diff --git a/.storybook/main.ts b/.storybook/main.ts index e8fc806..b5053b3 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -8,7 +8,8 @@ const config: StorybookConfig = { "@storybook/addon-essentials", "@chromatic-com/storybook", "@storybook/addon-interactions", - "@storybook/addon-themes" + "@storybook/addon-themes", + "@storybook/addon-remix-react-router", ], framework: { name: "@storybook/react-vite", diff --git a/package-lock.json b/package-lock.json index ad9062d..f7a24ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@radix-ui/react-slot": "^1.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^3.6.0", "lucide-react": "^0.408.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -52,6 +53,7 @@ "plop": "^4.0.1", "postcss": "^8", "storybook": "^8.2.2", + "storybook-addon-remix-react-router": "^3.0.0", "tailwindcss": "^3.4.1", "typescript": "^5.2.2", "vite": "^5.3.1", @@ -145,9 +147,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.9.tgz", - "integrity": "sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { "@babel/types": "^7.24.9", @@ -2603,28 +2605,28 @@ "dev": true }, "node_modules/@inquirer/confirm": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.14.tgz", - "integrity": "sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.15.tgz", + "integrity": "sha512-CiLGi3JmKGEsia5kYJN62yG/njHydbYIkzSBril7tCaKbsnIqxa2h/QiON9NjfwiKck/2siosz4h7lVhLFocMQ==", "dev": true, "dependencies": { - "@inquirer/core": "^9.0.2", - "@inquirer/type": "^1.4.0" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0" }, "engines": { "node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.2.tgz", - "integrity": "sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.4.0", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.9", + "@types/node": "^20.14.11", "@types/wrap-ansi": "^3.0.0", "ansi-escapes": "^4.3.2", "cli-spinners": "^2.9.2", @@ -2652,18 +2654,18 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.4.tgz", + "integrity": "sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.4.0.tgz", - "integrity": "sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.0.tgz", + "integrity": "sha512-L/UdayX9Z1lLN+itoTKqJ/X4DX5DaWu2Sruwt4XgZzMNv32x4qllbzMX4MbJlz0yxAQtU19UvABGOjmdq1u3qA==", "dev": true, "dependencies": { "mute-stream": "^1.0.0" @@ -3073,9 +3075,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", - "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", + "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", "engines": { "node": ">=14.0.0" } @@ -3335,9 +3337,9 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.3.tgz", - "integrity": "sha512-7ntW+hK2f0EtEZ08BRYdaMDdeCJY5IyRbaXhclMzo4FK4W3vsRnSMu+t61K42+/3+bJC8z2bnjZPrh2b7gJ34w==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.4.tgz", + "integrity": "sha512-l1dlzWBBkR/5aullsX8N1ZbYr2bkeHPAaMCRy1jG5BBA8IHbi55JFwmJ8XF2gXkT2GyAZnePzb43RuLXz4KxFQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -3351,13 +3353,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.3.tgz", - "integrity": "sha512-u3HMoN42ILpaZN+YWwgQl7togczS8FBX+KkTyxBqeWIsiPgXPWANABcquWARNajtyW3XpjrWzJPEhWehMQl2+Q==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.4.tgz", + "integrity": "sha512-4oU25rFyr4OgMxHe4RpLJ7lxVwUDfdTi1j/YVyHfYv8koTqjagso8bv0uj0ujP5C3dSsVO0sp3/JOfPDkEUtrA==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -3369,13 +3371,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-controls": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.3.tgz", - "integrity": "sha512-rylp7QNPS+sUx20YXAROLx7HLF1xRtBmICYBpU7wKOOufmIAM55ol8PvpQQ97J1XE/mH95FWY8bIQ3fXAqnB1g==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.4.tgz", + "integrity": "sha512-e56aUYhxyR8zJJstRAUP3WILhWTcvgRf5bysTtiyjFAL7U47cuCr043+IYEsxLkXhuZTKX2pcYSrjBtT5bYkVA==", "dev": true, "dependencies": { "dequal": "^2.0.2", @@ -3387,21 +3389,21 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-docs": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.3.tgz", - "integrity": "sha512-5glPip8Oex9npUTfVkkO1WMmbwpwUbu+04Uk6Vr30g+p2svGHH2qlKhWIu4g+Jx6s2ogMV47oj9Zl8jrXjNyPA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.4.tgz", + "integrity": "sha512-oyrDw4nGfntu5Hkhr2Qt1wUOyLaVVERQekYyejyir92QhM10UeA7ZarPXNLfCTj7rbTrWmM1Waka9Tsf8TGMrw==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.2.3", - "@storybook/csf-plugin": "8.2.3", + "@storybook/blocks": "8.2.4", + "@storybook/csf-plugin": "8.2.4", "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "8.2.3", + "@storybook/react-dom-shim": "8.2.4", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "fs-extra": "^11.1.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", @@ -3415,24 +3417,24 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-essentials": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.3.tgz", - "integrity": "sha512-M+43RTtugiqKchs6xjzSO7ZRFzhr6U+xOKaW8tfAdzheTRnT3moXSIoJn6w5rEiqvUAWtpswigKRcsxhbtL2qw==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "8.2.3", - "@storybook/addon-backgrounds": "8.2.3", - "@storybook/addon-controls": "8.2.3", - "@storybook/addon-docs": "8.2.3", - "@storybook/addon-highlight": "8.2.3", - "@storybook/addon-measure": "8.2.3", - "@storybook/addon-outline": "8.2.3", - "@storybook/addon-toolbars": "8.2.3", - "@storybook/addon-viewport": "8.2.3", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.4.tgz", + "integrity": "sha512-4upNauDJAJxauxnoUpUvzDnLo18C2yTVxgg+Id9wrKpt9C+CYH2oXyXzxoYGucYWZEe7zgCO6rWrGrKEisiLPQ==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.2.4", + "@storybook/addon-backgrounds": "8.2.4", + "@storybook/addon-controls": "8.2.4", + "@storybook/addon-docs": "8.2.4", + "@storybook/addon-highlight": "8.2.4", + "@storybook/addon-measure": "8.2.4", + "@storybook/addon-outline": "8.2.4", + "@storybook/addon-toolbars": "8.2.4", + "@storybook/addon-viewport": "8.2.4", "ts-dedent": "^2.0.0" }, "funding": { @@ -3440,13 +3442,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.3.tgz", - "integrity": "sha512-uc2dlZv7OkM5DGeN1wR7aZ4hmH1n6B38dlFzVh0rx+kghtSyUcQsaFPKR36Ky6cHHXa1z93TvEXJKkA1KtM7oQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.4.tgz", + "integrity": "sha512-Ll/2y0m/q9ko9jFt40qsiee4fds6vpcwwxi3mPAVwRV/J7PpMzPkoLxM54bKpeHiWdTeGCXRguXNvyeQMQf3pg==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -3456,18 +3458,18 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-interactions": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.3.tgz", - "integrity": "sha512-cRoz959E4XkxDLE6CR9yAQTjV4CaCZqW/O2gPQnarqXDo2sac4zisi7npa5LhVDA4yuiPVCCt7bKGSD1Yd0/+g==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.4.tgz", + "integrity": "sha512-jGGTCKfqZzq3DSZF+cimD8FBcO8X9yu/cNTcxHtx6TN9McV69sTiSzOpGgbWkLjLjP0XU12NQGqFw38tIn7n9Q==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.2.3", - "@storybook/test": "8.2.3", + "@storybook/instrumenter": "8.2.4", + "@storybook/test": "8.2.4", "polished": "^4.2.2", "ts-dedent": "^2.2.0" }, @@ -3476,13 +3478,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-links": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.3.tgz", - "integrity": "sha512-PAVj0ArWpW0Mwva4UzKZs1AxaUMmMTKsF5PFzUJ2fpHTfXOAnST59twDRn11XyWlb4QS+Ek0ok3k/scvOYbAyg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.4.tgz", + "integrity": "sha512-1FgD6YXdXXSEDrp2aO4LxYt/X7LnBYx7cLlFla+xbn1CZLGqWLLeOT+BFd29wxpzs3u1Tap9r1iz1vRYL5ziyg==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -3495,7 +3497,7 @@ }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.3" + "storybook": "^8.2.4" }, "peerDependenciesMeta": { "react": { @@ -3504,9 +3506,9 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.3.tgz", - "integrity": "sha512-IgvGUTLQfTCUBv8k+lRk6Wq550W/g+N1vDUHLw1iAfvvqTf5ZQYG54tDa2ad0wPj+yDIJrL0GwKVXsFnb5o1PA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.4.tgz", + "integrity": "sha512-bSyE3mGDaaIKoe6Kt/f20YXKsn8WSoJUHrfKA68gbb+H3tegVQaqeS2KY5YzLqvjHe1qSmrO132NJt8RixLOPQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -3517,13 +3519,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-onboarding": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.2.3.tgz", - "integrity": "sha512-ubbbBP5FPuGfrOhr9KiVp2FhKiiqsG/9kFhAsiZqgy+iPKaRqAn4B7dfDm+5h4rLu0wQighu+kZVFjz6WXaI9A==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.2.4.tgz", + "integrity": "sha512-guFRNPoNpLTR6hReGClUZasyMstGR2XmM4fjKg1iVvodw0nI/sZE/8eG2J2pWUGnp5YzFYirLuIZ03QO7edEMg==", "dev": true, "dependencies": { "react-confetti": "^6.1.0" @@ -3533,13 +3535,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-outline": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.3.tgz", - "integrity": "sha512-AOIxOLxq0I8gp9du8K5w+5ohNwShcTBNxKnwdKel+iOP+mjB0ygVV4cfVa/Z3q1IqW/fMiA+YtRElLkxZaWRoQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.4.tgz", + "integrity": "sha512-1C6NrvSDREgCZ7o/1n7Ca81uDDzrSrzWiOkh4OeA7PPQ/445cAOX2OMvxzNkKDIT9GLCLNi9M5XIVyGxJVS4dQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -3550,13 +3552,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-themes": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.2.3.tgz", - "integrity": "sha512-0Be9zEvhAGCEt0+z+XL09EkclHhrKCNX1GbKO40HiFlJTzWDDBJb6wyY8V4dFq4eU/144zQOdC9DHlXS7WSMRw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.2.4.tgz", + "integrity": "sha512-IPOu3dOnJdQbebCNSgXSa8KW5dalHPJU6wdqsAtwaWH4xtJ+nGdNzRWroVkbC6Q1pyjaELgAywS1aMqqukJLDQ==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -3566,26 +3568,26 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.3.tgz", - "integrity": "sha512-kRnisYanm+ylch06paBgaIfkaTHeeORra64acGULefDuCpexM9eSakP9lupCNBYS1Q/PaURnoih3IcrWjFhQGQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.4.tgz", + "integrity": "sha512-iPnSr+hdz40Uoqg2cimyWf01/Y8GdgdMKB+b47TGIxtn9SEFBXck00ZG8ttwBvEsecu9K9CDt20fIOnr6oK5tQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.3.tgz", - "integrity": "sha512-JqR0GNfHC/vq2hsi1UwXI/LHT07BouT2Z6/b+FjKoGZIEs/XiV1Mn58FS6dCAwzgF96TWipDo5J6mJF99BjZQQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.4.tgz", + "integrity": "sha512-58DcoX0xGpWlJfc0iLDjggkVPYzT4JdCZA2ioK9SQXQMsUzGFwR5PAAJv1tivYp7467tNkXvcM3QTb3Q3g8p4g==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -3595,13 +3597,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/blocks": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.3.tgz", - "integrity": "sha512-izbyT+6bV2/0dApRh97kJZWEwXKTMIU6zmvI8bD4Ii/cWtd2c8KchKM4s00t11kaCg5yuaqGL60MRs/YT/QHQw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.4.tgz", + "integrity": "sha512-Hl2Dpg41YiJLSVXxjEJPjgPShrDJM3RY6HEEOjqTcAADsheX1IHAWXMJSJGMmne3Sew6VdJXPuHBIOFV4suZxg==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -3626,7 +3628,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.3" + "storybook": "^8.2.4" }, "peerDependenciesMeta": { "react": { @@ -3638,12 +3640,12 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.3.tgz", - "integrity": "sha512-EGjs3bjvRCmXofC8etbXbhAb+7ahG3c4kmo/wxCeTZPEbPy4WNn4SSoZyxpNDv3OIYGdWQ+SJsjaNCqqPVy1DA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.4.tgz", + "integrity": "sha512-hDx0ZLcnFrIJaVoFMu41d9w1uWmwy/DDUuIbSd0T7xHwWyVqgI8lmaQlBIp81/QmSKaUB964UduHcdIjkoWoYA==", "dev": true, "dependencies": { - "@storybook/csf-plugin": "8.2.3", + "@storybook/csf-plugin": "8.2.4", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^1.5.0", @@ -3659,7 +3661,7 @@ }, "peerDependencies": { "@preact/preset-vite": "*", - "storybook": "^8.2.3", + "storybook": "^8.2.4", "typescript": ">= 4.3.x", "vite": "^4.0.0 || ^5.0.0", "vite-plugin-glimmerx": "*" @@ -3676,16 +3678,30 @@ } } }, + "node_modules/@storybook/channels": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.2.4.tgz", + "integrity": "sha512-xGEP3395DviKQQmwT2j6D6su2e4CSc9qRyNRuP8wXQi4Inl7TyIPUGI2QwmGjNplkGhVkxeYisYzNzvNfU8O8w==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" + } + }, "node_modules/@storybook/codemod": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.3.tgz", - "integrity": "sha512-mAc22OJthMr1oaGVKRbO05sveTUhcWhdgN4nQKf7wLfXjW73mMgrblao+mxiWIfhXIjbOB5xgw3Csi9pcy6Kkw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.4.tgz", + "integrity": "sha512-QcZdqjX4NvkVcWR3yI9it3PfqmBOCR+3iY6j4PmG7p5IE0j9kXMKBbeFrBRprSijHKlwcjbc3bRx2SnKF6AFEg==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/preset-env": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/core": "8.2.3", + "@storybook/core": "8.2.4", "@storybook/csf": "0.1.11", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", @@ -3745,10 +3761,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@storybook/components": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.4.tgz", + "integrity": "sha512-JLT1RoR/RXX+ZTeFoY85CRHb9Zz3l0PRRUSetEjoIJdnBGeL5C38bs0s9QnYjpCDLUlhdYhTln+GzmbyH8ocpA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" + } + }, "node_modules/@storybook/core": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.3.tgz", - "integrity": "sha512-6CV6P8ES7E+vQZEuJTdLhgC3Lo7iRy+tpc/3przT25EStzNTR3TW2X31KUn7BfY2fuxCFPzftPaSJ/LEi7zHqg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.4.tgz", + "integrity": "sha512-jePmsGZT2hhUNQs8ED6+hFVt2m4hrMseO8kkN7Mcsve1MIujzHUS7Gjo4uguBwHJJOtiXB2fw4OSiQCmsXscZA==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -3768,10 +3797,24 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/core-events": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.2.4.tgz", + "integrity": "sha512-HpvD/namc7aywpbA2DWJ3m7VQu97sJz5Z7dVO/9qCYNLS/UOz3EFXbDhBTbYtNYZ5eATCX65dGiWNeZJeUzfpw==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" + } + }, "node_modules/@storybook/core/node_modules/@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "version": "18.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.41.tgz", + "integrity": "sha512-LX84pRJ+evD2e2nrgYCHObGWkiQJ1mL+meAgbvnwk/US6vmMY7S2ygBTGV2Jw91s9vUsLSXeDEkUHZIJGLrhsg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -3787,9 +3830,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.3.tgz", - "integrity": "sha512-j6w9hD/Ze4utK4Hg5ILKsgGkN4QwYaCo67vKsyUB78Y1v7WiWQIM6UsuOVwXGL1SpAtF5NDtu/92/jAJ094zqw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.4.tgz", + "integrity": "sha512-7V2tmeyAwv4/AQiBpB+7fCpphnY1yhcz+Zv9esUOHKqFn5+7u9FKpEXFFcf6fcbqXr2KoNw2F1EnTv3K/SxXrg==", "dev": true, "dependencies": { "unplugin": "^1.3.1" @@ -3799,7 +3842,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/global": { @@ -3822,9 +3865,9 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.3.tgz", - "integrity": "sha512-LXG4Qvq2CMpoFr1OwstvfPZ/UwAQeT3mdqiW478QQ00RcYUUSfftts6D33+zZFG3LrZr+yy8eTZ/sov/rVAWZA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.4.tgz", + "integrity": "sha512-szcRjg7XhtobDW4omexWqBRlmRyrKW9p8uF9k6hanJqhHl4iG9D8xbi3SdaRhcn5KN1Wqv6RDAB+kXzHlFfdKA==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -3836,17 +3879,47 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" + } + }, + "node_modules/@storybook/manager-api": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.4.tgz", + "integrity": "sha512-ayiOtcGupSeLCi2doEsRpALNPo4MBWYruc+e3jjkeVJQIg9A1ipSogNQh8unuOmq9rezO4/vcNBd6MxLs3xLWg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" + } + }, + "node_modules/@storybook/preview-api": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.4.tgz", + "integrity": "sha512-IxOiUYYzNnk1OOz3zQBhsa3P1fsgqeMBZcH7TjiQWs9osuWG20oqsFR6+Z3dxoW8IuQHvpnREGKvAbRsDsThcA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" } }, "node_modules/@storybook/react": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.2.3.tgz", - "integrity": "sha512-818F6pJWFBiwG0r6DiUVrV+qndwbIso2gtgJoituBgIJO2eIzNmkPNSsckbaR7u+FpE4dWiIIhmDVZSnRwvDlA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.2.4.tgz", + "integrity": "sha512-tRkEeFhwq2GeRsPwFc8dINI5L4mXanXaa7/JreB6ZcUeOZD8d81TWXCH9QyGvxfe0LW+DeNujA91mx5Yja35Zw==", "dev": true, "dependencies": { + "@storybook/components": "^8.2.4", "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "8.2.3", + "@storybook/manager-api": "^8.2.4", + "@storybook/preview-api": "^8.2.4", + "@storybook/react-dom-shim": "8.2.4", + "@storybook/theming": "^8.2.4", "@types/escodegen": "^0.0.6", "@types/estree": "^0.0.51", "@types/node": "^18.0.0", @@ -3873,7 +3946,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.3", + "storybook": "^8.2.4", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { @@ -3883,9 +3956,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.3.tgz", - "integrity": "sha512-N8AsM6N1S867GGWt2J2q5oY5ryqxohh3y1HqNtjg+wXf5+RkTD6M2Cgqe6p+JHz81nDKyvvVzP60MvvDhY5VOA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.4.tgz", + "integrity": "sha512-p2ypPWuKKFY/ij7yYjvdnrOcfdpxnAJd9D4/2Hm2eVioE4y8HQSND54t9OfkW+498Ez7ph4zW9ez005XqzH/+w==", "dev": true, "funding": { "type": "opencollective", @@ -3894,19 +3967,19 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/react-vite": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.2.3.tgz", - "integrity": "sha512-a7HKCu/rd7GyzG1sr0W13gaOC1kEzJfGxI+Nb8RrH5+yRH5atYEsiBD80hdJNbOGdgp4LInBHZKiq0xE8VJ8xQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.2.4.tgz", + "integrity": "sha512-4nDZC4uJKV6YCVzT/es0abQnd28CuU3cN4nyzxaBbI/XtCvYzkT7KLEo8csaS+1o1uEb8lY3ZLZ2a3jYlVPNJA==", "dev": true, "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.1", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.2.3", - "@storybook/react": "8.2.3", + "@storybook/builder-vite": "8.2.4", + "@storybook/react": "8.2.4", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -3923,23 +3996,23 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.3", + "storybook": "^8.2.4", "vite": "^4.0.0 || ^5.0.0" } }, "node_modules/@storybook/react/node_modules/@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "version": "18.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.41.tgz", + "integrity": "sha512-LX84pRJ+evD2e2nrgYCHObGWkiQJ1mL+meAgbvnwk/US6vmMY7S2ygBTGV2Jw91s9vUsLSXeDEkUHZIJGLrhsg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@storybook/react/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3949,13 +4022,13 @@ } }, "node_modules/@storybook/test": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.3.tgz", - "integrity": "sha512-vDvDNZzqupf+p5RHOzFaBEYjp2dBnUeXO8cjtwK7nkOJUmrnP2g+aYfCYIJXsnK+iOjOhrGVGZiqR/gW8R669w==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.4.tgz", + "integrity": "sha512-boFjNFja4BNSbQhvmMlTVdQmZh36iM9+8w0sb7IK2e9Xnoi4+utupPNwBLvSsw4bRayK8+mP4Vk46O8h3TaiMw==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", - "@storybook/instrumenter": "8.2.3", + "@storybook/instrumenter": "8.2.4", "@testing-library/dom": "10.1.0", "@testing-library/jest-dom": "6.4.5", "@testing-library/user-event": "14.5.2", @@ -3968,7 +4041,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.3" + "storybook": "^8.2.4" } }, "node_modules/@storybook/test/node_modules/@testing-library/dom": { @@ -4106,10 +4179,23 @@ "node": ">=8" } }, + "node_modules/@storybook/theming": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.4.tgz", + "integrity": "sha512-B4HQMzTeg1TgV9uPDIoDkMSnP839Y05I9+Tw60cilAD+jTqrCvMlccHfehsTzJk+gioAflunATcbU05TMZoeIQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.4" + } + }, "node_modules/@swc/core": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz", - "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.0.tgz", + "integrity": "sha512-d4vMzH6ICllDwlPuhset2h8gu/USHdbyfJim+2hQEdxC0UONtfpmu38XBgNqRjStrji1Q5M10jfeUZL3cu1i8g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -4124,16 +4210,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.6.13", - "@swc/core-darwin-x64": "1.6.13", - "@swc/core-linux-arm-gnueabihf": "1.6.13", - "@swc/core-linux-arm64-gnu": "1.6.13", - "@swc/core-linux-arm64-musl": "1.6.13", - "@swc/core-linux-x64-gnu": "1.6.13", - "@swc/core-linux-x64-musl": "1.6.13", - "@swc/core-win32-arm64-msvc": "1.6.13", - "@swc/core-win32-ia32-msvc": "1.6.13", - "@swc/core-win32-x64-msvc": "1.6.13" + "@swc/core-darwin-arm64": "1.7.0", + "@swc/core-darwin-x64": "1.7.0", + "@swc/core-linux-arm-gnueabihf": "1.7.0", + "@swc/core-linux-arm64-gnu": "1.7.0", + "@swc/core-linux-arm64-musl": "1.7.0", + "@swc/core-linux-x64-gnu": "1.7.0", + "@swc/core-linux-x64-musl": "1.7.0", + "@swc/core-win32-arm64-msvc": "1.7.0", + "@swc/core-win32-ia32-msvc": "1.7.0", + "@swc/core-win32-x64-msvc": "1.7.0" }, "peerDependencies": { "@swc/helpers": "*" @@ -4145,9 +4231,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz", - "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-2ylhM7f0HwUwLrFYZAe/dse8PCbPsYcJS3Dt7Q8NT3PUn7vy6QOMxNcOPPuDrnmaXqQQO3oxdmRapguTxaat9g==", "cpu": [ "arm64" ], @@ -4161,9 +4247,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz", - "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.0.tgz", + "integrity": "sha512-SgVnN4gT1Rb9YfTkp4FCUITqSs7Yj0uB2SUciu5CV3HuGvS5YXCUzh+KrwpLFtx8NIgivISKcNnb41mJi98X8Q==", "cpu": [ "x64" ], @@ -4177,9 +4263,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz", - "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.0.tgz", + "integrity": "sha512-+Z9Dayart1iKJQEJJ9N/KS4z5EdXJE3WPFikY0jonKTo4Dd8RuyVz5yLvqcIMeVdz/SwximATaL6iJXw7hZS9A==", "cpu": [ "arm" ], @@ -4193,9 +4279,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz", - "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.0.tgz", + "integrity": "sha512-UnLrCiZ1EI4shznJn0xP6DLgsXUSwtfsdgHhGYCrvbgVBBve3S9iFgVFEB3SPl7Q/TdowNbrN4zHU0oChfiNfw==", "cpu": [ "arm64" ], @@ -4209,9 +4295,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz", - "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-H724UANA+ptsfwKRr9mnaDa9cb5fw0oFysiGKTgb3DMYcgk3Od0jMTnXVPFSVpo7FlmyxeC9K8ueUPBOoOK6XA==", "cpu": [ "arm64" ], @@ -4225,9 +4311,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz", - "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.0.tgz", + "integrity": "sha512-SY3HA0K0Dpqt1HIfMLGpwL4hd4UaL2xHP5oZXPlRQPhUDZrbb4PbI3ZJnh66c63eL4ZR8EJ+HRFI0Alx5p69Zw==", "cpu": [ "x64" ], @@ -4241,9 +4327,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz", - "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-cEJ2ebtV1v/5Ilb55E05J6F5SrHKQWzUttIhR5Mkayyo+yvPslcpByuFC3D+J7X1ebziTOBpWuMpUdjLfh3SMQ==", "cpu": [ "x64" ], @@ -4257,9 +4343,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz", - "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.0.tgz", + "integrity": "sha512-ecQOOmzEssz+m0pR4xDYCGuvn3E/l0nQ3tk5jp1NA1lsAy4bMV0YbYCHjptYvWL/UjhIerIp3IlCJ8x5DodSog==", "cpu": [ "arm64" ], @@ -4273,9 +4359,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz", - "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.0.tgz", + "integrity": "sha512-gz81seZkRn3zMnVOc7L5k6F4vQC82gIxmHiL+GedK+A37XI/X26AASU3zxvORnqQbwQYXQ+AEVckxBmFlz3v2g==", "cpu": [ "ia32" ], @@ -4289,9 +4375,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz", - "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.0.tgz", + "integrity": "sha512-b5Fd1xEOw9uqBpj2lqsaR4Iq9UhiL84hNDcEsi6DQA7Y1l85waQAslTbS0E4/pJ1PISAs0jW0zIGLco1eaWBOg==", "cpu": [ "x64" ], @@ -4728,9 +4814,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz", - "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true }, "node_modules/@types/mdx": { @@ -4761,9 +4847,9 @@ } }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5019,9 +5105,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6299,6 +6385,12 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6479,6 +6571,15 @@ "node": ">=18" } }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -6751,9 +6852,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.828", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz", - "integrity": "sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw==", + "version": "1.4.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", + "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", "dev": true }, "node_modules/emoji-regex": { @@ -7142,9 +7243,9 @@ } }, "node_modules/eslint-plugin-storybook/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7743,9 +7844,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.239.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.239.1.tgz", - "integrity": "sha512-topOrETNxJ6T2gAnQiWqAlzGPj8uI2wtmNOlDIMNB+qyvGJZ6R++STbUOTAYmvPhOMz2gXnXPH0hOvURYmrBow==", + "version": "0.241.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.241.0.tgz", + "integrity": "sha512-82yKXpz7iWknWFsognZUf5a6mBQLnVrYoYSU9Nbu7FTOpKlu3v9ehpiI9mYXuaIO3J0ojX1b83M/InXvld9HUw==", "dev": true, "engines": { "node": ">=0.4.0" @@ -8780,9 +8881,9 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dependencies": { "hasown": "^2.0.2" }, @@ -9734,9 +9835,9 @@ "dev": true }, "node_modules/msw": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.1.tgz", - "integrity": "sha512-ocgvBCLn/5l3jpl1lssIb3cniuACJLoOfZu01e3n5dbJrpA5PeeWn28jCLgQDNt6d7QT8tF2fYRzm9JoEHtiig==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.2.tgz", + "integrity": "sha512-vDn6d6a50vxPE+HnaKQfpmZ4SVXlOjF97yD5FJcUT3v2/uZ65qvTYNL25yOmnrfCNWZ4wtAS7EbtXxygMug2Tw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -9835,9 +9936,9 @@ } }, "node_modules/msw/node_modules/type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.22.1.tgz", + "integrity": "sha512-9tHNEa0Ov81YOopiVkcCJVz5TM6AEQ+CHHjFIktqPnE3NV0AHIkx+gh9tiCl58m/66wWxkOC9eltpa75J4lQPA==", "dev": true, "engines": { "node": ">=16" @@ -10017,9 +10118,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/normalize-path": { @@ -11232,6 +11333,15 @@ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true }, + "node_modules/react-inspector": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz", + "integrity": "sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==", + "dev": true, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -11264,11 +11374,11 @@ } }, "node_modules/react-router": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.1.tgz", - "integrity": "sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==", + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", + "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", "dependencies": { - "@remix-run/router": "1.17.1" + "@remix-run/router": "1.18.0" }, "engines": { "node": ">=14.0.0" @@ -11278,12 +11388,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.1.tgz", - "integrity": "sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==", + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", + "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", "dependencies": { - "@remix-run/router": "1.17.1", - "react-router": "6.24.1" + "@remix-run/router": "1.18.0", + "react-router": "6.25.1" }, "engines": { "node": ">=14.0.0" @@ -12004,15 +12114,15 @@ } }, "node_modules/storybook": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.3.tgz", - "integrity": "sha512-uGjoFasTDWaeLp+pz8jCdKfSOvBTNEBpGf2C+pwZkJpd5CHrUlq4dkfE0/Kv/MtyQI1W9Fgbinbj7ggNe0D3Cg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.4.tgz", + "integrity": "sha512-ASavW8vIHiWpFY+4M6ngeqK5oL4OkxqdpmQYxvRqH0gA1G1hfq/vmDw4YC4GnqKwyWPQh2kaV5JFurKZVaeaDQ==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/codemod": "8.2.3", - "@storybook/core": "8.2.3", + "@storybook/codemod": "8.2.4", + "@storybook/core": "8.2.4", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -12048,6 +12158,36 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/storybook-addon-remix-react-router": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/storybook-addon-remix-react-router/-/storybook-addon-remix-react-router-3.0.0.tgz", + "integrity": "sha512-0D7VDVf6uX6vgegpCb3v1/TIADxRWomycyj0ZNuVjrCO6w6FwfZ9CHlCK7k9v6CB2uqKjPiaBwmT7odHyy1qYA==", + "dev": true, + "dependencies": { + "compare-versions": "^6.0.0", + "react-inspector": "6.0.2" + }, + "peerDependencies": { + "@storybook/blocks": "^8.0.0", + "@storybook/channels": "^8.0.0", + "@storybook/components": "^8.0.0", + "@storybook/core-events": "^8.0.0", + "@storybook/manager-api": "^8.0.0", + "@storybook/preview-api": "^8.0.0", + "@storybook/theming": "^8.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-router-dom": "^6.4.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/storybook/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12206,9 +12346,9 @@ } }, "node_modules/storybook/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12500,9 +12640,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.5.tgz", - "integrity": "sha512-DlTxttYcogpDfx3tf/8jfnma1nfAYi2cBUYV2YNoPPecwmO3YGiFlOX9D8tGAu+EDF38ryBzvrDKU/BLMsUwbw==", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", + "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -12954,15 +13094,15 @@ } }, "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "dev": true }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", + "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", "dev": true, "optional": true, "bin": { @@ -13276,9 +13416,9 @@ } }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", diff --git a/package.json b/package.json index b148019..42da1b2 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,13 @@ "@radix-ui/react-slot": "^1.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^3.6.0", "lucide-react": "^0.408.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-query": "^3.39.3", "react-router": "^6.24.1", "react-router-dom": "^6.24.1", - "react-query": "^3.39.3", "tailwind-merge": "^2.4.0", "tailwindcss-animate": "^1.0.7" }, @@ -63,6 +64,7 @@ "plop": "^4.0.1", "postcss": "^8", "storybook": "^8.2.2", + "storybook-addon-remix-react-router": "^3.0.0", "tailwindcss": "^3.4.1", "typescript": "^5.2.2", "vite": "^5.3.1", diff --git a/src/components/ProfileCard/ProfileCard.tsx b/src/components/ProfileCard/ProfileCard.tsx index cf8c3a3..7b5aa96 100644 --- a/src/components/ProfileCard/ProfileCard.tsx +++ b/src/components/ProfileCard/ProfileCard.tsx @@ -7,7 +7,7 @@ export const ProfileCard = ({ name, role, imageUrl, imageFallback }: ProfileCard return (
- + {imageFallback}
diff --git a/src/components/ReturnButton/ReturnButton.stories.tsx b/src/components/ReturnButton/ReturnButton.stories.tsx new file mode 100644 index 0000000..420e257 --- /dev/null +++ b/src/components/ReturnButton/ReturnButton.stories.tsx @@ -0,0 +1,20 @@ +import { Meta } from '@storybook/react'; +import { reactRouterParameters, withRouter } from 'storybook-addon-remix-react-router'; +import { ReturnButton } from './ReturnButton'; + +export default { + title: 'Components/ReturnButton', + component: ReturnButton, + decorators: [withRouter] +} as Meta; + +export const Default = { + parameters: { + reactRouter: reactRouterParameters({ + routing: { + path: '/', + handle: 'Home Page', + } + }) + } +} \ No newline at end of file diff --git a/src/components/ReturnButton/ReturnButton.test.tsx b/src/components/ReturnButton/ReturnButton.test.tsx new file mode 100644 index 0000000..b746869 --- /dev/null +++ b/src/components/ReturnButton/ReturnButton.test.tsx @@ -0,0 +1,13 @@ +import { render } from '@testing-library/react'; +import { BrowserRouter } from 'react-router-dom'; +import ReturnButton from './ReturnButton'; + +test('renders ReturnButton', () => { + const { getByRole } = render( + + + + ); + const linkElement = getByRole('link'); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/components/ReturnButton/ReturnButton.tsx b/src/components/ReturnButton/ReturnButton.tsx new file mode 100644 index 0000000..23c8286 --- /dev/null +++ b/src/components/ReturnButton/ReturnButton.tsx @@ -0,0 +1,15 @@ +// src/components/ReturnButton/ReturnButton.tsx +import { Link } from 'react-router-dom'; +import { ChevronLeft } from 'lucide-react'; + +export const ReturnButton = () => { + return ( + <> + + + + + ); +} + +export default ReturnButton; \ No newline at end of file diff --git a/src/components/ReturnButton/index.ts b/src/components/ReturnButton/index.ts new file mode 100644 index 0000000..df3814f --- /dev/null +++ b/src/components/ReturnButton/index.ts @@ -0,0 +1,3 @@ +import { ReturnButton } from "./ReturnButton" + +export { ReturnButton } \ No newline at end of file diff --git a/src/hooks/useSavedTalks.test.tsx b/src/hooks/useSavedTalks.test.tsx new file mode 100644 index 0000000..6c2542a --- /dev/null +++ b/src/hooks/useSavedTalks.test.tsx @@ -0,0 +1,29 @@ +import { renderHook, act } from "@testing-library/react"; +import { useSavedTalks } from "./useSavedTalks"; + +describe("useSavedTalks", () => { + beforeEach(() => { + localStorage.clear(); + }); + + it("should retrieve saved talks from local storage", () => { + localStorage.setItem("savedTalks", JSON.stringify([1, 2, 3])); + const { result } = renderHook(() => useSavedTalks()); + expect(result.current.savedCardIds).toEqual([1, 2, 3]); + }); + + it("should save a new talk when toggleSaveCard is called", () => { + const { result } = renderHook(() => useSavedTalks()); + act(() => { result.current.toggleSaveCard(1) }); + expect(result.current.savedCardIds).toEqual([1]); + expect(JSON.parse(localStorage.getItem("savedTalks")!)).toEqual([1]); + }); + + it("should remove a saved talk when toggleSaveCard is called", () => { + localStorage.setItem("savedTalks", JSON.stringify([1])); + const { result } = renderHook(() => useSavedTalks()); + act(() => { result.current.toggleSaveCard(1) }); + expect(result.current.savedCardIds).toEqual([]); + expect(JSON.parse(localStorage.getItem("savedTalks")!)).toEqual([]); + }); +}); diff --git a/src/hooks/useSavedTalks.ts b/src/hooks/useSavedTalks.ts new file mode 100644 index 0000000..14a0295 --- /dev/null +++ b/src/hooks/useSavedTalks.ts @@ -0,0 +1,25 @@ +import { useState, useEffect, useCallback } from 'react'; + +const LOCAL_STORAGE_KEY = 'savedTalks'; + +export const useSavedTalks = () => { + const [savedCardIds, setSavedCardIds] = useState([]); + + useEffect(() => { + const storedIds = localStorage.getItem(LOCAL_STORAGE_KEY); + if (storedIds) { + setSavedCardIds(JSON.parse(storedIds)); + } + }, []); + + const toggleSaveCard = useCallback((cardId: number) => { + setSavedCardIds((prevIds) => { + const isSaved = prevIds.includes(cardId); + const newIds = isSaved ? prevIds.filter((id) => id !== cardId) : [...prevIds, cardId]; + localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newIds)); + return newIds; + }); + }, []); + + return { savedCardIds, toggleSaveCard }; +}; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 84e482a..b076dba 100644 --- a/src/index.css +++ b/src/index.css @@ -69,3 +69,9 @@ } } + + +.self-start { + align-self: self-start; +} + main diff --git a/src/pages/LivePage/LivePage.stories.tsx b/src/pages/LivePage/LivePage.stories.tsx new file mode 100644 index 0000000..096f7c9 --- /dev/null +++ b/src/pages/LivePage/LivePage.stories.tsx @@ -0,0 +1,28 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { LivePage } from "."; +import { QueryClient, QueryClientProvider } from "react-query"; +import { BrowserRouter } from "react-router-dom"; +import { Story } from "@storybook/blocks"; + +export type Story = StoryObj; + +const queryClient = new QueryClient(); + +const meta: Meta = { + title: "Pages/Live Page", + tags: ["autodocs"], + component: LivePage, + decorators: [ + (Story) => ( + + + + + + ), + ], +}; + +export default meta; + +export const Default: Story = {}; diff --git a/src/pages/LivePage/LivePage.test.tsx b/src/pages/LivePage/LivePage.test.tsx new file mode 100644 index 0000000..c320002 --- /dev/null +++ b/src/pages/LivePage/LivePage.test.tsx @@ -0,0 +1,17 @@ +import { render } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { BrowserRouter } from 'react-router-dom'; +import { LivePage } from './LivePage'; + +test('renders LivePage', () => { + const queryClient = new QueryClient(); + const { getByText } = render( + + + + + + ); + const element = getByText(/Acontecendo agora:/i); + expect(element).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/src/pages/LivePage/LivePage.tsx b/src/pages/LivePage/LivePage.tsx new file mode 100644 index 0000000..9dd9711 --- /dev/null +++ b/src/pages/LivePage/LivePage.tsx @@ -0,0 +1,89 @@ +import { Header } from "@/components/Header"; +import { ReturnButton } from "@/components/ReturnButton"; +import { SpeakerSection } from "@/components/SpeakerSection"; +import { Separator } from "@/components/ui/separator"; +import { useAgenda } from "@/hooks/useAgenda"; +import { useSavedTalks } from "@/hooks/useSavedTalks"; +import { getLiveTalk, getNextTalk } from "./utils/talks"; + +export const LivePage = () => { + const { data } = useAgenda(); + const { savedCardIds, toggleSaveCard } = useSavedTalks(); + const now = new Date(); + + const liveFrontendTalk = getLiveTalk(data?.Frontend || [], now); + const liveConvidadosTalk = getLiveTalk(data?.Convida || [], now); + const liveComunidadesTalk = getLiveTalk(data?.Comunidades || [], now); + + const nextFrontendTalk = getNextTalk(data?.Frontend || [], now); + const nextComunidadesTalk = getNextTalk(data?.Comunidades || [], now); + const nextConvidadosTalk = getNextTalk(data?.Convida || [], now); + + return ( +
+ +
+

+ Acontecendo agora: +

+ {liveFrontendTalk || liveConvidadosTalk || liveComunidadesTalk ? ( + <> + + + + + ) : ( +

+ Se avexe não, já já tem mais! 🙂 🥳 +

+ )} + +
+

+ Próximas Talks +

+ {nextFrontendTalk || nextConvidadosTalk || nextComunidadesTalk ? ( + <> + + + + + ) : ( +

+ Fique ligado, as próximas talks estão chegando! +

+ )} +
+
+ ); +}; diff --git a/src/pages/LivePage/index.tsx b/src/pages/LivePage/index.tsx new file mode 100644 index 0000000..45f5f88 --- /dev/null +++ b/src/pages/LivePage/index.tsx @@ -0,0 +1,3 @@ +import { LivePage } from "./LivePage"; + +export { LivePage }; diff --git a/src/pages/LivePage/utils/talks.ts b/src/pages/LivePage/utils/talks.ts new file mode 100644 index 0000000..17e58b2 --- /dev/null +++ b/src/pages/LivePage/utils/talks.ts @@ -0,0 +1,23 @@ +import { Palestra } from "@/api/types"; +import { format, isAfter, isBefore } from "date-fns"; + +export const getLiveTalk = (talks: Palestra[], now: Date) => { + return talks.find((talk) => { + const startTime = new Date(`${format(now, "yyyy-MM-dd")}T${talk.hour}`); + const endTime = new Date(startTime.getTime() + 60 * 20 * 1000); + return isAfter(now, startTime) && isBefore(now, endTime); + }); +}; + +export const getNextTalk = (talks: Palestra[], now: Date) => { + const sortedTalks = [...talks].sort( + (a, b) => + new Date(`${format(now, "yyyy-MM-dd")}T${a.hour}`).getTime() - + new Date(`${format(now, "yyyy-MM-dd")}T${b.hour}`).getTime() + ); + + return sortedTalks.find((talk) => { + const startTime = new Date(`${format(now, "yyyy-MM-dd")}T${talk.hour}`); + return isAfter(startTime, now); + }); +}; diff --git a/src/routes/index.tsx b/src/routes/index.tsx index c2a5e2f..9a404d4 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,5 +1,6 @@ -import { HomePage } from "@/pages/HomePage"; +import { HomePage } from "@/pages/HomePage"; +import { LivePage } from "@/pages/LivePage"; import { Routes, Route } from "react-router-dom"; export const AppRoutes = () => { @@ -7,7 +8,7 @@ export const AppRoutes = () => { } /> Minha Agenda} /> - Live Talks} /> + } /> 404} /> );