diff --git a/packages/0/package.json b/packages/0/package.json index e75e5c11b..2d9fe4f29 100644 --- a/packages/0/package.json +++ b/packages/0/package.json @@ -19,7 +19,10 @@ "build:tsdown": "tsdown", "build:web-types": "tsx scripts/generate-web-types.ts", "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": { @@ -112,9 +115,12 @@ "@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:", "concurrently": "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 e031cfbe2..27df5fce3 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 { ClientComboboxAdapter } from '#v0/composables/createCombobox/adapters/client' @@ -9,12 +9,6 @@ import { Combobox } from './index' import { mount } from '@vue/test-utils' import { defineComponent, h, nextTick, ref } from 'vue' -// Mock showPopover/hidePopover — not supported in happy-dom -beforeEach(() => { - HTMLElement.prototype.showPopover = vi.fn() - HTMLElement.prototype.hidePopover = vi.fn() -}) - // Track every mounted wrapper so afterEach can unmount each one. Without // unmount, attachTo: document.body leaks both DOM nodes and Vue effect scopes // (including useDocumentEventListener subscriptions) across tests, which 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 f2535c92b..56939d39e 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 { createSSRApp, defineComponent, h, nextTick, ref } from 'vue' // 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 64312e183..126f00245 100644 --- a/packages/0/src/components/Popover/index.test.ts +++ b/packages/0/src/components/Popover/index.browser.test.ts @@ -390,7 +390,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 7305303f4..7cf9f1a54 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' import { Select } from './index' @@ -6,12 +6,6 @@ import { Select } from './index' import { mount } from '@vue/test-utils' import { defineComponent, h, nextTick, ref } from 'vue' -// 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 dcaa1423c..a5a83b0f4 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,11 +22,13 @@ export default defineConfig({ __VERSION__: '"0.0.1"', }, test: { + name: 'v0:unit', projects: ['packages/*'], environment: 'happy-dom', pool: 'vmThreads', globals: true, include: ['**/*.{test,spec}.?(c|m)[jt]s?(x)'], + exclude: ['**/*.browser.test.{ts,tsx}'], setupFiles: ['./vitest.setup.ts'], testTimeout: 20_000, coverage: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a97f28389..0eac1cf00 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/node24': specifier: ^24.0.4 version: 24.0.4 @@ -63,6 +66,9 @@ catalogs: '@unhead/vue': specifier: ^2.1.13 version: 2.1.13 + '@vitest/browser-playwright': + specifier: ^4.1.5 + version: 4.1.5 '@vitest/coverage-v8': specifier: ^4.1.5 version: 4.1.5 @@ -111,6 +117,9 @@ catalogs: happy-dom: specifier: ^20.9.0 version: 20.9.0 + jsdom: + specifier: ^26.1.0 + version: 26.1.0 knip: specifier: ^6.11.0 version: 6.11.0 @@ -264,7 +273,7 @@ importers: version: 25.6.0 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.5(vitest@4.1.5) + version: 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5) '@vue/tsconfig': specifier: 'catalog:' version: 0.9.1(typescript@6.0.3)(vue@3.5.33(typescript@6.0.3)) @@ -309,7 +318,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vue-tsc: specifier: 'catalog:' version: 3.2.7(typescript@6.0.3) @@ -577,6 +586,12 @@ importers: '@material/material-color-utilities': specifier: 'catalog:' version: 0.4.0 + '@testing-library/vue': + specifier: 'catalog:' + version: 8.1.0(@vue/compiler-dom@3.5.33)(@vue/compiler-sfc@3.5.33)(@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)) + '@vitest/browser-playwright': + specifier: 'catalog:' + version: 4.1.5(playwright@1.59.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5) '@vue/compiler-dom': specifier: 'catalog:' version: 3.5.33 @@ -586,6 +601,9 @@ importers: concurrently: specifier: 'catalog:' version: 9.2.1 + jsdom: + specifier: 'catalog:' + version: 26.1.0 launchdarkly-js-client-sdk: specifier: 'catalog:' version: 3.9.1 @@ -688,6 +706,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} @@ -1218,6 +1239,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==} @@ -1261,10 +1285,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'} @@ -1272,6 +1307,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'} @@ -1279,6 +1321,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'} @@ -1293,6 +1341,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'} @@ -2783,6 +2835,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==} @@ -2814,6 +2880,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==} @@ -3127,6 +3196,17 @@ packages: '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@vitest/browser-playwright@4.1.5': + resolution: {integrity: sha512-CWy0lBQJq97nionyJJdnaU4961IXTl43a7UCu5nHy51IoKxAt6PVIJLo+76rVl7KOOgcWHNkG4kbJu/pW7knvA==} + peerDependencies: + playwright: '*' + vitest: 4.1.5 + + '@vitest/browser@4.1.5': + resolution: {integrity: sha512-iCDGI8c4yg+xmjUg2VsygdAUSIIB4x5Rht/P68OXy1hPELKXHDkzh87lkuTcdYmemRChDkEpB426MmDjzC0ziA==} + peerDependencies: + vitest: 4.1.5 + '@vitest/coverage-v8@4.1.5': resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} peerDependencies: @@ -3369,6 +3449,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'} @@ -3389,6 +3473,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'} @@ -3831,6 +3918,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'} @@ -3994,6 +4085,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} @@ -4037,6 +4132,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==} @@ -4083,6 +4182,9 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4176,6 +4278,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==} @@ -4510,6 +4615,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} @@ -4697,6 +4807,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} @@ -4785,6 +4899,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'} @@ -4994,6 +5112,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} @@ -5215,6 +5342,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==} @@ -5423,6 +5554,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'} @@ -5432,6 +5566,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'} @@ -5514,6 +5652,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==} @@ -5587,10 +5728,24 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + 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==} @@ -5658,6 +5813,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==} @@ -5709,6 +5868,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'} @@ -5854,6 +6016,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==} @@ -6356,9 +6521,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 @@ -6371,6 +6543,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'} @@ -6378,6 +6554,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'} @@ -6924,6 +7104,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'} @@ -6931,14 +7115,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} @@ -7152,6 +7349,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) @@ -7848,6 +8053,8 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@blazediff/core@1.9.1': {} + '@braintree/sanitize-url@7.1.2': {} '@bramus/specificity@2.4.2': @@ -7894,13 +8101,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 @@ -7908,6 +8129,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 @@ -7916,6 +8141,8 @@ snapshots: optionalDependencies: css-tree: 3.2.1 + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} '@emnapi/core@1.10.0': @@ -9037,6 +9264,29 @@ 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-dom@3.5.33)(@vue/compiler-sfc@3.5.33)(@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3))': + dependencies: + '@babel/runtime': 7.29.2 + '@testing-library/dom': 9.3.4 + '@vue/test-utils': 2.4.10(@vue/compiler-dom@3.5.33)(@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)) + vue: 3.5.33(typescript@6.0.3) + optionalDependencies: + '@vue/compiler-sfc': 3.5.33 + transitivePeerDependencies: + - '@vue/compiler-dom' + - '@vue/server-renderer' + '@ts-morph/common@0.28.1': dependencies: minimatch: 10.2.4 @@ -9065,6 +9315,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 @@ -9492,7 +9744,37 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': + '@vitest/browser-playwright@4.1.5(playwright@1.59.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5)': + dependencies: + '@vitest/browser': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5) + '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + playwright: 1.59.1 + tinyrainbow: 3.1.0 + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@26.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/utils': 4.1.5 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@26.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.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.5(@vitest/browser@4.1.5)(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.5 @@ -9504,7 +9786,9 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@26.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@vitest/browser': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5) '@vitest/eslint-plugin@1.3.4(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)(vitest@4.1.5)': dependencies: @@ -9512,7 +9796,7 @@ snapshots: eslint: 10.3.0(jiti@2.6.1) optionalDependencies: typescript: 6.0.3 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color optional: true @@ -9838,6 +10122,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.2.0: {} @@ -9854,6 +10140,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: @@ -9949,7 +10239,7 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.8 + postcss: 8.5.14 postcss-media-query-parser: 0.2.3 optional: true @@ -10315,6 +10605,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 @@ -10508,6 +10803,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 @@ -10549,6 +10849,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: {} @@ -10587,6 +10908,8 @@ snapshots: diff-sequences@29.6.3: {} + dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -10724,6 +11047,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: @@ -11135,6 +11470,9 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -11359,6 +11697,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 @@ -11449,6 +11791,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 @@ -11645,6 +11992,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 @@ -11865,6 +12239,8 @@ snapshots: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + magic-regexp@0.10.0: dependencies: estree-walker: 3.0.3 @@ -12094,6 +12470,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.23: {} + nypm@0.6.5: dependencies: citty: 0.2.1 @@ -12102,6 +12480,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: @@ -12266,6 +12649,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 @@ -12344,8 +12731,18 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + playwright-core@1.59.1: {} + + playwright@1.59.1: + dependencies: + playwright-core: 1.59.1 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} + pngjs@7.0.0: {} + pnpm-workspace-yaml@1.6.0: dependencies: yaml: 2.8.3 @@ -12414,6 +12811,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: {} @@ -12468,6 +12871,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 @@ -12667,6 +13072,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 @@ -13160,8 +13567,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 @@ -13172,6 +13585,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 @@ -13180,6 +13597,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 @@ -13335,7 +13756,7 @@ snapshots: unhead@2.1.12: dependencies: - hookable: 6.1.0 + hookable: 6.1.1 unhead@2.1.13: dependencies: @@ -13635,7 +14056,39 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@26.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.1.1 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@types/node': 25.6.0 + '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5) + '@vitest/coverage-v8': 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5) + happy-dom: 20.9.0 + jsdom: 26.1.0 + transitivePeerDependencies: + - msw + + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(jsdom@28.1.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -13660,7 +14113,8 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.6.0 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.5) + '@vitest/coverage-v8': 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5) happy-dom: 20.9.0 jsdom: 28.1.0 transitivePeerDependencies: @@ -13773,14 +14227,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 3b27b2284..7296b811b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,6 +18,7 @@ catalog: '@shikijs/langs': ^4.0.2 '@shikijs/markdown-it': ^4.0.2 '@shikijs/themes': ^4.0.2 + '@testing-library/vue': ^8.1.0 '@tsconfig/node24': ^24.0.4 '@tsdown/css': ^0.21.10 '@types/markdown-it': ^14.1.2 @@ -25,6 +26,7 @@ catalog: '@types/markdown-it-footnote': ^3.0.4 '@types/node': ^25.6.0 '@unhead/vue': ^2.1.13 + '@vitest/browser-playwright': ^4.1.5 '@vitest/coverage-v8': ^4.1.5 '@vue/compiler-dom': ^3.5.33 '@vue/repl': ^4.7.1 @@ -41,6 +43,7 @@ catalog: eslint-plugin-vuejs-accessibility: ^2.5.0 fflate: ^0.8.2 happy-dom: ^20.9.0 + jsdom: ^26.1.0 knip: ^6.11.0 launchdarkly-js-client-sdk: ^3.9.1 markdown-it: ^14.1.1 diff --git a/vitest.config.ts b/vitest.config.ts index 51285ae6f..5b956d4c7 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',