diff --git a/.gitignore b/.gitignore index 0f9cf2a7..b547a88f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ packages/kit/skills *.tsbuildinfo **/.vitepress/cache .turbo +storybook-static .context .ghfs diff --git a/package.json b/package.json index 58e00b2d..ca72fbb6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "docs": "pnpm -C docs run docs", "docs:build": "pnpm build && pnpm -C docs run docs:build", "docs:serve": "pnpm -C docs run docs:serve", + "storybook": "pnpm -C storybook run dev", "play": "pnpm -C packages/core run play", "play:debug": "pnpm -C packages/core run play:debug", "play:standalone": "pnpm -C packages/core run play:standalone", diff --git a/packages/core/src/client/webcomponents/components/command-palette/CommandPalette.stories.ts b/packages/core/src/client/webcomponents/components/command-palette/CommandPalette.stories.ts new file mode 100644 index 00000000..b6709144 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/command-palette/CommandPalette.stories.ts @@ -0,0 +1,47 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { defineComponent, h, onMounted } from 'vue' +import { groupedEntries } from '../../stories/fixtures' +import { mountWithContext } from '../../stories/story-helpers' +import CommandPalette from './CommandPalette.vue' + +const meta = { + title: 'Commands/Palette', + component: CommandPalette, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + // Fixed, full-screen overlay — render in an iframe for the docs canvas. + docs: { + story: { inline: false, height: '480px' }, + description: { + component: 'The ⌘K command palette. Lists client + server commands (and dock navigation), supports fuzzy search and drill-down into grouped commands.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** + * The palette opened over the built-in and dock-navigation commands. + * + * `paletteOpen` is flipped in `onMounted` (not before mount): the palette's + * open transition keys off the `show` change, so a value that's already `true` + * at mount would leave it stuck at `opacity-0`. + */ +export const Open: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: groupedEntries }, + ctx => h(defineComponent({ + setup() { + onMounted(() => { + ctx.commands.paletteOpen = true + }) + return () => h(CommandPalette, { context: ctx }) + }, + })), + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/command-palette/CommandPaletteItem.stories.ts b/packages/core/src/client/webcomponents/components/command-palette/CommandPaletteItem.stories.ts new file mode 100644 index 00000000..594d1766 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/command-palette/CommandPaletteItem.stories.ts @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsCommandEntry } from '@vitejs/devtools-kit' +import CommandPaletteItem from './CommandPaletteItem.vue' + +const entry: DevToolsCommandEntry = { + id: 'devtools:open-settings', + source: 'client', + title: 'Open Settings', + icon: 'ph:gear-duotone', +} as DevToolsCommandEntry + +const meta = { + title: 'Commands/PaletteItem', + component: CommandPaletteItem, + tags: ['autodocs'], + decorators: [() => ({ template: '
' })], + args: { + entry, + showParentTitle: false, + selected: false, + loading: false, + keybindings: [], + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** A resting command row. */ +export const Default: Story = {} + +/** The highlighted (keyboard-focused) row. */ +export const Selected: Story = { args: { selected: true } } + +/** With a keybinding badge on the right. */ +export const WithKeybinding: Story = { + args: { keybindings: [{ key: 'Mod+,' }] }, +} + +/** A child command showing its parent group as a prefix. */ +export const WithParentTitle: Story = { + args: { parentTitle: 'Docks', showParentTitle: true }, +} + +/** Mid-execution: the row shows a spinner. */ +export const Loading: Story = { args: { loading: true, selected: true } } diff --git a/packages/core/src/client/webcomponents/components/command-palette/KeybindingBadge.stories.ts b/packages/core/src/client/webcomponents/components/command-palette/KeybindingBadge.stories.ts new file mode 100644 index 00000000..9ff1c8e6 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/command-palette/KeybindingBadge.stories.ts @@ -0,0 +1,35 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import KeybindingBadge from './KeybindingBadge.vue' + +const meta = { + title: 'Commands/KeybindingBadge', + component: KeybindingBadge, + tags: ['autodocs'], + decorators: [() => ({ template: '
' })], + args: { keyString: 'Mod+K' }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** A single chord, formatted for the current platform (⌘ on macOS, Ctrl elsewhere). */ +export const Default: Story = {} + +/** A shortcut with a modifier and shift. */ +export const WithShift: Story = { args: { keyString: 'Mod+Shift+P' } } + +/** A plain key. */ +export const SingleKey: Story = { args: { keyString: 'Escape' } } + +/** Several badges together, as the palette lists them. */ +export const Gallery: Story = { + render: () => ({ + setup: () => () => h('div', { class: 'flex flex-col gap-2 items-start p6 font-sans' }, [ + h(KeybindingBadge, { keyString: 'Mod+K' }), + h(KeybindingBadge, { keyString: 'Mod+Shift+P' }), + h(KeybindingBadge, { keyString: 'Escape' }), + h(KeybindingBadge, { keyString: 'Alt+ArrowUp' }), + ]), + }), +} diff --git a/packages/core/src/client/webcomponents/components/display/Confirm.stories.ts b/packages/core/src/client/webcomponents/components/display/Confirm.stories.ts new file mode 100644 index 00000000..c5cec14c --- /dev/null +++ b/packages/core/src/client/webcomponents/components/display/Confirm.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h, onMounted } from 'vue' +import { useConfirm } from '../../state/confirm' +import Confirm from './Confirm.vue' + +const meta = { + title: 'Display/Confirm', + component: Confirm, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + // Fixed, full-screen modal — render in an iframe for the docs canvas. + docs: { + story: { inline: false, height: '360px' }, + description: { + component: 'The confirmation dialog, driven by the `useConfirm()` template-promise. These stories trigger it on mount.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function confirmStory(options: { title?: string, message: string, confirmText?: string, cancelText?: string }): Story { + return { + render: () => ({ + setup() { + const confirm = useConfirm() + onMounted(() => { + confirm(options) + }) + return () => h(Confirm) + }, + }), + } +} + +/** A titled destructive confirmation. */ +export const Default: Story = confirmStory({ + title: 'Remove workspace?', + message: 'This deletes the worktree and branch. This cannot be undone.', + confirmText: 'Remove', + cancelText: 'Cancel', +}) + +/** A message-only prompt (no title). */ +export const MessageOnly: Story = confirmStory({ + message: 'Reload the page to apply the new settings?', +}) diff --git a/packages/core/src/client/webcomponents/components/display/HashBadge.stories.ts b/packages/core/src/client/webcomponents/components/display/HashBadge.stories.ts new file mode 100644 index 00000000..005cd52e --- /dev/null +++ b/packages/core/src/client/webcomponents/components/display/HashBadge.stories.ts @@ -0,0 +1,31 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import HashBadge from './HashBadge.vue' + +const meta = { + title: 'Display/HashBadge', + component: HashBadge, + tags: ['autodocs'], + decorators: [() => ({ template: '
' })], + args: { label: 'a11y' }, + parameters: { + docs: { + description: { + component: 'A category/label chip whose colour is derived deterministically from the label text.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = {} + +/** The colour is stable per string — the same label always gets the same hue. */ +export const Palette: Story = { + render: () => ({ + setup: () => () => h('div', { class: 'flex flex-wrap gap-1.5 max-w-100 p6 font-sans' }, ['a11y', 'lint', 'runtime', 'test', 'network', 'build', 'hmr', 'plugin', 'vite', 'rolldown'] + .map(label => h(HashBadge, { key: label, label }))), + }), +} diff --git a/packages/core/src/client/webcomponents/components/display/ToastOverlay.stories.ts b/packages/core/src/client/webcomponents/components/display/ToastOverlay.stories.ts new file mode 100644 index 00000000..08b29191 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/display/ToastOverlay.stories.ts @@ -0,0 +1,38 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h, onMounted } from 'vue' +import { addToast } from '../../state/toasts' +import { message } from '../../stories/fixtures' +import ToastOverlay from './ToastOverlay.vue' + +const meta = { + title: 'Messages/ToastOverlay', + component: ToastOverlay, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + // Fixed bottom-right overlay — render in an iframe for the docs canvas. + docs: { + story: { inline: false, height: '360px' }, + description: { + component: 'The toast stack shown bottom-right for `notify` messages. These stories push toasts on mount (with a long auto-dismiss so they stay visible).', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** A few stacked toasts across levels. */ +export const Stack: Story = { + render: () => ({ + setup() { + onMounted(() => { + addToast(message({ level: 'error', message: 'Build failed', description: '2 errors in 1 file', notify: true, autoDismiss: 10 ** 7 })) + addToast(message({ level: 'warn', message: 'Slow HMR update (820ms)', notify: true, autoDismiss: 10 ** 7 })) + addToast(message({ level: 'success', message: 'Server ready on :5173', notify: true, autoDismiss: 10 ** 7 })) + }) + return () => h(ToastOverlay) + }, + }), +} diff --git a/packages/core/src/client/webcomponents/components/dock/Dock.stories.ts b/packages/core/src/client/webcomponents/components/dock/Dock.stories.ts new file mode 100644 index 00000000..4c546b06 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/dock/Dock.stories.ts @@ -0,0 +1,106 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import { categorizedEntries, groupedEntries, overflowEntries } from '../../stories/fixtures' +import { mountWithContext } from '../../stories/story-helpers' +import FloatingElements from '../floating/FloatingElements.vue' +import Dock from './Dock.vue' + +const meta = { + title: 'Dock/Shell/Float Bar', + component: Dock, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + // The shell is `position: fixed` to the viewport, so it escapes the small + // inline docs preview block — render it in an iframe of a fixed height. + docs: { + story: { inline: false, height: '520px' }, + description: { + component: 'The floating dock bar (float mode). It anchors to an edge of the viewport and can be dragged around. These stories pin `inactiveTimeout: -1` so the bar stays expanded.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** Default: docked to the bottom-center of the viewport. */ +export const Bottom: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { position: 'bottom', left: 50, top: 100, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Docked to the top edge. */ +export const Top: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { position: 'top', left: 50, top: 0, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Docked to the left edge — the bar rotates to vertical. */ +export const Left: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { position: 'left', left: 0, top: 50, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Docked to the right edge. */ +export const Right: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { position: 'right', left: 100, top: 50, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** With collapsed groups on the bar. */ +export const WithGroups: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: groupedEntries, panel: { position: 'bottom', left: 50, top: 100, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Past capacity: an overflow button appears at the end of the bar. */ +export const WithOverflow: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: overflowEntries, panel: { position: 'bottom', left: 50, top: 100, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Collapsed to the minimized nub (`inactiveTimeout: 0`). */ +export const Minimized: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { position: 'bottom', left: 50, top: 100, inactiveTimeout: 0 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} + +/** Unauthorized: the bar shows the warning affordance instead of the tools. */ +export const Unauthorized: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, isTrusted: false, panel: { position: 'bottom', left: 50, top: 100, inactiveTimeout: -1 } }, + ctx => [h(Dock, { context: ctx }), h(FloatingElements)], + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/dock/Dock.vue b/packages/core/src/client/webcomponents/components/dock/Dock.vue index 1067d044..7a6c96bb 100644 --- a/packages/core/src/client/webcomponents/components/dock/Dock.vue +++ b/packages/core/src/client/webcomponents/components/dock/Dock.vue @@ -5,6 +5,7 @@ import { computed, onMounted, reactive, ref, useTemplateRef, watchEffect } from import { BUILTIN_ENTRY_CLIENT_AUTH_NOTICE } from '../../constants' import { docksSplitGroupsWithCapacity } from '../../state/dock-settings' import { setDocksOverflowPanel } from '../../state/floating-tooltip' +import { useIsRpcTrusted } from '../../utils/useIsRpcTrusted' import BracketLeft from '../icons/BracketLeft.vue' import BracketRight from '../icons/BracketRight.vue' import VitePlusCore from '../icons/VitePlusCore.vue' @@ -68,9 +69,7 @@ function onPointerDown(e: PointerEvent) { draggingOffset.y = e.clientY - top - height / 2 } -const isRpcTrusted = ref(context.rpc.isTrusted) -context.rpc.events.on('rpc:is-trusted:updated', (isTrusted) => { - isRpcTrusted.value = isTrusted +const isRpcTrusted = useIsRpcTrusted(context, (isTrusted) => { if (isTrusted && context.docks.selected?.id === BUILTIN_ENTRY_CLIENT_AUTH_NOTICE.id) { context.docks.switchEntry(null) } diff --git a/packages/core/src/client/webcomponents/components/dock/DockEdge.stories.ts b/packages/core/src/client/webcomponents/components/dock/DockEdge.stories.ts new file mode 100644 index 00000000..439ee4e6 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/dock/DockEdge.stories.ts @@ -0,0 +1,82 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import { categorizedEntries, groupedEntries } from '../../stories/fixtures' +import { mountWithContext } from '../../stories/story-helpers' +import FloatingElements from '../floating/FloatingElements.vue' +import DockEdge from './DockEdge.vue' + +/** A stand-in panel body (the real one mounts iframe/custom views). */ +function body(entry: any) { + return h('div', { class: 'w-full h-full p6 font-sans color-base of-auto' }, [ + h('div', { class: 'text-lg font-medium mb2' }, entry?.title ?? 'No selection'), + h('div', { class: 'op60 text-sm' }, `Panel content for "${entry?.id ?? '—'}"`), + ]) +} + +const meta = { + title: 'Dock/Shell/Edge Panel', + component: DockEdge, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + docs: { + story: { inline: false, height: '520px' }, + description: { + component: 'The edge-docked shell (edge mode): a toolbar pinned to one viewport edge with a resizable panel. The `#view` slot is stubbed here in place of the live view renderer.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function edgeStory(position: 'top' | 'right' | 'bottom' | 'left', open = true) { + return { + render: () => ({ + setup: () => mountWithContext( + { + entries: categorizedEntries, + selectedId: open ? 'overview' : null, + panel: { mode: 'edge', position, open, height: 40, width: 30 }, + }, + ctx => [ + h(DockEdge, { context: ctx }, { view: ({ entry }: any) => body(entry) }), + h(FloatingElements), + ], + ), + }), + } satisfies Story +} + +/** Bottom edge with the panel open. */ +export const Bottom: Story = edgeStory('bottom') + +/** Top edge. */ +export const Top: Story = edgeStory('top') + +/** Left edge — toolbar runs vertically. */ +export const Left: Story = edgeStory('left') + +/** Right edge. */ +export const Right: Story = edgeStory('right') + +/** Toolbar only — nothing selected, so the panel body is collapsed away. */ +export const ToolbarOnly: Story = edgeStory('bottom', false) + +/** Edge dock hosting a group — the group rail shows inside the panel. */ +export const WithGroup: Story = { + render: () => ({ + setup: () => mountWithContext( + { + entries: groupedEntries, + selectedId: 'nuxt:overview', + panel: { mode: 'edge', position: 'bottom', open: true, height: 45 }, + }, + ctx => [ + h(DockEdge, { context: ctx }, { view: ({ entry }: any) => body(entry) }), + h(FloatingElements), + ], + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/dock/DockEdge.vue b/packages/core/src/client/webcomponents/components/dock/DockEdge.vue index 7ffacb80..a469a3d7 100644 --- a/packages/core/src/client/webcomponents/components/dock/DockEdge.vue +++ b/packages/core/src/client/webcomponents/components/dock/DockEdge.vue @@ -263,18 +263,20 @@ const contentClass = computed(() => { :selected-id="selectedEntry?.id ?? null" />
- -
+ + +
+
diff --git a/packages/core/src/client/webcomponents/components/dock/DockEmbedded.stories.ts b/packages/core/src/client/webcomponents/components/dock/DockEmbedded.stories.ts new file mode 100644 index 00000000..cbdc7b1b --- /dev/null +++ b/packages/core/src/client/webcomponents/components/dock/DockEmbedded.stories.ts @@ -0,0 +1,72 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsDockEntry } from '@vitejs/devtools-kit' +import { h } from 'vue' +import { categorizedEntries } from '../../stories/fixtures' +import { mountWithContext } from '../../stories/story-helpers' +import DockEmbedded from './DockEmbedded.vue' + +// Entries whose iframes load `about:blank`, so the full shell (address bar + +// iframe pane) renders without reaching for a dev server. +const blankEntries: DevToolsDockEntry[] = [ + { id: 'overview', type: 'iframe', url: 'about:blank', title: 'Overview', icon: 'ph:gauge-duotone' }, + { id: 'inspect', type: 'iframe', url: 'about:blank', title: 'Inspect', icon: 'ph:stethoscope-duotone' }, + { id: 'assets', type: 'iframe', url: 'about:blank', title: 'Assets', icon: 'ph:images-duotone' }, +] as DevToolsDockEntry[] + +const meta = { + title: 'Dock/Shell/Embedded', + component: DockEmbedded, + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + docs: { + story: { inline: false, height: '540px' }, + description: { + component: 'The full embedded shell as injected into a host app: the dock bar plus panel (float or edge), floating overlays, command palette, toasts and confirm dialog — switched by `panel.store.mode`.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** Float mode, panel closed — just the resting dock bar. */ +export const FloatClosed: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, panel: { mode: 'float', position: 'bottom', left: 50, top: 100, inactiveTimeout: -1 } }, + ctx => h(DockEmbedded, { context: ctx }), + ), + }), +} + +/** Float mode with the panel open over an `about:blank` iframe. */ +export const FloatOpen: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: blankEntries, selectedId: 'overview', panel: { mode: 'float', position: 'bottom', left: 50, top: 100, inactiveTimeout: -1, width: 60, height: 60 } }, + ctx => h(DockEmbedded, { context: ctx }), + ), + }), +} + +/** Edge mode, docked to the bottom with the panel open. */ +export const Edge: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: blankEntries, selectedId: 'overview', panel: { mode: 'edge', position: 'bottom', open: true, height: 45 } }, + ctx => h(DockEmbedded, { context: ctx }), + ), + }), +} + +/** Unauthorized — the shell forces float mode and shows the warning. */ +export const Unauthorized: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: categorizedEntries, isTrusted: false, panel: { mode: 'edge', position: 'bottom', inactiveTimeout: -1 } }, + ctx => h(DockEmbedded, { context: ctx }), + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/dock/DockEmbedded.vue b/packages/core/src/client/webcomponents/components/dock/DockEmbedded.vue index c0bbc98b..2d7d04fa 100644 --- a/packages/core/src/client/webcomponents/components/dock/DockEmbedded.vue +++ b/packages/core/src/client/webcomponents/components/dock/DockEmbedded.vue @@ -1,9 +1,10 @@ diff --git a/packages/core/src/client/webcomponents/components/message/MessageItem.stories.ts b/packages/core/src/client/webcomponents/components/message/MessageItem.stories.ts new file mode 100644 index 00000000..3504b460 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/message/MessageItem.stories.ts @@ -0,0 +1,41 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import { message, sampleMessages } from '../../stories/fixtures' +import MessageItem from './MessageItem.vue' + +const meta = { + title: 'Messages/MessageItem', + component: MessageItem, + tags: ['autodocs'], + decorators: [() => ({ template: '
' })], + parameters: { + docs: { + description: { + component: 'A single log/message row: level accent, icon, title, description, relative time and category/label chips.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Error: Story = { + render: () => ({ setup: () => () => h(MessageItem, { entry: sampleMessages[0]! }) }), +} + +export const Loading: Story = { + render: () => ({ setup: () => () => h(MessageItem, { entry: message({ level: 'warn', message: 'Running checks…', status: 'loading', category: 'a11y' }) }) }), +} + +/** The compact variant used inside toasts (no timestamp / chips). */ +export const Compact: Story = { + render: () => ({ setup: () => () => h(MessageItem, { entry: sampleMessages[2]!, compact: true }) }), +} + +/** Every level stacked together. */ +export const AllLevels: Story = { + render: () => ({ + setup: () => () => h('div', { class: 'flex flex-col gap-3' }, sampleMessages.map(entry => h(MessageItem, { key: entry.id, entry }))), + }), +} diff --git a/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinClientAuthNotice.stories.ts b/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinClientAuthNotice.stories.ts new file mode 100644 index 00000000..dddb5b14 --- /dev/null +++ b/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinClientAuthNotice.stories.ts @@ -0,0 +1,29 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { h } from 'vue' +import { mountWithContext } from '../../stories/story-helpers' +import ViewBuiltinClientAuthNotice from './ViewBuiltinClientAuthNotice.vue' + +const meta = { + title: 'Views/Builtin/AuthNotice', + component: ViewBuiltinClientAuthNotice, + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'The authorization prompt shown when the client is not yet trusted — explains the risk and takes a one-time code.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = { + render: () => ({ + setup: () => mountWithContext( + { isTrusted: false }, + ctx => h('div', { class: 'h-140 bg-base color-base border border-base rounded-lg overflow-auto' }, h(ViewBuiltinClientAuthNotice, { context: ctx })), + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinSettings.stories.ts b/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinSettings.stories.ts new file mode 100644 index 00000000..a4a777fc --- /dev/null +++ b/packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinSettings.stories.ts @@ -0,0 +1,53 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsViewBuiltin } from '@vitejs/devtools-kit' +import { h } from 'vue' +import { groupedEntries } from '../../stories/fixtures' +import { mountWithContext } from '../../stories/story-helpers' +import ViewBuiltinSettings from './ViewBuiltinSettings.vue' + +const entry: DevToolsViewBuiltin = { + type: '~builtin', + id: '~settings', + title: 'Settings', + icon: 'ph:gear-duotone', +} + +function stage(children: any) { + return h('div', { class: 'h-140 bg-base color-base border border-base rounded-lg overflow-hidden font-sans' }, children) +} + +const meta = { + title: 'Views/Builtin/Settings', + component: ViewBuiltinSettings, + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'The built-in settings view: Appearance, Docks, Shortcuts and Advanced tabs. Click the tabs to switch.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** Embedded client — the Appearance tab shows dock-mode options. */ +export const Embedded: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: groupedEntries, clientType: 'embedded' }, + ctx => stage(h(ViewBuiltinSettings, { context: ctx, entry })), + ), + }), +} + +/** Standalone client — dock-mode options are hidden. */ +export const Standalone: Story = { + render: () => ({ + setup: () => mountWithContext( + { entries: groupedEntries, clientType: 'standalone' }, + ctx => stage(h(ViewBuiltinSettings, { context: ctx, entry })), + ), + }), +} diff --git a/packages/core/src/client/webcomponents/components/views/ViewLauncher.stories.ts b/packages/core/src/client/webcomponents/components/views/ViewLauncher.stories.ts new file mode 100644 index 00000000..e74439ad --- /dev/null +++ b/packages/core/src/client/webcomponents/components/views/ViewLauncher.stories.ts @@ -0,0 +1,52 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import type { DevToolsViewLauncher } from '@vitejs/devtools-kit' +import { h } from 'vue' +import { mountWithContext } from '../../stories/story-helpers' +import ViewLauncher from './ViewLauncher.vue' + +function launcher(status: 'idle' | 'loading' | 'error' | 'success'): DevToolsViewLauncher { + return { + id: 'launcher', + type: 'launcher', + title: 'Launcher', + icon: 'ph:rocket-launch-duotone', + launcher: { + title: 'Launch My Cool App', + description: 'Start the dev server and open it here.', + status, + }, + } as DevToolsViewLauncher +} + +function stage(children: any) { + return h('div', { class: 'h-100 bg-base color-base border border-base rounded-lg overflow-hidden font-sans' }, children) +} + +const meta = { + title: 'Views/Launcher', + component: ViewLauncher, + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'A launcher view: a call-to-action that runs the entry\'s `onLaunch` and reflects idle / loading / success / error status.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +function launcherStory(status: 'idle' | 'loading' | 'error' | 'success'): Story { + return { + render: () => ({ + setup: () => mountWithContext({}, ctx => stage(h(ViewLauncher, { context: ctx, entry: launcher(status) }))), + }), + } +} + +export const Idle: Story = launcherStory('idle') +export const Loading: Story = launcherStory('loading') +export const Success: Story = launcherStory('success') +export const Error: Story = launcherStory('error') diff --git a/packages/core/src/client/webcomponents/json-render/JsonRender.stories.ts b/packages/core/src/client/webcomponents/json-render/JsonRender.stories.ts new file mode 100644 index 00000000..e7eabe0f --- /dev/null +++ b/packages/core/src/client/webcomponents/json-render/JsonRender.stories.ts @@ -0,0 +1,92 @@ +import type { Spec } from '@json-render/core' +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { JSONUIProvider, Renderer } from '@json-render/vue' +import { defineComponent, h } from 'vue' +import { devtoolsRegistry } from './registry' + +/** + * Render a json-render `Spec` with the DevTools registry, the same way + * `ViewJsonRender` does at runtime. + */ +function renderSpec(spec: Spec) { + return defineComponent({ + setup() { + const initialState = (spec as any).state ?? {} + return () => h( + 'div', + { class: 'max-w-160 p6 bg-base color-base font-sans' }, + h(JSONUIProvider, { registry: devtoolsRegistry, handlers: {}, initialState }, { + default: () => h(Renderer, { spec, registry: devtoolsRegistry }), + }), + ) + }, + }) +} + +const meta = { + title: 'JsonRender/Gallery', + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'The json-render primitive registry (`Stack`, `Card`, `Text`, `Badge`, `Button`, `Icon`, `Divider`, `Switch`, `KeyValueTable`, `DataTable`, `CodeBlock`, `Progress`) rendered from a declarative spec — the same renderer plugins use to build panels without shipping Vue.', + }, + }, + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +/** Every common primitive laid out in one spec. */ +export const Gallery: Story = { + render: () => renderSpec({ + root: 'root', + state: { notifications: true }, + elements: { + root: { type: 'Stack', props: { direction: 'vertical', gap: 16, padding: 4 }, children: ['heading', 'badges', 'buttons', 'progress', 'toggle', 'divider', 'kv', 'table', 'code'] }, + heading: { type: 'Text', props: { content: 'Build summary', variant: 'heading' } }, + badges: { type: 'Stack', props: { direction: 'horizontal', gap: 8, align: 'center' }, children: ['b1', 'b2', 'b3', 'b4'] }, + b1: { type: 'Badge', props: { text: 'passing', variant: 'success' } }, + b2: { type: 'Badge', props: { text: '3 warnings', variant: 'warning' } }, + b3: { type: 'Badge', props: { text: '1 error', variant: 'error' } }, + b4: { type: 'Badge', props: { text: 'v0.3.4', variant: 'default' } }, + buttons: { type: 'Stack', props: { direction: 'horizontal', gap: 8 }, children: ['btn1', 'btn2', 'btn3'] }, + btn1: { type: 'Button', props: { label: 'Rebuild', variant: 'primary', icon: 'ph:arrows-clockwise' } }, + btn2: { type: 'Button', props: { label: 'Open', variant: 'secondary', icon: 'ph:arrow-square-out' } }, + btn3: { type: 'Button', props: { label: 'Delete', variant: 'danger', icon: 'ph:trash' } }, + progress: { type: 'Progress', props: { value: 68, max: 100, label: 'Bundling' } }, + toggle: { type: 'Switch', props: { label: 'Notifications', value: '{{notifications}}' } }, + divider: { type: 'Divider', props: { label: 'Details' } }, + kv: { type: 'KeyValueTable', props: { title: 'Environment', entries: [ + { key: 'Vite', value: '8.1.2' }, + { key: 'Node', value: '24.17.0' }, + { key: 'Mode', value: 'production' }, + ] } }, + table: { type: 'DataTable', props: { + columns: [{ key: 'file', label: 'File', width: '60%' }, { key: 'size', label: 'Size' }], + rows: [ + { file: 'index.js', size: '124 kB' }, + { file: 'vendor.js', size: '612 kB' }, + { file: 'style.css', size: '18 kB' }, + ], + maxHeight: '160px', + } }, + code: { type: 'CodeBlock', props: { filename: 'vite.config.ts', code: 'export default defineConfig({\n plugins: [DevTools()],\n})' } }, + }, + } as unknown as Spec), +} + +/** A `Card` grouping content under a titled, bordered surface. */ +export const Card: Story = { + render: () => renderSpec({ + root: 'root', + state: {}, + elements: { + root: { type: 'Card', props: { title: 'Plugin', collapsible: false }, children: ['body'] }, + body: { type: 'Stack', props: { direction: 'vertical', gap: 8, padding: 4 }, children: ['t', 'badge'] }, + t: { type: 'Text', props: { content: 'vite-plugin-inspect', variant: 'code' } }, + badge: { type: 'Badge', props: { text: 'enabled', variant: 'success' } }, + }, + } as unknown as Spec), +} diff --git a/packages/core/src/client/webcomponents/scripts/build-css.ts b/packages/core/src/client/webcomponents/scripts/build-css.ts index ac832fec..94c9cbe7 100644 --- a/packages/core/src/client/webcomponents/scripts/build-css.ts +++ b/packages/core/src/client/webcomponents/scripts/build-css.ts @@ -13,6 +13,9 @@ import config from '../uno.config' const SRC_DIR = fileURLToPath(new URL('..', import.meta.url)) const GLOBS = ['components/**/*.{ts,vue}'] +// Exclude Storybook stories: their story-only utility classes must not leak +// into the shipped shadow-DOM stylesheet. +const IGNORE = ['**/*.stories.*'] const USER_STYLE = join(SRC_DIR, 'style.css') const GENERATED_CSS = join(SRC_DIR, '.generated/css.ts') const MINIFY = true @@ -22,6 +25,7 @@ export async function buildCSS() { const files = await glob(GLOBS, { cwd: SRC_DIR, absolute: true, + ignore: IGNORE, }) const generator = await createGenerator(config) diff --git a/packages/core/src/client/webcomponents/stories/__tests__/mock-context.test.ts b/packages/core/src/client/webcomponents/stories/__tests__/mock-context.test.ts new file mode 100644 index 00000000..6c8060f2 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/__tests__/mock-context.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it, vi } from 'vitest' +import { docksSplitGroupsWithCapacity } from '../../state/dock-settings' +import { categorizedEntries, groupedEntries, overflowEntries } from '../fixtures' +import { createMockDocksContext } from '../mock-context' + +describe('story mock context', () => { + it('boots a dock context over the in-memory rpc', async () => { + const ctx = await createMockDocksContext({ entries: categorizedEntries }) + expect(ctx.clientType).toBe('embedded') + expect(ctx.docks.entries.map(e => e.id)).toContain('overview') + // categories are grouped and ordered + expect(ctx.docks.groupedEntries.length).toBeGreaterThan(1) + }) + + it('collapses group members behind the group button on the bar', async () => { + const ctx = await createMockDocksContext({ entries: groupedEntries }) + const barIds = ctx.docks.groupedEntries.flatMap(([, items]) => items.map(i => i.id)) + expect(barIds).toContain('nuxt') + expect(barIds).not.toContain('nuxt:overview') + }) + + it('pre-selects an entry and opens the panel', async () => { + const ctx = await createMockDocksContext({ entries: groupedEntries, selectedId: 'nuxt:pages' }) + expect(ctx.docks.selectedId).toBe('nuxt:pages') + expect(ctx.docks.selected?.id).toBe('nuxt:pages') + expect(ctx.panel.store.open).toBe(true) + }) + + it('honours panel overrides', async () => { + const ctx = await createMockDocksContext({ panel: { mode: 'edge', position: 'right' } }) + expect(ctx.panel.store.mode).toBe('edge') + expect(ctx.panel.store.position).toBe('right') + expect(ctx.panel.isVertical).toBe(true) + }) + + it('exposes a mutable trust flag that emits on change', async () => { + const ctx = await createMockDocksContext({ isTrusted: false }) + expect(ctx.rpc.isTrusted).toBe(false) + + const seen = vi.fn() + ctx.rpc.events.on('rpc:is-trusted:updated', seen) + ctx.rpc.setTrusted(true) + + expect(ctx.rpc.isTrusted).toBe(true) + expect(seen).toHaveBeenCalledWith(true) + }) + + it('overflows the bar past capacity', async () => { + const ctx = await createMockDocksContext({ entries: overflowEntries }) + const { visible, overflow } = docksSplitGroupsWithCapacity(ctx.docks.groupedEntries, 5) + expect(visible.flatMap(([, i]) => i).length).toBe(5) + expect(overflow.flatMap(([, i]) => i).length).toBeGreaterThan(0) + }) +}) diff --git a/packages/core/src/client/webcomponents/stories/fixtures.ts b/packages/core/src/client/webcomponents/stories/fixtures.ts new file mode 100644 index 00000000..497e8955 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/fixtures.ts @@ -0,0 +1,98 @@ +import type { DevToolsDockEntry, DevToolsMessageEntry, DevToolsViewGroup } from '@vitejs/devtools-kit' + +type Extra = Partial + +/** An iframe dock entry (the common case). */ +export function iframe(id: string, title: string, icon: string, extra: Extra = {}): DevToolsDockEntry { + return { id, type: 'iframe', url: '/', title, icon, ...extra } as DevToolsDockEntry +} + +/** An action dock entry — a one-shot command with no panel of its own. */ +export function action(id: string, title: string, icon: string, extra: Extra = {}): DevToolsDockEntry { + return { id, type: 'action', title, icon, ...extra } as DevToolsDockEntry +} + +/** A group entry — a collapse button whose members declare `groupId: id`. */ +export function group(id: string, title: string, icon: string, extra: Partial = {}): DevToolsDockEntry { + return { id, type: 'group', title, icon, ...extra } as DevToolsDockEntry +} + +/** + * A small, single-category bar: a few top-level tools, no groups. + */ +export const basicEntries: DevToolsDockEntry[] = [ + iframe('overview', 'Overview', 'ph:gauge-duotone'), + iframe('inspect', 'Inspect', 'ph:stethoscope-duotone'), + iframe('assets', 'Assets', 'ph:images-duotone'), +] + +/** + * A bar spanning several categories, so separators and category ordering show. + */ +export const categorizedEntries: DevToolsDockEntry[] = [ + iframe('overview', 'Overview', 'ph:gauge-duotone', { category: 'app' }), + iframe('routes', 'Routes', 'ph:signpost-duotone', { category: 'app' }), + iframe('components', 'Components', 'ph:puzzle-piece-duotone', { category: 'framework' }), + iframe('modules', 'Modules', 'ph:plugs-connected-duotone', { category: 'framework' }), + iframe('network', 'Network', 'ph:wifi-high-duotone', { category: 'web' }), + iframe('graph', 'Graph', 'ph:graph-duotone', { category: 'advanced' }), +] + +/** + * Groups: a Nuxt umbrella (with a `defaultChildId`) and a Playground umbrella + * (popover-only), alongside a couple of top-level tools and an action. + */ +export const groupedEntries: DevToolsDockEntry[] = [ + iframe('overview', 'Overview', 'ph:gauge-duotone'), + action('reload', 'Reload', 'ph:arrow-clockwise-duotone'), + + group('nuxt', 'Nuxt', 'logos:nuxt-icon', { category: 'framework', defaultChildId: 'nuxt:overview' }), + iframe('nuxt:overview', 'Overview', 'ph:gauge-duotone', { groupId: 'nuxt', defaultOrder: 0 }), + iframe('nuxt:pages', 'Pages', 'ph:files-duotone', { groupId: 'nuxt', defaultOrder: 1 }), + iframe('nuxt:components', 'Components', 'ph:puzzle-piece-duotone', { groupId: 'nuxt', defaultOrder: 2, badge: '3' }), + iframe('nuxt:modules', 'Modules', 'ph:plugs-connected-duotone', { groupId: 'nuxt', defaultOrder: 3 }), + + group('playground', 'Playground', 'ph:flask-duotone', { category: 'framework' }), + iframe('playground:one', 'One', 'ph:number-circle-one-duotone', { groupId: 'playground' }), + iframe('playground:two', 'Two', 'ph:number-circle-two-duotone', { groupId: 'playground' }), +] + +/** + * Enough top-level entries to exceed the dock's 5-slot capacity, so the overflow + * button appears. + */ +export const overflowEntries: DevToolsDockEntry[] = [ + iframe('overview', 'Overview', 'ph:gauge-duotone'), + iframe('routes', 'Routes', 'ph:signpost-duotone'), + iframe('components', 'Components', 'ph:puzzle-piece-duotone'), + iframe('modules', 'Modules', 'ph:plugs-connected-duotone'), + iframe('assets', 'Assets', 'ph:images-duotone'), + iframe('network', 'Network', 'ph:wifi-high-duotone'), + iframe('timeline', 'Timeline', 'ph:chart-line-duotone'), + iframe('graph', 'Graph', 'ph:graph-duotone'), + iframe('terminal', 'Terminal', 'ph:terminal-window-duotone'), +] + +/** The Nuxt group entry on its own (for group-component stories). */ +export const nuxtGroup = groupedEntries.find(e => e.id === 'nuxt') as DevToolsViewGroup + +/** A message/log entry for the messages panel and toasts. */ +export function message(extra: Partial = {}): DevToolsMessageEntry { + return { + id: `msg-${Math.random().toString(36).slice(2, 8)}`, + message: 'Something happened', + level: 'info', + from: 'server', + timestamp: Date.now(), + ...extra, + } as DevToolsMessageEntry +} + +/** One message per level, covering the common shapes. */ +export const sampleMessages: DevToolsMessageEntry[] = [ + message({ level: 'error', message: 'Failed to resolve import "./missing"', description: 'in src/main.ts', category: 'runtime', labels: ['vite'] }), + message({ level: 'warn', message: 'Large chunk detected (612 kB)', category: 'build' }), + message({ level: 'success', message: 'HMR update applied', category: 'hmr' }), + message({ level: 'info', message: 'Server restarted', description: 'config change detected', category: 'server' }), + message({ level: 'warn', message: 'Checking accessibility…', status: 'loading', category: 'a11y' }), +] diff --git a/packages/core/src/client/webcomponents/stories/mock-context.ts b/packages/core/src/client/webcomponents/stories/mock-context.ts new file mode 100644 index 00000000..ec5c664a --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/mock-context.ts @@ -0,0 +1,126 @@ +import type { DevToolsDockEntry, DevToolsDocksUserSettings } from '@vitejs/devtools-kit' +import type { DevToolsRpcClient, DockPanelStorage, DocksContext, RpcClientEvents } from '@vitejs/devtools-kit/client' +import { DEFAULT_STATE_USER_SETTINGS } from '@vitejs/devtools-kit/constants' +import { createEventEmitter } from 'devframe/utils/events' +import { createSharedState } from 'devframe/utils/shared-state' +import { ref } from 'vue' +import { createDocksContext } from '../state/context' +import { DEFAULT_DOCK_PANEL_STORE } from '../state/docks' + +/** + * A story-only RPC client. Backs the three shared-state keys the dock context + * reads (`devframe:docks`, `devframe:user-settings`, `devframe:commands`) with + * in-memory stores, stubs `call`, and exposes a mutable `isTrusted` you can flip + * to exercise the unauthorized paths. + */ +export interface MockRpcClient extends DevToolsRpcClient { + /** Flip the trust flag and emit `rpc:is-trusted:updated`, as the real WS client does. */ + setTrusted: (value: boolean) => void +} + +export interface CreateMockContextOptions { + /** Dock entries seeded into `devframe:docks`. */ + entries?: DevToolsDockEntry[] + /** Which client shell the context represents. */ + clientType?: 'embedded' | 'standalone' + /** Overrides merged over the default panel store (mode, position, open, ...). */ + panel?: Partial + /** Overrides merged over the default user settings (hidden, pinned, order, ...). */ + settings?: Partial + /** Entry id to pre-select (also opens the panel). */ + selectedId?: string | null + /** Initial trust state. Defaults to `true`. */ + isTrusted?: boolean +} + +function createMockRpc( + entries: DevToolsDockEntry[], + settings: Partial, + initialTrusted: boolean, +): MockRpcClient { + const docksState = createSharedState({ initialValue: entries, enablePatches: false }) + const settingsState = createSharedState({ + initialValue: { ...DEFAULT_STATE_USER_SETTINGS(), ...settings }, + enablePatches: false, + }) + const commandsState = createSharedState({ initialValue: [] as any[], enablePatches: false }) + const events = createEventEmitter() + + let trusted = initialTrusted + + // Minimal RPC surface used by the composed shells (messages/toasts, command + // palette). `call` returns empty-but-valid shapes for the methods those call. + const call = async (method: string) => { + if (method === 'devtoolskit:internal:messages:list') + return { removedIds: [], entries: [], version: null } + return undefined + } + + const rpc = { + events, + get isTrusted() { + return trusted + }, + ensureTrusted: async () => trusted === true, + requestTrust: async () => trusted === true, + requestTrustWithCode: async () => trusted === true, + requestTrustWithToken: async () => trusted === true, + call, + callEvent: async () => undefined, + callOptional: async () => undefined, + client: { + // Register a client-side RPC handler; returns an unsubscribe. + register: () => () => {}, + }, + sharedState: { + get: async (key: string) => { + if (key === 'devframe:docks') + return docksState + if (key === 'devframe:user-settings') + return settingsState + if (key === 'devframe:commands') + return commandsState + throw new Error(`[mock-rpc] Unexpected shared state key: ${key}`) + }, + }, + setTrusted(value: boolean) { + trusted = value + events.emit('rpc:is-trusted:updated', value) + }, + } + + return rpc as unknown as MockRpcClient +} + +/** + * Build a real {@link DocksContext} wired to an in-memory {@link MockRpcClient}. + * + * This is the same `createDocksContext` the client boots with, so grouping, + * `switchEntry`, commands and when-clauses all behave exactly as they do at + * runtime — only the transport is faked. Every call gets a fresh RPC instance, + * so the per-rpc context cache never bleeds between stories. + */ +export async function createMockDocksContext( + options: CreateMockContextOptions = {}, +): Promise { + const { + entries = [], + clientType = 'embedded', + panel, + settings = {}, + selectedId = null, + isTrusted = true, + } = options + + const rpc = createMockRpc(entries, settings, isTrusted) + const panelStore = ref({ ...DEFAULT_DOCK_PANEL_STORE(), ...panel }) + + const context = await createDocksContext(clientType, rpc, panelStore) + + if (selectedId != null) { + context.docks.selectedId = selectedId + context.panel.store.open = true + } + + return context as DocksContext & { rpc: MockRpcClient } +} diff --git a/packages/core/src/client/webcomponents/stories/story-helpers.ts b/packages/core/src/client/webcomponents/stories/story-helpers.ts new file mode 100644 index 00000000..43716710 --- /dev/null +++ b/packages/core/src/client/webcomponents/stories/story-helpers.ts @@ -0,0 +1,58 @@ +import type { DocksContext } from '@vitejs/devtools-kit/client' +import type { CreateMockContextOptions } from './mock-context' +import { defineComponent, h, Suspense } from 'vue' +import { createMockDocksContext } from './mock-context' + +/** + * Render a component tree that needs a live {@link DocksContext}. + * + * `createMockDocksContext` is async (it boots the real dock context over a mock + * transport), so we resolve it inside an async `setup` wrapped in ``. + * The returned value is a render function — drop it straight into a story's + * `setup`: + * + * ```ts + * export const Example: Story = { + * render: () => ({ + * setup: () => mountWithContext( + * { entries: groupedEntries }, + * ctx => h(SomeComponent, { context: ctx }), + * ), + * }), + * } + * ``` + */ +export function mountWithContext( + options: CreateMockContextOptions, + slot: (context: DocksContext) => unknown, +): () => unknown { + const Inner = defineComponent({ + name: 'MockContextProvider', + async setup() { + const context = await createMockDocksContext(options) + return () => slot(context) as any + }, + }) + + return () => h( + Suspense, + null, + { + default: () => h(Inner), + fallback: () => h('div', { class: 'p8 op50 font-sans' }, 'Loading…'), + }, + ) +} + +/** + * Wrap story content in a centered, padded stage. Handy for the smaller + * presentational pieces (entries, popovers, sidebars) that would otherwise sit + * flush against the canvas edge. + */ +export function stage(children: unknown, extraClass = ''): unknown { + return h( + 'div', + { class: `flex items-center justify-center p10 min-h-60 ${extraClass}` }, + children as any, + ) +} diff --git a/packages/core/src/client/webcomponents/utils/iconify.ts b/packages/core/src/client/webcomponents/utils/iconify.ts index a161942d..29bd116d 100644 --- a/packages/core/src/client/webcomponents/utils/iconify.ts +++ b/packages/core/src/client/webcomponents/utils/iconify.ts @@ -14,6 +14,11 @@ export async function getIconifySvg(collection: string, icon: string) { getIconifySvgMap.set(id, svg) return svg }) + .catch((err) => { + // Don't cache failures — drop the entry so a later render can retry. + getIconifySvgMap.delete(id) + throw err + }) getIconifySvgMap.set(id, promise) return promise diff --git a/packages/core/src/client/webcomponents/utils/useIsRpcTrusted.ts b/packages/core/src/client/webcomponents/utils/useIsRpcTrusted.ts new file mode 100644 index 00000000..a00679fc --- /dev/null +++ b/packages/core/src/client/webcomponents/utils/useIsRpcTrusted.ts @@ -0,0 +1,25 @@ +import type { DocksContext } from '@vitejs/devtools-kit/client' +import type { Ref } from 'vue' +import { onScopeDispose, ref } from 'vue' + +/** + * Track the RPC client's trust flag as a reactive ref, seeded from the current + * value and kept in sync via `rpc:is-trusted:updated`. + * + * The subscription is torn down with the owning effect scope, so remounting a + * dock shell (as Storybook and tests do) never leaks listeners onto the shared + * RPC client. Pass `onChange` to react to transitions (e.g. close the panel on + * revocation). + */ +export function useIsRpcTrusted( + context: Pick, + onChange?: (isTrusted: boolean) => void, +): Ref { + const isTrusted = ref(context.rpc.isTrusted) + const off = context.rpc.events.on('rpc:is-trusted:updated', (value) => { + isTrusted.value = value + onChange?.(value) + }) + onScopeDispose(() => off()) + return isTrusted +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2de801c8..119ede8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -313,6 +313,16 @@ catalogs: vue-router: specifier: ^5.1.0 version: 5.1.0 + storybook: + '@storybook/addon-docs': + specifier: ^10.4.6 + version: 10.4.6 + '@storybook/vue3-vite': + specifier: ^10.4.6 + version: 10.4.6 + storybook: + specifier: ^10.4.6 + version: 10.4.6 testing: playwright-core: specifier: ^1.61.1 @@ -513,7 +523,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)) @@ -625,7 +635,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)) @@ -637,7 +647,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: @@ -671,7 +681,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)) @@ -699,7 +709,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) @@ -775,7 +785,7 @@ importers: version: 1.1.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)) typescript: specifier: catalog:devtools version: 6.0.3 @@ -815,7 +825,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 @@ -903,7 +913,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) @@ -1018,7 +1028,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) @@ -1034,11 +1044,62 @@ 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 + storybook: + devDependencies: + '@iconify-json/carbon': + specifier: catalog:icons + version: 1.2.23 + '@iconify-json/fluent-emoji-flat': + specifier: catalog:icons + version: 1.2.5 + '@iconify-json/logos': + specifier: catalog:icons + version: 1.2.11 + '@iconify-json/ph': + specifier: catalog:icons + version: 1.2.2 + '@storybook/addon-docs': + specifier: catalog:storybook + version: 10.4.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(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(@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)) + '@storybook/vue3-vite': + specifier: catalog:storybook + 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(@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))(vue@3.5.39(typescript@5.9.3))(webpack@5.104.1(esbuild@0.28.1)) + '@vitejs/devtools': + specifier: workspace:* + version: link:../packages/core + '@vitejs/devtools-kit': + specifier: workspace:* + version: link:../packages/kit + '@vitejs/devtools-ui': + specifier: workspace:* + version: link:../packages/ui + '@vitejs/plugin-vue': + specifier: catalog:build + version: 6.0.7(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))(vue@3.5.39(typescript@5.9.3)) + devframe: + specifier: catalog:deps + version: 0.6.0-beta.3(srvx@0.11.15)(typescript@5.9.3) + storybook: + specifier: catalog:storybook + version: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + tsx: + specifier: catalog:build + version: 4.22.4 + 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)) + vite: + specifier: ^8.1.2 + 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) + vue: + specifier: catalog:deps + version: 3.5.39(typescript@5.9.3) + packages: '@actions/expressions@0.3.57': @@ -1049,6 +1110,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 @@ -1253,6 +1317,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'} @@ -1386,12 +1454,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==} @@ -1780,6 +1854,12 @@ packages: engines: {node: '>=18'} hasBin: true + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + '@mermaid-js/mermaid-mindmap@9.3.0': resolution: {integrity: sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==} @@ -2047,6 +2127,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} @@ -2071,6 +2157,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} @@ -2095,6 +2187,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} @@ -2119,6 +2217,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} @@ -2143,6 +2247,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} @@ -2167,6 +2277,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} @@ -2191,6 +2307,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} @@ -2215,6 +2337,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} @@ -2243,6 +2372,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} @@ -2271,6 +2407,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} @@ -2299,6 +2442,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} @@ -2327,6 +2477,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} @@ -2355,6 +2512,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} @@ -2383,6 +2547,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} @@ -2411,6 +2582,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} @@ -2439,6 +2617,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} @@ -2463,6 +2647,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} @@ -2483,6 +2672,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} @@ -2507,6 +2702,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} @@ -2531,6 +2732,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} @@ -2555,6 +2762,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==} @@ -2570,6 +2780,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} @@ -3221,6 +3534,73 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@storybook/addon-docs@10.4.6': + resolution: {integrity: sha512-aWAfP5JMiT5a3zBJizwroCRzOCqZwDTJmvsYvwMD3ilIEa/kT1vhf6Xrbk4XIPhDwbh8Hpb/Gfnka1xBYEISWg==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.6 + peerDependenciesMeta: + '@types/react': + optional: true + + '@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/react-dom-shim@10.4.6': + resolution: {integrity: sha512-iGNmKzrq9vgl2PDrYAnZKI+yvac3Ym+lJXXuQaqlFRS23zA5MNm4EBX+rAG7WulqchoK6NaZ0KQOs2mAgEpTMg==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.6 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@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} @@ -3337,6 +3717,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] @@ -3370,6 +3764,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==} @@ -3544,6 +3941,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -3928,11 +4328,6 @@ packages: '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} - '@valibot/to-json-schema@1.7.0': - resolution: {integrity: sha512-Y3pPVibbIOHzohrlxSINvO7w/bvXkoYS3BQHoImV9ynE+bXKf171bdMucPurV2zp7gdmt0L1HCcNAsbo7cFRQw==} - peerDependencies: - valibot: ^1.4.0 - '@valibot/to-json-schema@1.7.1': resolution: {integrity: sha512-3qkmU6KXWh8GIThEAW3kuRHPQBMjWkKy+Ppz3WkUucx53DTpOa6siMn4xDGSOhlVyMrDaJTCTMLYPZVAIk1P0A==} peerDependencies: @@ -3987,6 +4382,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==} @@ -4001,6 +4399,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==} @@ -4010,9 +4411,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==} @@ -4022,12 +4429,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==} @@ -4071,6 +4487,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==} @@ -4085,6 +4504,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==} @@ -4244,6 +4671,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==} @@ -4283,6 +4713,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'} @@ -4316,6 +4751,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==} @@ -4334,6 +4772,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'} @@ -4377,6 +4819,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'} @@ -4389,6 +4844,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'} @@ -4432,6 +4891,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==} @@ -4533,6 +4996,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'} @@ -4546,6 +5017,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'} @@ -4574,6 +5049,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'} @@ -4682,6 +5164,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'} @@ -4757,6 +5242,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'} @@ -4969,6 +5457,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: @@ -4989,6 +5480,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'} @@ -5078,6 +5573,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==} @@ -5111,6 +5615,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==} @@ -5167,9 +5675,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==} @@ -5404,6 +5924,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} @@ -5608,9 +6131,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'} @@ -5672,6 +6203,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==} @@ -5707,6 +6242,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'} @@ -5717,6 +6263,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==} @@ -5797,6 +6347,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'} @@ -5843,6 +6397,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'} @@ -5887,9 +6444,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'} @@ -5931,6 +6495,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==} @@ -5988,6 +6555,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 @@ -6229,6 +6799,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==} @@ -6239,6 +6812,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 @@ -6274,6 +6851,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==} @@ -6470,6 +7051,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} @@ -6659,6 +7244,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==} @@ -6717,6 +7306,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} @@ -6733,6 +7326,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} @@ -6837,6 +7433,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==} @@ -7069,6 +7669,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==} @@ -7076,6 +7680,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==} @@ -7087,6 +7694,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'} @@ -7130,6 +7773,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'} @@ -7148,6 +7794,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'} @@ -7484,6 +8138,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==} @@ -7528,6 +8197,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'} @@ -7647,10 +8320,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'} @@ -7663,6 +8344,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} @@ -7691,6 +8375,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} @@ -7771,9 +8458,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'} @@ -8016,6 +8712,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==} @@ -8023,14 +8724,6 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - valibot@1.4.1: - resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - valibot@1.4.2: resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} peerDependencies: @@ -8252,12 +8945,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.7: + resolution: {integrity: sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -8272,12 +8983,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: @@ -8376,6 +9097,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'} @@ -8485,6 +9210,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 @@ -8722,6 +9449,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.29.7': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -8880,6 +9609,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 @@ -8890,6 +9625,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 @@ -9273,6 +10013,12 @@ snapshots: - encoding - supports-color + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + react: 19.2.7 + '@mermaid-js/mermaid-mindmap@9.3.0': dependencies: '@braintree/sanitize-url': 6.0.4 @@ -9309,6 +10055,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 @@ -9747,6 +10500,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 @@ -9759,6 +10515,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 @@ -9771,6 +10530,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 @@ -9783,6 +10545,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 @@ -9795,6 +10560,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 @@ -9807,6 +10575,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 @@ -9819,6 +10590,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 @@ -9831,6 +10605,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 @@ -9843,6 +10620,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 @@ -9855,6 +10635,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 @@ -9867,6 +10650,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 @@ -9879,6 +10665,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 @@ -9891,6 +10680,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 @@ -9903,6 +10695,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 @@ -9915,6 +10710,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 @@ -9927,6 +10725,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 @@ -9939,6 +10740,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 @@ -9967,6 +10775,9 @@ 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.127.0': + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.129.0': optional: true @@ -9979,6 +10790,9 @@ snapshots: '@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 @@ -9991,6 +10805,9 @@ snapshots: '@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 @@ -10003,6 +10820,8 @@ snapshots: '@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': {} @@ -10013,6 +10832,67 @@ snapshots: '@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-resolver/binding-darwin-x64@11.23.0': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.23.0': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.23.0': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.23.0': + optional: true + + '@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-resolver/binding-win32-arm64-msvc@11.23.0': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.23.0': + optional: true + '@oxc-transform/binding-android-arm-eabi@0.133.0': optional: true @@ -10480,15 +11360,94 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/base62@1.0.0': {} + '@sindresorhus/base62@1.0.0': {} + + '@sindresorhus/is@7.2.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@speed-highlight/core@1.2.14': {} + + '@standard-schema/spec@1.1.0': {} + + '@storybook/addon-docs@10.4.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(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(@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))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.7) + '@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(@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)) + '@storybook/icons': 2.1.0(react@19.2.7) + '@storybook/react-dom-shim': 10.4.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7)) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + 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 + optionalDependencies: + '@types/react': 19.2.17 + transitivePeerDependencies: + - '@types/react-dom' + - esbuild + - rollup + - vite + - webpack + + '@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(@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))': + 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(@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)) + 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@packages+core)(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(@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))': + 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@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) + + '@storybook/global@5.0.0': {} - '@sindresorhus/is@7.2.0': {} + '@storybook/icons@2.1.0(react@19.2.7)': + dependencies: + react: 19.2.7 - '@sindresorhus/merge-streams@4.0.0': {} + '@storybook/react-dom-shim@10.4.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7))': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@2.8.8)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@speed-highlight/core@1.2.14': {} + '@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(@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))(vue@3.5.39(typescript@5.9.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(@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)) + '@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@5.9.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@packages+core)(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@5.9.3)) + transitivePeerDependencies: + - esbuild + - rollup + - vue + - webpack - '@standard-schema/spec@1.1.0': {} + '@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@5.9.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@5.9.3) + vue-component-type-helpers: 3.3.7 '@stylistic/eslint-plugin@5.10.0(eslint@10.6.0(jiti@2.7.0))': dependencies: @@ -10584,6 +11543,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 @@ -10607,6 +11590,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 @@ -10816,6 +11801,8 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/mdx@2.0.14': {} + '@types/ms@2.1.0': {} '@types/node@25.0.3': @@ -11389,10 +12376,6 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@valibot/to-json-schema@1.7.0(valibot@1.4.1(typescript@6.0.3))': - dependencies: - valibot: 1.4.1(typescript@6.0.3) - '@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3))': dependencies: valibot: 1.4.2(typescript@6.0.3) @@ -11567,6 +12550,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-vue@6.0.7(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))(vue@3.5.39(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.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) + vue: 3.5.39(typescript@5.9.3) + '@vitejs/plugin-vue@6.0.7(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))(vue@3.5.39(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 @@ -11591,6 +12580,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 @@ -11616,6 +12613,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 @@ -11632,8 +12633,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 @@ -11676,12 +12687,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 @@ -11765,6 +12788,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 @@ -11784,6 +12812,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 @@ -11810,6 +12851,12 @@ snapshots: '@vue/shared': 3.5.39 csstype: 3.2.3 + '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + vue: 3.5.39(typescript@5.9.3) + '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.39 @@ -11971,6 +13018,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': {} @@ -11999,6 +13048,8 @@ snapshots: dependencies: acorn: 8.16.0 + acorn@7.4.1: {} + acorn@8.16.0: {} actionspack@0.1.5: @@ -12033,6 +13084,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: @@ -12047,6 +13100,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.3.1: {} @@ -12097,6 +13152,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: @@ -12110,6 +13175,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 @@ -12149,6 +13218,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: {} @@ -12255,6 +13328,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: @@ -12268,6 +13351,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: @@ -12289,6 +13380,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 @@ -12381,6 +13478,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: {} @@ -12450,6 +13552,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): @@ -12689,6 +13793,8 @@ snapshots: db0@0.3.4: {} + de-indent@1.0.2: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -12701,6 +13807,8 @@ snapshots: dependencies: character-entities: 2.0.2 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -12738,14 +13846,14 @@ snapshots: devframe@0.5.4(crossws@0.4.9(srvx@0.11.15))(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)): dependencies: - '@valibot/to-json-schema': 1.7.0(valibot@1.4.1(typescript@6.0.3)) + '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) birpc: 4.0.0 cac: 7.0.0 h3: 2.0.1-rc.22(crossws@0.4.9(srvx@0.11.15)) mrmime: 2.0.1 nostics: 0.2.0(esbuild@0.28.1)(rolldown@1.1.3)(rollup@4.60.2)(vite@8.1.2)(webpack@5.104.1(esbuild@0.28.1)) pathe: 2.0.3 - valibot: 1.4.1(typescript@6.0.3) + valibot: 1.4.2(typescript@6.0.3) ws: 8.21.0 transitivePeerDependencies: - '@farmfe/core' @@ -12762,6 +13870,23 @@ snapshots: - vite - webpack + devframe@0.6.0-beta.3(srvx@0.11.15)(typescript@5.9.3): + dependencies: + '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) + birpc: 4.0.0 + cac: 7.0.0 + crossws: 0.4.9(srvx@0.11.15) + destr: 2.0.5 + h3: 2.0.1-rc.22(crossws@0.4.9(srvx@0.11.15)) + mrmime: 2.0.1 + nostics: 1.1.4 + pathe: 2.0.3 + ufo: 1.6.4 + valibot: 1.4.2(typescript@5.9.3) + transitivePeerDependencies: + - srvx + - typescript + devframe@0.6.0-beta.3(srvx@0.11.15)(typescript@6.0.3): dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) @@ -12791,6 +13916,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 @@ -12819,7 +13950,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: {} @@ -12856,8 +13995,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: @@ -13199,6 +14346,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-resolve@1.0.11: {} + espree@10.4.0: dependencies: acorn: 8.16.0 @@ -13386,8 +14535,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: {} @@ -13448,6 +14615,8 @@ snapshots: globrex@0.1.2: {} + gopd@1.2.0: {} + graceful-fs@4.2.11: {} gray-matter@4.0.3: @@ -13488,6 +14657,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 @@ -13510,6 +14687,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + he@1.2.0: {} + hookable@5.5.3: {} hookable@6.1.1: {} @@ -13585,6 +14764,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + indent-string@5.0.0: {} inherits@2.0.4: {} @@ -13625,6 +14806,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: {} @@ -13654,10 +14840,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: {} @@ -13692,6 +14887,8 @@ snapshots: jiti@2.7.0: {} + js-stringify@1.0.2: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -13736,6 +14933,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 @@ -13931,6 +15133,8 @@ snapshots: longest-streak@3.1.0: {} + loupe@3.2.1: {} + lru-cache@10.4.3: {} lru-cache@11.2.7: {} @@ -13939,6 +15143,8 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@8.0.5: {} + lz-string@1.5.0: {} magic-regexp@0.10.0: @@ -13997,6 +15203,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 @@ -14409,6 +15617,8 @@ snapshots: mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + minimatch@10.2.4: dependencies: brace-expansion: 5.0.2 @@ -14790,6 +16000,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: {} @@ -14876,6 +16088,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 @@ -14976,6 +16213,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 @@ -15088,6 +16347,8 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + perfect-debounce@2.1.0: {} picocolors@1.1.1: {} @@ -15301,10 +16562,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 @@ -15321,6 +16592,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: {} @@ -15358,6 +16696,8 @@ snapshots: react: 19.2.7 scheduler: 0.27.0 + react-is@17.0.2: {} + react@19.2.7: {} readable-stream@2.3.8: @@ -15384,6 +16724,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: @@ -15461,14 +16814,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 @@ -15791,6 +17144,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 @@ -15845,6 +17224,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: {} @@ -15955,8 +17338,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 @@ -15968,6 +17355,8 @@ snapshots: toidentifier@1.0.1: {} + token-stream@1.0.0: {} + toml-eslint-parser@1.0.3: dependencies: eslint-visitor-keys: 5.0.1 @@ -15986,7 +17375,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 @@ -15997,7 +17388,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 @@ -16015,7 +17406,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 @@ -16026,7 +17417,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 @@ -16100,8 +17491,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: {} @@ -16410,13 +17807,17 @@ 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: {} - valibot@1.4.1(typescript@6.0.3): + valibot@1.4.2(typescript@5.9.3): optionalDependencies: - typescript: 6.0.3 + typescript: 5.9.3 valibot@1.4.2(typescript@6.0.3): optionalDependencies: @@ -16527,7 +17928,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 @@ -16537,6 +17938,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 @@ -16707,18 +18110,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.7: {} + 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@5.9.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@5.9.3) + vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.39(typescript@5.9.3)) + vue-eslint-parser@10.4.1(eslint@10.6.0(jiti@2.7.0)): dependencies: debug: 4.4.3 @@ -16731,6 +18165,10 @@ snapshots: transitivePeerDependencies: - supports-color + vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.39(typescript@5.9.3)): + dependencies: + vue: 3.5.39(typescript@5.9.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) @@ -16783,6 +18221,16 @@ snapshots: '@vue/compiler-sfc': 2.7.16 csstype: 3.2.3 + vue@3.5.39(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-sfc': 3.5.39 + '@vue/runtime-dom': 3.5.39 + '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@5.9.3)) + '@vue/shared': 3.5.39 + optionalDependencies: + typescript: 5.9.3 + vue@3.5.39(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.39 @@ -16868,6 +18316,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 2b07fd97..c7485e6b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,6 +19,7 @@ packages: - examples/* - docs - e2e + - storybook overrides: '@jridgewell/sourcemap-codec': 'catalog:resolutions' '@nuxt/devtools': 'catalog:devtools' @@ -160,6 +161,10 @@ catalogs: '@jridgewell/sourcemap-codec': 1.5.0 langium: ^4.3.0 semver: ^7.8.5 + storybook: + '@storybook/addon-docs': ^10.4.6 + '@storybook/vue3-vite': ^10.4.6 + storybook: ^10.4.6 testing: playwright-core: ^1.61.1 tsnapi: ^0.3.3 diff --git a/storybook/.storybook/docs-dark.css b/storybook/.storybook/docs-dark.css new file mode 100644 index 00000000..0db8b145 --- /dev/null +++ b/storybook/.storybook/docs-dark.css @@ -0,0 +1,20 @@ +/* Autodocs surfaces are static-light; recolor them under `.dark`. */ +.dark .sbdocs-wrapper, +.dark .sbdocs.sbdocs-content { + background: #111; +} +.dark .sbdocs-preview, +.dark .docs-story { + background: #111; + border-color: #8882; +} +.dark .sbdocs h1, +.dark .sbdocs h2, +.dark .sbdocs h3, +.dark .sbdocs p, +.dark .sbdocs a, +.dark .sbdocs li, +.dark .sbdocs td, +.dark .sbdocs th { + color: #ccc; +} diff --git a/storybook/.storybook/main.ts b/storybook/.storybook/main.ts new file mode 100644 index 00000000..37c7210f --- /dev/null +++ b/storybook/.storybook/main.ts @@ -0,0 +1,37 @@ +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 = { + // MDX before stories so the Overview can resolve component stories. + stories: [ + '../stories/**/*.mdx', + '../../packages/core/src/client/webcomponents/**/*.mdx', + '../../packages/core/src/client/webcomponents/**/*.stories.@(ts|js)', + ], + addons: ['@storybook/addon-docs'], + framework: { + name: '@storybook/vue3-vite', + // The package ships raw .vue; disable docgen so it doesn't re-parse compiled output. + options: { docgen: false }, + }, + viteFinal: base => mergeConfig(base, { + resolve: { alias }, + plugins: [ + Vue(), + Unocss({ configFile: fileURLToPath(new URL('../uno.config.ts', import.meta.url)) }), + ], + optimizeDeps: { + exclude: [ + '@vitejs/devtools', + '@vitejs/devtools-kit', + '@vitejs/devtools-ui', + ], + }, + }), +} + +export default config diff --git a/storybook/.storybook/manager.ts b/storybook/.storybook/manager.ts new file mode 100644 index 00000000..07e443ba --- /dev/null +++ b/storybook/.storybook/manager.ts @@ -0,0 +1,9 @@ +import { GLOBALS_UPDATED } from 'storybook/internal/core-events' +import { addons } from 'storybook/manager-api' +import { themes } from 'storybook/theming' + +addons.register('theme-sync', (api) => { + const apply = (t?: string): void => api.setOptions({ theme: t === 'dark' ? themes.dark : themes.light }) + apply(api.getGlobals().theme) + api.getChannel()?.on(GLOBALS_UPDATED, ({ globals }: { globals?: { theme?: string } }) => apply(globals?.theme)) +}) diff --git a/storybook/.storybook/preview.ts b/storybook/.storybook/preview.ts new file mode 100644 index 00000000..77aebb1d --- /dev/null +++ b/storybook/.storybook/preview.ts @@ -0,0 +1,46 @@ +import type { Preview } from '@storybook/vue3-vite' +import { GLOBALS_UPDATED } from 'storybook/internal/core-events' +import { addons } from 'storybook/preview-api' +import '@unocss/reset/tailwind.css' +import 'virtual:uno.css' +// The dock shells rely on the `#vite-devtools-*` id selectors shipped here. +import '../../packages/core/src/client/webcomponents/style.css' +import './docs-dark.css' + +// The manager (chrome) and preview (iframe) are separate roots; toggle the +// preview root from the global so docs/MDX pages theme too. +addons.getChannel().on(GLOBALS_UPDATED, ({ globals }: { globals?: { theme?: string } }) => { + document.documentElement.classList.toggle('dark', globals?.theme === 'dark') +}) + +const preview: Preview = { + parameters: { + options: { storySort: { order: ['Overview', 'Dock', '*'] } }, + layout: 'fullscreen', + }, + globalTypes: { + theme: { + defaultValue: 'light', + toolbar: { + title: 'Theme', + items: [ + { value: 'light', title: 'Light', icon: 'sun' }, + { value: 'dark', title: 'Dark', icon: 'moon' }, + ], + }, + }, + }, + decorators: [ + // Use the template-based `` decorator (the stable Storybook Vue API) + // rather than `h(story())` — under the vue3-vite renderer `story()` no longer + // returns a component, so hand-wrapping it mounts an `undefined` vnode. + (_story, ctx) => ({ + setup() { + document.documentElement.classList.toggle('dark', ctx.globals.theme === 'dark') + }, + template: '
', + }), + ], +} + +export default preview diff --git a/storybook/package.json b/storybook/package.json new file mode 100644 index 00000000..b5075014 --- /dev/null +++ b/storybook/package.json @@ -0,0 +1,30 @@ +{ + "name": "@vitejs/devtools-storybook", + "type": "module", + "version": "0.3.4", + "private": true, + "description": "Storybook for Vite DevTools client components", + "scripts": { + "dev": "storybook dev -p 6006 --host 0.0.0.0", + "build": "storybook build", + "docs:overview": "tsx scripts/gen-overview.mts" + }, + "devDependencies": { + "@iconify-json/carbon": "catalog:icons", + "@iconify-json/fluent-emoji-flat": "catalog:icons", + "@iconify-json/logos": "catalog:icons", + "@iconify-json/ph": "catalog:icons", + "@storybook/addon-docs": "catalog:storybook", + "@storybook/vue3-vite": "catalog:storybook", + "@vitejs/devtools": "workspace:*", + "@vitejs/devtools-kit": "workspace:*", + "@vitejs/devtools-ui": "workspace:*", + "@vitejs/plugin-vue": "catalog:build", + "devframe": "catalog:deps", + "storybook": "catalog:storybook", + "tsx": "catalog:build", + "unocss": "catalog:build", + "vite": "catalog:build", + "vue": "catalog:deps" + } +} diff --git a/storybook/scripts/gen-overview.mts b/storybook/scripts/gen-overview.mts new file mode 100644 index 00000000..525a4eee --- /dev/null +++ b/storybook/scripts/gen-overview.mts @@ -0,0 +1,82 @@ +/** + * Generate `stories/Overview.mdx` from the co-located component stories on disk, + * so the single Overview page never drifts from the story files. + * + * Run with `pnpm run docs:overview` (or `pnpm -C storybook docs:overview`). + */ +import { mkdir, readFile, writeFile } from 'node:fs/promises' +import { dirname, relative } from 'node:path' +import { fileURLToPath } from 'node:url' +import { glob } from 'tinyglobby' + +const here = dirname(fileURLToPath(import.meta.url)) +const root = fileURLToPath(new URL('../..', import.meta.url)) +const storiesDir = `${root}/packages/core/src/client/webcomponents` +const outFile = `${here}/../stories/Overview.mdx` + +interface Entry { + importName: string + importPath: string + title: string + docsId: string + firstExport: string +} + +/** Storybook's docs path id: `Dock/Group/Popover` -> `dock-group-popover`. */ +function toDocsId(title: string): string { + return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') +} + +/** A safe MDX import identifier derived from the story title. */ +function toImportName(title: string): string { + const pascal = title.replace(/[^a-z0-9]+/gi, ' ').trim().split(/\s+/).map(w => w[0]!.toUpperCase() + w.slice(1)).join('') + return `S${pascal}` +} + +const files = (await glob('**/*.stories.ts', { cwd: storiesDir, absolute: true })).sort() + +const entries: Entry[] = [] +for (const file of files) { + const src = await readFile(file, 'utf-8') + // Scope to the `meta` block so we don't pick up a fixture's `title:` field. + const title = src.match(/const meta\s*=\s*\{[\s\S]*?title:\s*['"]([^'"]+)['"]/)?.[1] + if (!title) + continue + const firstExport = src.match(/export const (\w+)\s*:/)?.[1] + if (!firstExport) + continue + const importPath = relative(dirname(outFile), file).replace(/\.ts$/, '') + entries.push({ + importName: toImportName(title), + importPath, + title, + docsId: toDocsId(title), + firstExport, + }) +} + +const imports = entries.map(e => `import * as ${e.importName} from '${e.importPath}'`).join('\n') +const sections = entries.map(e => + `### [${e.title}](/?path=/docs/${e.docsId}--docs)\n\n`, +).join('\n\n') + +const content = `{/* AUTO-GENERATED by scripts/gen-overview.mts — run \`pnpm run docs:overview\` to refresh. */} + +import { Canvas, Meta } from '@storybook/addon-docs/blocks' +${imports} + + + +# Vite DevTools — Client Components + +A gallery of the dock and floating-panel components that make up the embedded +and standalone DevTools client. Each heading links to that component's own docs +page; use the theme toggle in the toolbar to preview light and dark. + +${sections} +` + +await mkdir(dirname(outFile), { recursive: true }) +await writeFile(outFile, content, 'utf-8') + +console.log(`Wrote ${relative(root, outFile)} (${entries.length} components)`) diff --git a/storybook/stories/Overview.mdx b/storybook/stories/Overview.mdx new file mode 100644 index 00000000..dea90a5d --- /dev/null +++ b/storybook/stories/Overview.mdx @@ -0,0 +1,136 @@ +{/* AUTO-GENERATED by scripts/gen-overview.mts — run `pnpm run docs:overview` to refresh. */} + +import { Canvas, Meta } from '@storybook/addon-docs/blocks' +import * as SCommandsPalette from '../../packages/core/src/client/webcomponents/components/command-palette/CommandPalette.stories' +import * as SCommandsPaletteItem from '../../packages/core/src/client/webcomponents/components/command-palette/CommandPaletteItem.stories' +import * as SCommandsKeybindingBadge from '../../packages/core/src/client/webcomponents/components/command-palette/KeybindingBadge.stories' +import * as SDisplayConfirm from '../../packages/core/src/client/webcomponents/components/display/Confirm.stories' +import * as SDisplayHashBadge from '../../packages/core/src/client/webcomponents/components/display/HashBadge.stories' +import * as SMessagesToastOverlay from '../../packages/core/src/client/webcomponents/components/display/ToastOverlay.stories' +import * as SDockShellFloatBar from '../../packages/core/src/client/webcomponents/components/dock/Dock.stories' +import * as SDockShellEdgePanel from '../../packages/core/src/client/webcomponents/components/dock/DockEdge.stories' +import * as SDockShellEmbedded from '../../packages/core/src/client/webcomponents/components/dock/DockEmbedded.stories' +import * as SDockBarEntriesWithCategories from '../../packages/core/src/client/webcomponents/components/dock/DockEntriesWithCategories.stories' +import * as SDockEntry from '../../packages/core/src/client/webcomponents/components/dock/DockEntry.stories' +import * as SDockGroupButton from '../../packages/core/src/client/webcomponents/components/dock/DockGroupButton.stories' +import * as SDockGroupPopover from '../../packages/core/src/client/webcomponents/components/dock/DockGroupPopover.stories' +import * as SDockGroupSidebar from '../../packages/core/src/client/webcomponents/components/dock/DockGroupSidebar.stories' +import * as SDockIcon from '../../packages/core/src/client/webcomponents/components/dock/DockIcon.stories' +import * as SDockBarOverflowButton from '../../packages/core/src/client/webcomponents/components/dock/DockOverflowButton.stories' +import * as SDockShellFloatPanel from '../../packages/core/src/client/webcomponents/components/dock/DockPanel.stories' +import * as SDockShellStandalone from '../../packages/core/src/client/webcomponents/components/dock/DockStandalone.stories' +import * as SDockFloatingPopover from '../../packages/core/src/client/webcomponents/components/floating/FloatingPopover.stories' +import * as SBrandLogos from '../../packages/core/src/client/webcomponents/components/icons/Brand.stories' +import * as SMessagesMessageItem from '../../packages/core/src/client/webcomponents/components/message/MessageItem.stories' +import * as SViewsBuiltinAuthNotice from '../../packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinClientAuthNotice.stories' +import * as SViewsBuiltinSettings from '../../packages/core/src/client/webcomponents/components/views-builtin/ViewBuiltinSettings.stories' +import * as SViewsLauncher from '../../packages/core/src/client/webcomponents/components/views/ViewLauncher.stories' +import * as SJsonRenderGallery from '../../packages/core/src/client/webcomponents/json-render/JsonRender.stories' + + + +# Vite DevTools — Client Components + +A gallery of the dock and floating-panel components that make up the embedded +and standalone DevTools client. Each heading links to that component's own docs +page; use the theme toggle in the toolbar to preview light and dark. + +### [Commands/Palette](/?path=/docs/commands-palette--docs) + + + +### [Commands/PaletteItem](/?path=/docs/commands-paletteitem--docs) + + + +### [Commands/KeybindingBadge](/?path=/docs/commands-keybindingbadge--docs) + + + +### [Display/Confirm](/?path=/docs/display-confirm--docs) + + + +### [Display/HashBadge](/?path=/docs/display-hashbadge--docs) + + + +### [Messages/ToastOverlay](/?path=/docs/messages-toastoverlay--docs) + + + +### [Dock/Shell/Float Bar](/?path=/docs/dock-shell-float-bar--docs) + + + +### [Dock/Shell/Edge Panel](/?path=/docs/dock-shell-edge-panel--docs) + + + +### [Dock/Shell/Embedded](/?path=/docs/dock-shell-embedded--docs) + + + +### [Dock/Bar/EntriesWithCategories](/?path=/docs/dock-bar-entrieswithcategories--docs) + + + +### [Dock/Entry](/?path=/docs/dock-entry--docs) + + + +### [Dock/Group/Button](/?path=/docs/dock-group-button--docs) + + + +### [Dock/Group/Popover](/?path=/docs/dock-group-popover--docs) + + + +### [Dock/Group/Sidebar](/?path=/docs/dock-group-sidebar--docs) + + + +### [Dock/Icon](/?path=/docs/dock-icon--docs) + + + +### [Dock/Bar/OverflowButton](/?path=/docs/dock-bar-overflowbutton--docs) + + + +### [Dock/Shell/Float Panel](/?path=/docs/dock-shell-float-panel--docs) + + + +### [Dock/Shell/Standalone](/?path=/docs/dock-shell-standalone--docs) + + + +### [Dock/Floating/Popover](/?path=/docs/dock-floating-popover--docs) + + + +### [Brand/Logos](/?path=/docs/brand-logos--docs) + + + +### [Messages/MessageItem](/?path=/docs/messages-messageitem--docs) + + + +### [Views/Builtin/AuthNotice](/?path=/docs/views-builtin-authnotice--docs) + + + +### [Views/Builtin/Settings](/?path=/docs/views-builtin-settings--docs) + + + +### [Views/Launcher](/?path=/docs/views-launcher--docs) + + + +### [JsonRender/Gallery](/?path=/docs/jsonrender-gallery--docs) + + diff --git a/storybook/tsconfig.json b/storybook/tsconfig.json new file mode 100644 index 00000000..a1777203 --- /dev/null +++ b/storybook/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "lib": ["esnext", "dom"], + "types": ["vite/client"], + "noEmit": true + }, + "include": [ + ".storybook/**/*.ts", + "uno.config.ts", + "stories/**/*.ts", + "scripts/**/*.mts", + "../packages/core/src/client/webcomponents/**/*.stories.ts", + "../packages/core/src/client/webcomponents/stories/**/*.ts" + ] +} diff --git a/storybook/uno.config.ts b/storybook/uno.config.ts new file mode 100644 index 00000000..a9fe0e44 --- /dev/null +++ b/storybook/uno.config.ts @@ -0,0 +1,54 @@ +import { sharedShortcuts } from '@vitejs/devtools-ui/unocss/shared-shortcuts' +import { theme } from '@vitejs/devtools-ui/unocss/theme' +import { + defineConfig, + presetIcons, + presetWind3, + transformerDirectives, +} from 'unocss' + +/** + * Storybook mirror of the webcomponents `uno.config.ts`. + * + * Two deliberate deviations from the runtime config: + * - `dark: 'class'` instead of `'media'`, so the Storybook theme toolbar can + * drive light/dark by toggling `.dark` on the preview root (the runtime lets + * the host shadow DOM decide via `prefers-color-scheme`). + * - a wider `presetIcons` collection set, so the `i-*` utility icons used by the + * dock shells render without a network round-trip. + */ +export default defineConfig({ + shortcuts: [ + ...sharedShortcuts, + { + // webcomponent-specific z-index (kept in sync with the runtime config) + '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), + 'fluent-emoji-flat': () => import('@iconify-json/fluent-emoji-flat').then(i => i.icons), + 'carbon': () => import('@iconify-json/carbon').then(i => i.icons), + }, + }), + ], +})