From 08e8ebc4f5a73690139ec3a73889d72d1ca1f4a4 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:02:47 +0200 Subject: [PATCH 01/58] Add a11y config and audit module to @surfnet/storybook-config --- packages/storybook-config/package.json | 10 +- packages/storybook-config/src/a11y-audit.ts | 124 ++++++++++++++++++++ packages/storybook-config/src/a11y.ts | 19 +++ packages/storybook-config/src/index.ts | 3 + 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 packages/storybook-config/src/a11y-audit.ts create mode 100644 packages/storybook-config/src/a11y.ts diff --git a/packages/storybook-config/package.json b/packages/storybook-config/package.json index 54d117bd..aa0edfcb 100644 --- a/packages/storybook-config/package.json +++ b/packages/storybook-config/package.json @@ -13,6 +13,10 @@ "./manager": { "types": "./dist/manager.d.ts", "default": "./dist/manager.js" + }, + "./test-runner": { + "types": "./dist/a11y-audit.d.ts", + "default": "./dist/a11y-audit.js" } }, "files": [ @@ -29,12 +33,16 @@ }, "dependencies": { "@storybook/icons": "2.0.2", - "@surfnet/curve-tokens": "workspace:*" + "@surfnet/curve-tokens": "workspace:*", + "axe-playwright": "2.2.2" }, "devDependencies": { "@storybook/addon-docs": "10.4.5", + "@storybook/test-runner": "0.24.4", "@surfnet/curve-typescript-config": "workspace:*", "@types/react": "19.2.17", + "axe-core": "4.12.1", + "playwright-core": "1.61.0", "react": "19.2.7", "storybook": "10.4.5", "typescript": "6.0.3" diff --git a/packages/storybook-config/src/a11y-audit.ts b/packages/storybook-config/src/a11y-audit.ts new file mode 100644 index 00000000..8b67d5c7 --- /dev/null +++ b/packages/storybook-config/src/a11y-audit.ts @@ -0,0 +1,124 @@ +// Node-only WCAG 2.1 AA audit, run by `@storybook/test-runner`'s `postVisit` +// hook. Kept OUT of the browser preview bundle (it imports Node built-ins, +// Playwright and the test-runner) — consumers reach it via the package's +// `./test-runner` subpath, never the main entry. +import { mkdirSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +import { getStoryContext } from '@storybook/test-runner'; +import type { TestContext } from '@storybook/test-runner'; +import type { Result, RunOptions } from 'axe-core'; +import { getViolations, injectAxe } from 'axe-playwright'; +import type { Page } from 'playwright-core'; + +import { WCAG_21_AA_TAGS } from './a11y.js'; +import { THEME_NAMES } from './themes.js'; + +const RUN_ONLY: RunOptions['runOnly'] = { type: 'tag', values: WCAG_21_AA_TAGS }; + +// Only compute violations (skip building passes/incomplete/inapplicable node +// lists) — the sweep runs axe once per theme/mode, so this keeps each run fast. +const RESULT_TYPES: RunOptions['resultTypes'] = ['violations']; + +// Scope axe to the rendered story rather than the whole Storybook chrome. Colors +// still resolve up the real DOM tree, so contrast checks stay accurate. +const STORY_ROOT = '#storybook-root'; + +// Every theme/mode combination the tokens package ships, so the audit exercises +// the full cascade (`@surfnet/tokens` keys colors on `dark` + `theme-` +// classes on ). Contrast-sensitive rules differ per theme, so each combo +// is a distinct audit surface. +const MODES = ['light', 'dark'] as const; +type Mode = (typeof MODES)[number]; + +// Report directory (one JSON file per story keeps concurrent test-runner +// workers from clobbering a shared file). Override with A11Y_REPORT_DIR. +const REPORT_DIR = resolve(process.env.A11Y_REPORT_DIR ?? 'a11y-report'); + +// Reflect a theme/mode onto exactly like the `themeSwitcher` decorator, +// so axe sees the same resolved CSS variables a real user would. +async function applyTheme(page: Page, theme: string, mode: Mode): Promise { + await page.evaluate( + ({ theme, mode }) => { + const root = document.documentElement; + for (const c of Array.from(root.classList)) { + if (c.startsWith('theme-')) root.classList.remove(c); + } + root.classList.toggle('dark', mode === 'dark'); + if (theme && theme !== 'default') root.classList.add(`theme-${theme}`); + }, + { theme, mode }, + ); +} + +interface ComboResult { + theme: string; + mode: Mode; + violations: Result[]; +} + +/** + * `postVisit` hook for `@storybook/test-runner`: audits the just-rendered story + * against WCAG 2.1 AA with axe, once per theme/mode combination from + * `@surfnet/tokens`. Writes a per-story JSON report and throws if any + * combination has violations (so `test:a11y` exits non-zero). + */ +export async function runStoryA11yAudit(page: Page, context: TestContext): Promise { + const storyContext = await getStoryContext(page, context); + const a11y = storyContext.parameters?.a11y as + | { disable?: boolean; options?: RunOptions } + | undefined; + + // Respect per-story opt-out (`parameters: { a11y: { disable: true } }`). + if (a11y?.disable) return; + + await injectAxe(page); + + // Story-level axe options win over the WCAG 2.1 AA default, so a story can + // waive a specific rule while staying scoped to the same level. + const runOptions: RunOptions = { + resultTypes: RESULT_TYPES, + ...(a11y?.options ?? { runOnly: RUN_ONLY }), + }; + + const results: ComboResult[] = []; + for (const theme of THEME_NAMES) { + for (const mode of MODES) { + await applyTheme(page, theme, mode); + const violations = await getViolations(page, STORY_ROOT, runOptions); + results.push({ theme, mode, violations }); + } + } + + // Restore the story's default look for any later hooks / screenshots. + await applyTheme(page, 'default', 'light'); + + const total = results.reduce((n, r) => n + r.violations.length, 0); + const report = { + id: context.id, + title: storyContext.title, + name: storyContext.name, + tags: WCAG_21_AA_TAGS, + themesTested: THEME_NAMES.length, + modesTested: MODES.length, + totalViolations: total, + results, + }; + + mkdirSync(REPORT_DIR, { recursive: true }); + const file = `${context.id.replace(/[^a-z0-9-]+/gi, '_')}.json`; + writeFileSync(resolve(REPORT_DIR, file), JSON.stringify(report, null, 2) + '\n', 'utf8'); + + if (total > 0) { + const offending = results + .filter((r) => r.violations.length) + .map((r) => { + const rules = r.violations.map((v) => v.id).join(', '); + return ` ${r.theme}/${r.mode}: ${r.violations.length} (${rules})`; + }) + .join('\n'); + throw new Error( + `a11y (WCAG 2.1 AA) violations in "${storyContext.title} / ${storyContext.name}":\n${offending}`, + ); + } +} diff --git a/packages/storybook-config/src/a11y.ts b/packages/storybook-config/src/a11y.ts new file mode 100644 index 00000000..a73e5b3c --- /dev/null +++ b/packages/storybook-config/src/a11y.ts @@ -0,0 +1,19 @@ +// Browser-safe a11y config. This module is imported into each framework's +// `.storybook/preview.ts`, so it must NOT pull in Node built-ins, Playwright or +// the test-runner — those live in `./a11y-audit.ts`, behind the package's +// `./test-runner` subpath, which only the test-runner configs import. + +// WCAG 2.1 Level AA, expressed as the axe-core tag set. Both the interactive +// addon-a11y panel and the headless test-runner are scoped to exactly these +// tags, so a finding in one is a finding in the other. +export const WCAG_21_AA_TAGS: string[] = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']; + +// Preview-level parameters. Merge into each framework's preview `parameters` +// (next to `sharedParameters`). `options.runOnly` scopes the manual panel to +// WCAG 2.1 AA; `test: 'error'` makes the addon treat violations as failures. +export const a11yParameters = { + a11y: { + options: { runOnly: { type: 'tag', values: WCAG_21_AA_TAGS } }, + test: 'error' as const, + }, +}; diff --git a/packages/storybook-config/src/index.ts b/packages/storybook-config/src/index.ts index 5e3e4ec8..f3b2fad3 100644 --- a/packages/storybook-config/src/index.ts +++ b/packages/storybook-config/src/index.ts @@ -12,6 +12,9 @@ export type { TokenKind, TypeScaleEntry, } from './tokens.js'; +// Browser-safe a11y config only. The Node-only audit (`runStoryA11yAudit`) +// lives behind the `./test-runner` subpath so it never reaches a preview bundle. +export { WCAG_21_AA_TAGS, a11yParameters } from './a11y.js'; // Shared preview parameters so every framework's Storybook renders stories the // same way. From 3e419ffc03bfd42b9d61e04ea0f295b75253a41b Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:13:57 +0200 Subject: [PATCH 02/58] Wire WCAG 2.1 AA audit into React and Angular Storybooks --- packages/angular/.storybook/preview.ts | 2 + packages/angular/.storybook/test-runner.ts | 15 + packages/angular/package.json | 9 +- packages/react/.storybook/preview.ts | 2 + packages/react/.storybook/test-runner.ts | 15 + packages/react/package.json | 9 +- pnpm-lock.yaml | 3102 ++++++++++++++++++-- pnpm-workspace.yaml | 1 + 8 files changed, 2923 insertions(+), 232 deletions(-) create mode 100644 packages/angular/.storybook/test-runner.ts create mode 100644 packages/react/.storybook/test-runner.ts diff --git a/packages/angular/.storybook/preview.ts b/packages/angular/.storybook/preview.ts index 79cc474e..2952ac2a 100644 --- a/packages/angular/.storybook/preview.ts +++ b/packages/angular/.storybook/preview.ts @@ -1,4 +1,5 @@ import { + a11yParameters, frameworkGlobalTypes, frameworkSwitcher, sharedParameters, @@ -16,6 +17,7 @@ export default { decorators: [frameworkSwitcher('angular'), themeSwitcher()], parameters: { ...sharedParameters, + ...a11yParameters, // Must be a literal (Storybook reads it via static analysis, not // execution). Keep in sync with packages/react/.storybook/preview.ts. options: { diff --git a/packages/angular/.storybook/test-runner.ts b/packages/angular/.storybook/test-runner.ts new file mode 100644 index 00000000..c1759591 --- /dev/null +++ b/packages/angular/.storybook/test-runner.ts @@ -0,0 +1,15 @@ +import type { TestRunnerConfig } from '@storybook/test-runner'; + +import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; + +// Thin delegate to the shared audit so React and Angular stay in lockstep +// (same convention as the shared preview parameters and decorators). The audit +// sweeps every story against WCAG 2.1 AA across all themes/modes from +// `@surfnet/tokens` and writes a per-story JSON report. +const config: TestRunnerConfig = { + async postVisit(page, context) { + await runStoryA11yAudit(page, context); + }, +}; + +export default config; diff --git a/packages/angular/package.json b/packages/angular/package.json index a41af1e2..74283877 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -26,7 +26,10 @@ "lint": "ngc --noEmit -p tsconfig.json", "storybook": "ng run angular:storybook", "build-storybook": "ng run angular:build-storybook", - "fix-helm-imports": "jiti scripts/rewrite-helm-imports.ts" + "fix-helm-imports": "jiti scripts/rewrite-helm-imports.ts", + "test:a11y": "test-storybook --url http://127.0.0.1:6007 --testTimeout 180000", + "storybook:serve": "http-server storybook-static -p 6007 --silent", + "test:a11y:ci": "start-server-and-test storybook:serve http://127.0.0.1:6007 test:a11y" }, "peerDependencies": { "@angular/common": "^22.0.0", @@ -64,16 +67,20 @@ "@storybook/addon-a11y": "10.4.5", "@storybook/addon-docs": "10.4.5", "@storybook/angular": "10.4.5", + "@storybook/test-runner": "0.24.4", "@surfnet/curve-contracts": "workspace:*", "@surfnet/curve-storybook-config": "workspace:*", "@surfnet/curve-tokens": "workspace:*", "@surfnet/curve-typescript-config": "workspace:*", "@tailwindcss/cli": "4.3.1", "@tailwindcss/postcss": "4.3.1", + "axe-playwright": "2.2.2", + "http-server": "14.1.1", "jiti": "2.7.0", "ng-packagr": "22.0.0", "remark-gfm": "^4.0.1", "rxjs": "7.8.2", + "start-server-and-test": "3.0.11", "storybook": "10.4.5", "tailwindcss": "4.3.1", "tw-animate-css": "1.4.0", diff --git a/packages/react/.storybook/preview.ts b/packages/react/.storybook/preview.ts index 84ef7d12..99a3ff13 100644 --- a/packages/react/.storybook/preview.ts +++ b/packages/react/.storybook/preview.ts @@ -1,4 +1,5 @@ import { + a11yParameters, frameworkGlobalTypes, frameworkSwitcher, sharedParameters, @@ -20,6 +21,7 @@ export default { decorators: [frameworkSwitcher('react'), themeSwitcher()], parameters: { ...sharedParameters, + ...a11yParameters, // Force the React jsxDecorator to always serialize the rendered JSX for the // "Show code" panel. Without this, a story with `render: () => (...)` (no // `args` param) is treated as a non-args story, so Storybook prints the whole diff --git a/packages/react/.storybook/test-runner.ts b/packages/react/.storybook/test-runner.ts new file mode 100644 index 00000000..c1759591 --- /dev/null +++ b/packages/react/.storybook/test-runner.ts @@ -0,0 +1,15 @@ +import type { TestRunnerConfig } from '@storybook/test-runner'; + +import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; + +// Thin delegate to the shared audit so React and Angular stay in lockstep +// (same convention as the shared preview parameters and decorators). The audit +// sweeps every story against WCAG 2.1 AA across all themes/modes from +// `@surfnet/tokens` and writes a per-story JSON report. +const config: TestRunnerConfig = { + async postVisit(page, context) { + await runStoryA11yAudit(page, context); + }, +}; + +export default config; diff --git a/packages/react/package.json b/packages/react/package.json index 8a2e2fbb..707cb505 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -28,7 +28,10 @@ "dev": "vite build --watch", "lint": "tsc --noEmit", "storybook": "storybook dev -p 6006 --no-open", - "build-storybook": "storybook build" + "build-storybook": "storybook build", + "test:a11y": "test-storybook --testTimeout 180000", + "storybook:serve": "http-server storybook-static -p 6006 --silent", + "test:a11y:ci": "start-server-and-test storybook:serve http://127.0.0.1:6006 test:a11y" }, "peerDependencies": { "@phosphor-icons/react": "^2.0.0", @@ -57,6 +60,7 @@ "@storybook/addon-a11y": "10.4.5", "@storybook/addon-docs": "10.4.5", "@storybook/react-vite": "10.4.5", + "@storybook/test-runner": "0.24.4", "@surfnet/curve-contracts": "workspace:*", "@surfnet/curve-storybook-config": "workspace:*", "@surfnet/curve-tokens": "workspace:*", @@ -66,11 +70,14 @@ "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "6.0.2", + "axe-playwright": "2.2.2", + "http-server": "14.1.1", "react": "19.2.7", "react-dom": "19.2.7", "remark-gfm": "^4.0.1", "rollup-plugin-preserve-directives": "^0.4.0", "shadcn": "4.11.0", + "start-server-and-test": "3.0.11", "storybook": "10.4.5", "tailwindcss": "4.3.1", "tw-animate-css": "1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81dd6b0b..91de095b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -247,16 +247,19 @@ importers: version: 33.3.0(@angular-devkit/schematics@22.0.3(chokidar@5.0.0))(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(@schematics/angular@22.0.3(chokidar@5.0.0))(rxjs@7.8.2) '@spartan-ng/cli': specifier: 0.0.1-alpha.715 - version: 0.0.1-alpha.715(4e6bc275d935a53228757a3a51cd4725) + version: 0.0.1-alpha.715(48dc84f132864fbe8ba5d03532c73655) '@storybook/addon-a11y': specifier: 10.4.5 version: 10.4.5(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@storybook/addon-docs': specifier: 10.4.5 - version: 10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) '@storybook/angular': specifier: 10.4.5 - version: 10.4.5(0daad29ddd75a3df4c455e2bdc466bda) + version: 10.4.5(577b43059978df1a5cdc2c5e6ad93bbf) + '@storybook/test-runner': + specifier: 0.24.4 + version: 0.24.4(@swc/helpers@0.5.15)(@types/node@24.13.2)(babel-plugin-macros@3.1.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@surfnet/curve-contracts': specifier: workspace:* version: link:../contracts @@ -275,6 +278,12 @@ importers: '@tailwindcss/postcss': specifier: 4.3.1 version: 4.3.1 + axe-playwright: + specifier: 2.2.2 + version: 2.2.2(playwright@1.63.0) + http-server: + specifier: 14.1.1 + version: 14.1.1 jiti: specifier: 2.7.0 version: 2.7.0 @@ -287,6 +296,9 @@ importers: rxjs: specifier: 7.8.2 version: 7.8.2 + start-server-and-test: + specifier: 3.0.11 + version: 3.0.11 storybook: specifier: 10.4.5 version: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -372,6 +384,9 @@ importers: '@storybook/react-vite': specifier: 10.4.5 version: 10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.6)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)) + '@storybook/test-runner': + specifier: 0.24.4 + version: 0.24.4(@swc/helpers@0.5.15)(@types/node@24.13.2)(babel-plugin-macros@3.1.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@surfnet/curve-contracts': specifier: workspace:* version: link:../contracts @@ -399,6 +414,12 @@ importers: '@vitejs/plugin-react': specifier: 6.0.2 version: 6.0.2(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.6)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + axe-playwright: + specifier: 2.2.2 + version: 2.2.2(playwright@1.63.0) + http-server: + specifier: 14.1.1 + version: 14.1.1 react: specifier: 19.2.7 version: 19.2.7 @@ -414,6 +435,9 @@ importers: shadcn: specifier: 4.11.0 version: 4.11.0(babel-plugin-macros@3.1.0)(typescript@6.0.3) + start-server-and-test: + specifier: 3.0.11 + version: 3.0.11 storybook: specifier: 10.4.5 version: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -441,16 +465,28 @@ importers: '@surfnet/curve-tokens': specifier: workspace:* version: link:../tokens + axe-playwright: + specifier: 2.2.2 + version: 2.2.2(playwright@1.63.0) devDependencies: '@storybook/addon-docs': specifier: 10.4.5 version: 10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.6)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)) + '@storybook/test-runner': + specifier: 0.24.4 + version: 0.24.4(@swc/helpers@0.5.15)(@types/node@24.13.2)(babel-plugin-macros@3.1.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@surfnet/curve-typescript-config': specifier: workspace:* version: link:../typescript-config '@types/react': specifier: 19.2.17 version: 19.2.17 + axe-core: + specifier: 4.12.1 + version: 4.12.1 + playwright-core: + specifier: 1.61.0 + version: 1.61.0 react: specifier: 19.2.7 version: 19.2.7 @@ -1115,6 +1151,27 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.29.7': resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==} engines: {node: '>=6.9.0'} @@ -1133,12 +1190,64 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.29.7': resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.29.7': resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} @@ -1557,6 +1666,9 @@ packages: '@types/react': optional: true + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true @@ -2294,6 +2406,32 @@ packages: resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} engines: {node: ^20.17.0 || >=22.9.0} + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.7': + resolution: {integrity: sha512-MgNjRwy9Ti92yVAixLmDc8dd1bJIKwO9qlWCfFQRwRmUEDPQHYn4G6hwPFvFGUTzAa0FsS+inMjLin7GnyBRhA==} + engines: {node: '>=14.0.0'} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} @@ -2662,26 +2800,116 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + '@istanbuljs/schema@0.1.6': resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} + '@jest/console@30.5.2': + resolution: {integrity: sha512-e8sQC4pCMHPBrPX7Hk8TJr+DM5dkUnImSTNag8SEWFAFAF6xIz4AJvCKapnrdHnZxep4bxw4PhG+ZbimYBMyKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.5.2': + resolution: {integrity: sha512-/jqvFWoJF7LV1a6AUpYMbMm+2yIYsHJfR474H0SCzr9k8tnO/jl9wRg6zSG6lxgf6EozNlCG4amFzWsbZSvvZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/create-cache-key-function@30.5.1': + resolution: {integrity: sha512-5qkif//qhlbt54255O/M2JtUZNlnefOzE12bi7FlApOIYO4pqrZcAwhNCfP4jOGFubez8uoLgY9czWFjYY57ow==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.5.0': + resolution: {integrity: sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.5.2': + resolution: {integrity: sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.5.2': + resolution: {integrity: sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.5.2': + resolution: {integrity: sha512-2E+1Pg6jJxbRjLNLpciC71iri/3qsKJL222/aXJEFwC0VdUSvfS+JZQQLEVjUYYc8t8pQu2MGE3cF2+bNTYRsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.5.2': + resolution: {integrity: sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.5.0': + resolution: {integrity: sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.5.2': + resolution: {integrity: sha512-62zfS+dL+M5aTNHXCNLyqD+j4oqxTIzDYrZbpqMP8Yn+gvlAGyzC6BSPNb1ZmFOakV1RtFYX/O3FCQXSWmQdgg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.4.0': resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.5.0': + resolution: {integrity: sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.5.2': + resolution: {integrity: sha512-ev6E9iG73twQcfAfoTnviuYkr3yOrYbzAtMFCimv2fxHXPIp9PBt2u1wNMt0aYWgl8FPwIcS8oqRJg6alnht4Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/schemas@30.4.1': resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.5.0': + resolution: {integrity: sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.5.1': + resolution: {integrity: sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.5.2': + resolution: {integrity: sha512-c5CehvkbfHX6yyNg7bMn2ylqlp9AHXuZ/3hPH/Lh5bxD/vefd/lV9HBjMqXef9yQNqkdwyZvkLSVSwB38hy8Qw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.5.2': + resolution: {integrity: sha512-eO6YU5rsLfs60ne694e0IAmRgeBnoA8mu0nlxXDbl/1j5km0o2vO9/VbbUIKIH+WRKKEI+ELgwraRGn2Lhep8g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.5.2': + resolution: {integrity: sha512-bmij8jZyYAC47ExT2GeP7PcrlwSNS+Bp3KeRuBH88gpcxqDv6fljN8PemS4J/lLZ79xb6mpaennQTTq0zUAVVg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.5.2': + resolution: {integrity: sha512-LBGwmaE886C41jDZ65eqR1YbXM7642MK3ZhTowZd5+xDlrDLuf4ePuDdDmVSvcr8NTVJ3MqxLkMbUCzuigUaoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.4.1': resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.5.1': + resolution: {integrity: sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} peerDependencies: @@ -3733,6 +3961,12 @@ packages: cpu: [arm64] os: [android] + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + '@parcel/watcher-darwin-arm64@2.5.1': resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} engines: {node: '>= 10.0.0'} @@ -3745,6 +3979,12 @@ packages: cpu: [arm64] os: [darwin] + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + '@parcel/watcher-darwin-x64@2.5.1': resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} engines: {node: '>= 10.0.0'} @@ -3757,6 +3997,12 @@ packages: cpu: [x64] os: [darwin] + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + '@parcel/watcher-freebsd-x64@2.5.1': resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} engines: {node: '>= 10.0.0'} @@ -3769,6 +4015,12 @@ packages: cpu: [x64] os: [freebsd] + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + '@parcel/watcher-linux-arm-glibc@2.5.1': resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} engines: {node: '>= 10.0.0'} @@ -3783,6 +4035,13 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} @@ -3797,6 +4056,13 @@ packages: os: [linux] libc: [musl] + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} @@ -3811,6 +4077,13 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} @@ -3825,6 +4098,13 @@ packages: os: [linux] libc: [musl] + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} @@ -3839,6 +4119,13 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} @@ -3853,6 +4140,13 @@ packages: os: [linux] libc: [musl] + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} engines: {node: '>= 10.0.0'} @@ -3865,6 +4159,12 @@ packages: cpu: [arm64] os: [win32] + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + '@parcel/watcher-win32-ia32@2.5.1': resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} engines: {node: '>= 10.0.0'} @@ -3889,6 +4189,12 @@ packages: cpu: [x64] os: [win32] + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + '@parcel/watcher@2.5.1': resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} @@ -3897,6 +4203,10 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + '@peculiar/asn1-cms@2.8.0': resolution: {integrity: sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==} @@ -3950,6 +4260,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + '@pnpm/deps.graph-sequencer@1100.0.1': resolution: {integrity: sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==} engines: {node: '>=22.13'} @@ -4701,6 +5015,15 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sigstore/bundle@4.0.0': resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -4732,6 +5055,12 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} + '@spartan-ng/brain@0.0.1-alpha.720': resolution: {integrity: sha512-gFbvMUZauu00zUT5uVautgkUlZcDhS8AgBxSQAx1HJdNyLt6YBg1TrOp1SSAxv74FXfwmSfpN0t7+X+ZoHGI9A==} peerDependencies: @@ -4882,9 +5211,115 @@ packages: typescript: optional: true + '@storybook/test-runner@0.24.4': + resolution: {integrity: sha512-xm04bba5N7QyHHc+wD4xmPZx0vKK/PIpmTFypy445HrWOj0nFK4pYg5dE6H4ppqMt7qZAnb5GfHTvBwJtywJ4A==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + storybook: ^0.0.0-0 || ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 + + '@swc/core-darwin-arm64@1.16.2': + resolution: {integrity: sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.16.2': + resolution: {integrity: sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.16.2': + resolution: {integrity: sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.16.2': + resolution: {integrity: sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.16.2': + resolution: {integrity: sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-ppc64-gnu@1.16.2': + resolution: {integrity: sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-s390x-gnu@1.16.2': + resolution: {integrity: sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-gnu@1.16.2': + resolution: {integrity: sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.16.2': + resolution: {integrity: sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.16.2': + resolution: {integrity: sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.16.2': + resolution: {integrity: sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.16.2': + resolution: {integrity: sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.16.2': + resolution: {integrity: sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/jest@0.2.39': + resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + + '@swc/types@0.1.28': + resolution: {integrity: sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==} + '@tailwindcss/cli@4.3.1': resolution: {integrity: sha512-ZWPy20rF+TBfTImxDMG3Wr75Y3RpaPlo9lc+oJbInlMyjT+XPkTVKVIL5RZ7JirXuIahcfHoLNFRmDorKi+JQQ==} hasBin: true @@ -5154,6 +5589,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/junit-report-builder@3.0.2': + resolution: {integrity: sha512-R5M+SYhMbwBeQcNXYWNCZkl09vkVfAtcPIaCGdzIkkbeaTrVbGQ7HVgi4s+EmM/M1K4ZuWQH0jGcvMvNePfxYA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -5216,12 +5654,18 @@ packages: '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@types/wait-on@5.3.4': + resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5645,6 +6089,10 @@ packages: resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} engines: {node: '>= 20'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -5688,6 +6136,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -5705,6 +6157,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -5721,6 +6177,19 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -5820,6 +6289,17 @@ packages: resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} engines: {node: '>=4'} + axe-html-reporter@2.2.11: + resolution: {integrity: sha512-WlF+xlNVgNVWiM6IdVrsh+N0Cw7qupe5HT9N6Uyi+aN7f6SSi92RDomiP1noW8OWIV85V6x404m5oKMeqRV3tQ==} + engines: {node: '>=8.9.0'} + peerDependencies: + axe-core: '>=3' + + axe-playwright@2.2.2: + resolution: {integrity: sha512-h350/grzDCPgpuWV7eEOqr/f61Xn07Gi9f9B3Ew4rW6/nFtpdEJYW6jgRATorgAGXjEAYFTnaY3sEys39wDw4A==} + peerDependencies: + playwright: '>1.0.0' + axios@1.16.0: resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} @@ -5827,6 +6307,12 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-jest@30.5.2: + resolution: {integrity: sha512-ES8WeJ2fNWPEDunyAtUfJ12nHyaWUloCHdkfK2oW5uSoQSUmjNKdWiGaXJITJwvFEWoD/evHEg/QoCXAvLaQqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + babel-loader@10.0.0: resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} @@ -5846,6 +6332,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + babel-plugin-istanbul@8.0.0: + resolution: {integrity: sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==} + engines: {node: '>=18'} + + babel-plugin-jest-hoist@30.5.0: + resolution: {integrity: sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -5879,6 +6373,17 @@ packages: '@babel/traverse': optional: true + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.5.0: + resolution: {integrity: sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 || ^8.0.0 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -5958,6 +6463,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -5987,6 +6495,10 @@ packages: resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} engines: {node: ^20.17.0 || >=22.9.0} + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -6006,6 +6518,14 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -6027,6 +6547,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -6038,6 +6562,10 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -6048,6 +6576,10 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -6079,6 +6611,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -6086,6 +6621,10 @@ packages: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -6117,6 +6656,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -6143,13 +6685,26 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -6182,6 +6737,9 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -6189,6 +6747,9 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -6433,6 +6994,10 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cwd@0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -6484,6 +7049,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -6517,6 +7086,10 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -6569,6 +7142,10 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -6587,6 +7164,9 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + diffable-html@4.1.0: + resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -6608,15 +7188,24 @@ packages: dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -6625,6 +7214,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -6689,6 +7281,10 @@ packages: embla-carousel@8.6.0: resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -6732,6 +7328,9 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -6815,6 +7414,9 @@ packages: resolution: {integrity: sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esbuild-wasm@0.27.3: resolution: {integrity: sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==} engines: {node: '>=18'} @@ -6846,6 +7448,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -7046,14 +7652,34 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-playwright@0.8.0: + resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + deprecated: ⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration. + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + expect@30.5.2: + resolution: {integrity: sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} @@ -7113,6 +7739,9 @@ packages: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -7150,6 +7779,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + find-cache-dir@4.0.0: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} engines: {node: '>=14.16'} @@ -7158,18 +7791,34 @@ packages: resolution: {integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==} engines: {node: '>=20'} + find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + find-file-up@2.0.1: resolution: {integrity: sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==} engines: {node: '>=8'} + find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + find-pkg@2.0.0: resolution: {integrity: sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==} engines: {node: '>=8'} + find-process@1.4.11: + resolution: {integrity: sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==} + hasBin: true + find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -7205,6 +7854,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -7239,9 +7892,16 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -7257,6 +7917,9 @@ packages: fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -7303,6 +7966,10 @@ packages: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -7348,10 +8015,22 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} + global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} @@ -7382,6 +8061,10 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -7401,6 +8084,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -7445,6 +8132,9 @@ packages: html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} @@ -7465,6 +8155,9 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -7589,6 +8282,11 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -7600,6 +8298,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -7714,6 +8416,10 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -7825,6 +8531,9 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -7856,6 +8565,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -7898,10 +8611,38 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -7909,14 +8650,136 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-changed-files@30.5.1: + resolution: {integrity: sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.5.2: + resolution: {integrity: sha512-vffFgjs5JSJ9q4ds1vNW3klKYPJfYfIY61LT/zaZgvTeASJOWZUt8LBfHgIcV4rwxlPBLl/ePBGccHEclS4PlQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.5.2: + resolution: {integrity: sha512-YYYxUUVjFgPvgEleKNKMaYGIFgR3l3832Cl0kRL/oCiDZ03v7wImUtquHl2OOBCCNgprjZgBN5bczS/JklPBDg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.5.2: + resolution: {integrity: sha512-U6221OZekabePvGcGPf4raIBKMvYQWFHvhobDJRojOYaFMj2HaGytAdknjDhYc6JTz2fdHW9+6k0wWUDaNeOFQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.5.2: + resolution: {integrity: sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.5.0: + resolution: {integrity: sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.5.2: + resolution: {integrity: sha512-GRrW+7fmmgmkvyfEBqc1QFdWnF1Ex5yG6Y6AWL4TTxnkWlKIT98dsKh3P3UuWm6v4XsQwVE6DEzXIPMzWJ3ZbA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.5.2: + resolution: {integrity: sha512-Ciz4KgTGIbojxSKpuFImgWJj5EyqfE8xMq9NxWmOXnQywHHS03H9Mv+vaCB29J5pr3JBrY27WbRV18rBdjh8Dg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.5.1: + resolution: {integrity: sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-junit@16.0.0: + resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} + engines: {node: '>=10.12.0'} + + jest-leak-detector@30.5.1: + resolution: {integrity: sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.5.2: + resolution: {integrity: sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.5.1: + resolution: {integrity: sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.5.2: + resolution: {integrity: sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-process-manager@0.4.0: + resolution: {integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==} + deprecated: ⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details. + jest-regex-util@30.4.0: resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-regex-util@30.5.0: + resolution: {integrity: sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.5.2: + resolution: {integrity: sha512-GMI0DP5enX9Z2qW2zFy1bOkrCfWAOPRJQ7qHt0pdfrxBPsgWxglMPrRSK2TX/wRWYxcPRSLFg3Z88qPOzHx7FQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.5.1: + resolution: {integrity: sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.5.2: + resolution: {integrity: sha512-/B6px7hiiNhVSRwuv9AGn0nawYvwsHeQZ3ItTd5Gp2diFd0EOKaWVeWqcbw3L88vx1GfpCKjQkxWItZCTl11Rw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.5.2: + resolution: {integrity: sha512-0paUAHBlheai10A3XSy9Xh+YBG0IROy+/qzcDPzQ/nbbXrznQzeWy5qniICWK6d3W3scaRQCVAbXdcK0ibBq4w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-serializer-html@7.1.0: + resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + + jest-snapshot@30.5.2: + resolution: {integrity: sha512-jKIdes25AnAH73dOCi2qE6J6vHJ6L2vyBS11M89kT50DVJcLTf2AOjvcc+2vVaN8lUbY5v2R83aqXo3Ro9fqYA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.4.1: resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.5.1: + resolution: {integrity: sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.5.1: + resolution: {integrity: sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watch-typeahead@3.0.1: + resolution: {integrity: sha512-SFmHcvdueTswZlVhPCWfLXMazvwZlA2UZTrcE7MC3NwEVeWvEcOx6HUe+igMbnmA6qowuBSW4in8iC6J2EYsgQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + jest: ^30.0.0 + + jest-watcher@30.5.2: + resolution: {integrity: sha512-rqRgg4R11GA9m1UsEZwQeixHsgZReCn6TOHAHtIH33yXrIvoX0OGPA20Yzzjkz7X40fZvcRSxEpQppYPcWzmcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -7925,6 +8788,20 @@ packages: resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@30.5.1: + resolution: {integrity: sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.5.2: + resolution: {integrity: sha512-3gnpdBIza8ijCl3iMV9ChE3hSt1+46865qqod863gQtJr1DixOkAU5DoGbi3u+XlRcw++BhZQMu/y4xBdHBvSQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -7936,12 +8813,23 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joi@17.13.8: + resolution: {integrity: sha512-iPKOGmiRw1jxf/JOPwxmCcUQAOdF359mdzYiP2DJ+TMX0YK2zjK3D+zYOaGjpumWxOFF/l2xVWjRVK5bGSLdEw==} + + joi@18.2.9: + resolution: {integrity: sha512-2mD929bUVKUhOLQQEVhlf6EZ0Mlo0DeRb5MO7cViR9AXLtBauuccEtB1py9Ocxpo/P7ucnh442iY/iOwrh3IQw==} + engines: {node: '>= 20'} + jose@6.2.3: resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} + hasBin: true + js-yaml@4.2.0: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true @@ -8019,6 +8907,10 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + junit-report-builder@5.1.2: + resolution: {integrity: sha512-HzvLbEQcoqN2LmGnloShxu2hLadi/rkOTU3zt61UeMICLS0wGDvbf8neIi6+bGkxMnAePIcFMFnbqV+r6YvwxA==} + engines: {node: '>=16'} + karma-source-map-support@1.4.0: resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} @@ -8053,6 +8945,10 @@ packages: launch-editor@2.14.1: resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + lazy-ass@2.0.3: + resolution: {integrity: sha512-/O3/DoQmI1XAhklDvF1dAjFf/epE8u3lzOZegQfLZ8G7Ud5bTRSZiFOpukHCu6jODrCA4gtIdwUCC7htxcDACA==} + engines: {node: '> 0.8'} + less-loader@12.3.1: resolution: {integrity: sha512-JZZmG7gMzoDP3VGeEG8Sh6FW5wygB5jYL7Wp29FFihuRTsIBacqO3LbRPr2yStYD11riVf13selLm/CPFRDBRQ==} engines: {node: '>= 18.12.0'} @@ -8094,6 +8990,10 @@ packages: engines: {node: '>=18'} hasBin: true + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -8228,6 +9128,10 @@ packages: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -8239,6 +9143,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -8267,6 +9174,10 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + long-timeout@0.1.1: resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} @@ -8312,6 +9223,14 @@ packages: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + make-dir@5.1.0: resolution: {integrity: sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==} engines: {node: '>=18'} @@ -8583,6 +9502,11 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -8611,6 +9535,10 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -8750,6 +9678,13 @@ packages: node-html-parser@7.1.0: resolution: {integrity: sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ==} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + node-releases@2.0.47: resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} engines: {node: '>=18'} @@ -8818,6 +9753,11 @@ packages: '@swc/core': optional: true + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -8927,6 +9867,10 @@ packages: ordered-binary@1.6.1: resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -8938,6 +9882,10 @@ packages: oxc-resolver@11.20.0: resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -8946,6 +9894,10 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -8954,6 +9906,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + p-map@7.0.4: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} @@ -8962,6 +9918,14 @@ packages: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -9034,6 +9998,10 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -9095,6 +10063,10 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + piscina@5.1.4: resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} engines: {node: '>=20.x'} @@ -9107,6 +10079,10 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} @@ -9125,6 +10101,21 @@ packages: resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} engines: {node: '>=16.0.0'} + playwright-core@1.61.0: + resolution: {integrity: sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==} + engines: {node: '>=18'} + hasBin: true + + playwright-core@1.63.0: + resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.63.0: + resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==} + engines: {node: '>=20'} + hasBin: true + portfinder@1.0.38: resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} engines: {node: '>= 10.12'} @@ -9399,6 +10390,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@30.5.1: + resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -9410,6 +10405,10 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} + engines: {node: '>=8'} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -9439,6 +10438,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -9498,6 +10500,12 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.3.0: + resolution: {integrity: sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==} + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -9608,6 +10616,10 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -9628,12 +10640,23 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} reselect@5.2.0: resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -9642,6 +10665,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -9686,7 +10713,12 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.0-rc.4: + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rolldown@1.0.0-rc.4: resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -10021,6 +11053,9 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -10097,6 +11132,14 @@ packages: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -10157,6 +11200,13 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spawnd@5.0.0: + resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} @@ -10173,6 +11223,9 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + ssri@13.0.1: resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -10180,12 +11233,21 @@ packages: stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + start-server-and-test@3.0.11: + resolution: {integrity: sha512-NRapOwJl6jr1DNSaQ+SRukHI2OKcFZA2Iv2tfTW9fI/S+6YmJGiwacR+0MG3o5p39lY4xWUOE5JFkKJBZUjxuQ==} + engines: {node: ^22 || >=24} + hasBin: true + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -10231,6 +11293,14 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-length@6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10292,6 +11362,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -10348,6 +11422,10 @@ packages: peerDependencies: postcss: ^8.5.13 + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -10376,6 +11454,10 @@ packages: resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} engines: {node: '>=16.0.0'} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + tailwind-merge@3.6.0: resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} @@ -10454,6 +11536,14 @@ packages: engines: {node: '>=10'} hasBin: true + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} + thingies@2.6.0: resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} @@ -10622,6 +11712,18 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -10649,6 +11751,9 @@ packages: typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript-eslint@8.62.0: resolution: {integrity: sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10845,6 +11950,10 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -11047,6 +12156,21 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wait-on@7.2.0: + resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + wait-on@9.0.10: + resolution: {integrity: sha512-rCoJEhvMr0X6alHmwc9abbrA5ZrLZFKpFQVKPNFwl2h7DapXOGdmimIHDtLOWhT4PjhZhxFEtZoQgEXbkDWdZw==} + engines: {node: '>=20.0.0'} + hasBin: true + + wait-port@0.2.14: + resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} + engines: {node: '>=8'} + hasBin: true + watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -11207,6 +12331,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.22: resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} @@ -11265,6 +12392,13 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -11289,9 +12423,19 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -11315,6 +12459,10 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -11323,6 +12471,10 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -11493,11 +12645,11 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.2.15(f8ab6f975eee03eee4b3abc630c8c697)': + '@angular-devkit/build-angular@21.2.15(92540745d3bac060cf41dcb5e1f5dfad)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.15(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.15(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + '@angular-devkit/build-webpack': 0.2102.15(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.15(chokidar@5.0.0) '@angular/build': 21.2.15(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@24.13.2)(chokidar@5.0.0)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(ng-packagr@22.0.0(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(tailwindcss@4.3.1)(tslib@2.8.1)(typescript@6.0.3))(postcss@8.5.12)(sass-embedded@1.100.0)(tailwindcss@4.3.1)(terser@5.46.0)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.9(@types/node@24.13.2)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0)))(yaml@2.9.0) '@angular/compiler-cli': 22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3) @@ -11511,50 +12663,51 @@ snapshots: '@babel/preset-env': 7.29.2(@babel/core@7.29.0) '@babel/runtime': 7.29.2 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.15(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(typescript@6.0.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + '@ngtools/webpack': 21.2.15(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(typescript@6.0.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) ansi-colors: 4.1.3 autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.0)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + babel-loader: 10.0.0(@babel/core@7.29.0)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - css-loader: 7.1.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + css-loader: 7.1.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) esbuild-wasm: 0.27.3 http-proxy-middleware: 3.0.5 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 less: 4.4.2 - less-loader: 12.3.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.4.2)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + less-loader: 12.3.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.4.2)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) open: 11.0.0 ora: 9.3.0 picomatch: 4.0.4 piscina: 5.1.4 postcss: 8.5.12 - postcss-loader: 8.2.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.12)(typescript@6.0.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + postcss-loader: 8.2.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.12)(typescript@6.0.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 sass: 1.97.3 - sass-loader: 16.0.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + sass-loader: 16.0.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) source-map-support: 0.5.21 terser: 5.46.0 tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 typescript: 6.0.3 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) - webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) optionalDependencies: '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2)) esbuild: 0.27.3 + jest: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) ng-packagr: 22.0.0(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(tailwindcss@4.3.1)(tslib@2.8.1)(typescript@6.0.3) tailwindcss: 4.3.1 transitivePeerDependencies: @@ -11589,12 +12742,12 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.2102.15(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': + '@angular-devkit/build-webpack@0.2102.15(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': dependencies: '@angular-devkit/architect': 0.2102.15(chokidar@5.0.0) rxjs: 7.8.2 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) transitivePeerDependencies: - chokidar @@ -12349,6 +13502,26 @@ snapshots: dependencies: '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -12374,11 +13547,61 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -13345,6 +14568,8 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 + '@bcoe/v8-coverage@0.2.3': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 @@ -13935,6 +15160,28 @@ snapshots: '@gar/promise-retry@1.0.3': {} + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/hoek@9.3.0': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.7': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + '@harperfast/extended-iterable@1.0.3': optional: true @@ -14222,19 +15469,200 @@ snapshots: dependencies: minipass: 7.1.3 + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.15.2 + resolve-from: 5.0.0 + '@istanbuljs/schema@0.1.6': {} + '@jest/console@30.5.2': + dependencies: + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + chalk: 4.1.2 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + slash: 3.0.0 + + '@jest/core@30.5.2(babel-plugin-macros@3.1.0)': + dependencies: + '@jest/console': 30.5.2 + '@jest/pattern': 30.5.0 + '@jest/reporters': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.4.0 + exit-x: 0.2.2 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-changed-files: 30.5.1 + jest-config: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-resolve-dependencies: 30.5.2 + jest-runner: 30.5.2 + jest-runtime: 30.5.2 + jest-snapshot: 30.5.2 + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-watcher: 30.5.2 + pretty-format: 30.5.1 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/create-cache-key-function@30.5.1': + dependencies: + '@jest/types': 30.5.1 + '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.5.0': {} + + '@jest/environment@30.5.2': + dependencies: + '@jest/fake-timers': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + jest-mock: 30.5.2 + + '@jest/expect-utils@30.5.2': + dependencies: + '@jest/get-type': 30.5.0 + + '@jest/expect@30.5.2': + dependencies: + expect: 30.5.2 + jest-snapshot: 30.5.2 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.5.2': + dependencies: + '@jest/types': 30.5.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 24.13.2 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-util: 30.5.1 + + '@jest/get-type@30.5.0': {} + + '@jest/globals@30.5.2': + dependencies: + '@jest/environment': 30.5.2 + '@jest/expect': 30.5.2 + '@jest/types': 30.5.1 + jest-mock: 30.5.2 + transitivePeerDependencies: + - supports-color + '@jest/pattern@30.4.0': dependencies: '@types/node': 24.13.2 jest-regex-util: 30.4.0 + '@jest/pattern@30.5.0': + dependencies: + '@types/node': 24.13.2 + jest-regex-util: 30.5.0 + + '@jest/reporters@30.5.2': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2 + '@jest/types': 30.5.1 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 24.13.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + jest-worker: 30.5.1 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/schemas@30.4.1': dependencies: '@sinclair/typebox': 0.34.49 + '@jest/schemas@30.5.0': + dependencies: + '@sinclair/typebox': 0.34.49 + + '@jest/snapshot-utils@30.5.1': + dependencies: + '@jest/types': 30.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.5.2': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + convert-source-map: 2.0.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.5.2': + dependencies: + '@jest/console': 30.5.2 + '@jest/types': 30.5.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + + '@jest/test-sequencer@30.5.2': + dependencies: + '@jest/test-result': 30.5.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + slash: 3.0.0 + + '@jest/transform@30.5.2': + dependencies: + '@babel/core': 7.29.7 + '@jest/types': 30.5.1 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 8.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@30.4.1': dependencies: '@jest/pattern': 30.4.0 @@ -14245,6 +15673,16 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 + '@jest/types@30.5.1': + dependencies: + '@jest/pattern': 30.5.0 + '@jest/schemas': 30.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.13.2 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.6)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: glob: 13.0.6 @@ -14560,7 +15998,7 @@ snapshots: - node-fetch - utf-8-validate - '@module-federation/enhanced@2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': + '@module-federation/enhanced@2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@module-federation/bridge-react-webpack-plugin': 2.5.1(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/cli': 2.5.1(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3) @@ -14578,7 +16016,7 @@ snapshots: upath: 2.0.1 optionalDependencies: typescript: 6.0.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -14613,16 +16051,16 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/node@2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': + '@module-federation/node@2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: - '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) '@module-federation/runtime': 2.5.1(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/sdk': 2.5.1(node-fetch@2.7.0(encoding@0.1.13)) encoding: 0.1.13 node-fetch: 2.7.0(encoding@0.1.13) tapable: 2.3.0 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -14869,11 +16307,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@ngtools/webpack@21.2.15(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(typescript@6.0.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': + '@ngtools/webpack@21.2.15(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(typescript@6.0.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12))': dependencies: '@angular/compiler-cli': 22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3) typescript: 6.0.3 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) '@noble/ciphers@1.3.0': {} @@ -14955,18 +16393,18 @@ snapshots: node-gyp: 12.4.0 proc-log: 6.1.0 - '@nx/angular@22.7.5(d73274cdbc24cc3e41d341fd28ee74eb)': + '@nx/angular@22.7.5(7e5e6e6f8b6f70e6f73da22ef644ae2a)': dependencies: '@angular-devkit/core': 22.0.3(chokidar@5.0.0) '@angular-devkit/schematics': 22.0.3(chokidar@5.0.0) - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/eslint': 22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) - '@nx/module-federation': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(@swc/helpers@0.5.15)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5)(postcss@8.5.15)(typescript@6.0.3) - '@nx/rspack': 22.7.5(@babel/traverse@7.29.7)(@module-federation/enhanced@2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(@module-federation/node@2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(@swc/helpers@0.5.15)(esbuild@0.28.1)(less@4.6.6)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5)(react-refresh@0.18.0)(typescript@6.0.3)(webpack-hot-middleware@2.26.1) - '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(nx@22.7.5) - '@nx/webpack': 22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3) - '@nx/workspace': 22.7.5 + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/eslint': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) + '@nx/module-federation': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5(@swc/core@1.16.2))(postcss@8.5.15)(typescript@6.0.3) + '@nx/rspack': 22.7.5(59c1c01abad0ad572ebe1cb15d6ecfa7) + '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) + '@nx/webpack': 22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3) + '@nx/workspace': 22.7.5(@swc/core@1.16.2) '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) '@schematics/angular': 21.2.14(chokidar@5.0.0) '@typescript-eslint/type-utils': 8.61.0(eslint@10.5.0(jiti@2.7.0))(typescript@6.0.3) @@ -14979,7 +16417,7 @@ snapshots: tslib: 2.8.1 webpack-merge: 5.10.0 optionalDependencies: - '@angular-devkit/build-angular': 21.2.15(f8ab6f975eee03eee4b3abc630c8c697) + '@angular-devkit/build-angular': 21.2.15(92540745d3bac060cf41dcb5e1f5dfad) '@angular/build': 22.0.2(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2)))(@types/node@24.13.2)(chokidar@5.0.0)(istanbul-lib-instrument@6.0.3)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(ng-packagr@22.0.0(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(tailwindcss@4.3.1)(tslib@2.8.1)(typescript@6.0.3))(postcss@8.5.15)(sass-embedded@1.100.0)(tailwindcss@4.3.1)(terser@5.46.0)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.9(@types/node@24.13.2)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0)))(yaml@2.9.0) ng-packagr: 22.0.0(@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3))(tailwindcss@4.3.1)(tslib@2.8.1)(typescript@6.0.3) transitivePeerDependencies: @@ -15025,21 +16463,21 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/devkit@22.7.5(nx@22.7.5(debug@4.4.3))': + '@nx/devkit@22.7.5(nx@22.7.5(@swc/core@1.16.2))': dependencies: '@zkochan/js-yaml': 0.0.7 ejs: 5.0.1 enquirer: 2.3.6 minimatch: 10.2.5 - nx: 22.7.5(debug@4.4.3) + nx: 22.7.5(@swc/core@1.16.2)(debug@4.4.3) semver: 7.8.4 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3))': + '@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2))': dependencies: - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) eslint: 10.5.0(jiti@2.7.0) semver: 7.8.4 tslib: 2.8.1 @@ -15055,7 +16493,7 @@ snapshots: - supports-color - verdaccio - '@nx/js@22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3))': + '@nx/js@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) @@ -15064,8 +16502,8 @@ snapshots: '@babel/preset-env': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@babel/runtime': 7.29.7 - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/workspace': 22.7.5 + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/workspace': 22.7.5(@swc/core@1.16.2) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.7) babel-plugin-macros: 3.1.0 @@ -15091,20 +16529,20 @@ snapshots: - nx - supports-color - '@nx/module-federation@22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(@swc/helpers@0.5.15)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5)(postcss@8.5.15)(typescript@6.0.3)': + '@nx/module-federation@22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5(@swc/core@1.16.2))(postcss@8.5.15)(typescript@6.0.3)': dependencies: - '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - '@module-federation/node': 2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@module-federation/node': 2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) '@module-federation/sdk': 2.5.1(node-fetch@2.7.0(encoding@0.1.13)) - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) - '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(nx@22.7.5) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) + '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) '@rspack/core': 1.6.8(@swc/helpers@0.5.15) express: 4.22.2 http-proxy-middleware: 3.0.7 picocolors: 1.1.1 tslib: 2.8.1 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -15168,40 +16606,40 @@ snapshots: '@nx/nx-win32-x64-msvc@22.7.5': optional: true - '@nx/rspack@22.7.5(@babel/traverse@7.29.7)(@module-federation/enhanced@2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(@module-federation/node@2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(@swc/helpers@0.5.15)(esbuild@0.28.1)(less@4.6.6)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5)(react-refresh@0.18.0)(typescript@6.0.3)(webpack-hot-middleware@2.26.1)': + '@nx/rspack@22.7.5(59c1c01abad0ad572ebe1cb15d6ecfa7)': dependencies: - '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - '@module-federation/node': 2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) - '@nx/module-federation': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(@swc/helpers@0.5.15)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5)(postcss@8.5.15)(typescript@6.0.3) - '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(nx@22.7.5) + '@module-federation/enhanced': 2.5.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(node-fetch@2.7.0(encoding@0.1.13))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@module-federation/node': 2.7.44(@rspack/core@1.6.8(@swc/helpers@0.5.15))(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) + '@nx/module-federation': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(node-fetch@2.7.0(encoding@0.1.13))(nx@22.7.5(@swc/core@1.16.2))(postcss@8.5.15)(typescript@6.0.3) + '@nx/web': 22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - '@rspack/dev-server': 1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@rspack/dev-server': 1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) '@rspack/plugin-react-refresh': 1.6.2(react-refresh@0.18.0)(webpack-hot-middleware@2.26.1) autoprefixer: 10.5.0(postcss@8.5.15) browserslist: 4.28.2 - css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) enquirer: 2.3.6 express: 4.22.2 http-proxy-middleware: 3.0.7 - less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.6.6)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - license-webpack-plugin: 4.0.2(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.6.6)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + license-webpack-plugin: 4.0.2(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) loader-utils: 2.0.4 parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.5.15 postcss-import: 14.1.0(postcss@8.5.15) - postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) sass: 1.101.0 sass-embedded: 1.100.0 - sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - source-map-loader: 5.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - style-loader: 3.3.4(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + source-map-loader: 5.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + style-loader: 3.3.4(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) ts-checker-rspack-plugin: 1.4.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(tslib@2.8.1)(typescript@6.0.3) tslib: 2.8.1 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@babel/traverse' @@ -15240,17 +16678,17 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/web@22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3))(nx@22.7.5)': + '@nx/web@22.7.5(@babel/traverse@7.29.7)(@nx/eslint@22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)))(@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3))(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2))': dependencies: - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) detect-port: 2.1.0 http-server: 14.1.1 picocolors: 1.1.1 tslib: 2.8.1 optionalDependencies: - '@nx/eslint': 22.7.5(@babel/traverse@7.29.7)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(debug@4.4.3)) - '@nx/webpack': 22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3) + '@nx/eslint': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(@zkochan/js-yaml@0.0.7)(eslint@10.5.0(jiti@2.7.0))(nx@22.7.5(@swc/core@1.16.2)) + '@nx/webpack': 22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -15260,44 +16698,44 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(debug@4.4.3))(typescript@6.0.3)': + '@nx/webpack@22.7.5(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(lightningcss@1.32.0)(nx@22.7.5(@swc/core@1.16.2))(typescript@6.0.3)': dependencies: '@babel/core': 7.29.7 - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) ajv: 8.20.0 autoprefixer: 10.5.0(postcss@8.5.15) - babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(lightningcss@1.32.0)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - fork-ts-checker-webpack-plugin: 9.1.0(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + copy-webpack-plugin: 14.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(lightningcss@1.32.0)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) less: 4.5.1 - less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.5.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - license-webpack-plugin: 4.0.2(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.5.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + license-webpack-plugin: 4.0.2(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) loader-utils: 2.0.4 - mini-css-extract-plugin: 2.4.7(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + mini-css-extract-plugin: 2.4.7(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.5.15 postcss-import: 14.1.0(postcss@8.5.15) - postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) rxjs: 7.8.2 sass: 1.101.0 sass-embedded: 1.100.0 - sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - source-map-loader: 5.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - style-loader: 3.3.4(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - ts-loader: 9.6.0(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + source-map-loader: 5.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + style-loader: 3.3.4(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + ts-loader: 9.6.0(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) tsconfig-paths-webpack-plugin: 4.2.0 tslib: 2.8.1 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - webpack-dev-server: 5.2.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack-dev-server: 5.2.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) webpack-node-externals: 3.0.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -15325,13 +16763,13 @@ snapshots: - verdaccio - webpack-cli - '@nx/workspace@22.7.5': + '@nx/workspace@22.7.5(@swc/core@1.16.2)': dependencies: - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 22.7.5(debug@4.4.3) + nx: 22.7.5(@swc/core@1.16.2)(debug@4.4.3) picomatch: 4.0.4 semver: 7.8.4 tslib: 2.8.1 @@ -15478,66 +16916,99 @@ snapshots: '@parcel/watcher-android-arm64@2.5.6': optional: true + '@parcel/watcher-android-arm64@2.6.0': + optional: true + '@parcel/watcher-darwin-arm64@2.5.1': optional: true '@parcel/watcher-darwin-arm64@2.5.6': optional: true + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + '@parcel/watcher-darwin-x64@2.5.1': optional: true '@parcel/watcher-darwin-x64@2.5.6': optional: true + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + '@parcel/watcher-freebsd-x64@2.5.1': optional: true '@parcel/watcher-freebsd-x64@2.5.6': optional: true + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + '@parcel/watcher-linux-arm-glibc@2.5.1': optional: true '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + '@parcel/watcher-linux-arm-musl@2.5.1': optional: true '@parcel/watcher-linux-arm-musl@2.5.6': optional: true + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + '@parcel/watcher-linux-arm64-glibc@2.5.1': optional: true '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + '@parcel/watcher-linux-arm64-musl@2.5.1': optional: true '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + '@parcel/watcher-linux-x64-glibc@2.5.1': optional: true '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + '@parcel/watcher-linux-x64-musl@2.5.1': optional: true '@parcel/watcher-linux-x64-musl@2.5.6': optional: true + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + '@parcel/watcher-win32-arm64@2.5.1': optional: true '@parcel/watcher-win32-arm64@2.5.6': optional: true + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + '@parcel/watcher-win32-ia32@2.5.1': optional: true @@ -15550,6 +17021,9 @@ snapshots: '@parcel/watcher-win32-x64@2.5.6': optional: true + '@parcel/watcher-win32-x64@2.6.0': + optional: true + '@parcel/watcher@2.5.1': dependencies: detect-libc: 1.0.3 @@ -15593,6 +17067,26 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + '@peculiar/asn1-cms@2.8.0': dependencies: '@peculiar/asn1-schema': 2.8.0 @@ -15701,6 +17195,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.3.6': {} + '@pnpm/deps.graph-sequencer@1100.0.1': {} '@radix-ui/primitive@1.1.5': {} @@ -16158,7 +17654,7 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.15 - '@rspack/dev-server@1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': + '@rspack/dev-server@1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) '@types/bonjour': 3.5.13 @@ -16187,7 +17683,7 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -16238,6 +17734,14 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@sigstore/bundle@4.0.0': dependencies: '@sigstore/protobuf-specs': 0.5.1 @@ -16274,6 +17778,14 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@15.4.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@spartan-ng/brain@0.0.1-alpha.720(469bb1258e2d2005fc9db5b694bb62ca)': dependencies: '@angular/cdk': 22.0.0(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) @@ -16302,19 +17814,19 @@ snapshots: optionalDependencies: luxon: 3.7.2 - '@spartan-ng/cli@0.0.1-alpha.715(4e6bc275d935a53228757a3a51cd4725)': + '@spartan-ng/cli@0.0.1-alpha.715(48dc84f132864fbe8ba5d03532c73655)': dependencies: '@angular/core': 22.0.1(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2) - '@nx/angular': 22.7.5(d73274cdbc24cc3e41d341fd28ee74eb) - '@nx/devkit': 22.7.5(nx@22.7.5(debug@4.4.3)) - '@nx/js': 22.7.5(@babel/traverse@7.29.7)(nx@22.7.5(debug@4.4.3)) - '@nx/workspace': 22.7.5 + '@nx/angular': 22.7.5(7e5e6e6f8b6f70e6f73da22ef644ae2a) + '@nx/devkit': 22.7.5(nx@22.7.5(@swc/core@1.16.2)) + '@nx/js': 22.7.5(@babel/traverse@7.29.7)(@swc/core@1.16.2)(nx@22.7.5(@swc/core@1.16.2)) + '@nx/workspace': 22.7.5(@swc/core@1.16.2) '@phenomnomnominal/tsquery': 6.2.0(typescript@6.0.3) '@schematics/angular': 21.2.14(chokidar@5.0.0) enquirer: 2.3.6 jsonc-eslint-parser: 2.4.2 node-html-parser: 7.1.0 - nx: 22.7.5(debug@4.4.3) + nx: 22.7.5(@swc/core@1.16.2)(debug@4.4.3) picocolors: 1.1.1 postcss: 8.5.15 postcss-selector-parser: 7.1.4 @@ -16381,10 +17893,10 @@ snapshots: axe-core: 4.12.1 storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@storybook/addon-docs@10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/addon-docs@10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.7) - '@storybook/csf-plugin': 10.4.5(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + '@storybook/csf-plugin': 10.4.5(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@storybook/react-dom-shim': 10.4.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) react: 19.2.7 @@ -16419,10 +17931,10 @@ snapshots: - vite - webpack - '@storybook/angular@10.4.5(0daad29ddd75a3df4c455e2bdc466bda)': + '@storybook/angular@10.4.5(577b43059978df1a5cdc2c5e6ad93bbf)': dependencies: '@angular-devkit/architect': 0.2200.3(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.2.15(f8ab6f975eee03eee4b3abc630c8c697) + '@angular-devkit/build-angular': 21.2.15(92540745d3bac060cf41dcb5e1f5dfad) '@angular-devkit/core': 22.0.3(chokidar@5.0.0) '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': 22.0.2 @@ -16430,7 +17942,7 @@ snapshots: '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-browser-dynamic': 21.2.17(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)(zone.js@0.16.2))) - '@storybook/builder-webpack5': 10.4.5(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) + '@storybook/builder-webpack5': 10.4.5(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) '@storybook/global': 5.0.0 rxjs: 7.8.2 storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -16438,7 +17950,7 @@ snapshots: ts-dedent: 2.3.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 6.0.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: '@angular/cli': 22.0.2(@types/node@24.13.2)(chokidar@5.0.0) zone.js: 0.16.2 @@ -16469,22 +17981,22 @@ snapshots: - rollup - webpack - '@storybook/builder-webpack5@10.4.5(@rspack/core@1.6.8(@swc/helpers@0.5.15))(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)': + '@storybook/builder-webpack5@10.4.5(@rspack/core@1.6.8(@swc/helpers@0.5.15))(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)': dependencies: '@storybook/core-webpack': 10.4.5(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 - css-loader: 7.1.4(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + css-loader: 7.1.4(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) magic-string: 0.30.21 storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - style-loader: 4.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + style-loader: 4.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) ts-dedent: 2.3.0 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - webpack-dev-middleware: 6.1.3(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack-dev-middleware: 6.1.3(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -16510,7 +18022,7 @@ snapshots: storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ts-dedent: 2.3.0 - '@storybook/csf-plugin@10.4.5(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/csf-plugin@10.4.5(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.99.0)(terser@5.46.0)(yaml@2.9.0))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) unplugin: 2.3.11 @@ -16518,7 +18030,7 @@ snapshots: esbuild: 0.28.1 rollup: 4.62.0 vite: 7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.6)(lightningcss@1.32.0)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.46.0)(yaml@2.9.0) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) '@storybook/csf-plugin@10.4.5(esbuild@0.28.1)(rollup@4.62.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.6)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.107.2(esbuild@0.28.1))': dependencies: @@ -16586,10 +18098,112 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.15': + '@storybook/test-runner@0.24.4(@swc/helpers@0.5.15)(@types/node@24.13.2)(babel-plugin-macros@3.1.0)(storybook@10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': dependencies: - tslib: 2.8.1 - + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + '@jest/types': 30.4.1 + '@swc/core': 1.16.2(@swc/helpers@0.5.15) + '@swc/jest': 0.2.39(@swc/core@1.16.2) + expect-playwright: 0.8.0 + jest: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) + jest-circus: 30.5.2(babel-plugin-macros@3.1.0) + jest-environment-node: 30.5.2 + jest-junit: 16.0.0 + jest-process-manager: 0.4.0 + jest-runner: 30.5.2 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 3.0.1(jest@30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0)) + nyc: 15.1.0 + playwright: 1.63.0 + playwright-core: 1.61.0 + rimraf: 3.0.2 + storybook: 10.4.5(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + uuid: 8.3.2 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - babel-plugin-macros + - debug + - esbuild-register + - node-notifier + - supports-color + - ts-node + + '@swc/core-darwin-arm64@1.16.2': + optional: true + + '@swc/core-darwin-x64@1.16.2': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.16.2': + optional: true + + '@swc/core-linux-arm64-gnu@1.16.2': + optional: true + + '@swc/core-linux-arm64-musl@1.16.2': + optional: true + + '@swc/core-linux-ppc64-gnu@1.16.2': + optional: true + + '@swc/core-linux-s390x-gnu@1.16.2': + optional: true + + '@swc/core-linux-x64-gnu@1.16.2': + optional: true + + '@swc/core-linux-x64-musl@1.16.2': + optional: true + + '@swc/core-win32-arm64-msvc@1.16.2': + optional: true + + '@swc/core-win32-ia32-msvc@1.16.2': + optional: true + + '@swc/core-win32-x64-msvc@1.16.2': + optional: true + + '@swc/core@1.16.2(@swc/helpers@0.5.15)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.28 + optionalDependencies: + '@swc/core-darwin-arm64': 1.16.2 + '@swc/core-darwin-x64': 1.16.2 + '@swc/core-linux-arm-gnueabihf': 1.16.2 + '@swc/core-linux-arm64-gnu': 1.16.2 + '@swc/core-linux-arm64-musl': 1.16.2 + '@swc/core-linux-ppc64-gnu': 1.16.2 + '@swc/core-linux-s390x-gnu': 1.16.2 + '@swc/core-linux-x64-gnu': 1.16.2 + '@swc/core-linux-x64-musl': 1.16.2 + '@swc/core-win32-arm64-msvc': 1.16.2 + '@swc/core-win32-ia32-msvc': 1.16.2 + '@swc/core-win32-x64-msvc': 1.16.2 + '@swc/helpers': 0.5.15 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/jest@0.2.39(@swc/core@1.16.2)': + dependencies: + '@jest/create-cache-key-function': 30.5.1 + '@swc/core': 1.16.2(@swc/helpers@0.5.15) + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + + '@swc/types@0.1.28': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/cli@4.3.1': dependencies: '@parcel/watcher': 2.5.1 @@ -16870,6 +18484,8 @@ snapshots: '@types/json5@0.0.29': {} + '@types/junit-report-builder@3.0.2': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -16935,10 +18551,16 @@ snapshots: dependencies: '@types/node': 24.13.2 + '@types/stack-utils@2.0.3': {} + '@types/unist@3.0.3': {} '@types/validate-npm-package-name@4.0.2': {} + '@types/wait-on@5.3.4': + dependencies: + '@types/node': 24.13.2 + '@types/ws@8.18.1': dependencies: '@types/node': 24.13.2 @@ -17401,6 +19023,11 @@ snapshots: agent-base@9.0.0: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -17462,6 +19089,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -17472,6 +19103,10 @@ snapshots: ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -17485,6 +19120,18 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-hidden@1.2.6: @@ -17618,6 +19265,20 @@ snapshots: axe-core@4.12.1: {} + axe-html-reporter@2.2.11(axe-core@4.12.1): + dependencies: + axe-core: 4.12.1 + mustache: 4.2.0 + + axe-playwright@2.2.2(playwright@1.63.0): + dependencies: + '@types/junit-report-builder': 3.0.2 + axe-core: 4.12.1 + axe-html-reporter: 2.2.11(axe-core@4.12.1) + junit-report-builder: 5.1.2 + picocolors: 1.1.1 + playwright: 1.63.0 + axios@1.16.0(debug@4.4.3): dependencies: follow-redirects: 1.16.0(debug@4.4.3) @@ -17628,18 +19289,31 @@ snapshots: axobject-query@4.1.0: {} - babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + babel-jest@30.5.2(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@jest/transform': 30.5.2 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 8.0.0 + babel-preset-jest: 30.5.0(@babel/core@7.29.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: '@babel/core': 7.29.0 find-up: 5.0.0 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - babel-loader@9.2.1(@babel/core@7.29.7)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + babel-loader@9.2.1(@babel/core@7.29.7)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@babel/core': 7.29.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) babel-plugin-const-enum@1.2.0(@babel/core@7.29.7): dependencies: @@ -17650,6 +19324,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-istanbul@8.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.29.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-instrument: 6.0.3 + test-exclude: 7.0.2 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.5.0: + dependencies: + '@types/babel__core': 7.20.5 + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.29.7 @@ -17727,6 +19415,31 @@ snapshots: optionalDependencies: '@babel/traverse': 7.29.7 + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + + babel-preset-jest@30.5.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jest-hoist: 30.5.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -17844,6 +19557,10 @@ snapshots: node-releases: 2.0.47 update-browserslist-db: 1.2.3(browserslist@4.28.2) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-from@1.1.2: {} buffer@5.7.1: @@ -17879,6 +19596,13 @@ snapshots: p-map: 7.0.4 ssri: 13.0.1 + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -17903,6 +19627,10 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-api@3.0.0: dependencies: browserslist: 4.28.2 @@ -17926,6 +19654,12 @@ snapshots: chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -17935,12 +19669,16 @@ snapshots: change-case@5.4.4: {} + char-regex@1.0.2: {} + character-entities@2.0.2: {} chardet@2.1.1: {} check-error@2.1.3: {} + check-more-types@2.24.0: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -17971,6 +19709,8 @@ snapshots: cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.2.1: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -17979,6 +19719,8 @@ snapshots: dependencies: source-map: 0.6.1 + clean-stack@2.2.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -18002,6 +19744,12 @@ snapshots: client-only@0.0.1: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -18036,12 +19784,22 @@ snapshots: - '@types/react' - '@types/react-dom' + co@4.6.0: {} + code-block-writer@13.0.3: {} + collect-v8-coverage@1.0.3: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} colorette@2.0.20: {} @@ -18065,10 +19823,14 @@ snapshots: commander@2.20.3: {} + commander@3.0.2: {} + commander@8.3.0: {} common-path-prefix@3.0.0: {} + commondir@1.0.1: {} + compare-versions@6.1.1: {} component-emitter@2.0.0: {} @@ -18125,23 +19887,23 @@ snapshots: dependencies: is-what: 4.1.16 - copy-webpack-plugin@14.0.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + copy-webpack-plugin@14.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.17 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - copy-webpack-plugin@14.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + copy-webpack-plugin@14.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.17 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) core-js-compat@3.49.0: dependencies: @@ -18196,7 +19958,7 @@ snapshots: dependencies: postcss: 8.5.15 - css-loader@6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + css-loader@6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 @@ -18208,9 +19970,9 @@ snapshots: semver: 7.8.4 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - css-loader@7.1.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + css-loader@7.1.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 @@ -18222,9 +19984,9 @@ snapshots: semver: 7.8.4 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - css-loader@7.1.4(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + css-loader@7.1.4(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 @@ -18236,9 +19998,9 @@ snapshots: semver: 7.8.4 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.1)(lightningcss@1.32.0)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.1)(lightningcss@1.32.0)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 7.1.9(postcss@8.5.15) @@ -18246,7 +20008,7 @@ snapshots: postcss: 8.5.15 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: esbuild: 0.28.1 lightningcss: 1.32.0 @@ -18343,6 +20105,11 @@ snapshots: csstype@3.2.3: {} + cwd@0.10.0: + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + damerau-levenshtein@1.0.8: {} data-uri-to-buffer@4.0.1: {} @@ -18386,6 +20153,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decimal.js@10.6.0: {} decode-named-character-reference@1.3.0: @@ -18409,6 +20178,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -18445,6 +20218,8 @@ snapshots: detect-libc@2.1.2: {} + detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} detect-node@2.1.0: {} @@ -18459,6 +20234,10 @@ snapshots: diff@8.0.4: {} + diffable-html@4.1.0: + dependencies: + htmlparser2: 3.10.1 + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -18479,6 +20258,11 @@ snapshots: dependencies: utila: 0.4.0 + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -18491,8 +20275,14 @@ snapshots: domhandler: 5.0.3 entities: 4.5.0 + domelementtype@1.3.1: {} + domelementtype@2.3.0: {} + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + domhandler@4.3.1: dependencies: domelementtype: 2.3.0 @@ -18501,6 +20291,11 @@ snapshots: dependencies: domelementtype: 2.3.0 + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 @@ -18567,6 +20362,8 @@ snapshots: embla-carousel@8.6.0: {} + emittery@0.13.1: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -18606,6 +20403,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@1.1.2: {} + entities@2.2.0: {} entities@4.5.0: {} @@ -18751,6 +20550,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-error@4.1.1: {} + esbuild-wasm@0.27.3: {} esbuild@0.27.3: @@ -18846,6 +20647,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -19167,12 +20970,31 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + exit-x@0.2.2: {} + + exit@0.1.2: {} + + expand-tilde@1.2.2: + dependencies: + os-homedir: 1.0.2 + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 + expect-playwright@0.8.0: {} + expect-type@1.4.0: {} + expect@30.5.2: + dependencies: + '@jest/expect-utils': 30.5.2 + '@jest/get-type': 30.5.0 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-util: 30.5.1 + exponential-backoff@3.1.3: {} express-rate-limit@8.5.2(express@5.2.1): @@ -19295,6 +21117,10 @@ snapshots: dependencies: websocket-driver: 0.7.5 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -19343,6 +21169,12 @@ snapshots: transitivePeerDependencies: - supports-color + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 @@ -19353,16 +21185,36 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 8.0.0 + find-file-up@0.1.3: + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + find-file-up@2.0.1: dependencies: resolve-dir: 1.0.1 + find-pkg@0.1.2: + dependencies: + find-file-up: 0.1.3 + find-pkg@2.0.0: dependencies: find-file-up: 2.0.1 + find-process@1.4.11: + dependencies: + chalk: 4.1.2 + commander: 12.1.0 + loglevel: 1.9.2 + find-up-simple@1.0.1: {} + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -19394,12 +21246,17 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@babel/code-frame': 7.29.7 chalk: 4.1.2 @@ -19414,7 +21271,7 @@ snapshots: semver: 7.8.4 tapable: 2.3.3 typescript: 6.0.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) form-data@4.0.5: dependencies: @@ -19436,8 +21293,12 @@ snapshots: fresh@2.0.0: {} + fromentries@1.3.2: {} + fs-constants@1.0.0: {} + fs-exists-sync@0.1.0: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -19456,6 +21317,8 @@ snapshots: fs-monkey@1.1.0: {} + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -19502,6 +21365,8 @@ snapshots: get-own-enumerable-keys@1.0.0: {} + get-package-type@0.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -19553,12 +21418,33 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-modules@0.2.3: + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 + global-prefix@0.1.5: + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 @@ -19584,6 +21470,8 @@ snapshots: has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -19600,6 +21488,11 @@ snapshots: dependencies: has-symbols: 1.1.0 + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -19645,6 +21538,8 @@ snapshots: html-entities@2.6.0: {} + html-escaper@2.0.2: {} + html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 @@ -19655,7 +21550,7 @@ snapshots: relateurl: 0.2.7 terser: 5.48.0 - html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -19664,7 +21559,7 @@ snapshots: tapable: 2.3.3 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) htmlparser2@10.1.0: dependencies: @@ -19673,6 +21568,15 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -19830,12 +21734,22 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} indent-string@4.0.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.3: {} inherits@2.0.4: {} @@ -19940,6 +21854,8 @@ snapshots: dependencies: get-east-asian-width: 1.6.0 + is-generator-fn@2.1.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -20030,6 +21946,8 @@ snapshots: dependencies: which-typed-array: 1.1.22 + is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} is-unicode-supported@1.3.0: {} @@ -20051,6 +21969,8 @@ snapshots: is-what@4.1.16: {} + is-windows@0.2.0: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -20071,40 +21991,374 @@ snapshots: isexe@4.0.0: {} - isobject@3.0.1: {} + isobject@3.0.1: {} + + isomorphic-ws@5.0.0(ws@8.21.0): + dependencies: + ws: 8.21.0 + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + + istanbul-lib-instrument@4.0.3: + dependencies: + '@babel/core': 7.29.7 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-coverage: 3.2.2 + semver: 7.8.4 + transitivePeerDependencies: + - supports-color + + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.6 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@30.5.1: + dependencies: + execa: 5.1.1 + jest-util: 30.5.1 + p-limit: 3.1.0 + + jest-circus@30.5.2(babel-plugin-macros@3.1.0): + dependencies: + '@jest/environment': 30.5.2 + '@jest/expect': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.2(babel-plugin-macros@3.1.0) + is-generator-fn: 2.1.0 + jest-each: 30.5.2 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-runtime: 30.5.2 + jest-snapshot: 30.5.2 + jest-util: 30.5.1 + p-limit: 3.1.0 + pretty-format: 30.5.1 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 30.5.2(babel-plugin-macros@3.1.0) + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) + jest-util: 30.5.1 + jest-validate: 30.5.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0): + dependencies: + '@babel/core': 7.29.7 + '@jest/get-type': 30.5.0 + '@jest/pattern': 30.5.0 + '@jest/test-sequencer': 30.5.2 + '@jest/types': 30.5.1 + babel-jest: 30.5.2(@babel/core@7.29.7) + chalk: 4.1.2 + ci-info: 4.4.0 + deepmerge: 4.3.1 + glob: 13.0.6 + graceful-fs: 4.2.11 + jest-circus: 30.5.2(babel-plugin-macros@3.1.0) + jest-docblock: 30.5.0 + jest-environment-node: 30.5.2 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-runner: 30.5.2 + jest-util: 30.5.1 + jest-validate: 30.5.1 + parse-json: 5.2.0 + pretty-format: 30.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.13.2 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.5.2: + dependencies: + '@jest/diff-sequences': 30.5.0 + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + pretty-format: 30.5.1 + + jest-docblock@30.5.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.5.2: + dependencies: + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 + chalk: 4.1.2 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + pretty-format: 30.5.1 + + jest-environment-node@30.5.2: + dependencies: + '@jest/environment': 30.5.2 + '@jest/fake-timers': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + jest-mock: 30.5.2 + jest-util: 30.5.1 + jest-validate: 30.5.1 + + jest-haste-map@30.5.1: + dependencies: + '@jest/types': 30.5.1 + '@parcel/watcher': 2.6.0 + '@types/node': 24.13.2 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + fdir: 6.5.0(picomatch@4.0.4) + graceful-fs: 4.2.11 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + jest-worker: 30.5.1 + picomatch: 4.0.4 + + jest-junit@16.0.0: + dependencies: + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 + + jest-leak-detector@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + pretty-format: 30.5.1 + + jest-matcher-utils@30.5.2: + dependencies: + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + jest-diff: 30.5.2 + pretty-format: 30.5.1 + + jest-message-util@30.5.1: + dependencies: + '@babel/code-frame': 7.29.7 + '@jest/types': 30.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.5.1 + picomatch: 4.0.4 + pretty-format: 30.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.5.2: + dependencies: + '@jest/expect-utils': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + jest-util: 30.5.1 + + jest-process-manager@0.4.0: + dependencies: + '@types/wait-on': 5.3.4 + chalk: 4.1.2 + cwd: 0.10.0 + exit: 0.1.2 + find-process: 1.4.11 + prompts: 2.4.2 + signal-exit: 3.0.7 + spawnd: 5.0.0 + tree-kill: 1.2.2 + wait-on: 7.2.0 + transitivePeerDependencies: + - debug + - supports-color + + jest-regex-util@30.4.0: {} + + jest-regex-util@30.5.0: {} - isomorphic-ws@5.0.0(ws@8.21.0): + jest-resolve-dependencies@30.5.2: dependencies: - ws: 8.21.0 + jest-regex-util: 30.5.0 + jest-snapshot: 30.5.2 + transitivePeerDependencies: + - supports-color - istanbul-lib-coverage@3.2.2: {} + jest-resolve@30.5.1: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + slash: 3.0.0 + unrs-resolver: 1.12.2 - istanbul-lib-instrument@6.0.3: + jest-runner@30.5.2: dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@istanbuljs/schema': 0.1.6 - istanbul-lib-coverage: 3.2.2 - semver: 7.8.4 + '@jest/console': 30.5.2 + '@jest/environment': 30.5.2 + '@jest/source-map': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.2 + jest-haste-map: 30.5.1 + jest-leak-detector: 30.5.1 + jest-message-util: 30.5.1 + jest-resolve: 30.5.1 + jest-runtime: 30.5.2 + jest-util: 30.5.1 + jest-watcher: 30.5.2 + jest-worker: 30.5.1 + p-limit: 3.1.0 transitivePeerDependencies: - supports-color - iterator.prototype@1.1.5: + jest-runtime@30.5.2: dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 + '@jest/environment': 30.5.2 + '@jest/fake-timers': 30.5.2 + '@jest/globals': 30.5.2 + '@jest/source-map': 30.5.2 + '@jest/test-result': 30.5.2 + '@jest/transform': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + chalk: 4.1.2 + cjs-module-lexer: 2.2.1 + collect-v8-coverage: 1.0.3 + es-module-lexer: 2.1.0 + glob: 13.0.6 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.2 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-snapshot: 30.5.2 + jest-util: 30.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color - jackspeak@3.4.3: + jest-serializer-html@7.1.0: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + diffable-html: 4.1.0 - jest-regex-util@30.4.0: {} + jest-snapshot@30.5.2: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 + '@jest/expect-utils': 30.5.2 + '@jest/get-type': 30.5.0 + '@jest/snapshot-utils': 30.5.1 + '@jest/transform': 30.5.2 + '@jest/types': 30.5.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + chalk: 4.1.2 + expect: 30.5.2 + graceful-fs: 4.2.11 + jest-diff: 30.5.2 + jest-matcher-utils: 30.5.2 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + pretty-format: 30.5.1 + semver: 7.8.4 + synckit: 0.11.13 + transitivePeerDependencies: + - supports-color jest-util@30.4.1: dependencies: @@ -20115,6 +22369,46 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.4 + jest-util@30.5.1: + dependencies: + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.4 + + jest-validate@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.5.1 + + jest-watch-typeahead@3.0.1(jest@30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0)): + dependencies: + ansi-escapes: 7.3.0 + chalk: 5.6.2 + jest: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) + jest-regex-util: 30.4.0 + jest-watcher: 30.5.2 + slash: 5.1.0 + string-length: 6.0.0 + strip-ansi: 7.2.0 + + jest-watcher@30.5.2: + dependencies: + '@jest/test-result': 30.5.2 + '@jest/types': 30.5.1 + '@types/node': 24.13.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.5.1 + string-length: 4.0.2 + jest-worker@27.5.1: dependencies: '@types/node': 24.13.2 @@ -20129,16 +22423,60 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@30.5.1: + dependencies: + '@types/node': 24.13.2 + '@ungap/structured-clone': 1.3.1 + jest-util: 30.5.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 30.5.2(babel-plugin-macros@3.1.0) + '@jest/types': 30.5.1 + import-local: 3.2.0 + jest-cli: 30.5.2(@types/node@24.13.2)(babel-plugin-macros@3.1.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + jiti@2.4.2: {} jiti@2.7.0: {} jju@1.4.0: {} + joi@17.13.8: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + joi@18.2.9: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.7 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.1.0 + jose@6.2.3: {} js-tokens@4.0.0: {} + js-yaml@3.15.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.2.0: dependencies: argparse: 2.0.1 @@ -20227,6 +22565,12 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 + junit-report-builder@5.1.2: + dependencies: + lodash: 4.18.1 + make-dir: 3.1.0 + xmlbuilder: 15.1.1 + karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 @@ -20258,26 +22602,28 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.4 - less-loader@12.3.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.4.2)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + lazy-ass@2.0.3: {} + + less-loader@12.3.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.4.2)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: less: 4.4.2 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.5.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.5.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: less: 4.5.1 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.6.6)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.15))(less@4.6.6)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: less: 4.6.6 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) less@4.4.2: dependencies: @@ -20320,22 +22666,24 @@ snapshots: needle: 3.5.0 source-map: 0.6.1 + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + license-webpack-plugin@4.0.2(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: webpack-sources: 3.5.0 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - license-webpack-plugin@4.0.2(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + license-webpack-plugin@4.0.2(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: webpack-sources: 3.5.0 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) lightningcss-android-arm64@1.32.0: optional: true @@ -20470,6 +22818,10 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -20480,6 +22832,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.flattendeep@4.4.0: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -20511,6 +22865,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + loglevel@1.9.2: {} + long-timeout@0.1.1: {} longest-streak@3.1.0: {} @@ -20551,6 +22907,14 @@ snapshots: semver: 5.7.2 optional: true + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.4 + make-dir@5.1.0: optional: true @@ -20932,16 +23296,16 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + mini-css-extract-plugin@2.10.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - mini-css-extract-plugin@2.4.7(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + mini-css-extract-plugin@2.4.7(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: schema-utils: 4.3.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) minimalistic-assert@1.0.1: {} @@ -20993,6 +23357,8 @@ snapshots: dependencies: minipass: 7.1.3 + mkdirp@1.0.4: {} + mlly@1.8.2: dependencies: acorn: 8.17.0 @@ -21030,6 +23396,8 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 + mustache@4.2.0: {} + mute-stream@2.0.0: {} mute-stream@3.0.0: {} @@ -21179,6 +23547,12 @@ snapshots: css-select: 5.2.2 he: 1.2.0 + node-int64@0.4.0: {} + + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.1.0 + node-releases@2.0.47: {} node-schedule@2.1.1: @@ -21248,7 +23622,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nx@22.7.5(debug@4.4.3): + nx@22.7.5(@swc/core@1.16.2)(debug@4.4.3): dependencies: '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 @@ -21371,9 +23745,42 @@ snapshots: '@nx/nx-linux-x64-musl': 22.7.5 '@nx/nx-win32-arm64-msvc': 22.7.5 '@nx/nx-win32-x64-msvc': 22.7.5 + '@swc/core': 1.16.2(@swc/helpers@0.5.15) transitivePeerDependencies: - debug + nyc@15.1.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.1.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -21531,6 +23938,8 @@ snapshots: ordered-binary@1.6.1: optional: true + os-homedir@1.0.2: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -21584,6 +23993,10 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -21592,6 +24005,10 @@ snapshots: dependencies: yocto-queue: 1.2.2 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -21600,6 +24017,10 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.4: {} p-retry@6.2.1: @@ -21608,6 +24029,15 @@ snapshots: is-network-error: 1.3.2 retry: 0.13.1 + p-try@2.2.0: {} + + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + package-json-from-dist@1.0.1: {} package-manager-detector@1.8.0: {} @@ -21708,6 +24138,8 @@ snapshots: path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -21752,6 +24184,8 @@ snapshots: pify@4.0.1: optional: true + pirates@4.0.7: {} + piscina@5.1.4: optionalDependencies: '@napi-rs/nice': 1.1.1 @@ -21762,6 +24196,10 @@ snapshots: pkce-challenge@5.0.1: {} + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 @@ -21791,6 +24229,14 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 + playwright-core@1.61.0: {} + + playwright-core@1.63.0: {} + + playwright@1.63.0: + dependencies: + playwright-core: 1.63.0 + portfinder@1.0.38: dependencies: async: 3.2.6 @@ -21844,7 +24290,7 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.12 - postcss-loader@8.2.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.12)(typescript@6.0.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + postcss-loader@8.2.0(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.12)(typescript@6.0.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: cosmiconfig: 9.0.2(typescript@6.0.3) jiti: 2.7.0 @@ -21852,11 +24298,11 @@ snapshots: semver: 7.8.4 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) transitivePeerDependencies: - typescript - postcss-loader@8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + postcss-loader@8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.15))(postcss@8.5.15)(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: cosmiconfig: 9.0.2(typescript@6.0.3) jiti: 2.7.0 @@ -21864,7 +24310,7 @@ snapshots: semver: 7.8.4 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - typescript @@ -22051,6 +24497,13 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@30.5.1: + dependencies: + '@jest/react-is-18': react-is@18.3.1 + '@jest/react-is-19': react-is@19.3.0 + '@jest/schemas': 30.5.0 + ansi-styles: 5.2.0 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -22059,6 +24512,10 @@ snapshots: process-nextick-args@2.0.1: {} + process-on-spawn@1.1.0: + dependencies: + fromentries: 1.3.2 + process@0.11.10: {} prompts@2.4.2: @@ -22086,6 +24543,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@7.0.1: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -22152,6 +24611,10 @@ snapshots: react-is@17.0.2: {} + react-is@18.3.1: {} + + react-is@19.3.0: {} + react-refresh@0.18.0: {} react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7): @@ -22276,6 +24739,10 @@ snapshots: relateurl@0.2.7: {} + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -22314,10 +24781,21 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + requires-port@1.0.0: {} reselect@5.2.0: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-dir@0.1.1: + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 @@ -22325,6 +24803,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve-url-loader@5.0.0: @@ -22375,6 +24855,10 @@ snapshots: rfdc@1.4.1: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + rolldown@1.0.0-rc.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.113.0 @@ -22629,23 +25113,23 @@ snapshots: sass-embedded-win32-arm64: 1.100.0 sass-embedded-win32-x64: 1.100.0 - sass-loader@16.0.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + sass-loader@16.0.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) sass: 1.97.3 sass-embedded: 1.100.0 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - sass-loader@16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + sass-loader@16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.15))(sass-embedded@1.100.0)(sass@1.101.0)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.15) sass: 1.101.0 sass-embedded: 1.100.0 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) sass@1.100.0: dependencies: @@ -22803,6 +25287,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -22961,6 +25447,10 @@ snapshots: slash@2.0.0: {} + slash@3.0.0: {} + + slash@5.1.0: {} + slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -23003,17 +25493,17 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + source-map-loader@5.0.0(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) - source-map-loader@5.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + source-map-loader@5.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) source-map-support@0.5.19: dependencies: @@ -23029,6 +25519,24 @@ snapshots: source-map@0.7.6: {} + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + spawnd@5.0.0: + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + wait-port: 0.2.14 + transitivePeerDependencies: + - supports-color + spdx-exceptions@2.5.0: {} spdx-expression-parse@4.0.0: @@ -23059,16 +25567,34 @@ snapshots: transitivePeerDependencies: - supports-color + sprintf-js@1.0.3: {} + ssri@13.0.1: dependencies: minipass: 7.1.3 stable-hash@0.0.5: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} stackframe@1.3.4: {} + start-server-and-test@3.0.11: + dependencies: + arg: 5.0.2 + check-more-types: 2.24.0 + debug: 4.4.3 + execa: 5.1.1 + lazy-ass: 2.0.3 + tree-kill: 1.2.2 + wait-on: 9.0.10(debug@4.4.3) + transitivePeerDependencies: + - supports-color + statuses@1.5.0: {} statuses@2.0.2: {} @@ -23117,6 +25643,15 @@ snapshots: string-argv@0.3.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-length@6.0.0: + dependencies: + strip-ansi: 7.2.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -23215,6 +25750,8 @@ snapshots: strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-final-newline@2.0.0: {} strip-final-newline@4.0.0: {} @@ -23245,13 +25782,13 @@ snapshots: transitivePeerDependencies: - tslib - style-loader@3.3.4(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + style-loader@3.3.4(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - style-loader@4.0.0(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + style-loader@4.0.0(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) styled-jsx@5.1.6(react@19.2.7): dependencies: @@ -23264,6 +25801,10 @@ snapshots: postcss: 8.5.15 postcss-selector-parser: 7.1.4 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -23292,6 +25833,10 @@ snapshots: sync-message-port@1.2.0: {} + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 + tailwind-merge@3.6.0: {} tailwindcss@4.3.1: {} @@ -23318,26 +25863,28 @@ snapshots: telejson@8.0.0: {} - terser-webpack-plugin@5.6.1(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + terser-webpack-plugin@5.6.1(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) optionalDependencies: + '@swc/core': 1.16.2(@swc/helpers@0.5.15) esbuild: 0.27.3 lightningcss: 1.32.0 postcss: 8.5.12 - terser-webpack-plugin@5.6.1(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + terser-webpack-plugin@5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: + '@swc/core': 1.16.2(@swc/helpers@0.5.15) esbuild: 0.28.1 lightningcss: 1.32.0 postcss: 8.5.15 @@ -23367,6 +25914,18 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 7.2.3 + minimatch: 3.1.5 + + test-exclude@7.0.2: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 10.5.0 + minimatch: 10.2.5 + thingies@2.6.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -23454,7 +26013,7 @@ snapshots: ts-dedent@2.3.0: {} - ts-loader@9.6.0(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + ts-loader@9.6.0(loader-utils@2.0.4)(typescript@6.0.3)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.24.0 @@ -23462,7 +26021,7 @@ snapshots: semver: 7.8.4 source-map: 0.7.6 typescript: 6.0.3 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: loader-utils: 2.0.4 @@ -23527,6 +26086,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + type-fest@0.8.1: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -23573,6 +26138,10 @@ snapshots: typed-assert@1.0.9: {} + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typescript-eslint@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.4(jiti@2.7.0))(typescript@6.0.3) @@ -23772,6 +26341,12 @@ snapshots: uuid@8.3.2: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + validate-npm-package-name@7.0.2: {} varint@6.0.0: {} @@ -23959,6 +26534,34 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + wait-on@7.2.0: + dependencies: + axios: 1.16.0(debug@4.4.3) + joi: 17.13.8 + lodash: 4.18.1 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + + wait-on@9.0.10(debug@4.4.3): + dependencies: + axios: 1.16.0(debug@4.4.3) + joi: 18.2.9 + lodash: 4.18.1 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + + wait-port@0.2.14: + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -23985,7 +26588,7 @@ snapshots: webidl-conversions@8.0.1: {} - webpack-dev-middleware@6.1.3(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + webpack-dev-middleware@6.1.3(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -23993,9 +26596,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: colorette: 2.0.20 memfs: 4.57.7(tslib@2.8.1) @@ -24004,11 +26607,11 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) transitivePeerDependencies: - tslib - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: colorette: 2.0.20 memfs: 4.57.7(tslib@2.8.1) @@ -24017,11 +26620,11 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - tslib - webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -24049,10 +26652,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) ws: 8.21.0 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - bufferutil - debug @@ -24060,7 +26663,7 @@ snapshots: - tslib - utf-8-validate - webpack-dev-server@5.2.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + webpack-dev-server@5.2.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -24088,10 +26691,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) ws: 8.21.0 optionalDependencies: - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - bufferutil - debug @@ -24121,23 +26724,23 @@ snapshots: webpack-sources@3.5.0: {} - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)): dependencies: typed-assert: 1.0.9 - webpack: 5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12) optionalDependencies: - html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: typed-assert: 1.0.9 - webpack: 5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) + webpack: 5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15) optionalDependencies: - html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + html-webpack-plugin: 5.6.7(@rspack/core@1.6.8(@swc/helpers@0.5.15))(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) webpack-virtual-modules@0.6.2: {} - webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12): + webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -24161,7 +26764,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.16.2)(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) watchpack: 2.5.2 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -24178,7 +26781,7 @@ snapshots: - postcss - uglify-js - webpack@5.107.2(esbuild@0.28.1): + webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 @@ -24200,7 +26803,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.107.2(esbuild@0.28.1)) + terser-webpack-plugin: 5.6.1(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(@swc/core@1.16.2)(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) watchpack: 2.5.2 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -24216,9 +26819,8 @@ snapshots: - lightningcss - postcss - uglify-js - optional: true - webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15): + webpack@5.107.2(esbuild@0.28.1): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 @@ -24240,7 +26842,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.2(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.15)) + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.107.2(esbuild@0.28.1)) watchpack: 2.5.2 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -24256,6 +26858,7 @@ snapshots: - lightningcss - postcss - uglify-js + optional: true websocket-driver@0.7.5: dependencies: @@ -24315,6 +26918,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 @@ -24382,6 +26987,18 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@8.21.0: {} wsl-utils@0.1.0: @@ -24395,8 +27012,14 @@ snapshots: xml-name-validator@5.0.0: {} + xml@1.0.1: {} + + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -24409,10 +27032,29 @@ snapshots: yaml@2.9.0: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e4d60d24..e2a1910e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -29,4 +29,5 @@ allowBuilds: '@bundled-es-modules/glob': false style-dictionary: true sharp: true + '@swc/core': true unrs-resolver: true From 70f5703b03e56bc8d845fc5f381de8bc835dd6c2 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:02:52 +0200 Subject: [PATCH 03/58] Add test:a11y workspace script, Turbo task, and CI step --- .github/workflows/ci.yml | 21 +++++++++++++ .gitignore | 65 +++++++++++++++++++++------------------- package.json | 1 + turbo.json | 5 ++++ 4 files changed, 61 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8916b24..98574271 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,3 +42,24 @@ jobs: - run: pnpm lint - run: pnpm build + + # Automated WCAG 2.1 AA sweep of every Storybook story (all themes/modes), + # via @storybook/test-runner + axe. Reports cover ~30-50% of WCAG; the + # residual manual checklist lives in docs/accessibility/. + - name: Install Playwright Chromium + run: pnpm --filter @surfnet/react exec playwright install --with-deps chromium + + # Report-only for now: surfaces violations without blocking PRs while the + # backlog is triaged. Flip to blocking by removing `continue-on-error` + # once findings are at zero. + - name: Accessibility audit (WCAG 2.1 AA) + continue-on-error: true + run: pnpm test:a11y + + - name: Upload a11y reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: a11y-reports + path: packages/*/a11y-report/** + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore index 7b3d4fd9..4216d24a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1,34 @@ -# dependencies -node_modules -.pnpm-store - -# secrets -.env -.env.local - -# build output -dist -storybook-static - -# turbo -.turbo - -# angular -.angular - -# logs -*.log -npm-debug.log* -pnpm-debug.log* - -# editor / os -.DS_Store -.vs -!.vscode -.vscode/* -!.vscode/extensions.json -!.vscode/mcp.json -.idea +# dependencies +node_modules +.pnpm-store + +# secrets +.env +.env.local + +# build output +dist +storybook-static + +# accessibility audit reports (generated by `pnpm test:a11y`) +a11y-report + +# turbo +.turbo + +# angular +.angular + +# logs +*.log +npm-debug.log* +pnpm-debug.log* + +# editor / os +.DS_Store +.vs +\!.vscode +.vscode/* +\!.vscode/extensions.json +\!.vscode/mcp.json +.idea diff --git a/package.json b/package.json index fd61c374..19c46e8b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "storybook:angular": "pnpm --filter @surfnet/curve-angular storybook", "build-storybook": "turbo run build-storybook", "lint": "turbo run lint", + "test:a11y": "turbo run test:a11y:ci", "format": "prettier --write \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "format:check": "prettier --check \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "changeset": "changeset", diff --git a/turbo.json b/turbo.json index 6dee2fe1..fb88f410 100644 --- a/turbo.json +++ b/turbo.json @@ -20,6 +20,11 @@ }, "lint": { "dependsOn": ["^build"] + }, + "test:a11y:ci": { + "dependsOn": ["build-storybook"], + "cache": false, + "outputs": ["a11y-report/**"] } } } From 045859a3ca2861121b823601a751ce5e8479f435 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:16:29 +0200 Subject: [PATCH 04/58] Reorder storybook:serve before test:a11y in package scripts --- .github/workflows/ci.yml | 19 ++++ .gitignore | 2 + package.json | 1 + packages/angular/package.json | 2 +- packages/react/package.json | 3 +- pnpm-lock.yaml | 3 + scripts/a11y-comment.ts | 194 ++++++++++++++++++++++++++++++++++ 7 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 scripts/a11y-comment.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 98574271..c9d42106 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,10 @@ concurrency: jobs: checks: runs-on: ubuntu-latest + # Default token is read-only here; the a11y step needs to write a PR comment. + permissions: + contents: read + pull-requests: write steps: - uses: actions/checkout@v4 @@ -63,3 +67,18 @@ jobs: name: a11y-reports path: packages/*/a11y-report/** if-no-files-found: ignore + + # Summarise the JSON reports (component / theme / mode / rule) into Markdown, + # written to the run summary and a file for the PR comment below. + - name: Summarise a11y findings + if: always() + run: pnpm a11y:comment a11y-comment.md + + # Post (or update in place) one sticky PR comment with the findings, so + # reviewers see them inline instead of opening the artifact. + - name: Comment a11y findings on PR + if: always() && github.event_name == 'pull_request' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: a11y-audit + path: a11y-comment.md diff --git a/.gitignore b/.gitignore index 4216d24a..a84d8e7c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ storybook-static # accessibility audit reports (generated by `pnpm test:a11y`) a11y-report +# generated PR-comment markdown (`pnpm a11y:comment`) +a11y-comment.md # turbo .turbo diff --git a/package.json b/package.json index 19c46e8b..1e11cfaf 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "build-storybook": "turbo run build-storybook", "lint": "turbo run lint", "test:a11y": "turbo run test:a11y:ci", + "a11y:comment": "jiti scripts/a11y-comment.ts", "format": "prettier --write \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "format:check": "prettier --check \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "changeset": "changeset", diff --git a/packages/angular/package.json b/packages/angular/package.json index 74283877..f65721bc 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -27,8 +27,8 @@ "storybook": "ng run angular:storybook", "build-storybook": "ng run angular:build-storybook", "fix-helm-imports": "jiti scripts/rewrite-helm-imports.ts", - "test:a11y": "test-storybook --url http://127.0.0.1:6007 --testTimeout 180000", "storybook:serve": "http-server storybook-static -p 6007 --silent", + "test:a11y": "test-storybook --url http://127.0.0.1:6007 --testTimeout 180000", "test:a11y:ci": "start-server-and-test storybook:serve http://127.0.0.1:6007 test:a11y" }, "peerDependencies": { diff --git a/packages/react/package.json b/packages/react/package.json index 707cb505..16885e5a 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -29,8 +29,8 @@ "lint": "tsc --noEmit", "storybook": "storybook dev -p 6006 --no-open", "build-storybook": "storybook build", - "test:a11y": "test-storybook --testTimeout 180000", "storybook:serve": "http-server storybook-static -p 6006 --silent", + "test:a11y": "test-storybook --testTimeout 180000", "test:a11y:ci": "start-server-and-test storybook:serve http://127.0.0.1:6006 test:a11y" }, "peerDependencies": { @@ -72,6 +72,7 @@ "@vitejs/plugin-react": "6.0.2", "axe-playwright": "2.2.2", "http-server": "14.1.1", + "playwright": "1.61.0", "react": "19.2.7", "react-dom": "19.2.7", "remark-gfm": "^4.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91de095b..04b07dc2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,6 +420,9 @@ importers: http-server: specifier: 14.1.1 version: 14.1.1 + playwright: + specifier: 1.61.0 + version: 1.61.0 react: specifier: 19.2.7 version: 19.2.7 diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts new file mode 100644 index 00000000..1d61f549 --- /dev/null +++ b/scripts/a11y-comment.ts @@ -0,0 +1,194 @@ +/** + * Turns the per-story a11y JSON reports (packages//a11y-report/*.json, + * written by runStoryA11yAudit) into a Markdown summary for a sticky PR comment + * and the GitHub Actions job summary. No runtime deps — runs via jiti. + * + * Usage: pnpm a11y:comment [outFile=a11y-comment.md] + * + * Always exits 0 — reporting must never fail the build. + */ +import { appendFileSync, existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +// Subset of the axe-core result shape we read out of each report file. +interface AxeNode { + target?: string[]; + failureSummary?: string; +} +interface AxeViolation { + id: string; + help?: string; + nodes?: AxeNode[]; +} +interface ComboResult { + theme: string; + mode: string; + violations?: AxeViolation[]; +} +interface StoryReport { + title?: string; + name?: string; + results?: ComboResult[]; +} +interface Row { + framework: string; + story: string; + theme: string; + mode: string; + rule: string; + example: string; +} + +const OUT = process.argv[2] ?? 'a11y-comment.md'; +const PACKAGES_DIR = resolve('packages'); + +// axe rule id -> WCAG success criterion, for the rules our audit can surface. +// Falls back to the bare rule id for anything not listed. +const WCAG_REF: Record = { + 'color-contrast': '1.4.3', + 'color-contrast-enhanced': '1.4.6', + 'link-name': '4.1.2', + 'button-name': '4.1.2', + 'aria-required-attr': '4.1.2', + 'aria-valid-attr-value': '4.1.2', + 'image-alt': '1.1.1', + 'duplicate-id-aria': '4.1.1', +}; + +// Pull a human-readable example ("`#fff` on `#84cc16` · ratio 1.89") out of an +// axe node's failureSummary for contrast failures; else fall back to help text. +function exampleFor(violation: AxeViolation): string { + const summary = violation.nodes?.[0]?.failureSummary ?? ''; + const m = summary.match( + /contrast of ([\d.]+) \(foreground color: (#[0-9a-f]+), background color: (#[0-9a-f]+)/i, + ); + if (m) return `\`${m[2]}\` on \`${m[3]}\` · ratio ${m[1]}`; + return violation.help ?? ''; +} + +// Collect every failing (framework, story, theme, mode, rule) row. +const rows: Row[] = []; +const frameworks = existsSync(PACKAGES_DIR) + ? readdirSync(PACKAGES_DIR, { withFileTypes: true }).filter((d) => d.isDirectory()) + : []; + +let storiesAudited = 0; +let totalCombos = 0; +const frameworksWithReports = new Set(); + +for (const fw of frameworks) { + const reportDir = resolve(PACKAGES_DIR, fw.name, 'a11y-report'); + if (!existsSync(reportDir)) continue; + frameworksWithReports.add(fw.name); + + for (const file of readdirSync(reportDir).filter((f) => f.endsWith('.json'))) { + let report: StoryReport; + try { + report = JSON.parse(readFileSync(resolve(reportDir, file), 'utf8')) as StoryReport; + } catch { + continue; + } + storiesAudited += 1; + totalCombos += report.results?.length ?? 0; + const story = `${(report.title ?? '').replace(/^Components\//, '')} / ${report.name ?? ''}`; + + for (const combo of report.results ?? []) { + for (const v of combo.violations ?? []) { + const ref = WCAG_REF[v.id] ? `${v.id} (${WCAG_REF[v.id]})` : v.id; + rows.push({ + framework: `@surfnet/${fw.name}`, + story, + theme: combo.theme, + mode: combo.mode, + rule: ref, + example: exampleFor(v), + }); + } + } + } +} + +// Build the Markdown. +const HEADER = '## ♿ Accessibility audit — WCAG 2.1 AA'; +const FOOTER = + '_Automated axe covers ~30–50% of WCAG 2.1 AA. Keyboard, screen-reader and ' + + 'reflow checks still need a manual pass — see [`docs/accessibility`](docs/accessibility/automation-feasibility.md). ' + + 'Full per-story JSON is in the run’s `a11y-reports` artifact._'; + +function buildBody(): string { + if (frameworksWithReports.size === 0) { + return [ + HEADER, + '', + 'No a11y report was produced (the audit step may not have run).', + '', + FOOTER, + ].join('\n'); + } + + if (rows.length === 0) { + const fwList = [...frameworksWithReports].map((f) => `\`@surfnet/${f}\``).join(', '); + return [ + HEADER, + '', + `✅ **No violations** across ${storiesAudited} stories / ${totalCombos} theme·mode ` + + `combinations in ${fwList}.`, + '', + FOOTER, + ].join('\n'); + } + + const byFramework = new Map(); + for (const r of rows) { + const bucket = byFramework.get(r.framework) ?? []; + bucket.push(r); + byFramework.set(r.framework, bucket); + } + + const MAX_ROWS = 100; + const sections: string[] = []; + for (const [framework, frameworkRows] of [...byFramework].sort(([a], [b]) => + a.localeCompare(b), + )) { + frameworkRows.sort( + (a, b) => + a.story.localeCompare(b.story) || + a.theme.localeCompare(b.theme) || + a.mode.localeCompare(b.mode), + ); + const shown = frameworkRows.slice(0, MAX_ROWS); + const table = [ + '| Component / story | Theme | Mode | Rule (WCAG) | Detail |', + '| --- | --- | --- | --- | --- |', + ...shown.map( + (r) => `| ${r.story} | \`${r.theme}\` | \`${r.mode}\` | ${r.rule} | ${r.example} |`, + ), + ]; + if (frameworkRows.length > MAX_ROWS) { + table.push('', `_…and ${frameworkRows.length - MAX_ROWS} more (see the artifact)._`); + } + sections.push( + `
${framework} — ${frameworkRows.length} failing combination(s)\n\n${table.join('\n')}\n\n
`, + ); + } + + return [ + HEADER, + '', + `⚠️ **${rows.length} failing theme·mode combination(s)** across ${storiesAudited} stories ` + + `/ ${totalCombos} audited combinations. Report-only — does not block merge.`, + '', + ...sections, + '', + FOOTER, + ].join('\n'); +} + +const body = buildBody(); +writeFileSync(OUT, body + '\n', 'utf8'); + +// Mirror into the Actions run summary when available (also covers push builds). +const stepSummary = process.env.GITHUB_STEP_SUMMARY; +if (stepSummary) appendFileSync(stepSummary, body + '\n'); + +console.log(`a11y comment written to ${OUT} (${rows.length} failing rows)`); From 5b62ef6fe5a29b76f45ebb5a3b874d39b563b313 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:25:17 +0200 Subject: [PATCH 05/58] Write a11y reports to git-ignored .a11y-report dir Dot-prefix the per-package report output (and the generated PR-comment markdown) so a single .gitignore entry covers them and they read as generated/hidden. Updates the audit default dir, the comment script's read/write paths, turbo outputs, the CI artifact/comment paths, and .gitignore. --- .github/workflows/ci.yml | 8 +++---- .gitignore | 6 ++--- packages/storybook-config/src/a11y-audit.ts | 5 +++-- scripts/a11y-comment.ts | 25 ++++++++++++++------- turbo.json | 2 +- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9d42106..45996b0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,14 +65,14 @@ jobs: uses: actions/upload-artifact@v4 with: name: a11y-reports - path: packages/*/a11y-report/** + path: packages/*/.a11y-report/** if-no-files-found: ignore # Summarise the JSON reports (component / theme / mode / rule) into Markdown, - # written to the run summary and a file for the PR comment below. + # written to the run summary and .a11y-report/comment.md for the PR comment. - name: Summarise a11y findings if: always() - run: pnpm a11y:comment a11y-comment.md + run: pnpm a11y:comment # Post (or update in place) one sticky PR comment with the findings, so # reviewers see them inline instead of opening the artifact. @@ -81,4 +81,4 @@ jobs: uses: marocchino/sticky-pull-request-comment@v2 with: header: a11y-audit - path: a11y-comment.md + path: .a11y-report/comment.md diff --git a/.gitignore b/.gitignore index a84d8e7c..6c0effbe 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,8 @@ node_modules dist storybook-static -# accessibility audit reports (generated by `pnpm test:a11y`) -a11y-report -# generated PR-comment markdown (`pnpm a11y:comment`) -a11y-comment.md +# accessibility audit reports + generated PR comment (`pnpm test:a11y`, `pnpm a11y:comment`) +.a11y-report # turbo .turbo diff --git a/packages/storybook-config/src/a11y-audit.ts b/packages/storybook-config/src/a11y-audit.ts index 8b67d5c7..0561b037 100644 --- a/packages/storybook-config/src/a11y-audit.ts +++ b/packages/storybook-config/src/a11y-audit.ts @@ -32,8 +32,9 @@ const MODES = ['light', 'dark'] as const; type Mode = (typeof MODES)[number]; // Report directory (one JSON file per story keeps concurrent test-runner -// workers from clobbering a shared file). Override with A11Y_REPORT_DIR. -const REPORT_DIR = resolve(process.env.A11Y_REPORT_DIR ?? 'a11y-report'); +// workers from clobbering a shared file). Dot-prefixed and git-ignored. +// Override with A11Y_REPORT_DIR. +const REPORT_DIR = resolve(process.env.A11Y_REPORT_DIR ?? '.a11y-report'); // Reflect a theme/mode onto exactly like the `themeSwitcher` decorator, // so axe sees the same resolved CSS variables a real user would. diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 1d61f549..f0394237 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -1,14 +1,21 @@ /** - * Turns the per-story a11y JSON reports (packages//a11y-report/*.json, + * Turns the per-story a11y JSON reports (packages//.a11y-report/*.json, * written by runStoryA11yAudit) into a Markdown summary for a sticky PR comment * and the GitHub Actions job summary. No runtime deps — runs via jiti. * - * Usage: pnpm a11y:comment [outFile=a11y-comment.md] + * Usage: pnpm a11y:comment [outFile=.a11y-report/comment.md] * * Always exits 0 — reporting must never fail the build. */ -import { appendFileSync, existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'; -import { resolve } from 'node:path'; +import { + appendFileSync, + existsSync, + mkdirSync, + readdirSync, + readFileSync, + writeFileSync, +} from 'node:fs'; +import { dirname, resolve } from 'node:path'; // Subset of the axe-core result shape we read out of each report file. interface AxeNode { @@ -39,8 +46,9 @@ interface Row { example: string; } -const OUT = process.argv[2] ?? 'a11y-comment.md'; +const OUT = process.argv[2] ?? '.a11y-report/comment.md'; const PACKAGES_DIR = resolve('packages'); +const REPORT_DIR_NAME = '.a11y-report'; // axe rule id -> WCAG success criterion, for the rules our audit can surface. // Falls back to the bare rule id for anything not listed. @@ -77,7 +85,7 @@ let totalCombos = 0; const frameworksWithReports = new Set(); for (const fw of frameworks) { - const reportDir = resolve(PACKAGES_DIR, fw.name, 'a11y-report'); + const reportDir = resolve(PACKAGES_DIR, fw.name, REPORT_DIR_NAME); if (!existsSync(reportDir)) continue; frameworksWithReports.add(fw.name); @@ -112,8 +120,8 @@ for (const fw of frameworks) { const HEADER = '## ♿ Accessibility audit — WCAG 2.1 AA'; const FOOTER = '_Automated axe covers ~30–50% of WCAG 2.1 AA. Keyboard, screen-reader and ' + - 'reflow checks still need a manual pass — see [`docs/accessibility`](docs/accessibility/automation-feasibility.md). ' + - 'Full per-story JSON is in the run’s `a11y-reports` artifact._'; + 'reflow checks still need a manual pass. Full per-story JSON is in the run’s ' + + '`a11y-reports` artifact._'; function buildBody(): string { if (frameworksWithReports.size === 0) { @@ -185,6 +193,7 @@ function buildBody(): string { } const body = buildBody(); +mkdirSync(dirname(resolve(OUT)), { recursive: true }); writeFileSync(OUT, body + '\n', 'utf8'); // Mirror into the Actions run summary when available (also covers push builds). diff --git a/turbo.json b/turbo.json index fb88f410..413a2fed 100644 --- a/turbo.json +++ b/turbo.json @@ -24,7 +24,7 @@ "test:a11y:ci": { "dependsOn": ["build-storybook"], "cache": false, - "outputs": ["a11y-report/**"] + "outputs": [".a11y-report/**"] } } } From 00341a770e96d924843695601c22e992ce18cfd6 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:30:11 +0200 Subject: [PATCH 06/58] =?UTF-8?q?Group=20a11y=20comment=20by=20component?= =?UTF-8?q?=20=E2=86=92=20theme=20=E2=86=92=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the flat findings table with a nested layout (component heading, theme bullet, mode sub-bullet with the contrast detail) so reviewers can scan by component and drill into a theme. Cap body length under GitHub's comment size limit. --- scripts/a11y-comment.ts | 72 ++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index f0394237..2fb3ab5c 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -146,37 +146,49 @@ function buildBody(): string { ].join('\n'); } - const byFramework = new Map(); + // Nest the flat rows as framework -> component/story -> theme -> modes, so the + // comment is scannable: collapse a whole framework, skim components, drill into + // a theme to see which modes fail and why. + interface Leaf { + mode: string; + rule: string; + example: string; + } + const tree = new Map>>(); for (const r of rows) { - const bucket = byFramework.get(r.framework) ?? []; - bucket.push(r); - byFramework.set(r.framework, bucket); + const stories = tree.get(r.framework) ?? new Map>(); + const themes = stories.get(r.story) ?? new Map(); + const leaves = themes.get(r.theme) ?? []; + leaves.push({ mode: r.mode, rule: r.rule, example: r.example }); + themes.set(r.theme, leaves); + stories.set(r.story, themes); + tree.set(r.framework, stories); } - const MAX_ROWS = 100; + const countLeaves = (themes: Map) => + [...themes.values()].reduce((n, leaves) => n + leaves.length, 0); + // Light before dark, then anything else alphabetically. + const modeRank = (m: string) => (m === 'light' ? 0 : m === 'dark' ? 1 : 2); + const sections: string[] = []; - for (const [framework, frameworkRows] of [...byFramework].sort(([a], [b]) => - a.localeCompare(b), - )) { - frameworkRows.sort( - (a, b) => - a.story.localeCompare(b.story) || - a.theme.localeCompare(b.theme) || - a.mode.localeCompare(b.mode), - ); - const shown = frameworkRows.slice(0, MAX_ROWS); - const table = [ - '| Component / story | Theme | Mode | Rule (WCAG) | Detail |', - '| --- | --- | --- | --- | --- |', - ...shown.map( - (r) => `| ${r.story} | \`${r.theme}\` | \`${r.mode}\` | ${r.rule} | ${r.example} |`, - ), - ]; - if (frameworkRows.length > MAX_ROWS) { - table.push('', `_…and ${frameworkRows.length - MAX_ROWS} more (see the artifact)._`); + for (const [framework, stories] of [...tree].sort(([a], [b]) => a.localeCompare(b))) { + const fwCount = [...stories.values()].reduce((n, themes) => n + countLeaves(themes), 0); + + const blocks: string[] = []; + for (const [story, themes] of [...stories].sort(([a], [b]) => a.localeCompare(b))) { + const lines = [`#### ${story} — ${countLeaves(themes)} combination(s)`]; + for (const [theme, leaves] of [...themes].sort(([a], [b]) => a.localeCompare(b))) { + lines.push(`- \`${theme}\``); + for (const leaf of [...leaves].sort((a, b) => modeRank(a.mode) - modeRank(b.mode))) { + const detail = leaf.example ? `${leaf.example} — ` : ''; + lines.push(` - \`${leaf.mode}\` — ${detail}${leaf.rule}`); + } + } + blocks.push(lines.join('\n')); } + sections.push( - `
${framework} — ${frameworkRows.length} failing combination(s)\n\n${table.join('\n')}\n\n
`, + `
${framework} — ${fwCount} failing combination(s)\n\n${blocks.join('\n\n')}\n\n
`, ); } @@ -192,7 +204,15 @@ function buildBody(): string { ].join('\n'); } -const body = buildBody(); +// Keep under GitHub's 65 536-char comment limit (leave headroom for the marker). +const MAX_LEN = 64000; +const full = buildBody(); +const body = + full.length > MAX_LEN + ? full.slice(0, MAX_LEN) + + '\n\n_…truncated; see the `a11y-reports` artifact for the full list._' + : full; + mkdirSync(dirname(resolve(OUT)), { recursive: true }); writeFileSync(OUT, body + '\n', 'utf8'); From 2b2d5114fcd7b58238d14d609ed760d3dab74382 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Tue, 23 Jun 2026 08:23:41 +0200 Subject: [PATCH 07/58] Split component and variation into h4/h5 in a11y comment Show the component (e.g. Button) as an h4 and each story variation (e.g. Variants, As Link) as an h5 beneath it, instead of merging them into one "Button / Variants" heading. Theme/mode nesting is unchanged. --- scripts/a11y-comment.ts | 58 ++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 2fb3ab5c..41688970 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -39,7 +39,8 @@ interface StoryReport { } interface Row { framework: string; - story: string; + component: string; + variation: string; theme: string; mode: string; rule: string; @@ -98,14 +99,17 @@ for (const fw of frameworks) { } storiesAudited += 1; totalCombos += report.results?.length ?? 0; - const story = `${(report.title ?? '').replace(/^Components\//, '')} / ${report.name ?? ''}`; + // title is "Components/Button" -> component "Button"; name is the story variation. + const component = (report.title ?? '').replace(/^Components\//, '') || '(untitled)'; + const variation = report.name ?? ''; for (const combo of report.results ?? []) { for (const v of combo.violations ?? []) { const ref = WCAG_REF[v.id] ? `${v.id} (${WCAG_REF[v.id]})` : v.id; rows.push({ framework: `@surfnet/${fw.name}`, - story, + component, + variation, theme: combo.theme, mode: combo.mode, rule: ref, @@ -146,42 +150,54 @@ function buildBody(): string { ].join('\n'); } - // Nest the flat rows as framework -> component/story -> theme -> modes, so the - // comment is scannable: collapse a whole framework, skim components, drill into - // a theme to see which modes fail and why. + // Nest the flat rows as framework -> component -> variation -> theme -> modes, + // so the comment is scannable: collapse a whole framework, skim components + // (h4) and their variations (h5), drill into a theme to see which modes fail. interface Leaf { mode: string; rule: string; example: string; } - const tree = new Map>>(); + type ThemeMap = Map; + type VariationMap = Map; + type ComponentMap = Map; + + const tree = new Map(); for (const r of rows) { - const stories = tree.get(r.framework) ?? new Map>(); - const themes = stories.get(r.story) ?? new Map(); + const components = tree.get(r.framework) ?? new Map(); + const variations = components.get(r.component) ?? new Map(); + const themes = variations.get(r.variation) ?? new Map(); const leaves = themes.get(r.theme) ?? []; leaves.push({ mode: r.mode, rule: r.rule, example: r.example }); themes.set(r.theme, leaves); - stories.set(r.story, themes); - tree.set(r.framework, stories); + variations.set(r.variation, themes); + components.set(r.component, variations); + tree.set(r.framework, components); } - const countLeaves = (themes: Map) => + const countThemes = (themes: ThemeMap) => [...themes.values()].reduce((n, leaves) => n + leaves.length, 0); + const countVariations = (variations: VariationMap) => + [...variations.values()].reduce((n, themes) => n + countThemes(themes), 0); // Light before dark, then anything else alphabetically. const modeRank = (m: string) => (m === 'light' ? 0 : m === 'dark' ? 1 : 2); + const byKey = ([a]: [string, unknown], [b]: [string, unknown]) => a.localeCompare(b); const sections: string[] = []; - for (const [framework, stories] of [...tree].sort(([a], [b]) => a.localeCompare(b))) { - const fwCount = [...stories.values()].reduce((n, themes) => n + countLeaves(themes), 0); + for (const [framework, components] of [...tree].sort(byKey)) { + const fwCount = [...components.values()].reduce((n, v) => n + countVariations(v), 0); const blocks: string[] = []; - for (const [story, themes] of [...stories].sort(([a], [b]) => a.localeCompare(b))) { - const lines = [`#### ${story} — ${countLeaves(themes)} combination(s)`]; - for (const [theme, leaves] of [...themes].sort(([a], [b]) => a.localeCompare(b))) { - lines.push(`- \`${theme}\``); - for (const leaf of [...leaves].sort((a, b) => modeRank(a.mode) - modeRank(b.mode))) { - const detail = leaf.example ? `${leaf.example} — ` : ''; - lines.push(` - \`${leaf.mode}\` — ${detail}${leaf.rule}`); + for (const [component, variations] of [...components].sort(byKey)) { + const lines = [`#### ${component} — ${countVariations(variations)} combination(s)`]; + for (const [variation, themes] of [...variations].sort(byKey)) { + lines.push('', `##### ${variation} — ${countThemes(themes)} combination(s)`); + for (const [theme, leaves] of [...themes].sort(byKey)) { + lines.push(`- \`${theme}\``); + for (const leaf of [...leaves].sort((a, b) => modeRank(a.mode) - modeRank(b.mode))) { + const detail = leaf.example ? `${leaf.example} — ` : ''; + lines.push(` - \`${leaf.mode}\` — ${detail}${leaf.rule}`); + } } } blocks.push(lines.join('\n')); From 208c3ff84aa2f968262e8db9ab4e563eb76018ea Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:07:31 +0200 Subject: [PATCH 08/58] Collapse theme-independent a11y findings to one per variation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only contrast rules (color-contrast, link-in-text-block) depend on the theme/mode, so report those per theme·mode as before. DOM-structural rules (missing alt, button/link name, ARIA, etc.) are identical across themes — collapse each to a single finding per story variation, flagged 'all themes/modes', instead of repeating it for every combination. --- scripts/a11y-comment.ts | 85 ++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 41688970..9fd41676 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -45,6 +45,7 @@ interface Row { mode: string; rule: string; example: string; + themeDependent: boolean; } const OUT = process.argv[2] ?? '.a11y-report/comment.md'; @@ -64,6 +65,15 @@ const WCAG_REF: Record = { 'duplicate-id-aria': '4.1.1', }; +// Axe rules whose outcome depends on resolved colors, i.e. the theme/mode. These +// are reported per theme·mode; every other (DOM-structural) rule is identical +// across themes, so it's collapsed to a single per-variation finding. +const THEME_DEPENDENT_RULES = new Set([ + 'color-contrast', + 'color-contrast-enhanced', + 'link-in-text-block', +]); + // Pull a human-readable example ("`#fff` on `#84cc16` · ratio 1.89") out of an // axe node's failureSummary for contrast failures; else fall back to help text. function exampleFor(violation: AxeViolation): string { @@ -114,6 +124,7 @@ for (const fw of frameworks) { mode: combo.mode, rule: ref, example: exampleFor(v), + themeDependent: THEME_DEPENDENT_RULES.has(v.id), }); } } @@ -150,49 +161,73 @@ function buildBody(): string { ].join('\n'); } - // Nest the flat rows as framework -> component -> variation -> theme -> modes, - // so the comment is scannable: collapse a whole framework, skim components - // (h4) and their variations (h5), drill into a theme to see which modes fail. + // Nest as framework -> component (h4) -> variation (h5). Each variation splits + // findings in two: `structural` (theme-independent rules, collapsed to one + // entry each) and `themed` (contrast rules, kept per theme -> mode). interface Leaf { mode: string; rule: string; example: string; } - type ThemeMap = Map; - type VariationMap = Map; + interface VariationData { + structural: Map; // rule -> short description (deduped) + themed: Map; // theme -> failing modes + } + type VariationMap = Map; type ComponentMap = Map; const tree = new Map(); for (const r of rows) { const components = tree.get(r.framework) ?? new Map(); - const variations = components.get(r.component) ?? new Map(); - const themes = variations.get(r.variation) ?? new Map(); - const leaves = themes.get(r.theme) ?? []; - leaves.push({ mode: r.mode, rule: r.rule, example: r.example }); - themes.set(r.theme, leaves); - variations.set(r.variation, themes); + const variations = components.get(r.component) ?? new Map(); + const data: VariationData = variations.get(r.variation) ?? { + structural: new Map(), + themed: new Map(), + }; + if (r.themeDependent) { + const leaves = data.themed.get(r.theme) ?? []; + leaves.push({ mode: r.mode, rule: r.rule, example: r.example }); + data.themed.set(r.theme, leaves); + } else { + // Same finding in every theme/mode — keep one entry per rule. + data.structural.set(r.rule, r.example); + } + variations.set(r.variation, data); components.set(r.component, variations); tree.set(r.framework, components); } - const countThemes = (themes: ThemeMap) => - [...themes.values()].reduce((n, leaves) => n + leaves.length, 0); - const countVariations = (variations: VariationMap) => - [...variations.values()].reduce((n, themes) => n + countThemes(themes), 0); + const themedCount = (d: VariationData) => + [...d.themed.values()].reduce((n, leaves) => n + leaves.length, 0); + const findingCount = (d: VariationData) => d.structural.size + themedCount(d); + const variationsCount = (vs: VariationMap) => + [...vs.values()].reduce((n, d) => n + findingCount(d), 0); // Light before dark, then anything else alphabetically. const modeRank = (m: string) => (m === 'light' ? 0 : m === 'dark' ? 1 : 2); const byKey = ([a]: [string, unknown], [b]: [string, unknown]) => a.localeCompare(b); + let structuralTotal = 0; + let themedTotal = 0; const sections: string[] = []; for (const [framework, components] of [...tree].sort(byKey)) { - const fwCount = [...components.values()].reduce((n, v) => n + countVariations(v), 0); + const fwCount = [...components.values()].reduce((n, vs) => n + variationsCount(vs), 0); const blocks: string[] = []; for (const [component, variations] of [...components].sort(byKey)) { - const lines = [`#### ${component} — ${countVariations(variations)} combination(s)`]; - for (const [variation, themes] of [...variations].sort(byKey)) { - lines.push('', `##### ${variation} — ${countThemes(themes)} combination(s)`); - for (const [theme, leaves] of [...themes].sort(byKey)) { + const lines = [`#### ${component} — ${variationsCount(variations)} finding(s)`]; + for (const [variation, data] of [...variations].sort(byKey)) { + lines.push('', `##### ${variation} — ${findingCount(data)} finding(s)`); + + // Theme-independent findings: one line each, flagged as such. + for (const [rule, desc] of [...data.structural].sort(byKey)) { + structuralTotal += 1; + const detail = desc ? `${desc} — ` : ''; + lines.push(`- ${detail}${rule} · _all themes/modes_`); + } + + // Contrast findings: grouped theme -> mode. + for (const [theme, leaves] of [...data.themed].sort(byKey)) { + themedTotal += leaves.length; lines.push(`- \`${theme}\``); for (const leaf of [...leaves].sort((a, b) => modeRank(a.mode) - modeRank(b.mode))) { const detail = leaf.example ? `${leaf.example} — ` : ''; @@ -204,15 +239,19 @@ function buildBody(): string { } sections.push( - `
${framework} — ${fwCount} failing combination(s)\n\n${blocks.join('\n\n')}\n\n
`, + `
${framework} — ${fwCount} finding(s)\n\n${blocks.join('\n\n')}\n\n
`, ); } + const breakdown = + `${themedTotal} contrast (per theme·mode), ${structuralTotal} theme-independent` + + ` · across ${storiesAudited} stories / ${totalCombos} audited combinations`; + return [ HEADER, '', - `⚠️ **${rows.length} failing theme·mode combination(s)** across ${storiesAudited} stories ` + - `/ ${totalCombos} audited combinations. Report-only — does not block merge.`, + `⚠️ **${structuralTotal + themedTotal} finding(s)** — ${breakdown}. ` + + `Report-only — does not block merge.`, '', ...sections, '', From 9d24ae7527c007f44fb9704d2712038c66990f05 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:16:49 +0200 Subject: [PATCH 09/58] Add link-in-text-block WCAG ref (1.4.1) to a11y comment --- scripts/a11y-comment.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 9fd41676..32922c7f 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -57,6 +57,7 @@ const REPORT_DIR_NAME = '.a11y-report'; const WCAG_REF: Record = { 'color-contrast': '1.4.3', 'color-contrast-enhanced': '1.4.6', + 'link-in-text-block': '1.4.1', 'link-name': '4.1.2', 'button-name': '4.1.2', 'aria-required-attr': '4.1.2', From 57ce4b408600376706aaf17742ba388d33e09761 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:03:41 +0200 Subject: [PATCH 10/58] Move playwright dep from react to storybook-config, scope CI install accordingly --- .github/workflows/ci.yml | 6 +++++- packages/react/package.json | 1 - packages/storybook-config/package.json | 1 + pnpm-lock.yaml | 6 +++--- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45996b0a..ea693ee1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,8 +50,12 @@ jobs: # Automated WCAG 2.1 AA sweep of every Storybook story (all themes/modes), # via @storybook/test-runner + axe. Reports cover ~30-50% of WCAG; the # residual manual checklist lives in docs/accessibility/. + # + # Install the Chromium binary the audit drives. Scoped to + # @surfnet/storybook-config — the package that owns the audit and pins + # `playwright` — so both framework runs share one machine-global browser. - name: Install Playwright Chromium - run: pnpm --filter @surfnet/react exec playwright install --with-deps chromium + run: pnpm --filter @surfnet/storybook-config exec playwright install --with-deps chromium # Report-only for now: surfaces violations without blocking PRs while the # backlog is triaged. Flip to blocking by removing `continue-on-error` diff --git a/packages/react/package.json b/packages/react/package.json index 16885e5a..a3a52f15 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -72,7 +72,6 @@ "@vitejs/plugin-react": "6.0.2", "axe-playwright": "2.2.2", "http-server": "14.1.1", - "playwright": "1.61.0", "react": "19.2.7", "react-dom": "19.2.7", "remark-gfm": "^4.0.1", diff --git a/packages/storybook-config/package.json b/packages/storybook-config/package.json index aa0edfcb..85045160 100644 --- a/packages/storybook-config/package.json +++ b/packages/storybook-config/package.json @@ -42,6 +42,7 @@ "@surfnet/curve-typescript-config": "workspace:*", "@types/react": "19.2.17", "axe-core": "4.12.1", + "playwright": "1.61.0", "playwright-core": "1.61.0", "react": "19.2.7", "storybook": "10.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04b07dc2..f041c2f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,9 +420,6 @@ importers: http-server: specifier: 14.1.1 version: 14.1.1 - playwright: - specifier: 1.61.0 - version: 1.61.0 react: specifier: 19.2.7 version: 19.2.7 @@ -487,6 +484,9 @@ importers: axe-core: specifier: 4.12.1 version: 4.12.1 + playwright: + specifier: 1.61.0 + version: 1.61.0 playwright-core: specifier: 1.61.0 version: 1.61.0 From 3aac4d810ee64ba67de6ee63d6e42a23c4362a82 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:17:49 +0200 Subject: [PATCH 11/58] Stabilise a11y audit and trim comments Disable CSS transitions/animations and await fonts before the axe sweep so contrast reads settled colors and correct large-text thresholds. Condense the verbose comments added across the a11y tooling. --- .github/workflows/ci.yml | 21 +++-------- .gitignore | 2 +- packages/angular/.storybook/test-runner.ts | 5 +-- packages/react/.storybook/test-runner.ts | 5 +-- packages/storybook-config/src/a11y-audit.ts | 41 ++++++++------------- packages/storybook-config/src/a11y.ts | 15 +++----- packages/storybook-config/src/index.ts | 3 +- scripts/a11y-comment.ts | 27 +++++--------- 8 files changed, 40 insertions(+), 79 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea693ee1..51e5de51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ concurrency: jobs: checks: runs-on: ubuntu-latest - # Default token is read-only here; the a11y step needs to write a PR comment. + # The a11y step writes a PR comment. permissions: contents: read pull-requests: write @@ -47,19 +47,12 @@ jobs: - run: pnpm build - # Automated WCAG 2.1 AA sweep of every Storybook story (all themes/modes), - # via @storybook/test-runner + axe. Reports cover ~30-50% of WCAG; the - # residual manual checklist lives in docs/accessibility/. - # - # Install the Chromium binary the audit drives. Scoped to - # @surfnet/storybook-config — the package that owns the audit and pins - # `playwright` — so both framework runs share one machine-global browser. + # Scoped to @surfnet/storybook-config, which pins playwright, so both + # framework runs share one browser. - name: Install Playwright Chromium run: pnpm --filter @surfnet/storybook-config exec playwright install --with-deps chromium - # Report-only for now: surfaces violations without blocking PRs while the - # backlog is triaged. Flip to blocking by removing `continue-on-error` - # once findings are at zero. + # Report-only for now; flip to blocking by removing `continue-on-error`. - name: Accessibility audit (WCAG 2.1 AA) continue-on-error: true run: pnpm test:a11y @@ -72,14 +65,12 @@ jobs: path: packages/*/.a11y-report/** if-no-files-found: ignore - # Summarise the JSON reports (component / theme / mode / rule) into Markdown, - # written to the run summary and .a11y-report/comment.md for the PR comment. + # Summarise the JSON reports into .a11y-report/comment.md. - name: Summarise a11y findings if: always() run: pnpm a11y:comment - # Post (or update in place) one sticky PR comment with the findings, so - # reviewers see them inline instead of opening the artifact. + # One sticky comment, updated in place. - name: Comment a11y findings on PR if: always() && github.event_name == 'pull_request' uses: marocchino/sticky-pull-request-comment@v2 diff --git a/.gitignore b/.gitignore index 6c0effbe..cf88cd62 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ node_modules dist storybook-static -# accessibility audit reports + generated PR comment (`pnpm test:a11y`, `pnpm a11y:comment`) +# accessibility audit reports .a11y-report # turbo diff --git a/packages/angular/.storybook/test-runner.ts b/packages/angular/.storybook/test-runner.ts index c1759591..239188c8 100644 --- a/packages/angular/.storybook/test-runner.ts +++ b/packages/angular/.storybook/test-runner.ts @@ -2,10 +2,7 @@ import type { TestRunnerConfig } from '@storybook/test-runner'; import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; -// Thin delegate to the shared audit so React and Angular stay in lockstep -// (same convention as the shared preview parameters and decorators). The audit -// sweeps every story against WCAG 2.1 AA across all themes/modes from -// `@surfnet/tokens` and writes a per-story JSON report. +// Delegate to the shared audit so React and Angular stay in lockstep. const config: TestRunnerConfig = { async postVisit(page, context) { await runStoryA11yAudit(page, context); diff --git a/packages/react/.storybook/test-runner.ts b/packages/react/.storybook/test-runner.ts index c1759591..239188c8 100644 --- a/packages/react/.storybook/test-runner.ts +++ b/packages/react/.storybook/test-runner.ts @@ -2,10 +2,7 @@ import type { TestRunnerConfig } from '@storybook/test-runner'; import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; -// Thin delegate to the shared audit so React and Angular stay in lockstep -// (same convention as the shared preview parameters and decorators). The audit -// sweeps every story against WCAG 2.1 AA across all themes/modes from -// `@surfnet/tokens` and writes a per-story JSON report. +// Delegate to the shared audit so React and Angular stay in lockstep. const config: TestRunnerConfig = { async postVisit(page, context) { await runStoryA11yAudit(page, context); diff --git a/packages/storybook-config/src/a11y-audit.ts b/packages/storybook-config/src/a11y-audit.ts index 0561b037..69f934fd 100644 --- a/packages/storybook-config/src/a11y-audit.ts +++ b/packages/storybook-config/src/a11y-audit.ts @@ -1,7 +1,5 @@ -// Node-only WCAG 2.1 AA audit, run by `@storybook/test-runner`'s `postVisit` -// hook. Kept OUT of the browser preview bundle (it imports Node built-ins, -// Playwright and the test-runner) — consumers reach it via the package's -// `./test-runner` subpath, never the main entry. +// WCAG 2.1 AA audit run by the test-runner's `postVisit` hook. Reached via the +// package's `./test-runner` subpath, never the main entry. import { mkdirSync, writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; @@ -15,29 +13,18 @@ import { WCAG_21_AA_TAGS } from './a11y.js'; import { THEME_NAMES } from './themes.js'; const RUN_ONLY: RunOptions['runOnly'] = { type: 'tag', values: WCAG_21_AA_TAGS }; - -// Only compute violations (skip building passes/incomplete/inapplicable node -// lists) — the sweep runs axe once per theme/mode, so this keeps each run fast. const RESULT_TYPES: RunOptions['resultTypes'] = ['violations']; -// Scope axe to the rendered story rather than the whole Storybook chrome. Colors -// still resolve up the real DOM tree, so contrast checks stay accurate. +// Scope axe to the rendered story, not the Storybook chrome. const STORY_ROOT = '#storybook-root'; -// Every theme/mode combination the tokens package ships, so the audit exercises -// the full cascade (`@surfnet/tokens` keys colors on `dark` + `theme-` -// classes on ). Contrast-sensitive rules differ per theme, so each combo -// is a distinct audit surface. const MODES = ['light', 'dark'] as const; type Mode = (typeof MODES)[number]; -// Report directory (one JSON file per story keeps concurrent test-runner -// workers from clobbering a shared file). Dot-prefixed and git-ignored. -// Override with A11Y_REPORT_DIR. +// One file per story so concurrent workers don't clobber a shared report. const REPORT_DIR = resolve(process.env.A11Y_REPORT_DIR ?? '.a11y-report'); -// Reflect a theme/mode onto exactly like the `themeSwitcher` decorator, -// so axe sees the same resolved CSS variables a real user would. +// Reflect theme/mode onto like the `themeSwitcher` decorator does. async function applyTheme(page: Page, theme: string, mode: Mode): Promise { await page.evaluate( ({ theme, mode }) => { @@ -59,10 +46,8 @@ interface ComboResult { } /** - * `postVisit` hook for `@storybook/test-runner`: audits the just-rendered story - * against WCAG 2.1 AA with axe, once per theme/mode combination from - * `@surfnet/tokens`. Writes a per-story JSON report and throws if any - * combination has violations (so `test:a11y` exits non-zero). + * Audits the rendered story against WCAG 2.1 AA, once per theme/mode from + * `@surfnet/tokens`. Writes a per-story JSON report and throws on violations. */ export async function runStoryA11yAudit(page: Page, context: TestContext): Promise { const storyContext = await getStoryContext(page, context); @@ -70,13 +55,17 @@ export async function runStoryA11yAudit(page: Page, context: TestContext): Promi | { disable?: boolean; options?: RunOptions } | undefined; - // Respect per-story opt-out (`parameters: { a11y: { disable: true } }`). if (a11y?.disable) return; await injectAxe(page); - // Story-level axe options win over the WCAG 2.1 AA default, so a story can - // waive a specific rule while staying scoped to the same level. + // Stop color transitions/animations mid-flight so contrast reads the settled + // value, and wait for fonts so large-text thresholds use real metrics. + await page.addStyleTag({ + content: '*,*::before,*::after{transition:none!important;animation:none!important}', + }); + await page.evaluate(() => document.fonts?.ready); + const runOptions: RunOptions = { resultTypes: RESULT_TYPES, ...(a11y?.options ?? { runOnly: RUN_ONLY }), @@ -91,7 +80,7 @@ export async function runStoryA11yAudit(page: Page, context: TestContext): Promi } } - // Restore the story's default look for any later hooks / screenshots. + // Restore the default look for later hooks. await applyTheme(page, 'default', 'light'); const total = results.reduce((n, r) => n + r.violations.length, 0); diff --git a/packages/storybook-config/src/a11y.ts b/packages/storybook-config/src/a11y.ts index a73e5b3c..679ad64a 100644 --- a/packages/storybook-config/src/a11y.ts +++ b/packages/storybook-config/src/a11y.ts @@ -1,16 +1,11 @@ -// Browser-safe a11y config. This module is imported into each framework's -// `.storybook/preview.ts`, so it must NOT pull in Node built-ins, Playwright or -// the test-runner — those live in `./a11y-audit.ts`, behind the package's -// `./test-runner` subpath, which only the test-runner configs import. +// Browser-safe a11y config, imported into each framework's preview. Keep it free +// of Node/Playwright deps; those live in `./a11y-audit.ts`. -// WCAG 2.1 Level AA, expressed as the axe-core tag set. Both the interactive -// addon-a11y panel and the headless test-runner are scoped to exactly these -// tags, so a finding in one is a finding in the other. +// WCAG 2.1 AA as axe-core tags. Scopes both the addon panel and the test-runner. export const WCAG_21_AA_TAGS: string[] = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']; -// Preview-level parameters. Merge into each framework's preview `parameters` -// (next to `sharedParameters`). `options.runOnly` scopes the manual panel to -// WCAG 2.1 AA; `test: 'error'` makes the addon treat violations as failures. +// Merge into each preview's `parameters`. `test: 'error'` fails the addon on +// violations. export const a11yParameters = { a11y: { options: { runOnly: { type: 'tag', values: WCAG_21_AA_TAGS } }, diff --git a/packages/storybook-config/src/index.ts b/packages/storybook-config/src/index.ts index f3b2fad3..38a4d271 100644 --- a/packages/storybook-config/src/index.ts +++ b/packages/storybook-config/src/index.ts @@ -12,8 +12,7 @@ export type { TokenKind, TypeScaleEntry, } from './tokens.js'; -// Browser-safe a11y config only. The Node-only audit (`runStoryA11yAudit`) -// lives behind the `./test-runner` subpath so it never reaches a preview bundle. +// Browser-safe a11y config; the audit lives behind the `./test-runner` subpath. export { WCAG_21_AA_TAGS, a11yParameters } from './a11y.js'; // Shared preview parameters so every framework's Storybook renders stories the diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 32922c7f..5404bfd6 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -1,11 +1,8 @@ /** - * Turns the per-story a11y JSON reports (packages//.a11y-report/*.json, - * written by runStoryA11yAudit) into a Markdown summary for a sticky PR comment - * and the GitHub Actions job summary. No runtime deps — runs via jiti. + * Turns the per-story a11y JSON reports into a Markdown summary for the PR + * comment and the Actions job summary. Always exits 0. * * Usage: pnpm a11y:comment [outFile=.a11y-report/comment.md] - * - * Always exits 0 — reporting must never fail the build. */ import { appendFileSync, @@ -52,8 +49,7 @@ const OUT = process.argv[2] ?? '.a11y-report/comment.md'; const PACKAGES_DIR = resolve('packages'); const REPORT_DIR_NAME = '.a11y-report'; -// axe rule id -> WCAG success criterion, for the rules our audit can surface. -// Falls back to the bare rule id for anything not listed. +// axe rule id -> WCAG success criterion. Unlisted rules show the bare id. const WCAG_REF: Record = { 'color-contrast': '1.4.3', 'color-contrast-enhanced': '1.4.6', @@ -66,17 +62,15 @@ const WCAG_REF: Record = { 'duplicate-id-aria': '4.1.1', }; -// Axe rules whose outcome depends on resolved colors, i.e. the theme/mode. These -// are reported per theme·mode; every other (DOM-structural) rule is identical -// across themes, so it's collapsed to a single per-variation finding. +// Color-dependent rules; reported per theme·mode. Others collapse to one entry. const THEME_DEPENDENT_RULES = new Set([ 'color-contrast', 'color-contrast-enhanced', 'link-in-text-block', ]); -// Pull a human-readable example ("`#fff` on `#84cc16` · ratio 1.89") out of an -// axe node's failureSummary for contrast failures; else fall back to help text. +// Pull a readable example ("`#fff` on `#84cc16` · ratio 1.89") from a contrast +// failure; else fall back to help text. function exampleFor(violation: AxeViolation): string { const summary = violation.nodes?.[0]?.failureSummary ?? ''; const m = summary.match( @@ -162,9 +156,8 @@ function buildBody(): string { ].join('\n'); } - // Nest as framework -> component (h4) -> variation (h5). Each variation splits - // findings in two: `structural` (theme-independent rules, collapsed to one - // entry each) and `themed` (contrast rules, kept per theme -> mode). + // Nest framework -> component -> variation, splitting findings into structural + // (collapsed) and themed (kept per theme -> mode). interface Leaf { mode: string; rule: string; @@ -260,7 +253,7 @@ function buildBody(): string { ].join('\n'); } -// Keep under GitHub's 65 536-char comment limit (leave headroom for the marker). +// Keep under GitHub's 65 536-char comment limit. const MAX_LEN = 64000; const full = buildBody(); const body = @@ -272,7 +265,7 @@ const body = mkdirSync(dirname(resolve(OUT)), { recursive: true }); writeFileSync(OUT, body + '\n', 'utf8'); -// Mirror into the Actions run summary when available (also covers push builds). +// Mirror into the Actions run summary when available. const stepSummary = process.env.GITHUB_STEP_SUMMARY; if (stepSummary) appendFileSync(stepSummary, body + '\n'); From 2a8d4115b19cfae8b59b1048b5117524d3fcb38c Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:18:01 +0200 Subject: [PATCH 12/58] Adopt @surfnet/curve-* package names; note headless run in a11y CI Update the a11y tooling's imports, CI filter and PR-comment labels for the @surfnet/* -> @surfnet/curve-* rebrand on main, and spell out in ci.yml that the audit drives Playwright Chromium headless (a few seconds per framework after the Storybook build). --- .github/workflows/ci.yml | 13 +++++++++---- packages/angular/.storybook/test-runner.ts | 2 +- packages/react/.storybook/test-runner.ts | 2 +- packages/storybook-config/src/a11y-audit.ts | 2 +- scripts/a11y-comment.ts | 4 ++-- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51e5de51..c027ae48 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,12 +47,17 @@ jobs: - run: pnpm build - # Scoped to @surfnet/storybook-config, which pins playwright, so both - # framework runs share one browser. + # The audit runs @storybook/test-runner, which drives Playwright Chromium + # headless (no display needed on CI). Install it once, scoped to + # @surfnet/curve-storybook-config which pins playwright, so both framework + # runs share one browser. - name: Install Playwright Chromium - run: pnpm --filter @surfnet/storybook-config exec playwright install --with-deps chromium + run: pnpm --filter @surfnet/curve-storybook-config exec playwright install --with-deps chromium - # Report-only for now; flip to blocking by removing `continue-on-error`. + # Headless axe sweep of every story across all themes/modes. Fast: the + # test phase is a few seconds per framework once Storybook is built (the + # build-storybook step dominates). Report-only for now; flip to blocking by + # removing `continue-on-error`. - name: Accessibility audit (WCAG 2.1 AA) continue-on-error: true run: pnpm test:a11y diff --git a/packages/angular/.storybook/test-runner.ts b/packages/angular/.storybook/test-runner.ts index 239188c8..7e6cab72 100644 --- a/packages/angular/.storybook/test-runner.ts +++ b/packages/angular/.storybook/test-runner.ts @@ -1,6 +1,6 @@ import type { TestRunnerConfig } from '@storybook/test-runner'; -import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; +import { runStoryA11yAudit } from '@surfnet/curve-storybook-config/test-runner'; // Delegate to the shared audit so React and Angular stay in lockstep. const config: TestRunnerConfig = { diff --git a/packages/react/.storybook/test-runner.ts b/packages/react/.storybook/test-runner.ts index 239188c8..7e6cab72 100644 --- a/packages/react/.storybook/test-runner.ts +++ b/packages/react/.storybook/test-runner.ts @@ -1,6 +1,6 @@ import type { TestRunnerConfig } from '@storybook/test-runner'; -import { runStoryA11yAudit } from '@surfnet/storybook-config/test-runner'; +import { runStoryA11yAudit } from '@surfnet/curve-storybook-config/test-runner'; // Delegate to the shared audit so React and Angular stay in lockstep. const config: TestRunnerConfig = { diff --git a/packages/storybook-config/src/a11y-audit.ts b/packages/storybook-config/src/a11y-audit.ts index 69f934fd..ae34f066 100644 --- a/packages/storybook-config/src/a11y-audit.ts +++ b/packages/storybook-config/src/a11y-audit.ts @@ -47,7 +47,7 @@ interface ComboResult { /** * Audits the rendered story against WCAG 2.1 AA, once per theme/mode from - * `@surfnet/tokens`. Writes a per-story JSON report and throws on violations. + * `@surfnet/curve-tokens`. Writes a per-story JSON report and throws on violations. */ export async function runStoryA11yAudit(page: Page, context: TestContext): Promise { const storyContext = await getStoryContext(page, context); diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 5404bfd6..603b20e9 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -112,7 +112,7 @@ for (const fw of frameworks) { for (const v of combo.violations ?? []) { const ref = WCAG_REF[v.id] ? `${v.id} (${WCAG_REF[v.id]})` : v.id; rows.push({ - framework: `@surfnet/${fw.name}`, + framework: `@surfnet/curve-${fw.name}`, component, variation, theme: combo.theme, @@ -145,7 +145,7 @@ function buildBody(): string { } if (rows.length === 0) { - const fwList = [...frameworksWithReports].map((f) => `\`@surfnet/${f}\``).join(', '); + const fwList = [...frameworksWithReports].map((f) => `\`@surfnet/curve-${f}\``).join(', '); return [ HEADER, '', From 35bb443b209b819b95b9a91ef85ad74fef7c3e22 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 10:42:22 +0200 Subject: [PATCH 13/58] Inline a11y-comment script call in CI, drop a11y:comment workspace script --- .github/workflows/ci.yml | 2 +- package.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c027ae48..331cbde4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,7 +73,7 @@ jobs: # Summarise the JSON reports into .a11y-report/comment.md. - name: Summarise a11y findings if: always() - run: pnpm a11y:comment + run: pnpm exec jiti scripts/a11y-comment.ts # One sticky comment, updated in place. - name: Comment a11y findings on PR diff --git a/package.json b/package.json index 1e11cfaf..19c46e8b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "build-storybook": "turbo run build-storybook", "lint": "turbo run lint", "test:a11y": "turbo run test:a11y:ci", - "a11y:comment": "jiti scripts/a11y-comment.ts", "format": "prettier --write \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "format:check": "prettier --check \"**/*.{ts,tsx,js,mjs,cjs,json,md,css,html}\"", "changeset": "changeset", From afa90ef6f6ae5db573f9464fabca2ede28bd3a68 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:04:08 +0200 Subject: [PATCH 14/58] Capture and embed a11y violation screenshots --- .github/workflows/ci.yml | 14 +++++- packages/storybook-config/src/a11y-audit.ts | 54 ++++++++++++++++++++- scripts/a11y-comment.ts | 45 +++++++++++++++-- scripts/publish-a11y-screenshots.sh | 52 ++++++++++++++++++++ 4 files changed, 156 insertions(+), 9 deletions(-) create mode 100755 scripts/publish-a11y-screenshots.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 331cbde4..e75fceb1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,10 +13,13 @@ concurrency: jobs: checks: runs-on: ubuntu-latest - # The a11y step writes a PR comment. + # The a11y steps write a PR comment and push violation screenshots to the + # a11y-screenshots branch. permissions: - contents: read + contents: write pull-requests: write + env: + PR_NUMBER: ${{ github.event.pull_request.number }} steps: - uses: actions/checkout@v4 @@ -70,6 +73,13 @@ jobs: path: packages/*/.a11y-report/** if-no-files-found: ignore + # Pushes violating-element screenshots to the `a11y-screenshots` branch + # so the PR comment below can embed them by raw.githubusercontent.com + # URL. PR-only: there's no PR to attach screenshots to on a push build. + - name: Publish a11y screenshots + if: always() && github.event_name == 'pull_request' + run: ./scripts/publish-a11y-screenshots.sh + # Summarise the JSON reports into .a11y-report/comment.md. - name: Summarise a11y findings if: always() diff --git a/packages/storybook-config/src/a11y-audit.ts b/packages/storybook-config/src/a11y-audit.ts index ae34f066..88d8b7b6 100644 --- a/packages/storybook-config/src/a11y-audit.ts +++ b/packages/storybook-config/src/a11y-audit.ts @@ -39,10 +39,47 @@ async function applyTheme(page: Page, theme: string, mode: Mode): Promise ); } +type ViolationWithScreenshot = Result & { screenshot?: string }; + interface ComboResult { theme: string; mode: Mode; - violations: Result[]; + violations: ViolationWithScreenshot[]; +} + +const SCREENSHOT_DIR = resolve(REPORT_DIR, 'screenshots'); + +// Screenshots the first offending element of a violation, for the PR comment. +// Best-effort: axe targets aren't guaranteed to resolve to a single visible +// element (off-screen, zero-size, or inside a nested frame), so failures here +// must never break the audit itself. +async function captureViolationScreenshot( + page: Page, + storyId: string, + theme: string, + mode: Mode, + violation: Result, +): Promise { + // Only handle the plain, single-selector case; skip cross-frame/shadow-dom + // targets (arrays-within-the-array) rather than guess at a locator for them. + const target = violation.nodes?.[0]?.target; + const selector = target?.length === 1 && typeof target[0] === 'string' ? target[0] : undefined; + if (!selector) return undefined; + + try { + const locator = page.locator(selector).first(); + if ((await locator.count()) === 0) return undefined; + await locator.scrollIntoViewIfNeeded({ timeout: 2000 }); + const file = `${storyId}__${theme}-${mode}__${violation.id}.png`.replace( + /[^a-z0-9._-]+/gi, + '_', + ); + mkdirSync(SCREENSHOT_DIR, { recursive: true }); + await locator.screenshot({ path: resolve(SCREENSHOT_DIR, file), timeout: 5000 }); + return file; + } catch { + return undefined; + } } /** @@ -75,7 +112,20 @@ export async function runStoryA11yAudit(page: Page, context: TestContext): Promi for (const theme of THEME_NAMES) { for (const mode of MODES) { await applyTheme(page, theme, mode); - const violations = await getViolations(page, STORY_ROOT, runOptions); + const violations: ViolationWithScreenshot[] = await getViolations( + page, + STORY_ROOT, + runOptions, + ); + for (const violation of violations) { + violation.screenshot = await captureViolationScreenshot( + page, + context.id, + theme, + mode, + violation, + ); + } results.push({ theme, mode, violations }); } } diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index 603b20e9..c78eb1a7 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -23,6 +23,7 @@ interface AxeViolation { id: string; help?: string; nodes?: AxeNode[]; + screenshot?: string; } interface ComboResult { theme: string; @@ -43,12 +44,25 @@ interface Row { rule: string; example: string; themeDependent: boolean; + screenshotUrl?: string; } const OUT = process.argv[2] ?? '.a11y-report/comment.md'; const PACKAGES_DIR = resolve('packages'); const REPORT_DIR_NAME = '.a11y-report'; +// The "Publish a11y screenshots" CI step pushes screenshots to this branch, +// under `pr-//.png`, giving each one a stable raw URL. +// Only set for pull_request runs — local/push runs skip image embeds. +const SCREENSHOTS_BRANCH = 'a11y-screenshots'; +const PR_NUMBER = process.env.PR_NUMBER; +const REPO = process.env.GITHUB_REPOSITORY; + +function screenshotUrl(pkgName: string, file?: string): string | undefined { + if (!file || !PR_NUMBER || !REPO) return undefined; + return `https://raw.githubusercontent.com/${REPO}/${SCREENSHOTS_BRANCH}/pr-${PR_NUMBER}/${pkgName}/${file}`; +} + // axe rule id -> WCAG success criterion. Unlisted rules show the bare id. const WCAG_REF: Record = { 'color-contrast': '1.4.3', @@ -120,6 +134,7 @@ for (const fw of frameworks) { rule: ref, example: exampleFor(v), themeDependent: THEME_DEPENDENT_RULES.has(v.id), + screenshotUrl: screenshotUrl(fw.name, v.screenshot), }); } } @@ -162,14 +177,25 @@ function buildBody(): string { mode: string; rule: string; example: string; + screenshotUrl?: string; + } + interface StructuralEntry { + desc: string; + screenshotUrl?: string; } interface VariationData { - structural: Map; // rule -> short description (deduped) + structural: Map; // rule -> short description (deduped) themed: Map; // theme -> failing modes } type VariationMap = Map; type ComponentMap = Map; + // GitHub strips `data:` URIs from comment markdown, so thumbnails need a + // real URL — this stays undefined outside the "Publish a11y screenshots" CI + // step, and callers just render without an image in that case. + const img = (url: string | undefined, alt: string): string => + url ? `${alt.replace(/` : ''; + const tree = new Map(); for (const r of rows) { const components = tree.get(r.framework) ?? new Map(); @@ -180,11 +206,16 @@ function buildBody(): string { }; if (r.themeDependent) { const leaves = data.themed.get(r.theme) ?? []; - leaves.push({ mode: r.mode, rule: r.rule, example: r.example }); + leaves.push({ + mode: r.mode, + rule: r.rule, + example: r.example, + screenshotUrl: r.screenshotUrl, + }); data.themed.set(r.theme, leaves); } else { // Same finding in every theme/mode — keep one entry per rule. - data.structural.set(r.rule, r.example); + data.structural.set(r.rule, { desc: r.example, screenshotUrl: r.screenshotUrl }); } variations.set(r.variation, data); components.set(r.component, variations); @@ -213,10 +244,12 @@ function buildBody(): string { lines.push('', `##### ${variation} — ${findingCount(data)} finding(s)`); // Theme-independent findings: one line each, flagged as such. - for (const [rule, desc] of [...data.structural].sort(byKey)) { + for (const [rule, entry] of [...data.structural].sort(byKey)) { structuralTotal += 1; - const detail = desc ? `${desc} — ` : ''; + const detail = entry.desc ? `${entry.desc} — ` : ''; lines.push(`- ${detail}${rule} · _all themes/modes_`); + const thumb = img(entry.screenshotUrl, `${rule} violation`); + if (thumb) lines.push(` ${thumb}`); } // Contrast findings: grouped theme -> mode. @@ -226,6 +259,8 @@ function buildBody(): string { for (const leaf of [...leaves].sort((a, b) => modeRank(a.mode) - modeRank(b.mode))) { const detail = leaf.example ? `${leaf.example} — ` : ''; lines.push(` - \`${leaf.mode}\` — ${detail}${leaf.rule}`); + const thumb = img(leaf.screenshotUrl, `${leaf.rule} violation (${theme}/${leaf.mode})`); + if (thumb) lines.push(` ${thumb}`); } } } diff --git a/scripts/publish-a11y-screenshots.sh b/scripts/publish-a11y-screenshots.sh new file mode 100755 index 00000000..194b6883 --- /dev/null +++ b/scripts/publish-a11y-screenshots.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Publishes this run's a11y violation screenshots to a dedicated orphan +# branch, so each one gets a stable raw.githubusercontent.com URL that the +# sticky PR comment (scripts/a11y-comment.ts) can embed inline. A PR's +# screenshots fully replace its previous run's — no history is kept, so the +# branch never grows unbounded. +# +# Requires: PR_NUMBER env var, and `contents: write` on the job's +# GITHUB_TOKEN (actions/checkout already persists it for `git push`). + +BRANCH="a11y-screenshots" +PR_NUMBER="${PR_NUMBER:?PR_NUMBER env var required}" +TARGET_DIR="pr-${PR_NUMBER}" + +shopt -s nullglob +FILES=(packages/*/.a11y-report/screenshots/*.png) +if [ ${#FILES[@]} -eq 0 ]; then + echo "No a11y screenshots to publish." + exit 0 +fi + +WORKTREE="$(mktemp -d "${TMPDIR:-/tmp}/a11y-screenshots.XXXXXX")" +trap 'git worktree remove --force "$WORKTREE" 2>/dev/null || rm -rf "$WORKTREE"' EXIT + +git fetch origin "refs/heads/$BRANCH:refs/remotes/origin/$BRANCH" 2>/dev/null || true +if git show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then + git worktree add --quiet "$WORKTREE" "$BRANCH" +else + git worktree add --quiet --detach "$WORKTREE" HEAD + git -C "$WORKTREE" checkout --orphan "$BRANCH" + git -C "$WORKTREE" rm -rf . >/dev/null +fi + +rm -rf "${WORKTREE:?}/${TARGET_DIR}" +for f in "${FILES[@]}"; do + # packages/react/.a11y-report/screenshots/foo.png -> pr-123/react/foo.png + pkg=$(echo "$f" | cut -d/ -f2) + mkdir -p "$WORKTREE/$TARGET_DIR/$pkg" + cp "$f" "$WORKTREE/$TARGET_DIR/$pkg/" +done + +git -C "$WORKTREE" config user.name "github-actions[bot]" +git -C "$WORKTREE" config user.email "github-actions[bot]@users.noreply.github.com" +git -C "$WORKTREE" add "$TARGET_DIR" +if git -C "$WORKTREE" diff --cached --quiet; then + echo "No screenshot changes for PR #$PR_NUMBER." +else + git -C "$WORKTREE" commit --quiet -m "a11y screenshots for PR #$PR_NUMBER" + git -C "$WORKTREE" push origin "HEAD:$BRANCH" +fi From 4bcd9723744d36c9762e48184c3f326fa58d45d2 Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:25:51 +0200 Subject: [PATCH 15/58] Drop fixed width on a11y comment screenshots Forcing width=360 upscaled small violation screenshots, making them pixelated in the PR comment; render at native size instead. --- scripts/a11y-comment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/a11y-comment.ts b/scripts/a11y-comment.ts index c78eb1a7..f11b172b 100644 --- a/scripts/a11y-comment.ts +++ b/scripts/a11y-comment.ts @@ -194,7 +194,7 @@ function buildBody(): string { // real URL — this stays undefined outside the "Publish a11y screenshots" CI // step, and callers just render without an image in that case. const img = (url: string | undefined, alt: string): string => - url ? `${alt.replace(/` : ''; + url ? `${alt.replace(/` : ''; const tree = new Map(); for (const r of rows) { From e51e697860e2f1ee4d970565ae0214e395a19eff Mon Sep 17 00:00:00 2001 From: sjoerdbeentjes <11621275+sjoerdbeentjes@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:41:43 +0200 Subject: [PATCH 16/58] Update playwright to 1.61.1 --- packages/storybook-config/package.json | 4 +- pnpm-lock.yaml | 51 ++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/packages/storybook-config/package.json b/packages/storybook-config/package.json index 85045160..8136e45b 100644 --- a/packages/storybook-config/package.json +++ b/packages/storybook-config/package.json @@ -42,8 +42,8 @@ "@surfnet/curve-typescript-config": "workspace:*", "@types/react": "19.2.17", "axe-core": "4.12.1", - "playwright": "1.61.0", - "playwright-core": "1.61.0", + "playwright": "1.61.1", + "playwright-core": "1.61.1", "react": "19.2.7", "storybook": "10.4.5", "typescript": "6.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f041c2f9..324e335f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -467,7 +467,7 @@ importers: version: link:../tokens axe-playwright: specifier: 2.2.2 - version: 2.2.2(playwright@1.63.0) + version: 2.2.2(playwright@1.61.1) devDependencies: '@storybook/addon-docs': specifier: 10.4.5 @@ -485,11 +485,11 @@ importers: specifier: 4.12.1 version: 4.12.1 playwright: - specifier: 1.61.0 - version: 1.61.0 + specifier: 1.61.1 + version: 1.61.1 playwright-core: - specifier: 1.61.0 - version: 1.61.0 + specifier: 1.61.1 + version: 1.61.1 react: specifier: 19.2.7 version: 19.2.7 @@ -7923,6 +7923,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -10109,11 +10114,21 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} + hasBin: true + playwright-core@1.63.0: resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} engines: {node: '>=20'} hasBin: true + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} + hasBin: true + playwright@1.63.0: resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==} engines: {node: '>=20'} @@ -19273,6 +19288,15 @@ snapshots: axe-core: 4.12.1 mustache: 4.2.0 + axe-playwright@2.2.2(playwright@1.61.1): + dependencies: + '@types/junit-report-builder': 3.0.2 + axe-core: 4.12.1 + axe-html-reporter: 2.2.11(axe-core@4.12.1) + junit-report-builder: 5.1.2 + picocolors: 1.1.1 + playwright: 1.61.1 + axe-playwright@2.2.2(playwright@1.63.0): dependencies: '@types/junit-report-builder': 3.0.2 @@ -21322,6 +21346,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -24234,8 +24261,16 @@ snapshots: playwright-core@1.61.0: {} + playwright-core@1.61.1: {} + playwright-core@1.63.0: {} + playwright@1.61.1: + dependencies: + playwright-core: 1.61.1 + optionalDependencies: + fsevents: 2.3.2 + playwright@1.63.0: dependencies: playwright-core: 1.63.0 @@ -25140,7 +25175,7 @@ snapshots: immutable: 5.1.6 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + '@parcel/watcher': 2.6.0 optional: true sass@1.101.0: @@ -25149,7 +25184,7 @@ snapshots: immutable: 5.1.6 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + '@parcel/watcher': 2.6.0 sass@1.97.3: dependencies: @@ -25157,7 +25192,7 @@ snapshots: immutable: 5.1.6 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + '@parcel/watcher': 2.6.0 sass@1.99.0: dependencies: From f680b0a23bbf3a6d1d25772d08b30eff7036c213 Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 13:24:52 +0200 Subject: [PATCH 17/58] fix: always give progress component a accessible name --- .../progress/src/lib/hlm-progress.stories.ts | 64 ++++++++++++------- .../lib/ui/progress/src/lib/hlm-progress.ts | 13 +++- .../ui/progress/progress.stories.tsx | 51 +++++++++------ .../src/components/ui/progress/progress.tsx | 1 + 4 files changed, 86 insertions(+), 43 deletions(-) diff --git a/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.stories.ts b/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.stories.ts index 5bd0fc33..c1464b24 100644 --- a/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.stories.ts +++ b/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.stories.ts @@ -5,7 +5,13 @@ import { HlmProgress, HlmProgressImports } from '..'; // `value` is contributed by the BrnProgress host directive rather than HlmProgress // itself, so widen the story args to expose it as a control. -type ProgressArgs = HlmProgress & { value?: number | null }; +type ProgressArgs = HlmProgress & { value?: number | null; label: string }; + +const labelArgType = { + control: 'text' as const, + description: + 'Accessible name for the progress bar. Use `aria-label` when the name is not shown visually, or visible text linked with `aria-labelledby`.', +}; const meta: Meta = { title: 'Components/Progress', @@ -23,6 +29,7 @@ const meta: Meta = { }, }, argTypes: { + label: labelArgType, value: { control: { type: 'range', min: 0, max: 100, step: 1 }, description: @@ -31,6 +38,7 @@ const meta: Meta = { }, args: { value: 50, + label: 'Progress', }, }; @@ -39,10 +47,10 @@ type Story = StoryObj; /** The default progress bar — tweak `value` via the controls. */ export const Default: Story = { - render: ({ ...args }) => ({ - props: args, + render: ({ label, ...args }) => ({ + props: { label, ...args }, template: ` - + `, @@ -51,15 +59,18 @@ export const Default: Story = { /** A labelled progress bar — a text row with the percentage alongside the track. */ export const WithLabel: Story = { - render: ({ ...args }) => ({ - props: args, + args: { + label: 'Uploading file…', + }, + render: ({ label, ...args }) => ({ + props: { label, ...args }, template: `
- Uploading file… + {{ label }} {{ value }}%
- +
@@ -69,56 +80,61 @@ export const WithLabel: Story = { /** Indeterminate state — `value` is left unbound while the task's completion is unknown. */ export const Indeterminate: Story = { - render: () => ({ + args: { + label: 'Loading…', + }, + render: ({ label }) => ({ + props: { label }, template: ` -
- Loading… - - - -
+ + + `, }), }; /** Several tasks at different points of completion, each labelled with its percentage. */ export const Values: Story = { - render: () => ({ + args: { + label: 'Task', + }, + render: ({ label }) => ({ + props: { label }, template: `
- Task 10 + {{ label }} 10 10%
- +
- Task 40 + {{ label }} 40 40%
- +
- Task 75 + {{ label }} 75 75%
- +
- Task 100 + {{ label }} 100 100%
- +
diff --git a/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.ts b/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.ts index e02fe4b3..e9d702e2 100644 --- a/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.ts +++ b/packages/angular/src/lib/ui/progress/src/lib/hlm-progress.ts @@ -1,12 +1,23 @@ -import { Directive } from '@angular/core'; +import { Directive, input } from '@angular/core'; import { BrnProgress } from '@spartan-ng/brain/progress'; import { classes } from '../../../utils/src'; @Directive({ selector: 'hlm-progress,[hlmProgress]', hostDirectives: [{ directive: BrnProgress, inputs: ['value', 'max', 'getValueLabel'] }], + host: { + role: 'progressbar', + '[attr.aria-label]': 'ariaLabel()', + '[attr.aria-labelledby]': 'ariaLabelledby()', + }, }) export class HlmProgress { + /** The aria-label for the progress bar. */ + public readonly ariaLabel = input(null, { alias: 'aria-label' }); + + /** The aria-labelledby for the progress bar. */ + public readonly ariaLabelledby = input(null, { alias: 'aria-labelledby' }); + constructor() { classes(() => 'bg-muted h-1.5 rounded-full relative inline-flex w-full overflow-hidden'); } diff --git a/packages/react/src/components/ui/progress/progress.stories.tsx b/packages/react/src/components/ui/progress/progress.stories.tsx index 78640046..002b3ec7 100644 --- a/packages/react/src/components/ui/progress/progress.stories.tsx +++ b/packages/react/src/components/ui/progress/progress.stories.tsx @@ -1,9 +1,18 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; +import type { ComponentProps } from 'react'; import { progressContract } from '@surfnet/curve-contracts'; -import { Progress, ProgressLabel, ProgressValue } from './progress'; +import { Progress, ProgressValue } from './progress'; -const meta = { +const labelArgType = { + control: 'text' as const, + description: + 'Accessible name for the progress bar. Use `aria-label` when the name is not shown visually, or visible text linked with `aria-labelledby`.', +}; + +type ProgressStoryArgs = ComponentProps & { label: string }; + +const meta: Meta = { title: 'Components/Progress', component: Progress, parameters: { @@ -14,6 +23,7 @@ const meta = { }, }, argTypes: { + label: labelArgType, value: { control: { type: 'range', min: 0, max: 100, step: 1 }, description: @@ -22,8 +32,9 @@ const meta = { }, args: { value: 50, + label: 'Progress', }, -} satisfies Meta; +}; export default meta; @@ -31,15 +42,18 @@ type Story = StoryObj; /** The default progress bar — tweak `value` via the controls. */ export const Default: Story = { - render: (args) => , + render: ({ label, ...args }) => , }; -/** A labelled progress bar — `ProgressLabel` and `ProgressValue` alongside the track. */ +/** A labelled progress bar — a visible label linked with `aria-labelledby`. */ export const WithLabel: Story = { - render: (args) => ( - -
- Uploading file… + args: { + label: 'Uploading file…', + }, + render: ({ label, ...args }) => ( + +
+ {label}
@@ -48,22 +62,23 @@ export const WithLabel: Story = { /** Indeterminate state — `value` is `null` while the task's completion is unknown. */ export const Indeterminate: Story = { - args: { value: null }, - render: (args) => ( - - Loading… - - ), + args: { value: null, label: 'Loading…' }, + render: ({ label, ...args }) => , }; /** Several tasks at different points of completion, each labelled with its percentage. */ export const Values: Story = { - render: () => ( + args: { + label: 'Task', + }, + render: ({ label }) => (
{[10, 40, 75, 100].map((value) => ( - +
- Task {value} + + {label} {value} +
diff --git a/packages/react/src/components/ui/progress/progress.tsx b/packages/react/src/components/ui/progress/progress.tsx index 10db7c8a..7488dc46 100644 --- a/packages/react/src/components/ui/progress/progress.tsx +++ b/packages/react/src/components/ui/progress/progress.tsx @@ -8,6 +8,7 @@ function Progress({ className, children, value, ...props }: ProgressPrimitive.Ro return ( Date: Tue, 1 Sep 2026 13:40:01 +0200 Subject: [PATCH 18/58] fix: use primary-strong for badges to increase contrast --- .changeset/badge-link-primary-strong.md | 6 ++++++ packages/angular/src/lib/ui/badge/src/lib/hlm-badge.ts | 2 +- packages/react/src/components/ui/badge/badge.tsx | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .changeset/badge-link-primary-strong.md diff --git a/.changeset/badge-link-primary-strong.md b/.changeset/badge-link-primary-strong.md new file mode 100644 index 00000000..c303d1ec --- /dev/null +++ b/.changeset/badge-link-primary-strong.md @@ -0,0 +1,6 @@ +--- +'@surfnet/curve-react': patch +'@surfnet/curve-angular': patch +--- + +Use `--primary-strong` for link-style text (Badge `link`, and inline links in Field, Empty, and Item) so it meets contrast on the page background. Filled Primary is unchanged. diff --git a/packages/angular/src/lib/ui/badge/src/lib/hlm-badge.ts b/packages/angular/src/lib/ui/badge/src/lib/hlm-badge.ts index 7b68d845..98d02bd9 100644 --- a/packages/angular/src/lib/ui/badge/src/lib/hlm-badge.ts +++ b/packages/angular/src/lib/ui/badge/src/lib/hlm-badge.ts @@ -15,7 +15,7 @@ const badgeVariantClasses = { 'bg-danger-subtle text-danger-subtle-foreground [a]:hover:bg-danger-subtle-hover focus-visible:ring-danger/20 dark:focus-visible:ring-danger/40', outline: 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground', ghost: 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50', - link: 'text-primary underline-offset-4 hover:underline', + link: 'text-primary-strong underline-offset-4 hover:underline', } satisfies Record; const badgeVariants = cva( diff --git a/packages/react/src/components/ui/badge/badge.tsx b/packages/react/src/components/ui/badge/badge.tsx index b9c52b65..d262c491 100644 --- a/packages/react/src/components/ui/badge/badge.tsx +++ b/packages/react/src/components/ui/badge/badge.tsx @@ -19,7 +19,7 @@ const badgeVariantClasses = { 'bg-danger-subtle text-danger-subtle-foreground focus-visible:ring-danger/20 dark:focus-visible:ring-danger/40 [a]:hover:bg-danger-subtle-hover', outline: 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground', ghost: 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50', - link: 'text-primary underline-offset-4 hover:underline', + link: 'text-primary-strong underline-offset-4 hover:underline', } satisfies Record; const badgeVariants = cva( From d1b0852226aba777041f6a935dc6bffe7b5bd24d Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 15:11:07 +0200 Subject: [PATCH 19/58] fix: add aria-attributes to combobox trigger button --- .changeset/combobox-trigger-aria.md | 6 ++++ .../ui/combobox/src/lib/hlm-combobox-input.ts | 16 ++++++++- .../ui/combobox/src/lib/hlm-combobox-list.ts | 17 +++++++-- .../src/lib/hlm-combobox-listbox-id.ts | 16 +++++++++ .../combobox/src/lib/hlm-combobox-multiple.ts | 2 ++ .../combobox/src/lib/hlm-combobox-trigger.ts | 1 + .../lib/ui/combobox/src/lib/hlm-combobox.ts | 2 ++ .../src/components/ui/combobox/combobox.tsx | 35 ++++++++++++++----- 8 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 .changeset/combobox-trigger-aria.md create mode 100644 packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-listbox-id.ts diff --git a/.changeset/combobox-trigger-aria.md b/.changeset/combobox-trigger-aria.md new file mode 100644 index 00000000..be7d1c31 --- /dev/null +++ b/.changeset/combobox-trigger-aria.md @@ -0,0 +1,6 @@ +--- +'@surfnet/curve-angular': patch +'@surfnet/curve-react': patch +--- + +Wire combobox input trigger button `aria-expanded`, `aria-haspopup="listbox"`, and `aria-controls` to the listbox id. diff --git a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-input.ts b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-input.ts index 9d2f32d0..13bb9f8e 100644 --- a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-input.ts +++ b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-input.ts @@ -2,8 +2,13 @@ import { BooleanInput } from '@angular/cdk/coercion'; import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core'; import { NgIcon, provideIcons } from '@ng-icons/core'; import { phosphorCaretDown, phosphorX } from '@ng-icons/phosphor-icons/regular'; -import { BrnComboboxImports, BrnComboboxPopoverTrigger } from '@spartan-ng/brain/combobox'; +import { + BrnComboboxImports, + BrnComboboxPopoverTrigger, + injectBrnComboboxBase, +} from '@spartan-ng/brain/combobox'; import { HlmInputGroupImports } from '../../../input-group/src'; +import { injectHlmComboboxListboxId } from './hlm-combobox-listbox-id'; @Component({ selector: 'hlm-combobox-input', @@ -26,9 +31,13 @@ import { HlmInputGroupImports } from '../../../input-group/src'; @if (showTrigger()) { @@ -59,6 +69,10 @@ import { HlmInputGroupImports } from '../../../input-group/src'; export class HlmComboboxInput { private static _id = 0; + private readonly _combobox = injectBrnComboboxBase(); + protected readonly _listboxId = injectHlmComboboxListboxId(); + protected readonly _isExpanded = this._combobox.isExpanded; + public readonly inputId = input(`hlm-combobox-input-${HlmComboboxInput._id++}`); public readonly placeholder = input(''); diff --git a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-list.ts b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-list.ts index 87bf07d5..741cdb07 100644 --- a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-list.ts +++ b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-list.ts @@ -1,13 +1,24 @@ -import { Directive } from '@angular/core'; +import { Directive, input } from '@angular/core'; import { BrnComboboxList } from '@spartan-ng/brain/combobox'; import { classes } from '../../../utils/src'; +import { injectHlmComboboxListboxId } from './hlm-combobox-listbox-id'; @Directive({ selector: '[hlmComboboxList]', - hostDirectives: [{ directive: BrnComboboxList, inputs: ['id'] }], - host: { 'data-slot': 'combobox-list' }, + hostDirectives: [{ directive: BrnComboboxList, inputs: ['id: listId'] }], + host: { + 'data-slot': 'combobox-list', + '[id]': 'listId()', + }, }) export class HlmComboboxList { + private static _id = 0; + + private readonly _defaultListId = + injectHlmComboboxListboxId() ?? `hlm-combobox-listbox-${++HlmComboboxList._id}`; + + public readonly listId = input(this._defaultListId, { alias: 'id' }); + constructor() { classes( () => diff --git a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-listbox-id.ts b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-listbox-id.ts new file mode 100644 index 00000000..d313316c --- /dev/null +++ b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-listbox-id.ts @@ -0,0 +1,16 @@ +import { inject, InjectionToken, type ValueProvider } from '@angular/core'; + +let listboxId = 0; + +export const HlmComboboxListboxId = new InjectionToken('HlmComboboxListboxId'); + +export function provideHlmComboboxListboxId(): ValueProvider { + return { + provide: HlmComboboxListboxId, + useValue: `hlm-combobox-listbox-${++listboxId}`, + }; +} + +export function injectHlmComboboxListboxId(): string | null { + return inject(HlmComboboxListboxId, { optional: true }); +} diff --git a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-multiple.ts b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-multiple.ts index e44cc465..24f59f73 100644 --- a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-multiple.ts +++ b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-multiple.ts @@ -3,10 +3,12 @@ import { BrnComboboxMultiple } from '@spartan-ng/brain/combobox'; import { provideBrnDialogDefaultOptions } from '@spartan-ng/brain/dialog'; import { BrnPopover, provideBrnPopoverConfig } from '@spartan-ng/brain/popover'; import { classes } from '../../../utils/src'; +import { provideHlmComboboxListboxId } from './hlm-combobox-listbox-id'; @Directive({ selector: '[hlmComboboxMultiple],hlm-combobox-multiple', providers: [ + provideHlmComboboxListboxId(), provideBrnPopoverConfig({ align: 'start', sideOffset: 6, diff --git a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-trigger.ts b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-trigger.ts index e0fefc23..3866a69d 100644 --- a/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-trigger.ts +++ b/packages/angular/src/lib/ui/combobox/src/lib/hlm-combobox-trigger.ts @@ -25,6 +25,7 @@ import type { ClassValue } from 'clsx'; changeDetection: ChangeDetectionStrategy.OnPush, template: ` @for (action of actions(); track action) { - } From 4bb3a1dccf31bdb06e62184ae5e8e311da148c79 Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 15:49:59 +0200 Subject: [PATCH 24/58] fix: Add aria-labels to buttons in input-group --- .../src/lib/hlm-input-group.stories.ts | 12 ++++++------ .../ui/input-group/input-group.stories.tsx | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/angular/src/lib/ui/input-group/src/lib/hlm-input-group.stories.ts b/packages/angular/src/lib/ui/input-group/src/lib/hlm-input-group.stories.ts index 4af0fd50..d78427ab 100644 --- a/packages/angular/src/lib/ui/input-group/src/lib/hlm-input-group.stories.ts +++ b/packages/angular/src/lib/ui/input-group/src/lib/hlm-input-group.stories.ts @@ -68,7 +68,7 @@ export const WithTextPrefix: Story = {
-
@@ -92,11 +92,11 @@ export const WithLeadingDropdown: Story = {
- + @for (option of categories; track option) { - + } @@ -114,14 +114,14 @@ export const TextareaWithBlockEndToolbar: Story = { template: `
- +
- 52% used - diff --git a/packages/react/src/components/ui/input-group/input-group.stories.tsx b/packages/react/src/components/ui/input-group/input-group.stories.tsx index 145ba740..0fd87b51 100644 --- a/packages/react/src/components/ui/input-group/input-group.stories.tsx +++ b/packages/react/src/components/ui/input-group/input-group.stories.tsx @@ -105,13 +105,23 @@ export const TextareaWithBlockEndToolbar: Story = { render: () => (
- + - + 52% used - + Send From cf611cb2f06f1ffdcc6db3f23d6f16fbed957e83 Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 16:22:19 +0200 Subject: [PATCH 25/58] fix: give nativeSelect accessible name --- .../src/components/ui/native-select/native-select.stories.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react/src/components/ui/native-select/native-select.stories.tsx b/packages/react/src/components/ui/native-select/native-select.stories.tsx index d67d9ca6..bb1210de 100644 --- a/packages/react/src/components/ui/native-select/native-select.stories.tsx +++ b/packages/react/src/components/ui/native-select/native-select.stories.tsx @@ -23,10 +23,12 @@ const meta = { }, }, disabled: { control: 'boolean' }, + 'aria-label': { control: 'text' }, }, args: { size: nativeSelectContract.defaults.sizes, disabled: false, + 'aria-label': 'Select an option', }, } satisfies Meta; From 86efae776a9065f7f54e511ceb61ecf4b16c5be1 Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 16:49:21 +0200 Subject: [PATCH 26/58] fix: input-OTP accessibility --- .changeset/input-otp-aria-label.md | 5 ++ .changeset/input-otp-complete-live-region.md | 6 ++ .../src/lib/hlm-input-otp.stories.ts | 10 ++- .../lib/ui/input-otp/src/lib/hlm-input-otp.ts | 64 ++++++++++++++++++- .../ui/input-otp/input-otp.stories.tsx | 12 +++- .../src/components/ui/input-otp/input-otp.tsx | 52 ++++++++++++--- 6 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 .changeset/input-otp-aria-label.md create mode 100644 .changeset/input-otp-complete-live-region.md diff --git a/.changeset/input-otp-aria-label.md b/.changeset/input-otp-aria-label.md new file mode 100644 index 00000000..02ebc05b --- /dev/null +++ b/.changeset/input-otp-aria-label.md @@ -0,0 +1,5 @@ +--- +'@surfnet/curve-angular': patch +--- + +Forward `aria-label` from Input OTP onto the underlying input so unlabeled examples (and consumers) can name the field for assistive technology. diff --git a/.changeset/input-otp-complete-live-region.md b/.changeset/input-otp-complete-live-region.md new file mode 100644 index 00000000..15b9e2e9 --- /dev/null +++ b/.changeset/input-otp-complete-live-region.md @@ -0,0 +1,6 @@ +--- +'@surfnet/curve-angular': patch +'@surfnet/curve-react': patch +--- + +Announce Input OTP completion to screen readers with a polite live region so pasting a full code is perceivable. diff --git a/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.stories.ts b/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.stories.ts index 54d9cb87..807f7e31 100644 --- a/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.stories.ts +++ b/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.stories.ts @@ -28,6 +28,10 @@ const meta: Meta = { argTypes: { maxLength: { control: 'number' }, disabled: { control: 'boolean' }, + completeAnnouncement: { + control: 'text', + description: 'Screen-reader announcement when every slot is filled, including after paste.', + }, }, args: { maxLength: 6, @@ -43,7 +47,7 @@ export const Default: Story = { render: (args) => ({ props: args, template: ` - + @@ -61,7 +65,7 @@ export const Default: Story = { export const WithSeparator: Story = { render: () => ({ template: ` - + @@ -82,7 +86,7 @@ export const WithSeparator: Story = { export const Disabled: Story = { render: () => ({ template: ` - + diff --git a/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.ts b/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.ts index c7a91341..18e08286 100644 --- a/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.ts +++ b/packages/angular/src/lib/ui/input-otp/src/lib/hlm-input-otp.ts @@ -1,12 +1,72 @@ -import { Directive } from '@angular/core'; +import { afterRenderEffect, Directive, ElementRef, inject, input, Renderer2 } from '@angular/core'; +import { BrnInputOtp } from '@spartan-ng/brain/input-otp'; import { classes } from '../../../utils/src'; @Directive({ selector: 'brn-input-otp[hlmInputOtp], brn-input-otp[hlm]', - host: { 'data-slot': 'input-otp' }, + host: { + 'data-slot': 'input-otp', + // Consume aria-label on the host so it can be forwarded to the inner . + '[attr.aria-label]': 'null', + }, }) export class HlmInputOtp { + private readonly _elementRef = inject(ElementRef); + private readonly _renderer = inject(Renderer2); + private readonly _otp = inject(BrnInputOtp); + + private _statusEl: HTMLElement | null = null; + + /** Accessible name applied to the underlying OTP input. */ + public readonly ariaLabel = input(undefined, { alias: 'aria-label' }); + + /** Screen-reader announcement when every slot is filled, including after paste. */ + public readonly completeAnnouncement = input('Verification code complete'); + constructor() { classes(() => 'gap-2 flex items-center has-disabled:opacity-50'); + + afterRenderEffect(() => { + const label = this.ariaLabel(); + const host = this._elementRef.nativeElement; + const inputEl = host.querySelector('input[data-slot="input-otp"]') as HTMLInputElement | null; + if (inputEl) { + if (label) { + this._renderer.setAttribute(inputEl, 'aria-label', label); + } else { + this._renderer.removeAttribute(inputEl, 'aria-label'); + } + } + + const statusEl = this.ensureStatusEl(); + const value = this._otp.value() ?? ''; + const maxLength = this._otp.maxLength(); + const text = value.length === maxLength ? this.completeAnnouncement() : ''; + this._renderer.setProperty(statusEl, 'textContent', text); + }); + } + + private ensureStatusEl(): HTMLElement { + if (this._statusEl) { + return this._statusEl; + } + + const existing = this._elementRef.nativeElement.querySelector( + '[data-slot="input-otp-status"]', + ) as HTMLElement | null; + if (existing) { + this._statusEl = existing; + return existing; + } + + const statusEl = this._renderer.createElement('div') as HTMLElement; + this._renderer.setAttribute(statusEl, 'role', 'status'); + this._renderer.setAttribute(statusEl, 'aria-live', 'polite'); + this._renderer.setAttribute(statusEl, 'aria-atomic', 'true'); + this._renderer.setAttribute(statusEl, 'data-slot', 'input-otp-status'); + this._renderer.addClass(statusEl, 'sr-only'); + this._renderer.appendChild(this._elementRef.nativeElement, statusEl); + this._statusEl = statusEl; + return statusEl; } } diff --git a/packages/react/src/components/ui/input-otp/input-otp.stories.tsx b/packages/react/src/components/ui/input-otp/input-otp.stories.tsx index cd270b0f..222b8662 100644 --- a/packages/react/src/components/ui/input-otp/input-otp.stories.tsx +++ b/packages/react/src/components/ui/input-otp/input-otp.stories.tsx @@ -18,6 +18,12 @@ const meta = { }, }, }, + argTypes: { + completeAnnouncement: { + control: 'text', + description: 'Screen-reader announcement when every slot is filled, including after paste.', + }, + }, } satisfies Meta; export default meta; @@ -33,7 +39,7 @@ type Story = StoryObj; export const Default: Story = { args: { maxLength: 6, children: null }, render: () => ( - + @@ -50,7 +56,7 @@ export const Default: Story = { export const WithSeparator: Story = { args: { maxLength: 6, children: null }, render: () => ( - + @@ -70,7 +76,7 @@ export const WithSeparator: Story = { export const Disabled: Story = { args: { maxLength: 6, children: null }, render: () => ( - + diff --git a/packages/react/src/components/ui/input-otp/input-otp.tsx b/packages/react/src/components/ui/input-otp/input-otp.tsx index 1cfd590a..8be2c00c 100644 --- a/packages/react/src/components/ui/input-otp/input-otp.tsx +++ b/packages/react/src/components/ui/input-otp/input-otp.tsx @@ -9,21 +9,53 @@ import { MinusIcon } from '@phosphor-icons/react'; function InputOTP({ className, containerClassName, + value, + defaultValue, + onChange, + maxLength, + completeAnnouncement = 'Verification code complete', ...props }: React.ComponentProps & { containerClassName?: string; + /** Screen-reader announcement when every slot is filled, including after paste. */ + completeAnnouncement?: string; }) { + const [uncontrolledValue, setUncontrolledValue] = React.useState(() => + typeof defaultValue === 'string' ? defaultValue : '', + ); + const currentValue = value !== undefined ? value : uncontrolledValue; + return ( - + <> + { + if (value === undefined) { + setUncontrolledValue(next); + } + onChange?.(next); + }} + /> +
+ {currentValue.length === maxLength ? completeAnnouncement : ''} +
+ ); } From 33af2ae6cdf71a76ac19335f7981e7d3914180a8 Mon Sep 17 00:00:00 2001 From: Anneke Sinnema Date: Tue, 1 Sep 2026 16:50:56 +0200 Subject: [PATCH 27/58] fix: breadcrumb accessibility, removed obsolete attributes --- .../lib/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts | 8 +------- .../src/lib/ui/breadcrumb/src/lib/hlm-breadcrumb.ts | 2 +- .../react/src/components/ui/breadcrumb/breadcrumb.tsx | 4 +--- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/angular/src/lib/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts b/packages/angular/src/lib/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts index 3bddbd0d..d4456c20 100644 --- a/packages/angular/src/lib/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts +++ b/packages/angular/src/lib/ui/breadcrumb/src/lib/hlm-breadcrumb-ellipsis.ts @@ -11,14 +11,8 @@ import type { ClassValue } from 'clsx'; providers: [provideIcons({ phosphorDotsThree })], changeDetection: ChangeDetectionStrategy.OnPush, template: ` -
); } @@ -124,13 +137,22 @@ function CommandGroup({ function CommandSeparator({ className, + alwaysRender, ...props -}: React.ComponentProps) { +}: React.ComponentProps<'div'> & { alwaysRender?: boolean }) { + const search = useCommandState((state) => state.search); + + if (!alwaysRender && search) { + return null; + } + return ( -