diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..78b08f7bb --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +**/*.storybook.ts +**/*.storybook.tsx +*.d.ts diff --git a/.refresh_icon_story.sh b/.refresh_icon_story.sh new file mode 100755 index 000000000..a0a2cdfa0 --- /dev/null +++ b/.refresh_icon_story.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# This script is used to refresh the icon storybook + +# Get storybook code + + +# Go to the src directory +cd src + +# Remove the old storybook +rm -rf ./stories/icons && mkdir ./stories/icons + +# Get icons list +icons=$(awk 'BEGIN{ORS="\n"} {print $5}' ./icons/index.ts) + +for icon in $icons +do + echo "Creating story for $icon" + # Create a new story for the icon + echo "import type { Meta, StoryObj } from '@storybook/react' + import { $icon } from '@/icons' + + const meta: Meta = { + component: $icon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {}" > "./stories/icons/$icon.stories.tsx" +done + +# Get sub directories +sub_dirs=$(cd ./icons &&ls -dF */ | tr -d '/') + +echo "Sub directories: $sub_dirs" + +for sub_dir in $sub_dirs +do + # Make a new directory for the sub directory + mkdir ./stories/icons/$sub_dir + + # Get icons list + icons=$(awk 'BEGIN{ORS="\n"} {print $5}' ./icons/$sub_dir/index.ts) + + for icon in $icons + do + echo "Creating story for $icon" + # Create a new story for the icon + echo "import type { Meta, StoryObj } from '@storybook/react' + import { $icon } from '@/icons/$sub_dir' + + const meta: Meta = { + component: $icon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {}" > "./stories/icons/$sub_dir/$icon.stories.tsx" + done +done diff --git a/.storybook/main.ts b/.storybook/main.ts index 1154e014f..c2fe75ebb 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,3 +1,4 @@ +import path from 'path' import type { StorybookConfig } from '@storybook/nextjs' const config: StorybookConfig = { @@ -7,7 +8,8 @@ const config: StorybookConfig = { '@storybook/addon-essentials', '@storybook/addon-onboarding', '@storybook/addon-interactions', - '@storybook/addon-mdx-gfm' + '@storybook/addon-themes', + '@storybook/themes', ], framework: { name: '@storybook/nextjs', @@ -16,5 +18,33 @@ const config: StorybookConfig = { docs: { autodocs: 'tag', }, + typescript: { + reactDocgen: 'react-docgen-typescript', + reactDocgenTypescriptOptions: { + // Speeds up Storybook build time + compilerOptions: { + allowSyntheticDefaultImports: false, + esModuleInterop: false, + }, + // Makes union prop types like variant and size appear as select controls + shouldExtractLiteralValuesFromEnum: true, + // Makes string and boolean types that can be undefined appear as inputs and switches + shouldRemoveUndefinedFromOptional: true, + // Filter out third-party props from node_modules except @mui packages + propFilter: (prop) => + prop.parent + ? !/node_modules\/(?!@mui)/.test(prop.parent.fileName) + : true, + }, + }, + webpackFinal: async (config) => { + if (config.resolve) { + config.resolve.alias = { + ...config.resolve.alias, + '@': path.resolve(__dirname, '../src'), + } + } + return config + }, } export default config diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 8196bc5be..46db44206 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,5 +1,22 @@ import type { Preview } from '@storybook/react' +import { ThemeProvider, CssBaseline } from '@mui/material' +import { withThemeFromJSXProvider } from '@storybook/addon-themes' + +/* TODO: update import for your custom Material UI themes */ +import { lightTheme, darkTheme } from '../src/constant/ColorTheme' + +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + expanded: true, // Adds the description and default columns + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +} + const preview: Preview = { parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, @@ -10,6 +27,19 @@ const preview: Preview = { }, }, }, + + decorators: [ + withThemeFromJSXProvider({ + GlobalStyles: CssBaseline, + Provider: ThemeProvider, + themes: { + // Provide your custom themes here + light: lightTheme, + dark: darkTheme, + }, + defaultTheme: 'light', + }), + ], } export default preview diff --git a/next.config.js b/next.config.js index 982706e77..fa6a2eb06 100644 --- a/next.config.js +++ b/next.config.js @@ -5,8 +5,8 @@ const withPWA = require('@ducanh2912/next-pwa').default({ dest: 'public', register: true, skipWaiting: true, - disable: prod ? false : true, // 나중에 true로 바꿔야함 - // disable: true, + // disable: prod ? false : true, // 나중에 true로 바꿔야함 + disable: false, // runtimeCaching, }) diff --git a/package-lock.json b/package-lock.json index b2a035be1..f4e949993 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@mui/x-date-pickers": "^6.19.2", "@next/eslint-plugin-next": "^13.4.19", "@toast-ui/editor": "^3.2.2", + "@types/gtag.js": "^0.0.19", "@types/lodash": "^4.14.199", "@types/node": "20.5.3", "@types/react": "18.2.21", @@ -68,8 +69,9 @@ "@storybook/addon-links": "^7.6.13", "@storybook/addon-mdx-gfm": "^7.6.15", "@storybook/addon-onboarding": "^1.0.11", + "@storybook/addon-themes": "^7.6.17", "@storybook/blocks": "^7.6.13", - "@storybook/nextjs": "^7.6.13", + "@storybook/nextjs": "^7.6.17", "@storybook/react": "^7.6.13", "@storybook/test": "^7.6.13", "@svgr/webpack": "^8.1.0", @@ -6491,6 +6493,19 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/addon-themes": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-7.6.17.tgz", + "integrity": "sha512-i/dI3GKlJmQv0Di9HM3fKJvFIab55kvva0vXCGBkqSw3wYoZuq++npkWeDnjjZUvggV12H2RTdGqYwMCXB/GHg==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, "node_modules/@storybook/addon-toolbars": { "version": "7.6.15", "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.15.tgz", @@ -6722,20 +6737,20 @@ } }, "node_modules/@storybook/builder-webpack5": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.15.tgz", - "integrity": "sha512-HF+TSK/eU2ld8uQ8VWgcAIzOQ2hjnEkzup363vGZkYUfsHsVbjMpZgf+foDjI4LZNfQ/RjcVEZxqJqIbpM0Sjg==", + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.17.tgz", + "integrity": "sha512-GMaBd8/RzivuAmWrYSt9Rga3j8WLcu5LCMYiPVs+XKXsKAC8lTkV0WRWh8Nk6wTmfzsRQ2acwFjSG5oE4ClZKA==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", - "@storybook/channels": "7.6.15", - "@storybook/client-logger": "7.6.15", - "@storybook/core-common": "7.6.15", - "@storybook/core-events": "7.6.15", - "@storybook/core-webpack": "7.6.15", - "@storybook/node-logger": "7.6.15", - "@storybook/preview": "7.6.15", - "@storybook/preview-api": "7.6.15", + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/core-webpack": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preview": "7.6.17", + "@storybook/preview-api": "7.6.17", "@swc/core": "^1.3.82", "@types/node": "^18.0.0", "@types/semver": "^7.3.4", @@ -6776,15 +6791,188 @@ } } }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@storybook/builder-webpack5/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -6799,6 +6987,28 @@ "node": ">=14.14" } }, + "node_modules/@storybook/builder-webpack5/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@storybook/builder-webpack5/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -6811,10 +7021,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/@storybook/builder-webpack5/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@storybook/builder-webpack5/node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -6823,6 +7045,78 @@ "node": ">=12" } }, + "node_modules/@storybook/builder-webpack5/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@storybook/builder-webpack5/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -7281,26 +7575,112 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.15.tgz", - "integrity": "sha512-jwWol+zo+ItKBzPm9i80bEL6seHMsV0wKSaViVMQ4TqHtEbNeFE8sFEc2NTr18VNBnQOdlQPnEWmdboXBUrGcA==", + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.17.tgz", + "integrity": "sha512-LuDbADK+DPNAOOCXOlvY09hdGVueXlDetsdOJ/DgYnSa9QSWv9Uv+F8QcEgR3QckZJbPlztKJIVLgP2n/Xkijw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.15", - "@storybook/preview-api": "7.6.15" + "@storybook/client-logger": "7.6.17", + "@storybook/preview-api": "7.6.17" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-common": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.15.tgz", - "integrity": "sha512-VGmcLJ5U1r1s8/YnLbKcyB4GnNL+/sZIPqwlcSKzDXO76HoVFv1kywf7PbASote7P3gdhLSxBdg95LH2bdIbmw==", + "node_modules/@storybook/core-client/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, "dependencies": { - "@storybook/core-events": "7.6.15", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-client/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-client/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-client/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-client/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-common": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.15.tgz", + "integrity": "sha512-VGmcLJ5U1r1s8/YnLbKcyB4GnNL+/sZIPqwlcSKzDXO76HoVFv1kywf7PbASote7P3gdhLSxBdg95LH2bdIbmw==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.15", "@storybook/node-logger": "7.6.15", "@storybook/types": "7.6.15", "@types/find-cache-dir": "^3.2.1", @@ -7676,14 +8056,14 @@ } }, "node_modules/@storybook/core-webpack": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.15.tgz", - "integrity": "sha512-6Qk/kc7OKcy4jNowQFz6TFLWM2NYeLoJ73dIbFnN2o8DYS5WwmQLZhZ+MRvr92M+w1nlnc268kaqooYmAj8Mnw==", + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.17.tgz", + "integrity": "sha512-PyGrFhRM8sTONGwwLWLqBQ1HO+LBnVZ+5TOQO7ejQfdV2FWyNOzjBXm2e5jL/C6XlqiEhmL5pyHEyDBaQJQ3KA==", "dev": true, "dependencies": { - "@storybook/core-common": "7.6.15", - "@storybook/node-logger": "7.6.15", - "@storybook/types": "7.6.15", + "@storybook/core-common": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", "@types/node": "^18.0.0", "ts-dedent": "^2.0.0" }, @@ -7692,52 +8072,78 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-webpack/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", - "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, "dependencies": { - "type-fest": "^2.19.0" + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-plugin": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.15.tgz", - "integrity": "sha512-5Pm2B8XKNdG3fHyItWKbWnXHSRDFSvetlML+sMWGWYIjwOsnvPqt+gAvLksWhv/uJgDujGxNcPEh+/Y5C8ZAjQ==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.6.15", - "unplugin": "^1.3.1" + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.15.tgz", - "integrity": "sha512-8iKgg2cmbFTpVhRRJOqouhPcEh0c8ywabG4S8ICZvnJooSXUI9mD9p3tYCS7MYuSiHj0epa1Kkn9DtXJRo9o6g==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", "dev": true, "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.15", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", "ts-dedent": "^2.0.0" }, "funding": { @@ -7745,19 +8151,84 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-webpack/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", "dev": true, "dependencies": { - "tslib": "^2.0.1" + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-webpack/node_modules/@types/node": { + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/core-webpack/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@storybook/csf-tools/node_modules/fs-extra": { + "node_modules/@storybook/core-webpack/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-webpack/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-webpack/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", @@ -7771,7 +8242,29 @@ "node": ">=14.14" } }, - "node_modules/@storybook/csf-tools/node_modules/jsonfile": { + "node_modules/@storybook/core-webpack/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/core-webpack/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -7783,39 +8276,214 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@storybook/csf-tools/node_modules/recast": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", - "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "node_modules/@storybook/core-webpack/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "assert": "^2.0.0", - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/@storybook/csf-tools/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@storybook/core-webpack/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/csf-tools/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/@storybook/core-webpack/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 10.0.0" - } + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-webpack/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-webpack/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-webpack/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-webpack/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-webpack/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/csf": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", + "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", + "dev": true, + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.15.tgz", + "integrity": "sha512-5Pm2B8XKNdG3fHyItWKbWnXHSRDFSvetlML+sMWGWYIjwOsnvPqt+gAvLksWhv/uJgDujGxNcPEh+/Y5C8ZAjQ==", + "dev": true, + "dependencies": { + "@storybook/csf-tools": "7.6.15", + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.15.tgz", + "integrity": "sha512-8iKgg2cmbFTpVhRRJOqouhPcEh0c8ywabG4S8ICZvnJooSXUI9mD9p3tYCS7MYuSiHj0epa1Kkn9DtXJRo9o6g==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.2", + "@storybook/types": "7.6.15", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@storybook/csf-tools/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/csf-tools/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/csf-tools/node_modules/recast": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@storybook/csf-tools/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/csf-tools/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, "node_modules/@storybook/csf/node_modules/type-fest": { "version": "2.19.0", @@ -7922,9 +8590,9 @@ "dev": true }, "node_modules/@storybook/nextjs": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.6.15.tgz", - "integrity": "sha512-TeZctQvtkuuaabqurwAuBMs8LIVrdazXTTmjsjHNkv/0JV3ORqKk91gf2phfXiOeXQMCyhSYqx6Hl1aRJE3hfQ==", + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.6.17.tgz", + "integrity": "sha512-bD9x6HzH/fxiFnghOQfDM60tNUNxFNVVCZi6OvTRxVVz/5xdqbVnYVOuaJeUSLuUnGs7ALYfx8+2OTJQ9NrwRA==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", @@ -7940,14 +8608,14 @@ "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.2", "@babel/runtime": "^7.23.2", - "@storybook/addon-actions": "7.6.15", - "@storybook/builder-webpack5": "7.6.15", - "@storybook/core-common": "7.6.15", - "@storybook/core-events": "7.6.15", - "@storybook/node-logger": "7.6.15", - "@storybook/preset-react-webpack": "7.6.15", - "@storybook/preview-api": "7.6.15", - "@storybook/react": "7.6.15", + "@storybook/addon-actions": "7.6.17", + "@storybook/builder-webpack5": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preset-react-webpack": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/react": "7.6.17", "@types/node": "^18.0.0", "@types/semver": "^7.3.4", "css-loader": "^6.7.3", @@ -7995,130 +8663,156 @@ } } }, - "node_modules/@storybook/nextjs/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@storybook/nextjs/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/nextjs/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@storybook/nextjs/node_modules/@storybook/addon-actions": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.17.tgz", + "integrity": "sha512-TBphs4v6LRfyTpFo/WINF0TkMaE3rrNog7wW5mbz6n0j8o53kDN4o9ZEcygSL5zQX43CAaghQTeDCss7ueG7ZQ==", "dev": true, "dependencies": { - "universalify": "^2.0.0" + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "node_modules/@storybook/nextjs/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/nextjs/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@storybook/node-logger": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.15.tgz", - "integrity": "sha512-C+sCvRjR+5uVU3VTrfyv7/RlPBxesAjIucUAK0keGyIZ7sFQYCPdkm4m/C4s+TcubgAzVvuoUHlRrSppdA7WzQ==", - "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/postinstall": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.15.tgz", - "integrity": "sha512-DXQQ4kjAbQ7BSd9M4lDI/12vEEciYMP8uYFDlrPFjwD9LezsxtRiORkazjNRRX4730faO5zZsnWhXxCVkxck0g==", + "node_modules/@storybook/nextjs/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preset-react-webpack": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.15.tgz", - "integrity": "sha512-Oo3J7RKO/tFUVnRXs16tZGcX6n90gTpHdlT2Z1fZ+y8wEd9o+VvvKFEIIeMcRxf3hHa49R6Kbc4AQaE9FAuDlw==", + "node_modules/@storybook/nextjs/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", "dev": true, "dependencies": { - "@babel/preset-flow": "^7.22.15", - "@babel/preset-react": "^7.22.15", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", - "@storybook/core-webpack": "7.6.15", - "@storybook/docs-tools": "7.6.15", - "@storybook/node-logger": "7.6.15", - "@storybook/react": "7.6.15", - "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", "@types/node": "^18.0.0", - "@types/semver": "^7.3.4", - "babel-plugin-add-react-displayname": "^0.0.5", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", "fs-extra": "^11.1.0", - "magic-string": "^0.30.5", - "react-docgen": "^7.0.0", - "react-refresh": "^0.14.0", - "semver": "^7.3.7", - "webpack": "5" + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, - "peerDependencies": { - "@babel/core": "^7.22.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { + "node_modules/@storybook/nextjs/node_modules/@types/node": { "version": "18.19.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", @@ -8127,7 +8821,49 @@ "undici-types": "~5.26.4" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": { + "node_modules/@storybook/nextjs/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/nextjs/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/nextjs/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/nextjs/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", @@ -8141,7 +8877,29 @@ "node": ">=14.14" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/jsonfile": { + "node_modules/@storybook/nextjs/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/nextjs/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -8153,49 +8911,885 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "node_modules/@storybook/nextjs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/universalify": { + "node_modules/@storybook/nextjs/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/nextjs/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/nextjs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/nextjs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/nextjs/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/nextjs/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/nextjs/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/nextjs/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@storybook/node-logger": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.15.tgz", + "integrity": "sha512-C+sCvRjR+5uVU3VTrfyv7/RlPBxesAjIucUAK0keGyIZ7sFQYCPdkm4m/C4s+TcubgAzVvuoUHlRrSppdA7WzQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/postinstall": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.15.tgz", + "integrity": "sha512-DXQQ4kjAbQ7BSd9M4lDI/12vEEciYMP8uYFDlrPFjwD9LezsxtRiORkazjNRRX4730faO5zZsnWhXxCVkxck0g==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.17.tgz", + "integrity": "sha512-gn/LvIbll9loOkzwbFlxzOZGmJ6t1vF2/gfi+p/N/AifDYe8+LVM1QV4KRVKt6UEJwsQd79lKf7vPH92AQaKKQ==", + "dev": true, + "dependencies": { + "@babel/preset-flow": "^7.22.15", + "@babel/preset-react": "^7.22.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@storybook/core-webpack": "7.6.17", + "@storybook/docs-tools": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/react": "7.6.17", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "babel-plugin-add-react-displayname": "^0.0.5", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "react-refresh": "^0.14.0", + "semver": "^7.3.7", + "webpack": "5" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.22.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/docs-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.17.tgz", + "integrity": "sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/types": "7.6.17", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/preview": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.17.tgz", + "integrity": "sha512-LvkMYK/y6alGjwRVNDIKL1lFlbyZ0H0c8iAbcQkiMoaFiujMQyVswMDKlWcj42Upfr/B1igydiruomc+eUt0mw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preview-api": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz", + "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.15", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.17.tgz", + "integrity": "sha512-lVqzQSU03rRJWYW+gK2gq6mSo3/qtnVICY8B8oP7gc36jVu4ksDIu45bTfukM618ODkUZy0vZe6T4engK3azjA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-client": "7.6.17", + "@storybook/docs-tools": "7.6.17", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "7.6.17", + "@storybook/react-dom-shim": "7.6.17", + "@storybook/types": "7.6.17", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^18.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin": { + "version": "1.0.6--canary.9.0c3f3b7.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", + "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "typescript": ">= 4.x", + "webpack": ">= 4" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.15.tgz", + "integrity": "sha512-2+X0HIxIyvjfSKVyGGjSJJLEFJ2ox7Rr8FjlMiRo5QfoOJhohZuWH7p4Lw7JMwm5PotnjrwlfsZI3cCilYJeYA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/docs-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.17.tgz", + "integrity": "sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/types": "7.6.17", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preview": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.15.tgz", - "integrity": "sha512-q8d9v0+Bo/DHLV68OyV3Klep4knf2GAbrlHhLW1X4jlPccuEDUojIfqfK7m48ayeIxJzO48fcO0JdKM1XABx7g==", + "node_modules/@storybook/react/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preview-api": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz", - "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==", + "node_modules/@storybook/react/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", "dev": true, "dependencies": { - "@storybook/channels": "7.6.15", - "@storybook/client-logger": "7.6.15", - "@storybook/core-events": "7.6.15", + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.15", + "@storybook/types": "7.6.17", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8210,72 +9804,64 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/react": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.15.tgz", - "integrity": "sha512-oJMSh4iTGu6OqCmj0LhkuPyMkxGMTCoohN4HcDpXd96jCSyWotVebRsg9xm5ddB7f54e6DY4XDoGH0WnVoR23g==", + "node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.17.tgz", + "integrity": "sha512-32Sa/G+WnvaPiQ1Wvjjw5UM9rr2c4GDohwCcWVv3/LJuiFPqNS6zglAtmnsrlIBnUwRBMLMh/ekCTdqMiUmfDw==", "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.15", - "@storybook/core-client": "7.6.15", - "@storybook/docs-tools": "7.6.15", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.6.15", - "@storybook/react-dom-shim": "7.6.15", - "@storybook/types": "7.6.15", - "@types/escodegen": "^0.0.6", - "@types/estree": "^0.0.51", - "@types/node": "^18.0.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "escodegen": "^2.1.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^15.0.0", - "ts-dedent": "^2.0.0", - "type-fest": "~2.19", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=16.0.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "typescript": "*" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/react/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/react-docgen-typescript-plugin": { - "version": "1.0.6--canary.9.0c3f3b7.0", - "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", - "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", + "node_modules/@storybook/react/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "endent": "^2.0.1", - "find-cache-dir": "^3.3.1", - "flat-cache": "^3.0.4", - "micromatch": "^4.0.2", - "react-docgen-typescript": "^2.2.2", - "tslib": "^2.0.0" + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/react/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, - "peerDependencies": { - "typescript": ">= 4.x", - "webpack": ">= 4" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "node_modules/@storybook/react/node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", @@ -8292,7 +9878,7 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-up": { + "node_modules/@storybook/react/node_modules/find-cache-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", @@ -8305,7 +9891,67 @@ "node": ">=8" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/locate-path": { + "node_modules/@storybook/react/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/react/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/react/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/react/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", @@ -8317,7 +9963,7 @@ "node": ">=8" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/make-dir": { + "node_modules/@storybook/react/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", @@ -8332,7 +9978,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-limit": { + "node_modules/@storybook/react/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", @@ -8347,7 +9993,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-locate": { + "node_modules/@storybook/react/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", @@ -8359,19 +10005,28 @@ "node": ">=8" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/@storybook/react/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/react/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/semver": { + "node_modules/@storybook/react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -8380,47 +10035,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@storybook/react-dom-shim": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.15.tgz", - "integrity": "sha512-2+X0HIxIyvjfSKVyGGjSJJLEFJ2ox7Rr8FjlMiRo5QfoOJhohZuWH7p4Lw7JMwm5PotnjrwlfsZI3cCilYJeYA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@storybook/react/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@storybook/react/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/@storybook/react/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -8433,6 +10047,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@storybook/react/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@storybook/router": { "version": "7.6.15", "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.15.tgz", @@ -8867,9 +10490,9 @@ } }, "node_modules/@swc/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", - "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.2.tgz", + "integrity": "sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -8884,16 +10507,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.1", - "@swc/core-darwin-x64": "1.4.1", - "@swc/core-linux-arm-gnueabihf": "1.4.1", - "@swc/core-linux-arm64-gnu": "1.4.1", - "@swc/core-linux-arm64-musl": "1.4.1", - "@swc/core-linux-x64-gnu": "1.4.1", - "@swc/core-linux-x64-musl": "1.4.1", - "@swc/core-win32-arm64-msvc": "1.4.1", - "@swc/core-win32-ia32-msvc": "1.4.1", - "@swc/core-win32-x64-msvc": "1.4.1" + "@swc/core-darwin-arm64": "1.4.2", + "@swc/core-darwin-x64": "1.4.2", + "@swc/core-linux-arm-gnueabihf": "1.4.2", + "@swc/core-linux-arm64-gnu": "1.4.2", + "@swc/core-linux-arm64-musl": "1.4.2", + "@swc/core-linux-x64-gnu": "1.4.2", + "@swc/core-linux-x64-musl": "1.4.2", + "@swc/core-win32-arm64-msvc": "1.4.2", + "@swc/core-win32-ia32-msvc": "1.4.2", + "@swc/core-win32-x64-msvc": "1.4.2" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -8905,9 +10528,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", - "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz", + "integrity": "sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==", "cpu": [ "arm64" ], @@ -8921,9 +10544,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", - "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz", + "integrity": "sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==", "cpu": [ "x64" ], @@ -8937,9 +10560,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", - "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz", + "integrity": "sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==", "cpu": [ "arm" ], @@ -8953,9 +10576,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", - "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz", + "integrity": "sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==", "cpu": [ "arm64" ], @@ -8969,9 +10592,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", - "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz", + "integrity": "sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==", "cpu": [ "arm64" ], @@ -8985,9 +10608,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", - "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz", + "integrity": "sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==", "cpu": [ "x64" ], @@ -9001,9 +10624,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", - "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz", + "integrity": "sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==", "cpu": [ "x64" ], @@ -9017,9 +10640,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", - "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz", + "integrity": "sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==", "cpu": [ "arm64" ], @@ -9033,9 +10656,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", - "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz", + "integrity": "sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==", "cpu": [ "ia32" ], @@ -9049,9 +10672,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", - "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz", + "integrity": "sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==", "cpu": [ "x64" ], @@ -9436,6 +11059,11 @@ "@types/node": "*" } }, + "node_modules/@types/gtag.js": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.19.tgz", + "integrity": "sha512-KHoDzrf9rSd0mooKN576PjExpdk/XRrNu4RQnmigsScSTSidwyOUe9kDrHz9UPKjiBrx2QEsSkexbJSgS0j72w==" + }, "node_modules/@types/hast": { "version": "2.3.9", "license": "MIT", @@ -12354,9 +13982,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", - "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", + "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -16026,9 +17654,9 @@ "dev": true }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 04bef6cc7..b9fc440ea 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@mui/x-date-pickers": "^6.19.2", "@next/eslint-plugin-next": "^13.4.19", "@toast-ui/editor": "^3.2.2", + "@types/gtag.js": "^0.0.19", "@types/lodash": "^4.14.199", "@types/node": "20.5.3", "@types/react": "18.2.21", @@ -72,8 +73,9 @@ "@storybook/addon-links": "^7.6.13", "@storybook/addon-mdx-gfm": "^7.6.15", "@storybook/addon-onboarding": "^1.0.11", + "@storybook/addon-themes": "^7.6.17", "@storybook/blocks": "^7.6.13", - "@storybook/nextjs": "^7.6.13", + "@storybook/nextjs": "^7.6.17", "@storybook/react": "^7.6.13", "@storybook/test": "^7.6.13", "@svgr/webpack": "^8.1.0", diff --git a/public/icons/public/1discordIcon.svg b/public/icons/public/1discordIcon.svg new file mode 100644 index 000000000..281dd3799 --- /dev/null +++ b/public/icons/public/1discordIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/public/InstagramIcon.svg b/public/icons/public/InstagramIcon.svg new file mode 100644 index 000000000..77a0d8e86 --- /dev/null +++ b/public/icons/public/InstagramIcon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/public/discordIcon.svg b/public/icons/public/discordIcon.svg new file mode 100644 index 000000000..eb1b31e2f --- /dev/null +++ b/public/icons/public/discordIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/public/googleIcon.svg b/public/icons/public/googleIcon.svg new file mode 100644 index 000000000..088288fa3 --- /dev/null +++ b/public/icons/public/googleIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/public/kakaoIcon.svg b/public/icons/public/kakaoIcon.svg new file mode 100644 index 000000000..1e23afc83 --- /dev/null +++ b/public/icons/public/kakaoIcon.svg @@ -0,0 +1 @@ + diff --git a/public/icons/public/messageIcon.svg b/public/icons/public/messageIcon.svg new file mode 100644 index 000000000..dacc40409 --- /dev/null +++ b/public/icons/public/messageIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/public/slackIcon.svg b/public/icons/public/slackIcon.svg new file mode 100644 index 000000000..69a4eb6a2 --- /dev/null +++ b/public/icons/public/slackIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/og-image.png b/public/images/og-image.png new file mode 100644 index 000000000..07ca14df0 Binary files /dev/null and b/public/images/og-image.png differ diff --git a/src/app/about/@detail/page.tsx b/src/app/about/announce/[id]/page.tsx similarity index 93% rename from src/app/about/@detail/page.tsx rename to src/app/about/announce/[id]/page.tsx index c33daeb52..6cce4146d 100644 --- a/src/app/about/@detail/page.tsx +++ b/src/app/about/announce/[id]/page.tsx @@ -3,8 +3,8 @@ import { defaultGetFetcher } from '@/api/fetchers' import CuCircularProgress from '@/components/CuCircularProgress' import DynamicToastViewer from '@/components/DynamicToastViewer' -import useAboutLayout from '@/states/useAboutLayout' import { Avatar, Button, Card, Stack, Typography } from '@mui/material' +import { useRouter } from 'next/navigation' import useSWR from 'swr' interface AnnounceDailProp { @@ -33,10 +33,10 @@ function formatDate(dateStr: string | null) { return formattedDate } -const DetailPage = () => { - const { setBoard, announceDetailId } = useAboutLayout() +const DetailPage = ({ params }: { params: { id: string } }) => { + const router = useRouter() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/about/announcement/${announceDetailId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/about/announcement/${params.id}`, defaultGetFetcher, ) @@ -49,7 +49,7 @@ const DetailPage = () => { diff --git a/src/app/about/@announce/page.tsx b/src/app/about/announce/page.tsx similarity index 95% rename from src/app/about/@announce/page.tsx rename to src/app/about/announce/page.tsx index 4613e6ef0..23f1966cb 100644 --- a/src/app/about/@announce/page.tsx +++ b/src/app/about/announce/page.tsx @@ -4,7 +4,6 @@ import { defaultGetFetcher } from '@/api/fetchers' import CuCircularProgress from '@/components/CuCircularProgress' import NoDataDolphin from '@/components/NoDataDolphin' import useMedia from '@/hook/useMedia' -import useAboutLayout from '@/states/useAboutLayout' import { IPagination } from '@/types/IPagination' import { Card, @@ -14,6 +13,7 @@ import { Stack, Typography, } from '@mui/material' +import { useRouter } from 'next/navigation' import { ChangeEvent, useState } from 'react' import useSWR from 'swr' @@ -43,7 +43,7 @@ function formatDate(dateStr: string | null) { } const AnnounceCard = ({ title, writer, date, id }: AnnounceCardProps) => { - const { setAnnounceDetail } = useAboutLayout() + const router = useRouter() return ( { }} > setAnnounceDetail(id)} + onClick={() => router.push(`/about/announce/${id}`)} sx={{ '.MuiCardActionArea-focusHighlight': { background: 'transparent', diff --git a/src/app/about/@contact/page.tsx b/src/app/about/contact/page.tsx similarity index 100% rename from src/app/about/@contact/page.tsx rename to src/app/about/contact/page.tsx diff --git a/src/app/about/@dictionary/page.tsx b/src/app/about/dictionary/page.tsx similarity index 100% rename from src/app/about/@dictionary/page.tsx rename to src/app/about/dictionary/page.tsx diff --git a/src/app/about/layout.tsx b/src/app/about/layout.tsx index dcb98bb96..cb895cd45 100644 --- a/src/app/about/layout.tsx +++ b/src/app/about/layout.tsx @@ -1,8 +1,8 @@ 'use client' import useMedia from '@/hook/useMedia' -import useAboutLayout from '@/states/useAboutLayout' import { Button, ButtonGroup, Stack, Typography, styled } from '@mui/material' +import { useRouter } from 'next/navigation' import { ReactNode } from 'react' const StyledButtonGroup = styled(ButtonGroup)({ @@ -12,22 +12,30 @@ const StyledButtonGroup = styled(ButtonGroup)({ }) const Sidebar = () => { + const router = useRouter() const { isPc } = useMedia() - const { setBoard } = useAboutLayout() return ( About Us - - - - - - - + + + + + @@ -35,19 +43,7 @@ const Sidebar = () => { ) } -interface AboutPageProps { - contact: ReactNode - personal: ReactNode - announce: ReactNode - mind: ReactNode - dictionary: ReactNode - service: ReactNode - peer: ReactNode - detail: ReactNode -} - -const AboutPage = (props: AboutPageProps) => { - const { boardType } = useAboutLayout() +const AboutPage = ({ children }: { children: ReactNode }) => { const { isPc, isTablet } = useMedia() if (isPc) { @@ -57,16 +53,7 @@ const AboutPage = (props: AboutPageProps) => { - - {boardType === 'PEER' && props.peer} - {boardType === 'MIND' && props.mind} - {boardType === 'ANNOUNCE' && props.announce} - {boardType === 'DICTIONARY' && props.dictionary} - {boardType === 'CONTACT' && props.contact} - {boardType === 'PERSONAL' && props.personal} - {boardType === 'SERVICE' && props.service} - {boardType === 'ANNOUNCE_DETAIL' && props.detail} - + {children} ) @@ -74,16 +61,7 @@ const AboutPage = (props: AboutPageProps) => { return ( - - {boardType === 'PEER' && props.peer} - {boardType === 'MIND' && props.mind} - {boardType === 'ANNOUNCE' && props.announce} - {boardType === 'DICTIONARY' && props.dictionary} - {boardType === 'CONTACT' && props.contact} - {boardType === 'PERSONAL' && props.personal} - {boardType === 'SERVICE' && props.service} - {boardType === 'ANNOUNCE_DETAIL' && props.detail} - + {children} ) diff --git a/src/app/about/@mind/page.tsx b/src/app/about/mind/page.tsx similarity index 100% rename from src/app/about/@mind/page.tsx rename to src/app/about/mind/page.tsx diff --git a/src/app/about/@peer/page.tsx b/src/app/about/page.tsx similarity index 100% rename from src/app/about/@peer/page.tsx rename to src/app/about/page.tsx diff --git a/src/app/about/@personal/page.tsx b/src/app/about/personal/page.tsx similarity index 100% rename from src/app/about/@personal/page.tsx rename to src/app/about/personal/page.tsx diff --git a/src/app/about/@service/page.tsx b/src/app/about/service/page.tsx similarity index 100% rename from src/app/about/@service/page.tsx rename to src/app/about/service/page.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c8a3c85ce..59a9f7eda 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -8,10 +8,18 @@ import { Pretendard } from './panel/font' import ToastNotification from './panel/layout-panel/ToastNotification' import { AppRouterCacheProvider } from '@mui/material-nextjs/v13-appRouter' import DataPickerProvider from './DataPickerProvider' +import GoogleAnalytics from '@/utils/gtag' -export const metadata: Metadata = { +const webMetadata = { title: 'peer', - description: 'This is a website of the peer, by the peer, for the peer.', + description: '동료를 찾기 위한 가장 빠른 선택', + url: 'https://peer-study.co.kr/', + image: 'images/og-image.png', +} + +export const metadata: Metadata = { + title: webMetadata.title, + description: webMetadata.description, } // 개선 필요, 레이아웃 쉬프트 현상 고쳐야함 @@ -51,8 +59,26 @@ export default function RootLayout({ + {/* Html meta tag */} + {webMetadata.title} + + {/* Facebook meta tag */} + + + + + + {/* Twitter meta tag */} + + + + + + {process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS ? ( + + ) : null} diff --git a/src/app/panel/MainLayout.tsx b/src/app/panel/MainLayout.tsx index 29efe374c..067ed4646 100644 --- a/src/app/panel/MainLayout.tsx +++ b/src/app/panel/MainLayout.tsx @@ -62,7 +62,7 @@ const MainLayout = ({ children }: { children: React.ReactNode }) => { {isPc ? (
- {children} + {children}
) : (
diff --git a/src/app/panel/MainPage.tsx b/src/app/panel/MainPage.tsx index 8eaddd8e6..50dd4f630 100644 --- a/src/app/panel/MainPage.tsx +++ b/src/app/panel/MainPage.tsx @@ -1,43 +1,12 @@ 'use client' -import { - Container, - Box, - Grid, - Stack, - Typography, - Pagination, -} from '@mui/material' -import { useCallback, useEffect, useState } from 'react' -import FloatEditButton from './main-page/FloatEditButton' -import MainCard from './main-page/MainCard' -import SelectType from './main-page/SelectType' -import { defaultGetFetcher } from '@/api/fetchers' -import useSWR from 'swr' -import MainProfile from './main-page/MainProfile' -import MainShowcase from './main-page/MainShowcase' -import MainCarousel from './main-page/MainCarousel' -import { useRouter, useSearchParams } from 'next/navigation' -import { IFavorite, IPost, ProjectType } from '@/types/IPostDetail' -import useAuthStore from '@/states/useAuthStore' -import useAxiosWithAuth from '@/api/config' -import { AxiosInstance } from 'axios' +import { IPost } from '@/types/IPostDetail' import { IPagination } from '@/types/IPagination' import PwaInstallBanner from './PwaInstallBanner' -// import PushAlertBanner from './PushAlertBanner' -import MainBanner from '@/app/panel/main-page/MainBanner' -import Tutorial from '@/components/Tutorial' -import { MainPageTutorial } from '@/components/tutorialContent/MainPageTutorial' -import NoDataDolphin from '@/components/NoDataDolphin' -import { - cardStyle, - containerStyle, - floatButtonStyle, - sideMenuStyle, -} from '@/app/panel/main-page/Mainpage.style' -import SearchOptionPanel from '@/app/panel/main-page/MainPanel' -import SelectSort from '@/app/panel/main-page/SelectSort' -import useMedia from '@/hook/useMedia' +import MainMobileView from '@/app/panel/main-page/MainMobileView' +import MainPcView from '@/app/panel/main-page/MainPcView' +import Footer from '@/app/panel/main-page/Footer' +import PushAlertBanner from './PushAlertBanner' export interface BeforeInstallPromptEvent extends Event { readonly platforms: string[] @@ -51,320 +20,19 @@ export interface BeforeInstallPromptEvent extends Event { export type ProjectSort = 'latest' | 'hit' -export interface IDetailOption { - isInit?: boolean - due1: number - due2: number - region1: string - region2: string - place: string - status: string - tag: string -} - const MainPage = ({ initData }: { initData: IPagination }) => { - const searchParams = useSearchParams() - const keyword = searchParams.get('keyword') ?? '' - const searchType = - searchParams.get('type') === 'PROJECT' ? 'PROJECT' : 'STUDY' - const router = useRouter() - const [page, setPage] = useState(1) - const [type, setType] = useState(searchType) //'STUDY' - const [openOption, setOpenOption] = useState(false) - const [sort, setSort] = useState(undefined) //'latest' - const [detailOption, setDetailOption] = useState({ - isInit: true, - due1: 0, - due2: 100, - region1: '', - region2: '', - place: '', - status: '', - tag: '', - }) - - const { isLogin } = useAuthStore() - const axiosInstance: AxiosInstance = useAxiosWithAuth() - const [init, setInit] = useState(true) - const { isTablet } = useMedia() - - useEffect(() => { - if (keyword !== '') { - setType(searchType) - setInit(false) - } - }, [keyword, searchType]) - - /* page가 1이면 서버가 가져온 데이터(initData)로 렌더링 */ - - const dueObject: { [key: number]: string } = { - 0: '1주일', - 20: '1개월', - 40: '3개월', - 60: '6개월', - 80: '9개월', - 100: '12개월 이상', - } - const pageSize = 6 - const option = `?type=${type ?? 'STUDY'}&sort=${ - sort ?? 'latest' - }&page=${page}&pageSize=${pageSize}&keyword=${keyword}&due=${ - dueObject[detailOption.due1] - }&due=${dueObject[detailOption.due2]}®ion1=${ - detailOption.region1 - }®ion2=${detailOption.region2}&place=${detailOption.place}&status=${ - detailOption.status - }&tag=${detailOption.tag}` - - const isInit = - page == 1 && !sort && detailOption.isInit && keyword == '' && init - - const { data: favoriteData } = useSWR( - isInit && isLogin - ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorites` + option - : null, - (url: string) => axiosInstance.get(url).then((res) => res.data), - ) - - const getFavoriteData = (recruit_id: number) => { - const res = favoriteData?.find((data) => data?.recruit_id === recruit_id) - return res?.favorite - } - - const { data, isLoading, error } = useSWR>( - `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit` + option, - isLogin - ? (url: string) => - axiosInstance.get(url).then((res) => { - return res.data - }) - : defaultGetFetcher, - { - fallbackData: initData, - keepPreviousData: true, - }, - ) - - const handleType = useCallback( - (value: ProjectType) => { - setInit(false) - setType(value) - //type이 변경될 경우 초기화 - setPage(1) - setDetailOption({ - due1: 0, - due2: 100, - region1: '', - region2: '', - place: '', - status: '', - tag: '', - }) - setSort('latest') - router.replace(`?type=${value}`) - }, - [router], - ) - - const handleSort = useCallback((value: ProjectSort) => { - setSort(value) - setPage(1) - }, []) - - const handleOption = useCallback((value: IDetailOption) => { - setDetailOption(value) - setPage(1) - }, []) - - const handleChangePage = (_: any, newPage: number) => { - setPage(newPage) - } - - const noContent = !isLoading - ? error - ? '에러 발생' - : data?.content?.length == 0 - ? '데이터가 없습니다' - : null - : null - return ( <> - {/* */} + {/* mobile view */}
- - {keyword === '' ? ( - <> - - - - - - - - - ) : ( - - - {keyword} - 검색 결과 - - - - )} - {/*card list 영역*/} - {noContent ? ( - - - - ) : ( - <> - - - {data?.content?.map((project: IPost) => ( - - - - ))} - - - - - - - )} - - - - + +
- {/* pc view */}
- - - - {keyword === '' ? ( - <> - - - - - - } - /> - - - - ) : ( - - - {keyword} - 검색 결과 - - - - )} - {/*card list 영역*/} - {noContent ? ( - - - - ) : ( - <> - - {data?.content?.map((project: IPost) => ( - - - - ))} - - - )} - - - - - {!isTablet && ( - - - - - - )} - - + +
diff --git a/src/app/panel/MuiThemeProvider.tsx b/src/app/panel/MuiThemeProvider.tsx index f68c258bc..3bb2aac2f 100644 --- a/src/app/panel/MuiThemeProvider.tsx +++ b/src/app/panel/MuiThemeProvider.tsx @@ -363,71 +363,6 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { getModeFromLocalStorage() }, []) - if (theme.palette) { - theme.palette.red = theme.palette.augmentColor({ - color: { - main: '#FF5833', - strong: '#FF5833', - normal: '#FF6D4D', - alternative: '#FF7D61', - tinted: '#FF6D4D33', - }, - name: 'red', - }) - theme.palette.blue = theme.palette.augmentColor({ - color: { - main: '#3A5DCF', - strong: '#3A5DCF', - normal: '#4E6ED4', - alternative: '#6681DB', - tinted: '#4E6ED433', - }, - name: 'blue', - }) - theme.palette.purple = theme.palette.augmentColor({ - color: { - main: '#6F62FE', - strong: '#6F62FE', - normal: '#877CFE', - alternative: '#A39BFD', - tinted: '#877CFE33', - }, - name: 'purple', - }) - theme.palette.green = theme.palette.augmentColor({ - color: { - main: '#489B08', - strong: '#489B08', - normal: '#53B309', - alternative: '#61CD0E', - tinted: '#53B30933', - }, - name: 'green', - }) - theme.palette.yellow = theme.palette.augmentColor({ - color: { - main: '#FFA805', - strong: '#FFA805', - normal: '#FFB01F', - alternative: '#FDBC44', - tinted: '#FFB01F33', - }, - name: 'yellow', - }) - theme.palette.pink = theme.palette.augmentColor({ - color: { - main: '#C44ECA', - strong: '#C44ECA', - normal: '#CB62D0', - alternative: '#D581D9', - tinted: '#CB62D033', - }, - name: 'pink', - }) - - theme.palette.primary = theme.palette.purple - } - if (theme.components) { theme.components.MuiContainer = { styleOverrides: { diff --git a/src/app/panel/PushAlertBanner.tsx b/src/app/panel/PushAlertBanner.tsx index 45dba5461..218ec08c5 100644 --- a/src/app/panel/PushAlertBanner.tsx +++ b/src/app/panel/PushAlertBanner.tsx @@ -6,11 +6,16 @@ import { AxiosInstance } from 'axios' import { useEffect, useState } from 'react' import { initializeApp } from 'firebase/app' import { getMessaging, onMessage, getToken } from 'firebase/messaging' +import { EDeviceType } from '@/types/DeviceTypes' +import useToast from '@/states/useToast' +import useMedia from '@/hook/useMedia' const PushAlertBanner = () => { + const { isPc } = useMedia() const axiosInstance: AxiosInstance = useAxiosWithAuth() const [isShowPush, setIsShowPush] = useState(false) - const [isScroll, setIsScroll] = useState(1) + const [userAgent, setUserAgent] = useState(EDeviceType.OTHER) + const { openToast } = useToast() const handlePushFCM = () => { const firebaseConfig = initializeApp({ @@ -31,16 +36,23 @@ const PushAlertBanner = () => { .then((currentToken: any) => { if (currentToken) { axiosInstance - .post( - `${process.env.NEXT_PUBLIC_NEXT_PUBLIC_CSR_API}:8082/alarm/send-push`, + .put( + `${process.env.NEXT_PUBLIC_NEXT_PUBLIC_CSR_API}/api/v1/noti-pwa/spring/subscription`, { - token: currentToken, - title: '푸시 알림 테스트', - message: '푸시 알림 테스트 메시지입니다.', + firebaseToken: currentToken, + deviceInfo: userAgent, }, ) .then(() => { console.log('푸시 알림 전송 성공') + // 배너 아예 안보이기 + setIsShowPush(false) + localStorage.setItem('isShowPush', 'false') + }) + .catch(() => { + console.log('푸시 알림 전송 실패') + // 배너 일시적으로 가리기 + setIsShowPush(false) }) } else { console.log( @@ -49,11 +61,17 @@ const PushAlertBanner = () => { } }) .catch(() => { - console.log('An error occurred while retrieving token. ') + console.log('An error occurred while retrieving token.') + // 배너 일시적으로 가리기 + setIsShowPush(false) + openToast({ + message: '푸시 알림을 사용할 수 없습니다. 잠시후 다시 시도해주세요.', + severity: 'error', + }) }) onMessage(messaging, () => { - console.log('Message received. ') + console.log('Message received.') }) } @@ -63,8 +81,6 @@ const PushAlertBanner = () => { if (permission === 'granted') { console.log('Notification permission granted.') handlePushFCM() - setIsShowPush(false) - localStorage.setItem('isShowPush', 'false') } else { console.log('Unable to get permission to notify.') } @@ -72,22 +88,28 @@ const PushAlertBanner = () => { } } - const handleScroll = () => { - setIsScroll(window.scrollY) - } + // 유저의 기기 정보를 가져오는 부분: 알림 부분 참고 + useEffect(() => { + if (navigator.userAgent.match(/(iPhone|iPod)/)) { + setUserAgent(EDeviceType.IPHONE) + } else if (navigator.userAgent.match(/android|Android/)) { + setUserAgent(EDeviceType.ANDROID) + } else if (navigator.userAgent.match(/mac|Mac/)) { + setUserAgent(EDeviceType.MACOS) + } else if (navigator.userAgent.match(/windows|Windows/)) { + setUserAgent(EDeviceType.WINDOWS) + } else { + setUserAgent(EDeviceType.OTHER) + } + }, []) + // PWA 알림 배너 노출 여부를 지정 useEffect(() => { if (localStorage && localStorage.getItem('isShowPush') === 'false') { setIsShowPush(false) } else { setIsShowPush(true) } - - window.addEventListener('scroll', handleScroll) - - return () => { - window.removeEventListener('scroll', handleScroll) - } }, [setIsShowPush]) return ( @@ -95,20 +117,29 @@ const PushAlertBanner = () => { {isShowPush && ( - - + + 사용하시는 브라우저는 알림 기능을 사용할 수 있습니다. 사용하시겠습니까? - - + ) +} + +const LinkButton = ({ + href, + variant, +}: { + href: string + variant: 'text' | 'outlined' | 'contained' +}) => { //@todo 이동불가능한 url 처리 return ( - + {/* 모집글 링크버튼 */} + ) } diff --git a/src/app/recruit/[id]/panel/RecruitDetailContent.tsx b/src/app/recruit/[id]/panel/RecruitDetailContent.tsx index aae9a34de..58c5bca71 100644 --- a/src/app/recruit/[id]/panel/RecruitDetailContent.tsx +++ b/src/app/recruit/[id]/panel/RecruitDetailContent.tsx @@ -20,10 +20,8 @@ const RecruitDetailContent = ({ return ( } /> { > - {data?.teamName} + + {data?.leader_nickname + ? data.leader_nickname + : '존재하지 않는 유저'} + {/*지원 버튼*/} @@ -73,7 +77,11 @@ const RecruitInfo = ({ data, type, children, pc }: RecruitInfoProps) => { > - {data?.teamName} + + {data?.leader_nickname + ? data.leader_nickname + : '존재하지 않는 유저'} + diff --git a/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts b/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts index 4c4fd8219..b20ff35a7 100644 --- a/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts +++ b/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts @@ -20,6 +20,9 @@ export const commentListContainer = { alignItems: 'center', } +export const isEditContainer = { + width: '100%', +} export const commenterInfo = { display: 'flex', marginBottom: '0.25rem', @@ -29,7 +32,7 @@ export const commenterInfo = { export const iconContainer = { display: 'flex', - flexDirection: 'column', + flexDirection: 'row', alignItems: 'center', gap: '0.5rem', } diff --git a/src/app/showcase/detail/[id]/panel/CommentContainer.tsx b/src/app/showcase/detail/[id]/panel/CommentContainer.tsx index 29562b4ed..5c71b365e 100644 --- a/src/app/showcase/detail/[id]/panel/CommentContainer.tsx +++ b/src/app/showcase/detail/[id]/panel/CommentContainer.tsx @@ -3,30 +3,61 @@ import CuAvatar from '@/components/CuAvatar' import CuCircularProgress from '@/components/CuCircularProgress' import CuTextModal from '@/components/CuTextModal' import useModal from '@/hook/useModal' -import { TrashIcon } from '@/icons' import { CommentProps, IComment, IPostId } from '@/types/IComment' -import { - Box, - Container, - IconButton, - Stack, - Typography, - useTheme, - alpha, -} from '@mui/material' -import React from 'react' +import { Box, Container, Stack, Typography, TextField } from '@mui/material' +import React, { ChangeEvent, useState } from 'react' import useSWR, { mutate } from 'swr' import { CommentWriter } from './CommentWriter' import useToast from '@/states/useToast' import * as style from './CommentContainer.style' import OthersProfile from '@/app/panel/OthersProfile' -// import OthersProfile from '@/app/panel/OthersProfile' +import { CommentMoreDropdownMenu } from '@/components/board/CommentPanel' +import CuButton from '@/components/CuButton' const Comment = ({ data, postId }: CommentProps) => { - const theme = useTheme() const axiosWithAuth = useAxiosWithAuth() - const { isOpen: alertOpen, closeModal, openModal } = useModal() + const { closeModal, openModal, isOpen } = useModal() + const [isEdit, setIsEdit] = useState(false) const { openToast, closeToast } = useToast() + const [newContent, setNewContent] = useState(data.content) + + const onChangeContent = ( + event: ChangeEvent, + ) => { + setNewContent(event.target.value) + } + + const handleError = (error: any, openToast: any) => { + switch (error.response.status) { + case 401: { + openToast({ + severity: 'error', + message: '잘못된 접근입니다.', + }) + break + } + case 403: { + openToast({ + severity: 'error', + message: '접근이 거부되었습니다.', + }) + break + } + case 404: { + openToast({ + severity: 'error', + message: '존재하지 않는 댓글입니다.', + }) + break + } + default: + openToast({ + severity: 'error', + message: '알 수 없는 에러가 발생했습니다.', + }) + break + } + } const onDeleteComment = async () => { try { @@ -38,42 +69,38 @@ const Comment = ({ data, postId }: CommentProps) => { `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, ) } catch (error: any) { - switch (error.response.status) { - case 401: { - openToast({ - severity: 'error', - message: '접근이 거부되었습니다.', - }) - break - } - case 403: { - openToast({ - severity: 'error', - message: '접근이 거부되었습니다.', - }) - break - } - case 404: { - openToast({ - severity: 'error', - message: '존재하지 않는 댓글입니다.', - }) - break - } - default: - openToast({ - severity: 'error', - message: '알 수 없는 에러가 발생했습니다.', - }) - break - } + handleError(error, openToast) + } + } + const onEditComment = async (commentId: number) => { + if (!newContent) { + openToast({ + severity: 'error', + message: '댓글을 작성해주세요.', + }) + return + } + try { + await axiosWithAuth.put( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${commentId}`, + { content: newContent }, + ) + setIsEdit(false) + openToast({ + severity: 'success', + message: '댓글을 수정했습니다.', + }) + mutate( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, + ) + } catch (error: any) { + handleError(error, openToast) } } - return ( <> - + {/* TODO : OthersProfile 컴포넌트로 감싸기 */} { {data.authorNickname} - - {data.content} - - - {data.createAt - .split('T')[0] - .replace(/-/g, '월 ') - .replace('월 ', '년 ') + '일'} - - - - {data.isAuthor && ( - - + onChangeContent(event)} + placeholder="댓글을 작성해주세요." + style={{ + color: 'text.alternative', + width: '100%', }} + inputProps={{ maxLength: 150, style: { padding: '1rem' } }} /> - + + setIsEdit(false)} + variant={'outlined'} + /> + onEditComment(data.commentId)} + message={'수정'} + type={'submit'} + variant={'contained'} + /> + + + ) : ( + <> + + {data.content} + + + {data.createAt + .split('T')[0] + .replace(/-/g, '월 ') + .replace('월 ', '년 ') + '일'} + + )} - {/* - - */} + {!isEdit && data.isAuthor && ( + + openModal()} + setEditMode={() => setIsEdit(true)} + /> + + )} { if (!boardId) return null if (postId === undefined) return null - if (!data || error) + + if (isLoading) return ( setBoard('LIST', boardId, postId)} author={!!data?.isAuthor} /> ) - if (isLoading) + + if (!data || error) return ( setBoard('LIST', boardId, postId)} author={!!data?.isAuthor} /> diff --git a/src/app/teams/[id]/board/@list/panel/BoardPostList.tsx b/src/app/teams/[id]/board/@list/panel/BoardPostList.tsx index 3cef93385..92ee8a868 100644 --- a/src/app/teams/[id]/board/@list/panel/BoardPostList.tsx +++ b/src/app/teams/[id]/board/@list/panel/BoardPostList.tsx @@ -30,9 +30,11 @@ const BoardPostList = ({ if (!isLoading && size !== 1) setSize(1) }, [keyword]) - if (!data || error) return if (!data && isLoading) return + + if (!data || error) return + if (data.length === 0 || data[0].content.length === 0) return return ( diff --git a/src/app/teams/[id]/notice/@detail/page.tsx b/src/app/teams/[id]/notice/@detail/page.tsx index a7176ff9f..b4a276ab3 100644 --- a/src/app/teams/[id]/notice/@detail/page.tsx +++ b/src/app/teams/[id]/notice/@detail/page.tsx @@ -50,24 +50,27 @@ const TeamNoticeView = ({ params }: { params: { id: string } }) => { } if (postId === undefined) return null - if (!data || error) + + if (isLoading) return ( setNotice('EDIT', postId)} author={!!data?.isAuthor} /> ) - if (isLoading) + + if (!data || error) return ( setNotice('EDIT', postId)} author={!!data?.isAuthor} /> ) + return ( <> diff --git a/src/app/teams/[id]/panel/TeamInfoContainer.tsx b/src/app/teams/[id]/panel/TeamInfoContainer.tsx index a5dfc2d8c..d635fc534 100644 --- a/src/app/teams/[id]/panel/TeamInfoContainer.tsx +++ b/src/app/teams/[id]/panel/TeamInfoContainer.tsx @@ -10,13 +10,31 @@ import { ITeamInfo } from '@/types/ITeamInfo' import { StatusIcon, IconInfo } from './TeamInfoComponent' import * as style from './TeamInfoContainer.style' import { isAxiosError } from 'axios' +import useMedia from '@/hook/useMedia' +import { TeamMemberListMobile, TeamMemberListPc } from './TeamMemberList' + +export interface ITeamMemberInfo { + id: number + name: string + role: string +} const TeamInfoContainer = ({ id }: { id: number }) => { + const { isPc } = useMedia() const axiosInstance = useAxiosWithAuth() + // 팀의 정보를 불러오는 API 호출 const { data, error, isLoading } = useSWR( `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/main/${id}`, (url: string) => axiosInstance(url).then((res) => res.data), ) + // 팀원의 정보를 불러오는 API 호출 -> 추후 API 통합이 필요 + const { data: memberData, isLoading: memberIsLoading } = useSWR< + Array + >( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/main/member/${id}`, + (url: string) => axiosInstance(url).then((res) => res.data), + ) + const { setHeaderTitle } = useHeaderStore() const router = useRouter() @@ -40,7 +58,7 @@ const TeamInfoContainer = ({ id }: { id: number }) => { return } - if (!isLoading && !data) { + if (!isLoading && !data && !memberIsLoading && !memberData) { alert('팀 페이지에 접근할 수 없습니다.') router.push('/team-list') return @@ -48,7 +66,7 @@ const TeamInfoContainer = ({ id }: { id: number }) => { return ( <> - + {isLoading || !data ? ( ) : ( @@ -71,7 +89,15 @@ const TeamInfoContainer = ({ id }: { id: number }) => { - + + + {memberData && + (isPc ? ( + + ) : ( + + ))} + diff --git a/src/app/teams/[id]/panel/TeamMemberList.tsx b/src/app/teams/[id]/panel/TeamMemberList.tsx new file mode 100644 index 000000000..299117a61 --- /dev/null +++ b/src/app/teams/[id]/panel/TeamMemberList.tsx @@ -0,0 +1,217 @@ +'use client' + +import { Button, Card, Popover, Stack, Typography } from '@mui/material' +import { ITeamMemberInfo } from './TeamInfoContainer' +import CuCircularProgress from '@/components/CuCircularProgress' +import { AccountBox } from '@/icons' +import { MouseEvent, useState } from 'react' +import useNicknameStore from '@/states/useNicknameStore' +import { useRouter } from 'next/navigation' +import ReportModal from '@/components/ReportModal' +import ExternalMessageModal from '@/app/panel/ExternalMessageModal' +import CuModal from '@/components/CuModal' + +// 팀원 리스트를 보여주는 컴포넌트의 props interface +interface ITeamMemberListProps { + members: Array +} + +// 공통으로 사용되는 컴포넌트 +// 1. 프로필 보기 버튼, 쪽지 보내기 버튼, 신고하기 버튼을 보여주는 컴포넌트 +const MemberButtonGroup = ({ + userId, + name, +}: { + userId: string + name: string +}) => { + const router = useRouter() + const myNickname = useNicknameStore.getState().nickname + + // 쪽지와 신고를 보내기 위한 모달 + const [modalType, setModalType] = useState('' as string) + const messageOpen = () => { + setModalType('message') + } + const reportOpen = () => { + setModalType('report') + } + const handleModalClose = () => { + setModalType('') + } + + // 남의 프로필 보기 + const goOthersProfile = () => { + router.push(`/profile/${userId}`) + } + // 자기 자신의 프로필 보기 + const goMypage = () => { + router.push('/my-page') + } + + // 유령 회원 처리 + if (Number(userId) === -1) return <> + + return ( + <> + {myNickname !== name ? ( + <> + + + + + ) : ( + + )} + + + + ) +} + +// 2. 팀원의 이름과 역할, 프로필 보기 버튼을 보여주는 컴포넌트 +const MemberInfo = ({ member }: { member: ITeamMemberInfo }) => { + return ( + + + + + {member.name} + + {member.role === 'LEADER' && ( + + )} + + + + + + + ) +} + +// 모바일에선 버튼을 클릭하여 모달을 통해 멤버 리스트를 보여준다. +const TeamMemberListMobile = ({ members }: ITeamMemberListProps) => { + const [open, setOpen] = useState(false) + + // 모달 관련 함수 + const handleOpen = () => { + setOpen(true) + } + const handleClose = () => { + setOpen(false) + } + return ( + <> + + + + {!members ? ( + + ) : ( + members.map((member) => ( + + )) + )} + + + + ) +} + +// PC에선 popover를 사용하여 멤버 리스트를 보여준다. +const TeamMemberListPc = ({ members }: ITeamMemberListProps) => { + // 멤버 리스트를 보여주기 위한 popover 관련 객체 + // mui의 기본 예제 참고 + const [popOverAnchorEl, setPopOverAnchorEl] = + useState(null) + + const handlePopoverOpen = (event: MouseEvent) => { + setPopOverAnchorEl(event.currentTarget) + } + + const handlePopoverClose = () => { + setPopOverAnchorEl(null) + } + + const open = Boolean(popOverAnchorEl) + + return ( + <> + + + + + 멤버 리스트 + + + {!members ? ( + + ) : ( + members.map((member) => ( + + )) + )} + + + + + ) +} + +export { TeamMemberListPc, TeamMemberListMobile } diff --git a/src/assets/font/OpenSans-Light-webfont.eot b/src/assets/font/OpenSans-Light-webfont.eot new file mode 100755 index 000000000..f17617e03 Binary files /dev/null and b/src/assets/font/OpenSans-Light-webfont.eot differ diff --git a/src/assets/font/OpenSans-Light-webfont.svg b/src/assets/font/OpenSans-Light-webfont.svg new file mode 100755 index 000000000..deadc3ef1 --- /dev/null +++ b/src/assets/font/OpenSans-Light-webfont.svg @@ -0,0 +1,252 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/font/OpenSans-Light-webfont.ttf b/src/assets/font/OpenSans-Light-webfont.ttf new file mode 100755 index 000000000..b83078a60 Binary files /dev/null and b/src/assets/font/OpenSans-Light-webfont.ttf differ diff --git a/src/assets/font/OpenSans-Light-webfont.woff b/src/assets/font/OpenSans-Light-webfont.woff new file mode 100755 index 000000000..ff882b6ac Binary files /dev/null and b/src/assets/font/OpenSans-Light-webfont.woff differ diff --git a/src/assets/font/OpenSans-Regular-webfont.eot b/src/assets/font/OpenSans-Regular-webfont.eot new file mode 100755 index 000000000..545b7c15e Binary files /dev/null and b/src/assets/font/OpenSans-Regular-webfont.eot differ diff --git a/src/assets/font/OpenSans-Regular-webfont.svg b/src/assets/font/OpenSans-Regular-webfont.svg new file mode 100755 index 000000000..46a8f4c6c --- /dev/null +++ b/src/assets/font/OpenSans-Regular-webfont.svg @@ -0,0 +1,252 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/font/OpenSans-Regular-webfont.ttf b/src/assets/font/OpenSans-Regular-webfont.ttf new file mode 100755 index 000000000..a5b2378e5 Binary files /dev/null and b/src/assets/font/OpenSans-Regular-webfont.ttf differ diff --git a/src/assets/font/OpenSans-Regular-webfont.woff b/src/assets/font/OpenSans-Regular-webfont.woff new file mode 100755 index 000000000..11698afc2 Binary files /dev/null and b/src/assets/font/OpenSans-Regular-webfont.woff differ diff --git a/src/assets/icon/percolate.eot b/src/assets/icon/percolate.eot new file mode 100644 index 000000000..5fb4ffd82 Binary files /dev/null and b/src/assets/icon/percolate.eot differ diff --git a/src/assets/icon/percolate.svg b/src/assets/icon/percolate.svg new file mode 100644 index 000000000..3a4f55bd4 --- /dev/null +++ b/src/assets/icon/percolate.svg @@ -0,0 +1,139 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icon/percolate.ttf b/src/assets/icon/percolate.ttf new file mode 100644 index 000000000..edbc24a32 Binary files /dev/null and b/src/assets/icon/percolate.ttf differ diff --git a/src/assets/icon/percolate.woff b/src/assets/icon/percolate.woff new file mode 100644 index 000000000..178845625 Binary files /dev/null and b/src/assets/icon/percolate.woff differ diff --git a/src/components/CuPhotoBox.tsx b/src/components/CuPhotoBox.tsx index 090dbc259..68f6c68ab 100644 --- a/src/components/CuPhotoBox.tsx +++ b/src/components/CuPhotoBox.tsx @@ -27,9 +27,12 @@ const CuPhotoBox = ({ setError(true)} diff --git a/src/constant/ColorTheme.ts b/src/constant/ColorTheme.ts index 7f9623c26..6afe2e7bd 100644 --- a/src/constant/ColorTheme.ts +++ b/src/constant/ColorTheme.ts @@ -22,7 +22,55 @@ const customBreakpoints = { xl: 1536, } -export const darkTheme = createTheme({ +const customRed = { + main: '#FF5833', + strong: '#FF5833', + normal: '#FF6D4D', + alternative: '#FF7D61', + tinted: '#FF6D4D33', +} + +const customBlue = { + main: '#3A5DCF', + strong: '#3A5DCF', + normal: '#4E6ED4', + alternative: '#6681DB', + tinted: '#4E6ED433', +} + +const customPurple = { + main: '#6F62FE', + strong: '#6F62FE', + normal: '#877CFE', + alternative: '#A39BFD', + tinted: '#877CFE33', +} + +const customGreen = { + main: '#489B08', + strong: '#489B08', + normal: '#53B309', + alternative: '#61CD0E', + tinted: '#53B30933', +} + +const customYellow = { + main: '#FFA805', + strong: '#FFA805', + normal: '#FFB01F', + alternative: '#FDBC44', + tinted: '#FFB01F33', +} + +const customPink = { + main: '#C44ECA', + strong: '#C44ECA', + normal: '#CB62D0', + alternative: '#D581D9', + tinted: '#CB62D033', +} + +const darkTheme = createTheme({ breakpoints: { values: customBreakpoints, }, @@ -65,7 +113,7 @@ export const darkTheme = createTheme({ }, }) -export const lightTheme = createTheme({ +const lightTheme = createTheme({ breakpoints: { values: customBreakpoints, }, @@ -107,3 +155,63 @@ export const lightTheme = createTheme({ }, }, }) + +if (darkTheme.palette) { + darkTheme.palette.red = darkTheme.palette.augmentColor({ + color: customRed, + name: 'red', + }) + darkTheme.palette.blue = darkTheme.palette.augmentColor({ + color: customBlue, + name: 'blue', + }) + darkTheme.palette.purple = darkTheme.palette.augmentColor({ + color: customPurple, + name: 'purple', + }) + darkTheme.palette.green = darkTheme.palette.augmentColor({ + color: customGreen, + name: 'green', + }) + darkTheme.palette.yellow = darkTheme.palette.augmentColor({ + color: customYellow, + name: 'yellow', + }) + darkTheme.palette.pink = darkTheme.palette.augmentColor({ + color: customPink, + name: 'pink', + }) + + darkTheme.palette.primary = darkTheme.palette.purple +} + +if (lightTheme.palette) { + lightTheme.palette.red = lightTheme.palette.augmentColor({ + color: customRed, + name: 'red', + }) + lightTheme.palette.blue = lightTheme.palette.augmentColor({ + color: customBlue, + name: 'blue', + }) + lightTheme.palette.purple = lightTheme.palette.augmentColor({ + color: customPurple, + name: 'purple', + }) + lightTheme.palette.green = lightTheme.palette.augmentColor({ + color: customGreen, + name: 'green', + }) + lightTheme.palette.yellow = lightTheme.palette.augmentColor({ + color: customYellow, + name: 'yellow', + }) + lightTheme.palette.pink = lightTheme.palette.augmentColor({ + color: customPink, + name: 'pink', + }) + + lightTheme.palette.primary = lightTheme.palette.purple +} + +export { lightTheme, darkTheme } diff --git a/src/hook/main-page/useFavoriteList.ts b/src/hook/main-page/useFavoriteList.ts new file mode 100644 index 000000000..474882e17 --- /dev/null +++ b/src/hook/main-page/useFavoriteList.ts @@ -0,0 +1,30 @@ +import useSWR from 'swr' +import { IFavorite } from '@/types/IPostDetail' +import useAuthStore from '@/states/useAuthStore' +import { AxiosInstance } from 'axios' +import useAxiosWithAuth from '@/api/config' +import useMainOptions from '@/hook/main-page/useMainOptions' + +const useFavoriteList = () => { + //option, isInit 받아오기 + const { isLogin } = useAuthStore() + const axiosInstance: AxiosInstance = useAxiosWithAuth() + const { isInit, optionsQuery } = useMainOptions() + + const { data: favoriteData } = useSWR( + isInit && isLogin + ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorites` + + optionsQuery + : null, + (url: string) => axiosInstance.get(url).then((res) => res.data), + ) + + const getFavoriteData = (recruit_id: number) => { + const res = favoriteData?.find((data) => data?.recruit_id === recruit_id) + return res?.favorite + } + + return { getFavoriteData } +} + +export default useFavoriteList diff --git a/src/hook/main-page/useMainCards.ts b/src/hook/main-page/useMainCards.ts new file mode 100644 index 000000000..9746f0b64 --- /dev/null +++ b/src/hook/main-page/useMainCards.ts @@ -0,0 +1,39 @@ +import { IPagination } from '@/types/IPagination' +import { IPost } from '@/types/IPostDetail' +import useSWR from 'swr' +import { defaultGetFetcher } from '@/api/fetchers' +import useMainOptions from '@/hook/main-page/useMainOptions' +import useAuthStore from '@/states/useAuthStore' +import useAxiosWithAuth from '@/api/config' + +const useMainCards = (initData: IPagination) => { + const { optionsQuery } = useMainOptions() + const { isLogin } = useAuthStore() + const axiosInstance = useAxiosWithAuth() + + const { data, isLoading, error } = useSWR>( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit` + optionsQuery, + isLogin + ? (url: string) => + axiosInstance.get(url).then((res) => { + return res.data + }) + : defaultGetFetcher, + { + fallbackData: initData, + keepPreviousData: true, + }, + ) + + const noContent = !isLoading + ? error + ? '에러 발생' + : data?.content?.length == 0 + ? '데이터가 없습니다' + : null + : null + + return { data, isLoading, error, noContent } +} + +export default useMainCards diff --git a/src/hook/main-page/useMainOptions.ts b/src/hook/main-page/useMainOptions.ts new file mode 100644 index 000000000..d9497e2aa --- /dev/null +++ b/src/hook/main-page/useMainOptions.ts @@ -0,0 +1,117 @@ +import useMainOptionsStore from '@/states/main-page/useMainOptionsStore' +import { useCallback, useEffect } from 'react' +import { ProjectType } from '@/types/IPostDetail' +import { ProjectSort } from '@/app/panel/MainPage' +import { useRouter, useSearchParams } from 'next/navigation' +import { IDetailOption } from '@/types/IMainOptions' + +const useMainOptions = () => { + const { + type, + sort, + page, + init, + detailOption, + setPage, + setInit, + setSort, + setType, + setDetailOptions, + } = useMainOptionsStore() + const searchParams = useSearchParams() + const queryKeyword = searchParams.get('keyword') ?? '' + const searchType = + searchParams.get('type') === 'PROJECT' ? 'PROJECT' : 'STUDY' + const router = useRouter() + + const dueObject: { [key: number]: string } = { + 0: '1주일', + 20: '1개월', + 40: '3개월', + 60: '6개월', + 80: '9개월', + 100: '12개월 이상', + } + + //option 설정하기 + const pageSize = 6 + + const optionsQuery = `?type=${type ?? 'STUDY'}&sort=${ + sort ?? 'latest' + }&page=${page}&pageSize=${pageSize}&keyword=${queryKeyword}&due=${ + dueObject[detailOption.due1] + }&due=${dueObject[detailOption.due2]}®ion1=${ + detailOption.region1 + }®ion2=${detailOption.region2}&place=${detailOption.place}&status=${ + detailOption.status + }&tag=${detailOption.tag}` + + const isInit = + page == 1 && !sort && detailOption.isInit && queryKeyword == '' && init + + useEffect(() => { + if (queryKeyword !== '') { + setType(searchType) + setInit(false) + } + }, [queryKeyword, searchType]) + + const handleType = useCallback( + (value: ProjectType) => { + setInit(false) + setType(value) + //type이 변경될 경우 초기화 + setPage(1) + setDetailOptions({ + ...detailOption, + due1: 0, + due2: 100, + region1: '', + region2: '', + place: '', + status: '', + tag: '', + }) + setSort('latest') + router.replace(`?type=${value}`) + }, + [router], + ) + + const handleSort = useCallback( + (value: ProjectSort) => { + setSort(value) + setPage(1) + }, + [setPage, setSort], + ) + + const handleOption = useCallback( + (value: IDetailOption) => { + setDetailOptions({ ...detailOption, ...value }) + setPage(1) + }, + [detailOption, setDetailOptions, setPage], + ) + + const handleChangePage = (_: any, newPage: number) => { + setPage(newPage) + } + + return { + optionsQuery, + isInit, + handleSort, + handleType, + handleChangePage, + handleOption, + type, + sort, + page, + init, + detailOption, + queryKeyword, + } +} + +export default useMainOptions diff --git a/src/icons/AllIcons.tsx b/src/icons/AllIcons.tsx new file mode 100644 index 000000000..89dc0f2aa --- /dev/null +++ b/src/icons/AllIcons.tsx @@ -0,0 +1,71 @@ +import * as Icons from '@/icons' +import * as MyPageIcons from '@/icons/MyPage' +import * as NavIcons from '@/icons/Nav' +import * as TeamPage from '@/icons/TeamPage' +import React from 'react' +import { Unstable_Grid2 as Grid, Typography } from '@mui/material' + +const AllIcons = () => { + return ( + + + + Icons + + {Object.values(Icons).map((IconComponent) => ( + + + + ))} + + + + MyPage Icons + + {Object.values(MyPageIcons).map((IconComponent) => ( + + + + ))} + + + + Navigation Icons + + {Object.values(NavIcons).map((IconComponent) => ( + + + + ))} + + + + Team Page Icons + + {Object.values(TeamPage).map((IconComponent) => ( + + + + ))} + + + ) +} + +export default AllIcons diff --git a/src/states/main-page/useMainOptionsStore.ts b/src/states/main-page/useMainOptionsStore.ts new file mode 100644 index 000000000..b1a51b12e --- /dev/null +++ b/src/states/main-page/useMainOptionsStore.ts @@ -0,0 +1,33 @@ +import { create } from 'zustand' +import { IMainOptionsStore } from '@/types/IMainOptions' + +const useMainOptionsStore = create((set) => { + return { + page: 1, + sort: 'latest', + type: 'STUDY', + init: true, + detailOption: { + isInit: true, + due1: 0, + due2: 100, + region1: '', + region2: '', + place: '', + status: '', + tag: '', + }, + openOption: false, + setPage: (page: number) => set(() => ({ page })), + setSort: (sort: any) => set(() => ({ sort })), + setType: (type: any) => set(() => ({ type })), + setInit: (init: boolean) => set(() => ({ init })), + setDetailOptions: (detailOption: any) => + set(() => { + return { detailOption } + }), + setOpenOption: (openOption: boolean) => set(() => ({ openOption })), + } +}) + +export default useMainOptionsStore diff --git a/src/states/useAlarmStorage.ts b/src/states/useAlarmStorage.ts index 5095c14f4..5a8e45ca2 100644 --- a/src/states/useAlarmStorage.ts +++ b/src/states/useAlarmStorage.ts @@ -22,8 +22,7 @@ export interface IAlarm { interface IStoreAlarmState { isNew: boolean - - isNewAlarm: (isLogin: boolean) => void + isNewAlarm: (isLogin: boolean, accessToken: string) => void checkNewAlarm: () => void alarms: IAlarm[] resetAlarms: () => void @@ -37,7 +36,7 @@ const useAlarmStorage = create((set) => { return { isNew: false, - isNewAlarm: (isLogin: boolean) => { + isNewAlarm: (isLogin: boolean, accessToken: string) => { if (!isLogin) { return } diff --git a/src/stories/AllIcons.stories.tsx b/src/stories/AllIcons.stories.tsx new file mode 100644 index 000000000..5f13dd1ad --- /dev/null +++ b/src/stories/AllIcons.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' +import AllIcons from '@/icons/AllIcons' + +const meta: Meta = { + component: AllIcons, +} +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/stories/Button.stories.ts b/src/stories/Button.stories.ts deleted file mode 100644 index 2d33eca55..000000000 --- a/src/stories/Button.stories.ts +++ /dev/null @@ -1,50 +0,0 @@ -// import type { Meta, StoryObj } from '@storybook/react'; - -// // import { Button } from './Button'; - -// // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export -// const meta = { -// title: 'Example/Button', -// component: Button, -// parameters: { -// // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout -// layout: 'centered', -// }, -// // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs -// tags: ['autodocs'], -// // More on argTypes: https://storybook.js.org/docs/api/argtypes -// argTypes: { -// backgroundColor: { control: 'color' }, -// }, -// } satisfies Meta; - -// export default meta; -// type Story = StoryObj; - -// // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args -// export const Primary: Story = { -// args: { -// primary: true, -// label: 'Button', -// }, -// }; - -// export const Secondary: Story = { -// args: { -// label: 'Button', -// }, -// }; - -// export const Large: Story = { -// args: { -// size: 'large', -// label: 'Button', -// }, -// }; - -// export const Small: Story = { -// args: { -// size: 'small', -// label: 'Button', -// }, -// }; diff --git a/src/stories/Button.tsx b/src/stories/Button.tsx deleted file mode 100644 index affd8c342..000000000 --- a/src/stories/Button.tsx +++ /dev/null @@ -1,56 +0,0 @@ -// import React from 'react' -// import './button.css' - -// interface ButtonProps { -// /** -// * Is this the principal call to action on the page? -// */ -// primary?: boolean -// /** -// * What background color to use -// */ -// backgroundColor?: string -// /** -// * How large should the button be? -// */ -// size?: 'small' | 'medium' | 'large' -// /** -// * Button contents -// */ -// label: string -// /** -// * Optional click handler -// */ -// onClick?: () => void -// } - -// /** -// * Primary UI component for user interaction -// */ -// export const Button = ({ -// primary = false, -// size = 'medium', -// backgroundColor, -// label, -// ...props -// }: ButtonProps) => { -// const mode = primary -// ? 'storybook-button--primary' -// : 'storybook-button--secondary' -// return ( -// -// ) -// } diff --git a/src/stories/button.css b/src/stories/button.css deleted file mode 100644 index dc91dc763..000000000 --- a/src/stories/button.css +++ /dev/null @@ -1,30 +0,0 @@ -.storybook-button { - font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-weight: 700; - border: 0; - border-radius: 3em; - cursor: pointer; - display: inline-block; - line-height: 1; -} -.storybook-button--primary { - color: white; - background-color: #1ea7fd; -} -.storybook-button--secondary { - color: #333; - background-color: transparent; - box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 0px 1px inset; -} -.storybook-button--small { - font-size: 12px; - padding: 10px 16px; -} -.storybook-button--medium { - font-size: 14px; - padding: 11px 20px; -} -.storybook-button--large { - font-size: 16px; - padding: 12px 24px; -} diff --git a/src/stories/icons/AccountBox.stories.tsx b/src/stories/icons/AccountBox.stories.tsx new file mode 100644 index 000000000..c96a0273a --- /dev/null +++ b/src/stories/icons/AccountBox.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { AccountBox } from '@/icons' + + const meta: Meta = { + component: AccountBox, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ArrowDown.stories.tsx b/src/stories/icons/ArrowDown.stories.tsx new file mode 100644 index 000000000..2ee096104 --- /dev/null +++ b/src/stories/icons/ArrowDown.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ArrowDown } from '@/icons' + + const meta: Meta = { + component: ArrowDown, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ArrowUp.stories.tsx b/src/stories/icons/ArrowUp.stories.tsx new file mode 100644 index 000000000..fa39fbf8d --- /dev/null +++ b/src/stories/icons/ArrowUp.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ArrowUp } from '@/icons' + + const meta: Meta = { + component: ArrowUp, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/CheckBoxEmpty.stories.tsx b/src/stories/icons/CheckBoxEmpty.stories.tsx new file mode 100644 index 000000000..fe285c4da --- /dev/null +++ b/src/stories/icons/CheckBoxEmpty.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { CheckBoxEmpty } from '@/icons' + + const meta: Meta = { + component: CheckBoxEmpty, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/CheckBoxSelected.stories.tsx b/src/stories/icons/CheckBoxSelected.stories.tsx new file mode 100644 index 000000000..5414ca747 --- /dev/null +++ b/src/stories/icons/CheckBoxSelected.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { CheckBoxSelected } from '@/icons' + + const meta: Meta = { + component: CheckBoxSelected, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ChevronDown.stories.tsx b/src/stories/icons/ChevronDown.stories.tsx new file mode 100644 index 000000000..906795db3 --- /dev/null +++ b/src/stories/icons/ChevronDown.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ChevronDown } from '@/icons' + + const meta: Meta = { + component: ChevronDown, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ChevronLeft.stories.tsx b/src/stories/icons/ChevronLeft.stories.tsx new file mode 100644 index 000000000..48aadc49b --- /dev/null +++ b/src/stories/icons/ChevronLeft.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ChevronLeft } from '@/icons' + + const meta: Meta = { + component: ChevronLeft, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ChevronRight.stories.tsx b/src/stories/icons/ChevronRight.stories.tsx new file mode 100644 index 000000000..6290c2374 --- /dev/null +++ b/src/stories/icons/ChevronRight.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ChevronRight } from '@/icons' + + const meta: Meta = { + component: ChevronRight, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ClipboardIcon.stories.tsx b/src/stories/icons/ClipboardIcon.stories.tsx new file mode 100644 index 000000000..1344c0590 --- /dev/null +++ b/src/stories/icons/ClipboardIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ClipboardIcon } from '@/icons' + + const meta: Meta = { + component: ClipboardIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/CloseIcon.stories.tsx b/src/stories/icons/CloseIcon.stories.tsx new file mode 100644 index 000000000..199e60746 --- /dev/null +++ b/src/stories/icons/CloseIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { CloseIcon } from '@/icons' + + const meta: Meta = { + component: CloseIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/EditIcon.stories.tsx b/src/stories/icons/EditIcon.stories.tsx new file mode 100644 index 000000000..62304adc6 --- /dev/null +++ b/src/stories/icons/EditIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { EditIcon } from '@/icons' + + const meta: Meta = { + component: EditIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/FileIcon.stories.tsx b/src/stories/icons/FileIcon.stories.tsx new file mode 100644 index 000000000..db6aca83d --- /dev/null +++ b/src/stories/icons/FileIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { FileIcon } from '@/icons' + + const meta: Meta = { + component: FileIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/FolderPlusIcon.stories.tsx b/src/stories/icons/FolderPlusIcon.stories.tsx new file mode 100644 index 000000000..db2ee86cb --- /dev/null +++ b/src/stories/icons/FolderPlusIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { FolderPlusIcon } from '@/icons' + + const meta: Meta = { + component: FolderPlusIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/GroupIcon.stories.tsx b/src/stories/icons/GroupIcon.stories.tsx new file mode 100644 index 000000000..742fddb11 --- /dev/null +++ b/src/stories/icons/GroupIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { GroupIcon } from '@/icons' + + const meta: Meta = { + component: GroupIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ImageIcon.stories.tsx b/src/stories/icons/ImageIcon.stories.tsx new file mode 100644 index 000000000..bc2083ab4 --- /dev/null +++ b/src/stories/icons/ImageIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ImageIcon } from '@/icons' + + const meta: Meta = { + component: ImageIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/LinkDiagonalIcon.stories.tsx b/src/stories/icons/LinkDiagonalIcon.stories.tsx new file mode 100644 index 000000000..641bde2bc --- /dev/null +++ b/src/stories/icons/LinkDiagonalIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { LinkDiagonalIcon } from '@/icons' + + const meta: Meta = { + component: LinkDiagonalIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/LinkIcon.stories.tsx b/src/stories/icons/LinkIcon.stories.tsx new file mode 100644 index 000000000..0198ba5b3 --- /dev/null +++ b/src/stories/icons/LinkIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { LinkIcon } from '@/icons' + + const meta: Meta = { + component: LinkIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ListIcon.stories.tsx b/src/stories/icons/ListIcon.stories.tsx new file mode 100644 index 000000000..8be106692 --- /dev/null +++ b/src/stories/icons/ListIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ListIcon } from '@/icons' + + const meta: Meta = { + component: ListIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/LocationIcon.stories.tsx b/src/stories/icons/LocationIcon.stories.tsx new file mode 100644 index 000000000..b67092d19 --- /dev/null +++ b/src/stories/icons/LocationIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { LocationIcon } from '@/icons' + + const meta: Meta = { + component: LocationIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MoreHorizontalIcon.stories.tsx b/src/stories/icons/MoreHorizontalIcon.stories.tsx new file mode 100644 index 000000000..a9dc434a2 --- /dev/null +++ b/src/stories/icons/MoreHorizontalIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { MoreHorizontalIcon } from '@/icons' + + const meta: Meta = { + component: MoreHorizontalIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MyPage/HeartIcon.stories.tsx b/src/stories/icons/MyPage/HeartIcon.stories.tsx new file mode 100644 index 000000000..842d53844 --- /dev/null +++ b/src/stories/icons/MyPage/HeartIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { HeartIcon } from '@/icons/MyPage' + + const meta: Meta = { + component: HeartIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MyPage/MessageIcon.stories.tsx b/src/stories/icons/MyPage/MessageIcon.stories.tsx new file mode 100644 index 000000000..07e2674ac --- /dev/null +++ b/src/stories/icons/MyPage/MessageIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { MessageIcon } from '@/icons/MyPage' + + const meta: Meta = { + component: MessageIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MyPage/SettingIcon.stories.tsx b/src/stories/icons/MyPage/SettingIcon.stories.tsx new file mode 100644 index 000000000..7b843e0b6 --- /dev/null +++ b/src/stories/icons/MyPage/SettingIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SettingIcon } from '@/icons/MyPage' + + const meta: Meta = { + component: SettingIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MyPage/SilhouetteIcon.stories.tsx b/src/stories/icons/MyPage/SilhouetteIcon.stories.tsx new file mode 100644 index 000000000..9987a04cb --- /dev/null +++ b/src/stories/icons/MyPage/SilhouetteIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SilhouetteIcon } from '@/icons/MyPage' + + const meta: Meta = { + component: SilhouetteIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/MyPage/WhaleIcon.stories.tsx b/src/stories/icons/MyPage/WhaleIcon.stories.tsx new file mode 100644 index 000000000..9f0e984d6 --- /dev/null +++ b/src/stories/icons/MyPage/WhaleIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { WhaleIcon } from '@/icons/MyPage' + + const meta: Meta = { + component: WhaleIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/BackIcon.stories.tsx b/src/stories/icons/Nav/BackIcon.stories.tsx new file mode 100644 index 000000000..07ed8357b --- /dev/null +++ b/src/stories/icons/Nav/BackIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { BackIcon } from '@/icons/Nav' + + const meta: Meta = { + component: BackIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/HitchIcon.stories.tsx b/src/stories/icons/Nav/HitchIcon.stories.tsx new file mode 100644 index 000000000..42293d4cb --- /dev/null +++ b/src/stories/icons/Nav/HitchIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { HitchIcon } from '@/icons/Nav' + + const meta: Meta = { + component: HitchIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/MyPageIcon.stories.tsx b/src/stories/icons/Nav/MyPageIcon.stories.tsx new file mode 100644 index 000000000..18f567fac --- /dev/null +++ b/src/stories/icons/Nav/MyPageIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { MyPageIcon } from '@/icons/Nav' + + const meta: Meta = { + component: MyPageIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/RecruitIcon.stories.tsx b/src/stories/icons/Nav/RecruitIcon.stories.tsx new file mode 100644 index 000000000..9dbd88985 --- /dev/null +++ b/src/stories/icons/Nav/RecruitIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { RecruitIcon } from '@/icons/Nav' + + const meta: Meta = { + component: RecruitIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/ShowcaseIcon.stories.tsx b/src/stories/icons/Nav/ShowcaseIcon.stories.tsx new file mode 100644 index 000000000..6ac671b43 --- /dev/null +++ b/src/stories/icons/Nav/ShowcaseIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ShowcaseIcon } from '@/icons/Nav' + + const meta: Meta = { + component: ShowcaseIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/Nav/TeamsIcon.stories.tsx b/src/stories/icons/Nav/TeamsIcon.stories.tsx new file mode 100644 index 000000000..ffa34fd22 --- /dev/null +++ b/src/stories/icons/Nav/TeamsIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TeamsIcon } from '@/icons/Nav' + + const meta: Meta = { + component: TeamsIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/NotificationIcon.stories.tsx b/src/stories/icons/NotificationIcon.stories.tsx new file mode 100644 index 000000000..54108cb3f --- /dev/null +++ b/src/stories/icons/NotificationIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { NotificationIcon } from '@/icons' + + const meta: Meta = { + component: NotificationIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/PictureIcon.stories.tsx b/src/stories/icons/PictureIcon.stories.tsx new file mode 100644 index 000000000..4304e2bd4 --- /dev/null +++ b/src/stories/icons/PictureIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { PictureIcon } from '@/icons' + + const meta: Meta = { + component: PictureIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/PieChartIcon.stories.tsx b/src/stories/icons/PieChartIcon.stories.tsx new file mode 100644 index 000000000..99a744626 --- /dev/null +++ b/src/stories/icons/PieChartIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { PieChartIcon } from '@/icons' + + const meta: Meta = { + component: PieChartIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/PlusIcon.stories.tsx b/src/stories/icons/PlusIcon.stories.tsx new file mode 100644 index 000000000..ce8268404 --- /dev/null +++ b/src/stories/icons/PlusIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { PlusIcon } from '@/icons' + + const meta: Meta = { + component: PlusIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ReportIcon.stories.tsx b/src/stories/icons/ReportIcon.stories.tsx new file mode 100644 index 000000000..d7cd5ca71 --- /dev/null +++ b/src/stories/icons/ReportIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ReportIcon } from '@/icons' + + const meta: Meta = { + component: ReportIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/SearchIcon.stories.tsx b/src/stories/icons/SearchIcon.stories.tsx new file mode 100644 index 000000000..d324bbf5b --- /dev/null +++ b/src/stories/icons/SearchIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SearchIcon } from '@/icons' + + const meta: Meta = { + component: SearchIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/SelectedRadioButton.stories.tsx b/src/stories/icons/SelectedRadioButton.stories.tsx new file mode 100644 index 000000000..1eb634df6 --- /dev/null +++ b/src/stories/icons/SelectedRadioButton.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SelectedRadioButton } from '@/icons' + + const meta: Meta = { + component: SelectedRadioButton, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/SendIcon.stories.tsx b/src/stories/icons/SendIcon.stories.tsx new file mode 100644 index 000000000..1c456f704 --- /dev/null +++ b/src/stories/icons/SendIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SendIcon } from '@/icons' + + const meta: Meta = { + component: SendIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/ShareIcon.stories.tsx b/src/stories/icons/ShareIcon.stories.tsx new file mode 100644 index 000000000..cbe697e91 --- /dev/null +++ b/src/stories/icons/ShareIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ShareIcon } from '@/icons' + + const meta: Meta = { + component: ShareIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TagIcon.stories.tsx b/src/stories/icons/TagIcon.stories.tsx new file mode 100644 index 000000000..06ce88890 --- /dev/null +++ b/src/stories/icons/TagIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TagIcon } from '@/icons' + + const meta: Meta = { + component: TagIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/BoardIcon.stories.tsx b/src/stories/icons/TeamPage/BoardIcon.stories.tsx new file mode 100644 index 000000000..1d8766200 --- /dev/null +++ b/src/stories/icons/TeamPage/BoardIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { BoardIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: BoardIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/MainIcon.stories.tsx b/src/stories/icons/TeamPage/MainIcon.stories.tsx new file mode 100644 index 000000000..9e169a17e --- /dev/null +++ b/src/stories/icons/TeamPage/MainIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { MainIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: MainIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/NoticeIcon.stories.tsx b/src/stories/icons/TeamPage/NoticeIcon.stories.tsx new file mode 100644 index 000000000..768f9f2fe --- /dev/null +++ b/src/stories/icons/TeamPage/NoticeIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { NoticeIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: NoticeIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/PeerlogIcon.stories.tsx b/src/stories/icons/TeamPage/PeerlogIcon.stories.tsx new file mode 100644 index 000000000..77472cfd5 --- /dev/null +++ b/src/stories/icons/TeamPage/PeerlogIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { PeerlogIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: PeerlogIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/SettingIcon.stories.tsx b/src/stories/icons/TeamPage/SettingIcon.stories.tsx new file mode 100644 index 000000000..d07d175a5 --- /dev/null +++ b/src/stories/icons/TeamPage/SettingIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { SettingIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: SettingIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TeamPage/ShowcaseIcon.stories.tsx b/src/stories/icons/TeamPage/ShowcaseIcon.stories.tsx new file mode 100644 index 000000000..9b2c5d5c2 --- /dev/null +++ b/src/stories/icons/TeamPage/ShowcaseIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { ShowcaseIcon } from '@/icons/TeamPage' + + const meta: Meta = { + component: ShowcaseIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TimeIcon.stories.tsx b/src/stories/icons/TimeIcon.stories.tsx new file mode 100644 index 000000000..99a7bd320 --- /dev/null +++ b/src/stories/icons/TimeIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TimeIcon } from '@/icons' + + const meta: Meta = { + component: TimeIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TrashIcon.stories.tsx b/src/stories/icons/TrashIcon.stories.tsx new file mode 100644 index 000000000..b40d0b034 --- /dev/null +++ b/src/stories/icons/TrashIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TrashIcon } from '@/icons' + + const meta: Meta = { + component: TrashIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TrashLineIcon.stories.tsx b/src/stories/icons/TrashLineIcon.stories.tsx new file mode 100644 index 000000000..44e20a6cf --- /dev/null +++ b/src/stories/icons/TrashLineIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TrashLineIcon } from '@/icons' + + const meta: Meta = { + component: TrashLineIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/TwoPeopleIcon.stories.tsx b/src/stories/icons/TwoPeopleIcon.stories.tsx new file mode 100644 index 000000000..e3839a40d --- /dev/null +++ b/src/stories/icons/TwoPeopleIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { TwoPeopleIcon } from '@/icons' + + const meta: Meta = { + component: TwoPeopleIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/UnCheckedCheckBox.stories.tsx b/src/stories/icons/UnCheckedCheckBox.stories.tsx new file mode 100644 index 000000000..5a0c4737b --- /dev/null +++ b/src/stories/icons/UnCheckedCheckBox.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { UnCheckedCheckBox } from '@/icons' + + const meta: Meta = { + component: UnCheckedCheckBox, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/UnSelectedRadioButton.stories.tsx b/src/stories/icons/UnSelectedRadioButton.stories.tsx new file mode 100644 index 000000000..f7d107948 --- /dev/null +++ b/src/stories/icons/UnSelectedRadioButton.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { UnSelectedRadioButton } from '@/icons' + + const meta: Meta = { + component: UnSelectedRadioButton, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/UserCheckIcon.stories.tsx b/src/stories/icons/UserCheckIcon.stories.tsx new file mode 100644 index 000000000..ca41804c7 --- /dev/null +++ b/src/stories/icons/UserCheckIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { UserCheckIcon } from '@/icons' + + const meta: Meta = { + component: UserCheckIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/icons/WifiIcon.stories.tsx b/src/stories/icons/WifiIcon.stories.tsx new file mode 100644 index 000000000..2d9d8d617 --- /dev/null +++ b/src/stories/icons/WifiIcon.stories.tsx @@ -0,0 +1,11 @@ +import type { Meta, StoryObj } from '@storybook/react' + import { WifiIcon } from '@/icons' + + const meta: Meta = { + component: WifiIcon, + } + export default meta + + type Story = StoryObj + + export const Default: Story = {} diff --git a/src/stories/images/CuAvatar.stories.tsx b/src/stories/images/CuAvatar.stories.tsx new file mode 100644 index 000000000..34843f7ab --- /dev/null +++ b/src/stories/images/CuAvatar.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import CuAvatar from '../../components/CuAvatar' + +const meta: Meta = { + component: CuAvatar, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + src: 'https://picsum.photos/32', + }, +} + +export const Fallback: Story = {} diff --git a/src/stories/images/CuPhotoBox.stories.tsx b/src/stories/images/CuPhotoBox.stories.tsx new file mode 100644 index 000000000..2b1dd7a72 --- /dev/null +++ b/src/stories/images/CuPhotoBox.stories.tsx @@ -0,0 +1,34 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import CuPhotoBox from '@/components/CuPhotoBox' + +const meta: Meta = { + component: CuPhotoBox, + decorators: [ + (Story: any) => { + return ( +
+ +
+ ) + }, + ], +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + src: 'https://picsum.photos/300/200', + alt: 'Image', + }, +} + +export const Fallback: Story = { + args: { + src: 'not found image url', + alt: 'Image', + }, +} diff --git a/src/stories/inputs/ControlledSelect.stories.tsx b/src/stories/inputs/ControlledSelect.stories.tsx new file mode 100644 index 000000000..a4258389b --- /dev/null +++ b/src/stories/inputs/ControlledSelect.stories.tsx @@ -0,0 +1,58 @@ +import type { Meta, StoryObj } from '@storybook/react' +import ControlledSelect from '@/components/ControlledSelect' +import { MenuItem } from '@mui/material' +import WithRHF from '../utils/WithRHF' + +const meta: Meta = { + component: ControlledSelect, + decorators: [WithRHF(false)], +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + name: 'name', + sx: { + height: '2rem', + backgroundColor: 'background.tertiary', + color: 'text.alternative', + size: '12px', + align: 'center', + lineHeight: '18px', + fontWeight: 400, + }, + placeholder: '선택지를 입력해주세요.', + variant: 'outlined', + children: [ + + menu item 1 + , + + menu item 2 + , + ], + }, +} diff --git a/src/stories/inputs/ControlledTextfield.stories.tsx b/src/stories/inputs/ControlledTextfield.stories.tsx new file mode 100644 index 000000000..2f18038da --- /dev/null +++ b/src/stories/inputs/ControlledTextfield.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import ControlledTextfield from '@/components/ControlledTextfield' +import WithRHF from '../utils/WithRHF' + +const meta: Meta = { + component: ControlledTextfield, + decorators: [WithRHF(false)], +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + name: 'name', + }, +} diff --git a/src/stories/utils/WithRHF.tsx b/src/stories/utils/WithRHF.tsx new file mode 100644 index 000000000..2da17b46d --- /dev/null +++ b/src/stories/utils/WithRHF.tsx @@ -0,0 +1,31 @@ +import { action } from '@storybook/addon-actions' +import { StoryFn } from '@storybook/react' +import { ReactElement, ReactNode, FC } from 'react' +import { FormProvider, useForm } from 'react-hook-form' + +// https://gist.github.com/shumbo/3bbb8a2dea5ea0a90ecf0b7c103783e8 copied from here + +const StorybookFormProvider: FC<{ children: ReactNode }> = ({ children }) => { + const methods = useForm() + return ( + +
+ {children} +
+
+ ) +} + +const WithRHF = + (showSubmitButton: boolean) => + (Story: FC): ReturnType> => + ( + + + {showSubmitButton && } + + ) as ReturnType> + +export default WithRHF diff --git a/src/types/DeviceTypes.ts b/src/types/DeviceTypes.ts new file mode 100644 index 000000000..20a9831bf --- /dev/null +++ b/src/types/DeviceTypes.ts @@ -0,0 +1,7 @@ +export enum EDeviceType { + IPHONE = 'iOS', + ANDROID = 'android', + MACOS = 'Mac', + WINDOWS = 'Windows', + OTHER = 'Other', +} diff --git a/src/types/IMainOptions.ts b/src/types/IMainOptions.ts new file mode 100644 index 000000000..7e355e959 --- /dev/null +++ b/src/types/IMainOptions.ts @@ -0,0 +1,28 @@ +import { ProjectType } from '@/types/IPostDetail' +import { ProjectSort } from '@/app/panel/MainPage' + +export interface IDetailOption { + due1: number + due2: number + region1: string + region2: string + place: string + status: string + tag: string + isInit?: boolean +} + +export interface IMainOptionsStore { + page: number + sort: ProjectSort + type: ProjectType + init: boolean + openOption: boolean + setPage: (page: number) => void + setSort: (sort: ProjectSort) => void + setType: (type: ProjectType) => void + setInit: (init: boolean) => void + detailOption: IDetailOption + setDetailOptions: (detailOption: IDetailOption) => void + setOpenOption: (openOption: boolean) => void +} diff --git a/src/utils/gtag.tsx b/src/utils/gtag.tsx new file mode 100644 index 000000000..e0b14d16e --- /dev/null +++ b/src/utils/gtag.tsx @@ -0,0 +1,24 @@ +import Script from 'next/script' + +const GoogleAnalytics = ({ ga_id }: { ga_id: string }) => ( + <> + + + +) +export default GoogleAnalytics