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),
+ },
+ }),
+ ],
+})