From dc03efe867b8d5dacedb080aef9808dc51ae553d Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 07:21:19 +1000 Subject: [PATCH 01/12] static settings page and toggles --- ui/desktop/src/ChatWindow.tsx | 2 + ui/desktop/src/components/MoreMenu.tsx | 11 ++ ui/desktop/src/components/Settings.tsx | 183 ++++++++++++++++++ .../src/components/settings/KeyItem.tsx | 26 +++ .../src/components/settings/SectionHeader.tsx | 21 ++ .../src/components/settings/SettingItem.tsx | 87 +++++++++ .../components/settings/SettingsSection.tsx | 34 ++++ 7 files changed, 364 insertions(+) create mode 100644 ui/desktop/src/components/Settings.tsx create mode 100644 ui/desktop/src/components/settings/KeyItem.tsx create mode 100644 ui/desktop/src/components/settings/SectionHeader.tsx create mode 100644 ui/desktop/src/components/settings/SettingItem.tsx create mode 100644 ui/desktop/src/components/settings/SettingsSection.tsx diff --git a/ui/desktop/src/ChatWindow.tsx b/ui/desktop/src/ChatWindow.tsx index 124fcfa60..efc212ac0 100644 --- a/ui/desktop/src/ChatWindow.tsx +++ b/ui/desktop/src/ChatWindow.tsx @@ -16,6 +16,7 @@ import { askAi } from './utils/askAI'; import WingToWing, { Working } from './components/WingToWing'; import { WelcomeScreen } from './components/WelcomeScreen'; import FlappyGoose from './components/FlappyGoose'; +import Settings from './components/Settings'; // update this when you want to show the welcome screen again - doesn't have to be an actual version, just anything woudln't have been seen before const CURRENT_VERSION = '0.0.0'; @@ -453,6 +454,7 @@ export default function ChatWindow() { /> } /> + } /> } /> diff --git a/ui/desktop/src/components/MoreMenu.tsx b/ui/desktop/src/components/MoreMenu.tsx index ee763ab58..4a8f486ce 100644 --- a/ui/desktop/src/components/MoreMenu.tsx +++ b/ui/desktop/src/components/MoreMenu.tsx @@ -2,9 +2,11 @@ import React, {useState, useEffect} from 'react'; import {Popover, PopoverContent, PopoverTrigger} from './ui/popover'; import VertDots from './ui/VertDots'; import {FaSun, FaMoon} from 'react-icons/fa'; +import { useNavigate } from 'react-router-dom'; export default function MoreMenu() { + const navigate = useNavigate(); const [open, setOpen] = useState(false); const [useSystemTheme, setUseSystemTheme] = useState(() => @@ -110,6 +112,15 @@ export default function MoreMenu() { )} + +
+ {['Models', 'MCPs', 'Keys'].map((section) => ( + + {section} + + ))} +
+ + + + {/* Content Area */} +
+
+ {/* Models Section */} +
+
+

Models

+ +
+ {Object.entries(models).map(([id, enabled]) => ( +
+
+

+ {id === 'gpt4' ? 'GPT 4.0' : + id === 'gpt4lite' ? 'GPT 4.0 lite' : 'Claude'} +

+ +
+

+ Standard config +

+
+ ))} +
+ + {/* MCPs Section */} +
+
+

MCPs

+ +
+

{MCP_DESCRIPTION}

+ {Object.entries(mcps).map(([id, enabled]) => ( +
+
+

+ {id === 'fileviewer' ? 'File viewer' : + id === 'cloudthing' ? 'Cloud thing' : + id === 'mcpdice' ? 'MCP dice' : 'Binance market data'} +

+ +
+

+ Standard config +

+
+ ))} +
+ + {/* Keys Section */} +
+
+

Keys

+ +
+

{MCP_DESCRIPTION}

+ {['GISKey', 'AWScognito'].map(key => ( +
+
+

{key}

+
+ {'*'.repeat(17)} + +
+
+
+ ))} +
+
+
+ + + + + + ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/KeyItem.tsx b/ui/desktop/src/components/settings/KeyItem.tsx new file mode 100644 index 000000000..a0302a691 --- /dev/null +++ b/ui/desktop/src/components/settings/KeyItem.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export interface KeyItemProps { + name: string; + value: string; + onEdit: () => void; +} + +export function KeyItem({ name, value, onEdit }: KeyItemProps) { + return ( +
+
+

{name}

+
+ {value} + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/SectionHeader.tsx b/ui/desktop/src/components/settings/SectionHeader.tsx new file mode 100644 index 000000000..01ff2aa34 --- /dev/null +++ b/ui/desktop/src/components/settings/SectionHeader.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +interface SectionHeaderProps { + title: string; + buttonText?: string; + onAction: () => void; +} + +export function SectionHeader({ title, buttonText, onAction }: SectionHeaderProps) { + return ( +
+

{title}

+ +
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/SettingItem.tsx b/ui/desktop/src/components/settings/SettingItem.tsx new file mode 100644 index 000000000..53a34b6f5 --- /dev/null +++ b/ui/desktop/src/components/settings/SettingItem.tsx @@ -0,0 +1,87 @@ +import React from 'react'; + +type SettingValue = boolean | string | number; + +interface BaseSettingItem { + id: string; + title: string; + description: string; + type: 'toggle' | 'text' | 'password' | 'number'; + value: SettingValue; + onChange: (value: SettingValue) => void; + behavior?: { + // For toggle type - if true, will deactivate other items in the same group + exclusive?: boolean; + // For toggle type - if true, cannot be turned off directly + requireActive?: boolean; + // Group ID for related settings (like all models, all MCPs, etc) + group?: string; + }; +} + +export function SettingItem({ + title, + description, + type, + value, + onChange, + behavior +}: BaseSettingItem) { + const renderInput = () => { + switch (type) { + case 'toggle': + return ( + + ); + case 'text': + case 'password': + return ( + onChange(e.target.value)} + className="bg-transparent border-b border-gray-300 dark:border-gray-600 focus:outline-none focus:border-indigo-500" + /> + ); + case 'number': + return ( + onChange(Number(e.target.value))} + className="bg-transparent border-b border-gray-300 dark:border-gray-600 focus:outline-none focus:border-indigo-500" + /> + ); + } + }; + + return ( +
+
+

{title}

+ {renderInput()} +
+

{description}

+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/SettingsSection.tsx b/ui/desktop/src/components/settings/SettingsSection.tsx new file mode 100644 index 000000000..d63db89b9 --- /dev/null +++ b/ui/desktop/src/components/settings/SettingsSection.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { SectionHeader } from './SectionHeader'; + +interface SettingsSectionProps { + title: string; + buttonText?: string; + onAction: () => void; + description?: string; + children: React.ReactNode; +} + +export function SettingsSection({ + title, + buttonText, + onAction, + description, + children +}: SettingsSectionProps) { + return ( +
+ + {description && ( +
+ {description} +
+ )} + {children} +
+ ); +} \ No newline at end of file From c007c5a7d415157273266399a3731931dcaae2ef Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 07:23:24 +1000 Subject: [PATCH 02/12] move settings file --- .../src/components/settings/Settings.tsx | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 ui/desktop/src/components/settings/Settings.tsx diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx new file mode 100644 index 000000000..5fa884718 --- /dev/null +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -0,0 +1,183 @@ +import React from 'react'; +import { ScrollArea } from '../ui/scroll-area'; +import { Card } from '../ui/card'; +import { useNavigate } from 'react-router-dom'; + +const MCP_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; + +export default function Settings() { + const navigate = useNavigate(); + const [models, setModels] = React.useState({ + gpt4: false, + gpt4lite: false, + claude: true, + }); + const [mcps, setMcps] = React.useState({ + fileviewer: true, + cloudthing: true, + mcpdice: true, + binancedata: true, + }); + + const handleModelToggle = (modelId: string) => { + // Only allow one model to be active + setModels(Object.keys(models).reduce((acc, key) => ({ + ...acc, + [key]: key === modelId + }), {})); + }; + + const handleMcpToggle = (mcpId: string) => { + setMcps(prev => ({ + ...prev, + [mcpId]: !prev[mcpId] + })); + }; + + return ( +
+ +
+ +
+ {/* Left Navigation */} +
+
+ +
+ {['Models', 'MCPs', 'Keys'].map((section) => ( + + {section} + + ))} +
+
+
+ + {/* Content Area */} +
+
+ {/* Models Section */} +
+
+

Models

+ +
+ {Object.entries(models).map(([id, enabled]) => ( +
+
+

+ {id === 'gpt4' ? 'GPT 4.0' : + id === 'gpt4lite' ? 'GPT 4.0 lite' : 'Claude'} +

+ +
+

+ Standard config +

+
+ ))} +
+ + {/* MCPs Section */} +
+
+

MCPs

+ +
+

{MCP_DESCRIPTION}

+ {Object.entries(mcps).map(([id, enabled]) => ( +
+
+

+ {id === 'fileviewer' ? 'File viewer' : + id === 'cloudthing' ? 'Cloud thing' : + id === 'mcpdice' ? 'MCP dice' : 'Binance market data'} +

+ +
+

+ Standard config +

+
+ ))} +
+ + {/* Keys Section */} +
+
+

Keys

+ +
+

{MCP_DESCRIPTION}

+ {['GISKey', 'AWScognito'].map(key => ( +
+
+

{key}

+
+ {'*'.repeat(17)} + +
+
+
+ ))} +
+
+
+
+
+
+
+
+ ); +} \ No newline at end of file From e884ea469a562de21458e30aae6c3b1d82066955 Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 07:23:41 +1000 Subject: [PATCH 03/12] move settings file --- ui/desktop/src/ChatWindow.tsx | 2 +- ui/desktop/src/components/Settings.tsx | 183 ------------------------- 2 files changed, 1 insertion(+), 184 deletions(-) delete mode 100644 ui/desktop/src/components/Settings.tsx diff --git a/ui/desktop/src/ChatWindow.tsx b/ui/desktop/src/ChatWindow.tsx index efc212ac0..c91505012 100644 --- a/ui/desktop/src/ChatWindow.tsx +++ b/ui/desktop/src/ChatWindow.tsx @@ -16,7 +16,7 @@ import { askAi } from './utils/askAI'; import WingToWing, { Working } from './components/WingToWing'; import { WelcomeScreen } from './components/WelcomeScreen'; import FlappyGoose from './components/FlappyGoose'; -import Settings from './components/Settings'; +import Settings from './components/settings/Settings'; // update this when you want to show the welcome screen again - doesn't have to be an actual version, just anything woudln't have been seen before const CURRENT_VERSION = '0.0.0'; diff --git a/ui/desktop/src/components/Settings.tsx b/ui/desktop/src/components/Settings.tsx deleted file mode 100644 index 7478ba079..000000000 --- a/ui/desktop/src/components/Settings.tsx +++ /dev/null @@ -1,183 +0,0 @@ -import React from 'react'; -import { ScrollArea } from './ui/scroll-area'; -import { Card } from './ui/card'; -import { useNavigate } from 'react-router-dom'; - -const MCP_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; - -export default function Settings() { - const navigate = useNavigate(); - const [models, setModels] = React.useState({ - gpt4: false, - gpt4lite: false, - claude: true, - }); - const [mcps, setMcps] = React.useState({ - fileviewer: true, - cloudthing: true, - mcpdice: true, - binancedata: true, - }); - - const handleModelToggle = (modelId: string) => { - // Only allow one model to be active - setModels(Object.keys(models).reduce((acc, key) => ({ - ...acc, - [key]: key === modelId - }), {})); - }; - - const handleMcpToggle = (mcpId: string) => { - setMcps(prev => ({ - ...prev, - [mcpId]: !prev[mcpId] - })); - }; - - return ( -
- -
- -
- {/* Left Navigation */} -
-
- -
- {['Models', 'MCPs', 'Keys'].map((section) => ( - - {section} - - ))} -
-
-
- - {/* Content Area */} -
-
- {/* Models Section */} -
-
-

Models

- -
- {Object.entries(models).map(([id, enabled]) => ( -
-
-

- {id === 'gpt4' ? 'GPT 4.0' : - id === 'gpt4lite' ? 'GPT 4.0 lite' : 'Claude'} -

- -
-

- Standard config -

-
- ))} -
- - {/* MCPs Section */} -
-
-

MCPs

- -
-

{MCP_DESCRIPTION}

- {Object.entries(mcps).map(([id, enabled]) => ( -
-
-

- {id === 'fileviewer' ? 'File viewer' : - id === 'cloudthing' ? 'Cloud thing' : - id === 'mcpdice' ? 'MCP dice' : 'Binance market data'} -

- -
-

- Standard config -

-
- ))} -
- - {/* Keys Section */} -
-
-

Keys

- -
-

{MCP_DESCRIPTION}

- {['GISKey', 'AWScognito'].map(key => ( -
-
-

{key}

-
- {'*'.repeat(17)} - -
-
-
- ))} -
-
-
-
-
-
-
-
- ); -} \ No newline at end of file From 537707fce7e3535a88279f76f9231e31745ea5bf Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 07:43:25 +1000 Subject: [PATCH 04/12] fix more menu disappearing --- ui/desktop/src/ChatWindow.tsx | 11 +-- ui/desktop/src/components/MoreMenu.tsx | 9 +- .../src/components/settings/Settings.tsx | 90 +++++++++++++------ 3 files changed, 74 insertions(+), 36 deletions(-) diff --git a/ui/desktop/src/ChatWindow.tsx b/ui/desktop/src/ChatWindow.tsx index c91505012..dc2501047 100644 --- a/ui/desktop/src/ChatWindow.tsx +++ b/ui/desktop/src/ChatWindow.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef, useState } from 'react'; import { Message, useChat } from './ai-sdk-fork/useChat'; -import { Route, Routes, Navigate } from 'react-router-dom'; +import { Route, Routes, Navigate, useLocation } from 'react-router-dom'; import { getApiUrl } from './config'; import { Card } from './components/ui/card'; import { ScrollArea } from './components/ui/scroll-area'; @@ -428,13 +428,9 @@ export default function ChatWindow() {
{apiCredsMissing ? ( -
- -
+ ) : showWelcome && (!window.appConfig.get("REQUEST_DIR")) ? ( -
- -
+ ) : ( <>
@@ -458,7 +454,6 @@ export default function ChatWindow() { } />
- )} diff --git a/ui/desktop/src/components/MoreMenu.tsx b/ui/desktop/src/components/MoreMenu.tsx index 4a8f486ce..2174906bf 100644 --- a/ui/desktop/src/components/MoreMenu.tsx +++ b/ui/desktop/src/components/MoreMenu.tsx @@ -2,11 +2,11 @@ import React, {useState, useEffect} from 'react'; import {Popover, PopoverContent, PopoverTrigger} from './ui/popover'; import VertDots from './ui/VertDots'; import {FaSun, FaMoon} from 'react-icons/fa'; -import { useNavigate } from 'react-router-dom'; - +import { useNavigate, useLocation } from 'react-router-dom'; export default function MoreMenu() { const navigate = useNavigate(); + const location = useLocation(); const [open, setOpen] = useState(false); const [useSystemTheme, setUseSystemTheme] = useState(() => @@ -78,6 +78,11 @@ export default function MoreMenu() { // If disabling system theme, keep current theme state but don't update localStorage yet }; + // Close the menu when navigating + useEffect(() => { + setOpen(false); + }, [location.pathname]); + return ( diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx index 5fa884718..dcad7a183 100644 --- a/ui/desktop/src/components/settings/Settings.tsx +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -3,22 +3,42 @@ import { ScrollArea } from '../ui/scroll-area'; import { Card } from '../ui/card'; import { useNavigate } from 'react-router-dom'; -const MCP_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; +const EXTENSIONS_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; export default function Settings() { const navigate = useNavigate(); - const [models, setModels] = React.useState({ - gpt4: false, - gpt4lite: false, - claude: true, + + // Initialize models state from localStorage or use default values + const [models, setModels] = React.useState(() => { + const savedModels = localStorage.getItem('settings_models'); + return savedModels ? JSON.parse(savedModels) : { + gpt4: false, + gpt4lite: false, + claude: true, + }; }); - const [mcps, setMcps] = React.useState({ - fileviewer: true, - cloudthing: true, - mcpdice: true, - binancedata: true, + + // Initialize extensions state from localStorage or use default values + const [extensions, setExtensions] = React.useState(() => { + const savedExtensions = localStorage.getItem('settings_extensions'); + return savedExtensions ? JSON.parse(savedExtensions) : { + fileviewer: true, + cloudthing: true, + mcpdice: true, + binancedata: true, + }; }); + // Save models state to localStorage whenever it changes + React.useEffect(() => { + localStorage.setItem('settings_models', JSON.stringify(models)); + }, [models]); + + // Save extensions state to localStorage whenever it changes + React.useEffect(() => { + localStorage.setItem('settings_extensions', JSON.stringify(extensions)); + }, [extensions]); + const handleModelToggle = (modelId: string) => { // Only allow one model to be active setModels(Object.keys(models).reduce((acc, key) => ({ @@ -27,13 +47,31 @@ export default function Settings() { }), {})); }; - const handleMcpToggle = (mcpId: string) => { - setMcps(prev => ({ + const handleExtensionToggle = (extensionId: string) => { + setExtensions(prev => ({ ...prev, - [mcpId]: !prev[mcpId] + [extensionId]: !prev[extensionId] })); }; + const handleNavClick = (section: string, e: React.MouseEvent) => { + e.preventDefault(); + const scrollArea = document.querySelector('[data-radix-scroll-area-viewport]'); + const element = document.getElementById(section.toLowerCase()); + + if (scrollArea && element) { + const topPos = element.offsetTop; + scrollArea.scrollTo({ + top: topPos, + behavior: 'smooth' + }); + } + }; + + const handleExit = () => { + navigate('/chat/1', { replace: true }); // Use replace to ensure clean navigation + }; + return (
@@ -44,7 +82,7 @@ export default function Settings() {
@@ -108,16 +146,16 @@ export default function Settings() { ))} - {/* MCPs Section */} -
+ {/* Extensions Section (formerly MCPs) */} +
-

MCPs

+

Extensions

-

{MCP_DESCRIPTION}

- {Object.entries(mcps).map(([id, enabled]) => ( +

{EXTENSIONS_DESCRIPTION}

+ {Object.entries(extensions).map(([id, enabled]) => (

@@ -126,7 +164,7 @@ export default function Settings() { id === 'mcpdice' ? 'MCP dice' : 'Binance market data'}

-

{MCP_DESCRIPTION}

+

{EXTENSIONS_DESCRIPTION}

{['GISKey', 'AWScognito'].map(key => (
From 8c6858d6771d96f77bd4f234f2cbacd97697723e Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 08:49:48 +1000 Subject: [PATCH 05/12] fix dialogue popups --- ui/desktop/package-lock.json | 1062 ++++++++++++++++- ui/desktop/package.json | 4 +- .../src/components/settings/KeyItem.tsx | 41 +- .../src/components/settings/Settings.tsx | 251 ++-- .../components/settings/ToggleableItem.tsx | 38 + .../settings/modals/AddExtensionDialog.tsx | 53 + .../settings/modals/AddModelDialog.tsx | 53 + .../components/settings/modals/BaseDialog.tsx | 38 + .../components/settings/modals/KeyDialog.tsx | 63 + ui/desktop/src/components/settings/types.ts | 25 + ui/desktop/src/components/ui/dialog.tsx | 119 ++ ui/desktop/src/utils/cn.ts | 3 + 12 files changed, 1581 insertions(+), 169 deletions(-) create mode 100644 ui/desktop/src/components/settings/ToggleableItem.tsx create mode 100644 ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx create mode 100644 ui/desktop/src/components/settings/modals/AddModelDialog.tsx create mode 100644 ui/desktop/src/components/settings/modals/BaseDialog.tsx create mode 100644 ui/desktop/src/components/settings/modals/KeyDialog.tsx create mode 100644 ui/desktop/src/components/settings/types.ts create mode 100644 ui/desktop/src/components/ui/dialog.tsx create mode 100644 ui/desktop/src/utils/cn.ts diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index 919582bfb..3d025d6bd 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -12,6 +12,7 @@ "@ai-sdk/openai": "^0.0.72", "@ai-sdk/ui-utils": "^1.0.2", "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.4", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-slot": "^1.1.1", @@ -63,6 +64,7 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "postcss": "^8.4.47", + "shadcn-ui": "^0.9.4", "tailwindcss": "^3.4.14", "vite": "^5.0.12" } @@ -397,6 +399,21 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/ni": { + "version": "0.21.12", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.12.tgz", + "integrity": "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==", + "dev": true, + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -480,6 +497,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -507,6 +536,49 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", @@ -539,6 +611,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", @@ -549,6 +633,36 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -606,6 +720,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", @@ -638,6 +767,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", @@ -1952,6 +2100,41 @@ } } }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-dialog": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", + "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", @@ -2190,25 +2373,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", - "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", - "license": "MIT", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz", + "integrity": "sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" + "react-remove-scroll": "^2.6.1" }, "peerDependencies": { "@types/react": "*", @@ -2225,17 +2407,160 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "license": "MIT", + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==" + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz", + "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz", + "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", + "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz", + "integrity": "sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -3429,6 +3754,57 @@ "node": ">= 10" } }, + "node_modules/@ts-morph/common": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz", + "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -4624,6 +5000,18 @@ "node": ">= 6" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -5460,6 +5848,12 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", + "dev": true + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5577,6 +5971,59 @@ "node": ">= 0.10" } }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cosmiconfig/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-dirname": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", @@ -5640,6 +6087,15 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -5889,6 +6345,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-match-patch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", @@ -7225,6 +7690,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "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, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -7622,6 +8100,29 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -7807,6 +8308,18 @@ "node": ">=0.4.x" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8629,6 +9142,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -8782,15 +9304,6 @@ "node": ">=10.13.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -9461,6 +9974,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -9580,6 +10099,15 @@ "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10073,6 +10601,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10827,6 +11361,25 @@ "semver": "^7.3.5" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11378,6 +11931,12 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11870,6 +12429,19 @@ "node": ">=10" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -12101,20 +12673,19 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "license": "MIT", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "dependencies": { - "react-style-singleton": "^2.2.1", + "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -12155,21 +12726,19 @@ } }, "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "license": "MIT", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "dependencies": { "get-nonce": "^1.0.0", - "invariant": "^2.2.4", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -12345,6 +12914,22 @@ "node": ">=8.10.0" } }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -13032,6 +13617,276 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shadcn-ui": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/shadcn-ui/-/shadcn-ui-0.9.4.tgz", + "integrity": "sha512-75nqu4+y4mlhNXGfHPoPd1r2fgqGQgSEPzPe8TV39WRinafKHuBX2xkgoQOwu+NhiRPKV5TrRSCZ5ytGrFU1oQ==", + "dev": true, + "dependencies": { + "@antfu/ni": "^0.21.4", + "@babel/core": "^7.22.1", + "@babel/parser": "^7.22.6", + "@babel/plugin-transform-typescript": "^7.22.5", + "chalk": "5.2.0", + "commander": "^10.0.0", + "cosmiconfig": "^8.1.3", + "diff": "^5.1.0", + "execa": "^7.0.0", + "fast-glob": "^3.3.2", + "fs-extra": "^11.1.0", + "https-proxy-agent": "^6.2.0", + "lodash": "^4.17.21", + "node-fetch": "^3.3.0", + "ora": "^6.1.2", + "prompts": "^2.4.2", + "recast": "^0.23.2", + "ts-morph": "^18.0.0", + "tsconfig-paths": "^4.2.0", + "zod": "^3.20.2" + }, + "bin": { + "shadcn-ui": "dist/index.js" + } + }, + "node_modules/shadcn-ui/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/shadcn-ui/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/shadcn-ui/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/shadcn-ui/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/shadcn-ui/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/shadcn-ui/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/https-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-6.2.1.tgz", + "integrity": "sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/shadcn-ui/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/shadcn-ui/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn-ui/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13078,6 +13933,12 @@ "dev": true, "license": "ISC" }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -13276,6 +14137,56 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13522,6 +14433,18 @@ "node": ">=0.10.0" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -13948,6 +14871,12 @@ "license": "MIT", "optional": true }, + "node_modules/tiny-invariant": { + "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 + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -14060,6 +14989,30 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/ts-morph": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-18.0.0.tgz", + "integrity": "sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.19.0", + "code-block-writer": "^12.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -14395,10 +15348,9 @@ } }, "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "license": "MIT", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "dependencies": { "tslib": "^2.0.0" }, @@ -14406,8 +15358,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -14615,6 +15567,15 @@ "defaults": "^1.0.3" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -15160,7 +16121,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/ui/desktop/package.json b/ui/desktop/package.json index 249c10234..4a809415f 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -41,6 +41,7 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "postcss": "^8.4.47", + "shadcn-ui": "^0.9.4", "tailwindcss": "^3.4.14", "vite": "^5.0.12" }, @@ -50,6 +51,7 @@ "@ai-sdk/openai": "^0.0.72", "@ai-sdk/ui-utils": "^1.0.2", "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.4", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-slot": "^1.1.1", @@ -77,4 +79,4 @@ "tailwind-merge": "^2.5.4", "tailwindcss-animate": "^1.0.7" } -} \ No newline at end of file +} diff --git a/ui/desktop/src/components/settings/KeyItem.tsx b/ui/desktop/src/components/settings/KeyItem.tsx index a0302a691..28c37ca84 100644 --- a/ui/desktop/src/components/settings/KeyItem.tsx +++ b/ui/desktop/src/components/settings/KeyItem.tsx @@ -1,20 +1,43 @@ -import React from 'react'; +import React, { useState } from 'react'; +import { Key } from './types'; -export interface KeyItemProps { - name: string; - value: string; - onEdit: () => void; +interface KeyItemProps { + keyData: Key; + onEdit: (key: Key) => void; + onCopy: (value: string) => void; } -export function KeyItem({ name, value, onEdit }: KeyItemProps) { +export function KeyItem({ keyData, onEdit, onCopy }: KeyItemProps) { + const [isValueVisible, setIsValueVisible] = useState(false); + + const handleCopy = () => { + onCopy(keyData.value); + }; + return (
-

{name}

+

{keyData.name}

- {value} +
+ + {isValueVisible ? keyData.value : '*'.repeat(17)} + + + +
- {Object.entries(models).map(([id, enabled]) => ( -
-
-

- {id === 'gpt4' ? 'GPT 4.0' : - id === 'gpt4lite' ? 'GPT 4.0 lite' : 'Claude'} -

- -
-

- Standard config -

-
+ {settings.models.map(model => ( + ))}
- {/* Extensions Section (formerly MCPs) */} + {/* Extensions Section */}

Extensions

-

{EXTENSIONS_DESCRIPTION}

- {Object.entries(extensions).map(([id, enabled]) => ( -
-
-

- {id === 'fileviewer' ? 'File viewer' : - id === 'cloudthing' ? 'Cloud thing' : - id === 'mcpdice' ? 'MCP dice' : 'Binance market data'} -

- -
-

- Standard config -

-
+ {settings.extensions.map(ext => ( + ))}
@@ -191,23 +207,21 @@ export default function Settings() {

Keys

-

{EXTENSIONS_DESCRIPTION}

- {['GISKey', 'AWScognito'].map(key => ( -
-
-

{key}

-
- {'*'.repeat(17)} - -
-
-
+ {settings.keys.map(keyItem => ( + ))}
@@ -216,6 +230,27 @@ export default function Settings() {
+ + {/* Add the modals */} + setAddModelOpen(false)} + onAdd={handleAddModel} + /> + setAddExtensionOpen(false)} + onAdd={handleAddExtension} + /> + { + setAddKeyOpen(false); + setEditingKey(null); + }} + onSubmit={editingKey ? handleUpdateKey : handleAddKey} + initialKey={editingKey || undefined} + />
); } \ No newline at end of file diff --git a/ui/desktop/src/components/settings/ToggleableItem.tsx b/ui/desktop/src/components/settings/ToggleableItem.tsx new file mode 100644 index 000000000..da941f913 --- /dev/null +++ b/ui/desktop/src/components/settings/ToggleableItem.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +interface ToggleableItemProps { + id: string; + name: string; + description: string; + enabled: boolean; + onToggle: (id: string) => void; +} + +export function ToggleableItem({ + id, + name, + description, + enabled, + onToggle, +}: ToggleableItemProps) { + return ( +
+
+

{name}

+ +
+

{description}

+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx b/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx new file mode 100644 index 000000000..e33dad005 --- /dev/null +++ b/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { BaseDialog } from './BaseDialog'; +import { Extension } from '../types'; +import { Input } from '../../ui/input'; + +interface AddExtensionDialogProps { + isOpen: boolean; + onClose: () => void; + onAdd: (extension: Extension) => void; +} + +export function AddExtensionDialog({ isOpen, onClose, onAdd }: AddExtensionDialogProps) { + const [name, setName] = React.useState(''); + const [description, setDescription] = React.useState('Standard config'); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const id = name.toLowerCase().replace(/\s+/g, '-'); + onAdd({ + id, + name, + description, + enabled: true + }); + onClose(); + setName(''); + setDescription('Standard config'); + }; + + return ( + +
+
+ + setName(e.target.value)} + placeholder="Extension name" + required + /> +
+
+ + setDescription(e.target.value)} + placeholder="Extension description" + /> +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/AddModelDialog.tsx b/ui/desktop/src/components/settings/modals/AddModelDialog.tsx new file mode 100644 index 000000000..3549247b6 --- /dev/null +++ b/ui/desktop/src/components/settings/modals/AddModelDialog.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { BaseDialog } from './BaseDialog'; +import { Model } from '../types'; +import { Input } from '../../ui/input'; + +interface AddModelDialogProps { + isOpen: boolean; + onClose: () => void; + onAdd: (model: Model) => void; +} + +export function AddModelDialog({ isOpen, onClose, onAdd }: AddModelDialogProps) { + const [name, setName] = React.useState(''); + const [description, setDescription] = React.useState('Standard config'); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const id = name.toLowerCase().replace(/\s+/g, '-'); + onAdd({ + id, + name, + description, + enabled: false + }); + onClose(); + setName(''); + setDescription('Standard config'); + }; + + return ( + +
+
+ + setName(e.target.value)} + placeholder="Model name" + required + /> +
+
+ + setDescription(e.target.value)} + placeholder="Model description" + /> +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/BaseDialog.tsx b/ui/desktop/src/components/settings/modals/BaseDialog.tsx new file mode 100644 index 000000000..c999f3741 --- /dev/null +++ b/ui/desktop/src/components/settings/modals/BaseDialog.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '../../ui/dialog'; +import { Button } from '../../ui/button'; + +interface BaseDialogProps { + title: string; + isOpen: boolean; + onClose: () => void; + children: React.ReactNode; +} + +export function BaseDialog({ title, isOpen, onClose, children }: BaseDialogProps) { + return ( + + + + {title} + + {children} +
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/KeyDialog.tsx b/ui/desktop/src/components/settings/modals/KeyDialog.tsx new file mode 100644 index 000000000..c29b2a779 --- /dev/null +++ b/ui/desktop/src/components/settings/modals/KeyDialog.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { BaseDialog } from './BaseDialog'; +import { Key } from '../types'; +import { Input } from '../../ui/input'; + +interface KeyDialogProps { + isOpen: boolean; + onClose: () => void; + onSubmit: (key: Key) => void; + initialKey?: Key; +} + +export function KeyDialog({ isOpen, onClose, onSubmit, initialKey }: KeyDialogProps) { + const [name, setName] = React.useState(initialKey?.name || ''); + const [value, setValue] = React.useState(initialKey?.value || ''); + const isEditing = !!initialKey; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const id = initialKey?.id || name.toLowerCase().replace(/\s+/g, '-'); + onSubmit({ + id, + name, + value + }); + onClose(); + if (!isEditing) { + setName(''); + setValue(''); + } + }; + + return ( + +
+
+ + setName(e.target.value)} + placeholder="Key name" + required + disabled={isEditing} + /> +
+
+ + setValue(e.target.value)} + placeholder="Key value" + required + /> +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/settings/types.ts b/ui/desktop/src/components/settings/types.ts new file mode 100644 index 000000000..821601c12 --- /dev/null +++ b/ui/desktop/src/components/settings/types.ts @@ -0,0 +1,25 @@ +export interface Model { + id: string; + name: string; + description: string; + enabled: boolean; +} + +export interface Extension { + id: string; + name: string; + description: string; + enabled: boolean; +} + +export interface Key { + id: string; + name: string; + value: string; +} + +export interface Settings { + models: Model[]; + extensions: Extension[]; + keys: Key[]; +} \ No newline at end of file diff --git a/ui/desktop/src/components/ui/dialog.tsx b/ui/desktop/src/components/ui/dialog.tsx new file mode 100644 index 000000000..552ed9199 --- /dev/null +++ b/ui/desktop/src/components/ui/dialog.tsx @@ -0,0 +1,119 @@ +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; +import { cn } from "../../utils"; + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/ui/desktop/src/utils/cn.ts b/ui/desktop/src/utils/cn.ts new file mode 100644 index 000000000..ff0b824b7 --- /dev/null +++ b/ui/desktop/src/utils/cn.ts @@ -0,0 +1,3 @@ +export function cn(...classes: (string | undefined | false | null)[]) { + return classes.filter(Boolean).join(" "); +} From 1aaa261dbe17fd2368a73823eac06ffe5c6a1c4f Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 11:00:41 +1000 Subject: [PATCH 06/12] working static state with persisting changes --- .../src/components/settings/KeyItem.tsx | 51 ++++++++----- .../src/components/settings/Settings.tsx | 75 +++++++++++++++++++ .../components/settings/modals/BaseDialog.tsx | 15 ++-- .../components/settings/modals/KeyDialog.tsx | 56 +++++++++++--- .../settings/modals/RevealKeysDialog.tsx | 37 +++++++++ ui/desktop/src/components/ui/Tooltip.tsx | 17 +++++ ui/desktop/src/components/ui/dialog.tsx | 4 +- ui/desktop/src/components/ui/toast.tsx | 22 ++++++ 8 files changed, 239 insertions(+), 38 deletions(-) create mode 100644 ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx create mode 100644 ui/desktop/src/components/ui/Tooltip.tsx create mode 100644 ui/desktop/src/components/ui/toast.tsx diff --git a/ui/desktop/src/components/settings/KeyItem.tsx b/ui/desktop/src/components/settings/KeyItem.tsx index 28c37ca84..a49f223f3 100644 --- a/ui/desktop/src/components/settings/KeyItem.tsx +++ b/ui/desktop/src/components/settings/KeyItem.tsx @@ -1,5 +1,7 @@ import React, { useState } from 'react'; import { Key } from './types'; +import { showToast } from '../ui/toast'; +import { Tooltip } from '../ui/Tooltip'; interface KeyItemProps { keyData: Key; @@ -10,8 +12,13 @@ interface KeyItemProps { export function KeyItem({ keyData, onEdit, onCopy }: KeyItemProps) { const [isValueVisible, setIsValueVisible] = useState(false); - const handleCopy = () => { - onCopy(keyData.value); + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(keyData.value); + showToast(`${keyData.name} copied to clipboard!`, "success"); + } catch (err) { + showToast("Failed to copy the key.", "error"); + } }; return ( @@ -23,25 +30,31 @@ export function KeyItem({ keyData, onEdit, onCopy }: KeyItemProps) { {isValueVisible ? keyData.value : '*'.repeat(17)} - - + + + + +
+ + -
- +
diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx index 266c9ff5d..e2faf35b7 100644 --- a/ui/desktop/src/components/settings/Settings.tsx +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -8,6 +8,9 @@ import { KeyItem } from './KeyItem'; import { AddModelDialog } from './modals/AddModelDialog'; import { AddExtensionDialog } from './modals/AddExtensionDialog'; import { KeyDialog } from './modals/KeyDialog'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog'; +import { Button } from '../ui/button'; +import { RevealKeysDialog } from './modals/RevealKeysDialog'; const EXTENSIONS_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; @@ -83,6 +86,8 @@ export default function Settings() { const [addExtensionOpen, setAddExtensionOpen] = useState(false); const [addKeyOpen, setAddKeyOpen] = useState(false); const [editingKey, setEditingKey] = useState(null); + const [showResetConfirm, setShowResetConfirm] = useState(false); + const [showAllKeys, setShowAllKeys] = useState(false); const handleAddModel = (newModel: Model) => { setSettings(prev => ({ @@ -127,6 +132,20 @@ export default function Settings() { } }; + const handleDeleteKey = (keyToDelete: Key) => { + setSettings(prev => ({ + ...prev, + keys: prev.keys.filter(key => key.id !== keyToDelete.id) + })); + setEditingKey(null); + }; + + const handleReset = () => { + setSettings(DEFAULT_SETTINGS); + setShowResetConfirm(false); + showToast("Settings reset to default", "success"); + }; + return (
@@ -223,7 +242,28 @@ export default function Settings() { onCopy={handleCopyKey} /> ))} + +
+ +
+ + {/* Reset Button */} +
+ +
@@ -231,6 +271,34 @@ export default function Settings() { + {/* Reset Confirmation Dialog */} + + + + Reset Settings + +
+

+ Are you sure you want to reset all settings to their default values? This cannot be undone. +

+
+
+ + +
+
+
+ {/* Add the modals */} + + setShowAllKeys(false)} + keys={settings.keys} + /> ); } \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/BaseDialog.tsx b/ui/desktop/src/components/settings/modals/BaseDialog.tsx index c999f3741..4493f47ef 100644 --- a/ui/desktop/src/components/settings/modals/BaseDialog.tsx +++ b/ui/desktop/src/components/settings/modals/BaseDialog.tsx @@ -11,10 +11,13 @@ interface BaseDialogProps { title: string; isOpen: boolean; onClose: () => void; + onSubmit?: (e: React.FormEvent) => void; children: React.ReactNode; } -export function BaseDialog({ title, isOpen, onClose, children }: BaseDialogProps) { +export function BaseDialog({ title, isOpen, onClose, onSubmit, children }: BaseDialogProps) { + const isEditing = title.startsWith('Edit'); + return ( @@ -23,14 +26,12 @@ export function BaseDialog({ title, isOpen, onClose, children }: BaseDialogProps {children}
- - +
diff --git a/ui/desktop/src/components/settings/modals/KeyDialog.tsx b/ui/desktop/src/components/settings/modals/KeyDialog.tsx index c29b2a779..9d0edf786 100644 --- a/ui/desktop/src/components/settings/modals/KeyDialog.tsx +++ b/ui/desktop/src/components/settings/modals/KeyDialog.tsx @@ -7,14 +7,26 @@ interface KeyDialogProps { isOpen: boolean; onClose: () => void; onSubmit: (key: Key) => void; + onDelete?: (key: Key) => void; initialKey?: Key; } -export function KeyDialog({ isOpen, onClose, onSubmit, initialKey }: KeyDialogProps) { +export function KeyDialog({ isOpen, onClose, onSubmit, onDelete, initialKey }: KeyDialogProps) { const [name, setName] = React.useState(initialKey?.name || ''); const [value, setValue] = React.useState(initialKey?.value || ''); + const [isValueVisible, setIsValueVisible] = React.useState(false); const isEditing = !!initialKey; + React.useEffect(() => { + if (initialKey) { + setName(initialKey.name); + setValue(initialKey.value); + } else { + setName(''); + setValue(''); + } + }, [initialKey]); + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const id = initialKey?.id || name.toLowerCase().replace(/\s+/g, '-'); @@ -35,8 +47,9 @@ export function KeyDialog({ isOpen, onClose, onSubmit, initialKey }: KeyDialogPr title={isEditing ? 'Edit Key' : 'Add Key'} isOpen={isOpen} onClose={onClose} + onSubmit={handleSubmit} > -
+
setName(e.target.value)} placeholder="Key name" required - disabled={isEditing} />
- setValue(e.target.value)} - placeholder="Key value" - required - /> +
+ setValue(e.target.value)} + placeholder="Key value" + required + /> + +
+ + {isEditing && onDelete && ( +
+ +
+ )}
); diff --git a/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx b/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx new file mode 100644 index 000000000..6a3e25635 --- /dev/null +++ b/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/dialog'; +import { Button } from '../../ui/button'; +import { Key } from '../types'; + +interface RevealKeysDialogProps { + isOpen: boolean; + onClose: () => void; + keys: Key[]; +} + +export function RevealKeysDialog({ isOpen, onClose, keys }: RevealKeysDialogProps) { + return ( + + + + All Keys (Development Only) + +
+ {keys.map(key => ( +
+
+ {key.name} +
+
+ {key.value} +
+
+ ))} +
+
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/ui/Tooltip.tsx b/ui/desktop/src/components/ui/Tooltip.tsx new file mode 100644 index 000000000..f8402d890 --- /dev/null +++ b/ui/desktop/src/components/ui/Tooltip.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +interface TooltipProps { + content: string; + children: React.ReactNode; +} + +export function Tooltip({ content, children }: TooltipProps) { + return ( +
+ {children} +
+ {content} +
+
+ ); +} \ No newline at end of file diff --git a/ui/desktop/src/components/ui/dialog.tsx b/ui/desktop/src/components/ui/dialog.tsx index 552ed9199..e2bd996e0 100644 --- a/ui/desktop/src/components/ui/dialog.tsx +++ b/ui/desktop/src/components/ui/dialog.tsx @@ -18,7 +18,7 @@ const DialogOverlay = React.forwardRef< { + toast.style.opacity = '0'; + toast.style.transform = 'translateY(1rem)'; + setTimeout(() => toast.remove(), 300); + }, 2000); +} From 0df0f59fbf422c987f6da864d4481f32163fc15c Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Fri, 10 Jan 2025 11:04:57 +1000 Subject: [PATCH 07/12] fix broken buttons --- .../settings/modals/AddExtensionDialog.tsx | 19 +++++++++++++++---- .../settings/modals/AddModelDialog.tsx | 19 +++++++++++++++---- .../components/settings/modals/KeyDialog.tsx | 17 ++++++++++------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx b/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx index e33dad005..43a1217ba 100644 --- a/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx +++ b/ui/desktop/src/components/settings/modals/AddExtensionDialog.tsx @@ -13,6 +13,14 @@ export function AddExtensionDialog({ isOpen, onClose, onAdd }: AddExtensionDialo const [name, setName] = React.useState(''); const [description, setDescription] = React.useState('Standard config'); + // Reset form when dialog closes + React.useEffect(() => { + if (!isOpen) { + setName(''); + setDescription('Standard config'); + } + }, [isOpen]); + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const id = name.toLowerCase().replace(/\s+/g, '-'); @@ -23,13 +31,16 @@ export function AddExtensionDialog({ isOpen, onClose, onAdd }: AddExtensionDialo enabled: true }); onClose(); - setName(''); - setDescription('Standard config'); }; return ( - -
+ +
{ + if (!isOpen) { + setName(''); + setDescription('Standard config'); + } + }, [isOpen]); + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const id = name.toLowerCase().replace(/\s+/g, '-'); @@ -23,13 +31,16 @@ export function AddModelDialog({ isOpen, onClose, onAdd }: AddModelDialogProps) enabled: false }); onClose(); - setName(''); - setDescription('Standard config'); }; return ( - - + +
{ + if (!isOpen && !isEditing) { + setName(''); + setValue(''); + setIsValueVisible(false); + } + }, [isOpen, isEditing]); + + // Update form when initialKey changes React.useEffect(() => { if (initialKey) { setName(initialKey.name); setValue(initialKey.value); - } else { - setName(''); - setValue(''); } }, [initialKey]); @@ -36,10 +43,6 @@ export function KeyDialog({ isOpen, onClose, onSubmit, onDelete, initialKey }: K value }); onClose(); - if (!isEditing) { - setName(''); - setValue(''); - } }; return ( From dfb3f1ed97df45324e5e3339488c4a8c2d5e4196 Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Sat, 11 Jan 2025 05:20:49 +1000 Subject: [PATCH 08/12] remove add extension --- .../src/components/settings/Settings.tsx | 21 ------------------- ui/desktop/src/utils/cn.ts | 3 --- 2 files changed, 24 deletions(-) delete mode 100644 ui/desktop/src/utils/cn.ts diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx index e2faf35b7..06ff17a25 100644 --- a/ui/desktop/src/components/settings/Settings.tsx +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -6,7 +6,6 @@ import { Settings as SettingsType, Model, Extension, Key } from './types'; import { ToggleableItem } from './ToggleableItem'; import { KeyItem } from './KeyItem'; import { AddModelDialog } from './modals/AddModelDialog'; -import { AddExtensionDialog } from './modals/AddExtensionDialog'; import { KeyDialog } from './modals/KeyDialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog'; import { Button } from '../ui/button'; @@ -83,7 +82,6 @@ export default function Settings() { }; const [addModelOpen, setAddModelOpen] = useState(false); - const [addExtensionOpen, setAddExtensionOpen] = useState(false); const [addKeyOpen, setAddKeyOpen] = useState(false); const [editingKey, setEditingKey] = useState(null); const [showResetConfirm, setShowResetConfirm] = useState(false); @@ -97,14 +95,6 @@ export default function Settings() { setAddModelOpen(false); }; - const handleAddExtension = (newExtension: Extension) => { - setSettings(prev => ({ - ...prev, - extensions: [...prev.extensions, { ...newExtension, enabled: true }] - })); - setAddExtensionOpen(false); - }; - const handleAddKey = (newKey: Key) => { setSettings(prev => ({ ...prev, @@ -205,12 +195,6 @@ export default function Settings() {

Extensions

-

{EXTENSIONS_DESCRIPTION}

{settings.extensions.map(ext => ( @@ -305,11 +289,6 @@ export default function Settings() { onClose={() => setAddModelOpen(false)} onAdd={handleAddModel} /> - setAddExtensionOpen(false)} - onAdd={handleAddExtension} - /> { diff --git a/ui/desktop/src/utils/cn.ts b/ui/desktop/src/utils/cn.ts deleted file mode 100644 index ff0b824b7..000000000 --- a/ui/desktop/src/utils/cn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function cn(...classes: (string | undefined | false | null)[]) { - return classes.filter(Boolean).join(" "); -} From 21765a8e373a233f96921ce3432c01635e7a3602 Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Sat, 11 Jan 2025 06:04:27 +1000 Subject: [PATCH 09/12] add dev feat flag --- ui/desktop/src/components/MoreMenu.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/ui/desktop/src/components/MoreMenu.tsx b/ui/desktop/src/components/MoreMenu.tsx index 2174906bf..789e050e1 100644 --- a/ui/desktop/src/components/MoreMenu.tsx +++ b/ui/desktop/src/components/MoreMenu.tsx @@ -116,16 +116,18 @@ export default function MoreMenu() { className="text-yellow-500"/>} -
)} - +
)} + {process.env.NODE_ENV === 'development' && ( + + )} diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx index 06ff17a25..a72316f33 100644 --- a/ui/desktop/src/components/settings/Settings.tsx +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -7,7 +7,7 @@ import { ToggleableItem } from './ToggleableItem'; import { KeyItem } from './KeyItem'; import { AddModelDialog } from './modals/AddModelDialog'; import { KeyDialog } from './modals/KeyDialog'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog'; +import { Modal, ModalContent, ModalHeader, ModalTitle } from '../ui/modal'; import { Button } from '../ui/button'; import { RevealKeysDialog } from './modals/RevealKeysDialog'; @@ -256,11 +256,11 @@ export default function Settings() { {/* Reset Confirmation Dialog */} - - - - Reset Settings - + + + + Reset Settings +

Are you sure you want to reset all settings to their default values? This cannot be undone. @@ -280,8 +280,8 @@ export default function Settings() { Reset Settings

-
-
+ + {/* Add the modals */} - - - {title} - + + + + {title} + {children}
-
- + + ); } \ No newline at end of file diff --git a/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx b/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx index 6a3e25635..a75a740d7 100644 --- a/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx +++ b/ui/desktop/src/components/settings/modals/RevealKeysDialog.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/dialog'; +import { Modal, ModalContent, ModalHeader, ModalTitle } from '../../ui/modal'; import { Button } from '../../ui/button'; import { Key } from '../types'; @@ -11,11 +11,11 @@ interface RevealKeysDialogProps { export function RevealKeysDialog({ isOpen, onClose, keys }: RevealKeysDialogProps) { return ( - - - - All Keys (Development Only) - + + + + All Keys (Development Only) +
{keys.map(key => (
@@ -31,7 +31,7 @@ export function RevealKeysDialog({ isOpen, onClose, keys }: RevealKeysDialogProp
- -
+ + ); } \ No newline at end of file diff --git a/ui/desktop/src/components/ui/dialog.tsx b/ui/desktop/src/components/ui/modal.tsx similarity index 72% rename from ui/desktop/src/components/ui/dialog.tsx rename to ui/desktop/src/components/ui/modal.tsx index e2bd996e0..cc01acf95 100644 --- a/ui/desktop/src/components/ui/dialog.tsx +++ b/ui/desktop/src/components/ui/modal.tsx @@ -3,15 +3,15 @@ import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; import { cn } from "../../utils"; -const Dialog = DialogPrimitive.Root +const Modal = DialogPrimitive.Root -const DialogTrigger = DialogPrimitive.Trigger +const ModalTrigger = DialogPrimitive.Trigger -const DialogPortal = DialogPrimitive.Portal +const ModalPortal = DialogPrimitive.Portal -const DialogClose = DialogPrimitive.Close +const ModalClose = DialogPrimitive.Close -const DialogOverlay = React.forwardRef< +const ModalOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( @@ -24,14 +24,14 @@ const DialogOverlay = React.forwardRef< {...props} /> )) -DialogOverlay.displayName = DialogPrimitive.Overlay.displayName +ModalOverlay.displayName = "ModalOverlay" -const DialogContent = React.forwardRef< +const ModalContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - - + + Close - + )) -DialogContent.displayName = DialogPrimitive.Content.displayName +ModalContent.displayName = "ModalContent" -const DialogHeader = ({ +const ModalHeader = ({ className, ...props }: React.HTMLAttributes) => ( @@ -62,9 +62,9 @@ const DialogHeader = ({ {...props} /> ) -DialogHeader.displayName = "DialogHeader" +ModalHeader.displayName = "ModalHeader" -const DialogFooter = ({ +const ModalFooter = ({ className, ...props }: React.HTMLAttributes) => ( @@ -76,9 +76,9 @@ const DialogFooter = ({ {...props} /> ) -DialogFooter.displayName = "DialogFooter" +ModalFooter.displayName = "ModalFooter" -const DialogTitle = React.forwardRef< +const ModalTitle = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( @@ -91,9 +91,9 @@ const DialogTitle = React.forwardRef< {...props} /> )) -DialogTitle.displayName = DialogPrimitive.Title.displayName +ModalTitle.displayName = "ModalTitle" -const DialogDescription = React.forwardRef< +const ModalDescription = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( @@ -103,17 +103,17 @@ const DialogDescription = React.forwardRef< {...props} /> )) -DialogDescription.displayName = DialogPrimitive.Description.displayName +ModalDescription.displayName = "ModalDescription" export { - Dialog, - DialogPortal, - DialogOverlay, - DialogTrigger, - DialogClose, - DialogContent, - DialogHeader, - DialogFooter, - DialogTitle, - DialogDescription, + Modal, + ModalPortal, + ModalOverlay, + ModalTrigger, + ModalClose, + ModalContent, + ModalHeader, + ModalFooter, + ModalTitle, + ModalDescription, } From 4d92e97cad0d6907c2ff7e4e339f197e2fd4598c Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Sat, 11 Jan 2025 06:31:17 +1000 Subject: [PATCH 11/12] import showToast --- ui/desktop/src/components/settings/Settings.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/desktop/src/components/settings/Settings.tsx b/ui/desktop/src/components/settings/Settings.tsx index a72316f33..3dd294273 100644 --- a/ui/desktop/src/components/settings/Settings.tsx +++ b/ui/desktop/src/components/settings/Settings.tsx @@ -10,6 +10,7 @@ import { KeyDialog } from './modals/KeyDialog'; import { Modal, ModalContent, ModalHeader, ModalTitle } from '../ui/modal'; import { Button } from '../ui/button'; import { RevealKeysDialog } from './modals/RevealKeysDialog'; +import { showToast } from '../ui/toast'; const EXTENSIONS_DESCRIPTION = "The Model Context Protocol (MCP) is a system that allows AI models to securely connect with local or remote resources using standard server setups. It works like a client-server setup and expands AI capabilities using three main components: Prompts, Resources, and Tools."; From b90ecda96707b3e6b261d281f9ca0fc5da181064 Mon Sep 17 00:00:00 2001 From: Lily Delalande Date: Sat, 11 Jan 2025 06:33:08 +1000 Subject: [PATCH 12/12] remove shadcn-ui --- ui/desktop/package-lock.json | 797 +---------------------------------- ui/desktop/package.json | 1 - 2 files changed, 1 insertion(+), 797 deletions(-) diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json index 3d025d6bd..e7729a077 100644 --- a/ui/desktop/package-lock.json +++ b/ui/desktop/package-lock.json @@ -64,7 +64,6 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "postcss": "^8.4.47", - "shadcn-ui": "^0.9.4", "tailwindcss": "^3.4.14", "vite": "^5.0.12" } @@ -399,21 +398,6 @@ "node": ">=6.0.0" } }, - "node_modules/@antfu/ni": { - "version": "0.21.12", - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.12.tgz", - "integrity": "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==", - "dev": true, - "bin": { - "na": "bin/na.mjs", - "nci": "bin/nci.mjs", - "ni": "bin/ni.mjs", - "nlx": "bin/nlx.mjs", - "nr": "bin/nr.mjs", - "nu": "bin/nu.mjs", - "nun": "bin/nun.mjs" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -497,18 +481,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -536,49 +508,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", @@ -611,18 +540,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", @@ -633,36 +550,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -720,21 +607,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", @@ -767,25 +639,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", @@ -3754,57 +3607,6 @@ "node": ">= 10" } }, - "node_modules/@ts-morph/common": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz", - "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@ts-morph/common/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5000,18 +4802,6 @@ "node": ">= 6" } }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -5848,12 +5638,6 @@ "node": ">=6" } }, - "node_modules/code-block-writer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", - "dev": true - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5971,59 +5755,6 @@ "node": ">= 0.10" } }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/cross-dirname": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", @@ -6087,15 +5818,6 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -6345,15 +6067,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-match-patch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", @@ -7690,19 +7403,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "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, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -8100,29 +7800,6 @@ "pend": "~1.2.0" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8308,18 +7985,6 @@ "node": ">=0.4.x" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9142,15 +8807,6 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -9974,12 +9630,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -10099,15 +9749,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10601,12 +10242,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -11361,25 +10996,6 @@ "semver": "^7.3.5" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11931,12 +11547,6 @@ "node": ">= 0.8" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12429,19 +12039,6 @@ "node": ">=10" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -12914,22 +12511,6 @@ "node": ">=8.10.0" } }, - "node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -13617,276 +13198,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shadcn-ui": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/shadcn-ui/-/shadcn-ui-0.9.4.tgz", - "integrity": "sha512-75nqu4+y4mlhNXGfHPoPd1r2fgqGQgSEPzPe8TV39WRinafKHuBX2xkgoQOwu+NhiRPKV5TrRSCZ5ytGrFU1oQ==", - "dev": true, - "dependencies": { - "@antfu/ni": "^0.21.4", - "@babel/core": "^7.22.1", - "@babel/parser": "^7.22.6", - "@babel/plugin-transform-typescript": "^7.22.5", - "chalk": "5.2.0", - "commander": "^10.0.0", - "cosmiconfig": "^8.1.3", - "diff": "^5.1.0", - "execa": "^7.0.0", - "fast-glob": "^3.3.2", - "fs-extra": "^11.1.0", - "https-proxy-agent": "^6.2.0", - "lodash": "^4.17.21", - "node-fetch": "^3.3.0", - "ora": "^6.1.2", - "prompts": "^2.4.2", - "recast": "^0.23.2", - "ts-morph": "^18.0.0", - "tsconfig-paths": "^4.2.0", - "zod": "^3.20.2" - }, - "bin": { - "shadcn-ui": "dist/index.js" - } - }, - "node_modules/shadcn-ui/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/shadcn-ui/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/shadcn-ui/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/shadcn-ui/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/shadcn-ui/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/shadcn-ui/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/https-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-6.2.1.tgz", - "integrity": "sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/shadcn-ui/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/shadcn-ui/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn-ui/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13933,12 +13244,6 @@ "dev": true, "license": "ISC" }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -14137,56 +13442,6 @@ "node": ">= 0.8" } }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dev": true, - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stdin-discarder/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/stdin-discarder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14433,18 +13688,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -14871,12 +14114,6 @@ "license": "MIT", "optional": true }, - "node_modules/tiny-invariant": { - "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 - }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -14989,30 +14226,6 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, - "node_modules/ts-morph": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-18.0.0.tgz", - "integrity": "sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==", - "dev": true, - "dependencies": { - "@ts-morph/common": "~0.19.0", - "code-block-writer": "^12.0.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -15567,15 +14780,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -16121,6 +15325,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/ui/desktop/package.json b/ui/desktop/package.json index 4a809415f..074c4c627 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -41,7 +41,6 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "postcss": "^8.4.47", - "shadcn-ui": "^0.9.4", "tailwindcss": "^3.4.14", "vite": "^5.0.12" },