From e78a064e08ca40a7411c625cc7dfc5d386e912b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:26:03 +0000 Subject: [PATCH 01/12] Initial plan From 215a0978eef47f579019b3547216fa0a51acb39d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:30:32 +0000 Subject: [PATCH 02/12] Add Storybook stories for plugin components (9 of 14 plugins) Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- .../src/stories-json/aggrid.stories.tsx | 103 ++++++++++ .../src/stories-json/calendar.stories.tsx | 85 ++++++++ .../src/stories-json/charts.stories.tsx | 113 +++++++++++ .../src/stories-json/chatbot.stories.tsx | 111 +++++++++++ .../src/stories-json/code-editor.stories.tsx | 92 +++++++++ .../src/stories-json/dashboard.stories.tsx | 78 ++++++++ .../src/stories-json/kanban.stories.tsx | 167 ++++++++++++++++ .../src/stories-json/markdown.stories.tsx | 129 ++++++++++++ .../src/stories-json/timeline.stories.tsx | 188 ++++++++++++++++++ 9 files changed, 1066 insertions(+) create mode 100644 packages/components/src/stories-json/aggrid.stories.tsx create mode 100644 packages/components/src/stories-json/calendar.stories.tsx create mode 100644 packages/components/src/stories-json/charts.stories.tsx create mode 100644 packages/components/src/stories-json/chatbot.stories.tsx create mode 100644 packages/components/src/stories-json/code-editor.stories.tsx create mode 100644 packages/components/src/stories-json/dashboard.stories.tsx create mode 100644 packages/components/src/stories-json/kanban.stories.tsx create mode 100644 packages/components/src/stories-json/markdown.stories.tsx create mode 100644 packages/components/src/stories-json/timeline.stories.tsx diff --git a/packages/components/src/stories-json/aggrid.stories.tsx b/packages/components/src/stories-json/aggrid.stories.tsx new file mode 100644 index 000000000..f1c85b4dc --- /dev/null +++ b/packages/components/src/stories-json/aggrid.stories.tsx @@ -0,0 +1,103 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/AG Grid', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Default: Story = { + render: renderStory, + args: { + type: 'aggrid', + rowData: [ + { make: 'Tesla', model: 'Model Y', price: 64950, electric: true }, + { make: 'Ford', model: 'F-Series', price: 33850, electric: false }, + { make: 'Toyota', model: 'Corolla', price: 29600, electric: false }, + { make: 'Mercedes', model: 'EQA', price: 48890, electric: true }, + { make: 'Fiat', model: '500', price: 15774, electric: false }, + { make: 'Nissan', model: 'Juke', price: 20675, electric: false }, + { make: 'Vauxhall', model: 'Corsa', price: 18460, electric: false }, + { make: 'Volvo', model: 'XC90', price: 72835, electric: false }, + { make: 'Mercedes', model: 'GLA', price: 47825, electric: false }, + { make: 'Ford', model: 'Puma', price: 27420, electric: false }, + { make: 'Volkswagen', model: 'Golf', price: 28850, electric: false }, + { make: 'Kia', model: 'Sportage', price: 31095, electric: false } + ], + columnDefs: [ + { field: 'make', headerName: 'Make', sortable: true, filter: true }, + { field: 'model', headerName: 'Model', sortable: true, filter: true }, + { field: 'price', headerName: 'Price', sortable: true, filter: 'agNumberColumnFilter' }, + { field: 'electric', headerName: 'Electric', sortable: true, filter: true } + ], + pagination: true, + paginationPageSize: 10, + theme: 'quartz', + height: 500, + animateRows: true + } as any, +}; + +export const WithPagination: Story = { + render: renderStory, + args: { + type: 'aggrid', + rowData: [ + { athlete: 'Michael Phelps', age: 23, country: 'United States', year: 2008, sport: 'Swimming', gold: 8, silver: 0, bronze: 0 }, + { athlete: 'Natalie Coughlin', age: 25, country: 'United States', year: 2008, sport: 'Swimming', gold: 1, silver: 2, bronze: 3 }, + { athlete: 'Aleksey Nemov', age: 24, country: 'Russia', year: 2000, sport: 'Gymnastics', gold: 2, silver: 1, bronze: 3 }, + { athlete: 'Alicia Coutts', age: 24, country: 'Australia', year: 2012, sport: 'Swimming', gold: 1, silver: 3, bronze: 1 }, + { athlete: 'Missy Franklin', age: 17, country: 'United States', year: 2012, sport: 'Swimming', gold: 4, silver: 0, bronze: 1 }, + ], + columnDefs: [ + { field: 'athlete', headerName: 'Athlete' }, + { field: 'age', headerName: 'Age', width: 90 }, + { field: 'country', headerName: 'Country', width: 120 }, + { field: 'year', headerName: 'Year', width: 90 }, + { field: 'sport', headerName: 'Sport', width: 110 }, + { field: 'gold', headerName: 'Gold', width: 100 }, + { field: 'silver', headerName: 'Silver', width: 100 }, + { field: 'bronze', headerName: 'Bronze', width: 100 } + ], + pagination: true, + paginationPageSize: 3, + theme: 'quartz', + height: 400 + } as any, +}; + +export const AlpineTheme: Story = { + render: renderStory, + args: { + type: 'aggrid', + rowData: [ + { product: 'Laptop', category: 'Electronics', price: 1200, stock: 15 }, + { product: 'Mouse', category: 'Electronics', price: 25, stock: 150 }, + { product: 'Keyboard', category: 'Electronics', price: 75, stock: 80 }, + { product: 'Monitor', category: 'Electronics', price: 300, stock: 45 }, + { product: 'Desk', category: 'Furniture', price: 250, stock: 20 } + ], + columnDefs: [ + { field: 'product', headerName: 'Product', sortable: true, filter: true }, + { field: 'category', headerName: 'Category', sortable: true, filter: true }, + { field: 'price', headerName: 'Price ($)', sortable: true, filter: 'agNumberColumnFilter' }, + { field: 'stock', headerName: 'Stock', sortable: true, filter: 'agNumberColumnFilter' } + ], + theme: 'alpine', + height: 400, + domLayout: 'autoHeight' + } as any, +}; diff --git a/packages/components/src/stories-json/calendar.stories.tsx b/packages/components/src/stories-json/calendar.stories.tsx new file mode 100644 index 000000000..a96acbe71 --- /dev/null +++ b/packages/components/src/stories-json/calendar.stories.tsx @@ -0,0 +1,85 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Calendar', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const CalendarView: Story = { + render: renderStory, + args: { + type: 'calendar-view', + events: [ + { + id: '1', + title: 'Team Meeting', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 15, 10, 0), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 15, 11, 0), + color: '#3b82f6' + }, + { + id: '2', + title: 'Project Deadline', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 20), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 20), + allDay: true, + color: '#ef4444' + }, + { + id: '3', + title: 'Client Presentation', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 25, 14, 0), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 25, 16, 0), + color: '#10b981' + } + ], + className: 'h-[600px]' + } as any, +}; + +export const MonthView: Story = { + render: renderStory, + args: { + type: 'calendar-view', + defaultView: 'month', + events: [ + { + id: '1', + title: 'Sprint Planning', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 1, 9, 0), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 1, 10, 30), + color: '#8b5cf6' + }, + { + id: '2', + title: 'Code Review', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 5, 15, 0), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 5, 16, 0), + color: '#3b82f6' + }, + { + id: '3', + title: 'Team Building', + start: new Date(new Date().getFullYear(), new Date().getMonth(), 10), + end: new Date(new Date().getFullYear(), new Date().getMonth(), 10), + allDay: true, + color: '#f59e0b' + } + ], + className: 'h-[600px]' + } as any, +}; diff --git a/packages/components/src/stories-json/charts.stories.tsx b/packages/components/src/stories-json/charts.stories.tsx new file mode 100644 index 000000000..35691ff8c --- /dev/null +++ b/packages/components/src/stories-json/charts.stories.tsx @@ -0,0 +1,113 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Charts', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const BarChart: Story = { + render: renderStory, + args: { + type: 'bar-chart', + data: [ + { name: 'Jan', value: 400 }, + { name: 'Feb', value: 300 }, + { name: 'Mar', value: 600 }, + { name: 'Apr', value: 800 }, + { name: 'May', value: 500 }, + { name: 'Jun', value: 700 } + ], + dataKey: 'value', + xAxisKey: 'name', + height: 400, + color: '#3b82f6' + } as any, +}; + +export const MultiSeriesChart: Story = { + render: renderStory, + args: { + type: 'chart', + chartType: 'bar', + data: [ + { name: 'Jan', sales: 400, revenue: 240 }, + { name: 'Feb', sales: 300, revenue: 139 }, + { name: 'Mar', sales: 600, revenue: 380 }, + { name: 'Apr', sales: 800, revenue: 430 }, + { name: 'May', sales: 500, revenue: 220 }, + { name: 'Jun', sales: 700, revenue: 350 } + ], + config: { + sales: { label: 'Sales', color: '#3b82f6' }, + revenue: { label: 'Revenue', color: '#10b981' } + }, + xAxisKey: 'name', + series: [ + { dataKey: 'sales' }, + { dataKey: 'revenue' } + ] + } as any, +}; + +export const LineChart: Story = { + render: renderStory, + args: { + type: 'chart', + chartType: 'line', + data: [ + { month: 'Jan', users: 120, sessions: 450 }, + { month: 'Feb', users: 180, sessions: 620 }, + { month: 'Mar', users: 250, sessions: 890 }, + { month: 'Apr', users: 320, sessions: 1200 }, + { month: 'May', users: 410, sessions: 1560 }, + { month: 'Jun', users: 520, sessions: 1980 } + ], + config: { + users: { label: 'Active Users', color: '#8b5cf6' }, + sessions: { label: 'Sessions', color: '#ec4899' } + }, + xAxisKey: 'month', + series: [ + { dataKey: 'users' }, + { dataKey: 'sessions' } + ] + } as any, +}; + +export const AreaChart: Story = { + render: renderStory, + args: { + type: 'chart', + chartType: 'area', + data: [ + { date: 'Mon', traffic: 2400 }, + { date: 'Tue', traffic: 1398 }, + { date: 'Wed', traffic: 9800 }, + { date: 'Thu', traffic: 3908 }, + { date: 'Fri', traffic: 4800 }, + { date: 'Sat', traffic: 3800 }, + { date: 'Sun', traffic: 4300 } + ], + config: { + traffic: { label: 'Website Traffic', color: '#06b6d4' } + }, + xAxisKey: 'date', + series: [ + { dataKey: 'traffic' } + ] + } as any, +}; diff --git a/packages/components/src/stories-json/chatbot.stories.tsx b/packages/components/src/stories-json/chatbot.stories.tsx new file mode 100644 index 000000000..210593888 --- /dev/null +++ b/packages/components/src/stories-json/chatbot.stories.tsx @@ -0,0 +1,111 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Chatbot', + component: SchemaRenderer, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Default: Story = { + render: renderStory, + args: { + type: 'chatbot', + messages: [ + { + id: 'welcome', + role: 'assistant', + content: 'Hello! How can I help you today?', + } + ], + placeholder: 'Type your message...', + showTimestamp: false, + disabled: false, + userAvatarFallback: 'You', + assistantAvatarFallback: 'AI', + maxHeight: '500px', + autoResponse: true, + autoResponseText: 'Thank you for your message! This is an automated response.', + autoResponseDelay: 1000, + className: 'w-full max-w-2xl' + } as any, +}; + +export const WithTimestamps: Story = { + render: renderStory, + args: { + type: 'chatbot', + messages: [ + { + id: '1', + role: 'assistant', + content: 'Hello! I\'m here to assist you.', + timestamp: '10:00 AM' + }, + { + id: '2', + role: 'user', + content: 'Hi! I need help with my account.', + timestamp: '10:01 AM' + }, + { + id: '3', + role: 'assistant', + content: 'I\'d be happy to help! What specific issue are you experiencing?', + timestamp: '10:01 AM' + } + ], + placeholder: 'Type your message...', + showTimestamp: true, + autoResponse: true, + autoResponseText: 'I understand your concern. Let me help you with that.', + className: 'w-full max-w-2xl' + } as any, +}; + +export const CustomerSupport: Story = { + render: renderStory, + args: { + type: 'chatbot', + messages: [ + { + id: '1', + role: 'system', + content: 'Support session started' + }, + { + id: '2', + role: 'assistant', + content: 'Welcome to customer support! How may I assist you today?', + }, + { + id: '3', + role: 'user', + content: 'I\'m having trouble accessing my dashboard.', + }, + { + id: '4', + role: 'assistant', + content: 'I\'m sorry to hear that. Let me help you troubleshoot. First, can you tell me what error message you\'re seeing?', + } + ], + placeholder: 'Describe your issue...', + assistantAvatarFallback: 'CS', + autoResponse: true, + autoResponseText: 'Thank you for that information. Let me check our system.', + autoResponseDelay: 1500, + className: 'w-full max-w-2xl' + } as any, +}; diff --git a/packages/components/src/stories-json/code-editor.stories.tsx b/packages/components/src/stories-json/code-editor.stories.tsx new file mode 100644 index 000000000..532829807 --- /dev/null +++ b/packages/components/src/stories-json/code-editor.stories.tsx @@ -0,0 +1,92 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Code Editor', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const JavaScript: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: '// Write your code here\nconsole.log("Hello, World!");', + language: 'javascript', + theme: 'vs-dark', + height: '400px', + readOnly: false + } as any, +}; + +export const TypeScript: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: 'interface User {\n id: number;\n name: string;\n email: string;\n}\n\nconst user: User = {\n id: 1,\n name: "John Doe",\n email: "john@example.com"\n};', + language: 'typescript', + theme: 'vs-dark', + height: '400px', + readOnly: false + } as any, +}; + +export const Python: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: 'def greet(name):\n """Greet a person by name."""\n return f"Hello, {name}!"\n\nif __name__ == "__main__":\n print(greet("World"))', + language: 'python', + theme: 'vs-dark', + height: '400px', + readOnly: false + } as any, +}; + +export const JSON: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: '{\n "name": "ObjectUI",\n "version": "1.0.0",\n "description": "Server-Driven UI Engine",\n "features": [\n "JSON-based components",\n "React integration",\n "Tailwind styling"\n ]\n}', + language: 'json', + theme: 'vs-dark', + height: '400px', + readOnly: false + } as any, +}; + +export const ReadOnly: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: '// This editor is read-only\nconst message = "You cannot edit this code";\nconsole.log(message);', + language: 'javascript', + theme: 'vs-dark', + height: '300px', + readOnly: true + } as any, +}; + +export const LightTheme: Story = { + render: renderStory, + args: { + type: 'code-editor', + value: 'function fibonacci(n) {\n if (n <= 1) return n;\n return fibonacci(n - 1) + fibonacci(n - 2);\n}\n\nconsole.log(fibonacci(10));', + language: 'javascript', + theme: 'light', + height: '400px', + readOnly: false + } as any, +}; diff --git a/packages/components/src/stories-json/dashboard.stories.tsx b/packages/components/src/stories-json/dashboard.stories.tsx new file mode 100644 index 000000000..b4feec527 --- /dev/null +++ b/packages/components/src/stories-json/dashboard.stories.tsx @@ -0,0 +1,78 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Dashboard', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Default: Story = { + render: renderStory, + args: { + type: 'dashboard', + columns: 3, + gap: 4, + children: [ + { + type: 'metric', + label: 'Total Revenue', + value: '$45,231.89', + className: 'col-span-1' + }, + { + type: 'metric', + label: 'Active Users', + value: '2,350', + className: 'col-span-1' + }, + { + type: 'metric', + label: 'Conversion Rate', + value: '12.5%', + className: 'col-span-1' + } + ] + } as any, +}; + +export const WithCards: Story = { + render: renderStory, + args: { + type: 'dashboard', + columns: 2, + gap: 6, + children: [ + { + type: 'card', + title: 'Sales Overview', + children: [ + { type: 'metric', label: 'Today', value: '$1,234' }, + { type: 'metric', label: 'This Week', value: '$8,456' }, + ], + className: 'col-span-1' + }, + { + type: 'card', + title: 'User Metrics', + children: [ + { type: 'metric', label: 'Online', value: '456' }, + { type: 'metric', label: 'New Today', value: '89' }, + ], + className: 'col-span-1' + } + ] + } as any, +}; diff --git a/packages/components/src/stories-json/kanban.stories.tsx b/packages/components/src/stories-json/kanban.stories.tsx new file mode 100644 index 000000000..1b28dc2d3 --- /dev/null +++ b/packages/components/src/stories-json/kanban.stories.tsx @@ -0,0 +1,167 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Kanban', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Default: Story = { + render: renderStory, + args: { + type: 'kanban', + columns: [ + { + id: 'todo', + title: 'To Do', + cards: [ + { + id: 'card-1', + title: 'Task 1', + description: 'This is the first task', + badges: [ + { label: 'High Priority', variant: 'destructive' }, + { label: 'Feature', variant: 'default' } + ] + }, + { + id: 'card-2', + title: 'Task 2', + description: 'This is the second task', + badges: [ + { label: 'Bug', variant: 'destructive' } + ] + } + ] + }, + { + id: 'in-progress', + title: 'In Progress', + limit: 3, + cards: [ + { + id: 'card-3', + title: 'Task 3', + description: 'Currently working on this', + badges: [ + { label: 'In Progress', variant: 'default' } + ] + } + ] + }, + { + id: 'done', + title: 'Done', + cards: [ + { + id: 'card-4', + title: 'Task 4', + description: 'This task is completed', + badges: [ + { label: 'Completed', variant: 'outline' } + ] + }, + { + id: 'card-5', + title: 'Task 5', + description: 'Another completed task', + badges: [ + { label: 'Completed', variant: 'outline' } + ] + } + ] + } + ], + className: 'w-full' + } as any, +}; + +export const ProjectManagement: Story = { + render: renderStory, + args: { + type: 'kanban', + columns: [ + { + id: 'backlog', + title: 'Backlog', + cards: [ + { + id: 'task-1', + title: 'Implement dark mode', + description: 'Add support for dark theme across the application', + badges: [ + { label: 'Enhancement', variant: 'default' }, + { label: 'Low Priority', variant: 'secondary' } + ] + }, + { + id: 'task-2', + title: 'Performance optimization', + description: 'Optimize bundle size and loading time', + badges: [ + { label: 'Performance', variant: 'default' } + ] + } + ] + }, + { + id: 'in-progress', + title: 'In Progress', + limit: 2, + cards: [ + { + id: 'task-3', + title: 'User authentication', + description: 'Implement JWT-based authentication', + badges: [ + { label: 'Feature', variant: 'default' }, + { label: 'High Priority', variant: 'destructive' } + ] + } + ] + }, + { + id: 'review', + title: 'In Review', + cards: [ + { + id: 'task-4', + title: 'API integration', + description: 'Connect to REST API endpoints', + badges: [ + { label: 'Feature', variant: 'default' } + ] + } + ] + }, + { + id: 'completed', + title: 'Completed', + cards: [ + { + id: 'task-5', + title: 'Initial setup', + description: 'Project scaffolding and configuration', + badges: [ + { label: 'Done', variant: 'outline' } + ] + } + ] + } + ], + className: 'w-full' + } as any, +}; diff --git a/packages/components/src/stories-json/markdown.stories.tsx b/packages/components/src/stories-json/markdown.stories.tsx new file mode 100644 index 000000000..dce6ff31c --- /dev/null +++ b/packages/components/src/stories-json/markdown.stories.tsx @@ -0,0 +1,129 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Markdown', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Default: Story = { + render: renderStory, + args: { + type: 'markdown', + content: '# Hello World\n\nThis is a **markdown** component with *formatting* support.\n\n- Item 1\n- Item 2\n- Item 3' + } as any, +}; + +export const CompleteExample: Story = { + render: renderStory, + args: { + type: 'markdown', + content: `# ObjectUI Documentation + +## Introduction + +ObjectUI is a **Universal, Server-Driven UI (SDUI) Engine** built on React + Tailwind + Shadcn. + +### Key Features + +- 🚀 JSON-based component definitions +- 🎨 Beautiful UI with Shadcn components +- ⚡ Fast and lightweight +- 🔧 Fully customizable + +### Installation + +\`\`\`bash +npm install @object-ui/react +\`\`\` + +### Quick Start + +\`\`\`javascript +import { SchemaRenderer } from '@object-ui/react'; + +const schema = { + type: 'button', + children: [{ type: 'text', content: 'Click Me' }] +}; + + +\`\`\` + +> **Note:** This is just a sample documentation. + +For more information, visit our [website](https://objectui.dev). +` + } as any, +}; + +export const CodeExample: Story = { + render: renderStory, + args: { + type: 'markdown', + content: `## Code Snippets + +Here's how to create a button component: + +\`\`\`json +{ + "type": "button", + "props": { + "variant": "default" + }, + "children": [ + { + "type": "text", + "content": "Click Me" + } + ] +} +\`\`\` + +And here's a TypeScript example: + +\`\`\`typescript +interface ButtonSchema { + type: 'button'; + props?: { + variant?: 'default' | 'outline' | 'ghost'; + }; + children?: BaseSchema[]; +} +\`\`\` +` + } as any, +}; + +export const TableExample: Story = { + render: renderStory, + args: { + type: 'markdown', + content: `## Component Comparison + +| Feature | ObjectUI | Traditional | +|---------|----------|-------------| +| Development Speed | ⚡ Fast | 🐌 Slow | +| Flexibility | 🔥 High | ⭐ Medium | +| Learning Curve | 📚 Easy | 🎓 Steep | +| Performance | 🚀 Excellent | ✅ Good | + +### Conclusion + +ObjectUI provides a modern approach to building user interfaces with better development speed and flexibility. +` + } as any, +}; diff --git a/packages/components/src/stories-json/timeline.stories.tsx b/packages/components/src/stories-json/timeline.stories.tsx new file mode 100644 index 000000000..6dcaa3d79 --- /dev/null +++ b/packages/components/src/stories-json/timeline.stories.tsx @@ -0,0 +1,188 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Timeline', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const Vertical: Story = { + render: renderStory, + args: { + type: 'timeline', + variant: 'vertical', + dateFormat: 'short', + items: [ + { + time: '2024-01-15', + title: 'Project Started', + description: 'Kickoff meeting and initial planning', + variant: 'success', + icon: '🚀', + }, + { + time: '2024-02-01', + title: 'First Milestone', + description: 'Completed initial design phase', + variant: 'info', + icon: '🎨', + }, + { + time: '2024-03-15', + title: 'Beta Release', + description: 'Released beta version to testers', + variant: 'warning', + icon: '⚡', + }, + { + time: '2024-04-01', + title: 'Launch', + description: 'Official product launch', + variant: 'success', + icon: '🎉', + }, + ] + } as any, +}; + +export const Horizontal: Story = { + render: renderStory, + args: { + type: 'timeline', + variant: 'horizontal', + dateFormat: 'short', + items: [ + { + time: '2024-01-01', + title: 'Q1', + description: 'First quarter goals', + variant: 'default', + }, + { + time: '2024-04-01', + title: 'Q2', + description: 'Second quarter goals', + variant: 'info', + }, + { + time: '2024-07-01', + title: 'Q3', + description: 'Third quarter goals', + variant: 'warning', + }, + { + time: '2024-10-01', + title: 'Q4', + description: 'Fourth quarter goals', + variant: 'success', + }, + ] + } as any, +}; + +export const Gantt: Story = { + render: renderStory, + args: { + type: 'timeline', + variant: 'gantt', + dateFormat: 'short', + timeScale: 'month', + rowLabel: 'Projects', + items: [ + { + label: 'Backend Development', + items: [ + { + title: 'API Design', + startDate: '2024-01-01', + endDate: '2024-01-31', + variant: 'success', + }, + { + title: 'Implementation', + startDate: '2024-02-01', + endDate: '2024-03-31', + variant: 'info', + }, + ], + }, + { + label: 'Frontend Development', + items: [ + { + title: 'UI Design', + startDate: '2024-01-15', + endDate: '2024-02-15', + variant: 'warning', + }, + { + title: 'Component Dev', + startDate: '2024-02-15', + endDate: '2024-04-15', + variant: 'default', + }, + ], + }, + { + label: 'Testing', + items: [ + { + title: 'QA Phase', + startDate: '2024-03-01', + endDate: '2024-04-30', + variant: 'danger', + }, + ], + }, + ], + className: 'w-full' + } as any, +}; + +export const ProductRoadmap: Story = { + render: renderStory, + args: { + type: 'timeline', + variant: 'vertical', + dateFormat: 'long', + items: [ + { + time: '2024-01-01', + title: 'Phase 1: Foundation', + description: 'Core infrastructure and basic features', + variant: 'success', + }, + { + time: '2024-03-01', + title: 'Phase 2: Enhancement', + description: 'Advanced features and integrations', + variant: 'info', + }, + { + time: '2024-06-01', + title: 'Phase 3: Optimization', + description: 'Performance improvements and scaling', + variant: 'warning', + }, + { + time: '2024-09-01', + title: 'Phase 4: Enterprise', + description: 'Enterprise features and support', + variant: 'default', + }, + ] + } as any, +}; From 62c31e50afcdda6b77bf29e9309066b6e896ceac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:31:45 +0000 Subject: [PATCH 03/12] Complete Storybook stories for all 14 plugin components Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- .../src/stories-json/object-form.stories.tsx | 78 +++++++++++++ .../src/stories-json/object-gantt.stories.tsx | 103 ++++++++++++++++ .../src/stories-json/object-grid.stories.tsx | 95 +++++++++++++++ .../src/stories-json/object-map.stories.tsx | 105 +++++++++++++++++ .../src/stories-json/object-view.stories.tsx | 110 ++++++++++++++++++ 5 files changed, 491 insertions(+) create mode 100644 packages/components/src/stories-json/object-form.stories.tsx create mode 100644 packages/components/src/stories-json/object-gantt.stories.tsx create mode 100644 packages/components/src/stories-json/object-grid.stories.tsx create mode 100644 packages/components/src/stories-json/object-map.stories.tsx create mode 100644 packages/components/src/stories-json/object-view.stories.tsx diff --git a/packages/components/src/stories-json/object-form.stories.tsx b/packages/components/src/stories-json/object-form.stories.tsx new file mode 100644 index 000000000..e90c01d08 --- /dev/null +++ b/packages/components/src/stories-json/object-form.stories.tsx @@ -0,0 +1,78 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Object Form', + component: SchemaRenderer, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const BasicSchema: Story = { + render: renderStory, + args: { + type: 'object-form', + objectName: 'User', + fields: [ + { name: 'firstName', label: 'First Name', type: 'text', required: true }, + { name: 'lastName', label: 'Last Name', type: 'text', required: true }, + { name: 'email', label: 'Email', type: 'email', required: true }, + { name: 'age', label: 'Age', type: 'number' } + ], + className: 'w-full max-w-2xl' + } as any, +}; + +export const WithSections: Story = { + render: renderStory, + args: { + type: 'object-form', + objectName: 'Employee', + sections: [ + { + title: 'Personal Information', + fields: [ + { name: 'firstName', label: 'First Name', type: 'text', required: true }, + { name: 'lastName', label: 'Last Name', type: 'text', required: true }, + { name: 'dateOfBirth', label: 'Date of Birth', type: 'date' } + ] + }, + { + title: 'Contact Details', + fields: [ + { name: 'email', label: 'Email', type: 'email', required: true }, + { name: 'phone', label: 'Phone', type: 'tel' }, + { name: 'address', label: 'Address', type: 'textarea' } + ] + } + ], + className: 'w-full max-w-2xl' + } as any, +}; + +export const ComplexFields: Story = { + render: renderStory, + args: { + type: 'object-form', + objectName: 'Product', + fields: [ + { name: 'name', label: 'Product Name', type: 'text', required: true }, + { name: 'category', label: 'Category', type: 'select', options: ['Electronics', 'Clothing', 'Food'], required: true }, + { name: 'price', label: 'Price', type: 'number', required: true }, + { name: 'inStock', label: 'In Stock', type: 'checkbox' }, + { name: 'description', label: 'Description', type: 'textarea', rows: 4 } + ], + className: 'w-full max-w-2xl' + } as any, +}; diff --git a/packages/components/src/stories-json/object-gantt.stories.tsx b/packages/components/src/stories-json/object-gantt.stories.tsx new file mode 100644 index 000000000..7be5dea23 --- /dev/null +++ b/packages/components/src/stories-json/object-gantt.stories.tsx @@ -0,0 +1,103 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Object Gantt', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const ProjectSchedule: Story = { + render: renderStory, + args: { + type: 'object-gantt', + objectName: 'Task', + gantt: { + startDateField: 'startDate', + endDateField: 'endDate', + titleField: 'name', + progressField: 'progress', + dependenciesField: 'dependencies' + }, + tasks: [ + { + id: '1', + name: 'Project Planning', + startDate: '2024-01-01', + endDate: '2024-01-15', + progress: 100 + }, + { + id: '2', + name: 'Design Phase', + startDate: '2024-01-10', + endDate: '2024-02-15', + progress: 75, + dependencies: ['1'] + }, + { + id: '3', + name: 'Development', + startDate: '2024-02-01', + endDate: '2024-04-30', + progress: 30, + dependencies: ['2'] + }, + { + id: '4', + name: 'Testing', + startDate: '2024-04-15', + endDate: '2024-05-15', + progress: 0, + dependencies: ['3'] + } + ], + className: 'w-full' + } as any, +}; + +export const SimpleGantt: Story = { + render: renderStory, + args: { + type: 'object-gantt', + objectName: 'Milestone', + gantt: { + startDateField: 'start', + endDateField: 'end', + titleField: 'title' + }, + tasks: [ + { + id: '1', + title: 'Q1 Goals', + start: '2024-01-01', + end: '2024-03-31' + }, + { + id: '2', + title: 'Q2 Goals', + start: '2024-04-01', + end: '2024-06-30' + }, + { + id: '3', + title: 'Q3 Goals', + start: '2024-07-01', + end: '2024-09-30' + } + ], + className: 'w-full' + } as any, +}; diff --git a/packages/components/src/stories-json/object-grid.stories.tsx b/packages/components/src/stories-json/object-grid.stories.tsx new file mode 100644 index 000000000..c50c2d0e6 --- /dev/null +++ b/packages/components/src/stories-json/object-grid.stories.tsx @@ -0,0 +1,95 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Object Grid', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const UserGrid: Story = { + render: renderStory, + args: { + type: 'object-grid', + objectName: 'User', + columns: [ + { field: 'id', header: 'ID', width: 80 }, + { field: 'name', header: 'Name', sortable: true, filterable: true }, + { field: 'email', header: 'Email', sortable: true, filterable: true }, + { field: 'role', header: 'Role', sortable: true }, + { field: 'status', header: 'Status', sortable: true } + ], + data: [ + { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin', status: 'Active' }, + { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User', status: 'Active' }, + { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'User', status: 'Inactive' } + ], + pagination: true, + pageSize: 10, + className: 'w-full' + } as any, +}; + +export const ProductGrid: Story = { + render: renderStory, + args: { + type: 'object-grid', + objectName: 'Product', + columns: [ + { field: 'sku', header: 'SKU', width: 120 }, + { field: 'name', header: 'Product Name', sortable: true, filterable: true }, + { field: 'category', header: 'Category', sortable: true, filterable: true }, + { field: 'price', header: 'Price', sortable: true, type: 'currency' }, + { field: 'stock', header: 'In Stock', sortable: true, type: 'number' } + ], + data: [ + { sku: 'PROD-001', name: 'Laptop', category: 'Electronics', price: 1299.99, stock: 15 }, + { sku: 'PROD-002', name: 'Mouse', category: 'Electronics', price: 29.99, stock: 120 }, + { sku: 'PROD-003', name: 'Desk Chair', category: 'Furniture', price: 249.99, stock: 8 }, + { sku: 'PROD-004', name: 'Monitor', category: 'Electronics', price: 399.99, stock: 22 } + ], + pagination: true, + pageSize: 5, + className: 'w-full' + } as any, +}; + +export const WithActions: Story = { + render: renderStory, + args: { + type: 'object-grid', + objectName: 'Order', + columns: [ + { field: 'orderId', header: 'Order ID', width: 120 }, + { field: 'customer', header: 'Customer', sortable: true }, + { field: 'date', header: 'Order Date', sortable: true, type: 'date' }, + { field: 'total', header: 'Total', sortable: true, type: 'currency' }, + { field: 'status', header: 'Status', sortable: true } + ], + actions: [ + { label: 'View', action: 'view' }, + { label: 'Edit', action: 'edit' }, + { label: 'Delete', action: 'delete', variant: 'destructive' } + ], + data: [ + { orderId: 'ORD-1001', customer: 'Alice Brown', date: '2024-01-15', total: 159.99, status: 'Completed' }, + { orderId: 'ORD-1002', customer: 'Charlie Davis', date: '2024-01-18', total: 89.50, status: 'Processing' }, + { orderId: 'ORD-1003', customer: 'Eve Wilson', date: '2024-01-20', total: 299.99, status: 'Shipped' } + ], + pagination: true, + pageSize: 10, + className: 'w-full' + } as any, +}; diff --git a/packages/components/src/stories-json/object-map.stories.tsx b/packages/components/src/stories-json/object-map.stories.tsx new file mode 100644 index 000000000..bc2414c69 --- /dev/null +++ b/packages/components/src/stories-json/object-map.stories.tsx @@ -0,0 +1,105 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Object Map', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const StoreLocations: Story = { + render: renderStory, + args: { + type: 'object-map', + objectName: 'Store', + map: { + latitudeField: 'latitude', + longitudeField: 'longitude', + titleField: 'name', + descriptionField: 'address' + }, + locations: [ + { + id: '1', + name: 'Downtown Store', + address: '123 Main St', + latitude: 40.7128, + longitude: -74.0060 + }, + { + id: '2', + name: 'Uptown Branch', + address: '456 Park Ave', + latitude: 40.7589, + longitude: -73.9851 + }, + { + id: '3', + name: 'Suburban Location', + address: '789 Oak Rd', + latitude: 40.6782, + longitude: -73.9442 + } + ], + center: { + latitude: 40.7128, + longitude: -74.0060 + }, + zoom: 12, + className: 'w-full h-[500px]' + } as any, +}; + +export const DeliveryRoutes: Story = { + render: renderStory, + args: { + type: 'object-map', + objectName: 'Delivery', + map: { + latitudeField: 'lat', + longitudeField: 'lng', + titleField: 'address' + }, + locations: [ + { + id: '1', + address: 'Customer A - 100 First St', + lat: 37.7749, + lng: -122.4194, + status: 'Delivered' + }, + { + id: '2', + address: 'Customer B - 200 Second Ave', + lat: 37.7849, + lng: -122.4094, + status: 'In Transit' + }, + { + id: '3', + address: 'Customer C - 300 Third Blvd', + lat: 37.7649, + lng: -122.4294, + status: 'Pending' + } + ], + center: { + latitude: 37.7749, + longitude: -122.4194 + }, + zoom: 13, + className: 'w-full h-[500px]' + } as any, +}; diff --git a/packages/components/src/stories-json/object-view.stories.tsx b/packages/components/src/stories-json/object-view.stories.tsx new file mode 100644 index 000000000..f85326c26 --- /dev/null +++ b/packages/components/src/stories-json/object-view.stories.tsx @@ -0,0 +1,110 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { SchemaRenderer } from '../SchemaRenderer'; +import type { BaseSchema } from '@object-ui/types'; + +const meta = { + title: 'JSON/Plugins/Object View', + component: SchemaRenderer, + parameters: { + layout: 'padded', + }, + tags: ['autodocs'], + argTypes: { + schema: { table: { disable: true } }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const renderStory = (args: any) => ; + +export const UserProfile: Story = { + render: renderStory, + args: { + type: 'object-view', + objectName: 'User', + layout: 'card', + data: { + id: 1, + name: 'John Doe', + email: 'john.doe@example.com', + role: 'Administrator', + status: 'Active', + joinedDate: '2023-01-15', + department: 'Engineering' + }, + fields: [ + { name: 'id', label: 'User ID', type: 'text' }, + { name: 'name', label: 'Full Name', type: 'text' }, + { name: 'email', label: 'Email Address', type: 'email' }, + { name: 'role', label: 'Role', type: 'text' }, + { name: 'status', label: 'Status', type: 'badge' }, + { name: 'joinedDate', label: 'Joined Date', type: 'date' }, + { name: 'department', label: 'Department', type: 'text' } + ], + className: 'w-full max-w-2xl' + } as any, +}; + +export const ProductDetails: Story = { + render: renderStory, + args: { + type: 'object-view', + objectName: 'Product', + layout: 'table', + data: { + sku: 'PROD-12345', + name: 'Professional Laptop', + category: 'Electronics', + brand: 'TechCorp', + price: 1299.99, + stock: 45, + description: 'High-performance laptop for professionals', + rating: 4.5, + reviews: 128 + }, + fields: [ + { name: 'sku', label: 'SKU', type: 'text' }, + { name: 'name', label: 'Product Name', type: 'text' }, + { name: 'category', label: 'Category', type: 'text' }, + { name: 'brand', label: 'Brand', type: 'text' }, + { name: 'price', label: 'Price', type: 'currency' }, + { name: 'stock', label: 'In Stock', type: 'number' }, + { name: 'description', label: 'Description', type: 'textarea' }, + { name: 'rating', label: 'Rating', type: 'number' }, + { name: 'reviews', label: 'Reviews', type: 'number' } + ], + className: 'w-full max-w-3xl' + } as any, +}; + +export const OrderSummary: Story = { + render: renderStory, + args: { + type: 'object-view', + objectName: 'Order', + layout: 'card', + data: { + orderId: 'ORD-98765', + customer: 'Alice Johnson', + orderDate: '2024-01-20', + total: 456.78, + status: 'Processing', + shippingAddress: '456 Oak Street, San Francisco, CA 94102', + items: 3, + trackingNumber: 'TRK123456789' + }, + fields: [ + { name: 'orderId', label: 'Order ID', type: 'text' }, + { name: 'customer', label: 'Customer Name', type: 'text' }, + { name: 'orderDate', label: 'Order Date', type: 'date' }, + { name: 'total', label: 'Total Amount', type: 'currency' }, + { name: 'status', label: 'Status', type: 'badge' }, + { name: 'shippingAddress', label: 'Shipping Address', type: 'textarea' }, + { name: 'items', label: 'Number of Items', type: 'number' }, + { name: 'trackingNumber', label: 'Tracking Number', type: 'text' } + ], + className: 'w-full max-w-2xl' + } as any, +}; From 8dda86b6a5e2f402b4322e7778e9d3765a001788 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 12:17:07 +0000 Subject: [PATCH 04/12] Fix Storybook build: Add Vite aliases for plugin packages to avoid circular dependencies Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/components/.storybook/main.ts | 28 ++++++++ packages/components/.storybook/preview.ts | 19 +++++- pnpm-lock.yaml | 83 +++++++++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/packages/components/.storybook/main.ts b/packages/components/.storybook/main.ts index b8c38b8da..ea5a4fc1c 100644 --- a/packages/components/.storybook/main.ts +++ b/packages/components/.storybook/main.ts @@ -1,4 +1,6 @@ import type { StorybookConfig } from "@storybook/react-vite"; +import { mergeConfig } from 'vite'; +import path from 'path'; const config: StorybookConfig = { stories: ["../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], @@ -14,5 +16,31 @@ const config: StorybookConfig = { docs: { autodocs: "tag", }, + async viteFinal(config) { + return mergeConfig(config, { + resolve: { + alias: { + // Alias components package to source to avoid circular dependency during build + '@object-ui/components': path.resolve(__dirname, '../src/index.ts'), + '@object-ui/fields': path.resolve(__dirname, '../../fields/src/index.tsx'), + // Alias plugin packages for Storybook to resolve them from workspace + '@object-ui/plugin-aggrid': path.resolve(__dirname, '../../plugin-aggrid/src/index.tsx'), + '@object-ui/plugin-calendar': path.resolve(__dirname, '../../plugin-calendar/src/index.tsx'), + '@object-ui/plugin-charts': path.resolve(__dirname, '../../plugin-charts/src/index.tsx'), + '@object-ui/plugin-chatbot': path.resolve(__dirname, '../../plugin-chatbot/src/index.tsx'), + '@object-ui/plugin-dashboard': path.resolve(__dirname, '../../plugin-dashboard/src/index.tsx'), + '@object-ui/plugin-editor': path.resolve(__dirname, '../../plugin-editor/src/index.tsx'), + '@object-ui/plugin-form': path.resolve(__dirname, '../../plugin-form/src/index.tsx'), + '@object-ui/plugin-gantt': path.resolve(__dirname, '../../plugin-gantt/src/index.tsx'), + '@object-ui/plugin-grid': path.resolve(__dirname, '../../plugin-grid/src/index.tsx'), + '@object-ui/plugin-kanban': path.resolve(__dirname, '../../plugin-kanban/src/index.tsx'), + '@object-ui/plugin-map': path.resolve(__dirname, '../../plugin-map/src/index.tsx'), + '@object-ui/plugin-markdown': path.resolve(__dirname, '../../plugin-markdown/src/index.tsx'), + '@object-ui/plugin-timeline': path.resolve(__dirname, '../../plugin-timeline/src/index.tsx'), + '@object-ui/plugin-view': path.resolve(__dirname, '../../plugin-view/src/index.tsx'), + }, + }, + }); + }, }; export default config; diff --git a/packages/components/.storybook/preview.ts b/packages/components/.storybook/preview.ts index bb4e135d4..74811cfd8 100644 --- a/packages/components/.storybook/preview.ts +++ b/packages/components/.storybook/preview.ts @@ -3,9 +3,26 @@ import '../src/index.css'; import { ComponentRegistry } from '@object-ui/core'; import * as components from '../src/index'; -// Register all components for Storybook +// Register all base components for Storybook Object.values(components); +// Import and register all plugin components for Storybook +// This ensures plugin components are available for the plugin stories +import '@object-ui/plugin-aggrid'; +import '@object-ui/plugin-calendar'; +import '@object-ui/plugin-charts'; +import '@object-ui/plugin-chatbot'; +import '@object-ui/plugin-dashboard'; +import '@object-ui/plugin-editor'; +import '@object-ui/plugin-form'; +import '@object-ui/plugin-gantt'; +import '@object-ui/plugin-grid'; +import '@object-ui/plugin-kanban'; +import '@object-ui/plugin-map'; +import '@object-ui/plugin-markdown'; +import '@object-ui/plugin-timeline'; +import '@object-ui/plugin-view'; + const preview: Preview = { parameters: { controls: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d00669e0..77ed49a16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -499,6 +499,48 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) devDependencies: + '@object-ui/plugin-aggrid': + specifier: workspace:* + version: link:../plugin-aggrid + '@object-ui/plugin-calendar': + specifier: workspace:* + version: link:../plugin-calendar + '@object-ui/plugin-charts': + specifier: workspace:* + version: link:../plugin-charts + '@object-ui/plugin-chatbot': + specifier: workspace:* + version: link:../plugin-chatbot + '@object-ui/plugin-dashboard': + specifier: workspace:* + version: link:../plugin-dashboard + '@object-ui/plugin-editor': + specifier: workspace:* + version: link:../plugin-editor + '@object-ui/plugin-form': + specifier: workspace:* + version: link:../plugin-form + '@object-ui/plugin-gantt': + specifier: workspace:* + version: link:../plugin-gantt + '@object-ui/plugin-grid': + specifier: workspace:* + version: link:../plugin-grid + '@object-ui/plugin-kanban': + specifier: workspace:* + version: link:../plugin-kanban + '@object-ui/plugin-map': + specifier: workspace:* + version: link:../plugin-map + '@object-ui/plugin-markdown': + specifier: workspace:* + version: link:../plugin-markdown + '@object-ui/plugin-timeline': + specifier: workspace:* + version: link:../plugin-timeline + '@object-ui/plugin-view': + specifier: workspace:* + version: link:../plugin-view '@storybook/addon-essentials': specifier: ^8.6.0 version: 8.6.14(@types/react@19.2.9)(storybook@8.6.15(prettier@3.8.1)) @@ -2273,89 +2315,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2537,24 +2595,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.4': resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==} @@ -3336,66 +3398,79 @@ packages: resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.55.1': resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.55.1': resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.55.1': resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.55.1': resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.55.1': resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.55.1': resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.55.1': resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.55.1': resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.55.1': resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.55.1': resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.55.1': resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.55.1': resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.55.1': resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} @@ -3772,24 +3847,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -6145,24 +6224,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} From 63396525d74aa3e92a9f2dc68b86dd428b81bf4a Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 21:21:03 +0800 Subject: [PATCH 05/12] Add Storybook configuration and stories for all components and plugins --- .gitignore | 1 + .../.storybook => .storybook}/main.ts | 34 +++--- .../.storybook => .storybook}/preview.ts | 4 +- package.json | 10 +- packages/components/package.json | 5 +- pnpm-lock.yaml | 108 ++++-------------- .../components/vercel.json => vercel.json | 0 7 files changed, 53 insertions(+), 109 deletions(-) rename {packages/components/.storybook => .storybook}/main.ts (62%) rename {packages/components/.storybook => .storybook}/preview.ts (89%) rename packages/components/vercel.json => vercel.json (100%) diff --git a/.gitignore b/.gitignore index f40a781d7..89402fa76 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules dist build out +storybook-static # Misc .DS_Store diff --git a/packages/components/.storybook/main.ts b/.storybook/main.ts similarity index 62% rename from packages/components/.storybook/main.ts rename to .storybook/main.ts index ea5a4fc1c..20c6ce89b 100644 --- a/packages/components/.storybook/main.ts +++ b/.storybook/main.ts @@ -3,7 +3,7 @@ import { mergeConfig } from 'vite'; import path from 'path'; const config: StorybookConfig = { - stories: ["../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + stories: ["../packages/**/src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], addons: [ "@storybook/addon-links", "@storybook/addon-essentials", @@ -21,23 +21,23 @@ const config: StorybookConfig = { resolve: { alias: { // Alias components package to source to avoid circular dependency during build - '@object-ui/components': path.resolve(__dirname, '../src/index.ts'), - '@object-ui/fields': path.resolve(__dirname, '../../fields/src/index.tsx'), + '@object-ui/components': path.resolve(__dirname, '../packages/components/src/index.ts'), + '@object-ui/fields': path.resolve(__dirname, '../packages/fields/src/index.tsx'), // Alias plugin packages for Storybook to resolve them from workspace - '@object-ui/plugin-aggrid': path.resolve(__dirname, '../../plugin-aggrid/src/index.tsx'), - '@object-ui/plugin-calendar': path.resolve(__dirname, '../../plugin-calendar/src/index.tsx'), - '@object-ui/plugin-charts': path.resolve(__dirname, '../../plugin-charts/src/index.tsx'), - '@object-ui/plugin-chatbot': path.resolve(__dirname, '../../plugin-chatbot/src/index.tsx'), - '@object-ui/plugin-dashboard': path.resolve(__dirname, '../../plugin-dashboard/src/index.tsx'), - '@object-ui/plugin-editor': path.resolve(__dirname, '../../plugin-editor/src/index.tsx'), - '@object-ui/plugin-form': path.resolve(__dirname, '../../plugin-form/src/index.tsx'), - '@object-ui/plugin-gantt': path.resolve(__dirname, '../../plugin-gantt/src/index.tsx'), - '@object-ui/plugin-grid': path.resolve(__dirname, '../../plugin-grid/src/index.tsx'), - '@object-ui/plugin-kanban': path.resolve(__dirname, '../../plugin-kanban/src/index.tsx'), - '@object-ui/plugin-map': path.resolve(__dirname, '../../plugin-map/src/index.tsx'), - '@object-ui/plugin-markdown': path.resolve(__dirname, '../../plugin-markdown/src/index.tsx'), - '@object-ui/plugin-timeline': path.resolve(__dirname, '../../plugin-timeline/src/index.tsx'), - '@object-ui/plugin-view': path.resolve(__dirname, '../../plugin-view/src/index.tsx'), + '@object-ui/plugin-aggrid': path.resolve(__dirname, '../packages/plugin-aggrid/src/index.tsx'), + '@object-ui/plugin-calendar': path.resolve(__dirname, '../packages/plugin-calendar/src/index.tsx'), + '@object-ui/plugin-charts': path.resolve(__dirname, '../packages/plugin-charts/src/index.tsx'), + '@object-ui/plugin-chatbot': path.resolve(__dirname, '../packages/plugin-chatbot/src/index.tsx'), + '@object-ui/plugin-dashboard': path.resolve(__dirname, '../packages/plugin-dashboard/src/index.tsx'), + '@object-ui/plugin-editor': path.resolve(__dirname, '../packages/plugin-editor/src/index.tsx'), + '@object-ui/plugin-form': path.resolve(__dirname, '../packages/plugin-form/src/index.tsx'), + '@object-ui/plugin-gantt': path.resolve(__dirname, '../packages/plugin-gantt/src/index.tsx'), + '@object-ui/plugin-grid': path.resolve(__dirname, '../packages/plugin-grid/src/index.tsx'), + '@object-ui/plugin-kanban': path.resolve(__dirname, '../packages/plugin-kanban/src/index.tsx'), + '@object-ui/plugin-map': path.resolve(__dirname, '../packages/plugin-map/src/index.tsx'), + '@object-ui/plugin-markdown': path.resolve(__dirname, '../packages/plugin-markdown/src/index.tsx'), + '@object-ui/plugin-timeline': path.resolve(__dirname, '../packages/plugin-timeline/src/index.tsx'), + '@object-ui/plugin-view': path.resolve(__dirname, '../packages/plugin-view/src/index.tsx'), }, }, }); diff --git a/packages/components/.storybook/preview.ts b/.storybook/preview.ts similarity index 89% rename from packages/components/.storybook/preview.ts rename to .storybook/preview.ts index 74811cfd8..12482982c 100644 --- a/packages/components/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,7 +1,7 @@ import type { Preview } from '@storybook/react-vite' -import '../src/index.css'; +import '../packages/components/src/index.css'; import { ComponentRegistry } from '@object-ui/core'; -import * as components from '../src/index'; +import * as components from '../packages/components/src/index'; // Register all base components for Storybook Object.values(components); diff --git a/package.json b/package.json index 433d0747f..7354f9847 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "lint": "pnpm -r lint", "cli": "node packages/cli/dist/cli.js", "objectui": "node packages/cli/dist/cli.js", - "build:storybook": "pnpm --filter @object-ui/components build-storybook", + "storybook": "storybook dev -p 6006", + "build:storybook": "storybook build", "doctor": "node packages/cli/dist/cli.js doctor", "studio": "node packages/cli/dist/cli.js studio", "check": "node packages/cli/dist/cli.js check", @@ -47,6 +48,12 @@ "devDependencies": { "@changesets/cli": "^2.29.8", "@eslint/js": "^9.39.1", + "@storybook/addon-essentials": "^8.6.14", + "@storybook/addon-interactions": "^8.6.14", + "@storybook/addon-links": "^8.6.15", + "@storybook/blocks": "^8.6.14", + "@storybook/react": "^8.6.15", + "@storybook/react-vite": "^8.6.15", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -67,6 +74,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "react-router-dom": "^7.13.0", + "storybook": "^8.6.15", "tailwindcss": "^4.1.18", "tslib": "^2.6.0", "turbo": "^2.7.6", diff --git a/packages/components/package.json b/packages/components/package.json index ca87dc87c..8934cbabf 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -31,10 +31,7 @@ "pretest": "pnpm run prebuild", "test": "vitest run", "type-check": "tsc --noEmit", - "lint": "eslint .", - "storybook": "storybook dev -p 6006", - "prebuild-storybook": "pnpm run prebuild", - "build-storybook": "storybook build" + "lint": "eslint ." }, "dependencies": { "@object-ui/core": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77ed49a16..b94f6aa3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,24 @@ importers: '@eslint/js': specifier: ^9.39.1 version: 9.39.2 + '@storybook/addon-essentials': + specifier: ^8.6.14 + version: 8.6.14(@types/react@19.2.9)(storybook@8.6.15(prettier@3.8.1)) + '@storybook/addon-interactions': + specifier: ^8.6.14 + version: 8.6.14(storybook@8.6.15(prettier@3.8.1)) + '@storybook/addon-links': + specifier: ^8.6.15 + version: 8.6.15(react@19.2.3)(storybook@8.6.15(prettier@3.8.1)) + '@storybook/blocks': + specifier: ^8.6.14 + version: 8.6.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@8.6.15(prettier@3.8.1)) + '@storybook/react': + specifier: ^8.6.15 + version: 8.6.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@8.6.15(prettier@3.8.1))(typescript@5.9.3) + '@storybook/react-vite': + specifier: ^8.6.15 + version: 8.6.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.55.1)(storybook@8.6.15(prettier@3.8.1))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -84,6 +102,9 @@ importers: react-router-dom: specifier: ^7.13.0 version: 7.13.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + storybook: + specifier: ^8.6.15 + version: 8.6.15(prettier@3.8.1) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -499,48 +520,6 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) devDependencies: - '@object-ui/plugin-aggrid': - specifier: workspace:* - version: link:../plugin-aggrid - '@object-ui/plugin-calendar': - specifier: workspace:* - version: link:../plugin-calendar - '@object-ui/plugin-charts': - specifier: workspace:* - version: link:../plugin-charts - '@object-ui/plugin-chatbot': - specifier: workspace:* - version: link:../plugin-chatbot - '@object-ui/plugin-dashboard': - specifier: workspace:* - version: link:../plugin-dashboard - '@object-ui/plugin-editor': - specifier: workspace:* - version: link:../plugin-editor - '@object-ui/plugin-form': - specifier: workspace:* - version: link:../plugin-form - '@object-ui/plugin-gantt': - specifier: workspace:* - version: link:../plugin-gantt - '@object-ui/plugin-grid': - specifier: workspace:* - version: link:../plugin-grid - '@object-ui/plugin-kanban': - specifier: workspace:* - version: link:../plugin-kanban - '@object-ui/plugin-map': - specifier: workspace:* - version: link:../plugin-map - '@object-ui/plugin-markdown': - specifier: workspace:* - version: link:../plugin-markdown - '@object-ui/plugin-timeline': - specifier: workspace:* - version: link:../plugin-timeline - '@object-ui/plugin-view': - specifier: workspace:* - version: link:../plugin-view '@storybook/addon-essentials': specifier: ^8.6.0 version: 8.6.14(@types/react@19.2.9)(storybook@8.6.15(prettier@3.8.1)) @@ -638,7 +617,7 @@ importers: version: 5.9.3 vitest: specifier: ^1.2.0 - version: 1.6.1(@types/node@25.0.10)(@vitest/ui@4.0.18)(happy-dom@20.3.9)(jsdom@27.4.0)(lightningcss@1.30.2) + version: 1.6.1(@types/node@25.0.10)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.3.9)(jsdom@27.4.0)(lightningcss@1.30.2) packages/fields: dependencies: @@ -2315,105 +2294,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2595,28 +2558,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@16.1.4': resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==} @@ -3398,79 +3357,66 @@ packages: resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.55.1': resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.55.1': resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.55.1': resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.55.1': resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.55.1': resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.55.1': resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.55.1': resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.55.1': resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.55.1': resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.55.1': resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.55.1': resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.55.1': resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.55.1': resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} @@ -3847,28 +3793,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -6224,28 +6166,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -16207,7 +16145,7 @@ snapshots: jiti: 2.6.1 lightningcss: 1.30.2 - vitest@1.6.1(@types/node@25.0.10)(@vitest/ui@4.0.18)(happy-dom@20.3.9)(jsdom@27.4.0)(lightningcss@1.30.2): + vitest@1.6.1(@types/node@25.0.10)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.3.9)(jsdom@27.4.0)(lightningcss@1.30.2): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 diff --git a/packages/components/vercel.json b/vercel.json similarity index 100% rename from packages/components/vercel.json rename to vercel.json From 8fbf6ad9b9ddb69594c8ef75eee5e237d8a7f389 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 21:59:49 +0800 Subject: [PATCH 06/12] Add missing Storybook stories and update configuration for improved organization --- .storybook/main.ts | 5 +- .storybook/preview.ts | 6 + packages/components/src/stories/Configure.mdx | 364 ------------------ packages/components/src/stories/Guide.mdx | 55 +++ .../components/src/stories/Introduction.mdx | 34 ++ 5 files changed, 99 insertions(+), 365 deletions(-) delete mode 100644 packages/components/src/stories/Configure.mdx create mode 100644 packages/components/src/stories/Guide.mdx create mode 100644 packages/components/src/stories/Introduction.mdx diff --git a/.storybook/main.ts b/.storybook/main.ts index 20c6ce89b..c1e9ee074 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -3,7 +3,7 @@ import { mergeConfig } from 'vite'; import path from 'path'; const config: StorybookConfig = { - stories: ["../packages/**/src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + stories: ["../packages/**/src/**/*.mdx", "../packages/**/src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], addons: [ "@storybook/addon-links", "@storybook/addon-essentials", @@ -21,8 +21,11 @@ const config: StorybookConfig = { resolve: { alias: { // Alias components package to source to avoid circular dependency during build + '@object-ui/core': path.resolve(__dirname, '../packages/core/src/index.ts'), + '@object-ui/react': path.resolve(__dirname, '../packages/react/src/index.ts'), '@object-ui/components': path.resolve(__dirname, '../packages/components/src/index.ts'), '@object-ui/fields': path.resolve(__dirname, '../packages/fields/src/index.tsx'), + '@object-ui/layout': path.resolve(__dirname, '../packages/layout/src/index.ts'), // Alias plugin packages for Storybook to resolve them from workspace '@object-ui/plugin-aggrid': path.resolve(__dirname, '../packages/plugin-aggrid/src/index.tsx'), '@object-ui/plugin-calendar': path.resolve(__dirname, '../packages/plugin-calendar/src/index.tsx'), diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 12482982c..18737210d 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -25,6 +25,12 @@ import '@object-ui/plugin-view'; const preview: Preview = { parameters: { + options: { + storySort: { + method: 'alphabetical', + order: ['Introduction', 'Guide', 'JSON', 'UI', 'Fields', 'Layout', 'Plugins'], + }, + }, controls: { matchers: { color: /(background|color)$/i, diff --git a/packages/components/src/stories/Configure.mdx b/packages/components/src/stories/Configure.mdx deleted file mode 100644 index 948e410a0..000000000 --- a/packages/components/src/stories/Configure.mdx +++ /dev/null @@ -1,364 +0,0 @@ -import { Meta } from "@storybook/addon-docs/blocks"; - -import Github from "./assets/github.svg"; -import Discord from "./assets/discord.svg"; -import Youtube from "./assets/youtube.svg"; -import Tutorials from "./assets/tutorials.svg"; -import Styling from "./assets/styling.png"; -import Context from "./assets/context.png"; -import Assets from "./assets/assets.png"; -import Docs from "./assets/docs.png"; -import Share from "./assets/share.png"; -import FigmaPlugin from "./assets/figma-plugin.png"; -import Testing from "./assets/testing.png"; -import Accessibility from "./assets/accessibility.png"; -import Theming from "./assets/theming.png"; -import AddonLibrary from "./assets/addon-library.png"; - -export const RightArrow = () => - - - - - -
-
- # Configure your project - - Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. -
-
-
- A wall of logos representing different styling technologies -

Add styling and CSS

-

Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.

- Learn more -
-
- An abstraction representing the composition of data for a component -

Provide context and mocking

-

Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.

- Learn more -
-
- A representation of typography and image assets -
-

Load assets and resources

-

To link static files (like fonts) to your projects and stories, use the - `staticDirs` configuration option to specify folders to load when - starting Storybook.

- Learn more -
-
-
-
-
-
- # Do more with Storybook - - Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. -
- -
-
-
- A screenshot showing the autodocs tag being set, pointing a docs page being generated -

Autodocs

-

Auto-generate living, - interactive reference documentation from your components and stories.

- Learn more -
-
- A browser window showing a Storybook being published to a chromatic.com URL -

Publish to Chromatic

-

Publish your Storybook to review and collaborate with your entire team.

- Learn more -
-
- Windows showing the Storybook plugin in Figma -

Figma Plugin

-

Embed your stories into Figma to cross-reference the design and live - implementation in one place.

- Learn more -
-
- Screenshot of tests passing and failing -

Testing

-

Use stories to test a component in all its variations, no matter how - complex.

- Learn more -
-
- Screenshot of accessibility tests passing and failing -

Accessibility

-

Automatically test your components for a11y issues as you develop.

- Learn more -
-
- Screenshot of Storybook in light and dark mode -

Theming

-

Theme Storybook's UI to personalize it to your project.

- Learn more -
-
-
-
-
-
-

Addons

-

Integrate your tools with Storybook to connect workflows.

- Discover all addons -
-
- Integrate your tools with Storybook to connect workflows. -
-
- -
-
- Github logo - Join our contributors building the future of UI development. - - Star on GitHub -
-
- Discord logo -
- Get support and chat with frontend developers. - - Join Discord server -
-
-
- Youtube logo -
- Watch tutorials, feature previews and interviews. - - Watch on YouTube -
-
-
- A book -

Follow guided walkthroughs on for key workflows.

- - Discover tutorials -
-
- - diff --git a/packages/components/src/stories/Guide.mdx b/packages/components/src/stories/Guide.mdx new file mode 100644 index 000000000..1793865d2 --- /dev/null +++ b/packages/components/src/stories/Guide.mdx @@ -0,0 +1,55 @@ +import { Meta, Source } from "@storybook/blocks"; + + + +# Getting Started + +## Installation + +```bash +pnpm add @object-ui/react @object-ui/components +``` + +## Basic Usage + +The core component is ``. + +```tsx +import { SchemaRenderer } from "@object-ui/react"; + +const schema = { + type: "page", + children: [ + { + type: "card", + props: { title: "Hello World" }, + children: [ + { type: "text", props: { content: "This is a server-driven UI." } } + ] + } + ] +}; + +export default function App() { + return ; +} +``` + +## The Schema Protocol + +Every component is a JSON object with a `type` and `props`. + +```json +{ + "type": "button", + "props": { + "variant": "outline" + }, + "children": [], + "events": { + "onClick": [ + { "action": "toast", "message": "Clicked!" } + ] + } +} +``` diff --git a/packages/components/src/stories/Introduction.mdx b/packages/components/src/stories/Introduction.mdx new file mode 100644 index 000000000..c38981526 --- /dev/null +++ b/packages/components/src/stories/Introduction.mdx @@ -0,0 +1,34 @@ +import { Meta } from "@storybook/blocks"; + + + +# Welcome to Object UI + +Object UI is a **Universal, Server-Driven UI (SDUI) Engine** built on React + Tailwind + Shadcn. + +It is designed to interpret JSON metadata into pixel-perfect, accessible, and interactive Enterprise Interfaces. + +## Core Concepts + +- **Protocol Agnostic**: Works with any backend via Data Adapters. +- **Server Driven**: The UI structure is defined by JSON schemas. +- **Shadcn Compatible**: Uses standard Shadcn UI primitives. +- **Action System**: declaratively define behavior (clicks, validation, navigation). + +## Packages + +| Package | Description | +|---|---| +| `@object-ui/core` | The logic engine (Validation, Expressions, Registry). | +| `@object-ui/components` | The base UI atoms (Button, Card, Input). | +| `@object-ui/fields` | Standardized input fields. | +| `@object-ui/layout` | Page skeletons and shells. | +| `@object-ui/plugin-*` | Specialized widgets (Grids, Charts, Maps). | + +## Getting Started + +Check the **Guide** section for tutorials on how to use the SchemaRenderer. + +## Architecture + +This project is a monorepo managed with PNPM. From 7a1b06d55e068d7b6d092cc69d61e22a4029f1b8 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:02:58 +0800 Subject: [PATCH 07/12] Fix Tailwind source path in index.css and add postcss configuration file --- packages/components/src/index.css | 2 +- postcss.config.mjs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 postcss.config.mjs diff --git a/packages/components/src/index.css b/packages/components/src/index.css index 0acf3f7bd..d3b0b1e59 100644 --- a/packages/components/src/index.css +++ b/packages/components/src/index.css @@ -1,7 +1,7 @@ @import 'tailwindcss'; /* Scan sources for Tailwind classes */ -@source './src/**/*.{ts,tsx}'; +@source '../src/**/*.{ts,tsx}'; /* Tailwind plugin for animations */ @plugin 'tailwindcss-animate'; diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 000000000..1c8784688 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} From ddec15f6f9d3f6e8aa928fd2b980f2049ced5089 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:16:53 +0800 Subject: [PATCH 08/12] refactor: update story titles to follow new schema categorization - Changed titles in calendar, card, carousel, charts, chatbot, code editor, collapsible, controls, dashboard, data table, data display extras, date picker, dialog, feedback extras, feedback others, form advanced, form extras, form inputs, grid, icon, input, kanban, layout extended, layout flex, markdown, menus, navigation menu, object form, object gantt, object grid, object map, object view, overlay extras, overlay others, page, resizable, select, separator, sidebar, statistic, tabs, timeline, typography, and button stories to reflect the new schema structure. --- .storybook/preview.ts | 8 ++++- .../src/stories-json/accordion.stories.tsx | 2 +- .../src/stories-json/aggrid.stories.tsx | 2 +- .../src/stories-json/alert.stories.tsx | 6 ++-- .../src/stories-json/aspect-ratio.stories.tsx | 2 +- .../src/stories-json/avatar.stories.tsx | 2 +- .../src/stories-json/badge.stories.tsx | 2 +- .../src/stories-json/breadcrumb.stories.tsx | 2 +- .../src/stories-json/button-group.stories.tsx | 2 +- .../src/stories-json/button.stories.tsx | 2 +- .../src/stories-json/calendar.stories.tsx | 14 ++++---- .../src/stories-json/card.stories.tsx | 4 +-- .../src/stories-json/carousel.stories.tsx | 2 +- .../src/stories-json/charts.stories.tsx | 2 +- .../src/stories-json/chatbot.stories.tsx | 2 +- .../src/stories-json/code-editor.stories.tsx | 2 +- .../src/stories-json/collapsible.stories.tsx | 2 +- .../src/stories-json/controls.stories.tsx | 2 +- .../src/stories-json/dashboard.stories.tsx | 6 ++-- .../src/stories-json/data-table.stories.tsx | 2 +- .../data_display_extras.stories.tsx | 8 ++--- .../src/stories-json/date-picker.stories.tsx | 2 +- .../src/stories-json/dialog.stories.tsx | 4 +-- .../stories-json/feedback_extras.stories.tsx | 2 +- .../stories-json/feedback_others.stories.tsx | 2 +- .../stories-json/form_advanced.stories.tsx | 2 +- .../src/stories-json/form_extras.stories.tsx | 2 +- .../src/stories-json/form_inputs.stories.tsx | 2 +- .../src/stories-json/grid.stories.tsx | 2 +- .../src/stories-json/icon.stories.tsx | 2 +- .../src/stories-json/input.stories.tsx | 2 +- .../src/stories-json/kanban.stories.tsx | 36 +++++++++---------- .../stories-json/layout_extended.stories.tsx | 2 +- .../src/stories-json/layout_flex.stories.tsx | 2 +- .../src/stories-json/markdown.stories.tsx | 2 +- .../src/stories-json/menus.stories.tsx | 4 +-- .../stories-json/navigation-menu.stories.tsx | 2 +- .../src/stories-json/object-form.stories.tsx | 6 ++-- .../src/stories-json/object-gantt.stories.tsx | 8 ++--- .../src/stories-json/object-grid.stories.tsx | 2 +- .../src/stories-json/object-map.stories.tsx | 2 +- .../src/stories-json/object-view.stories.tsx | 2 +- .../stories-json/overlay_extras.stories.tsx | 6 ++-- .../stories-json/overlay_others.stories.tsx | 2 +- .../src/stories-json/page.stories.tsx | 4 +-- .../src/stories-json/resizable.stories.tsx | 2 +- .../src/stories-json/select.stories.tsx | 2 +- .../src/stories-json/separator.stories.tsx | 2 +- .../src/stories-json/sidebar.stories.tsx | 2 +- .../src/stories-json/statistic.stories.tsx | 2 +- .../src/stories-json/tabs.stories.tsx | 6 ++-- .../src/stories-json/timeline.stories.tsx | 36 +++++++++---------- .../src/stories-json/typography.stories.tsx | 2 +- packages/components/src/ui/button.stories.tsx | 2 +- 54 files changed, 120 insertions(+), 114 deletions(-) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 18737210d..d4fa383c3 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -28,7 +28,13 @@ const preview: Preview = { options: { storySort: { method: 'alphabetical', - order: ['Introduction', 'Guide', 'JSON', 'UI', 'Fields', 'Layout', 'Plugins'], + order: [ + 'Introduction', + 'Guide', + 'Primitives', + 'Schema', + ['Actions', 'Inputs', 'Layout', 'Data Display', 'Navigation', 'Feedback', 'Plugins'] + ], }, }, controls: { diff --git a/packages/components/src/stories-json/accordion.stories.tsx b/packages/components/src/stories-json/accordion.stories.tsx index 78a3795ce..32375d1d1 100644 --- a/packages/components/src/stories-json/accordion.stories.tsx +++ b/packages/components/src/stories-json/accordion.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Disclosure/Accordion', + title: 'Schema/Data Display/Accordion', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/aggrid.stories.tsx b/packages/components/src/stories-json/aggrid.stories.tsx index f1c85b4dc..085ea4ebe 100644 --- a/packages/components/src/stories-json/aggrid.stories.tsx +++ b/packages/components/src/stories-json/aggrid.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/AG Grid', + title: 'Schema/Plugins/AG Grid', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/alert.stories.tsx b/packages/components/src/stories-json/alert.stories.tsx index 0b587d96e..885d7390b 100644 --- a/packages/components/src/stories-json/alert.stories.tsx +++ b/packages/components/src/stories-json/alert.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Data Display/Alert', + title: 'Schema/Data Display/Alert', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], @@ -21,7 +21,7 @@ export const Default: Story = { render: renderStory, args: { type: 'alert', - title: 'Heads up!', + title: 'Schema/Data Display/Heads up!', description: 'You can add components to your app using the cli.', className: 'w-[400px]' } as any, @@ -32,7 +32,7 @@ export const Destructive: Story = { args: { type: 'alert', variant: 'destructive', - title: 'Error', + title: 'Schema/Data Display/Error', description: 'Your session has expired. Please log in again.', className: 'w-[400px]' } as any, diff --git a/packages/components/src/stories-json/aspect-ratio.stories.tsx b/packages/components/src/stories-json/aspect-ratio.stories.tsx index 12bdce6aa..af944ba84 100644 --- a/packages/components/src/stories-json/aspect-ratio.stories.tsx +++ b/packages/components/src/stories-json/aspect-ratio.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Layout/Aspect Ratio', + title: 'Schema/Layout/Aspect Ratio', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/avatar.stories.tsx b/packages/components/src/stories-json/avatar.stories.tsx index f2e1a3f47..e63b75222 100644 --- a/packages/components/src/stories-json/avatar.stories.tsx +++ b/packages/components/src/stories-json/avatar.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Data Display/Avatar', + title: 'Schema/Data Display/Avatar', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/badge.stories.tsx b/packages/components/src/stories-json/badge.stories.tsx index c562103f7..1c14060a8 100644 --- a/packages/components/src/stories-json/badge.stories.tsx +++ b/packages/components/src/stories-json/badge.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Data Display/Badge', + title: 'Schema/Data Display/Badge', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/breadcrumb.stories.tsx b/packages/components/src/stories-json/breadcrumb.stories.tsx index a64844cc2..ee0cf281e 100644 --- a/packages/components/src/stories-json/breadcrumb.stories.tsx +++ b/packages/components/src/stories-json/breadcrumb.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Data Display/Breadcrumb', + title: 'Schema/Navigation/Breadcrumb', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/button-group.stories.tsx b/packages/components/src/stories-json/button-group.stories.tsx index 627200c08..6ddc4f7e6 100644 --- a/packages/components/src/stories-json/button-group.stories.tsx +++ b/packages/components/src/stories-json/button-group.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Basic/Button Group', + title: 'Schema/Actions/Button Group', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/button.stories.tsx b/packages/components/src/stories-json/button.stories.tsx index 8abe7739a..296b70712 100644 --- a/packages/components/src/stories-json/button.stories.tsx +++ b/packages/components/src/stories-json/button.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Button', + title: 'Schema/Actions/Button', component: SchemaRenderer, parameters: { layout: 'centered', diff --git a/packages/components/src/stories-json/calendar.stories.tsx b/packages/components/src/stories-json/calendar.stories.tsx index a96acbe71..276787f96 100644 --- a/packages/components/src/stories-json/calendar.stories.tsx +++ b/packages/components/src/stories-json/calendar.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Calendar', + title: 'Schema/Data Display/Calendar', component: SchemaRenderer, parameters: { layout: 'padded', @@ -26,14 +26,14 @@ export const CalendarView: Story = { events: [ { id: '1', - title: 'Team Meeting', + title: 'Schema/Data Display/Team Meeting', start: new Date(new Date().getFullYear(), new Date().getMonth(), 15, 10, 0), end: new Date(new Date().getFullYear(), new Date().getMonth(), 15, 11, 0), color: '#3b82f6' }, { id: '2', - title: 'Project Deadline', + title: 'Schema/Data Display/Project Deadline', start: new Date(new Date().getFullYear(), new Date().getMonth(), 20), end: new Date(new Date().getFullYear(), new Date().getMonth(), 20), allDay: true, @@ -41,7 +41,7 @@ export const CalendarView: Story = { }, { id: '3', - title: 'Client Presentation', + title: 'Schema/Data Display/Client Presentation', start: new Date(new Date().getFullYear(), new Date().getMonth(), 25, 14, 0), end: new Date(new Date().getFullYear(), new Date().getMonth(), 25, 16, 0), color: '#10b981' @@ -59,21 +59,21 @@ export const MonthView: Story = { events: [ { id: '1', - title: 'Sprint Planning', + title: 'Schema/Data Display/Sprint Planning', start: new Date(new Date().getFullYear(), new Date().getMonth(), 1, 9, 0), end: new Date(new Date().getFullYear(), new Date().getMonth(), 1, 10, 30), color: '#8b5cf6' }, { id: '2', - title: 'Code Review', + title: 'Schema/Data Display/Code Review', start: new Date(new Date().getFullYear(), new Date().getMonth(), 5, 15, 0), end: new Date(new Date().getFullYear(), new Date().getMonth(), 5, 16, 0), color: '#3b82f6' }, { id: '3', - title: 'Team Building', + title: 'Schema/Data Display/Team Building', start: new Date(new Date().getFullYear(), new Date().getMonth(), 10), end: new Date(new Date().getFullYear(), new Date().getMonth(), 10), allDay: true, diff --git a/packages/components/src/stories-json/card.stories.tsx b/packages/components/src/stories-json/card.stories.tsx index d1c73f4fd..b13dd9bc6 100644 --- a/packages/components/src/stories-json/card.stories.tsx +++ b/packages/components/src/stories-json/card.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Card', + title: 'Schema/Layout/Card', component: SchemaRenderer, parameters: { layout: 'padded', @@ -26,7 +26,7 @@ export const Default: Story = { type: 'card', className: "w-[350px]", // Using high-level props supported by CardRenderer - title: "Create Project", + title: 'Schema/Layout/Create Project', description: "Deploy your new project in one-click.", // Main content (wrapped in CardContent by renderer) children: [ diff --git a/packages/components/src/stories-json/carousel.stories.tsx b/packages/components/src/stories-json/carousel.stories.tsx index cbed98136..05e11b75d 100644 --- a/packages/components/src/stories-json/carousel.stories.tsx +++ b/packages/components/src/stories-json/carousel.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Complex/Carousel', + title: 'Schema/Data Display/Carousel', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/charts.stories.tsx b/packages/components/src/stories-json/charts.stories.tsx index 35691ff8c..7097b80e5 100644 --- a/packages/components/src/stories-json/charts.stories.tsx +++ b/packages/components/src/stories-json/charts.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Charts', + title: 'Schema/Plugins/Charts', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/chatbot.stories.tsx b/packages/components/src/stories-json/chatbot.stories.tsx index 210593888..51bd83ae0 100644 --- a/packages/components/src/stories-json/chatbot.stories.tsx +++ b/packages/components/src/stories-json/chatbot.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Chatbot', + title: 'Schema/Plugins/Chatbot', component: SchemaRenderer, parameters: { layout: 'centered', diff --git a/packages/components/src/stories-json/code-editor.stories.tsx b/packages/components/src/stories-json/code-editor.stories.tsx index 532829807..ef1f5a024 100644 --- a/packages/components/src/stories-json/code-editor.stories.tsx +++ b/packages/components/src/stories-json/code-editor.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Code Editor', + title: 'Schema/Plugins/Code Editor', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/collapsible.stories.tsx b/packages/components/src/stories-json/collapsible.stories.tsx index 2700f81ae..306183526 100644 --- a/packages/components/src/stories-json/collapsible.stories.tsx +++ b/packages/components/src/stories-json/collapsible.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Disclosure/Collapsible', + title: 'Schema/Layout/Collapsible', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/controls.stories.tsx b/packages/components/src/stories-json/controls.stories.tsx index ea3a2fcb5..fce764745 100644 --- a/packages/components/src/stories-json/controls.stories.tsx +++ b/packages/components/src/stories-json/controls.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Form/Controls', + title: 'Schema/Inputs/Controls', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/dashboard.stories.tsx b/packages/components/src/stories-json/dashboard.stories.tsx index b4feec527..dae7e9654 100644 --- a/packages/components/src/stories-json/dashboard.stories.tsx +++ b/packages/components/src/stories-json/dashboard.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Dashboard', + title: 'Schema/Plugins/Dashboard', component: SchemaRenderer, parameters: { layout: 'padded', @@ -57,7 +57,7 @@ export const WithCards: Story = { children: [ { type: 'card', - title: 'Sales Overview', + title: 'Schema/Plugins/Sales Overview', children: [ { type: 'metric', label: 'Today', value: '$1,234' }, { type: 'metric', label: 'This Week', value: '$8,456' }, @@ -66,7 +66,7 @@ export const WithCards: Story = { }, { type: 'card', - title: 'User Metrics', + title: 'Schema/Plugins/User Metrics', children: [ { type: 'metric', label: 'Online', value: '456' }, { type: 'metric', label: 'New Today', value: '89' }, diff --git a/packages/components/src/stories-json/data-table.stories.tsx b/packages/components/src/stories-json/data-table.stories.tsx index 8cc536300..bdf7f9643 100644 --- a/packages/components/src/stories-json/data-table.stories.tsx +++ b/packages/components/src/stories-json/data-table.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Complex/Data Table', + title: 'Schema/Data Display/Data Table', component: SchemaRenderer, tags: ['autodocs'], argTypes: { diff --git a/packages/components/src/stories-json/data_display_extras.stories.tsx b/packages/components/src/stories-json/data_display_extras.stories.tsx index fbf8cbcb4..8312fff5d 100644 --- a/packages/components/src/stories-json/data_display_extras.stories.tsx +++ b/packages/components/src/stories-json/data_display_extras.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Data Display/Extras', + title: 'Schema/Data Display/Extras', component: SchemaRenderer, tags: ['autodocs'], argTypes: { @@ -25,7 +25,7 @@ export const KeyboardKey: Story = { export const ListUnordered: Story = { args: { type: 'list', - title: 'Technology Stack', + title: 'Schema/Data Display/Technology Stack', ordered: false, items: [ 'React', @@ -40,7 +40,7 @@ export const ListUnordered: Story = { export const ListOrdered: Story = { args: { type: 'list', - title: 'Installation Steps', + title: 'Schema/Data Display/Installation Steps', ordered: true, items: [ 'Run npm install', @@ -80,7 +80,7 @@ export const SimpleTable: Story = { export const TreeView: Story = { args: { type: 'tree-view', - title: 'Project Files', + title: 'Schema/Data Display/Project Files', nodes: [ { id: 'src', diff --git a/packages/components/src/stories-json/date-picker.stories.tsx b/packages/components/src/stories-json/date-picker.stories.tsx index ded02ddb6..ec05962ed 100644 --- a/packages/components/src/stories-json/date-picker.stories.tsx +++ b/packages/components/src/stories-json/date-picker.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Form/Date Picker', + title: 'Schema/Inputs/Date Picker', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/dialog.stories.tsx b/packages/components/src/stories-json/dialog.stories.tsx index 4b5a6c0d3..2fa3b036f 100644 --- a/packages/components/src/stories-json/dialog.stories.tsx +++ b/packages/components/src/stories-json/dialog.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Overlay/Dialog', + title: 'Schema/Feedback/Dialog', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], @@ -21,7 +21,7 @@ export const Default: Story = { render: renderStory, args: { type: 'dialog', - title: 'Edit profile', + title: 'Schema/Feedback/Edit profile', description: 'Make changes to your profile here. Click save when you\'re done.', trigger: [ { type: 'button', props: { variant: 'outline' }, children: [{type:'text', content: 'Edit Profile'}] } diff --git a/packages/components/src/stories-json/feedback_extras.stories.tsx b/packages/components/src/stories-json/feedback_extras.stories.tsx index e4de2b832..8419e7b54 100644 --- a/packages/components/src/stories-json/feedback_extras.stories.tsx +++ b/packages/components/src/stories-json/feedback_extras.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Feedback/Extras', + title: 'Schema/Feedback/Extras', component: SchemaRenderer, tags: ['autodocs'], }; diff --git a/packages/components/src/stories-json/feedback_others.stories.tsx b/packages/components/src/stories-json/feedback_others.stories.tsx index 2c5552b3d..f599db723 100644 --- a/packages/components/src/stories-json/feedback_others.stories.tsx +++ b/packages/components/src/stories-json/feedback_others.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Feedback/Others', + title: 'Schema/Feedback/Others', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/form_advanced.stories.tsx b/packages/components/src/stories-json/form_advanced.stories.tsx index 7f4c44244..8eaabb474 100644 --- a/packages/components/src/stories-json/form_advanced.stories.tsx +++ b/packages/components/src/stories-json/form_advanced.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Form/Advanced Controls', + title: 'Schema/Inputs/Advanced Controls', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/form_extras.stories.tsx b/packages/components/src/stories-json/form_extras.stories.tsx index 7d79ae012..280a5eaa7 100644 --- a/packages/components/src/stories-json/form_extras.stories.tsx +++ b/packages/components/src/stories-json/form_extras.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Form/Extras', + title: 'Schema/Inputs/Extras', component: SchemaRenderer, tags: ['autodocs'], argTypes: { diff --git a/packages/components/src/stories-json/form_inputs.stories.tsx b/packages/components/src/stories-json/form_inputs.stories.tsx index c48a74e3b..3c9c859a1 100644 --- a/packages/components/src/stories-json/form_inputs.stories.tsx +++ b/packages/components/src/stories-json/form_inputs.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta: Meta = { - title: 'Form/Inputs', + title: 'Schema/Inputs/Inputs', component: SchemaRenderer, tags: ['autodocs'], }; diff --git a/packages/components/src/stories-json/grid.stories.tsx b/packages/components/src/stories-json/grid.stories.tsx index 2b5eae466..cf35becf1 100644 --- a/packages/components/src/stories-json/grid.stories.tsx +++ b/packages/components/src/stories-json/grid.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Grid', + title: 'Schema/Layout/Grid', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/icon.stories.tsx b/packages/components/src/stories-json/icon.stories.tsx index a2ca31010..97a0835f6 100644 --- a/packages/components/src/stories-json/icon.stories.tsx +++ b/packages/components/src/stories-json/icon.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Basic/Icon', + title: 'Schema/Actions/Icon', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/input.stories.tsx b/packages/components/src/stories-json/input.stories.tsx index 5f6c804dd..ebcaf6ce6 100644 --- a/packages/components/src/stories-json/input.stories.tsx +++ b/packages/components/src/stories-json/input.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Form/Input', + title: 'Schema/Inputs/Input', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/kanban.stories.tsx b/packages/components/src/stories-json/kanban.stories.tsx index 1b28dc2d3..ccb2dfa58 100644 --- a/packages/components/src/stories-json/kanban.stories.tsx +++ b/packages/components/src/stories-json/kanban.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Kanban', + title: 'Schema/Plugins/Kanban', component: SchemaRenderer, parameters: { layout: 'padded', @@ -26,11 +26,11 @@ export const Default: Story = { columns: [ { id: 'todo', - title: 'To Do', + title: 'Schema/Plugins/To Do', cards: [ { id: 'card-1', - title: 'Task 1', + title: 'Schema/Plugins/Task 1', description: 'This is the first task', badges: [ { label: 'High Priority', variant: 'destructive' }, @@ -39,7 +39,7 @@ export const Default: Story = { }, { id: 'card-2', - title: 'Task 2', + title: 'Schema/Plugins/Task 2', description: 'This is the second task', badges: [ { label: 'Bug', variant: 'destructive' } @@ -49,12 +49,12 @@ export const Default: Story = { }, { id: 'in-progress', - title: 'In Progress', + title: 'Schema/Plugins/In Progress', limit: 3, cards: [ { id: 'card-3', - title: 'Task 3', + title: 'Schema/Plugins/Task 3', description: 'Currently working on this', badges: [ { label: 'In Progress', variant: 'default' } @@ -64,11 +64,11 @@ export const Default: Story = { }, { id: 'done', - title: 'Done', + title: 'Schema/Plugins/Done', cards: [ { id: 'card-4', - title: 'Task 4', + title: 'Schema/Plugins/Task 4', description: 'This task is completed', badges: [ { label: 'Completed', variant: 'outline' } @@ -76,7 +76,7 @@ export const Default: Story = { }, { id: 'card-5', - title: 'Task 5', + title: 'Schema/Plugins/Task 5', description: 'Another completed task', badges: [ { label: 'Completed', variant: 'outline' } @@ -96,11 +96,11 @@ export const ProjectManagement: Story = { columns: [ { id: 'backlog', - title: 'Backlog', + title: 'Schema/Plugins/Backlog', cards: [ { id: 'task-1', - title: 'Implement dark mode', + title: 'Schema/Plugins/Implement dark mode', description: 'Add support for dark theme across the application', badges: [ { label: 'Enhancement', variant: 'default' }, @@ -109,7 +109,7 @@ export const ProjectManagement: Story = { }, { id: 'task-2', - title: 'Performance optimization', + title: 'Schema/Plugins/Performance optimization', description: 'Optimize bundle size and loading time', badges: [ { label: 'Performance', variant: 'default' } @@ -119,12 +119,12 @@ export const ProjectManagement: Story = { }, { id: 'in-progress', - title: 'In Progress', + title: 'Schema/Plugins/In Progress', limit: 2, cards: [ { id: 'task-3', - title: 'User authentication', + title: 'Schema/Plugins/User authentication', description: 'Implement JWT-based authentication', badges: [ { label: 'Feature', variant: 'default' }, @@ -135,11 +135,11 @@ export const ProjectManagement: Story = { }, { id: 'review', - title: 'In Review', + title: 'Schema/Plugins/In Review', cards: [ { id: 'task-4', - title: 'API integration', + title: 'Schema/Plugins/API integration', description: 'Connect to REST API endpoints', badges: [ { label: 'Feature', variant: 'default' } @@ -149,11 +149,11 @@ export const ProjectManagement: Story = { }, { id: 'completed', - title: 'Completed', + title: 'Schema/Plugins/Completed', cards: [ { id: 'task-5', - title: 'Initial setup', + title: 'Schema/Plugins/Initial setup', description: 'Project scaffolding and configuration', badges: [ { label: 'Done', variant: 'outline' } diff --git a/packages/components/src/stories-json/layout_extended.stories.tsx b/packages/components/src/stories-json/layout_extended.stories.tsx index 70988fcbc..c6d3bdcf9 100644 --- a/packages/components/src/stories-json/layout_extended.stories.tsx +++ b/packages/components/src/stories-json/layout_extended.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Layout/Extended', + title: 'Schema/Layout/Extended', component: SchemaRenderer, tags: ['autodocs'], }; diff --git a/packages/components/src/stories-json/layout_flex.stories.tsx b/packages/components/src/stories-json/layout_flex.stories.tsx index 2f4465312..59978dd0d 100644 --- a/packages/components/src/stories-json/layout_flex.stories.tsx +++ b/packages/components/src/stories-json/layout_flex.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Layout/Flex & Stack', + title: 'Schema/Layout/Flex & Stack', component: SchemaRenderer, tags: ['autodocs'], argTypes: { diff --git a/packages/components/src/stories-json/markdown.stories.tsx b/packages/components/src/stories-json/markdown.stories.tsx index dce6ff31c..002f72638 100644 --- a/packages/components/src/stories-json/markdown.stories.tsx +++ b/packages/components/src/stories-json/markdown.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Markdown', + title: 'Schema/Plugins/Markdown', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/menus.stories.tsx b/packages/components/src/stories-json/menus.stories.tsx index 4b8768e7c..64245783f 100644 --- a/packages/components/src/stories-json/menus.stories.tsx +++ b/packages/components/src/stories-json/menus.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Overlay/Menus', + title: 'Schema/Navigation/Menus', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], @@ -47,7 +47,7 @@ export const Sheet: Story = { trigger: [ { type: 'button', props: { variant: 'outline' }, children: [{type: 'text', content: 'Open Sheet'}] } ], - title: 'Edit profile', + title: 'Schema/Navigation/Edit profile', description: 'Make changes to your profile here. Click save when you\'re done.', side: 'right', content: [ diff --git a/packages/components/src/stories-json/navigation-menu.stories.tsx b/packages/components/src/stories-json/navigation-menu.stories.tsx index 74a046551..72f2b80d2 100644 --- a/packages/components/src/stories-json/navigation-menu.stories.tsx +++ b/packages/components/src/stories-json/navigation-menu.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Basic/Navigation Menu', + title: 'Schema/Navigation/Navigation Menu', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/object-form.stories.tsx b/packages/components/src/stories-json/object-form.stories.tsx index e90c01d08..d600a2d0a 100644 --- a/packages/components/src/stories-json/object-form.stories.tsx +++ b/packages/components/src/stories-json/object-form.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Object Form', + title: 'Schema/Plugins/Object Form', component: SchemaRenderer, parameters: { layout: 'centered', @@ -41,7 +41,7 @@ export const WithSections: Story = { objectName: 'Employee', sections: [ { - title: 'Personal Information', + title: 'Schema/Plugins/Personal Information', fields: [ { name: 'firstName', label: 'First Name', type: 'text', required: true }, { name: 'lastName', label: 'Last Name', type: 'text', required: true }, @@ -49,7 +49,7 @@ export const WithSections: Story = { ] }, { - title: 'Contact Details', + title: 'Schema/Plugins/Contact Details', fields: [ { name: 'email', label: 'Email', type: 'email', required: true }, { name: 'phone', label: 'Phone', type: 'tel' }, diff --git a/packages/components/src/stories-json/object-gantt.stories.tsx b/packages/components/src/stories-json/object-gantt.stories.tsx index 7be5dea23..c6d7df0de 100644 --- a/packages/components/src/stories-json/object-gantt.stories.tsx +++ b/packages/components/src/stories-json/object-gantt.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Object Gantt', + title: 'Schema/Plugins/Object Gantt', component: SchemaRenderer, parameters: { layout: 'padded', @@ -81,19 +81,19 @@ export const SimpleGantt: Story = { tasks: [ { id: '1', - title: 'Q1 Goals', + title: 'Schema/Plugins/Q1 Goals', start: '2024-01-01', end: '2024-03-31' }, { id: '2', - title: 'Q2 Goals', + title: 'Schema/Plugins/Q2 Goals', start: '2024-04-01', end: '2024-06-30' }, { id: '3', - title: 'Q3 Goals', + title: 'Schema/Plugins/Q3 Goals', start: '2024-07-01', end: '2024-09-30' } diff --git a/packages/components/src/stories-json/object-grid.stories.tsx b/packages/components/src/stories-json/object-grid.stories.tsx index c50c2d0e6..7a4ddb149 100644 --- a/packages/components/src/stories-json/object-grid.stories.tsx +++ b/packages/components/src/stories-json/object-grid.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Object Grid', + title: 'Schema/Plugins/Object Grid', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/object-map.stories.tsx b/packages/components/src/stories-json/object-map.stories.tsx index bc2414c69..1a73c08d3 100644 --- a/packages/components/src/stories-json/object-map.stories.tsx +++ b/packages/components/src/stories-json/object-map.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Object Map', + title: 'Schema/Plugins/Object Map', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/object-view.stories.tsx b/packages/components/src/stories-json/object-view.stories.tsx index f85326c26..b1e2e3137 100644 --- a/packages/components/src/stories-json/object-view.stories.tsx +++ b/packages/components/src/stories-json/object-view.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Object View', + title: 'Schema/Plugins/Object View', component: SchemaRenderer, parameters: { layout: 'padded', diff --git a/packages/components/src/stories-json/overlay_extras.stories.tsx b/packages/components/src/stories-json/overlay_extras.stories.tsx index 683961c55..1ee3dd729 100644 --- a/packages/components/src/stories-json/overlay_extras.stories.tsx +++ b/packages/components/src/stories-json/overlay_extras.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Overlay/Extras', + title: 'Schema/Feedback/Extras', component: SchemaRenderer, tags: ['autodocs'], argTypes: { @@ -16,7 +16,7 @@ type Story = StoryObj; export const AlertDialogExample: Story = { args: { type: 'alert-dialog', - title: 'Delete Account', + title: 'Schema/Feedback/Delete Account', description: 'Are you sure you want to delete your account? This action cannot be undone.', actionText: 'Yes, Delete', cancelText: 'Cancel', @@ -49,7 +49,7 @@ export const ContextMenuExample: Story = { export const DrawerExample: Story = { args: { type: 'drawer', - title: 'Monthly Goal', + title: 'Schema/Feedback/Monthly Goal', description: 'Set your daily activity goal.', trigger: [ { type: 'button', content: 'Open Drawer', variant: 'outline' } diff --git a/packages/components/src/stories-json/overlay_others.stories.tsx b/packages/components/src/stories-json/overlay_others.stories.tsx index 907afb435..dbae3cf39 100644 --- a/packages/components/src/stories-json/overlay_others.stories.tsx +++ b/packages/components/src/stories-json/overlay_others.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Overlay/Tooltips', + title: 'Schema/Feedback/Tooltips', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/page.stories.tsx b/packages/components/src/stories-json/page.stories.tsx index a2e711ebe..71ca4a6ef 100644 --- a/packages/components/src/stories-json/page.stories.tsx +++ b/packages/components/src/stories-json/page.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Layout/Page', + title: 'Schema/Layout/Page', component: SchemaRenderer, parameters: { layout: 'fullscreen' }, tags: ['autodocs'], @@ -17,7 +17,7 @@ type Story = StoryObj; export const Dashboard: Story = { args: { type: 'page', - title: 'Dashboard', + title: 'Schema/Layout/Dashboard', description: 'Overview of your project analysis.', children: [ { diff --git a/packages/components/src/stories-json/resizable.stories.tsx b/packages/components/src/stories-json/resizable.stories.tsx index c22dbbf7e..e4a4f3e27 100644 --- a/packages/components/src/stories-json/resizable.stories.tsx +++ b/packages/components/src/stories-json/resizable.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Complex/Resizable', + title: 'Schema/Layout/Resizable', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/select.stories.tsx b/packages/components/src/stories-json/select.stories.tsx index 513363b49..226bea578 100644 --- a/packages/components/src/stories-json/select.stories.tsx +++ b/packages/components/src/stories-json/select.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Form/Select', + title: 'Schema/Inputs/Select', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/separator.stories.tsx b/packages/components/src/stories-json/separator.stories.tsx index 38ffd2464..6142a323f 100644 --- a/packages/components/src/stories-json/separator.stories.tsx +++ b/packages/components/src/stories-json/separator.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Basic/Separator', + title: 'Schema/Layout/Separator', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/sidebar.stories.tsx b/packages/components/src/stories-json/sidebar.stories.tsx index 8a3b86874..d843d4cd4 100644 --- a/packages/components/src/stories-json/sidebar.stories.tsx +++ b/packages/components/src/stories-json/sidebar.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { SchemaRenderer } from '../SchemaRenderer'; const meta: Meta = { - title: 'Navigation/Sidebar', + title: 'Schema/Navigation/Sidebar', component: SchemaRenderer, tags: ['autodocs'], argTypes: { diff --git a/packages/components/src/stories-json/statistic.stories.tsx b/packages/components/src/stories-json/statistic.stories.tsx index c809d500c..d5903f7ed 100644 --- a/packages/components/src/stories-json/statistic.stories.tsx +++ b/packages/components/src/stories-json/statistic.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Data Display/Statistic', + title: 'Schema/Data Display/Statistic', component: SchemaRenderer, parameters: { layout: 'centered' }, tags: ['autodocs'], diff --git a/packages/components/src/stories-json/tabs.stories.tsx b/packages/components/src/stories-json/tabs.stories.tsx index f94756e42..11d59338b 100644 --- a/packages/components/src/stories-json/tabs.stories.tsx +++ b/packages/components/src/stories-json/tabs.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Layout/Tabs', + title: 'Schema/Navigation/Tabs', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], @@ -28,7 +28,7 @@ export const Default: Story = { label: 'Account', value: 'account', body: [ - { type: 'card', title: 'Account', description: "Make changes to your account here.", children: [ + { type: 'card', title: 'Schema/Navigation/Account', description: "Make changes to your account here.", children: [ { type: 'input', label: 'Name', defaultValue: 'Pedro Duarte', wrapperClass: 'mb-4' }, { type: 'input', label: 'Username', defaultValue: '@peduarte' }, { type: 'button', children: [{type:'text', content: 'Save changes'}], className: 'mt-4' } @@ -39,7 +39,7 @@ export const Default: Story = { label: 'Password', value: 'password', body: [ - { type: 'card', title: 'Password', description: "Change your password here.", children: [ + { type: 'card', title: 'Schema/Navigation/Password', description: "Change your password here.", children: [ { type: 'input', label: 'Current Password', inputType: 'password', wrapperClass: 'mb-4' }, { type: 'input', label: 'New Password', inputType: 'password' }, { type: 'button', children: [{type:'text', content: 'Save password'}], className: 'mt-4' } diff --git a/packages/components/src/stories-json/timeline.stories.tsx b/packages/components/src/stories-json/timeline.stories.tsx index 6dcaa3d79..625315bf8 100644 --- a/packages/components/src/stories-json/timeline.stories.tsx +++ b/packages/components/src/stories-json/timeline.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Plugins/Timeline', + title: 'Schema/Data Display/Timeline', component: SchemaRenderer, parameters: { layout: 'padded', @@ -28,28 +28,28 @@ export const Vertical: Story = { items: [ { time: '2024-01-15', - title: 'Project Started', + title: 'Schema/Data Display/Project Started', description: 'Kickoff meeting and initial planning', variant: 'success', icon: '🚀', }, { time: '2024-02-01', - title: 'First Milestone', + title: 'Schema/Data Display/First Milestone', description: 'Completed initial design phase', variant: 'info', icon: '🎨', }, { time: '2024-03-15', - title: 'Beta Release', + title: 'Schema/Data Display/Beta Release', description: 'Released beta version to testers', variant: 'warning', icon: '⚡', }, { time: '2024-04-01', - title: 'Launch', + title: 'Schema/Data Display/Launch', description: 'Official product launch', variant: 'success', icon: '🎉', @@ -67,25 +67,25 @@ export const Horizontal: Story = { items: [ { time: '2024-01-01', - title: 'Q1', + title: 'Schema/Data Display/Q1', description: 'First quarter goals', variant: 'default', }, { time: '2024-04-01', - title: 'Q2', + title: 'Schema/Data Display/Q2', description: 'Second quarter goals', variant: 'info', }, { time: '2024-07-01', - title: 'Q3', + title: 'Schema/Data Display/Q3', description: 'Third quarter goals', variant: 'warning', }, { time: '2024-10-01', - title: 'Q4', + title: 'Schema/Data Display/Q4', description: 'Fourth quarter goals', variant: 'success', }, @@ -106,13 +106,13 @@ export const Gantt: Story = { label: 'Backend Development', items: [ { - title: 'API Design', + title: 'Schema/Data Display/API Design', startDate: '2024-01-01', endDate: '2024-01-31', variant: 'success', }, { - title: 'Implementation', + title: 'Schema/Data Display/Implementation', startDate: '2024-02-01', endDate: '2024-03-31', variant: 'info', @@ -123,13 +123,13 @@ export const Gantt: Story = { label: 'Frontend Development', items: [ { - title: 'UI Design', + title: 'Schema/Data Display/UI Design', startDate: '2024-01-15', endDate: '2024-02-15', variant: 'warning', }, { - title: 'Component Dev', + title: 'Schema/Data Display/Component Dev', startDate: '2024-02-15', endDate: '2024-04-15', variant: 'default', @@ -140,7 +140,7 @@ export const Gantt: Story = { label: 'Testing', items: [ { - title: 'QA Phase', + title: 'Schema/Data Display/QA Phase', startDate: '2024-03-01', endDate: '2024-04-30', variant: 'danger', @@ -161,25 +161,25 @@ export const ProductRoadmap: Story = { items: [ { time: '2024-01-01', - title: 'Phase 1: Foundation', + title: 'Schema/Data Display/Phase 1: Foundation', description: 'Core infrastructure and basic features', variant: 'success', }, { time: '2024-03-01', - title: 'Phase 2: Enhancement', + title: 'Schema/Data Display/Phase 2: Enhancement', description: 'Advanced features and integrations', variant: 'info', }, { time: '2024-06-01', - title: 'Phase 3: Optimization', + title: 'Schema/Data Display/Phase 3: Optimization', description: 'Performance improvements and scaling', variant: 'warning', }, { time: '2024-09-01', - title: 'Phase 4: Enterprise', + title: 'Schema/Data Display/Phase 4: Enterprise', description: 'Enterprise features and support', variant: 'default', }, diff --git a/packages/components/src/stories-json/typography.stories.tsx b/packages/components/src/stories-json/typography.stories.tsx index e9fccaa7b..ab43902c8 100644 --- a/packages/components/src/stories-json/typography.stories.tsx +++ b/packages/components/src/stories-json/typography.stories.tsx @@ -3,7 +3,7 @@ import { SchemaRenderer } from '../SchemaRenderer'; import type { BaseSchema } from '@object-ui/types'; const meta = { - title: 'JSON/Basic/Typography', + title: 'Schema/Data Display/Typography', component: SchemaRenderer, parameters: { layout: 'padded' }, tags: ['autodocs'], diff --git a/packages/components/src/ui/button.stories.tsx b/packages/components/src/ui/button.stories.tsx index 788e9f116..7e27b3725 100644 --- a/packages/components/src/ui/button.stories.tsx +++ b/packages/components/src/ui/button.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Button } from './button'; const meta = { - title: 'UI/Button', + title: 'Primitives/Button', component: Button, parameters: { layout: 'centered', From 0707e4f8d3b6784257f2ee5407bd9d162033dc35 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:24:09 +0800 Subject: [PATCH 09/12] Add Storybook test runner and Playwright dependencies Added @storybook/test-runner and playwright to devDependencies in package.json and introduced a new 'test:storybook' script. This enables automated testing for Storybook components. --- package.json | 3 + pnpm-lock.yaml | 2722 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 2653 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 7354f9847..b573fbbca 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "objectui": "node packages/cli/dist/cli.js", "storybook": "storybook dev -p 6006", "build:storybook": "storybook build", + "test:storybook": "test-storybook", "doctor": "node packages/cli/dist/cli.js doctor", "studio": "node packages/cli/dist/cli.js studio", "check": "node packages/cli/dist/cli.js check", @@ -54,6 +55,7 @@ "@storybook/blocks": "^8.6.14", "@storybook/react": "^8.6.15", "@storybook/react-vite": "^8.6.15", + "@storybook/test-runner": "^0.24.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -70,6 +72,7 @@ "globals": "^17.1.0", "happy-dom": "^20.3.9", "jsdom": "^27.4.0", + "playwright": "^1.58.0", "prettier": "^3.8.1", "react": "19.2.3", "react-dom": "19.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b94f6aa3b..9de84d426 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,9 @@ importers: '@storybook/react-vite': specifier: ^8.6.15 version: 8.6.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.55.1)(storybook@8.6.15(prettier@3.8.1))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)) + '@storybook/test-runner': + specifier: ^0.24.2 + version: 0.24.2(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5))(storybook@8.6.15(prettier@3.8.1)) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -90,6 +93,9 @@ importers: jsdom: specifier: ^27.4.0 version: 27.4.0 + playwright: + specifier: ^1.58.0 + version: 1.58.0 prettier: specifier: ^3.8.1 version: 3.8.1 @@ -368,7 +374,7 @@ importers: version: 25.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(@swc/core@1.15.11)(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -611,7 +617,7 @@ importers: devDependencies: tsup: specifier: ^8.0.1 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(@swc/core@1.15.11)(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1450,7 +1456,7 @@ importers: version: 3.7.1 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(@swc/core@1.15.11)(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -1676,12 +1682,91 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.28.6': resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} @@ -1734,6 +1819,9 @@ packages: resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1860,9 +1948,15 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -2242,6 +2336,12 @@ packages: tailwindcss: optional: true + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hono/node-server@1.19.9': resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} engines: {node: '>=18.14.1'} @@ -2457,10 +2557,104 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/create-cache-key-function@30.2.0': + resolution: {integrity: sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0': resolution: {integrity: sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==} peerDependencies: @@ -2538,6 +2732,9 @@ packages: resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@next/env@16.1.4': resolution: {integrity: sha512-gkrXnZyxPUy0Gg6SrPQPccbNVLSP3vmW8LU5dwEttEEC1RwDivk8w4O+sZIjFvPrSICXyhQDCG+y3VmjlJf+9A==} @@ -2641,6 +2838,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -3553,9 +3754,21 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -3564,6 +3777,12 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -3742,6 +3961,13 @@ packages: typescript: optional: true + '@storybook/test-runner@0.24.2': + resolution: {integrity: sha512-76DbflDTGAKq8Af6uHbWTGnKzKHhjLbJaZXRFhVnKqFocoXcej58C9DpM0BJ3addu7fSDJmPwfR97OINg16XFQ==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + storybook: ^0.0.0-0 || ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 + '@storybook/test@8.6.14': resolution: {integrity: sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==} peerDependencies: @@ -3752,9 +3978,90 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@swc/core-darwin-arm64@1.15.11': + resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.11': + resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.11': + resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.11': + resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.11': + resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.11': + resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.11': + resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.11': + resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.11': + resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.11': + resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.11': + resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/jest@0.2.39': + resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -3909,6 +4216,9 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -3994,6 +4304,15 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -4050,6 +4369,9 @@ packages: '@types/serve-static@1.15.10': resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} @@ -4074,12 +4396,21 @@ packages: '@types/vscode@1.108.1': resolution: {integrity: sha512-DerV0BbSzt87TbrqmZ7lRDIYaMiqvP8tmJTzW2p49ZBVtGUnGAu2RGQd1Wv4XMzEVUpaHbsemVM5nfuQJj7H6w==} + '@types/wait-on@5.3.4': + resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@typescript-eslint/eslint-plugin@8.53.1': resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4146,6 +4477,101 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4348,6 +4774,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -4387,6 +4817,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-escapes@7.2.0: resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} engines: {node: '>=18'} @@ -4399,6 +4833,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -4418,6 +4856,17 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -4478,9 +4927,37 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4544,12 +5021,18 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -4571,6 +5054,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4587,6 +5074,14 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001764: resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} @@ -4605,6 +5100,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -4617,6 +5116,10 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -4661,9 +5164,20 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -4679,6 +5193,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4693,6 +5210,10 @@ packages: react: 19.2.3 react-dom: 19.2.3 + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + cockatiel@3.2.1: resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} engines: {node: '>=16'} @@ -4703,10 +5224,19 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -4729,10 +5259,16 @@ packages: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} + commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -4764,6 +5300,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -4828,7 +5367,11 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - d3-array@3.2.4: + cwd@0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -4906,6 +5449,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} @@ -4954,6 +5501,10 @@ packages: resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} engines: {node: '>=18'} + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4990,6 +5541,10 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -5004,6 +5559,9 @@ packages: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} + diffable-html@4.1.0: + resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -5021,12 +5579,21 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -5034,6 +5601,9 @@ packages: dompurify@3.2.7: resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -5078,6 +5648,10 @@ packages: embla-carousel@8.6.0: resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5105,6 +5679,12 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -5150,6 +5730,9 @@ packages: es-toolkit@1.44.0: resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -5178,6 +5761,14 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -5301,14 +5892,34 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + + expect-playwright@0.8.0: + resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + deprecated: ⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration. + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + express-rate-limit@7.5.1: resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} @@ -5361,6 +5972,9 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -5400,6 +6014,22 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + + find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + + find-process@1.4.11: + resolution: {integrity: sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==} + hasBin: true + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5418,10 +6048,23 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -5449,9 +6092,16 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + fs-extra@11.3.3: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} @@ -5464,6 +6114,14 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -5592,6 +6250,10 @@ packages: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -5635,6 +6297,18 @@ packages: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + + global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -5666,6 +6340,10 @@ packages: resolution: {integrity: sha512-OIoj0PcK2JaxQuANHxWkxFRSNXAuSgO1vCzCT66KItE0W/ieZLG+/iW8OetlxB+F9EaPB7DoFYKAubFG1f4Mvw==} engines: {node: '>=20.0.0'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -5681,6 +6359,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -5716,6 +6398,10 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + hono@4.11.7: resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} engines: {node: '>=16.9.0'} @@ -5744,6 +6430,9 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -5814,6 +6503,11 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -5826,6 +6520,10 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -5895,6 +6593,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -5968,6 +6670,9 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -5976,6 +6681,10 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -5999,10 +6708,34 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -6018,6 +6751,151 @@ packages: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-junit@16.0.0: + resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} + engines: {node: '>=10.12.0'} + + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-process-manager@0.4.0: + resolution: {integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==} + deprecated: ⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details. + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-serializer-html@7.1.0: + resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watch-typeahead@3.0.1: + resolution: {integrity: sha512-SFmHcvdueTswZlVhPCWfLXMazvwZlA2UZTrcE7MC3NwEVeWvEcOx6HUe+igMbnmA6qowuBSW4in8iC6J2EYsgQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + jest: ^30.0.0 + + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -6025,6 +6903,9 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} @@ -6231,6 +7112,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -6268,6 +7152,10 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -6314,10 +7202,17 @@ packages: magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} @@ -6599,6 +7494,11 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -6650,6 +7550,11 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -6704,6 +7609,13 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -6715,6 +7627,10 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -6734,6 +7650,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6794,6 +7715,10 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -6828,6 +7753,10 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + p-map@7.0.4: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} @@ -6836,6 +7765,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -6864,6 +7797,10 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} @@ -6890,6 +7827,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -6965,12 +7906,26 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-core@1.58.0: + resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.58.0: + resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} + engines: {node: '>=18'} + hasBin: true + pluralize@2.0.0: resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} @@ -7050,10 +8005,18 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} + engines: {node: '>=8'} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -7072,6 +8035,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -7083,6 +8049,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + qs@6.14.1: resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} @@ -7331,6 +8300,10 @@ packages: rehype-sanitize@6.0.0: resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -7357,9 +8330,20 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -7384,6 +8368,11 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rollup@4.55.1: resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -7400,6 +8389,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -7463,6 +8455,9 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -7553,6 +8548,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -7564,6 +8562,13 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spawnd@5.0.0: + resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -7582,6 +8587,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -7615,6 +8624,14 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-length@6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7649,6 +8666,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -7707,6 +8728,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -7726,6 +8751,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} @@ -7767,6 +8796,10 @@ packages: resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} engines: {node: '>=18'} + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -7829,6 +8862,9 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -7946,10 +8982,22 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -7969,6 +9017,9 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript-eslint@8.53.1: resolution: {integrity: sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8053,6 +9104,9 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -8111,6 +9165,10 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -8295,6 +9353,19 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wait-on@7.2.0: + resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + wait-port@0.2.14: + resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} + engines: {node: '>=8'} + hasBin: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -8323,10 +9394,17 @@ packages: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.20: resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -8361,6 +9439,13 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.19.0: resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} @@ -8389,6 +9474,9 @@ packages: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -8396,6 +9484,9 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -8406,10 +9497,18 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -8802,53 +9901,128 @@ snapshots: dependencies: '@babel/types': 7.28.6 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) - transitivePeerDependencies: - - supports-color - '@babel/preset-typescript@7.28.5(@babel/core@7.28.6)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.6) + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.6) transitivePeerDependencies: - supports-color @@ -8877,6 +10051,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@1.0.2': {} '@changesets/apply-release-plan@7.0.14': @@ -9088,11 +10264,22 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -9327,6 +10514,12 @@ snapshots: next: 16.1.4(@babel/core@7.28.6)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) tailwindcss: 4.1.18 + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@hono/node-server@1.19.9(hono@4.11.7)': dependencies: hono: 4.11.7 @@ -9489,10 +10682,203 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + chalk: 4.1.2 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + + '@jest/core@30.2.0(esbuild-register@3.6.0(esbuild@0.21.5))': + dependencies: + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/create-cache-key-function@30.2.0': + dependencies: + '@jest/types': 30.2.0 + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.2.0': + dependencies: + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + jest-mock: 30.2.0 + + '@jest/expect-utils@30.2.0': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/expect@30.2.0': + dependencies: + expect: 30.2.0 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 25.0.10 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.2.0': + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 25.0.10 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.2.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 25.0.10 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.48 + + '@jest/snapshot-utils@30.2.0': + dependencies: + '@jest/types': 30.2.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.2.0': + dependencies: + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + + '@jest/test-sequencer@30.2.0': + dependencies: + '@jest/test-result': 30.2.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + slash: 3.0.0 + + '@jest/transform@30.2.0': + dependencies: + '@babel/core': 7.28.6 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.0.10 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: glob: 10.5.0 @@ -9651,6 +11037,13 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@next/env@16.1.4': {} '@next/swc-darwin-arm64@16.1.4': @@ -9723,6 +11116,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.2.9': {} + '@polka/url@1.0.0-next.29': {} '@radix-ui/number@1.1.1': {} @@ -10679,12 +12074,30 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.48': {} + '@sindresorhus/merge-streams@2.3.0': {} '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} @@ -10903,6 +12316,40 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@storybook/test-runner@0.24.2(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5))(storybook@8.6.15(prettier@3.8.1))': + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + '@jest/types': 30.2.0 + '@swc/core': 1.15.11 + '@swc/jest': 0.2.39(@swc/core@1.15.11) + expect-playwright: 0.8.0 + jest: 30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)) + jest-circus: 30.2.0 + jest-environment-node: 30.2.0 + jest-junit: 16.0.0 + jest-process-manager: 0.4.0 + jest-runner: 30.2.0 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 3.0.1(jest@30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5))) + nyc: 15.1.0 + playwright: 1.58.0 + playwright-core: 1.58.0 + rimraf: 3.0.2 + storybook: 8.6.15(prettier@3.8.1) + uuid: 8.3.2 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - babel-plugin-macros + - debug + - esbuild-register + - node-notifier + - supports-color + - ts-node + '@storybook/test@8.6.14(storybook@8.6.15(prettier@3.8.1))': dependencies: '@storybook/global': 5.0.0 @@ -10918,10 +12365,69 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.8.1) + '@swc/core-darwin-arm64@1.15.11': + optional: true + + '@swc/core-darwin-x64@1.15.11': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.11': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.11': + optional: true + + '@swc/core-linux-arm64-musl@1.15.11': + optional: true + + '@swc/core-linux-x64-gnu@1.15.11': + optional: true + + '@swc/core-linux-x64-musl@1.15.11': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.11': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.11': + optional: true + + '@swc/core-win32-x64-msvc@1.15.11': + optional: true + + '@swc/core@1.15.11': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.11 + '@swc/core-darwin-x64': 1.15.11 + '@swc/core-linux-arm-gnueabihf': 1.15.11 + '@swc/core-linux-arm64-gnu': 1.15.11 + '@swc/core-linux-arm64-musl': 1.15.11 + '@swc/core-linux-x64-gnu': 1.15.11 + '@swc/core-linux-x64-musl': 1.15.11 + '@swc/core-win32-arm64-msvc': 1.15.11 + '@swc/core-win32-ia32-msvc': 1.15.11 + '@swc/core-win32-x64-msvc': 1.15.11 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@swc/jest@0.2.39(@swc/core@1.15.11)': + dependencies: + '@jest/create-cache-key-function': 30.2.0 + '@swc/core': 1.15.11 + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 @@ -11092,6 +12598,11 @@ snapshots: minimatch: 10.1.1 path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -11193,6 +12704,16 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} @@ -11246,6 +12767,8 @@ snapshots: '@types/node': 25.0.10 '@types/send': 0.17.6 + '@types/stack-utils@2.0.3': {} + '@types/statuses@2.0.6': {} '@types/trusted-types@2.0.7': @@ -11263,12 +12786,22 @@ snapshots: '@types/vscode@1.108.1': {} + '@types/wait-on@5.3.4': + dependencies: + '@types/node': 25.0.10 + '@types/whatwg-mimetype@3.0.2': {} '@types/ws@8.18.1': dependencies: '@types/node': 25.0.10 + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -11370,8 +12903,67 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2))': - dependencies: + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2))': + dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) @@ -11675,6 +13267,11 @@ snapshots: agent-base@7.1.4: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -11737,6 +13334,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-escapes@7.2.0: dependencies: environment: 1.1.0 @@ -11745,6 +13346,10 @@ snapshots: ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -11757,6 +13362,17 @@ snapshots: any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -11810,11 +13426,71 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axios@1.13.4: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + azure-devops-node-api@12.5.0: dependencies: tunnel: 0.0.6 typed-rest-client: 1.8.11 + babel-jest@30.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@jest/transform': 30.2.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.6) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.1: + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.2.0: + dependencies: + '@types/babel__core': 7.20.5 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + + babel-preset-jest@30.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.6) + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -11905,10 +13581,16 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-crc32@0.2.13: {} buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -11928,6 +13610,13 @@ snapshots: cac@6.7.14: {} + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -11947,6 +13636,10 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-lite@1.0.30001764: {} ccount@2.0.1: {} @@ -11971,6 +13664,12 @@ snapshots: chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -11983,6 +13682,8 @@ snapshots: chalk@5.6.2: {} + char-regex@1.0.2: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -12035,10 +13736,16 @@ snapshots: ci-info@3.9.0: {} + ci-info@4.3.1: {} + + cjs-module-lexer@2.2.0: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + clean-stack@2.2.0: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -12049,6 +13756,12 @@ snapshots: client-only@0.0.1: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -12069,16 +13782,26 @@ snapshots: - '@types/react' - '@types/react-dom' + co@4.6.0: {} + cockatiel@3.2.1: {} code-block-writer@13.0.3: {} collapse-white-space@2.1.0: {} + collect-v8-coverage@1.0.3: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} combined-stream@1.0.8: @@ -12093,8 +13816,12 @@ snapshots: commander@14.0.2: {} + commander@3.0.2: {} + commander@4.1.1: {} + commondir@1.0.1: {} + compare-versions@6.1.1: {} compute-scroll-into-view@3.1.1: {} @@ -12115,6 +13842,8 @@ snapshots: content-type@1.0.5: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.7: {} @@ -12175,6 +13904,11 @@ snapshots: csstype@3.2.3: {} + cwd@0.10.0: + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -12234,6 +13968,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decimal.js-light@2.5.1: {} decimal.js@10.6.0: {} @@ -12269,6 +14005,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -12291,6 +14031,8 @@ snapshots: detect-libc@2.1.2: {} + detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} devlop@1.1.0: @@ -12301,6 +14043,10 @@ snapshots: diff@8.0.3: {} + diffable-html@4.1.0: + dependencies: + htmlparser2: 3.10.1 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -12318,14 +14064,25 @@ snapshots: '@babel/runtime': 7.28.6 csstype: 3.2.3 + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 + domelementtype@1.3.1: {} + domelementtype@2.3.0: {} + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 @@ -12334,6 +14091,11 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 @@ -12381,6 +14143,8 @@ snapshots: embla-carousel@8.6.0: {} + emittery@0.13.1: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -12409,6 +14173,10 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@1.1.2: {} + + entities@2.2.0: {} + entities@4.5.0: {} entities@6.0.1: {} @@ -12442,6 +14210,8 @@ snapshots: es-toolkit@1.44.0: {} + es6-error@4.1.1: {} + esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -12522,6 +14292,10 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -12701,11 +14475,30 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + exit-x@0.2.2: {} + + exit@0.1.2: {} + expand-template@2.0.3: optional: true + expand-tilde@1.2.2: + dependencies: + os-homedir: 1.0.2 + + expect-playwright@0.8.0: {} + expect-type@1.3.0: {} + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + express-rate-limit@7.5.1(express@5.2.1): dependencies: express: 5.2.1 @@ -12812,6 +14605,10 @@ snapshots: dependencies: reusify: 1.1.0 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -12862,6 +14659,27 @@ snapshots: transitivePeerDependencies: - supports-color + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-file-up@0.1.3: + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + + find-pkg@0.1.2: + dependencies: + find-file-up: 0.1.3 + + find-process@1.4.11: + dependencies: + chalk: 4.1.2 + commander: 12.1.0 + loglevel: 1.9.2 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -12885,10 +14703,17 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.11: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -12914,9 +14739,13 @@ snapshots: fresh@2.0.0: {} + fromentries@1.3.2: {} + fs-constants@1.0.0: optional: true + fs-exists-sync@0.1.0: {} + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 @@ -12935,6 +14764,11 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -13060,6 +14894,8 @@ snapshots: get-own-enumerable-keys@1.0.0: {} + get-package-type@0.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -13111,6 +14947,27 @@ snapshots: minipass: 7.1.2 path-scurry: 2.0.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-modules@0.2.3: + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + + global-prefix@0.1.5: + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + globals@14.0.0: {} globals@17.1.0: {} @@ -13151,6 +15008,8 @@ snapshots: - bufferutil - utf-8-validate + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -13163,6 +15022,11 @@ snapshots: dependencies: has-symbols: 1.1.0 + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -13246,6 +15110,10 @@ snapshots: dependencies: hermes-estree: 0.25.1 + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + hono@4.11.7: {} hosted-git-info@4.1.0: @@ -13275,6 +15143,15 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -13337,16 +15214,25 @@ snapshots: import-lazy@4.0.0: {} + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + imurmurhash@0.1.4: {} indent-string@4.0.0: {} index-to-position@1.2.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} - ini@1.3.8: - optional: true + ini@1.3.8: {} inline-style-parser@0.2.7: {} @@ -13391,6 +15277,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-generator-fn@2.1.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -13425,80 +15313,490 @@ snapshots: is-promise@4.0.0: {} - is-regex@1.2.1: + 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-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-typedarray@1.0.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-windows@0.2.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + + istanbul-lib-instrument@4.0.3: + dependencies: + '@babel/core': 7.28.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.6 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + istextorbinary@9.5.0: + dependencies: + binaryextensions: 6.11.0 + editions: 6.22.0 + textextensions: 6.11.0 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jest-changed-files@30.2.0: + dependencies: + execa: 5.1.1 + jest-util: 30.2.0 + p-limit: 3.1.0 + + jest-circus@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.1 + is-generator-fn: 2.1.0 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + p-limit: 3.1.0 + pretty-format: 30.2.0 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)): + dependencies: + '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.21.5)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)) + jest-util: 30.2.0 + jest-validate: 30.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)): + dependencies: + '@babel/core': 7.28.6 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.6) + chalk: 4.1.2 + ci-info: 4.3.1 + deepmerge: 4.3.1 + glob: 10.5.0 + graceful-fs: 4.2.11 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.2.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 25.0.10 + esbuild-register: 3.6.0(esbuild@0.21.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + + jest-docblock@30.2.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + jest-util: 30.2.0 + pretty-format: 30.2.0 + + jest-environment-node@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + + jest-haste-map@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + jest-worker: 30.2.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-junit@16.0.0: dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-regexp@3.1.0: {} + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 - is-stream@2.0.1: {} + jest-leak-detector@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + pretty-format: 30.2.0 - is-stream@3.0.0: {} + jest-matcher-utils@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 - is-stream@4.0.1: {} + jest-message-util@30.2.0: + dependencies: + '@babel/code-frame': 7.28.6 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 - is-subdir@1.2.0: + jest-mock@30.2.0: dependencies: - better-path-resolve: 1.0.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + jest-util: 30.2.0 - is-typed-array@1.1.15: + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): + optionalDependencies: + jest-resolve: 30.2.0 + + jest-process-manager@0.4.0: dependencies: - which-typed-array: 1.1.20 + '@types/wait-on': 5.3.4 + chalk: 4.1.2 + cwd: 0.10.0 + exit: 0.1.2 + find-process: 1.4.11 + prompts: 2.4.2 + signal-exit: 3.0.7 + spawnd: 5.0.0 + tree-kill: 1.2.2 + wait-on: 7.2.0 + transitivePeerDependencies: + - debug + - supports-color - is-unicode-supported@1.3.0: {} + jest-regex-util@30.0.1: {} - is-unicode-supported@2.1.0: {} + jest-resolve-dependencies@30.2.0: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color - is-windows@1.0.2: {} + jest-resolve@30.2.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 + slash: 3.0.0 + unrs-resolver: 1.11.1 - is-wsl@2.2.0: + jest-runner@30.2.0: dependencies: - is-docker: 2.2.1 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color - is-wsl@3.1.0: + jest-runtime@30.2.0: dependencies: - is-inside-container: 1.0.0 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + chalk: 4.1.2 + cjs-module-lexer: 2.2.0 + collect-v8-coverage: 1.0.3 + glob: 10.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color - isexe@2.0.0: {} + jest-serializer-html@7.1.0: + dependencies: + diffable-html: 4.1.0 - isexe@3.1.1: {} + jest-snapshot@30.2.0: + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) + '@babel/types': 7.28.6 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.6) + chalk: 4.1.2 + expect: 30.2.0 + graceful-fs: 4.2.11 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 + synckit: 0.11.12 + transitivePeerDependencies: + - supports-color - istanbul-lib-coverage@3.2.2: {} + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + chalk: 4.1.2 + ci-info: 4.3.1 + graceful-fs: 4.2.11 + picomatch: 4.0.3 - istanbul-lib-report@3.0.1: + jest-validate@30.2.0: dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.2.0 - istanbul-reports@3.2.0: + jest-watch-typeahead@3.0.1(jest@30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5))): dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + ansi-escapes: 7.2.0 + chalk: 5.6.2 + jest: 30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)) + jest-regex-util: 30.0.1 + jest-watcher: 30.2.0 + slash: 5.1.0 + string-length: 6.0.0 + strip-ansi: 7.1.2 - istextorbinary@9.5.0: + jest-watcher@30.2.0: dependencies: - binaryextensions: 6.11.0 - editions: 6.22.0 - textextensions: 6.11.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 25.0.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.2.0 + string-length: 4.0.2 - jackspeak@3.4.3: + jest-worker@30.2.0: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + '@types/node': 25.0.10 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.2.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 - jackspeak@4.1.1: + jest@30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)): dependencies: - '@isaacs/cliui': 8.0.2 + '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.21.5)) + '@jest/types': 30.2.0 + import-local: 3.2.0 + jest-cli: 30.2.0(@types/node@25.0.10)(esbuild-register@3.6.0(esbuild@0.21.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node jiti@2.6.1: {} jju@1.4.0: {} + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + jose@6.1.3: {} joycon@3.1.1: {} @@ -13699,6 +15997,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.flattendeep@4.4.0: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -13726,6 +16026,8 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + loglevel@1.9.2: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -13770,10 +16072,18 @@ snapshots: '@babel/types': 7.28.6 source-map-js: 1.2.1 + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + make-dir@4.0.0: dependencies: semver: 7.7.3 + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + map-or-similar@1.5.0: {} markdown-extensions@2.0.0: {} @@ -14295,6 +16605,8 @@ snapshots: mkdirp-classic@0.5.3: optional: true + mkdirp@1.0.4: {} + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -14357,6 +16669,8 @@ snapshots: napi-build-utils@2.0.0: optional: true + napi-postinstall@0.3.4: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -14408,6 +16722,12 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-int64@0.4.0: {} + + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.1.0 + node-releases@2.0.27: {} node-sarif-builder@3.4.0: @@ -14421,6 +16741,8 @@ snapshots: semver: 7.7.3 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -14440,6 +16762,38 @@ snapshots: dependencies: boolbase: 1.0.0 + nyc@15.1.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.1.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -14519,6 +16873,8 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.2 + os-homedir@1.0.2: {} + outdent@0.5.0: {} outvariant@1.4.3: {} @@ -14549,10 +16905,21 @@ snapshots: p-map@2.1.0: {} + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.4: {} p-try@2.2.0: {} + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.11: @@ -14590,6 +16957,8 @@ snapshots: parse-ms@4.0.0: {} + parse-passwd@1.0.0: {} + parse-semver@1.1.1: dependencies: semver: 5.7.2 @@ -14617,6 +16986,8 @@ snapshots: path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -14665,6 +17036,10 @@ snapshots: pkce-challenge@5.0.1: {} + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -14677,6 +17052,14 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + playwright-core@1.58.0: {} + + playwright@1.58.0: + dependencies: + playwright-core: 1.58.0 + optionalDependencies: + fsevents: 2.3.2 + pluralize@2.0.0: {} pluralize@8.0.0: {} @@ -14749,10 +17132,20 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 + process-on-spawn@1.1.0: + dependencies: + fromentries: 1.3.2 + process@0.11.10: {} prompts@2.4.2: @@ -14773,6 +17166,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} + pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -14783,6 +17178,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@7.0.1: {} + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -14988,7 +17385,6 @@ snapshots: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - optional: true readdirp@4.1.2: {} @@ -15102,6 +17498,10 @@ snapshots: '@types/hast': 3.0.4 hast-util-sanitize: 5.0.2 + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -15156,8 +17556,19 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + reselect@5.1.1: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-dir@0.1.1: + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -15177,6 +17588,10 @@ snapshots: reusify@1.1.0: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + rollup@4.55.1: dependencies: '@types/estree': 1.0.8 @@ -15224,6 +17639,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-buffer@5.2.1: {} safe-regex-test@1.1.0: @@ -15320,6 +17739,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -15495,12 +17916,35 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.6.1: {} source-map@0.7.6: {} space-separated-tokens@2.0.2: {} + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + spawnd@5.0.0: + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + wait-port: 0.2.14 + transitivePeerDependencies: + - supports-color + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -15522,6 +17966,10 @@ snapshots: sprintf-js@1.0.3: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} state-local@1.0.7: {} @@ -15546,6 +17994,15 @@ snapshots: string-argv@0.3.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-length@6.0.0: + dependencies: + strip-ansi: 7.1.2 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -15567,7 +18024,6 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - optional: true stringify-entities@4.0.4: dependencies: @@ -15590,6 +18046,8 @@ snapshots: strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} @@ -15640,6 +18098,10 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -15657,6 +18119,10 @@ snapshots: symbol-tree@3.2.4: {} + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + table@6.9.0: dependencies: ajv: 8.17.1 @@ -15703,6 +18169,12 @@ snapshots: ansi-escapes: 7.2.0 supports-hyperlinks: 3.2.0 + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + text-table@0.2.0: {} textextensions@6.11.0: @@ -15748,6 +18220,8 @@ snapshots: tmp@0.2.5: {} + tmpl@1.0.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -15791,7 +18265,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3): + tsup@8.5.1(@microsoft/api-extractor@7.55.2(@types/node@25.0.10))(@swc/core@1.15.11)(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -15812,6 +18286,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@microsoft/api-extractor': 7.55.2(@types/node@25.0.10) + '@swc/core': 1.15.11 postcss: 8.5.6 typescript: 5.9.3 transitivePeerDependencies: @@ -15858,8 +18333,14 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-detect@4.1.0: {} + type-fest@0.21.3: {} + + type-fest@0.8.1: {} + type-fest@4.41.0: {} type-fest@5.4.2: @@ -15883,6 +18364,10 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.7 + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typescript-eslint@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -15971,6 +18456,30 @@ snapshots: acorn: 8.15.0 webpack-virtual-modules: 0.6.2 + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + until-async@3.0.2: {} update-browserslist-db@1.2.3(browserslist@4.28.1): @@ -16020,6 +18529,12 @@ snapshots: uuid@9.0.1: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -16228,6 +18743,28 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + wait-on@7.2.0: + dependencies: + axios: 1.13.4 + joi: 17.13.3 + lodash: 4.17.23 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + + wait-port@0.2.14: + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + web-streams-polyfill@3.3.3: {} webidl-conversions@8.0.1: {} @@ -16247,6 +18784,8 @@ snapshots: tr46: 6.0.0 webidl-conversions: 8.0.1 + which-module@2.0.1: {} + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 @@ -16257,6 +18796,10 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -16292,6 +18835,18 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@8.19.0: {} wsl-utils@0.1.0: @@ -16310,18 +18865,41 @@ snapshots: sax: 1.4.4 xmlbuilder: 11.0.1 + xml@1.0.1: {} + xmlbuilder@11.0.1: {} xmlchars@2.2.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 From 7dc3a83cb2b04469fc42a9cd5444df7145636106 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:26:27 +0800 Subject: [PATCH 10/12] feat: add CI workflow for Storybook tests and update package scripts --- .github/workflows/storybook-tests.yml | 26 ++++++++ package.json | 5 +- pnpm-lock.yaml | 91 +++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/storybook-tests.yml diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml new file mode 100644 index 000000000..8c731087e --- /dev/null +++ b/.github/workflows/storybook-tests.yml @@ -0,0 +1,26 @@ +name: Storybook Tests +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +jobs: + test-storybook: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + - name: Install dependencies + run: pnpm install + - name: Install Playwright Browsers + run: pnpm exec playwright install --with-deps + - name: Run Storybook tests + run: pnpm test:storybook:ci diff --git a/package.json b/package.json index b573fbbca..88cdd63a7 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "storybook": "storybook dev -p 6006", "build:storybook": "storybook build", "test:storybook": "test-storybook", + "test:storybook:ci": "concurrently -k -s first \"pnpm storybook --no-open\" \"wait-on tcp:6006 && pnpm test:storybook\"", "doctor": "node packages/cli/dist/cli.js doctor", "studio": "node packages/cli/dist/cli.js studio", "check": "node packages/cli/dist/cli.js check", @@ -66,6 +67,7 @@ "@vitest/coverage-v8": "^4.0.18", "@vitest/ui": "^4.0.18", "autoprefixer": "^10.4.23", + "concurrently": "^9.2.1", "eslint": "^9.39.2", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", @@ -83,7 +85,8 @@ "turbo": "^2.7.6", "typescript": "^5.9.3", "typescript-eslint": "^8.53.1", - "vitest": "^4.0.18" + "vitest": "^4.0.18", + "wait-on": "^9.0.3" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9de84d426..2324f7a4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: autoprefixer: specifier: ^10.4.23 version: 10.4.23(postcss@8.5.6) + concurrently: + specifier: ^9.2.1 + version: 9.2.1 eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -129,6 +132,9 @@ importers: vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.0.10)(@vitest/ui@4.0.18)(happy-dom@20.3.9)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3)) + wait-on: + specifier: ^9.0.3 + version: 9.0.3 apps/site: dependencies: @@ -2336,12 +2342,32 @@ packages: tailwindcss: optional: true + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.4': + resolution: {integrity: sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==} + engines: {node: '>=14.0.0'} + '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + '@hono/node-server@1.19.9': resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} engines: {node: '>=18.14.1'} @@ -5278,6 +5304,11 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -6906,6 +6937,10 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + joi@18.0.2: + resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} + engines: {node: '>= 20'} + jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} @@ -8484,6 +8519,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@3.21.0: resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} @@ -9358,6 +9397,11 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + wait-on@9.0.3: + resolution: {integrity: sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==} + engines: {node: '>=20.0.0'} + hasBin: true + wait-port@0.2.14: resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} engines: {node: '>=8'} @@ -10514,12 +10558,28 @@ snapshots: next: 16.1.4(@babel/core@7.28.6)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) tailwindcss: 4.1.18 + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + '@hapi/hoek@9.3.0': {} + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.4': {} + '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + '@hono/node-server@1.19.9(hono@4.11.7)': dependencies: hono: 4.11.7 @@ -13828,6 +13888,15 @@ snapshots: concat-map@0.0.1: {} + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -15797,6 +15866,16 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + joi@18.0.2: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.4 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.1.0 + jose@6.1.3: {} joycon@3.1.1: {} @@ -17836,6 +17915,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@3.21.0: dependencies: '@shikijs/core': 3.21.0 @@ -18753,6 +18834,16 @@ snapshots: transitivePeerDependencies: - debug + wait-on@9.0.3: + dependencies: + axios: 1.13.4 + joi: 18.0.2 + lodash: 4.17.23 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + wait-port@0.2.14: dependencies: chalk: 2.4.2 From f23fdb2fcd603fa8c4e05f9dad18422d12ff1863 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 23:38:19 +0800 Subject: [PATCH 11/12] fix: update Storybook test timeout and improve data handling in components --- package.json | 2 +- .../src/renderers/disclosure/toggle-group.tsx | 1 + .../components/src/renderers/form/toggle.tsx | 51 ++----------------- .../src/stories-json/form_extras.stories.tsx | 4 +- .../stories-json/layout_extended.stories.tsx | 20 ++++++-- .../src/stories-json/object-gantt.stories.tsx | 3 ++ .../src/stories-json/object-map.stories.tsx | 3 ++ packages/plugin-grid/src/ObjectGrid.tsx | 18 +++++-- packages/plugin-map/src/ObjectMap.tsx | 7 ++- 9 files changed, 50 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 88cdd63a7..23aa9d93f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "objectui": "node packages/cli/dist/cli.js", "storybook": "storybook dev -p 6006", "build:storybook": "storybook build", - "test:storybook": "test-storybook", + "test:storybook": "test-storybook --testTimeout=90000", "test:storybook:ci": "concurrently -k -s first \"pnpm storybook --no-open\" \"wait-on tcp:6006 && pnpm test:storybook\"", "doctor": "node packages/cli/dist/cli.js doctor", "studio": "node packages/cli/dist/cli.js studio", diff --git a/packages/components/src/renderers/disclosure/toggle-group.tsx b/packages/components/src/renderers/disclosure/toggle-group.tsx index 192e51bf6..bae645118 100644 --- a/packages/components/src/renderers/disclosure/toggle-group.tsx +++ b/packages/components/src/renderers/disclosure/toggle-group.tsx @@ -16,6 +16,7 @@ ComponentRegistry.register('toggle-group', 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style, + type, // Extract type to prevent overriding the one we set below ...toggleGroupProps } = props; diff --git a/packages/components/src/renderers/form/toggle.tsx b/packages/components/src/renderers/form/toggle.tsx index 24f6be466..997abbe42 100644 --- a/packages/components/src/renderers/form/toggle.tsx +++ b/packages/components/src/renderers/form/toggle.tsx @@ -8,7 +8,7 @@ import { ComponentRegistry } from '@object-ui/core'; import type { ToggleSchema } from '@object-ui/types'; -import { Toggle, ToggleGroup, ToggleGroupItem } from '../../ui'; +import { Toggle } from '../../ui'; import { renderChildren } from '../../lib/utils'; ComponentRegistry.register('toggle', @@ -28,9 +28,9 @@ ComponentRegistry.register('toggle', inputs: [ { name: 'label', type: 'string', label: 'Label' }, { name: 'pressed', type: 'boolean', label: 'Pressed' }, - { name: 'variant', type: 'enum', enum: ['default', 'outline'], defaultValue: 'default', label: 'Variant' }, - { name: 'size', type: 'enum', enum: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' }, - { name: 'ariaLabel', type: 'string', label: 'Aria Label' } + { name: 'variant', type: 'enum', index: ['default', 'outline'], defaultValue: 'default', label: 'Variant' }, + { name: 'size', type: 'enum', index: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' }, + { name: 'ariaLabel', type: 'string', label: 'Aria Label' } ], defaultProps: { label: 'Toggle', @@ -39,46 +39,3 @@ ComponentRegistry.register('toggle', } } ); - -ComponentRegistry.register('toggle-group', - ({ schema, className, ...props }) => ( - - {schema.items?.map((item: any) => ( - - {item.icon || item.label} - - ))} - - ), - { - label: 'Toggle Group', - inputs: [ - { name: 'groupType', type: 'enum', enum: ['single', 'multiple'], defaultValue: 'single', label: 'Type' }, - { name: 'variant', type: 'enum', enum: ['default', 'outline'], defaultValue: 'default', label: 'Variant' }, - { name: 'size', type: 'enum', enum: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' }, - { - name: 'items', - type: 'array', - label: 'Items', - description: 'Array of {label, value, icon?} objects' - }, - { name: 'className', type: 'string', label: 'CSS Class' } - ], - defaultProps: { - groupType: 'single', - variant: 'default', - size: 'default', - items: [ - { label: 'A', value: 'a' }, - { label: 'B', value: 'b' }, - { label: 'C', value: 'c' } - ] - } - } -); diff --git a/packages/components/src/stories-json/form_extras.stories.tsx b/packages/components/src/stories-json/form_extras.stories.tsx index 280a5eaa7..31fe2f3f4 100644 --- a/packages/components/src/stories-json/form_extras.stories.tsx +++ b/packages/components/src/stories-json/form_extras.stories.tsx @@ -39,7 +39,7 @@ export const Toggle: Story = { export const ToggleGroup: Story = { args: { type: 'toggle-group', - groupType: 'multiple', + selectionType: 'multiple', variant: 'outline', items: [ { value: 'bold', label: 'Bold', icon: }, @@ -58,7 +58,7 @@ export const ToggleGroup: Story = { export const ToggleGroupText: Story = { args: { type: 'toggle-group', - groupType: 'single', + selectionType: 'single', variant: 'outline', items: [ { value: 'left', label: 'Left' }, diff --git a/packages/components/src/stories-json/layout_extended.stories.tsx b/packages/components/src/stories-json/layout_extended.stories.tsx index c6d3bdcf9..906884069 100644 --- a/packages/components/src/stories-json/layout_extended.stories.tsx +++ b/packages/components/src/stories-json/layout_extended.stories.tsx @@ -33,11 +33,21 @@ export const ScrollArea: Story = { export const HeaderBar: Story = { args: { - type: 'header-bar', - crumbs: [ - { label: 'Application' }, - { label: 'Dashboard', href: '/dashboard' }, - { label: 'Analytics' } + type: 'sidebar-provider', + body: [ + { + type: 'sidebar-inset', + children: [ + { + type: 'header-bar', + crumbs: [ + { label: 'Application' }, + { label: 'Dashboard', href: '/dashboard' }, + { label: 'Analytics' } + ] + } + ] + } ] } as any, render: (args) => diff --git a/packages/components/src/stories-json/object-gantt.stories.tsx b/packages/components/src/stories-json/object-gantt.stories.tsx index c6d7df0de..19a61c6cd 100644 --- a/packages/components/src/stories-json/object-gantt.stories.tsx +++ b/packages/components/src/stories-json/object-gantt.stories.tsx @@ -7,6 +7,9 @@ const meta = { component: SchemaRenderer, parameters: { layout: 'padded', + test: { + timeout: 60000, + }, }, tags: ['autodocs'], argTypes: { diff --git a/packages/components/src/stories-json/object-map.stories.tsx b/packages/components/src/stories-json/object-map.stories.tsx index 1a73c08d3..bd1dcf0d4 100644 --- a/packages/components/src/stories-json/object-map.stories.tsx +++ b/packages/components/src/stories-json/object-map.stories.tsx @@ -7,6 +7,9 @@ const meta = { component: SchemaRenderer, parameters: { layout: 'padded', + test: { + timeout: 60000, + }, }, tags: ['autodocs'], argTypes: { diff --git a/packages/plugin-grid/src/ObjectGrid.tsx b/packages/plugin-grid/src/ObjectGrid.tsx index c52014fb3..b0710b257 100644 --- a/packages/plugin-grid/src/ObjectGrid.tsx +++ b/packages/plugin-grid/src/ObjectGrid.tsx @@ -115,13 +115,25 @@ export const ObjectGrid: React.FC = ({ const [objectSchema, setObjectSchema] = useState(null); // Get data configuration (supports both new and legacy formats) - const dataConfig = getDataConfig(schema); + const rawDataConfig = getDataConfig(schema); + // Memoize dataConfig using deep comparison to prevent infinite loops + const dataConfig = React.useMemo(() => { + return rawDataConfig; + }, [JSON.stringify(rawDataConfig)]); + const hasInlineData = dataConfig?.provider === 'value'; useEffect(() => { if (hasInlineData && dataConfig?.provider === 'value') { - setData(dataConfig.items as any[]); - setLoading(false); + // Only update if data is different to avoid infinite loop + setData(prev => { + const newItems = dataConfig.items as any[]; + if (JSON.stringify(prev) !== JSON.stringify(newItems)) { + return newItems; + } + return prev; + }); + setLoading(false); } }, [hasInlineData, dataConfig]); diff --git a/packages/plugin-map/src/ObjectMap.tsx b/packages/plugin-map/src/ObjectMap.tsx index cad708350..3129d9595 100644 --- a/packages/plugin-map/src/ObjectMap.tsx +++ b/packages/plugin-map/src/ObjectMap.tsx @@ -190,7 +190,12 @@ export const ObjectMap: React.FC = ({ const [objectSchema, setObjectSchema] = useState(null); const [selectedMarker, setSelectedMarker] = useState(null); - const dataConfig = getDataConfig(schema); + const rawDataConfig = getDataConfig(schema); + // Memoize dataConfig using deep comparison to prevent infinite loops + const dataConfig = useMemo(() => { + return rawDataConfig; + }, [JSON.stringify(rawDataConfig)]); + const mapConfig = getMapConfig(schema); const hasInlineData = dataConfig?.provider === 'value'; From 95dcd104b07896ada5ee682952c325be5e994fe8 Mon Sep 17 00:00:00 2001 From: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Date: Wed, 28 Jan 2026 23:40:00 +0800 Subject: [PATCH 12/12] fix: memoize data configuration in ObjectGantt to prevent infinite loops --- packages/plugin-gantt/src/ObjectGantt.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/plugin-gantt/src/ObjectGantt.tsx b/packages/plugin-gantt/src/ObjectGantt.tsx index 87a47fcb6..85af38d8d 100644 --- a/packages/plugin-gantt/src/ObjectGantt.tsx +++ b/packages/plugin-gantt/src/ObjectGantt.tsx @@ -114,7 +114,12 @@ export const ObjectGantt: React.FC = ({ const [error, setError] = useState(null); const [objectSchema, setObjectSchema] = useState(null); - const dataConfig = getDataConfig(schema); + const rawDataConfig = getDataConfig(schema); + // Memoize dataConfig using deep comparison to prevent infinite loops + const dataConfig = useMemo(() => { + return rawDataConfig; + }, [JSON.stringify(rawDataConfig)]); + const ganttConfig = getGanttConfig(schema); const hasInlineData = dataConfig?.provider === 'value';