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",
}}
/>
)}
-
-
-
-
-
{
- const value = e.target.value
- if (value === "prompts-action") {
- window.postMessage({ type: "action", action: "promptsButtonClicked" })
- return
- }
- setMode(value as Mode)
- vscode.postMessage({
- type: "mode",
- text: value,
- })
- }}
- style={{
- ...selectStyle,
- minWidth: "70px",
- flex: "0 0 auto",
- }}>
- {getAllModes(customModes).map((mode) => (
-
- {mode.name}
-
- ))}
-
- ────
-
-
- Edit...
-
-
-
-
-
-
-
-
-
{
- const value = e.target.value
- if (value === "settings-action") {
- window.postMessage({ type: "action", action: "settingsButtonClicked" })
- return
- }
- vscode.postMessage({
- type: "loadApiConfiguration",
- text: value,
- })
- }}
- style={{
- ...selectStyle,
- width: "100%",
- textOverflow: "ellipsis",
- }}>
- {(listApiConfigMeta || []).map((config) => (
-
- {config.name}
-
- ))}
-
- ────
-
-
- Edit...
-
-
-
-
-
-
-
-
-
-
- {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 */}
+
+
{
+ const value = e.target.value
+ if (value === "prompts-action") {
+ window.postMessage({ type: "action", action: "promptsButtonClicked" })
+ return
+ }
+ setMode(value as Mode)
+ vscode.postMessage({
+ type: "mode",
+ text: value,
+ })
+ }}
+ style={{
+ ...selectStyle,
+ ...hoverStyle,
+ }}>
+ {getAllModes(customModes).map((mode) => (
+
+ {mode.name}
+
+ ))}
+
+ ────
+
+
+ Edit...
+
+
+
+
+
+
+
+ {/* API Config Dropdown */}
+
+
{
+ const value = e.target.value
+ if (value === "settings-action") {
+ window.postMessage({ type: "action", action: "settingsButtonClicked" })
+ return
+ }
+ vscode.postMessage({
+ type: "loadApiConfiguration",
+ text: value,
+ })
+ }}
+ style={{
+ ...selectStyle,
+ ...hoverStyle,
+ textOverflow: "ellipsis",
+ }}>
+ {(listApiConfigMeta || []).map((config) => (
+
+ {config.name}
+
+ ))}
+
+ ────
+
+
+ Edit...
+
+
+
+
+
+
+
+ )
+}
+
+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 (
+ console.log('Clicked!')}
+ >
+ Click Me
+
+ );
+}
+\`\`\`
+
+### 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")
})
})