From 58de6268e50651ca46160261fbe2854372b18d2c Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 7 May 2026 10:57:00 -0700 Subject: [PATCH 01/38] Enable alpha releases on `graphiql-6` (#4227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Swap the vestigial `graphiql-5` reference in `.github/workflows/release.yml` for `graphiql-6` so the changesets-action runs on pushes to the integration branch. - Enter changesets pre-mode with the `alpha` tag so merges aggregate into `6.0.0-alpha.N` prereleases. - Add a changeset that seeds the alpha release line by bumping `graphiql` to v6. No functional change — subsequent alphas accumulate the redesign work. ## Test plan - [ ] On merge: changesets-action opens a "Version Packages (alpha)" PR bumping `graphiql` to `6.0.0-alpha.0`. - [ ] Merging the version PR publishes `graphiql@6.0.0-alpha.0` to npm with the `alpha` dist-tag. Refs: graphql/graphiql#4219 --- .changeset/pre.json | 29 +++++++++++++++++++++++++++++ .changeset/v6-alpha-line.md | 5 +++++ .github/workflows/release.yml | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 .changeset/pre.json create mode 100644 .changeset/v6-alpha-line.md diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000000..b27ac73cadd --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,29 @@ +{ + "mode": "pre", + "tag": "alpha", + "initialVersions": { + "example-graphiql-vite": "0.0.0", + "example-graphiql-vite-react-router": "1.0.0", + "example-graphiql-webpack": "0.0.0", + "example-monaco-graphql-nextjs": "0.0.0", + "example-monaco-graphql-react-vite": "0.0.0", + "example-monaco-graphql-webpack": "0.0.0", + "cm6-graphql": "0.2.1", + "codemirror-graphql": "2.2.4", + "graphiql": "5.2.2", + "@graphiql/plugin-code-exporter": "5.1.1", + "@graphiql/plugin-doc-explorer": "0.4.1", + "@graphiql/plugin-explorer": "5.1.1", + "@graphiql/plugin-history": "0.4.1", + "@graphiql/react": "0.37.3", + "@graphiql/toolkit": "0.11.3", + "graphql-language-service": "5.5.0", + "graphql-language-service-cli": "3.5.0", + "graphql-language-service-server": "2.14.8", + "monaco-graphql": "1.7.3", + "vscode-graphql": "0.13.2", + "vscode-graphql-execution": "0.3.2", + "vscode-graphql-syntax": "1.3.8" + }, + "changesets": [] +} diff --git a/.changeset/v6-alpha-line.md b/.changeset/v6-alpha-line.md new file mode 100644 index 00000000000..751f5642634 --- /dev/null +++ b/.changeset/v6-alpha-line.md @@ -0,0 +1,5 @@ +--- +'graphiql': major +--- + +Initial v6 alpha. Refs graphql/graphiql#4219. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8dfb4fde68a..c8f787eccc3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: push: - branches: [main, graphiql-5] + branches: [main, graphiql-6] permissions: {} jobs: release: From e21fc3f0222cc0f4c3051901cd28c493431ec641 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 7 May 2026 23:20:19 -0700 Subject: [PATCH 02/38] fix formatting after merge conflict resolution --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 260a60d3fb6..a54c3b05b63 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ jobs: - uses: actions/setup-node@v6 with: - node-version-file: ".node-version" + node-version-file: '.node-version' cache: yarn - run: yarn install --frozen-lockfile --immutable From 8eebea769289e8ac9779c8932926a9afb1950b78 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 8 May 2026 23:11:02 +0000 Subject: [PATCH 03/38] trigger ci From 72e897082bbec4b67a26bf958c6205fefb64aa77 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 8 May 2026 19:36:00 -0700 Subject: [PATCH 04/38] v6: Add OKLCH design tokens (dark + light) (#4242) ## Summary - Introduce a new `packages/graphiql-react/src/style/tokens.css` with the v6 OKLCH-based design token system. Both dark and light palettes ship together. - Light theme activates explicitly via `data-theme="light"` or automatically via `prefers-color-scheme: light` when no theme is pinned. Dark remains the default. - Existing v5 HSL variables are unchanged; nothing in `@graphiql/react` references the new tokens yet. - Future PRs will restyle components to consume the new tokens and shim the v5 variables. Refs: graphql/graphiql#4219 --- .changeset/oklch-tokens.md | 5 + packages/graphiql-react/src/style/root.css | 1 + packages/graphiql-react/src/style/tokens.css | 152 +++++++++++++++++++ resources/custom-words.txt | 2 + 4 files changed, 160 insertions(+) create mode 100644 .changeset/oklch-tokens.md create mode 100644 packages/graphiql-react/src/style/tokens.css diff --git a/.changeset/oklch-tokens.md b/.changeset/oklch-tokens.md new file mode 100644 index 00000000000..6e268cf5ada --- /dev/null +++ b/.changeset/oklch-tokens.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': minor +--- + +Introduce the v6 OKLCH design-token system with both dark and light theme palettes. Tokens (`--bg-canvas`, `--fg-default`, `--accent-blue`, etc.) are stored as OKLCH triplets so opacity can be combined at the call site. Themes are keyed off `data-theme` (`dark` is the default; `light` activates explicitly or via `prefers-color-scheme: light` when no override is set). Existing v5 variables are unchanged; component styles continue to use them until they are migrated. diff --git a/packages/graphiql-react/src/style/root.css b/packages/graphiql-react/src/style/root.css index 4bce741a1dd..d8d63da1462 100644 --- a/packages/graphiql-react/src/style/root.css +++ b/packages/graphiql-react/src/style/root.css @@ -1,3 +1,4 @@ +@import 'tokens.css'; @import 'auto-insertion.css'; @import 'editor.css'; diff --git a/packages/graphiql-react/src/style/tokens.css b/packages/graphiql-react/src/style/tokens.css new file mode 100644 index 00000000000..1b1a1674062 --- /dev/null +++ b/packages/graphiql-react/src/style/tokens.css @@ -0,0 +1,152 @@ +/* + * v6 design tokens. + * + * Color tokens are stored as OKLCH component triplets (L% C H) so callers + * can combine them with alpha at the use site: + * + * background: oklch(var(--bg-canvas)); + * color: oklch(var(--fg-default) / 0.6); + * + * Variable names defined here are the supported retheming surface; class + * names and internal selectors are not public API. + */ + +:root, +[data-theme='dark'] { + /* Backgrounds */ + --bg-canvas: 17.63% 0.014 258; /* #0D1117 */ + --bg-elevated: 10.39% 0.019 248; /* #010409 */ + --bg-subtle: 22.02% 0.016 257; /* #161B22 */ + --bg-overlay: 26.66% 0.015 257; /* #21262D */ + + /* Borders */ + --border-default: 24.58% 0.015 257; /* #1C2128 */ + --border-muted: 26.66% 0.015 257; /* #21262D */ + --border-strong: 33% 0.015 252; /* #30363D */ + + /* Foreground */ + --fg-default: 85.69% 0.014 248; /* #C9D1D9 */ + --fg-strong: 97.03% 0.01 248; /* #F0F6FC */ + --fg-muted: 66.25% 0.018 251; /* #8B949E */ + --fg-subtle: 61.37% 0.019 256; /* #7D8590 */ + --fg-disabled: 56.29% 0.02 256; /* #6E7681 */ + --fg-dim: 42.47% 0.017 255; /* #484F58 */ + + /* Accents */ + --accent-blue: 78.57% 0.115 247; /* #79C0FF */ + --accent-green: 69.51% 0.181 146; /* #3FB950 */ + --accent-green-light: 84.16% 0.164 146; /* #7EE787 */ + --accent-yellow: 85.74% 0.133 90; /* #F2CC60 */ + --accent-orange: 79.91% 0.141 60; /* #FFA657 */ + --accent-red: 66.51% 0.205 27; /* #F85149 */ + --accent-purple: 80.05% 0.127 306; /* #D2A8FF */ + --accent-pink: 73.45% 0.163 26; /* #FF7B72 */ + + /* Action button (Run) */ + --btn-primary: 54.6% 0.147 146; /* #238636 */ + --btn-primary-border: 62.22% 0.166 146; /* #2EA043 */ + + /* Typography */ + --font-family: 'Inter', ui-sans-serif, system-ui, sans-serif; + --font-family-mono: 'JetBrains Mono', ui-monospace, monospace; + --font-size-body: 13px; + --font-size-small: 11px; + --font-size-mono: 12px; + --font-size-eyebrow: 10.5px; + --line-height-body: 18px; + --letter-spacing-ui: -0.005em; + + /* Spacing scale */ + --px-4: 4px; + --px-6: 6px; + --px-8: 8px; + --px-10: 10px; + --px-12: 12px; + --px-14: 14px; + --px-16: 16px; + --px-24: 24px; + --px-32: 32px; + + /* Layout dimensions */ + --top-bar-height: 40px; + --status-bar-height: 24px; + --rail-width: 48px; + --side-panel-width: 340px; + --tab-strip-height: 32px; + + /* Radii */ + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 8px; +} + +[data-theme='light'] { + /* Backgrounds */ + --bg-canvas: 99% 0.005 248; + --bg-elevated: 100% 0 248; + --bg-subtle: 96% 0.008 248; + --bg-overlay: 92% 0.01 248; + + /* Borders */ + --border-default: 90% 0.01 248; + --border-muted: 85% 0.01 248; + --border-strong: 78% 0.012 248; + + /* Foreground */ + --fg-default: 20% 0.013 248; + --fg-strong: 12% 0.011 248; + --fg-muted: 40% 0.013 248; + --fg-subtle: 50% 0.012 248; + --fg-disabled: 65% 0.012 248; + --fg-dim: 75% 0.011 248; + + /* Accents — slightly darker / more saturated for AA contrast on light bg */ + --accent-blue: 50% 0.193 248; + --accent-green: 50% 0.176 145; + --accent-green-light: 65% 0.19 145; + --accent-yellow: 70% 0.15 86; + --accent-orange: 62% 0.165 60; + --accent-red: 55% 0.224 27; + --accent-purple: 55% 0.18 295; + --accent-pink: 58% 0.22 17; + + /* Action button (Run) — keeps the green; inverted bg lets it stand out */ + --btn-primary: 51% 0.15 145; + --btn-primary-border: 45% 0.17 145; + + /* Typography, spacing, dimensions, and radii are inherited from :root. */ +} + +/* + * Apply light overrides automatically when the system prefers light and the + * user has not pinned dark. The values are duplicated rather than relying on + * inheritance into a media query, which can resolve inconsistently across + * browsers when the source rule is keyed off a different selector. + */ +@media (prefers-color-scheme: light) { + :root:not([data-theme='dark']) { + --bg-canvas: 99% 0.005 248; + --bg-elevated: 100% 0 248; + --bg-subtle: 96% 0.008 248; + --bg-overlay: 92% 0.01 248; + --border-default: 90% 0.01 248; + --border-muted: 85% 0.01 248; + --border-strong: 78% 0.012 248; + --fg-default: 20% 0.013 248; + --fg-strong: 12% 0.011 248; + --fg-muted: 40% 0.013 248; + --fg-subtle: 50% 0.012 248; + --fg-disabled: 65% 0.012 248; + --fg-dim: 75% 0.011 248; + --accent-blue: 50% 0.193 248; + --accent-green: 50% 0.176 145; + --accent-green-light: 65% 0.19 145; + --accent-yellow: 70% 0.15 86; + --accent-orange: 62% 0.165 60; + --accent-red: 55% 0.224 27; + --accent-purple: 55% 0.18 295; + --accent-pink: 58% 0.22 17; + --btn-primary: 51% 0.15 145; + --btn-primary-border: 45% 0.17 145; + } +} diff --git a/resources/custom-words.txt b/resources/custom-words.txt index ab691a503e4..e2737fd1f2b 100644 --- a/resources/custom-words.txt +++ b/resources/custom-words.txt @@ -153,6 +153,7 @@ nullthrows nulltype nvim objectvalues +oklch onig ooops orche @@ -182,6 +183,7 @@ randomthing ravikoti resi resizer +retheming rikki roadmap roboto From d9873c3abd0717bc5901010e945c886d9017e002 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 13 May 2026 05:25:58 -0700 Subject: [PATCH 05/38] v6: Set up Storybook in `@graphiql/react` (#4254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Storybook gives us a fast feedback loop for iterating on the look of the app and individual components — flipping themes/density/font-size without spinning up the full GraphiQL shell. - Bootstrap Storybook 10 in `@graphiql/react`. Stories colocated as `.stories.tsx`; ships one starter (`Spinner`) to validate the pipeline. - A global decorator wraps every story in `.graphiql-container` with `data-theme` / `data-density` / `data-font-size` attributes, toggleable from the Storybook toolbar. - Move `Uri`, `KeyMod`, `KeyCode`, and `Range` out of the `utility` barrel into direct imports from `utility/monaco-ssr`. The barrel was bundling two unrelated concerns — lightweight UI helpers (`cn`, `pick`, etc.) and heavy Monaco re-exports — so any story reaching for `cn` transitively pulled Monaco's ESM bundle, which doesn't initialize cleanly inside Storybook's preview iframe. Splitting them keeps UI primitives lightweight. ## Run locally From the repo root: ``` yarn storybook # dev server on http://localhost:6006 yarn build-storybook # static build under packages/graphiql-react/storybook-static ``` Refs: graphql/graphiql#4219 --- .gitignore | 2 + package.json | 2 + packages/graphiql-react/.storybook/main.ts | 9 + .../graphiql-react/.storybook/preview.tsx | 64 ++ packages/graphiql-react/package.json | 4 + .../src/components/operation-editor.tsx | 3 +- .../src/components/response-editor.tsx | 2 +- .../src/components/spinner/spinner.stories.ts | 13 + packages/graphiql-react/src/constants.ts | 2 +- packages/graphiql-react/src/index.ts | 1 + .../graphiql-react/src/stores/execution.ts | 3 +- .../src/utility/create-editor.ts | 2 +- packages/graphiql-react/src/utility/index.ts | 1 - yarn.lock | 775 ++++++++++++++++-- 14 files changed, 816 insertions(+), 67 deletions(-) create mode 100644 packages/graphiql-react/.storybook/main.ts create mode 100644 packages/graphiql-react/.storybook/preview.tsx create mode 100644 packages/graphiql-react/src/components/spinner/spinner.stories.ts diff --git a/.gitignore b/.gitignore index 8f0b981fff2..38f3fb5120e 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,5 @@ packages/graphiql/typedoc/ packages/graphiql/webpack/ .react-router/ + +storybook-static/ diff --git a/package.json b/package.json index 63384736e7a..8a6457ac212 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ "dev:graphiql": "turbo run dev --filter=graphiql...", "dev:example-nextjs": "turbo run dev --filter=example-graphiql-nextjs...", "dev:example-vite": "turbo run dev --filter=example-graphiql-vite...", + "storybook": "yarn workspace @graphiql/react storybook", + "build-storybook": "yarn workspace @graphiql/react build-storybook", "build:graphiql": "turbo run build --filter=graphiql...", "build": "yarn build-clean && yarn build:tsc && yarn build:nontsc", "build-bundles": "yarn prebuild-bundles && yarn wsrun:noexamples --stages build-bundles", diff --git a/packages/graphiql-react/.storybook/main.ts b/packages/graphiql-react/.storybook/main.ts new file mode 100644 index 00000000000..cf7d1305e8a --- /dev/null +++ b/packages/graphiql-react/.storybook/main.ts @@ -0,0 +1,9 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(ts|tsx)'], + addons: [], + framework: { name: '@storybook/react-vite', options: {} }, +}; + +export default config; diff --git a/packages/graphiql-react/.storybook/preview.tsx b/packages/graphiql-react/.storybook/preview.tsx new file mode 100644 index 00000000000..2c975d64305 --- /dev/null +++ b/packages/graphiql-react/.storybook/preview.tsx @@ -0,0 +1,64 @@ +import type { Preview } from '@storybook/react-vite'; +import '../src/style/root.css'; + +const preview: Preview = { + parameters: { + backgrounds: { disable: true }, + }, + globalTypes: { + theme: { + description: 'Theme', + defaultValue: 'dark', + toolbar: { + icon: 'circlehollow', + items: [ + { value: 'dark', title: 'Dark' }, + { value: 'light', title: 'Light' }, + ], + dynamicTitle: true, + }, + }, + density: { + description: 'Density', + defaultValue: 'comfortable', + toolbar: { + icon: 'expand', + items: [ + { value: 'compact', title: 'Compact' }, + { value: 'comfortable', title: 'Comfortable' }, + { value: 'spacious', title: 'Spacious' }, + ], + dynamicTitle: true, + }, + }, + fontSize: { + description: 'Font size', + defaultValue: 'default', + toolbar: { + icon: 'beaker', + items: [ + { value: 'compact', title: 'Compact' }, + { value: 'default', title: 'Default' }, + { value: 'large', title: 'Large' }, + { value: 'xl', title: 'Extra large' }, + ], + dynamicTitle: true, + }, + }, + }, + decorators: [ + (Story, ctx) => ( +
+ +
+ ), + ], +}; + +export default preview; diff --git a/packages/graphiql-react/package.json b/packages/graphiql-react/package.json index bf9d9dcbd99..dadd8ed9108 100644 --- a/packages/graphiql-react/package.json +++ b/packages/graphiql-react/package.json @@ -42,6 +42,8 @@ "types:check": "tsc --noEmit", "dev": "vite build --watch --emptyOutDir=false", "build": "vite build", + "build-storybook": "storybook build", + "storybook": "storybook dev -p 6006", "test": "vitest run --typecheck" }, "peerDependencies": { @@ -70,6 +72,7 @@ }, "devDependencies": { "@babel/helper-string-parser": "^7.19.4", + "@storybook/react-vite": "^10.3.6", "@types/get-value": "^3.0.5", "@types/markdown-it": "^14.1.2", "@types/react-dom": "^19.1.2", @@ -79,6 +82,7 @@ "graphql": "^16.9.0", "react": "^19.1.0", "react-dom": "^19.1.0", + "storybook": "^10.3.6", "typescript": "^5.8.0", "vite": "^6.3.4", "vite-plugin-dts": "^4.5.3", diff --git a/packages/graphiql-react/src/components/operation-editor.tsx b/packages/graphiql-react/src/components/operation-editor.tsx index 4dfd7ac4226..1cf5a021294 100644 --- a/packages/graphiql-react/src/components/operation-editor.tsx +++ b/packages/graphiql-react/src/components/operation-editor.tsx @@ -15,9 +15,8 @@ import { pick, cleanupDisposables, cn, - Uri, - Range, } from '../utility'; +import { Uri, Range } from '../utility/monaco-ssr'; import type { MonacoEditor, EditorProps, SchemaReference } from '../types'; import { KEY_BINDINGS, diff --git a/packages/graphiql-react/src/components/response-editor.tsx b/packages/graphiql-react/src/components/response-editor.tsx index 4cc32990e16..eaff718bee3 100644 --- a/packages/graphiql-react/src/components/response-editor.tsx +++ b/packages/graphiql-react/src/components/response-editor.tsx @@ -10,8 +10,8 @@ import { pick, cleanupDisposables, cn, - Range, } from '../utility'; +import { Range } from '../utility/monaco-ssr'; import { KEY_BINDINGS, URI_NAME } from '../constants'; import type { EditorProps } from '../types'; import type * as monaco from 'monaco-editor'; diff --git a/packages/graphiql-react/src/components/spinner/spinner.stories.ts b/packages/graphiql-react/src/components/spinner/spinner.stories.ts new file mode 100644 index 00000000000..3f6ca7caf13 --- /dev/null +++ b/packages/graphiql-react/src/components/spinner/spinner.stories.ts @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Spinner } from './'; + +const meta = { + title: 'Primitives/Spinner', + component: Spinner, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/packages/graphiql-react/src/constants.ts b/packages/graphiql-react/src/constants.ts index 996f5724fd2..18b8c25fb8c 100644 --- a/packages/graphiql-react/src/constants.ts +++ b/packages/graphiql-react/src/constants.ts @@ -1,7 +1,7 @@ /* eslint-disable no-bitwise */ import type { DiagnosticSettings } from 'monaco-graphql'; import type * as monaco from 'monaco-editor'; -import { KeyCode, KeyMod } from './utility'; +import { KeyCode, KeyMod } from './utility/monaco-ssr'; import type { EditorSlice } from './stores'; export const isMacOs = diff --git a/packages/graphiql-react/src/index.ts b/packages/graphiql-react/src/index.ts index d7a4b2cfe49..314b81a7a3c 100644 --- a/packages/graphiql-react/src/index.ts +++ b/packages/graphiql-react/src/index.ts @@ -2,6 +2,7 @@ import './style/root.css'; export { useMonaco } from './stores'; export * from './utility'; +export { Uri, KeyMod, KeyCode, Range } from './utility/monaco-ssr'; export type { TabsState } from './utility/tabs'; export * from './icons'; export * from './components'; diff --git a/packages/graphiql-react/src/stores/execution.ts b/packages/graphiql-react/src/stores/execution.ts index 5020b2a3db5..824d933656b 100644 --- a/packages/graphiql-react/src/stores/execution.ts +++ b/packages/graphiql-react/src/stores/execution.ts @@ -14,7 +14,8 @@ import setValue from 'set-value'; import getValue from 'get-value'; import type { StateCreator } from 'zustand'; -import { tryParseJSONC, Range } from '../utility'; +import { tryParseJSONC } from '../utility'; +import { Range } from '../utility/monaco-ssr'; import type { SlicesWithActions, MonacoEditor } from '../types'; export interface ExecutionSlice { diff --git a/packages/graphiql-react/src/utility/create-editor.ts b/packages/graphiql-react/src/utility/create-editor.ts index d2623804030..a480294cafd 100644 --- a/packages/graphiql-react/src/utility/create-editor.ts +++ b/packages/graphiql-react/src/utility/create-editor.ts @@ -2,7 +2,7 @@ import type { KeyboardEventHandler, RefObject } from 'react'; import type * as monaco from 'monaco-editor'; import type { MonacoEditor } from '../types'; import { monacoStore } from '../stores'; -import { Uri } from '../utility'; +import { Uri } from './monaco-ssr'; export const onEditorContainerKeyDown: KeyboardEventHandler< HTMLDivElement diff --git a/packages/graphiql-react/src/utility/index.ts b/packages/graphiql-react/src/utility/index.ts index b1cbca2a325..2090463161a 100644 --- a/packages/graphiql-react/src/utility/index.ts +++ b/packages/graphiql-react/src/utility/index.ts @@ -8,7 +8,6 @@ export { export { debounce } from './debounce'; export { formatJSONC, parseJSONC, tryParseJSONC } from './jsonc'; export { markdown } from './markdown'; -export { Uri, KeyMod, KeyCode, Range } from './monaco-ssr'; export { pick } from './pick'; export { useDragResize } from './resize'; export { clsx as cn } from 'clsx'; diff --git a/yarn.lock b/yarn.lock index 25a24f35a1e..d6c319f31fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1577,7 +1577,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.23.5, @babel/types@npm:^7.23.6, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.23.5, @babel/types@npm:^7.23.6, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -2434,6 +2434,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/aix-ppc64@npm:0.27.7" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/android-arm64@npm:0.18.10" @@ -2455,6 +2462,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm64@npm:0.27.7" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/android-arm@npm:0.18.10" @@ -2476,6 +2490,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm@npm:0.27.7" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/android-x64@npm:0.18.10" @@ -2497,6 +2518,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/darwin-arm64@npm:0.18.10" @@ -2518,6 +2546,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-arm64@npm:0.27.7" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/darwin-x64@npm:0.18.10" @@ -2539,6 +2574,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-x64@npm:0.27.7" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/freebsd-arm64@npm:0.18.10" @@ -2560,6 +2602,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-arm64@npm:0.27.7" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/freebsd-x64@npm:0.18.10" @@ -2581,6 +2630,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-x64@npm:0.27.7" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-arm64@npm:0.18.10" @@ -2602,6 +2658,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm64@npm:0.27.7" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-arm@npm:0.18.10" @@ -2623,6 +2686,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm@npm:0.27.7" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-ia32@npm:0.18.10" @@ -2644,6 +2714,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ia32@npm:0.27.7" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-loong64@npm:0.18.10" @@ -2665,6 +2742,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-loong64@npm:0.27.7" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-mips64el@npm:0.18.10" @@ -2686,6 +2770,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-mips64el@npm:0.27.7" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-ppc64@npm:0.18.10" @@ -2707,6 +2798,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ppc64@npm:0.27.7" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-riscv64@npm:0.18.10" @@ -2728,6 +2826,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-riscv64@npm:0.27.7" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-s390x@npm:0.18.10" @@ -2749,6 +2854,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-s390x@npm:0.27.7" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/linux-x64@npm:0.18.10" @@ -2770,6 +2882,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-x64@npm:0.27.7" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/netbsd-arm64@npm:0.25.3" @@ -2777,6 +2896,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-arm64@npm:0.27.7" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/netbsd-x64@npm:0.18.10" @@ -2798,6 +2924,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-x64@npm:0.27.7" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/openbsd-arm64@npm:0.23.1" @@ -2812,6 +2945,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-arm64@npm:0.27.7" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/openbsd-x64@npm:0.18.10" @@ -2833,6 +2973,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-x64@npm:0.27.7" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openharmony-arm64@npm:0.27.7" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/sunos-x64@npm:0.18.10" @@ -2854,6 +3008,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/sunos-x64@npm:0.27.7" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/win32-arm64@npm:0.18.10" @@ -2875,6 +3036,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-arm64@npm:0.27.7" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/win32-ia32@npm:0.18.10" @@ -2896,6 +3064,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-ia32@npm:0.27.7" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.18.10": version: 0.18.10 resolution: "@esbuild/win32-x64@npm:0.18.10" @@ -2917,6 +3092,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-x64@npm:0.27.7" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@exodus/bytes@npm:^1.11.0, @exodus/bytes@npm:^1.15.0, @exodus/bytes@npm:^1.6.0": version: 1.15.0 resolution: "@exodus/bytes@npm:1.15.0" @@ -3109,6 +3291,7 @@ __metadata: "@radix-ui/react-dropdown-menu": "npm:^2.1" "@radix-ui/react-tooltip": "npm:^1.2" "@radix-ui/react-visually-hidden": "npm:^1.2" + "@storybook/react-vite": "npm:^10.3.6" "@types/get-value": "npm:^3.0.5" "@types/markdown-it": "npm:^14.1.2" "@types/react-dom": "npm:^19.1.2" @@ -3129,6 +3312,7 @@ __metadata: react-compiler-runtime: "npm:19.1.0-rc.1" react-dom: "npm:^19.1.0" set-value: "npm:^4.1.0" + storybook: "npm:^10.3.6" typescript: "npm:^5.8.0" vite: "npm:^6.3.4" vite-plugin-dts: "npm:^4.5.3" @@ -3832,6 +4016,22 @@ __metadata: languageName: node linkType: hard +"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.7.0": + version: 0.7.0 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.7.0" + dependencies: + glob: "npm:^13.0.1" + react-docgen-typescript: "npm:^2.2.2" + peerDependencies: + typescript: ">= 4.3.x" + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/6d1a353e4dd0d9d641beafcf8d5c36805ad7f916ae07b817642033bc85c388f819f92dc94db192117dedfaa5d981ac5ef72911315e3e4bf2fe9e23d8956618e6 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.12 resolution: "@jridgewell/gen-mapping@npm:0.3.12" @@ -3869,10 +4069,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 languageName: node linkType: hard @@ -5563,7 +5763,7 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.3, @rollup/pluginutils@npm:^5.1.4": +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.3, @rollup/pluginutils@npm:^5.1.4": version: 5.3.0 resolution: "@rollup/pluginutils@npm:5.3.0" dependencies: @@ -5852,6 +6052,113 @@ __metadata: languageName: node linkType: hard +"@storybook/builder-vite@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/builder-vite@npm:10.3.6" + dependencies: + "@storybook/csf-plugin": "npm:10.3.6" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^10.3.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/f7e5c57362ba8df8dac4f71dc86d4117cd1edfaf2f61a3ecb0d6bece6b37357f1dc0bf135fd27b5552055b47e0fce5ffba67ffeb2fdedbc75fc986997062bf28 + languageName: node + linkType: hard + +"@storybook/csf-plugin@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/csf-plugin@npm:10.3.6" + dependencies: + unplugin: "npm:^2.3.5" + peerDependencies: + esbuild: "*" + rollup: "*" + storybook: ^10.3.6 + vite: "*" + webpack: "*" + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + checksum: 10c0/593fc6b9b6073c9dacd26f595ccb58f1ac28f3ab3cf63bf3d8d6913285765eb9c4fdb3e1c54356804ec8eccdde24f14cfa7af3e528731eb6d7e52266d81c4213 + languageName: node + linkType: hard + +"@storybook/global@npm:^5.0.0": + version: 5.0.0 + resolution: "@storybook/global@npm:5.0.0" + checksum: 10c0/8f1b61dcdd3a89584540896e659af2ecc700bc740c16909a7be24ac19127ea213324de144a141f7caf8affaed017d064fea0618d453afbe027cf60f54b4a6d0b + languageName: node + linkType: hard + +"@storybook/icons@npm:^2.0.1": + version: 2.0.2 + resolution: "@storybook/icons@npm:2.0.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/072486356fc929ba5a1a225a8636f0e50b2019083e86e4d48d55aeeae4b40f17731cd1eea9cf1785c53e5fc4409fa93aeca15dccb96675c8e7ab536b18ba864c + languageName: node + linkType: hard + +"@storybook/react-dom-shim@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/react-dom-shim@npm:10.3.6" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.3.6 + checksum: 10c0/60183fc05b0410ca174f215d3271ffbccdc2680bd0704f58dc931cf60e72f497a9f22c00afa868398ad693c7ec633ef619541d4b0611fc2a577fb09609fcc3c7 + languageName: node + linkType: hard + +"@storybook/react-vite@npm:^10.3.6": + version: 10.3.6 + resolution: "@storybook/react-vite@npm:10.3.6" + dependencies: + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.7.0" + "@rollup/pluginutils": "npm:^5.0.2" + "@storybook/builder-vite": "npm:10.3.6" + "@storybook/react": "npm:10.3.6" + empathic: "npm:^2.0.0" + magic-string: "npm:^0.30.0" + react-docgen: "npm:^8.0.0" + resolve: "npm:^1.22.8" + tsconfig-paths: "npm:^4.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.3.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/3b939caf05985f0c6d5049c49b71fd8c7abac1f94f1559cfa135a755f3d94c0ef29bdd8d7f7f68c4676ea66852ed4b43d2e33d18434aa1c72f4aebca928b3e13 + languageName: node + linkType: hard + +"@storybook/react@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/react@npm:10.3.6" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@storybook/react-dom-shim": "npm:10.3.6" + react-docgen: "npm:^8.0.2" + react-docgen-typescript: "npm:^2.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.3.6 + typescript: ">= 4.9.x" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3d3af66105cdca98c537b4bcc3e92f87e3b56d154b24e9b167300e9d5de8a7ba6a5ef3c22203ccb6f4c2f0602a5546273b2b49728aa383ba0f98e66a286647a8 + languageName: node + linkType: hard + "@surma/rollup-plugin-off-main-thread@npm:^2.2.3": version: 2.2.3 resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3" @@ -6053,18 +6360,17 @@ __metadata: languageName: node linkType: hard -"@testing-library/jest-dom@npm:^6.6.3": - version: 6.6.3 - resolution: "@testing-library/jest-dom@npm:6.6.3" +"@testing-library/jest-dom@npm:^6.6.3, @testing-library/jest-dom@npm:^6.9.1": + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" dependencies: "@adobe/css-tools": "npm:^4.4.0" aria-query: "npm:^5.0.0" - chalk: "npm:^3.0.0" css.escape: "npm:^1.5.1" dom-accessibility-api: "npm:^0.6.3" - lodash: "npm:^4.17.21" + picocolors: "npm:^1.1.1" redent: "npm:^3.0.0" - checksum: 10c0/5566b6c0b7b0709bc244aec3aa3dc9e5f4663e8fb2b99d8cd456fc07279e59db6076cbf798f9d3099a98fca7ef4cd50e4e1f4c4dec5a60a8fad8d24a638a5bf6 + checksum: 10c0/4291ebd2f0f38d14cefac142c56c337941775a5807e2a3d6f1a14c2fbd6be76a18e498ed189e95bedc97d9e8cf1738049bc76c85b5bc5e23fae7c9e10f7b3a12 languageName: node linkType: hard @@ -6088,6 +6394,15 @@ __metadata: languageName: node linkType: hard +"@testing-library/user-event@npm:^14.6.1": + version: 14.6.1 + resolution: "@testing-library/user-event@npm:14.6.1" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10c0/75fea130a52bf320d35d46ed54f3eec77e71a56911b8b69a3fe29497b0b9947b2dc80d30f04054ad4ce7f577856ae3e5397ea7dff0ef14944d3909784c7a93fe + languageName: node + linkType: hard + "@types/argparse@npm:1.0.38": version: 1.0.38 resolution: "@types/argparse@npm:1.0.38" @@ -6134,12 +6449,12 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*": - version: 7.20.1 - resolution: "@types/babel__traverse@npm:7.20.1" +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.7": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/5a6a3a26be090573309527184a31f1b82ef55f3d73d811c15f181d323e471305f2390651a04d49d4cd4ca41bbeabb53c9f7862a8e09eab5a0f8910a6aec6e867 + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 languageName: node linkType: hard @@ -6188,6 +6503,16 @@ __metadata: languageName: node linkType: hard +"@types/chai@npm:^5.2.2": + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" + dependencies: + "@types/deep-eql": "npm:*" + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f + languageName: node + linkType: hard + "@types/codemirror@npm:^0.0.90": version: 0.0.90 resolution: "@types/codemirror@npm:0.0.90" @@ -6232,6 +6557,20 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: 10c0/cdaca493f13c321cf0cacd1973efc0ae74569633145d9e6fc1128f32217a6968c33bea1f858275239fe90c98f3be57ec8f452b416a9ff48b8e8c1098b20fa51c + languageName: node + linkType: hard + "@types/dotenv@npm:8.2.0": version: 8.2.0 resolution: "@types/dotenv@npm:8.2.0" @@ -6562,6 +6901,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:^1.20.2": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: 10c0/a9b0549d816ff2c353077365d865a33655a141d066d0f5a3ba6fd4b28bc2f4188a510079f7c1f715b3e7af505a27374adce2a5140a3ece2a059aab3d6e1a4244 + languageName: node + linkType: hard + "@types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" @@ -6891,6 +7237,19 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/expect@npm:3.2.4" + dependencies: + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/7586104e3fd31dbe1e6ecaafb9a70131e4197dce2940f727b6a84131eee3decac7b10f9c7c72fa5edbdb68b6f854353bd4c0fa84779e274207fb7379563b10db + languageName: node + linkType: hard + "@vitest/mocker@npm:2.1.9": version: 2.1.9 resolution: "@vitest/mocker@npm:2.1.9" @@ -6919,6 +7278,15 @@ __metadata: languageName: node linkType: hard +"@vitest/pretty-format@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/pretty-format@npm:3.2.4" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/5ad7d4278e067390d7d633e307fee8103958806a419ca380aec0e33fae71b44a64415f7a9b4bc11635d3c13d4a9186111c581d3cef9c65cc317e68f077456887 + languageName: node + linkType: hard + "@vitest/runner@npm:2.1.9": version: 2.1.9 resolution: "@vitest/runner@npm:2.1.9" @@ -6949,6 +7317,15 @@ __metadata: languageName: node linkType: hard +"@vitest/spy@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/spy@npm:3.2.4" + dependencies: + tinyspy: "npm:^4.0.3" + checksum: 10c0/6ebf0b4697dc238476d6b6a60c76ba9eb1dd8167a307e30f08f64149612fd50227682b876420e4c2e09a76334e73f72e3ebf0e350714dc22474258292e202024 + languageName: node + linkType: hard + "@vitest/utils@npm:2.1.9": version: 2.1.9 resolution: "@vitest/utils@npm:2.1.9" @@ -6960,6 +7337,17 @@ __metadata: languageName: node linkType: hard +"@vitest/utils@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/utils@npm:3.2.4" + dependencies: + "@vitest/pretty-format": "npm:3.2.4" + loupe: "npm:^3.1.4" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/024a9b8c8bcc12cf40183c246c244b52ecff861c6deb3477cbf487ac8781ad44c68a9c5fd69f8c1361878e55b97c10d99d511f2597f1f7244b5e5101d028ba64 + languageName: node + linkType: hard + "@vitest/web-worker@npm:3.1.4": version: 3.1.4 resolution: "@vitest/web-worker@npm:3.1.4" @@ -7447,6 +7835,13 @@ __metadata: languageName: node linkType: hard +"@webcontainer/env@npm:^1.1.1": + version: 1.1.1 + resolution: "@webcontainer/env@npm:1.1.1" + checksum: 10c0/bc64114ffa7ee92f4985cc2bdd5e27f6f31d892b9aa5cde68eaf93df02d13ee6edf13faeebdd701464183b6f8f9c47c14975958cdd6fc20e7356ad32f6ee39e7 + languageName: node + linkType: hard + "@webpack-cli/configtest@npm:^2.1.1": version: 2.1.1 resolution: "@webpack-cli/configtest@npm:2.1.1" @@ -8145,6 +8540,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.16.1": + version: 0.16.1 + resolution: "ast-types@npm:0.16.1" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf + languageName: node + linkType: hard + "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" @@ -8834,16 +9238,16 @@ __metadata: languageName: node linkType: hard -"chai@npm:^5.1.2": - version: 5.1.2 - resolution: "chai@npm:5.1.2" +"chai@npm:^5.1.2, chai@npm:^5.2.0": + version: 5.3.3 + resolution: "chai@npm:5.3.3" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10c0/6c04ff8495b6e535df9c1b062b6b094828454e9a3c9493393e55b2f4dbff7aa2a29a4645133cad160fb00a16196c4dc03dc9bb37e1f4ba9df3b5f50d7533a736 + checksum: 10c0/b360fd4d38861622e5010c2f709736988b05c7f31042305fa3f4e9911f6adb80ccfb4e302068bf8ed10e835c2e2520cba0f5edc13d878b886987e5aa62483f53 languageName: node linkType: hard @@ -8858,16 +9262,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 - languageName: node - linkType: hard - "chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -10412,6 +10806,15 @@ __metadata: languageName: node linkType: hard +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + "dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" @@ -10655,6 +11058,13 @@ __metadata: languageName: node linkType: hard +"empathic@npm:^2.0.0": + version: 2.0.1 + resolution: "empathic@npm:2.0.1" + checksum: 10c0/577f2868bfcad4ffbf911b57c75016125eb8cc8a7d32cf2d3e9fbcb31bfe6e9e6b66d9457ac34ccb2cd38bff353b3af34287899e0360b8c561ff6d4a048aca62 + languageName: node + linkType: hard + "encodeurl@npm:~2.0.0": version: 2.0.0 resolution: "encodeurl@npm:2.0.0" @@ -10948,6 +11358,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": + version: 0.27.7 + resolution: "esbuild@npm:0.27.7" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.7" + "@esbuild/android-arm": "npm:0.27.7" + "@esbuild/android-arm64": "npm:0.27.7" + "@esbuild/android-x64": "npm:0.27.7" + "@esbuild/darwin-arm64": "npm:0.27.7" + "@esbuild/darwin-x64": "npm:0.27.7" + "@esbuild/freebsd-arm64": "npm:0.27.7" + "@esbuild/freebsd-x64": "npm:0.27.7" + "@esbuild/linux-arm": "npm:0.27.7" + "@esbuild/linux-arm64": "npm:0.27.7" + "@esbuild/linux-ia32": "npm:0.27.7" + "@esbuild/linux-loong64": "npm:0.27.7" + "@esbuild/linux-mips64el": "npm:0.27.7" + "@esbuild/linux-ppc64": "npm:0.27.7" + "@esbuild/linux-riscv64": "npm:0.27.7" + "@esbuild/linux-s390x": "npm:0.27.7" + "@esbuild/linux-x64": "npm:0.27.7" + "@esbuild/netbsd-arm64": "npm:0.27.7" + "@esbuild/netbsd-x64": "npm:0.27.7" + "@esbuild/openbsd-arm64": "npm:0.27.7" + "@esbuild/openbsd-x64": "npm:0.27.7" + "@esbuild/openharmony-arm64": "npm:0.27.7" + "@esbuild/sunos-x64": "npm:0.27.7" + "@esbuild/win32-arm64": "npm:0.27.7" + "@esbuild/win32-ia32": "npm:0.27.7" + "@esbuild/win32-x64": "npm:0.27.7" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/ccd51f0555708bc9ff4ec9dc3ac92d3daacd45ecaac949ca8645984c5c323bf8cefe98c2df307418685e0b4ce37f9a3bdbfe8e3651fe632a0059a436195a17d4 + languageName: node + linkType: hard + "esbuild@npm:^0.23.0": version: 0.23.1 resolution: "esbuild@npm:0.23.1" @@ -11185,7 +11684,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:^4.0.1": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -12724,6 +13223,17 @@ __metadata: languageName: node linkType: hard +"glob@npm:^13.0.1": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + "glob@npm:^7.0.5, glob@npm:^7.0.6, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -14777,7 +15287,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -15401,10 +15911,10 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.2": - version: 3.1.2 - resolution: "loupe@npm:3.1.2" - checksum: 10c0/b13c02e3ddd6a9d5f8bf84133b3242de556512d824dddeea71cce2dbd6579c8f4d672381c4e742d45cf4423d0701765b4a6e5fbc24701def16bc2b40f8daa96a +"loupe@npm:^3.1.0, loupe@npm:^3.1.2, loupe@npm:^3.1.4": + version: 3.2.1 + resolution: "loupe@npm:3.2.1" + checksum: 10c0/910c872cba291309664c2d094368d31a68907b6f5913e989d301b5c25f30e97d76d77f23ab3bf3b46d0f601ff0b6af8810c10c31b91d2c6b2f132809ca2cc705 languageName: node linkType: hard @@ -15491,12 +16001,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10, magic-string@npm:^0.30.12, magic-string@npm:^0.30.17, magic-string@npm:^0.30.4": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.10, magic-string@npm:^0.30.12, magic-string@npm:^0.30.17, magic-string@npm:^0.30.4": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a languageName: node linkType: hard @@ -15868,7 +16378,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.0, minimatch@npm:^10.1.1, minimatch@npm:^10.2.5": +"minimatch@npm:^10.0.0, minimatch@npm:^10.1.1, minimatch@npm:^10.2.2, minimatch@npm:^10.2.5": version: 10.2.5 resolution: "minimatch@npm:10.2.5" dependencies: @@ -15991,10 +16501,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb languageName: node linkType: hard @@ -16741,15 +17251,15 @@ __metadata: languageName: node linkType: hard -"open@npm:^10.0.3": - version: 10.1.2 - resolution: "open@npm:10.1.2" +"open@npm:^10.0.3, open@npm:^10.2.0": + version: 10.2.0 + resolution: "open@npm:10.2.0" dependencies: default-browser: "npm:^5.2.1" define-lazy-prop: "npm:^3.0.0" is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^3.1.0" - checksum: 10c0/1bee796f06e549ce764f693272100323fbc04da8fa3c5b0402d6c2d11b3d76fa0aac0be7535e710015ff035326638e3b9a563f3b0e7ac3266473ed5663caae6d + wsl-utils: "npm:^0.1.0" + checksum: 10c0/5a36d0c1fd2f74ce553beb427ca8b8494b623fc22c6132d0c1688f246a375e24584ea0b44c67133d9ab774fa69be8e12fbe1ff12504b1142bd960fb09671948f languageName: node linkType: hard @@ -17398,7 +17908,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.0": +"path-scurry@npm:^2.0.0, path-scurry@npm:^2.0.2": version: 2.0.2 resolution: "path-scurry@npm:2.0.2" dependencies: @@ -17505,10 +18015,10 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 languageName: node linkType: hard @@ -18059,6 +18569,33 @@ __metadata: languageName: node linkType: hard +"react-docgen-typescript@npm:^2.2.2": + version: 2.4.0 + resolution: "react-docgen-typescript@npm:2.4.0" + peerDependencies: + typescript: ">= 4.3.x" + checksum: 10c0/18e3e1c80d28abcdd72e62261d2f70b0904d9b088f9c2ebe485ffee5e46f5735208bc174a20ed2772112b3ca6432b5f3d5f0ac345872fe76e541f84543e49e50 + languageName: node + linkType: hard + +"react-docgen@npm:^8.0.0, react-docgen@npm:^8.0.2": + version: 8.0.3 + resolution: "react-docgen@npm:8.0.3" + dependencies: + "@babel/core": "npm:^7.28.0" + "@babel/traverse": "npm:^7.28.0" + "@babel/types": "npm:^7.28.2" + "@types/babel__core": "npm:^7.20.5" + "@types/babel__traverse": "npm:^7.20.7" + "@types/doctrine": "npm:^0.0.9" + "@types/resolve": "npm:^1.20.2" + doctrine: "npm:^3.0.0" + resolve: "npm:^1.22.1" + strip-indent: "npm:^4.0.0" + checksum: 10c0/0231fb9177bc7c633f3d1f228eebb0ee90a2f0feac50b1869ef70b0a3683b400d7875547a2d5168f2619b63d4cc29d7c45ae33d3f621fc67a7fa6790ac2049f6 + languageName: node + linkType: hard + "react-dom@npm:18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" @@ -18291,6 +18828,19 @@ __metadata: languageName: node linkType: hard +"recast@npm:^0.23.5": + version: 0.23.11 + resolution: "recast@npm:0.23.11" + dependencies: + ast-types: "npm:^0.16.1" + esprima: "npm:~4.0.0" + source-map: "npm:~0.6.1" + tiny-invariant: "npm:^1.3.3" + tslib: "npm:^2.0.1" + checksum: 10c0/45b520a8f0868a5a24ecde495be9de3c48e69a54295d82a7331106554b75cfba75d16c909959d056e9ceed47a1be5e061e2db8b9ecbcd6ba44c2f3ef9a47bd18 + languageName: node + linkType: hard + "rechoir@npm:^0.8.0": version: 0.8.0 resolution: "rechoir@npm:0.8.0" @@ -18570,7 +19120,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.15.1, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.11, resolve@npm:~1.22.1, resolve@npm:~1.22.2": +"resolve@npm:^1.10.0, resolve@npm:^1.15.1, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.11, resolve@npm:^1.22.8, resolve@npm:~1.22.1, resolve@npm:~1.22.2": version: 1.22.12 resolution: "resolve@npm:1.22.12" dependencies: @@ -18584,7 +19134,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": version: 1.22.12 resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" dependencies: @@ -19786,6 +20336,37 @@ __metadata: languageName: node linkType: hard +"storybook@npm:^10.3.6": + version: 10.3.6 + resolution: "storybook@npm:10.3.6" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^2.0.1" + "@testing-library/jest-dom": "npm:^6.9.1" + "@testing-library/user-event": "npm:^14.6.1" + "@vitest/expect": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" + "@webcontainer/env": "npm:^1.1.1" + esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" + open: "npm:^10.2.0" + recast: "npm:^0.23.5" + semver: "npm:^7.7.3" + use-sync-external-store: "npm:^1.5.0" + ws: "npm:^8.18.0" + peerDependencies: + prettier: ^2 || ^3 + vite-plus: ^0.1.15 + peerDependenciesMeta: + prettier: + optional: true + vite-plus: + optional: true + bin: + storybook: ./dist/bin/dispatcher.js + checksum: 10c0/ee6702667459ba2d49269ddd63a7281f17816fcdd4bacd338ed47a4a8e7ad65760c90d99f6b2dfdfd0a564bcfcab3c1ea05b50bf3aafc6b5b19a039a5da77870 + languageName: node + linkType: hard + "stream-combiner@npm:~0.0.4": version: 0.0.4 resolution: "stream-combiner@npm:0.0.4" @@ -20071,6 +20652,13 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^4.0.0": + version: 4.1.1 + resolution: "strip-indent@npm:4.1.1" + checksum: 10c0/5b23dd5934be0ef6b6fe1b802887f83e56ad9dcd9f6c3896a637da2c6c3a6da3fdf3e51354a98e6cccb6f1c41863e7b9b9deaa348639dfd35f71f3549edb4dff + languageName: node + linkType: hard + "strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.0.0, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -20493,6 +21081,13 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.3.3": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a + languageName: node + linkType: hard + "tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -20538,6 +21133,13 @@ __metadata: languageName: node linkType: hard +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10c0/c83c52bef4e0ae7fb8ec6a722f70b5b6fa8d8be1c85792e829f56c0e1be94ab70b293c032dc5048d4d37cfe678f1f5babb04bdc65fd123098800148ca989184f + languageName: node + linkType: hard + "tinyspy@npm:^3.0.2": version: 3.0.2 resolution: "tinyspy@npm:3.0.2" @@ -20545,6 +21147,13 @@ __metadata: languageName: node linkType: hard +"tinyspy@npm:^4.0.3": + version: 4.0.4 + resolution: "tinyspy@npm:4.0.4" + checksum: 10c0/a8020fc17799251e06a8398dcc352601d2770aa91c556b9531ecd7a12581161fd1c14e81cbdaff0c1306c93bfdde8ff6d1c1a3f9bbe6d91604f0fd4e01e2f1eb + languageName: node + linkType: hard + "tldts-core@npm:^7.0.28": version: 7.0.28 resolution: "tldts-core@npm:7.0.28" @@ -20712,6 +21321,13 @@ __metadata: languageName: node linkType: hard +"ts-dedent@npm:^2.0.0": + version: 2.2.0 + resolution: "ts-dedent@npm:2.2.0" + checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -20739,6 +21355,17 @@ __metadata: languageName: node linkType: hard +"tsconfig-paths@npm:^4.2.0": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: "npm:^2.2.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea + languageName: node + linkType: hard + "tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -20746,7 +21373,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.8.0, tslib@npm:^2.8.1": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.8.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -21266,6 +21893,18 @@ __metadata: languageName: node linkType: hard +"unplugin@npm:^2.3.5": + version: 2.3.11 + resolution: "unplugin@npm:2.3.11" + dependencies: + "@jridgewell/remapping": "npm:^2.3.5" + acorn: "npm:^8.15.0" + picomatch: "npm:^4.0.3" + webpack-virtual-modules: "npm:^0.6.2" + checksum: 10c0/273c1eab0eca4470c7317428689295c31dbe8ab0b306504de9f03cd20c156debb4131bef24b27ac615862958c5dd950a3951d26c0723ea774652ab3624149cff + languageName: node + linkType: hard + "until-async@npm:^3.0.2": version: 3.0.2 resolution: "until-async@npm:3.0.2" @@ -22138,6 +22777,13 @@ __metadata: languageName: node linkType: hard +"webpack-virtual-modules@npm:^0.6.2": + version: 0.6.2 + resolution: "webpack-virtual-modules@npm:0.6.2" + checksum: 10c0/5ffbddf0e84bf1562ff86cf6fcf039c74edf09d78358a6904a09bbd4484e8bb6812dc385fe14330b715031892dcd8423f7a88278b57c9f5002c84c2860179add + languageName: node + linkType: hard + "webpack@npm:^5": version: 5.106.2 resolution: "webpack@npm:5.106.2" @@ -22748,6 +23394,15 @@ __metadata: languageName: node linkType: hard +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10c0/44318f3585eb97be994fc21a20ddab2649feaf1fbe893f1f866d936eea3d5f8c743bec6dc02e49fbdd3c0e69e9b36f449d90a0b165a4f47dd089747af4cf2377 + languageName: node + linkType: hard + "wsrun@npm:^5.2.4": version: 5.2.4 resolution: "wsrun@npm:5.2.4" From 53054cd5b22519c7ddeb2214a6d4330d03878b1b Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 14 May 2026 13:18:04 -0700 Subject: [PATCH 06/38] v6: Add `cypress-axe` for full-app a11y coverage (#4258) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Component a11y is covered by Storybook + axe; this is the full-app counterpart. `cypress-axe` runs axe at four checkpoints during a normal session (initial render, after running a query, with the docs panel open, with the history panel open) and gates PRs against a committed baseline. `cypress/.a11y-baseline.json` pins today's accepted violations — color-contrast in several spots, a couple of nested-interactive cases, link-in-text-block in the docs panel. CI fails on net-new only. The spec lives alongside the existing Cypress suite, so it runs as part of the normal `yarn e2e` flow. `cypress.config.ts` gets a small `writeBaseline` Node task so the spec can persist baseline updates from inside the browser. ## Refresh baseline ``` yarn workspace graphiql test:a11y:update ``` Refs: graphql/graphiql#4219 --- packages/graphiql/cypress.config.ts | 17 + packages/graphiql/cypress/.a11y-baseline.json | 55 ++ packages/graphiql/cypress/e2e/a11y.cy.ts | 104 +++ packages/graphiql/cypress/support/e2e.ts | 1 + packages/graphiql/cypress/tsconfig.json | 4 +- packages/graphiql/package.json | 3 + resources/custom-words.txt | 2 + yarn.lock | 657 ++---------------- 8 files changed, 247 insertions(+), 596 deletions(-) create mode 100644 packages/graphiql/cypress/.a11y-baseline.json create mode 100644 packages/graphiql/cypress/e2e/a11y.cy.ts diff --git a/packages/graphiql/cypress.config.ts b/packages/graphiql/cypress.config.ts index e48832c01c7..6df53e90f35 100644 --- a/packages/graphiql/cypress.config.ts +++ b/packages/graphiql/cypress.config.ts @@ -1,3 +1,5 @@ +import fs from 'node:fs'; +import path from 'node:path'; import { defineConfig } from 'cypress'; const PORT = process.env.CI === 'true' ? 8080 : 5173; @@ -5,6 +7,21 @@ const PORT = process.env.CI === 'true' ? 8080 : 5173; export default defineConfig({ e2e: { baseUrl: `http://localhost:${PORT}`, + setupNodeEvents(on) { + on('task', { + writeBaseline({ filePath, data }: { filePath: string; data: unknown }) { + const abs = path.isAbsolute(filePath) + ? filePath + : path.resolve(process.cwd(), filePath); + const dir = path.dirname(abs); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(abs, JSON.stringify(data, null, 2) + '\n'); + return null; + }, + }); + }, }, video: true, viewportWidth: 1920, diff --git a/packages/graphiql/cypress/.a11y-baseline.json b/packages/graphiql/cypress/.a11y-baseline.json new file mode 100644 index 00000000000..886cfc1a11d --- /dev/null +++ b/packages/graphiql/cypress/.a11y-baseline.json @@ -0,0 +1,55 @@ +{ + "initial": [ + { + "id": "color-contrast", + "impact": "serious", + "nodeCount": 1 + }, + { + "id": "nested-interactive", + "impact": "serious", + "nodeCount": 1 + } + ], + "post-run": [ + { + "id": "color-contrast", + "impact": "serious", + "nodeCount": 2 + }, + { + "id": "nested-interactive", + "impact": "serious", + "nodeCount": 1 + } + ], + "docs-open": [ + { + "id": "color-contrast", + "impact": "serious", + "nodeCount": 21 + }, + { + "id": "link-in-text-block", + "impact": "serious", + "nodeCount": 1 + }, + { + "id": "nested-interactive", + "impact": "serious", + "nodeCount": 1 + } + ], + "history-open": [ + { + "id": "color-contrast", + "impact": "serious", + "nodeCount": 1 + }, + { + "id": "nested-interactive", + "impact": "serious", + "nodeCount": 1 + } + ] +} diff --git a/packages/graphiql/cypress/e2e/a11y.cy.ts b/packages/graphiql/cypress/e2e/a11y.cy.ts new file mode 100644 index 00000000000..9474b9c169f --- /dev/null +++ b/packages/graphiql/cypress/e2e/a11y.cy.ts @@ -0,0 +1,104 @@ +/// +/// + +import baseline from '../.a11y-baseline.json'; + +type ViolationSummary = { + id: string; + impact: string | null; + nodeCount: number; +}; + +type Baseline = Record; + +const UPDATE_BASELINE = Boolean(Cypress.env('A11Y_UPDATE_BASELINE')); + +const RULESET = { + runOnly: { + type: 'tag' as const, + values: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'], + }, +}; + +const accumulated: Baseline = {}; + +function toSummary(v: { + id: string; + impact?: string | null; + nodes: unknown[]; +}): ViolationSummary { + return { id: v.id, impact: v.impact ?? null, nodeCount: v.nodes.length }; +} + +function checkOrCapture(checkpoint: string) { + cy.checkA11y( + undefined, + RULESET, + violations => { + if (UPDATE_BASELINE) { + accumulated[checkpoint] = violations.map(toSummary); + // Task runs in Node; path is relative to the package root. + // cypress.config.ts wires up the writeBaseline task. + cy.task('writeBaseline', { + filePath: 'cypress/.a11y-baseline.json', + data: { ...(baseline as Baseline), ...accumulated }, + }); + } else { + const baselineEntries: ViolationSummary[] = + (baseline as Baseline)[checkpoint] ?? []; + // Compare by violation id only — node counts drift between local + // (Electron on macOS) and CI (headless Chromium on Linux) for the + // same underlying issues, so they're not a reliable key. + const baselineKeys = new Set(baselineEntries.map(v => v.id)); + const newViolations = violations.filter(v => !baselineKeys.has(v.id)); + if (newViolations.length > 0) { + const summary = newViolations + .map(v => `${v.id} (${v.impact}): ${v.help}`) + .join('\n'); + throw new Error( + `New a11y violations at "${checkpoint}":\n${summary}`, + ); + } + } + }, + // Don't let cypress-axe auto-throw — the callback above is the only + // source of failures (compare-against-baseline in normal mode; capture + // and write in update mode). + true, + ); +} + +describe('a11y baseline', () => { + beforeEach(() => { + cy.visit('/'); + cy.injectAxe(); + }); + + it('initial render has no new violations', () => { + checkOrCapture('initial'); + }); + + it('after running a query has no new violations', () => { + cy.clickExecuteQuery(); + // Wait for the response panel to populate before scanning + cy.get('section.result-window').should('not.have.text', ''); + cy.injectAxe(); + checkOrCapture('post-run'); + }); + + it('with docs panel open has no new violations', () => { + // First sidebar button is the docs explorer toggle (confirmed in docs.cy.ts) + cy.get('.graphiql-sidebar button').eq(0).click(); + cy.get('.graphiql-doc-explorer').should('be.visible'); + cy.injectAxe(); + checkOrCapture('docs-open'); + }); + + it('with history panel open has no new violations', () => { + // history.cy.ts uses this exact selector + cy.get('button[aria-label="Show History"]').click(); + cy.get('.graphiql-history').should('be.visible'); + cy.injectAxe(); + checkOrCapture('history-open'); + }); +}); diff --git a/packages/graphiql/cypress/support/e2e.ts b/packages/graphiql/cypress/support/e2e.ts index f9e2ea7fdcb..5727497621d 100644 --- a/packages/graphiql/cypress/support/e2e.ts +++ b/packages/graphiql/cypress/support/e2e.ts @@ -15,3 +15,4 @@ /// import './commands'; +import 'cypress-axe'; diff --git a/packages/graphiql/cypress/tsconfig.json b/packages/graphiql/cypress/tsconfig.json index 48cb1263dad..d5fb01f9ac7 100644 --- a/packages/graphiql/cypress/tsconfig.json +++ b/packages/graphiql/cypress/tsconfig.json @@ -4,7 +4,9 @@ "lib": ["es2021", "dom"], "types": ["cypress", "node"], "strictNullChecks": true, - "strict": true + "strict": true, + "resolveJsonModule": true, + "esModuleInterop": true }, "include": ["**/*.ts"] } diff --git a/packages/graphiql/package.json b/packages/graphiql/package.json index 969d3a195bb..3482344f1a0 100644 --- a/packages/graphiql/package.json +++ b/packages/graphiql/package.json @@ -46,6 +46,7 @@ "cypress-open": "cypress open --browser electron", "dev": "concurrently 'cross-env PORT=8080 node test/e2e-server' vite", "e2e": "yarn e2e-server 'cypress run'", + "test:a11y:update": "CYPRESS_A11Y_UPDATE_BASELINE=1 yarn e2e-server 'cypress run --spec cypress/e2e/a11y.cy.ts'", "e2e-server": "start-server-and-test 'cross-env PORT=8080 node test/e2e-server' 'http-get://localhost:8080/graphql?query={test { id }}'", "test": "vitest run" }, @@ -67,9 +68,11 @@ "@testing-library/react": "^16.3.0", "@vitejs/plugin-react": "^4.4.1", "@vitest/web-worker": "^4.1.6", + "axe-core": "^4", "babel-plugin-react-compiler": "19.1.0-rc.1", "cross-env": "^7.0.2", "cypress": "^13.13.2", + "cypress-axe": "^1", "graphql": "^16.11.0", "lightningcss": "^1.29.3", "react": "^19.1.0", diff --git a/resources/custom-words.txt b/resources/custom-words.txt index e2737fd1f2b..a06ed5fcbbd 100644 --- a/resources/custom-words.txt +++ b/resources/custom-words.txt @@ -189,6 +189,7 @@ roadmap roboto rodionov rohit +ruleset runmode runtimes saihaj @@ -242,6 +243,7 @@ vitejs vitest vizag vsix +wcag webp websockets wgutils diff --git a/yarn.lock b/yarn.lock index 587b4c5b5d3..3491f7110a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2379,25 +2379,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:1.9.2": - version: 1.9.2 - resolution: "@emnapi/core@npm:1.9.2" - dependencies: - "@emnapi/wasi-threads": "npm:1.2.1" - tslib: "npm:^2.4.0" - checksum: 10c0/5500393f953951bad0768fafaa9191f2d938956b20c6d6a79e5ab696a613a25ce6ad23422bc18e86e6ce8deb147619d8d0d7d413a69f84adc01a6633cc353cd9 - languageName: node - linkType: hard - -"@emnapi/runtime@npm:1.9.2": - version: 1.9.2 - resolution: "@emnapi/runtime@npm:1.9.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/61c3a59e0c36784558b8d58eb02bd04815aa5fb0dbfbaf84d1b3050a78aa0cc63ea129ae806bd1e48062bfeb7fc36eb0e5431740d62f64ea51bdf426404b8caa - languageName: node - linkType: hard - "@emnapi/runtime@npm:^1.7.0": version: 1.10.0 resolution: "@emnapi/runtime@npm:1.10.0" @@ -2407,15 +2388,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.2.1": - version: 1.2.1 - resolution: "@emnapi/wasi-threads@npm:1.2.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 - languageName: node - linkType: hard - "@envelop/core@npm:^5.4.0": version: 5.5.1 resolution: "@envelop/core@npm:5.5.1" @@ -4304,18 +4276,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.1, @napi-rs/wasm-runtime@npm:^1.1.4": - version: 1.1.4 - resolution: "@napi-rs/wasm-runtime@npm:1.1.4" - dependencies: - "@tybys/wasm-util": "npm:^0.10.1" - peerDependencies: - "@emnapi/core": ^1.7.1 - "@emnapi/runtime": ^1.7.1 - checksum: 10c0/2e88e1955258949ccf2d18c79975821ad38071b465ef126a5e14110977b97868867b016c1ad046e963cccc42c0bd9db6c8ff5fd1ebb61b87bb3487f339041658 - languageName: node - linkType: hard - "@next/env@npm:15.5.15": version: 15.5.15 resolution: "@next/env@npm:15.5.15" @@ -4473,299 +4433,6 @@ __metadata: languageName: node linkType: hard -"@oxc-parser/binding-android-arm-eabi@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.127.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxc-parser/binding-android-arm64@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-android-arm64@npm:0.127.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-parser/binding-darwin-arm64@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-darwin-arm64@npm:0.127.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-parser/binding-darwin-x64@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-darwin-x64@npm:0.127.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxc-parser/binding-freebsd-x64@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-freebsd-x64@npm:0.127.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-arm64-musl@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.127.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-x64-gnu@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.127.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-parser/binding-linux-x64-musl@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.127.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxc-parser/binding-openharmony-arm64@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.127.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-parser/binding-wasm32-wasi@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.127.0" - dependencies: - "@emnapi/core": "npm:1.9.2" - "@emnapi/runtime": "npm:1.9.2" - "@napi-rs/wasm-runtime": "npm:^1.1.4" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxc-parser/binding-win32-x64-msvc@npm:0.127.0": - version: 0.127.0 - resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.127.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@oxc-project/types@npm:^0.127.0": - version: 0.127.0 - resolution: "@oxc-project/types@npm:0.127.0" - checksum: 10c0/52c0947ac64a9ca119fe971f947e784a35ecd14a072fa3f542a58a5f6c42010b53f2bf92731e39b9899b83c990a9517bbd29d1e5a5b7b489e52616685c6a9278 - languageName: node - linkType: hard - -"@oxc-resolver/binding-android-arm-eabi@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.19.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxc-resolver/binding-android-arm64@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-android-arm64@npm:11.19.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-darwin-arm64@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.19.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-darwin-x64@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-darwin-x64@npm:11.19.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-freebsd-x64@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.19.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.19.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.19.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-arm64-gnu@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.19.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-arm64-musl@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.19.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.19.1" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.19.1" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-riscv64-musl@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.19.1" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-s390x-gnu@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.19.1" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-x64-gnu@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.19.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxc-resolver/binding-linux-x64-musl@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.19.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxc-resolver/binding-openharmony-arm64@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.19.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-wasm32-wasi@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.19.1" - dependencies: - "@napi-rs/wasm-runtime": "npm:^1.1.1" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@oxc-resolver/binding-win32-arm64-msvc@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.19.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxc-resolver/binding-win32-ia32-msvc@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.19.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxc-resolver/binding-win32-x64-msvc@npm:11.19.1": - version: 11.19.1 - resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.19.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@oxfmt/binding-android-arm-eabi@npm:0.45.0": version: 0.45.0 resolution: "@oxfmt/binding-android-arm-eabi@npm:0.45.0" @@ -6392,28 +6059,28 @@ __metadata: languageName: node linkType: hard -"@storybook/builder-vite@npm:10.4.0": - version: 10.4.0 - resolution: "@storybook/builder-vite@npm:10.4.0" +"@storybook/builder-vite@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/builder-vite@npm:10.3.6" dependencies: - "@storybook/csf-plugin": "npm:10.4.0" + "@storybook/csf-plugin": "npm:10.3.6" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.4.0 + storybook: ^10.3.6 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/416240f36b7e93520a6d1168470614fce615062c3c39ea1ad9fe1defffc4f50716b2923210d4e89fa68c1162d89a6f646ef29a08759ed2430ccbf1c0c89453b6 + checksum: 10c0/f7e5c57362ba8df8dac4f71dc86d4117cd1edfaf2f61a3ecb0d6bece6b37357f1dc0bf135fd27b5552055b47e0fce5ffba67ffeb2fdedbc75fc986997062bf28 languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.4.0": - version: 10.4.0 - resolution: "@storybook/csf-plugin@npm:10.4.0" +"@storybook/csf-plugin@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/csf-plugin@npm:10.3.6" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.4.0 + storybook: ^10.3.6 vite: "*" webpack: "*" peerDependenciesMeta: @@ -6425,7 +6092,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/9c968636b14beb9b740b42c3e0f0b81ef2662344bb2328e1149b62e71d3e1e45d82bb08788b6a3fe7755c2884d0b5cf8e033937a07659047764dcfeb91cce80b + checksum: 10c0/593fc6b9b6073c9dacd26f595ccb58f1ac28f3ab3cf63bf3d8d6913285765eb9c4fdb3e1c54356804ec8eccdde24f14cfa7af3e528731eb6d7e52266d81c4213 languageName: node linkType: hard @@ -6436,7 +6103,7 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^2.0.2": +"@storybook/icons@npm:^2.0.1": version: 2.0.2 resolution: "@storybook/icons@npm:2.0.2" peerDependencies: @@ -6446,32 +6113,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:10.4.0": - version: 10.4.0 - resolution: "@storybook/react-dom-shim@npm:10.4.0" +"@storybook/react-dom-shim@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/react-dom-shim@npm:10.3.6" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/d2a07900dd7d35403abb29f23f0f58a53e552003c713a004b465bfc8a781399e3a6062682fe950b79faf5b45bb1955139abe69b6d9f4c3478688b30ebd669274 + storybook: ^10.3.6 + checksum: 10c0/60183fc05b0410ca174f215d3271ffbccdc2680bd0704f58dc931cf60e72f497a9f22c00afa868398ad693c7ec633ef619541d4b0611fc2a577fb09609fcc3c7 languageName: node linkType: hard "@storybook/react-vite@npm:^10.3.6": - version: 10.4.0 - resolution: "@storybook/react-vite@npm:10.4.0" + version: 10.3.6 + resolution: "@storybook/react-vite@npm:10.3.6" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.7.0" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:10.4.0" - "@storybook/react": "npm:10.4.0" + "@storybook/builder-vite": "npm:10.3.6" + "@storybook/react": "npm:10.3.6" empathic: "npm:^2.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -6480,35 +6140,29 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.0 + storybook: ^10.3.6 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/3674c84a59ab75df75bc56fcce9e50464bea05c0d02f6ff6733b734b57d6629b501844a4a9491f01df945eec8c65dd14d9d97552d45aaff49a9782453ee476cf + checksum: 10c0/3b939caf05985f0c6d5049c49b71fd8c7abac1f94f1559cfa135a755f3d94c0ef29bdd8d7f7f68c4676ea66852ed4b43d2e33d18434aa1c72f4aebca928b3e13 languageName: node linkType: hard -"@storybook/react@npm:10.4.0": - version: 10.4.0 - resolution: "@storybook/react@npm:10.4.0" +"@storybook/react@npm:10.3.6": + version: 10.3.6 + resolution: "@storybook/react@npm:10.3.6" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:10.4.0" + "@storybook/react-dom-shim": "npm:10.3.6" react-docgen: "npm:^8.0.2" react-docgen-typescript: "npm:^2.2.2" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.0 + storybook: ^10.3.6 typescript: ">= 4.9.x" peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true typescript: optional: true - checksum: 10c0/b23acb83cb5eccd0b37eb2a73158ed444b702f7e484277e6e65ac05d18dff2c3b1dd45c00941a86e7acd4ba3edfe14f79448c9316915426dbce2752ecceeaa5e + checksum: 10c0/3d3af66105cdca98c537b4bcc3e92f87e3b56d154b24e9b167300e9d5de8a7ba6a5ef3c22203ccb6f4c2f0602a5546273b2b49728aa383ba0f98e66a286647a8 languageName: node linkType: hard @@ -6713,22 +6367,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/jest-dom@npm:^6.6.3": - version: 6.6.3 - resolution: "@testing-library/jest-dom@npm:6.6.3" - dependencies: - "@adobe/css-tools": "npm:^4.4.0" - aria-query: "npm:^5.0.0" - chalk: "npm:^3.0.0" - css.escape: "npm:^1.5.1" - dom-accessibility-api: "npm:^0.6.3" - lodash: "npm:^4.17.21" - redent: "npm:^3.0.0" - checksum: 10c0/5566b6c0b7b0709bc244aec3aa3dc9e5f4663e8fb2b99d8cd456fc07279e59db6076cbf798f9d3099a98fca7ef4cd50e4e1f4c4dec5a60a8fad8d24a638a5bf6 - languageName: node - linkType: hard - -"@testing-library/jest-dom@npm:^6.9.1": +"@testing-library/jest-dom@npm:^6.6.3, @testing-library/jest-dom@npm:^6.9.1": version: 6.9.1 resolution: "@testing-library/jest-dom@npm:6.9.1" dependencies: @@ -6771,15 +6410,6 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.10.1": - version: 0.10.2 - resolution: "@tybys/wasm-util@npm:0.10.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 - languageName: node - linkType: hard - "@types/argparse@npm:1.0.38": version: 1.0.38 resolution: "@types/argparse@npm:1.0.38" @@ -6826,16 +6456,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*": - version: 7.20.1 - resolution: "@types/babel__traverse@npm:7.20.1" - dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/5a6a3a26be090573309527184a31f1b82ef55f3d73d811c15f181d323e471305f2390651a04d49d4cd4ca41bbeabb53c9f7862a8e09eab5a0f8910a6aec6e867 - languageName: node - linkType: hard - -"@types/babel__traverse@npm:^7.20.7": +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.7": version: 7.28.0 resolution: "@types/babel__traverse@npm:7.28.0" dependencies: @@ -9008,6 +8629,13 @@ __metadata: languageName: node linkType: hard +"axe-core@npm:^4": + version: 4.11.4 + resolution: "axe-core@npm:4.11.4" + checksum: 10c0/c4aa83fc3eac5f7a0d0cb1a28f9d073acf0c06ce8daacc38608faa278c57ce084c028c850746b98817ae4c101c30c1a32e95ea34748c4b4c7419b9b81221ef84 + languageName: node + linkType: hard + "axios@npm:^0.21.1": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -9656,16 +9284,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 - languageName: node - linkType: hard - "chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -9684,9 +9302,9 @@ __metadata: linkType: hard "check-error@npm:^2.1.1": - version: 2.1.3 - resolution: "check-error@npm:2.1.3" - checksum: 10c0/878e99038fb6476316b74668cd6a498c7e66df3efe48158fa40db80a06ba4258742ac3ee2229c4a2a98c5e73f5dff84eb3e50ceb6b65bbd8f831eafc8338607d + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e languageName: node linkType: hard @@ -10741,6 +10359,16 @@ __metadata: languageName: node linkType: hard +"cypress-axe@npm:^1": + version: 1.7.0 + resolution: "cypress-axe@npm:1.7.0" + peerDependencies: + axe-core: ^3 || ^4 + cypress: ^10 || ^11 || ^12 || ^13 || ^14 || ^15 + checksum: 10c0/93d53eaaf0abb2eed61b0ecbf890bbb2b063db0941be70fa945697f09f5d33d0747fe518778eb25b32326bdea08cd8f4a00b8e4633aea4fe8a8d00b55fb02b15 + languageName: node + linkType: hard + "cypress@npm:^13.13.2": version: 13.13.2 resolution: "cypress@npm:13.13.2" @@ -13876,9 +13504,11 @@ __metadata: "@testing-library/react": "npm:^16.3.0" "@vitejs/plugin-react": "npm:^4.4.1" "@vitest/web-worker": "npm:^4.1.6" + axe-core: "npm:^4" babel-plugin-react-compiler: "npm:19.1.0-rc.1" cross-env: "npm:^7.0.2" cypress: "npm:^13.13.2" + cypress-axe: "npm:^1" graphql: "npm:^16.11.0" lightningcss: "npm:^1.29.3" react: "npm:^19.1.0" @@ -16895,14 +16525,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minipass@npm:^7.1.3": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": version: 7.1.3 resolution: "minipass@npm:7.1.3" checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb @@ -17659,19 +17282,7 @@ __metadata: languageName: node linkType: hard -"open@npm:^10.0.3": - version: 10.1.2 - resolution: "open@npm:10.1.2" - dependencies: - default-browser: "npm:^5.2.1" - define-lazy-prop: "npm:^3.0.0" - is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^3.1.0" - checksum: 10c0/1bee796f06e549ce764f693272100323fbc04da8fa3c5b0402d6c2d11b3d76fa0aac0be7535e710015ff035326638e3b9a563f3b0e7ac3266473ed5663caae6d - languageName: node - linkType: hard - -"open@npm:^10.2.0": +"open@npm:^10.0.3, open@npm:^10.2.0": version: 10.2.0 resolution: "open@npm:10.2.0" dependencies: @@ -17776,145 +17387,6 @@ __metadata: languageName: node linkType: hard -"oxc-parser@npm:^0.127.0": - version: 0.127.0 - resolution: "oxc-parser@npm:0.127.0" - dependencies: - "@oxc-parser/binding-android-arm-eabi": "npm:0.127.0" - "@oxc-parser/binding-android-arm64": "npm:0.127.0" - "@oxc-parser/binding-darwin-arm64": "npm:0.127.0" - "@oxc-parser/binding-darwin-x64": "npm:0.127.0" - "@oxc-parser/binding-freebsd-x64": "npm:0.127.0" - "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.127.0" - "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.127.0" - "@oxc-parser/binding-linux-arm64-gnu": "npm:0.127.0" - "@oxc-parser/binding-linux-arm64-musl": "npm:0.127.0" - "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.127.0" - "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.127.0" - "@oxc-parser/binding-linux-riscv64-musl": "npm:0.127.0" - "@oxc-parser/binding-linux-s390x-gnu": "npm:0.127.0" - "@oxc-parser/binding-linux-x64-gnu": "npm:0.127.0" - "@oxc-parser/binding-linux-x64-musl": "npm:0.127.0" - "@oxc-parser/binding-openharmony-arm64": "npm:0.127.0" - "@oxc-parser/binding-wasm32-wasi": "npm:0.127.0" - "@oxc-parser/binding-win32-arm64-msvc": "npm:0.127.0" - "@oxc-parser/binding-win32-ia32-msvc": "npm:0.127.0" - "@oxc-parser/binding-win32-x64-msvc": "npm:0.127.0" - "@oxc-project/types": "npm:^0.127.0" - dependenciesMeta: - "@oxc-parser/binding-android-arm-eabi": - optional: true - "@oxc-parser/binding-android-arm64": - optional: true - "@oxc-parser/binding-darwin-arm64": - optional: true - "@oxc-parser/binding-darwin-x64": - optional: true - "@oxc-parser/binding-freebsd-x64": - optional: true - "@oxc-parser/binding-linux-arm-gnueabihf": - optional: true - "@oxc-parser/binding-linux-arm-musleabihf": - optional: true - "@oxc-parser/binding-linux-arm64-gnu": - optional: true - "@oxc-parser/binding-linux-arm64-musl": - optional: true - "@oxc-parser/binding-linux-ppc64-gnu": - optional: true - "@oxc-parser/binding-linux-riscv64-gnu": - optional: true - "@oxc-parser/binding-linux-riscv64-musl": - optional: true - "@oxc-parser/binding-linux-s390x-gnu": - optional: true - "@oxc-parser/binding-linux-x64-gnu": - optional: true - "@oxc-parser/binding-linux-x64-musl": - optional: true - "@oxc-parser/binding-openharmony-arm64": - optional: true - "@oxc-parser/binding-wasm32-wasi": - optional: true - "@oxc-parser/binding-win32-arm64-msvc": - optional: true - "@oxc-parser/binding-win32-ia32-msvc": - optional: true - "@oxc-parser/binding-win32-x64-msvc": - optional: true - checksum: 10c0/9d109fb3a79c0862a36434cc01c8c0e8f6cf5f1efe9369e02d2183fd518479b10262cf092da2e7f8328befae446afa05ccf742ce12f8346d81429c8f2cdf1651 - languageName: node - linkType: hard - -"oxc-resolver@npm:^11.19.1": - version: 11.19.1 - resolution: "oxc-resolver@npm:11.19.1" - dependencies: - "@oxc-resolver/binding-android-arm-eabi": "npm:11.19.1" - "@oxc-resolver/binding-android-arm64": "npm:11.19.1" - "@oxc-resolver/binding-darwin-arm64": "npm:11.19.1" - "@oxc-resolver/binding-darwin-x64": "npm:11.19.1" - "@oxc-resolver/binding-freebsd-x64": "npm:11.19.1" - "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.19.1" - "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.19.1" - "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.19.1" - "@oxc-resolver/binding-linux-arm64-musl": "npm:11.19.1" - "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.19.1" - "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.19.1" - "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.19.1" - "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.19.1" - "@oxc-resolver/binding-linux-x64-gnu": "npm:11.19.1" - "@oxc-resolver/binding-linux-x64-musl": "npm:11.19.1" - "@oxc-resolver/binding-openharmony-arm64": "npm:11.19.1" - "@oxc-resolver/binding-wasm32-wasi": "npm:11.19.1" - "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.19.1" - "@oxc-resolver/binding-win32-ia32-msvc": "npm:11.19.1" - "@oxc-resolver/binding-win32-x64-msvc": "npm:11.19.1" - dependenciesMeta: - "@oxc-resolver/binding-android-arm-eabi": - optional: true - "@oxc-resolver/binding-android-arm64": - optional: true - "@oxc-resolver/binding-darwin-arm64": - optional: true - "@oxc-resolver/binding-darwin-x64": - optional: true - "@oxc-resolver/binding-freebsd-x64": - optional: true - "@oxc-resolver/binding-linux-arm-gnueabihf": - optional: true - "@oxc-resolver/binding-linux-arm-musleabihf": - optional: true - "@oxc-resolver/binding-linux-arm64-gnu": - optional: true - "@oxc-resolver/binding-linux-arm64-musl": - optional: true - "@oxc-resolver/binding-linux-ppc64-gnu": - optional: true - "@oxc-resolver/binding-linux-riscv64-gnu": - optional: true - "@oxc-resolver/binding-linux-riscv64-musl": - optional: true - "@oxc-resolver/binding-linux-s390x-gnu": - optional: true - "@oxc-resolver/binding-linux-x64-gnu": - optional: true - "@oxc-resolver/binding-linux-x64-musl": - optional: true - "@oxc-resolver/binding-openharmony-arm64": - optional: true - "@oxc-resolver/binding-wasm32-wasi": - optional: true - "@oxc-resolver/binding-win32-arm64-msvc": - optional: true - "@oxc-resolver/binding-win32-ia32-msvc": - optional: true - "@oxc-resolver/binding-win32-x64-msvc": - optional: true - checksum: 10c0/8ac4eaffa9c0bcbb9f4f4a2b43786457ec5a68684d8776cb78b5a15ce3d1a79d3e67262aa3c635f98a0c1cd6cd56a31fcb05bffb9a286100056e4ab06b928833 - languageName: node - linkType: hard - "oxfmt@npm:^0.45.0": version: 0.45.0 resolution: "oxfmt@npm:0.45.0" @@ -18513,9 +17985,9 @@ __metadata: linkType: hard "pathval@npm:^2.0.0": - version: 2.0.1 - resolution: "pathval@npm:2.0.1" - checksum: 10c0/460f4709479fbf2c45903a65655fc8f0a5f6d808f989173aeef5fdea4ff4f303dc13f7870303999add60ec49d4c14733895c0a869392e9866f1091fa64fd7581 + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 languageName: node linkType: hard @@ -20896,11 +20368,11 @@ __metadata: linkType: hard "storybook@npm:^10.3.6": - version: 10.4.0 - resolution: "storybook@npm:10.4.0" + version: 10.3.6 + resolution: "storybook@npm:10.3.6" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^2.0.2" + "@storybook/icons": "npm:^2.0.1" "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" @@ -20908,26 +20380,21 @@ __metadata: "@webcontainer/env": "npm:^1.1.1" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" open: "npm:^10.2.0" - oxc-parser: "npm:^0.127.0" - oxc-resolver: "npm:^11.19.1" recast: "npm:^0.23.5" semver: "npm:^7.7.3" use-sync-external-store: "npm:^1.5.0" ws: "npm:^8.18.0" peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 prettier: ^2 || ^3 vite-plus: ^0.1.15 peerDependenciesMeta: - "@types/react": - optional: true prettier: optional: true vite-plus: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10c0/f6e493819b68dbf4a182cd31d5717db08481a25cfc8c4ab6139fbb70e039a9d4e6d54ff1f8280d3b6052a06ef32242d3753bd9cbbdf91392f4c65a92acf8cff6 + checksum: 10c0/ee6702667459ba2d49269ddd63a7281f17816fcdd4bacd338ed47a4a8e7ad65760c90d99f6b2dfdfd0a564bcfcab3c1ea05b50bf3aafc6b5b19a039a5da77870 languageName: node linkType: hard From e0ebc5b413c57e66f26903e91c3c864f14e7ec43 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 14 May 2026 15:21:08 -0700 Subject: [PATCH 07/38] v6: Wire axe into Storybook stories via `@storybook/addon-vitest` (#4262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Component-level a11y for v6. `@storybook/addon-a11y` surfaces axe results next to each story while you're working on it; `@storybook/addon-vitest` folds those same checks into the existing Vitest suite so they run as part of `yarn test` in CI. The model is per-story `parameters.a11y.test`: - `'error'` (default) — axe violations fail the test - `'todo'` — warn only, for stories with known issues we plan to fix - `'off'` — skip a11y for the story `vitest.config.mts` is split into two projects: - `unit` — existing jsdom suite, unchanged behavior - `storybook` — Vitest browser mode (Playwright Chromium), picks up `.stories.*` files The PR CI workflow gets one new step: `yarn playwright install --with-deps chromium` ahead of `yarn test`. ## Run locally ``` yarn workspace @graphiql/react test # both projects yarn workspace @graphiql/react vitest run --project=unit # unit only yarn workspace @graphiql/react vitest run --project=storybook ``` The Storybook a11y panel surfaces the same axe results live during `yarn workspace @graphiql/react storybook`. Refs: graphql/graphiql#4219 --- .github/workflows/pr.yml | 1 + packages/graphiql-react/.storybook/main.ts | 2 +- .../graphiql-react/.storybook/preview.tsx | 1 + packages/graphiql-react/package.json | 4 + packages/graphiql-react/vitest.config.mts | 44 +- yarn.lock | 846 ++++++++++++++++-- 6 files changed, 798 insertions(+), 100 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 85cf68fb4f7..b2dc6242fdf 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -76,6 +76,7 @@ jobs: with: key: build-${{ github.sha }} path: ${{ env.BUILD-CACHE-LIST }} + - run: npx playwright install --with-deps chromium - run: yarn test lint: diff --git a/packages/graphiql-react/.storybook/main.ts b/packages/graphiql-react/.storybook/main.ts index cf7d1305e8a..dddd2d457b7 100644 --- a/packages/graphiql-react/.storybook/main.ts +++ b/packages/graphiql-react/.storybook/main.ts @@ -2,7 +2,7 @@ import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { stories: ['../src/**/*.stories.@(ts|tsx)'], - addons: [], + addons: ['@storybook/addon-a11y', '@storybook/addon-vitest'], framework: { name: '@storybook/react-vite', options: {} }, }; diff --git a/packages/graphiql-react/.storybook/preview.tsx b/packages/graphiql-react/.storybook/preview.tsx index 2c975d64305..8004f881823 100644 --- a/packages/graphiql-react/.storybook/preview.tsx +++ b/packages/graphiql-react/.storybook/preview.tsx @@ -4,6 +4,7 @@ import '../src/style/root.css'; const preview: Preview = { parameters: { backgrounds: { disable: true }, + a11y: { test: 'error' }, }, globalTypes: { theme: { diff --git a/packages/graphiql-react/package.json b/packages/graphiql-react/package.json index dadd8ed9108..8b2046f044e 100644 --- a/packages/graphiql-react/package.json +++ b/packages/graphiql-react/package.json @@ -72,14 +72,18 @@ }, "devDependencies": { "@babel/helper-string-parser": "^7.19.4", + "@storybook/addon-a11y": "^10.3.6", + "@storybook/addon-vitest": "^10.3.6", "@storybook/react-vite": "^10.3.6", "@types/get-value": "^3.0.5", "@types/markdown-it": "^14.1.2", "@types/react-dom": "^19.1.2", "@types/set-value": "^4.0.1", "@vitejs/plugin-react": "^4.4.1", + "@vitest/browser-playwright": "^4.1.6", "babel-plugin-react-compiler": "19.1.0-rc.1", "graphql": "^16.9.0", + "playwright": "^1.60.0", "react": "^19.1.0", "react-dom": "^19.1.0", "storybook": "^10.3.6", diff --git a/packages/graphiql-react/vitest.config.mts b/packages/graphiql-react/vitest.config.mts index 1127e2b1b9b..f3b0d2bb908 100644 --- a/packages/graphiql-react/vitest.config.mts +++ b/packages/graphiql-react/vitest.config.mts @@ -1,19 +1,47 @@ import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { defineConfig } from 'vitest/config'; +import { playwright } from '@vitest/browser-playwright'; +import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; import { plugins } from './vite.config.mjs'; +const dirname = path.dirname(fileURLToPath(import.meta.url)); + export default defineConfig({ plugins, test: { - environment: 'jsdom', - setupFiles: ['./setup-files.ts'], - alias: [ + projects: [ + { + extends: true, + test: { + name: 'unit', + environment: 'jsdom', + setupFiles: ['./setup-files.ts'], + alias: [ + { + // Fixes Error: Failed to resolve entry for package "monaco-editor". The package may have incorrect main/module/exports specified in its package.json. + find: /^monaco-editor$/, + replacement: path.resolve( + '../../node_modules/monaco-editor/esm/vs/editor/editor.api', + ), + }, + ], + }, + }, { - // Fixes Error: Failed to resolve entry for package "monaco-editor". The package may have incorrect main/module/exports specified in its package.json. - find: /^monaco-editor$/, - replacement: path.resolve( - '../../node_modules/monaco-editor/esm/vs/editor/editor.api', - ), + extends: true, + plugins: [ + storybookTest({ configDir: path.join(dirname, '.storybook') }), + ], + test: { + name: 'storybook', + browser: { + enabled: true, + headless: true, + provider: playwright({}), + instances: [{ browser: 'chromium' }], + }, + }, }, ], }, diff --git a/yarn.lock b/yarn.lock index ce298d188f2..0fe13ea2029 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1003,8 +1003,8 @@ __metadata: linkType: hard "@babel/plugin-transform-modules-systemjs@npm:^7.29.0": - version: 7.29.4 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.4" + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" dependencies: "@babel/helper-module-transforms": "npm:^7.28.6" "@babel/helper-plugin-utils": "npm:^7.28.6" @@ -1012,7 +1012,7 @@ __metadata: "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1da94f89ef8ba1aa1501136a80eb4c010c6a19f5550e10db84677b3ccb7a4934c8098f2b5134def87cf513bf05747ffa523d33722a1ea5a5c8ef956e9136c4c2 + checksum: 10c0/44ea502f2c990398b7d9adc5b44d9e1810a0a5e86eebc05c92d039458f0b3994fe243efa9353b90f8a648d8a91b79845fb353d8679d7324cc9de0162d732771d languageName: node linkType: hard @@ -1587,6 +1587,13 @@ __metadata: languageName: node linkType: hard +"@blazediff/core@npm:1.9.1": + version: 1.9.1 + resolution: "@blazediff/core@npm:1.9.1" + checksum: 10c0/fd45cdd0544002341d74831a179ef693a81414abd348c1ff0c01086c0ea03f5e5ee284c4e16c2e6fb3670c265f90a3d85752b9360320efa9a835928e604dae77 + languageName: node + linkType: hard + "@bramus/specificity@npm:^2.4.2": version: 2.4.2 resolution: "@bramus/specificity@npm:2.4.2" @@ -2379,6 +2386,25 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/core@npm:1.9.2" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10c0/5500393f953951bad0768fafaa9191f2d938956b20c6d6a79e5ab696a613a25ce6ad23422bc18e86e6ce8deb147619d8d0d7d413a69f84adc01a6633cc353cd9 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/runtime@npm:1.9.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/61c3a59e0c36784558b8d58eb02bd04815aa5fb0dbfbaf84d1b3050a78aa0cc63ea129ae806bd1e48062bfeb7fc36eb0e5431740d62f64ea51bdf426404b8caa + languageName: node + linkType: hard + "@emnapi/runtime@npm:^1.7.0": version: 1.10.0 resolution: "@emnapi/runtime@npm:1.10.0" @@ -2388,6 +2414,15 @@ __metadata: languageName: node linkType: hard +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 + languageName: node + linkType: hard + "@envelop/core@npm:^5.4.0": version: 5.5.1 resolution: "@envelop/core@npm:5.5.1" @@ -3291,12 +3326,15 @@ __metadata: "@radix-ui/react-dropdown-menu": "npm:^2.1" "@radix-ui/react-tooltip": "npm:^1.2" "@radix-ui/react-visually-hidden": "npm:^1.2" + "@storybook/addon-a11y": "npm:^10.3.6" + "@storybook/addon-vitest": "npm:^10.3.6" "@storybook/react-vite": "npm:^10.3.6" "@types/get-value": "npm:^3.0.5" "@types/markdown-it": "npm:^14.1.2" "@types/react-dom": "npm:^19.1.2" "@types/set-value": "npm:^4.0.1" "@vitejs/plugin-react": "npm:^4.4.1" + "@vitest/browser-playwright": "npm:^4.1.6" babel-plugin-react-compiler: "npm:19.1.0-rc.1" clsx: "npm:^1.2.1" framer-motion: "npm:^12.12" @@ -3307,6 +3345,7 @@ __metadata: markdown-it: "npm:^14.1.0" monaco-editor: "npm:0.52.2" monaco-graphql: "npm:^1.7.4" + playwright: "npm:^1.60.0" prettier: "npm:^3.5.3" react: "npm:^19.1.0" react-compiler-runtime: "npm:19.1.0-rc.1" @@ -4276,65 +4315,77 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.18": - version: 15.5.18 - resolution: "@next/env@npm:15.5.18" - checksum: 10c0/cfb628f88b903b2593a778658abd2eed8a35ca91807ef19c08461543ed3ba9143e6f0ea4f29b98693f806f9498d1e6ca7c1efd1e0c3a0595991e2bac202e545a +"@napi-rs/wasm-runtime@npm:^1.1.1, @napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.1.4 + resolution: "@napi-rs/wasm-runtime@npm:1.1.4" + dependencies: + "@tybys/wasm-util": "npm:^0.10.1" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/2e88e1955258949ccf2d18c79975821ad38071b465ef126a5e14110977b97868867b016c1ad046e963cccc42c0bd9db6c8ff5fd1ebb61b87bb3487f339041658 + languageName: node + linkType: hard + +"@next/env@npm:15.5.15": + version: 15.5.15 + resolution: "@next/env@npm:15.5.15" + checksum: 10c0/f22ceea51866896ba0b981c74283b4637b109100efa3a3b5ed2cd0943fb7e0434fb686185a33c6dee2ede4801a4e071b6e50526bbff54cdbdc0973dfd149883f languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-darwin-arm64@npm:15.5.18" +"@next/swc-darwin-arm64@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-darwin-arm64@npm:15.5.15" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-darwin-x64@npm:15.5.18" +"@next/swc-darwin-x64@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-darwin-x64@npm:15.5.15" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-linux-arm64-gnu@npm:15.5.18" +"@next/swc-linux-arm64-gnu@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-arm64-gnu@npm:15.5.15" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-linux-arm64-musl@npm:15.5.18" +"@next/swc-linux-arm64-musl@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-arm64-musl@npm:15.5.15" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-linux-x64-gnu@npm:15.5.18" +"@next/swc-linux-x64-gnu@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-x64-gnu@npm:15.5.15" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-linux-x64-musl@npm:15.5.18" +"@next/swc-linux-x64-musl@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-x64-musl@npm:15.5.15" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-win32-arm64-msvc@npm:15.5.18" +"@next/swc-win32-arm64-msvc@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-win32-arm64-msvc@npm:15.5.15" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.5.18": - version: 15.5.18 - resolution: "@next/swc-win32-x64-msvc@npm:15.5.18" +"@next/swc-win32-x64-msvc@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-win32-x64-msvc@npm:15.5.15" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4433,6 +4484,299 @@ __metadata: languageName: node linkType: hard +"@oxc-parser/binding-android-arm-eabi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.127.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-android-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm64@npm:0.127.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-arm64@npm:0.127.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-x64@npm:0.127.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-freebsd-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-freebsd-x64@npm:0.127.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.127.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-openharmony-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.127.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-wasm32-wasi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.127.0" + dependencies: + "@emnapi/core": "npm:1.9.2" + "@emnapi/runtime": "npm:1.9.2" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-x64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@oxc-project/types@npm:^0.127.0": + version: 0.127.0 + resolution: "@oxc-project/types@npm:0.127.0" + checksum: 10c0/52c0947ac64a9ca119fe971f947e784a35ecd14a072fa3f542a58a5f6c42010b53f2bf92731e39b9899b83c990a9517bbd29d1e5a5b7b489e52616685c6a9278 + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm-eabi@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.19.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm64@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.19.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-arm64@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.19.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.19.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.19.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.19.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.19.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.19.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.19.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.19.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.19.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.19.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.19.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.19.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.19.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-openharmony-arm64@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.19.1" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.19.1" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.1" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.19.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-ia32-msvc@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.19.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:11.19.1": + version: 11.19.1 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.19.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@oxfmt/binding-android-arm-eabi@npm:0.45.0": version: 0.45.0 resolution: "@oxfmt/binding-android-arm-eabi@npm:0.45.0" @@ -4915,6 +5259,13 @@ __metadata: languageName: node linkType: hard +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.29 + resolution: "@polka/url@npm:1.0.0-next.29" + checksum: 10c0/0d58e081844095cb029d3c19a659bfefd09d5d51a2f791bc61eba7ea826f13d6ee204a8a448c2f5a855c17df07b37517373ff916dd05801063c0568ae9937684 + languageName: node + linkType: hard + "@radix-ui/primitive@npm:1.1.2": version: 1.1.2 resolution: "@radix-ui/primitive@npm:1.1.2" @@ -6059,28 +6410,65 @@ __metadata: languageName: node linkType: hard -"@storybook/builder-vite@npm:10.3.6": - version: 10.3.6 - resolution: "@storybook/builder-vite@npm:10.3.6" +"@storybook/addon-a11y@npm:^10.3.6": + version: 10.4.0 + resolution: "@storybook/addon-a11y@npm:10.4.0" dependencies: - "@storybook/csf-plugin": "npm:10.3.6" + "@storybook/global": "npm:^5.0.0" + axe-core: "npm:^4.2.0" + peerDependencies: + storybook: ^10.4.0 + checksum: 10c0/f018fb5aa7edbba00657c57eae32aaecf85b7f4063d9da0f4cb97975f4f3a7b0d347bfdca167ef91127dfecaefdaf10c59337109a5ce2c8811329d4cceaa67c8 + languageName: node + linkType: hard + +"@storybook/addon-vitest@npm:^10.3.6": + version: 10.4.0 + resolution: "@storybook/addon-vitest@npm:10.4.0" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^2.0.2" + peerDependencies: + "@vitest/browser": ^3.0.0 || ^4.0.0 + "@vitest/browser-playwright": ^4.0.0 + "@vitest/runner": ^3.0.0 || ^4.0.0 + storybook: ^10.4.0 + vitest: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + "@vitest/browser": + optional: true + "@vitest/browser-playwright": + optional: true + "@vitest/runner": + optional: true + vitest: + optional: true + checksum: 10c0/01bd3fb79af3fa3cb026cf13a0df2b5f87dc2283ad95a176b243a62427a6fba7359d25daa78b922f834e4e4ebc7f839950e762a7d320b8f6eca698766f4ebdbd + languageName: node + linkType: hard + +"@storybook/builder-vite@npm:10.4.0": + version: 10.4.0 + resolution: "@storybook/builder-vite@npm:10.4.0" + dependencies: + "@storybook/csf-plugin": "npm:10.4.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.3.6 + storybook: ^10.4.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/f7e5c57362ba8df8dac4f71dc86d4117cd1edfaf2f61a3ecb0d6bece6b37357f1dc0bf135fd27b5552055b47e0fce5ffba67ffeb2fdedbc75fc986997062bf28 + checksum: 10c0/416240f36b7e93520a6d1168470614fce615062c3c39ea1ad9fe1defffc4f50716b2923210d4e89fa68c1162d89a6f646ef29a08759ed2430ccbf1c0c89453b6 languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.3.6": - version: 10.3.6 - resolution: "@storybook/csf-plugin@npm:10.3.6" +"@storybook/csf-plugin@npm:10.4.0": + version: 10.4.0 + resolution: "@storybook/csf-plugin@npm:10.4.0" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.3.6 + storybook: ^10.4.0 vite: "*" webpack: "*" peerDependenciesMeta: @@ -6092,7 +6480,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/593fc6b9b6073c9dacd26f595ccb58f1ac28f3ab3cf63bf3d8d6913285765eb9c4fdb3e1c54356804ec8eccdde24f14cfa7af3e528731eb6d7e52266d81c4213 + checksum: 10c0/9c968636b14beb9b740b42c3e0f0b81ef2662344bb2328e1149b62e71d3e1e45d82bb08788b6a3fe7755c2884d0b5cf8e033937a07659047764dcfeb91cce80b languageName: node linkType: hard @@ -6103,7 +6491,7 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^2.0.1": +"@storybook/icons@npm:^2.0.2": version: 2.0.2 resolution: "@storybook/icons@npm:2.0.2" peerDependencies: @@ -6113,25 +6501,32 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:10.3.6": - version: 10.3.6 - resolution: "@storybook/react-dom-shim@npm:10.3.6" +"@storybook/react-dom-shim@npm:10.4.0": + version: 10.4.0 + resolution: "@storybook/react-dom-shim@npm:10.4.0" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.6 - checksum: 10c0/60183fc05b0410ca174f215d3271ffbccdc2680bd0704f58dc931cf60e72f497a9f22c00afa868398ad693c7ec633ef619541d4b0611fc2a577fb09609fcc3c7 + storybook: ^10.4.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/d2a07900dd7d35403abb29f23f0f58a53e552003c713a004b465bfc8a781399e3a6062682fe950b79faf5b45bb1955139abe69b6d9f4c3478688b30ebd669274 languageName: node linkType: hard "@storybook/react-vite@npm:^10.3.6": - version: 10.3.6 - resolution: "@storybook/react-vite@npm:10.3.6" + version: 10.4.0 + resolution: "@storybook/react-vite@npm:10.4.0" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.7.0" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:10.3.6" - "@storybook/react": "npm:10.3.6" + "@storybook/builder-vite": "npm:10.4.0" + "@storybook/react": "npm:10.4.0" empathic: "npm:^2.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -6140,29 +6535,35 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.6 + storybook: ^10.4.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/3b939caf05985f0c6d5049c49b71fd8c7abac1f94f1559cfa135a755f3d94c0ef29bdd8d7f7f68c4676ea66852ed4b43d2e33d18434aa1c72f4aebca928b3e13 + checksum: 10c0/3674c84a59ab75df75bc56fcce9e50464bea05c0d02f6ff6733b734b57d6629b501844a4a9491f01df945eec8c65dd14d9d97552d45aaff49a9782453ee476cf languageName: node linkType: hard -"@storybook/react@npm:10.3.6": - version: 10.3.6 - resolution: "@storybook/react@npm:10.3.6" +"@storybook/react@npm:10.4.0": + version: 10.4.0 + resolution: "@storybook/react@npm:10.4.0" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:10.3.6" + "@storybook/react-dom-shim": "npm:10.4.0" react-docgen: "npm:^8.0.2" react-docgen-typescript: "npm:^2.2.2" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.6 + storybook: ^10.4.0 typescript: ">= 4.9.x" peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true typescript: optional: true - checksum: 10c0/3d3af66105cdca98c537b4bcc3e92f87e3b56d154b24e9b167300e9d5de8a7ba6a5ef3c22203ccb6f4c2f0602a5546273b2b49728aa383ba0f98e66a286647a8 + checksum: 10c0/b23acb83cb5eccd0b37eb2a73158ed444b702f7e484277e6e65ac05d18dff2c3b1dd45c00941a86e7acd4ba3edfe14f79448c9316915426dbce2752ecceeaa5e languageName: node linkType: hard @@ -6410,6 +6811,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.1": + version: 0.10.2 + resolution: "@tybys/wasm-util@npm:0.10.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 + languageName: node + linkType: hard + "@types/argparse@npm:1.0.38": version: 1.0.38 resolution: "@types/argparse@npm:1.0.38" @@ -7232,6 +7642,41 @@ __metadata: languageName: node linkType: hard +"@vitest/browser-playwright@npm:^4.1.6": + version: 4.1.6 + resolution: "@vitest/browser-playwright@npm:4.1.6" + dependencies: + "@vitest/browser": "npm:4.1.6" + "@vitest/mocker": "npm:4.1.6" + tinyrainbow: "npm:^3.1.0" + peerDependencies: + playwright: "*" + vitest: 4.1.6 + peerDependenciesMeta: + playwright: + optional: false + checksum: 10c0/501d78e0a56004d9b2fc7f86177d8cb3a9cf2ed1a7a7b075d5b536e29c27bb909f8df418eafbdcdf1cc6dff1faa5a02b0cddd822bc1210e61f25e587a1e2af8e + languageName: node + linkType: hard + +"@vitest/browser@npm:4.1.6": + version: 4.1.6 + resolution: "@vitest/browser@npm:4.1.6" + dependencies: + "@blazediff/core": "npm:1.9.1" + "@vitest/mocker": "npm:4.1.6" + "@vitest/utils": "npm:4.1.6" + magic-string: "npm:^0.30.21" + pngjs: "npm:^7.0.0" + sirv: "npm:^3.0.2" + tinyrainbow: "npm:^3.1.0" + ws: "npm:^8.19.0" + peerDependencies: + vitest: 4.1.6 + checksum: 10c0/f9e8dd7e48add4d11856517bfdbb6b0f9fa291d5b22bb21a5a74194f5b37e32e3597c653e59b630ac2c58f0edd70a440a17b12c1d03e867a5a26fd57ab9a3d67 + languageName: node + linkType: hard + "@vitest/expect@npm:3.2.4": version: 3.2.4 resolution: "@vitest/expect@npm:3.2.4" @@ -8629,7 +9074,7 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4": +"axe-core@npm:^4, axe-core@npm:^4.2.0": version: 4.11.4 resolution: "axe-core@npm:4.11.4" checksum: 10c0/c4aa83fc3eac5f7a0d0cb1a28f9d073acf0c06ce8daacc38608faa278c57ce084c028c850746b98817ae4c101c30c1a32e95ea34748c4b4c7419b9b81221ef84 @@ -9302,9 +9747,9 @@ __metadata: linkType: hard "check-error@npm:^2.1.1": - version: 2.1.1 - resolution: "check-error@npm:2.1.1" - checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e + version: 2.1.3 + resolution: "check-error@npm:2.1.3" + checksum: 10c0/878e99038fb6476316b74668cd6a498c7e66df3efe48158fa40db80a06ba4258742ac3ee2229c4a2a98c5e73f5dff84eb3e50ceb6b65bbd8f831eafc8338607d languageName: node linkType: hard @@ -12312,9 +12757,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.1.2 - resolution: "fast-uri@npm:3.1.2" - checksum: 10c0/5b35641895959f3f7ab7a7b1b5542bded159346f25ec9f256817b206d50b64eda5828e90d605a2e2fc645c90519a7259c2bab2c942ee728c88b88e5be21b090d + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 languageName: node linkType: hard @@ -12922,6 +13367,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@npm:^1.1.1": version: 1.2.13 resolution: "fsevents@npm:1.2.13" @@ -12943,6 +13398,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@npm%3A^1.1.1#optional!builtin": version: 1.2.13 resolution: "fsevents@patch:fsevents@npm%3A1.2.13#optional!builtin::version=1.2.13&hash=d11327" @@ -16706,6 +17170,13 @@ __metadata: languageName: node linkType: hard +"mrmime@npm:^2.0.0": + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 10c0/af05afd95af202fdd620422f976ad67dc18e6ee29beb03dd1ce950ea6ef664de378e44197246df4c7cdd73d47f2e7143a6e26e473084b9e4aa2095c0ad1e1761 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -16876,18 +17347,18 @@ __metadata: linkType: soft "next@npm:^15": - version: 15.5.18 - resolution: "next@npm:15.5.18" - dependencies: - "@next/env": "npm:15.5.18" - "@next/swc-darwin-arm64": "npm:15.5.18" - "@next/swc-darwin-x64": "npm:15.5.18" - "@next/swc-linux-arm64-gnu": "npm:15.5.18" - "@next/swc-linux-arm64-musl": "npm:15.5.18" - "@next/swc-linux-x64-gnu": "npm:15.5.18" - "@next/swc-linux-x64-musl": "npm:15.5.18" - "@next/swc-win32-arm64-msvc": "npm:15.5.18" - "@next/swc-win32-x64-msvc": "npm:15.5.18" + version: 15.5.15 + resolution: "next@npm:15.5.15" + dependencies: + "@next/env": "npm:15.5.15" + "@next/swc-darwin-arm64": "npm:15.5.15" + "@next/swc-darwin-x64": "npm:15.5.15" + "@next/swc-linux-arm64-gnu": "npm:15.5.15" + "@next/swc-linux-arm64-musl": "npm:15.5.15" + "@next/swc-linux-x64-gnu": "npm:15.5.15" + "@next/swc-linux-x64-musl": "npm:15.5.15" + "@next/swc-win32-arm64-msvc": "npm:15.5.15" + "@next/swc-win32-x64-msvc": "npm:15.5.15" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -16930,7 +17401,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/94c3be1ee04240913ab9d46e70fde3b26a73cedf6c76e946cfd2580d7ddd494b7da66260fe3a9a2be187652f5a10b1d9a6a555f10744d350be7f6ae05157d893 + checksum: 10c0/580750feebdf3035478816dcd819d216193ea0873b1f2844790b271235790129b5e8364499256a825d9b493baeddf94a39d05691f1b17ae418f39571a2381bbc languageName: node linkType: hard @@ -17389,6 +17860,145 @@ __metadata: languageName: node linkType: hard +"oxc-parser@npm:^0.127.0": + version: 0.127.0 + resolution: "oxc-parser@npm:0.127.0" + dependencies: + "@oxc-parser/binding-android-arm-eabi": "npm:0.127.0" + "@oxc-parser/binding-android-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-x64": "npm:0.127.0" + "@oxc-parser/binding-freebsd-x64": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-s390x-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-musl": "npm:0.127.0" + "@oxc-parser/binding-openharmony-arm64": "npm:0.127.0" + "@oxc-parser/binding-wasm32-wasi": "npm:0.127.0" + "@oxc-parser/binding-win32-arm64-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-ia32-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-x64-msvc": "npm:0.127.0" + "@oxc-project/types": "npm:^0.127.0" + dependenciesMeta: + "@oxc-parser/binding-android-arm-eabi": + optional: true + "@oxc-parser/binding-android-arm64": + optional: true + "@oxc-parser/binding-darwin-arm64": + optional: true + "@oxc-parser/binding-darwin-x64": + optional: true + "@oxc-parser/binding-freebsd-x64": + optional: true + "@oxc-parser/binding-linux-arm-gnueabihf": + optional: true + "@oxc-parser/binding-linux-arm-musleabihf": + optional: true + "@oxc-parser/binding-linux-arm64-gnu": + optional: true + "@oxc-parser/binding-linux-arm64-musl": + optional: true + "@oxc-parser/binding-linux-ppc64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-musl": + optional: true + "@oxc-parser/binding-linux-s390x-gnu": + optional: true + "@oxc-parser/binding-linux-x64-gnu": + optional: true + "@oxc-parser/binding-linux-x64-musl": + optional: true + "@oxc-parser/binding-openharmony-arm64": + optional: true + "@oxc-parser/binding-wasm32-wasi": + optional: true + "@oxc-parser/binding-win32-arm64-msvc": + optional: true + "@oxc-parser/binding-win32-ia32-msvc": + optional: true + "@oxc-parser/binding-win32-x64-msvc": + optional: true + checksum: 10c0/9d109fb3a79c0862a36434cc01c8c0e8f6cf5f1efe9369e02d2183fd518479b10262cf092da2e7f8328befae446afa05ccf742ce12f8346d81429c8f2cdf1651 + languageName: node + linkType: hard + +"oxc-resolver@npm:^11.19.1": + version: 11.19.1 + resolution: "oxc-resolver@npm:11.19.1" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.19.1" + "@oxc-resolver/binding-android-arm64": "npm:11.19.1" + "@oxc-resolver/binding-darwin-arm64": "npm:11.19.1" + "@oxc-resolver/binding-darwin-x64": "npm:11.19.1" + "@oxc-resolver/binding-freebsd-x64": "npm:11.19.1" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.19.1" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.19.1" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.19.1" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.19.1" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.19.1" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.19.1" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.19.1" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.19.1" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.19.1" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.19.1" + "@oxc-resolver/binding-openharmony-arm64": "npm:11.19.1" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.19.1" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.19.1" + "@oxc-resolver/binding-win32-ia32-msvc": "npm:11.19.1" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.19.1" + dependenciesMeta: + "@oxc-resolver/binding-android-arm-eabi": + optional: true + "@oxc-resolver/binding-android-arm64": + optional: true + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm-musleabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-ppc64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-musl": + optional: true + "@oxc-resolver/binding-linux-s390x-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-openharmony-arm64": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-ia32-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10c0/8ac4eaffa9c0bcbb9f4f4a2b43786457ec5a68684d8776cb78b5a15ce3d1a79d3e67262aa3c635f98a0c1cd6cd56a31fcb05bffb9a286100056e4ab06b928833 + languageName: node + linkType: hard + "oxfmt@npm:^0.45.0": version: 0.45.0 resolution: "oxfmt@npm:0.45.0" @@ -17987,9 +18597,9 @@ __metadata: linkType: hard "pathval@npm:^2.0.0": - version: 2.0.0 - resolution: "pathval@npm:2.0.0" - checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 10c0/460f4709479fbf2c45903a65655fc8f0a5f6d808f989173aeef5fdea4ff4f303dc13f7870303999add60ec49d4c14733895c0a869392e9866f1091fa64fd7581 languageName: node linkType: hard @@ -18146,6 +18756,37 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.60.0": + version: 1.60.0 + resolution: "playwright-core@npm:1.60.0" + bin: + playwright-core: cli.js + checksum: 10c0/99ccd43923b6e9355e0723b7fe221e6326efd4687f8dafff951313662aea11db51f542a9c2122c704c445fb9baae1c9ec9fa6f895126bbddd9fe92313f6942c9 + languageName: node + linkType: hard + +"playwright@npm:^1.60.0": + version: 1.60.0 + resolution: "playwright@npm:1.60.0" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.60.0" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 10c0/714ad76d85b4865d7e43c0012f9039800c1485373388973ed39d79339cee5ad467052d1e2f1eaeca107a1cb6e65342186a8578a4c3504853d84c3a691250d5db + languageName: node + linkType: hard + +"pngjs@npm:^7.0.0": + version: 7.0.0 + resolution: "pngjs@npm:7.0.0" + checksum: 10c0/0d4c7a0fd476a9c33df7d0a2a73e1d56537628a668841f6995c2bca070cf30819f9254a64363266bc14ef2fee47659dd3b4f2b18eec7ab65143015139f497b38 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -19986,6 +20627,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^3.0.2": + version: 3.0.2 + resolution: "sirv@npm:3.0.2" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/5930e4397afdb14fbae13751c3be983af4bda5c9aadec832607dc2af15a7162f7d518c71b30e83ae3644b9a24cea041543cc969e5fe2b80af6ce8ea3174b2d04 + languageName: node + linkType: hard + "slash@npm:^2.0.0": version: 2.0.0 resolution: "slash@npm:2.0.0" @@ -20370,11 +21022,11 @@ __metadata: linkType: hard "storybook@npm:^10.3.6": - version: 10.3.6 - resolution: "storybook@npm:10.3.6" + version: 10.4.0 + resolution: "storybook@npm:10.4.0" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^2.0.1" + "@storybook/icons": "npm:^2.0.2" "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" @@ -20382,21 +21034,26 @@ __metadata: "@webcontainer/env": "npm:^1.1.1" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" open: "npm:^10.2.0" + oxc-parser: "npm:^0.127.0" + oxc-resolver: "npm:^11.19.1" recast: "npm:^0.23.5" semver: "npm:^7.7.3" use-sync-external-store: "npm:^1.5.0" ws: "npm:^8.18.0" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 prettier: ^2 || ^3 vite-plus: ^0.1.15 peerDependenciesMeta: + "@types/react": + optional: true prettier: optional: true vite-plus: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10c0/ee6702667459ba2d49269ddd63a7281f17816fcdd4bacd338ed47a4a8e7ad65760c90d99f6b2dfdfd0a564bcfcab3c1ea05b50bf3aafc6b5b19a039a5da77870 + checksum: 10c0/f6e493819b68dbf4a182cd31d5717db08481a25cfc8c4ab6139fbb70e039a9d4e6d54ff1f8280d3b6052a06ef32242d3753bd9cbbdf91392f4c65a92acf8cff6 languageName: node linkType: hard @@ -21262,6 +21919,13 @@ __metadata: languageName: node linkType: hard +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + "tough-cookie@npm:^4.1.3": version: 4.1.4 resolution: "tough-cookie@npm:4.1.4" @@ -23378,9 +24042,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:>=8.7.0, ws@npm:^8.18.0, ws@npm:^8.18.3, ws@npm:^8.20.0": - version: 8.20.0 - resolution: "ws@npm:8.20.0" +"ws@npm:>=8.7.0, ws@npm:^8.18.0, ws@npm:^8.18.3, ws@npm:^8.19.0, ws@npm:^8.20.0": + version: 8.20.1 + resolution: "ws@npm:8.20.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -23389,7 +24053,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/956ac5f11738c914089b65878b9223692ace77337ba55379ae68e1ecbeae9b47a0c6eb9403688f609999a58c80d83d99865fe0029b229d308b08c1ef93d4ea14 + checksum: 10c0/ce162433218399cdedeb76fd33363d4d86a7d910058d4e3c679dce08cea65d6da6b39f11baa4d7808d024cf46ed88f6a05c17611621aaad8fc5e62edacc30c5d languageName: node linkType: hard From bd773d3a245cd3a6a9e1595f7d2d686e2201c786 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 14 May 2026 23:08:07 -0700 Subject: [PATCH 08/38] v6: Restyle `Button` and `ToolbarButton` (#4276) ## Summary - Migrate `Button`, `UnStyledButton`, `ToolbarButton`, and `ExecuteButton` CSS to v6 OKLCH tokens. - Add `variant?: 'default' | 'primary'` to `Button`; `primary` renders the Run-button style. - Switch `:focus` to `:focus-visible` on interactive states so the focus ring no longer fires on mouse click. Aligns with [MDN `:focus-visible`](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible) and WCAG 2.4.7 (Focus Visible). - Import `clsx` directly in `button` and `toolbar-button`, following the leaf-module pattern from #4272. A follow-up PR will convert remaining callers and remove the `cn` re-export. - Add Storybook stories: `Primitives/Button` (Default, Primary, Success, Error, Disabled) and `Primitives/ToolbarButton` (Default). ## Test plan - [x] Open Storybook `Primitives/Button` and verify each variant matches the design. - [x] Tab into the buttons, then mouse-click them. Focus ring appears on Tab only, not on click. - [x] Open `Primitives/ToolbarButton`. Hover the icon button; a v6 tooltip appears. - [x] Run `yarn dev:graphiql`. The Run button and toolbar buttons match the new design. Refs: graphql/graphiql#4219 --- .changeset/restyle-button-iconbutton.md | 5 ++ .../src/components/button/button.stories.tsx | 32 ++++++++++ .../src/components/button/index.css | 58 ++++++++++++------- .../src/components/button/index.tsx | 4 +- .../src/components/execute-button/index.css | 18 +++--- .../src/components/toolbar-button/index.css | 15 ++++- .../src/components/toolbar-button/index.tsx | 2 +- .../toolbar-button/toolbar-button.stories.tsx | 26 +++++++++ resources/custom-words.txt | 1 + 9 files changed, 129 insertions(+), 32 deletions(-) create mode 100644 .changeset/restyle-button-iconbutton.md create mode 100644 packages/graphiql-react/src/components/button/button.stories.tsx create mode 100644 packages/graphiql-react/src/components/toolbar-button/toolbar-button.stories.tsx diff --git a/.changeset/restyle-button-iconbutton.md b/.changeset/restyle-button-iconbutton.md new file mode 100644 index 00000000000..9bd754c377f --- /dev/null +++ b/.changeset/restyle-button-iconbutton.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': patch +--- + +Restyle `Button` and `ToolbarButton` to the v6 OKLCH design tokens. Adds a `primary` variant to `Button` for the Run-button style. Storybook stories added for each variant. Props and behavior unchanged. diff --git a/packages/graphiql-react/src/components/button/button.stories.tsx b/packages/graphiql-react/src/components/button/button.stories.tsx new file mode 100644 index 00000000000..35138126609 --- /dev/null +++ b/packages/graphiql-react/src/components/button/button.stories.tsx @@ -0,0 +1,32 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Button } from './'; + +const meta: Meta = { + title: 'Primitives/Button', + component: Button, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + render: () => , +}; + +export const Primary: Story = { + render: () => , +}; + +export const Success: Story = { + render: () => , +}; + +export const Error: Story = { + render: () => , +}; + +export const Disabled: Story = { + render: () => , +}; diff --git a/packages/graphiql-react/src/components/button/index.css b/packages/graphiql-react/src/components/button/index.css index 4716869d05a..646c489a840 100644 --- a/packages/graphiql-react/src/components/button/index.css +++ b/packages/graphiql-react/src/components/button/index.css @@ -1,50 +1,66 @@ .graphiql-un-styled { all: unset; - border-radius: var(--border-radius-4); + border-radius: var(--radius-sm); cursor: pointer; &:hover { - background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + background-color: oklch(var(--bg-overlay)); } &:active { - background-color: hsla( - var(--color-neutral), - var(--alpha-background-medium) - ); + background-color: oklch(var(--bg-overlay) / 0.8); } - &:focus { - outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px; + &:focus-visible { + outline: 2px solid oklch(var(--accent-blue)); + outline-offset: 1px; } } .graphiql-button, button.graphiql-button { - background-color: hsla(var(--color-neutral), var(--alpha-background-light)); - border: none; - border-radius: var(--border-radius-4); - color: hsl(var(--color-neutral)); + background-color: oklch(var(--bg-subtle)); + border: 1px solid oklch(var(--border-strong)); + border-radius: var(--radius-sm); + color: oklch(var(--fg-default)); cursor: pointer; font-size: var(--font-size-body); - padding: var(--px-8) var(--px-12); + padding: var(--px-4) var(--px-12); &:hover, &:active { - background-color: hsla( - var(--color-neutral), - var(--alpha-background-medium) - ); + background-color: oklch(var(--bg-overlay)); } - &:focus { - outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px; + &:focus-visible { + outline: 2px solid oklch(var(--accent-blue)); + outline-offset: 1px; + } + + &.graphiql-button-primary { + background-color: oklch(var(--btn-primary)); + border-color: oklch(var(--btn-primary-border)); + color: #fff; + font-weight: 600; + + &:hover { + background-color: oklch(var(--btn-primary-border)); + } + + &:active { + background-color: oklch(var(--btn-primary)); + opacity: 0.85; + } } &.graphiql-button-success { - background-color: hsla(var(--color-success), var(--alpha-background-heavy)); + background-color: oklch(var(--accent-green)); + border-color: oklch(var(--accent-green)); + color: #000; } &.graphiql-button-error { - background-color: hsla(var(--color-error), var(--alpha-background-heavy)); + background-color: oklch(var(--accent-red)); + border-color: oklch(var(--accent-red)); + color: #000; } } diff --git a/packages/graphiql-react/src/components/button/index.tsx b/packages/graphiql-react/src/components/button/index.tsx index b5d94fab7f8..6ea212bc22e 100644 --- a/packages/graphiql-react/src/components/button/index.tsx +++ b/packages/graphiql-react/src/components/button/index.tsx @@ -1,5 +1,5 @@ import { ComponentPropsWithoutRef, forwardRef } from 'react'; -import { cn } from '../../utility'; +import { clsx as cn } from 'clsx'; import './index.css'; type UnStyledButtonProps = ComponentPropsWithoutRef<'button'>; @@ -18,6 +18,7 @@ UnStyledButton.displayName = 'UnStyledButton'; interface ButtonProps extends UnStyledButtonProps { state?: 'success' | 'error'; + variant?: 'default' | 'primary'; } export const Button = forwardRef( @@ -27,6 +28,7 @@ export const Button = forwardRef( ref={ref} className={cn( 'graphiql-button', + props.variant === 'primary' && 'graphiql-button-primary', { success: 'graphiql-button-success', error: 'graphiql-button-error', diff --git a/packages/graphiql-react/src/components/execute-button/index.css b/packages/graphiql-react/src/components/execute-button/index.css index 3c7cfa3c34d..637091a8543 100644 --- a/packages/graphiql-react/src/components/execute-button/index.css +++ b/packages/graphiql-react/src/components/execute-button/index.css @@ -1,26 +1,28 @@ button.graphiql-execute-button { - background-color: hsl(var(--color-primary)); - border: none; - border-radius: var(--border-radius-8); + background-color: oklch(var(--btn-primary)); + border: 1px solid oklch(var(--btn-primary-border)); + border-radius: var(--radius-md); cursor: pointer; height: var(--toolbar-width); padding: 0; width: var(--toolbar-width); &:hover { - background-color: hsla(var(--color-primary), 0.9); + background-color: oklch(var(--btn-primary-border)); } &:active { - background-color: hsla(var(--color-primary), 0.8); + background-color: oklch(var(--btn-primary)); + opacity: 0.85; } - &:focus { - outline: hsla(var(--color-primary), 0.8) auto 1px; + &:focus-visible { + outline: 2px solid oklch(var(--accent-blue)); + outline-offset: 1px; } & > svg { - color: white; + color: #fff; display: block; height: var(--px-16); margin: auto; diff --git a/packages/graphiql-react/src/components/toolbar-button/index.css b/packages/graphiql-react/src/components/toolbar-button/index.css index 6d66de96012..5d78364f3ab 100644 --- a/packages/graphiql-react/src/components/toolbar-button/index.css +++ b/packages/graphiql-react/src/components/toolbar-button/index.css @@ -4,8 +4,21 @@ button.graphiql-toolbar-button { justify-content: center; height: var(--toolbar-width); width: var(--toolbar-width); + color: oklch(var(--fg-subtle)); + border-radius: var(--radius-sm); + + &:hover { + background-color: oklch(var(--bg-overlay)); + color: oklch(var(--fg-default)); + } + + &:focus-visible { + outline: 2px solid oklch(var(--accent-blue)); + outline-offset: 1px; + } &.error { - background: hsla(var(--color-error), var(--alpha-background-heavy)); + background-color: oklch(var(--accent-red) / 0.15); + color: oklch(var(--accent-red)); } } diff --git a/packages/graphiql-react/src/components/toolbar-button/index.tsx b/packages/graphiql-react/src/components/toolbar-button/index.tsx index 0238d256627..55ac7e85aa2 100644 --- a/packages/graphiql-react/src/components/toolbar-button/index.tsx +++ b/packages/graphiql-react/src/components/toolbar-button/index.tsx @@ -4,7 +4,7 @@ import { useState, ComponentPropsWithoutRef, } from 'react'; -import { cn } from '../../utility'; +import { clsx as cn } from 'clsx'; import { Tooltip } from '../tooltip'; import { UnStyledButton } from '../button'; import './index.css'; diff --git a/packages/graphiql-react/src/components/toolbar-button/toolbar-button.stories.tsx b/packages/graphiql-react/src/components/toolbar-button/toolbar-button.stories.tsx new file mode 100644 index 00000000000..40c334eff70 --- /dev/null +++ b/packages/graphiql-react/src/components/toolbar-button/toolbar-button.stories.tsx @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import * as T from '@radix-ui/react-tooltip'; +import { ToolbarButton } from './'; + +const meta: Meta = { + title: 'Primitives/ToolbarButton', + component: ToolbarButton, + tags: ['autodocs'], + args: { + label: 'Prettify query', + children: '✦', + }, + decorators: [ + Story => ( + + + + ), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/resources/custom-words.txt b/resources/custom-words.txt index a06ed5fcbbd..97a756ffef8 100644 --- a/resources/custom-words.txt +++ b/resources/custom-words.txt @@ -32,6 +32,7 @@ arthurgeron asiandrummer astro astrojs +autodocs aumy Autopurge behaviour From d4f026853b89b9755f28d8f4059fcba419aa6d5a Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 14 May 2026 23:12:09 -0700 Subject: [PATCH 09/38] v6: Add `KeycapHint` primitive (#4277) ## Summary - New primitive `KeycapHint` for inline keyboard-shortcut chips. - Renders an array of keys as `` elements with the v6 keycap visual. - Required `ariaLabel` ensures every shortcut chip has a screen-reader-readable description. - Storybook stories for single, chord-with-modifier, and Run-shortcut variants. - Adds `@testing-library/react` + `@testing-library/jest-dom` as devDeps; these are the first component unit tests in `@graphiql/react`. ## Test plan - [ ] Open Storybook `Primitives/KeycapHint`. Each variant renders with the v6 chip style. - [ ] Inspect the `aria-label` on each story root; screen-reader spot-check is optional. Refs: graphql/graphiql#4219 --- .changeset/keycap-hint.md | 5 ++++ packages/graphiql-react/package.json | 2 ++ packages/graphiql-react/setup-files.ts | 8 +++--- .../graphiql-react/src/components/index.ts | 2 ++ .../src/components/keycap-hint/index.css | 22 +++++++++++++++ .../src/components/keycap-hint/index.tsx | 17 ++++++++++++ .../keycap-hint/keycap-hint.stories.tsx | 25 +++++++++++++++++ .../keycap-hint/keycap-hint.test.tsx | 27 +++++++++++++++++++ resources/custom-words.txt | 1 + yarn.lock | 2 ++ 10 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 .changeset/keycap-hint.md create mode 100644 packages/graphiql-react/src/components/keycap-hint/index.css create mode 100644 packages/graphiql-react/src/components/keycap-hint/index.tsx create mode 100644 packages/graphiql-react/src/components/keycap-hint/keycap-hint.stories.tsx create mode 100644 packages/graphiql-react/src/components/keycap-hint/keycap-hint.test.tsx diff --git a/.changeset/keycap-hint.md b/.changeset/keycap-hint.md new file mode 100644 index 00000000000..ddd595ec132 --- /dev/null +++ b/.changeset/keycap-hint.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': minor +--- + +Add a `KeycapHint` primitive for displaying inline keyboard shortcuts (e.g. `⌘K`, `⌘⏎`). Used in the new top bar; available for general consumer use. diff --git a/packages/graphiql-react/package.json b/packages/graphiql-react/package.json index 8b2046f044e..996717b4de4 100644 --- a/packages/graphiql-react/package.json +++ b/packages/graphiql-react/package.json @@ -75,6 +75,8 @@ "@storybook/addon-a11y": "^10.3.6", "@storybook/addon-vitest": "^10.3.6", "@storybook/react-vite": "^10.3.6", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", "@types/get-value": "^3.0.5", "@types/markdown-it": "^14.1.2", "@types/react-dom": "^19.1.2", diff --git a/packages/graphiql-react/setup-files.ts b/packages/graphiql-react/setup-files.ts index 984dec5f9af..c40d88eff47 100644 --- a/packages/graphiql-react/setup-files.ts +++ b/packages/graphiql-react/setup-files.ts @@ -1,6 +1,8 @@ -import { vi } from 'vitest'; +import { vi, afterEach } from 'vitest'; +import '@testing-library/jest-dom/vitest'; +import { cleanup } from '@testing-library/react'; + +afterEach(cleanup); // to make it works like Jest (auto-mocking) vi.mock('monaco-editor'); - -export {}; diff --git a/packages/graphiql-react/src/components/index.ts b/packages/graphiql-react/src/components/index.ts index eac918748b0..2aa4a0a36c6 100644 --- a/packages/graphiql-react/src/components/index.ts +++ b/packages/graphiql-react/src/components/index.ts @@ -18,3 +18,5 @@ export { Spinner } from './spinner'; export { Tabs, Tab } from './tabs'; export { Tooltip } from './tooltip'; export { Root as VisuallyHidden } from '@radix-ui/react-visually-hidden'; +export { KeycapHint } from './keycap-hint'; +export type { KeycapHintProps } from './keycap-hint'; diff --git a/packages/graphiql-react/src/components/keycap-hint/index.css b/packages/graphiql-react/src/components/keycap-hint/index.css new file mode 100644 index 00000000000..a756c40dfff --- /dev/null +++ b/packages/graphiql-react/src/components/keycap-hint/index.css @@ -0,0 +1,22 @@ +.graphiql-keycap-hint { + display: inline-flex; + gap: var(--px-4); + align-items: center; +} + +.graphiql-keycap { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 18px; + height: 18px; + padding: 0 var(--px-4); + border: 1px solid oklch(var(--border-strong)); + border-radius: var(--radius-sm); + background: oklch(var(--bg-canvas)); + color: oklch(var(--fg-muted)); + font-family: var(--font-family-mono); + font-size: var(--font-size-eyebrow); + font-weight: 600; + line-height: 1; +} diff --git a/packages/graphiql-react/src/components/keycap-hint/index.tsx b/packages/graphiql-react/src/components/keycap-hint/index.tsx new file mode 100644 index 00000000000..70c8916751e --- /dev/null +++ b/packages/graphiql-react/src/components/keycap-hint/index.tsx @@ -0,0 +1,17 @@ +import type { FC } from 'react'; +import './index.css'; + +export type KeycapHintProps = { + keys: string[]; + ariaLabel: string; +}; + +export const KeycapHint: FC = ({ keys, ariaLabel }) => ( + + {keys.map((k, i) => ( + + {k} + + ))} + +); diff --git a/packages/graphiql-react/src/components/keycap-hint/keycap-hint.stories.tsx b/packages/graphiql-react/src/components/keycap-hint/keycap-hint.stories.tsx new file mode 100644 index 00000000000..9e8baa3e93b --- /dev/null +++ b/packages/graphiql-react/src/components/keycap-hint/keycap-hint.stories.tsx @@ -0,0 +1,25 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { KeycapHint } from './'; + +const meta: Meta = { + title: 'Primitives/KeycapHint', + component: KeycapHint, + tags: ['autodocs'], +}; +export default meta; + +type Story = StoryObj; + +export const Single: Story = { + render: () => , +}; + +export const ChordWithModifier: Story = { + render: () => ( + + ), +}; + +export const RunShortcut: Story = { + render: () => , +}; diff --git a/packages/graphiql-react/src/components/keycap-hint/keycap-hint.test.tsx b/packages/graphiql-react/src/components/keycap-hint/keycap-hint.test.tsx new file mode 100644 index 00000000000..f502c8c2446 --- /dev/null +++ b/packages/graphiql-react/src/components/keycap-hint/keycap-hint.test.tsx @@ -0,0 +1,27 @@ +'use no memo'; + +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { KeycapHint } from './'; + +describe('KeycapHint', () => { + it('renders the provided keys', () => { + render(); + expect(screen.getByText('⌘')).toBeInTheDocument(); + expect(screen.getByText('K')).toBeInTheDocument(); + }); + + it('exposes the shortcut as an accessible name', () => { + render( + , + ); + expect(screen.getByLabelText(/Run query/i)).toBeInTheDocument(); + }); + + it('renders a element for each key', () => { + const { container } = render( + , + ); + expect(container.querySelectorAll('kbd')).toHaveLength(2); + }); +}); diff --git a/resources/custom-words.txt b/resources/custom-words.txt index 97a756ffef8..e5f0ff5d4b6 100644 --- a/resources/custom-words.txt +++ b/resources/custom-words.txt @@ -113,6 +113,7 @@ jiti jonathanawesome jsdelivr jsgl +keycap kumar languageservice leebyron diff --git a/yarn.lock b/yarn.lock index 0fe13ea2029..ee4c01a5d4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3329,6 +3329,8 @@ __metadata: "@storybook/addon-a11y": "npm:^10.3.6" "@storybook/addon-vitest": "npm:^10.3.6" "@storybook/react-vite": "npm:^10.3.6" + "@testing-library/jest-dom": "npm:^6.6.3" + "@testing-library/react": "npm:^16.3.0" "@types/get-value": "npm:^3.0.5" "@types/markdown-it": "npm:^14.1.2" "@types/react-dom": "npm:^19.1.2" From 34695e832ddcbb23c80a6060fe28cf0127d1d61a Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Thu, 14 May 2026 23:12:51 -0700 Subject: [PATCH 10/38] v6: Restyle `Tooltip` (#4278) ## Summary - Migrate `Tooltip` CSS to v6 OKLCH tokens (`--bg-elevated`, `--border-default`, `--fg-default`). - Add `--shadow-popover` to `tokens.css` (dark + light variants) and use it in `Tooltip`. Future Dialog and DropdownMenu PRs reuse this token. - Pin tooltip `font-size` to `--font-size-small` (11px) rather than `inherit`: tooltips are floating UI primitives and should render at a consistent size regardless of where they're anchored. - Add Storybook stories: `Primitives/Tooltip` (Default + TopPlacement). ## Test plan - [x] Open Storybook `Primitives/Tooltip` and verify both Default and TopPlacement render correctly. - [x] Toggle to light theme (system preference or set `data-theme="light"` on the Storybook root). Shadow should soften for the lighter surface. - [x] Hover any toolbar button in the example app. Tooltip should match the design. Refs: graphql/graphiql#4219 --- .changeset/restyle-tooltip.md | 5 +++ .../src/components/tooltip/index.css | 14 ++++---- .../components/tooltip/tooltip.stories.tsx | 33 +++++++++++++++++++ packages/graphiql-react/src/style/tokens.css | 10 ++++++ 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 .changeset/restyle-tooltip.md create mode 100644 packages/graphiql-react/src/components/tooltip/tooltip.stories.tsx diff --git a/.changeset/restyle-tooltip.md b/.changeset/restyle-tooltip.md new file mode 100644 index 00000000000..eec9ab308e0 --- /dev/null +++ b/.changeset/restyle-tooltip.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': patch +--- + +Restyle `Tooltip` to the v6 design: `--bg-elevated` surface, simplified border and shadow. diff --git a/packages/graphiql-react/src/components/tooltip/index.css b/packages/graphiql-react/src/components/tooltip/index.css index 4455f9126b8..efd76acbff8 100644 --- a/packages/graphiql-react/src/components/tooltip/index.css +++ b/packages/graphiql-react/src/components/tooltip/index.css @@ -1,10 +1,10 @@ .graphiql-tooltip { - background: hsl(var(--color-base)); - border: var(--popover-border); - border-radius: var(--border-radius-4); - box-shadow: var(--popover-box-shadow); - color: hsl(var(--color-neutral)); - font-size: inherit; - padding: var(--px-4) var(--px-6); + background: oklch(var(--bg-elevated)); + border: 1px solid oklch(var(--border-default)); + border-radius: var(--radius-md); + box-shadow: var(--shadow-popover); + color: oklch(var(--fg-default)); font-family: var(--font-family); + font-size: var(--font-size-small); + padding: var(--px-6) var(--px-8); } diff --git a/packages/graphiql-react/src/components/tooltip/tooltip.stories.tsx b/packages/graphiql-react/src/components/tooltip/tooltip.stories.tsx new file mode 100644 index 00000000000..2094cf7e243 --- /dev/null +++ b/packages/graphiql-react/src/components/tooltip/tooltip.stories.tsx @@ -0,0 +1,33 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Tooltip } from './'; + +const meta: Meta = { + title: 'Primitives/Tooltip', + decorators: [ + Story => ( + + + + ), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + ), +}; + +export const TopPlacement: Story = { + render: () => ( + + + + ), +}; diff --git a/packages/graphiql-react/src/style/tokens.css b/packages/graphiql-react/src/style/tokens.css index 1b1a1674062..8cc2d870160 100644 --- a/packages/graphiql-react/src/style/tokens.css +++ b/packages/graphiql-react/src/style/tokens.css @@ -78,6 +78,10 @@ --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; + + /* Shadows */ + --shadow-popover: + 0 4px 12px oklch(0% 0 0 / 0.3), 0 1px 3px oklch(0% 0 0 / 0.15); } [data-theme='light'] { @@ -114,6 +118,10 @@ --btn-primary: 51% 0.15 145; --btn-primary-border: 45% 0.17 145; + /* Shadows — lighter to read on light surfaces */ + --shadow-popover: + 0 4px 12px oklch(0% 0 0 / 0.08), 0 1px 3px oklch(0% 0 0 / 0.04); + /* Typography, spacing, dimensions, and radii are inherited from :root. */ } @@ -148,5 +156,7 @@ --accent-pink: 58% 0.22 17; --btn-primary: 51% 0.15 145; --btn-primary-border: 45% 0.17 145; + --shadow-popover: + 0 4px 12px oklch(0% 0 0 / 0.08), 0 1px 3px oklch(0% 0 0 / 0.04); } } From 1bcf3be69a883f4eda09713b0db81e738a27e310 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 07:54:08 -0700 Subject: [PATCH 11/38] v6: Restyle `Dialog` (#4279) ## Summary - Dialog styling moves to v6 OKLCH tokens. - Adds Storybook stories: Default and ConfirmAction. Layout matches the real consumer pattern: title and close button in a header row, body below. - Bundles a Storybook decorator fix so portaled components actually theme. Without it, `Dialog` (and any future portaled story) ignored the toolbar's Dark / Light toggle because Radix portals render to `document.body`, outside the wrapper div the decorator was setting attributes on. The fix moves `data-theme` / `data-density` / `data-font-size` to `document.documentElement` so the whole DOM inherits. ## Test plan - [x] Open `Primitives/Dialog` in Storybook; both stories render with the new surface, border, and shadow. Close button sits in the header row at top right. - [x] Toggle the theme between Dark and Light; surface and text colors should now actually differ (this was the symptom that prompted the decorator fix). - [ ] In the example app, open the Settings dialog (gear icon). Visuals match the new look. Refs: graphql/graphiql#4219 ## Merge note Two commits, intended for rebase-merge: dialog restyle and the storybook decorator fix are independently reviewable. --- .changeset/restyle-dialog.md | 5 ++ .../graphiql-react/.storybook/preview.tsx | 26 +++--- .../src/components/dialog/dialog.stories.tsx | 90 +++++++++++++++++++ .../src/components/dialog/index.css | 14 +-- 4 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 .changeset/restyle-dialog.md create mode 100644 packages/graphiql-react/src/components/dialog/dialog.stories.tsx diff --git a/.changeset/restyle-dialog.md b/.changeset/restyle-dialog.md new file mode 100644 index 00000000000..76b5b641c8e --- /dev/null +++ b/.changeset/restyle-dialog.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': patch +--- + +Restyle `Dialog` to the v6 design: `--bg-elevated` surface, refined border, larger radius. Behavior and API unchanged. diff --git a/packages/graphiql-react/.storybook/preview.tsx b/packages/graphiql-react/.storybook/preview.tsx index 8004f881823..e6594dd5905 100644 --- a/packages/graphiql-react/.storybook/preview.tsx +++ b/packages/graphiql-react/.storybook/preview.tsx @@ -1,3 +1,4 @@ +import { useEffect } from 'react'; import type { Preview } from '@storybook/react-vite'; import '../src/style/root.css'; @@ -48,17 +49,20 @@ const preview: Preview = { }, }, decorators: [ - (Story, ctx) => ( -
- -
- ), + (Story, ctx) => { + useEffect(() => { + const root = document.documentElement; + root.setAttribute('data-theme', ctx.globals.theme); + root.setAttribute('data-density', ctx.globals.density); + root.setAttribute('data-font-size', ctx.globals.fontSize); + }, [ctx.globals.theme, ctx.globals.density, ctx.globals.fontSize]); + + return ( +
+ +
+ ); + }, ], }; diff --git a/packages/graphiql-react/src/components/dialog/dialog.stories.tsx b/packages/graphiql-react/src/components/dialog/dialog.stories.tsx new file mode 100644 index 00000000000..cbe4f929236 --- /dev/null +++ b/packages/graphiql-react/src/components/dialog/dialog.stories.tsx @@ -0,0 +1,90 @@ +import { useState } from 'react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Button } from '../button'; +import { Dialog } from './'; + +const meta: Meta = { + title: 'Primitives/Dialog', + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +const headerStyle = { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: 'var(--px-4) var(--px-4) var(--px-4) var(--px-16)', + borderBottom: '1px solid oklch(var(--border-default))', +} as const; + +const bodyStyle = { + padding: 'var(--px-16)', + display: 'flex', + flexDirection: 'column', + gap: 'var(--px-12)', +} as const; + +export const Default: Story = { + render: function DefaultStory() { + const [open, setOpen] = useState(false); + return ( + <> + + +
+
+ Settings + +
+
+ + Update your preferences. + +
+
+
+ + ); + }, +}; + +export const ConfirmAction: Story = { + render: function ConfirmActionStory() { + const [open, setOpen] = useState(false); + return ( + <> + + +
+
+ + Discard changes? + + +
+
+ + Your unsaved changes will be lost. + +
+ + +
+
+
+
+ + ); + }, +}; diff --git a/packages/graphiql-react/src/components/dialog/index.css b/packages/graphiql-react/src/components/dialog/index.css index 256b85b4871..8f98002009f 100644 --- a/packages/graphiql-react/src/components/dialog/index.css +++ b/packages/graphiql-react/src/components/dialog/index.css @@ -1,7 +1,7 @@ .graphiql-dialog-overlay { position: fixed; inset: 0; - background-color: hsla(var(--color-neutral), var(--alpha-background-heavy)); + background-color: oklch(0% 0 0 / 0.5); /** * CodeMirror has a `z-index` set for the container of the scrollbar of the * editor, so we have to add one here to make sure that the dialog is shown @@ -11,10 +11,12 @@ } .graphiql-dialog { - background-color: hsl(var(--color-base)); - border: var(--popover-border); - border-radius: var(--border-radius-12); - box-shadow: var(--popover-box-shadow); + background: oklch(var(--bg-elevated)); + border: 1px solid oklch(var(--border-default)); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-popover); + color: oklch(var(--fg-default)); + font-family: var(--font-family); margin: 0; max-height: 80vh; max-width: 80vw; @@ -29,7 +31,7 @@ } .graphiql-dialog-close > svg { - color: hsla(var(--color-neutral), var(--alpha-secondary)); + color: oklch(var(--fg-muted)); display: block; height: var(--px-12); padding: var(--px-12); From 7dd211143e2e8c575363dfb8339a37c1452579dd Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 11:04:57 -0700 Subject: [PATCH 12/38] v6: Restyle `DropdownMenu` (#4280) ## Summary - DropdownMenu styling moves to v6 OKLCH tokens (surface, item hover, separator). - Adds a `Separator` subcomponent wrapping the Radix primitive. - Adds Storybook stories. ## Test plan - [x] Open `Primitives/DropdownMenu`; check default and separator-bearing variants. - [x] Keyboard nav: arrow keys cycle items, Enter activates, Escape closes. - [x] Disabled items render with reduced contrast and don't activate. Refs: graphql/graphiql#4219 --- .changeset/restyle-dropdown-menu.md | 5 +++ .../dropdown-menu/dropdown-menu.stories.tsx | 40 ++++++++++++++++++ .../src/components/dropdown-menu/index.css | 42 ++++++++++++------- .../src/components/dropdown-menu/index.tsx | 16 ++++--- 4 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 .changeset/restyle-dropdown-menu.md create mode 100644 packages/graphiql-react/src/components/dropdown-menu/dropdown-menu.stories.tsx diff --git a/.changeset/restyle-dropdown-menu.md b/.changeset/restyle-dropdown-menu.md new file mode 100644 index 00000000000..ad9b31e0ba4 --- /dev/null +++ b/.changeset/restyle-dropdown-menu.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': patch +--- + +Restyle `DropdownMenu` to the v6 design. Behavior and API unchanged. diff --git a/packages/graphiql-react/src/components/dropdown-menu/dropdown-menu.stories.tsx b/packages/graphiql-react/src/components/dropdown-menu/dropdown-menu.stories.tsx new file mode 100644 index 00000000000..879ebd7ad9b --- /dev/null +++ b/packages/graphiql-react/src/components/dropdown-menu/dropdown-menu.stories.tsx @@ -0,0 +1,40 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { DropdownMenu } from './'; + +const meta: Meta = { + title: 'Primitives/DropdownMenu', +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + Open menu + + Item 1 + Item 2 + + Disabled + + + ), +}; + +export const WithManyItems: Story = { + render: () => ( + + Open menu + + Schema + Explorer + History + + Settings + Unavailable + + + ), +}; diff --git a/packages/graphiql-react/src/components/dropdown-menu/index.css b/packages/graphiql-react/src/components/dropdown-menu/index.css index 09f4c57524e..f39ea14be2b 100644 --- a/packages/graphiql-react/src/components/dropdown-menu/index.css +++ b/packages/graphiql-react/src/components/dropdown-menu/index.css @@ -1,13 +1,13 @@ .graphiql-dropdown-content { - background-color: hsl(var(--color-base)); - border: var(--popover-border); - border-radius: var(--border-radius-8); - box-shadow: var(--popover-box-shadow); - font-size: inherit; + background: oklch(var(--bg-elevated)); + border: 1px solid oklch(var(--border-default)); + border-radius: var(--radius-md); + box-shadow: var(--shadow-popover); + color: oklch(var(--fg-default)); + font-family: var(--font-family); + font-size: var(--font-size-body); max-width: 250px; padding: var(--px-4); - font-family: var(--font-family); - color: hsl(var(--color-neutral)); max-height: min( calc(var(--radix-dropdown-menu-content-available-height) - 10px), 400px @@ -16,25 +16,37 @@ } .graphiql-dropdown-item { - border-radius: var(--border-radius-4); + border-radius: var(--radius-sm); + cursor: pointer; font-size: inherit; + line-height: var(--line-height-body); margin: var(--px-4); + outline: none; overflow: hidden; padding: var(--px-6) var(--px-8); text-overflow: ellipsis; white-space: nowrap; - outline: none; - cursor: pointer; - line-height: var(--line-height); - &[data-selected], - &[data-current-nav], + &[data-highlighted], &:hover { - background-color: hsla(var(--color-neutral), var(--alpha-background-light)); - color: inherit; + background: oklch(var(--bg-overlay)); + color: oklch(var(--fg-strong)); + outline: none; + } + + &[data-disabled] { + color: oklch(var(--fg-disabled)); + cursor: default; + pointer-events: none; } &:not(:first-child) { margin-top: 0; } } + +.graphiql-dropdown-separator { + border: none; + border-top: 1px solid oklch(var(--border-muted)); + margin: var(--px-4) 0; +} diff --git a/packages/graphiql-react/src/components/dropdown-menu/index.tsx b/packages/graphiql-react/src/components/dropdown-menu/index.tsx index 2aeeb243e75..8b1deab86b9 100644 --- a/packages/graphiql-react/src/components/dropdown-menu/index.tsx +++ b/packages/graphiql-react/src/components/dropdown-menu/index.tsx @@ -5,20 +5,18 @@ import { Portal, Content as RadixContent, Item as RadixItem, + Separator as RadixSeparator, DropdownMenuContentProps, DropdownMenuItemProps, Root, } from '@radix-ui/react-dropdown-menu'; +import { UnStyledButton } from '../button'; import './index.css'; const Button = forwardRef>( (props, ref) => ( - + ))} + + ); +} diff --git a/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx b/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx new file mode 100644 index 00000000000..13c752628d0 --- /dev/null +++ b/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx @@ -0,0 +1,64 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { useState } from 'react'; +import { SegmentedControl } from './'; + +const meta: Meta = { + title: 'Primitives/SegmentedControl', + component: SegmentedControl, + tags: ['autodocs'], +}; +export default meta; + +export const ResponseView: StoryObj = { + render() { + const [v, setV] = useState('json'); + return ( + + ); + }, +}; + +export const Density: StoryObj = { + render() { + const [v, setV] = useState('comfortable'); + return ( + + ); + }, +}; + +export const WithDisabledOption: StoryObj = { + render() { + const [v, setV] = useState('list'); + return ( + + ); + }, +}; diff --git a/packages/graphiql-react/src/components/segmented-control/segmented-control.test.tsx b/packages/graphiql-react/src/components/segmented-control/segmented-control.test.tsx new file mode 100644 index 00000000000..64489c1c7e7 --- /dev/null +++ b/packages/graphiql-react/src/components/segmented-control/segmented-control.test.tsx @@ -0,0 +1,84 @@ +'use no memo'; + +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useState } from 'react'; +import { SegmentedControl } from './'; + +describe('SegmentedControl', () => { + it('renders all options', () => { + render( + {}} + options={[ + { value: 'a', label: 'Alpha' }, + { value: 'b', label: 'Beta' }, + { value: 'c', label: 'Gamma' }, + ]} + />, + ); + expect(screen.getByRole('button', { name: 'Alpha' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Beta' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Gamma' })).toBeInTheDocument(); + }); + + it('marks the selected option with aria-pressed', () => { + render( + {}} + options={[ + { value: 'a', label: 'Alpha' }, + { value: 'b', label: 'Beta' }, + ]} + />, + ); + expect( + screen.getByRole('button', { name: 'Alpha', pressed: true }), + ).toBeInTheDocument(); + expect( + screen.getByRole('button', { name: 'Beta', pressed: false }), + ).toBeInTheDocument(); + }); + + it('calls onChange when a non-selected option is clicked', async () => { + const user = userEvent.setup(); + function Wrapper() { + const [v, setV] = useState('a'); + return ( + + ); + } + render(); + await user.click(screen.getByRole('button', { name: 'Beta' })); + expect( + screen.getByRole('button', { name: 'Beta', pressed: true }), + ).toBeInTheDocument(); + }); + + it('does not call onChange for a disabled option', async () => { + const user = userEvent.setup(); + const onChange = vi.fn(); + render( + , + ); + await user.click(screen.getByRole('button', { name: 'Beta' })); + expect(onChange).not.toHaveBeenCalled(); + }); +}); From 05ecaf0aae89a027a415f6ab070ba0be204c473a Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 12:27:33 -0700 Subject: [PATCH 15/38] v6: Restyle `Spinner` (#4283) ## Summary Spinner stroke now uses `oklch(var(--fg-muted))`. ## Test plan - [ ] Open the Spinner story and confirm it renders. - [ ] Trigger a fetch in the app; verify spinner appearance. Refs: graphql/graphiql#4219 --- .changeset/restyle-spinner.md | 5 +++++ packages/graphiql-react/src/components/spinner/index.css | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/restyle-spinner.md diff --git a/.changeset/restyle-spinner.md b/.changeset/restyle-spinner.md new file mode 100644 index 00000000000..ca2c12bf27b --- /dev/null +++ b/.changeset/restyle-spinner.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': patch +--- + +Restyle `Spinner` to the v6 design. Default stroke uses the muted foreground token. diff --git a/packages/graphiql-react/src/components/spinner/index.css b/packages/graphiql-react/src/components/spinner/index.css index 43d0044b9bc..41698dfb2c3 100644 --- a/packages/graphiql-react/src/components/spinner/index.css +++ b/packages/graphiql-react/src/components/spinner/index.css @@ -8,7 +8,7 @@ animation: rotation 0.8s linear 0s infinite; border: 4px solid transparent; border-radius: 100%; - border-top: 4px solid hsla(var(--color-neutral), var(--alpha-tertiary)); + border-top: 4px solid oklch(var(--fg-muted)); content: ''; display: inline-block; height: 46px; From 1ce71e407dd3b457d6fecc9e7ad0b3ad246c693b Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 20:04:45 -0700 Subject: [PATCH 16/38] v6: Add `PanelHeader` primitive (#4284) ## Summary - New primitive `PanelHeader` for side-panel content areas. - Props: `title` (`

`), `subtitle?`, `actions?`. ## Test plan - [x] Open `Primitives/PanelHeader` in Storybook; check TitleOnly, WithSubtitle, and WithActions render correctly. - [x] Confirm the title is an `

` in the DOM. - [x] Confirm action buttons are keyboard-focusable and carry their aria-labels. Refs: graphql/graphiql#4219 --- .changeset/panel-header.md | 5 ++ .../graphiql-react/src/components/index.ts | 2 + .../src/components/panel-header/index.css | 42 +++++++++++++++++ .../src/components/panel-header/index.tsx | 22 +++++++++ .../panel-header/panel-header.stories.tsx | 46 +++++++++++++++++++ .../panel-header/panel-header.test.tsx | 46 +++++++++++++++++++ 6 files changed, 163 insertions(+) create mode 100644 .changeset/panel-header.md create mode 100644 packages/graphiql-react/src/components/panel-header/index.css create mode 100644 packages/graphiql-react/src/components/panel-header/index.tsx create mode 100644 packages/graphiql-react/src/components/panel-header/panel-header.stories.tsx create mode 100644 packages/graphiql-react/src/components/panel-header/panel-header.test.tsx diff --git a/.changeset/panel-header.md b/.changeset/panel-header.md new file mode 100644 index 00000000000..413e45b1173 --- /dev/null +++ b/.changeset/panel-header.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': minor +--- + +Add a `PanelHeader` primitive for side panels. Renders a title, optional subtitle, and optional action-icon row. diff --git a/packages/graphiql-react/src/components/index.ts b/packages/graphiql-react/src/components/index.ts index f93ee4efeda..750e7295d61 100644 --- a/packages/graphiql-react/src/components/index.ts +++ b/packages/graphiql-react/src/components/index.ts @@ -20,6 +20,8 @@ export { Tooltip } from './tooltip'; export { Root as VisuallyHidden } from '@radix-ui/react-visually-hidden'; export { KeycapHint } from './keycap-hint'; export type { KeycapHintProps } from './keycap-hint'; +export { PanelHeader } from './panel-header'; +export type { PanelHeaderProps } from './panel-header'; export { SegmentedControl } from './segmented-control'; export type { SegmentedControlProps, diff --git a/packages/graphiql-react/src/components/panel-header/index.css b/packages/graphiql-react/src/components/panel-header/index.css new file mode 100644 index 00000000000..f84582be71c --- /dev/null +++ b/packages/graphiql-react/src/components/panel-header/index.css @@ -0,0 +1,42 @@ +.graphiql-panel-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: var(--px-12) var(--px-14) var(--px-10); + border-bottom: 1px solid oklch(var(--border-default)); + background: oklch(var(--bg-elevated)); +} + +.graphiql-panel-header-titles { + display: flex; + flex-direction: column; + gap: 2px; +} + +.graphiql-panel-header-title { + margin: 0; + color: oklch(var(--fg-strong)); + font-family: var(--font-family); + font-size: 12px; + font-weight: 600; + line-height: 1.3; +} + +.graphiql-panel-header-subtitle { + margin: 0; + color: oklch(var(--fg-subtle)); + font-family: var(--font-family); + font-size: var(--font-size-small); + line-height: var(--line-height-body); +} + +.graphiql-panel-header-actions { + display: flex; + gap: var(--px-4); + color: oklch(var(--fg-subtle)); +} + +.graphiql-panel-header-actions svg { + width: 12px; + height: 12px; +} diff --git a/packages/graphiql-react/src/components/panel-header/index.tsx b/packages/graphiql-react/src/components/panel-header/index.tsx new file mode 100644 index 00000000000..2241a408752 --- /dev/null +++ b/packages/graphiql-react/src/components/panel-header/index.tsx @@ -0,0 +1,22 @@ +import type { FC, ReactNode } from 'react'; +import './index.css'; + +export type PanelHeaderProps = { + title: ReactNode; + subtitle?: ReactNode; + actions?: ReactNode; +}; + +export const PanelHeader: FC = ({ + title, + subtitle, + actions, +}) => ( +
+
+

{title}

+ {subtitle &&

{subtitle}

} +
+ {actions &&
{actions}
} +
+); diff --git a/packages/graphiql-react/src/components/panel-header/panel-header.stories.tsx b/packages/graphiql-react/src/components/panel-header/panel-header.stories.tsx new file mode 100644 index 00000000000..7d62b06c52b --- /dev/null +++ b/packages/graphiql-react/src/components/panel-header/panel-header.stories.tsx @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { MagnifyingGlassIcon, SettingsIcon } from '../../icons'; +import { ToolbarButton } from '../toolbar-button'; +import { Tooltip } from '../tooltip'; +import { PanelHeader } from './'; + +const meta: Meta = { + title: 'Primitives/PanelHeader', + component: PanelHeader, + tags: ['autodocs'], + decorators: [ + Story => ( + + + + ), + ], +}; +export default meta; + +type Story = StoryObj; + +export const TitleOnly: Story = { + args: { title: 'Schema' }, +}; + +export const WithSubtitle: Story = { + args: { title: 'Schema', subtitle: 'Pokemon API' }, +}; + +export const WithActions: Story = { + args: { + title: 'History', + subtitle: 'Last 500 runs, searchable.', + actions: ( + <> + + + + + + ), + }, +}; diff --git a/packages/graphiql-react/src/components/panel-header/panel-header.test.tsx b/packages/graphiql-react/src/components/panel-header/panel-header.test.tsx new file mode 100644 index 00000000000..9d3b6e2664a --- /dev/null +++ b/packages/graphiql-react/src/components/panel-header/panel-header.test.tsx @@ -0,0 +1,46 @@ +'use no memo'; + +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { PanelHeader } from './'; + +describe('PanelHeader', () => { + it('renders the title', () => { + render(); + expect(screen.getByText('Schema')).toBeInTheDocument(); + }); + + it('renders the subtitle when provided', () => { + render(); + expect(screen.getByText('Pokemon API')).toBeInTheDocument(); + }); + + it('does not render a subtitle element when omitted', () => { + const { container } = render(); + expect( + container.querySelector('.graphiql-panel-header-subtitle'), + ).toBeNull(); + }); + + it('renders action icons when provided', () => { + render( + ↻} + />, + ); + expect(screen.getByLabelText('Refresh')).toBeInTheDocument(); + }); + + it('does not render the actions container when omitted', () => { + const { container } = render(); + expect( + container.querySelector('.graphiql-panel-header-actions'), + ).toBeNull(); + }); + + it('renders the title in an h2', () => { + const { container } = render(); + expect(container.querySelector('h2')).toHaveTextContent('History'); + }); +}); From c25bfd5b51ad98f36cbdb81a7486380f8dd1ab6a Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 21:08:02 -0700 Subject: [PATCH 17/38] v6: Add `MethodPill` primitive (#4285) ## Summary - New primitive `MethodPill` labeling operation types: QRY (green), MUT (yellow), SUB (purple). - Three Storybook stories covering each operation. ## Test plan - [x] Open `Primitives/MethodPill` and confirm each variant's color and label. - [x] Pill renders as decorative; consumers pair it with the operation name for the accessible name. Refs: graphql/graphiql#4219 --- .changeset/method-pill.md | 5 +++ .../graphiql-react/src/components/index.ts | 2 ++ .../src/components/method-pill/index.css | 32 +++++++++++++++++++ .../src/components/method-pill/index.tsx | 24 ++++++++++++++ .../method-pill/method-pill.stories.tsx | 23 +++++++++++++ .../method-pill/method-pill.test.tsx | 22 +++++++++++++ 6 files changed, 108 insertions(+) create mode 100644 .changeset/method-pill.md create mode 100644 packages/graphiql-react/src/components/method-pill/index.css create mode 100644 packages/graphiql-react/src/components/method-pill/index.tsx create mode 100644 packages/graphiql-react/src/components/method-pill/method-pill.stories.tsx create mode 100644 packages/graphiql-react/src/components/method-pill/method-pill.test.tsx diff --git a/.changeset/method-pill.md b/.changeset/method-pill.md new file mode 100644 index 00000000000..e5697f77539 --- /dev/null +++ b/.changeset/method-pill.md @@ -0,0 +1,5 @@ +--- +'@graphiql/react': minor +--- + +Add a `MethodPill` primitive: a small colored pill labeling an operation as QRY (query), MUT (mutation), or SUB (subscription). diff --git a/packages/graphiql-react/src/components/index.ts b/packages/graphiql-react/src/components/index.ts index 750e7295d61..bae025879f7 100644 --- a/packages/graphiql-react/src/components/index.ts +++ b/packages/graphiql-react/src/components/index.ts @@ -27,3 +27,5 @@ export type { SegmentedControlProps, SegmentedControlOption, } from './segmented-control'; +export { MethodPill } from './method-pill'; +export type { MethodPillProps, Operation } from './method-pill'; diff --git a/packages/graphiql-react/src/components/method-pill/index.css b/packages/graphiql-react/src/components/method-pill/index.css new file mode 100644 index 00000000000..2cc06618b9d --- /dev/null +++ b/packages/graphiql-react/src/components/method-pill/index.css @@ -0,0 +1,32 @@ +.graphiql-method-pill { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 1px 5px; + border-radius: var(--radius-sm); + font-family: var(--font-family-mono); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.04em; + line-height: 1.4; +} + +/* + * Pills use solid backgrounds rather than alpha tints so they read the + * same regardless of what surface they're stacked on, and contrast against + * the pill text stays well above WCAG AA in both themes. + */ +.graphiql-method-pill-query { + color: oklch(98% 0 0); + background: oklch(50% 0.15 146); +} + +.graphiql-method-pill-mutation { + color: oklch(15% 0 0); + background: oklch(85% 0.13 90); +} + +.graphiql-method-pill-subscription { + color: oklch(98% 0 0); + background: oklch(45% 0.18 295); +} diff --git a/packages/graphiql-react/src/components/method-pill/index.tsx b/packages/graphiql-react/src/components/method-pill/index.tsx new file mode 100644 index 00000000000..49ef2ad7ae5 --- /dev/null +++ b/packages/graphiql-react/src/components/method-pill/index.tsx @@ -0,0 +1,24 @@ +import type { FC } from 'react'; +import './index.css'; + +export type Operation = 'query' | 'mutation' | 'subscription'; + +const LABELS: Record = { + query: 'QRY', + mutation: 'MUT', + subscription: 'SUB', +}; + +export type MethodPillProps = { + operation: Operation; + 'aria-hidden'?: boolean; +}; + +export const MethodPill: FC = ({ operation, ...rest }) => ( + + {LABELS[operation]} + +); diff --git a/packages/graphiql-react/src/components/method-pill/method-pill.stories.tsx b/packages/graphiql-react/src/components/method-pill/method-pill.stories.tsx new file mode 100644 index 00000000000..e908ff4ce21 --- /dev/null +++ b/packages/graphiql-react/src/components/method-pill/method-pill.stories.tsx @@ -0,0 +1,23 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { MethodPill } from './'; + +const meta: Meta = { + title: 'Primitives/MethodPill', + component: MethodPill, + tags: ['autodocs'], +}; +export default meta; + +type Story = StoryObj; + +export const Query: Story = { + render: () => , +}; + +export const Mutation: Story = { + render: () => , +}; + +export const Subscription: Story = { + render: () => , +}; diff --git a/packages/graphiql-react/src/components/method-pill/method-pill.test.tsx b/packages/graphiql-react/src/components/method-pill/method-pill.test.tsx new file mode 100644 index 00000000000..43362debd12 --- /dev/null +++ b/packages/graphiql-react/src/components/method-pill/method-pill.test.tsx @@ -0,0 +1,22 @@ +'use no memo'; + +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { MethodPill } from './'; + +describe('MethodPill', () => { + it('renders QRY for query operations', () => { + render(); + expect(screen.getByText('QRY')).toBeInTheDocument(); + }); + + it('renders MUT for mutations', () => { + render(); + expect(screen.getByText('MUT')).toBeInTheDocument(); + }); + + it('renders SUB for subscriptions', () => { + render(); + expect(screen.getByText('SUB')).toBeInTheDocument(); + }); +}); From e54b9c94ab0b61d47731554362c6641a12aa0112 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Fri, 15 May 2026 21:21:20 -0700 Subject: [PATCH 18/38] v6: Rewrite `SegmentedControl` on native radio inputs (#4287) ## Summary - Rewrites `SegmentedControl` to render `
` + hidden `` per option, with a visible `
); } diff --git a/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx b/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx index 13c752628d0..2f6d3843b0a 100644 --- a/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx +++ b/packages/graphiql-react/src/components/segmented-control/segmented-control.stories.tsx @@ -1,6 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { useState } from 'react'; import { SegmentedControl } from './'; +import { PrettifyIcon, DocsIcon, MergeIcon } from '../../icons'; const meta: Meta = { title: 'Primitives/SegmentedControl', @@ -62,3 +63,33 @@ export const WithDisabledOption: StoryObj = { ); }, }; + +export const Icons: StoryObj = { + render() { + const [v, setV] = useState('pretty'); + return ( +