From 8850ec96cc9ff9c6035cd2de1d20c3330f62e4c4 Mon Sep 17 00:00:00 2001 From: Chad Gauthier Date: Mon, 24 Feb 2025 00:22:13 -0600 Subject: [PATCH 1/3] Redesign Chat Window and Fix Chat Disabling Issue --- webview-ui/.storybook/main.ts | 15 +- webview-ui/.storybook/preview-context.tsx | 175 ++ webview-ui/.storybook/preview.css | 157 ++ webview-ui/.storybook/preview.ts | 17 - webview-ui/.storybook/preview.tsx | 34 + webview-ui/package-lock.json | 2245 +++++++++++++++-- webview-ui/package.json | 32 +- .../components/chat/Announcement.stories.tsx | 47 + .../src/components/chat/Announcement.tsx | 16 +- .../chat/AutoApproveMenu.stories.tsx | 69 + .../chat/BrowserSessionRow.stories.tsx | 143 ++ .../src/components/chat/ChatRow.stories.tsx | 83 + .../chat/ChatTextArea/ChatTextArea.module.css | 89 + .../ChatTextArea/ChatTextArea.stories.tsx | 137 + .../chat/ChatTextArea/ChatTextArea.tsx | 119 + .../chat/ChatTextArea/ChatTextAreaActions.tsx | 92 + .../ChatTextAreaInput.tsx} | 591 ++--- .../chat/ChatTextArea/ChatTextAreaLayout.tsx | 42 + .../ChatTextArea/ChatTextAreaSelections.tsx | 181 ++ .../src/components/chat/ChatTextArea/index.ts | 5 + .../src/components/chat/ChatView.stories.tsx | 40 + webview-ui/src/components/chat/ChatView.tsx | 81 +- .../components/chat/ContextMenu.stories.tsx | 109 + .../chat/ReasoningBlock.stories.tsx | 102 + .../components/chat/TaskHeader.stories.tsx | 93 + .../common/CodeAccordian.stories.tsx | 110 + .../components/common/CodeBlock.stories.tsx | 145 ++ .../common/MarkdownBlock.stories.tsx | 153 ++ .../src/components/common/Thumbnails.tsx | 1 + webview-ui/vite.config.ts | 1 + 30 files changed, 4434 insertions(+), 690 deletions(-) create mode 100644 webview-ui/.storybook/preview-context.tsx create mode 100644 webview-ui/.storybook/preview.css delete mode 100644 webview-ui/.storybook/preview.ts create mode 100644 webview-ui/.storybook/preview.tsx create mode 100644 webview-ui/src/components/chat/Announcement.stories.tsx create mode 100644 webview-ui/src/components/chat/AutoApproveMenu.stories.tsx create mode 100644 webview-ui/src/components/chat/BrowserSessionRow.stories.tsx create mode 100644 webview-ui/src/components/chat/ChatRow.stories.tsx create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx rename webview-ui/src/components/chat/{ChatTextArea.tsx => ChatTextArea/ChatTextAreaInput.tsx} (53%) create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextAreaLayout.tsx create mode 100644 webview-ui/src/components/chat/ChatTextArea/ChatTextAreaSelections.tsx create mode 100644 webview-ui/src/components/chat/ChatTextArea/index.ts create mode 100644 webview-ui/src/components/chat/ChatView.stories.tsx create mode 100644 webview-ui/src/components/chat/ContextMenu.stories.tsx create mode 100644 webview-ui/src/components/chat/ReasoningBlock.stories.tsx create mode 100644 webview-ui/src/components/chat/TaskHeader.stories.tsx create mode 100644 webview-ui/src/components/common/CodeAccordian.stories.tsx create mode 100644 webview-ui/src/components/common/CodeBlock.stories.tsx create mode 100644 webview-ui/src/components/common/MarkdownBlock.stories.tsx diff --git a/webview-ui/.storybook/main.ts b/webview-ui/.storybook/main.ts index 2a079945dfc..ff000328bb6 100644 --- a/webview-ui/.storybook/main.ts +++ b/webview-ui/.storybook/main.ts @@ -2,10 +2,23 @@ import type { StorybookConfig } from "@storybook/react-vite" const config: StorybookConfig = { stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], - addons: ["@storybook/addon-essentials", "storybook-dark-mode"], + addons: [ + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-interactions", + "storybook-dark-mode", + "storybook-vscode-component/register", + ], framework: { name: "@storybook/react-vite", options: {}, }, + docs: { + autodocs: "tag", + }, + core: { + builder: "@storybook/builder-vite", + }, } + export default config diff --git a/webview-ui/.storybook/preview-context.tsx b/webview-ui/.storybook/preview-context.tsx new file mode 100644 index 00000000000..368e1868edb --- /dev/null +++ b/webview-ui/.storybook/preview-context.tsx @@ -0,0 +1,175 @@ +import { ExtensionStateContextType, ExtensionStateContext } from "../src/context/ExtensionStateContext" +import { McpServer } from "../../src/shared/mcp" +import { ApiConfiguration, ModelInfo } from "../../src/shared/api" +import { HistoryItem } from "../../src/shared/HistoryItem" // Import HistoryItem +import { useContext } from "react" + +// Mock ModelInfo +const mockModelInfo: ModelInfo = { + contextWindow: 2048, + supportsImages: true, + supportsPromptCache: true, + reasoningEffort: "low", +} + +// Mock API configuration +const mockApiConfig: ApiConfiguration = { + apiModelId: "mock-model", + glamaModelInfo: mockModelInfo, +} + +// Mock MCP server +const mockMcpServer: McpServer = { + name: "mock-server", + tools: [], + resources: [], + resourceTemplates: [], + disabled: false, + config: "?", + status: "disconnected", +} + +// Mock task history item (Corrected to match HistoryItem type) +const mockTaskHistoryItem: HistoryItem = { + id: "mock-task-id", + ts: Date.now(), + task: "Sample task", + tokensIn: 100, + tokensOut: 200, + totalCost: 0.5, +} + +// Mock file paths and opened tabs (more realistic mock data) +const mockFilePaths: string[] = [ + "/Roo-Code/src/components/chat/ChatTextArea.tsx", + "/Roo-Code/src/components/common/CodeBlock.tsx", + "/Roo-Code/webview-ui/.storybook/preview-context.tsx", +] +const mockOpenedTabs: Array<{ label: string; isActive: boolean; path?: string }> = [ + { label: "ChatTextArea.tsx", isActive: true, path: "/Roo-Code/src/components/chat/ChatTextArea.tsx" }, + { label: "CodeBlock.tsx", isActive: false, path: "/Roo-Code/src/components/common/CodeBlock.tsx" }, +] + +const defaultContext: ExtensionStateContextType = { + // Version and state + version: "1.0.0", + didHydrateState: true, + showWelcome: false, + + // Messages and history + clineMessages: [], + taskHistory: [mockTaskHistoryItem], + shouldShowAnnouncement: false, + + // API and models + apiConfiguration: mockApiConfig, + glamaModels: {}, + requestyModels: {}, + openRouterModels: {}, + unboundModels: {}, + openAiModels: [], + + // MCP + mcpServers: [mockMcpServer], + mcpEnabled: true, + enableMcpServerCreation: true, + + // Files and tabs + filePaths: mockFilePaths, + openedTabs: mockOpenedTabs, + currentCheckpoint: undefined, + + // Settings + mode: "code", + preferredLanguage: "English", + requestDelaySeconds: 0, + rateLimitSeconds: 0, + writeDelayMs: 0, + browserViewportSize: "1200x800", + screenshotQuality: 75, + terminalOutputLineLimit: 500, + fuzzyMatchThreshold: 1.0, + maxOpenTabsContext: 20, + + // Features + diffEnabled: false, + checkpointsEnabled: false, + soundEnabled: false, + soundVolume: 0.5, + autoApprovalEnabled: true, + + // Permissions + alwaysAllowBrowser: true, + alwaysAllowExecute: true, + alwaysAllowMcp: true, + alwaysAllowModeSwitch: true, + alwaysAllowReadOnly: true, + alwaysApproveResubmit: true, + alwaysAllowWrite: true, + allowedCommands: [], + + // Other state + customModePrompts: {}, + customSupportPrompts: {}, + experiments: { + experimentalDiffStrategy: false, + search_and_replace: false, + insert_content: false, + powerSteering: false, + }, + customModes: [], + enhancementApiConfigId: undefined, + currentApiConfigName: "default", + listApiConfigMeta: [], + theme: {}, + + // Setters + setApiConfiguration: () => {}, + setCustomInstructions: () => {}, + setAlwaysAllowReadOnly: () => {}, + setAlwaysAllowWrite: () => {}, + setAlwaysAllowExecute: () => {}, + setAlwaysAllowBrowser: () => {}, + setAlwaysAllowMcp: () => {}, + setAlwaysAllowModeSwitch: () => {}, + setShowAnnouncement: () => {}, + setAllowedCommands: () => {}, + setSoundEnabled: () => {}, + setSoundVolume: () => {}, + setDiffEnabled: () => {}, + setCheckpointsEnabled: () => {}, + setBrowserViewportSize: () => {}, + setFuzzyMatchThreshold: () => {}, + setPreferredLanguage: () => {}, + setWriteDelayMs: () => {}, + setScreenshotQuality: () => {}, + setTerminalOutputLineLimit: () => {}, + setMcpEnabled: () => {}, + setEnableMcpServerCreation: () => {}, + setAlwaysApproveResubmit: () => {}, + setRequestDelaySeconds: () => {}, + setRateLimitSeconds: () => {}, + setCurrentApiConfigName: () => {}, + setListApiConfigMeta: () => {}, + onUpdateApiConfig: () => {}, + setMode: () => {}, + setCustomModePrompts: () => {}, + setCustomSupportPrompts: () => {}, + setEnhancementApiConfigId: () => {}, + setExperimentEnabled: () => {}, + setAutoApprovalEnabled: () => {}, + setCustomModes: () => {}, + setMaxOpenTabsContext: () => {}, +} + +export const PreviewExtensionStateContextProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + console.log("PreviewExtensionStateContextProvider is rendering!") // Re-add console log + console.log("Context Value:", defaultContext) // Log context value + return {children} +} + +export const usePreviewExtensionState = () => { + const context = useContext(ExtensionStateContext) + console.log("useExtensionState Hook Context:", context) // Log context in hook + return context +} diff --git a/webview-ui/.storybook/preview.css b/webview-ui/.storybook/preview.css new file mode 100644 index 00000000000..6150dbc9789 --- /dev/null +++ b/webview-ui/.storybook/preview.css @@ -0,0 +1,157 @@ +/* VS Code theme variables */ +:root { + /* Base theme */ + --vscode-foreground: #d1d5da; + --vscode-editor-background: #24292e; + --vscode-editor-foreground: #e1e4e8; + + /* Input elements */ + --vscode-input-background: #2f363d; + --vscode-input-foreground: #e1e4e8; + --vscode-input-border: #1b1f23; + --vscode-focusBorder: #005cc5; + + /* Buttons */ + --vscode-button-background: #176f2c; + --vscode-button-foreground: #dcffe4; + --vscode-button-hoverBackground: #1177bb; + --vscode-button-secondaryBackground: #444d56; + --vscode-button-secondaryForeground: #ffffff; + + /* Dropdowns and Lists */ + --vscode-dropdown-background: #2f363d; + --vscode-dropdown-foreground: #e1e4e8; + --vscode-dropdown-border: #1b1f23; + --vscode-list-hoverBackground: #282e34; + --vscode-list-hoverForeground: #e1e4e8; + --vscode-list-focusBackground: #044289; + + /* Badges and Notifications */ + --vscode-badge-background: #044289; + --vscode-badge-foreground: #c8e1ff; + --vscode-notifications-background: #2f363d; + --vscode-notifications-foreground: #e1e4e8; + --vscode-notifications-border: #1b1f23; + + /* Editor elements */ + --vscode-editorGroup-border: #444444; + --vscode-diffEditor-insertedTextBackground: #37373d; + --vscode-diffEditor-removedTextBackground: #3c1f1f; + --vscode-textCodeBlock-background: #1e1e1e; + --vscode-textSeparator-foreground: #424242; + --vscode-textPreformat-foreground: #d7ba7d; + --vscode-textLink-foreground: #3794ff; + + /* Status indicators */ + --vscode-errorForeground: #f97583; + --vscode-descriptionForeground: #959da5; + --vscode-charts-green: #89d185; + --vscode-titleBar-inactiveForeground: #cccccc99; + + /* Menu (from shadcn/ui) */ + --vscode-menu-background: #2f363d; + --vscode-menu-foreground: #e1e4e8; + --vscode-disabledForeground: #cccccc; + + /* Typography */ + --vscode-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --vscode-font-size: 13px; + --vscode-editor-font-family: "SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", + "DejaVu Sans Mono", "Courier New", monospace; + --vscode-editor-font-size: 12px; + --vscode-editor-line-height: 18px; +} + +/* Dark theme */ +.dark { + color-scheme: dark; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); +} + +/* Light theme */ +.light { + color-scheme: light; + background-color: #ffffff; + color: #000000; +} + +/* Global styles */ +body { + margin: 0; + padding: 0; + font-family: var(--vscode-font-family); + font-size: var(--vscode-font-size); + line-height: 1.4; +} + +/* Mermaid diagram styles */ +.mermaid { + background: var(--vscode-editor-background); +} + +/* VS Code scrollbar styles */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #424242; + border-radius: 5px; +} + +::-webkit-scrollbar-thumb:hover { + background: #686868; +} + +/* Dark theme */ +.dark { + color-scheme: dark; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); +} + +/* Light theme */ +.light { + color-scheme: light; + background-color: #ffffff; + color: #000000; +} + +/* Global styles */ +body { + margin: 0; + padding: 0; + font-family: var(--vscode-font-family); + font-size: var(--vscode-font-size); + line-height: 1.4; +} + +/* Mermaid diagram styles */ +.mermaid { + background: var(--vscode-editor-background); +} + +/* VS Code scrollbar styles */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #424242; + border-radius: 5px; +} + +::-webkit-scrollbar-thumb:hover { + background: #686868; +} diff --git a/webview-ui/.storybook/preview.ts b/webview-ui/.storybook/preview.ts deleted file mode 100644 index 1b31bcd32c6..00000000000 --- a/webview-ui/.storybook/preview.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Preview } from "@storybook/react" - -import "./vscode.css" -import "../src/index.css" - -const preview: Preview = { - parameters: { - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/i, - }, - }, - }, -} - -export default preview diff --git a/webview-ui/.storybook/preview.tsx b/webview-ui/.storybook/preview.tsx new file mode 100644 index 00000000000..69d9d58e16a --- /dev/null +++ b/webview-ui/.storybook/preview.tsx @@ -0,0 +1,34 @@ +import React from "react" +import type { Preview, StoryFn } from "@storybook/react" +import { themes } from "@storybook/theming" +import "./preview.css" +import "@vscode/codicons/dist/codicon.css" +import { PreviewExtensionStateContextProvider } from "./preview-context" + +const preview: Preview = { + parameters: { + actions: { argTypesRegex: "^on.*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + darkMode: { + dark: { ...themes.dark }, + light: { ...themes.light }, + current: "dark", + }, + }, + decorators: [ + (Story: StoryFn) => { + return ( + + + + ) + }, + ], +} + +export default preview diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index 1d64f934dc2..9c4079a4c2b 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "webview-ui", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webview-ui", - "version": "0.1.0", + "version": "0.2.0", "dependencies": { "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-collapsible": "^1.1.3", @@ -19,7 +19,10 @@ "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@storybook/preview-api": "^8.5.8", "@tailwindcss/vite": "^4.0.0", + "@types/mermaid": "^9.1.0", + "@vscode/codicons": "^0.0.36", "@vscode/webview-ui-toolkit": "^1.4.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -28,6 +31,8 @@ "fast-deep-equal": "^3.1.3", "fzf": "^0.5.2", "lucide-react": "^0.475.0", + "mermaid": "^11.4.1", + "pretty-bytes": "^6.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^9.0.3", @@ -42,13 +47,17 @@ "tailwind-merge": "^2.6.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", - "vscrui": "^0.2.2" + "vscrui": "^0.2.2", + "zod": "^3.24.2" }, "devDependencies": { - "@storybook/addon-essentials": "^8.5.6", - "@storybook/blocks": "^8.5.6", - "@storybook/react": "^8.5.6", - "@storybook/react-vite": "^8.5.6", + "@chromatic-com/storybook": "^3.2.4", + "@storybook/addon-essentials": "^8.5.8", + "@storybook/addon-interactions": "^8.5.8", + "@storybook/addon-links": "^8.5.8", + "@storybook/blocks": "^8.5.8", + "@storybook/react-vite": "^8.5.8", + "@storybook/test": "^8.5.8", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", "@testing-library/user-event": "^14.6.1", @@ -72,11 +81,12 @@ "jest-environment-jsdom": "^29.7.0", "jest-simple-dot-reporter": "^1.0.5", "shiki": "^2.3.2", - "storybook": "^8.5.6", + "storybook": "^8.5.8", "storybook-dark-mode": "^4.0.2", + "storybook-vscode-component": "^1.0.9", "ts-jest": "^29.2.5", "typescript": "^4.9.5", - "vite": "6.0.11" + "vite": "latest" } }, "node_modules/@adobe/css-tools": { @@ -100,6 +110,28 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz", + "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^0.2.8", + "tinyexec": "^0.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -2196,6 +2228,101 @@ "dev": true, "license": "MIT" }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@chromatic-com/storybook": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.4.tgz", + "integrity": "sha512-5/bOOYxfwZ2BktXeqcCpOVAoR6UCoeART5t9FVy22hoo8F291zOuX4y3SDgm10B1GVU/ZTtJWPT2X9wZFlxYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chromatic": "^11.15.0", + "filesize": "^10.0.12", + "jsonfile": "^6.1.0", + "react-confetti": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0", + "yarn": ">=1.22.18" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", @@ -2785,6 +2912,40 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3529,6 +3690,15 @@ "react": ">=16" } }, + "node_modules/@mermaid-js/parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", + "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "license": "MIT", + "dependencies": { + "langium": "3.0.0" + } + }, "node_modules/@microsoft/fast-element": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.14.0.tgz", @@ -5465,9 +5635,9 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.5.6.tgz", - "integrity": "sha512-kREkqUNmaYFYL5NsgbtYXxuFbVGuoA1reQPYl/ToqI/ujXZo1XDo0o+Sztjj8r2GVAjaM6a96FUxEJ7yg1yBCg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.5.8.tgz", + "integrity": "sha512-7J0NAz+WDw1NmvmKIh0Qr5cxgVRDPFC5fmngbDNxedk147TkwrgmqOypgEi/SAksHbTWxJclbimoqdcsNtWffA==", "dev": true, "license": "MIT", "dependencies": { @@ -5482,13 +5652,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.5.6.tgz", - "integrity": "sha512-vdkYPtrd9FtWPU22QylQF5GTh6hJa//s5I2r2+AZ3huHeqWvyOcFHyOM//RlwcPjkNDnaCbaSotDdeP6C77rcQ==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.5.8.tgz", + "integrity": "sha512-TsQFagQ95+d7H3/+qUZKI2B0SEK8iu6CV13cyry9Dm59nn2bBylFrwx4I3xDQUOWMiSF6QIRjCYzxKQ/jJ5OEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5501,13 +5671,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-controls": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.5.6.tgz", - "integrity": "sha512-OiIwgfKfx/4lOjHl4CEkO+d4eM31nsV2PfrCgtMsTOwg1YKZ4K5/Sq6HvEmqoAdJReonSlKnzBOzoVFVeG9A+A==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.5.8.tgz", + "integrity": "sha512-3iifI8mBGPsiPmV9eAYk+tK9i+xuWhVsa+sXz01xTZ/0yoOREpp972hka86mtCqdDTOJIpzh1LmxvB218OssvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5520,20 +5690,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-docs": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.5.6.tgz", - "integrity": "sha512-LOBupHN4K8eaSrfG/byl2d3lnFOIIkp4rDnsglgEbDe0Rv9E/yjaigcSW1pzFQ0pgRH7tg7sZz26cISHBvr50A==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.5.8.tgz", + "integrity": "sha512-zKVUqE0UGiq1gZtY2TX57SYB4RIsdlbTDxKW2JZ9HhZGLvZ5Qb7AvdiKTZxfOepGhuw3UcNXH/zCFkFCTJifMw==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.5.6", - "@storybook/csf-plugin": "8.5.6", - "@storybook/react-dom-shim": "8.5.6", + "@storybook/blocks": "8.5.8", + "@storybook/csf-plugin": "8.5.8", + "@storybook/react-dom-shim": "8.5.8", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -5543,25 +5713,25 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-essentials": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.5.6.tgz", - "integrity": "sha512-CtOCbJ1TkCqvOoqrksKMTattJdIIe4N/x/o4IBNzvmaLJD0TUYbCnEsYAzm4WXTVdxQ9uJO4f/BHRkNShuHbew==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.5.8.tgz", + "integrity": "sha512-sCNvMZqL6dywnyHuZBrWl4f6QXsvpJHOioL3wJJKaaRMZmctbFmS0u6J8TQjmgZhQfyRzuJuhr1gJg9oeqp6AA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-actions": "8.5.6", - "@storybook/addon-backgrounds": "8.5.6", - "@storybook/addon-controls": "8.5.6", - "@storybook/addon-docs": "8.5.6", - "@storybook/addon-highlight": "8.5.6", - "@storybook/addon-measure": "8.5.6", - "@storybook/addon-outline": "8.5.6", - "@storybook/addon-toolbars": "8.5.6", - "@storybook/addon-viewport": "8.5.6", + "@storybook/addon-actions": "8.5.8", + "@storybook/addon-backgrounds": "8.5.8", + "@storybook/addon-controls": "8.5.8", + "@storybook/addon-docs": "8.5.8", + "@storybook/addon-highlight": "8.5.8", + "@storybook/addon-measure": "8.5.8", + "@storybook/addon-outline": "8.5.8", + "@storybook/addon-toolbars": "8.5.8", + "@storybook/addon-viewport": "8.5.8", "ts-dedent": "^2.0.0" }, "funding": { @@ -5569,13 +5739,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.5.6.tgz", - "integrity": "sha512-uuwBe+FwT9vKbEG9S/yqwZLD1GP3y5Mpu2gsiNcYcfhxHpwDQVbknOSeJJig/CGhuDMqy95GcgItIs/kPPFKqg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.5.8.tgz", + "integrity": "sha512-kkldtFrY0oQJY/vfNLkV66hVgtp66OO8T68KoZFsmUz4a3iYgzDS8WF+Av2/9jthktFvMchjFr8NKOno9YBGIg==", "dev": true, "license": "MIT", "dependencies": { @@ -5586,13 +5756,59 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.5.8.tgz", + "integrity": "sha512-SDyIV3M+c41QemXgg1OchsFBO6YGZkZcmVeUF8C7aWm5SnzLh6B2OiggiKvRk0v3Eh3rDLXdkx3XdR2F/rG+0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.5.8", + "@storybook/test": "8.5.8", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.5.8" + } + }, + "node_modules/@storybook/addon-links": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.5.8.tgz", + "integrity": "sha512-nLfcWhqDCTaEB/zPjzdN+FtsJ3WnvrRE7Uq+UZHF/HDqt7EXicUYCnbzHIF6ReyNBFklr48O/RhotDu9cyUDlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "0.1.12", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.5.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, "node_modules/@storybook/addon-measure": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.5.6.tgz", - "integrity": "sha512-Q83k/75/vcFcXz3YAvwfWpHQubJyOzpNT/jTLdeK27uXatVH6eq0+dRt/fW1plri9GA52HJmiZ7SvJ6MAHFQzQ==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.5.8.tgz", + "integrity": "sha512-xf84ByTRkFPoNSck6Z5OJ0kXTYAYgmg/0Ke0eCY/CNgwh7lfjYQBrcjuKiYZ6jyRUMLdysXzIfF9/2MeFqLfIg==", "dev": true, "license": "MIT", "dependencies": { @@ -5604,13 +5820,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-outline": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.5.6.tgz", - "integrity": "sha512-HypYCQ5aF0Htyhc8E+ZhJEnSojuNheYWq7Kgd51WnSYLtZbZfPbLKYiw/VHPvYWbS2IpKJ5YDAvkUPzgwqgBgA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.5.8.tgz", + "integrity": "sha512-NAC9VWZFg2gwvduzJRVAtxPeQfJjB8xfDDgcGjgLOCSQkZDDOmGVdLXf78pykMQKyuu/0YZ989KufAac6kRG5g==", "dev": true, "license": "MIT", "dependencies": { @@ -5622,13 +5838,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.5.6.tgz", - "integrity": "sha512-e6wJne/bH0EOnqUCz4SDIYxwuEgDzLOYcJZvcl8aNWfoHTgZBSI/5ai9d23CvM0SFY9dGdKwjEejvdJjwRcK0w==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.5.8.tgz", + "integrity": "sha512-AfGdMNBp+vOjyiFKlOyUFLIU0kN1QF4PhVBqd0vYkWAk2w9n6a/ZlG0TcJGe7K5+bcvmZDAerYMKbDMSeg9bAw==", "dev": true, "license": "MIT", "funding": { @@ -5636,13 +5852,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.5.6.tgz", - "integrity": "sha512-i0PJN587K9GMViXJr9Mb4cFF7ZiGvFpk215xRgtC33Pv7mIp8yRjbjNgi3TgEfDe4GQFQ1hKoisqk/pjs9quXg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.5.8.tgz", + "integrity": "sha512-SdoRb4bH99Knj2R+rTcMQQxHrtcIO1GLzTFitAefxBE1OUkq8FNLHMHd0Ip/sCQGLW/5F03U70R2uh7SkhBBYA==", "dev": true, "license": "MIT", "dependencies": { @@ -5653,13 +5869,179 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" + } + }, + "node_modules/@storybook/addons": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", + "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/api": "6.5.16", + "@storybook/channels": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.16", + "@storybook/theming": "6.5.16", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/core-events": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", + "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/theming": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", + "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "6.5.16", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addons/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/api": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", + "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.16", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.16", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/api/node_modules/@storybook/core-events": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", + "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/api/node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/api/node_modules/@storybook/theming": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", + "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "6.5.16", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@storybook/api/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT" + }, "node_modules/@storybook/blocks": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.5.6.tgz", - "integrity": "sha512-5RL2hnk3y9MX8TxJUY4OxGw0rBuJ8OhuWtBK4DlFug3dRKd/TuOuAfIqVWzV5KybI6LyQLD0GOgt+REqP4YQeA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.5.8.tgz", + "integrity": "sha512-O6tJDJM83fDm3ZP1+lTf24l7HOTzSRXkkMDD7zB/JHixzlj9p6wI4UQc2lplLadDCa5ya1IwyE7zUDN/0UfC5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5674,7 +6056,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^8.5.6" + "storybook": "^8.5.8" }, "peerDependenciesMeta": { "react": { @@ -5686,13 +6068,13 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.5.6.tgz", - "integrity": "sha512-uvNo8wAULW2+IOlsFCrszvH6juBDoOEYZIn0WLGzRKbMvLGt3j6CB6d2QjRrLs9p62ayia51fTpJfhIISM9new==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.5.8.tgz", + "integrity": "sha512-nm07wXP4MN7HlWqLRomSFHibwrwiY7V4kTohgsXSjTUod0J+xY+XvmkM4YRK2QYcUgVesG+Q2q3Q5NHof07sfg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "8.5.6", + "@storybook/csf-plugin": "8.5.8", "browser-assert": "^1.2.1", "ts-dedent": "^2.0.0" }, @@ -5701,14 +6083,45 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6", + "storybook": "^8.5.8", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/@storybook/channels": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", + "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/client-logger": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", + "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, "node_modules/@storybook/components": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.5.6.tgz", - "integrity": "sha512-d2mhnnce2C03lRhBEtVR9lS78YueQGBS949R3QXPsEXmrkfDMpcnFI3DIOByjnea6ZeS0+i4lYjnfiAJb0oiMQ==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.5.8.tgz", + "integrity": "sha512-PPEMqWPXn7rX+qISaOOv9CDSuuvG538f0+4M5Ppq2LwpjXecgOG5ktqJF0ZqxmTytT+RpEaJmgjGW0dMAKZswA==", "dev": true, "license": "MIT", "funding": { @@ -5720,16 +6133,15 @@ } }, "node_modules/@storybook/core": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.5.6.tgz", - "integrity": "sha512-ibgTGI3mcSsADABIQuhHWL8rxqF6CvooKIWpkZsB9kwNActS3OJzfCSAZDcgtvRkwaarPVjYX/sAOBzjqQNkXg==", - "dev": true, + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.5.8.tgz", + "integrity": "sha512-OT02DQhkGpBgn5P+nZOZmbzxqubC4liVqbhpjp/HOGi5cOA3+fCJzDJeSDTu+pPh7dZnopC4XnR+5dWjtOJHdA==", "license": "MIT", "dependencies": { "@storybook/csf": "0.1.12", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", "esbuild-register": "^3.5.0", "jsdoc-type-pratt-parser": "^4.0.0", "process": "^0.11.10", @@ -5769,7 +6181,6 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5782,16 +6193,15 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz", "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.5.6.tgz", - "integrity": "sha512-60JBEVsW8x7u4hc+NmrCE0ij36QnaitqTDsxaT8BhbDrqFUvxwUjeaEmoyMn/UCJh080fQfKc2+dqBkFfbkAww==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.5.8.tgz", + "integrity": "sha512-9p+TFutbvtPYEmg14UsvqBDWKP/p/+OkIdi+gkwCMw0yiJF/+7ErMHDB0vr5SpJpU7SFQmfpY2c/LaglEtaniw==", "dev": true, "license": "MIT", "dependencies": { @@ -5802,14 +6212,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/csf/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -5840,13 +6249,11 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.5.6.tgz", - "integrity": "sha512-uMOOiq/9dFoFhSl3IxuQ+yq4lClkcRtEuB6cPzD/rVCmlh+i//VkHTqFCNrDvpVA21Lsy9NLmnxLHJpBGN3Avg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.5.8.tgz", + "integrity": "sha512-+d5bbnwqcSQlj0wkZo6/1b+8rge70EU2wTq14DO22/VSXa9nm3bwPJlEyqBT7laWmC4DJQWHVJwF/790KjT9yg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@vitest/utils": "^2.1.1" @@ -5856,13 +6263,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/manager-api": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.5.6.tgz", - "integrity": "sha512-24Fm1LnRs1uCTMDid1Mmii0mQvmyM//IfzdtuVvzh0OSvatEKKLX+o3vdG/3/QCN1FVyq1hI9uHnkOaz6EuH4Q==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.5.8.tgz", + "integrity": "sha512-ik3yikvYxAJMDFg0s3Pm7hZWucAlkFaaO7e2RlfOctaJFdaEi3evR4RS7GdmS38uKBEk31RC7x+nnIJkqEC59A==", "dev": true, "license": "MIT", "funding": { @@ -5874,10 +6281,9 @@ } }, "node_modules/@storybook/preview-api": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.5.6.tgz", - "integrity": "sha512-brT8jvw+QYoAyddOtPTqMc6tHDKye24oYkL5Bvp96nQi5AcNhkpL1eYfS7dtcQFV7j010Ox6RlzHPt+Ln8XB+Q==", - "dev": true, + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.5.8.tgz", + "integrity": "sha512-HJoz2o28VVprnU5OG6JO6CHrD3ah6qVPWixbnmyUKd0hOYF5dayK5ptmeLyUpYX56Eb2KoYcuVaeQqAby4RkNw==", "license": "MIT", "funding": { "type": "opencollective", @@ -5888,18 +6294,18 @@ } }, "node_modules/@storybook/react": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.5.6.tgz", - "integrity": "sha512-i+h3Kbeus7XaQBdxuAa2oLATMH/pMW3rLlilGXo/lnYkPanslRD77Eb4Oc+ChubzQZe2njda+C/SnHYgnp9tEg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.5.8.tgz", + "integrity": "sha512-QYgKpInR2FLiJHsRoGKCzNhKTRNjOssbLZVd3B0ZABUee+AjkwE0Pey7x2XaNAcp9PxSjQXEPGu+DlaP4BWw2Q==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "8.5.6", + "@storybook/components": "8.5.8", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.5.6", - "@storybook/preview-api": "8.5.6", - "@storybook/react-dom-shim": "8.5.6", - "@storybook/theming": "8.5.6" + "@storybook/manager-api": "8.5.8", + "@storybook/preview-api": "8.5.8", + "@storybook/react-dom-shim": "8.5.8", + "@storybook/theming": "8.5.8" }, "engines": { "node": ">=18.0.0" @@ -5909,10 +6315,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.5.6", + "@storybook/test": "8.5.8", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.5.6", + "storybook": "^8.5.8", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { @@ -5925,9 +6331,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.5.6.tgz", - "integrity": "sha512-Wfu7HCLRyG+0HpHwz+YPeiY70KyZ0mBzcGrgdP+wJ0n6jVXx3+LWheN+5f21tEydAGbpdBT8FN784k2juPkE7A==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.5.8.tgz", + "integrity": "sha512-UT/kGJHPW+HLNCTmI1rV1to+dUZuXKUTaRv2wZ2BUq2/gjIuePyqQZYVQeb0LkZbuH2uviLrPfXpS5d3/RSUJw==", "dev": true, "license": "MIT", "funding": { @@ -5937,20 +6343,20 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/react-vite": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.5.6.tgz", - "integrity": "sha512-hLxWRF51tqTJVqmDP+EOLYRKJX9GKYpPNE2vDrFM9DoSuyckAeEPrVr0NhuMUzEBZ+2lP6BIkoWTWvjZSm+rhw==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.5.8.tgz", + "integrity": "sha512-Fa3WjqMsY/52p8IHX52IofbvQpoh88cFA/SQ8Q6RUGCNvUVYG/l025pBYbm+PhAkKDQXTirRul9CwA66gGR9zA==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.5.6", - "@storybook/react": "8.5.6", + "@storybook/builder-vite": "8.5.8", + "@storybook/react": "8.5.8", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -5965,10 +6371,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.5.6", + "@storybook/test": "8.5.8", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.5.6", + "storybook": "^8.5.8", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { @@ -5977,20 +6383,120 @@ } } }, - "node_modules/@storybook/test": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.5.6.tgz", - "integrity": "sha512-U4HdyAcCwc/ictwq0HWKI6j2NAUggB9ENfyH3baEWaLEI+mp4pzQMuTnOIF9TvqU7K1D5UqOyfs/hlbFxUFysg==", + "node_modules/@storybook/router": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", + "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@storybook/csf": "0.1.12", - "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.5.6", - "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "6.5.0", + "@storybook/client-logger": "6.5.16", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/router/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "license": "ISC", + "dependencies": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/semver/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/semver/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/semver/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/semver/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/test": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.5.8.tgz", + "integrity": "sha512-cpdl9Vk4msRnkINwwSNLklyWXOwAsLAA7JsHMICNPR2GFVc8T+TwZHATcRToCHXhFJTZBMMBYrnqCdD5C2Kr3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "0.1.12", + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.5.8", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", "@testing-library/user-event": "14.5.2", "@vitest/expect": "2.0.5", "@vitest/spy": "2.0.5" @@ -6000,7 +6506,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.5.6" + "storybook": "^8.5.8" } }, "node_modules/@storybook/test/node_modules/@testing-library/jest-dom": { @@ -6009,8 +6515,6 @@ "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -6032,8 +6536,6 @@ "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12", "npm": ">=6" @@ -6048,8 +6550,6 @@ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6063,14 +6563,12 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@storybook/theming": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.5.6.tgz", - "integrity": "sha512-WX0NjPn6sao56OCSm3NVPqBjFhLhMLPjjDwC4fHCW25HZgI+u7oByNk/7YHcxpBYtoHSWMKMiCjOSJuW6731+A==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.5.8.tgz", + "integrity": "sha512-/Rm6BV778sCT+3Ok861VYmw9BlEV5zcCq2zg5TOVuk8HqZw7H7VHtubVsjukEuhveYCs+oF+i2tv/II6jh6jdg==", "dev": true, "license": "MIT", "funding": { @@ -6320,7 +6818,6 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -6434,8 +6931,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -6482,6 +6978,259 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6513,6 +7262,12 @@ "@types/estree": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -6532,6 +7287,13 @@ "@types/unist": "*" } }, + "node_modules/@types/is-function": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.3.tgz", + "integrity": "sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -6624,6 +7386,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mermaid": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.1.0.tgz", + "integrity": "sha512-rc8QqhveKAY7PouzY/p8ljS+eBSNCv7o79L97RSub/Ic2SQ34ph1Ng3s8wFLWVjvaEt6RLOWtSCsgYWd95NY8A==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -6724,6 +7492,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -6744,6 +7519,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/webpack-env": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", + "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -7218,8 +8000,6 @@ "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@vitest/spy": "2.0.5", "@vitest/utils": "2.0.5", @@ -7236,8 +8016,6 @@ "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -7251,8 +8029,6 @@ "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@vitest/pretty-format": "2.0.5", "estree-walker": "^3.0.3", @@ -7269,8 +8045,6 @@ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -7281,8 +8055,6 @@ "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -7296,8 +8068,6 @@ "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tinyspy": "^3.0.0" }, @@ -7311,8 +8081,6 @@ "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", @@ -7322,6 +8090,12 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vscode/codicons": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.36.tgz", + "integrity": "sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ==", + "license": "CC-BY-4.0" + }, "node_modules/@vscode/webview-ui-toolkit": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", @@ -7356,7 +8130,6 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7687,8 +8460,6 @@ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -7697,7 +8468,6 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -7741,7 +8511,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -8000,7 +8769,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, "license": "MIT", "dependencies": { "open": "^8.0.4" @@ -8036,8 +8804,7 @@ "node_modules/browser-assert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==" }, "node_modules/browserslist": { "version": "4.24.4", @@ -8106,7 +8873,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -8125,7 +8891,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8139,7 +8904,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -8218,8 +8982,6 @@ "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -8304,12 +9066,60 @@ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 16" } }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chromatic": { + "version": "11.25.2", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.25.2.tgz", + "integrity": "sha512-/9eQWn6BU1iFsop86t8Au21IksTRxwXAl7if8YHD05L2AbuMjClLWZo5cZojqrJHGKDhTqfrC2X2xE4uSm0iKw==", + "dev": true, + "license": "MIT", + "bin": { + "chroma": "dist/bin.js", + "chromatic": "dist/bin.js", + "chromatic-cli": "dist/bin.js" + }, + "peerDependencies": { + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" + }, + "peerDependenciesMeta": { + "@chromatic-com/cypress": { + "optional": true + }, + "@chromatic-com/playwright": { + "optional": true + } + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -8862,6 +9672,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8869,6 +9688,12 @@ "dev": true, "license": "MIT" }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -8892,7 +9717,19 @@ "toggle-selection": "^1.0.6" } }, - "node_modules/core-js-compat": { + "node_modules/core-js": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", @@ -8906,6 +9743,15 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -9052,6 +9898,505 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/cytoscape": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.31.0.tgz", + "integrity": "sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -9128,6 +10473,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debounce": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", @@ -9208,8 +10559,6 @@ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=6" } @@ -9235,7 +10584,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -9253,7 +10601,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9277,6 +10624,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -9378,8 +10734,13 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true }, "node_modules/domexception": { "version": "4.0.0", @@ -9395,11 +10756,19 @@ "node": ">=12" } }, + "node_modules/dompurify": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -9582,7 +10951,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9592,7 +10960,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9630,7 +10997,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -9727,7 +11093,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -10835,7 +12200,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -11184,6 +12548,16 @@ "node": ">=10" } }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -11240,7 +12614,6 @@ "version": "0.3.4", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -11323,7 +12696,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11390,7 +12762,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -11434,7 +12805,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -11510,6 +12880,17 @@ "node": ">=10.13.0" } }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -11562,7 +12943,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11584,6 +12964,12 @@ "dev": true, "license": "MIT" }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -11618,7 +13004,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -11647,7 +13032,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11660,7 +13044,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -11676,7 +13059,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -12039,7 +13421,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -12144,7 +13525,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/inline-style-parser": { @@ -12177,6 +13557,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -12205,7 +13594,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -12323,7 +13711,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12397,7 +13784,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" @@ -12445,6 +13831,13 @@ "node": ">=8" } }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -12459,7 +13852,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -12567,7 +13959,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -12663,7 +14054,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -12725,7 +14115,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -12748,6 +14137,16 @@ "dev": true, "license": "ISC" }, + "node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -13934,7 +15333,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -14040,6 +15438,29 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -14056,6 +15477,31 @@ "node": ">=4.0" } }, + "node_modules/katex": { + "version": "0.16.21", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", + "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -14066,6 +15512,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -14076,6 +15527,28 @@ "node": ">=6" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", + "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -14096,6 +15569,12 @@ "node": ">=0.10" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -14355,6 +15834,22 @@ "dev": true, "license": "MIT" }, + "node_modules/local-pkg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", + "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.3.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -14378,6 +15873,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -14426,9 +15927,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/lowlight": { "version": "3.3.0", @@ -14470,7 +15969,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -14548,11 +16046,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15867,6 +17376,34 @@ "node": ">= 8" } }, + "node_modules/mermaid": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.1.tgz", + "integrity": "sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.0.1", + "@iconify/utils": "^2.1.32", + "@mermaid-js/parser": "^0.3.0", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.2", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.10", + "dompurify": "^3.2.1", + "katex": "^0.16.9", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^13.0.2", + "roughjs": "^4.6.6", + "stylis": "^4.3.1", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.1" + } + }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -16462,6 +17999,15 @@ "node": ">=6" } }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -16505,6 +18051,18 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -16771,7 +18329,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", @@ -16870,6 +18427,12 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/package-manager-detector": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz", + "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==", + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16933,6 +18496,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -17004,14 +18573,18 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 14.16" } @@ -17114,6 +18687,33 @@ "node": ">=8" } }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/polished": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", @@ -17131,7 +18731,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -17181,6 +18780,18 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -17213,7 +18824,6 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -17305,6 +18915,22 @@ ], "license": "MIT" }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -17345,6 +18971,22 @@ "node": ">=0.10.0" } }, + "node_modules/react-confetti": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.2.3.tgz", + "integrity": "sha512-Jt6Fy3jE7FrpKxeDQ3oh36Bz6LoYt4o+vU578ghuF//NxADlcauDYvWr24S8hHKnQ90Uv01XXOngnKVBdZ73zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-docgen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz", @@ -17821,7 +19463,6 @@ "version": "0.23.9", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, "license": "MIT", "dependencies": { "ast-types": "^0.16.1", @@ -18432,6 +20073,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/rollup": { "version": "4.32.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", @@ -18470,6 +20117,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, "node_modules/rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", @@ -18503,6 +20162,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -18544,7 +20209,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -18562,7 +20226,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/saxes": { @@ -18613,7 +20276,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -18939,14 +20601,20 @@ "stacktrace-gps": "^3.0.4" } }, - "node_modules/storybook": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.5.6.tgz", - "integrity": "sha512-mrcYAA5CP6QBrq5O9grz2eqBoEfJNsK3b+Iz+PdGYqpr04oMC7rg1h80murV2pRwsbHxIWBFpLpXAVX8tMK01w==", + "node_modules/store2": { + "version": "2.14.4", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.4.tgz", + "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==", "dev": true, + "license": "MIT" + }, + "node_modules/storybook": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.5.8.tgz", + "integrity": "sha512-k3QDa7z4a656oO3Mx929KNm+xIdEI2nIDCKatVl1mA6vt+ge+uwoiG+ro182J9LOEppR5XXD2mQQi4u1xNsy6A==", "license": "MIT", "dependencies": { - "@storybook/core": "8.5.6" + "@storybook/core": "8.5.8" }, "bin": { "getstorybook": "bin/index.cjs", @@ -18983,6 +20651,20 @@ "memoizerific": "^1.11.3" } }, + "node_modules/storybook-vscode-component": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/storybook-vscode-component/-/storybook-vscode-component-1.0.9.tgz", + "integrity": "sha512-FfnEKYK8vLwOQWkUgJM6LBPgZ7llOezo0PGcqqB9neEPg4un5erWf5JvZPkGKjL8alOKfZZfO2BzoXcmbcDJ3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@storybook/addons": "^6.5.15", + "@storybook/api": "^6.5.15" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -19401,6 +21083,23 @@ "node": ">=6" } }, + "node_modules/telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -19436,7 +21135,12 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "license": "MIT" }, "node_modules/tinyrainbow": { @@ -19445,8 +21149,6 @@ "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=14.0.0" } @@ -19457,8 +21159,6 @@ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=14.0.0" } @@ -19555,7 +21255,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.10" @@ -19683,6 +21382,13 @@ "dev": true, "license": "0BSD" }, + "node_modules/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "dev": true, + "license": "BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19811,6 +21517,12 @@ "node": ">=4.2.0" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "license": "MIT" + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -20244,7 +21956,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -20254,11 +21965,17 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -20395,6 +22112,55 @@ } } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, "node_modules/vscrui": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/vscrui/-/vscrui-0.2.2.tgz", @@ -20583,7 +22349,6 @@ "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -20672,7 +22437,6 @@ "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -20775,6 +22539,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/webview-ui/package.json b/webview-ui/package.json index 2206fb35c94..20359780eb8 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -1,6 +1,6 @@ { "name": "webview-ui", - "version": "0.1.0", + "version": "0.2.0", "private": true, "type": "module", "scripts": { @@ -8,7 +8,7 @@ "lint-fix": "eslint src --ext ts,tsx --fix", "check-types": "tsc --noEmit", "test": "jest", - "dev": "vite", + "dev": "vite --host", "build": "tsc -b && vite build", "preview": "vite preview", "storybook": "storybook dev -p 6006", @@ -26,7 +26,10 @@ "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@storybook/preview-api": "^8.5.8", "@tailwindcss/vite": "^4.0.0", + "@types/mermaid": "^9.1.0", + "@vscode/codicons": "^0.0.36", "@vscode/webview-ui-toolkit": "^1.4.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -35,6 +38,8 @@ "fast-deep-equal": "^3.1.3", "fzf": "^0.5.2", "lucide-react": "^0.475.0", + "mermaid": "^11.4.1", + "pretty-bytes": "^6.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^9.0.3", @@ -49,13 +54,17 @@ "tailwind-merge": "^2.6.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", - "vscrui": "^0.2.2" + "vscrui": "^0.2.2", + "zod": "^3.24.2" }, "devDependencies": { - "@storybook/addon-essentials": "^8.5.6", - "@storybook/blocks": "^8.5.6", - "@storybook/react": "^8.5.6", - "@storybook/react-vite": "^8.5.6", + "@chromatic-com/storybook": "^3.2.4", + "@storybook/addon-essentials": "^8.5.8", + "@storybook/addon-interactions": "^8.5.8", + "@storybook/addon-links": "^8.5.8", + "@storybook/blocks": "^8.5.8", + "@storybook/react-vite": "^8.5.8", + "@storybook/test": "^8.5.8", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", "@testing-library/user-event": "^14.6.1", @@ -79,10 +88,15 @@ "jest-environment-jsdom": "^29.7.0", "jest-simple-dot-reporter": "^1.0.5", "shiki": "^2.3.2", - "storybook": "^8.5.6", + "storybook": "^8.5.8", "storybook-dark-mode": "^4.0.2", + "storybook-vscode-component": "^1.0.9", "ts-jest": "^29.2.5", "typescript": "^4.9.5", - "vite": "6.0.11" + "vite": "latest" + }, + "resolutions": { + "@storybook/react-vite": "8.5.8", + "@storybook/test": "8.5.8" } } diff --git a/webview-ui/src/components/chat/Announcement.stories.tsx b/webview-ui/src/components/chat/Announcement.stories.tsx new file mode 100644 index 00000000000..89fb0f74369 --- /dev/null +++ b/webview-ui/src/components/chat/Announcement.stories.tsx @@ -0,0 +1,47 @@ +import type { Meta, StoryObj } from "@storybook/react" +import Announcement from "./Announcement" + +const meta = { + title: "Chat/Announcement", + component: Announcement, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = { + args: { + version: "3.2.0", + hideAnnouncement: () => {}, + }, +} + +export const WithCustomVersion: Story = { + args: { + version: "3.3.0", + hideAnnouncement: () => {}, + }, +} + +// Add dark mode variant +export const DarkMode: Story = { + args: { + version: "3.2.0", + hideAnnouncement: () => {}, + }, + parameters: { + backgrounds: { + default: "dark", + }, + }, +} diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index a2e96606efc..252864e44ca 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -37,18 +37,22 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {

Custom Modes: Celebrating Our New Identity

-

- To mark this new chapter, we're introducing the power to shape Roo Code into any role you need! Create - specialized personas and create an entire team of agents with deeply customized prompts: +

+

+ To mark this new chapter, we're introducing the power to shape Roo Code into any role you need! + Create specialized personas and create an entire team of agents with deeply customized prompts: +

  • QA Engineers who write thorough test cases and catch edge cases
  • Product Managers who excel at user stories and feature prioritization
  • UI/UX Designers who craft beautiful, accessible interfaces
  • Code Reviewers who ensure quality and maintainability
- Just click the icon to - get started with Custom Modes! -

+

+ Just click the icon + to get started with Custom Modes! +

+

Join Us for the Next Chapter

diff --git a/webview-ui/src/components/chat/AutoApproveMenu.stories.tsx b/webview-ui/src/components/chat/AutoApproveMenu.stories.tsx new file mode 100644 index 00000000000..1ccb2c98120 --- /dev/null +++ b/webview-ui/src/components/chat/AutoApproveMenu.stories.tsx @@ -0,0 +1,69 @@ +import type { Meta, StoryObj } from "@storybook/react" +import AutoApproveMenu from "./AutoApproveMenu" +import { PreviewExtensionStateContextProvider } from "../../../.storybook/preview-context" // Import PreviewExtensionStateContextProvider + +const meta: Meta = { + title: "Chat/AutoApproveMenu", + component: AutoApproveMenu, + parameters: { + layout: "fullscreen", + }, +} + +export default meta +type Story = StoryObj + +// Replace withInteractiveState decorator with PreviewExtensionStateContextProvider +export const Default: Story = { + decorators: [ + ( + Story, // Use PreviewExtensionStateContextProvider as decorator + ) => ( + +

+ +
{/* Spacer to test modal positioning */} +
+ + ), + ], +} + +// Test overflow behavior with a narrow container +export const NarrowContainer: Story = { + decorators: [ + ( + Story, // Use PreviewExtensionStateContextProvider as decorator + ) => ( + +
+ +
+
+ ), + ], +} + +// Test overflow behavior with a very narrow container +export const VeryNarrowContainer: Story = { + decorators: [ + ( + Story, // Use PreviewExtensionStateContextProvider as decorator + ) => ( + +
+ +
+
+ ), + ], +} diff --git a/webview-ui/src/components/chat/BrowserSessionRow.stories.tsx b/webview-ui/src/components/chat/BrowserSessionRow.stories.tsx new file mode 100644 index 00000000000..5ed3231456c --- /dev/null +++ b/webview-ui/src/components/chat/BrowserSessionRow.stories.tsx @@ -0,0 +1,143 @@ +import type { Meta, StoryObj } from "@storybook/react" +import BrowserSessionRow from "./BrowserSessionRow" +import { ExtensionStateContextProvider } from "../../context/ExtensionStateContext" +import { ClineMessage, ClineAsk } from "../../../../src/shared/ExtensionMessage" + +const meta = { + title: "Chat/BrowserSessionRow", + component: BrowserSessionRow, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const sampleScreenshot = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==" + +const baseMessages: ClineMessage[] = [ + { + ts: Date.now(), + type: "ask", + ask: "browser_action_launch" as ClineAsk, + text: "https://example.com", + }, +] + +export const LaunchingBrowser: Story = { + args: { + messages: baseMessages, + isExpanded: () => false, + onToggleExpand: () => {}, + isLast: true, + onHeightChange: () => {}, + isStreaming: false, + }, +} + +export const BrowserWithScreenshot: Story = { + args: { + messages: [ + ...baseMessages, + { + ts: Date.now() + 1, + type: "say" as const, + say: "browser_action_result", + text: JSON.stringify({ + currentUrl: "https://example.com", + screenshot: sampleScreenshot, + currentMousePosition: "450,300", + logs: "Console log example", + }), + }, + ], + isExpanded: () => false, + onToggleExpand: () => {}, + isLast: true, + onHeightChange: () => {}, + isStreaming: false, + }, +} + +export const WithClickAction: Story = { + args: { + messages: [ + ...baseMessages, + { + ts: Date.now() + 1, + type: "say" as const, + say: "browser_action", + text: JSON.stringify({ + action: "click", + coordinate: "450,300", + }), + }, + ], + isExpanded: () => false, + onToggleExpand: () => {}, + isLast: true, + onHeightChange: () => {}, + isStreaming: true, + }, +} + +export const WithMultipleActions: Story = { + args: { + messages: [ + ...baseMessages, + { + ts: Date.now() + 1, + type: "say" as const, + say: "browser_action_result", + text: JSON.stringify({ + currentUrl: "https://example.com", + screenshot: sampleScreenshot, + currentMousePosition: "450,300", + logs: "Page loaded", + }), + }, + { + ts: Date.now() + 2, + type: "say" as const, + say: "browser_action", + text: JSON.stringify({ + action: "click", + coordinate: "200,150", + }), + }, + { + ts: Date.now() + 3, + type: "say" as const, + say: "browser_action_result", + text: JSON.stringify({ + currentUrl: "https://example.com/clicked", + screenshot: sampleScreenshot, + currentMousePosition: "200,150", + logs: "Clicked element", + }), + }, + ], + isExpanded: () => false, + onToggleExpand: () => {}, + isLast: true, + onHeightChange: () => {}, + isStreaming: false, + }, +} diff --git a/webview-ui/src/components/chat/ChatRow.stories.tsx b/webview-ui/src/components/chat/ChatRow.stories.tsx new file mode 100644 index 00000000000..31ff5d19450 --- /dev/null +++ b/webview-ui/src/components/chat/ChatRow.stories.tsx @@ -0,0 +1,83 @@ +import type { Meta, StoryObj } from "@storybook/react" +import ChatRow from "./ChatRow" + +const meta = { + title: "Chat/ChatRow", + component: ChatRow, + parameters: { + layout: "padded", + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +const baseMessage = { + ts: Date.now(), + type: "say" as const, + text: "Hello! I am the assistant. How can I help you today?", +} + +export const AssistantMessage: Story = { + args: { + message: { + ...baseMessage, + say: "text", + }, + isExpanded: false, + onToggleExpand: () => {}, + isLast: false, + onHeightChange: () => {}, + isStreaming: false, + }, +} + +export const UserFeedback: Story = { + args: { + message: { + ...baseMessage, + type: "say", + say: "user_feedback", + text: "Can you help me with a coding question?", + }, + isExpanded: false, + onToggleExpand: () => {}, + isLast: false, + onHeightChange: () => {}, + isStreaming: false, + }, +} + +export const LoadingAPIRequest: Story = { + args: { + message: { + ...baseMessage, + type: "say", + say: "api_req_started", + text: JSON.stringify({ + request: "Processing your request...", + }), + }, + isExpanded: false, + onToggleExpand: () => {}, + isLast: true, + onHeightChange: () => {}, + isStreaming: true, + }, +} + +export const Error: Story = { + args: { + message: { + ...baseMessage, + type: "say", + say: "error", + text: "Sorry, there was an error processing your request.", + }, + isExpanded: false, + onToggleExpand: () => {}, + isLast: false, + onHeightChange: () => {}, + isStreaming: false, + }, +} diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css new file mode 100644 index 00000000000..a36625e43bb --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css @@ -0,0 +1,89 @@ +.footer { + display: flex; + margin-top: 2px; + padding-top: 8px; + padding-left: 2px; + border-top: 1px solid var(--vscode-widget-border); + gap: 10px; +} + +.selections { + display: flex; + gap: 6px; + align-items: center; + flex: 1 1 auto; + min-width: 0; + flex-wrap: wrap; +} + +.actions { + display: flex; + gap: 6px; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; +} + +@media (min-width: 480px) { + .footer { + flex-direction: row; + justify-content: space-between; + align-items: center; + } +} + +.action-button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + background: transparent; + border: none; + outline: none; + opacity: 0.85; + padding: 6px; + border-radius: 6px; + transition: all 0.2s ease; + min-width: 28px; + min-height: 28px; + cursor: pointer; + color: var(--vscode-foreground); +} + +.action-button:hover { + background-color: color-mix(in srgb, var(--vscode-button-hoverBackground) 40%, transparent); + opacity: 1; +} + +.action-button.disabled { + opacity: 0.35; + cursor: not-allowed; + filter: grayscale(30%); +} + +.action-button.disabled:hover { + background-color: transparent; +} + +/* Loading spinner styles */ +.action-button.codicon-loading { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Desktop styles */ +@media (min-width: 1024px) { + .action-button { + padding: 5px; + min-width: 26px; + min-height: 26px; + } +} diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx new file mode 100644 index 00000000000..044423a4b93 --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx @@ -0,0 +1,137 @@ +import type { Meta, StoryObj } from "@storybook/react" +import ChatTextArea from "." +import { Mode } from "../../../../../src/shared/modes" +import { fn } from "@storybook/test" + +const meta = { + title: "Chat/ChatTextArea", + component: ChatTextArea, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const onHeightChangeSpy = fn() + +const defaultArgs = { + inputValue: "", + setInputValue: () => {}, + textAreaDisabled: false, + placeholderText: "Type a message...", + selectedImages: [], + setSelectedImages: () => {}, + onSend: () => {}, + onSelectImages: () => {}, + shouldDisableImages: false, + mode: "code" as Mode, + setMode: () => {}, + onHeightChange: onHeightChangeSpy, +} + +export const Empty: Story = { + args: defaultArgs, +} + +export const WithText: Story = { + args: { + ...defaultArgs, + inputValue: "Hello, how can you help me today?", + }, +} + +export const WithImages: Story = { + args: { + ...defaultArgs, + selectedImages: [ + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", + ], + }, +} + +export const Disabled: Story = { + args: { + ...defaultArgs, + textAreaDisabled: true, + inputValue: "This text area is disabled", + }, +} + +export const WithMention: Story = { + args: { + ...defaultArgs, + inputValue: "Check this file @/src/index.ts for more details", + }, +} + +export const WithPlaceholder: Story = { + args: { + ...defaultArgs, + placeholderText: "Ask me anything about your code...", + }, +} + +// New stories for improved layout and functionality + +export const WideMode: Story = { + parameters: { + layout: "fullscreen", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], + args: defaultArgs, +} + +export const ResponsiveLayout: Story = { + parameters: { + layout: "fullscreen", + }, + decorators: [ + (Story) => ( +
+

Mobile View (360px)

+ +
+ +
+ +
+ +
+ +

Tablet View (768px)

+
+ +
+ +

Desktop View (1200px)

+
+ +
+
+ ), + ], + args: defaultArgs, +} + +// Story with quick action buttons +export const WithQuickActions: Story = { + args: { + ...defaultArgs, + inputValue: "Here is some text that can be enhanced or cleared", + }, +} diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx new file mode 100644 index 00000000000..059f532d375 --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx @@ -0,0 +1,119 @@ +import React, { forwardRef, useEffect, useState } from "react" +import ChatTextAreaLayout from "./ChatTextAreaLayout" +import ChatTextAreaInput from "./ChatTextAreaInput" +import ChatTextAreaSelections from "./ChatTextAreaSelections" +import ChatTextAreaActions from "./ChatTextAreaActions" +import { useExtensionState } from "@/context/ExtensionStateContext" +import { Mode } from "../../../../../src/shared/modes" + +interface ChatTextAreaProps { + inputValue: string + setInputValue: (value: string) => void + textAreaDisabled: boolean + placeholderText: string + selectedImages: string[] + setSelectedImages: React.Dispatch> + onSend: () => void + onSelectImages: () => void + shouldDisableImages: boolean + onHeightChange?: (height: number) => void + mode: Mode + setMode: (value: Mode) => void +} + +const ChatTextArea = forwardRef( + ( + { + inputValue, + setInputValue, + textAreaDisabled, + placeholderText, + selectedImages, + setSelectedImages, + onSend, + onSelectImages, + shouldDisableImages, + onHeightChange, + mode, + setMode, + }, + ref, + ) => { + const { filePaths, openedTabs, currentApiConfigName, listApiConfigMeta, customModes } = useExtensionState() + const [gitCommits, setGitCommits] = useState([]) + const [isEnhancingPrompt, setIsEnhancingPrompt] = useState(false) + + // Handle enhanced prompt response + useEffect(() => { + const messageHandler = (event: MessageEvent) => { + const message = event.data + if (message.type === "enhancedPrompt") { + if (message.text) { + setInputValue(message.text) + } + setIsEnhancingPrompt(false) + } else if (message.type === "commitSearchResults") { + const commits = message.commits.map((commit: any) => ({ + type: "git", + value: commit.hash, + label: commit.subject, + description: `${commit.shortHash} by ${commit.author} on ${commit.date}`, + icon: "$(git-commit)", + })) + setGitCommits(commits) + } + } + window.addEventListener("message", messageHandler) + return () => window.removeEventListener("message", messageHandler) + }, [setInputValue]) + + return ( + + {{ + input: ( + + ), + selections: ( + + ), + actions: ( + + ), + }} + + ) + }, +) + +export default ChatTextArea diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx new file mode 100644 index 00000000000..b9724c55335 --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx @@ -0,0 +1,92 @@ +import React from "react" +import { vscode } from "../../../utils/vscode" +import styles from "./ChatTextArea.module.css" + +interface ChatTextAreaActionsProps { + textAreaDisabled: boolean + shouldDisableImages: boolean + isEnhancingPrompt: boolean + inputValue: string + setInputValue: (value: string) => void + onSelectImages: () => void + onSend: () => void +} + +const ChatTextAreaActions: React.FC = ({ + textAreaDisabled, + shouldDisableImages, + isEnhancingPrompt, + inputValue, + setInputValue, + onSelectImages, + onSend, +}) => { + const handleEnhancePrompt = () => { + if (!textAreaDisabled) { + const trimmedInput = inputValue.trim() + if (trimmedInput) { + const message = { + type: "enhancePrompt" as const, + text: trimmedInput, + } + vscode.postMessage(message) + } else { + const promptDescription = + "The 'Enhance Prompt' button helps improve your prompt by providing additional context, clarification, or rephrasing. Try typing a prompt in here and clicking the button again to see how it works." + setInputValue(promptDescription) + } + } + } + + return ( +
+
+ {isEnhancingPrompt ? ( + + ) : ( + !textAreaDisabled && handleEnhancePrompt()} + style={{ fontSize: 16 }} + className={`codicon codicon-sparkle ${styles["action-button"]} ${textAreaDisabled ? styles.disabled : ""}`} + /> + )} +
+ !shouldDisableImages && onSelectImages()} + style={{ fontSize: 16 }} + /> + !textAreaDisabled && onSend()} + style={{ fontSize: 16 }} + /> +
+ ) +} + +export default ChatTextAreaActions diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaInput.tsx similarity index 53% rename from webview-ui/src/components/chat/ChatTextArea.tsx rename to webview-ui/src/components/chat/ChatTextArea/ChatTextAreaInput.tsx index d317efb96e6..de3679b926b 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaInput.tsx @@ -1,96 +1,58 @@ -import React, { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react" +import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react" import DynamicTextArea from "react-textarea-autosize" -import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { useExtensionState } from "../../context/ExtensionStateContext" +import { mentionRegex, mentionRegexGlobal } from "../../../../../src/shared/context-mentions" import { ContextMenuOptionType, getContextMenuOptions, insertMention, removeMention, shouldShowContextMenu, -} from "../../utils/context-mentions" -import { MAX_IMAGES_PER_MESSAGE } from "./ChatView" -import ContextMenu from "./ContextMenu" -import Thumbnails from "../common/Thumbnails" -import { vscode } from "../../utils/vscode" -import { WebviewMessage } from "../../../../src/shared/WebviewMessage" -import { Mode, getAllModes } from "../../../../src/shared/modes" -import { CaretIcon } from "../common/CaretIcon" - -interface ChatTextAreaProps { +} from "../../../utils/context-mentions" +import ContextMenu from "../ContextMenu" +import Thumbnails from "../../common/Thumbnails" +import { Mode, getAllModes } from "../../../../../src/shared/modes" +import { MAX_IMAGES_PER_MESSAGE } from "../ChatView" +import { vscode } from "../../../utils/vscode" + +interface ChatTextAreaInputProps { inputValue: string setInputValue: (value: string) => void textAreaDisabled: boolean + shouldDisableImages: boolean placeholderText: string selectedImages: string[] setSelectedImages: React.Dispatch> onSend: () => void - onSelectImages: () => void - shouldDisableImages: boolean onHeightChange?: (height: number) => void mode: Mode setMode: (value: Mode) => void + customModes: any[] + filePaths: string[] + openedTabs: Array<{ path?: string }> + gitCommits: any[] } -const ChatTextArea = forwardRef( +const ChatTextAreaInput = React.forwardRef( ( { inputValue, setInputValue, textAreaDisabled, + shouldDisableImages, placeholderText, selectedImages, setSelectedImages, onSend, - onSelectImages, - shouldDisableImages, onHeightChange, mode, setMode, + customModes, + filePaths, + openedTabs, + gitCommits, }, ref, ) => { - const { filePaths, openedTabs, currentApiConfigName, listApiConfigMeta, customModes } = useExtensionState() - const [gitCommits, setGitCommits] = useState([]) - const [showDropdown, setShowDropdown] = useState(false) - - // Close dropdown when clicking outside - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if (showDropdown) { - setShowDropdown(false) - } - } - document.addEventListener("mousedown", handleClickOutside) - return () => document.removeEventListener("mousedown", handleClickOutside) - }, [showDropdown]) - - // Handle enhanced prompt response - useEffect(() => { - const messageHandler = (event: MessageEvent) => { - const message = event.data - if (message.type === "enhancedPrompt") { - if (message.text) { - setInputValue(message.text) - } - setIsEnhancingPrompt(false) - } else if (message.type === "commitSearchResults") { - const commits = message.commits.map((commit: any) => ({ - type: ContextMenuOptionType.Git, - value: commit.hash, - label: commit.subject, - description: `${commit.shortHash} by ${commit.author} on ${commit.date}`, - icon: "$(git-commit)", - })) - setGitCommits(commits) - } - } - window.addEventListener("message", messageHandler) - return () => window.removeEventListener("message", messageHandler) - }, [setInputValue]) - - const [thumbnailsHeight, setThumbnailsHeight] = useState(0) - const [textAreaBaseHeight, setTextAreaBaseHeight] = useState(undefined) const [showContextMenu, setShowContextMenu] = useState(false) const [cursorPosition, setCursorPosition] = useState(0) const [searchQuery, setSearchQuery] = useState("") @@ -102,38 +64,11 @@ const ChatTextArea = forwardRef( const [justDeletedSpaceAfterMention, setJustDeletedSpaceAfterMention] = useState(false) const [intendedCursorPosition, setIntendedCursorPosition] = useState(null) const contextMenuContainerRef = useRef(null) - const [isEnhancingPrompt, setIsEnhancingPrompt] = useState(false) + const [thumbnailsHeight, setThumbnailsHeight] = useState(0) + const [textAreaBaseHeight, setTextAreaBaseHeight] = useState(undefined) + const [isDraggingOver, setIsDraggingOver] = useState(false) const [isFocused, setIsFocused] = useState(false) - // Fetch git commits when Git is selected or when typing a hash - useEffect(() => { - if (selectedType === ContextMenuOptionType.Git || /^[a-f0-9]+$/i.test(searchQuery)) { - const message: WebviewMessage = { - type: "searchCommits", - query: searchQuery || "", - } as const - vscode.postMessage(message) - } - }, [selectedType, searchQuery]) - - const handleEnhancePrompt = useCallback(() => { - if (!textAreaDisabled) { - const trimmedInput = inputValue.trim() - if (trimmedInput) { - setIsEnhancingPrompt(true) - const message = { - type: "enhancePrompt" as const, - text: trimmedInput, - } - vscode.postMessage(message) - } else { - const promptDescription = - "The 'Enhance Prompt' button helps improve your prompt by providing additional context, clarification, or rephrasing. Try typing a prompt in here and clicking the button again to see how it works." - setInputValue(promptDescription) - } - } - }, [inputValue, textAreaDisabled, setInputValue]) - const queryItems = useMemo(() => { return [ { type: ContextMenuOptionType.Problems, value: "problems" }, @@ -147,7 +82,7 @@ const ChatTextArea = forwardRef( })), ...filePaths .map((file) => "/" + file) - .filter((path) => !openedTabs.some((tab) => tab.path && "/" + tab.path === path)) // Filter out paths that are already in openedTabs + .filter((path) => !openedTabs.some((tab) => tab.path && "/" + tab.path === path)) .map((path) => ({ type: path.endsWith("/") ? ContextMenuOptionType.Folder : ContextMenuOptionType.File, value: path, @@ -155,25 +90,6 @@ const ChatTextArea = forwardRef( ] }, [filePaths, gitCommits, openedTabs]) - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if ( - contextMenuContainerRef.current && - !contextMenuContainerRef.current.contains(event.target as Node) - ) { - setShowContextMenu(false) - } - } - - if (showContextMenu) { - document.addEventListener("mousedown", handleClickOutside) - } - - return () => { - document.removeEventListener("mousedown", handleClickOutside) - } - }, [showContextMenu, setShowContextMenu]) - const handleMentionSelect = useCallback( (type: ContextMenuOptionType, value?: string) => { if (type === ContextMenuOptionType.NoResults) { @@ -181,14 +97,9 @@ const ChatTextArea = forwardRef( } if (type === ContextMenuOptionType.Mode && value) { - // Handle mode selection setMode(value) setInputValue("") setShowContextMenu(false) - vscode.postMessage({ - type: "mode", - text: value, - }) return } @@ -232,7 +143,6 @@ const ChatTextArea = forwardRef( setCursorPosition(newCursorPosition) setIntendedCursorPosition(newCursorPosition) - // scroll to cursor setTimeout(() => { if (textAreaRef.current) { textAreaRef.current.blur() @@ -241,8 +151,7 @@ const ChatTextArea = forwardRef( }, 0) } }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [setInputValue, cursorPosition], + [setInputValue, cursorPosition, setMode], ) const handleKeyDown = useCallback( @@ -268,16 +177,14 @@ const ChatTextArea = forwardRef( if (optionsLength === 0) return prevIndex - // Find selectable options (non-URL types) const selectableOptions = options.filter( (option) => option.type !== ContextMenuOptionType.URL && option.type !== ContextMenuOptionType.NoResults, ) - if (selectableOptions.length === 0) return -1 // No selectable options + if (selectableOptions.length === 0) return -1 - // Find the index of the next selectable option const currentSelectableIndex = selectableOptions.findIndex( (option) => option === options[prevIndex], ) @@ -286,7 +193,6 @@ const ChatTextArea = forwardRef( (currentSelectableIndex + direction + selectableOptions.length) % selectableOptions.length - // Find the index of the selected option in the original options array return options.findIndex((option) => option === selectableOptions[newSelectableIndex]) }) return @@ -324,13 +230,11 @@ const ChatTextArea = forwardRef( charBeforeCursor === " " || charBeforeCursor === "\n" || charBeforeCursor === "\r\n" const charAfterIsWhitespace = charAfterCursor === " " || charAfterCursor === "\n" || charAfterCursor === "\r\n" - // checks if char before cusor is whitespace after a mention if ( charBeforeIsWhitespace && - inputValue.slice(0, cursorPosition - 1).match(new RegExp(mentionRegex.source + "$")) // "$" is added to ensure the match occurs at the end of the string + inputValue.slice(0, cursorPosition - 1).match(new RegExp(mentionRegex.source + "$")) ) { const newCursorPosition = cursorPosition - 1 - // if mention is followed by another word, then instead of deleting the space separating them we just move the cursor to the end of the mention if (!charAfterIsWhitespace) { event.preventDefault() textAreaRef.current?.setSelectionRange(newCursorPosition, newCursorPosition) @@ -343,7 +247,7 @@ const ChatTextArea = forwardRef( if (newText !== inputValue) { event.preventDefault() setInputValue(newText) - setIntendedCursorPosition(newPosition) // Store the new cursor position in state + setIntendedCursorPosition(newPosition) } setJustDeletedSpaceAfterMention(false) setShowContextMenu(false) @@ -371,34 +275,38 @@ const ChatTextArea = forwardRef( useLayoutEffect(() => { if (intendedCursorPosition !== null && textAreaRef.current) { textAreaRef.current.setSelectionRange(intendedCursorPosition, intendedCursorPosition) - setIntendedCursorPosition(null) // Reset the state + setIntendedCursorPosition(null) } }, [inputValue, intendedCursorPosition]) const handleInputChange = useCallback( (e: React.ChangeEvent) => { const newValue = e.target.value - const newCursorPosition = e.target.selectionStart + const newCursorPosition = e.target.selectionStart || 0 setInputValue(newValue) setCursorPosition(newCursorPosition) - const showMenu = shouldShowContextMenu(newValue, newCursorPosition) + if (newValue === "@" || newValue === "/") { + setShowContextMenu(true) + setSearchQuery("") + setSelectedMenuIndex(newValue === "/" ? 0 : 3) + return + } + + const showMenu = shouldShowContextMenu(newValue, newCursorPosition) setShowContextMenu(showMenu) + if (showMenu) { if (newValue.startsWith("/")) { - // Handle slash command - const query = newValue + const query = newValue.slice(1) setSearchQuery(query) setSelectedMenuIndex(0) } else { - // Existing @ mention handling const lastAtIndex = newValue.lastIndexOf("@", newCursorPosition - 1) - const query = newValue.slice(lastAtIndex + 1, newCursorPosition) - setSearchQuery(query) - if (query.length > 0) { - setSelectedMenuIndex(0) - } else { - setSelectedMenuIndex(3) // Set to "File" option by default + if (lastAtIndex !== -1) { + const query = newValue.slice(lastAtIndex + 1, newCursorPosition) + setSearchQuery(query) + setSelectedMenuIndex(query.length > 0 ? 0 : 3) } } } else { @@ -409,26 +317,11 @@ const ChatTextArea = forwardRef( [setInputValue], ) - useEffect(() => { - if (!showContextMenu) { - setSelectedType(null) - } - }, [showContextMenu]) - - const handleBlur = useCallback(() => { - // Only hide the context menu if the user didn't click on it - if (!isMouseDownOnMenu) { - setShowContextMenu(false) - } - setIsFocused(false) - }, [isMouseDownOnMenu]) - const handlePaste = useCallback( async (e: React.ClipboardEvent) => { const items = e.clipboardData.items const pastedText = e.clipboardData.getData("text") - // Check if the pasted content is a URL, add space after so user can easily delete if they don't want it const urlRegex = /^\S+:\/\/\S+$/ if (urlRegex.test(pastedText.trim())) { e.preventDefault() @@ -441,7 +334,6 @@ const ChatTextArea = forwardRef( setIntendedCursorPosition(newCursorPosition) setShowContextMenu(false) - // Scroll to new cursor position setTimeout(() => { if (textAreaRef.current) { textAreaRef.current.blur() @@ -457,7 +349,7 @@ const ChatTextArea = forwardRef( const [type, subtype] = item.type.split("/") return type === "image" && acceptedTypes.includes(subtype) }) - if (!shouldDisableImages && imageItems.length > 0) { + if (imageItems.length > 0) { e.preventDefault() const imagePromises = imageItems.map((item) => { return new Promise((resolve) => { @@ -472,8 +364,7 @@ const ChatTextArea = forwardRef( console.error("Error reading file:", reader.error) resolve(null) } else { - const result = reader.result - resolve(typeof result === "string" ? result : null) + resolve(typeof reader.result === "string" ? reader.result : null) } } reader.readAsDataURL(blob) @@ -488,7 +379,7 @@ const ChatTextArea = forwardRef( } } }, - [shouldDisableImages, setSelectedImages, cursorPosition, setInputValue, inputValue], + [cursorPosition, setInputValue, inputValue, setSelectedImages], ) const handleThumbnailsHeightChange = useCallback((height: number) => { @@ -512,7 +403,7 @@ const ChatTextArea = forwardRef( highlightLayerRef.current.innerHTML = text .replace(/\n$/, "\n\n") - .replace(/[<>&]/g, (c) => ({ "<": "<", ">": ">", "&": "&" })[c] || c) + .replace(/[<>&]/g, (c) => ({ "<": "<", ">": ">", "&": "&" })[c] || c) .replace(mentionRegexGlobal, '$&') highlightLayerRef.current.scrollTop = textAreaRef.current.scrollTop @@ -538,55 +429,27 @@ const ChatTextArea = forwardRef( [updateCursorPosition], ) - const selectStyle = { - fontSize: "11px", - cursor: textAreaDisabled ? "not-allowed" : "pointer", - backgroundColor: "transparent", - border: "none", - color: "var(--vscode-foreground)", - opacity: textAreaDisabled ? 0.5 : 0.8, - outline: "none", - paddingLeft: "20px", - paddingRight: "6px", - WebkitAppearance: "none" as const, - MozAppearance: "none" as const, - appearance: "none" as const, - } - - const optionStyle = { - backgroundColor: "var(--vscode-dropdown-background)", - color: "var(--vscode-dropdown-foreground)", - } - - const caretContainerStyle = { - position: "absolute" as const, - left: 6, - top: "50%", - transform: "translateY(-45%)", - pointerEvents: "none" as const, - opacity: textAreaDisabled ? 0.5 : 0.8, - } - return (
{ e.preventDefault() - const files = Array.from(e.dataTransfer.files) + e.stopPropagation() + setIsDraggingOver(false) + + // Handle text drops const text = e.dataTransfer.getData("text") if (text) { const newValue = inputValue.slice(0, cursorPosition) + text + inputValue.slice(cursorPosition) @@ -596,49 +459,88 @@ const ChatTextArea = forwardRef( setIntendedCursorPosition(newCursorPosition) return } - const acceptedTypes = ["png", "jpeg", "webp"] - const imageFiles = files.filter((file) => { - const [type, subtype] = file.type.split("/") - return type === "image" && acceptedTypes.includes(subtype) - }) - if (!shouldDisableImages && imageFiles.length > 0) { - const imagePromises = imageFiles.map((file) => { - return new Promise((resolve) => { - const reader = new FileReader() - reader.onloadend = () => { - if (reader.error) { - console.error("Error reading file:", reader.error) - resolve(null) - } else { - const result = reader.result - resolve(typeof result === "string" ? result : null) + + // Handle file drops + const files = Array.from(e.dataTransfer.files) + if (!textAreaDisabled && files.length > 0) { + const acceptedTypes = ["png", "jpeg", "webp"] + const imageFiles = files.filter((file) => { + const [type, subtype] = file.type.split("/") + return type === "image" && acceptedTypes.includes(subtype) + }) + + if (imageFiles.length > 0) { + try { + const imagePromises = imageFiles.map( + (file) => + new Promise((resolve) => { + const reader = new FileReader() + reader.onloadend = () => { + if (reader.error) { + console.error("Error reading file:", reader.error) + resolve(null) + } else { + resolve(typeof reader.result === "string" ? reader.result : null) + } + } + reader.readAsDataURL(file) + }), + ) + + const imageDataArray = await Promise.all(imagePromises) + const dataUrls = imageDataArray.filter((dataUrl): dataUrl is string => dataUrl !== null) + if (dataUrls.length > 0) { + setSelectedImages((prevImages) => + [...prevImages, ...dataUrls].slice(0, MAX_IMAGES_PER_MESSAGE), + ) + if (typeof vscode !== "undefined") { + vscode.postMessage({ + type: "draggedImages", + dataUrls: dataUrls, + }) } } - reader.readAsDataURL(file) - }) - }) - const imageDataArray = await Promise.all(imagePromises) - const dataUrls = imageDataArray.filter((dataUrl): dataUrl is string => dataUrl !== null) - if (dataUrls.length > 0) { - setSelectedImages((prevImages) => - [...prevImages, ...dataUrls].slice(0, MAX_IMAGES_PER_MESSAGE), - ) - if (typeof vscode !== "undefined") { - vscode.postMessage({ - type: "draggedImages", - dataUrls: dataUrls, - }) + } catch (error) { + console.error("Error processing dropped images:", error) } - } else { - console.warn("No valid images were processed") } } }} onDragOver={(e) => { e.preventDefault() + e.stopPropagation() + setIsDraggingOver(true) + e.dataTransfer.dropEffect = "copy" + }} + onDragEnter={(e) => { + e.preventDefault() + e.stopPropagation() + }} + onDragLeave={(e) => { + e.preventDefault() + e.stopPropagation() + const rect = e.currentTarget.getBoundingClientRect() + if ( + e.clientX <= rect.left || + e.clientX >= rect.right || + e.clientY <= rect.top || + e.clientY >= rect.bottom + ) { + setIsDraggingOver(false) + } }}> {showContextMenu && ( -
+
( fontFamily: "var(--vscode-font-family)", fontSize: "var(--vscode-editor-font-size)", lineHeight: "var(--vscode-editor-line-height)", - padding: "2px", - paddingRight: "8px", - marginBottom: thumbnailsHeight > 0 ? `${thumbnailsHeight + 16}px` : 0, + padding: "8px", + paddingRight: "16px", + marginBottom: thumbnailsHeight > 0 ? `${thumbnailsHeight}px` : 0, zIndex: 1, }} /> @@ -691,14 +593,24 @@ const ChatTextArea = forwardRef( }} value={inputValue} disabled={textAreaDisabled} - onChange={(e) => { - handleInputChange(e) - updateHighlights() + onChange={handleInputChange} + onFocus={() => { + setIsFocused(true) + if (inputValue === "@" || inputValue === "/") { + setShowContextMenu(true) + setSearchQuery("") + setSelectedMenuIndex(inputValue === "/" ? 0 : 3) + } + }} + onBlur={(e) => { + setIsFocused(false) + if (!isMouseDownOnMenu) { + setTimeout(() => setShowContextMenu(false), 100) + } + setIsMouseDownOnMenu(false) }} - onFocus={() => setIsFocused(true)} onKeyDown={handleKeyDown} onKeyUp={handleKeyUp} - onBlur={handleBlur} onPaste={handlePaste} onSelect={updateCursorPosition} onMouseUp={updateCursorPosition} @@ -716,9 +628,11 @@ const ChatTextArea = forwardRef( width: "100%", outline: "none", boxSizing: "border-box", - backgroundColor: "transparent", - color: "var(--vscode-input-foreground)", - borderRadius: 2, + backgroundColor: isFocused + ? "color-mix(in srgb, var(--vscode-editor-background) 95%, var(--vscode-focusBorder))" + : "var(--vscode-editor-background)", + color: "var(--vscode-editor-foreground)", + borderRadius: 5, fontFamily: "var(--vscode-font-family)", fontSize: "var(--vscode-editor-font-size)", lineHeight: "var(--vscode-editor-line-height)", @@ -726,18 +640,40 @@ const ChatTextArea = forwardRef( overflowX: "hidden", overflowY: "auto", border: "none", - padding: "2px", - paddingRight: "8px", + padding: "8px", + paddingRight: "16px", marginBottom: thumbnailsHeight > 0 ? `${thumbnailsHeight + 16}px` : 0, - cursor: textAreaDisabled ? "not-allowed" : undefined, + cursor: textAreaDisabled ? "not-allowed" : "text", flex: "0 1 auto", zIndex: 2, scrollbarWidth: "none", + opacity: textAreaDisabled ? 0.5 : 1, + position: "relative", + transition: "background-color 0.2s ease-in-out", }} onScroll={() => updateHighlights()} />
- + {!inputValue && ( +
0 ? `${thumbnailsHeight + 22}px` : 6, + transition: "opacity 0.2s ease", + }}> + [@ Context] + [/ Modes] + {!shouldDisableImages && [⇧ Drag Images]} +
+ )} {selectedImages.length > 0 && ( ( onHeightChange={handleThumbnailsHeightChange} style={{ position: "absolute", - bottom: "36px", - left: "16px", + bottom: "0", + left: "2px", zIndex: 2, marginBottom: "4px", }} /> )} - -
-
-
- -
- -
-
- -
- -
- -
-
-
- -
-
- {isEnhancingPrompt ? ( - - ) : ( - !textAreaDisabled && handleEnhancePrompt()} - style={{ fontSize: 16.5 }} - /> - )} -
- !shouldDisableImages && onSelectImages()} - style={{ fontSize: 16.5 }} - /> - !textAreaDisabled && onSend()} - style={{ fontSize: 15 }} - /> -
-
) }, ) -export default ChatTextArea +export default ChatTextAreaInput diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaLayout.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaLayout.tsx new file mode 100644 index 00000000000..4c27845fb26 --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaLayout.tsx @@ -0,0 +1,42 @@ +import React from "react" +import styles from "./ChatTextArea.module.css" + +interface ChatTextAreaLayoutProps { + children: { + input: React.ReactNode + selections: React.ReactNode + actions: React.ReactNode + } +} + +const ChatTextAreaLayout: React.FC = ({ children: { input, selections, actions } }) => { + return ( +
+
{input}
+
+
{selections}
+
{actions}
+
+
+ ) +} + +export default ChatTextAreaLayout diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaSelections.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaSelections.tsx new file mode 100644 index 00000000000..d2ed86bb4c2 --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaSelections.tsx @@ -0,0 +1,181 @@ +import React from "react" +import { Mode, getAllModes } from "../../../../../src/shared/modes" +import { CaretIcon } from "../../common/CaretIcon" +import { vscode } from "../../../utils/vscode" + +interface ChatTextAreaSelectionsProps { + mode: Mode + setMode: (value: Mode) => void + currentApiConfigName: string | null | undefined + listApiConfigMeta: Array<{ name: string }> | undefined + customModes: any[] +} + +const ChatTextAreaSelections: React.FC = ({ + mode, + setMode, + currentApiConfigName, + listApiConfigMeta, + customModes, +}) => { + const selectStyle = { + fontSize: "11px", + fontWeight: 400, + cursor: "pointer", + backgroundColor: "var(--vscode-input-background)", + border: "1px solid color-mix(in srgb, var(--vscode-input-foreground) 35%, var(--vscode-input-background))", // Slightly darker border + color: "var(--vscode-input-foreground)", + outline: "none", + padding: "4px 16px 4px 8px", // Adjusted padding + borderRadius: "3px", + WebkitAppearance: "none" as const, + MozAppearance: "none" as const, + appearance: "none" as const, + transition: "border-color 0.1s ease", + minHeight: "20px", + maxWidth: "120px", + textOverflow: "ellipsis", + whiteSpace: "nowrap", + overflow: "hidden", + } + + const optionStyle = { + backgroundColor: "var(--vscode-input-background)", + color: "var(--vscode-input-foreground)", + fontSize: "11px", + padding: "2px 4px", + fontWeight: 400, + lineHeight: "16px", + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "nowrap", + maxWidth: "200px", // Wider options in dropdown for readability + } + + const caretContainerStyle = { + position: "absolute" as const, + right: 4, + top: "50%", + transform: "translateY(-45%)", + pointerEvents: "none" as const, + opacity: 0.6, + fontSize: "10px", // Slightly smaller caret + } + + const selectContainerStyle = { + position: "relative" as const, + display: "inline-block", + minWidth: 0, // Allow container to shrink + flex: "0 1 auto", // Allow shrinking but not growing + } + + const hoverStyle = { + "&:hover": { + borderColor: "var(--vscode-input-border)", + backgroundColor: "var(--vscode-input-background)", + }, + "&:focus": { + outline: "1px solid var(--vscode-focusBorder)", + outlineOffset: "1px", + }, + } + + return ( +
+ {/* Editor Mode Dropdown */} +
+ +
+ +
+
+ + {/* API Config Dropdown */} +
+ +
+ +
+
+
+ ) +} + +export default ChatTextAreaSelections diff --git a/webview-ui/src/components/chat/ChatTextArea/index.ts b/webview-ui/src/components/chat/ChatTextArea/index.ts new file mode 100644 index 00000000000..8b8442f36ca --- /dev/null +++ b/webview-ui/src/components/chat/ChatTextArea/index.ts @@ -0,0 +1,5 @@ +export { default } from "./ChatTextArea" +export { default as ChatTextAreaActions } from "./ChatTextAreaActions" +export { default as ChatTextAreaInput } from "./ChatTextAreaInput" +export { default as ChatTextAreaLayout } from "./ChatTextAreaLayout" +export { default as ChatTextAreaSelections } from "./ChatTextAreaSelections" diff --git a/webview-ui/src/components/chat/ChatView.stories.tsx b/webview-ui/src/components/chat/ChatView.stories.tsx new file mode 100644 index 00000000000..8215963e256 --- /dev/null +++ b/webview-ui/src/components/chat/ChatView.stories.tsx @@ -0,0 +1,40 @@ +import type { Meta, StoryObj } from "@storybook/react" +import ChatView from "./ChatView" + +const meta = { + title: "Chat/ChatView", + component: ChatView, + parameters: { + layout: "fullscreen", + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = { + args: { + showHistoryView: () => {}, + isHidden: false, + showAnnouncement: false, + hideAnnouncement: () => {}, + }, +} + +export const Hidden: Story = { + args: { + showHistoryView: () => {}, + isHidden: true, + showAnnouncement: false, + hideAnnouncement: () => {}, + }, +} + +export const WithAnnouncement: Story = { + args: { + showHistoryView: () => {}, + isHidden: false, + showAnnouncement: true, + hideAnnouncement: () => {}, + }, +} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index b9fc215a1c7..08f287f51b5 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -877,13 +877,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }, []) useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance - const placeholderText = useMemo(() => { - const baseText = task ? "Type a message..." : "Type your task here..." - const contextText = "(@ to add context, / to switch modes" - const imageText = shouldDisableImages ? "" : ", hold shift to drag in images" - const helpText = imageText ? `\n${contextText}${imageText})` : `\n${contextText})` - return baseText + helpText - }, [task, shouldDisableImages]) + const placeholderText = task ? "Type a message..." : "Type your task here..." const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -999,15 +993,72 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie paddingBottom: "10px", }}> {showAnnouncement && } -
-

What can Roo do for you?

-

- Thanks to the latest breakthroughs in agentic coding capabilities, I can handle complex - software development tasks step-by-step. With tools that let me create & edit files, explore - complex projects, use the browser, and execute terminal commands (after you grant - permission), I can assist you in ways that go beyond code completion or tech support. I can - even use MCP to create new tools and extend my own capabilities. +

+

+ What can Roo do for you? +

+

+ Hey developer! I'm Roo, your coding companion. I help build features, fix bugs, and improve + code quality with proper validation.

+
+
+ + File Operations +
+
+ + Project Analysis +
+
+ + Terminal Control +
+
+ + Browser Testing +
+
+ + MCP Extensions +
+
+ + Custom Tools +
+
{taskHistory.length > 0 && }
diff --git a/webview-ui/src/components/chat/ContextMenu.stories.tsx b/webview-ui/src/components/chat/ContextMenu.stories.tsx new file mode 100644 index 00000000000..682078d3e09 --- /dev/null +++ b/webview-ui/src/components/chat/ContextMenu.stories.tsx @@ -0,0 +1,109 @@ +import type { Meta, StoryObj } from "@storybook/react" +import ContextMenu from "./ContextMenu" +import { ContextMenuOptionType } from "../../utils/context-mentions" +import { ModeConfig } from "../../../../src/shared/modes" + +const meta = { + title: "Chat/ContextMenu", + component: ContextMenu, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const sampleModes: ModeConfig[] = [ + { + name: "Act Mode", + slug: "act", + roleDefinition: "Execute actions and make changes", + groups: ["read", "edit", "browser", "command", "mcp"], + }, + { + name: "Plan Mode", + slug: "plan", + roleDefinition: "Plan and discuss changes", + groups: ["read", "browser", "mcp"], + }, +] + +const sampleQueryItems = [ + { + type: ContextMenuOptionType.File, + value: "/src/components/App.tsx", + }, + { + type: ContextMenuOptionType.OpenedFile, + value: "/src/index.tsx", + }, + { + type: ContextMenuOptionType.Folder, + value: "/src/components", + }, + { + type: ContextMenuOptionType.Git, + value: "abc123", + label: "Add new feature", + description: "abc123 by John Doe on Feb 21", + }, +] + +export const Default: Story = { + args: { + searchQuery: "", + selectedIndex: -1, + setSelectedIndex: () => {}, + onSelect: () => {}, + onMouseDown: () => {}, + selectedType: null, + queryItems: sampleQueryItems, + modes: sampleModes, + }, +} + +export const WithSearchQuery: Story = { + args: { + ...Default.args, + searchQuery: "app", + }, +} + +export const WithSelectedFile: Story = { + args: { + ...Default.args, + selectedType: ContextMenuOptionType.File, + selectedIndex: 0, + }, +} + +export const WithGitCommits: Story = { + args: { + ...Default.args, + selectedType: ContextMenuOptionType.Git, + selectedIndex: 3, + }, +} + +export const NoResults: Story = { + args: { + ...Default.args, + searchQuery: "nonexistentfile", + }, +} + +export const WithModes: Story = { + args: { + ...Default.args, + selectedType: ContextMenuOptionType.Mode, + selectedIndex: 0, + }, +} diff --git a/webview-ui/src/components/chat/ReasoningBlock.stories.tsx b/webview-ui/src/components/chat/ReasoningBlock.stories.tsx new file mode 100644 index 00000000000..8f274dcc689 --- /dev/null +++ b/webview-ui/src/components/chat/ReasoningBlock.stories.tsx @@ -0,0 +1,102 @@ +import type { Meta, StoryObj } from "@storybook/react" +import ReasoningBlock from "./ReasoningBlock" + +const meta = { + title: "Chat/ReasoningBlock", + component: ReasoningBlock, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const sampleContent = `Let me analyze the requirements and break down the task: + +1. First, I need to understand the current codebase structure + - Look for existing components + - Check the file organization + - Review any existing patterns + +2. Key considerations: + - Performance implications + - Maintainability + - Code reusability + - Testing strategy + +3. Implementation approach: + - Start with core functionality + - Add error handling + - Implement edge cases + - Write comprehensive tests + +4. Next steps: + - Create necessary files + - Implement the component + - Add documentation + - Run tests` + +export const Default: Story = { + args: { + content: sampleContent, + isCollapsed: false, + onToggleCollapse: () => {}, + }, +} + +export const Collapsed: Story = { + args: { + content: sampleContent, + isCollapsed: true, + onToggleCollapse: () => {}, + }, +} + +export const WithCodeBlocks: Story = { + args: { + content: `Here's my analysis of the code: + +\`\`\`typescript +interface Props { + items: string[]; + onSelect: (item: string) => void; +} +\`\`\` + +The component needs to handle these props efficiently. + +\`\`\`typescript +// Example implementation +const ListComponent: React.FC = ({ items, onSelect }) => { + // Implementation here +}; +\`\`\``, + isCollapsed: false, + onToggleCollapse: () => {}, + }, +} + +export const LongContent: Story = { + args: { + content: Array(5).fill(sampleContent).join("\n\n"), + isCollapsed: false, + onToggleCollapse: () => {}, + }, +} + +export const AutoHeight: Story = { + args: { + content: sampleContent, + isCollapsed: false, + onToggleCollapse: () => {}, + autoHeight: true, + }, +} diff --git a/webview-ui/src/components/chat/TaskHeader.stories.tsx b/webview-ui/src/components/chat/TaskHeader.stories.tsx new file mode 100644 index 00000000000..e0c96916432 --- /dev/null +++ b/webview-ui/src/components/chat/TaskHeader.stories.tsx @@ -0,0 +1,93 @@ +import type { Meta, StoryObj } from "@storybook/react" +import TaskHeader from "./TaskHeader" +import { ExtensionStateContextProvider } from "../../context/ExtensionStateContext" + +const meta = { + title: "Chat/TaskHeader", + component: TaskHeader, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const baseTask = { + ts: Date.now(), + type: "ask" as const, + text: "Create a new React component that displays a list of items with pagination.", +} + +export const Default: Story = { + args: { + task: baseTask, + tokensIn: 1500, + tokensOut: 800, + doesModelSupportPromptCache: true, + cacheWrites: 100, + cacheReads: 50, + totalCost: 0.0123, + contextTokens: 2500, + onClose: () => {}, + }, +} + +export const LongTask: Story = { + args: { + ...Default.args, + task: { + ...baseTask, + text: "Create a new React component that displays a list of items with pagination. The component should support sorting, filtering, and custom rendering of items. It should also handle loading states, error states, and empty states gracefully. Add support for keyboard navigation and accessibility features. Include proper TypeScript types and comprehensive unit tests. The component should be responsive and work well on both desktop and mobile devices. Add documentation with examples of all features and edge cases.", + }, + }, +} + +export const WithImages: Story = { + args: { + ...Default.args, + task: { + ...baseTask, + images: [ + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", + ], + }, + }, +} + +export const WithMentions: Story = { + args: { + ...Default.args, + task: { + ...baseTask, + text: "Update the component in @/src/components/App.tsx and add tests in @/src/components/__tests__/App.test.tsx", + }, + }, +} + +export const HighTokenUsage: Story = { + args: { + ...Default.args, + tokensIn: 15000, + tokensOut: 8000, + contextTokens: 25000, + }, +} + +export const WithoutCache: Story = { + args: { + ...Default.args, + doesModelSupportPromptCache: false, + cacheWrites: undefined, + cacheReads: undefined, + }, +} diff --git a/webview-ui/src/components/common/CodeAccordian.stories.tsx b/webview-ui/src/components/common/CodeAccordian.stories.tsx new file mode 100644 index 00000000000..d50576b5935 --- /dev/null +++ b/webview-ui/src/components/common/CodeAccordian.stories.tsx @@ -0,0 +1,110 @@ +import type { Meta, StoryObj } from "@storybook/react" +import CodeAccordian from "./CodeAccordian" + +const meta = { + title: "Common/CodeAccordian", + component: CodeAccordian, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +const sampleCode = `function calculateSum(a: number, b: number): number { + return a + b; +} + +// Example usage +const result = calculateSum(5, 3); +console.log(result); // 8` + +export const Default: Story = { + args: { + code: sampleCode, + path: "src/utils/math.ts", + isExpanded: false, + onToggleExpand: () => {}, + }, +} + +export const Expanded: Story = { + args: { + ...Default.args, + isExpanded: true, + }, +} + +export const WithDiff: Story = { + args: { + diff: `- function oldSum(a, b) { +- return a + b; +- } ++ function calculateSum(a: number, b: number): number { ++ return a + b; ++ }`, + path: "src/utils/math.ts", + isExpanded: true, + onToggleExpand: () => {}, + }, +} + +export const ConsoleLogs: Story = { + args: { + code: `Server started on port 3000 +Connected to database +[INFO] User authentication successful +[ERROR] Failed to load resource`, + isConsoleLogs: true, + isExpanded: true, + onToggleExpand: () => {}, + }, +} + +export const UserFeedback: Story = { + args: { + code: `function greet(name: string) { + console.log(\`Hello, \${name}!\`); +}`, + isFeedback: true, + isExpanded: true, + onToggleExpand: () => {}, + }, +} + +export const Loading: Story = { + args: { + code: sampleCode, + path: "src/utils/math.ts", + isExpanded: true, + onToggleExpand: () => {}, + isLoading: true, + }, +} + +export const LongPath: Story = { + args: { + code: sampleCode, + path: "very/long/path/to/the/source/code/file/that/should/be/truncated/with/ellipsis/math.ts", + isExpanded: false, + onToggleExpand: () => {}, + }, +} + +export const WithCustomLanguage: Story = { + args: { + code: ".container {\n display: flex;\n align-items: center;\n}", + path: "styles.css", + language: "css", + isExpanded: true, + onToggleExpand: () => {}, + }, +} diff --git a/webview-ui/src/components/common/CodeBlock.stories.tsx b/webview-ui/src/components/common/CodeBlock.stories.tsx new file mode 100644 index 00000000000..b3bd9ae326a --- /dev/null +++ b/webview-ui/src/components/common/CodeBlock.stories.tsx @@ -0,0 +1,145 @@ +import type { Meta, StoryObj } from "@storybook/react" +import CodeBlock from "./CodeBlock" +import { ExtensionStateContextProvider } from "../../context/ExtensionStateContext" + +const meta = { + title: "Common/CodeBlock", + component: CodeBlock, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +export const JavaScript: Story = { + args: { + source: `\`\`\`javascript +const greeting = "Hello, World!"; +console.log(greeting); + +function add(a, b) { + return a + b; +} + +// Example usage +const result = add(5, 3); +console.log(result); // 8 +\`\`\``, + }, +} + +export const TypeScript: Story = { + args: { + source: `\`\`\`typescript +interface User { + id: number; + name: string; + email: string; +} + +class UserService { + private users: User[] = []; + + addUser(user: User): void { + this.users.push(user); + } + + getUser(id: number): User | undefined { + return this.users.find(user => user.id === id); + } +} +\`\`\``, + }, +} + +export const WithDiff: Story = { + args: { + source: `\`\`\`diff +- const oldFunction = (x) => { +- return x * 2; +- } ++ const newFunction = (x: number): number => { ++ return x * 2; ++ } +\`\`\``, + }, +} + +export const LongContent: Story = { + args: { + source: `\`\`\`typescript +${Array(20) + .fill( + ` +interface Props { + title: string; + description: string; + onClick: () => void; +} + +const Component: React.FC = ({ title, description, onClick }) => { + return ( +
+

{title}

+

{description}

+
+ ); +}; +`, + ) + .join("\n")} +\`\`\``, + }, +} + +export const ForceWrap: Story = { + args: { + source: `\`\`\`typescript +const veryLongLine = "This is a very long line of code that would normally require horizontal scrolling but with forceWrap enabled it will wrap to the next line instead of creating a horizontal scrollbar which can be useful in certain situations where you want to ensure all content is visible without scrolling horizontally"; + +const anotherLongLine = "Here's another example of a long line that demonstrates the text wrapping behavior when forceWrap is set to true in the CodeBlock component's props"; +\`\`\``, + forceWrap: true, + }, +} + +export const MultipleCodeBlocks: Story = { + args: { + source: ` +Here's a JavaScript example: + +\`\`\`javascript +const greeting = "Hello!"; +console.log(greeting); +\`\`\` + +And here's some TypeScript: + +\`\`\`typescript +interface Greeting { + message: string; +} +\`\`\` + +Finally, some CSS: + +\`\`\`css +.greeting { + color: blue; + font-size: 16px; +} +\`\`\` +`, + }, +} diff --git a/webview-ui/src/components/common/MarkdownBlock.stories.tsx b/webview-ui/src/components/common/MarkdownBlock.stories.tsx new file mode 100644 index 00000000000..1250102c351 --- /dev/null +++ b/webview-ui/src/components/common/MarkdownBlock.stories.tsx @@ -0,0 +1,153 @@ +import type { Meta, StoryObj } from "@storybook/react" +import MarkdownBlock from "./MarkdownBlock" +import { ExtensionStateContextProvider } from "../../context/ExtensionStateContext" + +const meta = { + title: "Common/MarkdownBlock", + component: MarkdownBlock, + parameters: { + layout: "padded", + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +export const SimpleText: Story = { + args: { + markdown: "This is a simple paragraph of text.", + }, +} + +export const WithFormatting: Story = { + args: { + markdown: `# Heading 1 +## Heading 2 +### Heading 3 + +**Bold text** and *italic text* + +* Bullet point 1 +* Bullet point 2 + * Nested bullet point + +1. Numbered item 1 +2. Numbered item 2 + 1. Nested numbered item`, + }, +} + +export const WithCodeBlocks: Story = { + args: { + markdown: `Here's some inline \`code\` and a code block: + +\`\`\`typescript +interface User { + id: number; + name: string; + email: string; +} + +function greetUser(user: User) { + console.log(\`Hello, \${user.name}!\`); +} +\`\`\``, + }, +} + +export const WithLinks: Story = { + args: { + markdown: `Here are some links: +* [Link with text](https://example.com) +* Plain URL: https://example.com +* Another URL in text: Check out https://github.com for more info.`, + }, +} + +export const WithDiffBlocks: Story = { + args: { + markdown: `Here's a diff block showing changes: + +\`\`\`diff +- const oldFunction = (x) => { +- return x * 2; +- } ++ const newFunction = (x: number): number => { ++ return x * 2; ++ } +\`\`\``, + }, +} + +export const ComplexContent: Story = { + args: { + markdown: `# Project Documentation + +## Overview +This project implements a React component library with TypeScript support. + +### Installation +\`\`\`bash +npm install @my/components +\`\`\` + +### Usage Example +Here's how to use the main component: + +\`\`\`typescript +import { Button } from '@my/components'; + +function App() { + return ( + + ); +} +\`\`\` + +### Key Features +* 🚀 **Performance Optimized** +* 💅 *Fully Styled* +* 📱 Responsive Design + +For more information, visit https://example.com/docs + +> Note: This is a blockquote with some important information.`, + }, +} + +export const WithTables: Story = { + args: { + markdown: `| Feature | Status | Notes | +|---------|--------|-------| +| Authentication | ✅ Done | Implemented with JWT | +| Authorization | 🚧 WIP | Role-based access | +| API Integration | ❌ Todo | Planned for v2 |`, + }, +} + +export const WithTaskLists: Story = { + args: { + markdown: `Project Tasks: +- [x] Setup project +- [x] Add core components +- [ ] Write documentation +- [ ] Add tests + - [x] Unit tests + - [ ] Integration tests + - [ ] E2E tests`, + }, +} diff --git a/webview-ui/src/components/common/Thumbnails.tsx b/webview-ui/src/components/common/Thumbnails.tsx index 63f326ecbc2..f035209690e 100644 --- a/webview-ui/src/components/common/Thumbnails.tsx +++ b/webview-ui/src/components/common/Thumbnails.tsx @@ -66,6 +66,7 @@ const Thumbnails = ({ images, style, setImages, onHeightChange }: ThumbnailsProp /> {isDeletable && hoveredIndex === index && (
handleDelete(index)} style={{ position: "absolute", diff --git a/webview-ui/vite.config.ts b/webview-ui/vite.config.ts index 3a0aabbd31b..1faa1582f52 100644 --- a/webview-ui/vite.config.ts +++ b/webview-ui/vite.config.ts @@ -36,5 +36,6 @@ export default defineConfig({ define: { "process.platform": JSON.stringify(process.platform), "process.env.VSCODE_TEXTMATE_DEBUG": JSON.stringify(process.env.VSCODE_TEXTMATE_DEBUG), + "process.env.STORYBOOK": JSON.stringify("true"), }, }) From 0ca5cdce05939629dc1fe0a30dc6142db54fd221 Mon Sep 17 00:00:00 2001 From: Chad Gauthier Date: Mon, 24 Feb 2025 00:36:41 -0600 Subject: [PATCH 2/3] Redesign Chat Window and Fix Chat Disabling Issue --- .changeset/quiet-boxes-smoke.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-boxes-smoke.md diff --git a/.changeset/quiet-boxes-smoke.md b/.changeset/quiet-boxes-smoke.md new file mode 100644 index 00000000000..f7ab84a131d --- /dev/null +++ b/.changeset/quiet-boxes-smoke.md @@ -0,0 +1,5 @@ +--- +"roo-cline": minor +--- + +Redesign chat window, update start screen, fix chat disabling, add Storybook stories. From adbf28376db84d92f275ef82c45b8fb50d28f3c7 Mon Sep 17 00:00:00 2001 From: Chad Gauthier Date: Mon, 24 Feb 2025 01:37:21 -0600 Subject: [PATCH 3/3] remove dup CSS, fix enhancing animation --- webview-ui/.storybook/preview.css | 47 --------------- .../chat/ChatTextArea/ChatTextArea.module.css | 59 ++++++++++++++----- .../ChatTextArea/ChatTextArea.stories.tsx | 2 +- .../chat/ChatTextArea/ChatTextArea.tsx | 3 +- .../chat/ChatTextArea/ChatTextAreaActions.tsx | 26 ++++---- .../chat/__tests__/ChatTextArea.test.tsx | 3 +- 6 files changed, 60 insertions(+), 80 deletions(-) diff --git a/webview-ui/.storybook/preview.css b/webview-ui/.storybook/preview.css index 6150dbc9789..ce4f0a52382 100644 --- a/webview-ui/.storybook/preview.css +++ b/webview-ui/.storybook/preview.css @@ -108,50 +108,3 @@ body { ::-webkit-scrollbar-thumb:hover { background: #686868; } - -/* Dark theme */ -.dark { - color-scheme: dark; - background-color: var(--vscode-editor-background); - color: var(--vscode-editor-foreground); -} - -/* Light theme */ -.light { - color-scheme: light; - background-color: #ffffff; - color: #000000; -} - -/* Global styles */ -body { - margin: 0; - padding: 0; - font-family: var(--vscode-font-family); - font-size: var(--vscode-font-size); - line-height: 1.4; -} - -/* Mermaid diagram styles */ -.mermaid { - background: var(--vscode-editor-background); -} - -/* VS Code scrollbar styles */ -::-webkit-scrollbar { - width: 10px; - height: 10px; -} - -::-webkit-scrollbar-track { - background: transparent; -} - -::-webkit-scrollbar-thumb { - background: #424242; - border-radius: 5px; -} - -::-webkit-scrollbar-thumb:hover { - background: #686868; -} diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css index a36625e43bb..30371971614 100644 --- a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.module.css @@ -55,30 +55,61 @@ opacity: 1; } -.action-button.disabled { - opacity: 0.35; - cursor: not-allowed; - filter: grayscale(30%); +.codicon-sparkle { + transition: all 0.3s ease; + z-index: 1; } -.action-button.disabled:hover { - background-color: transparent; +.codicon-sparkle:hover { + filter: brightness(1.2); } -/* Loading spinner styles */ -.action-button.codicon-loading { - animation: spin 1s linear infinite; +.enhancing { + position: relative; + background: transparent !important; + opacity: 1 !important; +} + +.enhancing::after { + content: ""; + position: absolute; + inset: -2px; + border-radius: 8px; + background: linear-gradient( + 45deg, + var(--vscode-button-background), + var(--vscode-textLink-foreground), + var(--vscode-symbolIcon-classForeground), + var(--vscode-button-background) + ); + background-size: 400% 400%; + opacity: 0.08; + z-index: 0; + animation: border-flow 2s ease-in-out infinite; } -@keyframes spin { - from { - transform: rotate(0deg); +@keyframes border-flow { + 0%, + 100% { + background-position: 0% 50%; + opacity: 0.08; } - to { - transform: rotate(360deg); + 50% { + background-position: 100% 50%; + opacity: 0.12; } } +.disabled:not(.enhancing) { + opacity: 0.35; + cursor: not-allowed; + filter: grayscale(30%); +} + +.disabled:not(.enhancing):hover { + background-color: transparent; +} + /* Desktop styles */ @media (min-width: 1024px) { .action-button { diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx index 044423a4b93..fd836df2c80 100644 --- a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.stories.tsx @@ -19,7 +19,7 @@ const meta = { } satisfies Meta export default meta -type Story = StoryObj +type Story = StoryObj const onHeightChangeSpy = fn() diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx index 059f532d375..f8ec99b6239 100644 --- a/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextArea.tsx @@ -65,7 +65,7 @@ const ChatTextArea = forwardRef( } window.addEventListener("message", messageHandler) return () => window.removeEventListener("message", messageHandler) - }, [setInputValue]) + }, [setInputValue, setIsEnhancingPrompt]) return ( @@ -108,6 +108,7 @@ const ChatTextArea = forwardRef( setInputValue={setInputValue} onSelectImages={onSelectImages} onSend={onSend} + setIsEnhancingPrompt={setIsEnhancingPrompt} /> ), }} diff --git a/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx index b9724c55335..412cf2f15ff 100644 --- a/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx +++ b/webview-ui/src/components/chat/ChatTextArea/ChatTextAreaActions.tsx @@ -10,6 +10,7 @@ interface ChatTextAreaActionsProps { setInputValue: (value: string) => void onSelectImages: () => void onSend: () => void + setIsEnhancingPrompt: (value: boolean) => void } const ChatTextAreaActions: React.FC = ({ @@ -20,11 +21,13 @@ const ChatTextAreaActions: React.FC = ({ setInputValue, onSelectImages, onSend, + setIsEnhancingPrompt, }) => { const handleEnhancePrompt = () => { if (!textAreaDisabled) { const trimmedInput = inputValue.trim() if (trimmedInput) { + setIsEnhancingPrompt(true) const message = { type: "enhancePrompt" as const, text: trimmedInput, @@ -55,21 +58,14 @@ const ChatTextAreaActions: React.FC = ({ gap: "2px", flexShrink: 0, }}> - {isEnhancingPrompt ? ( - - ) : ( - !textAreaDisabled && handleEnhancePrompt()} - style={{ fontSize: 16 }} - className={`codicon codicon-sparkle ${styles["action-button"]} ${textAreaDisabled ? styles.disabled : ""}`} - /> - )} + !textAreaDisabled && !isEnhancingPrompt && handleEnhancePrompt()} + style={{ fontSize: 16 }} + className={`codicon codicon-sparkle ${styles["action-button"]} ${styles["codicon-sparkle"]} ${textAreaDisabled ? styles.disabled : ""} ${isEnhancingPrompt ? styles.enhancing : ""}`} + />
{ const enhanceButton = screen.getByRole("button", { name: /enhance prompt/i }) fireEvent.click(enhanceButton) - const loadingSpinner = screen.getByText("", { selector: ".codicon-loading" }) - expect(loadingSpinner).toBeInTheDocument() + expect(enhanceButton).toHaveClass("enhancing") }) })