/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { useRef, useState, useEffect, JSX } from 'react'; import Layout from '@theme/Layout'; import Link from '@docusaurus/Link'; import { Card, Carousel, Flex } from 'antd'; import styled from '@emotion/styled'; import GitHubButton from 'react-github-btn'; import { mq } from '../utils'; import { Databases } from '../resources/data'; import SectionHeader from '../components/SectionHeader'; import BlurredSection from '../components/BlurredSection'; import DataSet from '../../../RESOURCES/INTHEWILD.yaml'; import '../styles/main.less'; interface Organization { name: string; url: string; logo?: string; } interface DataSetType { categories: Record; } const typedDataSet = DataSet as DataSetType; // Extract all organizations with logos for the carousel const companiesWithLogos = Object.values(typedDataSet.categories) .flat() .filter((org) => org.logo?.trim()); // Fisher-Yates shuffle for fair randomization function shuffleArray(array: T[]): T[] { const shuffled = [...array]; for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } return shuffled; } const features = [ { image: 'powerful-yet-easy.jpg', title: 'Powerful yet easy to use', description: 'Superset makes it easy to explore your data, using either our simple no-code viz builder or state-of-the-art SQL IDE.', }, { image: 'modern-databases.jpg', title: 'Integrates with modern databases', description: 'Superset can connect to any SQL-based databases including modern cloud-native databases and engines at petabyte scale.', }, { image: 'modern-architecture.jpg', title: 'Modern architecture', description: 'Superset is lightweight and highly scalable, leveraging the power of your existing data infrastructure without requiring yet another ingestion layer.', }, { image: 'rich-visualizations.jpg', title: 'Rich visualizations and dashboards', description: 'Superset ships with 40+ pre-installed visualization types. Our plug-in architecture makes it easy to build custom visualizations.', }, ]; const StyledMain = styled('main')` text-align: center; `; const StyledTitleContainer = styled('div')` position: relative; padding: 130px 20px 0; margin-bottom: 160px; background-image: url('/img/grid-background.jpg'); background-size: cover; ${mq[1]} { margin-bottom: 100px; } .info-container { position: relative; z-index: 4; } .superset-mark { ${mq[1]} { width: 140px; } } .info-text { font-size: 30px; line-height: 37px; max-width: 720px; margin: 24px auto 10px; color: var(--ifm-font-base-color-inverse); ${mq[1]} { font-size: 25px; line-height: 30px; } } .github-section { margin-top: 9px; ${mq[1]} { display: flex; flex-direction: column; overflow: hidden; } .github-button { margin: 5px; ${mq[1]} { transform: scale(1.25); margin: 8px; &:first-of-type { margin-top: 5px; } &:last-of-type { margin-bottom: 5px; } } } } `; const StyledButton = styled(Link)` border-radius: 10px; font-size: 20px; font-weight: bold; width: 170px; padding: 10px 0; margin: 15px auto 0; ${mq[1]} { font-size: 19px; width: 175px; padding: 10px 0; } `; const StyledScreenshotContainer = styled('div')` position: relative; display: inline-block; padding-top: 30px; margin-top: 25px; margin-bottom: -125px; max-width: 800px; ${mq[1]} { padding-top: 20px; } .screenshot { position: relative; z-index: 3; border-radius: 10px; } .screenshot-shadow-1 { position: absolute; top: 15px; left: 20px; width: calc(100% - 40px); height: calc(100% - 15px); background-color: #256b7c; border-radius: 10px; z-index: 2; ${mq[1]} { background-color: #335a64; top: 10px; left: 15px; width: calc(100% - 30px); height: calc(100% - 10px); } } .screenshot-shadow-2 { position: absolute; top: 0; left: 40px; width: calc(100% - 80px); height: 100%; background-color: #0d5262; border-radius: 10px; z-index: 1; ${mq[1]} { background-color: #1f4048; left: 30px; width: calc(100% - 60px); } } .screenshotBlur { display: none; background-color: #173036; filter: blur(45px); position: absolute; bottom: 0; left: 50%; width: 100%; padding-top: 100%; border-radius: 50%; transform: translate3d(-50%, 0, 0); opacity: 0.3; ${mq[1]} { display: block; } } `; const StyledFeaturesList = styled('ul')` display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; width: 100%; max-width: 1170px; margin: 15px auto 0; padding: 0 20px; ${mq[1]} { grid-template-columns: repeat(1, minmax(0, 1fr)); } .item { text-align: left; border: 1px solid var(--ifm-border-color); border-radius: 10px; overflow: hidden; display: flex; align-items: flex-start; padding: 20px; ${mq[1]} { flex-direction: column; align-items: center; text-align: center; padding: 35px; } .image { flex-shrink: 0; margin-right: 20px; width: 140px; text-align: center; ${mq[1]} { width: 115px; } } .title { font-size: 24px; margin: 10px 0 0; ${mq[1]} { font-size: 23px; margin-top: 20px; } } .description { font-size: 17px; line-height: 23px; margin: 5px 0 0; ${mq[1]} { font-size: 16px; margin-top: 10px; } } } `; const StyledSliderSection = styled('div')` position: relative; padding: 60px 20px; ${mq[1]} { padding-top: 0; padding-bottom: 50px; } &::before { content: ''; display: block; width: 100%; height: calc(100% - 320px); position: absolute; top: 0; left: 0; background-image: url('/img/grid-background.jpg'); background-size: cover; z-index: -1; ${mq[1]} { height: 100%; } } .toggleBtns { display: flex; justify-content: space-between; list-style: none; max-width: 870px; width: 100%; margin: 0 auto 20px; padding: 0; ${mq[1]} { flex-direction: column; text-align: left; max-width: 140px; gap: 10px; margin-top: 15px; margin-bottom: 40px; } .toggle { font-size: 24px; color: #b4c0c7; position: relative; padding-left: 32px; cursor: pointer; ${mq[1]} { font-size: 17px; font-weight: bold; padding-left: 22px; } &::before { content: ''; display: block; width: 12px; height: 12px; border-radius: 50%; background-color: #457f8d; position: absolute; top: 50%; left: 0; transform: translate3d(0, -50%, 0); ${mq[1]} { width: 8px; height: 8px; } } &.active { font-weight: 700; color: var(--ifm-font-base-color-inverse); } &.active::before { background-color: var(--ifm-color-primary); } } } .slide { max-width: 920px; & > p { max-width: 560px; margin: 0 auto; font-size: 24px; line-height: 32px; color: var(--ifm-font-base-color-inverse); margin-bottom: 45px; ${mq[1]} { font-size: 17px; line-height: 23px; } } } video { width: 100%; max-width: 920px; margin-top: 10px; border-radius: 10px; ${mq[1]} { border-radius: 5px; } } `; const StyledKeyFeatures = styled('div')` margin-top: 50px; & > h3 { font-size: 30px; } .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 30px; max-width: 960px; margin: 30px auto 0; padding: 0 20px; text-align: left; ${mq[1]} { grid-template-columns: repeat(1, minmax(0, 1fr)); } & > .item { display: flex; font-size: 17px; ${mq[1]} { font-size: 15px; } & > img { width: 20px; height: 20px; flex-shrink: 0; margin-right: 12px; margin-top: 4px; ${mq[1]} { width: 18px; height: 18px; margin-top: 2px; } } } } .row { display: flex; max-width: 960px; margin: 30px auto 0; & > .column { width: 50%; & > ul { font-size: 17px; list-style: none; padding: 0 20px; text-align: left; margin: 0; & > li { display: flex; margin-bottom: 20px; & > img { width: 20px; height: 20px; flex-shrink: 0; margin-right: 12px; margin-top: 4px; } } } } } `; const StyledIntegrations = styled('div')` padding: 0 20px; .database-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 14px; max-width: 1160px; margin: 25px auto 0; ${mq[1]} { grid-template-columns: repeat(4, minmax(0, 1fr)); } ${mq[0]} { grid-template-columns: repeat(1, minmax(0, 1fr)); } & > .item { border: 1px solid var(--ifm-border-color); border-radius: 10px; overflow: hidden; height: 120px; padding: 25px; display: flex; align-items: center; justify-content: center; & > a { height: 100%; } & img { height: 100%; object-fit: contain; } } } .database-sub { display: block; text-align: center; font-size: 17px; margin-top: 50px; } `; export default function Home(): JSX.Element { const slider = useRef(null); const [slideIndex, setSlideIndex] = useState(0); const [shuffledCompanies, setShuffledCompanies] = useState(companiesWithLogos); const onChange = (current, next) => { setSlideIndex(next); }; const changeToDark = () => { const navbar = document.body.querySelector('.navbar'); const logo = document.body.querySelector('.navbar__logo img'); if (navbar) { navbar.classList.add('navbar--dark'); } if (logo) { logo.setAttribute('src', '/img/superset-logo-horiz-dark.svg'); } }; const changeToLight = () => { const navbar = document.body.querySelector('.navbar'); const logo = document.body.querySelector('.navbar__logo img'); if (navbar) { navbar.classList.remove('navbar--dark'); } if (logo) { logo.setAttribute('src', '/img/superset-logo-horiz.svg'); } }; // Shuffle companies on mount for fair rotation useEffect(() => { setShuffledCompanies(shuffleArray(companiesWithLogos)); }, []); // Set up dark <-> light navbar change useEffect(() => { changeToDark(); const navbarToggle = document.body.querySelector('.navbar__toggle'); if (navbarToggle) { navbarToggle.addEventListener('click', () => changeToLight()); } const scrollListener = () => { if (window.scrollY > 0) { changeToLight(); } else { changeToDark(); } }; window.addEventListener('scroll', scrollListener); return () => { window.removeEventListener('scroll', scrollListener); changeToLight(); }; }, []); return (
Superset mark
Apache Superset™ is an open-source modern data exploration and visualization platform.
line
Star Watch Fork
line Get Started
hero-screenshot
{features.map(({ image, title, description }) => (
  • {title}

    {description}

  • ))}
    • slider.current.goTo(0)} role="button" > Dashboards
    • slider.current.goTo(1)} role="button" > Chart Builder
    • slider.current.goTo(2)} role="button" > SQL Lab
    • slider.current.goTo(3)} role="button" > Datasets

    Explore data and find insights from interactive dashboards.

    Drag and drop to create robust charts and tables.

    Write custom SQL queries, browse database metadata, use Jinja templating, and more.

    Create physical and virtual datasets to scale chart creation with unified metric definitions.

    Key features

    check-icon
    40+ pre-installed visualizations
    check-icon
    Support for drag-and-drop and{' '} SQL queries
    check-icon
    Data caching for the faster load time of charts and dashboards
    check-icon
    Jinja templating and dashboard filters for creating interactive dashboards
    check-icon
    CSS templates to customize charts and dashboards to your brand’s look and feel
    check-icon
    Semantic layer for SQL data transformations
    check-icon
    Cross-filters, drill-to-detail, and drill-by{' '} features for deeper data analysis
    check-icon
    Virtual datasets for ad-hoc data exploration
    check-icon
    Access to new functionalities through{' '} feature flags
    {Databases.map(({ title, href, imgName }) => (
    {href ? ( ) : ( )}
    ))}
    ...and many other{' '} compatible databases
    {/* Only show carousel when we have enough logos (>10) for a good display */} {companiesWithLogos.length > 10 && (
    {shuffledCompanies.map(({ name, url, logo }) => ( ))}
    See all companies · Add yours to the list!
    )}
    ); }