diff --git a/eslint.config.mjs b/eslint.config.mjs index 83e6cc3b04a..c9e482b5718 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,3 +1,6 @@ +// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format +import storybook from 'eslint-plugin-storybook'; + import eslint from '@eslint/js'; import configPrettier from 'eslint-config-prettier'; import configTurbo from 'eslint-config-turbo/flat'; @@ -89,374 +92,380 @@ const noNavigateUseClerk = { }, }; -export default tseslint.config([ - { - name: 'repo/ignores', - ignores: [ - '.cache', - '.idea', - '.next', - '.turbo', - '.vscode', - '.yalc', - '!.*.js', - '**/.turbo/*', - '**/build/*', - '**/coverage/*', - '**/dist/*', - '**/integration/templates/**/*', - '**/node_modules/**', - '*.snap', - 'commitlint.config.ts', - 'packages/*/dist/**', - 'packages/*/examples', - 'playground/*', - 'pnpm-lock.json', - 'eslint.config.mjs', - 'typedoc.config.mjs', - 'vitest.workspace.mjs', - // package specific ignores - 'packages/astro/src/astro-components/**/*.ts', - 'packages/backend/src/runtime/**/*', - 'packages/clerk-js/rspack.config.js', - 'packages/shared/src/compiled/path-to-regexp/index.js', - ], - }, - { - name: 'repo/react-settings', - settings: { - react: { - version: 'detect', - }, +export default tseslint.config( + [ + { + name: 'repo/ignores', + ignores: [ + '.cache', + '.idea', + '.next', + '.turbo', + '.vscode', + '.yalc', + '!.*.js', + '**/.turbo/*', + '**/build/*', + '**/coverage/*', + '**/dist/*', + '**/integration/templates/**/*', + '**/node_modules/**', + '*.snap', + 'commitlint.config.ts', + 'packages/*/dist/**', + 'packages/*/examples', + 'playground/*', + 'pnpm-lock.json', + 'eslint.config.mjs', + 'typedoc.config.mjs', + 'vitest.workspace.mjs', + // package specific ignores + 'packages/astro/src/astro-components/**/*.ts', + 'packages/backend/src/runtime/**/*', + 'packages/clerk-js/rspack.config.js', + 'packages/shared/src/compiled/path-to-regexp/index.js', + ], }, - }, - { - name: 'repo/language-options', - languageOptions: { - ecmaVersion: ECMA_VERSION, - globals: { - ...globals.browser, - ...globals.node, - }, - parserOptions: { - projectService: true, - tsconfigRootDir: import.meta.dirname, + { + name: 'repo/react-settings', + settings: { + react: { + version: 'detect', + }, }, - sourceType: 'module', - }, - }, - { - name: 'repo/linter-options', - linterOptions: { - reportUnusedDisableDirectives: 'error', }, - }, - eslint.configs.recommended, - tseslint.configs.recommendedTypeChecked, - ...configTurbo, - pluginImport.flatConfigs.recommended, - pluginJsxA11y.flatConfigs.recommended, - pluginReact.configs.flat.recommended, - { - name: 'repo/global', - plugins: { - 'simple-import-sort': pluginSimpleImportSort, - 'unused-imports': pluginUnusedImports, - turbo: pluginTurbo, - }, - settings: { - 'import/ignore': ['node_modules/react-native/index\\.js$'], - 'import/resolver': { - node: true, - typescript: { - alwaysTryTypes: true, - project: ['packages/*/tsconfig.json', 'integration/tsconfig.json'], + { + name: 'repo/language-options', + languageOptions: { + ecmaVersion: ECMA_VERSION, + globals: { + ...globals.browser, + ...globals.node, + }, + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, }, + sourceType: 'module', + }, + }, + { + name: 'repo/linter-options', + linterOptions: { + reportUnusedDisableDirectives: 'error', }, }, - rules: { - curly: ['error', 'all'], - 'no-label-var': 'error', - 'no-undef-init': 'warn', - 'no-restricted-imports': [ - 'error', - { - paths: [ - { - message: "Please always import from '@clerk/shared/' instead of '@clerk/shared'.", - name: '@clerk/shared', - }, - ], - patterns: [ - { - group: ['!@clerk/shared/*'], - message: 'ignore this line -- eslint matching workaround to allow all imports except @clerk/shared', - }, - { - group: ['@emotion/*'], - message: - 'Please do not import emotion directly. Import helpers from ./design-system or ./primitives instead.', - }, - ], + eslint.configs.recommended, + tseslint.configs.recommendedTypeChecked, + ...configTurbo, + pluginImport.flatConfigs.recommended, + pluginJsxA11y.flatConfigs.recommended, + pluginReact.configs.flat.recommended, + { + name: 'repo/global', + plugins: { + 'simple-import-sort': pluginSimpleImportSort, + 'unused-imports': pluginUnusedImports, + turbo: pluginTurbo, + }, + settings: { + 'import/ignore': ['node_modules/react-native/index\\.js$'], + 'import/resolver': { + node: true, + typescript: { + alwaysTryTypes: true, + project: ['packages/*/tsconfig.json', 'integration/tsconfig.json'], + }, }, - ], + }, + rules: { + curly: ['error', 'all'], + 'no-label-var': 'error', + 'no-undef-init': 'warn', + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + message: "Please always import from '@clerk/shared/' instead of '@clerk/shared'.", + name: '@clerk/shared', + }, + ], + patterns: [ + { + group: ['!@clerk/shared/*'], + message: 'ignore this line -- eslint matching workaround to allow all imports except @clerk/shared', + }, + { + group: ['@emotion/*'], + message: + 'Please do not import emotion directly. Import helpers from ./design-system or ./primitives instead.', + }, + ], + }, + ], - 'jsx-a11y/no-onchange': 'off', + 'jsx-a11y/no-onchange': 'off', - 'react/button-has-type': 'warn', - 'react/function-component-definition': 'off', - 'react/hook-use-state': 'warn', - 'react/jsx-boolean-value': 'warn', - 'react/jsx-curly-brace-presence': 'warn', - 'react/jsx-fragments': 'warn', - 'react/jsx-no-leaked-render': 'warn', - 'react/jsx-no-target-blank': [ - 'error', - { - allowReferrer: true, - }, - ], - 'react/jsx-no-useless-fragment': ['warn', { allowExpressions: true }], - 'react/jsx-pascal-case': 'warn', - 'react/jsx-sort-props': 'warn', - 'react/no-array-index-key': 'warn', - 'react/no-unstable-nested-components': 'warn', - 'react/no-unknown-property': ['error', { ignore: ['css'] }], // Emotion - 'react/self-closing-comp': 'warn', - 'react/prop-types': 'off', - 'react/react-in-jsx-scope': 'off', + 'react/button-has-type': 'warn', + 'react/function-component-definition': 'off', + 'react/hook-use-state': 'warn', + 'react/jsx-boolean-value': 'warn', + 'react/jsx-curly-brace-presence': 'warn', + 'react/jsx-fragments': 'warn', + 'react/jsx-no-leaked-render': 'warn', + 'react/jsx-no-target-blank': [ + 'error', + { + allowReferrer: true, + }, + ], + 'react/jsx-no-useless-fragment': ['warn', { allowExpressions: true }], + 'react/jsx-pascal-case': 'warn', + 'react/jsx-sort-props': 'warn', + 'react/no-array-index-key': 'warn', + 'react/no-unstable-nested-components': 'warn', + 'react/no-unknown-property': ['error', { ignore: ['css'] }], // Emotion + 'react/self-closing-comp': 'warn', + 'react/prop-types': 'off', + 'react/react-in-jsx-scope': 'off', - 'simple-import-sort/imports': 'error', + 'simple-import-sort/imports': 'error', - 'sort-imports': 'off', + 'sort-imports': 'off', - ...pluginTurbo.configs['flat/recommended'].rules, + ...pluginTurbo.configs['flat/recommended'].rules, - 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-imports': 'error', - // TYPESCRIPT RULE DISABLES - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-declaration-merging': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/restrict-template-expressions': 'off', + // TYPESCRIPT RULE DISABLES + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-declaration-merging': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + }, }, - }, - { - name: 'repo/global-temporary', - rules: { - // TODO: All rules below should be set to their defaults - // when we're able to make the appropriate changes. - '@typescript-eslint/await-thenable': 'warn', - '@typescript-eslint/ban-ts-comment': [ - `warn`, - { - 'ts-ignore': 'allow-with-description', - 'ts-expect-error': 'allow-with-description', - 'ts-check': 'allow-with-description', - }, - ], - '@typescript-eslint/consistent-type-imports': [ - 'error', - { - prefer: 'type-imports', - disallowTypeAnnotations: true, - fixStyle: 'separate-type-imports', - }, - ], - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/no-floating-promises': [ - 'warn', - { - ignoreVoid: true, - }, - ], - '@typescript-eslint/no-misused-promises': 'warn', - '@typescript-eslint/no-redundant-type-constituents': 'warn', - '@typescript-eslint/no-unnecessary-type-assertion': 'warn', - '@typescript-eslint/no-unsafe-enum-comparison': 'warn', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - args: 'after-used', - argsIgnorePattern: '^_', - ignoreRestSiblings: true, - vars: 'all', - varsIgnorePattern: '^_', - }, - ], - '@typescript-eslint/prefer-promise-reject-errors': 'warn', - '@typescript-eslint/require-await': 'warn', + { + name: 'repo/global-temporary', + rules: { + // TODO: All rules below should be set to their defaults + // when we're able to make the appropriate changes. + '@typescript-eslint/await-thenable': 'warn', + '@typescript-eslint/ban-ts-comment': [ + `warn`, + { + 'ts-ignore': 'allow-with-description', + 'ts-expect-error': 'allow-with-description', + 'ts-check': 'allow-with-description', + }, + ], + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + disallowTypeAnnotations: true, + fixStyle: 'separate-type-imports', + }, + ], + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/no-floating-promises': [ + 'warn', + { + ignoreVoid: true, + }, + ], + '@typescript-eslint/no-misused-promises': 'warn', + '@typescript-eslint/no-redundant-type-constituents': 'warn', + '@typescript-eslint/no-unnecessary-type-assertion': 'warn', + '@typescript-eslint/no-unsafe-enum-comparison': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'after-used', + argsIgnorePattern: '^_', + ignoreRestSiblings: true, + vars: 'all', + varsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/prefer-promise-reject-errors': 'warn', + '@typescript-eslint/require-await': 'warn', - // FIXME: This rule should be enabled when we're able to support import aliases - 'import/no-unresolved': ['error', { ignore: ['^#', '^~'] }], + // FIXME: This rule should be enabled when we're able to support import aliases + 'import/no-unresolved': ['error', { ignore: ['^#', '^~'] }], - 'jsx-a11y/alt-text': 'warn', - 'jsx-a11y/html-has-lang': 'warn', - 'jsx-a11y/no-autofocus': 'warn', + 'jsx-a11y/alt-text': 'warn', + 'jsx-a11y/html-has-lang': 'warn', + 'jsx-a11y/no-autofocus': 'warn', - 'react/button-has-type': 'warn', - 'react/display-name': 'off', - 'react/jsx-curly-brace-presence': 'off', - 'react/jsx-no-leaked-render': 'off', - 'react/jsx-no-useless-fragment': 'warn', - 'react/jsx-sort-props': 'off', - }, - }, - { - name: 'repo/javascript', - files: JAVASCRIPT_FILES, - rules: { - 'no-unused-vars': [ - 'error', - { - args: 'after-used', - argsIgnorePattern: '^_', - ignoreRestSiblings: true, - vars: 'all', - varsIgnorePattern: '^_', - }, - ], - }, - }, - { - name: 'repo/typescript', - files: TYPESCRIPT_FILES, - extends: [pluginImport.flatConfigs.recommended, pluginImport.flatConfigs.typescript], - rules: { - 'no-unused-vars': 'off', - '@typescript-eslint/no-non-null-assertion': 'error', - }, - }, - { - name: 'repo/test', - files: TEST_FILES, - languageOptions: { - globals: pluginJest.environments.globals.globals, + 'react/button-has-type': 'warn', + 'react/display-name': 'off', + 'react/jsx-curly-brace-presence': 'off', + 'react/jsx-no-leaked-render': 'off', + 'react/jsx-no-useless-fragment': 'warn', + 'react/jsx-sort-props': 'off', + }, }, - plugins: { - jest: pluginJest, + { + name: 'repo/javascript', + files: JAVASCRIPT_FILES, + rules: { + 'no-unused-vars': [ + 'error', + { + args: 'after-used', + argsIgnorePattern: '^_', + ignoreRestSiblings: true, + vars: 'all', + varsIgnorePattern: '^_', + }, + ], + }, }, - rules: { - '@typescript-eslint/unbound-method': 'off', - 'jest/unbound-method': 'error', + { + name: 'repo/typescript', + files: TYPESCRIPT_FILES, + extends: [pluginImport.flatConfigs.recommended, pluginImport.flatConfigs.typescript], + rules: { + 'no-unused-vars': 'off', + '@typescript-eslint/no-non-null-assertion': 'error', + }, }, - }, - { - name: 'repo/react-hooks', - plugins: { - 'react-hooks': pluginReactHooks, + { + name: 'repo/test', + files: TEST_FILES, + languageOptions: { + globals: pluginJest.environments.globals.globals, + }, + plugins: { + jest: pluginJest, + }, + rules: { + '@typescript-eslint/unbound-method': 'off', + 'jest/unbound-method': 'error', + }, }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - 'react-hooks/rules-of-hooks': 'warn', + { + name: 'repo/react-hooks', + plugins: { + 'react-hooks': pluginReactHooks, + }, + rules: { + ...pluginReactHooks.configs.recommended.rules, + 'react-hooks/rules-of-hooks': 'warn', + }, }, - }, - { - name: 'packages/clerk-js', - files: ['packages/clerk-js/src/ui/**/*'], - plugins: { - 'custom-rules': { - rules: { - 'no-navigate-useClerk': noNavigateUseClerk, + { + name: 'packages/clerk-js', + files: ['packages/clerk-js/src/ui/**/*'], + plugins: { + 'custom-rules': { + rules: { + 'no-navigate-useClerk': noNavigateUseClerk, + }, }, }, + rules: { + 'custom-rules/no-navigate-useClerk': 'error', + }, }, - rules: { - 'custom-rules/no-navigate-useClerk': 'error', - }, - }, - { - name: 'packages/clerk-js - vitest', - files: ['packages/clerk-js/src/**/*.spec.{ts,tsx}'], - rules: { - 'jest/unbound-method': 'off', - '@typescript-eslint/unbound-method': 'off', - }, - }, - { - name: 'packages/expo-passkeys', - files: ['packages/expo-passkeys/src/**/*'], - rules: { - 'no-restricted-imports': [ - 'error', - { - patterns: ['node:*'], - }, - ], + { + name: 'packages/clerk-js - vitest', + files: ['packages/clerk-js/src/**/*.spec.{ts,tsx}'], + rules: { + 'jest/unbound-method': 'off', + '@typescript-eslint/unbound-method': 'off', + }, }, - }, - { - name: 'packages/nextjs', - files: ['packages/nextjs/src/**/*'], - rules: { - 'turbo/no-undeclared-env-vars': [ - 'error', - { - allowList: ['_NEXT_ROUTER_BASEPATH'], - }, - ], + { + name: 'packages/expo-passkeys', + files: ['packages/expo-passkeys/src/**/*'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: ['node:*'], + }, + ], + }, }, - }, - { - name: 'packages/upgrade', - files: ['packages/upgrade/src/**/*'], - rules: { - 'import/no-unresolved': ['error', { ignore: ['^#', '^~', '@inkjs/ui', '^ink'] }], - 'react/no-unescaped-entities': 'off', - '@typescript-eslint/no-floating-promises': 'warn', + { + name: 'packages/nextjs', + files: ['packages/nextjs/src/**/*'], + rules: { + 'turbo/no-undeclared-env-vars': [ + 'error', + { + allowList: ['_NEXT_ROUTER_BASEPATH'], + }, + ], + }, }, - }, - { - name: 'repo/integration', - ...pluginPlaywright.configs['flat/recommended'], - files: ['integration/tests/**'], - rules: { - ...pluginPlaywright.configs['flat/recommended'].rules, - 'playwright/expect-expect': 'off', - 'playwright/no-skipped-test': 'off', - 'playwright/no-page-pause': 'warn', + { + name: 'packages/upgrade', + files: ['packages/upgrade/src/**/*'], + rules: { + 'import/no-unresolved': ['error', { ignore: ['^#', '^~', '@inkjs/ui', '^ink'] }], + 'react/no-unescaped-entities': 'off', + '@typescript-eslint/no-floating-promises': 'warn', + }, }, - }, - { - name: 'repo/scripts', - files: ['scripts/**/*'], - rules: { - 'turbo/no-undeclared-env-vars': 'off', + { + name: 'repo/integration', + ...pluginPlaywright.configs['flat/recommended'], + files: ['integration/tests/**'], + rules: { + ...pluginPlaywright.configs['flat/recommended'].rules, + 'playwright/expect-expect': 'off', + 'playwright/no-skipped-test': 'off', + 'playwright/no-page-pause': 'warn', + }, }, - }, - { - name: 'repo/jsdoc', - ...pluginJsDoc.configs['flat/recommended-typescript'], - files: ['packages/shared/src/**/*.{ts,tsx}'], - ignores: ['**/__tests__/**'], - plugins: { - jsdoc: pluginJsDoc, + { + name: 'repo/scripts', + files: ['scripts/**/*'], + rules: { + 'turbo/no-undeclared-env-vars': 'off', + }, }, - rules: { - ...pluginJsDoc.configs['flat/recommended-typescript'].rules, - 'jsdoc/check-examples': 'off', - 'jsdoc/informative-docs': 'warn', - 'jsdoc/check-tag-names': [ - 'warn', - { definedTags: ['inline', 'unionReturnHeadings', 'displayFunctionSignature', 'paramExtension'], typed: false }, - ], - 'jsdoc/require-hyphen-before-param-description': 'warn', - 'jsdoc/require-description': 'warn', - 'jsdoc/require-description-complete-sentence': 'warn', - 'jsdoc/require-param': ['warn', { ignoreWhenAllParamsMissing: true }], - 'jsdoc/require-param-description': 'warn', - 'jsdoc/require-returns': 'off', - 'jsdoc/tag-lines': [ - 'warn', - 'always', - { count: 1, applyToEndTag: false, startLines: 1, tags: { param: { lines: 'never' } } }, - ], + { + name: 'repo/jsdoc', + ...pluginJsDoc.configs['flat/recommended-typescript'], + files: ['packages/shared/src/**/*.{ts,tsx}'], + ignores: ['**/__tests__/**'], + plugins: { + jsdoc: pluginJsDoc, + }, + rules: { + ...pluginJsDoc.configs['flat/recommended-typescript'].rules, + 'jsdoc/check-examples': 'off', + 'jsdoc/informative-docs': 'warn', + 'jsdoc/check-tag-names': [ + 'warn', + { + definedTags: ['inline', 'unionReturnHeadings', 'displayFunctionSignature', 'paramExtension'], + typed: false, + }, + ], + 'jsdoc/require-hyphen-before-param-description': 'warn', + 'jsdoc/require-description': 'warn', + 'jsdoc/require-description-complete-sentence': 'warn', + 'jsdoc/require-param': ['warn', { ignoreWhenAllParamsMissing: true }], + 'jsdoc/require-param-description': 'warn', + 'jsdoc/require-returns': 'off', + 'jsdoc/tag-lines': [ + 'warn', + 'always', + { count: 1, applyToEndTag: false, startLines: 1, tags: { param: { lines: 'never' } } }, + ], + }, }, - }, - ...pluginYml.configs['flat/recommended'], - configPrettier, -]); + ...pluginYml.configs['flat/recommended'], + configPrettier, + ], + storybook.configs['flat/recommended'], +); diff --git a/packages/storybook/.storybook/main.css b/packages/storybook/.storybook/main.css new file mode 100644 index 00000000000..282684328cd --- /dev/null +++ b/packages/storybook/.storybook/main.css @@ -0,0 +1,12 @@ +:root { + --background: #f5f5f5; +} + +.dark { + --background: #0a0a0a; +} + +body { + font-family: 'ui-sans-serif', sans-serif; + background-color: var(--background); +} diff --git a/packages/storybook/.storybook/main.ts b/packages/storybook/.storybook/main.ts new file mode 100644 index 00000000000..baded089254 --- /dev/null +++ b/packages/storybook/.storybook/main.ts @@ -0,0 +1,30 @@ +import { createRequire } from 'node:module'; +import { dirname, join } from 'node:path'; +import type { StorybookConfig } from '@storybook/react-vite'; + +const require = createRequire(import.meta.url); + +const config: StorybookConfig = { + stories: ['../stories/**/*.stories.@(js|jsx|mjs|ts|tsx|mdx)'], + addons: [getAbsolutePath('@storybook/addon-docs'), getAbsolutePath('@storybook/addon-themes')], + + framework: { + name: getAbsolutePath('@storybook/react-vite'), + options: {}, + }, + + typescript: { + check: false, + reactDocgen: 'react-docgen-typescript', + reactDocgenTypescriptOptions: { + shouldExtractLiteralValuesFromEnum: true, + propFilter: (prop: any) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true), + }, + }, +}; + +export default config; + +function getAbsolutePath(value: string): any { + return dirname(require.resolve(join(value, 'package.json'))); +} diff --git a/packages/storybook/.storybook/preview.tsx b/packages/storybook/.storybook/preview.tsx new file mode 100644 index 00000000000..22e25d14d1b --- /dev/null +++ b/packages/storybook/.storybook/preview.tsx @@ -0,0 +1,247 @@ +import './main.css'; + +import { ClerkProvider } from '@clerk/clerk-react'; +import { enUS, esES, frFR, koKR, zhCN } from '@clerk/localizations'; +import type { Appearance } from '@clerk/types'; +import { withThemeByClassName } from '@storybook/addon-themes'; +import React from 'react'; + +// Map locale selector values to localization resources +const localeMap = { + en: enUS, + fr: frFR, + es: esES, + zh: zhCN, + kr: koKR, +} as const; + +// Mock router functions for Storybook +const mockRouter = { + push: () => {}, + replace: () => {}, +}; + +const preview: any = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + layout: 'centered', + backgrounds: { disable: true }, + }, + globalTypes: { + locale: { + description: 'Locale', + toolbar: { + icon: 'globe', + items: [ + { value: 'en', right: '🇺🇸', title: 'English' }, + { value: 'fr', right: '🇫🇷', title: 'Français' }, + { value: 'es', right: '🇪🇸', title: 'Español' }, + { value: 'zh', right: '🇨🇳', title: '中文' }, + { value: 'kr', right: '🇰🇷', title: '한국어' }, + ], + }, + }, + }, + initialGlobals: { + locale: 'en', + }, + argTypes: { + // Color Variables + colorPrimary: { + description: 'Primary color used throughout the components', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorPrimaryForeground: { + description: 'Text color appearing on top of primary background', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorForeground: { + description: 'Default text color', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorBackground: { + description: 'Background color for the card container', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorInput: { + description: 'Background color for all input elements', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorInputForeground: { + description: 'Text color inside input elements', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorMuted: { + description: 'Background color for elements of lower importance', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorMutedForeground: { + description: 'Text color for elements of lower importance', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorDanger: { + description: 'Color used to indicate errors or destructive actions', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorSuccess: { + description: 'Color used to indicate successful actions or positive results', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorWarning: { + description: 'Color used for potentially destructive actions or when attention is required', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorNeutral: { + description: 'Neutral color used for borders, backgrounds, and hovered elements', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorBorder: { + description: 'Base border color used in the components', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + colorShadow: { + description: 'Base shadow color used in the components', + control: { type: 'color' }, + table: { category: 'Appearance - Colors' }, + }, + // Typography Variables + fontFamily: { + description: 'Default font family for all components', + control: { type: 'text' }, + table: { category: 'Appearance - Typography' }, + }, + fontFamilyButtons: { + description: 'Font family for all buttons', + control: { type: 'text' }, + table: { category: 'Appearance - Typography' }, + }, + fontSize: { + description: 'Base font size (md value for calculating other scales)', + control: { type: 'text' }, + table: { category: 'Appearance - Typography' }, + }, + // Layout Variables + borderRadius: { + description: 'Base border radius (md value for calculating other scales)', + control: { type: 'text' }, + table: { category: 'Appearance - Layout' }, + }, + spacing: { + description: 'Base spacing for margins, paddings, and gaps', + control: { type: 'text' }, + table: { category: 'Appearance - Layout' }, + }, + }, + args: { + // Default values for appearance variables + colorPrimary: '#2F3037', + colorPrimaryForeground: '#FFFFFF', + colorBackground: '#FFFFFF', + colorInput: '#FFFFFF', + colorInputForeground: '#212126', + colorForeground: '#212126', + colorMutedForeground: '#747686', + colorDanger: '#EF4444', + colorSuccess: '#22C543', + colorWarning: '#F36B16', + colorNeutral: '#000000', + fontFamily: 'inherit', + fontFamilyButtons: 'inherit', + fontSize: '0.8125rem', + borderRadius: '0.375rem', + spacing: '1rem', + }, + decorators: [ + withThemeByClassName({ + themes: { + light: 'light', + dark: 'dark', + }, + defaultTheme: 'light', + }), + (Story: any, context: any) => { + const { + colorPrimary, + colorPrimaryForeground, + colorBackground, + colorInput, + colorInputForeground, + colorForeground, + colorMuted, + colorMutedForeground, + colorDanger, + colorSuccess, + colorWarning, + colorNeutral, + colorBorder, + colorShadow, + fontFamily, + fontFamilyButtons, + fontSize, + borderRadius, + spacing, + } = context.args; + + // Get the selected locale with proper type safety + const selectedLocale = context.globals.locale as keyof typeof localeMap; + const localization = localeMap[selectedLocale] || localeMap.en; + + // Build appearance object with individual variables + const appearance: Appearance = { + variables: { + colorPrimary, + colorPrimaryForeground, + colorBackground, + colorInput, + colorInputForeground, + colorForeground, + colorMuted, + colorMutedForeground, + colorDanger, + colorSuccess, + colorWarning, + colorNeutral, + colorBorder, + colorShadow, + fontFamily, + fontFamilyButtons, + fontSize, + borderRadius, + spacing, + }, + }; + + return React.createElement( + ClerkProvider, + { + publishableKey: 'pk_test_dG91Y2hlZC1sYWR5YmlyZC0yMy5jbGVyay5hY2NvdW50cy5kZXYk', + appearance, + localization, + routerPush: mockRouter.push, + routerReplace: mockRouter.replace, + } as any, + React.createElement(Story), + ); + }, + ], +}; + +export default preview; diff --git a/packages/storybook/README.md b/packages/storybook/README.md new file mode 100644 index 00000000000..1a5e73cf273 --- /dev/null +++ b/packages/storybook/README.md @@ -0,0 +1,53 @@ +# @clerk/storybook + +This package provides Storybook documentation for Clerk components using the React component library. + +## Why a Separate Package? + +This approach offers several advantages over integrating Storybook directly into the `clerk-js` package: + +1. **Clean Architecture**: Dedicated package for documentation with its own build setup +2. **React Components**: Uses `@clerk/clerk-react` components directly instead of wrapping vanilla JS +3. **Better TypeScript Support**: Proper typing and intellisense for React components +4. **Standard Patterns**: Follows conventional Storybook patterns for component documentation +5. **Easier Maintenance**: Isolated configuration and dependencies + +## Components Documented + +- **Authentication**: `SignIn`, `SignUp`, `SignInButton`, `SignUpButton` +- **User Management**: `UserButton`, `UserProfile` +- **Organization Management**: `OrganizationSwitcher`, `OrganizationProfile`, `CreateOrganization`, `OrganizationList` +- **Specialized**: `GoogleOneTap`, `Waitlist`, `PricingTable`, `APIKeys` +- **Control Components**: `SignedIn`, `SignedOut`, `Protect`, etc. + +## Getting Started + +```bash +# Install dependencies +pnpm install + +# Start Storybook +pnpm dev + +# Build Storybook +pnpm build +``` + +## Features + +- **Appearance Controls**: Interactive controls for theming and customization +- **Localization**: Support for multiple languages via toolbar +- **Auto-generated Documentation**: Using Storybook's autodocs feature +- **Interactive Examples**: Live component examples with controls +- **TypeScript Support**: Full TypeScript support with proper types + +## Development + +Stories are located in the `stories/` directory. Each component has its own story file with multiple variants demonstrating different use cases and configurations. + +The Storybook configuration includes: + +- Global appearance and localization controls +- Auto-generated documentation +- Interactive controls for component props +- Proper ClerkProvider context for all stories diff --git a/packages/storybook/package.json b/packages/storybook/package.json new file mode 100644 index 00000000000..4ba948de186 --- /dev/null +++ b/packages/storybook/package.json @@ -0,0 +1,43 @@ +{ + "name": "@clerk/storybook", + "version": "0.0.0", + "private": true, + "description": "Storybook documentation for Clerk components", + "keywords": [ + "clerk", + "storybook", + "documentation" + ], + "license": "MIT", + "scripts": { + "build": "storybook build", + "build-storybook": "storybook build", + "dev": "storybook dev -p 6006", + "storybook": "storybook dev -p 6006" + }, + "dependencies": { + "@clerk/clerk-react": "workspace:*", + "@clerk/localizations": "workspace:*", + "@clerk/shared": "workspace:*", + "@clerk/themes": "workspace:*", + "@clerk/types": "workspace:*", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@storybook/addon-docs": "^9.0.17", + "@storybook/addon-links": "^9.0.17", + "@storybook/addon-onboarding": "^9.0.17", + "@storybook/react-vite": "^9.0.17", + "@types/react": "18.2.37", + "@types/react-dom": "18.2.15", + "eslint-plugin-storybook": "9.0.17", + "storybook": "^9.0.17", + "typescript": "5.2.2", + "vite": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } +} diff --git a/packages/storybook/stories/SignIn.stories.tsx b/packages/storybook/stories/SignIn.stories.tsx new file mode 100644 index 00000000000..a1668772f16 --- /dev/null +++ b/packages/storybook/stories/SignIn.stories.tsx @@ -0,0 +1,25 @@ +import { SignIn } from '@clerk/clerk-react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; + +// Define the story metadata +const meta: Meta = { + title: 'Components/SignIn', + component: SignIn, + parameters: { + docs: { + description: { + component: 'The SignIn component renders a UI for users to sign in to your application.', + }, + }, + }, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +// Default story +export const Default: Story = { + args: {}, +}; diff --git a/packages/storybook/stories/SignUp.stories.tsx b/packages/storybook/stories/SignUp.stories.tsx new file mode 100644 index 00000000000..34de14bedff --- /dev/null +++ b/packages/storybook/stories/SignUp.stories.tsx @@ -0,0 +1,25 @@ +import { SignUp } from '@clerk/clerk-react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; + +// Define the story metadata +const meta: Meta = { + title: 'Components/SignUp', + component: SignUp, + parameters: { + docs: { + description: { + component: 'The SignUp component renders a UI for users to sign in to your application.', + }, + }, + }, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +// Default story +export const Default: Story = { + args: {}, +}; diff --git a/packages/storybook/stories/UserButton.stories.tsx b/packages/storybook/stories/UserButton.stories.tsx new file mode 100644 index 00000000000..d3bc578fe0c --- /dev/null +++ b/packages/storybook/stories/UserButton.stories.tsx @@ -0,0 +1,25 @@ +import { UserButton } from '@clerk/clerk-react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; + +// Define the story metadata +const meta: Meta = { + title: 'Components/UserButton', + component: UserButton, + parameters: { + docs: { + description: { + component: 'The UserButton component renders a UI for users to sign in to your application.', + }, + }, + }, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +// Default story +export const Default: Story = { + args: {}, +}; diff --git a/packages/storybook/stories/UserProfile.stories.tsx b/packages/storybook/stories/UserProfile.stories.tsx new file mode 100644 index 00000000000..8988249b2c0 --- /dev/null +++ b/packages/storybook/stories/UserProfile.stories.tsx @@ -0,0 +1,25 @@ +import { UserProfile } from '@clerk/clerk-react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; + +// Define the story metadata +const meta: Meta = { + title: 'Components/UserProfile', + component: UserProfile, + parameters: { + docs: { + description: { + component: 'The UserProfile component renders a UI for users to sign in to your application.', + }, + }, + }, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +// Default story +export const Default: Story = { + args: {}, +}; diff --git a/packages/storybook/stories/navigation-pattern.md b/packages/storybook/stories/navigation-pattern.md new file mode 100644 index 00000000000..1d1d84d89e3 --- /dev/null +++ b/packages/storybook/stories/navigation-pattern.md @@ -0,0 +1,113 @@ +# Storybook Navigation Pattern + +This document explains how to implement navigation between stories in Storybook, specifically addressing the iframe reload issue when using authentication components like Clerk's SignIn. + +## The Problem + +When using `forceRedirectUrl` or `afterSignInUrl` with authentication components in Storybook, the redirect happens within the iframe context, causing: + +- Nested iframe reloads +- Poor user experience +- Broken navigation flow + +## The Solution + +Use React state management combined with Storybook's `@storybook/addon-links` to handle navigation: + +### 1. Install Dependencies + +```bash +pnpm add -D @storybook/addon-links +``` + +### 2. Configure Storybook + +In `.storybook/main.ts`: + +```typescript +export default { + addons: ['@storybook/addon-links'], + // ... other config +}; +``` + +### 3. Implementation Pattern + +```typescript +import React from 'react'; +import { SignIn, useUser } from '@clerk/clerk-react'; +import { linkTo } from '@storybook/addon-links'; + +export const WithNavigation: Story = { + render: (args) => { + const { isSignedIn } = useUser(); + + // Navigate when user becomes signed in + React.useEffect(() => { + if (isSignedIn) { + const timer = setTimeout(() => { + linkTo('Components/UserProfile', 'WithNavigation')(); + }, 100); + return () => clearTimeout(timer); + } + }, [isSignedIn]); + + // Override redirect URLs to prevent iframe issues + const modifiedArgs = { + ...args, + afterSignInUrl: undefined, + forceRedirectUrl: undefined, + }; + + return ; + }, +}; +``` + +### 4. Bidirectional Navigation + +Create corresponding navigation in the target story: + +```typescript +export const WithNavigation: Story = { + render: (args) => { + const { isSignedIn } = useUser(); + + if (!isSignedIn) { + return ( +
+

Please sign in to view your profile

+ +
+ ); + } + + return ; + }, +}; +``` + +## Key Benefits + +- **No iframe reload issues**: Navigation happens within Storybook's navigation system +- **Smooth user experience**: Seamless transitions between stories +- **Maintains context**: Storybook's iframe context is preserved +- **Works with authentication**: Compatible with Clerk and other auth providers + +## Use Cases + +This pattern is useful for: + +- Authentication flows (Sign In → Profile) +- Multi-step forms +- Wizard-like components +- Any scenario requiring story-to-story navigation + +## Examples + +See the following stories for working examples: + +- `Components/SignIn` → `WithNavigation` and `NavigationDemo` +- `Components/UserProfile` → `WithNavigation` diff --git a/packages/storybook/tsconfig.json b/packages/storybook/tsconfig.json new file mode 100644 index 00000000000..d7e1576a9b8 --- /dev/null +++ b/packages/storybook/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "types": ["vite/client"] + }, + "include": ["src/**/*", "stories/**/*", ".storybook/**/*"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/storybook/tsconfig.node.json b/packages/storybook/tsconfig.node.json new file mode 100644 index 00000000000..383d1351a8b --- /dev/null +++ b/packages/storybook/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true, + "types": ["node"] + }, + "include": [".storybook/**/*", "vite.config.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2382b2aab06..fb41af44245 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,16 +102,16 @@ importers: version: 1.44.1 '@testing-library/dom': specifier: ^10.1.0 - version: 10.1.0 + version: 10.4.0 '@testing-library/jest-dom': specifier: ^6.4.6 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.16.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.16.0)(typescript@5.8.3)))(vitest@3.0.5(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(jsdom@24.1.3)(lightningcss@1.27.0)(msw@2.10.2(@types/node@22.16.0)(typescript@5.8.3))(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + version: 6.6.3 '@testing-library/react': specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.1.0) + version: 14.6.1(@testing-library/dom@10.4.0) '@types/cross-spawn': specifier: ^6.0.6 version: 6.0.6 @@ -957,6 +957,67 @@ importers: specifier: 0.25.0 version: 0.25.0 + packages/storybook: + dependencies: + '@clerk/clerk-react': + specifier: workspace:* + version: link:../react + '@clerk/localizations': + specifier: workspace:* + version: link:../localizations + '@clerk/shared': + specifier: workspace:* + version: link:../shared + '@clerk/themes': + specifier: workspace:* + version: link:../themes + '@clerk/types': + specifier: workspace:* + version: link:../types + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + storybook-dark-mode: + specifier: 4.0.2 + version: 4.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + devDependencies: + '@storybook/addon-docs': + specifier: ^9.0.17 + version: 9.0.17(@types/react@18.2.37)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-links': + specifier: ^9.0.17 + version: 9.0.17(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-onboarding': + specifier: ^9.0.17 + version: 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-themes': + specifier: 9.0.17 + version: 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/react-vite': + specifier: ^9.0.17 + version: 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.45.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2)(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@types/react': + specifier: 18.2.37 + version: 18.2.37 + '@types/react-dom': + specifier: 18.2.15 + version: 18.2.15 + eslint-plugin-storybook: + specifier: 9.0.17 + version: 9.0.17(eslint@9.27.0(jiti@2.4.2))(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2) + storybook: + specifier: ^9.0.17 + version: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + typescript: + specifier: 5.2.2 + version: 5.2.2 + vite: + specifier: ^6.0.0 + version: 6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) + packages/tanstack-react-start: dependencies: '@clerk/backend': @@ -2897,7 +2958,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -3310,6 +3371,15 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1': + resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -3374,85 +3444,75 @@ packages: engines: {node: '>=18'} hasBin: true + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + '@miniflare/cache@2.14.4': resolution: {integrity: sha512-ayzdjhcj+4mjydbNK7ZGDpIXNliDbQY4GPcY2KrYw0v1OSUdj5kZUkygD09fqoGRfAks0d91VelkyRsAXX8FQA==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/core@2.14.4': resolution: {integrity: sha512-FMmZcC1f54YpF4pDWPtdQPIO8NXfgUxCoR9uyrhxKJdZu7M6n8QKopPVNuaxR40jcsdxb7yKoQoFWnHfzJD9GQ==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/d1@2.14.4': resolution: {integrity: sha512-pMBVq9XWxTDdm+RRCkfXZP+bREjPg1JC8s8C0JTovA9OGmLQXqGTnFxIaS9vf1d8k3uSUGhDzPTzHr0/AUW1gA==} engines: {node: '>=16.7'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/durable-objects@2.14.4': resolution: {integrity: sha512-+JrmHP6gHHrjxV8S3axVw5lGHLgqmAGdcO/1HJUPswAyJEd3Ah2YnKhpo+bNmV4RKJCtEq9A2hbtVjBTD2YzwA==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/html-rewriter@2.14.4': resolution: {integrity: sha512-GB/vZn7oLbnhw+815SGF+HU5EZqSxbhIa3mu2L5MzZ2q5VOD5NHC833qG8c2GzDPhIaZ99ITY+ZJmbR4d+4aNQ==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/kv@2.14.4': resolution: {integrity: sha512-QlERH0Z+klwLg0xw+/gm2yC34Nnr/I0GcQ+ASYqXeIXBwjqOtMBa3YVQnocaD+BPy/6TUtSpOAShHsEj76R2uw==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/queues@2.14.4': resolution: {integrity: sha512-aXQ5Ik8Iq1KGMBzGenmd6Js/jJgqyYvjom95/N9GptCGpiVWE5F0XqC1SL5rCwURbHN+aWY191o8XOFyY2nCUA==} engines: {node: '>=16.7'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/r2@2.14.4': resolution: {integrity: sha512-4ctiZWh7Ty7LB3brUjmbRiGMqwyDZgABYaczDtUidblo2DxX4JZPnJ/ZAyxMPNJif32kOJhcg6arC2hEthR9Sw==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/runner-vm@2.14.4': resolution: {integrity: sha512-Nog0bB9SVhPbZAkTWfO4lpLAUsBXKEjlb4y+y66FJw77mPlmPlVdpjElCvmf8T3VN/pqh83kvELGM+/fucMf4g==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/shared-test-environment@2.14.4': resolution: {integrity: sha512-FdU2/8wEd00vIu+MfofLiHcfZWz+uCbE2VTL85KpyYfBsNGAbgRtzFMpOXdoXLqQfRu6MBiRwWpb2FbMrBzi7g==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/shared@2.14.4': resolution: {integrity: sha512-upl4RSB3hyCnITOFmRZjJj4A72GmkVrtfZTilkdq5Qe5TTlzsjVeDJp7AuNUM9bM8vswRo+N5jOiot6O4PVwwQ==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/sites@2.14.4': resolution: {integrity: sha512-O5npWopi+fw9W9Ki0gy99nuBbgDva/iXy8PDC4dAXDB/pz45nISDqldabk0rL2t4W2+lY6LXKzdOw+qJO1GQTA==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/storage-file@2.14.4': resolution: {integrity: sha512-JxcmX0hXf4cB0cC9+s6ZsgYCq+rpyUKRPCGzaFwymWWplrO3EjPVxKCcMxG44jsdgsII6EZihYUN2J14wwCT7A==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/storage-memory@2.14.4': resolution: {integrity: sha512-9jB5BqNkMZ3SFjbPFeiVkLi1BuSahMhc/W1Y9H0W89qFDrrD+z7EgRgDtHTG1ZRyi9gIlNtt9qhkO1B6W2qb2A==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/watcher@2.14.4': resolution: {integrity: sha512-PYn05ET2USfBAeXF6NZfWl0O32KVyE8ncQ/ngysrh3hoIV7l3qGGH7ubeFx+D8VWQ682qYhwGygUzQv2j1tGGg==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@miniflare/web-sockets@2.14.4': resolution: {integrity: sha512-stTxvLdJ2IcGOs76AnvGYAzGvx8JvQPRxC5DW0P5zdAAnhL33noqb5LKdPt3P37BKp9FzBKZHuihQI9oVqwm0g==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 '@modelcontextprotocol/sdk@1.7.0': resolution: {integrity: sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==} @@ -4538,6 +4598,99 @@ packages: peerDependencies: xstate: ^5.5.1 + '@storybook/addon-docs@9.0.17': + resolution: {integrity: sha512-LOX/kKgQGnyulrqZHsvf77+ZoH/nSUaplGr5hvZglW/U6ak6fO9seJyXAzVKEnC6p+F8n02kFBZbi3s+znQhSg==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/addon-links@9.0.17': + resolution: {integrity: sha512-c4hYojq0O6n5fD8MS+Ss1njR3qs88LLlO3LLaRD4bxsIgn8WFNjgG5677M7m8WjzTgWSxFWN0KAra2kaDZ8Jlg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + peerDependenciesMeta: + react: + optional: true + + '@storybook/addon-onboarding@9.0.17': + resolution: {integrity: sha512-WoZZ8d58gP6uBu6OJ2K1GjBSM4+Kcr0I9lo0z3convzYqxrhfUm9pNEwVm57KCbVVyBbIKmevddCsSFoPC5u6Q==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/addon-themes@9.0.17': + resolution: {integrity: sha512-qQCoWig+wPVVuiibk8AuUUH/hS9hbLFt2IdjpiCIObAjStqSQMosr/1b95FcxppBCEa8uTltEkGdxQPdpdVZEQ==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/builder-vite@9.0.17': + resolution: {integrity: sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==} + peerDependencies: + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/components@8.6.14': + resolution: {integrity: sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/core-events@8.6.14': + resolution: {integrity: sha512-RrJ95u3HuIE4Nk8VmZP0tc/u0vYoE2v9fYlMw6K2GUSExzKDITs3voy6WMIY7Q3qbQun8XUXVlmqkuFzTEy/pA==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/csf-plugin@9.0.17': + resolution: {integrity: sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.4.0': + resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + + '@storybook/manager-api@8.6.14': + resolution: {integrity: sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/react-dom-shim@9.0.17': + resolution: {integrity: sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + + '@storybook/react-vite@9.0.17': + resolution: {integrity: sha512-wx1yKScni4ifOC/ccqpnnpceQbyF2xto+jHGsyua+M4UUCQdS2NYPDR8JFWp1YvBhVt2cQiD6SAltVGM9QLGnQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/react@9.0.17': + resolution: {integrity: sha512-wssao+uXg72OHtEJdQmmQJGdX90x/aU/6avoP3fgVgepWdZXVgciS9mnqHjKRF/vP+vPOlNQcJjojF/zTtq5qg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + typescript: '>= 4.9.x' + peerDependenciesMeta: + typescript: + optional: true + + '@storybook/theming@8.6.14': + resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@stripe/react-stripe-js@3.1.1': resolution: {integrity: sha512-+JzYFgUivVD7koqYV7LmLlt9edDMAwKH7XhZAHFQMo7NeRC+6D2JmQGzp9tygWerzwttwFLlExGp4rAOvD6l9g==} peerDependencies: @@ -4837,34 +4990,17 @@ packages: resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==} engines: {node: '>=12'} - '@testing-library/dom@10.1.0': - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} '@testing-library/dom@9.3.4': resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - '@testing-library/jest-dom@6.4.6': - resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: 29.7.0 - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true '@testing-library/react@16.0.0': resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} @@ -4881,8 +5017,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -4950,6 +5086,9 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chrome@0.0.114': resolution: {integrity: sha512-i7qRr74IrxHtbnrZSKUuP5Uvd5EOKwlwJq/yp7+yTPihOXnPhNQO4Z5bqb1XTnrjdbUKEJicaVVbhcgtRijmLA==} @@ -4980,9 +5119,15 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -5061,6 +5206,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -5106,11 +5254,17 @@ packages: '@types/range-parser@1.2.4': resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@types/react-dom@18.2.15': + resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} + '@types/react-dom@18.3.7': resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 + '@types/react@18.2.37': + resolution: {integrity: sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==} + '@types/react@18.3.23': resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} @@ -5123,6 +5277,9 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/scheduler@0.26.0': + resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} + '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -5469,6 +5626,9 @@ packages: '@vitest/expect@3.0.5': resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/mocker@3.0.5': resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} peerDependencies: @@ -5483,6 +5643,9 @@ packages: '@vitest/pretty-format@3.0.5': resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/runner@3.0.5': resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} @@ -5492,9 +5655,15 @@ packages: '@vitest/spy@3.0.5': resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/utils@3.0.5': resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@volar/language-core@2.1.6': resolution: {integrity: sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==} @@ -6471,9 +6640,9 @@ packages: engines: {node: '>=10'} hasBin: true - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} - engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -7530,6 +7699,10 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -7782,6 +7955,11 @@ packages: resolution: {integrity: sha512-lNjylaAsJMprYg28zjUyBivP3y0ms9b7RJZ5tdhDUFLa3sCbqZw4wDnbFUSmnyZYWhCYDPxxp7KkXM2TXGw3PQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -7943,6 +8121,13 @@ packages: peerDependencies: eslint: '>=5.0.0' + eslint-plugin-storybook@9.0.17: + resolution: {integrity: sha512-IuTdlwCEwoDNobdygRCxNhlKXHmsDfPtPvHGcsY35x2Bx8KItrjfekO19gJrjc1VT2CMfcZMYF8OBKaxHELupw==} + engines: {node: '>=20.0.0'} + peerDependencies: + eslint: '>=8' + storybook: ^9.0.17 + eslint-plugin-turbo@2.5.3: resolution: {integrity: sha512-DlXZd+LgpDlxH/6IsiAXLhy82x0jeJDm0XBEqP6Le08uy0HBQkjCUt7SmXNp8esAtX9RYe6oDClbNbmI1jtK5g==} peerDependencies: @@ -10298,8 +10483,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lowdb@1.0.0: resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} @@ -10370,6 +10555,9 @@ packages: resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -10484,6 +10672,9 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -12206,6 +12397,20 @@ packages: react-devtools-core@6.1.2: resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} + react-docgen-typescript@2.4.0: + resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@8.0.0: + resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==} + engines: {node: ^20.9.0 || >=22} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -12273,6 +12478,10 @@ packages: react-dom: optional: true + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -13085,6 +13294,18 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} + storybook-dark-mode@4.0.2: + resolution: {integrity: sha512-zjcwwQ01R5t1VsakA6alc2JDIRVtavryW8J3E3eKLDIlAMcvsgtpxlelWkZs2cuNspk6Z10XzhQVrUWtYc3F0w==} + + storybook@9.0.17: + resolution: {integrity: sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} @@ -13526,6 +13747,10 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + tldts-core@6.1.84: resolution: {integrity: sha512-NaQa1W76W2aCGjXybvnMYzGSM4x8fvG2AN/pla7qxcg0ZHbooOPhA8kctmOZUDfZyhDL27OGNbwAeig8P4p1vg==} @@ -13625,6 +13850,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -13679,6 +13908,10 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -13857,6 +14090,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.6.1-rc: resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} engines: {node: '>=14.17'} @@ -14388,7 +14626,6 @@ packages: vitest-environment-miniflare@2.14.4: resolution: {integrity: sha512-DzwQWdY42sVYR6aUndw9FdCtl/i0oh3NkbkQpw+xq5aYQw5eiJn5kwnKaKQEWaoBe8Cso71X2i1EJGvi1jZ2xw==} engines: {node: '>=16.13'} - deprecated: Miniflare v2 is no longer supported. Please upgrade to Miniflare v4 peerDependencies: vitest: '>=0.23.0' @@ -17629,6 +17866,15 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.2.2)(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + dependencies: + glob: 10.4.5 + magic-string: 0.30.17 + react-docgen-typescript: 2.4.0(typescript@5.2.2) + vite: 6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) + optionalDependencies: + typescript: 5.2.2 + '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -17730,6 +17976,12 @@ snapshots: - encoding - supports-color + '@mdx-js/react@3.1.0(@types/react@18.2.37)(react@18.2.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.2.37 + react: 18.2.0 + '@miniflare/cache@2.14.4': dependencies: '@miniflare/core': 2.14.4 @@ -19301,6 +19553,106 @@ snapshots: transitivePeerDependencies: - ws + '@storybook/addon-docs@9.0.17(@types/react@18.2.37)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.2.37)(react@18.2.0) + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/react-dom-shim': 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/addon-links@9.0.17(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + optionalDependencies: + react: 18.2.0 + + '@storybook/addon-onboarding@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/addon-themes@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + + '@storybook/builder-vite@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + dependencies: + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + vite: 6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) + + '@storybook/components@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/core-events@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/csf-plugin@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + unplugin: 1.16.1 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@storybook/manager-api@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/react-dom-shim@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/react-vite@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.45.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2)(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.2.2)(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@rollup/pluginutils': 5.1.4(rollup@4.45.0) + '@storybook/builder-vite': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) + '@storybook/react': 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2) + find-up: 7.0.0 + magic-string: 0.30.17 + react: 18.2.0 + react-docgen: 8.0.0 + react-dom: 18.2.0(react@18.2.0) + resolve: 1.22.10 + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + tsconfig-paths: 4.2.0 + vite: 6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + '@storybook/react@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/react-dom-shim': 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + optionalDependencies: + typescript: 5.2.2 + + '@storybook/theming@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + '@stripe/react-stripe-js@3.1.1(@stripe/stripe-js@5.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@stripe/stripe-js': 5.6.0 @@ -19777,7 +20129,7 @@ snapshots: '@tanstack/virtual-file-routes@1.121.21': {} - '@testing-library/dom@10.1.0': + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 '@babel/runtime': 7.26.0 @@ -19799,35 +20151,29 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.16.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.16.0)(typescript@5.8.3)))(vitest@3.0.5(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(jsdom@24.1.3)(lightningcss@1.27.0)(msw@2.10.2(@types/node@22.16.0)(typescript@5.8.3))(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': + '@testing-library/jest-dom@6.6.3': dependencies: '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.26.0 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - optionalDependencies: - '@jest/globals': 29.7.0 - '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@22.16.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.16.0)(typescript@5.8.3)) - vitest: 3.0.5(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(jsdom@24.1.3)(lightningcss@1.27.0)(msw@2.10.2(@types/node@22.16.0)(typescript@5.8.3))(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) - '@testing-library/react@16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@testing-library/dom': 10.1.0 + '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: - '@testing-library/dom': 10.1.0 + '@testing-library/dom': 10.4.0 '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.17)(vue@3.5.17(typescript@5.8.3))': dependencies: @@ -19899,6 +20245,10 @@ snapshots: dependencies: '@types/node': 22.16.0 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/chrome@0.0.114': dependencies: '@types/filesystem': 0.0.32 @@ -19935,8 +20285,12 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/diff-match-patch@1.0.36': {} + '@types/doctrine@0.0.9': {} + '@types/estree@1.0.5': {} '@types/estree@1.0.8': {} @@ -20032,6 +20386,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} + '@types/methods@1.1.4': {} '@types/mime@1.3.2': {} @@ -20070,10 +20426,20 @@ snapshots: '@types/range-parser@1.2.4': {} + '@types/react-dom@18.2.15': + dependencies: + '@types/react': 18.2.37 + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: '@types/react': 18.3.23 + '@types/react@18.2.37': + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.26.0 + csstype: 3.1.3 + '@types/react@18.3.23': dependencies: '@types/prop-types': 15.7.5 @@ -20085,6 +20451,8 @@ snapshots: '@types/retry@0.12.2': {} + '@types/scheduler@0.26.0': {} + '@types/semver@7.7.0': {} '@types/send@0.17.1': @@ -20192,6 +20560,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.33.0(typescript@5.2.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.2.2) + '@typescript-eslint/types': 8.33.0 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/project-service@8.33.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3) @@ -20206,6 +20583,10 @@ snapshots: '@typescript-eslint/types': 8.33.0 '@typescript-eslint/visitor-keys': 8.33.0 + '@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.2.2)': + dependencies: + typescript: 5.2.2 + '@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 @@ -20223,6 +20604,22 @@ snapshots: '@typescript-eslint/types@8.33.0': {} + '@typescript-eslint/typescript-estree@8.33.0(typescript@5.2.2)': + dependencies: + '@typescript-eslint/project-service': 8.33.0(typescript@5.2.2) + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.2.2) + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/visitor-keys': 8.33.0 + debug: 4.4.1(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.33.0(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.33.0(typescript@5.8.3) @@ -20239,6 +20636,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.2.2)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.2.2) + eslint: 9.27.0(jiti@2.4.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) @@ -20564,7 +20972,15 @@ snapshots: dependencies: '@vitest/spy': 3.0.5 '@vitest/utils': 3.0.5 - chai: 5.1.2 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 tinyrainbow: 2.0.0 '@vitest/mocker@3.0.5(msw@2.10.2(@types/node@22.16.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))': @@ -20589,6 +21005,10 @@ snapshots: dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/runner@3.0.5': dependencies: '@vitest/utils': 3.0.5 @@ -20604,10 +21024,20 @@ snapshots: dependencies: tinyspy: 3.0.2 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + '@vitest/utils@3.0.5': dependencies: '@vitest/pretty-format': 3.0.5 - loupe: 3.1.2 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 '@volar/language-core@2.1.6': @@ -21880,12 +22310,12 @@ snapshots: supports-color: 8.1.1 window-size: 1.1.1 - chai@5.1.2: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.4 pathval: 2.0.0 chalk@2.4.2: @@ -22993,6 +23423,10 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -23315,6 +23749,13 @@ snapshots: esbuild-plugin-file-path-extensions@2.1.4: {} + esbuild-register@3.6.0(esbuild@0.25.0): + dependencies: + debug: 4.4.1(supports-color@8.1.1) + esbuild: 0.25.0 + transitivePeerDependencies: + - supports-color + esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -23606,6 +24047,15 @@ snapshots: dependencies: eslint: 9.27.0(jiti@2.4.2) + eslint-plugin-storybook@9.0.17(eslint@9.27.0(jiti@2.4.2))(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.2.2): + dependencies: + '@typescript-eslint/utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.2.2) + eslint: 9.27.0(jiti@2.4.2) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-turbo@2.5.3(eslint@9.27.0(jiti@2.4.2))(turbo@2.5.4): dependencies: dotenv: 16.0.3 @@ -26630,7 +27080,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} + loupe@3.1.4: {} lowdb@1.0.0: dependencies: @@ -26695,6 +27145,8 @@ snapshots: map-obj@5.0.2: {} + map-or-similar@1.5.0: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -26887,6 +27339,10 @@ snapshots: memoize-one@5.2.1: {} + memoizerific@1.11.3: + dependencies: + map-or-similar: 1.5.0 + memorystream@0.3.1: {} meow@11.0.0: @@ -29000,6 +29456,31 @@ snapshots: - bufferutil - utf-8-validate + react-docgen-typescript@2.4.0(typescript@5.2.2): + dependencies: + typescript: 5.2.2 + + react-docgen@8.0.0: + dependencies: + '@babel/core': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.2 + doctrine: 3.0.0 + resolve: 1.22.10 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.2 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -29095,6 +29576,10 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -30123,6 +30608,42 @@ snapshots: dependencies: internal-slot: 1.1.0 + storybook-dark-mode@4.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)): + dependencies: + '@storybook/components': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/core-events': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/global': 5.0.0 + '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/manager-api': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/theming': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + fast-deep-equal: 3.1.3 + memoizerific: 1.11.3 + transitivePeerDependencies: + - react + - react-dom + - storybook + + storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3): + dependencies: + '@storybook/global': 5.0.0 + '@testing-library/jest-dom': 6.6.3 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + better-opn: 3.0.2 + esbuild: 0.25.0 + esbuild-register: 3.6.0(esbuild@0.25.0) + recast: 0.23.11 + semver: 7.7.2 + ws: 8.18.3 + optionalDependencies: + prettier: 3.5.3 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - supports-color + - utf-8-validate + stream-buffers@2.2.0: {} stream-shift@1.0.3: {} @@ -30595,6 +31116,8 @@ snapshots: tinyspy@3.0.2: {} + tinyspy@4.0.3: {} + tldts-core@6.1.84: {} tldts@6.1.84: @@ -30668,10 +31191,16 @@ snapshots: trough@2.2.0: {} + ts-api-utils@2.1.0(typescript@5.2.2): + dependencies: + typescript: 5.2.2 + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} ts-jest@29.2.5(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(esbuild@0.25.0)(jest@29.7.0(@types/node@22.16.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.16.0)(typescript@5.8.3)))(typescript@5.8.3): @@ -30726,6 +31255,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} tsscmp@1.0.6: {} @@ -30904,6 +31439,8 @@ snapshots: transitivePeerDependencies: - supports-color + typescript@5.2.2: {} + typescript@5.6.1-rc: {} typescript@5.8.3: {} @@ -31562,12 +32099,12 @@ snapshots: dependencies: '@vitest/expect': 3.0.5 '@vitest/mocker': 3.0.5(msw@2.10.2(@types/node@22.16.0)(typescript@5.8.3))(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 '@vitest/spy': 3.0.5 '@vitest/utils': 3.0.5 - chai: 5.1.2 + chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17 @@ -31603,12 +32140,12 @@ snapshots: dependencies: '@vitest/expect': 3.0.5 '@vitest/mocker': 3.0.5(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 '@vitest/spy': 3.0.5 '@vitest/utils': 3.0.5 - chai: 5.1.2 + chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17