├── .editorconfig
├── .env.example
├── .eslintignore
├── .eslintrc
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ └── other.md
├── dependabot.yml
└── workflows
│ └── tests.yml
├── .gitignore
├── .percy.json
├── .storybook
├── main.js
├── preview-head.html
├── preview.js
└── webpack.config.js
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets
├── landing.png
├── meilisearch-landing-dark.png
└── meilisearch-landing-light.png
├── bors.toml
├── cypress.config.js
├── cypress
├── e2e
│ └── functional.js
└── support
│ ├── commands.js
│ └── e2e.js
├── data
├── 404.js
├── about-us.js
├── footer.js
├── header.js
├── homepage.js
├── legal.js
└── pricing.js
├── jsconfig.json
├── next.config.js
├── package.json
├── public
├── apple-touch-icon.png
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── icons
│ └── check.svg
└── images
│ ├── bjornftw.jpeg
│ ├── danpastori.jpeg
│ ├── david-boyne.png
│ ├── decorator1.svg
│ ├── decorator2.svg
│ ├── decorator3.svg
│ ├── decorator4.svg
│ ├── decorator5.svg
│ ├── decorator6.svg
│ ├── decorator7.svg
│ ├── developer.svg
│ ├── dhigit9.jpeg
│ ├── hero-desktop.svg
│ ├── hero-mobile.svg
│ ├── interactive-search-arrows.svg
│ ├── jellevliet.jpeg
│ ├── meili-logo.png
│ ├── meili-logo.svg
│ ├── meilisearch-full.svg
│ ├── meilisearch.svg
│ ├── miteshmetha.jpeg
│ ├── og-image.png
│ ├── orphikkkk.jpeg
│ ├── pricing-hero-stars-left.svg
│ ├── pricing-hero-stars-right.svg
│ ├── step1-mobile.svg
│ ├── step1.svg
│ ├── step2.svg
│ ├── step3-2-mobile.svg
│ ├── step3-2.svg
│ ├── step3-mobile.svg
│ ├── step3.svg
│ ├── teamMembers
│ ├── alexia.png
│ ├── amelie.png
│ ├── bruno.png
│ ├── carolina.png
│ ├── charline.png
│ ├── charlotte.png
│ ├── clementine.png
│ ├── dave.png
│ ├── ferdinand.png
│ ├── gui.png
│ ├── guillaume.png
│ ├── ingrid.png
│ ├── jonathan.png
│ ├── kero.png
│ ├── laurene.png
│ ├── loic.png
│ ├── louis.png
│ ├── luna.png
│ ├── many.png
│ ├── maryam.png
│ ├── morgane-d.png
│ ├── morgane-n.png
│ ├── nico.png
│ ├── olu.png
│ ├── quentin.png
│ ├── sam.png
│ ├── tamo.png
│ ├── thomas.png
│ └── tommy.png
│ ├── theraloss.jpeg
│ └── timeline.png
├── snapshots.yml
├── src
├── blocks
│ ├── AboutUsHero.js
│ ├── Cards.js
│ ├── Companies.js
│ ├── ComparativeTable.js
│ ├── Demo.js
│ ├── Developer
│ │ ├── Terminal
│ │ │ ├── Head.js
│ │ │ ├── LeftColumn.js
│ │ │ ├── RightColumn.js
│ │ │ └── index.js
│ │ ├── Text.js
│ │ ├── TitleSection.js
│ │ └── index.js
│ ├── FAQ.js
│ ├── Footer
│ │ ├── BottomSection.js
│ │ ├── MenuSection.js
│ │ ├── Newsletter.js
│ │ └── index.js
│ ├── Header
│ │ ├── Ctas.js
│ │ ├── DesktopHeader.js
│ │ ├── Logo.js
│ │ ├── MenuLinks.js
│ │ ├── MobileHeader.js
│ │ └── index.js
│ ├── Hero.js
│ ├── Investors.js
│ ├── JobOffers.js
│ ├── OpenSource.js
│ ├── OurStory.js
│ ├── OurTeam
│ │ ├── Carousel.js
│ │ ├── TeamMemberCard.js
│ │ ├── TeamMemberList.js
│ │ └── index.js
│ ├── PerksAndBenefits.js
│ ├── PricingHero.js
│ ├── PricingPlans
│ │ ├── Plan.js
│ │ └── index.js
│ ├── Step1.js
│ ├── Step2.js
│ ├── Step3
│ │ ├── FirstSection.js
│ │ ├── SecondSection.js
│ │ ├── TitleSection.js
│ │ └── index.js
│ ├── Testimonials.js
│ ├── Values.js
│ └── index.js
├── components
│ ├── Accordion.js
│ ├── Anchor.js
│ ├── AnchorTitles.js
│ ├── Banner.js
│ ├── Bullets.js
│ ├── Button.js
│ ├── Card.js
│ ├── Checkbox.js
│ ├── Dialog
│ │ ├── DialogBackdrop.js
│ │ ├── DialogContent.js
│ │ ├── DialogDisclosure.js
│ │ └── index.js
│ ├── Disclosure
│ │ ├── Disclosure.js
│ │ ├── DisclosureContent.js
│ │ └── index.js
│ ├── FullWidthCard.js
│ ├── GithubButton.js
│ ├── Grid.js
│ ├── Head.js
│ ├── IconCard.js
│ ├── Image.js
│ ├── Input.js
│ ├── InteractiveSearch.js
│ ├── Link.js
│ ├── List.js
│ ├── Lottie.js
│ ├── Markdown.js
│ ├── Menu
│ │ ├── Menu.js
│ │ ├── MenuDisclosure.js
│ │ ├── MenuItem.js
│ │ └── index.js
│ ├── PageContent.js
│ ├── PreTitle.js
│ ├── PricingCard.js
│ ├── Radio.js
│ ├── RoundedIcon.js
│ ├── Searchbox.js
│ ├── Tab.js
│ ├── Table.js
│ ├── Tag.js
│ ├── Testimonial.js
│ ├── Tooltip.js
│ ├── Typography.js
│ └── icons
│ │ ├── Angular.js
│ │ ├── Api.js
│ │ ├── ApiReference.js
│ │ ├── Arrow.js
│ │ ├── B2CApp.js
│ │ ├── Blog.js
│ │ ├── Chat.js
│ │ ├── Code.js
│ │ ├── Cross.js
│ │ ├── Crv.js
│ │ ├── Dart.js
│ │ ├── Diamond.js
│ │ ├── Discord.js
│ │ ├── Documentation.js
│ │ ├── Dotnet.js
│ │ ├── Earth.js
│ │ ├── Ecommerce.js
│ │ ├── Excluded.js
│ │ ├── Felicis.js
│ │ ├── Filter.js
│ │ ├── GeographicSearch.js
│ │ ├── Github.js
│ │ ├── GithubOutlined.js
│ │ ├── Go.js
│ │ ├── GoRails.js
│ │ ├── Guides.js
│ │ ├── Hellonext.js
│ │ ├── HuggingFace.js
│ │ ├── Included.js
│ │ ├── Instantmeilisearch.js
│ │ ├── Integrations.js
│ │ ├── Java.js
│ │ ├── Javascript.js
│ │ ├── Juicebrothers.js
│ │ ├── Key.js
│ │ ├── KimaVentures.js
│ │ ├── Laravel.js
│ │ ├── Lightning.js
│ │ ├── Linkedin.js
│ │ ├── Literal.js
│ │ ├── LocalGlobe.js
│ │ ├── LouisVuitton.js
│ │ ├── MagnifyingGlass.js
│ │ ├── Mango.js
│ │ ├── Media.js
│ │ ├── NumericSorting.js
│ │ ├── Other.js
│ │ ├── Palmes.js
│ │ ├── Php.js
│ │ ├── PlatformSh.js
│ │ ├── Plug.js
│ │ ├── Puzzle.js
│ │ ├── Python.js
│ │ ├── Rails.js
│ │ ├── React.js
│ │ ├── RightArrow.js
│ │ ├── Roadmap.js
│ │ ├── Roadmap2.js
│ │ ├── Rocket.js
│ │ ├── Ruby.js
│ │ ├── Rust.js
│ │ ├── SaasApp.js
│ │ ├── Seedcamp.js
│ │ ├── SiteSearch.js
│ │ ├── SortBy.js
│ │ ├── Star.js
│ │ ├── Swift.js
│ │ ├── Symfony.js
│ │ ├── TextualSearch.js
│ │ ├── Twitter.js
│ │ ├── Typo.js
│ │ ├── Vercel.js
│ │ ├── Vue.js
│ │ ├── Wrench.js
│ │ ├── index.js
│ │ └── svg
│ │ ├── API.svg
│ │ ├── CRV.svg
│ │ ├── Code.svg
│ │ ├── angular.svg
│ │ ├── arrow.svg
│ │ ├── blog.svg
│ │ ├── chat.svg
│ │ ├── cross.svg
│ │ ├── dart.svg
│ │ ├── diamond.svg
│ │ ├── discord.svg
│ │ ├── documentation.svg
│ │ ├── dotnet.svg
│ │ ├── earth.svg
│ │ ├── excluded.svg
│ │ ├── felicis.svg
│ │ ├── filter.svg
│ │ ├── github.svg
│ │ ├── github_outlined.svg
│ │ ├── go.svg
│ │ ├── go_rails.svg
│ │ ├── guides.svg
│ │ ├── hellonext.svg
│ │ ├── hugging_face.svg
│ │ ├── included.svg
│ │ ├── instantmeilisearch.svg
│ │ ├── java.svg
│ │ ├── javascript.svg
│ │ ├── juicebrothers.svg
│ │ ├── key.svg
│ │ ├── kima_ventures.svg
│ │ ├── laravel.svg
│ │ ├── lightning.svg
│ │ ├── linkedin.svg
│ │ ├── literal.svg
│ │ ├── local_globe.svg
│ │ ├── louis_vuitton.svg
│ │ ├── magnifying_glass.svg
│ │ ├── mango.svg
│ │ ├── palmes.svg
│ │ ├── php.svg
│ │ ├── platform_sh.svg
│ │ ├── plug.svg
│ │ ├── puzzle.svg
│ │ ├── python.svg
│ │ ├── rails.svg
│ │ ├── react.svg
│ │ ├── right_arrow.svg
│ │ ├── roadmap.svg
│ │ ├── roadmap2.svg
│ │ ├── rocket.svg
│ │ ├── ruby.svg
│ │ ├── rust.svg
│ │ ├── seedcamp.svg
│ │ ├── sort_by.svg
│ │ ├── star.svg
│ │ ├── swift.svg
│ │ ├── symfony.svg
│ │ ├── twitter.svg
│ │ ├── typo.svg
│ │ ├── vercel.svg
│ │ ├── vue.svg
│ │ └── wrench.svg
├── hooks
│ └── useWindowSize.js
├── layouts
│ ├── BaseLayout.js
│ └── LegalLayout.js
├── lotties
│ ├── animatedArrows.json
│ ├── hamburgerMenu.json
│ ├── hero-desktop.json
│ ├── hero-mobile.json
│ └── opensource.json
├── pages
│ ├── 404.js
│ ├── [legal].js
│ ├── _app.js
│ ├── _document.js
│ ├── about-us.js
│ ├── index.js
│ ├── pricing.js
│ ├── privacy-policy.mdx
│ └── terms-of-use.mdx
├── stories
│ ├── AboutUsHero.stories.js
│ ├── Accordion.stories.js
│ ├── Bullets.stories.js
│ ├── Button.stories.js
│ ├── Card.stories.js
│ ├── Cards.stories.js
│ ├── Checkbox.stories.js
│ ├── Companies.stories.js
│ ├── Demo.stories.js
│ ├── Dialog.stories.js
│ ├── Disclosure.stories.js
│ ├── FAQ.stories.js
│ ├── Footer.stories.js
│ ├── GithubButton.stories.js
│ ├── Header.stories.js
│ ├── Hero.stories.js
│ ├── Icons.stories.js
│ ├── Input.stories.js
│ ├── InteractiveSearch.stories.js
│ ├── Investors.stories.js
│ ├── JobOffers.stories.js
│ ├── Link.stories.js
│ ├── List.stories.js
│ ├── Menu.stories.js
│ ├── OpenSource.stories.js
│ ├── OurStory.stories.js
│ ├── OurTeam.stories.js
│ ├── PerksAndBenefits.stories.js
│ ├── PreTitle.stories.js
│ ├── Pricing.stories.js
│ ├── PricingCard.stories.js
│ ├── PricingHero.stories.js
│ ├── Radio.stories.js
│ ├── RoundedIcon.stories.js
│ ├── Searchbox.stories.js
│ ├── Step1.stories.js
│ ├── Step2.stories.js
│ ├── Step3.stories.js
│ ├── Tab.stories.js
│ ├── Table.stories.js
│ ├── TableComponent.stories.js
│ ├── Tag.stories.js
│ ├── Testimonial.stories.js
│ ├── Testimonials.stories.js
│ ├── Tooltip.stories.js
│ ├── Typography.stories.js
│ └── Values.stories.js
├── theme
│ ├── GlobalStyle.js
│ ├── breakpoints.js
│ ├── colors.js
│ ├── dracula.js
│ ├── fontFamily.js
│ ├── fontWeight.js
│ └── index.js
└── utils
│ ├── colors.js
│ ├── formatStargazers.js
│ ├── get.js
│ ├── getCodeSamples.js
│ ├── getColorName.js
│ ├── hexToRgb.js
│ ├── isBreakpointSmaller.js
│ └── shuffleArray.js
└── yarn.lock
/.editorconfig:
--------------------------------------------------------------------------------
1 | # top-most EditorConfig file
2 | root = true
3 |
4 | # all files
5 | [*]
6 | end_of_line = lf
7 | insert_final_newline = true
8 | indent_style = space
9 | indent_size = 2
10 | charset = utf-8
11 | trim_trailing_whitespace = true
12 | max_line_length = 80
13 | quote_type = single
14 |
15 | [*.{js,ts}]
16 | quote_type = single
17 | curly_bracket_next_line = false
18 | spaces_around_brackets = inside
19 | indent_brace_style = BSD KNF
20 |
21 | # HTML
22 | [*.html]
23 | quote_type = double
24 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_DEMO_MOVIES_HOST=http://0.0.0.0:7700
2 | NEXT_PUBLIC_DEMO_MOVIES_API_KEY=searchKey
3 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | .cache
2 | build
3 | node_modules
4 | public
5 | storybook-static
6 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true,
5 | "node": true,
6 | "cypress/globals": true
7 | },
8 | "extends": ["next", "prettier", "eslint:recommended", "plugin:cypress/recommended"],
9 | "parserOptions": {
10 | "ecmaFeatures": {
11 | "jsx": true
12 | },
13 | "sourceType": "module",
14 | "ecmaVersion": 12
15 | },
16 | "plugins": ["react", "prettier", "cypress"],
17 | "settings": {
18 | "react": {
19 | "version": "detect"
20 | }
21 | },
22 | "rules": {
23 | "cypress/no-unnecessary-waiting": "off",
24 | "react/jsx-closing-bracket-location": [2, "tag-aligned"],
25 | "import/no-anonymous-default-export": "off",
26 | "no-unused-vars": [
27 | "error",
28 | {
29 | "varsIgnorePattern": "^omit.*$"
30 | }
31 | ],
32 | "array-callback-return": "off",
33 | "arrow-parens": ["error", "as-needed"],
34 | "prettier/prettier": [
35 | "error",
36 | {
37 | "quoteProps": "consistent",
38 | "semi": false,
39 | "arrowParens": "avoid",
40 | "singleQuote": true,
41 | "trailingComma": "es5",
42 | "tabWidth": 2
43 | }
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Landing Bug Report 🐞
3 | about: Create a report to help us improve.
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 | ---
8 |
9 |
10 |
11 | **Description**
12 | Description of what the bug is about.
13 |
14 | **Expected behavior**
15 | What you expected to happen.
16 |
17 | **Current behavior**
18 | What happened.
19 |
20 | **Screenshots or Logs**
21 | If applicable, add screenshots or logs to help explain your problem.
22 |
23 | **Environment (please complete the following information):**
24 |
25 | - Browser: [e.g. Chrome version 90.0]
26 | - Viewport: [e.g. 800px (width) x 480px (height)]
27 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: Meilisearch Project Issues
4 | url: https://github.com/meilisearch/meilisearch/issues
5 | about: Please report Meilisearch issues here
6 | - name: Meilisearch Documentation Issues
7 | url: https://github.com/meilisearch/documentation/issues
8 | about: Please report documentation issues here
9 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/other.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Other
3 | about: Any other topic you want to talk about.
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 | ---
8 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: npm
4 | directory: '/'
5 | schedule:
6 | interval: weekly
7 | time: '04:00'
8 | open-pull-requests-limit: 10
9 | labels:
10 | - skip-changelog
11 | - dependencies
12 | versioning-strategy: increase
13 | rebase-strategy: disabled
14 | ignore:
15 | - dependency-name: 'eslint*'
16 | - dependency-name: '*prettier*'
17 | - dependency-name: '*storybook*'
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env.local
29 | .env.development.local
30 | .env.test.local
31 | .env.production.local
32 |
33 | # vercel
34 | .vercel
35 |
36 | # cypress
37 | /cypress/plugins
38 | /cypress/screenshots
39 | /cypress/videos
40 | /cypress/fixtures
41 |
42 | # storybook
43 | /storybook-static
44 |
--------------------------------------------------------------------------------
/.percy.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "snapshot": {
4 | "widths": [1440],
5 | "percy-css": ".hide-in-percy {\n visibility: hidden;\n}\n"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/.storybook/main.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | stories: [
3 | '../src/stories/**/*.stories.mdx',
4 | '../src/stories/**/*.stories.@(js|jsx|ts|tsx)',
5 | ],
6 | addons: [
7 | '@storybook/addon-links',
8 | '@storybook/addon-essentials',
9 | 'storybook-addon-next-router',
10 | ],
11 | staticDirs: ['../public'],
12 | };
13 |
--------------------------------------------------------------------------------
/.storybook/preview-head.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.storybook/preview.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ThemeProvider } from 'styled-components';
3 | import { createGlobalStyle } from 'styled-components';
4 | import theme from '../src/theme';
5 | import * as nextImage from 'next/image';
6 | import { RouterContext } from 'next/dist/shared/lib/router-context';
7 |
8 | const GlobalStyle = createGlobalStyle`
9 | html, body {
10 | margin: 0;
11 | }
12 | * {
13 | box-sizing: border-box;
14 | }
15 | a {
16 | text-decoration: none;
17 | }
18 |
19 | img {
20 | position: relative;
21 | }
22 | `;
23 |
24 | export const decorators = [
25 | (Story) => (
26 |
27 |
28 |
29 |
30 | ),
31 | ];
32 |
33 | export const parameters = {
34 | actions: { argTypesRegex: '^on[A-Z].*' },
35 | layout: 'fullscreen',
36 | backgrounds: {
37 | default: 'valhalla',
38 | values: [
39 | {
40 | name: 'valhalla',
41 | value: '#21004B',
42 | },
43 | {
44 | name: 'white',
45 | value: '#FFF',
46 | },
47 | ],
48 | },
49 | nextRouter: {
50 | Provider: RouterContext.Provider,
51 | path: '/',
52 | asPath: '/',
53 | query: {},
54 | push() {},
55 | },
56 | };
57 |
58 | // Workaround for Next/Image not working in Storybook
59 | Object.defineProperty(nextImage, 'default', {
60 | configurable: true,
61 | value: (props) =>
,
62 | });
63 |
--------------------------------------------------------------------------------
/.storybook/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = ({config}) => {
4 | config.resolve.modules = [
5 | path.resolve(__dirname, "..", "src"),
6 | "node_modules",
7 | ]
8 |
9 | return config
10 | }
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020-2022 Meili SAS
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/landing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/assets/landing.png
--------------------------------------------------------------------------------
/assets/meilisearch-landing-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/assets/meilisearch-landing-dark.png
--------------------------------------------------------------------------------
/assets/meilisearch-landing-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/assets/meilisearch-landing-light.png
--------------------------------------------------------------------------------
/bors.toml:
--------------------------------------------------------------------------------
1 | status = [
2 | 'linter_check',
3 | 'cypress-run',
4 | 'percy'
5 | ]
6 | # 1 hour timeout
7 | timeout-sec = 3600
8 |
--------------------------------------------------------------------------------
/cypress.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress')
2 |
3 | module.exports = defineConfig({
4 | viewportWidth: 1440,
5 | viewportHeight: 900,
6 | scrollBehavior: 'center',
7 | projectId: '4ja87b',
8 | e2e: {
9 | // We've imported your old cypress plugins here.
10 | // You may want to clean this up later by importing these.
11 | // setupNodeEvents(on, config) {
12 | // return require('./cypress/plugins/index.js')(on, config)
13 | // },
14 | baseUrl: 'http://localhost:3000',
15 | specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}',
16 | },
17 | blockHosts: ['*.segment.com'],
18 | })
19 |
--------------------------------------------------------------------------------
/cypress/support/commands.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/cypress/support/commands.js
--------------------------------------------------------------------------------
/cypress/support/e2e.js:
--------------------------------------------------------------------------------
1 | import './commands'
2 |
--------------------------------------------------------------------------------
/data/404.js:
--------------------------------------------------------------------------------
1 | const get404Data = () => ({
2 | meta: {
3 | title: '404',
4 | description: '',
5 | },
6 | content: {
7 | description: 'Sorry, the page you are looking for does not exist.',
8 | cta: 'Bring me home, please',
9 | },
10 | })
11 |
12 | export default get404Data
13 |
--------------------------------------------------------------------------------
/data/legal.js:
--------------------------------------------------------------------------------
1 | const getLegalData = () => ({
2 | text: {
3 | legal: 'Legal',
4 | },
5 | menu: [
6 | {
7 | title: 'Privacy policy',
8 | href: '/privacy-policy',
9 | },
10 | {
11 | title: 'Terms of use',
12 | href: '/terms-of-use',
13 | },
14 | ],
15 | })
16 |
17 | export default getLegalData
18 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": "src"
4 | },
5 | "include": ["src"]
6 | }
7 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | reactStrictMode: true,
3 | compiler: {
4 | styledComponents: true,
5 | },
6 | poweredByHeader: false,
7 | webpack: config => {
8 | // Unset client-side javascript that only works server-side
9 | config.resolve.fallback = { fs: false, module: false }
10 | config.module.rules.push({
11 | test: /\.mdx$/,
12 | use: 'raw-loader',
13 | })
14 | return config
15 | },
16 | images: {
17 | domains: ['pbs.twimg.com', 'image.tmdb.org'],
18 | },
19 | async redirects() {
20 | return [
21 | {
22 | source: '/privacy',
23 | destination: '/privacy-policy',
24 | permanent: true,
25 | },
26 | {
27 | source: '/blog',
28 | destination: 'https://blog.meilisearch.com',
29 | permanent: true,
30 | basePath: false,
31 | },
32 | {
33 | source: '/docs',
34 | destination: 'https://docs.meilisearch.com',
35 | permanent: true,
36 | basePath: false,
37 | },
38 | ]
39 | },
40 | }
41 |
--------------------------------------------------------------------------------
/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/favicon.ico
--------------------------------------------------------------------------------
/public/icons/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/bjornftw.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/bjornftw.jpeg
--------------------------------------------------------------------------------
/public/images/danpastori.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/danpastori.jpeg
--------------------------------------------------------------------------------
/public/images/david-boyne.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/david-boyne.png
--------------------------------------------------------------------------------
/public/images/decorator1.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/images/decorator2.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/decorator3.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/decorator4.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/decorator5.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/decorator6.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/images/decorator7.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/images/dhigit9.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/dhigit9.jpeg
--------------------------------------------------------------------------------
/public/images/interactive-search-arrows.svg:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/public/images/jellevliet.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/jellevliet.jpeg
--------------------------------------------------------------------------------
/public/images/meili-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/meili-logo.png
--------------------------------------------------------------------------------
/public/images/meili-logo.svg:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/public/images/miteshmetha.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/miteshmetha.jpeg
--------------------------------------------------------------------------------
/public/images/og-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/og-image.png
--------------------------------------------------------------------------------
/public/images/orphikkkk.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/orphikkkk.jpeg
--------------------------------------------------------------------------------
/public/images/pricing-hero-stars-left.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/public/images/pricing-hero-stars-right.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/public/images/teamMembers/alexia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/alexia.png
--------------------------------------------------------------------------------
/public/images/teamMembers/amelie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/amelie.png
--------------------------------------------------------------------------------
/public/images/teamMembers/bruno.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/bruno.png
--------------------------------------------------------------------------------
/public/images/teamMembers/carolina.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/carolina.png
--------------------------------------------------------------------------------
/public/images/teamMembers/charline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/charline.png
--------------------------------------------------------------------------------
/public/images/teamMembers/charlotte.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/charlotte.png
--------------------------------------------------------------------------------
/public/images/teamMembers/clementine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/clementine.png
--------------------------------------------------------------------------------
/public/images/teamMembers/dave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/dave.png
--------------------------------------------------------------------------------
/public/images/teamMembers/ferdinand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/ferdinand.png
--------------------------------------------------------------------------------
/public/images/teamMembers/gui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/gui.png
--------------------------------------------------------------------------------
/public/images/teamMembers/guillaume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/guillaume.png
--------------------------------------------------------------------------------
/public/images/teamMembers/ingrid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/ingrid.png
--------------------------------------------------------------------------------
/public/images/teamMembers/jonathan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/jonathan.png
--------------------------------------------------------------------------------
/public/images/teamMembers/kero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/kero.png
--------------------------------------------------------------------------------
/public/images/teamMembers/laurene.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/laurene.png
--------------------------------------------------------------------------------
/public/images/teamMembers/loic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/loic.png
--------------------------------------------------------------------------------
/public/images/teamMembers/louis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/louis.png
--------------------------------------------------------------------------------
/public/images/teamMembers/luna.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/luna.png
--------------------------------------------------------------------------------
/public/images/teamMembers/many.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/many.png
--------------------------------------------------------------------------------
/public/images/teamMembers/maryam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/maryam.png
--------------------------------------------------------------------------------
/public/images/teamMembers/morgane-d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/morgane-d.png
--------------------------------------------------------------------------------
/public/images/teamMembers/morgane-n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/morgane-n.png
--------------------------------------------------------------------------------
/public/images/teamMembers/nico.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/nico.png
--------------------------------------------------------------------------------
/public/images/teamMembers/olu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/olu.png
--------------------------------------------------------------------------------
/public/images/teamMembers/quentin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/quentin.png
--------------------------------------------------------------------------------
/public/images/teamMembers/sam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/sam.png
--------------------------------------------------------------------------------
/public/images/teamMembers/tamo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/tamo.png
--------------------------------------------------------------------------------
/public/images/teamMembers/thomas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/thomas.png
--------------------------------------------------------------------------------
/public/images/teamMembers/tommy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/teamMembers/tommy.png
--------------------------------------------------------------------------------
/public/images/theraloss.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/theraloss.jpeg
--------------------------------------------------------------------------------
/public/images/timeline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/meilisearch/landing/f529a11c6ed1bd7bacf1a2ba0b29d90506f38873/public/images/timeline.png
--------------------------------------------------------------------------------
/snapshots.yml:
--------------------------------------------------------------------------------
1 | - name: 'home-responsive'
2 | url: /
3 | widths: [375, 1024, 1440]
4 | - name: 'pricing-responsive'
5 | url: /pricing
6 | widths: [375, 1024, 1440]
7 | - name: 'about-us-responsive'
8 | url: /about-us
9 | widths: [375, 1024, 1440]
10 | - name: 'privacy-policy'
11 | url: /privacy-policy
12 | - name: 'terms-of-use'
13 | url: /terms-of-use
14 | - name: '404'
15 | url: /test
16 |
--------------------------------------------------------------------------------
/src/blocks/AboutUsHero.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Grid from 'components/Grid'
4 | import Typography from 'components/Typography'
5 | import get from 'utils/get'
6 |
7 | const AboutUsHeroGrid = styled(Grid)`
8 | height: calc(100vh - 160px);
9 | align-items: center;
10 | `
11 |
12 | const Title = styled(Typography)`
13 | color: white;
14 | strong {
15 | color: ${get('colors.hotPink')};
16 | }
17 |
18 | grid-column: 1 / -1;
19 |
20 | @media (min-width: ${get('breakpoints.md')}) {
21 | grid-column: 1 / 11;
22 | }
23 |
24 | @media (min-width: ${get('breakpoints.md')}) and (max-width: calc(${get(
25 | 'breakpoints.lg'
26 | )} - 1px)) {
27 | font-size: 32px;
28 | }
29 | `
30 |
31 | const AboutUsHero = ({ hero, ...props }) => {
32 | return (
33 |
34 |
38 |
39 | )
40 | }
41 |
42 | export default AboutUsHero
43 |
--------------------------------------------------------------------------------
/src/blocks/Developer/Terminal/Head.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 |
5 | const TerminalButton = styled.div`
6 | width: 13px;
7 | height: 13px;
8 | border-radius: 50%;
9 | `
10 |
11 | const TerminalHead = styled.div`
12 | background-color: ${get('colors.valhalla.700')};
13 | grid-column: 1/-1;
14 | height: 44px;
15 | border-bottom: 2px solid ${get('colors.white')};
16 | padding: 0 16px;
17 | display: flex;
18 | align-items: center;
19 |
20 | ${TerminalButton}:first-child {
21 | background-color: ${get('colors.hotPink')};
22 | }
23 | ${TerminalButton}:nth-child(2) {
24 | background-color: ${get('colors.lila')};
25 | }
26 | ${TerminalButton}:nth-child(3) {
27 | background-color: ${get('colors.dodgerBlue')};
28 | }
29 |
30 | ${TerminalButton}+${TerminalButton} {
31 | margin-left: 9px;
32 | }
33 | `
34 |
35 | const Head = () => {
36 | const message = `✨ We're hiring !
37 | Check https://jobs.lever.co/meili if you want to join us ✨`
38 | return (
39 |
40 | console.log(message)} />
41 |
42 |
43 |
44 | )
45 | }
46 |
47 | export default Head
48 |
--------------------------------------------------------------------------------
/src/blocks/Developer/Terminal/LeftColumn.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Tab from 'components/Tab'
4 | import Typography from 'components/Typography'
5 | import get from 'utils/get'
6 |
7 | const Container = styled.div`
8 | width: 190px;
9 | background-color: ${get('colors.valhalla.600')};
10 | display: flex;
11 | flex-direction: column;
12 | border-right: 2px solid ${get('colors.valhalla.300')};
13 | padding: 26px 28px;
14 |
15 | @media (min-width: ${get('breakpoints.xl')}) {
16 | padding: 26px 44px;
17 | width: 218px;
18 | }
19 | `
20 |
21 | const SdkTab = styled(Tab.Tab)`
22 | display: flex;
23 | align-items: center;
24 | `
25 |
26 | const Language = styled(Typography)`
27 | font-family: ${get('fontFamily.poppins')};
28 | font-weight: ${get('fontWeight.bold')};
29 | font-size: 10px;
30 | line-height: 12px;
31 | letter-spacing: 0.03em;
32 | text-transform: uppercase;
33 | margin-left: 16px;
34 | text-align: left;
35 | `
36 |
37 | const SdkList = styled(Tab.TabList)`
38 | button + button {
39 | margin-left: 0;
40 | }
41 | `
42 |
43 | const LeftColumn = ({ tab, sdkList }) => {
44 | return (
45 |
46 |
47 | {sdkList.map(sdk => {
48 | const Logo = sdk.logo
49 | return (
50 |
51 |
52 |
53 |
54 |
55 | {sdk.name}
56 |
57 |
58 | )
59 | })}
60 |
61 |
62 | )
63 | }
64 |
65 | export default LeftColumn
66 |
--------------------------------------------------------------------------------
/src/blocks/Developer/Terminal/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import { useTabState } from 'reakit/Tab'
4 | import get from 'utils/get'
5 | import Grid from 'components/Grid'
6 | import Head from './Head'
7 | import LeftColumn from './LeftColumn'
8 | import RightColumn from './RightColumn'
9 |
10 | const StyledGrid = styled(Grid)`
11 | color: ${get('colors.white')};
12 | margin-top: -124px;
13 | background-color ${get('colors.valhalla.700')};
14 | border-radius: 16px;
15 | border: 2px solid ${get('colors.white')};
16 | overflow: hidden;
17 | grid-gap: 0 16px;
18 | grid-template-columns: 1fr;
19 |
20 | `
21 |
22 | const TerminalBody = styled.div`
23 | display: flex;
24 | flex-direction: row;
25 | width: 100%;
26 | `
27 |
28 | const Terminal = ({ developerProps, code_samples }) => {
29 | const tab = useTabState({ orientation: 'vertical' })
30 |
31 | const sdkList = code_samples.map(sdk => ({
32 | ...sdk,
33 | logo: developerProps.sdkList.find(
34 | currentSdk => currentSdk.pkgName === sdk.pkgName
35 | ).logo,
36 | }))
37 |
38 | return (
39 |
40 |
41 |
42 |
43 |
48 |
49 |
50 | )
51 | }
52 |
53 | export default Terminal
54 |
--------------------------------------------------------------------------------
/src/blocks/Developer/TitleSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Grid from 'components/Grid'
4 | import Typography from 'components/Typography'
5 | import get from 'utils/get'
6 |
7 | const Container = styled.div`
8 | background-color: ${get('colors.dodgerBlue')};
9 |
10 | svg {
11 | color: ${get('colors.white')};
12 | opacity: 0.3;
13 | }
14 |
15 | padding: 40px 0 110px;
16 | @media (min-width: ${get('breakpoints.md')}) {
17 | padding: 40px 0 158px;
18 | }
19 | @media (min-width: ${get('breakpoints.lg')}) {
20 | padding: 106px 0 276px;
21 | }
22 | @media (min-width: ${get('breakpoints.xl')}) {
23 | padding: 118px 0 242px;
24 | }
25 | `
26 |
27 | const Title = styled(Typography)`
28 | color: ${get('colors.white')};
29 | margin-top: 23px;
30 | `
31 |
32 | const TitleContent = styled.div`
33 | grid-column: 1/-1;
34 | display: flex;
35 | flex-direction: column;
36 | `
37 |
38 | const TitleSection = ({ developerProps }) => {
39 | const PreTitle = developerProps.preTitle
40 |
41 | return (
42 |
43 |
44 |
45 |
46 |
51 |
52 |
53 |
54 | )
55 | }
56 |
57 | export default TitleSection
58 |
--------------------------------------------------------------------------------
/src/blocks/Developer/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import TitleSection from './TitleSection'
5 | import Terminal from './Terminal'
6 | import Text from './Text'
7 |
8 | const Section = styled.section`
9 | display: none;
10 | @media (min-width: ${get('breakpoints.md')}) {
11 | display: block;
12 | margin: 0 -32px;
13 | }
14 | `
15 |
16 | const Developer = ({ developerProps, code_samples, ...props }) => {
17 | return (
18 |
23 | )
24 | }
25 | export default Developer
26 |
--------------------------------------------------------------------------------
/src/blocks/FAQ.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Typography from 'components/Typography'
4 | import Grid from 'components/Grid'
5 | import get from 'utils/get'
6 | import Accordion from 'components/Accordion'
7 |
8 | const FAQWrapper = styled.section`
9 | color: ${get('colors.white')};
10 | margin: 0 -16px;
11 | padding: 64px 16px 76px;
12 | background-color: ${get('colors.valhalla')};
13 |
14 | @media (min-width: ${get('breakpoints.md')}) {
15 | margin: 0 -32px;
16 | padding: 64px 32px 76px;
17 | }
18 | `
19 |
20 | const Content = styled.div`
21 | grid-column: 1 / -1;
22 | @media (min-width: ${get('breakpoints.lg')}) {
23 | grid-column: 3 / 11;
24 | }
25 | `
26 |
27 | const Title = styled(Typography)`
28 | display: block;
29 | text-align: center;
30 | `
31 |
32 | const Questions = styled.div`
33 | margin-top: 40px;
34 | details + details {
35 | margin-top: 18px;
36 | }
37 | `
38 |
39 | const FAQ = ({ faq, ...props }) => {
40 | return (
41 |
42 |
43 |
44 |
45 | {faq.title}
46 |
47 |
48 | {faq.questions.map((question, index) => (
49 |
54 | ))}
55 |
56 |
57 |
58 |
59 | )
60 | }
61 |
62 | export default FAQ
63 |
--------------------------------------------------------------------------------
/src/blocks/Footer/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import footerData from '../../../data/footer'
5 | import Grid from 'components/Grid'
6 | import Image from 'components/Image'
7 | import Newsletter from './Newsletter'
8 | import BottomSection from './BottomSection'
9 | import MenuSection from './MenuSection'
10 |
11 | const Wrapper = styled.footer`
12 | background-color: ${get('colors.valhalla.700')};
13 | color: ${get('colors.white')};
14 | padding: 74px 24px 68px;
15 | @media (min-width: ${get('breakpoints.md')}) {
16 | padding: 94px 32px 32px;
17 | }
18 | @media (min-width: ${get('breakpoints.lg')}) {
19 | padding: 142px 64px 74px;
20 | }
21 | `
22 |
23 | const LogoSection = styled.div`
24 | grid-column: 1 / -1;
25 | @media (min-width: ${get('breakpoints.md')}) {
26 | grid-column: 1 / 5;
27 | }
28 | @media (min-width: ${get('breakpoints.lg')}) {
29 | grid-column: 1 / 6;
30 | }
31 | @media (min-width: ${get('breakpoints.xl')}) {
32 | grid-column: 1 / 5;
33 | }
34 | `
35 |
36 | const Footer = props => {
37 | return (
38 |
39 |
40 |
41 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | )
55 | }
56 |
57 | export default Footer
58 |
--------------------------------------------------------------------------------
/src/blocks/Header/Ctas.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Typography from 'components/Typography'
4 | import Button from 'components/Button'
5 | import get from 'utils/get'
6 |
7 | const Wrapper = styled.div`
8 | width: 100%;
9 | display: flex;
10 | justify-content: space-between;
11 | @media (min-width: ${get('breakpoints.lg')}) {
12 | width: auto;
13 | display: block;
14 | }
15 | `
16 |
17 | const Ctas = ({ headerProps, ...props }) => {
18 | const { cta1, cta2 } = headerProps
19 | return (
20 |
21 |
29 |
37 |
38 | )
39 | }
40 |
41 | export default Ctas
42 |
--------------------------------------------------------------------------------
/src/blocks/Header/DesktopHeader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import GithubButton from 'components/GithubButton'
4 | import get from 'utils/get'
5 | import Logo from './Logo'
6 | import MenuLinks from './MenuLinks'
7 | import Ctas from './Ctas'
8 |
9 | const Grid = styled.nav`
10 | display: none;
11 | @media (min-width: ${get('breakpoints.lg')}) {
12 | width: 100%;
13 | display: flex;
14 | align-items: center;
15 | justify-content: space-between;
16 | padding: 0;
17 | margin: 0 auto;
18 | max-width: 1328px;
19 | padding: 0 24px;
20 | }
21 | `
22 |
23 | const DesktopHeader = ({ headerProps }) => {
24 | return (
25 |
26 |
27 |
28 |
29 |
30 |
31 | )
32 | }
33 |
34 | export default DesktopHeader
35 |
--------------------------------------------------------------------------------
/src/blocks/Header/Logo.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Image from 'components/Image'
4 | import get from 'utils/get'
5 |
6 | const MeilisearchName = styled.div`
7 | margin-left: 12px;
8 | @media (min-width: ${get('breakpoints.lg')}) {
9 | display: none;
10 | }
11 |
12 | @media (min-width: ${get('breakpoints.xl')}) {
13 | display: block;
14 | }
15 | `
16 |
17 | const Logos = styled.a`
18 | display: flex;
19 | align-items: center;
20 | outline: none;
21 | `
22 |
23 | const Logo = () => (
24 |
25 |
32 |
33 |
40 |
41 |
42 | )
43 |
44 | export default Logo
45 |
--------------------------------------------------------------------------------
/src/blocks/Header/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import headerData from '../../../data/header'
5 | import DesktopHeader from './DesktopHeader'
6 | import MobileHeader from './MobileHeader'
7 | import { useRouter } from 'next/router'
8 | import Banner from 'components/Banner'
9 |
10 | const Wrapper = styled.header`
11 | display: flex;
12 | flex-direction: column;
13 | justify-content: center;
14 | position: sticky;
15 | top: 0;
16 | z-index: 50;
17 | `
18 |
19 | const HeaderWrapper = styled.div`
20 | display: flex;
21 | flex-direction: column;
22 | justify-content: center;
23 | width: 100%;
24 | background-color: ${p =>
25 | p.$hasDarkBgColor ? get('colors.valhalla.800') : get('colors.valhalla')};
26 | height: var(--header-height-mobile);
27 | @media (min-width: ${get('breakpoints.lg')}) {
28 | height: var(--header-height-desktop);
29 | }
30 | `
31 |
32 | const Header = props => {
33 | const router = useRouter()
34 |
35 | const darkBgPages = ['/privacy-policy', '/terms-of-use']
36 | const hasDarkBgColor = darkBgPages.includes(router.asPath)
37 | const banner = headerData?.banner?.title
38 |
39 | return (
40 |
41 | {banner && }
42 |
43 |
44 |
45 |
46 |
47 | )
48 | }
49 |
50 | export default Header
51 |
--------------------------------------------------------------------------------
/src/blocks/OurTeam/Carousel.js:
--------------------------------------------------------------------------------
1 | import styled, { css, keyframes } from 'styled-components'
2 | import get from 'utils/get'
3 |
4 | const scrollRightToLeft = keyframes`
5 | 0% {
6 | transform: translateX(0);
7 | }
8 | 100% {
9 | transform: translateX(-50%);
10 | }
11 | `
12 |
13 | const scrollLeftToRight = keyframes`
14 | 0% {
15 | transform: translateX(-50%);
16 | }
17 | 100% {
18 | transform: translateX(0);
19 | }
20 | `
21 |
22 | const Carousel = styled.div`
23 | z-index: 2;
24 | position: relative;
25 | display: grid;
26 | grid-template-columns: repeat(${p => p.$nbSlides}, 1fr);
27 | grid-gap: 0 26px;
28 | justify-content: center;
29 | align-items: flex-start;
30 | &:hover {
31 | animation-play-state: paused;
32 | }
33 |
34 | ${p =>
35 | p.$dir === 'ltr' &&
36 | css`
37 | animation: ${scrollLeftToRight} 50s linear infinite;
38 | `}
39 | ${p =>
40 | p.$dir === 'rtl' &&
41 | css`
42 | animation: ${scrollRightToLeft} 50s linear infinite;
43 | `}
44 |
45 | // Number of cards * width + gutter
46 | width: calc(${p => p.$nbSlides} * 112px + ${p => p.$nbSlides - 1} * 26px);
47 | @media (min-width: ${get('breakpoints.md')}) {
48 | width: calc(${p => p.$nbSlides} * 152px + ${p => p.$nbSlides - 1} * 26px);
49 | }
50 | @media (min-width: ${get('breakpoints.lg')}) {
51 | width: calc(${p => p.$nbSlides} * 190px + ${p => p.$nbSlides - 1} * 26px);
52 | }
53 | `
54 |
55 | export default Carousel
56 |
--------------------------------------------------------------------------------
/src/blocks/OurTeam/TeamMemberList.js:
--------------------------------------------------------------------------------
1 | import TeamMemberCard from './TeamMemberCard'
2 | import Carousel from './Carousel'
3 |
4 | const TeamMemberList = ({ carousel, dir, ...props }) => (
5 |
6 | {carousel.map((teamMember, index) => (
7 |
8 |
13 |
14 | ))}
15 |
16 | )
17 |
18 | export default TeamMemberList
19 |
--------------------------------------------------------------------------------
/src/blocks/PricingPlans/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import BaseGrid from 'components/Grid'
5 | import BasePlan from './Plan'
6 |
7 | const Section = styled.section`
8 | z-index: 2;
9 | margin-bottom: 70px;
10 | @media (min-width: ${get('breakpoints.md')}) {
11 | margin-bottom: 56px;
12 | }
13 | @media (min-width: ${get('breakpoints.lg')}) {
14 | margin-bottom: 106px;
15 | }
16 | @media (min-width: ${get('breakpoints.xl')}) {
17 | margin-bottom: 120px;
18 | }
19 | `
20 |
21 | const Grid = styled(BaseGrid)`
22 | grid-template-columns: repeat(2, 1fr);
23 | @media (min-width: ${get('breakpoints.md')}) {
24 | grid-template-columns: repeat(12, 1fr);
25 | }
26 | `
27 |
28 | const Plan = styled(BasePlan)`
29 | grid-column: span 1;
30 |
31 | @media (min-width: ${get('breakpoints.md')}) {
32 | grid-column: ${p => (p.plan.fullWidth ? '1 / -1' : 'span 4')};
33 | }
34 | `
35 |
36 | const PricingPlans = ({ pricing, ...props }) => {
37 | return (
38 |
39 |
40 | {pricing.plans?.map(plan => (
41 |
42 | ))}
43 |
44 |
45 | )
46 | }
47 |
48 | export default PricingPlans
49 |
--------------------------------------------------------------------------------
/src/blocks/Step3/TitleSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import AnchorTitles from 'components/AnchorTitles'
4 | import Grid from 'components/Grid'
5 | import Typography from 'components/Typography'
6 | import get from 'utils/get'
7 |
8 | // Tricks the scroll behaviour in order to not have the top of the block appearing below the header
9 | const Title = styled(Typography)`
10 | margin-top: 6px;
11 | @media (min-width: ${get('breakpoints.lg')}) {
12 | margin-top: -160px;
13 | padding-top: calc(160px + 44px);
14 | }
15 | @media (min-width: ${get('breakpoints.xl')}) {
16 | margin-top: -160px;
17 | padding-top: calc(160px + 32px);
18 | }
19 | `
20 |
21 | const TitlesColumn = styled.div`
22 | grid-column: 1 / 3;
23 | @media (min-width: ${get('breakpoints.lg')}) {
24 | grid-column: 1 / 6;
25 | }
26 | `
27 |
28 | const TitleSection = ({ steps, step, color }) => {
29 | return (
30 |
31 |
32 |
33 |
39 | {step.title}
40 |
41 |
42 |
43 | )
44 | }
45 |
46 | export default TitleSection
47 |
--------------------------------------------------------------------------------
/src/blocks/Step3/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import PropTypes from 'prop-types'
5 | import TitleSection from './TitleSection'
6 | import FirstSection from './FirstSection'
7 | import SecondSection from './SecondSection'
8 |
9 | const Section = styled.section`
10 | position: relative;
11 | color: ${get('colors.white')};
12 | padding-bottom: 72px;
13 | @media (min-width: ${get('breakpoints.lg')}) {
14 | padding-bottom: 156px;
15 | }
16 | @media (min-width: ${get('breakpoints.lg')}) {
17 | padding-bottom: 192px;
18 | }
19 | `
20 |
21 | const Step3 = ({
22 | step3Props: step,
23 | steps = [],
24 | color = get('colors.dodgerBlue'),
25 | ...props
26 | }) => (
27 |
32 | )
33 |
34 | Step3.propTypes = {
35 | /**
36 | * Primary color of the block
37 | */
38 | color: PropTypes.string,
39 | /**
40 | * List of the different steps to display the anchors
41 | */
42 | steps: PropTypes.arrayOf(
43 | PropTypes.shape({
44 | preTitle: PropTypes.string,
45 | title: PropTypes.string,
46 | })
47 | ),
48 | }
49 |
50 | Step3.defaultProps = {
51 | color: get('colors.dodgerBlue'),
52 | steps: [],
53 | }
54 |
55 | export default Step3
56 |
--------------------------------------------------------------------------------
/src/blocks/index.js:
--------------------------------------------------------------------------------
1 | export { default as AboutUsHero } from './AboutUsHero'
2 | export { default as Cards } from './Cards'
3 | export { default as Companies } from './Companies'
4 | export { default as Demo } from './Demo'
5 | export { default as Developer } from './Developer'
6 | export { default as FAQ } from './FAQ'
7 | export { default as Header } from './Header'
8 | export { default as Hero } from './Hero'
9 | export { default as Investors } from './Investors'
10 | export { default as Footer } from './Footer'
11 | export { default as JobOffers } from './JobOffers'
12 | export { default as OpenSource } from './OpenSource'
13 | export { default as OurStory } from './OurStory'
14 | export { default as OurTeam } from './OurTeam'
15 | export { default as PerksAndBenefits } from './PerksAndBenefits'
16 | export { default as PricingHero } from './PricingHero'
17 | export { default as PricingPlans } from './PricingPlans'
18 | export { default as Step1 } from './Step1'
19 | export { default as Step2 } from './Step2'
20 | export { default as Step3 } from './Step3'
21 | export { default as ComparativeTable } from './ComparativeTable'
22 | export { default as Testimonials } from './Testimonials'
23 | export { default as Values } from './Values'
24 |
--------------------------------------------------------------------------------
/src/components/Anchor.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 |
3 | const Anchor = styled.div`
4 | display: block;
5 | position: relative;
6 | // Due to a big header on top of the page, the negative position is used to avoid the anchor being hidden under the header
7 | top: -200px;
8 | visibility: hidden;
9 | `
10 |
11 | export default Anchor
12 |
--------------------------------------------------------------------------------
/src/components/Banner.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import Typography from 'components/Typography'
5 |
6 | const Wrapper = styled.div`
7 | background-color: ${get('colors.dodgerBlue')};
8 | padding: 16px;
9 | height: var(--banner-height);
10 | color: ${get('colors.ashes.600')};
11 | display: flex;
12 | align-items: center;
13 | justify-content: center;
14 | text-align: center;
15 | a {
16 | transition: color 300ms, border-bottom 300ms;
17 | border-bottom: 2px solid ${get('colors.ashes.600')};
18 | color: inherit;
19 | &:hover,
20 | &:focus {
21 | color: ${get('colors.white')};
22 | border-bottom: 2px solid ${get('colors.white')};
23 | }
24 | }
25 |
26 | @media (min-width: ${get('breakpoints.lg')}) {
27 | padding: 24px;
28 | }
29 | `
30 |
31 | const Banner = ({ title }) => (
32 |
33 |
37 |
38 | )
39 |
40 | export default Banner
41 |
--------------------------------------------------------------------------------
/src/components/Bullets.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled, { css } from 'styled-components'
3 | import hexToRgb from 'utils/hexToRgb'
4 | import getColorName from 'utils/getColorName'
5 | import get from 'utils/get'
6 |
7 | const Bullet = styled.div`
8 | width: 8px;
9 | height: 8px;
10 | border-radius: 50%;
11 | transition: background-color 300ms;
12 |
13 | ${p =>
14 | p.$index < p.$currentIndex &&
15 | css`
16 | background-color: ${hexToRgb(
17 | get(`colors.${getColorName(p.$color)}`),
18 | 0.6
19 | )};
20 | `}
21 | ${p =>
22 | p.$index === p.$currentIndex &&
23 | css`
24 | background-color: ${p.$color};
25 | `}
26 | ${p =>
27 | p.$index > p.$currentIndex &&
28 | css`
29 | background-color: ${hexToRgb(get(`colors.valhalla.100`), 0.4)};
30 | `};
31 | `
32 |
33 | const Bullets = ({ currentIndex, nbBullets, color, ...props }) => {
34 | return (
35 |
36 | {[...Array(nbBullets)].map((e, i) => (
37 |
43 | ))}
44 |
45 | )
46 | }
47 |
48 | export default Bullets
49 |
--------------------------------------------------------------------------------
/src/components/Card.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import get from 'utils/get'
3 |
4 | const Card = styled.div`
5 | background-color: ${p => get(p.$bgColor || 'colors.valhalla.700')};
6 | border-radius: 16px;
7 | height: 100%;
8 | width: 100%;
9 | display: flex;
10 | flex-direction: column;
11 | justify-content: space-between;
12 | align-items: flex-start;
13 | padding: 32px;
14 | `
15 |
16 | export default Card
17 |
--------------------------------------------------------------------------------
/src/components/Checkbox.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Checkbox as ReakitCheckbox } from 'reakit/Checkbox'
3 | import styled from 'styled-components'
4 | import get from 'utils/get'
5 | import IconCard from 'components/IconCard'
6 | import hexToRgb from 'utils/hexToRgb'
7 | import getColorName from 'utils/getColorName'
8 |
9 | const HiddenCheckBox = styled(ReakitCheckbox)`
10 | opacity: 0;
11 | height: 0;
12 | width: 0;
13 | display: block;
14 | `
15 |
16 | const VisibleCheckBox = styled(IconCard)`
17 | cursor: pointer;
18 | border: 1px solid ${get('colors.valhalla.100')};
19 | border-radius: 8px;
20 | transition: border 300ms, background-color 300ms, color 300ms;
21 |
22 | &:hover,
23 | &:focus-within,
24 | ${HiddenCheckBox}:focus + & {
25 | border: 1px solid ${get('colors.white')};
26 | color: ${get('colors.white')};
27 | }
28 | ${HiddenCheckBox}[aria-checked="true"] + & {
29 | border: 1px solid ${p => get(`colors.${getColorName(p.$color)}`)};
30 | color: ${get('colors.white')};
31 | background-color: ${p =>
32 | hexToRgb(get(`colors.${getColorName(p.$color)}`), 0.2)};
33 | }
34 | ${HiddenCheckBox}[aria-checked="true"]:hover + &,
35 | ${HiddenCheckBox}[aria-checked="true"]:focus + & {
36 | border-color: ${p => get(`colors.${getColorName(p.$color)}.300`)};
37 | }
38 | `
39 |
40 | const Checkbox = ({
41 | value,
42 | title,
43 | icon,
44 | color = get('colors.dodgerBlue'),
45 | checkboxState,
46 | }) => {
47 | return (
48 |
52 | )
53 | }
54 |
55 | export default Checkbox
56 |
--------------------------------------------------------------------------------
/src/components/Dialog/DialogBackdrop.js:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components'
2 | import { DialogBackdrop as ReakitDialogBackdrop } from 'reakit/Dialog'
3 |
4 | const Backdrop = styled.div`
5 | transition: opacity 300ms;
6 | overflow: auto;
7 | position: fixed;
8 |
9 | ${p =>
10 | p.$animated &&
11 | css`
12 | opacity: 0;
13 | &[data-enter] {
14 | opacity: 1;
15 | }
16 | `};
17 | `
18 |
19 | const DialogBackdrop = props => (
20 |
21 | )
22 |
23 | export default DialogBackdrop
24 |
--------------------------------------------------------------------------------
/src/components/Dialog/DialogContent.js:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components'
2 | import { Dialog as ReakitDialog } from 'reakit/Dialog'
3 |
4 | const Content = styled.div`
5 | ${p =>
6 | p.$animated &&
7 | css`
8 | transition: opacity 300ms, transform 300ms;
9 | opacity: 0;
10 | transform-origin: top center;
11 | transform: translateY(-24px);
12 | &[data-enter] {
13 | opacity: 1;
14 | transform: translateY(0px);
15 | }
16 | `};
17 | `
18 |
19 | const DialogContent = props => (
20 |
21 | )
22 |
23 | export default DialogContent
24 |
--------------------------------------------------------------------------------
/src/components/Dialog/DialogDisclosure.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import { DialogDisclosure as ReakitDialogDisclosure } from 'reakit/Dialog'
3 |
4 | const Disclosure = styled.div`
5 | max-width: 32px;
6 | background-color: transparent;
7 | border: none;
8 | cursor: pointer;
9 | outline: none;
10 | `
11 |
12 | const DialogDisclosure = props => (
13 |
14 | )
15 |
16 | export default DialogDisclosure
17 |
--------------------------------------------------------------------------------
/src/components/Dialog/index.js:
--------------------------------------------------------------------------------
1 | export { default as DialogDisclosure } from './DialogDisclosure'
2 | export { default as DialogBackdrop } from './DialogBackdrop'
3 | export { default as DialogContent } from './DialogContent'
4 |
--------------------------------------------------------------------------------
/src/components/Disclosure/Disclosure.js:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components'
2 | import { Disclosure as DisclosureButton } from 'reakit/Disclosure'
3 | import { Arrow } from 'components/icons'
4 |
5 | const StyledDisclosureButton = styled.button`
6 | display: inline-flex;
7 | align-items: center;
8 | background-color: transparent;
9 | border: 0;
10 | color: inherit;
11 | cursor: pointer;
12 | padding: 0;
13 | `
14 |
15 | const StyledArrow = styled(Arrow)`
16 | margin-left: 10px;
17 | transform: rotate(0deg);
18 | transition: transform 300ms;
19 | height: 8px;
20 | stroke: currentColor;
21 |
22 | ${p =>
23 | p.$visible &&
24 | css`
25 | transform: rotate(180deg);
26 | `};
27 | `
28 |
29 | const Disclosure = ({ children, ...props }) => (
30 |
31 | {children}
32 |
33 |
34 | )
35 |
36 | export default Disclosure
37 |
--------------------------------------------------------------------------------
/src/components/Disclosure/DisclosureContent.js:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components'
2 | import { DisclosureContent as ReakitDisclosureContent } from 'reakit/Disclosure'
3 |
4 | const StyledDisclosureContent = styled.div`
5 | ${p =>
6 | p.$animated &&
7 | css`
8 | transition: opacity 300ms, transform 300ms;
9 | opacity: 0;
10 | transform-origin: top center;
11 | transform: translateY(-16px);
12 | &[data-enter] {
13 | opacity: 1;
14 | transform: translateY(0px);
15 | }
16 | `};
17 | `
18 |
19 | const DisclosureContent = props => (
20 |
25 | )
26 |
27 | export default DisclosureContent
28 |
--------------------------------------------------------------------------------
/src/components/Disclosure/index.js:
--------------------------------------------------------------------------------
1 | export { default as Disclosure } from './Disclosure'
2 | export { default as DisclosureContent } from './DisclosureContent'
3 |
--------------------------------------------------------------------------------
/src/components/FullWidthCard.js:
--------------------------------------------------------------------------------
1 | import Typography from 'components/Typography'
2 | import React from 'react'
3 | import styled from 'styled-components'
4 |
5 | const Card = styled.div`
6 | padding: 8px 0;
7 | width: 100%;
8 | display: flex;
9 | align-items: center;
10 | justify-content: center;
11 | `
12 |
13 | const FullWidthCard = ({ title, ...props }) => {
14 | return (
15 |
16 | {title}
17 |
18 | )
19 | }
20 |
21 | export default FullWidthCard
22 |
--------------------------------------------------------------------------------
/src/components/Grid.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import get from 'utils/get'
3 |
4 | const Grid = styled.div`
5 | display: grid;
6 | margin: 0 auto;
7 | grid-gap: 16px;
8 | grid-template-columns: repeat(5, 1fr);
9 | max-width: 504px;
10 | max-width: calc((88px * 5) + (16px * 4));
11 |
12 | @media (min-width: ${get('breakpoints.md')}) {
13 | grid-template-columns: repeat(12, 1fr);
14 | max-width: calc((44px * 12) + (16px * 11));
15 | }
16 | @media (min-width: ${get('breakpoints.lg')}) {
17 | max-width: calc((60px * 12) + (16px * 11));
18 | }
19 | @media (min-width: ${get('breakpoints.xl')}) {
20 | max-width: calc((80px * 12) + (16px * 11));
21 | }
22 | `
23 |
24 | export default Grid
25 |
--------------------------------------------------------------------------------
/src/components/Head.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import NextHead from 'next/head'
3 |
4 | const Head = ({ meta }) => {
5 | return (
6 |
7 |
8 | Meilisearch{meta.title ? ` | ${meta.title}` : ''}
9 |
10 |
11 |
12 | {/* Open Graph data */}
13 |
14 |
15 |
19 |
20 |
26 |
27 |
28 | {/* Twitter Open Graph data */}
29 |
30 |
31 |
35 |
36 |
37 |
38 |
44 |
45 |
46 | )
47 | }
48 |
49 | export default Head
50 |
--------------------------------------------------------------------------------
/src/components/IconCard.js:
--------------------------------------------------------------------------------
1 | import Typography from 'components/Typography'
2 | import React from 'react'
3 | import styled from 'styled-components'
4 | import get from 'utils/get'
5 |
6 | const Card = styled.div`
7 | width: 100%;
8 | min-height: 75px;
9 | height: 100%;
10 | display: flex;
11 | align-items: center;
12 | justify-content: center;
13 | flex-direction: column;
14 | cursor: pointer;
15 | padding: 8px;
16 |
17 | > svg {
18 | width: 36px;
19 | height: 36px;
20 | flex-shrink: 0;
21 | @media (min-width: ${get('breakpoints.lg')}) {
22 | width: 55px;
23 | height: 55px;
24 | }
25 | }
26 | `
27 |
28 | const Title = styled(Typography)`
29 | display: block;
30 | text-align: center;
31 | `
32 |
33 | const IconCard = ({ icon, title, ...props }) => {
34 | const Icon = icon
35 | return (
36 |
37 |
38 | {title}
39 |
40 | )
41 | }
42 |
43 | export default IconCard
44 |
--------------------------------------------------------------------------------
/src/components/Image.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import NextImage from 'next/image'
3 |
4 | const Image = ({ alt = '', ...props }) => {
5 | const env = process.env.NEXT_PUBLIC_APP_ENV
6 | return (
7 |
12 | )
13 | }
14 |
15 | export default Image
16 |
--------------------------------------------------------------------------------
/src/components/Input.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import hexToRgb from 'utils/hexToRgb'
5 |
6 | const StyledInput = styled.input`
7 | height: 38px;
8 | border-radius: 8px;
9 | border: 1px solid ${get('colors.ashes.900')};
10 | padding: 10px 16px;
11 | outline: none;
12 | cursor: pointer;
13 | &::placeholder {
14 | color: ${get('colors.ashes.900')};
15 | }
16 | &:hover {
17 | border: 1px solid ${get('colors.dodgerBlue')};
18 | }
19 | &:focus-within {
20 | border: 1px solid ${get('colors.dodgerBlue')};
21 | box-shadow: 0px 0px 0px 4px ${hexToRgb(get('colors.ashes.900'), 0.2)};
22 | }
23 | `
24 |
25 | const Input = props => {
26 | return
27 | }
28 |
29 | export default Input
30 |
--------------------------------------------------------------------------------
/src/components/Link.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import NextLink from 'next/link'
4 | import get from 'utils/get'
5 |
6 | const StyledLink = styled.a`
7 | color: inherit;
8 | transition: color 300ms;
9 | outline: none;
10 | @media (min-width: ${get('breakpoints.lg')}) {
11 | &:hover,
12 | &:focus {
13 | color: ${get('colors.hotPink')};
14 | }
15 | }
16 | `
17 |
18 | const Link = React.forwardRef(({ href, ...props }, ref) => (
19 |
20 |
21 |
22 | ))
23 |
24 | Link.displayName = 'Link'
25 |
26 | Link.propTypes = {}
27 |
28 | Link.defaultProps = {}
29 |
30 | export default Link
31 |
--------------------------------------------------------------------------------
/src/components/List.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import styled from 'styled-components'
4 | import get from 'utils/get'
5 |
6 | const Ul = styled.ul`
7 | padding: 0;
8 | margin: 0;
9 | > li + li {
10 | margin-top: 4px;
11 | }
12 | `
13 |
14 | const Li = styled.li`
15 | display: flex;
16 | align-items: center;
17 | list-style-type: none;
18 | color: ${get('colors.ashes')};
19 | &:before {
20 | width: 18px;
21 | height: 18px;
22 | background-color: ${p => p.$bulletColor};
23 | content: '';
24 | flex-shrink: 0;
25 | mask: url(/icons/check.svg) no-repeat 50% 50%;
26 | mask-size: cover;
27 | margin-right: 8px;
28 | }
29 | `
30 |
31 | const Element = ({ bulletColor = get('colors.dodgerBlue'), ...props }) => (
32 |
33 | )
34 |
35 | const List = props =>
36 |
37 | List.Element = Element
38 |
39 | List.propTypes = {
40 | /**
41 | * Color of the li bullets
42 | */
43 | bulletColor: PropTypes.string,
44 | }
45 |
46 | List.defaultProps = {
47 | bulletColor: get('colors.dodgerBlue'),
48 | }
49 |
50 | export default List
51 |
--------------------------------------------------------------------------------
/src/components/Lottie.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Lottie from 'react-lottie-wrapper'
3 |
4 | const LottieAnimation = ({
5 | animation,
6 | options = {},
7 | ariaLabel,
8 | hideInPercy = true,
9 | ...props
10 | }) => {
11 | const lottieOptions = {
12 | loop: true,
13 | autoplay: true,
14 | animationData: animation,
15 | rendererSettings: {
16 | preserveAspectRatio: 'xMidYMid slice',
17 | },
18 | ...options,
19 | }
20 |
21 | React.useEffect(() => {
22 | const lottie = document.querySelectorAll('div .hide-in-percy')
23 | for (let i = 0; i < lottie.length; i++) {
24 | lottie[i].removeAttribute('aria-label')
25 | }
26 | }, [])
27 |
28 | return (
29 |
38 | )
39 | }
40 |
41 | export default LottieAnimation
42 |
--------------------------------------------------------------------------------
/src/components/Menu/Menu.js:
--------------------------------------------------------------------------------
1 | import PropTypes from 'prop-types'
2 | import styled, { css } from 'styled-components'
3 | import { Menu as ReakitMenu } from 'reakit/Menu'
4 | import get from 'utils/get'
5 |
6 | const MenuContent = styled.div`
7 | overflow: hidden;
8 | transition: transform 300ms, opacity 300ms;
9 | margin-top: 16px;
10 | @media (min-width: ${get('breakpoints.lg')}) {
11 | border: 1px solid ${get('colors.valhalla.300')};
12 | border-radius: 8px;
13 | background-color: ${get('colors.valhalla.600')};
14 | padding-left: 0;
15 | max-width: 360px;
16 | }
17 |
18 | ${p =>
19 | p.$animated &&
20 | css`
21 | transform-origin: top center;
22 | transform: translateY(0);
23 | opacity: 0;
24 | margin-top: 0;
25 | `};
26 |
27 | [data-enter] & {
28 | transform: translateY(16px);
29 | opacity: 100;
30 | }
31 | `
32 |
33 | const MenuWrapper = styled(ReakitMenu)`
34 | margin: 0;
35 | z-index: 50;
36 | `
37 |
38 | const Menu = ({ ariaLabel, children, ...props }) => (
39 |
40 | {children}
41 |
42 | )
43 |
44 | Menu.propTypes = {
45 | /**
46 | * aria-label for accessibility
47 | */
48 | ariaLabel: PropTypes.string,
49 | /**
50 | * The content to appear inside the Menu
51 | */
52 | children: PropTypes.node,
53 | }
54 |
55 | Menu.defaultProps = {
56 | ariaLabel: null,
57 | children: null,
58 | }
59 |
60 | export default Menu
61 |
--------------------------------------------------------------------------------
/src/components/Menu/MenuDisclosure.js:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components'
2 | import { MenuButton as ReakitMenuButton } from 'reakit/Menu'
3 | import PropTypes from 'prop-types'
4 | import { Arrow } from 'components/icons'
5 | import get from 'utils/get'
6 |
7 | const MenuButton = styled(ReakitMenuButton)`
8 | z-index: 10;
9 | display: inline-flex;
10 | align-items: center;
11 | color: white;
12 | background-color: transparent;
13 | border: 0;
14 | cursor: pointer;
15 | padding: 0;
16 | transition: color 300ms;
17 | outline: none;
18 | &:hover,
19 | &:focus {
20 | color: ${get('colors.hotPink')};
21 | }
22 | `
23 |
24 | const StyledArrow = styled(Arrow)`
25 | margin-left: 10px;
26 | transform: rotate(0deg);
27 | transition: transform 300ms;
28 | stroke: currentColor;
29 | width: 10px;
30 | ${p =>
31 | p.$visible &&
32 | css`
33 | transform: rotate(180deg);
34 | `}
35 | `
36 |
37 | const MenuDisclosure = ({ children, ...props }) => (
38 |
39 | {children}
40 |
41 |
42 | )
43 |
44 | MenuDisclosure.propTypes = {
45 | /**
46 | * The content to appear inside the MenuDisclosure
47 | */
48 | children: PropTypes.node,
49 | }
50 |
51 | MenuDisclosure.defaultProps = {
52 | children: null,
53 | }
54 |
55 | export default MenuDisclosure
56 |
--------------------------------------------------------------------------------
/src/components/Menu/index.js:
--------------------------------------------------------------------------------
1 | export { default as Menu } from './Menu'
2 | export { default as MenuDisclosure } from './MenuDisclosure'
3 | export { default as MenuItem } from './MenuItem'
4 |
--------------------------------------------------------------------------------
/src/components/PageContent.js:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import get from 'utils/get'
3 |
4 | const PageContent = styled.main`
5 | overflow: hidden;
6 | padding: 0 16px;
7 | @media (min-width: ${get('breakpoints.md')}) {
8 | padding: 0 32px;
9 | }
10 | `
11 |
12 | export default PageContent
13 |
--------------------------------------------------------------------------------
/src/components/PreTitle.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import PropTypes from 'prop-types'
4 | import Typography from 'components/Typography'
5 | import get from 'utils/get'
6 |
7 | const StyledPreTitle = styled(Typography)`
8 | color: ${p => p.$color};
9 | text-transform: uppercase;
10 | display: block;
11 | `
12 |
13 | const PreTitle = ({ preTitle, color, ...props }) => {
14 | return (
15 |
16 | {preTitle}
17 |
18 | )
19 | }
20 |
21 | PreTitle.propTypes = {
22 | /**
23 | * Text to display
24 | */
25 | preTitle: PropTypes.string,
26 | /**
27 | * Text to display
28 | */
29 | color: PropTypes.string,
30 | }
31 |
32 | PreTitle.defaultProps = {
33 | preTitle: null,
34 | color: get('colors.lila'),
35 | }
36 |
37 | export default PreTitle
38 |
--------------------------------------------------------------------------------
/src/components/PricingCard.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import Card from 'components/Card'
5 |
6 | const Wrapper = styled(Card)`
7 | border-style: solid;
8 | border-width: 1px;
9 | border-color: ${p => (p.$active ? get(p.$color) : 'transparent')};
10 | background-color: ${get('colors.valhalla.600')};
11 | padding: 16px;
12 | transition: background-color 300ms, border-color 300ms;
13 |
14 | &:hover,
15 | &:focus {
16 | background-color: ${get('colors.valhalla.700')};
17 | border-color: ${p => get(p.$color)};
18 | }
19 |
20 | @media (min-width: ${get('breakpoints.lg')}) {
21 | padding: 24px;
22 | }
23 | @media (min-width: ${get('breakpoints.xl')}) {
24 | padding: 32px;
25 | }
26 | `
27 |
28 | const PricingCard = ({ color = 'colors.dodgerBlue', active, ...props }) => {
29 | return
30 | }
31 |
32 | export default PricingCard
33 |
--------------------------------------------------------------------------------
/src/components/Radio.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import { Radio as ReakitRadio } from 'reakit/Radio'
4 | import IconCard from 'components/IconCard'
5 | import FullWidthCard from 'components/FullWidthCard'
6 | import hexToRgb from 'utils/hexToRgb'
7 | import get from 'utils/get'
8 | import getColorName from 'utils/getColorName'
9 |
10 | const HiddenRadio = styled(ReakitRadio)`
11 | opacity: 0;
12 | height: 0;
13 | width: 0;
14 | display: block;
15 | `
16 |
17 | const CardRadio = styled.div`
18 | cursor: pointer;
19 | border: 1px solid ${get('colors.valhalla.100')};
20 | border-radius: 8px;
21 | transition: border 300ms, background-color 300ms, color 300ms;
22 |
23 | &:hover,
24 | &:focus-within,
25 | ${HiddenRadio}:focus + & {
26 | border: 1px solid ${get('colors.white')};
27 | color: ${get('colors.white')};
28 | }
29 | ${HiddenRadio}[aria-checked="true"] + & {
30 | border: 1px solid ${p => get(`colors.${getColorName(p.$color)}`)};
31 | color: ${get('colors.white')};
32 | background-color: ${p =>
33 | hexToRgb(get(`colors.${getColorName(p.$color)}`), 0.2)};
34 | }
35 | ${HiddenRadio}[aria-checked="true"]:hover + &,
36 | ${HiddenRadio}[aria-checked="true"]:focus + & {
37 | border: 1px solid ${p => get(`colors.${getColorName(p.$color)}.300`)};
38 | }
39 | `
40 |
41 | const Radio = ({
42 | icon,
43 | title,
44 | radioState,
45 | color = get('colors.dodgerBlue'),
46 | value,
47 | ...props
48 | }) => (
49 |
58 | )
59 |
60 | export default Radio
61 |
--------------------------------------------------------------------------------
/src/components/RoundedIcon.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import hexToRgb from 'utils/hexToRgb'
4 | import get from 'utils/get'
5 |
6 | const IconWrapper = styled.div`
7 | background-color: ${p => hexToRgb(get(p.$color || 'colors.hotPink'), 0.2)};
8 | width: 36px;
9 | height: 36px;
10 | border-radius: 50%;
11 | color: ${p => get(p.$color || 'colors.hotPink')};
12 | padding: 8px;
13 | `
14 |
15 | const RoundedIcon = ({ icon, color, ...props }) => {
16 | const Icon = icon
17 | return (
18 |
19 |
20 |
21 | )
22 | }
23 |
24 | export default RoundedIcon
25 |
--------------------------------------------------------------------------------
/src/components/Tab.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import {
4 | Tab as ReakitTab,
5 | TabList as ReakitTabList,
6 | TabPanel as ReakitTabPabel,
7 | } from 'reakit/Tab'
8 | import get from 'utils/get'
9 |
10 | const Tab = props =>
11 |
12 | const TabList = styled(ReakitTabList)`
13 | button + button {
14 | margin-left: 32px;
15 | }
16 | `
17 |
18 | const TabElement = styled(ReakitTab)`
19 | border: 0;
20 | color: ${get('colors.white')};
21 | background-color: transparent;
22 | padding: 0;
23 | opacity: 0.4;
24 | transition: opacity 300ms;
25 |
26 | &:hover {
27 | opacity: 1;
28 | cursor: pointer;
29 | }
30 |
31 | &[aria-selected='true'] {
32 | opacity: 1;
33 | }
34 | `
35 |
36 | const TabPanel = styled(ReakitTabPabel)``
37 |
38 | Tab.TabList = TabList
39 | Tab.Tab = TabElement
40 | Tab.TabPanel = TabPanel
41 |
42 | export default Tab
43 |
--------------------------------------------------------------------------------
/src/components/Tag.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import get from 'utils/get'
4 | import hexToRgb from 'utils/hexToRgb'
5 | import Typography from './Typography'
6 |
7 | const TagWrapper = styled.div`
8 | color: ${get('colors.ashes')};
9 | border: 1px solid ${p => get(p.$color)};
10 | border-radius: 8px;
11 | padding: 4px 7px;
12 | display: inline-flex;
13 | align-items: center;
14 | justify-content: center;
15 | background-color: ${p => hexToRgb(get(p.$color), 0.2)};
16 | min-width: 70px;
17 | `
18 |
19 | const Tag = ({ children, color = 'colors.dodgerBlue', ...props }) => {
20 | return (
21 |
22 | {children}
23 |
24 | )
25 | }
26 |
27 | export default Tag
28 |
--------------------------------------------------------------------------------
/src/components/Tooltip.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import {
4 | useTooltipState,
5 | Tooltip as ReakitTooltip,
6 | TooltipReference as ReakitTooltipReference,
7 | } from 'reakit/Tooltip'
8 | import Typography from './Typography'
9 | import get from 'utils/get'
10 |
11 | const TooltipReference = styled(ReakitTooltipReference)`
12 | background-color: transparent;
13 | border: 0;
14 | color: inherit;
15 | border-bottom: 1px dashed ${get('colors.white')};
16 | padding: 0;
17 | `
18 |
19 | const TextContainer = styled.div`
20 | background-color: ${get('colors.white')};
21 | border-radius: 8px;
22 | padding: 12px 10px;
23 | color: ${get('colors.valhalla.100')};
24 | `
25 |
26 | function Tooltip({ children, title, ...props }) {
27 | const tooltip = useTooltipState({ placement: 'bottom' })
28 | return (
29 | <>
30 |
31 | {referenceProps => React.cloneElement(children, referenceProps)}
32 |
33 |
34 |
35 |
36 | {title}
37 |
38 |
39 | >
40 | )
41 | }
42 | export default Tooltip
43 |
--------------------------------------------------------------------------------
/src/components/icons/Angular.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgAngular({ title, titleId, ...props }) {
4 | return (
5 |
27 | )
28 | }
29 |
30 | export default SvgAngular
31 |
--------------------------------------------------------------------------------
/src/components/icons/Api.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgApi({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgApi
24 |
--------------------------------------------------------------------------------
/src/components/icons/ApiReference.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgApiReference({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgApiReference
24 |
--------------------------------------------------------------------------------
/src/components/icons/Arrow.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgArrow({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgArrow
24 |
--------------------------------------------------------------------------------
/src/components/icons/B2CApp.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgB2CApp({ title, titleId, ...props }) {
4 | return (
5 |
47 | )
48 | }
49 |
50 | export default SvgB2CApp
51 |
--------------------------------------------------------------------------------
/src/components/icons/Blog.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgBlog({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgBlog
24 |
--------------------------------------------------------------------------------
/src/components/icons/Chat.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgChat({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgChat
24 |
--------------------------------------------------------------------------------
/src/components/icons/Code.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgCode({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgCode
24 |
--------------------------------------------------------------------------------
/src/components/icons/Cross.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgCross({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgCross
24 |
--------------------------------------------------------------------------------
/src/components/icons/Diamond.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgDiamond({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgDiamond
24 |
--------------------------------------------------------------------------------
/src/components/icons/Discord.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgDiscord({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgDiscord
24 |
--------------------------------------------------------------------------------
/src/components/icons/Documentation.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgDocumentation({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgDocumentation
24 |
--------------------------------------------------------------------------------
/src/components/icons/Dotnet.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgDotnet({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgDotnet
22 |
--------------------------------------------------------------------------------
/src/components/icons/Excluded.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgExcluded({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgExcluded
22 |
--------------------------------------------------------------------------------
/src/components/icons/Filter.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgFilter({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgFilter
24 |
--------------------------------------------------------------------------------
/src/components/icons/Github.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgGithub({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgGithub
22 |
--------------------------------------------------------------------------------
/src/components/icons/Guides.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgGuides({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgGuides
24 |
--------------------------------------------------------------------------------
/src/components/icons/Included.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgIncluded({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgIncluded
22 |
--------------------------------------------------------------------------------
/src/components/icons/Instantmeilisearch.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgInstantmeilisearch({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgInstantmeilisearch
22 |
--------------------------------------------------------------------------------
/src/components/icons/Integrations.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgIntegrations({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgIntegrations
24 |
--------------------------------------------------------------------------------
/src/components/icons/Javascript.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgJavascript({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgJavascript
22 |
--------------------------------------------------------------------------------
/src/components/icons/Key.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgKey({ title, titleId, ...props }) {
4 | return (
5 |
22 | )
23 | }
24 |
25 | export default SvgKey
26 |
--------------------------------------------------------------------------------
/src/components/icons/Lightning.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgLightning({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgLightning
24 |
--------------------------------------------------------------------------------
/src/components/icons/Linkedin.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgLinkedin({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgLinkedin
22 |
--------------------------------------------------------------------------------
/src/components/icons/LocalGlobe.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgLocalGlobe({ title, titleId, ...props }) {
4 | return (
5 |
30 | )
31 | }
32 |
33 | export default SvgLocalGlobe
34 |
--------------------------------------------------------------------------------
/src/components/icons/MagnifyingGlass.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgMagnifyingGlass({ title, titleId, ...props }) {
4 | return (
5 |
26 | )
27 | }
28 |
29 | export default SvgMagnifyingGlass
30 |
--------------------------------------------------------------------------------
/src/components/icons/Media.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgMedia({ title, titleId, ...props }) {
4 | return (
5 |
38 | )
39 | }
40 |
41 | export default SvgMedia
42 |
--------------------------------------------------------------------------------
/src/components/icons/NumericSorting.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgNumericSorting({ title, titleId, ...props }) {
4 | return (
5 |
49 | )
50 | }
51 |
52 | export default SvgNumericSorting
53 |
--------------------------------------------------------------------------------
/src/components/icons/Other.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgOther({ title, titleId, ...props }) {
4 | return (
5 |
50 | )
51 | }
52 |
53 | export default SvgOther
54 |
--------------------------------------------------------------------------------
/src/components/icons/Php.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgPhp({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgPhp
22 |
--------------------------------------------------------------------------------
/src/components/icons/Plug.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgPlug({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgPlug
22 |
--------------------------------------------------------------------------------
/src/components/icons/Python.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgPython({ title, titleId, ...props }) {
4 | return (
5 |
22 | )
23 | }
24 |
25 | export default SvgPython
26 |
--------------------------------------------------------------------------------
/src/components/icons/RightArrow.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgRightArrow({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgRightArrow
24 |
--------------------------------------------------------------------------------
/src/components/icons/Roadmap.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgRoadmap({ title, titleId, ...props }) {
4 | return (
5 |
22 | )
23 | }
24 |
25 | export default SvgRoadmap
26 |
--------------------------------------------------------------------------------
/src/components/icons/Roadmap2.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgRoadmap2({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgRoadmap2
22 |
--------------------------------------------------------------------------------
/src/components/icons/Rocket.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgRocket({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgRocket
24 |
--------------------------------------------------------------------------------
/src/components/icons/SaasApp.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgSaasApp({ title, titleId, ...props }) {
4 | return (
5 |
43 | )
44 | }
45 |
46 | export default SvgSaasApp
47 |
--------------------------------------------------------------------------------
/src/components/icons/SortBy.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgSortBy({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgSortBy
24 |
--------------------------------------------------------------------------------
/src/components/icons/Star.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgStar({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgStar
22 |
--------------------------------------------------------------------------------
/src/components/icons/Swift.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgSwift({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgSwift
22 |
--------------------------------------------------------------------------------
/src/components/icons/Twitter.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgTwitter({ title, titleId, ...props }) {
4 | return (
5 |
18 | )
19 | }
20 |
21 | export default SvgTwitter
22 |
--------------------------------------------------------------------------------
/src/components/icons/Typo.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgTypo({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgTypo
24 |
--------------------------------------------------------------------------------
/src/components/icons/Vue.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgVue({ title, titleId, ...props }) {
4 | return (
5 |
23 | )
24 | }
25 |
26 | export default SvgVue
27 |
--------------------------------------------------------------------------------
/src/components/icons/Wrench.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | function SvgWrench({ title, titleId, ...props }) {
4 | return (
5 |
20 | )
21 | }
22 |
23 | export default SvgWrench
24 |
--------------------------------------------------------------------------------
/src/components/icons/svg/API.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/Code.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/icons/svg/angular.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/icons/svg/arrow.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/cross.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/diamond.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/discord.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/documentation.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/dotnet.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/src/components/icons/svg/excluded.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/filter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/github.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/included.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/instantmeilisearch.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/icons/svg/javascript.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/lightning.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/linkedin.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/local_globe.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/icons/svg/magnifying_glass.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/icons/svg/plug.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/python.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/icons/svg/right_arrow.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/roadmap.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/icons/svg/roadmap2.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/star.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/swift.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/twitter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/components/icons/svg/vue.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/hooks/useWindowSize.js:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react'
2 |
3 | const useWindowSize = () => {
4 | const [windowSize, setWindowSize] = useState({
5 | width: undefined,
6 | height: undefined,
7 | })
8 |
9 | useEffect(() => {
10 | const handleResize = () => {
11 | setWindowSize({
12 | width: window.innerWidth,
13 | height: window.innerHeight,
14 | })
15 | }
16 | window.addEventListener('resize', handleResize)
17 | handleResize()
18 |
19 | return () => window.removeEventListener('resize', handleResize)
20 | }, [])
21 |
22 | return windowSize
23 | }
24 |
25 | export default useWindowSize
26 |
--------------------------------------------------------------------------------
/src/layouts/BaseLayout.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import { Header, Footer } from 'blocks'
4 |
5 | const BaseLayout = ({ children }) => {
6 | return (
7 |
8 |
9 | {children}
10 |
11 |
12 | )
13 | }
14 |
15 | export default BaseLayout
16 |
--------------------------------------------------------------------------------
/src/pages/about-us.js:
--------------------------------------------------------------------------------
1 | import Head from 'components/Head'
2 | import PageContent from 'components/PageContent'
3 | import aboutUsData from '../../data/about-us'
4 | import {
5 | AboutUsHero,
6 | OurStory,
7 | Investors,
8 | Values,
9 | JobOffers,
10 | PerksAndBenefits,
11 | OurTeam,
12 | } from 'blocks'
13 |
14 | const AboutUs = () => {
15 | const {
16 | meta,
17 | hero,
18 | ourStory,
19 | investors,
20 | values,
21 | jobOffers,
22 | perksAndBenefits,
23 | ourTeam,
24 | } = aboutUsData
25 | return (
26 | <>
27 |
28 |
29 |
30 |
31 |
32 |
33 |
37 |
38 |
39 |
40 | >
41 | )
42 | }
43 |
44 | export default AboutUs
45 |
--------------------------------------------------------------------------------
/src/pages/pricing.js:
--------------------------------------------------------------------------------
1 | import Head from 'components/Head'
2 | import styled from 'styled-components'
3 | import pricingPageData from '../../data/pricing'
4 | import PageContent from 'components/PageContent'
5 | import {
6 | PricingHero,
7 | FAQ,
8 | ComparativeTable,
9 | PricingPlans as BasePricingBlock,
10 | } from 'blocks'
11 | import get from 'utils/get'
12 |
13 | const HeroBlock = styled(PricingHero)`
14 | margin-top: 72px;
15 | @media (min-width: ${get('breakpoints.md')}) {
16 | margin-top: 46px;
17 | }
18 | @media (min-width: ${get('breakpoints.lg')}) {
19 | margin-top: 98px;
20 | }
21 | @media (min-width: ${get('breakpoints.xl')}) {
22 | margin-top: 92px;
23 | }
24 | `
25 |
26 | const PricingBlock = styled(BasePricingBlock)`
27 | margin-top: 68px;
28 | @media (min-width: ${get('breakpoints.lg')}) {
29 | margin-top: 56px;
30 | }
31 | @media (min-width: ${get('breakpoints.lg')}) {
32 | margin-top: 68px;
33 | }
34 | @media (min-width: ${get('breakpoints.xl')}) {
35 | margin-top: 128px;
36 | }
37 | `
38 |
39 | const Pricing = () => {
40 | const { meta, hero, faq, table, pricing } = pricingPageData
41 | return (
42 | <>
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | >
51 | )
52 | }
53 |
54 | export default Pricing
55 |
--------------------------------------------------------------------------------
/src/stories/AboutUsHero.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { AboutUsHero } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/AboutUsHero',
7 | }
8 |
9 | export const Default = () => {
10 | const { hero } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Accordion.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Accordion from 'components/Accordion'
3 |
4 | export default {
5 | title: 'Components/Accordion',
6 | component: Accordion,
7 | parameters: {
8 | layout: 'padded',
9 | },
10 | }
11 |
12 | const Template = args => (
13 |
16 | )
17 |
18 | export const Default = Template.bind({})
19 | Default.args = {
20 | question: 'Do you offer custom invoicing?',
21 | answer:
22 | 'Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more.',
23 | }
24 |
25 | export const WithLink = Template.bind({})
26 | WithLink.args = {
27 | question: 'Do you offer custom invoicing?',
28 | answer:
29 | 'Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more.',
30 | }
31 |
32 | export const WithLongQuestion = Template.bind({})
33 | WithLongQuestion.args = {
34 | question:
35 | 'Do you offer custom invoicing? Do you offer custom invoicing? Do you offer custom invoicing?',
36 | answer:
37 | 'Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more.',
38 | }
39 |
40 | export const WithLongAnswer = Template.bind({})
41 | WithLongAnswer.args = {
42 | question: 'Do you offer custom invoicing?',
43 | answer:
44 | 'Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more.
Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more. Yes, we offer custom invoicing for Enterprise customers. Contact our sales team to learn more.',
45 | }
46 |
--------------------------------------------------------------------------------
/src/stories/Bullets.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Bullets from 'components/Bullets'
3 | import get from 'utils/get'
4 | import Button from 'components/Button'
5 |
6 | export default {
7 | title: 'Components/Bullets',
8 | component: Bullets,
9 | parameters: {
10 | layout: 'padded',
11 | },
12 | decorators: [
13 | Story => (
14 |
19 |
20 |
21 | ),
22 | ],
23 | }
24 |
25 | export const Default = () => {
26 | const [index, setIndex] = React.useState(0)
27 | const nbBullets = 6
28 | return (
29 | <>
30 |
35 | {index < nbBullets - 1 && (
36 |
39 | )}
40 | >
41 | )
42 | }
43 |
--------------------------------------------------------------------------------
/src/stories/Card.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Card from 'components/Card'
3 | import Typography from 'components/Typography'
4 |
5 | export default {
6 | title: 'Components/Card',
7 | component: Card,
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | decorators: [
12 | Story => (
13 |
18 |
19 |
20 | ),
21 | ],
22 | }
23 |
24 | const Template = args => (
25 |
26 |
27 |
28 | )
29 |
30 | export const Default = Template.bind({})
31 | Default.args = {
32 | children: I am a Card component,
33 | }
34 |
--------------------------------------------------------------------------------
/src/stories/Cards.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Cards } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 |
5 | export default {
6 | title: 'Blocks/Cards',
7 | parameters: {
8 | backgrounds: { default: 'white' },
9 | },
10 | }
11 |
12 | export const Default = () => {
13 | const { cards: cardsProps } = homepageData
14 |
15 | return
16 | }
17 |
--------------------------------------------------------------------------------
/src/stories/Checkbox.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Checkbox from 'components/Checkbox'
3 | import { useCheckboxState } from 'reakit/Checkbox'
4 | import { Rust, Python, React as ReactIcon } from 'components/icons'
5 | import Typography from 'components/Typography'
6 |
7 | export default {
8 | title: 'Components/Checkbox',
9 | component: Checkbox,
10 | parameters: {
11 | layout: 'padded',
12 | },
13 | decorators: [
14 | Story => (
15 |
20 |
21 |
22 | ),
23 | ],
24 | }
25 |
26 | export const Default = () => {
27 | const checkboxState = useCheckboxState({ state: [] })
28 | return (
29 | <>
30 | Choices: {checkboxState.state.join(', ')}
31 |
37 |
43 |
49 | >
50 | )
51 | }
52 |
--------------------------------------------------------------------------------
/src/stories/Companies.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Companies } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/Companies',
8 | }
9 |
10 | export const Default = () => {
11 | const { companies: companiesProps } = homepageData
12 |
13 | return (
14 |
15 | )
16 | }
17 |
--------------------------------------------------------------------------------
/src/stories/Demo.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Demo } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/Demo',
8 | }
9 |
10 | export const Default = () => {
11 | const { demo: demoProps } = homepageData
12 |
13 | return
14 | }
15 |
16 | export const OtherColor = () => {
17 | const { demo: demoProps } = homepageData
18 |
19 | return
20 | }
21 |
--------------------------------------------------------------------------------
/src/stories/Disclosure.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useDisclosureState } from 'reakit/Disclosure'
3 | import { Disclosure, DisclosureContent } from '../components/Disclosure'
4 | import Typography from '../components/Typography'
5 | import get from 'utils/get'
6 |
7 | export default {
8 | title: 'Components/Disclosure',
9 | parameters: {
10 | layout: 'padded',
11 | },
12 | decorators: [
13 | Story => (
14 |
19 |
20 |
21 | ),
22 | ],
23 | }
24 |
25 | const DisclosureComponent = ({ disclosure }) => (
26 | <>
27 |
28 | Toggle
29 |
30 |
31 |
32 | I’m the content !
33 |
34 |
35 | >
36 | )
37 |
38 | export const Default = () => {
39 | const disclosure = useDisclosureState()
40 | return
41 | }
42 |
43 | export const Animated = () => {
44 | const disclosure = useDisclosureState({ animated: true })
45 | return
46 | }
47 |
--------------------------------------------------------------------------------
/src/stories/FAQ.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FAQ } from 'blocks'
3 | import pricingPageData from '../../data/pricing'
4 |
5 | export default {
6 | title: 'Blocks/FAQ',
7 | }
8 |
9 | export const Default = () => {
10 | const { faq } = pricingPageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Footer.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Footer } from 'blocks'
3 |
4 | export default {
5 | title: 'blocks/Footer',
6 | component: Footer,
7 | parameters: {
8 | backgrounds: { default: 'white' },
9 | },
10 | }
11 |
12 | const Template = args => {
13 | return
14 | }
15 |
16 | export const Default = Template.bind({})
17 | Default.parameters = {
18 | backgrounds: { default: 'white' },
19 | }
20 |
--------------------------------------------------------------------------------
/src/stories/GithubButton.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import GithubButton from 'components/GithubButton'
3 |
4 | export default {
5 | title: 'Components/GithubButton',
6 | component: GithubButton,
7 | parameters: {
8 | layout: 'padded',
9 | },
10 | }
11 |
12 | const Template = args =>
13 |
14 | export const Default = Template.bind({})
15 | Default.args = {
16 | count: '20.5K',
17 | href: '/',
18 | }
19 |
--------------------------------------------------------------------------------
/src/stories/Header.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Header } from 'blocks'
3 |
4 | export default {
5 | title: 'blocks/Header',
6 | component: Header,
7 | parameters: {
8 | backgrounds: { default: 'white' },
9 | },
10 | }
11 |
12 | const Template = args => {
13 | return
14 | }
15 |
16 | export const Default = Template.bind({})
17 | Default.parameters = {
18 | backgrounds: { default: 'white' },
19 | }
20 |
--------------------------------------------------------------------------------
/src/stories/Hero.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Hero } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 |
5 | export default {
6 | title: 'Blocks/Hero',
7 | }
8 |
9 | export const Default = () => {
10 | const { hero: heroProps } = homepageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Input.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Input from 'components/Input'
3 | import footerData from '../../data/footer'
4 |
5 | export default {
6 | title: 'Components/Input',
7 | component: Input,
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | }
12 |
13 | export const Default = () => {
14 | const [email, setEmail] = React.useState('')
15 | const { newsletter: newsletterProps } = footerData
16 |
17 | return (
18 | setEmail(e.target.value)}
23 | />
24 | )
25 | }
26 |
--------------------------------------------------------------------------------
/src/stories/InteractiveSearch.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import InteractiveSearch from 'components/InteractiveSearch'
3 | import homepageData from '../../data/homepage'
4 |
5 | export default {
6 | title: 'Components/InteractiveSearch',
7 | component: InteractiveSearch,
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | }
12 |
13 | export const Default = () => {
14 | const { demo: demoProps } = homepageData
15 |
16 | return (
17 |
21 | )
22 | }
23 |
--------------------------------------------------------------------------------
/src/stories/Investors.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Investors } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/Investors',
7 | }
8 |
9 | export const Default = () => {
10 | const { investors } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/JobOffers.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { JobOffers } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/JobOffers',
7 | }
8 |
9 | export const Default = () => {
10 | const { jobOffers } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Link.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from 'styled-components'
3 | import Link from 'components/Link'
4 | import Typography from 'components/Typography'
5 |
6 | export default {
7 | title: 'Components/Link',
8 | component: Link,
9 | parameters: {
10 | layout: 'padded',
11 | },
12 | }
13 |
14 | const StyledLink = styled(Link)`
15 | color: white;
16 | `
17 |
18 | const Template = args =>
19 |
20 | export const Default = Template.bind({})
21 | Default.args = {
22 | href: '/',
23 | children: I’m a Link,
24 | }
25 |
--------------------------------------------------------------------------------
/src/stories/List.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Typography from 'components/Typography'
3 | import List from 'components/List'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Components/List',
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | }
12 |
13 | export const Default = () => (
14 |
15 |
16 | Release notes
17 |
18 |
19 | Demos
20 |
21 |
22 | Integrations
23 |
24 |
25 | )
26 |
27 | const PinkLi = props => (
28 |
29 | )
30 |
31 | export const HotPink = () => (
32 |
33 |
34 | Release notes
35 |
36 |
37 | Demos
38 |
39 |
40 | Integrations
41 |
42 |
43 | )
44 |
--------------------------------------------------------------------------------
/src/stories/Menu.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Menu, MenuDisclosure, MenuItem } from 'components/Menu'
3 | import Typography from 'components/Typography'
4 | import { useMenuState } from 'reakit/Menu'
5 | import headerData from '../../data/header'
6 |
7 | export default {
8 | title: 'Components/Menu',
9 | component: Menu,
10 | parameters: {
11 | layout: 'padded',
12 | },
13 | }
14 |
15 | export const Default = () => {
16 | const menuState = useMenuState()
17 |
18 | const menuList = headerData.links.find(link => link.subMenu)
19 | return (
20 | <>
21 |
22 | {menuList.title}
23 |
24 |
29 | >
30 | )
31 | }
32 |
33 | export const Animated = () => {
34 | const menuState = useMenuState({ animated: 300, loop: true })
35 |
36 | const menuList = headerData.links.find(link => link.subMenu)
37 |
38 | return (
39 | <>
40 |
41 | {menuList.title}
42 |
43 |
48 | >
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/src/stories/OpenSource.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { OpenSource } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/OpenSource',
8 | }
9 |
10 | export const Default = () => {
11 | const { openSource: openSourceProps } = homepageData
12 |
13 | return
14 | }
15 |
16 | export const OtherColor = () => {
17 | const { openSource: openSourceProps } = homepageData
18 |
19 | return (
20 |
21 | )
22 | }
23 |
--------------------------------------------------------------------------------
/src/stories/OurStory.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { OurStory } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/OurStory',
7 | }
8 |
9 | export const Default = () => {
10 | const { ourStory } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/OurTeam.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { OurTeam } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/OurTeam',
7 | }
8 |
9 | export const Default = () => {
10 | const { ourTeam } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/PerksAndBenefits.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { PerksAndBenefits } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/PerksAndBenefits',
7 | }
8 |
9 | export const Default = () => {
10 | const { perksAndBenefits } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/PreTitle.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PreTitle from 'components/PreTitle'
3 | import get from 'utils/get'
4 |
5 | export default {
6 | title: 'Components/PreTitle',
7 | component: PreTitle,
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | }
12 |
13 | const Template = args =>
14 |
15 | export const Default = Template.bind({})
16 | Default.args = {
17 | preTitle: 'I’m the default preTitle',
18 | }
19 |
20 | export const OtherColor = Template.bind({})
21 | OtherColor.args = {
22 | preTitle: 'I’m a preTitle with an other color',
23 | color: get('colors.hotPink'),
24 | }
25 |
--------------------------------------------------------------------------------
/src/stories/Pricing.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { PricingPlans } from 'blocks'
3 | import pricingPageData from '../../data/pricing'
4 |
5 | export default {
6 | title: 'Blocks/PricingPlans',
7 | }
8 |
9 | export const Default = () => {
10 | const { pricing } = pricingPageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/PricingCard.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PricingCard from 'components/PricingCard'
3 | import Typography from 'components/Typography'
4 |
5 | export default {
6 | title: 'Components/PricingCard',
7 | component: PricingCard,
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | decorators: [
12 | Story => (
13 |
19 |
20 |
21 | ),
22 | ],
23 | }
24 |
25 | const Template = args =>
26 |
27 | export const Default = Template.bind({})
28 | Default.args = {
29 | children: Hover me,
30 | }
31 |
32 | export const OtherColor = Template.bind({})
33 | OtherColor.args = {
34 | children: Hover me,
35 | color: 'colors.hotPink',
36 | }
37 |
--------------------------------------------------------------------------------
/src/stories/PricingHero.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { PricingHero as Hero } from 'blocks'
3 | import pricingPageData from '../../data/pricing'
4 |
5 | export default {
6 | title: 'Blocks/PricingHero',
7 | }
8 |
9 | export const Default = () => {
10 | const { hero } = pricingPageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Radio.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Radio from 'components/Radio'
3 | import { useRadioState, RadioGroup } from 'reakit/Radio'
4 | import { Rust, Python, React as ReactIcon } from 'components/icons'
5 |
6 | export default {
7 | title: 'Components/Radio',
8 | component: Radio,
9 | parameters: {
10 | layout: 'padded',
11 | },
12 | decorators: [
13 | Story => (
14 |
19 |
20 |
21 | ),
22 | ],
23 | }
24 |
25 | export const Default = () => {
26 | const radioState = useRadioState()
27 |
28 | return (
29 |
30 |
31 |
32 |
33 |
34 | )
35 | }
36 |
37 | export const WithIcon = () => {
38 | const radioState = useRadioState()
39 |
40 | return (
41 |
42 |
43 |
49 |
55 |
56 | )
57 | }
58 |
--------------------------------------------------------------------------------
/src/stories/RoundedIcon.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import RoundedIcon from 'components/RoundedIcon'
3 | import { Puzzle } from 'components/icons'
4 |
5 | export default {
6 | title: 'Components/RoundedIcon',
7 | parameters: {
8 | layout: 'padded',
9 | },
10 | }
11 |
12 | const Template = args =>
13 |
14 | export const Default = Template.bind({})
15 | Default.args = {
16 | icon: Puzzle,
17 | }
18 |
19 | export const OtherColor = Template.bind({})
20 | OtherColor.args = {
21 | icon: Puzzle,
22 | color: 'colors.dodgerBlue',
23 | }
24 |
--------------------------------------------------------------------------------
/src/stories/Searchbox.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { instantMeiliSearch } from '@meilisearch/instant-meilisearch'
3 | import Searchbox from 'components/Searchbox'
4 | import { InstantSearch } from 'react-instantsearch-dom'
5 |
6 | const NEXT_PUBLIC_DEMO_MOVIES_HOST =
7 | process.env.NEXT_PUBLIC_DEMO_MOVIES_HOST || 'http://0.0.0.0:7700'
8 |
9 | const NEXT_PUBLIC_DEMO_MOVIES_API_KEY =
10 | process.env.NEXT_PUBLIC_DEMO_MOVIES_API_KEY || 'searchKey'
11 |
12 | export default {
13 | title: 'Components/Searchbox',
14 | component: Searchbox,
15 | parameters: {
16 | layout: 'padded',
17 | },
18 | }
19 |
20 | export const Default = () => {
21 | const searchClient = React.useMemo(
22 | () =>
23 | instantMeiliSearch(
24 | NEXT_PUBLIC_DEMO_MOVIES_HOST,
25 | NEXT_PUBLIC_DEMO_MOVIES_API_KEY,
26 | {
27 | paginationTotalHits: 4,
28 | primaryKey: 'id',
29 | }
30 | ),
31 | []
32 | )
33 | return (
34 |
35 |
36 |
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/src/stories/Step1.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Step1 } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/Step1',
8 | }
9 |
10 | export const Default = () => {
11 | const { steps: stepsProps } = homepageData
12 |
13 | return (
14 | ({
17 | preTitle: step.preTitle,
18 | title: step.title,
19 | }))}
20 | />
21 | )
22 | }
23 |
24 | export const OtherColor = () => {
25 | const { steps: stepsProps } = homepageData
26 |
27 | return (
28 | ({
31 | preTitle: step.preTitle,
32 | title: step.title,
33 | }))}
34 | color={get('colors.hotPink')}
35 | />
36 | )
37 | }
38 |
--------------------------------------------------------------------------------
/src/stories/Step2.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Step2 } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/Step2',
8 | }
9 |
10 | export const Default = () => {
11 | const { steps: stepsProps } = homepageData
12 |
13 | return (
14 | ({
17 | preTitle: step.preTitle,
18 | title: step.title,
19 | }))}
20 | />
21 | )
22 | }
23 |
24 | export const OtherColor = () => {
25 | const { steps: stepsProps } = homepageData
26 |
27 | return (
28 | ({
31 | preTitle: step.preTitle,
32 | title: step.title,
33 | }))}
34 | color={get('colors.dodgerBlue')}
35 | />
36 | )
37 | }
38 |
--------------------------------------------------------------------------------
/src/stories/Step3.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Step3 } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 | import get from 'utils/get'
5 |
6 | export default {
7 | title: 'Blocks/Step3',
8 | }
9 |
10 | export const Default = () => {
11 | const { steps: stepsProps } = homepageData
12 |
13 | return (
14 | ({
17 | preTitle: step.preTitle,
18 | title: step.title,
19 | }))}
20 | />
21 | )
22 | }
23 |
24 | export const OtherColor = () => {
25 | const { steps: stepsProps } = homepageData
26 |
27 | return (
28 | ({
31 | preTitle: step.preTitle,
32 | title: step.title,
33 | }))}
34 | color={get('colors.hotPink')}
35 | />
36 | )
37 | }
38 |
--------------------------------------------------------------------------------
/src/stories/Tab.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Typography from '../components/Typography'
3 | import { useTabState } from 'reakit/Tab'
4 | import Tab from 'components/Tab'
5 |
6 | export default {
7 | title: 'Components/Tab',
8 | parameters: {
9 | layout: 'padded',
10 | },
11 | decorators: [
12 | Story => (
13 |
18 |
19 |
20 | ),
21 | ],
22 | }
23 |
24 | export const Default = () => {
25 | const tab = useTabState()
26 |
27 | return (
28 | <>
29 |
30 |
31 | Basic
32 |
33 |
34 | Enterprise
35 |
36 |
37 |
38 | Basic plan
39 |
40 |
41 | Enterprise plan
42 |
43 | >
44 | )
45 | }
46 |
--------------------------------------------------------------------------------
/src/stories/Table.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { ComparativeTable } from 'blocks'
3 | import pricingPageData from '../../data/pricing'
4 |
5 | export default {
6 | title: 'Blocks/Table',
7 | }
8 |
9 | export const Default = () => {
10 | const { table } = pricingPageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/TableComponent.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Table from 'components/Table'
3 | import pricingPageData from '../../data/pricing'
4 |
5 | export default {
6 | title: 'Components/Table',
7 | parameters: {
8 | layout: 'padded',
9 | },
10 | }
11 |
12 | export const Default = () => {
13 | const { table } = pricingPageData
14 |
15 | return
16 | }
17 |
--------------------------------------------------------------------------------
/src/stories/Tag.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Tag from 'components/Tag'
3 |
4 | export default {
5 | title: 'Components/Tag',
6 | parameters: {
7 | layout: 'padded',
8 | },
9 | }
10 |
11 | const Template = args =>
12 |
13 | export const Default = Template.bind({})
14 | Default.args = {
15 | children: '$0.042/hr',
16 | }
17 |
18 | export const ShortText = Template.bind({})
19 | ShortText.args = {
20 | children: '$1/hr',
21 | }
22 |
23 | export const LongText = Template.bind({})
24 | LongText.args = {
25 | children: '$0.0000000000042/hr',
26 | }
27 |
28 | export const OtherColor = Template.bind({})
29 | OtherColor.args = {
30 | children: '$0.042/hr',
31 | color: 'colors.hotPink',
32 | }
33 |
--------------------------------------------------------------------------------
/src/stories/Testimonial.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Testimonial from 'components/Testimonial'
3 | import homepageData from '../../data/homepage'
4 |
5 | export default {
6 | title: 'Components/Testimonial',
7 | parameters: {
8 | layout: 'padded',
9 | },
10 | }
11 |
12 | export const Default = () => {
13 | const { testimonials } = homepageData
14 |
15 | return
16 | }
17 |
--------------------------------------------------------------------------------
/src/stories/Testimonials.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Testimonials } from 'blocks'
3 | import homepageData from '../../data/homepage'
4 |
5 | export default {
6 | title: 'Blocks/Testimonials',
7 | }
8 |
9 | export const Default = () => {
10 | const { testimonials: testimonialsProps } = homepageData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/stories/Tooltip.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Typography from '../components/Typography'
3 | import Tooltip from 'components/Tooltip'
4 |
5 | export default {
6 | title: 'Components/Tooltip',
7 | decorators: [
8 | Story => (
9 |
16 |
17 |
18 | ),
19 | ],
20 | }
21 |
22 | export const Default = () => (
23 |
24 |
27 |
28 | )
29 |
--------------------------------------------------------------------------------
/src/stories/Values.stories.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Values } from 'blocks'
3 | import aboutUsData from '../../data/about-us'
4 |
5 | export default {
6 | title: 'Blocks/Values',
7 | }
8 |
9 | export const Default = () => {
10 | const { values } = aboutUsData
11 |
12 | return
13 | }
14 |
--------------------------------------------------------------------------------
/src/theme/GlobalStyle.js:
--------------------------------------------------------------------------------
1 | import { createGlobalStyle } from 'styled-components'
2 | import get from 'utils/get'
3 |
4 | const GlobalStyle = createGlobalStyle`
5 | html, body {
6 | margin: 0;
7 | background-color: ${get('colors.valhalla')};
8 | scroll-behavior: smooth;
9 | font-smooth: auto;
10 | -webkit-font-smoothing: antialiased;
11 | --header-height-mobile: 98px;
12 | --header-height-desktop: 88px;
13 | --banner-height: 48px;
14 | }
15 | * {
16 | box-sizing: border-box;
17 | }
18 | a {
19 | text-decoration: none;
20 | }
21 | .cky-consent-container, .cky-modal {
22 | font-family: ${get('fontFamily.inter')};
23 | }
24 | `
25 |
26 | export default GlobalStyle
27 |
--------------------------------------------------------------------------------
/src/theme/breakpoints.js:
--------------------------------------------------------------------------------
1 | const breakpoints = {
2 | md: '768px',
3 | lg: '1024px',
4 | xl: '1440px',
5 | }
6 |
7 | export default breakpoints
8 |
--------------------------------------------------------------------------------
/src/theme/colors.js:
--------------------------------------------------------------------------------
1 | const colors = {
2 | white: '#FFF',
3 | dodgerBlue: {
4 | 300: '#9FA1F0',
5 | 400: '#7B7EEF',
6 | DEFAULT: '#4F55E3',
7 | 600: '#232ADC',
8 | 700: '#1C22B0',
9 | 800: '#151984',
10 | },
11 | lila: {
12 | 100: '#F5EDFC',
13 | 400: '#C392ED',
14 | DEFAULT: '#AD6DE7',
15 | 600: '#8E33DE',
16 | },
17 | tertiary: {
18 | 300: '#A8F0ED',
19 | 400: '#85EAE5',
20 | DEFAULT: '#51E1D9',
21 | },
22 | hotPink: {
23 | 300: '#FFAED4',
24 | 400: '#FF8DC4',
25 | DEFAULT: '#FF5CAA',
26 | 600: '#FF1786',
27 | },
28 | candleLight: {
29 | 400: '#FFE27D',
30 | DEFAULT: '#FFDA58',
31 | },
32 | valhalla: {
33 | 100: '#705B8C',
34 | 200: '#5C447C',
35 | 300: '#492E6C',
36 | 400: '#35175B',
37 | DEFAULT: '#21004B',
38 | 600: '#1A003C',
39 | 700: '#14002D',
40 | 800: '#0D001E',
41 | },
42 | ashes: {
43 | 100: '#FAFBFE',
44 | DEFAULT: '#EDEEF7',
45 | 600: '#E1E0EE',
46 | 900: '#BDB7D3',
47 | },
48 | luckyPoint: '#281969',
49 | }
50 |
51 | export default colors
52 |
--------------------------------------------------------------------------------
/src/theme/fontFamily.js:
--------------------------------------------------------------------------------
1 | const fontFamily = {
2 | poppins: 'Poppins, Arial, Helvetica, sans-serif',
3 | inter: 'Inter, Verdana, sans-serif',
4 | }
5 |
6 | export default fontFamily
7 |
--------------------------------------------------------------------------------
/src/theme/fontWeight.js:
--------------------------------------------------------------------------------
1 | const fontWeight = {
2 | 'font-light': 300,
3 | 'normal': 400,
4 | 'medium': 500,
5 | 'semibold': 600,
6 | 'bold': 700,
7 | }
8 |
9 | export default fontWeight
10 |
--------------------------------------------------------------------------------
/src/theme/index.js:
--------------------------------------------------------------------------------
1 | import colors from './colors'
2 | import fontWeight from './fontWeight'
3 | import breakpoints from './breakpoints'
4 | import fontFamily from './fontFamily'
5 |
6 | const theme = {
7 | breakpoints,
8 | colors,
9 | fontWeight,
10 | fontFamily,
11 | }
12 |
13 | export default theme
14 |
--------------------------------------------------------------------------------
/src/utils/colors.js:
--------------------------------------------------------------------------------
1 | const lightenDarkenColor = (color, value) => {
2 | const num = parseInt(color.slice(1), 16)
3 |
4 | let red = (num >> 16) + value
5 |
6 | if (red > 255) red = 255
7 | else if (red < 0) red = 0
8 |
9 | let blue = ((num >> 8) & 0x00ff) + value
10 |
11 | if (blue > 255) blue = 255
12 | else if (blue < 0) blue = 0
13 |
14 | let green = (num & 0x0000ff) + value
15 |
16 | if (green > 255) green = 255
17 | else if (green < 0) green = 0
18 |
19 | return `#${String(
20 | '000000' + (green | (blue << 8) | (red << 16)).toString(16)
21 | ).slice(-6)}`
22 | }
23 |
24 | export const whiten = (color, value) => lightenDarkenColor(color, value)
25 |
26 | export const darken = (color, value) => lightenDarkenColor(color, -value)
27 |
--------------------------------------------------------------------------------
/src/utils/formatStargazers.js:
--------------------------------------------------------------------------------
1 | const formatStargazers = count => (count ? `${(count / 1000).toFixed(1)}K` : '')
2 |
3 | export default formatStargazers
4 |
--------------------------------------------------------------------------------
/src/utils/get.js:
--------------------------------------------------------------------------------
1 | import theme from '../theme'
2 | import lodashGet from 'lodash.get'
3 |
4 | const get = value => {
5 | try {
6 | const res = lodashGet(theme, value)
7 | return res?.DEFAULT || res
8 | } catch (err) {
9 | return value
10 | }
11 | }
12 |
13 | export default get
14 |
--------------------------------------------------------------------------------
/src/utils/getCodeSamples.js:
--------------------------------------------------------------------------------
1 | import fetch from 'node-fetch'
2 | const yaml = require('js-yaml')
3 |
4 | const getCodeSamples = async sdkList => {
5 | const fetchPromises = sdkList.map(async sdk => {
6 | // eslint-disable-next-line no-unused-vars
7 | const { logo, ...sdkProps } = sdk
8 | try {
9 | const fetchedContent = await (
10 | await fetch(sdk.url, { method: 'GET' })
11 | ).text()
12 |
13 | const codeSample = yaml.load(fetchedContent)
14 | return {
15 | ...sdkProps,
16 | code: codeSample.landing_getting_started_1,
17 | }
18 | } catch (e) {
19 | console.log(e)
20 | }
21 | })
22 | return await Promise.all(fetchPromises)
23 | }
24 |
25 | export default getCodeSamples
26 |
--------------------------------------------------------------------------------
/src/utils/getColorName.js:
--------------------------------------------------------------------------------
1 | import theme from '../theme'
2 |
3 | const isObject = elem =>
4 | typeof elem === 'object' && !Array.isArray(elem) && elem !== null
5 |
6 | const getColorName = color => {
7 | try {
8 | const { colors } = theme
9 | const result = Object.keys(colors).map(key => [key, colors[key]])
10 |
11 | for (const [key, value] of Object.entries(result)) {
12 | if (value === color) return key
13 |
14 | if (isObject(value[1])) {
15 | // eslint-disable-next-line no-unused-vars
16 | for (const [_, subValue] of Object.entries(value[1])) {
17 | if (subValue === color) return value[0]
18 | }
19 | }
20 | }
21 | } catch (err) {
22 | console.log(err)
23 | }
24 | }
25 |
26 | export default getColorName
27 |
--------------------------------------------------------------------------------
/src/utils/hexToRgb.js:
--------------------------------------------------------------------------------
1 | const hexToRgb = (hex, alpha) => {
2 | const r = parseInt(hex.slice(1, 3), 16)
3 | const g = parseInt(hex.slice(3, 5), 16)
4 | const b = parseInt(hex.slice(5, 7), 16)
5 |
6 | return `rgba(${r}, ${g}, ${b}${alpha ? `, ${alpha}` : ''})`
7 | }
8 |
9 | export default hexToRgb
10 |
--------------------------------------------------------------------------------
/src/utils/isBreakpointSmaller.js:
--------------------------------------------------------------------------------
1 | const isBreakpointSmaller = (currentBreakpoint, comparedBreakpoint) => {
2 | const comparedBreakpointAsNumber = parseInt(
3 | comparedBreakpoint.replace(/px/g, '')
4 | )
5 | return currentBreakpoint < comparedBreakpointAsNumber
6 | }
7 |
8 | export default isBreakpointSmaller
9 |
--------------------------------------------------------------------------------
/src/utils/shuffleArray.js:
--------------------------------------------------------------------------------
1 | const shuffleArray = array => {
2 | let shuffledArray = [...array]
3 | for (let i = shuffledArray.length - 1; i > 0; i--) {
4 | const j = Math.floor(Math.random() * (i + 1))
5 | const temp = shuffledArray[i]
6 | shuffledArray[i] = shuffledArray[j]
7 | shuffledArray[j] = temp
8 | }
9 | return shuffledArray
10 | }
11 |
12 | export default shuffleArray
13 |
--------------------------------------------------------------------------------