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}
+
+ {#each items as doc (doc._id)}
+ - onSelect?.({ documentId: doc._id })}
+ tabindex="0"
+ onkeydown={(e) => e.key === 'Enter' && onSelect?.({ documentId: doc._id })}
+ >
+ {doc.name}
+ {doc.type}
+
+ {/each}
+
+{/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 @@
+
+
+
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}
+
+
+
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}
+ {error}
+ {:else}
+
+
+
+ | Email |
+ Joined |
+
+
+
+ {#each users as u (u._id)}
+
+ |
+ {u.email}
+ {#if u._id === $authStore.user?._id}
+ you
+ {/if}
+ |
+ {new Date(u.createdAt).toLocaleDateString()} |
+
+ {/each}
+
+
+ {/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 @@
+
+
+
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}
+
{error}
+ {/if}
+
+
or
+
+
+ Continue with Google
+
+
Already have an account? Sign In
+
+
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}
+
{error}
+ {/if}
+ {#if success}
+
{success}
+ {/if}
+
+
+
+
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