diff --git a/.gitignore b/.gitignore index bcb3d1d..43d1599 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ coverage/ *.log .DS_Store .claude/ +apps/web/.svelte-kit/ +apps/web/build/ diff --git a/apps/web/index.html b/apps/web-react/index.html similarity index 100% rename from apps/web/index.html rename to apps/web-react/index.html diff --git a/apps/web/jest.config.ts b/apps/web-react/jest.config.ts similarity index 100% rename from apps/web/jest.config.ts rename to apps/web-react/jest.config.ts diff --git a/apps/web-react/postcss.config.js b/apps/web-react/postcss.config.js new file mode 100644 index 0000000..e9be339 --- /dev/null +++ b/apps/web-react/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: { config: './apps/web/tailwind.config.js' }, + autoprefixer: {}, + }, +}; diff --git a/apps/web-react/project.json b/apps/web-react/project.json new file mode 100644 index 0000000..f77e491 --- /dev/null +++ b/apps/web-react/project.json @@ -0,0 +1,75 @@ +{ + "name": "web-react", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/web-react/src", + "projectType": "application", + "targets": { + "build-css": { + "executor": "nx:run-commands", + "outputs": ["{workspaceRoot}/dist/apps/web-react/styles.css"], + "options": { + "command": "pnpm tailwindcss -i apps/web-react/src/app/styles/global.css -o dist/apps/web-react/styles.css --config apps/web-react/tailwind.config.js" + } + }, + "build": { + "executor": "@nx/esbuild:esbuild", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "dependsOn": ["^build", "build-css"], + "options": { + "platform": "browser", + "outputPath": "dist/apps/web", + "deleteOutputPath": false, + "bundle": true, + "main": "apps/web-react/src/main.tsx", + "tsConfig": "apps/web-react/tsconfig.app.json", + "assets": [ + { "glob": "index.html", "input": "apps/web", "output": "." } + ], + "esbuildOptions": { + "jsx": "automatic", + "format": "iife", + "alias": { + "@": "apps/web-react/src" + }, + "define": { + "process.env.NODE_ENV": "\"production\"", + "process.env.API_URL": "\"http://localhost:3000\"" + } + } + }, + "configurations": { + "development": { + "minify": false, + "sourcemap": true, + "esbuildOptions": { + "jsx": "automatic", + "format": "iife", + "define": { + "process.env.NODE_ENV": "\"development\"", + "process.env.API_URL": "\"http://localhost:3000\"" + } + } + }, + "production": { + "minify": true, + "sourcemap": false + } + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "command": "node tools/web-dev-server.mjs" + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "apps/web-react/jest.config.ts" + } + } + }, + "tags": ["type:app", "scope:web"] +} diff --git a/apps/web/src/app/App.tsx b/apps/web-react/src/app/App.tsx similarity index 100% rename from apps/web/src/app/App.tsx rename to apps/web-react/src/app/App.tsx diff --git a/apps/web/src/app/components/ChatWindow.tsx b/apps/web-react/src/app/components/ChatWindow.tsx similarity index 100% rename from apps/web/src/app/components/ChatWindow.tsx rename to apps/web-react/src/app/components/ChatWindow.tsx diff --git a/apps/web/src/app/components/LayoutDocumentView.tsx b/apps/web-react/src/app/components/LayoutDocumentView.tsx similarity index 100% rename from apps/web/src/app/components/LayoutDocumentView.tsx rename to apps/web-react/src/app/components/LayoutDocumentView.tsx diff --git a/apps/web/src/app/components/PageHeader.tsx b/apps/web-react/src/app/components/PageHeader.tsx similarity index 100% rename from apps/web/src/app/components/PageHeader.tsx rename to apps/web-react/src/app/components/PageHeader.tsx diff --git a/apps/web/src/app/components/PrivateRoute.tsx b/apps/web-react/src/app/components/PrivateRoute.tsx similarity index 100% rename from apps/web/src/app/components/PrivateRoute.tsx rename to apps/web-react/src/app/components/PrivateRoute.tsx diff --git a/apps/web/src/app/components/TargetPortal.tsx b/apps/web-react/src/app/components/TargetPortal.tsx similarity index 100% rename from apps/web/src/app/components/TargetPortal.tsx rename to apps/web-react/src/app/components/TargetPortal.tsx diff --git a/apps/web/src/app/components/messages/DisplayColorfulTextMessage.tsx b/apps/web-react/src/app/components/messages/DisplayColorfulTextMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/DisplayColorfulTextMessage.tsx rename to apps/web-react/src/app/components/messages/DisplayColorfulTextMessage.tsx diff --git a/apps/web/src/app/components/messages/DisplayJsonMessage.tsx b/apps/web-react/src/app/components/messages/DisplayJsonMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/DisplayJsonMessage.tsx rename to apps/web-react/src/app/components/messages/DisplayJsonMessage.tsx diff --git a/apps/web/src/app/components/messages/DisplayTextMessage.tsx b/apps/web-react/src/app/components/messages/DisplayTextMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/DisplayTextMessage.tsx rename to apps/web-react/src/app/components/messages/DisplayTextMessage.tsx diff --git a/apps/web/src/app/components/messages/HorizontalWorkspaceMessage.tsx b/apps/web-react/src/app/components/messages/HorizontalWorkspaceMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/HorizontalWorkspaceMessage.tsx rename to apps/web-react/src/app/components/messages/HorizontalWorkspaceMessage.tsx diff --git a/apps/web/src/app/components/messages/SimpleTabMessage.tsx b/apps/web-react/src/app/components/messages/SimpleTabMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/SimpleTabMessage.tsx rename to apps/web-react/src/app/components/messages/SimpleTabMessage.tsx diff --git a/apps/web/src/app/components/messages/VerticalWorkspaceMessage.tsx b/apps/web-react/src/app/components/messages/VerticalWorkspaceMessage.tsx similarity index 100% rename from apps/web/src/app/components/messages/VerticalWorkspaceMessage.tsx rename to apps/web-react/src/app/components/messages/VerticalWorkspaceMessage.tsx diff --git a/apps/web/src/app/components/shared/Tabs.tsx b/apps/web-react/src/app/components/shared/Tabs.tsx similarity index 100% rename from apps/web/src/app/components/shared/Tabs.tsx rename to apps/web-react/src/app/components/shared/Tabs.tsx diff --git a/apps/web/src/app/contexts/AuthContext.tsx b/apps/web-react/src/app/contexts/AuthContext.tsx similarity index 100% rename from apps/web/src/app/contexts/AuthContext.tsx rename to apps/web-react/src/app/contexts/AuthContext.tsx diff --git a/apps/web/src/app/hooks/useDashboardChannelId.ts b/apps/web-react/src/app/hooks/useDashboardChannelId.ts similarity index 100% rename from apps/web/src/app/hooks/useDashboardChannelId.ts rename to apps/web-react/src/app/hooks/useDashboardChannelId.ts diff --git a/apps/web/src/app/hooks/useDocumentChannel.ts b/apps/web-react/src/app/hooks/useDocumentChannel.ts similarity index 100% rename from apps/web/src/app/hooks/useDocumentChannel.ts rename to apps/web-react/src/app/hooks/useDocumentChannel.ts diff --git a/apps/web/src/app/pages/AdminDashboardPage.tsx b/apps/web-react/src/app/pages/AdminDashboardPage.tsx similarity index 100% rename from apps/web/src/app/pages/AdminDashboardPage.tsx rename to apps/web-react/src/app/pages/AdminDashboardPage.tsx diff --git a/apps/web/src/app/pages/AuthorDashboardPage.tsx b/apps/web-react/src/app/pages/AuthorDashboardPage.tsx similarity index 100% rename from apps/web/src/app/pages/AuthorDashboardPage.tsx rename to apps/web-react/src/app/pages/AuthorDashboardPage.tsx diff --git a/apps/web/src/app/pages/DashboardPage.tsx b/apps/web-react/src/app/pages/DashboardPage.tsx similarity index 100% rename from apps/web/src/app/pages/DashboardPage.tsx rename to apps/web-react/src/app/pages/DashboardPage.tsx diff --git a/apps/web/src/app/pages/LoginPage.tsx b/apps/web-react/src/app/pages/LoginPage.tsx similarity index 100% rename from apps/web/src/app/pages/LoginPage.tsx rename to apps/web-react/src/app/pages/LoginPage.tsx diff --git a/apps/web/src/app/pages/OAuthCallbackPage.tsx b/apps/web-react/src/app/pages/OAuthCallbackPage.tsx similarity index 100% rename from apps/web/src/app/pages/OAuthCallbackPage.tsx rename to apps/web-react/src/app/pages/OAuthCallbackPage.tsx diff --git a/apps/web/src/app/pages/RegisterPage.tsx b/apps/web-react/src/app/pages/RegisterPage.tsx similarity index 100% rename from apps/web/src/app/pages/RegisterPage.tsx rename to apps/web-react/src/app/pages/RegisterPage.tsx diff --git a/apps/web/src/app/pages/SettingsPage.tsx b/apps/web-react/src/app/pages/SettingsPage.tsx similarity index 100% rename from apps/web/src/app/pages/SettingsPage.tsx rename to apps/web-react/src/app/pages/SettingsPage.tsx diff --git a/apps/web/src/app/pages/UserDashboardPage.tsx b/apps/web-react/src/app/pages/UserDashboardPage.tsx similarity index 100% rename from apps/web/src/app/pages/UserDashboardPage.tsx rename to apps/web-react/src/app/pages/UserDashboardPage.tsx diff --git a/apps/web/src/app/registry/documentRegistry.ts b/apps/web-react/src/app/registry/documentRegistry.ts similarity index 100% rename from apps/web/src/app/registry/documentRegistry.ts rename to apps/web-react/src/app/registry/documentRegistry.ts diff --git a/apps/web/src/app/registry/layoutRegistry.ts b/apps/web-react/src/app/registry/layoutRegistry.ts similarity index 100% rename from apps/web/src/app/registry/layoutRegistry.ts rename to apps/web-react/src/app/registry/layoutRegistry.ts diff --git a/apps/web/src/app/registry/messageRegistry.ts b/apps/web-react/src/app/registry/messageRegistry.ts similarity index 100% rename from apps/web/src/app/registry/messageRegistry.ts rename to apps/web-react/src/app/registry/messageRegistry.ts diff --git a/apps/web/src/app/services/EventManager.ts b/apps/web-react/src/app/services/EventManager.ts similarity index 100% rename from apps/web/src/app/services/EventManager.ts rename to apps/web-react/src/app/services/EventManager.ts diff --git a/apps/web/src/app/services/api.ts b/apps/web-react/src/app/services/api.ts similarity index 100% rename from apps/web/src/app/services/api.ts rename to apps/web-react/src/app/services/api.ts diff --git a/apps/web/src/app/services/documentModelStore.ts b/apps/web-react/src/app/services/documentModelStore.ts similarity index 100% rename from apps/web/src/app/services/documentModelStore.ts rename to apps/web-react/src/app/services/documentModelStore.ts diff --git a/apps/web/src/app/styles/global.css b/apps/web-react/src/app/styles/global.css similarity index 100% rename from apps/web/src/app/styles/global.css rename to apps/web-react/src/app/styles/global.css diff --git a/apps/web/src/components/LayoutRenderer.tsx b/apps/web-react/src/components/LayoutRenderer.tsx similarity index 100% rename from apps/web/src/components/LayoutRenderer.tsx rename to apps/web-react/src/components/LayoutRenderer.tsx diff --git a/apps/web/src/components/layout/ChatBody.tsx b/apps/web-react/src/components/layout/ChatBody.tsx similarity index 100% rename from apps/web/src/components/layout/ChatBody.tsx rename to apps/web-react/src/components/layout/ChatBody.tsx diff --git a/apps/web/src/components/layout/ChatInput.tsx b/apps/web-react/src/components/layout/ChatInput.tsx similarity index 100% rename from apps/web/src/components/layout/ChatInput.tsx rename to apps/web-react/src/components/layout/ChatInput.tsx diff --git a/apps/web/src/components/layout/DocumentList.tsx b/apps/web-react/src/components/layout/DocumentList.tsx similarity index 100% rename from apps/web/src/components/layout/DocumentList.tsx rename to apps/web-react/src/components/layout/DocumentList.tsx diff --git a/apps/web/src/components/layout/FullPanel.tsx b/apps/web-react/src/components/layout/FullPanel.tsx similarity index 100% rename from apps/web/src/components/layout/FullPanel.tsx rename to apps/web-react/src/components/layout/FullPanel.tsx diff --git a/apps/web/src/components/layout/LayoutDocumentViewLayout.tsx b/apps/web-react/src/components/layout/LayoutDocumentViewLayout.tsx similarity index 100% rename from apps/web/src/components/layout/LayoutDocumentViewLayout.tsx rename to apps/web-react/src/components/layout/LayoutDocumentViewLayout.tsx diff --git a/apps/web/src/components/layout/LogTreePanel.tsx b/apps/web-react/src/components/layout/LogTreePanel.tsx similarity index 100% rename from apps/web/src/components/layout/LogTreePanel.tsx rename to apps/web-react/src/components/layout/LogTreePanel.tsx diff --git a/apps/web/src/components/layout/NewDocument.tsx b/apps/web-react/src/components/layout/NewDocument.tsx similarity index 100% rename from apps/web/src/components/layout/NewDocument.tsx rename to apps/web-react/src/components/layout/NewDocument.tsx diff --git a/apps/web/src/components/layout/SmartAccordion.tsx b/apps/web-react/src/components/layout/SmartAccordion.tsx similarity index 100% rename from apps/web/src/components/layout/SmartAccordion.tsx rename to apps/web-react/src/components/layout/SmartAccordion.tsx diff --git a/apps/web/src/components/layout/SmartTab.tsx b/apps/web-react/src/components/layout/SmartTab.tsx similarity index 100% rename from apps/web/src/components/layout/SmartTab.tsx rename to apps/web-react/src/components/layout/SmartTab.tsx diff --git a/apps/web/src/components/layout/SmartTabs.tsx b/apps/web-react/src/components/layout/SmartTabs.tsx similarity index 100% rename from apps/web/src/components/layout/SmartTabs.tsx rename to apps/web-react/src/components/layout/SmartTabs.tsx diff --git a/apps/web/src/components/layout/TwoColumnPanel.tsx b/apps/web-react/src/components/layout/TwoColumnPanel.tsx similarity index 100% rename from apps/web/src/components/layout/TwoColumnPanel.tsx rename to apps/web-react/src/components/layout/TwoColumnPanel.tsx diff --git a/apps/web/src/components/ui/accordion.tsx b/apps/web-react/src/components/ui/accordion.tsx similarity index 100% rename from apps/web/src/components/ui/accordion.tsx rename to apps/web-react/src/components/ui/accordion.tsx diff --git a/apps/web/src/components/ui/button.tsx b/apps/web-react/src/components/ui/button.tsx similarity index 100% rename from apps/web/src/components/ui/button.tsx rename to apps/web-react/src/components/ui/button.tsx diff --git a/apps/web/src/components/ui/tabs.tsx b/apps/web-react/src/components/ui/tabs.tsx similarity index 100% rename from apps/web/src/components/ui/tabs.tsx rename to apps/web-react/src/components/ui/tabs.tsx diff --git a/apps/web/src/components/ui/tree-view.tsx b/apps/web-react/src/components/ui/tree-view.tsx similarity index 100% rename from apps/web/src/components/ui/tree-view.tsx rename to apps/web-react/src/components/ui/tree-view.tsx diff --git a/apps/web-react/src/lib/utils.ts b/apps/web-react/src/lib/utils.ts new file mode 100644 index 0000000..2819a83 --- /dev/null +++ b/apps/web-react/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/apps/web/src/main.tsx b/apps/web-react/src/main.tsx similarity index 100% rename from apps/web/src/main.tsx rename to apps/web-react/src/main.tsx diff --git a/apps/web-react/tailwind.config.js b/apps/web-react/tailwind.config.js new file mode 100644 index 0000000..315d739 --- /dev/null +++ b/apps/web-react/tailwind.config.js @@ -0,0 +1,64 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ['class'], + content: ['./apps/web/src/**/*.{ts,tsx}'], + theme: { + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [], +}; diff --git a/apps/web/tsconfig.app.json b/apps/web-react/tsconfig.app.json similarity index 100% rename from apps/web/tsconfig.app.json rename to apps/web-react/tsconfig.app.json diff --git a/apps/web-react/tsconfig.json b/apps/web-react/tsconfig.json new file mode 100644 index 0000000..0f21f72 --- /dev/null +++ b/apps/web-react/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/apps/web/tsconfig.spec.json b/apps/web-react/tsconfig.spec.json similarity index 100% rename from apps/web/tsconfig.spec.json rename to apps/web-react/tsconfig.spec.json diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..131b7f5 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,23 @@ +{ + "name": "web", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev --port 4200", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.21.4", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "svelte": "^5.34.1", + "svelte-check": "^4.2.1", + "vite": "^6.3.5" + }, + "dependencies": { + "bits-ui": "^1.3.22", + "lucide-svelte": "^0.511.0" + } +} diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js index e9be339..2aa7205 100644 --- a/apps/web/postcss.config.js +++ b/apps/web/postcss.config.js @@ -1,6 +1,6 @@ -module.exports = { +export default { plugins: { - tailwindcss: { config: './apps/web/tailwind.config.js' }, + tailwindcss: {}, autoprefixer: {}, }, }; diff --git a/apps/web/project.json b/apps/web/project.json index 06f9eb4..312dbb0 100644 --- a/apps/web/project.json +++ b/apps/web/project.json @@ -4,70 +4,26 @@ "sourceRoot": "apps/web/src", "projectType": "application", "targets": { - "build-css": { - "executor": "nx:run-commands", - "outputs": ["{workspaceRoot}/dist/apps/web/styles.css"], - "options": { - "command": "pnpm tailwindcss -i apps/web/src/app/styles/global.css -o dist/apps/web/styles.css --config apps/web/tailwind.config.js" - } - }, "build": { - "executor": "@nx/esbuild:esbuild", - "outputs": ["{options.outputPath}"], - "defaultConfiguration": "production", - "dependsOn": ["^build", "build-css"], + "executor": "nx:run-commands", + "outputs": ["{workspaceRoot}/dist/apps/web"], "options": { - "platform": "browser", - "outputPath": "dist/apps/web", - "deleteOutputPath": false, - "bundle": true, - "main": "apps/web/src/main.tsx", - "tsConfig": "apps/web/tsconfig.app.json", - "assets": [ - { "glob": "index.html", "input": "apps/web", "output": "." } - ], - "esbuildOptions": { - "jsx": "automatic", - "format": "iife", - "alias": { - "@": "apps/web/src" - }, - "define": { - "process.env.NODE_ENV": "\"production\"", - "process.env.API_URL": "\"http://localhost:3000\"" - } - } - }, - "configurations": { - "development": { - "minify": false, - "sourcemap": true, - "esbuildOptions": { - "jsx": "automatic", - "format": "iife", - "define": { - "process.env.NODE_ENV": "\"development\"", - "process.env.API_URL": "\"http://localhost:3000\"" - } - } - }, - "production": { - "minify": true, - "sourcemap": false - } + "command": "pnpm vite build", + "cwd": "{workspaceRoot}/apps/web" } }, "serve": { "executor": "nx:run-commands", "options": { - "command": "node tools/web-dev-server.mjs" + "command": "pnpm vite dev --port 4200 --host", + "cwd": "{workspaceRoot}/apps/web" } }, "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "executor": "nx:run-commands", "options": { - "jestConfig": "apps/web/jest.config.ts" + "command": "pnpm svelte-check --tsconfig ./tsconfig.json", + "cwd": "{workspaceRoot}/apps/web" } } }, diff --git a/apps/web/src/app.css b/apps/web/src/app.css new file mode 100644 index 0000000..10c2d37 --- /dev/null +++ b/apps/web/src/app.css @@ -0,0 +1,59 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/apps/web/src/app.html b/apps/web/src/app.html new file mode 100644 index 0000000..adf8bd8 --- /dev/null +++ b/apps/web/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/apps/web/src/lib/components/LayoutDocumentView.svelte b/apps/web/src/lib/components/LayoutDocumentView.svelte new file mode 100644 index 0000000..077fbef --- /dev/null +++ b/apps/web/src/lib/components/LayoutDocumentView.svelte @@ -0,0 +1,60 @@ + + +{#if model.layoutConfig.length === 0} +

Loading…

+{:else} + } + {emit} + /> +{/if} diff --git a/apps/web/src/lib/components/LayoutNode.svelte b/apps/web/src/lib/components/LayoutNode.svelte new file mode 100644 index 0000000..6160694 --- /dev/null +++ b/apps/web/src/lib/components/LayoutNode.svelte @@ -0,0 +1,91 @@ + + +{#if loader} + {#await loader()} + + {:then module} + {@const DynComp = module.default as any} + + {#each childItems as child (child.key)} + + {/each} + + {:catch} + + {/await} +{/if} diff --git a/apps/web/src/lib/components/LayoutRenderer.svelte b/apps/web/src/lib/components/LayoutRenderer.svelte new file mode 100644 index 0000000..0649833 --- /dev/null +++ b/apps/web/src/lib/components/LayoutRenderer.svelte @@ -0,0 +1,18 @@ + + +{#each nodes as node, i (i)} + +{/each} diff --git a/apps/web/src/lib/components/PageHeader.svelte b/apps/web/src/lib/components/PageHeader.svelte new file mode 100644 index 0000000..4289d39 --- /dev/null +++ b/apps/web/src/lib/components/PageHeader.svelte @@ -0,0 +1,21 @@ + + + diff --git a/apps/web/src/lib/components/layout/ChatBody.svelte b/apps/web/src/lib/components/layout/ChatBody.svelte new file mode 100644 index 0000000..fe6e915 --- /dev/null +++ b/apps/web/src/lib/components/layout/ChatBody.svelte @@ -0,0 +1,34 @@ + + +
+ {#if messages.length === 0} +

No messages yet. Say hello!

+ {/if} + {#each messages as msg, i (i)} +
+ {msg.authorEmail} + {msg.text} +
+ {/each} +
+
diff --git a/apps/web/src/lib/components/layout/ChatInput.svelte b/apps/web/src/lib/components/layout/ChatInput.svelte new file mode 100644 index 0000000..12ff740 --- /dev/null +++ b/apps/web/src/lib/components/layout/ChatInput.svelte @@ -0,0 +1,35 @@ + + +
+ + +
diff --git a/apps/web/src/lib/components/layout/DocumentList.svelte b/apps/web/src/lib/components/layout/DocumentList.svelte new file mode 100644 index 0000000..1d534d7 --- /dev/null +++ b/apps/web/src/lib/components/layout/DocumentList.svelte @@ -0,0 +1,29 @@ + + +{#if items.length === 0} +

No documents yet.

+{:else} + +{/if} diff --git a/apps/web/src/lib/components/layout/FullPanel.svelte b/apps/web/src/lib/components/layout/FullPanel.svelte new file mode 100644 index 0000000..af45bb5 --- /dev/null +++ b/apps/web/src/lib/components/layout/FullPanel.svelte @@ -0,0 +1,9 @@ + + +
+ {@render children?.()} +
diff --git a/apps/web/src/lib/components/layout/LayoutDocumentViewLayout.svelte b/apps/web/src/lib/components/layout/LayoutDocumentViewLayout.svelte new file mode 100644 index 0000000..458db53 --- /dev/null +++ b/apps/web/src/lib/components/layout/LayoutDocumentViewLayout.svelte @@ -0,0 +1,7 @@ + + + diff --git a/apps/web/src/lib/components/layout/LogTreePanel.svelte b/apps/web/src/lib/components/layout/LogTreePanel.svelte new file mode 100644 index 0000000..ab76383 --- /dev/null +++ b/apps/web/src/lib/components/layout/LogTreePanel.svelte @@ -0,0 +1,74 @@ + + +
+
+ {#if items.length === 0} +

No tree data.

+ {:else} + + {/if} +
+
+ {#if selectedNode} +
+ {#each Object.entries(selectedNode.rawData).filter(([k]) => !OMIT_KEYS.has(k)) as [key, val] (key)} +
+ {key}: + {formatValue(val)} +
+ {/each} +
+ {:else} +

Select a node to view details.

+ {/if} +
+
diff --git a/apps/web/src/lib/components/layout/NewDocument.svelte b/apps/web/src/lib/components/layout/NewDocument.svelte new file mode 100644 index 0000000..28ca1b3 --- /dev/null +++ b/apps/web/src/lib/components/layout/NewDocument.svelte @@ -0,0 +1,43 @@ + + +
+ + {#if types.length > 1} + + {/if} + +
diff --git a/apps/web/src/lib/components/layout/SmartAccordion.svelte b/apps/web/src/lib/components/layout/SmartAccordion.svelte new file mode 100644 index 0000000..f15d3d3 --- /dev/null +++ b/apps/web/src/lib/components/layout/SmartAccordion.svelte @@ -0,0 +1,99 @@ + + +{#if items.length === 0} +

No entries found.

+{:else} +
+ {#each items as item (String(item[idField] ?? ''))} + {@const id = String(item[idField] ?? '')} + {@const triggerText = (triggerFields as string[]).map((f) => getField(item, f)).filter(Boolean).join(' · ')} + {@const open = openValue === id} +
+ + {#if open} +
+ {#if isSelected(id)} + {@render children?.()} + {:else} +

Loading…

+ {/if} +
+ {/if} +
+ {/each} +
+{/if} + + diff --git a/apps/web/src/lib/components/layout/SmartTab.svelte b/apps/web/src/lib/components/layout/SmartTab.svelte new file mode 100644 index 0000000..d674178 --- /dev/null +++ b/apps/web/src/lib/components/layout/SmartTab.svelte @@ -0,0 +1,27 @@ + + +{#if ctx?.activeTab === id} +
+ {@render children?.()} +
+{/if} diff --git a/apps/web/src/lib/components/layout/SmartTabs.svelte b/apps/web/src/lib/components/layout/SmartTabs.svelte new file mode 100644 index 0000000..8af8926 --- /dev/null +++ b/apps/web/src/lib/components/layout/SmartTabs.svelte @@ -0,0 +1,67 @@ + + +
+
+ {#each tabs as tab (tab.id)} + + {/each} +
+ {@render children?.()} +
+ + diff --git a/apps/web/src/lib/components/layout/TwoColumnPanel.svelte b/apps/web/src/lib/components/layout/TwoColumnPanel.svelte new file mode 100644 index 0000000..4cb40a1 --- /dev/null +++ b/apps/web/src/lib/components/layout/TwoColumnPanel.svelte @@ -0,0 +1,25 @@ + + +
+
+ {@render left?.()} +
+
+ {@render right?.()} +
+
diff --git a/apps/web/src/lib/components/ui/TreeView.svelte b/apps/web/src/lib/components/ui/TreeView.svelte new file mode 100644 index 0000000..2f5cbd2 --- /dev/null +++ b/apps/web/src/lib/components/ui/TreeView.svelte @@ -0,0 +1,102 @@ + + +
+ {#each data as item (item.id)} + + {/each} +
+ +{#snippet TreeItem(item: TreeDataItem, selectedId: string | undefined, select: (item: TreeDataItem) => void)} + {#if item.children && item.children.length > 0} + + {:else} + + {/if} +{/snippet} + +{#snippet TreeNode(item: TreeDataItem, selectedId: string | undefined, select: (item: TreeDataItem) => void)} + {@const isSelected = selectedId === item.id} +
+ select(item)} + role="treeitem" + aria-selected={isSelected} + > + + {item.name} + +
+ {#each item.children ?? [] as child (child.id)} + + {/each} +
+
+{/snippet} + +{#snippet TreeLeaf(item: TreeDataItem, selectedId: string | undefined, select: (item: TreeDataItem) => void)} + {@const isSelected = selectedId === item.id} +
select(item)} + role="treeitem" + aria-selected={isSelected} + tabindex="0" + onkeydown={(e) => e.key === 'Enter' && select(item)} + > + {item.name} +
+{/snippet} + + diff --git a/apps/web/src/lib/registry/layoutRegistry.ts b/apps/web/src/lib/registry/layoutRegistry.ts new file mode 100644 index 0000000..8794a66 --- /dev/null +++ b/apps/web/src/lib/registry/layoutRegistry.ts @@ -0,0 +1,18 @@ +type SvelteImport = () => Promise<{ default: unknown }>; + +const registry: Partial> = { + fullPanel: () => import('@/lib/components/layout/FullPanel.svelte'), + chatBody: () => import('@/lib/components/layout/ChatBody.svelte'), + chatInput: () => import('@/lib/components/layout/ChatInput.svelte'), + smartAccordion: () => import('@/lib/components/layout/SmartAccordion.svelte'), + logTreePanel: () => import('@/lib/components/layout/LogTreePanel.svelte'), + smartTab: () => import('@/lib/components/layout/SmartTab.svelte'), + smartTabs: () => import('@/lib/components/layout/SmartTabs.svelte'), + documentList: () => import('@/lib/components/layout/DocumentList.svelte'), + newDocument: () => import('@/lib/components/layout/NewDocument.svelte'), + layoutDocumentView: () => import('@/lib/components/layout/LayoutDocumentViewLayout.svelte'), +}; + +export function getLayoutComponent(componentType: string): SvelteImport | null { + return registry[componentType] ?? null; +} diff --git a/apps/web/src/lib/services/EventManager.ts b/apps/web/src/lib/services/EventManager.ts new file mode 100644 index 0000000..9d64627 --- /dev/null +++ b/apps/web/src/lib/services/EventManager.ts @@ -0,0 +1,142 @@ +import type { InboundMessage, OutboundMessage, WsClientMessage, WsServerMessage } from '@multiplayer-base/shared-types'; + +type MessageCallback = (message: OutboundMessage) => void; + +const WS_URL = 'ws://localhost:3000'; +const MAX_RECONNECT_DELAY = 30000; + +class EventManager { + private ws: WebSocket | null = null; + private subscribers = new Map>(); + private subscribedChannels = new Set(); + private isAuthenticated = false; + private reconnectDelay = 1000; + private reconnectTimer: ReturnType | null = null; + private shouldReconnect = false; + private dashboardChannelId: string | null = null; + private dashboardReadyCallbacks: Array<(channelId: string) => void> = []; + + connect(): void { + if ( + this.ws?.readyState === WebSocket.OPEN || + this.ws?.readyState === WebSocket.CONNECTING + ) return; + + const token = localStorage.getItem('token'); + if (!token) return; + + this.shouldReconnect = true; + this.ws = new WebSocket(WS_URL); + + this.ws.onopen = () => { + this.reconnectDelay = 1000; + this.isAuthenticated = false; + this.send({ type: 'auth', token }); + }; + + this.ws.onmessage = (event) => { + try { + const msg = JSON.parse(event.data) as WsServerMessage; + if (msg.type === 'auth_success') { + this.isAuthenticated = true; + if (msg.dashboardChannelId) { + this.dashboardChannelId = msg.dashboardChannelId; + this.subscribedChannels.add(msg.dashboardChannelId); + const cbs = this.dashboardReadyCallbacks; + this.dashboardReadyCallbacks = []; + cbs.forEach((cb) => cb(msg.dashboardChannelId!)); + } + this.subscribedChannels.forEach((channel) => { + this.send({ type: 'subscribe', channel }); + }); + } else if (msg.type === 'channel-message') { + this.notify(msg.message.channel, msg.message); + } + } catch { + // ignore malformed messages + } + }; + + this.ws.onclose = () => { + this.isAuthenticated = false; + if (this.shouldReconnect) this.scheduleReconnect(); + }; + + this.ws.onerror = () => { + this.ws?.close(); + }; + } + + disconnect(): void { + this.shouldReconnect = false; + this.isAuthenticated = false; + this.dashboardChannelId = null; + if (this.reconnectTimer) clearTimeout(this.reconnectTimer); + this.ws?.close(); + this.ws = null; + } + + getDashboardChannelId(): string | null { + return this.dashboardChannelId; + } + + onDashboardReady(cb: (channelId: string) => void): () => void { + if (this.dashboardChannelId) { + cb(this.dashboardChannelId); + return () => {}; + } + this.dashboardReadyCallbacks.push(cb); + return () => { + this.dashboardReadyCallbacks = this.dashboardReadyCallbacks.filter((c) => c !== cb); + }; + } + + subscribe(channel: string, callback: MessageCallback): () => void { + if (!this.subscribers.has(channel)) { + this.subscribers.set(channel, new Set()); + } + this.subscribers.get(channel)!.add(callback); + this.subscribedChannels.add(channel); + this.connect(); + + if (this.ws?.readyState === WebSocket.OPEN && this.isAuthenticated) { + this.send({ type: 'subscribe', channel }); + } + + return () => { + const subs = this.subscribers.get(channel); + if (!subs) return; + subs.delete(callback); + if (subs.size === 0) { + this.subscribers.delete(channel); + this.subscribedChannels.delete(channel); + if (this.ws?.readyState === WebSocket.OPEN && this.isAuthenticated) { + this.send({ type: 'unsubscribe', channel }); + } + } + }; + } + + publish(channel: string, message: InboundMessage): void { + if (this.ws?.readyState === WebSocket.OPEN && this.isAuthenticated) { + this.send({ type: 'channel-message', message }); + } + } + + private send(msg: WsClientMessage): void { + this.ws?.send(JSON.stringify(msg)); + } + + private notify(channel: string, message: OutboundMessage): void { + this.subscribers.get(channel)?.forEach((cb) => cb(message)); + } + + private scheduleReconnect(): void { + this.reconnectTimer = setTimeout(() => { + this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY); + this.connect(); + }, this.reconnectDelay); + } +} + +export const eventManager = new EventManager(); diff --git a/apps/web/src/lib/services/api.ts b/apps/web/src/lib/services/api.ts new file mode 100644 index 0000000..3429c15 --- /dev/null +++ b/apps/web/src/lib/services/api.ts @@ -0,0 +1,67 @@ +import axios from 'axios'; +import type { AuthResponse, User, UpdateUserRequest, Artifact } from '@multiplayer-base/shared-types'; + +const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000'; + +const client = axios.create({ baseURL: API_URL }); + +client.interceptors.request.use((config) => { + const token = localStorage.getItem('token'); + if (token) { + config.headers['Authorization'] = `Bearer ${token}`; + } + return config; +}); + +export async function apiLogin(email: string, password: string): Promise { + const { data } = await client.post('/api/auth/login', { email, password }); + return data; +} + +export async function apiRegister( + email: string, + password: string, + confirmPassword: string +): Promise { + const { data } = await client.post('/api/auth/register', { + email, + password, + confirmPassword, + }); + return data; +} + +export async function apiGetUsers(): Promise { + const { data } = await client.get('/api/users'); + return data; +} + +export async function apiGetMe(): Promise { + const { data } = await client.get('/api/users/me'); + return data; +} + +export async function apiUpdateMe(updates: UpdateUserRequest): Promise { + const { data } = await client.patch('/api/users/me', updates); + return data; +} + +export async function apiExchangeOAuthCode(code: string): Promise { + const { data } = await client.post<{ token: string }>('/api/auth/exchange', { code }); + return data.token; +} + +export async function apiGetDocuments(): Promise { + const { data } = await client.get('/api/documents'); + return data; +} + +export async function apiCreateDocument(name: string): Promise { + const { data } = await client.post('/api/documents', { name }); + return data; +} + +export async function apiGetDocument(id: string): Promise { + const { data } = await client.get(`/api/documents/${id}`); + return data; +} diff --git a/apps/web/src/lib/services/documentModelStore.ts b/apps/web/src/lib/services/documentModelStore.ts new file mode 100644 index 0000000..b30b26a --- /dev/null +++ b/apps/web/src/lib/services/documentModelStore.ts @@ -0,0 +1,218 @@ +import type { ActionItem, InitializeClientMessage, LayoutNode, OutboundMessage, UpdateStateMessage, InboundMessage } from '@multiplayer-base/shared-types'; +import { eventManager } from './EventManager'; + +interface DocState { + state: Record; + temp: Record; +} + +export interface DocModel { + layoutConfig: LayoutNode[]; + docState: DocState; +} + +interface ChannelData { + docState: DocState; + layouts: Map; + snapshots: Map; + stateInitialized: boolean; +} + +const EMPTY_MODEL: DocModel = { + layoutConfig: [], + docState: { state: {}, temp: {} }, +}; + +const channelData = new Map(); +const listeners = new Map void>>(); // key: "channelId:viewHandler" +const chSubscribed = new Set(); +const vhEmitted = new Set(); // key: "channelId:viewHandler" +const pendingUpdates = new Map(); + +function getOrCreateChannelData(channelId: string): ChannelData { + if (!channelData.has(channelId)) { + channelData.set(channelId, { + docState: { state: {}, temp: {} }, + layouts: new Map(), + snapshots: new Map(), + stateInitialized: false, + }); + } + return channelData.get(channelId)!; +} + +function notifyAll(channelId: string): void { + const prefix = `${channelId}:`; + for (const [key, cbs] of listeners) { + if (key.startsWith(prefix)) cbs.forEach((cb) => cb()); + } +} + +export function subscribeToModel(channelId: string, viewHandler: string, cb: () => void): () => void { + const key = `${channelId}:${viewHandler}`; + if (!listeners.has(key)) listeners.set(key, new Set()); + listeners.get(key)!.add(cb); + return () => listeners.get(key)?.delete(cb); +} + +export function getModelSnapshot(channelId: string, viewHandler: string): DocModel { + const data = channelData.get(channelId); + if (!data?.stateInitialized || !data.layouts.has(viewHandler)) { + return EMPTY_MODEL; + } + return data.snapshots.get(viewHandler) ?? EMPTY_MODEL; +} + +// --- state mutation --- + +function getAtPath(obj: Record, path: string): unknown { + return path.split('.').reduce((curr, key) => { + if (curr == null || typeof curr !== 'object') return undefined; + return (curr as Record)[key]; + }, obj); +} + +function setAtPath(obj: Record, path: string, value: unknown): Record { + const keys = path.split('.'); + const result = { ...obj }; + let curr: Record = result; + for (let i = 0; i < keys.length - 1; i++) { + const k = keys[i]; + curr[k] = typeof curr[k] === 'object' && curr[k] !== null ? { ...(curr[k] as Record) } : {}; + curr = curr[k] as Record; + } + curr[keys[keys.length - 1]] = value; + return result; +} + +function applyAction(next: Record, action: ActionItem): Record { + const { actionType, path, value, keys } = action; + const resolvedPath = path.startsWith('$') ? path.slice(1) : path; + switch (actionType) { + case 'update': + return setAtPath(next, resolvedPath, value); + case 'merge': { + const existing = (getAtPath(next, resolvedPath) as Record) ?? {}; + return setAtPath(next, resolvedPath, { ...existing, ...(value as Record) }); + } + case 'append': { + const existing = (getAtPath(next, resolvedPath) as unknown[]) ?? []; + const items = Array.isArray(value) ? value : [value]; + return setAtPath(next, resolvedPath, [...existing, ...items]); + } + case 'prepend': { + const existing = (getAtPath(next, resolvedPath) as unknown[]) ?? []; + const items = Array.isArray(value) ? value : [value]; + return setAtPath(next, resolvedPath, [...items, ...existing]); + } + case 'upsert': { + if (!keys?.length) { console.error('applyAction: upsert missing keys', action); return next; } + const item = value as Record; + const existing = (getAtPath(next, resolvedPath) as unknown[]) ?? []; + const idx = existing.findIndex((el) => + keys.every((k) => (el as Record)[k] === item[k]) + ); + const updated = [...existing]; + if (idx >= 0) updated[idx] = item; else updated.push(item); + return setAtPath(next, resolvedPath, updated); + } + case 'remove': { + if (!keys?.length) { console.error('applyAction: remove missing keys', action); return next; } + const matcher = value as Record; + const existing = (getAtPath(next, resolvedPath) as unknown[]) ?? []; + return setAtPath(next, resolvedPath, existing.filter( + (el) => !keys.every((k) => (el as Record)[k] === matcher[k]) + )); + } + default: + return next; + } +} + +function applyActions(prev: DocState, msg: UpdateStateMessage): DocState { + if (!msg.actions?.length) return prev; + let next = prev as unknown as Record; + for (const action of msg.actions) { + next = applyAction(next, action); + } + return next as unknown as DocState; +} + +function rebuildAllSnapshots(data: ChannelData): void { + for (const [vh, layout] of data.layouts) { + data.snapshots.set(vh, { layoutConfig: layout, docState: data.docState }); + } +} + +// --- channel lifecycle --- + +function handleMessage(channelId: string, msg: OutboundMessage): void { + const m = msg as unknown as Record; + + if (m['type'] === 'initialize-client') { + const im = msg as unknown as InitializeClientMessage; + const vh = im.viewHandler ?? 'defaultView'; + const layout = im.layoutConfig ?? []; + const data = getOrCreateChannelData(channelId); + + if (im.initialState !== undefined) { + data.stateInitialized = true; + data.docState = { + state: im.initialState, + temp: {}, + }; + const pending = pendingUpdates.get(channelId); + if (pending?.length) { + pendingUpdates.delete(channelId); + for (const um of pending) { + data.docState = applyActions(data.docState, um); + } + } + rebuildAllSnapshots(data); + } + + if (layout.length > 0) { + data.layouts.set(vh, layout); + data.snapshots.set(vh, { layoutConfig: layout, docState: data.docState }); + } + } else if (m['type'] === 'update-state') { + const data = channelData.get(channelId); + const um = msg as unknown as UpdateStateMessage; + if (!data?.stateInitialized) { + if (!pendingUpdates.has(channelId)) pendingUpdates.set(channelId, []); + pendingUpdates.get(channelId)!.push(um); + return; + } + data.docState = applyActions(data.docState, um); + rebuildAllSnapshots(data); + } else { + return; + } + + notifyAll(channelId); +} + +export function mountChannel( + channelId: string, + emit: (type: string, payload?: Record) => void, + viewHandler: string +): void { + if (!channelId) return; + + if (!chSubscribed.has(channelId)) { + chSubscribed.add(channelId); + eventManager.subscribe(channelId, (msg) => handleMessage(channelId, msg)); + } + + const initKey = `${channelId}:initializeState`; + if (!vhEmitted.has(initKey) && !channelData.get(channelId)?.stateInitialized) { + vhEmitted.add(initKey); + emit('initializeState'); + } + + const key = `${channelId}:${viewHandler}`; + if (!vhEmitted.has(key)) { + vhEmitted.add(key); + emit(viewHandler); + } +} diff --git a/apps/web/src/lib/stores/auth.ts b/apps/web/src/lib/stores/auth.ts new file mode 100644 index 0000000..7e902e8 --- /dev/null +++ b/apps/web/src/lib/stores/auth.ts @@ -0,0 +1,80 @@ +import { writable } from 'svelte/store'; +import type { User } from '@multiplayer-base/shared-types'; +import { apiLogin, apiRegister, apiGetMe } from '$lib/services/api'; +import { eventManager } from '$lib/services/EventManager'; + +interface AuthState { + user: User | null; + token: string | null; + isLoading: boolean; +} + +function createAuthStore() { + const { subscribe, set, update } = writable({ + user: null, + token: null, + isLoading: true, + }); + + return { + subscribe, + + async init() { + const storedToken = localStorage.getItem('token'); + if (!storedToken) { + update((s) => ({ ...s, isLoading: false })); + return; + } + update((s) => ({ ...s, token: storedToken })); + try { + const user = await apiGetMe(); + localStorage.setItem('user', JSON.stringify(user)); + update((s) => ({ ...s, user, isLoading: false })); + eventManager.connect(); + } catch { + localStorage.removeItem('token'); + localStorage.removeItem('user'); + update((s) => ({ ...s, token: null, isLoading: false })); + } + }, + + async login(email: string, password: string) { + const data = await apiLogin(email, password); + localStorage.setItem('token', data.token); + localStorage.setItem('user', JSON.stringify(data.user)); + set({ user: data.user, token: data.token, isLoading: false }); + eventManager.connect(); + }, + + async register(email: string, password: string, confirmPassword: string) { + const data = await apiRegister(email, password, confirmPassword); + localStorage.setItem('token', data.token); + localStorage.setItem('user', JSON.stringify(data.user)); + set({ user: data.user, token: data.token, isLoading: false }); + eventManager.connect(); + }, + + logout() { + eventManager.disconnect(); + localStorage.removeItem('token'); + localStorage.removeItem('user'); + set({ user: null, token: null, isLoading: false }); + }, + + setUser(user: User) { + update((s) => ({ ...s, user })); + localStorage.setItem('user', JSON.stringify(user)); + }, + + setToken(token: string) { + update((s) => ({ ...s, token })); + localStorage.setItem('token', token); + }, + }; +} + +export const authStore = createAuthStore(); + +export function initAuth() { + authStore.init(); +} diff --git a/apps/web/src/lib/stores/dashboardChannelId.ts b/apps/web/src/lib/stores/dashboardChannelId.ts new file mode 100644 index 0000000..52c8df9 --- /dev/null +++ b/apps/web/src/lib/stores/dashboardChannelId.ts @@ -0,0 +1,15 @@ +import { writable } from 'svelte/store'; +import { eventManager } from '$lib/services/EventManager'; + +function createDashboardChannelIdStore() { + const { subscribe, set } = writable(null); + + const initial = eventManager.getDashboardChannelId(); + if (initial) set(initial); + + eventManager.onDashboardReady((id) => set(id)); + + return { subscribe }; +} + +export const dashboardChannelId = createDashboardChannelIdStore(); diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte new file mode 100644 index 0000000..f0fe7a1 --- /dev/null +++ b/apps/web/src/routes/+layout.svelte @@ -0,0 +1,17 @@ + + +{@render children()} diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte new file mode 100644 index 0000000..7af8203 --- /dev/null +++ b/apps/web/src/routes/+page.svelte @@ -0,0 +1,8 @@ + diff --git a/apps/web/src/routes/auth/callback/+page.svelte b/apps/web/src/routes/auth/callback/+page.svelte new file mode 100644 index 0000000..5d8e0aa --- /dev/null +++ b/apps/web/src/routes/auth/callback/+page.svelte @@ -0,0 +1,31 @@ + + +
Signing you in...
diff --git a/apps/web/src/routes/dashboard/+layout.svelte b/apps/web/src/routes/dashboard/+layout.svelte new file mode 100644 index 0000000..cf46e4d --- /dev/null +++ b/apps/web/src/routes/dashboard/+layout.svelte @@ -0,0 +1,18 @@ + + +{#if $authStore.isLoading} +
Loading...
+{:else if $authStore.user} + {@render children()} +{/if} diff --git a/apps/web/src/routes/dashboard/+page.svelte b/apps/web/src/routes/dashboard/+page.svelte new file mode 100644 index 0000000..831bb1b --- /dev/null +++ b/apps/web/src/routes/dashboard/+page.svelte @@ -0,0 +1,25 @@ + + +
+ +
+

Welcome back, {$authStore.user?.email}

+
+ {#each DASHBOARD_CARDS as card (card.path)} + +

{card.label}

+

{card.description}

+
+ {/each} +
+
+
diff --git a/apps/web/src/routes/dashboard/admin/+page.svelte b/apps/web/src/routes/dashboard/admin/+page.svelte new file mode 100644 index 0000000..51c392c --- /dev/null +++ b/apps/web/src/routes/dashboard/admin/+page.svelte @@ -0,0 +1,52 @@ + + +
+ +
+

User Management

+ {#if isLoading} +

Loading...

+ {:else if error} + + {:else} + + + + + + + + + {#each users as u (u._id)} + + + + + {/each} + +
EmailJoined
+ {u.email} + {#if u._id === $authStore.user?._id} + you + {/if} + {new Date(u.createdAt).toLocaleDateString()}
+ {/if} +
+
diff --git a/apps/web/src/routes/dashboard/author/+page.svelte b/apps/web/src/routes/dashboard/author/+page.svelte new file mode 100644 index 0000000..eab88f1 --- /dev/null +++ b/apps/web/src/routes/dashboard/author/+page.svelte @@ -0,0 +1,10 @@ + + +
+ +
+

Author dashboard coming soon.

+
+
diff --git a/apps/web/src/routes/dashboard/user/+page.svelte b/apps/web/src/routes/dashboard/user/+page.svelte new file mode 100644 index 0000000..40f0625 --- /dev/null +++ b/apps/web/src/routes/dashboard/user/+page.svelte @@ -0,0 +1,16 @@ + + +
+ +
+ {#if $dashboardChannelId} + + {:else} +

Loading…

+ {/if} +
+
diff --git a/apps/web/src/routes/login/+page.svelte b/apps/web/src/routes/login/+page.svelte new file mode 100644 index 0000000..c75d365 --- /dev/null +++ b/apps/web/src/routes/login/+page.svelte @@ -0,0 +1,58 @@ + + +
+
+

Sign In

+ {#if error} + + {/if} +
+
+ + +
+
+ + +
+ +
+
or
+ + + Continue with Google + + +
+
diff --git a/apps/web/src/routes/register/+page.svelte b/apps/web/src/routes/register/+page.svelte new file mode 100644 index 0000000..de4e465 --- /dev/null +++ b/apps/web/src/routes/register/+page.svelte @@ -0,0 +1,67 @@ + + +
+
+

Create Account

+ {#if error} + + {/if} +
+
+ + +
+
+ + +
+
+ + +
+ +
+
or
+ + + Continue with Google + + +
+
diff --git a/apps/web/src/routes/settings/+page.svelte b/apps/web/src/routes/settings/+page.svelte new file mode 100644 index 0000000..cd12cff --- /dev/null +++ b/apps/web/src/routes/settings/+page.svelte @@ -0,0 +1,100 @@ + + +
+ + +
+
+

Account Settings

+ {#if error} + + {/if} + {#if success} +
{success}
+ {/if} +
+
+ + +
+ +
+

Change Password

+

Leave blank to keep your current password.

+ +
+ + +
+
+ + +
+
+ + +
+ + +
+
+
+
diff --git a/apps/web/svelte.config.js b/apps/web/svelte.config.js new file mode 100644 index 0000000..2e59b35 --- /dev/null +++ b/apps/web/svelte.config.js @@ -0,0 +1,15 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +export default { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + fallback: 'index.html' + }), + alias: { + '@': './src', + '@multiplayer-base/shared-types': '../../libs/shared-types/src/index.ts' + } + } +}; diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js index 315d739..11ac68e 100644 --- a/apps/web/tailwind.config.js +++ b/apps/web/tailwind.config.js @@ -1,7 +1,7 @@ /** @type {import('tailwindcss').Config} */ -module.exports = { +export default { darkMode: ['class'], - content: ['./apps/web/src/**/*.{ts,tsx}'], + content: ['./src/**/*.{html,js,ts,svelte}'], theme: { extend: { colors: { @@ -47,10 +47,10 @@ module.exports = { keyframes: { 'accordion-down': { from: { height: '0' }, - to: { height: 'var(--radix-accordion-content-height)' }, + to: { height: 'var(--bits-accordion-content-height)' }, }, 'accordion-up': { - from: { height: 'var(--radix-accordion-content-height)' }, + from: { height: 'var(--bits-accordion-content-height)' }, to: { height: '0' }, }, }, diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 0f21f72..3ff6926 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -1,16 +1,6 @@ { - "extends": "../../tsconfig.base.json", + "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { - "jsx": "react-jsx", - "allowJs": false, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, "strict": true - }, - "files": [], - "include": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.spec.json" } - ] + } } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..e2c2cd9 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,9 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()], + server: { + port: 4200 + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e4cb75..30ec3ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,7 +98,7 @@ importers: version: 20.8.4(@babel/traverse@7.29.0)(@types/node@20.19.39)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.9.3))(typescript@5.9.3) '@nx/react': specifier: ^20.0.0 - version: 20.8.4(@babel/traverse@7.29.0)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) + version: 20.8.4(@babel/traverse@7.29.0)(@swc/helpers@0.5.23)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) '@nx/web': specifier: ^20.0.0 version: 20.8.4(@babel/traverse@7.29.0)(nx@20.8.4) @@ -199,6 +199,34 @@ importers: specifier: ^8.1.1 version: 8.1.1(@wdio/types@8.41.0)(chromedriver@125.0.3)(webdriverio@8.46.0(encoding@0.1.13)) + apps/web: + dependencies: + bits-ui: + specifier: ^1.3.22 + version: 1.8.0(svelte@5.56.3) + lucide-svelte: + specifier: ^0.511.0 + version: 0.511.0(svelte@5.56.3) + devDependencies: + '@sveltejs/adapter-static': + specifier: ^3.0.8 + version: 3.0.10(@sveltejs/kit@2.65.2(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(typescript@5.9.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3))) + '@sveltejs/kit': + specifier: ^2.21.4 + version: 2.65.2(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(typescript@5.9.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.3 + version: 5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + svelte: + specifier: ^5.34.1 + version: 5.56.3 + svelte-check: + specifier: ^4.2.1 + version: 4.6.0(picomatch@4.0.4)(svelte@5.56.3)(typescript@5.9.3) + vite: + specifier: ^6.3.5 + version: 6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3) + packages: '@alloc/quick-lru@5.2.0': @@ -882,138 +910,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1052,6 +1236,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -1072,6 +1265,9 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@internationalized/date@3.12.2': + resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==} + '@ioredis/commands@1.5.1': resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} @@ -1507,6 +1703,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@promptbook/utils@0.69.5': resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} @@ -1703,6 +1902,131 @@ packages: resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} engines: {node: '>=14.0.0'} + '@rollup/rollup-android-arm-eabi@4.62.0': + resolution: {integrity: sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.0': + resolution: {integrity: sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.0': + resolution: {integrity: sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.0': + resolution: {integrity: sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.0': + resolution: {integrity: sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.0': + resolution: {integrity: sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.0': + resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.62.0': + resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.62.0': + resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.62.0': + resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.62.0': + resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.0': + resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.62.0': + resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.0': + resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.62.0': + resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.62.0': + resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.62.0': + resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.62.0': + resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.62.0': + resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.62.0': + resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.0': + resolution: {integrity: sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.0': + resolution: {integrity: sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.0': + resolution: {integrity: sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.0': + resolution: {integrity: sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.0': + resolution: {integrity: sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==} + cpu: [x64] + os: [win32] + '@rspack/binding-darwin-arm64@1.7.11': resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} cpu: [arm64] @@ -1780,6 +2104,54 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/acorn-typescript@1.0.10': + resolution: {integrity: sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-static@3.0.10': + resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.65.2': + resolution: {integrity: sha512-ZIkyEmxT1gcq50Opn1ZIIx6vc/yt2zNN0rF5hS6op95gqHtNw8QMKDhjJI+RyjMcbvECRw+FzEeAoBe/MOz9AA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 || ^6.0.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/load-config@0.1.1': + resolution: {integrity: sha512-BXXm+VOH/9X4N7Dd1iZ2MqA1h7M+9i2noI8QYuLDY8QcN2WHYn7D/VK/+IJNfcAmRw7ACNJ538UT9GXIhnBTiA==} + engines: {node: '>= 18.0.0'} + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1858,6 +2230,9 @@ packages: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -1907,6 +2282,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} @@ -1922,6 +2300,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.19.8': resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} @@ -2029,6 +2410,9 @@ packages: '@types/supertest@6.0.3': resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} @@ -2300,6 +2684,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -2341,6 +2729,10 @@ packages: axios@1.15.2: resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} peerDependencies: @@ -2497,6 +2889,12 @@ packages: binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + bits-ui@1.8.0: + resolution: {integrity: sha512-CXD6Orp7l8QevNDcRPLXc/b8iMVgxDWT2LyTwsdLzJKh9CxesOmPuNePSPqAxKoT59FIdU4aFPS1k7eBdbaCxg==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.11.0 + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -2790,6 +3188,10 @@ packages: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -2877,6 +3279,9 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -3021,6 +3426,9 @@ packages: engines: {node: '>= 4.0.0'} hasBin: true + devalue@5.8.1: + resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + devtools-protocol@0.0.1232444: resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} @@ -3182,6 +3590,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3236,6 +3649,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3249,6 +3665,14 @@ packages: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} + esrap@2.2.11: + resolution: {integrity: sha512-gPdx+I+BjYEinNMQaBXFjbaJVyoPMU4ZODg5mE+M4DqVG9VusAVHHjcBX+zqyITlI0DIARwDMMzZwAWj36dRoQ==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3770,6 +4194,9 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inquirer@9.2.12: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} @@ -3846,6 +4273,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -4154,6 +4584,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} @@ -4213,6 +4647,9 @@ packages: locate-app@2.5.0: resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4326,6 +4763,12 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-svelte@0.511.0: + resolution: {integrity: sha512-cSBj1UPKt1EXnj3VBUidBqwHyFQ83pLYiTaQ/67Q5thnaP9IPohL2UXjqEzgSXXklYPYQKaAv+kmVdliDWFjWQ==} + deprecated: Package deprecated. Please use @lucide/svelte instead. + peerDependencies: + svelte: ^3 || ^4 || ^5.0.0-next.42 + luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} @@ -4572,6 +5015,14 @@ packages: resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} engines: {node: '>=14.0.0'} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -5209,6 +5660,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.62.0: + resolution: {integrity: sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -5216,9 +5672,18 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safaridriver@0.1.2: resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} @@ -5286,6 +5751,9 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + set-cookie-parser@3.1.0: + resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -5334,6 +5802,10 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5476,6 +5948,9 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -5505,6 +5980,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-check@4.6.0: + resolution: {integrity: sha512-KhVnDFDSid57mmZtHz8gfW8AAGylOZ0vPnOIzVmAL+urzwK8sBYXRss953gD8T0OdgAQ11mdWhE6uadmtOz8TQ==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + + svelte@5.56.3: + resolution: {integrity: sha512-w7JvrM5IFl5cmfbY0TLik9o7mjRUJmRMhOR51tBPu708Gr/MjbGs7VnJnr/B0CaXeI4vtnOh7RKxDr0cwhMdDA==} + engines: {node: '>=18'} + svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} @@ -5513,6 +6006,9 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} @@ -5613,6 +6109,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + touch@3.1.1: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true @@ -5831,6 +6331,54 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + wait-port@1.1.0: resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} engines: {node: '>=10'} @@ -6047,6 +6595,9 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -6909,72 +7460,150 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/android-arm64@0.19.12': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm@0.19.12': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-x64@0.19.12': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.19.12': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.19.12': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.19.12': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.19.12': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.19.12': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm@0.19.12': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-ia32@0.19.12': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-loong64@0.19.12': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.19.12': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.19.12': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.19.12': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-s390x@0.19.12': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-x64@0.19.12': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.19.12': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.19.12': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.19.12': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.19.12': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-ia32@0.19.12': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-x64@0.19.12': optional: true + '@esbuild/win32-x64@0.25.12': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': dependencies: eslint: 9.39.4(jiti@1.21.7) @@ -7021,6 +7650,17 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -7037,6 +7677,10 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@internationalized/date@3.12.2': + dependencies: + '@swc/helpers': 0.5.23 + '@ioredis/commands@1.5.1': {} '@isaacs/cliui@8.0.2': @@ -7331,7 +7975,7 @@ snapshots: - node-fetch - utf-8-validate - '@module-federation/enhanced@0.9.1(@rspack/core@1.7.11)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': + '@module-federation/enhanced@0.9.1(@rspack/core@1.7.11(@swc/helpers@0.5.23))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 '@module-federation/data-prefetch': 0.9.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -7340,7 +7984,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.9.1(@module-federation/runtime-tools@0.9.1) '@module-federation/managers': 0.9.1 '@module-federation/manifest': 0.9.1(typescript@5.9.3) - '@module-federation/rspack': 0.9.1(@rspack/core@1.7.11)(typescript@5.9.3) + '@module-federation/rspack': 0.9.1(@rspack/core@1.7.11(@swc/helpers@0.5.23))(typescript@5.9.3) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 btoa: 1.2.1 @@ -7357,7 +8001,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@2.4.0(@rspack/core@1.7.11)(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': + '@module-federation/enhanced@2.4.0(@rspack/core@1.7.11(@swc/helpers@0.5.23))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': dependencies: '@module-federation/bridge-react-webpack-plugin': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/cli': 2.4.0(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) @@ -7366,7 +8010,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 2.4.0(@module-federation/runtime-tools@2.4.0(node-fetch@2.7.0(encoding@0.1.13))) '@module-federation/managers': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/manifest': 2.4.0(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) - '@module-federation/rspack': 2.4.0(@rspack/core@1.7.11)(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) + '@module-federation/rspack': 2.4.0(@rspack/core@1.7.11(@swc/helpers@0.5.23))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) '@module-federation/runtime-tools': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/sdk': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/webpack-bundler-runtime': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) @@ -7437,9 +8081,9 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/node@2.7.42(@rspack/core@1.7.11)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': + '@module-federation/node@2.7.42(@rspack/core@1.7.11(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': dependencies: - '@module-federation/enhanced': 2.4.0(@rspack/core@1.7.11)(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) + '@module-federation/enhanced': 2.4.0(@rspack/core@1.7.11(@swc/helpers@0.5.23))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) '@module-federation/runtime': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/sdk': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) encoding: 0.1.13 @@ -7454,7 +8098,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.9.1(@rspack/core@1.7.11)(typescript@5.9.3)': + '@module-federation/rspack@0.9.1(@rspack/core@1.7.11(@swc/helpers@0.5.23))(typescript@5.9.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 '@module-federation/dts-plugin': 0.9.1(typescript@5.9.3) @@ -7463,7 +8107,7 @@ snapshots: '@module-federation/manifest': 0.9.1(typescript@5.9.3) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 - '@rspack/core': 1.7.11 + '@rspack/core': 1.7.11(@swc/helpers@0.5.23) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -7472,7 +8116,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@2.4.0(@rspack/core@1.7.11)(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)': + '@module-federation/rspack@2.4.0(@rspack/core@1.7.11(@swc/helpers@0.5.23))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/dts-plugin': 2.4.0(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) @@ -7481,7 +8125,7 @@ snapshots: '@module-federation/manifest': 2.4.0(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3) '@module-federation/runtime-tools': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) '@module-federation/sdk': 2.4.0(node-fetch@2.7.0(encoding@0.1.13)) - '@rspack/core': 1.7.11 + '@rspack/core': 1.7.11(@swc/helpers@0.5.23) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -7731,15 +8375,15 @@ snapshots: - nx - supports-color - '@nx/module-federation@20.8.4(@babel/traverse@7.29.0)(esbuild@0.19.12)(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)': + '@nx/module-federation@20.8.4(@babel/traverse@7.29.0)(@swc/helpers@0.5.23)(esbuild@0.19.12)(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)': dependencies: - '@module-federation/enhanced': 0.9.1(@rspack/core@1.7.11)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) - '@module-federation/node': 2.7.42(@rspack/core@1.7.11)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) + '@module-federation/enhanced': 0.9.1(@rspack/core@1.7.11(@swc/helpers@0.5.23))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) + '@module-federation/node': 2.7.42(@rspack/core@1.7.11(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12)) '@module-federation/sdk': 0.9.1 '@nx/devkit': 20.8.4(nx@20.8.4) '@nx/js': 20.8.4(@babel/traverse@7.29.0)(nx@20.8.4) '@nx/web': 20.8.4(@babel/traverse@7.29.0)(nx@20.8.4) - '@rspack/core': 1.7.11 + '@rspack/core': 1.7.11(@swc/helpers@0.5.23) express: 4.22.1 http-proxy-middleware: 3.0.5 picocolors: 1.1.1 @@ -7817,12 +8461,12 @@ snapshots: '@nx/nx-win32-x64-msvc@20.8.4': optional: true - '@nx/react@20.8.4(@babel/traverse@7.29.0)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': + '@nx/react@20.8.4(@babel/traverse@7.29.0)(@swc/helpers@0.5.23)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)(webpack@5.106.2(esbuild@0.19.12))': dependencies: '@nx/devkit': 20.8.4(nx@20.8.4) '@nx/eslint': 20.8.4(@babel/traverse@7.29.0)(@zkochan/js-yaml@0.0.7)(eslint@9.39.4(jiti@1.21.7))(nx@20.8.4) '@nx/js': 20.8.4(@babel/traverse@7.29.0)(nx@20.8.4) - '@nx/module-federation': 20.8.4(@babel/traverse@7.29.0)(esbuild@0.19.12)(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3) + '@nx/module-federation': 20.8.4(@babel/traverse@7.29.0)(@swc/helpers@0.5.23)(esbuild@0.19.12)(nx@20.8.4)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3) '@nx/web': 20.8.4(@babel/traverse@7.29.0)(nx@20.8.4) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.3) '@svgr/webpack': 8.1.0(typescript@5.9.3) @@ -7899,6 +8543,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@polka/url@1.0.0-next.29': {} + '@promptbook/utils@0.69.5': dependencies: spacetrim: 0.11.59 @@ -8085,6 +8731,81 @@ snapshots: '@remix-run/router@1.23.2': {} + '@rollup/rollup-android-arm-eabi@4.62.0': + optional: true + + '@rollup/rollup-android-arm64@4.62.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.0': + optional: true + + '@rollup/rollup-darwin-x64@4.62.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.0': + optional: true + '@rspack/binding-darwin-arm64@1.7.11': optional: true @@ -8130,11 +8851,13 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.7.11 '@rspack/binding-win32-x64-msvc': 1.7.11 - '@rspack/core@1.7.11': + '@rspack/core@1.7.11(@swc/helpers@0.5.23)': dependencies: '@module-federation/runtime-tools': 0.22.0 '@rspack/binding': 1.7.11 '@rspack/lite-tapable': 1.1.0 + optionalDependencies: + '@swc/helpers': 0.5.23 '@rspack/lite-tapable@1.1.0': {} @@ -8150,6 +8873,60 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@standard-schema/spec@1.1.0': {} + + '@sveltejs/acorn-typescript@1.0.10(acorn@8.16.0)': + dependencies: + acorn: 8.16.0 + + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.65.2(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(typescript@5.9.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))': + dependencies: + '@sveltejs/kit': 2.65.2(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(typescript@5.9.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + + '@sveltejs/kit@2.65.2(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(typescript@5.9.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.16.0) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + '@types/cookie': 0.6.0 + acorn: 8.16.0 + cookie: 0.6.0 + devalue: 5.8.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.1.0 + sirv: 3.0.2 + svelte: 5.56.3 + vite: 6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3) + optionalDependencies: + typescript: 5.9.3 + + '@sveltejs/load-config@0.1.1': {} + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + debug: 4.4.3(supports-color@5.5.0) + svelte: 5.56.3 + vite: 6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)))(svelte@5.56.3)(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + debug: 4.4.3(supports-color@5.5.0) + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.56.3 + vite: 6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3) + vitefu: 1.1.3(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)) + transitivePeerDependencies: + - supports-color + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -8243,6 +9020,10 @@ snapshots: - supports-color - typescript + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -8300,6 +9081,8 @@ snapshots: dependencies: '@types/node': 20.19.39 + '@types/cookie@0.6.0': {} + '@types/cookiejar@2.1.5': {} '@types/cors@2.8.19': @@ -8318,6 +9101,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.19.8': dependencies: '@types/node': 20.19.39 @@ -8449,6 +9234,8 @@ snapshots: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 + '@types/trusted-types@2.0.7': {} + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-url@11.0.5': @@ -8872,6 +9659,8 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.1: {} + aria-query@5.3.2: {} array-flatten@1.1.1: {} @@ -8911,6 +9700,8 @@ snapshots: transitivePeerDependencies: - debug + axobject-query@4.1.0: {} + b4a@1.8.0: {} babel-jest@29.7.0(@babel/core@7.29.0): @@ -9083,6 +9874,18 @@ snapshots: buffers: 0.1.1 chainsaw: 0.1.0 + bits-ui@1.8.0(svelte@5.56.3): + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/dom': 1.7.6 + '@internationalized/date': 3.12.2 + css.escape: 1.5.1 + esm-env: 1.2.2 + runed: 0.23.4(svelte@5.56.3) + svelte: 5.56.3 + svelte-toolbelt: 0.7.1(svelte@5.56.3) + tabbable: 6.4.0 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -9369,6 +10172,8 @@ snapshots: cookie-signature@1.2.2: {} + cookie@0.6.0: {} + cookie@0.7.2: {} cookiejar@2.1.4: {} @@ -9472,6 +10277,8 @@ snapshots: css-what@6.2.2: {} + css.escape@1.5.1: {} + cssesc@3.0.0: {} csso@5.0.5: @@ -9571,6 +10378,8 @@ snapshots: transitivePeerDependencies: - supports-color + devalue@5.8.1: {} + devtools-protocol@0.0.1232444: {} devtools-protocol@0.0.1400418: {} @@ -9746,6 +10555,35 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -9821,6 +10659,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + espree@10.4.0: dependencies: acorn: 8.16.0 @@ -9833,6 +10673,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@2.2.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -10488,6 +11332,8 @@ snapshots: ini@1.3.8: {} + inline-style-parser@0.2.7: {} + inquirer@9.2.12: dependencies: '@ljharb/through': 2.3.14 @@ -10566,6 +11412,10 @@ snapshots: is-plain-object@5.0.0: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -11066,6 +11916,8 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + koa-compose@4.1.0: {} koa-convert@2.0.0: @@ -11142,6 +11994,8 @@ snapshots: type-fest: 4.26.0 userhome: 1.0.1 + locate-character@3.0.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -11233,6 +12087,10 @@ snapshots: dependencies: react: 19.2.6 + lucide-svelte@0.511.0(svelte@5.56.3): + dependencies: + svelte: 5.56.3 + luxon@3.7.2: {} magic-string@0.30.21: @@ -11460,6 +12318,10 @@ snapshots: transitivePeerDependencies: - supports-color + mri@1.2.0: {} + + mrmime@2.0.1: {} + ms@2.0.0: {} ms@2.1.2: {} @@ -11897,7 +12759,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.4 - debug: 4.3.4 + debug: 4.4.3(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -12143,16 +13005,56 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.62.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.0 + '@rollup/rollup-android-arm64': 4.62.0 + '@rollup/rollup-darwin-arm64': 4.62.0 + '@rollup/rollup-darwin-x64': 4.62.0 + '@rollup/rollup-freebsd-arm64': 4.62.0 + '@rollup/rollup-freebsd-x64': 4.62.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.0 + '@rollup/rollup-linux-arm-musleabihf': 4.62.0 + '@rollup/rollup-linux-arm64-gnu': 4.62.0 + '@rollup/rollup-linux-arm64-musl': 4.62.0 + '@rollup/rollup-linux-loong64-gnu': 4.62.0 + '@rollup/rollup-linux-loong64-musl': 4.62.0 + '@rollup/rollup-linux-ppc64-gnu': 4.62.0 + '@rollup/rollup-linux-ppc64-musl': 4.62.0 + '@rollup/rollup-linux-riscv64-gnu': 4.62.0 + '@rollup/rollup-linux-riscv64-musl': 4.62.0 + '@rollup/rollup-linux-s390x-gnu': 4.62.0 + '@rollup/rollup-linux-x64-gnu': 4.62.0 + '@rollup/rollup-linux-x64-musl': 4.62.0 + '@rollup/rollup-openbsd-x64': 4.62.0 + '@rollup/rollup-openharmony-arm64': 4.62.0 + '@rollup/rollup-win32-arm64-msvc': 4.62.0 + '@rollup/rollup-win32-ia32-msvc': 4.62.0 + '@rollup/rollup-win32-x64-gnu': 4.62.0 + '@rollup/rollup-win32-x64-msvc': 4.62.0 + fsevents: 2.3.3 + run-async@3.0.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + runed@0.23.4(svelte@5.56.3): + dependencies: + esm-env: 1.2.2 + svelte: 5.56.3 + rxjs@7.8.2: dependencies: tslib: 2.8.1 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safaridriver@0.1.2: {} safe-buffer@5.1.2: {} @@ -12234,6 +13136,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@3.1.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -12291,6 +13195,12 @@ snapshots: dependencies: semver: 7.7.4 + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -12434,6 +13344,10 @@ snapshots: strnum@1.1.2: {} + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -12480,6 +13394,47 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-check@4.6.0(picomatch@4.0.4)(svelte@5.56.3)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.1.1 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.56.3 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-toolbelt@0.7.1(svelte@5.56.3): + dependencies: + clsx: 2.1.1 + runed: 0.23.4(svelte@5.56.3) + style-to-object: 1.0.14 + svelte: 5.56.3 + + svelte@5.56.3: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.16.0) + '@types/estree': 1.0.8 + '@types/trusted-types': 2.0.7 + acorn: 8.16.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.8.1 + esm-env: 1.2.2 + esrap: 2.2.11 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + svg-parser@2.0.4: {} svgo@3.3.3: @@ -12492,6 +13447,8 @@ snapshots: picocolors: 1.1.1 sax: 1.6.0 + tabbable@6.4.0: {} + tailwind-merge@3.5.0: {} tailwindcss@3.4.19(yaml@2.8.3): @@ -12641,6 +13598,8 @@ snapshots: toidentifier@1.0.1: {} + totalist@3.0.1: {} + touch@3.1.1: {} tr46@0.0.3: {} @@ -12818,6 +13777,25 @@ snapshots: vary@1.1.2: {} + vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.12 + rollup: 4.62.0 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 22.19.17 + fsevents: 2.3.3 + jiti: 2.4.2 + terser: 5.46.2 + yaml: 2.8.3 + + vitefu@1.1.3(vite@6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3)): + optionalDependencies: + vite: 6.4.3(@types/node@22.19.17)(jiti@2.4.2)(terser@5.46.2)(yaml@2.8.3) + wait-port@1.1.0: dependencies: chalk: 4.1.2 @@ -13068,6 +14046,8 @@ snapshots: yocto-queue@1.2.2: {} + zimmerframe@1.1.4: {} + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2