+ + {/* Header with title */} + + {toolName} + + Explore data with visualizations, powered by AI agents. + - - Explore data with visualizations, powered by AI agents. - {actionButtons} - {/* Interactive Features Carousel */} - - - {/* Left Arrow */} - + {features.map((feature, index) => ( + - - - - {/* Feature Content */} - {/* Text Content */} - {features[currentFeature].title} + {feature.title} - {features[currentFeature].description} + {feature.description} - - {/* Feature Indicators */} - - {features.map((_, index) => ( - setCurrentFeature(index)} - sx={{ - width: 32, - height: 4, - borderRadius: 2, - bgcolor: index === currentFeature - ? theme.palette.primary.main - : alpha(theme.palette.text.secondary, 0.2), - cursor: 'pointer', - '&:hover': { - bgcolor: index === currentFeature - ? theme.palette.primary.main - : alpha(theme.palette.text.secondary, 0.4), - } - }} - /> - ))} - {/* Media Content */} @@ -292,30 +177,18 @@ export const About: FC<{}> = function About({ }) { flex: 1, borderRadius: 2, overflow: 'hidden', - boxShadow: '0 4px 12px rgba(0,0,0,0.1)', - minWidth: 300, - maxWidth: 500, + border: '1px solid rgba(0,0,0,0.1)', }}> - {features[currentFeature].mediaType === 'video' ? ( + {feature.mediaType === 'video' ? ( { - const video = e.currentTarget as HTMLVideoElement; - if (video.duration && !isNaN(video.duration)) { - videoDurationsRef.current.set( - features[currentFeature].media, - video.duration - ); - } - }} + aria-label={`Video demonstration: ${feature.title}`} sx={{ width: '100%', height: 'auto', @@ -325,8 +198,8 @@ export const About: FC<{}> = function About({ }) { ) : ( = function About({ }) { )} - - {/* Right Arrow */} - - - - - - - {/* Screenshots Carousel Section */} - - - {/* Screenshot Container */} - setCurrentScreenshot((currentScreenshot + 1) % screenshots.length)} - sx={{ - height: 680, - width: 'auto', - borderRadius: 8, - cursor: 'pointer', - overflow: 'hidden', - border: '1px solid rgba(0,0,0,0.1)', - boxShadow: '0 4px 12px rgba(0,0,0,0.1)', - position: 'relative', - display: 'flex', - justifyContent: 'center', - textDecoration: 'none', - animation: 'fadeSlideIn 0.1s ease-out', - '&:hover': { - boxShadow: '0 8px 24px rgba(0,0,0,0.2)', - '& .description-overlay': { - opacity: 1, - } - } - }} - > - - - - {screenshots[currentScreenshot].description} - - - - - {/* Screenshot Indicators */} - - {screenshots.map((_, index) => ( - setCurrentScreenshot(index)} - sx={{ - width: 32, - height: 4, - borderRadius: 2, - bgcolor: index === currentScreenshot - ? theme.palette.primary.main - : alpha(theme.palette.text.secondary, 0.2), - cursor: 'pointer', - transition: 'all 0.3s ease', - '&:hover': { - bgcolor: index === currentScreenshot - ? theme.palette.primary.main - : alpha(theme.palette.text.secondary, 0.4), - } - }} - /> - ))} - - + ))} - - - How does Data Formulator handle your data? - - -
  • Data Storage: Uploaded data (csv, xlsx, json, clipboard, messy data etc.) is stored in browser's local storage only
  • -
  • Data Processing: Local installation runs Python on your machine; online demo sends the data to server for data transformations (but not stored)
  • -
  • Database: Only available for locally installed Data Formulator (a DuckDB database file is created in temp directory to store data); not available in online demo
  • -
  • LLM Endpoints: Small data samples are sent to LLM endpoints along with the prompt. Use your trusted model provider if working with private data.
  • -
    - - Research Prototype from Microsoft Research - -
    + + Data handling: Data stored in browser only • Local install runs Python locally; online demo processes server-side (not stored) • LLM receives small samples with prompts + + + Research Prototype from Microsoft Research +
    {/* Footer */} - + - + ) } diff --git a/src/views/DataFormulator.tsx b/src/views/DataFormulator.tsx index ead4e94..0ea145b 100644 --- a/src/views/DataFormulator.tsx +++ b/src/views/DataFormulator.tsx @@ -331,7 +331,7 @@ export const DataFormulatorFC = ({ }) => { zIndex: 1000, }}> - + {toolName}