From d00beb4d600663835135828e0d8660e127cea1d1 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Mon, 6 Jul 2026 04:57:53 +0000 Subject: [PATCH 1/2] feat(core): add Storybook for dock shells, frames, and overlays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set up Storybook 10 (@storybook/vue3-vite) in packages/core with stories covering the embedded dock (float/edge), the standalone/static dock, floating popovers, view frames (iframe/launcher/json-render), the command palette, toast/confirm overlays, and the built-in settings/messages/terminals views. Stories drive the real createDocksContext through an in-memory mock RPC client (createSharedState-backed) plus fixtures, so they exercise production state code. Make the webcomponents entry side-effect-free: DockEmbedded/DockStandalone now export pure custom-element constructors plus explicit registerDockEmbedded/ registerDockStandalone functions, and consumers (inject, popup) register before constructing — honoring the package's sideEffects:false. Add resetMessagesState/ resetTerminalsState seams so the shared singletons don't leak between stories. Add a Storybook build job to CI. --- .github/workflows/ci.yml | 22 + packages/core/.storybook/main.ts | 39 + packages/core/.storybook/preview.css | 19 + packages/core/.storybook/preview.ts | 55 + packages/core/.storybook/uno.config.ts | 54 + packages/core/package.json | 8 +- packages/core/src/client/inject/index.ts | 3 +- .../webcomponents/components/DockEmbedded.ts | 24 +- .../components/DockStandalone.ts | 25 +- .../client/webcomponents/state/messages.ts | 9 + .../src/client/webcomponents/state/popup.ts | 4 +- .../client/webcomponents/state/terminals.ts | 10 + .../stories/BuiltinViews.stories.ts | 108 ++ .../stories/CommandPalette.stories.ts | 40 + .../stories/DockEmbedded.stories.ts | 81 + .../stories/DockStandalone.stories.ts | 54 + .../webcomponents/stories/Floating.stories.ts | 134 ++ .../webcomponents/stories/Overlays.stories.ts | 62 + .../webcomponents/stories/Views.stories.ts | 82 + .../stories/mock/create-context.test.ts | 46 + .../stories/mock/create-context.ts | 72 + .../webcomponents/stories/mock/fixtures.ts | 117 ++ .../stories/mock/json-render-spec.ts | 57 + .../webcomponents/stories/mock/messages.ts | 52 + .../webcomponents/stories/mock/mock-rpc.ts | 110 ++ .../webcomponents/stories/mock/terminals.ts | 36 + .../webcomponents/stories/story-utils.ts | 54 + pnpm-lock.yaml | 1397 ++++++++++++++++- pnpm-workspace.yaml | 3 + .../client/webcomponents.snapshot.d.ts | 8 + .../devtools/client/webcomponents.snapshot.js | 7 + 31 files changed, 2749 insertions(+), 43 deletions(-) create mode 100644 packages/core/.storybook/main.ts create mode 100644 packages/core/.storybook/preview.css create mode 100644 packages/core/.storybook/preview.ts create mode 100644 packages/core/.storybook/uno.config.ts create mode 100644 packages/core/src/client/webcomponents/stories/BuiltinViews.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/CommandPalette.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/DockEmbedded.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/DockStandalone.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/Floating.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/Overlays.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/Views.stories.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/create-context.test.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/create-context.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/fixtures.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/json-render-spec.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/messages.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/mock-rpc.ts create mode 100644 packages/core/src/client/webcomponents/stories/mock/terminals.ts create mode 100644 packages/core/src/client/webcomponents/stories/story-utils.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 539d81a6..1f9f3c1c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,3 +101,25 @@ jobs: - name: E2E run: nr test:e2e + + storybook: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + + - name: Install pnpm + uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 + + - name: Set node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e + with: + node-version: lts/* + + - name: Setup + run: npm i -g @antfu/ni + + - name: Install + run: nci + + - name: Build Storybook + run: pnpm -C packages/core run build:storybook diff --git a/packages/core/.storybook/main.ts b/packages/core/.storybook/main.ts new file mode 100644 index 00000000..c3b7e728 --- /dev/null +++ b/packages/core/.storybook/main.ts @@ -0,0 +1,39 @@ +import type { StorybookConfig } from '@storybook/vue3-vite' +import { fileURLToPath } from 'node:url' +import Vue from '@vitejs/plugin-vue' +import UnoCSS from 'unocss/vite' +import { mergeConfig } from 'vite' +import { alias } from '../../../alias' + +const config: StorybookConfig = { + stories: [ + '../src/client/**/*.stories.@(ts|tsx)', + ], + addons: [], + framework: { + name: '@storybook/vue3-vite', + options: {}, + }, + core: { + disableTelemetry: true, + }, + async viteFinal(base) { + return mergeConfig(base, { + define: { + // The webcomponents entry branches on this flag to import the local + // source instead of the published dist. Stories always run against + // source, so pin it on. + 'import.meta.env.VITE_DEVTOOLS_LOCAL_DEV': JSON.stringify('true'), + }, + resolve: { + alias, + }, + plugins: [ + Vue(), + UnoCSS(fileURLToPath(new URL('./uno.config.ts', import.meta.url))), + ], + }) + }, +} + +export default config diff --git a/packages/core/.storybook/preview.css b/packages/core/.storybook/preview.css new file mode 100644 index 00000000..2ba2f8c7 --- /dev/null +++ b/packages/core/.storybook/preview.css @@ -0,0 +1,19 @@ +/* Storybook-only chrome. Production styling lives in the shadow-DOM CSS blob. */ +html, +body, +#storybook-root { + height: 100%; + margin: 0; + padding: 0; +} + +.vite-devtools-storybook-root { + min-height: 100vh; + font-family: + ui-sans-serif, + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + sans-serif; +} diff --git a/packages/core/.storybook/preview.ts b/packages/core/.storybook/preview.ts new file mode 100644 index 00000000..ad78221f --- /dev/null +++ b/packages/core/.storybook/preview.ts @@ -0,0 +1,55 @@ +import type { Preview } from '@storybook/vue3-vite' +import { h } from 'vue' + +import '@unocss/reset/tailwind.css' +import '@xterm/xterm/css/xterm.css' +import 'uno.css' +import './preview.css' + +type Theme = 'dark' | 'light' + +function applyTheme(theme: Theme) { + const root = document.documentElement + root.classList.toggle('dark', theme === 'dark') + root.style.colorScheme = theme +} + +const preview: Preview = { + parameters: { + layout: 'fullscreen', + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, + globalTypes: { + theme: { + description: 'DevTools color theme', + toolbar: { + title: 'Theme', + icon: 'circlehollow', + items: [ + { value: 'dark', title: 'Dark', icon: 'moon' }, + { value: 'light', title: 'Light', icon: 'sun' }, + ], + dynamicTitle: true, + }, + }, + }, + initialGlobals: { + theme: 'dark', + }, + decorators: [ + (story, context) => { + applyTheme((context.globals.theme as Theme) ?? 'dark') + return { + components: { story }, + render: () => h('div', { class: 'vite-devtools-storybook-root color-base bg-base' }, [h(story)]), + } + }, + ], +} + +export default preview diff --git a/packages/core/.storybook/uno.config.ts b/packages/core/.storybook/uno.config.ts new file mode 100644 index 00000000..965d23cf --- /dev/null +++ b/packages/core/.storybook/uno.config.ts @@ -0,0 +1,54 @@ +import { fileURLToPath } from 'node:url' +import { sharedShortcuts } from '@vitejs/devtools-ui/unocss/shared-shortcuts' +import { theme } from '@vitejs/devtools-ui/unocss/theme' +import { + defineConfig, + presetIcons, + presetWind3, + transformerDirectives, +} from 'unocss' + +// Mirrors the webcomponents UnoCSS config (`src/client/webcomponents/uno.config.ts`) +// with two Storybook-specific tweaks: +// 1. `dark: 'class'` so a toolbar toggle can flip the theme via a `.dark` +// class (production uses `media`, baked into the shadow-DOM CSS blob). +// 2. filesystem scanning of the component sources + stories, since the +// components render in the light DOM here and UnoCSS runs live. +export default defineConfig({ + shortcuts: [ + ...sharedShortcuts, + { + 'z-viewframe': 'z-20', + 'z-viewframe-resizer': 'z-30', + 'z-floating-dock': 'z-50', + 'z-floating-anchor': 'z-[2147483644]', + 'z-floating-tooltip': 'z-[2147483645]', + 'z-command-palette': 'z-[2147483646]', + }, + ], + transformers: [ + transformerDirectives(), + ], + theme: { + colors: theme.colors, + }, + presets: [ + presetWind3({ + dark: 'class', + variablePrefix: 'vdt-', + }), + presetIcons({ + warn: true, + collections: { + logos: () => import('@iconify-json/logos').then(i => i.icons), + ph: () => import('@iconify-json/ph').then(i => i.icons), + }, + }), + ], + content: { + filesystem: [ + fileURLToPath(new URL('../src/client/webcomponents/components/**/*.{vue,ts}', import.meta.url)), + fileURLToPath(new URL('../src/client/**/*.stories.ts', import.meta.url)), + ], + }, +}) diff --git a/packages/core/package.json b/packages/core/package.json index 82712a10..64ba2100 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -50,7 +50,9 @@ "play:debug": "pnpm -C playground run dev:debug", "play:standalone": "DEBUG='vite:devtools:*' pnpm -C playground run dev:standalone", "cli": "DEBUG='vite:devtools:*' tsx src/node/cli.ts", - "play:build": "pnpm -C playground run build" + "play:build": "pnpm -C playground run build", + "storybook": "storybook dev -p 6006 --host 0.0.0.0", + "build:storybook": "storybook build -o dist/storybook" }, "peerDependencies": { "vite": "*" @@ -72,6 +74,8 @@ }, "devDependencies": { "@clack/prompts": "catalog:inlined", + "@storybook/vue3-vite": "catalog:devtools", + "@unocss/reset": "catalog:build", "@vitejs/devtools-rolldown": "workspace:*", "@vitejs/plugin-vue": "catalog:build", "@xterm/addon-fit": "catalog:frontend", @@ -80,8 +84,10 @@ "fuse.js": "catalog:frontend", "human-id": "catalog:inlined", "iframe-pane": "catalog:frontend", + "storybook": "catalog:devtools", "tsdown": "catalog:build", "typescript": "catalog:devtools", + "unocss": "catalog:build", "unplugin-vue": "catalog:build", "unrun": "catalog:build", "vite": "catalog:build", diff --git a/packages/core/src/client/inject/index.ts b/packages/core/src/client/inject/index.ts index 44573c0a..9417f32b 100644 --- a/packages/core/src/client/inject/index.ts +++ b/packages/core/src/client/inject/index.ts @@ -38,10 +38,11 @@ export async function init(): Promise { ) ;(globalThis as any)[CLIENT_CONTEXT_KEY] = context - const { DockEmbedded } = import.meta.env.VITE_DEVTOOLS_LOCAL_DEV + const { registerDockEmbedded } = import.meta.env.VITE_DEVTOOLS_LOCAL_DEV ? await import('../webcomponents') : await import('@vitejs/devtools/client/webcomponents') + const DockEmbedded = registerDockEmbedded() const dockEl = new DockEmbedded({ context }) document.body.appendChild(dockEl) } diff --git a/packages/core/src/client/webcomponents/components/DockEmbedded.ts b/packages/core/src/client/webcomponents/components/DockEmbedded.ts index f08fa9ed..e81b0720 100644 --- a/packages/core/src/client/webcomponents/components/DockEmbedded.ts +++ b/packages/core/src/client/webcomponents/components/DockEmbedded.ts @@ -4,6 +4,16 @@ import { defineCustomElement } from 'vue' import css from '../.generated/css' import Component from './dock/DockEmbedded.vue' +export const DOCK_EMBEDDED_TAG = 'vite-devtools-dock-embedded' + +/** + * The embedded dock custom-element constructor. + * + * `defineCustomElement` is pure — it only builds the class. Registering the + * element with the global `customElements` registry is deferred to + * {@link registerDockEmbedded} so importing this module stays side-effect-free + * (honoring the package's `sideEffects: false`). + */ export const DockEmbedded = defineCustomElement( Component, { @@ -14,4 +24,16 @@ export const DockEmbedded = defineCustomElement( context: DocksContext }> -customElements.define('vite-devtools-dock-embedded', DockEmbedded) +/** + * Register the embedded dock as a custom element and return its constructor. + * + * Idempotent and safe to call in environments without a `customElements` + * registry (returns the constructor unchanged). Instantiating the constructor + * with `new` requires the element to be registered first, so call this before + * constructing one. + */ +export function registerDockEmbedded(): VueElementConstructor<{ context: DocksContext }> { + if (typeof customElements !== 'undefined' && !customElements.get(DOCK_EMBEDDED_TAG)) + customElements.define(DOCK_EMBEDDED_TAG, DockEmbedded) + return DockEmbedded +} diff --git a/packages/core/src/client/webcomponents/components/DockStandalone.ts b/packages/core/src/client/webcomponents/components/DockStandalone.ts index 8614ac1b..facf199c 100644 --- a/packages/core/src/client/webcomponents/components/DockStandalone.ts +++ b/packages/core/src/client/webcomponents/components/DockStandalone.ts @@ -4,6 +4,16 @@ import { defineCustomElement } from 'vue' import css from '../.generated/css' import Component from './dock/DockStandalone.vue' +export const DOCK_STANDALONE_TAG = 'vite-devtools-dock-standalone' + +/** + * The standalone dock custom-element constructor. + * + * `defineCustomElement` is pure — it only builds the class. Registering the + * element with the global `customElements` registry is deferred to + * {@link registerDockStandalone} so importing this module stays + * side-effect-free (honoring the package's `sideEffects: false`). + */ export const DockStandalone = defineCustomElement( Component, { @@ -14,5 +24,16 @@ export const DockStandalone = defineCustomElement( context: DocksContext }> -if (!customElements.get('vite-devtools-dock-standalone')) - customElements.define('vite-devtools-dock-standalone', DockStandalone) +/** + * Register the standalone dock as a custom element and return its constructor. + * + * Idempotent and safe to call in environments without a `customElements` + * registry (returns the constructor unchanged). Instantiating the constructor + * with `new` requires the element to be registered first, so call this before + * constructing one. + */ +export function registerDockStandalone(): VueElementConstructor<{ context: DocksContext }> { + if (typeof customElements !== 'undefined' && !customElements.get(DOCK_STANDALONE_TAG)) + customElements.define(DOCK_STANDALONE_TAG, DockStandalone) + return DockStandalone +} diff --git a/packages/core/src/client/webcomponents/state/messages.ts b/packages/core/src/client/webcomponents/state/messages.ts index 14a5794f..22d6c08f 100644 --- a/packages/core/src/client/webcomponents/state/messages.ts +++ b/packages/core/src/client/webcomponents/state/messages.ts @@ -74,6 +74,15 @@ export function useMessages(context: DocksContext): Reactive { return state } +/** + * Reset the module-level messages singleton. Intended for tests and stories, + * which share one module graph — call before re-initializing `useMessages` + * with a fresh context so state doesn't leak between scenarios. + */ +export function resetMessagesState(): void { + _messagesState = undefined +} + export function markMessagesAsRead(): void { if (_messagesState) _messagesState.unreadCount = 0 diff --git a/packages/core/src/client/webcomponents/state/popup.ts b/packages/core/src/client/webcomponents/state/popup.ts index b459ef86..cc09751e 100644 --- a/packages/core/src/client/webcomponents/state/popup.ts +++ b/packages/core/src/client/webcomponents/state/popup.ts @@ -27,7 +27,7 @@ let detachColorModeSync: (() => void) | undefined let popupDockElement: (HTMLElement & { remove: () => void }) | undefined let popupContext: DocksContext | undefined let loadDockStandalone: () => Promise HTMLElement> = async () => { - return await import('../components/DockStandalone').then(m => m.DockStandalone) + return await import('../components/DockStandalone').then(m => m.registerDockStandalone()) } popupEvents.on('popup:open-requested', (context) => { @@ -250,7 +250,7 @@ export function closeDockPopup() { export function setDockStandaloneLoaderForTest(loader?: () => Promise HTMLElement>) { loadDockStandalone = loader || (async () => { - return await import('../components/DockStandalone').then(m => m.DockStandalone) + return await import('../components/DockStandalone').then(m => m.registerDockStandalone()) }) } diff --git a/packages/core/src/client/webcomponents/state/terminals.ts b/packages/core/src/client/webcomponents/state/terminals.ts index d023474f..1ed1ddef 100644 --- a/packages/core/src/client/webcomponents/state/terminals.ts +++ b/packages/core/src/client/webcomponents/state/terminals.ts @@ -13,6 +13,16 @@ export interface TerminalState { } let _terminalsMap: Reactive> | undefined + +/** + * Reset the module-level terminals singleton. Intended for tests and stories, + * which share one module graph — call before re-initializing `useTerminals` + * with a fresh context so state doesn't leak between scenarios. + */ +export function resetTerminalsState(): void { + _terminalsMap = undefined +} + export function useTerminals(context: DocksContext): Reactive> { if (_terminalsMap) { return _terminalsMap diff --git a/packages/core/src/client/webcomponents/stories/BuiltinViews.stories.ts b/packages/core/src/client/webcomponents/stories/BuiltinViews.stories.ts new file mode 100644 index 00000000..7d9daa73 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/BuiltinViews.stories.ts @@ -0,0 +1,108 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsViewBuiltin } from '@vitejs/devtools-kit' +import SettingsAppearance from '../components/views-builtin/SettingsAppearance.vue' +import ViewBuiltinClientAuthNotice from '../components/views-builtin/ViewBuiltinClientAuthNotice.vue' +import ViewBuiltinMessages from '../components/views-builtin/ViewBuiltinMessages.vue' +import ViewBuiltinSettings from '../components/views-builtin/ViewBuiltinSettings.vue' +import ViewBuiltinTerminals from '../components/views-builtin/ViewBuiltinTerminals.vue' +import { resetMessagesState, useMessages } from '../state/messages' +import { resetTerminalsState } from '../state/terminals' +import { messagesFixture } from './mock/messages' +import { terminalBuffers, terminalSessionsFixture } from './mock/terminals' +import { contextStory } from './story-utils' + +/** + * Built-in views ship with every DevTools instance: the settings panels, the + * messages log, the terminals panel, and the client-auth notice. + */ +const meta = { + title: 'Views/Built-in', + parameters: { + layout: 'fullscreen', + docs: { + description: { + component: + 'Views bundled with every DevTools instance — settings, messages log, terminals, and the client-auth notice.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +const SETTINGS_ENTRY: DevToolsViewBuiltin = { type: '~builtin', id: '~settings', title: 'Settings', icon: 'ph:gear-duotone' } + +function box(inner: string) { + return `
${inner}
` +} + +/** The full settings view (appearance, docks, shortcuts, advanced). */ +export const Settings: Story = contextStory({ + render: context => ({ + components: { ViewBuiltinSettings }, + setup: () => ({ context, entry: SETTINGS_ENTRY }), + template: box(``), + }), +}) as Story + +/** Just the appearance settings sub-panel. */ +export const SettingsAppearanceOnly: Story = contextStory({ + render: context => ({ + components: { SettingsAppearance }, + setup: () => ({ context, settingsStore: context.docks.settings }), + template: box(`
`), + }), +}) as Story + +/** The messages log populated with entries across all severity levels. */ +export const Messages: Story = contextStory({ + context: { + callHandlers: { + 'devtoolskit:internal:messages:list': () => ({ + removedIds: [], + entries: messagesFixture(), + version: 1, + }), + }, + }, + prepare: (context) => { + // Re-initialize the singleton against this story's context so it fetches + // the seeded fixture instead of whatever a prior story left behind. + resetMessagesState() + useMessages(context) + }, + render: context => ({ + components: { ViewBuiltinMessages }, + setup: () => ({ context }), + template: box(``), + }), +}) as Story + +/** The terminals panel with several sessions and seeded scrollback. */ +export const Terminals: Story = contextStory({ + context: { + callHandlers: { + 'devtoolskit:internal:terminals:list': () => terminalSessionsFixture(), + 'devtoolskit:internal:terminals:read': (id: string) => ({ buffer: terminalBuffers()[id] ?? [] }), + }, + }, + prepare: () => { + resetTerminalsState() + }, + render: context => ({ + components: { ViewBuiltinTerminals }, + setup: () => ({ context }), + template: box(``), + }), +}) as Story + +/** The notice shown when the RPC client is not yet trusted. */ +export const ClientAuthNotice: Story = contextStory({ + context: { isTrusted: false }, + render: context => ({ + components: { ViewBuiltinClientAuthNotice }, + setup: () => ({ context }), + template: box(``), + }), +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/CommandPalette.stories.ts b/packages/core/src/client/webcomponents/stories/CommandPalette.stories.ts new file mode 100644 index 00000000..13b37cb9 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/CommandPalette.stories.ts @@ -0,0 +1,40 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import CommandPalette from '../components/command-palette/CommandPalette.vue' +import { contextStory } from './story-utils' + +/** + * The command palette (Cmd/Ctrl+K) surfaces every registered command — + * server-side commands plus the client navigation/settings/dock-mode commands + * seeded by the context — with fuzzy search and keyboard-driven selection. + */ +const meta = { + title: 'Command Palette', + component: CommandPalette, + parameters: { + docs: { + description: { + component: + 'Cmd/Ctrl+K palette listing server and client commands with fuzzy search, nested groups, and keybinding hints.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function renderPalette(context: any) { + return { + components: { CommandPalette }, + setup: () => ({ context }), + template: `
`, + } +} + +/** The palette open, listing all seeded commands. */ +export const Open: Story = contextStory({ + prepare: (context) => { + context.commands.paletteOpen = true + }, + render: renderPalette, +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/DockEmbedded.stories.ts b/packages/core/src/client/webcomponents/stories/DockEmbedded.stories.ts new file mode 100644 index 00000000..2394587b --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/DockEmbedded.stories.ts @@ -0,0 +1,81 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import DockEmbedded from '../components/dock/DockEmbedded.vue' +import { contextStory } from './story-utils' + +/** + * The embedded dock is what a user's app renders in-page: a floating panel + * (or an edge-docked panel) overlaid on top of the host application. + */ +const meta = { + title: 'Docks/Embedded', + component: DockEmbedded, + parameters: { + docs: { + description: { + component: + 'The in-page DevTools dock, overlaid on the host app. Supports a floating panel and an edge-docked panel; the dock bar is always present.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function renderEmbedded(context: any) { + return { + components: { DockEmbedded }, + setup: () => ({ context }), + template: ``, + } +} + +/** Floating panel open at the bottom of the viewport, showing an iframe frame. */ +export const FloatOpen: Story = contextStory({ + context: { + clientType: 'embedded', + panel: { mode: 'float', open: true, position: 'bottom', width: 60, height: 60 }, + selectedId: 'overview', + }, + render: renderEmbedded, +}) as Story + +/** Floating panel docked to the left edge. */ +export const FloatLeft: Story = contextStory({ + context: { + clientType: 'embedded', + panel: { mode: 'float', open: true, position: 'left', width: 40, height: 80, left: 0, top: 10 }, + selectedId: 'modules', + }, + render: renderEmbedded, +}) as Story + +/** Edge mode: the panel is pinned to the viewport edge rather than floating. */ +export const EdgeOpen: Story = contextStory({ + context: { + clientType: 'embedded', + panel: { mode: 'edge', open: true, position: 'bottom', width: 60, height: 50 }, + selectedId: 'overview', + }, + render: renderEmbedded, +}) as Story + +/** Only the dock bar is visible — no entry selected, panel closed. */ +export const DockBarOnly: Story = contextStory({ + context: { + clientType: 'embedded', + panel: { mode: 'float', open: false, position: 'bottom' }, + selectedId: null, + }, + render: renderEmbedded, +}) as Story + +/** A grouped entry selected: the group's members appear in a sidebar. */ +export const GroupedEntry: Story = contextStory({ + context: { + clientType: 'embedded', + panel: { mode: 'float', open: true, position: 'bottom', width: 70, height: 60 }, + selectedId: 'nuxt:overview', + }, + render: renderEmbedded, +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/DockStandalone.stories.ts b/packages/core/src/client/webcomponents/stories/DockStandalone.stories.ts new file mode 100644 index 00000000..5b2a28b1 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/DockStandalone.stories.ts @@ -0,0 +1,54 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import DockStandalone from '../components/dock/DockStandalone.vue' +import { contextStory } from './story-utils' + +/** + * The standalone dock is the full-page DevTools UI — the sidebar navigation + * plus the active view — served on its own route rather than overlaid on a + * host app. This is the "static" rendering mode used by the standalone client + * and the picture-in-picture popup. + */ +const meta = { + title: 'Docks/Standalone', + component: DockStandalone, + parameters: { + docs: { + description: { + component: + 'Full-page DevTools UI: fixed sidebar navigation on the left, the active dock view filling the rest. Used by the standalone client and PiP popup.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function renderStandalone(context: any) { + return { + components: { DockStandalone }, + setup: () => ({ context }), + template: ``, + } +} + +/** The default full-page layout with the first entry auto-selected. */ +export const Default: Story = contextStory({ + context: { clientType: 'standalone', selectedId: 'overview' }, + render: renderStandalone, +}) as Story + +/** A grouped member selected — the group's siblings render in the sub-sidebar. */ +export const GroupedEntry: Story = contextStory({ + context: { clientType: 'standalone', selectedId: 'nuxt:pages' }, + render: renderStandalone, +}) as Story + +/** + * When the RPC client is not trusted, the standalone page shows the client-auth + * notice instead of the dock, prompting the user to authorize the connection. + */ +export const Untrusted: Story = contextStory({ + context: { clientType: 'standalone', isTrusted: false }, + render: renderStandalone, +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/Floating.stories.ts b/packages/core/src/client/webcomponents/stories/Floating.stories.ts new file mode 100644 index 00000000..1084b35b --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/Floating.stories.ts @@ -0,0 +1,134 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { FloatingPopoverProps } from '../state/floating-tooltip' +import { h, onMounted, ref } from 'vue' +import FloatingElements from '../components/floating/FloatingElements.vue' +import { + setDockContextMenu, + setDocksGroupPanel, + setDocksOverflowPanel, + setEdgePositionDropdown, + setFloatingTooltip, +} from '../state/floating-tooltip' +import { resetFloatingState } from './story-utils' + +/** + * Floating popovers are the transient overlays anchored to dock elements: + * hover tooltips, the dock-bar overflow panel, group popovers, the entry + * context menu, and the edge-position dropdown. `FloatingElements` hosts them + * all, driven by the shared floating-state singletons. + */ +const meta = { + title: 'Floating/Popovers', + component: FloatingElements, + parameters: { + docs: { + description: { + component: + 'Transient overlays anchored to dock elements — tooltips, overflow/group popovers, the entry context menu, and the edge-position dropdown.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** + * Render a labelled anchor button centered in the viewport, plus the + * `FloatingElements` host. Once mounted, `open(anchor)` seeds the relevant + * floating-state singleton so its popover appears next to the anchor. + */ +function anchoredPopover( + label: string, + open: (props: FloatingPopoverProps) => void, + content: FloatingPopoverProps['content'], +) { + return () => { + const anchor = ref(null) + onMounted(() => { + resetFloatingState() + if (anchor.value) + open({ el: anchor.value, content }) + }) + return { + components: { FloatingElements }, + setup: () => ({ anchor }), + template: ` +
+ + +
+ `, + } + } +} + +function menu(items: [icon: string, label: string][]) { + return () => + h( + 'div', + { class: 'flex flex-col gap-1 min-w-40' }, + items.map(([icon, text]) => + h('div', { class: 'flex items-center gap-2 px2 py1 rounded hover:bg-active cursor-pointer text-sm' }, [ + h('div', { class: `${icon} op70` }), + h('span', text), + ])), + ) +} + +/** A hover tooltip anchored below its target. */ +export const Tooltip: Story = { + render: anchoredPopover('Hover target', setFloatingTooltip, 'Open in editor'), +} + +/** The overflow panel that collects dock entries that don't fit on the bar. */ +export const OverflowPanel: Story = { + render: anchoredPopover( + 'Overflow', + setDocksOverflowPanel, + menu([ + ['i-ph-gauge-duotone', 'Overview'], + ['i-ph-plugs-connected-duotone', 'Modules'], + ['i-ph-newspaper-clipping-duotone', 'Notes'], + ]), + ), +} + +/** A group popover listing a collapsed group's member entries. */ +export const GroupPanel: Story = { + render: anchoredPopover( + 'Nuxt group', + setDocksGroupPanel, + menu([ + ['i-ph-gauge-duotone', 'Overview'], + ['i-ph-files-duotone', 'Pages'], + ['i-ph-puzzle-piece-duotone', 'Components'], + ]), + ), +} + +/** The context menu shown when right-clicking a dock entry. */ +export const ContextMenu: Story = { + render: anchoredPopover( + 'Right-click target', + setDockContextMenu, + menu([ + ['i-ph-arrow-square-out-duotone', 'Open in popup'], + ['i-ph-eye-slash-duotone', 'Hide entry'], + ['i-ph-gear-duotone', 'Settings'], + ]), + ), +} + +/** The dropdown for choosing which viewport edge the dock pins to. */ +export const EdgePositionDropdown: Story = { + render: anchoredPopover( + 'Edge position', + setEdgePositionDropdown, + menu([ + ['i-ph-square-half-bottom-duotone', 'Bottom'], + ['i-ph-square-half-duotone', 'Left'], + ['i-ph-square-half-duotone', 'Right'], + ]), + ), +} diff --git a/packages/core/src/client/webcomponents/stories/Overlays.stories.ts b/packages/core/src/client/webcomponents/stories/Overlays.stories.ts new file mode 100644 index 00000000..ab12fced --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/Overlays.stories.ts @@ -0,0 +1,62 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { onMounted } from 'vue' +import Confirm from '../components/display/Confirm.vue' +import ToastOverlay from '../components/display/ToastOverlay.vue' +import { ConfirmPromise } from '../state/confirm' +import { addToast, dismissToast, useToasts } from '../state/toasts' +import { messagesFixture } from './mock/messages' +import { contextStory } from './story-utils' + +/** + * Global overlays that float above every dock surface: the toast stack + * (bottom-right notifications derived from messages) and the confirm dialog + * (a promise-driven modal). + */ +const meta = { + title: 'Overlays', + parameters: { + docs: { + description: { + component: + 'Global overlays above the dock: the toast notification stack and the promise-driven confirm dialog.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** A stack of toast notifications, one per severity level. */ +export const Toasts: Story = contextStory({ + prepare: () => { + // Clear any residual toasts from a previous story, then seed fresh ones. + for (const toast of [...useToasts()]) dismissToast(toast.id) + for (const entry of messagesFixture()) addToast(entry) + }, + render: context => ({ + components: { ToastOverlay }, + setup: () => ({ context }), + template: `
`, + }), +}) as Story + +/** The confirm dialog, opened immediately and left awaiting a choice. */ +export const ConfirmDialog: Story = contextStory({ + render: () => ({ + components: { Confirm }, + setup() { + onMounted(() => { + // Fire-and-forget: the story just displays the dialog chrome. + void ConfirmPromise.start({ + title: 'Delete workspace?', + message: 'This removes the worktree and its branch. This action cannot be undone.', + confirmText: 'Delete', + cancelText: 'Cancel', + }) + }) + return {} + }, + template: `
`, + }), +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/Views.stories.ts b/packages/core/src/client/webcomponents/stories/Views.stories.ts new file mode 100644 index 00000000..13ac682d --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/Views.stories.ts @@ -0,0 +1,82 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsDockEntry } from '@vitejs/devtools-kit' +import { ref } from 'vue' +import ViewEntry from '../components/views/ViewEntry.vue' +import { useIframePanes } from '../utils/useIframePanes' +import { dockEntriesFixture } from './mock/fixtures' +import { jsonRenderSpecFixture } from './mock/json-render-spec' +import { contextStory } from './story-utils' + +/** + * A dock view is the content pane for a selected entry. `ViewEntry` picks the + * concrete renderer from the entry type: an iframe frame, a launcher card, a + * json-render spec, a custom-render script, or a built-in view. + */ +const meta = { + title: 'Views/Frames', + component: ViewEntry, + parameters: { + docs: { + description: { + component: + 'The content pane for a selected dock entry. `ViewEntry` dispatches on entry type — iframe, launcher, json-render, custom-render, or built-in.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** + * Render `ViewEntry` for one entry inside a bordered box that owns an + * iframe-pane overlay container, exactly like the dock shells do. + */ +function renderView(entryId: string) { + return (context: any) => ({ + components: { ViewEntry }, + setup() { + const container = ref(null) + const panes = useIframePanes(container, context.panel) + const entry = context.docks.entries.find((e: DevToolsDockEntry) => e.id === entryId) + return { context, entry, panes, container } + }, + template: ` +
+ +
+
+ `, + }) +} + +/** An iframe frame embedding an external URL (`about:blank` here). */ +export const Iframe: Story = contextStory({ + context: { selectedId: 'overview' }, + render: renderView('overview'), +}) as Story + +/** A launcher card — a call-to-action that starts a process, then swaps to a frame. */ +export const Launcher: Story = contextStory({ + context: { selectedId: 'launcher' }, + render: renderView('launcher'), +}) as Story + +/** A json-render view: server-authored UI spec rendered via the component registry. */ +export const JsonRender: Story = contextStory({ + context: { + entries: [ + ...dockEntriesFixture(), + { + type: 'json-render', + id: 'build-summary', + title: 'Build Summary', + icon: 'ph:chart-bar-duotone', + ui: { _stateKey: 'story:json-render' } as any, + }, + ], + sharedStates: { 'story:json-render': jsonRenderSpecFixture() }, + selectedId: 'build-summary', + }, + render: renderView('build-summary'), +}) as Story diff --git a/packages/core/src/client/webcomponents/stories/mock/create-context.test.ts b/packages/core/src/client/webcomponents/stories/mock/create-context.test.ts new file mode 100644 index 00000000..9cdbb27f --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/create-context.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from 'vitest' +import { createMockDocksContext } from './create-context' +import { dockEntriesFixture } from './fixtures' +import { jsonRenderSpecFixture } from './json-render-spec' + +describe('createMockDocksContext', () => { + it('builds a context seeded with fixture entries and commands', async () => { + const { context } = await createMockDocksContext() + + expect(context.clientType).toBe('embedded') + expect(context.docks.entries.length).toBeGreaterThan(0) + expect(context.docks.entries.find(e => e.id === 'overview')).toBeTruthy() + + // Server command fixtures merged with the client commands the context seeds. + const commandIds = context.commands.commands.map(c => c.id) + expect(commandIds).toContain('vite:restart') + expect(commandIds).toContain('devtools:toggle-palette') + }) + + it('selects an iframe entry and opens the panel', async () => { + const { context } = await createMockDocksContext({ selectedId: 'overview' }) + expect(context.docks.selectedId).toBe('overview') + expect(context.panel.store.open).toBe(true) + }) + + it('resolves a group entry to its default child', async () => { + const { context } = await createMockDocksContext() + const switched = await context.docks.switchEntry('nuxt') + expect(switched).toBe(true) + expect(context.docks.selectedId).toBe('nuxt:overview') + }) + + it('honors the untrusted flag', async () => { + const { context } = await createMockDocksContext({ isTrusted: false }) + expect(context.rpc.isTrusted).toBe(false) + }) + + it('seeds extra shared state for json-render views', async () => { + const { rpc } = await createMockDocksContext({ + entries: dockEntriesFixture(), + sharedStates: { 'story:json-render': jsonRenderSpecFixture() }, + }) + const state = await rpc.sharedState.get('story:json-render' as any) + expect((state.value() as any).root).toBe('root') + }) +}) diff --git a/packages/core/src/client/webcomponents/stories/mock/create-context.ts b/packages/core/src/client/webcomponents/stories/mock/create-context.ts new file mode 100644 index 00000000..fe5e7760 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/create-context.ts @@ -0,0 +1,72 @@ +import type { DevToolsDockEntry, DevToolsServerCommandEntry } from '@vitejs/devtools-kit' +import type { DockClientType, DockPanelStorage, DocksContext } from '@vitejs/devtools-kit/client' +import { ref } from 'vue' +import { createDocksContext } from '../../state/context' +import { DEFAULT_DOCK_PANEL_STORE } from '../../state/docks' +import { dockEntriesFixture, serverCommandsFixture } from './fixtures' +import { createMockRpcClient } from './mock-rpc' + +export interface MockContextOptions { + clientType?: DockClientType + isTrusted?: boolean + /** Dock entries to seed. Defaults to {@link dockEntriesFixture}. */ + entries?: DevToolsDockEntry[] + /** Server commands to seed. Defaults to {@link serverCommandsFixture}. */ + serverCommands?: DevToolsServerCommandEntry[] + /** Partial overrides merged onto the default panel storage. */ + panel?: Partial + /** Dock entry id to select once the context is ready. */ + selectedId?: string | null + /** Handlers for `rpc.call(id, ...)`, keyed by command/RPC id. */ + callHandlers?: Record unknown> + /** + * Extra shared-state values to seed beyond docks/commands — e.g. a + * json-render spec keyed by the view's `_stateKey`. + */ + sharedStates?: Record +} + +export interface MockContext { + context: DocksContext + rpc: ReturnType +} + +/** + * Build a real {@link DocksContext} backed by a mock RPC client, seeded with + * fixture dock entries and commands. Drives the production context factory so + * stories exercise the same state code paths the app uses. + */ +export async function createMockDocksContext(options: MockContextOptions = {}): Promise { + const { + clientType = 'embedded', + isTrusted = true, + entries = dockEntriesFixture(), + serverCommands = serverCommandsFixture(), + panel = {}, + selectedId = null, + callHandlers = {}, + sharedStates = {}, + } = options + + const rpc = createMockRpcClient({ + isTrusted, + sharedStates: { + 'devframe:docks': entries, + 'devframe:commands': serverCommands, + ...sharedStates, + }, + callHandlers, + }) + + const panelStore = ref({ + ...DEFAULT_DOCK_PANEL_STORE(), + ...panel, + }) + + const context = await createDocksContext(clientType, rpc, panelStore) + + if (selectedId != null) + await context.docks.switchEntry(selectedId) + + return { context, rpc } +} diff --git a/packages/core/src/client/webcomponents/stories/mock/fixtures.ts b/packages/core/src/client/webcomponents/stories/mock/fixtures.ts new file mode 100644 index 00000000..0353d024 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/fixtures.ts @@ -0,0 +1,117 @@ +import type { DevToolsDockEntry, DevToolsServerCommandEntry } from '@vitejs/devtools-kit' + +/** + * A representative set of dock entries covering every user entry type: + * iframe frames, a launcher, a custom-render view, an action, and a + * collapsed group with members. Mirrors the shapes registered by the core + * playground so stories exercise realistic dock layouts. + */ +export function dockEntriesFixture(): DevToolsDockEntry[] { + return [ + { + type: 'iframe', + id: 'overview', + title: 'Overview', + icon: 'ph:gauge-duotone', + url: 'about:blank', + }, + { + type: 'iframe', + id: 'modules', + title: 'Modules', + icon: 'ph:plugs-connected-duotone', + url: 'about:blank', + badge: '128', + }, + { + type: 'custom-render', + id: 'notes', + title: 'Notes', + icon: 'ph:newspaper-clipping-duotone', + renderer: { importFrom: 'virtual:story-noop' }, + }, + { + type: 'launcher', + id: 'launcher', + title: 'Launcher', + icon: 'ph:rocket-launch-duotone', + launcher: { + title: 'Launch My Cool App', + description: 'Start the dev server and open the app in a frame.', + buttonStart: 'Start', + onLaunch: async () => {}, + }, + }, + { + type: 'action', + id: 'ping', + title: 'Ping', + icon: 'ph:bell-simple-ringing-duotone', + action: { importFrom: 'virtual:story-noop' }, + }, + // A collapsed group ("Nuxt") with several iframe members. + { + type: 'group', + id: 'nuxt', + title: 'Nuxt', + icon: 'logos:nuxt-icon', + category: 'framework', + defaultChildId: 'nuxt:overview', + }, + { + type: 'iframe', + id: 'nuxt:overview', + title: 'Nuxt Overview', + icon: 'ph:gauge-duotone', + url: 'about:blank', + groupId: 'nuxt', + defaultOrder: 0, + }, + { + type: 'iframe', + id: 'nuxt:pages', + title: 'Pages', + icon: 'ph:files-duotone', + url: 'about:blank', + groupId: 'nuxt', + defaultOrder: 1, + }, + { + type: 'iframe', + id: 'nuxt:components', + title: 'Components', + icon: 'ph:puzzle-piece-duotone', + url: 'about:blank', + groupId: 'nuxt', + defaultOrder: 2, + }, + ] +} + +/** + * Server-side commands, surfaced in the command palette alongside the + * client-registered navigation/settings commands seeded by the context. + */ +export function serverCommandsFixture(): DevToolsServerCommandEntry[] { + return [ + { + id: 'vite:restart', + source: 'server', + title: 'Restart Vite Server', + icon: 'ph:arrow-clockwise-duotone', + keybindings: [{ key: 'Mod+Shift+R' }], + }, + { + id: 'vite:clear-cache', + source: 'server', + title: 'Clear Optimize-Deps Cache', + icon: 'ph:broom-duotone', + }, + { + id: 'vite:open-in-editor', + source: 'server', + title: 'Open in Editor', + icon: 'ph:pencil-simple-duotone', + }, + ] +} diff --git a/packages/core/src/client/webcomponents/stories/mock/json-render-spec.ts b/packages/core/src/client/webcomponents/stories/mock/json-render-spec.ts new file mode 100644 index 00000000..0a07df66 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/json-render-spec.ts @@ -0,0 +1,57 @@ +/** + * A representative json-render spec exercising the DevTools component + * registry (Stack / Card / Text / Badge / KeyValueTable / Divider / Button). + * Shaped as a flat element map keyed by id, matching `@json-render/core`'s + * {@link Spec}. + */ +export function jsonRenderSpecFixture() { + return { + root: 'root', + state: {}, + elements: { + root: { + type: 'Stack', + props: { direction: 'vertical', gap: 12, padding: 4 }, + children: ['heading', 'card', 'actions'], + }, + heading: { + type: 'Text', + props: { content: 'Build Summary', variant: 'heading' }, + }, + card: { + type: 'Card', + props: { title: 'Bundle', collapsible: true }, + children: ['stats', 'divider', 'note'], + }, + stats: { + type: 'KeyValueTable', + props: { + entries: [ + { key: 'Modules', value: '1,284' }, + { key: 'Chunks', value: '17' }, + { key: 'Size (gzip)', value: '312 kB' }, + { key: 'Build time', value: '4.2s' }, + ], + }, + }, + divider: { type: 'Divider', props: {} }, + note: { + type: 'Text', + props: { content: 'Rendered from a json-render spec over RPC shared state.', variant: 'caption' }, + }, + actions: { + type: 'Stack', + props: { direction: 'horizontal', gap: 8 }, + children: ['badge', 'button'], + }, + badge: { + type: 'Badge', + props: { text: 'production', variant: 'success' }, + }, + button: { + type: 'Button', + props: { label: 'Rebuild', icon: 'i-ph-arrow-clockwise-duotone', variant: 'primary' }, + }, + }, + } +} diff --git a/packages/core/src/client/webcomponents/stories/mock/messages.ts b/packages/core/src/client/webcomponents/stories/mock/messages.ts new file mode 100644 index 00000000..2ab5db6f --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/messages.ts @@ -0,0 +1,52 @@ +import type { DevToolsMessageEntry } from '@vitejs/devtools-kit' + +/** + * A spread of message entries across every severity level, for the messages + * panel and toast overlays. `autoDismiss: -1` keeps story toasts pinned so + * they don't disappear mid-inspection. + */ +export function messagesFixture(): DevToolsMessageEntry[] { + const now = Date.now() + return [ + { + id: 'msg-error', + message: 'Failed to resolve import "vue-router"', + description: 'The dependency could not be resolved from node_modules.', + level: 'error', + from: 'server', + category: 'runtime', + timestamp: now - 1000, + autoDismiss: -1, + }, + { + id: 'msg-warn', + message: 'Large chunk detected', + description: 'index.js is 812 kB after minification. Consider code-splitting.', + level: 'warn', + from: 'server', + category: 'build', + labels: ['perf'], + timestamp: now - 2000, + autoDismiss: -1, + }, + { + id: 'msg-success', + message: 'Build completed in 4.2s', + level: 'success', + from: 'server', + category: 'build', + timestamp: now - 3000, + autoDismiss: -1, + }, + { + id: 'msg-info', + message: 'HMR update applied', + description: 'src/App.vue', + level: 'info', + from: 'browser', + category: 'hmr', + timestamp: now - 4000, + autoDismiss: -1, + }, + ] +} diff --git a/packages/core/src/client/webcomponents/stories/mock/mock-rpc.ts b/packages/core/src/client/webcomponents/stories/mock/mock-rpc.ts new file mode 100644 index 00000000..50647fe3 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/mock-rpc.ts @@ -0,0 +1,110 @@ +import type { DevToolsRpcClient } from '@vitejs/devtools-kit/client' +import type { SharedState } from 'devframe/utils/shared-state' +import { createEventEmitter } from 'devframe/utils/events' +import { createSharedState } from 'devframe/utils/shared-state' + +export interface MockRpcOptions { + /** + * Whether the client is trusted. Set `false` to preview the client-auth + * notice surfaces. + * @default true + */ + isTrusted?: boolean + /** + * Pre-seeded shared-state values, keyed by shared-state key + * (e.g. `'devframe:docks'`, `'devframe:commands'`). + */ + sharedStates?: Record + /** + * Handlers for server RPC calls (`rpc.call(id, ...args)`), keyed by id. + * Unmatched ids resolve to `undefined`. + */ + callHandlers?: Record unknown> +} + +/** + * An in-memory {@link DevToolsRpcClient} for Storybook and tests. + * + * Backs `sharedState.get()` with real {@link createSharedState} stores so the + * production state factories (`createDocksContext`, `createCommandsContext`, …) + * run unmodified against it. Network-only surfaces (`streaming`, `cacheManager`, + * trust negotiation) are stubbed to no-ops. + */ +export function createMockRpcClient(options: MockRpcOptions = {}): DevToolsRpcClient { + const { + isTrusted = true, + sharedStates = {}, + callHandlers = {}, + } = options + + const events = createEventEmitter<{ 'rpc:is-trusted:updated': (isTrusted: boolean) => void }>() + const stateStore = new Map>() + const keyAddedListeners = new Set<(key: string) => void>() + + // Pre-seed the provided shared states so consumers see them on first `get`. + for (const [key, value] of Object.entries(sharedStates)) { + stateStore.set(key, createSharedState({ initialValue: value as object })) + } + + const sharedState: DevToolsRpcClient['sharedState'] = { + get: (async (key: string, opts?: { initialValue?: unknown }) => { + const existing = stateStore.get(key) + if (existing) + return existing + const created = createSharedState({ initialValue: (opts?.initialValue ?? {}) as object }) + stateStore.set(key, created) + for (const fn of keyAddedListeners) fn(key) + return created + }) as DevToolsRpcClient['sharedState']['get'], + keys: () => [...stateStore.keys()], + onKeyAdded: (fn: (key: string) => void) => { + keyAddedListeners.add(fn) + return () => keyAddedListeners.delete(fn) + }, + } + + // Safe defaults for the internal list endpoints so the messages/terminals + // state factories never choke on an undefined response. Overridable per story + // via `callHandlers`. + const defaultCallResults: Record unknown> = { + 'devtoolskit:internal:messages:list': () => ({ removedIds: [], entries: [], version: 0 }), + 'devtoolskit:internal:terminals:list': () => [], + } + + const call = (async (id: string, ...args: any[]) => { + if (callHandlers[id]) + return callHandlers[id](...args) + return defaultCallResults[id]?.() + }) as DevToolsRpcClient['call'] + + return { + events: events as DevToolsRpcClient['events'], + isTrusted, + connectionMeta: {} as DevToolsRpcClient['connectionMeta'], + ensureTrusted: async () => isTrusted, + requestTrust: async () => isTrusted, + requestTrustWithToken: async () => isTrusted, + call, + callEvent: (() => {}) as unknown as DevToolsRpcClient['callEvent'], + callOptional: (async () => undefined) as unknown as DevToolsRpcClient['callOptional'], + // `client.register` lets consumers (messages/terminals) attach client-side + // RPC handlers. Stories never invoke them, so registration is a no-op. + client: { + register: () => () => {}, + } as unknown as DevToolsRpcClient['client'], + sharedState, + streaming: { + // A benign reader that ends immediately — consumers' `for await` loops + // complete without receiving chunks (stories seed output via the + // `terminals:read` call handler instead of a live stream). + subscribe: () => ({ + async* [Symbol.asyncIterator]() {}, + readable: new ReadableStream(), + }), + upload: () => { + throw new Error('[mock-rpc] streaming.upload is not implemented') + }, + } as unknown as DevToolsRpcClient['streaming'], + cacheManager: {} as DevToolsRpcClient['cacheManager'], + } +} diff --git a/packages/core/src/client/webcomponents/stories/mock/terminals.ts b/packages/core/src/client/webcomponents/stories/mock/terminals.ts new file mode 100644 index 00000000..d6d55441 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock/terminals.ts @@ -0,0 +1,36 @@ +import type { DevToolsTerminalSessionBase } from '@vitejs/devtools-kit' + +export function terminalSessionsFixture(): DevToolsTerminalSessionBase[] { + return [ + { id: 'vite-dev', title: 'vite dev', status: 'running', icon: 'ph:terminal-duotone' }, + { id: 'test-watch', title: 'vitest', status: 'running', icon: 'ph:test-tube-duotone' }, + { id: 'build', title: 'build', status: 'stopped', icon: 'ph:package-duotone' }, + ] +} + +/** Scrollback buffer lines keyed by terminal id, served via `terminals:read`. */ +export function terminalBuffers(): Record { + return { + 'vite-dev': [ + 'VITE v8.1.2 ready in 312 ms', + '', + ' ➜ Local: http://localhost:5173/', + ' ➜ Network: use --host to expose', + ' ➜ press h + enter to show help', + ], + 'test-watch': [ + ' ✓ src/utils.test.ts (12 tests) 24ms', + ' ✓ src/dock.test.ts (8 tests) 41ms', + '', + ' Test Files 2 passed (2)', + ' Tests 20 passed (20)', + ], + 'build': [ + 'vite build', + 'transforming...', + '✓ 284 modules transformed.', + 'dist/index.js 312.4 kB │ gzip: 98.1 kB', + '✓ built in 4.20s', + ], + } +} diff --git a/packages/core/src/client/webcomponents/stories/story-utils.ts b/packages/core/src/client/webcomponents/stories/story-utils.ts new file mode 100644 index 00000000..3ce3e09e --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/story-utils.ts @@ -0,0 +1,54 @@ +import type { StoryObj } from '@storybook/vue3-vite' +import type { DocksContext } from '@vitejs/devtools-kit/client' +import type { MockContextOptions } from './mock/create-context' +import { + setDockContextMenu, + setDocksGroupPanel, + setDocksOverflowPanel, + setEdgePositionDropdown, + setFloatingTooltip, +} from '../state/floating-tooltip' +import { createMockDocksContext } from './mock/create-context' + +/** + * Clear the module-level floating popover singletons. Stories share one iframe, + * so reset before each render to stop one story's popover leaking into the next. + */ +export function resetFloatingState(): void { + setFloatingTooltip(null) + setDocksOverflowPanel(null) + setDocksGroupPanel(null) + setDockContextMenu(null) + setEdgePositionDropdown(null) +} + +export interface ContextStoryConfig { + /** Options forwarded to {@link createMockDocksContext}. */ + context?: MockContextOptions + /** + * Runs after the context is built and floating state is reset, before render. + * Use it to seed module state (toasts, confirm dialogs, floating popovers). + */ + prepare?: (context: DocksContext) => void | Promise + /** Produce the Storybook render result for the resolved context. */ + render: (context: DocksContext, args: Record) => Record +} + +/** + * Build a Storybook story whose render depends on an async-built + * {@link DocksContext}. Resolves the mock context in a loader, resets shared + * floating state, runs `prepare`, then renders. + */ +export function contextStory(config: ContextStoryConfig): StoryObj { + return { + loaders: [ + async () => { + const mock = await createMockDocksContext(config.context) + resetFloatingState() + await config.prepare?.(mock.context) + return { context: mock.context } + }, + ], + render: (args, { loaded }) => config.render((loaded as { context: DocksContext }).context, args as Record), + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82f4928a..590b6901 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,9 @@ catalogs: '@unocss/nuxt': specifier: ^66.7.4 version: 66.7.4 + '@unocss/reset': + specifier: ^66.7.4 + version: 66.7.4 '@vitejs/plugin-vue': specifier: ^6.0.7 version: 6.0.7 @@ -110,6 +113,9 @@ catalogs: '@nuxt/eslint': specifier: ^1.16.0 version: 1.16.0 + '@storybook/vue3-vite': + specifier: ^10.4.6 + version: 10.4.6 '@typescript-eslint/utils': specifier: ^8.62.1 version: 8.62.1 @@ -143,6 +149,9 @@ catalogs: solid-js: specifier: ^1.9.13 version: 1.9.13 + storybook: + specifier: ^10.4.6 + version: 10.4.6 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -519,7 +528,7 @@ importers: version: 1.2.4 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) tsnapi: specifier: catalog:testing version: 0.3.3(vitest@4.1.9(@types/node@25.0.3)(vite@8.1.2)) @@ -631,7 +640,7 @@ importers: version: 1.9.13 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@packages+core)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@packages+core)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unocss: specifier: catalog:build version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0))(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) @@ -643,7 +652,7 @@ importers: version: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) vite-plugin-solid: specifier: catalog:devtools - version: 2.11.12(solid-js@1.9.13)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) + version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) examples/plugin-file-explorer: dependencies: @@ -677,7 +686,7 @@ importers: version: 14.2.6 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@packages+core)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@packages+core)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unocss: specifier: catalog:build version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0))(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) @@ -705,7 +714,7 @@ importers: version: 14.2.6 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@packages+core)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@packages+core)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unrun: specifier: catalog:build version: 0.3.1(synckit@0.11.13) @@ -758,6 +767,12 @@ importers: '@clack/prompts': specifier: catalog:inlined version: 1.6.0 + '@storybook/vue3-vite': + specifier: catalog:devtools + version: 10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(vue@3.5.39(typescript@6.0.3))(webpack@5.104.1(esbuild@0.28.1)) + '@unocss/reset': + specifier: catalog:build + version: 66.7.4 '@vitejs/plugin-vue': specifier: catalog:build version: 6.0.7(vite@8.1.2)(vue@3.5.39(typescript@6.0.3)) @@ -779,12 +794,18 @@ importers: iframe-pane: specifier: catalog:frontend version: 1.1.0 + storybook: + specifier: catalog:devtools + version: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) typescript: specifier: catalog:devtools version: 6.0.3 + unocss: + specifier: catalog:build + version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2) unplugin-vue: specifier: catalog:build version: 7.2.0(@types/node@25.0.3)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.1.3)(rollup@4.60.2)(terser@5.44.1)(tsx@4.22.4)(vue@3.5.39(typescript@6.0.3))(webpack@5.104.1(esbuild@0.28.1))(yaml@2.9.0) @@ -821,7 +842,7 @@ importers: version: 4.2.0 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) ua-parser-modern: specifier: catalog:frontend version: 0.1.1 @@ -909,7 +930,7 @@ importers: version: 1.0.0 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unocss: specifier: catalog:build version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2) @@ -946,7 +967,7 @@ importers: version: 2.0.0 tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@packages+core)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@packages+core)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unocss: specifier: catalog:build version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0))(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) @@ -1061,7 +1082,7 @@ importers: version: 4.1.2(vue@3.5.39(typescript@6.0.3)) tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) unocss: specifier: catalog:build version: 66.7.4(@unocss/webpack@66.7.4(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)))(vite@8.1.2) @@ -1077,7 +1098,7 @@ importers: devDependencies: tsdown: specifier: catalog:build - version: 0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) + version: 0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)) tsx: specifier: catalog:build version: 4.22.4 @@ -1092,6 +1113,9 @@ packages: resolution: {integrity: sha512-+PXG49BkEXpZfbqiWis9AjG94ygmqr7JD/0bByPG4ZCGLi2ZlYudfB/7iaCItV9yTqXMuC9tDg5AwM0I1n2Mqg==} engines: {node: '>= 20'} + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} + '@antfu/eslint-config@9.1.0': resolution: {integrity: sha512-Vtjt+W/6/bV9hgQG8AiWG66OpAeLKmpo5bZaAmUdRvZsMyirVvIJeHnbM4XUJf4urIuLvK0gGSvXD74PI3ZnGQ==} hasBin: true @@ -1296,6 +1320,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -1393,12 +1421,18 @@ packages: '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -2054,6 +2088,12 @@ packages: cpu: [x64] os: [win32] + '@oxc-parser/binding-android-arm-eabi@0.127.0': + resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxc-parser/binding-android-arm-eabi@0.129.0': resolution: {integrity: sha512-sG37CfXLlYXdDrggAFO/mKcO4w36piwf862xAZXIuf3nzKhWK1FvW4dqie+06++z+mDto2QeOQSvhyzBeK5jsQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2078,6 +2118,12 @@ packages: cpu: [arm] os: [android] + '@oxc-parser/binding-android-arm64@0.127.0': + resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-android-arm64@0.129.0': resolution: {integrity: sha512-DVyLFN2+S0VOhT6lm5++tFqlu3x2Njiby6y5DhTzjV5uRsZWpifsBn6+yjtwAxl105peEjs5BHE3ToBJuQjLTg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2102,6 +2148,12 @@ packages: cpu: [arm64] os: [android] + '@oxc-parser/binding-darwin-arm64@0.127.0': + resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@oxc-parser/binding-darwin-arm64@0.129.0': resolution: {integrity: sha512-QeqThtB8qax4IL+NFBWgshudyKkj5c076L8vyd8PCEx7U1wHyIbH49MEQ5J5iURFhUW5jiFmdnLKEwyOo0GAJA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2126,6 +2178,12 @@ packages: cpu: [arm64] os: [darwin] + '@oxc-parser/binding-darwin-x64@0.127.0': + resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@oxc-parser/binding-darwin-x64@0.129.0': resolution: {integrity: sha512-zn5+7nv4DlK4uFgblmhKm6xRV0QUHXOHyIDkjmhxJ53xSA9ahkb3pHNiHesNPXn/nK/VWU+C+Z6JYHdatZBh7g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2150,6 +2208,12 @@ packages: cpu: [x64] os: [darwin] + '@oxc-parser/binding-freebsd-x64@0.127.0': + resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@oxc-parser/binding-freebsd-x64@0.129.0': resolution: {integrity: sha512-SPTcDBiHWlgRpWFC1jnoi0sBWqCw4DFR+4b8+dV+NAhUu2ONERWyIVIOCfcE9a8BlvZsDCuXf3l/x7wQUs1Rsw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2174,6 +2238,12 @@ packages: cpu: [x64] os: [freebsd] + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-gnueabihf@0.129.0': resolution: {integrity: sha512-Rgc9+WNKLbc+chyDTXyyJ7gbgLo+ve27CrRnmIwGgucGflrBZbutge5jdPPegcgf46RrR4dkBbMCp0/x16mdig==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2198,6 +2268,12 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.129.0': resolution: {integrity: sha512-YtSsJ51VysXqlO8Cs2mWTyXvxBRemTHj4WDQjXwKl0SAxh+CVrEdXrdH+RnjxLj3JCUMFeYuHs5c+/DImfbKkg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2222,6 +2298,13 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-arm64-gnu@0.129.0': resolution: {integrity: sha512-9oK8iQr9KtgI5JhaJ+5IwiQsXEo6NuasFgovtJGrdK/RxbA0bO4YKRvVY7M+8lozUCVz1U7XrFFODv3emIOPRA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2250,6 +2333,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-arm64-musl@0.129.0': resolution: {integrity: sha512-GghE/bf9ZqgqZFxLacgP0ImVD6UiLKQOpvpgUoIsqjopu2ms/+p1L0d0Dv2Sck+8p0FbKS2WE3IjqmIlLbxJgA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2278,6 +2368,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-ppc64-gnu@0.129.0': resolution: {integrity: sha512-A2PW0UbERzKGV6fKX1zoe2Tkc1zVcEJSSPW9IUSKbZAPuPe+M5/5hTA+6fQbWmevabe2B3IDky66a1lFGjpBKA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2306,6 +2403,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.129.0': resolution: {integrity: sha512-omwxd9H+jrl1T72RI666k4ho7Eli2iHdELzf+dL0D+uXThNZXYJCbKjm5rK2hrHmDy4O+NWv7+khBrEkorLsgw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2334,6 +2438,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-riscv64-musl@0.129.0': resolution: {integrity: sha512-v2hi8id+M8C0uY8uuG2t2a5vr8H9XyHXiHL12yMdMNtgn04nnM/8hlOGuoJuxVc07PhClNiaoSaY2eXehSRa7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2362,6 +2473,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.129.0': resolution: {integrity: sha512-UXrdDyLh1Obgj5X+IVVXWoo5/FJbFsU8/uLQ/M9lkVUwBUKpRFxNEhzwBNv21qqdKgAh+pr2CCVD8J1JfRPsIQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2390,6 +2508,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.129.0': resolution: {integrity: sha512-hsL/3/kdX9FGLqOj8DR3Eki4Y6zO1i3+ZHhiPwX0hDt4n+18abkfUzePCv3h8SShprwCmwdxPnlrebZ5+MZ+cw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2418,6 +2543,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-musl@0.127.0': + resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-x64-musl@0.129.0': resolution: {integrity: sha512-kdXvJ4crOeRld3vWl0J0VU4nmnT4pZ3lKGA5tZ1y0UPWsBtElDYd+jsz4lE36tpAbCiWm0M0PG0laUNBSE+Wlw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2446,6 +2578,12 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-openharmony-arm64@0.127.0': + resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@oxc-parser/binding-openharmony-arm64@0.129.0': resolution: {integrity: sha512-DusJfcK7EGwf9TEakB+z6SXCLdHGvDZ8U8882bzWb4oVrORHpbkFl9npS7cN3YC2axcVKoktbxZevS1nxVCKFw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2470,6 +2608,11 @@ packages: cpu: [arm64] os: [openharmony] + '@oxc-parser/binding-wasm32-wasi@0.127.0': + resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@oxc-parser/binding-wasm32-wasi@0.129.0': resolution: {integrity: sha512-Iie9CcII+ELSinKFnxTR15xhI9qriVivEhbFh3driRNbzms/5ioDAU0fwe8Mf1FEaz3n2FtiUVX0h0nwKLYk0A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2490,6 +2633,12 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.129.0': resolution: {integrity: sha512-99kH1udLyrts+wGm+u0VhPbogkb2wxc/6J1XMKOpS6Kx5DjBWGRZZfBjfCGI3xKSInpYbZn4TLWLX1Q1GURYwg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2514,6 +2663,12 @@ packages: cpu: [arm64] os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.129.0': resolution: {integrity: sha512-tmSBR1A4yH697qV291xKyDe4OAWFchJ+cXf2wuipx/vK3n5d5Ej9MVLRtXlIcZ38n8qAjsF0/AnskaYgxM151A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2538,6 +2693,12 @@ packages: cpu: [ia32] os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.129.0': resolution: {integrity: sha512-Z1PbJvkPeLASIUxa3AnrQ5H+vv1K9zC0IGnQqoKfM0ZvsvCSe0d3u5m7d9iuy+HB7GrcElHuwKb0d0qFdtG0iA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2562,6 +2723,9 @@ packages: cpu: [x64] os: [win32] + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.129.0': resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} @@ -2577,6 +2741,109 @@ packages: '@oxc-project/types@0.137.0': resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxc-resolver/binding-android-arm-eabi@11.23.0': + resolution: {integrity: sha512-8IJyWRLVAyhTfe9/TIEbQqSQnl5rUqYJrUOS6Dkr+Mq9FGHMxDGeiEmwkBqCvDP5KckpPh/GYSgbag66O6JsCw==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.23.0': + resolution: {integrity: sha512-pprVojnNhHxupwTT2gdeUlkxll6XEvWWBk3oVicOSNVWQC99OBnDhMQDoirqnzrE1bScQSMS2JgPpqdlrhz/Fg==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.23.0': + resolution: {integrity: sha512-mbIrWIMAJeytyee36OyUP5XH92TP7FaKaQ2m5AjokKy7STgjrhRt7SMXqpqLjhGm6Xn721Xmsg6H3Rtd9YQETw==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.23.0': + resolution: {integrity: sha512-UnIphmZ1LazUCr9DXWaKYWtKDefPMbgLsywaoYxRqVCNHhq4MM6d2q1Nz1i9Vzxt5i+cE2nRUYpAUHr/lijNYA==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.23.0': + resolution: {integrity: sha512-aaZ/cSEYFkSxgS2hOrobT6RQcsWNviOX8dW6CEkVx2/UYkAf9MeHbjl3W0usWV53rVV//ndBdn2nb1y7jsu4lw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.23.0': + resolution: {integrity: sha512-IoJLvO5SjLSVMaq83BNTrPCb1FppvoJc1IhZ5CoUVl3PykUBku7D+LK1j0GSurhJcIc6zfjghsvaZNpq5ev6Mg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.23.0': + resolution: {integrity: sha512-vskFpwg44T/LFsfjSCnVZ5ygcuqzPC1yUzVEiKa8BgHAQz0+QLQQW3EGWLPVi8EXFghzjR4EtgPBtOhCjU4jdw==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.23.0': + resolution: {integrity: sha512-//TcHVhrChyw5RYtgts6WO7KcWq9387c1Z5Zvhqpk/ktAbyaRYgBZrpSY1GDCFq50ASt6B6jhh+JxB1rB45IAg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@11.23.0': + resolution: {integrity: sha512-ZFqlwiTf7CXLLSGyAR9tYiO33LiaeIEXW+xm42d8mnUGpDgPltyrCGYtQezyMMEXvjhOgCz1X+i7sbDTJEx+bg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.23.0': + resolution: {integrity: sha512-oZ5LeN5+H1R19dRjTAxKrxQguH+AsemHcnthEfFxf4OjmBSty2doHLeSmMunKy3zpTHJQ3lh3Af+dNS+W6dYeA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.23.0': + resolution: {integrity: sha512-O4ciFDyX5ebQd0qkb1bjAIg8IEfiLT03GbSeylwlwlUMK9KwBWaALwrxSbc0Msaz4U6iPj+T9eRXpD5mxBfmvA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-musl@11.23.0': + resolution: {integrity: sha512-P3o8Y9kISYjcxadmbO+94ThRwLhwGuDAbA7dcdd4+YLpfeF+mmobz8fXf4NmSdfSqjyRSkceJDBRZha9NVYkiQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-s390x-gnu@11.23.0': + resolution: {integrity: sha512-oj03m1E3RmTFczKhcKJDzHaEDKJnPIsDcQFVxBJsSdXGSuIPdt5TvcM332FfMQgzI6yDJqyl4InrnFfXrmUTKQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@11.23.0': + resolution: {integrity: sha512-BqJxbSC8FdP7mSuSpRePTGHm0hXWV+dfz//f7SjsteZncLaBgWTBmi/OZNv7sX6CyG/Pt/eJkPorP+DkMOhMwQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@11.23.0': + resolution: {integrity: sha512-utmw+VmUrW4K8LI5/6jhg4aGYKJHOIjQ9syYOOA6pF3w7haKu4r4enTe2U0C04/HbUvkq/Zif43xFsKW1Pnq9w==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-openharmony-arm64@11.23.0': + resolution: {integrity: sha512-V6lbRrthHa4TbvsLjPtg+EkXT1tRY+s4I8rYLXUfiHlZzGx3sLv1EH9CEOOevjvUYHLsbe/gqCIc73XnQfPb9A==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.23.0': + resolution: {integrity: sha512-gRoOxQPdnAmIAjxcuQNBxfihvx+wjTaQM/9/eP12xwnGNawOG/+Zz9RHN4WNSxT45b5CrscK4NB8aPh+oZQXAQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.23.0': + resolution: {integrity: sha512-CgTGMYsJVe1eUiCdJTpGw21svXw79ITsemN1h0hcNkiswasDbN5MoibSLY+gRMWP5syfEz5iffrjZnwEP8xeUA==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.23.0': + resolution: {integrity: sha512-gUGJpr+Rn6zMxm5juApV0K3U845i8t47o8k+rbO0BHbi4PoJIfSPeQmrE2dgohQm2g5k6iviNFyXCGqvmaYUpw==} + cpu: [x64] + os: [win32] + '@oxc-transform/binding-android-arm-eabi@0.133.0': resolution: {integrity: sha512-2A79NBpyBKgHJ0FwgC8D1hzp3x2ujyvqq/kG+M76YyDMMkxLhX6A3vjnAnfEKycOoZxuKhwYu8BF9hKq67ykIA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3228,6 +3495,50 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@storybook/builder-vite@10.4.6': + resolution: {integrity: sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg==} + peerDependencies: + storybook: ^10.4.6 + vite: ^8.1.2 + + '@storybook/csf-plugin@10.4.6': + resolution: {integrity: sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA==} + peerDependencies: + esbuild: ^0.28.1 + rollup: '*' + storybook: ^10.4.6 + vite: ^8.1.2 + webpack: '*' + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@2.1.0': + resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@storybook/vue3-vite@10.4.6': + resolution: {integrity: sha512-XUcBOFsS8Btr9s9rC/kHUIrLGgrnXNmzwFldhA0FMf5ywFICGW1DneJpBwWNXabA2ii0GJqit8gaKNvnTf3UWw==} + peerDependencies: + storybook: ^10.4.6 + vite: ^8.1.2 + + '@storybook/vue3@10.4.6': + resolution: {integrity: sha512-X+rSRuhTeG5lL1Ayg/JugAPauqgi33D+y8vode0U5IdwJQUy0ew0kKoMUPd/WGbjcrZI8Pq9T/syX0aMvaPcNw==} + peerDependencies: + storybook: ^10.4.6 + vue: ^3.0.0 + '@stylistic/eslint-plugin@5.10.0': resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3344,6 +3655,20 @@ packages: peerDependencies: vue: ^2.7.0 || ^3.0.0 + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@turbo/darwin-64@2.10.2': resolution: {integrity: sha512-wBM3ObqOWnKUDmg7QfUFDkDHPFUAJmrYlYqmEM8jMPAPA/I6wRJIbWimeQUqhOiQ8xPKhzyWM+xaiUP0wz8FEQ==} cpu: [x64] @@ -3377,6 +3702,9 @@ packages: '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3997,6 +4325,9 @@ packages: vitest: optional: true + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.9': resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} @@ -4011,6 +4342,9 @@ packages: vite: optional: true + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.9': resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} @@ -4020,9 +4354,15 @@ packages: '@vitest/snapshot@4.1.9': resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.9': resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} @@ -4032,12 +4372,21 @@ packages: vitepress: ^2.0.0-alpha.16 vue: ^3.5.0 + '@volar/language-core@2.4.15': + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + '@volar/language-core@2.4.28': resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + '@volar/source-map@2.4.15': + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + '@volar/source-map@2.4.28': resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + '@volar/typescript@2.4.15': + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} @@ -4081,6 +4430,9 @@ packages: '@vue/compiler-ssr@3.5.39': resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/devtools-api@8.1.2': resolution: {integrity: sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==} @@ -4095,6 +4447,14 @@ packages: '@vue/devtools-shared@8.1.2': resolution: {integrity: sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==} + '@vue/language-core@2.2.12': + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@vue/language-core@3.3.6': resolution: {integrity: sha512-LgBMZAy2sR3cQWknpyaxnI6yBkqDfLBPkbdhwRhQCvzfNJRQXPilgQIrdI/v4ytJ0sAq9bWhaPsjqBqneomJ3Q==} @@ -4254,6 +4614,9 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@webcontainer/env@1.1.1': + resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} + '@xterm/addon-fit@0.11.0': resolution: {integrity: sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==} @@ -4293,6 +4656,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -4326,6 +4694,9 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + alien-signals@3.2.0: resolution: {integrity: sha512-5J9+NpCLHgic4xnZtI8SznvNagwJsZSvRFsAwoLlLw+Edaqa4upCiOC19P8Vx2DqmEvqK2qJBMtI8+9eXOEb/A==} @@ -4344,6 +4715,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'} @@ -4387,6 +4762,19 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4399,6 +4787,10 @@ packages: resolution: {integrity: sha512-8OG92q3R35qjC/4i6BLBMg8IB+fClWu/1PEwg2Z9Rn+BuNaiEgJzpzn+pxWOdHJWDCAwu2JP0wCDTozAM4QirQ==} engines: {node: ^22.18.0 || >=24.11.0} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + ast-walker-scope@0.9.0: resolution: {integrity: sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==} engines: {node: '>=20.19.0'} @@ -4442,6 +4834,10 @@ packages: solid-js: optional: true + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4543,6 +4939,14 @@ packages: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -4556,6 +4960,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -4584,6 +4992,13 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -4692,6 +5107,9 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} @@ -4759,6 +5177,9 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -4971,6 +5392,9 @@ packages: sqlite3: optional: true + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4991,6 +5415,10 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -5072,6 +5500,15 @@ packages: resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -5105,6 +5542,10 @@ packages: oxc-resolver: optional: true + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -5161,9 +5602,21 @@ packages: errx@0.1.0: resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} @@ -5398,6 +5851,9 @@ packages: jiti: optional: true + esm-resolve@1.0.11: + resolution: {integrity: sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5602,9 +6058,17 @@ packages: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-port-please@3.2.0: resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -5666,6 +6130,10 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5701,6 +6169,17 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -5711,6 +6190,10 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -5791,6 +6274,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -5837,6 +6324,9 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -5881,9 +6371,16 @@ packages: resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -5925,6 +6422,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5982,6 +6482,9 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true @@ -6223,6 +6726,9 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -6233,6 +6739,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -6268,6 +6778,10 @@ packages: engines: {node: '>= 20'} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -6464,6 +6978,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.4: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} @@ -6653,6 +7171,10 @@ packages: engines: {node: '>=18'} hasBin: true + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-deep-merge@2.0.1: resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} @@ -6711,6 +7233,10 @@ packages: resolution: {integrity: sha512-6bNsYU+5WNIaNHB16zHnL24cUaJuKiPzUvjENoMale3+U8ZBMbGYgdgt//frx0ge7UcgEGIpqtukGGNPT0kxfQ==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.127.0: + resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} + engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.129.0: resolution: {integrity: sha512-S6eFI+VLkpyA+/Lf8z6qURjDV6Mgo74SLNznNopHTlQW3hedv2MB/z31kBRuBCCTqZN9HHdva0ojljEhPnBKFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6727,6 +7253,9 @@ packages: resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-resolver@11.23.0: + resolution: {integrity: sha512-f0+l598CJMOLnYPXsXxttJALH0ljtivdRMKtvHhxRuWa5FYmw5+qODARl8oYjMC/brpzKcrpdORsOBrTqhBZ9A==} + oxc-transform@0.133.0: resolution: {integrity: sha512-9lt2b+hkG6yqe0fUDMHhMk7rgI9uTjNxU9wauQiYnHzc4kZI8JP/OhBqXTIJQTrqRJ8CkSH3O5AhQ13ke28yNg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6831,6 +7360,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -7063,6 +7596,10 @@ packages: resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} engines: {node: '>=20'} + 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} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7070,6 +7607,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} @@ -7081,6 +7621,42 @@ packages: engines: {node: '>=18'} hasBin: true + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.4: + resolution: {integrity: sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.4: + resolution: {integrity: sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -7124,6 +7700,9 @@ packages: peerDependencies: react: ^19.2.7 + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react@19.2.7: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} @@ -7142,6 +7721,14 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + recast@0.23.12: + resolution: {integrity: sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -7478,6 +8065,21 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + storybook@10.4.6: + resolution: {integrity: sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==} + hasBin: true + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + prettier: ^2 || ^3 + vite-plus: ^0.1.15 + peerDependenciesMeta: + '@types/react': + optional: true + prettier: + optional: true + vite-plus: + optional: true + streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -7522,6 +8124,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-indent@4.1.1: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} @@ -7641,10 +8247,18 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -7657,6 +8271,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + toml-eslint-parser@1.0.3: resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -7685,6 +8302,9 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-map@1.0.3: + resolution: {integrity: sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==} + tsdown@0.22.3: resolution: {integrity: sha512-louqbfA8Qf//B9jTTL0FPtXTNpjCWv1VPkbcmQMph2pTpzs+LnB1tbe4tDDRVpo2BjF5SgUXaTZe45SxB8pWHg==} engines: {node: ^22.18.0 || >=24.11.0} @@ -7765,9 +8385,18 @@ packages: resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} engines: {node: '>=20'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type-level-regexp@0.1.17: resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -8010,6 +8639,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -8238,12 +8872,30 @@ packages: jsdom: optional: true + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} vue-bundle-renderer@2.2.0: resolution: {integrity: sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==} + vue-component-meta@2.2.12: + resolution: {integrity: sha512-dQU6/obNSNbennJ1xd+rhDid4g3vQro+9qUBBIg8HMZH2Zs1jTpkFNxuQ3z77bOlU+ew08Qck9sbYkdSePr0Pw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + + vue-component-type-helpers@3.3.6: + resolution: {integrity: sha512-FkljacAwJ9BUoSUdpFe3VDy0sGigNlTH9+2zcXUWmZOjN8swiCkl3t48wOJun0OsUd2cEIda1l04tsxMiKIIrQ==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -8258,12 +8910,22 @@ packages: vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + vue-docgen-api@4.79.2: + resolution: {integrity: sha512-n9ENAcs+40awPZMsas7STqjkZiVlIjxIKgiJr5rSohDP0/JCrD9VtlzNojafsA1MChm/hz2h3PDtUedx3lbgfA==} + peerDependencies: + vue: '>=2' + vue-eslint-parser@10.4.1: resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue-inbrowser-compiler-independent-utils@4.71.1: + resolution: {integrity: sha512-K3wt3iVmNGaFEOUR4JIThQRWfqokxLfnPslD41FDZB2ajXp789+wCqJyGYlIFsvEQ2P61PInw6/ph5iiqg51gg==} + peerDependencies: + vue: '>=2' + vue-resize@2.0.0-alpha.1: resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} peerDependencies: @@ -8362,6 +9024,10 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -8468,6 +9134,8 @@ snapshots: cronstrue: 2.59.0 yaml: 2.9.0 + '@adobe/css-tools@4.5.0': {} + '@antfu/eslint-config@9.1.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3))(@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(@unocss/eslint-plugin@66.7.4(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.39)(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.9(@types/node@25.0.3)(vite@8.1.2))': dependencies: '@antfu/install-pkg': 1.1.0 @@ -8705,6 +9373,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.29.7': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -8820,6 +9490,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -8830,6 +9506,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -9249,6 +9930,13 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.3 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9873,6 +10561,9 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.133.0': optional: true + '@oxc-parser/binding-android-arm-eabi@0.127.0': + optional: true + '@oxc-parser/binding-android-arm-eabi@0.129.0': optional: true @@ -9885,6 +10576,9 @@ snapshots: '@oxc-parser/binding-android-arm-eabi@0.133.0': optional: true + '@oxc-parser/binding-android-arm64@0.127.0': + optional: true + '@oxc-parser/binding-android-arm64@0.129.0': optional: true @@ -9897,6 +10591,9 @@ snapshots: '@oxc-parser/binding-android-arm64@0.133.0': optional: true + '@oxc-parser/binding-darwin-arm64@0.127.0': + optional: true + '@oxc-parser/binding-darwin-arm64@0.129.0': optional: true @@ -9909,6 +10606,9 @@ snapshots: '@oxc-parser/binding-darwin-arm64@0.133.0': optional: true + '@oxc-parser/binding-darwin-x64@0.127.0': + optional: true + '@oxc-parser/binding-darwin-x64@0.129.0': optional: true @@ -9921,6 +10621,9 @@ snapshots: '@oxc-parser/binding-darwin-x64@0.133.0': optional: true + '@oxc-parser/binding-freebsd-x64@0.127.0': + optional: true + '@oxc-parser/binding-freebsd-x64@0.129.0': optional: true @@ -9933,6 +10636,9 @@ snapshots: '@oxc-parser/binding-freebsd-x64@0.133.0': optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.129.0': optional: true @@ -9945,6 +10651,9 @@ snapshots: '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.129.0': optional: true @@ -9957,6 +10666,9 @@ snapshots: '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.129.0': optional: true @@ -9969,6 +10681,9 @@ snapshots: '@oxc-parser/binding-linux-arm64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm64-musl@0.129.0': optional: true @@ -9981,6 +10696,9 @@ snapshots: '@oxc-parser/binding-linux-arm64-musl@0.133.0': optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.129.0': optional: true @@ -9993,6 +10711,9 @@ snapshots: '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.129.0': optional: true @@ -10005,6 +10726,9 @@ snapshots: '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.129.0': optional: true @@ -10017,6 +10741,9 @@ snapshots: '@oxc-parser/binding-linux-riscv64-musl@0.133.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.129.0': optional: true @@ -10029,6 +10756,9 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-x64-gnu@0.129.0': optional: true @@ -10041,6 +10771,9 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-x64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-x64-musl@0.129.0': optional: true @@ -10053,6 +10786,9 @@ snapshots: '@oxc-parser/binding-linux-x64-musl@0.133.0': optional: true + '@oxc-parser/binding-openharmony-arm64@0.127.0': + optional: true + '@oxc-parser/binding-openharmony-arm64@0.129.0': optional: true @@ -10065,6 +10801,13 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.133.0': optional: true + '@oxc-parser/binding-wasm32-wasi@0.127.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + '@oxc-parser/binding-wasm32-wasi@0.129.0': dependencies: '@emnapi/core': 1.10.0 @@ -10093,51 +10836,123 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.129.0': + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.129.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.132.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.133.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.129.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.132.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.133.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.129.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.131.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.132.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.133.0': + optional: true + + '@oxc-project/types@0.127.0': {} + + '@oxc-project/types@0.129.0': {} + + '@oxc-project/types@0.131.0': {} + + '@oxc-project/types@0.132.0': {} + + '@oxc-project/types@0.133.0': {} + + '@oxc-project/types@0.137.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.23.0': + optional: true + + '@oxc-resolver/binding-android-arm64@11.23.0': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.23.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.131.0': + '@oxc-resolver/binding-darwin-x64@11.23.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.132.0': + '@oxc-resolver/binding-freebsd-x64@11.23.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.133.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.23.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.129.0': + '@oxc-resolver/binding-linux-arm-musleabihf@11.23.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.131.0': + '@oxc-resolver/binding-linux-arm64-gnu@11.23.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.132.0': + '@oxc-resolver/binding-linux-arm64-musl@11.23.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.133.0': + '@oxc-resolver/binding-linux-ppc64-gnu@11.23.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.129.0': + '@oxc-resolver/binding-linux-riscv64-gnu@11.23.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.131.0': + '@oxc-resolver/binding-linux-riscv64-musl@11.23.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.132.0': + '@oxc-resolver/binding-linux-s390x-gnu@11.23.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.133.0': + '@oxc-resolver/binding-linux-x64-gnu@11.23.0': optional: true - '@oxc-project/types@0.129.0': {} + '@oxc-resolver/binding-linux-x64-musl@11.23.0': + optional: true - '@oxc-project/types@0.131.0': {} + '@oxc-resolver/binding-openharmony-arm64@11.23.0': + optional: true - '@oxc-project/types@0.132.0': {} + '@oxc-resolver/binding-wasm32-wasi@11.23.0': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true - '@oxc-project/types@0.133.0': {} + '@oxc-resolver/binding-win32-arm64-msvc@11.23.0': + optional: true - '@oxc-project/types@0.137.0': {} + '@oxc-resolver/binding-win32-x64-msvc@11.23.0': + optional: true '@oxc-transform/binding-android-arm-eabi@0.133.0': optional: true @@ -10616,6 +11431,57 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@storybook/builder-vite@10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1))': + dependencies: + '@storybook/csf-plugin': 10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)) + storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + ts-dedent: 2.2.0 + vite: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) + transitivePeerDependencies: + - esbuild + - rollup + - webpack + + '@storybook/csf-plugin@10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1))': + dependencies: + storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + unplugin: 2.3.11 + optionalDependencies: + esbuild: 0.28.1 + rollup: 4.60.2 + vite: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) + webpack: 5.104.1(esbuild@0.28.1) + + '@storybook/global@5.0.0': {} + + '@storybook/icons@2.1.0(react@19.2.7)': + dependencies: + react: 19.2.7 + + '@storybook/vue3-vite@10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(vue@3.5.39(typescript@6.0.3))(webpack@5.104.1(esbuild@0.28.1))': + dependencies: + '@storybook/builder-vite': 10.4.6(esbuild@0.28.1)(rollup@4.60.2)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)) + '@storybook/vue3': 10.4.6(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vue@3.5.39(typescript@6.0.3)) + magic-string: 0.30.21 + storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + typescript: 5.9.3 + vite: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) + vue-component-meta: 2.2.12(typescript@5.9.3) + vue-docgen-api: 4.79.2(vue@3.5.39(typescript@6.0.3)) + transitivePeerDependencies: + - esbuild + - rollup + - vue + - webpack + + '@storybook/vue3@10.4.6(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))(vue@3.5.39(typescript@6.0.3))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + type-fest: 5.8.0 + vue: 3.5.39(typescript@6.0.3) + vue-component-type-helpers: 3.3.6 + '@stylistic/eslint-plugin@5.10.0(eslint@10.6.0(jiti@2.7.0))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) @@ -10710,6 +11576,30 @@ snapshots: '@tanstack/virtual-core': 3.13.18 vue: 3.5.39(typescript@6.0.3) + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.5.0 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@turbo/darwin-64@2.10.2': optional: true @@ -10733,6 +11623,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.7 @@ -11761,6 +12653,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 @@ -11786,6 +12686,10 @@ snapshots: optionalDependencies: vite: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 @@ -11802,8 +12706,18 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + '@vitest/spy@4.1.9': {} + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@vitest/utils@4.1.9': dependencies: '@vitest/pretty-format': 4.1.9 @@ -11846,12 +12760,24 @@ snapshots: - universal-cookie - vite + '@volar/language-core@2.4.15': + dependencies: + '@volar/source-map': 2.4.15 + '@volar/language-core@2.4.28': dependencies: '@volar/source-map': 2.4.28 + '@volar/source-map@2.4.15': {} + '@volar/source-map@2.4.28': {} + '@volar/typescript@2.4.15': + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + '@volar/typescript@2.4.28': dependencies: '@volar/language-core': 2.4.28 @@ -11935,6 +12861,11 @@ snapshots: '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + '@vue/devtools-api@8.1.2': dependencies: '@vue/devtools-kit': 8.1.2 @@ -11954,6 +12885,19 @@ snapshots: '@vue/devtools-shared@8.1.2': {} + '@vue/language-core@2.2.12(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.39 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + '@vue/language-core@3.3.6': dependencies: '@volar/language-core': 2.4.28 @@ -12152,6 +13096,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@webcontainer/env@1.1.1': {} + '@xterm/addon-fit@0.11.0': {} '@xterm/xterm@6.0.0': {} @@ -12180,6 +13126,8 @@ snapshots: dependencies: acorn: 8.16.0 + acorn@7.4.1: {} + acorn@8.16.0: {} actionspack@0.1.5: @@ -12214,6 +13162,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + alien-signals@1.0.13: {} + alien-signals@3.2.0: {} ansi-align@3.0.1: @@ -12228,6 +13178,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.3.1: {} @@ -12278,6 +13230,16 @@ snapshots: dependencies: tslib: 2.8.1 + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + asap@2.0.6: {} + + assert-never@1.4.0: {} + assertion-error@2.0.1: {} ast-kit@2.2.0: @@ -12291,6 +13253,10 @@ snapshots: estree-walker: 3.0.3 pathe: 2.0.3 + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + ast-walker-scope@0.9.0: dependencies: '@babel/parser': 7.29.7 @@ -12330,6 +13296,10 @@ snapshots: optionalDependencies: solid-js: 1.9.13 + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.29.7 + balanced-match@1.0.2: {} balanced-match@4.0.3: {} @@ -12436,6 +13406,16 @@ snapshots: cac@7.0.0: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + camelcase@7.0.1: {} caniuse-api@3.0.0: @@ -12449,6 +13429,14 @@ snapshots: ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chai@6.2.2: {} chalk-template@0.4.0: @@ -12470,6 +13458,12 @@ snapshots: character-entities@2.0.2: {} + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + + check-error@2.1.3: {} + chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -12562,6 +13556,11 @@ snapshots: consola@3.4.2: {} + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + content-disposition@0.5.2: {} convert-source-map@2.0.0: {} @@ -12627,6 +13626,8 @@ snapshots: css-what@6.2.2: {} + css.escape@1.5.1: {} + cssesc@3.0.0: {} cssnano-preset-default@8.0.1(postcss@8.5.16): @@ -12866,6 +13867,8 @@ snapshots: db0@0.3.4: {} + de-indent@1.0.2: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -12878,6 +13881,8 @@ snapshots: dependencies: character-entities: 2.0.2 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -12977,6 +13982,12 @@ snapshots: diff@9.0.0: {} + doctypes@1.1.0: {} + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -13005,7 +14016,15 @@ snapshots: dotenv@17.4.2: {} - dts-resolver@3.0.0: {} + dts-resolver@3.0.0(oxc-resolver@11.23.0): + optionalDependencies: + oxc-resolver: 11.23.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 duplexer@0.1.2: {} @@ -13042,8 +14061,16 @@ snapshots: errx@0.1.0: {} + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-toolkit@1.46.1: {} esbuild@0.28.1: @@ -13385,6 +14412,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-resolve@1.0.11: {} + espree@10.4.0: dependencies: acorn: 8.16.0 @@ -13572,8 +14601,26 @@ snapshots: get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-port-please@3.2.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -13634,6 +14681,8 @@ snapshots: globrex@0.1.2: {} + gopd@1.2.0: {} + graceful-fs@4.2.11: {} gray-matter@4.0.3: @@ -13672,6 +14721,14 @@ snapshots: has-flag@4.0.0: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-sum@2.0.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -13694,6 +14751,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + he@1.2.0: {} + hookable@5.5.3: {} hookable@6.1.1: {} @@ -13787,6 +14846,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + indent-string@5.0.0: {} inherits@2.0.4: {} @@ -13827,6 +14888,11 @@ snapshots: is-docker@3.0.0: {} + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -13856,10 +14922,19 @@ snapshots: is-port-reachable@4.0.0: {} + is-promise@2.2.2: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.9 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -13894,6 +14969,8 @@ snapshots: jiti@2.7.0: {} + js-stringify@1.0.2: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -13938,6 +15015,11 @@ snapshots: jsonc-parser@3.3.1: {} + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + katex@0.16.47: dependencies: commander: 8.3.0 @@ -14131,6 +15213,8 @@ snapshots: longest-streak@3.1.0: {} + loupe@3.2.1: {} + lru-cache@10.4.3: {} lru-cache@11.2.7: {} @@ -14139,6 +15223,8 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@8.0.5: {} + lz-string@1.5.0: {} magic-regexp@0.10.0: @@ -14214,6 +15300,8 @@ snapshots: marked@16.4.2: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -14626,6 +15714,8 @@ snapshots: mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + minimatch@10.2.4: dependencies: brace-expansion: 5.0.2 @@ -15262,6 +16352,8 @@ snapshots: pathe: 2.0.3 tinyexec: 1.2.4 + object-assign@4.1.1: {} + object-deep-merge@2.0.1: {} obug@2.1.3: {} @@ -15348,6 +16440,31 @@ snapshots: '@oxc-minify/binding-win32-ia32-msvc': 0.133.0 '@oxc-minify/binding-win32-x64-msvc': 0.133.0 + oxc-parser@0.127.0: + dependencies: + '@oxc-project/types': 0.127.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.127.0 + '@oxc-parser/binding-android-arm64': 0.127.0 + '@oxc-parser/binding-darwin-arm64': 0.127.0 + '@oxc-parser/binding-darwin-x64': 0.127.0 + '@oxc-parser/binding-freebsd-x64': 0.127.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 + '@oxc-parser/binding-linux-arm64-musl': 0.127.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-musl': 0.127.0 + '@oxc-parser/binding-openharmony-arm64': 0.127.0 + '@oxc-parser/binding-wasm32-wasi': 0.127.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 + '@oxc-parser/binding-win32-x64-msvc': 0.127.0 + oxc-parser@0.129.0: dependencies: '@oxc-project/types': 0.129.0 @@ -15448,6 +16565,28 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.133.0 '@oxc-parser/binding-win32-x64-msvc': 0.133.0 + oxc-resolver@11.23.0: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.23.0 + '@oxc-resolver/binding-android-arm64': 11.23.0 + '@oxc-resolver/binding-darwin-arm64': 11.23.0 + '@oxc-resolver/binding-darwin-x64': 11.23.0 + '@oxc-resolver/binding-freebsd-x64': 11.23.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.23.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.23.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.23.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.23.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.23.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.23.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.23.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.23.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.23.0 + '@oxc-resolver/binding-linux-x64-musl': 11.23.0 + '@oxc-resolver/binding-openharmony-arm64': 11.23.0 + '@oxc-resolver/binding-wasm32-wasi': 11.23.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.23.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.23.0 + oxc-transform@0.133.0: optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.133.0 @@ -15576,6 +16715,8 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + perfect-debounce@2.1.0: {} picocolors@1.1.1: {} @@ -15789,10 +16930,20 @@ snapshots: pretty-bytes@7.1.0: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + process-nextick-args@2.0.1: {} process@0.11.10: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 @@ -15809,6 +16960,73 @@ snapshots: sade: 1.8.1 optional: true + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.4: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.11 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.4: + dependencies: + pug-code-gen: 3.0.4 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -15846,6 +17064,8 @@ snapshots: react: 19.2.7 scheduler: 0.27.0 + react-is@17.0.2: {} + react@19.2.7: {} readable-stream@2.3.8: @@ -15872,6 +17092,19 @@ snapshots: readdirp@5.0.0: {} + recast@0.23.12: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -15949,14 +17182,14 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.26.0(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)): + rolldown-plugin-dts@0.26.0(oxc-resolver@11.23.0)(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)): dependencies: '@babel/generator': 8.0.0 '@babel/helper-validator-identifier': 8.0.2 '@babel/parser': 8.0.0 ast-kit: 3.0.0 birpc: 4.0.0 - dts-resolver: 3.0.0 + dts-resolver: 3.0.0(oxc-resolver@11.23.0) get-tsconfig: 5.0.0-beta.5 obug: 2.1.3 rolldown: 1.1.3 @@ -16279,6 +17512,32 @@ snapshots: std-env@4.1.0: {} + storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7): + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.1.0(react@19.2.7) + '@testing-library/jest-dom': 6.9.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + '@webcontainer/env': 1.1.1 + esbuild: 0.28.1 + open: 10.2.0 + oxc-parser: 0.127.0 + oxc-resolver: 11.23.0 + recast: 0.23.12 + semver: 7.8.5 + use-sync-external-store: 1.6.0(react@19.2.7) + ws: 8.21.0 + optionalDependencies: + '@types/react': 19.2.17 + prettier: 2.8.8 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - react + - utf-8-validate + streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -16333,6 +17592,10 @@ snapshots: strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-indent@4.1.1: {} strip-json-comments@2.0.1: {} @@ -16443,8 +17706,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyrainbow@2.0.0: {} + tinyrainbow@3.1.0: {} + tinyspy@4.0.4: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -16456,6 +17723,8 @@ snapshots: toidentifier@1.0.1: {} + token-stream@1.0.0: {} + toml-eslint-parser@1.0.3: dependencies: eslint-visitor-keys: 5.0.1 @@ -16474,7 +17743,9 @@ snapshots: ts-dedent@2.2.0: {} - tsdown@0.22.3(@vitejs/devtools@0.3.4)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)): + ts-map@1.0.3: {} + + tsdown@0.22.3(@vitejs/devtools@0.3.4)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)): dependencies: ansis: 4.3.1 cac: 7.0.0 @@ -16485,7 +17756,7 @@ snapshots: obug: 2.1.3 picomatch: 4.0.4 rolldown: 1.1.3 - rolldown-plugin-dts: 0.26.0(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)) + rolldown-plugin-dts: 0.26.0(oxc-resolver@11.23.0)(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)) semver: 7.8.5 tinyexec: 1.2.4 tinyglobby: 0.2.17 @@ -16503,7 +17774,7 @@ snapshots: - oxc-resolver - vue-tsc - tsdown@0.22.3(@vitejs/devtools@packages+core)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)): + tsdown@0.22.3(@vitejs/devtools@packages+core)(oxc-resolver@11.23.0)(publint@0.3.21)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1(synckit@0.11.13))(vue-tsc@3.3.6(typescript@6.0.3)): dependencies: ansis: 4.3.1 cac: 7.0.0 @@ -16514,7 +17785,7 @@ snapshots: obug: 2.1.3 picomatch: 4.0.4 rolldown: 1.1.3 - rolldown-plugin-dts: 0.26.0(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)) + rolldown-plugin-dts: 0.26.0(oxc-resolver@11.23.0)(rolldown@1.1.3)(typescript@6.0.3)(vue-tsc@3.3.6(typescript@6.0.3)) semver: 7.8.5 tinyexec: 1.2.4 tinyglobby: 0.2.17 @@ -16588,8 +17859,14 @@ snapshots: dependencies: tagged-tag: 1.0.0 + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type-level-regexp@0.1.17: {} + typescript@5.9.3: {} + typescript@6.0.3: {} ua-parser-modern@0.1.1: {} @@ -16926,6 +18203,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + util-deprecate@1.0.2: {} uuid@11.1.0: {} @@ -17103,7 +18384,7 @@ snapshots: - utf-8-validate - webpack - vite-plugin-solid@2.11.12(solid-js@1.9.13)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)): + vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -17113,6 +18394,8 @@ snapshots: solid-refresh: 0.6.3(solid-js@1.9.13) vite: 8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0) vitefu: 1.1.2(vite@8.1.2(@types/node@25.0.3)(@vitejs/devtools@packages+core)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.44.1)(tsx@4.22.4)(yaml@2.9.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color @@ -17293,18 +18576,49 @@ snapshots: transitivePeerDependencies: - msw + void-elements@3.1.0: {} + vscode-uri@3.1.0: {} vue-bundle-renderer@2.2.0: dependencies: ufo: 1.6.4 + vue-component-meta@2.2.12(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.9.3) + path-browserify: 1.0.1 + vue-component-type-helpers: 2.2.12 + optionalDependencies: + typescript: 5.9.3 + + vue-component-type-helpers@2.2.12: {} + + vue-component-type-helpers@3.3.6: {} + vue-demi@0.14.10(vue@3.5.39(typescript@6.0.3)): dependencies: vue: 3.5.39(typescript@6.0.3) vue-devtools-stub@0.1.0: {} + vue-docgen-api@4.79.2(vue@3.5.39(typescript@6.0.3)): + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-sfc': 3.5.39 + ast-types: 0.16.1 + esm-resolve: 1.0.11 + hash-sum: 2.0.0 + lru-cache: 8.0.5 + pug: 3.0.4 + recast: 0.23.12 + ts-map: 1.0.3 + vue: 3.5.39(typescript@6.0.3) + vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.39(typescript@6.0.3)) + vue-eslint-parser@10.4.1(eslint@10.6.0(jiti@2.7.0)): dependencies: debug: 4.4.3 @@ -17317,6 +18631,10 @@ snapshots: transitivePeerDependencies: - supports-color + vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.39(typescript@6.0.3)): + dependencies: + vue: 3.5.39(typescript@6.0.3) + vue-resize@2.0.0-alpha.1(vue@3.5.39(typescript@6.0.3)): dependencies: vue: 3.5.39(typescript@6.0.3) @@ -17487,6 +18805,13 @@ snapshots: dependencies: string-width: 5.1.2 + with@7.0.2: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ce40dd2c..6bd4934d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -41,6 +41,7 @@ catalogs: '@nuxt/kit': ^4.4.8 '@nuxt/vite-builder': ^4.4.8 '@unocss/nuxt': ^66.7.4 + '@unocss/reset': ^66.7.4 '@vitejs/plugin-vue': ^6.0.7 '@vueuse/nuxt': ^14.3.0 esbuild: ^0.28.1 @@ -83,6 +84,7 @@ catalogs: '@antfu/eslint-config': ^9.1.0 '@nuxt/devtools': ^3.2.4 '@nuxt/eslint': ^1.16.0 + '@storybook/vue3-vite': ^10.4.6 '@typescript-eslint/utils': ^8.62.1 '@unocss/eslint-config': ^66.7.4 '@unocss/preset-web-fonts': ^66.7.4 @@ -95,6 +97,7 @@ catalogs: simple-git-hooks: ^2.13.1 skills-npm: ^1.2.0 solid-js: ^1.9.13 + storybook: ^10.4.6 typescript: ^6.0.3 vite-plugin-inspect: ^12.0.0-beta.3 vite-plugin-solid: ^2.11.12 diff --git a/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.d.ts b/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.d.ts index 8e82716b..4d6287f9 100644 --- a/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.d.ts +++ b/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.d.ts @@ -4,11 +4,19 @@ // #region Functions export declare function createDockEntryState(_: DevToolsDockEntry, _: Ref): DockEntryState; export declare function DEFAULT_DOCK_PANEL_STORE(): DockPanelStorage; +export declare function registerDockEmbedded(): VueElementConstructor<{ + context: DocksContext; +}>; +export declare function registerDockStandalone(): VueElementConstructor<{ + context: DocksContext; +}>; export declare function sharedStateToRef(_: SharedState): ShallowRef; export declare function useDocksEntries(_: DevToolsRpcClient): Promise>; // #endregion // #region Variables +export declare const DOCK_EMBEDDED_TAG: string; +export declare const DOCK_STANDALONE_TAG: string; export declare const DockEmbedded: VueElementConstructor<{ context: DocksContext; }>; diff --git a/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.js b/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.js index f07f79d5..6dd57eb0 100644 --- a/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.js +++ b/test/__snapshots__/tsnapi/@vitejs/devtools/client/webcomponents.snapshot.js @@ -1,14 +1,21 @@ /** * Generated by tsnapi — public API snapshot of `@vitejs/devtools/client/webcomponents` */ +// #region Functions +export function registerDockEmbedded() {} +// #endregion + // #region Variables +export var DOCK_EMBEDDED_TAG /* const */ export var DockEmbedded /* const */ // #endregion // #region Other export { createDockEntryState } export { DEFAULT_DOCK_PANEL_STORE } +export { DOCK_STANDALONE_TAG } export { DockStandalone } +export { registerDockStandalone } export { sharedStateToRef } export { useDocksEntries } // #endregion \ No newline at end of file From 479792f5e9ec28279f3b75b441a14ec698fc4617 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Mon, 6 Jul 2026 05:06:42 +0000 Subject: [PATCH 2/2] fix(core): render Storybook decorator via template, not h(story) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The preview decorator rendered the story through h(story), but the first argument a Vue decorator receives is Storybook's story-context gate function, not the story component — h() coerced its returned options object to a text node, so every story showed "[object Object]". Wrap with a template that resolves the story component Storybook injects into components.story. --- packages/core/.storybook/preview.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/.storybook/preview.ts b/packages/core/.storybook/preview.ts index ad78221f..bf165d35 100644 --- a/packages/core/.storybook/preview.ts +++ b/packages/core/.storybook/preview.ts @@ -1,5 +1,4 @@ import type { Preview } from '@storybook/vue3-vite' -import { h } from 'vue' import '@unocss/reset/tailwind.css' import '@xterm/xterm/css/xterm.css' @@ -44,9 +43,12 @@ const preview: Preview = { decorators: [ (story, context) => { applyTheme((context.globals.theme as Theme) ?? 'dark') + // Wrap via a template so Storybook composes the StoryFn into a real + // component. Rendering the raw `story` fn through `h()` coerces its + // return to a text node ("[object Object]"). return { components: { story }, - render: () => h('div', { class: 'vite-devtools-storybook-root color-base bg-base' }, [h(story)]), + template: `
`, } }, ],