diff --git a/packages/0/package.json b/packages/0/package.json index 003ab2dbf..85f1ebb53 100644 --- a/packages/0/package.json +++ b/packages/0/package.json @@ -17,7 +17,10 @@ "scripts": { "build": "tsdown && pnpm generate:web-types", "generate:web-types": "tsx scripts/generate-web-types.ts", - "typecheck": "vue-tsc --noEmit --incremental" + "typecheck": "vue-tsc --noEmit --incremental", + "test:unit": "vitest --project v0:unit", + "test:browser": "vitest --project v0:browser", + "test:open": "TEST_BAIL=1 vitest --project v0:browser -w" }, "publishConfig": { "exports": { @@ -110,8 +113,11 @@ "@ant-design/colors": "catalog:", "@flagsmith/flagsmith": "catalog:", "@material/material-color-utilities": "catalog:", + "@testing-library/vue": "catalog:", + "@vitest/browser-playwright": "catalog:", "@vue/compiler-dom": "catalog:", "@vue/test-utils": "catalog:", + "jsdom": "catalog:", "launchdarkly-js-client-sdk": "catalog:", "posthog-js": "catalog:", "tsdown": "catalog:", diff --git a/packages/0/src/components/AlertDialog/index.test.ts b/packages/0/src/components/AlertDialog/index.browser.test.ts similarity index 100% rename from packages/0/src/components/AlertDialog/index.test.ts rename to packages/0/src/components/AlertDialog/index.browser.test.ts diff --git a/packages/0/src/components/Atom/index.test.ts b/packages/0/src/components/Atom/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Atom/index.test.ts rename to packages/0/src/components/Atom/index.browser.test.ts diff --git a/packages/0/src/components/Avatar/index.test.ts b/packages/0/src/components/Avatar/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Avatar/index.test.ts rename to packages/0/src/components/Avatar/index.browser.test.ts diff --git a/packages/0/src/components/Breadcrumbs/index.test.ts b/packages/0/src/components/Breadcrumbs/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Breadcrumbs/index.test.ts rename to packages/0/src/components/Breadcrumbs/index.browser.test.ts diff --git a/packages/0/src/components/Button/index.test.ts b/packages/0/src/components/Button/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Button/index.test.ts rename to packages/0/src/components/Button/index.browser.test.ts diff --git a/packages/0/src/components/Checkbox/index.test.ts b/packages/0/src/components/Checkbox/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Checkbox/index.test.ts rename to packages/0/src/components/Checkbox/index.browser.test.ts diff --git a/packages/0/src/components/Combobox/index.test.ts b/packages/0/src/components/Combobox/index.browser.test.ts similarity index 99% rename from packages/0/src/components/Combobox/index.test.ts rename to packages/0/src/components/Combobox/index.browser.test.ts index bf359b579..e18b061ef 100644 --- a/packages/0/src/components/Combobox/index.test.ts +++ b/packages/0/src/components/Combobox/index.browser.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it } from 'vitest' // Adapters import { ClientAdapter } from '#v0/composables/createCombobox/adapters/client' @@ -9,12 +9,6 @@ import { defineComponent, h, nextTick, ref } from 'vue' import { Combobox } from './index' -// Mock showPopover/hidePopover — not supported in happy-dom -beforeEach(() => { - HTMLElement.prototype.showPopover = vi.fn() - HTMLElement.prototype.hidePopover = vi.fn() -}) - // Clean up DOM between tests — cursor uses document.querySelector (global), // so stale elements from prior tests cause false matches if not cleared afterEach(() => { diff --git a/packages/0/src/components/Dialog/index.test.ts b/packages/0/src/components/Dialog/index.browser.test.ts similarity index 99% rename from packages/0/src/components/Dialog/index.test.ts rename to packages/0/src/components/Dialog/index.browser.test.ts index b2f1290a9..63bd672bd 100644 --- a/packages/0/src/components/Dialog/index.test.ts +++ b/packages/0/src/components/Dialog/index.browser.test.ts @@ -13,10 +13,7 @@ import { Dialog } from './index' // Create fresh stack plugin for each test to avoid "Ticket already exists" warnings let stackPlugin: ReturnType -// Mock showModal and close for happy-dom beforeEach(() => { - HTMLDialogElement.prototype.showModal = vi.fn() - HTMLDialogElement.prototype.close = vi.fn() stackPlugin = createStackPlugin() }) diff --git a/packages/0/src/components/ExpansionPanel/index.test.ts b/packages/0/src/components/ExpansionPanel/index.browser.test.ts similarity index 100% rename from packages/0/src/components/ExpansionPanel/index.test.ts rename to packages/0/src/components/ExpansionPanel/index.browser.test.ts diff --git a/packages/0/src/components/Form/index.test.ts b/packages/0/src/components/Form/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Form/index.test.ts rename to packages/0/src/components/Form/index.browser.test.ts diff --git a/packages/0/src/components/Group/index.test.ts b/packages/0/src/components/Group/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Group/index.test.ts rename to packages/0/src/components/Group/index.browser.test.ts diff --git a/packages/0/src/components/Input/index.test.ts b/packages/0/src/components/Input/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Input/index.test.ts rename to packages/0/src/components/Input/index.browser.test.ts diff --git a/packages/0/src/components/Pagination/index.test.ts b/packages/0/src/components/Pagination/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Pagination/index.test.ts rename to packages/0/src/components/Pagination/index.browser.test.ts diff --git a/packages/0/src/components/Popover/index.test.ts b/packages/0/src/components/Popover/index.browser.test.ts similarity index 99% rename from packages/0/src/components/Popover/index.test.ts rename to packages/0/src/components/Popover/index.browser.test.ts index 19abe9b41..08ad1d342 100644 --- a/packages/0/src/components/Popover/index.test.ts +++ b/packages/0/src/components/Popover/index.browser.test.ts @@ -371,7 +371,6 @@ describe('popover', () => { }) it('should reflect open state via context', async () => { - // Note: Native showPopover() doesn't exist in happy-dom // This test verifies the context state is properly reflected let contentProps: any let rootProps: any diff --git a/packages/0/src/components/Portal/index.test.ts b/packages/0/src/components/Portal/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Portal/index.test.ts rename to packages/0/src/components/Portal/index.browser.test.ts diff --git a/packages/0/src/components/Presence/index.test.ts b/packages/0/src/components/Presence/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Presence/index.test.ts rename to packages/0/src/components/Presence/index.browser.test.ts diff --git a/packages/0/src/components/Radio/index.test.ts b/packages/0/src/components/Radio/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Radio/index.test.ts rename to packages/0/src/components/Radio/index.browser.test.ts diff --git a/packages/0/src/components/Scrim/index.test.ts b/packages/0/src/components/Scrim/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Scrim/index.test.ts rename to packages/0/src/components/Scrim/index.browser.test.ts diff --git a/packages/0/src/components/Select/index.test.ts b/packages/0/src/components/Select/index.browser.test.ts similarity index 99% rename from packages/0/src/components/Select/index.test.ts rename to packages/0/src/components/Select/index.browser.test.ts index b8ac04926..10656c3c3 100644 --- a/packages/0/src/components/Select/index.test.ts +++ b/packages/0/src/components/Select/index.browser.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' // Utilities import { mount } from '@vue/test-utils' @@ -6,12 +6,6 @@ import { defineComponent, h, nextTick, ref } from 'vue' import { Select } from './index' -// Mock showPopover/hidePopover — not supported in happy-dom -beforeEach(() => { - HTMLElement.prototype.showPopover = vi.fn() - HTMLElement.prototype.hidePopover = vi.fn() -}) - /** * Helper to mount a complete Select compound and open it so items * register with the selection context (useLazy defers rendering diff --git a/packages/0/src/components/Selection/index.test.ts b/packages/0/src/components/Selection/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Selection/index.test.ts rename to packages/0/src/components/Selection/index.browser.test.ts diff --git a/packages/0/src/components/Single/index.test.ts b/packages/0/src/components/Single/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Single/index.test.ts rename to packages/0/src/components/Single/index.browser.test.ts diff --git a/packages/0/src/components/Slider/index.test.ts b/packages/0/src/components/Slider/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Slider/index.test.ts rename to packages/0/src/components/Slider/index.browser.test.ts diff --git a/packages/0/src/components/Snackbar/index.test.ts b/packages/0/src/components/Snackbar/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Snackbar/index.test.ts rename to packages/0/src/components/Snackbar/index.browser.test.ts diff --git a/packages/0/src/components/Splitter/index.test.ts b/packages/0/src/components/Splitter/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Splitter/index.test.ts rename to packages/0/src/components/Splitter/index.browser.test.ts diff --git a/packages/0/src/components/Step/index.test.ts b/packages/0/src/components/Step/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Step/index.test.ts rename to packages/0/src/components/Step/index.browser.test.ts diff --git a/packages/0/src/components/Switch/index.test.ts b/packages/0/src/components/Switch/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Switch/index.test.ts rename to packages/0/src/components/Switch/index.browser.test.ts diff --git a/packages/0/src/components/Tabs/index.test.ts b/packages/0/src/components/Tabs/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Tabs/index.test.ts rename to packages/0/src/components/Tabs/index.browser.test.ts diff --git a/packages/0/src/components/Theme/index.test.ts b/packages/0/src/components/Theme/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Theme/index.test.ts rename to packages/0/src/components/Theme/index.browser.test.ts diff --git a/packages/0/src/components/Toggle/index.test.ts b/packages/0/src/components/Toggle/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Toggle/index.test.ts rename to packages/0/src/components/Toggle/index.browser.test.ts diff --git a/packages/0/src/components/Treeview/index.test.ts b/packages/0/src/components/Treeview/index.browser.test.ts similarity index 100% rename from packages/0/src/components/Treeview/index.test.ts rename to packages/0/src/components/Treeview/index.browser.test.ts diff --git a/packages/0/test/commands.ts b/packages/0/test/commands.ts new file mode 100644 index 000000000..60ffd3e86 --- /dev/null +++ b/packages/0/test/commands.ts @@ -0,0 +1,60 @@ +/// + +import type { BrowserCommandContext } from 'vitest/node' + +async function drag (ctx: BrowserCommandContext, start: [number, number], ...moves: number[][]) { + const cdp = await ctx.provider.getCDPSession!(ctx.sessionId) + await cdp.send('Input.dispatchTouchEvent', { + type: 'touchStart', + touchPoints: [{ x: start[0], y: start[1] }], + }) + await cdp.send('Input.dispatchTouchEvent', { + type: 'touchMove', + touchPoints: [{ x: start[0], y: start[1] }], + }) + for (const move of moves) { + await cdp.send('Input.dispatchTouchEvent', { + type: 'touchMove', + touchPoints: [{ x: move[0], y: move[1] }], + }) + } + await cdp.send('Input.dispatchTouchEvent', { + type: 'touchEnd', + touchPoints: [{ x: moves.at(-1)[0], y: moves.at(-1)[1] }], + }) +} + +async function waitStable (ctx: BrowserCommandContext, selector: string) { + const el = ctx.iframe.locator(selector) + const handles = await el.elementHandles() + await Promise.all( + handles.map(h => Promise.any([ + h.waitForElementState('stable', { timeout: 1000 }), + h.waitForElementState('hidden', { timeout: 1000 }), + ])), + ) +} + +async function setFocusEmulationEnabled (ctx: BrowserCommandContext) { + const cdp = await ctx.provider.getCDPSession!(ctx.sessionId) + await cdp.send('Emulation.setFocusEmulationEnabled', { enabled: true }) +} + +async function setReduceMotionEnabled (ctx: BrowserCommandContext) { + await ctx.page.emulateMedia({ + reducedMotion: 'reduce', + }) +} + +export const commands = { + drag, + waitStable, + setFocusEmulationEnabled, + setReduceMotionEnabled, +} + +export type CustomCommands = { + [K in keyof typeof commands]: typeof commands[K] extends (ctx: any, ...args: infer A) => any + ? (...args: A) => any + : never +} diff --git a/packages/0/test/globals.d.ts b/packages/0/test/globals.d.ts new file mode 100644 index 000000000..56b5a536d --- /dev/null +++ b/packages/0/test/globals.d.ts @@ -0,0 +1,6 @@ +// Types +import type { CustomCommands } from './commands' + +declare module 'vitest/browser' { + interface BrowserCommands extends CustomCommands {} +} diff --git a/packages/0/test/index.ts b/packages/0/test/index.ts new file mode 100644 index 000000000..596d9d91c --- /dev/null +++ b/packages/0/test/index.ts @@ -0,0 +1,29 @@ +export { commands, page, userEvent } from 'vitest/browser' +export { cleanup, render, screen } from '@testing-library/vue' + +export function wait (timeout?: number) { + return new Promise(resolve => setTimeout(resolve, timeout)) +} + +export function waitAnimationFrame () { + return new Promise(resolve => requestAnimationFrame(resolve)) +} + +export function touch (element: Element) { + function trigger (eventName: string) { + return (clientX: number, clientY: number) => { + const touches = [{ clientX, clientY }] + const event = new Event(eventName) + ;(event as any).touches = touches + ;(event as any).changedTouches = touches + element.dispatchEvent(event) + return touch(element) + } + } + + return { + start: trigger('touchstart'), + move: trigger('touchmove'), + end: trigger('touchend'), + } +} diff --git a/packages/0/test/setup.ts b/packages/0/test/setup.ts new file mode 100644 index 000000000..3ae5bee81 --- /dev/null +++ b/packages/0/test/setup.ts @@ -0,0 +1,14 @@ +import './globals' + +import { cleanup } from '@testing-library/vue' +import { afterEach, beforeAll } from 'vitest' +import { commands } from 'vitest/browser' + +beforeAll(async () => { + await commands.setFocusEmulationEnabled() + await commands.setReduceMotionEnabled() +}) + +afterEach(() => { + cleanup() +}) diff --git a/packages/0/test/tsconfig.json b/packages/0/test/tsconfig.json new file mode 100644 index 000000000..197bfc739 --- /dev/null +++ b/packages/0/test/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "composite": false, + "noEmit": true + }, + "include": ["**/*.ts"] +} diff --git a/packages/0/vitest.browser.config.ts b/packages/0/vitest.browser.config.ts new file mode 100644 index 000000000..9c7898672 --- /dev/null +++ b/packages/0/vitest.browser.config.ts @@ -0,0 +1,47 @@ +import { fileURLToPath } from 'node:url' + +import { playwright } from '@vitest/browser-playwright' +import Vue from 'unplugin-vue/rolldown' +import { defineConfig } from 'vitest/config' + +import { commands } from './test/commands' + +export default defineConfig({ + resolve: { + alias: { + '@': fileURLToPath(new URL('src', import.meta.url)), + '@vuetify/v0': fileURLToPath(new URL('src', import.meta.url)), + '@vuetify/paper': fileURLToPath(new URL('../paper/src', import.meta.url)), + '@test': fileURLToPath(new URL('test/index.ts', import.meta.url)), + // internal + '#v0': fileURLToPath(new URL('src', import.meta.url)), + '#paper': fileURLToPath(new URL('../paper/src', import.meta.url)), + }, + }, + plugins: [Vue()], + define: { + __DEV__: 'process.env.NODE_ENV !== \'production\'', + __VITE_LOGGER_ENABLED__: 'process.env.VITE_LOGGER_ENABLED', + __VERSION__: '"0.0.1"', + }, + test: { + name: 'v0:browser', + globals: true, + include: ['**/*.browser.test.{ts,tsx}'], + testTimeout: 20_000, + setupFiles: ['./test/setup.ts'], + browser: { + enabled: true, + provider: playwright({ + actionTimeout: 5000, + contextOptions: { + reducedMotion: 'reduce', + }, + }), + headless: !process.env.TEST_BAIL, + commands, + instances: [{ browser: 'chromium' }], + viewport: { width: 1280, height: 800 }, + }, + }, +}) diff --git a/packages/0/vitest.config.ts b/packages/0/vitest.config.ts index b3fc33064..ff1d14982 100644 --- a/packages/0/vitest.config.ts +++ b/packages/0/vitest.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ '@': fileURLToPath(new URL('src', import.meta.url)), '@vuetify/v0': fileURLToPath(new URL('src', import.meta.url)), '@vuetify/paper': fileURLToPath(new URL('../paper/src', import.meta.url)), + '@test': fileURLToPath(new URL('test/index.ts', import.meta.url)), // internal '#v0': fileURLToPath(new URL('src', import.meta.url)), '#paper': fileURLToPath(new URL('../paper/src', import.meta.url)), @@ -21,10 +22,11 @@ export default defineConfig({ __VERSION__: '"0.0.1"', }, test: { - projects: ['packages/*'], + name: 'v0:unit', environment: 'happy-dom', globals: true, - include: ['**/*.{test,spec}.?(c|m)[jt]s?(x)'], + include: ['**/*.test.{ts,tsx}'], + exclude: ['**/*.browser.test.{ts,tsx}'], testTimeout: 20_000, }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e32df5a9e..a118d2cf6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,9 @@ catalogs: '@shikijs/themes': specifier: ^4.0.2 version: 4.0.2 + '@testing-library/vue': + specifier: ^8.1.0 + version: 8.1.0 '@tsconfig/node22': specifier: ^22.0.5 version: 22.0.5 @@ -60,6 +63,9 @@ catalogs: '@unhead/vue': specifier: ^2.1.12 version: 2.1.12 + '@vitest/browser-playwright': + specifier: ^4.1.2 + version: 4.1.2 '@vitest/coverage-v8': specifier: ^4.1.2 version: 4.1.2 @@ -102,6 +108,9 @@ catalogs: happy-dom: specifier: ^20.8.9 version: 20.8.9 + jsdom: + specifier: ^26.1.0 + version: 26.1.0 knip: specifier: ^6.1.0 version: 6.1.0 @@ -246,7 +255,7 @@ importers: version: 25.5.0 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.2(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2) '@vue/tsconfig': specifier: 'catalog:' version: 0.9.1(typescript@6.0.2)(vue@3.5.31(typescript@6.0.2)) @@ -264,7 +273,7 @@ importers: version: 10.1.0(jiti@2.6.1) eslint-config-vuetify: specifier: 'catalog:' - version: 4.5.0(@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))))(eslint-plugin-no-only-tests@3.3.0)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + version: 4.5.0(@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2))(eslint-plugin-no-only-tests@3.3.0)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) eslint-plugin-vuejs-accessibility: specifier: 'catalog:' version: 2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0) @@ -288,7 +297,7 @@ importers: version: 6.0.2 vitest: specifier: 'catalog:' - version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vue-tsc: specifier: 'catalog:' version: 3.2.6(typescript@6.0.2) @@ -544,12 +553,21 @@ importers: '@material/material-color-utilities': specifier: 'catalog:' version: 0.4.0 + '@testing-library/vue': + specifier: 'catalog:' + version: 8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@6.0.2)) + '@vitest/browser-playwright': + specifier: 'catalog:' + version: 4.1.2(playwright@1.59.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) '@vue/compiler-dom': specifier: 'catalog:' version: 3.5.31 '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 + jsdom: + specifier: 'catalog:' + version: 26.1.0 launchdarkly-js-client-sdk: specifier: 'catalog:' version: 3.9.0 @@ -640,6 +658,9 @@ packages: peerDependencies: '@types/json-schema': ^7.0.15 + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@asamuzakjp/css-color@5.1.1': resolution: {integrity: sha512-iGWN8E45Ws0XWx3D44Q1t6vX2LqhCKcwfmwBYCDsFrYFS6m4q/Ks61L2veETaLv+ckDC6+dTETJoaAAb7VjLiw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1170,6 +1191,9 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@blazediff/core@1.9.1': + resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} @@ -1213,10 +1237,21 @@ packages: conventional-commits-parser: optional: true + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-calc@3.1.1': resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} engines: {node: '>=20.19.0'} @@ -1224,6 +1259,13 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-color-parser@4.0.2': resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} engines: {node: '>=20.19.0'} @@ -1231,6 +1273,12 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms@4.0.0': resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} engines: {node: '>=20.19.0'} @@ -1245,6 +1293,10 @@ packages: css-tree: optional: true + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} @@ -2692,6 +2744,20 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + + '@testing-library/vue@8.1.0': + resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} + engines: {node: '>=14'} + peerDependencies: + '@vue/compiler-sfc': '>= 3' + vue: '>= 3' + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + '@ts-morph/common@0.28.1': resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} @@ -2723,6 +2789,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -3068,6 +3137,17 @@ packages: '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@vitest/browser-playwright@4.1.2': + resolution: {integrity: sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==} + peerDependencies: + playwright: '*' + vitest: 4.1.2 + + '@vitest/browser@4.1.2': + resolution: {integrity: sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==} + peerDependencies: + vitest: 4.1.2 + '@vitest/coverage-v8@4.1.2': resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} peerDependencies: @@ -3259,6 +3339,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -3279,6 +3363,9 @@ packages: args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -3463,6 +3550,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -3702,6 +3793,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + cssstyle@6.2.0: resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} engines: {node: '>=20'} @@ -3865,6 +3960,10 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -3904,6 +4003,10 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3947,6 +4050,9 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4040,6 +4146,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} @@ -4371,6 +4480,11 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + 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} @@ -4555,6 +4669,10 @@ packages: hsluv@1.0.1: resolution: {integrity: sha512-zCaFTiDqBLQjCCFBu0qg7z9ASYPd+Bxx2GDCVZJsnehjK80S+jByqhuFz0pCd2Aw3FSKr18AWbRlwnKR0YdizQ==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4643,6 +4761,10 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -4848,6 +4970,15 @@ packages: resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} engines: {node: '>=20.0.0'} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsdom@28.1.0: resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -5073,6 +5204,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-regexp@0.10.0: resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} @@ -5278,6 +5413,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nypm@0.6.5: resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} engines: {node: '>=18'} @@ -5287,6 +5425,10 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -5369,6 +5511,9 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -5435,10 +5580,24 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-core@1.59.0: + resolution: {integrity: sha512-PW/X/IoZ6BMUUy8rpwHEZ8Kc0IiLIkgKYGNFaMs5KmQhcfLILNx9yCQD0rnWeWfz1PNeqcFP1BsihQhDOBCwZw==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.0: + resolution: {integrity: sha512-wihGScriusvATUxmhfENxg0tj1vHEFeIwxlnPFKQTOQVd7aG08mUfvvniRP/PtQOC+2Bs52kBOC/Up1jTXeIbw==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + pnpm-workspace-yaml@1.6.0: resolution: {integrity: sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==} @@ -5502,6 +5661,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -5539,6 +5702,9 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + read-package-up@11.0.0: resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} engines: {node: '>=18'} @@ -5680,6 +5846,9 @@ packages: roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6162,9 +6331,16 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@7.0.27: resolution: {integrity: sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==} + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tldts@7.0.27: resolution: {integrity: sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==} hasBin: true @@ -6177,6 +6353,10 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} @@ -6184,6 +6364,10 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -6694,6 +6878,10 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -6701,14 +6889,27 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@16.0.1: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -6888,6 +7089,14 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.1 + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@asamuzakjp/css-color@5.1.1': dependencies: '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) @@ -7584,6 +7793,8 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@blazediff/core@1.9.1': {} + '@braintree/sanitize-url@7.1.2': {} '@bramus/specificity@2.4.2': @@ -7627,13 +7838,27 @@ snapshots: conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.4.0 + '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.0.2': {} + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -7641,6 +7866,10 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-tokenizer': 4.0.0 @@ -7649,6 +7878,8 @@ snapshots: optionalDependencies: css-tree: 3.2.1 + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} '@emnapi/core@1.9.0': @@ -8725,6 +8956,26 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@testing-library/dom@9.3.4': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@6.0.2))': + dependencies: + '@babel/runtime': 7.29.2 + '@testing-library/dom': 9.3.4 + '@vue/test-utils': 2.4.6 + vue: 3.5.31(typescript@6.0.2) + optionalDependencies: + '@vue/compiler-sfc': 3.5.31 + '@ts-morph/common@0.28.1': dependencies: minimatch: 10.2.4 @@ -8755,6 +9006,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -9236,7 +9489,37 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': + '@vitest/browser-playwright@4.1.2(playwright@1.59.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': + dependencies: + '@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + playwright: 1.59.0 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/utils': 4.1.2 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -9248,15 +9531,17 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) - '@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': + '@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2)': dependencies: '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.1.0(jiti@2.6.1) optionalDependencies: typescript: 6.0.2 - vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color optional: true @@ -9492,6 +9777,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.2.0: {} @@ -9508,6 +9795,10 @@ snapshots: args-tokenizer@0.3.0: {} + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -9710,6 +10001,11 @@ snapshots: chai@6.2.2: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -9945,6 +10241,11 @@ snapshots: cssesc@3.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + cssstyle@6.2.0: dependencies: '@asamuzakjp/css-color': 5.1.1 @@ -10138,6 +10439,11 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.23 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 @@ -10177,6 +10483,27 @@ snapshots: dependencies: mimic-response: 3.1.0 + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + es-get-iterator: 1.1.3 + get-intrinsic: 1.3.0 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -10213,6 +10540,8 @@ snapshots: diff-sequences@27.5.1: {} + dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -10350,6 +10679,18 @@ snapshots: es-errors@1.3.0: {} + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + is-arguments: 1.2.0 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.1.1 + isarray: 2.0.5 + stop-iteration-iterator: 1.1.0 + es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: @@ -10418,7 +10759,7 @@ snapshots: '@eslint/compat': 2.0.3(eslint@10.1.0(jiti@2.6.1)) eslint: 10.1.0(jiti@2.6.1) - eslint-config-vuetify@4.5.0(@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))))(eslint-plugin-no-only-tests@3.3.0)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2): + eslint-config-vuetify@4.5.0(@vitest/eslint-plugin@1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2))(eslint-plugin-no-only-tests@3.3.0)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2): dependencies: '@clack/prompts': 1.1.0 '@eslint/eslintrc': 3.3.5 @@ -10449,7 +10790,7 @@ snapshots: vue-eslint-parser: 10.4.0(eslint@10.1.0(jiti@2.6.1)) yaml-eslint-parser: 2.0.0 optionalDependencies: - '@vitest/eslint-plugin': 1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + '@vitest/eslint-plugin': 1.3.4(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)(vitest@4.1.2) eslint-plugin-no-only-tests: 3.3.0 eslint-plugin-vuejs-accessibility: 2.5.0(eslint@10.1.0(jiti@2.6.1))(globals@17.4.0) transitivePeerDependencies: @@ -10760,6 +11101,9 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -10980,6 +11324,10 @@ snapshots: hsluv@1.0.1: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.15.0 @@ -11070,6 +11418,11 @@ snapshots: internmap@2.0.3: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -11264,6 +11617,33 @@ snapshots: jsdoc-type-pratt-parser@7.1.1: {} + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.23 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.20.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsdom@28.1.0: dependencies: '@acemir/cssom': 0.9.31 @@ -11492,6 +11872,8 @@ snapshots: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + magic-regexp@0.10.0: dependencies: estree-walker: 3.0.3 @@ -11719,6 +12101,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.23: {} + nypm@0.6.5: dependencies: citty: 0.2.1 @@ -11727,6 +12111,11 @@ snapshots: object-inspect@1.13.4: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + object-keys@1.1.1: {} object.assign@4.1.7: @@ -11894,6 +12283,10 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parse5@8.0.0: dependencies: entities: 6.0.1 @@ -11954,8 +12347,18 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + playwright-core@1.59.0: {} + + playwright@1.59.0: + dependencies: + playwright-core: 1.59.0 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} + pngjs@7.0.0: {} + pnpm-workspace-yaml@1.6.0: dependencies: yaml: 2.8.3 @@ -12018,6 +12421,12 @@ snapshots: pretty-bytes@6.1.1: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + property-information@7.1.0: {} proto-list@1.2.4: {} @@ -12055,6 +12464,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + react-is@17.0.2: {} + read-package-up@11.0.0: dependencies: find-up-simple: 1.0.1 @@ -12255,6 +12666,8 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 + rrweb-cssom@0.8.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -12735,8 +13148,14 @@ snapshots: tinyrainbow@3.1.0: {} + tldts-core@6.1.86: {} + tldts-core@7.0.27: {} + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tldts@7.0.27: dependencies: tldts-core: 7.0.27 @@ -12747,6 +13166,10 @@ snapshots: totalist@3.0.1: {} + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + tough-cookie@6.0.1: dependencies: tldts: 7.0.27 @@ -12755,6 +13178,10 @@ snapshots: dependencies: punycode: 2.3.1 + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -13190,7 +13617,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(happy-dom@20.8.9)(jsdom@28.1.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -13215,6 +13642,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.5.0 + '@vitest/browser-playwright': 4.1.2(playwright@1.59.0)(vite@8.0.3(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) happy-dom: 20.8.9 jsdom: 28.1.0 transitivePeerDependencies: @@ -13317,14 +13745,27 @@ snapshots: webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} + webidl-conversions@8.0.1: {} webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@16.0.1: dependencies: '@exodus/bytes': 1.15.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a11206a1d..739570449 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,12 +18,14 @@ catalog: '@shikijs/langs': ^4.0.2 '@shikijs/markdown-it': ^4.0.2 '@shikijs/themes': ^4.0.2 + '@testing-library/vue': ^8.1.0 '@tsconfig/node22': ^22.0.5 '@tsdown/css': ^0.21.7 '@types/markdown-it-attrs': ^4.1.3 '@types/node': ^25.5.0 '@unhead/addons': ^2.1.12 '@unhead/vue': ^2.1.12 + '@vitest/browser-playwright': ^4.1.2 '@vitest/coverage-v8': ^4.1.2 '@vue/compiler-dom': ^3.5.31 '@vue/repl': ^4.7.1 @@ -38,6 +40,7 @@ catalog: eslint-plugin-vuejs-accessibility: ^2.5.0 fflate: ^0.8.2 happy-dom: ^20.8.9 + jsdom: ^26.1.0 knip: ^6.1.0 launchdarkly-js-client-sdk: ^3.9.0 markdown-it-anchor: ^9.2.0 diff --git a/vitest.config.ts b/vitest.config.ts index 885ebc8c0..be43188ac 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,12 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { - projects: ['packages/*', 'apps/docs'], + projects: [ + 'packages/0', + 'packages/0/vitest.browser.config.ts', + 'packages/paper', + 'apps/docs', + ], globals: true, include: ['**/*.{test,spec}.?(c|m)[jt]s?(x)'], testTimeout: 20_000, @@ -12,6 +17,7 @@ export default defineConfig({ include: ['packages/0/src/**/*.ts', 'packages/0/src/**/*.vue'], exclude: [ '**/*.test.ts', + '**/*.browser.test.ts', '**/*.spec.ts', '**/*.bench.ts', '**/*.d.ts',