diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index d6903d5c..00000000 --- a/.eslintrc +++ /dev/null @@ -1,119 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - // TODO: Enable type-aware linting (https://typescript-eslint.io/docs/linting/type-linting) - // "tsconfigRootDir": ".", - // "project": ["./packages/*/tsconfig.json"], - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - }, - "warnOnUnsupportedTypeScriptVersion": true - }, - "env": { - "browser": true, - "node": true - }, - "plugins": [ - "@typescript-eslint", - "import", - "simple-import-sort", - "react", - "jsx-a11y" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - // "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:eslint-comments/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "plugin:jsx-a11y/recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "plugin:react/jsx-runtime", - "prettier" - ], - "overrides": [ - { - "files": ["examples/**/*.tsx"], - "rules": { - "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off" - } - }, - { - // TODO: add https://github.com/francoismassart/eslint-plugin-tailwindcss - "files": ["./apps/website/"], - "extends": ["next", "next/core-web-vitals"] - // "settings": { - // "import/resolver": { - // "typescript": { - // "extensions": [".js", ".jsx", ".ts", ".tsx"], - // "project": ["tsconfig.json", "apps/website/tsconfig.json"] - // } - // } - // } - } - ], - "rules": { - "react/prop-types": 0, - // "@typescript-eslint/consistent-type-definitions": ["error", "interface"], - "@typescript-eslint/consistent-type-imports": "error", - // TODO: turn on this rul - "@typescript-eslint/no-non-null-assertion": "off", - // "@typescript-eslint/consistent-type-exports": "error", - "simple-import-sort/imports": [ - "error", - { - "groups": [ - // Side effect imports. - ["^\\u0000"], - // `react` related packages come first. - ["^react$", "^react-dom$"], - // Things that start with a letter (or digit or underscore), or `@` followed by a letter. - ["^@?\\w"], - // Absolute imports and other imports such as Vue-style `@/foo`. - // Anything not matched in another group. - ["^"], - // Relative imports. - // Anything that starts with a dot. - ["^\\."], - // type imports last as a separate group - ["^.+\\u0000$"] - ] - } - ], - "simple-import-sort/exports": "error", - "import/first": "error", - "import/newline-after-import": "error", - "import/no-duplicates": "error" - }, - "settings": { - "react": { - "version": "detect" - }, - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"], - "project": [ - "tsconfig.base.json", - "packages/*/tsconfig.json", - "apps/*/tsconfig.json" - ] - }, - "typescript": { - "alwaysTryTypes": true, - "project": [ - "tsconfig.base.json", - "packages/*/tsconfig.json", - "apps/*/tsconfig.json" - ] - } - }, - "import/ignore": ["react-native"] - } -} - -// appp/website; extend eslint-config-next diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2677bae..d9fd83f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,11 @@ on: pull_request: types: [opened, synchronize] +env: + NEXT_PUBLIC_GHOST_API_KEY: '' + INFURA_API_KEY: '' + TAMAGUI_TARGET: 'web' + jobs: build: name: Build and Test diff --git a/.vscode/settings.json b/.vscode/settings.json index 36c53bbc..a7375cd5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,11 @@ { "typescript.tsdk": "node_modules/typescript/lib", "eslint.packageManager": "yarn", - "npm.packageManager": "yarn" + "npm.packageManager": "yarn", + "eslint.workingDirectories": [ + { + "mode": "auto", + "#comment": "See https://github.com/microsoft/vscode-eslint/issues/1161 for reason (i.e. multiple .eslintrc config files)" + } + ] } diff --git a/apps/mobile/.eslintrc b/apps/mobile/.eslintrc new file mode 100644 index 00000000..bef97c7d --- /dev/null +++ b/apps/mobile/.eslintrc @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": ["@status-im/eslint-config"] +} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 54966df6..a8a7c5c7 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -38,6 +38,7 @@ "@types/react-native": "~0.70.6", "babel-plugin-module-resolver": "^4.1.0", "babel-plugin-transform-inline-environment-variables": "^0.4.4", + "@status-im/eslint-config": "*", "typescript": "^5.0.3" } } diff --git a/apps/web/.eslintrc b/apps/web/.eslintrc new file mode 100644 index 00000000..51442486 --- /dev/null +++ b/apps/web/.eslintrc @@ -0,0 +1,9 @@ +{ + "root": true, + "extends": [ + "@status-im/eslint-config", + "plugin:tailwindcss/recommended", + "next", + "next/core-web-vitals" + ] +} diff --git a/apps/web/package.json b/apps/web/package.json index dd2f98fa..a02f5923 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,6 +24,7 @@ "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", "@vitejs/plugin-react-swc": "^3.2.0", + "@status-im/eslint-config": "*", "typescript": "^5.0.3", "vite": "^4.2.1" } diff --git a/apps/website/.eslintrc b/apps/website/.eslintrc new file mode 100644 index 00000000..51442486 --- /dev/null +++ b/apps/website/.eslintrc @@ -0,0 +1,9 @@ +{ + "root": true, + "extends": [ + "@status-im/eslint-config", + "plugin:tailwindcss/recommended", + "next", + "next/core-web-vitals" + ] +} diff --git a/apps/website/.prettierrc b/apps/website/.prettierrc new file mode 100644 index 00000000..2ec5b2fc --- /dev/null +++ b/apps/website/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "tailwindConfig": "./tailwind.config.cjs" +} diff --git a/apps/website/env.d.ts b/apps/website/env.d.ts new file mode 100644 index 00000000..0bd9db58 --- /dev/null +++ b/apps/website/env.d.ts @@ -0,0 +1,12 @@ +import type { clientEnv } from './src/config/env.client.mjs' +import type { serverEnv } from './src/config/env.server.mjs' + +type Env = typeof clientEnv & typeof serverEnv + +declare global { + namespace NodeJS { + /* eslint-disable @typescript-eslint/no-empty-interface */ + interface ProcessEnv extends Env {} + /* eslint-enable @typescript-eslint/no-empty-interface */ + } +} diff --git a/apps/website/next.config.js b/apps/website/next.config.mjs similarity index 82% rename from apps/website/next.config.js rename to apps/website/next.config.mjs index aa85ba48..fe30adab 100644 --- a/apps/website/next.config.js +++ b/apps/website/next.config.mjs @@ -1,9 +1,13 @@ /* eslint-disable eslint-comments/disable-enable-pair */ -/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable import/default */ -/** @type {import('next').NextConfig} */ -const { withTamagui } = require('@tamagui/next-plugin') -const { join } = require('path') +import './src/config/env.server.mjs' +import './src/config/env.client.mjs' + +import tamagui_next_plugin from '@tamagui/next-plugin' +import { join } from 'node:path' + +const { withTamagui } = tamagui_next_plugin /** @type {import('next').NextConfig} */ let config = { @@ -26,6 +30,7 @@ let config = { experimental: { legacyBrowsers: false, // esmExternals: 'loose', + scrollRestoration: true, }, } @@ -59,7 +64,7 @@ const plugins = [ }), ] -module.exports = () => { +export default () => { for (const plugin of plugins) { config = { ...config, diff --git a/apps/website/package.json b/apps/website/package.json index 6c288006..4e7f873c 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -8,7 +8,7 @@ "start": "next start", "lint": "next lint", "typecheck": "tsc", - "clean": "rimraf .next .tamagui .vercel/output node_modules .turbo", + "clean": "rimraf .next .tamagui .turbo .vercel/output node_modules", "preview": "next start --port 8151" }, "dependencies": { @@ -21,9 +21,11 @@ "@status-im/icons": "*", "@status-im/js": "*", "@tamagui/next-theme": "1.11.1", + "@tanstack/react-query": "^4.29.7", "@vercel/og": "^0.5.4", - "class-variance-authority": "^0.6.0", + "@tryghost/content-api": "^1.11.13", "@visx/visx": "^2.18.0", + "class-variance-authority": "^0.6.0", "d3-array": "^3.2.3", "d3-time-format": "^4.1.0", "next": "13.2.4", @@ -31,22 +33,29 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-native-web": "^0.18.12", - "@tanstack/react-query": "^4.29.7", - "ts-pattern": "^4.3.0" + "ts-pattern": "^4.3.0", + "zod": "^3.21.4" }, "devDependencies": { "@achingbrain/ssdp": "^4.0.1", + "@tailwindcss/typography": "^0.5.9", "@tamagui/next-plugin": "1.11.1", "@types/d3-array": "^3.0.4", "@types/d3-time-format": "^4.0.0", "@types/node": "^18.11.11", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", + "@types/tryghost__content-api": "^1.3.11", "autoprefixer": "^10.4.14", + "@status-im/eslint-config": "*", "postcss": "^8.4.21", + "rehype-parse": "^8.0.4", + "rehype-react": "^7.2.0", + "rehype-stringify": "^9.0.3", "tailwindcss": "^3.3.1", "tailwindcss-animate": "^1.0.5", - "typescript": "^5.0.3" + "typescript": "^5.0.3", + "unified": "^10.1.2" }, "engines": { "node": "^18.x" diff --git a/apps/website/public/assets/favicon/blog.png b/apps/website/public/assets/favicon/blog.png new file mode 100644 index 00000000..2f8ffe74 Binary files /dev/null and b/apps/website/public/assets/favicon/blog.png differ diff --git a/apps/website/public/assets/favicon/default.png b/apps/website/public/assets/favicon/default.png new file mode 100644 index 00000000..2f8ffe74 Binary files /dev/null and b/apps/website/public/assets/favicon/default.png differ diff --git a/apps/website/public/assets/favicon/dev.png b/apps/website/public/assets/favicon/dev.png new file mode 100644 index 00000000..7e42a30d Binary files /dev/null and b/apps/website/public/assets/favicon/dev.png differ diff --git a/apps/website/public/assets/favicon/learn.png b/apps/website/public/assets/favicon/learn.png new file mode 100644 index 00000000..1ea7d020 Binary files /dev/null and b/apps/website/public/assets/favicon/learn.png differ diff --git a/apps/website/public/assets/wallet/1.png b/apps/website/public/assets/wallet/1.png new file mode 100644 index 00000000..153e84b6 Binary files /dev/null and b/apps/website/public/assets/wallet/1.png differ diff --git a/apps/website/public/assets/wallet/2.png b/apps/website/public/assets/wallet/2.png new file mode 100644 index 00000000..5f9ecf0c Binary files /dev/null and b/apps/website/public/assets/wallet/2.png differ diff --git a/apps/website/public/assets/wallet/3.png b/apps/website/public/assets/wallet/3.png new file mode 100644 index 00000000..5177ebb5 Binary files /dev/null and b/apps/website/public/assets/wallet/3.png differ diff --git a/apps/website/public/assets/wallet/4.png b/apps/website/public/assets/wallet/4.png new file mode 100644 index 00000000..86232d4f Binary files /dev/null and b/apps/website/public/assets/wallet/4.png differ diff --git a/apps/website/public/assets/wallet/5.png b/apps/website/public/assets/wallet/5.png new file mode 100644 index 00000000..bcaca385 Binary files /dev/null and b/apps/website/public/assets/wallet/5.png differ diff --git a/apps/website/public/assets/wallet/6.png b/apps/website/public/assets/wallet/6.png new file mode 100644 index 00000000..2e47bbb8 Binary files /dev/null and b/apps/website/public/assets/wallet/6.png differ diff --git a/apps/website/public/assets/wallet/7.png b/apps/website/public/assets/wallet/7.png new file mode 100644 index 00000000..98580675 Binary files /dev/null and b/apps/website/public/assets/wallet/7.png differ diff --git a/apps/website/public/assets/wallet/8.png b/apps/website/public/assets/wallet/8.png new file mode 100644 index 00000000..1d2a2f45 Binary files /dev/null and b/apps/website/public/assets/wallet/8.png differ diff --git a/apps/website/public/assets/wallet/arbitrum.png b/apps/website/public/assets/wallet/arbitrum.png new file mode 100644 index 00000000..a255d7bb Binary files /dev/null and b/apps/website/public/assets/wallet/arbitrum.png differ diff --git a/apps/website/public/assets/wallet/background-pattern.png b/apps/website/public/assets/wallet/background-pattern.png new file mode 100644 index 00000000..729e7cf5 Binary files /dev/null and b/apps/website/public/assets/wallet/background-pattern.png differ diff --git a/apps/website/public/assets/wallet/border.png b/apps/website/public/assets/wallet/border.png new file mode 100644 index 00000000..160458a3 Binary files /dev/null and b/apps/website/public/assets/wallet/border.png differ diff --git a/apps/website/public/assets/wallet/cube.png b/apps/website/public/assets/wallet/cube.png new file mode 100644 index 00000000..756afbdf Binary files /dev/null and b/apps/website/public/assets/wallet/cube.png differ diff --git a/apps/website/public/assets/wallet/duck.png b/apps/website/public/assets/wallet/duck.png new file mode 100644 index 00000000..5136af82 Binary files /dev/null and b/apps/website/public/assets/wallet/duck.png differ diff --git a/apps/website/public/assets/wallet/ethereum.png b/apps/website/public/assets/wallet/ethereum.png new file mode 100644 index 00000000..8c5703dd Binary files /dev/null and b/apps/website/public/assets/wallet/ethereum.png differ diff --git a/apps/website/public/assets/wallet/gentleman.png b/apps/website/public/assets/wallet/gentleman.png new file mode 100644 index 00000000..6ea5b3fc Binary files /dev/null and b/apps/website/public/assets/wallet/gentleman.png differ diff --git a/apps/website/public/assets/wallet/hands.png b/apps/website/public/assets/wallet/hands.png new file mode 100644 index 00000000..d1da4ba6 Binary files /dev/null and b/apps/website/public/assets/wallet/hands.png differ diff --git a/apps/website/public/assets/wallet/megaphone.png b/apps/website/public/assets/wallet/megaphone.png new file mode 100644 index 00000000..68e3af90 Binary files /dev/null and b/apps/website/public/assets/wallet/megaphone.png differ diff --git a/apps/website/public/assets/wallet/nft.png b/apps/website/public/assets/wallet/nft.png new file mode 100644 index 00000000..1f2247f9 Binary files /dev/null and b/apps/website/public/assets/wallet/nft.png differ diff --git a/apps/website/public/assets/wallet/optimism.png b/apps/website/public/assets/wallet/optimism.png new file mode 100644 index 00000000..ff2ae2d8 Binary files /dev/null and b/apps/website/public/assets/wallet/optimism.png differ diff --git a/apps/website/public/assets/wallet/pizza.png b/apps/website/public/assets/wallet/pizza.png new file mode 100644 index 00000000..3fc25108 Binary files /dev/null and b/apps/website/public/assets/wallet/pizza.png differ diff --git a/apps/website/public/assets/wallet/skull.png b/apps/website/public/assets/wallet/skull.png new file mode 100644 index 00000000..7df64018 Binary files /dev/null and b/apps/website/public/assets/wallet/skull.png differ diff --git a/apps/website/public/assets/wallet/texture.png b/apps/website/public/assets/wallet/texture.png new file mode 100644 index 00000000..26e70ff0 Binary files /dev/null and b/apps/website/public/assets/wallet/texture.png differ diff --git a/apps/website/public/assets/wallet/vegas.png b/apps/website/public/assets/wallet/vegas.png new file mode 100644 index 00000000..92fb9e11 Binary files /dev/null and b/apps/website/public/assets/wallet/vegas.png differ diff --git a/apps/website/public/assets/wallet/vitalik.mp4 b/apps/website/public/assets/wallet/vitalik.mp4 new file mode 100644 index 00000000..1b23224f Binary files /dev/null and b/apps/website/public/assets/wallet/vitalik.mp4 differ diff --git a/apps/website/public/assets/wallet/vitalik.webm b/apps/website/public/assets/wallet/vitalik.webm new file mode 100644 index 00000000..57100a12 Binary files /dev/null and b/apps/website/public/assets/wallet/vitalik.webm differ diff --git a/apps/website/public/favicon.ico b/apps/website/public/favicon.ico deleted file mode 100644 index e6bb1a61..00000000 Binary files a/apps/website/public/favicon.ico and /dev/null differ diff --git a/apps/website/public/images/social/facebook.svg b/apps/website/public/images/social/facebook.svg new file mode 100644 index 00000000..2a5125f9 --- /dev/null +++ b/apps/website/public/images/social/facebook.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/apps/website/public/images/social/reddit.svg b/apps/website/public/images/social/reddit.svg new file mode 100644 index 00000000..2d747800 --- /dev/null +++ b/apps/website/public/images/social/reddit.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/apps/website/public/images/social/status.svg b/apps/website/public/images/social/status.svg new file mode 100644 index 00000000..dcb755fb --- /dev/null +++ b/apps/website/public/images/social/status.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/website/public/images/social/twitter.svg b/apps/website/public/images/social/twitter.svg new file mode 100644 index 00000000..ef0369d1 --- /dev/null +++ b/apps/website/public/images/social/twitter.svg @@ -0,0 +1,12 @@ + + + diff --git a/apps/website/public/images/tags/community-20x20.png b/apps/website/public/images/tags/community-20x20.png new file mode 100644 index 00000000..2deefa8d Binary files /dev/null and b/apps/website/public/images/tags/community-20x20.png differ diff --git a/apps/website/public/images/tags/dapps-20x20.png b/apps/website/public/images/tags/dapps-20x20.png new file mode 100644 index 00000000..245b3cfa Binary files /dev/null and b/apps/website/public/images/tags/dapps-20x20.png differ diff --git a/apps/website/public/images/tags/developers-20x20.png b/apps/website/public/images/tags/developers-20x20.png new file mode 100644 index 00000000..216ba590 Binary files /dev/null and b/apps/website/public/images/tags/developers-20x20.png differ diff --git a/apps/website/public/images/tags/news-and-announcements-20x20.png b/apps/website/public/images/tags/news-and-announcements-20x20.png new file mode 100644 index 00000000..1d87e2a9 Binary files /dev/null and b/apps/website/public/images/tags/news-and-announcements-20x20.png differ diff --git a/apps/website/public/images/tags/privacy-security-20x20.png b/apps/website/public/images/tags/privacy-security-20x20.png new file mode 100644 index 00000000..ae1a70f3 Binary files /dev/null and b/apps/website/public/images/tags/privacy-security-20x20.png differ diff --git a/apps/website/public/images/tags/product-20x20.png b/apps/website/public/images/tags/product-20x20.png new file mode 100644 index 00000000..f59e74b6 Binary files /dev/null and b/apps/website/public/images/tags/product-20x20.png differ diff --git a/apps/website/src/components/cards/border.tsx b/apps/website/src/components/cards/border.tsx new file mode 100644 index 00000000..00fc49f4 --- /dev/null +++ b/apps/website/src/components/cards/border.tsx @@ -0,0 +1,17 @@ +export const Border = () => { + return ( + + + + ) +} diff --git a/apps/website/src/components/cards/grid-hero.tsx b/apps/website/src/components/cards/grid-hero.tsx new file mode 100644 index 00000000..2b3dda33 --- /dev/null +++ b/apps/website/src/components/cards/grid-hero.tsx @@ -0,0 +1,161 @@ +import { cva } from 'class-variance-authority' +import Image from 'next/image' + +import type { StaticImageData } from 'next/image' + +// Variants for the grid hero class names +const biggerCardClassNames = cva( + [ + 'min-w-[350px] rounded-[40px]', + 'px-[22px] py-6 sm:min-w-0 sm:px-[35px] sm:py-[48px] lg:px-5 xl:px-[34px] xl:py-[68px] 2xl:px-[73px]', + ], + { + variants: { + color: { + yellow: ['bg-customisation-yellow/10'], + turquoise: ['bg-customisation-turquoise/10'], + purple: ['bg-customisation-purple/10'], + }, + }, + } +) + +const imagesWithBorders = cva(['border-4', 'rounded-3xl'], { + variants: { + color: { + yellow: ['border-customisation-yellow/5'], + turquoise: ['border-customisation-turquoise/5'], + purple: ['border-customisation-purple/5'], + }, + }, +}) + +const imagesWithBordersTopOrBottom = cva(['border-4', 'rounded-3xl'], { + variants: { + color: { + yellow: ['border-customisation-yellow/5'], + turquoise: ['border-customisation-turquoise/5'], + purple: ['border-customisation-purple/5'], + }, + alignment: { + top: ['border-t-0'], + bottom: ['border-b-0'], + }, + }, +}) + +const thirdCardClassNames = cva( + [ + 'flex min-w-[calc(50%-10px)] rounded-[40px]', + 'px-[22px] sm:min-w-0 sm:px-[35px] lg:px-5 xl:px-[34px] 2xl:px-[73px]', + ], + { + variants: { + color: { + yellow: ['bg-customisation-yellow/10'], + turquoise: ['bg-customisation-turquoise/10'], + purple: ['bg-customisation-purple/10'], + }, + alignment: { + top: [ + 'pt-0', + 'pb-6 sm:pb-[48px] xl:pb-[68px]', + 'items-start', + 'justify-start', + ], + bottom: [ + 'pb-0', + 'pt-6 sm:pt-[48px] xl:pt-[68px]', + 'items-end', + 'justify-end', + ], + }, + }, + } +) + +const fourthCardClassNames = cva( + [ + 'flex min-w-[calc(50%-10px)] rounded-[40px]', + 'grow items-center justify-center px-0 sm:px-5 md:px-10 lg:px-5 2xl:px-10', + ], + { + variants: { + color: { + yellow: ['bg-customisation-yellow/10'], + turquoise: ['bg-customisation-turquoise/10'], + purple: ['bg-customisation-purple/10'], + }, + }, + } +) + +type Props = { + color: 'yellow' | 'turquoise' | 'purple' + cardOne: { + image: StaticImageData + alt: string + } + cardTwo: { + image: StaticImageData + alt: string + } + cardThree: { + image: StaticImageData + alt: string + alignment?: 'top' | 'bottom' + } + cardFour: { + image: StaticImageData + alt: string + } +} + +const GridHero = (props: Props) => { + const { color, cardOne, cardTwo, cardThree, cardFour } = props + + return ( +
+
+
+
+ {cardOne.alt} +
+
+ {cardTwo.alt} +
+
+
+
+ {cardThree.alt} +
+
+ {cardFour.alt} +
+
+
+
+ ) +} + +export { GridHero } diff --git a/apps/website/src/components/cards/index.ts b/apps/website/src/components/cards/index.ts new file mode 100644 index 00000000..e99e87f0 --- /dev/null +++ b/apps/website/src/components/cards/index.ts @@ -0,0 +1,2 @@ +export { GridHero } from './grid-hero' +export { Section } from './section' diff --git a/apps/website/src/components/cards/section.tsx b/apps/website/src/components/cards/section.tsx new file mode 100644 index 00000000..bad785f5 --- /dev/null +++ b/apps/website/src/components/cards/section.tsx @@ -0,0 +1,149 @@ +import { Text } from '@status-im/components' +import { PopupIcon } from '@status-im/icons' +import { cva } from 'class-variance-authority' +import Image from 'next/image' + +import { Border } from './border' + +import type { StaticImageData } from 'next/image' + +type Props = { + direction?: 'ltr' | 'rtl' + title: string + description: string + image: StaticImageData + imageAlt: string + imageSecondary: StaticImageData + imageSecondaryAlt: string + secondaryDescription: string + secondaryTitle: string + customNode?: React.ReactNode + color: 'yellow' | 'turquoise' | 'purple' + information?: string +} + +const containerClassNames = cva( + [ + 'relative flex w-full justify-center', + 'overflow-hidden', + 'max-h-[854px]', + 'max-w-[582px]', + 'rounded-[32px]', + 'py-[65px]', + ], + { + variants: { + color: { + yellow: ['bg-customisation-yellow/10'], + turquoise: ['bg-customisation-turquoise/10'], + purple: ['bg-customisation-purple/10'], + }, + }, + } +) + +const imageClassNames = cva( + ['rounded-3xl', 'border-4', 'h-auto max-h-[724px] w-auto'], + { + variants: { + color: { + yellow: ['border-customisation-yellow/5'], + turquoise: ['border-customisation-turquoise/5'], + purple: ['border-customisation-purple/5'], + }, + }, + } +) + +const borderContainerClassNames = cva( + ['absolute left-0 top-0', 'w-full', 'h-[100%]'], + { + variants: { + color: { + yellow: ['text-customisation-yellow/5'], + turquoise: ['text-customisation-turquoise/5'], + purple: ['text-customisation-purple/5'], + }, + }, + } +) + +const Section = (props: Props) => { + const { + title, + color, + description, + image, + imageAlt, + imageSecondary, + imageSecondaryAlt, + secondaryDescription, + secondaryTitle, + direction = 'ltr', + } = props + + const directionOrder = direction === 'ltr' ? 'order-0' : 'order-1' + + return ( +
+
+
+
+
+ +
+
+ {imageAlt} +
+
+
+
+ {imageSecondaryAlt} + +
+ + {title} + +
+ {description} +
+
+ +
+ + {secondaryTitle} + +
+ + {secondaryDescription} + {props.information && ( + + + + )} + +
+ + {props.customNode && ( +
{props.customNode}
+ )} +
+
+
+
+
+ ) +} + +export { Section } diff --git a/apps/website/src/components/coming-soon.tsx b/apps/website/src/components/coming-soon.tsx new file mode 100644 index 00000000..5cb13822 --- /dev/null +++ b/apps/website/src/components/coming-soon.tsx @@ -0,0 +1,12 @@ +export const ComingSoon = () => { + return ( + + + + ) +} diff --git a/apps/website/src/components/datepicker/datepicker.tsx b/apps/website/src/components/datepicker/datepicker.tsx new file mode 100644 index 00000000..fe89e51c --- /dev/null +++ b/apps/website/src/components/datepicker/datepicker.tsx @@ -0,0 +1,45 @@ +import { Calendar } from '@status-im/components/src/calendar/calendar' +import { Popover } from '@status-im/components/src/popover' +import { EditIcon } from '@status-im/icons' + +import { formatDate } from '../chart/utils/format-time' + +import type { DateRange } from '@status-im/components/src/calendar/calendar' + +type Props = { + selected?: DateRange + onSelect: (selected?: DateRange) => void +} + +const DatePicker = (props: Props) => { + const { selected, onSelect } = props + + return ( +
+ + + + + + +
+ ) +} + +export { DatePicker } diff --git a/apps/website/src/components/error-page.tsx b/apps/website/src/components/error-page.tsx index f2ca376f..dabec07a 100644 --- a/apps/website/src/components/error-page.tsx +++ b/apps/website/src/components/error-page.tsx @@ -13,7 +13,7 @@ export const ErrorPage = (props: Props) => { // todo!: design review, not in designs case ERROR_CODES.NOT_FOUND: return ( -
+
Page not found. @@ -24,7 +24,7 @@ export const ErrorPage = (props: Props) => { case ERROR_CODES.INTERNAL_SERVER_ERROR: default: return ( -
+
diff --git a/apps/website/src/components/footer/action-card.tsx b/apps/website/src/components/footer/action-card.tsx new file mode 100644 index 00000000..2d1c939a --- /dev/null +++ b/apps/website/src/components/footer/action-card.tsx @@ -0,0 +1,29 @@ +import { Button, Text } from '@status-im/components' + +type Props = { + title: string + description: string + action: string +} + +const ActionCard = (props: Props) => { + const { title, description, action } = props + + return ( +
+
+ + {title} + + + {description} + +
+ +
+ ) +} + +export { ActionCard } diff --git a/apps/website/src/components/footer/components/dot.tsx b/apps/website/src/components/footer/components/dot.tsx new file mode 100644 index 00000000..99da4e63 --- /dev/null +++ b/apps/website/src/components/footer/components/dot.tsx @@ -0,0 +1,13 @@ +export const Dot = () => ( + + + + + +) diff --git a/apps/website/src/components/footer/components/messari-icon.tsx b/apps/website/src/components/footer/components/messari-icon.tsx new file mode 100644 index 00000000..10d768ce --- /dev/null +++ b/apps/website/src/components/footer/components/messari-icon.tsx @@ -0,0 +1,31 @@ +export const MessariIcon = () => { + return ( + + + + + + + + + + + + + ) +} diff --git a/apps/website/src/components/footer/footer-mobile.tsx b/apps/website/src/components/footer/footer-mobile.tsx new file mode 100644 index 00000000..4619758c --- /dev/null +++ b/apps/website/src/components/footer/footer-mobile.tsx @@ -0,0 +1,77 @@ +import { Text } from '@status-im/components' + +import { SOCIALS } from '@/config/links' + +import { Logo } from '../logo' +import { AccordionMenu } from '../navigation/accordion-menu' +import { Dot } from './components/dot' +import { MessariIcon } from './components/messari-icon' + +type Props = { + hasBorderTop?: boolean +} + +export const FooterMobile = (props: Props) => { + const { hasBorderTop } = props + + return ( +
+
+
+
+ +
+
+ +
+
+ +
+
+ + © Status Research & Development GmbH + + +
+ + Terms of use + + + + Privacy policy + + + + Cookies + +
+
+
+
+ + + Messari Transparency Verified + +
+
+ {Object.values(SOCIALS).map(social => { + const IconComponent = social.icon + return ( + + ) + })} +
+
+
+
+
+ ) +} diff --git a/apps/website/src/components/footer/footer.tsx b/apps/website/src/components/footer/footer.tsx new file mode 100644 index 00000000..e71bce08 --- /dev/null +++ b/apps/website/src/components/footer/footer.tsx @@ -0,0 +1,94 @@ +import { Text } from '@status-im/components' +import { cva } from 'class-variance-authority' + +import { LINKS, SOCIALS } from '@/config/links' + +import { Logo } from '../logo' +import { Dot } from './components/dot' +import { MessariIcon } from './components/messari-icon' +import { Section } from './section' + +type Props = { + hasBorderTop?: boolean +} + +const section = cva( + [ + 'border-neutral-80', + 'mb-6', + 'flex', + 'items-start', + 'border-dashed', + 'pl-6', + 'pt-6', + ], + { + variants: { + hasBorderTop: { + true: ['border-t'], + false: ['border-t-0'], + }, + }, + } +) + +export const Footer = (props: Props) => { + const { hasBorderTop } = props + + return ( +
+
+
+ +
+ {Object.entries(LINKS).map(([title, links], index) => ( +
+ ))} +
+
+
+ + © Status Research & Development GmbH + + +
+ + Terms of use + + + Privacy policy + + + Cookies + +
+
+
+
+ + + Messari Transparency Verified + + +
+ {Object.values(SOCIALS).map(social => { + const IconComponent = social.icon + return ( + + ) + })} +
+
+
+ ) +} diff --git a/apps/website/src/components/footer/section.tsx b/apps/website/src/components/footer/section.tsx new file mode 100644 index 00000000..403aa38f --- /dev/null +++ b/apps/website/src/components/footer/section.tsx @@ -0,0 +1,79 @@ +import { Text } from '@status-im/components' +import { cva } from 'class-variance-authority' + +import { Link } from '../link' + +import type { Links } from '@/config/links' + +type Props = { + title: string + links: Links + hasBorderLeft?: boolean + hasBorderTop?: boolean +} + +const section = cva( + [ + 'border-neutral-80', + 'relative', + 'grid', + 'gap-3', + 'border-dashed', + 'px-5', + 'pb-6', + 'pt-6', + 'lg:border-l', + 'lg:pb-0', + ], + { + variants: { + hasBorderTop: { + true: ['border-t'], + false: ['border-t-0'], + }, + hasBorderLeft: { + true: ['border-l'], + false: ['border-l-0'], + }, + }, + } +) + +const Section = (props: Props) => { + const { title, links, hasBorderLeft, hasBorderTop } = props + + return ( +
+
+
+ + {title} + +
    + {links.map(link => ( +
  • + + + {link.name} + + +
  • + ))} +
+
+
+ ) +} + +export { Section } diff --git a/apps/website/src/components/head.tsx b/apps/website/src/components/head.tsx deleted file mode 100644 index 8bb42724..00000000 --- a/apps/website/src/components/head.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import Head from 'next/head' - -type Props = { - index?: boolean - children?: React.ReactElement - imageUrl?: string -} - -function _Head(props: Props) { - const { index = true, children, imageUrl } = props - return ( - - Status - - - - {/* todo: app stores banners/redirects */} - {/* todo: eval following meta tags */} - - - - - - - {imageUrl && } - - - - {/* */} - - - - - - - - - {/* todo?: except communities; ask product */} - {!index && } - {/* todo?: entity QR */} - {/* todo?: fallback OG */} - {children} - - ) -} - -export { _Head as Head } diff --git a/apps/website/src/components/link.tsx b/apps/website/src/components/link.tsx index 51701a61..d8dff052 100644 --- a/apps/website/src/components/link.tsx +++ b/apps/website/src/components/link.tsx @@ -1,8 +1,8 @@ import NextLink from 'next/link' -import type { ComponentProps } from 'react' +import type { ComponentPropsWithRef } from 'react' -export const Link = (props: ComponentProps) => { +export const Link = (props: ComponentPropsWithRef) => { const external = typeof props.href === 'string' ? props.href.startsWith('http') diff --git a/apps/website/src/components/logo.tsx b/apps/website/src/components/logo.tsx index 5dbb1b4c..ca9d307f 100644 --- a/apps/website/src/components/logo.tsx +++ b/apps/website/src/components/logo.tsx @@ -2,21 +2,23 @@ import Image from 'next/image' import { useRouter } from 'next/router' import { match, P } from 'ts-pattern' +import logoBlogSrc from '../../public/images/logo/blog.svg' import logoSrc from '../../public/images/logo/default.svg' import logoDevSrc from '../../public/images/logo/dev.svg' import logoLearnSrc from '../../public/images/logo/learn.svg' type Props = { label?: boolean + isTopbarDesktop?: boolean } export const Logo = (props: Props) => { - const { label = true } = props + const { label = true, isTopbarDesktop } = props const { pathname } = useRouter() return ( -
+
{match(pathname) .with( P.when(p => p.startsWith('/insights')), @@ -28,7 +30,7 @@ export const Logo = (props: Props) => { ) .with( P.when(p => p.startsWith('/blog')), - () => Status logo + () => Status logo ) .otherwise(() => ( Status logo @@ -39,7 +41,7 @@ export const Logo = (props: Props) => { width="70" height="16" fill="none" - className="mr-[10px]" + className={`mr-[10px] ${isTopbarDesktop ? 'hidden lg:block' : ''}`} > { + const [openLink, setOpenLink] = useState('') + + const handleToggle = (value: string) => { + setOpenLink(value === openLink ? '' : value) + } + + return ( +
+ {Object.entries(LINKS).map(([name, links]) => ( + + +
+ +
+ +
+ + {name} + +
+ +
+ {links.map((link, index) => { + const external = link.href.startsWith('http') + return ( +
+ + + {link.name} + + + {external && ( + + )} + +
+ ) + })} +
+
+
+
+
+ ))} +
+ ) +} + +export { AccordionMenu } diff --git a/apps/website/src/components/nav-menu.tsx b/apps/website/src/components/navigation/floating-desktop.tsx similarity index 67% rename from apps/website/src/components/nav-menu.tsx rename to apps/website/src/components/navigation/floating-desktop.tsx index 8053df8a..ba3a7aa0 100644 --- a/apps/website/src/components/nav-menu.tsx +++ b/apps/website/src/components/navigation/floating-desktop.tsx @@ -1,5 +1,3 @@ -import { useEffect, useRef, useState } from 'react' - import * as NavigationMenu from '@radix-ui/react-navigation-menu' import { Button, Text } from '@status-im/components' import { DownloadIcon, ExternalIcon } from '@status-im/icons' @@ -7,39 +5,22 @@ import { cx } from 'class-variance-authority' import { LINKS } from '@/config/links' -import { Link } from './link' -import { Logo } from './logo' +import { Link } from '../link' +import { Logo } from '../logo' -export const NavMenu = () => { - const [visible, setVisible] = useState(false) +type Props = { + visible: boolean +} - // Using ref to prevent re-running of useEffect - const visibleRef = useRef(visible) - visibleRef.current = visible - useEffect(() => { - const handleScroll = () => { - if (window.scrollY > 60) { - visibleRef.current === false && setVisible(true) - } else { - visibleRef.current === true && setVisible(false) - } - } - - handleScroll() - - window.addEventListener('scroll', handleScroll, { passive: true }) - return () => { - window.removeEventListener('scroll', handleScroll) - } - }, []) +const FloatingDesktop = (props: Props) => { + const { visible } = props return ( @@ -58,7 +39,7 @@ export const NavMenu = () => { className={cx([ 'grid gap-3 pb-12 pl-[60px] pt-6', 'data-[state=open]:animate-in', - 'data-[state=closed]:animate-out fade-out-20', + 'fade-out-20 data-[state=closed]:animate-out', ])} > {links.map(link => { @@ -91,10 +72,12 @@ export const NavMenu = () => { ) } + +export { FloatingDesktop } diff --git a/apps/website/src/components/navigation/floating-menu.tsx b/apps/website/src/components/navigation/floating-menu.tsx new file mode 100644 index 00000000..5fd4a8b4 --- /dev/null +++ b/apps/website/src/components/navigation/floating-menu.tsx @@ -0,0 +1,82 @@ +import { useRef, useState } from 'react' + +import { animated, useScroll } from '@react-spring/web' +import { cx } from 'class-variance-authority' + +import { useLockScroll } from '@/hooks/use-lock-scroll' +import { useOutsideClick } from '@/hooks/use-outside-click' + +import { FloatingDesktop } from './floating-desktop' +import { FloatingMobile } from './floating-mobile' + +const FloatingMenu = (): JSX.Element => { + const [visible, setVisible] = useState(false) + const [open, setOpen] = useState(false) + const openRef = useRef(open) + openRef.current = open + + // Using ref to prevent re-running of useEffect + const visibleRef = useRef(visible) + const scrollYRef = useRef(0) + visibleRef.current = visible + + // Close menu on outside click + const ref = useOutsideClick(() => setOpen(false)) + useLockScroll(open) + + useScroll({ + onChange: ({ value: { scrollYProgress } }) => { + const isMenuOpen = openRef.current + const isScrollingUp = scrollYProgress < scrollYRef.current + const detectionPoint = scrollYProgress > 0.005 + + if (detectionPoint && isScrollingUp) { + if (!visibleRef.current) { + setVisible(true) + } + } else { + if (!isMenuOpen) { + setVisible(false) + } + } + scrollYRef.current = scrollYProgress + }, + default: { + immediate: true, + }, + }) + + return ( + <> + + + + + + + + ) +} + +export { FloatingMenu } diff --git a/apps/website/src/components/navigation/floating-mobile.tsx b/apps/website/src/components/navigation/floating-mobile.tsx new file mode 100644 index 00000000..ac861943 --- /dev/null +++ b/apps/website/src/components/navigation/floating-mobile.tsx @@ -0,0 +1,61 @@ +import { Button, IconButton } from '@status-im/components' +import { CloseIcon, DownloadIcon, MenuIcon } from '@status-im/icons' + +import { Link } from '../link' +import { Logo } from '../logo' +import { AccordionMenu } from './accordion-menu' + +type Props = { + open: boolean + setOpen: (open: boolean) => void +} + +const FloatingMobile = (props: Props) => { + const { open, setOpen } = props + return ( +
+
+
+ + + +
+ + + ) : ( + + ) + } + onPress={() => setOpen(!open)} + /> +
+
+ +
+ +
+
+
+ ) +} + +export { FloatingMobile } diff --git a/apps/website/src/components/navigation/nav-desktop.tsx b/apps/website/src/components/navigation/nav-desktop.tsx new file mode 100644 index 00000000..6773dd85 --- /dev/null +++ b/apps/website/src/components/navigation/nav-desktop.tsx @@ -0,0 +1,88 @@ +import * as NavigationMenu from '@radix-ui/react-navigation-menu' +import { Button, Text } from '@status-im/components' +import { DownloadIcon, ExternalIcon } from '@status-im/icons' +import { cx } from 'class-variance-authority' + +import { Logo } from '@/components/logo' +import { LINKS } from '@/config/links' + +import { Link } from '../link' + +const NavDesktop = () => { + return ( + <> + +
+
+ + + +
+ +
+ + {Object.entries(LINKS).map(([name, links]) => ( + + + + {name} + + + + {links.map(link => { + const external = link.href.startsWith('http') + + return ( + + + + {link.name} + + {external && ( + + )} + + + ) + })} + + + ))} + +
+ +
+ +
+
+ +
+ + ) +} + +export { NavDesktop } diff --git a/apps/website/src/components/navigation/nav-mobile.tsx b/apps/website/src/components/navigation/nav-mobile.tsx new file mode 100644 index 00000000..69729319 --- /dev/null +++ b/apps/website/src/components/navigation/nav-mobile.tsx @@ -0,0 +1,67 @@ +import { useState } from 'react' + +import { Button, IconButton } from '@status-im/components' +import { CloseIcon, DownloadIcon, MenuIcon } from '@status-im/icons' + +import { Logo } from '@/components/logo' +import { useLockScroll } from '@/hooks/use-lock-scroll' + +import { Link } from '../link' +import { AccordionMenu } from './accordion-menu' + +const NavMobile = () => { + const [open, setOpen] = useState(false) + const screenHeight = typeof window !== 'undefined' ? window.innerHeight : 0 + + useLockScroll(open) + const handleToggle = () => { + setOpen(prevOpen => !prevOpen) + } + + return ( +
+
+
+ + + +
+ + + ) : ( + + ) + } + onPress={handleToggle} + /> +
+
+ +
+ +
+
+
+ ) +} + +export { NavMobile } diff --git a/apps/website/src/components/page-footer.tsx b/apps/website/src/components/page-footer.tsx deleted file mode 100644 index 7b8507f2..00000000 --- a/apps/website/src/components/page-footer.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { Button, Text } from '@status-im/components' -import Link from 'next/link' - -import { LINKS, SOCIALS } from '@/config/links' - -import { Logo } from './logo' - -import type { Links } from '@/config/links' - -export const PageFooter = () => { - return ( -
-
- -
-
- {Object.entries(LINKS).map(([title, links]) => ( -
- ))} - -
- - {"Let's connect"} - -
- {Object.values(SOCIALS).map(social => ( - - {social.name} - - ))} -
-
-
- -
- - -
- -
- - © Status Research & Development GmbH - - - - - - - - -
- - Terms of use - - - Privacy policy - - - Cookies - -
-
-
- ) -} - -type SectionProps = { - title: string - links: Links -} - -const Section = (props: SectionProps) => { - const { title, links } = props - - return ( -
-
- - {title} - -
    - {links.map(link => ( -
  • - - - {link.name} - - -
  • - ))} -
-
-
- ) -} - -type ActionCardProps = { - title: string - description: string - action: string -} - -const ActionCard = (props: ActionCardProps) => { - const { title, description, action } = props - - return ( -
-
- - {title} - - - {description} - -
- -
- ) -} diff --git a/apps/website/src/components/pre-footer.tsx b/apps/website/src/components/pre-footer.tsx new file mode 100644 index 00000000..9b132407 --- /dev/null +++ b/apps/website/src/components/pre-footer.tsx @@ -0,0 +1,48 @@ +import { Button, Text } from '@status-im/components' +import { DownloadIcon } from '@status-im/icons' +import Image from 'next/image' + +import logoSrc from '../../public/images/logo/default.svg' +import { ComingSoon } from './coming-soon' + +const Prefooter = () => { + return ( +
+
+
+ Status logo +

+ Be unstoppable +

+ + + Use the open source, decentralized crypto communication super app. + + +
+
+ +
+
+ + Betas for Mac, Windows, Linux
+ Alphas for iOS & Android +
+
+ +
+
+
+
+
+
+ ) +} + +export { Prefooter } diff --git a/apps/website/src/components/preview-page.tsx b/apps/website/src/components/preview-page.tsx index 2ca361d1..624734fb 100644 --- a/apps/website/src/components/preview-page.tsx +++ b/apps/website/src/components/preview-page.tsx @@ -21,9 +21,9 @@ import { QrCodeIcon, } from '@status-im/icons' import { useQuery } from '@tanstack/react-query' +import Head from 'next/head' import { useRouter } from 'next/router' -import { Head } from '@/components/head' import { ERROR_CODES } from '@/consts/error-codes' import { useURLData } from '@/hooks/use-url-data' import { getRequestClient } from '@/lib/request-client' @@ -80,6 +80,12 @@ export type Data = info: UserInfo } +const ACTION_VERB: Record = { + community: 'Join', + channel: 'View', + profile: 'Open', +} + const INSTRUCTIONS_HEADING: Record = { community: 'How to join this community:', channel: 'How to join this channel:', @@ -93,7 +99,7 @@ const JOIN_BUTTON_LABEL: Record = { } export function PreviewPage(props: PreviewPageProps) { - const { type, decodedData, encodedData } = props + const { type, decodedData, encodedData, index } = props const { asPath } = useRouter() @@ -109,8 +115,10 @@ export function PreviewPage(props: PreviewPageProps) { channelUuid: urlChannelUuid, data: urlData, errorCode: urlErrorCode, + isLoading: urlIsLoading, } = useURLData(type, decodedData, encodedData) + const wakuQueryIsEnabled = Boolean(publicKey) const { data: wakuData, isLoading, @@ -119,7 +127,7 @@ export function PreviewPage(props: PreviewPageProps) { } = useQuery({ refetchOnWindowFocus: false, queryKey: [type], - enabled: !!publicKey, + enabled: wakuQueryIsEnabled, queryFn: async function ({ queryKey }): Promise { const client = await getRequestClient() @@ -179,7 +187,20 @@ export function PreviewPage(props: PreviewPageProps) { }, }) - const loading = status === 'loading' || isLoading + const loading = getLoading() + + function getLoading(): boolean { + if (urlIsLoading) { + return true + } + + if (wakuQueryIsEnabled) { + return status === 'loading' || isLoading + } + + return false + } + const data: Data | undefined = wakuData ?? urlData const { avatarURL, bannerURL } = useMemo(() => { @@ -201,9 +222,34 @@ export function PreviewPage(props: PreviewPageProps) { return } + // const urlOrigin = process.env.VERCEL_URL + // ? 'https://' + process.env.VERCEL_URL + // : '' + if ((loading && !data) || !data || !publicKey) { return ( <> + + + {/* todo: test if server-rendered version with which a (social) card would be + generated would not effectively override actual shared link on clicking */} + {/* */} + + + {!index && } +
@@ -311,16 +357,39 @@ export function PreviewPage(props: PreviewPageProps) { return ( <> - + + + {`${ACTION_VERB[type]} ${data.info.displayName} in Status`} + + + + + {/* */} + + + {!index && } + <> {/* todo: theme; based on user system settings */} - {/* todo: (system or both?) install banner */}
-
-
+
+
{bannerURL && ( -
+

{INSTRUCTIONS_HEADING[type]}

@@ -460,7 +529,7 @@ export function PreviewPage(props: PreviewPageProps) {
-
+
Have Status already? diff --git a/apps/website/src/components/qr-dialog.tsx b/apps/website/src/components/qr-dialog.tsx index 4f16e77c..4a205ca1 100644 --- a/apps/website/src/components/qr-dialog.tsx +++ b/apps/website/src/components/qr-dialog.tsx @@ -26,8 +26,8 @@ export const QrDialog = (props: Props) => {
-
-
+
+
diff --git a/apps/website/src/components/side-bar/side-bar.tsx b/apps/website/src/components/side-bar/side-bar.tsx index 0cdad8f8..dfc8ec35 100644 --- a/apps/website/src/components/side-bar/side-bar.tsx +++ b/apps/website/src/components/side-bar/side-bar.tsx @@ -36,8 +36,8 @@ const SideBar = (props: Props) => { }, [defaultLabel]) return ( -
-