diff --git a/package.json b/package.json index 59ce43a..ea0727b 100755 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "cheerio": "1.0.0-rc.5", "dotenv": "^8.2.0", "gatsby": "^3.1.2", + "@heroicons/react": "^2.0.18", "gatsby-awesome-pagination": "0.3.6", "gatsby-image": "^3.2.0", "gatsby-plugin-advanced-sitemap": "1.6.0", @@ -78,8 +79,10 @@ "react": "17.0.1", "react-dom": "17.0.1", "react-helmet": "6.1.0", + "recharts": "^2.15.3", "sass": "^1.32.10", "styled-components": "^5.2.3", - "tailwindcss": "^3.1.1" + "tailwindcss": "^3.1.1", + "xlsx": "^0.18.5" } } diff --git a/src/components/Cta.js b/src/components/Cta.js index 6797c81..b786914 100644 --- a/src/components/Cta.js +++ b/src/components/Cta.js @@ -1,32 +1,36 @@ -import React from 'react' +import React from "react"; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faGithub } from '@fortawesome/free-brands-svg-icons' +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faGithub } from "@fortawesome/free-brands-svg-icons"; export default function Cta() { return ( -
+
-

Let's put synthetic data to work.

+

+ Let's put synthetic data to work. +

- - - {' '} - View on Github + View on Github
- ) -} \ No newline at end of file + ); +} diff --git a/src/components/Footer.js b/src/components/Footer.js index 3f873f0..80f6058 100644 --- a/src/components/Footer.js +++ b/src/components/Footer.js @@ -1,178 +1,226 @@ import React from "react"; - -import Img from "gatsby-image"; - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faSlack, faTwitter, faLinkedin, + faGithub, } from "@fortawesome/free-brands-svg-icons"; +import { Link } from "gatsby"; +import dataceboHorizontalLogo from "../../static/datacebo-horizontal-logo.svg"; + +const ListItem = ({ i }) => { + return ( +
  • + + + {i.name} + {i.tag && ( + + {i.tag.name} + + )} + + +
  • + ); +}; -import { Link, StaticQuery, graphql } from "gatsby"; +const SocialLink = ({ url, icon }) => { + return ( + + + + ); +}; export default function Footer() { return ( - { - return ( -
    -
    -
    -
    -
    -
    -
    - - The Synthetic Data Vault Blog - -
    +
    +
    +
    +
    +
    + + Datacebo logo + +

    + Make synthetic data a reality +

    +
    +
    +
    +
    +
    +

    + Product +

    +
      + {[ + { + name: "SDV Community", + url: "https://sdv.dev/", + }, + { + name: "SDV Enterprise", + url: "/sdv-enterprise/", + }, + { + name: "SDMetrics", + url: "https://docs.sdv.dev/sdmetrics/", + }, + { + name: "Pricing", + url: "/pricing/", + }, + ].map((i, idx) => ( + + ))} +
    +
    +
    +

    + Use cases +

    +
      + {[ + { + name: "Testing software applications", + url: "https://datacebo.com/blog/fake-to-synthetic-ml/", + }, + { + name: "Simulating Scenarios", + url: "https://datacebo.com/blog/sdv-flights-synthesizer/", + }, + { + name: "Training AI models", + url: "https://datacebo.com/blog/synthetic-clones-for-ml/", + }, + { + name: "Sharing data", + url: "https://datacebo.com/blog/synthetic-label-balancing/", + }, + ].map((i, idx) => ( + + ))} +
    +
    +
    +

    + Resources +

    +
      + {[ + { + name: "Blog", + url: "https://datacebo.com/blog/", + }, + { + name: "Newsroom", + url: "https://datacebo.com/newsroom/", + }, + { + name: "Announcements", + url: "https://datacebo.com/announcements/", + }, + { + name: "SDV Docs", + url: "https://docs.sdv.dev/sdv/", + }, + ].map((i, idx) => ( + + ))} +
    +
    +
    +

    + Company +

    +
      + {[ + { + name: "Our Team", + url: "/team/", + }, + + { + name: "Careers", + url: "/careers/", + tag: { + name: "We're hiring", + }, + }, + { + name: "Support", + url: "/support/", + }, + ].map((i, idx) => ( + + ))} +
    +
    +
    +

    Connect

    +
    +
    + + + +
    + -
    -
    -
    -

    - Resources -

    -
      - {[ - { - name: "GitHub", - url: "https://github.com/sdv-dev/SDV", - }, - { - name: "SDV Docs", - url: "https://bit.ly/sdv-docs", - }, - { name: "Blog", url: "https://datacebo.com/blog" }, - ].map((i, idx) => { - return ( -
    • - - {i.name} - -
    • - ); - })} -
    -
    -
    -

    - Company -

    -
      - {[ - { - name: "About Us", - url: "https://datacebo.com/team/", - }, - { - name: "Contact", - url: "https://datacebo.com/contact/", - }, - ].map((i, idx) => { - return ( -
    • - - {i.name} - -
    • - ); - })} -
    -
    -
    -

    - Connect -

    -
    -
    - - - -
    -
    - - - -
    -
    - - - -
    -
    -
    -
    +
    -
    -

    © 2023, DataCebo, Inc.

    -
    -
    +
    - ); - }} - /> +
    +
    +
    +

    + © {new Date().getFullYear()}, DataCebo, Inc. +

    +
    + + + +
    +
    +
    ); } diff --git a/src/components/FooterSm.js b/src/components/FooterSm.js deleted file mode 100644 index bc8afb2..0000000 --- a/src/components/FooterSm.js +++ /dev/null @@ -1,116 +0,0 @@ -import React from 'react' - -export default function FooterSm() { - return ( -
    - {/* The footer at the very bottom of the screen */} - -
    - - ) -} \ No newline at end of file diff --git a/src/components/MultiTableIcon.js b/src/components/MultiTableIcon.js new file mode 100644 index 0000000..a3776a1 --- /dev/null +++ b/src/components/MultiTableIcon.js @@ -0,0 +1,78 @@ +import React from "react"; + +const MultiTableIcon = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default MultiTableIcon; diff --git a/src/components/SequentialTableIcon.js b/src/components/SequentialTableIcon.js new file mode 100644 index 0000000..09341d2 --- /dev/null +++ b/src/components/SequentialTableIcon.js @@ -0,0 +1,214 @@ +import React from "react"; + +const SequentialTableIcon = () => { + return ( + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + ); +}; + +export default SequentialTableIcon; diff --git a/src/components/SingleTableIcon.js b/src/components/SingleTableIcon.js new file mode 100644 index 0000000..c825bd1 --- /dev/null +++ b/src/components/SingleTableIcon.js @@ -0,0 +1,39 @@ +import React from "react"; + +const SingleTableIcon = () => { + return ( + + + + + + + + + + + + ); +}; + +export default SingleTableIcon; diff --git a/src/components/common/ArrowSlider.js b/src/components/common/ArrowSlider.js new file mode 100644 index 0000000..da0340b --- /dev/null +++ b/src/components/common/ArrowSlider.js @@ -0,0 +1,41 @@ +import React from "react"; +import chevronBackward from "../../../static/chevron-backward.svg"; +import chevronForward from "../../../static/chevron-forward.svg"; +import chevronForwardDisabled from "../../../static/chevron-forward-disabled.svg"; +import chevronBackwardDisabled from "../../../static/chevron-backward-disabled.svg"; + +export default function ArrowSlider({ + onPrev, + onNext, + disablePrev, + disableNext, +}) { + return ( +
    + + +
    + ); +} diff --git a/src/components/common/Article.js b/src/components/common/Article.js index 4c3b759..ef862dd 100644 --- a/src/components/common/Article.js +++ b/src/components/common/Article.js @@ -1,14 +1,10 @@ import React from "react"; import { Helmet } from "react-helmet"; import { StaticQuery, graphql } from "gatsby"; -import Img from "gatsby-image"; - -import { Navigation } from "."; -import Footer from '../../components/Footer'; - -import MoreArticles from '../MoreArticles' - -import favicon from '../../../static/favicon.ico'; +import Navigation from "./Navigation"; +import Footer from "../../components/Footer"; +import MoreArticles from "../MoreArticles"; +import dataceboHorizontalLogo from "../../../static/datacebo-horizontal-logo.svg"; /** * Main layout component @@ -19,93 +15,69 @@ import favicon from '../../../static/favicon.ico'; * */ const PostDefaultLayout = ({ data, children, bodyClass, isPost }) => { + return ( + <> + + + {/* */} + +
    +
    + + +
    + DataCebo Logo +
    +
    +
    - return ( - <> - - - {/* */} - - -
    -
    - - -
    - DataCebo Blog - DataCebo Blog -
    -
    -
    - - -
    - {children} - { isPost ? (
    - -
    ) : ''} -
    -
    - {/* */} -
    -
    - - ); +
    + {children} + {isPost ? ( +
    + +
    + ) : ( + "" + )} +
    +
    + {/* */} +
    + + ); }; - - -export default function PostDefaultLayoutSettingsQuery (props) { - return ( +export default function PostDefaultLayoutSettingsQuery(props) { + return ( } + } + } + `} + render={(data) => } /> -)}; + ); +} diff --git a/src/components/common/BlogIcon.js b/src/components/common/BlogIcon.js new file mode 100644 index 0000000..1d60092 --- /dev/null +++ b/src/components/common/BlogIcon.js @@ -0,0 +1,51 @@ +import React from "react"; + +const BlogIcon = () => { + return ( +
    + + + + + + + + + + +
    + ); +}; + +export default BlogIcon; diff --git a/src/components/common/CareersIcon.js b/src/components/common/CareersIcon.js new file mode 100644 index 0000000..325bf28 --- /dev/null +++ b/src/components/common/CareersIcon.js @@ -0,0 +1,50 @@ +import React from "react"; + +const CareersIcon = () => { + return ( +
    + + + + + + + + + + + +
    + ); +}; + +export default CareersIcon; diff --git a/src/components/common/DataceboLogo.js b/src/components/common/DataceboLogo.js new file mode 100644 index 0000000..c976761 --- /dev/null +++ b/src/components/common/DataceboLogo.js @@ -0,0 +1,48 @@ +import React from "react"; + +const DataceboLogo = () => { + return ( + + + + + + + + + + + ); +}; + +export default DataceboLogo; diff --git a/src/components/common/DotSlider.js b/src/components/common/DotSlider.js new file mode 100644 index 0000000..2108516 --- /dev/null +++ b/src/components/common/DotSlider.js @@ -0,0 +1,20 @@ +import React from "react"; + +export default function DotSlider({ sliderItems, activeIndex, onClick }) { + return ( +
    + {sliderItems.map((_, index) => ( +
    + ); +} diff --git a/src/components/common/InfoBar.js b/src/components/common/InfoBar.js new file mode 100644 index 0000000..6347fcf --- /dev/null +++ b/src/components/common/InfoBar.js @@ -0,0 +1,28 @@ +import React from "react"; +import { ArrowRightIcon } from "@heroicons/react/24/solid"; + +const InfoBar = () => { + return ( +
    +
    +
    + Product{" "} +
    +
    + Introducing Constraint-Augmented Generation (CAG) + + Read More{" "} + + +
    +
    +
    + ); +}; + +export default InfoBar; diff --git a/src/components/common/LabelBalancingIcon.js b/src/components/common/LabelBalancingIcon.js new file mode 100644 index 0000000..b9e0999 --- /dev/null +++ b/src/components/common/LabelBalancingIcon.js @@ -0,0 +1,38 @@ +import React from "react"; + +const LabelBalancingIcon = () => { + return ( +
    + + + + + +
    + ); +}; + +export default LabelBalancingIcon; diff --git a/src/components/common/Layout.js b/src/components/common/Layout.js deleted file mode 100644 index b6e9cf4..0000000 --- a/src/components/common/Layout.js +++ /dev/null @@ -1,165 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { Helmet } from "react-helmet"; -import { Link, StaticQuery, graphql } from "gatsby"; -import Img from "gatsby-image"; - -import { Navigation } from "."; -import Footer from '../../components/Footer'; -import Cta from '../../components/Cta' -import config from "../../utils/siteConfig"; - -import HeroImage from "../../../assets/blog-hero.svg"; -import favicon from '../../../static/favicon.ico'; - -/** - * Main layout component - * - * The Layout component wraps around each page and template. - * It also provides the header, footer as well as the main - * styles, and meta data for each page. - * - */ -const DefaultLayout = ({ data, children, bodyClass, isHome }) => { - - return ( - <> - - - {/* */} - - -
    -
    - {/* The main header section on top of the screen */} -
    - -
    - - -
    - The Synthetic Data Vault Blog -
    - {/* {site.logo ? ( - {site.title} - ) : ( - {site.title} - )} */} - -
    -
    - {isHome ? ( -
    -
    -
    -
    -

    - Welcome to the SDV Blog - {/* {site.title} */} -

    - {/*

    - {site.description} -

    */} -
    -
    - The Synthetic Data Vault Blog -
    -
    -
    -
    - ) : null} -
    - -
    - {/* All the main content gets inserted here, index.js, post.js */} -
    - {children} -
    -
    -
    - {/* */} -
    -
    - - ); -}; - -export default function DefaultLayoutSettingsQuery (props) { - return ( - } - /> -)}; diff --git a/src/components/common/MlModelIcon.js b/src/components/common/MlModelIcon.js new file mode 100644 index 0000000..13136c2 --- /dev/null +++ b/src/components/common/MlModelIcon.js @@ -0,0 +1,86 @@ +import React from "react"; + +const MlModelIcon = () => { + return ( +
    + + + + + + + {/* Nodes */} + + + + + + + +
    + ); +}; + +export default MlModelIcon; diff --git a/src/components/common/NavbarItem-vertical.js b/src/components/common/NavbarItem-vertical.js new file mode 100644 index 0000000..dc798f7 --- /dev/null +++ b/src/components/common/NavbarItem-vertical.js @@ -0,0 +1,226 @@ +import React, { useRef, useState } from "react"; +import ChevronMobile from "../common/chevron-mobile"; +import chevronDown from "../../../static/chevron-down.svg"; +import chevronUp from "../../../static/chevron-up.svg"; +import resourcesBlog from "../../../static/resources-blog.png"; +import useOutsideClick from "../../utils/outside-click"; + +const NavbarItemVertical = ({ data }) => { + const [isActive, setActive] = useState(false); + const subItems = data.subItems || null; + const currentEl = useRef(null); + const onClick = (e) => { + // console.log('isActive && window.innerWidth < 1024', isActive && window.innerWidth < 1024); + if (window.innerWidth < 1024) { + if (e.target === currentEl.current) { + setActive(!isActive); + } + } + }; + const onHover = () => { + // console.log('hover', e.target, currentEl.current.contains(e.target)); + if (window.innerWidth >= 1024) { + setActive(true); + } + }; + const onFocus = () => { + // console.log('focus', e.target, currentEl.current.contains(e.target)); + setActive(true); + }; + const onBlur = (e) => { + // console.log('blur', e.target, currentEl.current.contains(e.target)); + if (!currentEl.current.contains(e.target)) { + setActive(false); + } + }; + + const onLeave = (e) => { + // console.log('leave', e.target, e.target != currentEl.current, currentEl.current.contains(e.target)); + + if (window.innerWidth >= 1024) { + if ( + e.target !== currentEl.current && + currentEl.current.contains(e.target) + ) { + setActive(false); + } + } + }; + + useOutsideClick(currentEl, () => { + // if (window.innerWidth >= 1024) { + if (isActive) { + setActive(false); + } + // } + }); + + if (subItems === null) { + if (data.url === "/contact/" || data.url === "/support/") { + return ( +
  • + + {data.name} + +
  • + ); + } + return ( +
  • + + {data.name} + +
  • + ); + } + + let items = data.subItems; + + return ( +
  • + + {/* add trianglular */} + +
    +
    +
    +
    + {data.text && ( +
    + )} +
    + {data.name === "Resources" && ( +
    +
    + + Blog + +
    + Introducing AI Connectors: Database Integration for + Synthetic Data +
    +
    + +
    + )} +
    3 + ? "columns-1 lg:columns-2 lg:gap-0" + : "flex flex-col" + } + > + {data.name === "Use cases" && ( + + Use AI-generated synthetic data for + + )} + {Array.from(items).map((item, idx) => ( + +
    +
    +
    +
    +
  • + ); +}; + +export default NavbarItemVertical; diff --git a/src/components/common/Navigation.js b/src/components/common/Navigation.js index c40e387..0193b47 100644 --- a/src/components/common/Navigation.js +++ b/src/components/common/Navigation.js @@ -1,9 +1,135 @@ import React, { useRef, useEffect, useState } from "react"; -import { Link } from "gatsby"; import { Squash as Hamburger } from "hamburger-react"; -import PropTypes from "prop-types"; +import NavbarItemVertical from "./NavbarItem-vertical"; +import InfoBar from "./InfoBar"; +import SdvEntIcon from "./SdvEntIcon"; +import PublicSdvIcon from "./PublicSdvIcon"; +import SdMetricsIcon from "./SdMetricsIcon"; +import SoftwareTestingIcon from "./SoftwareTestingIcon"; +import SimulatingScenariosIcon from "./SimulatingScenariosIcon"; +import MlModelIcon from "./MlModelIcon"; +import LabelBalancingIcon from "./LabelBalancingIcon"; +import BlogIcon from "./BlogIcon"; +import NewsroomIcon from "./NewsroomIcon"; +import SdvDocsIcon from "./SdvDocsIcon"; +import SdvAcademyIcon from "./SdvAcademyIcon"; +import SdvGuideIcon from "./SdvGuideIcon"; +import OurTeamIcon from "./OurTeamIcon"; +import CareersIcon from "./CareersIcon"; -// import Logo from "../../../assets/logo.svg"; +const navbarItems = [ + { + name: "Product", + subItems: [ + { + title: "SDV Community", + icon: , + url: "https://sdv.dev/", + text: "Founded at MIT, SDV is the most used source-available library", + }, + { + title: "SDV Enterprise", + icon: , + url: "/sdv-enterprise/", + text: "Built on the open core, SDV Enterprise offers scalability, business logic, and more", + }, + { + title: "SDMetrics", + icon: , + url: "https://docs.sdv.dev/sdmetrics/", + text: "Our vendor-agnostic library to evaluate the synthetic data", + }, + ], + }, + + { + name: "Use cases", + subItems: [ + { + title: "Testing software applications", + icon: , + url: "https://datacebo.com/blog/fake-to-synthetic-ml/", + text: "Unlock developer productivity by providing timely access to realistic test data", + }, + { + title: "Simulating Scenarios", + icon: , + url: "https://datacebo.com/blog/sdv-flights-synthesizer/", + text: "Use generative AI models to create scenarios and test outcomes", + }, + { + title: "Training AI models", + icon: , + url: "https://datacebo.com/blog/synthetic-clones-for-ml/", + text: `Overcome the shortage of data to train your AI modelsplaceholder placeholder placeholder`, + }, + { + title: "Sharing data", + icon: , + url: "https://datacebo.com/blog/synthetic-label-balancing/", + text: "Share data with external parties to improve collaboration outcomes", + }, + ], + }, + { name: "Announcements", url: "/announcements/" }, + { + name: "Resources", + subItems: [ + { + title: "Blog", + icon: , + url: "https://datacebo.com/blog/", + text: "Insights on synthetic data, our product and successful use cases", + }, + { + title: "Newsroom", + icon: , + url: "/newsroom/", + text: "Our latest media coverage and expert industry insights", + }, + { + title: "SDV Docs", + icon: , + url: "https://docs.sdv.dev/sdv", + text: "Documentation and demos to learn more about SDV", + }, + { + title: "SDV Academy", + icon: , + url: "", + text: "Course catalogue with the latest SDV tips and tricks", + tag: "Coming soon", + }, + { + title: "SDV Guides", + icon: , + url: "", + text: "Practical guidance on deploying synthetic data effectively", + tag: "Coming soon", + }, + ], + }, + + { + name: "Company", + subItems: [ + { + title: "Our Team", + icon: , + url: "/team/", + text: "Meet our team and discover our inspiring mission", + }, + { + title: "Careers", + icon: , + url: "/careers/", + text: "Join us to create the future of Generative AI", + }, + ], + }, + { name: "Pricing", url: "/pricing/" }, + { name: "Support", url: "/support/" }, +]; /** * Navigation component @@ -16,16 +142,14 @@ import PropTypes from "prop-types"; * */ -const navItems = [ - { label: "Blog", url: "https://datacebo.com/blog" }, - { label: "Company", url: "https://datacebo.com" }, - { label: "GitHub", url: "https://github.com/sdv-dev/SDV" }, -]; - -const Navigation = ({ navClass, children, isDark }) => { +const Navigation = ({ children, isDark, isTransparent, hasInfoBar }) => { const ref = useRef(); - const navbarClassName = isDark ? "nav-bg-dark" : "nav-bg-white"; + const navbarClassName = isDark + ? "nav-bg-dark" + : isTransparent + ? "nav-bg-tp" + : "nav-bg-white"; // const [isWhite, setNavbarColor] = useState(false); @@ -87,73 +211,50 @@ const Navigation = ({ navClass, children, isDark }) => { }); return ( - + ); }; @@ -161,14 +262,4 @@ Navigation.defaultProps = { navClass: `site-nav-item`, }; -Navigation.propTypes = { - data: PropTypes.arrayOf( - PropTypes.shape({ - label: PropTypes.string.isRequired, - url: PropTypes.string.isRequired, - }).isRequired - ).isRequired, - navClass: PropTypes.string, -}; - export default Navigation; diff --git a/src/components/common/NewsUpdate.js b/src/components/common/NewsUpdate.js new file mode 100644 index 0000000..9b7825e --- /dev/null +++ b/src/components/common/NewsUpdate.js @@ -0,0 +1,31 @@ +import React from "react"; + +export default function NewsUpdate({ + imgSrc, + imgDimensions = "md:h-[176px] min-w-[292px]", + label, + text, + link, +}) { + return ( +
    +
    + Illustration +
    + + {label} + +

    + + {text} + +

    +
    +
    +
    + ); +} diff --git a/src/components/common/NewsroomIcon.js b/src/components/common/NewsroomIcon.js new file mode 100644 index 0000000..8c51c97 --- /dev/null +++ b/src/components/common/NewsroomIcon.js @@ -0,0 +1,49 @@ +import React from "react"; + +const NewsroomIcon = () => { + return ( +
    + + + + + + + + + + +
    + ); +}; + +export default NewsroomIcon; diff --git a/src/components/common/OurTeamIcon.js b/src/components/common/OurTeamIcon.js new file mode 100644 index 0000000..cba7664 --- /dev/null +++ b/src/components/common/OurTeamIcon.js @@ -0,0 +1,48 @@ +import React from "react"; + +const OurTeamIcon = () => { + return ( +
    + + + + + + + +
    + ); +}; + +export default OurTeamIcon; diff --git a/src/components/common/PublicSdvIcon.js b/src/components/common/PublicSdvIcon.js new file mode 100644 index 0000000..95c9147 --- /dev/null +++ b/src/components/common/PublicSdvIcon.js @@ -0,0 +1,40 @@ +import React from "react"; + +const PublicSdvIcon = () => { + return ( +
    + + + + + + +
    + ); +}; + +export default PublicSdvIcon; diff --git a/src/components/common/SdMetricsIcon.js b/src/components/common/SdMetricsIcon.js new file mode 100644 index 0000000..880f6c4 --- /dev/null +++ b/src/components/common/SdMetricsIcon.js @@ -0,0 +1,39 @@ +import React from "react"; + +const SdMetricsIcon = () => { + return ( +
    + + + + + + +
    + ); +}; + +export default SdMetricsIcon; diff --git a/src/components/common/SdvAcademyIcon.js b/src/components/common/SdvAcademyIcon.js new file mode 100644 index 0000000..c22280f --- /dev/null +++ b/src/components/common/SdvAcademyIcon.js @@ -0,0 +1,52 @@ +import React from "react"; + +const SdvAcademyIcon = () => { + return ( +
    + + + + + + + + + + + +
    + ); +}; + +export default SdvAcademyIcon; diff --git a/src/components/common/SdvDocsIcon.js b/src/components/common/SdvDocsIcon.js new file mode 100644 index 0000000..30aea0c --- /dev/null +++ b/src/components/common/SdvDocsIcon.js @@ -0,0 +1,51 @@ +import React from "react"; + +const SdvDocsIcon = () => { + return ( +
    + + + + + + + + + + +
    + ); +}; + +export default SdvDocsIcon; diff --git a/src/components/common/SdvEntIcon.js b/src/components/common/SdvEntIcon.js new file mode 100644 index 0000000..d704e38 --- /dev/null +++ b/src/components/common/SdvEntIcon.js @@ -0,0 +1,36 @@ +import React from "react"; + +const SdvEntIcon = () => { + return ( +
    + + + + + +
    + ); +}; + +export default SdvEntIcon; diff --git a/src/components/common/SdvGuideIcon.js b/src/components/common/SdvGuideIcon.js new file mode 100644 index 0000000..46ee5a5 --- /dev/null +++ b/src/components/common/SdvGuideIcon.js @@ -0,0 +1,52 @@ +import React from "react"; + +const SdvGuideIcon = () => { + return ( +
    + + + + + + + + + + + +
    + ); +}; + +export default SdvGuideIcon; diff --git a/src/components/common/SimulatingScenariosIcon.js b/src/components/common/SimulatingScenariosIcon.js new file mode 100644 index 0000000..80c7286 --- /dev/null +++ b/src/components/common/SimulatingScenariosIcon.js @@ -0,0 +1,37 @@ +import React from "react"; + +const SimulatingScenariosIcon = () => { + return ( +
    + + + + + +
    + ); +}; + +export default SimulatingScenariosIcon; diff --git a/src/components/common/SoftwareTestingIcon.js b/src/components/common/SoftwareTestingIcon.js new file mode 100644 index 0000000..3c78e10 --- /dev/null +++ b/src/components/common/SoftwareTestingIcon.js @@ -0,0 +1,61 @@ +import React from "react"; + +const SoftwareTestingIcon = () => { + return ( +
    + + + + + + + + + + + + + + + +
    + ); +}; + +export default SoftwareTestingIcon; diff --git a/src/components/common/Tab.js b/src/components/common/Tab.js new file mode 100644 index 0000000..b241748 --- /dev/null +++ b/src/components/common/Tab.js @@ -0,0 +1,16 @@ +import React from "react"; + +export default function Tab({ children, isActive, onClick }) { + return ( +
    + {children} +
    + ); +} diff --git a/src/components/common/chevron-mobile.js b/src/components/common/chevron-mobile.js new file mode 100644 index 0000000..cdb0b06 --- /dev/null +++ b/src/components/common/chevron-mobile.js @@ -0,0 +1,26 @@ +import React from "react"; + +const ChevronMobile = ({ isActive }) => { + return ( + + + + ); +}; + +export default ChevronMobile; diff --git a/src/components/common/table/Table.js b/src/components/common/table/Table.js new file mode 100644 index 0000000..ce84fb6 --- /dev/null +++ b/src/components/common/table/Table.js @@ -0,0 +1,17 @@ +import React from "react"; + +export default function Table({ children, tableColDimensions }) { + const customStyles = { + "--table-col-dimensions": `${tableColDimensions ?? "minmax(0, 1fr)"}`, + gridTemplateAreas: `"header" "body"`, + }; + + return ( +
    + {children} +
    + ); +} diff --git a/src/components/common/table/TableBody.js b/src/components/common/table/TableBody.js new file mode 100644 index 0000000..11f187a --- /dev/null +++ b/src/components/common/table/TableBody.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default function TableBody(props) { + return
    {props.children}
    ; +} diff --git a/src/components/common/table/TableHeader.js b/src/components/common/table/TableHeader.js new file mode 100644 index 0000000..77fa1af --- /dev/null +++ b/src/components/common/table/TableHeader.js @@ -0,0 +1,12 @@ +import React from "react"; + +export default function TableHeader({ children }) { + return ( +
    + {children} +
    + ); +} diff --git a/src/components/common/table/TableHeaderCell.js b/src/components/common/table/TableHeaderCell.js new file mode 100644 index 0000000..ec75e9c --- /dev/null +++ b/src/components/common/table/TableHeaderCell.js @@ -0,0 +1,9 @@ +import React from "react"; + +export default function TableHeaderCell({ children }) { + return ( +
    + {children} +
    + ); +} diff --git a/src/components/common/table/TableRow.js b/src/components/common/table/TableRow.js new file mode 100644 index 0000000..0b21298 --- /dev/null +++ b/src/components/common/table/TableRow.js @@ -0,0 +1,14 @@ +import React from "react"; + +export default function TableRow({ index, isLast, children }) { + const bgClass = index % 2 === 0 ? "bg-midnight-25" : "bg-white"; + const cornerClass = isLast ? "rounded-bl-20 rounded-br-20" : ""; + + return ( +
    + {children} +
    + ); +} diff --git a/src/components/common/table/TableRowCell.js b/src/components/common/table/TableRowCell.js new file mode 100644 index 0000000..fef2bc7 --- /dev/null +++ b/src/components/common/table/TableRowCell.js @@ -0,0 +1,9 @@ +import React from "react"; + +export default function TableRowCell({ children }) { + return ( +
    + {children} +
    + ); +} diff --git a/src/components/community-stats/BannerSection.js b/src/components/community-stats/BannerSection.js new file mode 100644 index 0000000..bcfa0de --- /dev/null +++ b/src/components/community-stats/BannerSection.js @@ -0,0 +1,42 @@ +import React from "react"; +import useWindowWidth from "../../hooks/useviewport"; +import ctaImage from "../../../static/cta-image.png"; +import bannerHomeSm from "../../../static/banner-home-sm.png"; +import eastIcon from "../../../static/east.svg"; + +export default function BannerSection() { + const width = useWindowWidth(); + const isMobile = width < 768; + + return ( +
    +
    +
    +
    +

    + Partner with us on your synthetic data journey +

    + + Get started with SDV Community{" "} + Arrow + +
    +
    +
    +
    + ); +} diff --git a/src/components/community-stats/CommunityStatsContent.js b/src/components/community-stats/CommunityStatsContent.js new file mode 100644 index 0000000..01f8779 --- /dev/null +++ b/src/components/community-stats/CommunityStatsContent.js @@ -0,0 +1,99 @@ +import React, { useEffect, useState } from "react"; +import * as XLSX from "xlsx"; +import SdvCommunityHero from "./SdvCommunityHero"; +import NewsSliderSection from "./NewsSliderSection"; +import SynthesizeCardsSection from "./SynthesizeCardsSection"; +import CommunityUsersSection from "./CommunityUsersSection"; +import SdvInNumbersSection from "./SdvInNumbersSection"; +import SdvCoreSection from "./SdvCoreSection"; +import SdvOpenCoreSection from "./SdvOpenCoreSection"; +import BannerSection from "./BannerSection"; +// import LatestsNewsSubSection from "./LatestsNewsSubSection"; + +export default function CommunityStatsContent() { + const [data, setData] = useState([]); + const [dependenciesData, setDependenciesData] = useState([]); + const fileUrl = + "https://raw.githubusercontent.com/sdv-dev/sdv-dev.github.io/gatsby-home/assets/Downloads_Summary.xlsx"; + + useEffect(() => { + async function fetchExcel() { + try { + const response = await fetch(fileUrl); + const blob = await response.blob(); + const arrayBuffer = await blob.arrayBuffer(); + const workbook = XLSX.read(arrayBuffer, { type: "array" }); + + const firstSheet = workbook.SheetNames[0]; + const thirdSheet = workbook.SheetNames[2]; + const worksheet = workbook.Sheets[firstSheet]; + const dependenciesWorksheet = workbook.Sheets[thirdSheet]; + + const rawData = XLSX.utils.sheet_to_json(worksheet); + const rawDependencies = XLSX.utils.sheet_to_json(dependenciesWorksheet); + + function formatThousands(value) { + if (value >= 1_000_000) + return (value / 1_000_000).toFixed(2).replace(/\.00$/, "") + "M"; + if (value >= 1_000) return (value / 1_000).toFixed(0) + "K"; + return value.toString(); + } + + const filtered = rawData.filter( + (item) => + item["Total Since Beginning"] !== undefined && + item["2025"] !== undefined + ); + + const total = filtered.reduce( + (sum, item) => sum + item["Total Since Beginning"], + 0 + ); + + const enrichedData = filtered.map((item) => ({ + name: item.Ecosystem, + percentage: parseFloat( + ((item["Total Since Beginning"] / total) * 100).toFixed(2) + ), + toDate: formatThousands(item["Total Since Beginning"]), + yearToDate: formatThousands(item["2025"]), + })); + + setData(enrichedData); + + const dependencies = rawDependencies + .filter( + (item) => + item["Library"] !== undefined && + item["Total Since Beginning"] !== undefined && + item["2025"] !== undefined + ) + .map((item) => ({ + name: item["Library"], + toDate: formatThousands(item["Total Since Beginning"]), + yearToDate: formatThousands(item["2025"]), + })); + + setDependenciesData(dependencies); + } catch (error) { + console.error("Error loading Excel file:", error); + } + } + + fetchExcel(); + }, []); + + return ( +
    + + + + + {/* */} + + + + +
    + ); +} diff --git a/src/components/community-stats/CommunityUsersSection.js b/src/components/community-stats/CommunityUsersSection.js new file mode 100644 index 0000000..7d72052 --- /dev/null +++ b/src/components/community-stats/CommunityUsersSection.js @@ -0,0 +1,84 @@ +import React from "react"; +import DataceboLogo from "../common/DataceboLogo"; +import KaggleLogo from "./KaggleLogo"; +import MapfreeLogo from "./MapfreeLogo"; +import JpmcLogo from "./JpmcLogo"; +import SparNordLogo from "./SparNordLogo"; + +export default function CommunityUsersSection() { + const cards = [ + { + logo: , + bg: "#0079C1", + title: + "JP Morgan Chase lorem ipsum dolorem lorem ipsum dolor lorem ipsum dolor dolor dolor dolor", + link: "/", + }, + { + logo: , + bg: "#BE002F", + title: "MAPFRE insurance improves fraud detection by xx% using SDV", + link: "/", + }, + { + logo: , + bg: "#20BEFF", + title: "Kaggle releases data for 11 competitions using SDV", + link: "/", + }, + { + logo: , + bg: "#1D427D", + title: "Spar Nord Bank is using SDV", + link: "/", + }, + ]; + + return ( +
    +

    + Users of the Community +

    +
    + {cards.map((c, idx) => { + const isLast = idx === cards.length - 1; + const isFirst = idx === 0; + + return ( +
    +
    +
    + {c.logo} +
    +
    +

    + {c.title} +

    + + +
    +
    + {!isLast &&
    } +
    + ); + })} +
    +
    + ); +} diff --git a/src/components/community-stats/CustomPieChart.js b/src/components/community-stats/CustomPieChart.js new file mode 100644 index 0000000..92d0d37 --- /dev/null +++ b/src/components/community-stats/CustomPieChart.js @@ -0,0 +1,296 @@ +import React from "react"; +import { PieChart, Pie, Cell, Label, Legend } from "recharts"; +import sdvPieChartLogo from "../../../static/sdv-pie-chart-logo.svg"; +import gretelSvg from "../../../static/gretel.svg"; +import useWindowWidth from "../../hooks/useviewport"; + +const COLORS = [ + "#01E0C9", + "#03AFF1", + "#77DAFF", + "#0690D1", + "#C1C8DB", + "#959FBD", + "#2EC8FF", + "#E5E8F2", + "#0690D1", + "#525C80", +]; + +const renderCustomizedLabel = ({ name, value, index, isTablet, isMobile }) => { + const gradientStops = [ + ["#BCC4DE", "#FCFCFD"], // hidden + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ["#FCFCFD", "#BCC4DE"], + ]; + const gradientOffsets = [ + 100, + isTablet ? 31 : 27, + isTablet ? 60.5 : 53, + isTablet ? 72.5 : 63.5, + isTablet ? 77.5 : 69, + isTablet ? 24.5 : 20.5, + isTablet ? 48 : 39, + isTablet ? 58.5 : 50, + isTablet ? 65.5 : 58.5, + isTablet ? 67.5 : 62.5, + ]; + + const labelPositions = [ + { x: -290, y: -450 }, + { x: isTablet ? 65 : 50, y: isTablet ? 100 : 50 }, + { x: isTablet ? 67 : 50, y: isTablet ? 170 : 120 }, + { x: isTablet ? 68 : 51, y: isTablet ? 240 : 190 }, + { x: isTablet ? 71 : 51, y: isTablet ? 310 : 260 }, + { x: isTablet ? 743 : 945, y: isTablet ? 100 : 50 }, + { x: isTablet ? 745 : 945, y: isTablet ? 170 : 120 }, + { x: isTablet ? 744 : 945, y: isTablet ? 240 : 190 }, + { x: isTablet ? 744 : 945, y: isTablet ? 310 : 260 }, + { x: isTablet ? 744 : 945, y: isTablet ? 380 : 330 }, + ]; + + const polylinePaths = [ + { from: [-270, -450], bend: [-290, -475], to: [-290, -500] }, + { + from: [isTablet ? 360 : 450, isTablet ? 100 : 50], + bend: [isTablet ? 300 : 370, isTablet ? 100 : 50], + to: [isTablet ? 66 : 50, isTablet ? 100 : 50], + }, + { + from: [isTablet ? 410 : 515, isTablet ? 115 : 60], + bend: [isTablet ? 320 : 250, isTablet ? 170 : 122], + to: [isTablet ? 69 : 53, isTablet ? 170 : 122], + }, + { + from: [isTablet ? 440 : 545, isTablet ? 110 : 80], + bend: [isTablet ? 320 : 220, isTablet ? 240 : 190], + to: [isTablet ? 69 : 56, isTablet ? 240 : 190], + }, + { + from: [isTablet ? 457 : 557, isTablet ? 100 : 100], + bend: [isTablet ? 320 : 220, isTablet ? 310 : 260], + to: [isTablet ? 71 : 57, isTablet ? 310 : 260], + }, + { + from: [isTablet ? 465 : 583, isTablet ? 100 : 50], + bend: [isTablet ? 600 : 740, isTablet ? 100 : 50], + to: [isTablet ? 742 : 944, isTablet ? 100 : 50], + }, + { + from: [isTablet ? 471 : 588, isTablet ? 105 : 65], + bend: [isTablet ? 570 : 745, isTablet ? 171 : 122], + to: [isTablet ? 744 : 944, isTablet ? 171 : 122], + }, + { + from: [isTablet ? 472 : 591, isTablet ? 120 : 80], + bend: [isTablet ? 630 : 780, isTablet ? 241 : 190], + to: [isTablet ? 744 : 944, isTablet ? 241 : 190], + }, + { + from: [isTablet ? 474 : 590, isTablet ? 130 : 100], + bend: [isTablet ? 630 : 790, isTablet ? 311 : 260], + to: [isTablet ? 744 : 944, isTablet ? 311 : 260], + }, + { + from: [isTablet ? 475 : 586, isTablet ? 140 : 120], + bend: [isTablet ? 610 : 785, isTablet ? 381 : 330], + to: [isTablet ? 743 : 944, isTablet ? 381 : 330], + }, + ]; + + const label = labelPositions[index]; + const path = polylinePaths[index]; + + if (!label) return null; + + return ( + + + + + + + + + + + {path && ( + <> + + + + )} + {(() => { + const isLeftSide = index >= 1 && index <= 4; + const textAnchor = isLeftSide ? "start" : "end"; + + if (name.toLowerCase() === "gretel") { + return ( + <> + + + + ({value.toFixed(2)}%) + + + + ); + } + + return ( + + + {name} + + + ({value.toFixed(2)}%) + + + ); + })()} + + ); +}; + +export default function CustomPieChart({ data }) { + const width = useWindowWidth(); + const isMobile = width < 768; + const isTablet = width > 768 && width < 1024; + const sortedData = [...data].sort((a, b) => b.percentage - a.percentage); + + return ( +
    + SDV logo + + + renderCustomizedLabel({ ...props, isTablet, isMobile }) + : false + } + > + {sortedData.map((_, index) => ( + + ))} + + {isMobile && ( + ( +
      + {sortedData.map((entry, index) => ( +
    • +
      + + + {`${entry.name} (${sortedData[index].percentage}%)`} + +
      +
    • + ))} +
    + )} + /> + )} +
    +
    + ); +} diff --git a/src/components/community-stats/JpmcLogo.js b/src/components/community-stats/JpmcLogo.js new file mode 100644 index 0000000..43631f5 --- /dev/null +++ b/src/components/community-stats/JpmcLogo.js @@ -0,0 +1,32 @@ +import React from "react"; + +const JpmcLogo = () => { + return ( + + + + + + + + + + + ); +}; + +export default JpmcLogo; diff --git a/src/components/community-stats/KaggleLogo.js b/src/components/community-stats/KaggleLogo.js new file mode 100644 index 0000000..805d78a --- /dev/null +++ b/src/components/community-stats/KaggleLogo.js @@ -0,0 +1,32 @@ +import React from "react"; + +const KaggleLogo = () => { + return ( + + + + + + + + + + + ); +}; + +export default KaggleLogo; diff --git a/src/components/community-stats/LatestsNewsSubSection.js b/src/components/community-stats/LatestsNewsSubSection.js new file mode 100644 index 0000000..5efff04 --- /dev/null +++ b/src/components/community-stats/LatestsNewsSubSection.js @@ -0,0 +1,174 @@ +import React, { useRef, useState, useEffect } from "react"; +import newStack from "../../../static/images/news/new-stack.svg"; +import hoodline from "../../../static/images/news/hoodline.svg"; +import ArrowSlider from "../common/ArrowSlider"; +import DotSlider from "../common/DotSlider"; +import NewsUpdate from "../common/NewsUpdate"; + +export default function LatestsNewsSubSection() { + const newsAndUpdates = [ + { + id: 1, + imgSrc: newStack, + label: "News", + text: "What’s Next for Companies Built on Open Source?", + link: "https://thenewstack.io/whats-next-for-companies-built-on-open-source/", + }, + { + id: 2, + imgSrc: hoodline, + label: "News", + text: "MIT's DataCebo Reinvents Software Testing with Over 1 Million Downloads of Synthetic Data Vault", + link: "https://hoodline.com/2024/03/mit-s-datacebo-reinvents-software-testing-with-over-1-million-downloads-of-synthetic-data-vault/", + }, + { + id: 3, + imgSrc: newStack, + label: "Announcements", + text: "Introducing Constraint-Augmented Generation (CAG)", + link: "https://datacebo.com/announcements/introducing-cag", + }, + { + id: 4, + imgSrc: hoodline, + label: "Blog", + text: "How ING Belgium Uses DataCebo’s SDV Enterprise to Create Synthetic Data for 100x the Test Coverage", + link: "https://datacebo.com/blog/ing-belgium-sepa", + }, + { + id: 5, + imgSrc: newStack, + label: "News", + text: "DataCebo Creates Synthetic Enterprise Data With Actually Useful Generative AI", + link: "https://www.forbes.com/sites/justinwarren/2024/04/29/datacebo-creates-synthetic-enterprise-data-with-actually-useful-generative-ai", + }, + { + id: 6, + imgSrc: hoodline, + label: "News", + text: "What is synthetic data — and how can it help you competitively?", + link: "https://mitsloan.mit.edu/ideas-made-to-matter/what-synthetic-data-and-how-can-it-help-you-competitively", + }, + ]; + + const scrollRef = useRef(null); + const [currentSlide, setCurrentSlide] = useState(0); + const [windowWidth, setWindowWidth] = useState( + typeof window !== "undefined" ? window.innerWidth : 0 + ); + + useEffect(() => { + const handleResize = () => setWindowWidth(window.innerWidth); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + + const isLg = windowWidth >= 1024; + const isMd = windowWidth >= 768 && windowWidth < 1024; + const visibleSlides = isLg ? 2 : 1; + const maxSlide = newsAndUpdates.length - visibleSlides; + const isAtStart = currentSlide === 0; + const isAtEnd = currentSlide === maxSlide; + + const handleNext = () => { + setCurrentSlide((prev) => Math.min(prev + 1, maxSlide)); + }; + + const handlePrev = () => { + setCurrentSlide((prev) => Math.max(prev - 1, 0)); + }; + + const containerWidth = scrollRef.current?.offsetWidth || 0; + const cardWidth = isLg + ? containerWidth / 2 + : isMd + ? containerWidth * 0.85 + : containerWidth; + + const translateX = -(currentSlide * cardWidth); + + const touchStartX = useRef(0); + const touchEndX = useRef(0); + + const handleTouchStart = (e) => { + touchStartX.current = e.touches[0].clientX; + }; + + const handleTouchMove = (e) => { + touchEndX.current = e.touches[0].clientX; + }; + + const handleTouchEnd = () => { + const deltaX = touchStartX.current - touchEndX.current; + const minSwipe = 50; + + if (Math.abs(deltaX) > minSwipe) { + if (deltaX > 0 && !isAtEnd) { + handleNext(); + } else if (deltaX < 0 && !isAtStart) { + handlePrev(); + } + } + }; + + return ( +
    +
    +
    +

    + Latest news and updates +

    +
    + +
    +
    +
    +
    +
    + {newsAndUpdates.map((n, idx) => ( +
    + +
    + ))} +
    +
    + setCurrentSlide(ind)} + /> +
    +
    +
    +
    +
    + ); +} diff --git a/src/components/community-stats/MapfreeLogo.js b/src/components/community-stats/MapfreeLogo.js new file mode 100644 index 0000000..c3dfadf --- /dev/null +++ b/src/components/community-stats/MapfreeLogo.js @@ -0,0 +1,30 @@ +import React from "react"; + +const MapfreeLogo = () => { + return ( + + + + + + ); +}; + +export default MapfreeLogo; diff --git a/src/components/community-stats/NewsSliderSection.js b/src/components/community-stats/NewsSliderSection.js new file mode 100644 index 0000000..4e5a163 --- /dev/null +++ b/src/components/community-stats/NewsSliderSection.js @@ -0,0 +1,185 @@ +import React, { useRef, useState, useEffect } from "react"; +import dataceboIng from "../../../static/images/news/datacebo-ing.svg"; +// import sdvTenMillions from "../../../static/images/news/sdv-ten-millions.svg"; +import aiPowered from "../../../static/images/news/ai-powered.svg"; +import aiConnectors from "../../../static/images/news/ai-connectors.svg"; +import cag from "../../../static/images/news/cag.svg"; +import forbes from "../../../static/images/news/forbes.svg"; +import syntDataNews from "../../../static/images/news/synt-data-news.svg"; +import ArrowSlider from "../common/ArrowSlider"; +import DotSlider from "../common/DotSlider"; +import NewsUpdate from "../common/NewsUpdate"; + +export default function NewsSliderSection() { + const newsAndUpdates = [ + // { + // id: 1, + // imgSrc: sdvTenMillions, + // label: "Announcements", + // text: "SDV reaches 10 Million Downloads", + // link: "https://datacebo.com/announcements/sdv-reaches-10-million-downloads/", + // }, + { + id: 2, + imgSrc: aiPowered, + label: "News", + text: "How “AI powered” synthetic data boosts software engineering", + link: "https://medium.com/ing-blog/how-ai-powered-synthetic-data-boosts-software-engineering-d89ad77ca2e7", + }, + { + id: 3, + imgSrc: aiConnectors, + label: "Announcements", + text: "Introducing AI Connectors", + link: "https://datacebo.com/announcements/introducing-ai-connectors", + }, + { + id: 4, + imgSrc: cag, + label: "Announcements", + text: "Introducing Constraint-Augmented Generation (CAG)", + link: "https://datacebo.com/announcements/introducing-cag", + }, + { + id: 5, + imgSrc: dataceboIng, + label: "Blog", + text: "How ING Belgium Uses DataCebo’s SDV Enterprise to Create Synthetic Data for 100x the Test Coverage", + link: "https://datacebo.com/blog/ing-belgium-sepa", + }, + { + id: 6, + imgSrc: forbes, + label: "News", + text: "DataCebo Creates Synthetic Enterprise Data With Actually Useful Generative AI", + link: "https://www.forbes.com/sites/justinwarren/2024/04/29/datacebo-creates-synthetic-enterprise-data-with-actually-useful-generative-ai", + }, + { + id: 7, + imgSrc: syntDataNews, + label: "News", + text: "What is synthetic data — and how can it help you competitively?", + link: "https://mitsloan.mit.edu/ideas-made-to-matter/what-synthetic-data-and-how-can-it-help-you-competitively", + }, + ]; + + const scrollRef = useRef(null); + const [currentSlide, setCurrentSlide] = useState(0); + const [windowWidth, setWindowWidth] = useState( + typeof window !== "undefined" ? window.innerWidth : 0 + ); + + useEffect(() => { + const handleResize = () => setWindowWidth(window.innerWidth); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + + const isLg = windowWidth >= 1024; + const isMd = windowWidth >= 768 && windowWidth < 1024; + const visibleSlides = isLg ? 2 : 1; + const maxSlide = newsAndUpdates.length - visibleSlides; + const isAtStart = currentSlide === 0; + const isAtEnd = currentSlide === maxSlide; + + const handleNext = () => { + setCurrentSlide((prev) => Math.min(prev + 1, maxSlide)); + }; + + const handlePrev = () => { + setCurrentSlide((prev) => Math.max(prev - 1, 0)); + }; + + const containerWidth = scrollRef.current?.offsetWidth || 0; + const cardWidth = isLg + ? containerWidth / 2 + : isMd + ? containerWidth * 0.85 + : containerWidth; + + const translateX = -(currentSlide * cardWidth); + + const touchStartX = useRef(0); + const touchEndX = useRef(0); + + const handleTouchStart = (e) => { + touchStartX.current = e.touches[0].clientX; + }; + + const handleTouchMove = (e) => { + touchEndX.current = e.touches[0].clientX; + }; + + const handleTouchEnd = () => { + const deltaX = touchStartX.current - touchEndX.current; + const minSwipe = 50; + + if (Math.abs(deltaX) > minSwipe) { + if (deltaX > 0 && !isAtEnd) { + handleNext(); + } else if (deltaX < 0 && !isAtStart) { + handlePrev(); + } + } + }; + + return ( +
    +
    +
    +

    + Latest news and updates +

    +
    + +
    +
    +
    +
    +
    + {newsAndUpdates.map((n, idx) => ( +
    + +
    + ))} +
    +
    + setCurrentSlide(ind)} + /> +
    +
    +
    +
    +
    + ); +} diff --git a/src/components/community-stats/SdvCommunityHero.js b/src/components/community-stats/SdvCommunityHero.js new file mode 100644 index 0000000..90c0467 --- /dev/null +++ b/src/components/community-stats/SdvCommunityHero.js @@ -0,0 +1,55 @@ +import React from "react"; +import worldMap from "../../../static/world-map.png"; +import eastIcon from "../../../static/east.svg"; + +export default function SdvCommunityHero() { + return ( +
    +
    +
    +
    +

    + + SDV
    +
    + Community +

    + +
    + + +
    +
    +
    + World map +
    +
    +
    +
    + ); +} diff --git a/src/components/community-stats/SdvCoreSection.js b/src/components/community-stats/SdvCoreSection.js new file mode 100644 index 0000000..607d4b6 --- /dev/null +++ b/src/components/community-stats/SdvCoreSection.js @@ -0,0 +1,153 @@ +import React, { useState, useRef, useEffect } from "react"; +import Table from "../common/table/Table"; +import TableHeader from "../common/table/TableHeader"; +import TableHeaderCell from "../common/table/TableHeaderCell"; +import TableBody from "../common/table/TableBody"; +import TableRow from "../common/table/TableRow"; +import TableRowCell from "../common/table/TableRowCell"; +import useWindowWidth from "../../hooks/useviewport"; + +export default function SdvCoreSection({ dependenciesData }) { + const currentYear = new Date().getFullYear().toString(); + const metricKeys = ["toDate", "yearToDate"]; + const metricLabels = ["To date", currentYear]; + const [tableColDimensions, setTableColDimensions] = useState( + "minmax(208px, 208px) minmax(136px, 488px) minmax(136px, 488px)" + ); + const width = useWindowWidth(); + const isMobile = width < 768; + + const [activeMetricIndex, setActiveMetricIndex] = useState(0); + const touchStartX = useRef(null); + + useEffect(() => { + setTableColDimensions( + isMobile + ? "minmax(208px, 208px) minmax(136px, 488px)" + : "minmax(208px, 208px) minmax(136px, 488px) minmax(136px, 488px)" + ); + }, [isMobile]); + + const handleSwipeStart = (e) => { + touchStartX.current = e.touches[0].clientX; + }; + + const handleSwipeMove = (e) => { + if (touchStartX.current === null) return; + const deltaX = e.touches[0].clientX - touchStartX.current; + const threshold = 50; + + if (deltaX > threshold) { + setActiveMetricIndex((prev) => Math.max(prev - 1, 0)); + touchStartX.current = null; + } else if (deltaX < -threshold) { + setActiveMetricIndex((prev) => Math.min(prev + 1, metricKeys.length - 1)); + touchStartX.current = null; + } + }; + + return ( +
    +
    +

    + SDV Community +

    + + +
    + + + {isMobile && ( +
    +
    +
    + )} +
    + {isMobile ? ( +
    + + {metricLabels[activeMetricIndex]} + +
    + ) : ( + <> + {metricLabels.map((ml) => ( + {ml} + ))} + + )} + + + + {dependenciesData.map((row, idx) => { + const isLast = idx === dependenciesData.length - 1; + + return ( + +
    + +
    + {row.name} +
    +
    + + {isMobile && ( +
    +
    +
    + )} +
    + {isMobile ? ( +
    + +
    + {row[metricKeys[activeMetricIndex]]} +
    +
    +
    + ) : ( + <> + +
    + {row.toDate} +
    +
    + +
    + {row.yearToDate} +
    +
    + + )} + + ); + })} + +
    +
    +
    + ); +} diff --git a/src/components/community-stats/SdvInNumbersSection.js b/src/components/community-stats/SdvInNumbersSection.js new file mode 100644 index 0000000..bdf1de1 --- /dev/null +++ b/src/components/community-stats/SdvInNumbersSection.js @@ -0,0 +1,199 @@ +import React, { useState, useEffect, useRef } from "react"; +import Table from "../common/table/Table"; +import TableHeader from "../common/table/TableHeader"; +import TableHeaderCell from "../common/table/TableHeaderCell"; +import TableBody from "../common/table/TableBody"; +import TableRow from "../common/table/TableRow"; +import TableRowCell from "../common/table/TableRowCell"; +import Tab from "../common/Tab"; +import useWindowWidth from "../../hooks/useviewport"; +import CustomPieChart from "./CustomPieChart"; + +export default function SdvInNumbersSection({ data }) { + const currentYear = new Date().getFullYear().toString(); + const metricKeys = ["toDate", "yearToDate"]; + const metricLabels = ["To date", currentYear]; + const [tableColDimensions, setTableColDimensions] = useState( + "minmax(208px, 208px) minmax(136px, 488px) minmax(136px, 488px)" + ); + const width = useWindowWidth(); + const isMobile = width < 768; + + const [activeMetricIndex, setActiveMetricIndex] = useState(0); + const touchStartX = useRef(null); + + useEffect(() => { + setTableColDimensions( + isMobile + ? "minmax(208px, 208px) minmax(136px, 488px)" + : "minmax(208px, 208px) minmax(136px, 488px) minmax(136px, 488px)" + ); + }, [isMobile]); + + const handleSwipeStart = (e) => { + touchStartX.current = e.touches[0].clientX; + }; + + const handleSwipeMove = (e) => { + if (touchStartX.current === null) return; + const deltaX = e.touches[0].clientX - touchStartX.current; + const threshold = 50; + + if (deltaX > threshold) { + setActiveMetricIndex((prev) => Math.max(prev - 1, 0)); + touchStartX.current = null; + } else if (deltaX < -threshold) { + setActiveMetricIndex((prev) => Math.min(prev + 1, metricKeys.length - 1)); + touchStartX.current = null; + } + }; + + const [tabs, setTabs] = useState([ + { label: "Visualize", isActive: true }, + { label: "Downloads", isActive: false }, + // { label: "Users", isActive: false }, + ]); + const activeTab = tabs.find((t) => t.isActive); + + const clickTab = (label) => { + setTabs((prevTabs) => + prevTabs.map((tab) => ({ + ...tab, + isActive: tab.label === label, + })) + ); + }; + + return ( +
    +
    +

    + The Synthetic Data Vault{" "} +
    + in numbers +

    + +
    + {tabs.map((t) => ( + clickTab(t.label)} + > + {t.label} + + ))} +
    +
    + {activeTab.label === "Downloads" && ( + + +
    + + + {isMobile && ( +
    +
    +
    + )} +
    + {isMobile ? ( +
    + + {metricLabels[activeMetricIndex]} + +
    + ) : ( + <> + {metricLabels.map((ml) => ( + {ml} + ))} + + )} + + + + {data.map((row, idx) => { + const isLast = idx === data.length - 1; + + return ( + +
    + +
    + {row.name} +
    +
    + + {isMobile && ( +
    +
    +
    + )} +
    + {isMobile ? ( +
    + +
    + {row[metricKeys[activeMetricIndex]]} +
    +
    +
    + ) : ( + <> + +
    + {row.toDate} +
    +
    + +
    + {row.yearToDate} +
    +
    + + )} + + ); + })} + +
    + )} + {activeTab.label === "Visualize" && } +
    +
    +
    + ); +} diff --git a/src/components/community-stats/SdvOpenCoreSection.js b/src/components/community-stats/SdvOpenCoreSection.js new file mode 100644 index 0000000..97b51cd --- /dev/null +++ b/src/components/community-stats/SdvOpenCoreSection.js @@ -0,0 +1,107 @@ +import React, { useState, useRef } from "react"; +import firstSlide from "../../../static/first-slide.svg"; +import secondSlide from "../../../static/second-slide.svg"; +import thirdSlide from "../../../static/third-slide.svg"; +import DotSlider from "../common/DotSlider"; +import ArrowSlider from "../common/ArrowSlider"; + +export default function SdvOpenCoreSection() { + const slides = [ + { + link: "https://docs.sdv.dev/sdv", + imgSrc: firstSlide, + }, + { + link: "https://docs.sdv.dev/sdv", + imgSrc: secondSlide, + }, + { + link: "https://docs.sdv.dev/sdv", + imgSrc: thirdSlide, + }, + ]; + + const [activeSliderIndex, setActiveSliderIndex] = useState(0); + const activeSlide = slides[activeSliderIndex]; + + const touchStartX = useRef(0); + const touchEndX = useRef(0); + + const handleTouchStart = (e) => { + touchStartX.current = e.changedTouches[0].screenX; + }; + + const handleTouchEnd = (e) => { + touchEndX.current = e.changedTouches[0].screenX; + handleSwipeGesture(); + }; + + const handleSwipeGesture = () => { + const threshold = 50; + const diff = touchStartX.current - touchEndX.current; + + if (Math.abs(diff) > threshold) { + if (diff > 0 && activeSliderIndex < slides.length - 1) { + setActiveSliderIndex((prev) => prev + 1); + } else if (diff < 0 && activeSliderIndex > 0) { + setActiveSliderIndex((prev) => prev - 1); + } + } + }; + + const handlePrev = () => { + if (activeSliderIndex > 0) { + setActiveSliderIndex((prev) => prev - 1); + } + }; + + const handleNext = () => { + if (activeSliderIndex < slides.length - 1) { + setActiveSliderIndex((prev) => prev + 1); + } + }; + + const isAtStart = activeSliderIndex === 0; + const isAtEnd = activeSliderIndex === slides.length - 1; + + return ( +
    +
    +

    + SDV: An open core software for tabular Generative AI +

    + +
    + Illustration +
    +
    +
    + setActiveSliderIndex(ind)} + /> + +
    +
    +
    + ); +} diff --git a/src/components/community-stats/SparNordLogo.js b/src/components/community-stats/SparNordLogo.js new file mode 100644 index 0000000..56e1c8f --- /dev/null +++ b/src/components/community-stats/SparNordLogo.js @@ -0,0 +1,44 @@ +import React from "react"; + +const SparNordLogo = () => { + return ( + + + + + + + + + + + + + + ); +}; + +export default SparNordLogo; diff --git a/src/components/community-stats/SynthesizeCardsSection.js b/src/components/community-stats/SynthesizeCardsSection.js new file mode 100644 index 0000000..442347c --- /dev/null +++ b/src/components/community-stats/SynthesizeCardsSection.js @@ -0,0 +1,78 @@ +import React from "react"; +import SingleTableIcon from "../SingleTableIcon"; +import MultiTableIcon from "../MultiTableIcon"; +import SequentialTableIcon from "../SequentialTableIcon"; + +export default function SynthesizeCardsSection() { + const cards = [ + { + title: "Single Table", + desc: "Learn a tabular model to synthesize rows in a table", + icon: , + link: "https://colab.research.google.com/drive/1F3WWduNjcX4oKck6XkjlwZ9zIsWlTGEM?usp=sharing", + }, + { + title: "Multi Table", + desc: "Learn a relational data model to synthesize multiple, related tables", + icon: , + link: "https://colab.research.google.com/drive/1L6i-JhJK9ROG-KFcyzT9G-8FC3L8y8Lc?usp=sharing", + }, + { + title: "Sequential Table", + desc: "Learn a sequential or time series model to synthesize new events", + icon: , + link: "https://colab.research.google.com/drive/1YLk2uwn8yrSRPy0soEeJwu8Hdk_tGTlE?usp=sharing", + }, + ]; + + const onCardClick = (link) => { + window.open(link, "_blank", "noopener"); + }; + + return ( +
    +

    + Learn how to synthesize +

    +
    +
    + {cards.map((c) => ( +
    onCardClick(c.link)} + className="flex flex-col flex-1 cursor-pointer pt-[30px] px-6 pb-6 md:pt-6 md:px-9 md:pb-9 bg-midnight-25 border border-midnight-50 rounded-20 transition-all duration-500 hover:shadow-[0px_20px_30px_-15px_rgba(0,0,54,0.08),_0px_1px_2px_0px_rgba(0,0,54,0.04)]" + > +
    {c.icon}
    +

    + {c.title} +

    +

    + {c.desc} +

    +
    + ))} +
    +
    + +
    +
    + {cards.map((c) => ( +
    onCardClick(c.link)} + className="min-w-[395px] snap-start flex flex-col cursor-pointer pt-[30px] px-6 pb-6 md:pt-6 md:px-9 md:pb-9 bg-midnight-25 border border-midnight-50 rounded-20 transition-all duration-500 hover:shadow-[0px_20px_30px_-15px_rgba(0,0,54,0.08),_0px_1px_2px_0px_rgba(0,0,54,0.04)]" + > +
    {c.icon}
    +

    + {c.title} +

    +

    + {c.desc} +

    +
    + ))} +
    +
    +
    + ); +} diff --git a/src/components/home/hero.js b/src/components/home/hero.js index 0ea5888..8d30832 100644 --- a/src/components/home/hero.js +++ b/src/components/home/hero.js @@ -1,19 +1,20 @@ import React from "react"; - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faGithub, faSlack, faLinkedin } from "@fortawesome/free-brands-svg-icons"; -import config from "../../utils/siteConfig" -import WhiteBottomWave from "./wave-bottom-white" - - -export default function Hero({downloads}) { +import { + faGithub, + faSlack, + faLinkedin, +} from "@fortawesome/free-brands-svg-icons"; +import config from "../../utils/siteConfig"; +import WhiteBottomWave from "./wave-bottom-white"; +export default function Hero() { return (
    @@ -21,35 +22,53 @@ export default function Hero({downloads}) {

    SDV - The Synthetic Data Vault + + The Synthetic Data Vault +

    -
    - - - -
    -
    - - - -
    +
    + + + +
    +
    + + + +
    -
    - - - -
    -
    +
    + + + +
    +
    -
    sdv hero
    +
    + sdv hero +
    @@ -57,7 +76,6 @@ export default function Hero({downloads}) { - ); } diff --git a/src/components/home/protect-enhance.js b/src/components/home/protect-enhance.js index 4cd6e74..9a98610 100644 --- a/src/components/home/protect-enhance.js +++ b/src/components/home/protect-enhance.js @@ -1,62 +1,63 @@ -import React from 'react' +import React from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faGithub } from "@fortawesome/free-brands-svg-icons"; - -import WhiteTopWave from "./wave-top-white" -import WhiteBottomWave from "./wave-bottom-white" - -import TestSoftware from "../../../assets/test-software.svg" -import ExpandAccess from "../../../assets/expand-access.svg" -import PilotProducts from "../../../assets/pilot-new-products.svg" -import AugmentData from "../../../assets/augment-data.svg" -import PlanScenarios from "../../../assets/plan-scenarios.svg" - - +import WhiteBottomWave from "./wave-bottom-white"; +import TestSoftware from "../../../assets/test-software.svg"; +import ExpandAccess from "../../../assets/expand-access.svg"; +import PilotProducts from "../../../assets/pilot-new-products.svg"; +import AugmentData from "../../../assets/augment-data.svg"; +import PlanScenarios from "../../../assets/plan-scenarios.svg"; export default function ProtectEnhance() { - const useCases = [ { svg: , name: "Test Software", - url: "https://datacebo.com/blog/fake-to-synthetic-ml/" + url: "https://datacebo.com/blog/fake-to-synthetic-ml/", }, { svg: , name: "Expand Access", - url: "" + url: "", }, { svg: , name: "Pilot New Products", - url: "" + url: "", }, { svg: , name: "Augment Data", - url: "https://datacebo.com/blog/synthetic-label-balancing/" + url: "https://datacebo.com/blog/synthetic-label-balancing/", }, { svg: , name: "Plan Scenarios", - url: "https://datacebo.com/blog/sdv-flights-synthesizer/" + url: "https://datacebo.com/blog/sdv-flights-synthesizer/", }, - ] + ]; return ( -
    +
    {/*
    */}
    -

    The Synthetic Data Vault

    -

    What can you use synthetic data for?

    +

    + The Synthetic Data Vault +

    +

    + What can you use synthetic data for? +

    - Use a synthetic data in place of real data for added protection, or - use it in addition to your real data as an enhancement. + Use a synthetic data in place of real data for added protection, + or use it in addition to your real data as an enhancement.

    @@ -64,43 +65,50 @@ export default function ProtectEnhance() {
    - { - useCases.map((item, idx) => { - - if (item.url) { - return () - } - + {useCases.map((item, idx) => { + if (item.url) { return (
    -
    -
    { item.svg }
    -

    {item.name}

    -
    + +
    + {item.svg} +
    +

    {item.name}

    +
    +
    + ); + } + + return ( +
    +
    +
    {item.svg}
    +

    + {item.name} +

    - ) - }) - } +
    + ); + })}
    @@ -108,5 +116,5 @@ export default function ProtectEnhance() {
    - ) -} \ No newline at end of file + ); +} diff --git a/src/hooks/useviewport.js b/src/hooks/useviewport.js new file mode 100644 index 0000000..e2d3c5a --- /dev/null +++ b/src/hooks/useviewport.js @@ -0,0 +1,27 @@ +import { useState, useEffect } from "react"; + +function useWindowWidth() { + const [width, setWidth] = useState(0); + + useEffect(() => { + const handleResize = () => { + setWidth(window.innerWidth); + }; + + // Handle initial load + handleResize(); + + // Add event listeners + window.addEventListener("resize", handleResize); + window.addEventListener("load", handleResize); + + return () => { + window.removeEventListener("resize", handleResize); + window.removeEventListener("load", handleResize); + }; + }, []); + + return width; +} + +export default useWindowWidth; diff --git a/src/pages/community-guidelines-slack.js b/src/pages/community-guidelines-slack.js index 71ea491..748a83a 100644 --- a/src/pages/community-guidelines-slack.js +++ b/src/pages/community-guidelines-slack.js @@ -39,7 +39,7 @@ const ResourcesPage = () => {
    -

    +

    SDV Slack Community Guidelines

    @@ -85,22 +85,48 @@ const ResourcesPage = () => {

    -

    +

    1. Discuss and participate openly

    - We created our Slack Community as an open place to discuss the SDV. Anyone can join our community by creating a profile. Whether it's through asking questions, having detailed discussions or reacting to existing conversations, you are welcome to engage with the community in any way you feel comfortable. Feel free to answer questions by replying in a thread, especially if you've run into the same problems in the past or have workarounds. -

    -

    - The guidance below allows us to keep the community safe: + We created our Slack Community as an open place to discuss the + SDV. Anyone can join our community by creating a profile. + Whether it's through asking questions, having detailed + discussions or reacting to existing conversations, you are + welcome to engage with the community in any way you feel + comfortable. Feel free to answer questions by replying in a + thread, especially if you've run into the same problems in the + past or have workarounds.

    +

    The guidance below allows us to keep the community safe:

      -
    • We encourage SDV Slack members to create profiles that accurately represent who they are, including their name, profile image and email. Please do not deliberately change your identity in order to mislead the community, for example by providing a temporary email or a fake name or profile photo. Impersonating others could also result in your expulsion.
    • -
    • We encourage everyone to communicate in public channels instead of through private Direct Messages (DMs). When you keep discussions in the public space, everyone in the community can benefit from the solutions that you find, and others can also join in. This also applies to communicating with SDV team members — we try to respond to questions on a first-come, first-serve basis, and generally get to everything within a few business days. You will not receive a faster response by directly messaging individual members of the SDV team.
    • +
    • + We encourage SDV Slack members to create profiles that + accurately represent who they are, including their name, + profile image and email. Please do not deliberately change + your identity in order to mislead the community, for example + by providing a temporary email or a fake name or profile + photo. Impersonating others could also result in your + expulsion. +
    • +
    • + We encourage everyone to communicate in public channels + instead of through private Direct Messages (DMs). When you + keep discussions in the public space, everyone in the + community can benefit from the solutions that you find, and + others can also join in. This also applies to communicating + with SDV team members — we try to respond to questions on a + first-come, first-serve basis, and generally get to everything + within a few business days.{" "} + + You will not receive a faster response by directly + messaging individual members of the SDV team. + +
    -

    +

    2. Keep the workspace organized

    @@ -135,11 +161,11 @@ const ResourcesPage = () => {

    If you cannot find any related material, post your question in the appropriate channel depending on the use – for eg. - #single-table, #multi-table, #timeseries, #sdmetrics, etc. For general - questions, use #sdv-dev. We recommend you use only 1 block of - text to write your initial question. The text will become the - start of a new thread, and new replies will appear nested - underneath it: + #single-table, #multi-table, #timeseries, #sdmetrics, etc. For + general questions, use #sdv-dev. We recommend you use only 1 + block of text to write your initial question. The text will + become the start of a new thread, and new replies will appear + nested underneath it:

    {

    -

    +

    3. Continue with involved discussions on GitHub

    @@ -196,7 +222,7 @@ const ResourcesPage = () => {

    -

    +

    4. Keep the focus on SDV usage

    @@ -249,7 +275,7 @@ const ResourcesPage = () => {

    -

    +

    5. Be respectful

    diff --git a/src/pages/community-stats.js b/src/pages/community-stats.js new file mode 100644 index 0000000..cabe595 --- /dev/null +++ b/src/pages/community-stats.js @@ -0,0 +1,23 @@ +import React from "react"; +import { Article } from "../components/common"; +import config from "../utils/siteConfig"; +import Seo from "../components/Seo"; +import CommunityStatsContent from "../components/community-stats/CommunityStatsContent"; + +export default function CommunityStatsPage() { + return ( +

    + + +
    + +
    +
    + ); +} diff --git a/src/pages/index.js b/src/pages/index.js index e668176..14da55f 100755 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import { Article } from "../components/common"; import Features from "../components/home/features"; import Hero from "../components/home/hero"; @@ -10,10 +10,10 @@ import config from "../utils/siteConfig"; import Seo from "../components/Seo"; export default function HomePage() { - const [downloads, setDownloads] = useState(""); - function numberWithCommas(x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } + const [downloads] = useState(""); + // function numberWithCommas(x) { + // return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + // } //Get the total number of downloads for a single release, using its tag name. @@ -49,8 +49,8 @@ export default function HomePage() { canonical={`https://sdv.dev/`} /> -
    - +
    + diff --git a/src/pages/resources.js b/src/pages/resources.js index d51e6e5..4cd34ce 100644 --- a/src/pages/resources.js +++ b/src/pages/resources.js @@ -1,33 +1,31 @@ import React from "react"; import { Article } from "../components/common"; -import { Helmet } from 'react-helmet' +import { Helmet } from "react-helmet"; import Cta from "../components/Cta"; -import config from "../utils/siteConfig" +import config from "../utils/siteConfig"; const ResourcesPage = () => (
    -
    -
    +
    +
    -

    +

    Research papers

    @@ -41,7 +39,6 @@ const ResourcesPage = () => (

    -
    code[class*="language-"] { +pre[class*="language-"], +:not(pre) > code[class*="language-"] { background: #000036 !important; } pre[class*="language-"] { - border: .3em solid #000036 !important; - font-family: 'Cern', sans-serif; + border: 0.3em solid #000036 !important; + font-family: "Cern", sans-serif; padding-left: 32px !important; padding-right: 32px !important; border-radius: 1rem !important; } -.token.keyword { +.token.keyword { font-weight: 700 !important; - color:#03C8DE !important + color: #03c8de !important; } .token.boolean { font-weight: 700 !important; - color: #01E0C9 !important; + color: #01e0c9 !important; } .token.comment { - color: #ADADAD !important; + color: #adadad !important; } .sal-animate .img-cover:nth-of-type(even) { - @apply translate-y-full + @apply translate-y-full; } .sal-animate .img-cover:nth-of-type(odd) { - @apply -translate-y-full + @apply -translate-y-full; } .logo-stripe { animation: marquee 50s linear infinite; - -webkit-mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.776042) 20%, #000000 80%, rgba(0, 0, 0, 0) 100%); - mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.776042) 20%, #000000 80%, rgba(0, 0, 0, 0) 100%); + -webkit-mask-image: linear-gradient( + 90deg, + rgba(0, 0, 0, 0) 0%, + rgba(0, 0, 0, 0.776042) 20%, + #000000 80%, + rgba(0, 0, 0, 0) 100% + ); + mask-image: linear-gradient( + 90deg, + rgba(0, 0, 0, 0) 0%, + rgba(0, 0, 0, 0.776042) 20%, + #000000 80%, + rgba(0, 0, 0, 0) 100% + ); width: 100%; height: 48px; @@ -148,4 +183,46 @@ pre[class*="language-"] { to { background-position: -3505px 0%; } -} \ No newline at end of file +} + +.all-button { + @apply font-semibold rounded-lg text-base xs:text-lg lg:text-xl duration-200 leading-none text-center; + @apply px-6 pt-[18px] pb-[21px]; +} + +.blue-btn { + @apply rounded-lg bg-midnight-950 py-[15px] px-[18px] md:py-[17px] md:px-[20px] text-white; +} + +.blue-btn:hover { + @apply bg-[rgba(0,11,61,0.77)]; +} + +.blue-btn:focus-visible { + @apply bg-midnight-950 ring-2 ring-blue-600 ring-offset-2 ring-offset-white outline-none; +} + +.gray-btn { + @apply rounded-lg border bg-[rgba(30,30,105,0.04)] border-[rgba(0,32,99,0.03)] backdrop-blur-[50px]; + @apply text-midnight-950 py-[15px] px-[18px] md:py-[17px] md:px-[20px]; +} + +.gray-btn:hover { + @apply border bg-[rgba(5,5,88,0.06)] border-[rgba(4,32,98,0.03)]; +} + +.gray-btn:focus-visible { + @apply bg-[rgba(30,30,105,0.04)] ring-2 ring-blue-600 ring-offset-2 ring-offset-[rgba(0,32,99,0.03)] outline-none; +} + +.dotted-bg { + background: radial-gradient(#fff 1.5px, transparent 0) 1.5px 1.5px / 7px 7px; +} + +.dr-dwn { + @apply max-h-0 opacity-0 duration-500 pointer-events-none; +} + +.is-active > .dr-dwn { + @apply lg:animate-slide-up max-h-screen opacity-100 pointer-events-auto; +} diff --git a/src/utils/outside-click.js b/src/utils/outside-click.js new file mode 100644 index 0000000..8c0f0f7 --- /dev/null +++ b/src/utils/outside-click.js @@ -0,0 +1,25 @@ +import { useEffect } from "react"; + +const useOutsideClick = (ref, callback) => { + const handleClick = (e) => { + if (window.innerWidth >= 1024) { + if (ref.current && !ref.current.contains(e.target)) { + callback(); + } + } else { + if (ref.current && !ref.current.contains(e.target)) { + callback(); + } + } + }; + + useEffect(() => { + document.addEventListener("click", handleClick); + + return () => { + document.removeEventListener("click", handleClick); + }; + }); +}; + +export default useOutsideClick; diff --git a/static/banner-home-sm.png b/static/banner-home-sm.png new file mode 100644 index 0000000..fe55ea9 Binary files /dev/null and b/static/banner-home-sm.png differ diff --git a/static/chevron-backward-disabled.svg b/static/chevron-backward-disabled.svg new file mode 100644 index 0000000..7061d8a --- /dev/null +++ b/static/chevron-backward-disabled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/chevron-backward.svg b/static/chevron-backward.svg new file mode 100644 index 0000000..5dd2fb7 --- /dev/null +++ b/static/chevron-backward.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/chevron-down.svg b/static/chevron-down.svg new file mode 100644 index 0000000..5bb6723 --- /dev/null +++ b/static/chevron-down.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/chevron-forward-disabled.svg b/static/chevron-forward-disabled.svg new file mode 100644 index 0000000..04a24e4 --- /dev/null +++ b/static/chevron-forward-disabled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/chevron-forward.svg b/static/chevron-forward.svg new file mode 100644 index 0000000..4c1cf95 --- /dev/null +++ b/static/chevron-forward.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/chevron-up.svg b/static/chevron-up.svg new file mode 100644 index 0000000..5381a71 --- /dev/null +++ b/static/chevron-up.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/cta-image.png b/static/cta-image.png new file mode 100644 index 0000000..94d6314 Binary files /dev/null and b/static/cta-image.png differ diff --git a/static/datacebo-horizontal-logo.svg b/static/datacebo-horizontal-logo.svg new file mode 100644 index 0000000..f045ef7 --- /dev/null +++ b/static/datacebo-horizontal-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/east.svg b/static/east.svg new file mode 100644 index 0000000..5cb7cc0 --- /dev/null +++ b/static/east.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/first-slide.svg b/static/first-slide.svg new file mode 100644 index 0000000..2297bbb --- /dev/null +++ b/static/first-slide.svg @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/gretel.svg b/static/gretel.svg new file mode 100644 index 0000000..3d143d6 --- /dev/null +++ b/static/gretel.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/images/news/ai-connectors.svg b/static/images/news/ai-connectors.svg new file mode 100644 index 0000000..a2c5191 --- /dev/null +++ b/static/images/news/ai-connectors.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/images/news/ai-powered.svg b/static/images/news/ai-powered.svg new file mode 100644 index 0000000..3c4d96b --- /dev/null +++ b/static/images/news/ai-powered.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/images/news/cag.svg b/static/images/news/cag.svg new file mode 100644 index 0000000..e5c9014 --- /dev/null +++ b/static/images/news/cag.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/images/news/datacebo-ing.svg b/static/images/news/datacebo-ing.svg new file mode 100644 index 0000000..056f39e --- /dev/null +++ b/static/images/news/datacebo-ing.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/images/news/forbes.svg b/static/images/news/forbes.svg new file mode 100644 index 0000000..11d143e --- /dev/null +++ b/static/images/news/forbes.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/images/news/hoodline.svg b/static/images/news/hoodline.svg new file mode 100644 index 0000000..2a43d24 --- /dev/null +++ b/static/images/news/hoodline.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/news/new-stack.svg b/static/images/news/new-stack.svg new file mode 100644 index 0000000..fc6a6dd --- /dev/null +++ b/static/images/news/new-stack.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/news/sdv-ten-millions.svg b/static/images/news/sdv-ten-millions.svg new file mode 100644 index 0000000..8a25c99 --- /dev/null +++ b/static/images/news/sdv-ten-millions.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/images/news/synt-data-news.svg b/static/images/news/synt-data-news.svg new file mode 100644 index 0000000..802938b --- /dev/null +++ b/static/images/news/synt-data-news.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/resources-blog.png b/static/resources-blog.png new file mode 100644 index 0000000..e50dcfb Binary files /dev/null and b/static/resources-blog.png differ diff --git a/static/sdv-pie-chart-logo.svg b/static/sdv-pie-chart-logo.svg new file mode 100644 index 0000000..7351a06 --- /dev/null +++ b/static/sdv-pie-chart-logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/second-slide.svg b/static/second-slide.svg new file mode 100644 index 0000000..db86833 --- /dev/null +++ b/static/second-slide.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/third-slide.svg b/static/third-slide.svg new file mode 100644 index 0000000..a07ba71 --- /dev/null +++ b/static/third-slide.svg @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/world-map.png b/static/world-map.png new file mode 100644 index 0000000..a663f99 Binary files /dev/null and b/static/world-map.png differ diff --git a/tailwind.config.js b/tailwind.config.js index 6dee5ac..d3938e4 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,123 +1,195 @@ module.exports = { - content: ['./src/**/*.{js,jsx,ts,tsx}'], + content: ["./src/**/*.{js,jsx,ts,tsx}"], // darkMode: false, // or 'media' or 'class' theme: { container: { center: true, padding: { - DEFAULT: '1rem', - sm: '1rem', - md: '1.875rem', - } + DEFAULT: "1rem", + sm: "1rem", + }, }, fontFamily: { - cern: ['Cern', 'sans-serif'], + cern: ["Cern", "sans-serif"], }, fontSize: { - 'xs': '.75rem', //12 - 'sm': '.875rem', //14 - 'base': '1rem', //16 - 'lg': '1.125rem', //18 - 'xl': '1.25rem', //20 - '2xl': '1.375rem', //22 - '3xl': '1.5rem', //24 - '4xl': '1.75rem', //28 - '5xl': '2rem', //32 - h1 on mobile - '6xl': '2.25rem', //36 - '7xl': '2.5rem', //40 - '8xl': '3rem', //48 - '9xl': '3.5rem', //56 + xs: ".75rem", //12 + sm: ".875rem", //14 + base: "1rem", //16 + md: "1.0625rem", //17 + lg: "1.125rem", //18 + xl: "1.25rem", //20 + "2xl": "1.5rem", //24 + "2xl2": "1.875rem", //30 + "3xl": "2rem", //32 + "4xl": "2.25rem", // 36 + "5xl": "3rem", //48 + "6xl": "3.75rem", //60 + "7xl": "4.5rem", //72 + }, + fontWeight: { + thin: 100, + ultrathin: 200, + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, + black: 900, }, screens: { - 'sm': '640px', + xs: "412px", + // => @media (min-width: 412px) { ... } + + sm: "640px", // => @media (min-width: 640px) { ... } - 'md': '768px', + md: "768px", // => @media (min-width: 768px) { ... } - 'lg': '1024px', + lg: "1024px", // => @media (min-width: 1024px) { ... } - 'xl': '1280px', + xl: "1248px", // => @media (min-width: 1280px) { ... } }, - - extend: { + + extend: { animation: { - 'slide-up': 'slideup 300ms 200ms ease-in forwards', + "slide-up": "slideup 300ms 200ms ease-in forwards", }, keyframes: { slideup: { - '0%': { - transform: 'translateY(50px)', - opacity: 0 - }, - '100%': { - transform: 'rotate(0)', - opacity: 1 + "0%": { + transform: "translateY(50px)", + opacity: 0, + }, + "100%": { + transform: "rotate(0)", + opacity: 1, }, - } + }, }, - + borderRadius: { - '3': "3px", - '20': "20px", - '10': "10px", - '30': "30px", - '50': "50px" + 3: "3px", + 20: "20px", + 10: "10px", + 30: "30px", + 50: "50px", }, borderWidth: { - '3': '3px' + 3: "3px", }, colors: { sdv: { - highlight: '#03C8DE', - primary: '#01E0C9', - secondary: '#03AFF1', - success: '#36B37E', - warning: '#FAAD13', - error: '#F16141', - dark: '#000036', - gray: '#231F20', - graylight: '#F7F7F8', - offwhite: '#FAFAFA', - border: '#BBC0CB' + highlight: "#03C8DE", + primary: "#01E0C9", + secondary: "#03AFF1", + success: "#36B37E", + warning: "#FAAD13", + error: "#F16141", + dark: "#000036", + gray: "#231F20", + graylight: "#F7F7F8", + offwhite: "#FAFAFA", + border: "#BBC0CB", + }, + midnight: { + 0: "#FFFFFF", + 25: "#F6F6F9", + 50: "#EFEFF5", + 100: "#E5E8F2", + 200: "#D5DAE8", + 300: "#C1C8DB", + 400: "#AEB5CF", + 500: "#959FBD", + 600: "#727C9E", + 700: "#525C80", + 800: "#353E67", + 900: "#19214E", + 950: "#000036", + }, + teal: { + 950: "#003438", + 900: "#065255", + 800: "#04696A", + 700: "#008583", + 600: "#00A29B", + 500: "#04C1B3", + 400: "#01E0C9", + 300: "#67E7D4", + 200: "#95EEDE", + 100: "#BBF4E9", + 50: "#DEFAF4", + 25: "#EFFDF9", + }, + blue: { + 950: "#002152", + 900: "#003C7A", + 800: "#025596", + 700: "#1376B1", + 600: "#0690D1", + 500: "#03AFF1", + 400: "#2EC8FF", + 300: "#77DAFF", + 200: "#B7E9FF", + 100: "#DEF3FF", + 50: "#F0F9FF", + 25: "#F7FDFF", }, - light: { - primary: 'rgba(1, 224, 201, .1)', - secondary: 'rgba(3, 175, 241, .1)', - success: 'rgba(54, 179, 126, .1)', - warning: 'rgba(250, 173, 19, .1)', - error: 'rgba(241, 97, 65, .1)', - dark: 'rgba(0, 0, 54, .1)', - gray: 'rgba(35, 31, 32, .1)', - graylight: 'rgba(247, 247, 248, .1)', - offwhite: 'rgba(250, 250, 250, .1)', - } + primary: "rgba(1, 224, 201, .1)", + secondary: "rgba(3, 175, 241, .1)", + success: "rgba(54, 179, 126, .1)", + warning: "rgba(250, 173, 19, .1)", + error: "rgba(241, 97, 65, .1)", + dark: "rgba(0, 0, 54, .1)", + gray: "rgba(35, 31, 32, .1)", + graylight: "rgba(247, 247, 248, .1)", + offwhite: "rgba(250, 250, 250, .1)", + }, }, letterSpacing: { - body: '0.0125rem' + body: "0.0125rem", + "2xs": "-0.1rem", // -1.6px + xs: "-0.025rem", // -0.4px + sm: "-0.015625rem", // -0.25px + none: "0", + md: "-0.0125rem", // -0.2px + lg: "-0.00625rem", // -0.1px + xl: "0.1rem", // 1.6px + label: "0.05rem", // 0.8px }, lineHeight: { - 'extra-loose': '1.85', - 'extra-relaxed': '1.75', + none: 1, // 1 + "2xs": "1.5rem", // 24px + xs: "1.75rem", // 28px + sm: "1.875rem", // 30px + base: "2rem", //32 + md: "2.5rem", // 40px + lg: "3.5rem", // 56px + xl: "3.75rem", // 60px + "2xl": "4.5rem", // 72px + "extra-loose": "1.85", + "extra-relaxed": "1.75", }, maxWidth: { - form: "956px" + form: "956px", }, padding: { - '4/3': '75%', - 'pimg-lg': '32.15%', - 'pimg-md': '56%', - 'pimg-sm': '60%', - 'pimg-xs': '90%', - 'cimg-xs': '78%', - '21/9': '35%' + "4/3": "75%", + "pimg-lg": "32.15%", + "pimg-md": "56%", + "pimg-sm": "60%", + "pimg-xs": "90%", + "cimg-xs": "78%", + "21/9": "35%", }, spacing: { - 'input': '1.125rem', - '5': '1.875rem', + input: "1.125rem", + // 5: "1.875rem", }, }, }, @@ -125,4 +197,4 @@ module.exports = { extend: {}, }, plugins: [], -} +}; diff --git a/yarn.lock b/yarn.lock index a7ad58f..cc4aadb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1050,6 +1050,11 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.4.tgz#a91ec580e6c00c67118127777c316dfd5a5a6abf" + integrity sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA== + "@babel/standalone@^7.15.5": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.21.2.tgz#3a19c6672f8436d2d4154c05d984a4ae40d7d51c" @@ -1536,6 +1541,11 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@heroicons/react@^2.0.18": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.2.0.tgz#0c05124af50434a800773abec8d3af6a297d904b" + integrity sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ== + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -2091,6 +2101,57 @@ dependencies: "@types/node" "*" +"@types/d3-array@^3.0.3": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-ease@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-interpolate@^3.0.1": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-scale@^4.0.2": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^3.1.0": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.7.tgz#2b7b423dc2dfe69c8c93596e673e37443348c555" + integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== + +"@types/d3-timer@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + "@types/debug@^0.0.30": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df" @@ -2642,6 +2703,11 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +adler-32@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2" + integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -3685,6 +3751,14 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== +cfb@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44" + integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3912,6 +3986,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -3926,6 +4005,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" @@ -4263,6 +4347,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc-32@~1.2.0, crc-32@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-gatsby@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/create-gatsby/-/create-gatsby-1.15.0.tgz#03e88760813c954abc7239c7f17907208d11bc4a" @@ -4539,6 +4628,77 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -4588,6 +4748,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -4922,6 +5087,14 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -5713,7 +5886,7 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -5936,6 +6109,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-equals@^5.0.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.2.2.tgz#885d7bfb079fac0ce0e8450374bce29e9b742484" + integrity sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw== + fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -6212,6 +6390,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -6564,13 +6747,13 @@ gatsby-plugin-react-svg@^3.0.1: dependencies: svg-react-loader "^0.4.6" -gatsby-plugin-sass@^4.3.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/gatsby-plugin-sass/-/gatsby-plugin-sass-4.15.0.tgz#904df3c7f696016f9818652a1bdfeab6c5551748" - integrity sha512-NBun+e3cZw42dw69FQXQ21/QQpEcN6NrxX/6g9sW36eY+7xwKN7qUGovkOMQBAKhhdQ8YrbGCbuBFb0V9iZrXQ== +gatsby-plugin-sass@^5.0.0: + version "5.25.0" + resolved "https://registry.yarnpkg.com/gatsby-plugin-sass/-/gatsby-plugin-sass-5.25.0.tgz#8aedec8d58f50826c1c25faa52f94175e69b8017" + integrity sha512-e+47Z24DI+Uh3KcUbj/WvTyH4ZPXcC4zlwqhzspv1Ye+xMS1ipTsIelvBuTwiiEWBs6cqdcYAPhn7HoXX/errw== dependencies: "@babel/runtime" "^7.15.4" - resolve-url-loader "^3.1.2" + resolve-url-loader "^3.1.4" sass-loader "^10.1.1" gatsby-plugin-scroll-reveal@^0.0.7: @@ -6607,10 +6790,10 @@ gatsby-plugin-sharp@2.14.3: svgo "1.3.2" uuid "3.4.0" -gatsby-plugin-styled-components@^4.3.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-4.15.0.tgz#235e4ecd4e1be26ba9ab5760dda84d9591aa8d38" - integrity sha512-C0Qz8tL88FDsiN41JHejJAOEzyhmaXIUJZkzPQ41PYLuV//5OsAigznt3zTrq6V9ggsrulV3fWw8SmiYmSjL3w== +gatsby-plugin-styled-components@^5.0.0: + version "5.25.0" + resolved "https://registry.yarnpkg.com/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-5.25.0.tgz#e0bac90712986400376a65c6e72678bc12dff8fe" + integrity sha512-gBCgvLDz+X9Xq8BhroFWZTtURMycgARyly4SlidrPqcPtxWhJtas+gc01/uivHnjIUW6SAac8cpot3ld/PLdZA== dependencies: "@babel/runtime" "^7.15.4" @@ -7982,6 +8165,11 @@ internal-slot@^1.0.3, internal-slot@^1.0.4: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + intersection-observer@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.7.0.tgz#ee16bee978db53516ead2f0a8154b09b400bbdc9" @@ -11447,7 +11635,7 @@ prompts@^2.3.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.1, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -11699,6 +11887,11 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -11714,6 +11907,25 @@ react-side-effect@^2.1.0: resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== +react-smooth@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-4.0.4.tgz#a5875f8bb61963ca61b819cedc569dc2453894b4" + integrity sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q== + dependencies: + fast-equals "^5.0.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@17.0.1: version "17.0.1" resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" @@ -11782,6 +11994,27 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.15.3.tgz#b94d05e91e3a5df1b02368ef64400dec9e9a77d4" + integrity sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ== + dependencies: + clsx "^2.0.0" + eventemitter3 "^4.0.1" + lodash "^4.17.21" + react-is "^18.3.1" + react-smooth "^4.0.4" + recharts-scale "^0.4.4" + tiny-invariant "^1.3.1" + victory-vendor "^36.6.8" + recursive-readdir@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -12074,7 +12307,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url-loader@^3.1.2: +resolve-url-loader@^3.1.4: version "3.1.5" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz#1dce0847d4a2ef43c51f63c9fd30bf6dfbf26716" integrity sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ== @@ -12759,6 +12992,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + st@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/st/-/st-2.0.0.tgz#eabd11e7722863b8ee8cfbdd027cb25e76ff35e9" @@ -13371,6 +13611,11 @@ timm@^1.6.1: resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tinycolor2@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -14143,6 +14388,26 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +victory-vendor@^36.6.8: + version "36.9.2" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.9.2.tgz#668b02a448fa4ea0f788dbf4228b7e64669ff801" + integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -14315,11 +14580,21 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + workbox-background-sync@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" @@ -14516,6 +14791,19 @@ xhr@^2.0.1: parse-headers "^2.0.0" xtend "^4.0.0" +xlsx@^0.18.5: + version "0.18.5" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0" + integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ== + dependencies: + adler-32 "~1.3.0" + cfb "~1.2.1" + codepage "~1.15.0" + crc-32 "~1.2.1" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"