From a6427ce21c0de6c6a6a11e0a1bfedc895d0da883 Mon Sep 17 00:00:00 2001 From: mikeangstadt Date: Mon, 1 Jun 2026 08:10:04 -0500 Subject: [PATCH 01/31] FEA: Replace agent-monitor sidecar with in-process SQLite database + React renderer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace agent-dashboard sidecar (external process) with in-process node:sqlite database - Create functional repository layer matching symphony-alpha patterns (sessions, agents, events, dashboard stores) - Add Vite + React 19 renderer with DesignSystemProvider shell and DS components - Add hook ingestion endpoint (POST /api/hooks/event) writing directly to local SQLite - Extend preload bridge with typed db IPC channels (db.getSessions, db.getAgents, db.getEvents, db.getDashboardSummary) - Update window.ts to load Vite-built renderer (dev server in dev, file in prod) - Vendor @closedloop-ai/design-system as file: dep with subpath component exports - Preserve legacy HTML renderer as legacy.html for strangler-fig migration via iframe - Add DashboardPage using DS Card/Badge/Button components with real-time summary queries Testing: pnpm build:renderer (Vite) and npx tsc (main process) both compile clean; all DB-layer errors resolved; pre-existing tsc errors (node-pty, ws, react) unchanged. Risks: Sidecar not yet disabled — this adds parallel in-process DB alongside existing agent-monitor; legacy HTML still works via iframe fallback. --- apps/desktop/package.json | 21 +- apps/desktop/postcss.renderer.config.mjs | 5 + .../desktop/scripts/patch-vendor-ds-react.mjs | 103 + apps/desktop/src/main/app.ts | 58 + apps/desktop/src/main/database/agents.ts | 147 + apps/desktop/src/main/database/dashboard.ts | 97 + apps/desktop/src/main/database/events.ts | 106 + .../src/main/database/hooks-ingestion.ts | 44 + apps/desktop/src/main/database/index.ts | 44 + apps/desktop/src/main/database/schema.ts | 62 + apps/desktop/src/main/database/sessions.ts | 117 + apps/desktop/src/main/database/types.ts | 134 + apps/desktop/src/main/index.ts | 9 +- apps/desktop/src/main/preload.ts | 15 +- apps/desktop/src/main/window.ts | 78 +- apps/desktop/src/renderer/App.tsx | 104 + .../components/activity/ActivityPanel.tsx | 148 + .../components/analytics/AnalyticsView.tsx | 171 + .../components/approvals/ApprovalsPanel.tsx | 97 + .../components/dashboard/DashboardPage.tsx | 125 + .../components/feed/ActivityFeedView.tsx | 129 + .../renderer/components/kanban/KanbanView.tsx | 127 + .../renderer/components/layout/Sidebar.tsx | 131 + .../src/renderer/components/layout/Topbar.tsx | 60 + .../renderer/components/logs/LogsPanel.tsx | 133 + .../components/sessions/SessionsView.tsx | 85 + .../components/settings/SettingsPanel.tsx | 313 + .../components/workflows/WorkflowsView.tsx | 188 + apps/desktop/src/renderer/globals.css | 1 + .../src/renderer/hooks/useDesktopApi.ts | 45 + apps/desktop/src/renderer/index.html | 6207 +------- apps/desktop/src/renderer/main.tsx | 25 + .../src/renderer/types/desktop-api.d.ts | 107 + apps/desktop/src/renderer/vite-env.d.ts | 1 + apps/desktop/tsconfig.json | 3 + .../desktop/vendor/design-system/package.json | 79 + .../vendor/design-system/postcss.config.mjs | 8 + .../vendor/design-system/styles/globals.css | 299 + apps/desktop/vite.renderer.config.ts | 45 + pnpm-lock.yaml | 12256 ++++++++++------ 40 files changed, 11060 insertions(+), 10867 deletions(-) create mode 100644 apps/desktop/postcss.renderer.config.mjs create mode 100644 apps/desktop/scripts/patch-vendor-ds-react.mjs create mode 100644 apps/desktop/src/main/database/agents.ts create mode 100644 apps/desktop/src/main/database/dashboard.ts create mode 100644 apps/desktop/src/main/database/events.ts create mode 100644 apps/desktop/src/main/database/hooks-ingestion.ts create mode 100644 apps/desktop/src/main/database/index.ts create mode 100644 apps/desktop/src/main/database/schema.ts create mode 100644 apps/desktop/src/main/database/sessions.ts create mode 100644 apps/desktop/src/main/database/types.ts create mode 100644 apps/desktop/src/renderer/App.tsx create mode 100644 apps/desktop/src/renderer/components/activity/ActivityPanel.tsx create mode 100644 apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx create mode 100644 apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx create mode 100644 apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx create mode 100644 apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx create mode 100644 apps/desktop/src/renderer/components/kanban/KanbanView.tsx create mode 100644 apps/desktop/src/renderer/components/layout/Sidebar.tsx create mode 100644 apps/desktop/src/renderer/components/layout/Topbar.tsx create mode 100644 apps/desktop/src/renderer/components/logs/LogsPanel.tsx create mode 100644 apps/desktop/src/renderer/components/sessions/SessionsView.tsx create mode 100644 apps/desktop/src/renderer/components/settings/SettingsPanel.tsx create mode 100644 apps/desktop/src/renderer/components/workflows/WorkflowsView.tsx create mode 100644 apps/desktop/src/renderer/globals.css create mode 100644 apps/desktop/src/renderer/hooks/useDesktopApi.ts create mode 100644 apps/desktop/src/renderer/main.tsx create mode 100644 apps/desktop/src/renderer/types/desktop-api.d.ts create mode 100644 apps/desktop/src/renderer/vite-env.d.ts create mode 100644 apps/desktop/vendor/design-system/package.json create mode 100644 apps/desktop/vendor/design-system/postcss.config.mjs create mode 100644 apps/desktop/vendor/design-system/styles/globals.css create mode 100644 apps/desktop/vite.renderer.config.ts diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e99ac396..0247bfea 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -7,13 +7,14 @@ "type": "module", "main": "dist/main/index.js", "scripts": { - "dev": "pnpm build && ELECTRON_BIN=$(bash scripts/patch-electron-plist.sh | tail -1) && \"$ELECTRON_BIN\" .", + "dev": "pnpm build:renderer && pnpm build && ELECTRON_BIN=$(bash scripts/patch-electron-plist.sh | tail -1) && \"$ELECTRON_BIN\" .", "start": "ELECTRON_BIN=$(bash scripts/patch-electron-plist.sh | tail -1) && \"$ELECTRON_BIN\" .", - "clean:dist": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"", + "clean:dist": "node -e \"require('fs').rmSync('dist/main',{recursive:true,force:true});require('fs').rmSync('dist/server',{recursive:true,force:true})\"", "clean:package": "node -e \"require('fs').rmSync('dist-dmg',{recursive:true,force:true})\"", "prebuild": "node -e \"const{execSync:e}=require('child_process'),{writeFileSync:w}=require('fs');const h=e('git rev-parse HEAD').toString().trim();w('src/shared/build-info.ts','// AUTO-GENERATED — do not edit\\nexport const BUILD_COMMIT_HASH = \\\"'+h+'\\\";\\n');\"", - "build": "pnpm clean:dist && pnpm prebuild && tsc -p tsconfig.json && pnpm build:agent-monitor", + "build": "pnpm build:renderer && pnpm clean:dist && pnpm prebuild && tsc -p tsconfig.json", "build:agent-monitor": "node scripts/build-agent-monitor.mjs", + "build:renderer": "node scripts/patch-vendor-ds-react.mjs && vite build --config vite.renderer.config.ts", "dashboard:reset": "node scripts/reset-dashboard-db.mjs", "dashboard:reset-packs": "node scripts/reset-dashboard-db.mjs --packs-only", "stage:package": "node scripts/stage-packaging-app.mjs", @@ -24,6 +25,7 @@ "release": "pnpm clean:package && pnpm build && pnpm stage:package && node scripts/run-electron-builder.mjs --publish always" }, "dependencies": { + "@closedloop-ai/design-system": "file:vendor/design-system", "@closedloop-ai/loops-api": "0.2.11", "agent-dashboard": "github:hoangsonww/Claude-Code-Agent-Monitor#840c518d7fa69231de049e41b893938228b67e40", "busboy": "^1.6.0", @@ -31,22 +33,29 @@ "electron-store": "^8.2.0", "electron-updater": "^6.8.3", "glob": "^11.0.1", + "next-themes": "^0.4.6", + "react": "^19.2.6", + "react-day-picker": "^9.14.0", + "react-dom": "^19.2.6", + "react-hook-form": "^7.76.1", + "react-resizable-panels": "^3.0.6", "socket.io-client": "^4.8.1", "zod": "^4.0.0" }, "devDependencies": { - "@vitejs/plugin-react": "4.3.4", + "@tailwindcss/postcss": "^4.3.0", "@types/busboy": "^1.5.4", "@types/node": "^22.13.8", "@typescript-eslint/eslint-plugin": "^8.57.1", "@typescript-eslint/parser": "^8.57.1", + "@vitejs/plugin-react": "4.3.4", "agent-dashboard-client": "github:hoangsonww/Claude-Code-Agent-Monitor#840c518d7fa69231de049e41b893938228b67e40&path:/client", "autoprefixer": "10.4.20", "electron": "^35.0.2", "electron-builder": "^26.8.1", "eslint": "^10.0.3", - "postcss": "8.5.1", - "tailwindcss": "3.4.17", + "postcss": "8.5.15", + "tailwindcss": "4.3.0", "tsx": "^4.19.3", "typescript": "^5.8.2", "typescript-eslint": "^8.57.1", diff --git a/apps/desktop/postcss.renderer.config.mjs b/apps/desktop/postcss.renderer.config.mjs new file mode 100644 index 00000000..c2ddf748 --- /dev/null +++ b/apps/desktop/postcss.renderer.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; diff --git a/apps/desktop/scripts/patch-vendor-ds-react.mjs b/apps/desktop/scripts/patch-vendor-ds-react.mjs new file mode 100644 index 00000000..3fe89d09 --- /dev/null +++ b/apps/desktop/scripts/patch-vendor-ds-react.mjs @@ -0,0 +1,103 @@ +// Patches vendored @closedloop-ai/design-system dist files that reference +// `React` as a bare global (missing/incorrect import/require statements). +// Run after pnpm install or by build:renderer. + +import { readFileSync, writeFileSync, readdirSync, statSync } from "node:fs"; +import { join, extname } from "node:path"; + +const VENDOR_DIST = new URL( + "../vendor/design-system/dist", + import.meta.url, +).pathname; + +const REACT_CJS_LINE = 'var React = require("react");\n'; +const REACT_ESM_LINE = 'import React from "react";\n'; + +function hasScopeImport(code) { + return ( + /\bvar\s+React\b\s*=/.test(code) || + /import\s+(?:\*\s+as\s+)?React\s+from\s/.test(code) || + /\bimport\s+\{[^}]*\bReact\b[^}]*\}\s+from\s/.test(code) + ); +} + +function walk(dir) { + const entries = readdirSync(dir); + for (const entry of entries) { + const full = join(dir, entry); + if (statSync(full).isDirectory()) { + walk(full); + } else if (entry.endsWith(".js") || entry.endsWith(".cjs") || entry.endsWith(".mjs")) { + patch(full); + } + } +} + +function patch(file) { + let code = readFileSync(file, "utf-8"); + const ext = extname(file); + + // --- Step 1: Deduplicate stale patches from earlier tool runs --- + // If our patch line is present AND there's already a proper React import, + // remove the stale patch line. + const lines = code.split("\n"); + let changed = false; + + // For ESM: check if line 1 is our patch and another React import exists + if ( + ext === ".mjs" && + (lines[0] === 'import React from "react"' || lines[0] === 'import React from "react";') && + hasScopeImport(code.slice(code.indexOf("\n") + 1)) + ) { + code = lines.slice(1).join("\n"); + changed = true; + } + + // For CJS: check if line 2 (after "use strict") is our patch + if ( + ext !== ".mjs" && + lines[0] === '"use strict"' && + (lines[1] === 'var React = require("react")' || lines[1] === 'var React = require("react");') && + hasScopeImport(code.slice(code.indexOf("\n", code.indexOf("\n") + 1) + 1)) + ) { + code = '"use strict";\n' + lines.slice(2).join("\n"); + changed = true; + } + + // --- Step 2: Re-check if already patched (dedup may have just cleaned it) --- + if (code.includes(REACT_ESM_LINE) || code.includes(REACT_CJS_LINE)) { + if (changed) { + writeFileSync(file, code); + console.log(` dedup: ${file.replace(VENDOR_DIST, "")}`); + } + return; + } + + // If dedup removed our patch but the file already has its own React import, we're done. + if (changed && hasScopeImport(code)) { + writeFileSync(file, code); + console.log(` dedup: ${file.replace(VENDOR_DIST, "")}`); + return; + } + + // --- Step 3: Check if file needs patching --- + if (!/\bReact\s*[\.\(]/.test(code)) { + return; + } + + // Skip if React is already properly in scope + if (hasScopeImport(code)) { + return; + } + + const line = ext === ".mjs" ? REACT_ESM_LINE : REACT_CJS_LINE; + if (code.startsWith('"use strict";\n')) { + code = code.replace('"use strict";\n', '"use strict";\n' + line); + } else { + code = line + code; + } + writeFileSync(file, code); + console.log(` patched: ${file.replace(VENDOR_DIST, "")}`); +} + +walk(VENDOR_DIST); diff --git a/apps/desktop/src/main/app.ts b/apps/desktop/src/main/app.ts index 91be138e..93bfed96 100644 --- a/apps/desktop/src/main/app.ts +++ b/apps/desktop/src/main/app.ts @@ -65,6 +65,7 @@ import { SettingsStore, type SavedConfigManagedPatch } from "./settings-store.js import { DesktopTray } from "./tray.js"; import { DesktopWindow } from "./window.js"; import { AgentMonitorSidecar } from "./agent-monitor-sidecar.js"; +import { openAgentDatabase } from "./database/index.js"; import { AgentSessionSyncService } from "./agent-session-sync-service.js"; import { isAgentMonitorHooksEnabled, @@ -196,6 +197,7 @@ export class DesktopApplication { private readonly cloudSocket: CloudSocketService; private readonly commandExecutor: CloudCommandExecutor; private readonly agentMonitor: AgentMonitorSidecar; + private readonly agentDatabase: ReturnType; private readonly agentSessionSync: AgentSessionSyncService; private readonly activityLog: ActivityLogStore; private readonly approvalStore: ApprovalStore; @@ -284,6 +286,9 @@ export class DesktopApplication { this.tray = new DesktopTray(); this.desktopWindow = new DesktopWindow(); this.agentMonitor = new AgentMonitorSidecar(); + this.agentDatabase = openAgentDatabase( + path.join(app.getPath("userData"), "agent-dashboard.sqlite"), + ); this.activityLog = new ActivityLogStore(); this.jobStore = new JobStore(); this.approvalStore = new ApprovalStore({ @@ -3190,6 +3195,59 @@ export class DesktopApplication { this.restartCloudSocket(); return appliedConfig; }); + + ipcMain.handle("desktop:db:get-sessions", () => { + return this.agentDatabase.sessions.getAll(); + }); + + ipcMain.handle("desktop:db:get-session", (_event, id: string) => { + return this.agentDatabase.sessions.getById(id); + }); + + ipcMain.handle("desktop:db:get-agents", (_event, sessionId: string) => { + return this.agentDatabase.agents.getBySession(sessionId); + }); + + ipcMain.handle( + "desktop:db:get-events", + (_event, sessionId: string, agentId?: string) => { + if (agentId) { + return this.agentDatabase.events.getBySessionAndAgent( + sessionId, + agentId, + ); + } + return this.agentDatabase.events.getBySession(sessionId); + }, + ); + + ipcMain.handle("desktop:db:get-dashboard-summary", () => { + return this.agentDatabase.getSummary(); + }); + + ipcMain.handle("desktop:db:get-sessions-with-details", () => { + return this.agentDatabase.sessions.getAllWithDetails(); + }); + + ipcMain.handle("desktop:db:get-event-feed", () => { + return this.agentDatabase.events.getAll(); + }); + + ipcMain.handle("desktop:db:get-events-with-session", (_event, sessionId: string) => { + return this.agentDatabase.events.getWithSession(sessionId); + }); + + ipcMain.handle("desktop:db:get-event-count-by-type", () => { + return this.agentDatabase.events.getCountByType(); + }); + + ipcMain.handle("desktop:db:get-token-analytics", () => { + return this.agentDatabase.dashboard.getTokenAnalytics(); + }); + + ipcMain.handle("desktop:db:get-agent-hierarchy", (_event, sessionId: string) => { + return this.agentDatabase.agents.getBySessionWithChildren(sessionId, this.agentDatabase.events); + }); } private signDesktopRequest( diff --git a/apps/desktop/src/main/database/agents.ts b/apps/desktop/src/main/database/agents.ts new file mode 100644 index 00000000..f069f61e --- /dev/null +++ b/apps/desktop/src/main/database/agents.ts @@ -0,0 +1,147 @@ +import type { DatabaseSync } from "node:sqlite"; +import type { AgentRow, AgentHierarchyNode, HookEventPayload } from "./types.js"; + +export function createAgentStore(db: DatabaseSync) { + const insertStmt = db.prepare(` + INSERT INTO agents (id, session_id, name, type, subagent_type, status, task, current_tool, started_at, updated_at, parent_agent_id, metadata) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + + const updateStatusStmt = db.prepare(` + UPDATE agents SET status = ?, updated_at = ?, ended_at = ? WHERE id = ? + `); + + const updateStmt = db.prepare(` + UPDATE agents SET name = ?, task = ?, current_tool = ?, updated_at = ? WHERE id = ? + `); + + const getBySessionStmt = db.prepare( + "SELECT * FROM agents WHERE session_id = ? ORDER BY started_at ASC", + ); + const getByIdStmt = db.prepare("SELECT * FROM agents WHERE id = ?"); + + const getBySessionWithChildrenStmt = db.prepare(` + SELECT a.*, + (SELECT COUNT(*) FROM agents child WHERE child.parent_agent_id = a.id) as children_count + FROM agents a WHERE a.session_id = ? ORDER BY a.started_at ASC + `); + + function toRow(raw: Record | undefined): AgentRow | undefined { + if (!raw) return undefined; + return { + id: raw.id as string, + sessionId: raw.session_id as string, + name: (raw.name as string) ?? null, + type: (raw.type as string) ?? null, + subagentType: (raw.subagent_type as string) ?? null, + status: raw.status as string, + task: (raw.task as string) ?? null, + currentTool: (raw.current_tool as string) ?? null, + startedAt: (raw.started_at as string) ?? null, + updatedAt: (raw.updated_at as string) ?? null, + endedAt: (raw.ended_at as string) ?? null, + awaitingInputSince: (raw.awaiting_input_since as string) ?? null, + parentAgentId: (raw.parent_agent_id as string) ?? null, + metadata: (raw.metadata as string) ?? null, + }; + } + + function rowsToList(raws: Record[]): AgentRow[] { + return raws.map(toRow).filter(Boolean) as AgentRow[]; + } + + return { + upsert(payload: HookEventPayload): AgentRow { + if (!payload.agentId || !payload.sessionId) { + throw new Error("agentId and sessionId are required"); + } + + const existing = toRow(getByIdStmt.get(payload.agentId) as Record | undefined); + const now = new Date().toISOString(); + + if (existing) { + if (payload.status) { + const endedAt = ["completed", "failed", "stopped"].includes(payload.status) ? now : null; + updateStatusStmt.run(payload.status, now, endedAt, payload.agentId); + } + if (payload.name || payload.task || payload.toolName) { + updateStmt.run( + payload.name ?? existing.name, + payload.task ?? existing.task, + payload.toolName ?? existing.currentTool, + now, + payload.agentId, + ); + } + return toRow(getByIdStmt.get(payload.agentId) as Record)!; + } + + insertStmt.run( + payload.agentId, + payload.sessionId, + payload.name ?? null, + payload.type ?? null, + payload.subagentType ?? null, + payload.status ?? "running", + payload.task ?? null, + payload.toolName ?? null, + now, + now, + payload.parentAgentId ?? null, + payload.metadata ? JSON.stringify(payload.metadata) : null, + ); + + return toRow(getByIdStmt.get(payload.agentId) as Record)!; + }, + + getBySession(sessionId: string): AgentRow[] { + return rowsToList(getBySessionStmt.all(sessionId) as Record[]); + }, + + getBySessionWithChildren(sessionId: string, eventStore: { getBySession: (sid: string) => { agentId: string | null; eventType: string; toolName: string | null; summary: string | null; createdAt: string | null }[] }): AgentHierarchyNode[] { + const raws = getBySessionWithChildrenStmt.all(sessionId) as Record[]; + const allAgents = raws.map((r) => ({ + ...toRow(r)!, + childrenCount: r.children_count as number, + })); + + const agentMap = new Map(); + const roots: AgentHierarchyNode[] = []; + + for (const agent of allAgents) { + const events = eventStore.getBySession(sessionId) + .filter((e) => e.agentId === agent.id) + .map((e) => ({ + eventType: e.eventType, + toolName: e.toolName, + summary: e.summary, + createdAt: e.createdAt, + })); + + const node: AgentHierarchyNode = { + agentId: agent.id, + name: agent.name, + type: agent.type, + subagentType: agent.subagentType, + status: agent.status, + task: agent.task, + currentTool: agent.currentTool, + children: [], + events, + }; + agentMap.set(agent.id, node); + } + + for (const agent of allAgents) { + const node = agentMap.get(agent.id)!; + if (agent.parentAgentId && agentMap.has(agent.parentAgentId)) { + agentMap.get(agent.parentAgentId)!.children.push(node); + } else { + roots.push(node); + } + } + + return roots; + }, + }; +} diff --git a/apps/desktop/src/main/database/dashboard.ts b/apps/desktop/src/main/database/dashboard.ts new file mode 100644 index 00000000..13605374 --- /dev/null +++ b/apps/desktop/src/main/database/dashboard.ts @@ -0,0 +1,97 @@ +import type { DatabaseSync } from "node:sqlite"; +import type { DashboardSummary, TokenAnalytics } from "./types.js"; + +export function createDashboardQueries(db: DatabaseSync) { + const totalSessionsStmt = db.prepare("SELECT COUNT(*) as count FROM sessions"); + const activeSessionsStmt = db.prepare( + "SELECT COUNT(*) as count FROM sessions WHERE status NOT IN ('completed', 'failed', 'stopped')", + ); + const totalAgentsStmt = db.prepare("SELECT COUNT(*) as count FROM agents"); + const totalEventsStmt = db.prepare("SELECT COUNT(*) as count FROM events"); + const totalTokensStmt = db.prepare(` + SELECT COALESCE(SUM(input_tokens + output_tokens), 0) as total + FROM token_usage + `); + const recentSessionsStmt = db.prepare( + "SELECT id, name, status, model, cwd, started_at FROM sessions ORDER BY started_at DESC LIMIT 10", + ); + + const tokenAnalyticsStmt = db.prepare(` + SELECT COALESCE(SUM(input_tokens), 0) as totalInput, + COALESCE(SUM(output_tokens), 0) as totalOutput, + COALESCE(SUM(cache_read_tokens), 0) as totalCacheRead, + COALESCE(SUM(cache_write_tokens), 0) as totalCacheWrite + FROM token_usage + `); + + const tokenByModelStmt = db.prepare(` + SELECT model, + SUM(input_tokens) as inputTokens, + SUM(output_tokens) as outputTokens, + COUNT(DISTINCT session_id) as sessions + FROM token_usage + WHERE model IS NOT NULL + GROUP BY model + ORDER BY SUM(input_tokens + output_tokens) DESC + `); + + const tokenByDayStmt = db.prepare(` + SELECT DATE(t.created_at) as day, + SUM(t.input_tokens) as inputTokens, + SUM(t.output_tokens) as outputTokens + FROM token_usage t + WHERE t.created_at IS NOT NULL + GROUP BY DATE(t.created_at) + ORDER BY day DESC + LIMIT 30 + `); + + return { + getSummary(): DashboardSummary { + const totalSessions = (totalSessionsStmt.get() as { count: number }).count; + const activeSessions = (activeSessionsStmt.get() as { count: number }).count; + const totalAgents = (totalAgentsStmt.get() as { count: number }).count; + const totalEvents = (totalEventsStmt.get() as { count: number }).count; + const totalTokens = (totalTokensStmt.get() as { total: number }).total; + const recentSessions = recentSessionsStmt.all() as Array<{ + id: string; + name: string | null; + status: string; + model: string | null; + cwd: string | null; + started_at: string | null; + }>; + + return { + totalSessions, + activeSessions, + totalAgents, + totalEvents, + totalTokens, + recentSessions: recentSessions.map((s) => ({ + id: s.id, + name: s.name, + status: s.status, + model: s.model, + cwd: s.cwd, + startedAt: s.started_at, + })), + }; + }, + + getTokenAnalytics(): TokenAnalytics { + const totals = tokenAnalyticsStmt.get() as { totalInput: number; totalOutput: number; totalCacheRead: number; totalCacheWrite: number }; + const byModel = tokenByModelStmt.all() as Array<{ model: string; inputTokens: number; outputTokens: number; sessions: number }>; + const byDay = tokenByDayStmt.all() as Array<{ day: string; inputTokens: number; outputTokens: number }>; + + return { + totalInputTokens: totals.totalInput, + totalOutputTokens: totals.totalOutput, + totalCacheReadTokens: totals.totalCacheRead, + totalCacheWriteTokens: totals.totalCacheWrite, + byModel, + byDay, + }; + }, + }; +} diff --git a/apps/desktop/src/main/database/events.ts b/apps/desktop/src/main/database/events.ts new file mode 100644 index 00000000..8a71d1b8 --- /dev/null +++ b/apps/desktop/src/main/database/events.ts @@ -0,0 +1,106 @@ +import type { DatabaseSync } from "node:sqlite"; +import { randomUUID } from "node:crypto"; +import type { EventRow, HookEventPayload, EventCountByType } from "./types.js"; + +export function createEventStore(db: DatabaseSync) { + const insertStmt = db.prepare(` + INSERT INTO events (id, session_id, agent_id, event_type, tool_name, summary, data, created_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `); + + const getBySessionStmt = db.prepare( + "SELECT * FROM events WHERE session_id = ? ORDER BY created_at ASC", + ); + + const getBySessionAndAgentStmt = db.prepare( + "SELECT * FROM events WHERE session_id = ? AND agent_id = ? ORDER BY created_at ASC", + ); + + const getAllStmt = db.prepare( + "SELECT e.*, s.name as session_name FROM events e LEFT JOIN sessions s ON s.id = e.session_id ORDER BY e.created_at DESC LIMIT 200", + ); + + const getEventsWithSessionStmt = db.prepare( + "SELECT e.*, s.name as session_name FROM events e LEFT JOIN sessions s ON s.id = e.session_id WHERE e.session_id = ? ORDER BY e.created_at ASC", + ); + + const getCountByTypeStmt = db.prepare( + "SELECT event_type, COUNT(*) as count FROM events GROUP BY event_type ORDER BY count DESC", + ); + + function toRow(raw: Record | undefined): EventRow | undefined { + if (!raw) return undefined; + return { + id: raw.id as string, + sessionId: raw.session_id as string, + agentId: (raw.agent_id as string) ?? null, + eventType: raw.event_type as string, + toolName: (raw.tool_name as string) ?? null, + summary: (raw.summary as string) ?? null, + data: (raw.data as string) ?? null, + createdAt: (raw.created_at as string) ?? null, + }; + } + + function toEventWithSession(raw: Record | undefined): (EventRow & { sessionName: string | null }) | undefined { + if (!raw) return undefined; + const row = toRow(raw); + if (!row) return undefined; + return { ...row, sessionName: (raw.session_name as string) ?? null }; + } + + function eventsWithSessionToList(raws: Record[]): (EventRow & { sessionName: string | null })[] { + return raws.map(toEventWithSession).filter(Boolean) as (EventRow & { sessionName: string | null })[]; + } + + function rowsToList(raws: Record[]): EventRow[] { + return raws.map(toRow).filter(Boolean) as EventRow[]; + } + + return { + insert(payload: HookEventPayload): EventRow { + const id = randomUUID(); + const now = new Date().toISOString(); + insertStmt.run( + id, + payload.sessionId ?? null, + payload.agentId ?? null, + payload.eventType ?? "unknown", + payload.toolName ?? null, + payload.summary ?? null, + payload.data ?? null, + now, + ); + return { + id, + sessionId: payload.sessionId ?? "", + agentId: payload.agentId ?? null, + eventType: payload.eventType ?? "unknown", + toolName: payload.toolName ?? null, + summary: payload.summary ?? null, + data: payload.data ?? null, + createdAt: now, + }; + }, + + getBySession(sessionId: string): EventRow[] { + return rowsToList(getBySessionStmt.all(sessionId) as Record[]); + }, + + getBySessionAndAgent(sessionId: string, agentId: string): EventRow[] { + return rowsToList(getBySessionAndAgentStmt.all(sessionId, agentId) as Record[]); + }, + + getAll(): (EventRow & { sessionName: string | null })[] { + return eventsWithSessionToList(getAllStmt.all() as Record[]); + }, + + getWithSession(sessionId: string): (EventRow & { sessionName: string | null })[] { + return eventsWithSessionToList(getEventsWithSessionStmt.all(sessionId) as Record[]); + }, + + getCountByType(): EventCountByType[] { + return getCountByTypeStmt.all() as unknown as EventCountByType[]; + }, + }; +} diff --git a/apps/desktop/src/main/database/hooks-ingestion.ts b/apps/desktop/src/main/database/hooks-ingestion.ts new file mode 100644 index 00000000..a2a5b250 --- /dev/null +++ b/apps/desktop/src/main/database/hooks-ingestion.ts @@ -0,0 +1,44 @@ +import type { IncomingMessage, ServerResponse } from "node:http"; +import type { AgentDatabase } from "./index.js"; +import type { HookEventPayload } from "./types.js"; + +/** + * Handles incoming hook events from Claude Code. + * POST /api/hooks/event with JSON body + */ +export function handleHookEvent( + req: IncomingMessage, + res: ServerResponse, + db: AgentDatabase, + body: string, +): void { + try { + const payload: HookEventPayload = JSON.parse(body); + + if (payload.sessionId) { + db.sessions.upsert(payload); + + if (payload.agentId) { + db.agents.upsert(payload); + } + + db.events.insert(payload); + } + + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ ok: true })); + } catch (error) { + const message = error instanceof Error ? error.message : "unknown error"; + res.writeHead(400, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ ok: false, error: message })); + } +} + +export function parseBody(req: IncomingMessage): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + req.on("data", (chunk: Buffer) => chunks.push(chunk)); + req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8"))); + req.on("error", reject); + }); +} diff --git a/apps/desktop/src/main/database/index.ts b/apps/desktop/src/main/database/index.ts new file mode 100644 index 00000000..cffbbf63 --- /dev/null +++ b/apps/desktop/src/main/database/index.ts @@ -0,0 +1,44 @@ +import { DatabaseSync } from "node:sqlite"; +import { existsSync, mkdirSync } from "node:fs"; +import { dirname } from "node:path"; +import { SCHEMA_SQL } from "./schema.js"; +import { createSessionStore } from "./sessions.js"; +import { createAgentStore } from "./agents.js"; +import { createEventStore } from "./events.js"; +import { createDashboardQueries } from "./dashboard.js"; +import type { DashboardSummary, SessionRow, AgentRow, EventRow, HookEventPayload } from "./types.js"; + +export interface AgentDatabase { + sessions: ReturnType; + agents: ReturnType; + events: ReturnType; + dashboard: ReturnType; + getSummary: () => DashboardSummary; + close: () => void; +} + +export function openAgentDatabase(dbPath: string): AgentDatabase { + const dir = dirname(dbPath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + + const db = new DatabaseSync(dbPath); + db.exec("PRAGMA journal_mode=WAL"); + db.exec("PRAGMA foreign_keys=ON"); + db.exec(SCHEMA_SQL); + + const sessions = createSessionStore(db); + const agents = createAgentStore(db); + const events = createEventStore(db); + const dashboard = createDashboardQueries(db); + + return { + sessions, + agents, + events, + dashboard, + getSummary: () => dashboard.getSummary(), + close: () => db.close(), + }; +} diff --git a/apps/desktop/src/main/database/schema.ts b/apps/desktop/src/main/database/schema.ts new file mode 100644 index 00000000..36e1c853 --- /dev/null +++ b/apps/desktop/src/main/database/schema.ts @@ -0,0 +1,62 @@ +export const SCHEMA_SQL = ` +CREATE TABLE IF NOT EXISTS sessions ( + id TEXT PRIMARY KEY, + name TEXT, + status TEXT NOT NULL DEFAULT 'running', + cwd TEXT, + model TEXT, + started_at TEXT, + updated_at TEXT, + ended_at TEXT, + awaiting_input_since TEXT, + metadata TEXT, + harness TEXT +); + +CREATE TABLE IF NOT EXISTS agents ( + id TEXT PRIMARY KEY, + session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE, + name TEXT, + type TEXT, + subagent_type TEXT, + status TEXT NOT NULL DEFAULT 'running', + task TEXT, + current_tool TEXT, + started_at TEXT, + updated_at TEXT, + ended_at TEXT, + awaiting_input_since TEXT, + parent_agent_id TEXT, + metadata TEXT +); + +CREATE INDEX IF NOT EXISTS idx_agents_session_id ON agents(session_id); + +CREATE TABLE IF NOT EXISTS events ( + id TEXT PRIMARY KEY, + session_id TEXT NOT NULL, + agent_id TEXT, + event_type TEXT NOT NULL, + tool_name TEXT, + summary TEXT, + data TEXT, + created_at TEXT +); + +CREATE INDEX IF NOT EXISTS idx_events_session_id ON events(session_id); +CREATE INDEX IF NOT EXISTS idx_events_agent_id ON events(agent_id); +CREATE INDEX IF NOT EXISTS idx_events_created_at ON events(created_at); + +CREATE TABLE IF NOT EXISTS token_usage ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + session_id TEXT NOT NULL, + model TEXT NOT NULL, + input_tokens INTEGER NOT NULL DEFAULT 0, + output_tokens INTEGER NOT NULL DEFAULT 0, + cache_read_tokens INTEGER NOT NULL DEFAULT 0, + cache_write_tokens INTEGER NOT NULL DEFAULT 0, + created_at TEXT DEFAULT (datetime('now')) +); + +CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id); +`; diff --git a/apps/desktop/src/main/database/sessions.ts b/apps/desktop/src/main/database/sessions.ts new file mode 100644 index 00000000..5c9b7129 --- /dev/null +++ b/apps/desktop/src/main/database/sessions.ts @@ -0,0 +1,117 @@ +import type { DatabaseSync } from "node:sqlite"; +import type { SessionRow, SessionWithAgents, HookEventPayload } from "./types.js"; + +export function createSessionStore(db: DatabaseSync) { + const insertStmt = db.prepare(` + INSERT INTO sessions (id, name, status, cwd, model, started_at, updated_at, metadata, harness) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + + const updateStatusStmt = db.prepare(` + UPDATE sessions SET status = ?, updated_at = ?, ended_at = ? WHERE id = ? + `); + + const updateStmt = db.prepare(` + UPDATE sessions SET name = ?, model = ?, cwd = ?, updated_at = ?, metadata = ? WHERE id = ? + `); + + const getByIdStmt = db.prepare("SELECT * FROM sessions WHERE id = ?"); + const getAllStmt = db.prepare("SELECT * FROM sessions ORDER BY started_at DESC"); + const getActiveStmt = db.prepare( + "SELECT * FROM sessions WHERE status NOT IN ('completed', 'failed', 'stopped') ORDER BY started_at DESC", + ); + + const getAllWithDetailsStmt = db.prepare(` + SELECT s.*, + (SELECT COUNT(*) FROM agents a WHERE a.session_id = s.id) as agent_count, + (SELECT COUNT(*) FROM events e WHERE e.session_id = s.id) as event_count, + (SELECT COALESCE(SUM(COALESCE(t.input_tokens, 0) + COALESCE(t.output_tokens, 0)), 0) FROM token_usage t WHERE t.session_id = s.id) as total_tokens + FROM sessions s ORDER BY s.started_at DESC + `); + + function toRow(raw: Record | undefined): SessionRow | undefined { + if (!raw) return undefined; + return { + id: raw.id as string, + name: (raw.name as string) ?? null, + status: raw.status as string, + cwd: (raw.cwd as string) ?? null, + model: (raw.model as string) ?? null, + startedAt: (raw.started_at as string) ?? null, + updatedAt: (raw.updated_at as string) ?? null, + endedAt: (raw.ended_at as string) ?? null, + awaitingInputSince: (raw.awaiting_input_since as string) ?? null, + metadata: (raw.metadata as string) ?? null, + harness: (raw.harness as string) ?? null, + }; + } + + function rowsToList(raws: Record[]): SessionRow[] { + return raws.map(toRow).filter(Boolean) as SessionRow[]; + } + + return { + upsert(payload: HookEventPayload): SessionRow { + if (!payload.sessionId) throw new Error("sessionId is required"); + + const existing = toRow(getByIdStmt.get(payload.sessionId) as Record | undefined); + const now = new Date().toISOString(); + + if (existing) { + if (payload.status) { + const endedAt = ["completed", "failed", "stopped"].includes(payload.status) ? now : null; + updateStatusStmt.run(payload.status, now, endedAt, payload.sessionId); + } + if (payload.name || payload.model || payload.cwd) { + updateStmt.run( + payload.name ?? existing.name, + payload.model ?? existing.model, + payload.cwd ?? existing.cwd, + now, + payload.metadata ? JSON.stringify(payload.metadata) : existing.metadata, + payload.sessionId, + ); + } + return toRow(getByIdStmt.get(payload.sessionId) as Record)!; + } + + insertStmt.run( + payload.sessionId, + payload.name ?? null, + payload.status ?? "running", + payload.cwd ?? null, + payload.model ?? null, + now, + now, + payload.metadata ? JSON.stringify(payload.metadata) : null, + null, + ); + + return toRow(getByIdStmt.get(payload.sessionId) as Record)!; + }, + + getById(id: string): SessionRow | undefined { + return toRow(getByIdStmt.get(id) as Record | undefined); + }, + + getAll(): SessionRow[] { + return rowsToList(getAllStmt.all() as Record[]); + }, + + getActive(): SessionRow[] { + return rowsToList(getActiveStmt.all() as Record[]); + }, + + getAllWithDetails(): SessionWithAgents[] { + return (getAllWithDetailsStmt.all() as Record[]).map((raw) => { + const base = toRow(raw)!; + return { + ...base, + agentCount: raw.agent_count as number, + eventCount: raw.event_count as number, + totalTokens: raw.total_tokens as number, + }; + }); + }, + }; +} diff --git a/apps/desktop/src/main/database/types.ts b/apps/desktop/src/main/database/types.ts new file mode 100644 index 00000000..20b1fb8e --- /dev/null +++ b/apps/desktop/src/main/database/types.ts @@ -0,0 +1,134 @@ +export interface SessionRow { + id: string; + name: string | null; + status: string; + cwd: string | null; + model: string | null; + startedAt: string | null; + updatedAt: string | null; + endedAt: string | null; + awaitingInputSince: string | null; + metadata: string | null; + harness: string | null; +} + +export interface AgentRow { + id: string; + sessionId: string; + name: string | null; + type: string | null; + subagentType: string | null; + status: string; + task: string | null; + currentTool: string | null; + startedAt: string | null; + updatedAt: string | null; + endedAt: string | null; + awaitingInputSince: string | null; + parentAgentId: string | null; + metadata: string | null; +} + +export interface EventRow { + id: string; + sessionId: string; + agentId: string | null; + eventType: string; + toolName: string | null; + summary: string | null; + data: string | null; + createdAt: string | null; +} + +export interface TokenUsageRow { + sessionId: string; + model: string; + inputTokens: number; + outputTokens: number; + cacheReadTokens: number; + cacheWriteTokens: number; +} + +export interface HookEventPayload { + sessionId?: string; + agentId?: string; + eventType?: string; + toolName?: string; + summary?: string; + data?: string; + status?: string; + name?: string; + model?: string; + cwd?: string; + task?: string; + type?: string; + subagentType?: string; + parentAgentId?: string; + metadata?: Record; +} + +export interface DashboardSummary { + totalSessions: number; + activeSessions: number; + totalAgents: number; + totalEvents: number; + totalTokens: number; + recentSessions: Array<{ + id: string; + name: string | null; + status: string; + model: string | null; + cwd: string | null; + startedAt: string | null; + }>; +} + +export interface SessionWithAgents extends SessionRow { + agentCount: number; + eventCount: number; + totalTokens: number; +} + +export interface EventWithSession extends EventRow { + sessionName: string | null; +} + +export interface TokenAnalytics { + totalInputTokens: number; + totalOutputTokens: number; + totalCacheReadTokens: number; + totalCacheWriteTokens: number; + byModel: Array<{ + model: string; + inputTokens: number; + outputTokens: number; + sessions: number; + }>; + byDay: Array<{ + day: string; + inputTokens: number; + outputTokens: number; + }>; +} + +export interface EventCountByType { + eventType: string; + count: number; +} + +export interface AgentHierarchyNode { + agentId: string; + name: string | null; + type: string | null; + subagentType: string | null; + status: string; + task: string | null; + currentTool: string | null; + children: AgentHierarchyNode[]; + events: Array<{ + eventType: string; + toolName: string | null; + summary: string | null; + createdAt: string | null; + }>; +} diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index a23e5dbe..f5122e8b 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -1,4 +1,4 @@ -import { app, nativeTheme } from "electron"; +import { app, nativeTheme, protocol } from "electron"; import { DesktopApplication } from "./app.js"; import { handleActivateEvent } from "./app-lifecycle.js"; import { handleUncaughtException, handleUnhandledRejection } from "./error-handlers.js"; @@ -27,6 +27,13 @@ process.on("unhandledRejection", (reason) => }) ); +protocol.registerSchemesAsPrivileged([ + { + scheme: "app", + privileges: { standard: true, secure: true, supportFetchAPI: true }, + }, +]); + const desktopApplication = new DesktopApplication(); app.on("ready", () => { diff --git a/apps/desktop/src/main/preload.ts b/apps/desktop/src/main/preload.ts index 15036ce1..3c98c9af 100644 --- a/apps/desktop/src/main/preload.ts +++ b/apps/desktop/src/main/preload.ts @@ -129,7 +129,20 @@ const desktopApi = { ipcRenderer.invoke( "desktop:set-agent-monitor-hooks-enabled", enabled, - ) as Promise<{ ok: boolean; enabled: boolean; error?: string }> + ) as Promise<{ ok: boolean; enabled: boolean; error?: string }>, + db: { + getSessions: () => ipcRenderer.invoke("desktop:db:get-sessions") as Promise, + getSession: (id: string) => ipcRenderer.invoke("desktop:db:get-session", id) as Promise, + getAgents: (sessionId: string) => ipcRenderer.invoke("desktop:db:get-agents", sessionId) as Promise, + getEvents: (sessionId: string, agentId?: string) => ipcRenderer.invoke("desktop:db:get-events", sessionId, agentId) as Promise, + getDashboardSummary: () => ipcRenderer.invoke("desktop:db:get-dashboard-summary") as Promise, + getSessionsWithDetails: () => ipcRenderer.invoke("desktop:db:get-sessions-with-details") as Promise, + getEventFeed: () => ipcRenderer.invoke("desktop:db:get-event-feed") as Promise, + getEventsWithSession: (sessionId: string) => ipcRenderer.invoke("desktop:db:get-events-with-session", sessionId) as Promise, + getEventCountByType: () => ipcRenderer.invoke("desktop:db:get-event-count-by-type") as Promise, + getTokenAnalytics: () => ipcRenderer.invoke("desktop:db:get-token-analytics") as Promise, + getAgentHierarchy: (sessionId: string) => ipcRenderer.invoke("desktop:db:get-agent-hierarchy", sessionId) as Promise, + } }; contextBridge.exposeInMainWorld("desktopApi", desktopApi); diff --git a/apps/desktop/src/main/window.ts b/apps/desktop/src/main/window.ts index 7c75ca2e..e60f9355 100644 --- a/apps/desktop/src/main/window.ts +++ b/apps/desktop/src/main/window.ts @@ -1,10 +1,47 @@ -import { app, BrowserWindow } from "electron"; -import { existsSync } from "node:fs"; +import { app, BrowserWindow, protocol } from "electron"; +import { readFileSync, existsSync } from "node:fs"; import { fileURLToPath } from "node:url"; import path from "node:path"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const RENDERER_DIR = path.resolve(__dirname, "..", "renderer"); +const APP_PROTOCOL = "app"; + +const MIME_TYPES: Record = { + ".html": "text/html", + ".js": "text/javascript", + ".css": "text/css", + ".json": "application/json", + ".png": "image/png", + ".svg": "image/svg+xml", + ".ico": "image/x-icon", + ".map": "application/json", +}; + +function mimeType(ext: string): string { + return MIME_TYPES[ext] ?? "application/octet-stream"; +} + +function registerAppProtocol(): void { + protocol.handle(APP_PROTOCOL, (request) => { + const url = new URL(request.url); + const relativePath = url.pathname.replace(/^\//, ""); + const filePath = path.join(RENDERER_DIR, relativePath); + + if (!existsSync(filePath)) { + return new Response("Not found", { status: 404 }); + } + + const data = readFileSync(filePath); + const ext = path.extname(filePath); + return new Response(data, { + status: 200, + headers: { "Content-Type": mimeType(ext) }, + }); + }); +} + export class DesktopWindow { private browserWindow: BrowserWindow | null = null; private disposing = false; @@ -23,8 +60,8 @@ export class DesktopWindow { webPreferences: { contextIsolation: true, sandbox: false, - preload: path.join(__dirname, "preload.js") - } + preload: path.join(__dirname, "preload.js"), + }, }); this.browserWindow.once("ready-to-show", () => { this.browserWindow?.show(); @@ -36,8 +73,23 @@ export class DesktopWindow { event.preventDefault(); this.browserWindow?.hide(); }); - const htmlPath = resolveRendererPath(); - void this.browserWindow.loadFile(htmlPath); + + void this.loadContent(); + } + + private async loadContent(): Promise { + registerAppProtocol(); + + if (app.isPackaged) { + await this.browserWindow!.loadURL(`app://renderer/index.html`); + return; + } + + try { + await this.browserWindow!.loadURL("http://localhost:5173"); + } catch { + await this.browserWindow!.loadURL(`app://renderer/index.html`); + } } getWindow(): BrowserWindow | null { @@ -64,17 +116,3 @@ export class DesktopWindow { this.disposing = false; } } - -function resolveRendererPath(): string { - if (app.isPackaged) { - return path.join(__dirname, "..", "..", "src", "renderer", "index.html"); - } - - const cwd = process.cwd(); - const inDesktopCwdPath = path.join(cwd, "src", "renderer", "index.html"); - if (existsSync(inDesktopCwdPath)) { - return inDesktopCwdPath; - } - - return path.join(cwd, "apps", "desktop", "src", "renderer", "index.html"); -} diff --git a/apps/desktop/src/renderer/App.tsx b/apps/desktop/src/renderer/App.tsx new file mode 100644 index 00000000..61337efc --- /dev/null +++ b/apps/desktop/src/renderer/App.tsx @@ -0,0 +1,104 @@ +import { useState, useCallback, useEffect } from "react"; +import { Sidebar } from "./components/layout/Sidebar"; +import { Topbar } from "./components/layout/Topbar"; +import { DashboardPage } from "./components/dashboard/DashboardPage"; +import { ApprovalsPanel } from "./components/approvals/ApprovalsPanel"; +import { ActivityPanel } from "./components/activity/ActivityPanel"; +import { LogsPanel } from "./components/logs/LogsPanel"; +import { SettingsPanel } from "./components/settings/SettingsPanel"; +import { SessionsView } from "./components/sessions/SessionsView"; +import { ActivityFeedView } from "./components/feed/ActivityFeedView"; +import { AnalyticsView } from "./components/analytics/AnalyticsView"; +import { KanbanView } from "./components/kanban/KanbanView"; +import { WorkflowsView } from "./components/workflows/WorkflowsView"; + +export type NavId = + | "dashboard" + | "kanban" + | "sessions" + | "activity-feed" + | "analytics" + | "workflows" + | "cc-config" + | "run" + | "plans" + | "agent-settings" + | "approvals" + | "requests" + | "diagnostics" + | "settings"; + +export default function App() { + const [navId, setNavId] = useState("dashboard"); + const [runtimeStatus, setRuntimeStatus] = useState | null>(null); + + useEffect(() => { + window.desktopApi + .getRuntimeStatus() + .then((s) => setRuntimeStatus(s as Record)) + .catch(() => {}); + }, []); + + useEffect(() => { + const handler = (e: CustomEvent) => { + setNavId(e.detail as NavId); + }; + window.addEventListener("desktop:navigate-tab", handler as EventListener); + return () => + window.removeEventListener("desktop:navigate-tab", handler as EventListener); + }, []); + + const [collapsed, setCollapsed] = useState(false); + const toggleSidebar = useCallback(() => setCollapsed((c) => !c), []); + + const healthy = runtimeStatus?.healthy === true; + + const content = (() => { + switch (navId) { + case "dashboard": + return ; + case "sessions": + return ; + case "activity-feed": + return ; + case "analytics": + return ; + case "kanban": + return ; + case "workflows": + return ; + case "approvals": + return ; + case "requests": + return ; + case "diagnostics": + return ; + case "settings": + return ; + default: + return ; + } + })(); + + return ( +
+ +
+ +
+ {content} +
+
+
+ ); +} diff --git a/apps/desktop/src/renderer/components/activity/ActivityPanel.tsx b/apps/desktop/src/renderer/components/activity/ActivityPanel.tsx new file mode 100644 index 00000000..d5a214a9 --- /dev/null +++ b/apps/desktop/src/renderer/components/activity/ActivityPanel.tsx @@ -0,0 +1,148 @@ +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; + +interface ActivityEvent { + id: string; + type?: string; + summary?: string; + timestamp?: string; +} + +interface Job { + id: string; + description?: string; + status?: string; + startedAt?: string; +} + +export function ActivityPanel() { + const [events, setEvents] = useState([]); + const [runningJobs, setRunningJobs] = useState([]); + const [completedJobs, setCompletedJobs] = useState([]); + const [loading, setLoading] = useState(true); + const [showRegular, setShowRegular] = useState(true); + const [showSecurity, setShowSecurity] = useState(true); + + const load = useCallback(async () => { + setLoading(true); + try { + const [evts, running, completed] = await Promise.all([ + window.desktopApi.getActivityEvents(), + window.desktopApi.listRunningJobs(), + window.desktopApi.listCompletedJobs(), + ]); + setEvents((evts as ActivityEvent[]) ?? []); + setRunningJobs((running as Job[]) ?? []); + setCompletedJobs((completed as Job[]) ?? []); + } catch { /* ignore */ } + setLoading(false); + }, []); + + useEffect(() => { load(); }, [load]); + + const handleClear = async () => { + await window.desktopApi.clearActivityEvents(); + await load(); + }; + + const filtered = events.filter((e) => { + const type = e.type ?? ""; + if (type.includes("security") || type.includes("auth")) return showSecurity; + return showRegular; + }); + + const jobStatusVariant = (status?: string) => { + if (status === "running" || status === "active") return "default"; + if (status === "completed" || status === "success") return "secondary"; + return "outline"; + }; + + return ( +
+
+

Activity

+
+ + +
+
+ + + + Running Jobs + + + {runningJobs.length === 0 ? ( +

No running jobs

+ ) : ( +
+ {runningJobs.map((j) => ( +
+ {j.description ?? j.id} + {j.status ?? "running"} +
+ ))} +
+ )} +
+
+ +
+ Completed Jobs ({completedJobs.length}) + + + {completedJobs.length === 0 ? ( +

No completed jobs

+ ) : ( +
+ {completedJobs.map((j) => ( +
+ {j.description ?? j.id} + {j.status ?? "completed"} +
+ ))} +
+ )} +
+
+
+ + + + Gateway Request Log + + +
+ + +
+ {loading ? ( +

Loading...

+ ) : filtered.length === 0 ? ( +

No events

+ ) : ( +
+ {filtered.map((e) => ( +
+ + {e.timestamp ? new Date(e.timestamp).toLocaleTimeString() : ""} + + {e.type} + {e.summary} +
+ ))} +
+ )} +
+
+
+ ); +} diff --git a/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx b/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx new file mode 100644 index 00000000..5f5b148f --- /dev/null +++ b/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx @@ -0,0 +1,171 @@ +import { useState, useEffect } from "react"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; +import { LineChart } from "@closedloop-ai/design-system/components/ui/primitives/line-chart"; +import { DonutChart } from "@closedloop-ai/design-system/components/ui/primitives/donut-chart"; +import type { TokenAnalytics, EventCountByType } from "../../main/database/types"; + +const MODEL_COLORS = [ + "#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6", + "#ec4899", "#14b8a6", "#f97316", "#6366f1", "#84cc16", +]; + +export function AnalyticsView() { + const [tokens, setTokens] = useState(null); + const [eventTypes, setEventTypes] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + Promise.all([ + window.desktopApi.db.getTokenAnalytics(), + window.desktopApi.db.getEventCountByType(), + ]) + .then(([tokenData, eventData]) => { + setTokens(tokenData as TokenAnalytics); + setEventTypes(eventData as EventCountByType[]); + setLoading(false); + }) + .catch(() => setLoading(false)); + }, []); + + if (loading) { + return ( +
+

Loading analytics...

+
+ ); + } + + const totalTokens = tokens + ? tokens.totalInputTokens + tokens.totalOutputTokens + : 0; + + const metrics = [ + { label: "Total Tokens", value: totalTokens.toLocaleString() }, + { label: "Input Tokens", value: tokens?.totalInputTokens.toLocaleString() ?? "0" }, + { label: "Output Tokens", value: tokens?.totalOutputTokens.toLocaleString() ?? "0" }, + { label: "Cache Saved", value: (tokens ? tokens.totalCacheReadTokens + tokens.totalCacheWriteTokens : 0).toLocaleString() }, + ]; + + const tokenSegments = tokens + ? [ + { label: "Input", value: tokens.totalInputTokens, color: MODEL_COLORS[0] }, + { label: "Output", value: tokens.totalOutputTokens, color: MODEL_COLORS[1] }, + { label: "Cache Read", value: tokens.totalCacheReadTokens, color: MODEL_COLORS[2] }, + { label: "Cache Write", value: tokens.totalCacheWriteTokens, color: MODEL_COLORS[3] }, + ].filter((s) => s.value > 0) + : []; + + const eventSegments = eventTypes.map((e, i) => ({ + label: e.eventType, + value: e.count, + color: MODEL_COLORS[i % MODEL_COLORS.length], + })); + + const tokenByModelSegments = tokens?.byModel.map((m, i) => ({ + label: m.model, + value: m.inputTokens + m.outputTokens, + color: MODEL_COLORS[i % MODEL_COLORS.length], + })) ?? []; + + const dayPoints: { label: string; value: number }[] = (tokens?.byDay ?? []).map((d) => ({ + label: d.day, + value: d.inputTokens + d.outputTokens, + })); + + return ( +
+
+

Analytics

+

+ Token usage and event metrics +

+
+ +
+ {metrics.map((m) => ( + + ))} +
+ +
+ + + Token Distribution + + + {tokenSegments.length > 0 ? ( + t.toLocaleString()} + centerLabel="Tokens" + /> + ) : ( +

No token data

+ )} +
+
+ + + + Events by Type + + + {eventSegments.length > 0 ? ( + t.toLocaleString()} + centerLabel="Events" + /> + ) : ( +

No event data

+ )} +
+
+
+ + + + Token Usage by Model + + + {tokenByModelSegments.length > 0 ? ( +
+ {tokenByModelSegments.map((seg) => ( +
+ + {seg.label} + + {seg.value.toLocaleString()} + +
+ ))} +
+ ) : ( +

No model data

+ )} +
+
+ + {dayPoints.length > 0 && ( + + + Daily Token Usage (Last 30 Days) + + +
+ v.toLocaleString()} + /> +
+
+
+ )} +
+ ); +} diff --git a/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx b/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx new file mode 100644 index 00000000..6788cbb4 --- /dev/null +++ b/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx @@ -0,0 +1,97 @@ +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; +import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; + +interface Approval { + id: string; + reason: string; + request?: { path?: string; args?: Record }; + tier?: string; + createdAt?: string; +} + +export function ApprovalsPanel() { + const [approvals, setApprovals] = useState([]); + const [loading, setLoading] = useState(true); + + const load = useCallback(async () => { + setLoading(true); + try { + const data = await window.desktopApi.getPendingApprovals(); + setApprovals(data as Approval[]); + } catch { /* ignore */ } + setLoading(false); + }, []); + + useEffect(() => { load(); }, [load]); + + const handleApprove = async (id: string) => { + await window.desktopApi.approveApproval(id); + await load(); + }; + const handleDeny = async (id: string) => { + await window.desktopApi.denyApproval(id); + await load(); + }; + const handleAlwaysAllow = async (id: string) => { + await window.desktopApi.alwaysAllowApproval(id); + await load(); + }; + const handleClear = async () => { + await window.desktopApi.clearPendingApprovals(); + await load(); + }; + + return ( +
+
+
+

Approvals

+

Pending requests that need approval

+
+
+ + +
+
+ + {loading ? ( +
+

Loading approvals...

+
+ ) : approvals.length === 0 ? ( + + + No pending approvals + + + ) : ( +
+ {approvals.map((a) => ( + + +
+
+
+

{a.reason}

+ {a.request?.path && ( +

{a.request.path}

+ )} +
+ {a.tier ?? "unknown"} +
+
+ + + +
+
+
+
+ ))} +
+ )} +
+ ); +} diff --git a/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx b/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx new file mode 100644 index 00000000..2bb1c87c --- /dev/null +++ b/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx @@ -0,0 +1,125 @@ +import { useState, useEffect } from "react"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; +import type { DashboardSummary } from "../../main/database/types"; + +export function DashboardPage() { + const [summary, setSummary] = useState(null); + + useEffect(() => { + window.desktopApi.db + .getDashboardSummary() + .then((data) => setSummary(data as DashboardSummary)) + .catch(console.error); + }, []); + + return ( +
+
+

Agent Dashboard

+

+ In-process agent session monitoring +

+
+ + {summary ? ( + <> +
+ + + + Sessions + + + +
{summary.totalSessions}
+

+ {summary.activeSessions} active +

+
+
+ + + + Agents + + + +
{summary.totalAgents}
+
+
+ + + + Events + + + +
{summary.totalEvents}
+
+
+ + + + Token Usage + + + +
{summary.totalTokens}
+
+
+
+ + + + Recent Sessions + + +
+ {summary.recentSessions.map((session) => ( +
+
+

+ {session.name || "Unnamed Session"} +

+

+ {session.model ?? "Unknown model"} + {session.cwd ? ` · ${session.cwd}` : ""} +

+
+
+ + {session.status} + + + {session.startedAt + ? new Date(session.startedAt).toLocaleDateString() + : ""} + +
+
+ ))} + {summary.recentSessions.length === 0 && ( +

+ No sessions recorded yet. +

+ )} +
+
+
+ + ) : ( +
+

Loading dashboard data...

+
+ )} +
+ ); +} diff --git a/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx b/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx new file mode 100644 index 00000000..2d86fd3c --- /dev/null +++ b/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx @@ -0,0 +1,129 @@ +import { useState, useEffect, useCallback } from "react"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; +import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; +import type { EventRow } from "../../main/database/types"; + +const EVENT_TYPE_TONES: Record = { + tool_use: "bg-blue-500/10 text-blue-400", + tool_result: "bg-green-500/10 text-green-400", + error: "bg-red-500/10 text-red-400", + thinking: "bg-yellow-500/10 text-yellow-400", + text: "bg-zinc-500/10 text-zinc-300", +}; + +function eventTypeColor(eventType: string): string { + return EVENT_TYPE_TONES[eventType] ?? "bg-zinc-500/10 text-zinc-300"; +} + +interface EventWithSession extends EventRow { + sessionName: string | null; +} + +export function ActivityFeedView() { + const [events, setEvents] = useState([]); + const [loading, setLoading] = useState(true); + const [paused, setPaused] = useState(false); + + const load = useCallback(() => { + if (paused) return; + window.desktopApi.db + .getEventFeed() + .then((data) => setEvents(data as EventWithSession[])) + .catch(() => {}); + }, [paused]); + + useEffect(() => { + load(); + setLoading(false); + }, [load]); + + useEffect(() => { + if (paused) return; + const interval = setInterval(load, 5000); + return () => clearInterval(interval); + }, [load, paused]); + + const toolCount = events.filter((e) => e.eventType === "tool_use" || e.eventType === "tool_result").length; + const errorCount = events.filter((e) => e.eventType === "error").length; + + const metrics = [ + { label: "Events", value: events.length }, + { label: "Tool Calls", value: toolCount }, + { label: "Errors", value: errorCount }, + { label: "Types", value: new Set(events.map((e) => e.eventType)).size }, + ]; + + if (loading) { + return ( +
+

Loading activity feed...

+
+ ); + } + + return ( +
+
+
+

Activity Feed

+

+ Real-time agent event stream +

+
+ +
+ +
+ {metrics.map((m) => ( + + ))} +
+ +
+ {events.length === 0 && ( +
+ No events recorded yet. +
+ )} + {events.map((event) => ( +
+ + {event.eventType.slice(0, 8)} + +
+ {event.summary && ( +

{event.summary}

+ )} +
+ {event.sessionName && ( + {event.sessionName} + )} + {event.toolName && ( + {event.toolName} + )} + {event.createdAt && ( + {new Date(event.createdAt).toLocaleTimeString()} + )} +
+
+
+ ))} +
+
+ ); +} diff --git a/apps/desktop/src/renderer/components/kanban/KanbanView.tsx b/apps/desktop/src/renderer/components/kanban/KanbanView.tsx new file mode 100644 index 00000000..1e6c2439 --- /dev/null +++ b/apps/desktop/src/renderer/components/kanban/KanbanView.tsx @@ -0,0 +1,127 @@ +import { useState, useEffect } from "react"; +import { KanbanBoardLayout, KanbanColumn, KanbanCardFrame } from "@closedloop-ai/design-system/components/ui/layout/kanban-board"; +import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; +import type { SessionWithAgents } from "../../main/database/types"; + +function PlayIcon() { return ; } +function ClockIcon() { return ; } +function CheckIcon() { return ; } +function XIcon() { return ; } +function StopIcon() { return ; } + +const COLUMNS = [ + { key: "running", label: "Running", icon: PlayIcon(), color: "text-blue-400" }, + { key: "waiting", label: "Waiting", icon: ClockIcon(), color: "text-yellow-400" }, + { key: "completed", label: "Completed", icon: CheckIcon(), color: "text-green-400" }, + { key: "failed", label: "Failed", icon: XIcon(), color: "text-red-400" }, + { key: "stopped", label: "Stopped", icon: StopIcon(), color: "text-zinc-400" }, +]; + +export function KanbanView() { + const [sessions, setSessions] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedId, setSelectedId] = useState(null); + + useEffect(() => { + window.desktopApi.db + .getSessionsWithDetails() + .then((data) => { + setSessions(data as SessionWithAgents[]); + setLoading(false); + }) + .catch(() => setLoading(false)); + }, []); + + if (loading) { + return ( +
+

Loading kanban...

+
+ ); + } + + const grouped: Record = {}; + for (const col of COLUMNS) { + grouped[col.key] = sessions.filter((s) => s.status === col.key); + } + + const uncategorized = sessions.filter( + (s) => !COLUMNS.some((c) => c.key === s.status), + ); + + return ( +
+
+

Kanban Board

+

+ Sessions grouped by status +

+
+ +
+ + {COLUMNS.map((col) => { + const items = grouped[col.key] ?? []; + return ( + } + emptyState={ +
+ No {col.label.toLowerCase()} sessions +
+ } + > + {items.map((session) => ( + + + + ))} +
+ ); + })} + + {uncategorized.length > 0 && ( + + {uncategorized.map((session) => ( + +

{session.name ?? "Unnamed"}

+ {session.status} +
+ ))} +
+ )} +
+
+
+ ); +} diff --git a/apps/desktop/src/renderer/components/layout/Sidebar.tsx b/apps/desktop/src/renderer/components/layout/Sidebar.tsx new file mode 100644 index 00000000..d360e9e4 --- /dev/null +++ b/apps/desktop/src/renderer/components/layout/Sidebar.tsx @@ -0,0 +1,131 @@ +import type { NavId } from "../../App"; + +interface NavItem { + id: NavId; + label: string; + icon: string; + section: "agent" | "gateway"; +} + +const NAV_ITEMS: NavItem[] = [ + { id: "dashboard", label: "Dashboard", icon: "dashboard", section: "agent" }, + { id: "kanban", label: "Kanban Board", icon: "kanban", section: "agent" }, + { id: "sessions", label: "Sessions", icon: "sessions", section: "agent" }, + { id: "activity-feed", label: "Activity Feed", icon: "activity", section: "agent" }, + { id: "analytics", label: "Analytics", icon: "analytics", section: "agent" }, + { id: "workflows", label: "Workflows", icon: "workflows", section: "agent" }, + { id: "approvals", label: "Approvals", icon: "shield", section: "gateway" }, + { id: "requests", label: "Requests", icon: "inbox", section: "gateway" }, + { id: "diagnostics", label: "Diagnostics", icon: "stethoscope", section: "gateway" }, + { id: "settings", label: "Settings", icon: "settings", section: "gateway" }, +]; + +const SVG_ICONS: Record = { + dashboard: '', + kanban: '', + sessions: '', + activity: '', + analytics: '', + workflows: '', + shield: '', + inbox: '', + stethoscope: '', + settings: '', +}; + +function NavIcon({ name }: { name: string }) { + const paths = SVG_ICONS[name] || ""; + return ( + + + {name === "dashboard" ? ( + <> + + + + + + ) : ( + + )} + + + ); +} + +interface SidebarProps { + collapsed: boolean; + activeNav: NavId; + onNavigate: (id: NavId) => void; + runtimeHealthy: boolean; +} + +export function Sidebar({ collapsed, activeNav, onNavigate, runtimeHealthy }: SidebarProps) { + const agentItems = NAV_ITEMS.filter((i) => i.section === "agent"); + const gatewayItems = NAV_ITEMS.filter((i) => i.section === "gateway"); + + const navWidth = collapsed ? "w-[52px]" : "w-[200px]"; + + return ( + + ); +} diff --git a/apps/desktop/src/renderer/components/layout/Topbar.tsx b/apps/desktop/src/renderer/components/layout/Topbar.tsx new file mode 100644 index 00000000..b0f01a75 --- /dev/null +++ b/apps/desktop/src/renderer/components/layout/Topbar.tsx @@ -0,0 +1,60 @@ +import { useCallback } from "react"; + +interface TopbarProps { + collapsed: boolean; + onToggleSidebar: () => void; + navId: string; + runtimeStatus: Record | null; +} + +const NAV_LABELS: Record = { + dashboard: "Dashboard", + kanban: "Kanban Board", + sessions: "Sessions", + "activity-feed": "Activity Feed", + analytics: "Analytics", + workflows: "Workflows", + approvals: "Approvals", + requests: "Requests", + diagnostics: "Diagnostics", + settings: "Settings", +}; + +export function Topbar({ collapsed, onToggleSidebar, navId, runtimeStatus }: TopbarProps) { + const section = ["approvals", "requests", "diagnostics", "settings"].includes(navId) + ? "Gateway" + : "Agents"; + const label = NAV_LABELS[navId] ?? navId; + + return ( +
+ + +
+ {section} + / + {label} +
+ +
+ +
+ {runtimeStatus && ( + + Port: {(runtimeStatus as Record).port as string ?? "..."} + + )} +
+
+ ); +} diff --git a/apps/desktop/src/renderer/components/logs/LogsPanel.tsx b/apps/desktop/src/renderer/components/logs/LogsPanel.tsx new file mode 100644 index 00000000..93977cc7 --- /dev/null +++ b/apps/desktop/src/renderer/components/logs/LogsPanel.tsx @@ -0,0 +1,133 @@ +import { useState, useEffect, useRef, useCallback } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; +import { Card, CardContent } from "@closedloop-ai/design-system/components/ui/card"; + +interface LogEntry { + timestamp?: string; + level?: string; + message?: string; + text?: string; +} + +export function LogsPanel() { + const [entries, setEntries] = useState([]); + const [verbose, setVerbose] = useState(false); + const [paused, setPaused] = useState(false); + const containerRef = useRef(null); + const autoScroll = useRef(true); + + const load = useCallback(async () => { + try { + const data = await window.desktopApi.getLogs(); + const raw = (data as LogEntry[]) ?? []; + setEntries(raw); + } catch { /* ignore */ } + }, []); + + useEffect(() => { load(); }, [load]); + + useEffect(() => { + if (paused) return; + const interval = setInterval(load, 3000); + return () => clearInterval(interval); + }, [paused, load]); + + const handleScroll = () => { + if (!containerRef.current) return; + const { scrollTop, scrollHeight, clientHeight } = containerRef.current; + autoScroll.current = scrollHeight - scrollTop - clientHeight < 50; + }; + + useEffect(() => { + if (autoScroll.current && containerRef.current) { + containerRef.current.scrollTop = containerRef.current.scrollHeight; + } + }, [entries]); + + const handleClear = async () => { + await window.desktopApi.clearLogs(); + await load(); + }; + + const handleOpenFile = async () => { + await window.desktopApi.openLogFile(); + }; + + const filtered = verbose ? entries : entries.filter((e) => { + const msg = e.message ?? e.text ?? ""; + return !msg.startsWith("[debug") && !msg.startsWith("[trace"); + }); + + const levelColor = (level?: string) => { + if (!level) return ""; + const l = level.toLowerCase(); + if (l === "error" || l === "fatal") return "text-[var(--destructive)]"; + if (l === "warn" || l === "warning") return "text-[var(--warning)]"; + if (l === "info") return "text-[var(--info)]"; + return "text-[var(--muted-foreground)]"; + }; + + return ( +
+
+

Diagnostics

+
+ + + +
+ +
+ + + + +
+ + {paused && ( +
Paused
+ )} + +
+ {filtered.length === 0 ? ( +

No log entries

+ ) : ( + filtered.slice(-500).map((e, i) => { + const msg = e.message ?? e.text ?? ""; + const time = e.timestamp ? new Date(e.timestamp).toLocaleTimeString() : ""; + return ( +
+ {time} + {e.level ?? ""} + {msg} +
+ ); + }) + )} +
+ + +
+ ); +} diff --git a/apps/desktop/src/renderer/components/sessions/SessionsView.tsx b/apps/desktop/src/renderer/components/sessions/SessionsView.tsx new file mode 100644 index 00000000..16c58a1f --- /dev/null +++ b/apps/desktop/src/renderer/components/sessions/SessionsView.tsx @@ -0,0 +1,85 @@ +import { useState, useEffect } from "react"; +import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; +import { SessionTable } from "@closedloop-ai/design-system/components/ui/composites/session-table"; +import type { SessionRow } from "@closedloop-ai/design-system/components/ui/types"; +import type { SessionWithAgents } from "../../main/database/types"; + +function adaptSession(raw: SessionWithAgents): SessionRow { + return { + id: raw.id, + name: raw.name ?? "Unnamed Session", + repo: raw.cwd ?? "", + model: raw.model ?? "", + harness: raw.harness ?? "claude", + status: raw.status, + startedAt: raw.startedAt ?? "", + lastActivity: raw.updatedAt ?? raw.startedAt ?? "", + cost: 0, + agents: raw.agentCount, + totalTokens: raw.totalTokens, + awaitingInputSince: raw.awaitingInputSince, + }; +} + +export function SessionsView() { + const [sessions, setSessions] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + window.desktopApi.db + .getSessionsWithDetails() + .then((data) => { + setSessions(data as SessionWithAgents[]); + setLoading(false); + }) + .catch(() => setLoading(false)); + }, []); + + const totalAgents = sessions.reduce((a, s) => a + s.agentCount, 0); + const totalEvents = sessions.reduce((a, s) => a + s.eventCount, 0); + const totalTokens = sessions.reduce((a, s) => a + s.totalTokens, 0); + const activeSessions = sessions.filter( + (s) => !["completed", "failed", "stopped"].includes(s.status), + ).length; + + const metrics = [ + { label: "Total Sessions", value: sessions.length }, + { label: "Active", value: activeSessions }, + { label: "Agents", value: totalAgents }, + { label: "Tokens", value: totalTokens.toLocaleString() }, + ]; + + if (loading) { + return ( +
+

Loading sessions...

+
+ ); + } + + return ( +
+
+

Sessions

+

+ All agent sessions ({sessions.length} total) +

+
+ +
+ {metrics.map((m) => ( + + ))} +
+ + + No sessions recorded yet. +
+ } + /> +
+ ); +} diff --git a/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx b/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx new file mode 100644 index 00000000..cdb1b25e --- /dev/null +++ b/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx @@ -0,0 +1,313 @@ +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; + +type SettingsTab = "relay-gateway" | "security" | "policies" | "binary-paths"; + +export function SettingsPanel() { + const [tab, setTab] = useState("relay-gateway"); + const [settings, setSettings] = useState | null>(null); + + useEffect(() => { + window.desktopApi.getSettings().then((s) => setSettings(s as Record)); + }, []); + + useEffect(() => { + const handler = (e: CustomEvent) => setTab(e.detail as SettingsTab); + window.addEventListener("desktop:navigate-settings-tab", handler as EventListener); + return () => window.removeEventListener("desktop:navigate-settings-tab", handler as EventListener); + }, []); + + const tabs: { id: SettingsTab; label: string }[] = [ + { id: "relay-gateway", label: "Relay / Gateway" }, + { id: "security", label: "Security" }, + { id: "policies", label: "Policies" }, + { id: "binary-paths", label: "CLI Tools" }, + ]; + + return ( +
+

Settings

+ +
+ {tabs.map((t) => ( + + ))} +
+ + {tab === "relay-gateway" && } + {tab === "security" && } + {tab === "policies" && } + {tab === "binary-paths" && } +
+ ); +} + +function RelayGatewayTab({ settings }: { settings: Record | null }) { + const [runtime, setRuntime] = useState | null>(null); + const [paused, setPaused] = useState(false); + const [connected, setConnected] = useState(true); + const [hooksEnabled, setHooksEnabled] = useState(false); + + useEffect(() => { + window.desktopApi.getRuntimeStatus().then((r) => setRuntime(r as Record)); + window.desktopApi.getCloudCommandsPaused().then((p) => setPaused(p as boolean)); + window.desktopApi.getCloudConnectionEnabled().then((c) => setConnected(c as boolean)); + window.desktopApi.getAgentMonitorHooksEnabled().then((h) => setHooksEnabled(h as boolean)); + }, []); + + const handlePauseToggle = async () => { + const next = !paused; + await window.desktopApi.setCloudCommandsPaused(next); + setPaused(next); + }; + + const handleConnectionToggle = async () => { + const next = !connected; + await window.desktopApi.setCloudConnectionEnabled(next); + setConnected(next); + }; + + const handleHooksToggle = async () => { + const next = !hooksEnabled; + const result = await window.desktopApi.setAgentMonitorHooksEnabled(next); + setHooksEnabled(result.enabled); + }; + + return ( +
+ + + Connection Status + + +
+
+

Gateway Port

+

{(runtime?.port as string) ?? "..."}

+
+
+

Cloud Connection

+

+ {connected ? "Connected" : "Disconnected"} +

+
+
+

Remote Commands

+

+ {paused ? "Paused" : "Active"} +

+
+
+

Security

+

{(runtime?.security as string) ?? "..."}

+
+
+
+
+ + + + Configuration + + + + + + + + +
+
+
+

Pause Incoming Commands

+

Pause processing of remote commands

+
+
diff --git a/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx b/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx index 5f5b148f..14aed227 100644 --- a/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx +++ b/apps/desktop/src/renderer/components/analytics/AnalyticsView.tsx @@ -1,34 +1,53 @@ -import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; import { LineChart } from "@closedloop-ai/design-system/components/ui/primitives/line-chart"; import { DonutChart } from "@closedloop-ai/design-system/components/ui/primitives/donut-chart"; -import type { TokenAnalytics, EventCountByType } from "../../main/database/types"; - -const MODEL_COLORS = [ +import { RankedBar } from "@closedloop-ai/design-system/components/ui/primitives/ranked-bar"; +import { ActivityHeatmap } from "@closedloop-ai/design-system/components/ui/primitives/activity-heatmap"; +import { SegmentedBar } from "@closedloop-ai/design-system/components/ui/primitives/segmented-bar"; +import { Coins, ArrowDownToLine, ArrowUpFromLine, DatabaseZap } from "lucide-react"; +import { useQueryCache } from "../../hooks/useQueryCache"; +import type { AnalyticsData } from "../../main/database/types"; + +const PALETTE = [ "#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6", "#ec4899", "#14b8a6", "#f97316", "#6366f1", "#84cc16", ]; +const STATUS_COLORS: Record = { + running: "#3b82f6", active: "#3b82f6", completed: "#10b981", + failed: "#ef4444", error: "#ef4444", stopped: "#6b7280", + waiting: "#f59e0b", abandoned: "#9ca3af", +}; + +function buildHeatmapWeeks(dailyEvents: Array<{ date: string; count: number }>) { + const counts = new Map(dailyEvents.map((d) => [d.date, d.count])); + const weeks: Array> = []; + const today = new Date(); + const start = new Date(today); + start.setDate(start.getDate() - 364); + start.setDate(start.getDate() - start.getDay()); + + let week: Array<{ date: string; count: number }> = []; + for (let d = new Date(start); d <= today; d.setDate(d.getDate() + 1)) { + const iso = d.toISOString().slice(0, 10); + week.push({ date: iso, count: counts.get(iso) ?? 0 }); + if (week.length === 7) { + weeks.push(week); + week = []; + } + } + if (week.length > 0) weeks.push(week); + return weeks; +} + export function AnalyticsView() { - const [tokens, setTokens] = useState(null); - const [eventTypes, setEventTypes] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - Promise.all([ - window.desktopApi.db.getTokenAnalytics(), - window.desktopApi.db.getEventCountByType(), - ]) - .then(([tokenData, eventData]) => { - setTokens(tokenData as TokenAnalytics); - setEventTypes(eventData as EventCountByType[]); - setLoading(false); - }) - .catch(() => setLoading(false)); - }, []); - - if (loading) { + const { data, loading } = useQueryCache( + "db:analytics", + () => window.desktopApi.db.getAnalytics() as Promise, + ); + + if (loading || !data) { return (

Loading analytics...

@@ -36,70 +55,71 @@ export function AnalyticsView() { ); } - const totalTokens = tokens - ? tokens.totalInputTokens + tokens.totalOutputTokens - : 0; - - const metrics = [ - { label: "Total Tokens", value: totalTokens.toLocaleString() }, - { label: "Input Tokens", value: tokens?.totalInputTokens.toLocaleString() ?? "0" }, - { label: "Output Tokens", value: tokens?.totalOutputTokens.toLocaleString() ?? "0" }, - { label: "Cache Saved", value: (tokens ? tokens.totalCacheReadTokens + tokens.totalCacheWriteTokens : 0).toLocaleString() }, - ]; - - const tokenSegments = tokens - ? [ - { label: "Input", value: tokens.totalInputTokens, color: MODEL_COLORS[0] }, - { label: "Output", value: tokens.totalOutputTokens, color: MODEL_COLORS[1] }, - { label: "Cache Read", value: tokens.totalCacheReadTokens, color: MODEL_COLORS[2] }, - { label: "Cache Write", value: tokens.totalCacheWriteTokens, color: MODEL_COLORS[3] }, - ].filter((s) => s.value > 0) - : []; - - const eventSegments = eventTypes.map((e, i) => ({ - label: e.eventType, - value: e.count, - color: MODEL_COLORS[i % MODEL_COLORS.length], + const { tokens, eventsByType, toolUsage, dailyEvents, sessionsByStatus, agentsByStatus, agentsByType } = data; + const totalTokens = tokens.totalInputTokens + tokens.totalOutputTokens; + const cacheTokens = tokens.totalCacheReadTokens + tokens.totalCacheWriteTokens; + + const tokenSegments = [ + { label: "Input", value: tokens.totalInputTokens, color: PALETTE[0] }, + { label: "Output", value: tokens.totalOutputTokens, color: PALETTE[1] }, + { label: "Cache Read", value: tokens.totalCacheReadTokens, color: PALETTE[2] }, + { label: "Cache Write", value: tokens.totalCacheWriteTokens, color: PALETTE[3] }, + ].filter((s) => s.value > 0); + + const sessionSegments = sessionsByStatus.map((s, i) => ({ + label: s.status, value: s.count, color: STATUS_COLORS[s.status] ?? PALETTE[i % PALETTE.length], + })); + + const agentStatusSegments = agentsByStatus.map((s, i) => ({ + label: s.status, value: s.count, color: STATUS_COLORS[s.status] ?? PALETTE[i % PALETTE.length], })); - const tokenByModelSegments = tokens?.byModel.map((m, i) => ({ - label: m.model, - value: m.inputTokens + m.outputTokens, - color: MODEL_COLORS[i % MODEL_COLORS.length], - })) ?? []; + const eventSegments = eventsByType.slice(0, 8).map((e, i) => ({ + label: e.eventType, value: e.count, color: PALETTE[i % PALETTE.length], + })); + + const agentTypeSegments = agentsByType.slice(0, 8).map((a, i) => ({ + key: a.type, label: a.type, value: a.count, + colorClassName: `bg-[${PALETTE[i % PALETTE.length]}]`, + })); + const agentTypeTotal = agentsByType.reduce((s, a) => s + a.count, 0); - const dayPoints: { label: string; value: number }[] = (tokens?.byDay ?? []).map((d) => ({ - label: d.day, - value: d.inputTokens + d.outputTokens, + const dayPoints = (tokens.byDay ?? []).map((d) => ({ + label: d.day, value: d.inputTokens + d.outputTokens, })); + const maxToolCount = toolUsage.length > 0 ? toolUsage[0].count : 1; + const heatmapWeeks = buildHeatmapWeeks(dailyEvents); + return (

Analytics

-

- Token usage and event metrics -

+

Token usage, event metrics, and activity trends

- {metrics.map((m) => ( - - ))} + + + + 0 ? `${Math.round((cacheTokens / (totalTokens + cacheTokens)) * 100)}% cache rate` : undefined} icon={DatabaseZap} />
+ {dailyEvents.length > 0 && ( + + Activity Heatmap + + + + + )} +
- - Token Distribution - + Token Distribution {tokenSegments.length > 0 ? ( - t.toLocaleString()} - centerLabel="Tokens" - /> + t.toLocaleString()} centerLabel="Tokens" /> ) : (

No token data

)} @@ -107,16 +127,32 @@ export function AnalyticsView() {
- - Events by Type - + Sessions by Status + + {sessionSegments.length > 0 ? ( + `${t}`} centerLabel="Sessions" /> + ) : ( +

No session data

+ )} +
+
+ + + Agents by Status + + {agentStatusSegments.length > 0 ? ( + `${t}`} centerLabel="Agents" /> + ) : ( +

No agent data

+ )} +
+
+ + + Events by Type {eventSegments.length > 0 ? ( - t.toLocaleString()} - centerLabel="Events" - /> + t.toLocaleString()} centerLabel="Events" /> ) : (

No event data

)} @@ -124,26 +160,54 @@ export function AnalyticsView() {
+ {agentTypeSegments.length > 0 && ( + + Agent Type Distribution + + + + + )} + - - Token Usage by Model - + Tool Usage - {tokenByModelSegments.length > 0 ? ( + {toolUsage.length > 0 ? (
- {tokenByModelSegments.map((seg) => ( -
- - {seg.label} - - {seg.value.toLocaleString()} - -
+ {toolUsage.slice(0, 15).map((t) => ( + {t.toolName}} + value={t.count} + percent={(t.count / maxToolCount) * 100} + /> ))}
+ ) : ( +

No tool usage data

+ )} +
+
+ + + Token Usage by Model + + {tokens.byModel.length > 0 ? ( +
+ {tokens.byModel.map((m) => { + const modelTotal = m.inputTokens + m.outputTokens; + const maxModel = tokens.byModel[0] ? tokens.byModel[0].inputTokens + tokens.byModel[0].outputTokens : 1; + return ( + {m.model}} + value={modelTotal.toLocaleString()} + percent={(modelTotal / maxModel) * 100} + description={{m.sessions} sessions} + /> + ); + })} +
) : (

No model data

)} @@ -152,16 +216,10 @@ export function AnalyticsView() { {dayPoints.length > 0 && ( - - Daily Token Usage (Last 30 Days) - + Daily Token Usage (Last 30 Days)
- v.toLocaleString()} - /> + v.toLocaleString()} />
diff --git a/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx b/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx index 6788cbb4..11e1a556 100644 --- a/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx +++ b/apps/desktop/src/renderer/components/approvals/ApprovalsPanel.tsx @@ -24,22 +24,34 @@ export function ApprovalsPanel() { setLoading(false); }, []); - useEffect(() => { load(); }, [load]); + useEffect(() => { + load(); + const interval = setInterval(load, 3000); + return () => clearInterval(interval); + }, [load]); const handleApprove = async (id: string) => { - await window.desktopApi.approveApproval(id); + try { + await window.desktopApi.approveApproval(id); + } catch { /* reload will pick up current state */ } await load(); }; const handleDeny = async (id: string) => { - await window.desktopApi.denyApproval(id); + try { + await window.desktopApi.denyApproval(id); + } catch { /* reload will pick up current state */ } await load(); }; const handleAlwaysAllow = async (id: string) => { - await window.desktopApi.alwaysAllowApproval(id); + try { + await window.desktopApi.alwaysAllowApproval(id); + } catch { /* reload will pick up current state */ } await load(); }; const handleClear = async () => { - await window.desktopApi.clearPendingApprovals(); + try { + await window.desktopApi.clearPendingApprovals(); + } catch { /* reload will pick up current state */ } await load(); }; diff --git a/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx b/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx index 2bb1c87c..87b5025b 100644 --- a/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx +++ b/apps/desktop/src/renderer/components/dashboard/DashboardPage.tsx @@ -1,124 +1,165 @@ import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; -import type { DashboardSummary } from "../../main/database/types"; +import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; +import { RankedBar } from "@closedloop-ai/design-system/components/ui/primitives/ranked-bar"; +import { MonitorDot, Bot, Zap, Layers } from "lucide-react"; +import type { DashboardSummary, AnalyticsData } from "../../main/database/types"; export function DashboardPage() { const [summary, setSummary] = useState(null); + const [analytics, setAnalytics] = useState(null); + const [error, setError] = useState(false); useEffect(() => { - window.desktopApi.db - .getDashboardSummary() - .then((data) => setSummary(data as DashboardSummary)) - .catch(console.error); + let mounted = true; + const load = () => { + Promise.all([ + window.desktopApi.db.getDashboardSummary(), + window.desktopApi.db.getAnalytics(), + ]) + .then(([summaryData, analyticsData]) => { + if (mounted) { + setSummary(summaryData as DashboardSummary); + setAnalytics(analyticsData as AnalyticsData); + setError(false); + } + }) + .catch(() => { if (mounted) setError(true); }); + }; + load(); + const interval = setInterval(load, 3000); + return () => { mounted = false; clearInterval(interval); }; }, []); + if (error) { + return ( +
+

Failed to load dashboard data.

+
+ ); + } + + if (!summary) { + return ( +
+

Loading dashboard data...

+
+ ); + } + + const toolUsage = analytics?.toolUsage ?? []; + const maxToolCount = toolUsage.length > 0 ? toolUsage[0].count : 1; + + const effectivenessData = analytics?.agentsByType ?? []; + return (
-

Agent Dashboard

+

My Tasks

- In-process agent session monitoring + Agent sessions and activity overview

- {summary ? ( - <> -
- - - - Sessions - - - -
{summary.totalSessions}
-

- {summary.activeSessions} active +

+ + + + +
+ +
+ + + Recent Sessions + + +
+ {summary.recentSessions.map((session) => ( +
+
+

+ {session.name || "Unnamed Session"} +

+

+ {session.model ?? "Unknown model"} + {session.cwd ? ` · ${session.cwd}` : ""} +

+
+
+ + {session.status} + + + {session.startedAt ? new Date(session.startedAt).toLocaleDateString() : ""} + +
+
+ ))} + {summary.recentSessions.length === 0 && ( +

+ No sessions recorded yet.

- - - - - - Agents - - - -
{summary.totalAgents}
-
-
- - - - Events - - - -
{summary.totalEvents}
-
-
- - - - Token Usage - - - -
{summary.totalTokens}
-
-
-
+ )} +
+
+
- - - Recent Sessions - - + + + Tool Usage + + + {toolUsage.length > 0 ? (
- {summary.recentSessions.map((session) => ( -
-
-

- {session.name || "Unnamed Session"} -

-

- {session.model ?? "Unknown model"} - {session.cwd ? ` · ${session.cwd}` : ""} -

-
-
- - {session.status} - - - {session.startedAt - ? new Date(session.startedAt).toLocaleDateString() - : ""} - -
-
+ {toolUsage.slice(0, 8).map((t) => ( + {t.toolName}} + value={t.count} + percent={(t.count / maxToolCount) * 100} + /> ))} - {summary.recentSessions.length === 0 && ( -

- No sessions recorded yet. -

- )}
-
-
- - ) : ( -
-

Loading dashboard data...

-
+ ) : ( +

+ No tool usage data yet. +

+ )} +
+
+
+ + {effectivenessData.length > 0 && ( + + + Agent Types + + +
+ + + + + + + + + {effectivenessData.map((a) => ( + + + + + ))} + +
TypeCount
{a.type}{a.count}
+
+
+
)}
); diff --git a/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx b/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx index 2d86fd3c..0437a487 100644 --- a/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx +++ b/apps/desktop/src/renderer/components/feed/ActivityFeedView.tsx @@ -1,19 +1,20 @@ -import { useState, useEffect, useCallback } from "react"; -import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { useState, useEffect, useCallback, useMemo } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; +import { Zap, Wrench, AlertCircle, Layers } from "lucide-react"; import type { EventRow } from "../../main/database/types"; const EVENT_TYPE_TONES: Record = { - tool_use: "bg-blue-500/10 text-blue-400", - tool_result: "bg-green-500/10 text-green-400", - error: "bg-red-500/10 text-red-400", - thinking: "bg-yellow-500/10 text-yellow-400", - text: "bg-zinc-500/10 text-zinc-300", + tool_use: "bg-blue-500/10 text-blue-600", + tool_result: "bg-green-500/10 text-green-600", + error: "bg-red-500/10 text-red-600", + thinking: "bg-yellow-500/10 text-yellow-700", + text: "bg-zinc-500/10 text-zinc-600", }; function eventTypeColor(eventType: string): string { - return EVENT_TYPE_TONES[eventType] ?? "bg-zinc-500/10 text-zinc-300"; + return EVENT_TYPE_TONES[eventType] ?? "bg-zinc-500/10 text-zinc-600"; } interface EventWithSession extends EventRow { @@ -24,6 +25,9 @@ export function ActivityFeedView() { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [paused, setPaused] = useState(false); + const [search, setSearch] = useState(""); + const [typeFilter, setTypeFilter] = useState("all"); + const [expandedId, setExpandedId] = useState(null); const load = useCallback(() => { if (paused) return; @@ -44,16 +48,31 @@ export function ActivityFeedView() { return () => clearInterval(interval); }, [load, paused]); + const eventTypes = useMemo(() => { + const types = new Set(events.map((e) => e.eventType)); + return Array.from(types).sort(); + }, [events]); + + const filtered = useMemo(() => { + let result = events; + if (typeFilter !== "all") { + result = result.filter((e) => e.eventType === typeFilter); + } + if (search) { + const q = search.toLowerCase(); + result = result.filter( + (e) => + (e.summary ?? "").toLowerCase().includes(q) || + (e.toolName ?? "").toLowerCase().includes(q) || + (e.sessionName ?? "").toLowerCase().includes(q), + ); + } + return result; + }, [events, typeFilter, search]); + const toolCount = events.filter((e) => e.eventType === "tool_use" || e.eventType === "tool_result").length; const errorCount = events.filter((e) => e.eventType === "error").length; - const metrics = [ - { label: "Events", value: events.length }, - { label: "Tool Calls", value: toolCount }, - { label: "Errors", value: errorCount }, - { label: "Types", value: new Set(events.map((e) => e.eventType)).size }, - ]; - if (loading) { return (
@@ -71,56 +90,80 @@ export function ActivityFeedView() { Real-time agent event stream

- + {paused ? "Resume" : "Pause"} +
- {metrics.map((m) => ( - - ))} + + + + +
+ +
+ setSearch(e.target.value)} + placeholder="Search events..." + className="flex-1 bg-[var(--input)] border border-[var(--input-border)] rounded-md px-3 py-1.5 text-sm text-[var(--foreground)] placeholder:text-[var(--muted-foreground)]" + /> +
- {events.length === 0 && ( + {filtered.length === 0 && (
- No events recorded yet. + {search || typeFilter !== "all" ? "No events match the current filters." : "No events recorded yet."}
)} - {events.map((event) => ( -
- ( +
+
setExpandedId(expandedId === event.id ? null : event.id)} > - {event.eventType.slice(0, 8)} - -
- {event.summary && ( -

{event.summary}

- )} -
- {event.sessionName && ( - {event.sessionName} - )} - {event.toolName && ( - {event.toolName} - )} - {event.createdAt && ( - {new Date(event.createdAt).toLocaleTimeString()} + + {event.eventType.replace(/_/g, " ").slice(0, 12)} + +
+ {event.summary && ( +

{event.summary}

)} +
+ {event.sessionName && {event.sessionName}} + {event.toolName && {event.toolName}} + {event.createdAt && {new Date(event.createdAt).toLocaleTimeString()}} +
+ {event.toolName && ( + {event.toolName} + )}
+ {expandedId === event.id && event.data && ( +
+
+                  {(() => { try { return JSON.stringify(JSON.parse(event.data), null, 2); } catch { return event.data; } })()}
+                
+
+ )}
))}
diff --git a/apps/desktop/src/renderer/components/kanban/KanbanView.tsx b/apps/desktop/src/renderer/components/kanban/KanbanView.tsx index 1e6c2439..9ce1dbd6 100644 --- a/apps/desktop/src/renderer/components/kanban/KanbanView.tsx +++ b/apps/desktop/src/renderer/components/kanban/KanbanView.tsx @@ -1,6 +1,7 @@ -import { useState, useEffect } from "react"; +import { useState } from "react"; import { KanbanBoardLayout, KanbanColumn, KanbanCardFrame } from "@closedloop-ai/design-system/components/ui/layout/kanban-board"; import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; +import { useQueryCache } from "../../hooks/useQueryCache"; import type { SessionWithAgents } from "../../main/database/types"; function PlayIcon() { return ; } @@ -18,24 +19,16 @@ const COLUMNS = [ ]; export function KanbanView() { - const [sessions, setSessions] = useState([]); - const [loading, setLoading] = useState(true); + const { data: sessions, loading } = useQueryCache( + "db:sessions-details", + () => window.desktopApi.db.getSessionsWithDetails() as Promise, + ); const [selectedId, setSelectedId] = useState(null); - useEffect(() => { - window.desktopApi.db - .getSessionsWithDetails() - .then((data) => { - setSessions(data as SessionWithAgents[]); - setLoading(false); - }) - .catch(() => setLoading(false)); - }, []); - - if (loading) { + if (loading || !sessions) { return (
-

Loading kanban...

+

Loading...

); } @@ -52,7 +45,7 @@ export function KanbanView() { return (
-

Kanban Board

+

My Tasks

Sessions grouped by status

@@ -67,7 +60,7 @@ export function KanbanView() { key={col.key} title={col.label} count={items.length} - icon={} + icon={col.icon} emptyState={
No {col.label.toLowerCase()} sessions diff --git a/apps/desktop/src/renderer/components/layout/Sidebar.tsx b/apps/desktop/src/renderer/components/layout/Sidebar.tsx index d360e9e4..5dcd4377 100644 --- a/apps/desktop/src/renderer/components/layout/Sidebar.tsx +++ b/apps/desktop/src/renderer/components/layout/Sidebar.tsx @@ -8,12 +8,12 @@ interface NavItem { } const NAV_ITEMS: NavItem[] = [ - { id: "dashboard", label: "Dashboard", icon: "dashboard", section: "agent" }, + { id: "dashboard", label: "My Tasks", icon: "dashboard", section: "agent" }, { id: "kanban", label: "Kanban Board", icon: "kanban", section: "agent" }, { id: "sessions", label: "Sessions", icon: "sessions", section: "agent" }, { id: "activity-feed", label: "Activity Feed", icon: "activity", section: "agent" }, { id: "analytics", label: "Analytics", icon: "analytics", section: "agent" }, - { id: "workflows", label: "Workflows", icon: "workflows", section: "agent" }, + { id: "workflows", label: "Agents", icon: "workflows", section: "agent" }, { id: "approvals", label: "Approvals", icon: "shield", section: "gateway" }, { id: "requests", label: "Requests", icon: "inbox", section: "gateway" }, { id: "diagnostics", label: "Diagnostics", icon: "stethoscope", section: "gateway" }, @@ -38,16 +38,7 @@ function NavIcon({ name }: { name: string }) { return ( - {name === "dashboard" ? ( - <> - - - - - - ) : ( - - )} + ); diff --git a/apps/desktop/src/renderer/components/layout/Topbar.tsx b/apps/desktop/src/renderer/components/layout/Topbar.tsx index b0f01a75..00d784d9 100644 --- a/apps/desktop/src/renderer/components/layout/Topbar.tsx +++ b/apps/desktop/src/renderer/components/layout/Topbar.tsx @@ -8,12 +8,12 @@ interface TopbarProps { } const NAV_LABELS: Record = { - dashboard: "Dashboard", + dashboard: "My Tasks", kanban: "Kanban Board", sessions: "Sessions", "activity-feed": "Activity Feed", analytics: "Analytics", - workflows: "Workflows", + workflows: "Agents", approvals: "Approvals", requests: "Requests", diagnostics: "Diagnostics", diff --git a/apps/desktop/src/renderer/components/sessions/SessionsView.tsx b/apps/desktop/src/renderer/components/sessions/SessionsView.tsx index 16c58a1f..0e0c9bc8 100644 --- a/apps/desktop/src/renderer/components/sessions/SessionsView.tsx +++ b/apps/desktop/src/renderer/components/sessions/SessionsView.tsx @@ -1,6 +1,9 @@ -import { useState, useEffect } from "react"; +import { useState, useMemo } from "react"; +import { Button } from "@closedloop-ai/design-system/components/ui/button"; import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; import { SessionTable } from "@closedloop-ai/design-system/components/ui/composites/session-table"; +import { MonitorDot, Activity, Bot, Coins } from "lucide-react"; +import { useQueryCache } from "../../hooks/useQueryCache"; import type { SessionRow } from "@closedloop-ai/design-system/components/ui/types"; import type { SessionWithAgents } from "../../main/database/types"; @@ -21,34 +24,42 @@ function adaptSession(raw: SessionWithAgents): SessionRow { }; } +const STATUS_OPTIONS = ["all", "running", "completed", "failed", "stopped", "waiting"] as const; + export function SessionsView() { - const [sessions, setSessions] = useState([]); - const [loading, setLoading] = useState(true); + const { data: sessions, loading } = useQueryCache( + "db:sessions-details", + () => window.desktopApi.db.getSessionsWithDetails() as Promise, + ); + const [search, setSearch] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + + const allSessions = sessions ?? []; - useEffect(() => { - window.desktopApi.db - .getSessionsWithDetails() - .then((data) => { - setSessions(data as SessionWithAgents[]); - setLoading(false); - }) - .catch(() => setLoading(false)); - }, []); + const filtered = useMemo(() => { + let result = allSessions; + if (statusFilter !== "all") { + result = result.filter((s) => s.status === statusFilter); + } + if (search) { + const q = search.toLowerCase(); + result = result.filter( + (s) => + (s.name ?? "").toLowerCase().includes(q) || + s.id.toLowerCase().includes(q) || + (s.cwd ?? "").toLowerCase().includes(q) || + (s.model ?? "").toLowerCase().includes(q), + ); + } + return result; + }, [allSessions, statusFilter, search]); - const totalAgents = sessions.reduce((a, s) => a + s.agentCount, 0); - const totalEvents = sessions.reduce((a, s) => a + s.eventCount, 0); - const totalTokens = sessions.reduce((a, s) => a + s.totalTokens, 0); - const activeSessions = sessions.filter( + const totalAgents = allSessions.reduce((a, s) => a + s.agentCount, 0); + const totalTokens = allSessions.reduce((a, s) => a + s.totalTokens, 0); + const activeSessions = allSessions.filter( (s) => !["completed", "failed", "stopped"].includes(s.status), ).length; - const metrics = [ - { label: "Total Sessions", value: sessions.length }, - { label: "Active", value: activeSessions }, - { label: "Agents", value: totalAgents }, - { label: "Tokens", value: totalTokens.toLocaleString() }, - ]; - if (loading) { return (
@@ -62,21 +73,46 @@ export function SessionsView() {

Sessions

- All agent sessions ({sessions.length} total) + All agent sessions ({allSessions.length} total)

- {metrics.map((m) => ( - - ))} + + + + +
+ +
+ setSearch(e.target.value)} + placeholder="Search sessions..." + className="flex-1 bg-[var(--input)] border border-[var(--input-border)] rounded-md px-3 py-1.5 text-sm text-[var(--foreground)] placeholder:text-[var(--muted-foreground)]" + /> +
+ {STATUS_OPTIONS.map((s) => ( + + ))} +
- No sessions recorded yet. + {search || statusFilter !== "all" + ? "No sessions match the current filters." + : "No sessions recorded yet."}
} /> diff --git a/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx b/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx index cdb1b25e..7d375913 100644 --- a/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx +++ b/apps/desktop/src/renderer/components/settings/SettingsPanel.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useCallback } from "react"; import { Button } from "@closedloop-ai/design-system/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; -type SettingsTab = "relay-gateway" | "security" | "policies" | "binary-paths"; +type SettingsTab = "relay-gateway" | "security" | "policies" | "binary-paths" | "labs"; export function SettingsPanel() { const [tab, setTab] = useState("relay-gateway"); @@ -23,6 +23,7 @@ export function SettingsPanel() { { id: "security", label: "Security" }, { id: "policies", label: "Policies" }, { id: "binary-paths", label: "CLI Tools" }, + { id: "labs", label: "Labs" }, ]; return ( @@ -50,6 +51,7 @@ export function SettingsPanel() { {tab === "security" && } {tab === "policies" && } {tab === "binary-paths" && } + {tab === "labs" && }
); } @@ -243,6 +245,8 @@ function PoliciesTab({ settings }: { settings: Record | null }) function BinaryPathsTab() { const [binaries, setBinaries] = useState>({}); const [loading, setLoading] = useState(true); + const [editing, setEditing] = useState(null); + const [editValue, setEditValue] = useState(""); useEffect(() => { window.desktopApi.getBinaryPaths().then((b) => { @@ -259,13 +263,18 @@ function BinaryPathsTab() { setLoading(false); }; + const startEdit = (tool: string) => { + setEditing(tool); + setEditValue(binaries[tool] ?? ""); + }; + const handleSave = async (tool: string) => { - const input = prompt(`Enter path for ${tool}:`, binaries[tool] ?? ""); - if (input) { - await window.desktopApi.patchBinaryPaths({ [tool]: input }); + if (editValue) { + await window.desktopApi.patchBinaryPaths({ [tool]: editValue }); const b = await window.desktopApi.getBinaryPaths(); setBinaries(b as Record); } + setEditing(null); }; const BINARY_TOOLS = ["claude", "node", "git", "bash", "python3"]; @@ -285,14 +294,33 @@ function BinaryPathsTab() { ) : ( BINARY_TOOLS.map((tool) => (
-
+

{tool}

-

- {binaries[tool] ?? "Not found"} -

+ {editing === tool ? ( + setEditValue(e.target.value)} + onKeyDown={(e) => { if (e.key === "Enter") handleSave(tool); if (e.key === "Escape") setEditing(null); }} + autoFocus + className="mt-1 w-full text-xs font-mono bg-[var(--input)] border rounded px-2 py-1 text-[var(--foreground)]" + placeholder={`/usr/bin/${tool}`} + /> + ) : ( +

+ {binaries[tool] ?? "Not found"} +

+ )}
-
- +
+ {editing === tool ? ( + <> + + + + ) : ( + + )}
)) @@ -303,6 +331,71 @@ function BinaryPathsTab() { ); } +const LAB_FLAGS: { key: string; label: string; description: string; category: string; requiresRestart?: boolean }[] = [ + { key: "agentMonitorEnabled", label: "Agent Dashboard", description: "Enable the Claude Dashboard for session and agent observability.", category: "Monitoring" }, + { key: "planExtractionEnabled", label: "Plan Extraction", description: "Enable Plans / plan extraction UI in the Agent Dashboard.", category: "Monitoring" }, + { key: "commandSigningEnforcementEnabled", label: "Command Signing Enforcement", description: "Require ED25519 signatures on browser commands.", category: "Security", requiresRestart: true }, + { key: "verboseLogging", label: "Verbose Logging", description: "Enable verbose gateway logging for debugging.", category: "Debugging" }, +]; + +function LabsTab({ settings, onSettingsChange }: { settings: Record | null; onSettingsChange: (s: Record) => void }) { + const [saving, setSaving] = useState(null); + + const handleToggle = async (key: string, currentValue: boolean) => { + setSaving(key); + try { + await window.desktopApi.updateSettings({ [key]: !currentValue }); + const updated = await window.desktopApi.getSettings(); + onSettingsChange(updated as Record); + } catch { /* ignore */ } + setSaving(null); + }; + + return ( +
+ + + Labs + + +

+ Early access to experimental features and advanced controls. +

+
+ {LAB_FLAGS.map((flag) => { + const value = settings?.[flag.key] === true; + return ( +
+
+
+

{flag.label}

+ {flag.category} +
+

{flag.description}

+ {flag.requiresRestart && ( +

Requires restart

+ )} +
+
+ + +
+ ); +} + function ConfigRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) { return (
diff --git a/apps/desktop/src/renderer/components/workflows/WorkflowsView.tsx b/apps/desktop/src/renderer/components/workflows/WorkflowsView.tsx index f9601b67..fa5be507 100644 --- a/apps/desktop/src/renderer/components/workflows/WorkflowsView.tsx +++ b/apps/desktop/src/renderer/components/workflows/WorkflowsView.tsx @@ -1,95 +1,27 @@ -import { useState, useEffect } from "react"; +import { useQueryCache } from "../../hooks/useQueryCache"; import { Card, CardContent, CardHeader, CardTitle } from "@closedloop-ai/design-system/components/ui/card"; +import { WorkflowStatTile } from "@closedloop-ai/design-system/components/ui/primitives/workflow-stat-tile"; +import { OrchestrationDag } from "@closedloop-ai/design-system/components/ui/composites/orchestration-dag"; +import { SankeyGraph } from "@closedloop-ai/design-system/components/ui/primitives/sankey-graph"; +import { AgentCollaborationNetwork } from "@closedloop-ai/design-system/components/ui/composites/agent-collaboration-network"; +import { RankedBar } from "@closedloop-ai/design-system/components/ui/primitives/ranked-bar"; import { Badge } from "@closedloop-ai/design-system/components/ui/badge"; -import { MetricCard } from "@closedloop-ai/design-system/components/ui/primitives/metric-card"; -import type { SessionWithAgents, AgentHierarchyNode } from "../../main/database/types"; +import { Monitor, Bot, GitFork, Target, Layers, Timer } from "lucide-react"; +import type { WorkflowQueryData } from "../../main/database/types"; -function AgentTreeNode({ node, depth }: { node: AgentHierarchyNode; depth: number }) { - const [expanded, setExpanded] = useState(depth < 2); - const hasChildren = node.children.length > 0; - - return ( -
-
0 ? "ml-6" : "" - }`} - onClick={() => setExpanded((e) => !e)} - > - {hasChildren ? ( - expanded ? ( - - ) : ( - - ) - ) : ( - - )} -
-

- {node.name ?? node.subagentType ?? node.type ?? "Agent"} -

- {node.task && ( -

{node.task}

- )} -
- - {node.status} - - {node.currentTool && ( - - {node.currentTool} - - )} -
- {expanded && hasChildren && ( -
- {node.children.map((child) => ( - - ))} -
- )} -
- ); +function formatDuration(sec: number): string { + if (sec < 60) return `${Math.round(sec)}s`; + if (sec < 3600) return `${Math.round(sec / 60)}m`; + return `${(sec / 3600).toFixed(1)}h`; } export function WorkflowsView() { - const [sessions, setSessions] = useState([]); - const [hierarchies, setHierarchies] = useState>(new Map()); - const [selectedSessionId, setSelectedSessionId] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - window.desktopApi.db - .getSessionsWithDetails() - .then(async (data) => { - const allSessions = data as SessionWithAgents[]; - setSessions(allSessions); - - const hierarchyMap = new Map(); - for (const s of allSessions) { - try { - const tree = await window.desktopApi.db.getAgentHierarchy(s.id); - hierarchyMap.set(s.id, tree as AgentHierarchyNode[]); - } catch { - hierarchyMap.set(s.id, []); - } - } - setHierarchies(hierarchyMap); - setLoading(false); - }) - .catch(() => setLoading(false)); - }, []); + const { data, loading } = useQueryCache( + "db:workflows", + () => window.desktopApi.db.getWorkflowData() as Promise, + ); - if (loading) { + if (loading || !data) { return (

Loading workflows...

@@ -97,92 +29,139 @@ export function WorkflowsView() { ); } - const sessionsWithAgents = sessions.filter((s) => s.agentCount > 0); - const totalSubagents = [...hierarchies.values()].reduce( - (sum, roots) => sum + roots.reduce((s, r) => s + countNodes(r), 0), - 0, - ); - - const metrics = [ - { label: "Sessions", value: sessionsWithAgents.length }, - { label: "Agent Trees", value: totalSubagents }, - { label: "Avg Depth", value: sessionsWithAgents.length > 0 ? "~3" : "0" }, - { label: "Active Flows", value: sessionsWithAgents.filter((s) => s.status === "running").length }, - ]; + const { stats, orchestration, toolFlow, effectiveness, cooccurrence } = data; - const displaySession = selectedSessionId - ? sessions.find((s) => s.id === selectedSessionId) - : sessionsWithAgents[0]; - - const tree = displaySession ? hierarchies.get(displaySession.id) ?? [] : []; + const hasOrchestration = orchestration.subagentTypes.length > 0 || orchestration.edges.length > 0; + const hasToolFlow = toolFlow.transitions.length > 0; + const hasEffectiveness = effectiveness.length > 0; + const hasCooccurrence = cooccurrence.length > 0; + const maxToolCount = toolFlow.toolCounts.length > 0 ? toolFlow.toolCounts[0].count : 1; return (

Workflows

- Agent pipeline and delegation trees + Agent orchestration patterns, tool flows, and effectiveness

-
- {metrics.map((m) => ( - - ))} +
+ + + + + +
- {sessionsWithAgents.length > 0 && ( -
- {sessionsWithAgents.slice(0, 10).map((s) => ( - - ))} -
+ {stats.topFlow && ( + + +

+ Top tool flow: {stats.topFlow.source} + {" → "} + {stats.topFlow.target} + {" "} + {stats.topFlow.count}x +

+
+
+ )} + + {hasOrchestration && ( + + Orchestration DAG + + + + + )} + + {hasToolFlow && ( + + Tool Execution Flow + + ({ id: t.toolName, value: t.count }))} + ariaLabel="Tool execution flow" + emptyMessage="No tool transitions recorded" + /> + + + )} + + {hasCooccurrence && hasEffectiveness && ( + + Agent Collaboration Network + + + + + )} + + {hasEffectiveness && ( + + Subagent Effectiveness + +
+ + + + + + + + + + + + {effectiveness.map((e) => ( + + + + + + + + ))} + +
Agent TypeTotalCompletedErrorsSuccess Rate
{e.subagentType}{e.total}{e.completed}{e.errors} + = 80 ? "default" : "secondary"}> + {e.successRate.toFixed(0)}% + +
+
+
+
)} - {displaySession && ( + {toolFlow.toolCounts.length > 0 && ( - - - {displaySession.name ?? "Session"} — Agent Tree - - + Tool Invocation Counts - {tree.length > 0 ? ( -
- {tree.map((root) => ( - - ))} -
- ) : ( -

- No agent hierarchy data for this session. -

- )} +
+ {toolFlow.toolCounts.slice(0, 15).map((t) => ( + {t.toolName}} + value={t.count} + percent={(t.count / maxToolCount) * 100} + /> + ))} +
)} - {sessionsWithAgents.length === 0 && ( -
-

- No workflow data available yet. Start an agent session to see delegation trees. -

-
+ {!hasOrchestration && !hasToolFlow && !hasEffectiveness && ( + + + No workflow data yet. Agent orchestration patterns will appear here once sessions with subagents are recorded. + + )}
); } - -function countNodes(node: AgentHierarchyNode): number { - return 1 + node.children.reduce((sum, child) => sum + countNodes(child), 0); -} diff --git a/apps/desktop/src/renderer/globals.css b/apps/desktop/src/renderer/globals.css index 1346c413..cebabdb1 100644 --- a/apps/desktop/src/renderer/globals.css +++ b/apps/desktop/src/renderer/globals.css @@ -1 +1,329 @@ -@import "@closedloop-ai/design-system/styles/globals.css"; +@import "tailwindcss"; +@import "tw-animate-css"; +@source "./**/*.{ts,tsx}"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(0.985 0.001 267); + --foreground: oklch(0.232 0 0); + --card: oklch(0.989 0 0); + --card-foreground: oklch(0.232 0 0); + --popover: oklch(0.989 0 0); + --popover-foreground: oklch(0.232 0 0); + --primary: oklch(0.528 0.214 267); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.925 0.058 146.3); + --secondary-foreground: oklch(0.381 0.113 149); + --muted: oklch(0.7 0 0 / 0.12); + --muted-foreground: oklch(0.466 0 0); + --accent: oklch(0.94 0.04 267); + --accent-foreground: oklch(0.232 0 0); + --destructive: oklch(0.62 0.22 29.2); + --destructive-foreground: oklch(1 0 0); + --success: oklch(0.629 0.144 155.113); + --success-foreground: oklch(0.35 0.1 165); + --warning: oklch(0.82 0.17 85); + --warning-foreground: oklch(0.45 0.12 85); + --info: oklch(0.6 0.15 250); + --info-foreground: oklch(0.45 0.12 250); + --ai: oklch(0.6 0.2 295); + --ai-foreground: oklch(0.4 0.15 295); + --border: oklch(0.5 0.008 267 / 0.1); + --input: oklch(1 0 0 / 0); + --input-border: oklch(0.5 0.008 267 / 0.14); + --ring: oklch(0.861 0.04 250); + --chart-1: oklch(0.554 0.214 266.2); + --chart-2: oklch(0.923 0.056 211); + --chart-3: oklch(0.908 0.115 148.6); + --chart-4: oklch(0.902 0.128 87.8); + --chart-5: oklch(0.756 0.162 38); + --chart-6: oklch(0.66 0.22 25); + --chart-7: oklch(0.7 0.18 340); + --chart-8: oklch(0.62 0.2 295); + --radius: 0.5rem; + --sidebar: oklch(0.96 0.005 267); + --sidebar-foreground: oklch(0.253 0 0); + --sidebar-primary: oklch(0.322 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.92 0.008 267); + --sidebar-accent-foreground: oklch(0.322 0 0); + --sidebar-border: oklch(0.933 0 0); + --sidebar-ring: oklch(0.762 0 0); + --progress: oklch(0.6 0.005 267 / 0.2); + --progress-foreground: var(--primary); + --thinking: var(--primary); + --closedloop-violet: oklch(0.61 0.256 285.5); + --highlight: rgb(0 89 255 / 0.15); + --surface-0: oklch(0.982 0.002 267); + --surface-1: oklch(0.975 0.002 267); + --surface-2: oklch(0.962 0.004 267); + --surface-3: oklch(0.942 0.006 267); + --surface-4: oklch(0.91 0.008 267); + --surface-5: oklch(0.87 0.01 267); + --progress-badge-bg: oklch(0.94 0.035 317.076); + --progress-badge-border: oklch(0.94 0.035 317.076); + --progress-badge-text: oklch(0.5 0.2 319.047); + --shadow-inset: + 0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.08); + --font-weight-bold: 600; +} + +.dark { + --background: oklch(0.24 0.005 270); + --foreground: oklch(0.948 0.002 270); + --card: oklch(0.285 0.012 270); + --card-foreground: oklch(0.943 0 0); + --popover: oklch(0.27 0.007 270); + --popover-foreground: oklch(0.943 0 0); + --primary: oklch(0.542 0.214 266); + --primary-foreground: oklch(0.976 0.014 263); + --secondary: oklch(0.346 0.063 150); + --secondary-foreground: oklch(0.808 0.176 141); + --muted: oklch(1 0.003 270 / 0.04); + --muted-foreground: oklch(0.759 0 0); + --accent: oklch(0.3 0.05 270); + --accent-foreground: oklch(0.95 0 270); + --destructive: oklch(0.62 0.22 29.2); + --destructive-foreground: oklch(1 0 0); + --success: oklch(0.6626 0.1659 148.11); + --success-foreground: oklch(0.7 0.12 165); + --warning: oklch(0.8068 0.1549 94.06); + --warning-foreground: oklch(0.85 0.15 85); + --info: oklch(0.55 0.12 250); + --info-foreground: oklch(0.75 0.15 250); + --ai: oklch(0.55 0.18 295); + --ai-foreground: oklch(0.8 0.15 295); + --border: oklch(1 0.005 270 / 0.06); + --input: oklch(0.27 0.007 270); + --input-border: oklch(0.5 0.01 270 / 0.25); + --ring: oklch(0.5 0.1 270 / 0.8); + --chart-1: oklch(0.385 0.158 266); + --chart-2: oklch(0.437 0.081 221); + --chart-3: oklch(0.43 0.093 158); + --chart-4: oklch(0.473 0.099 119); + --chart-5: oklch(0.4 0.094 52); + --chart-6: oklch(0.45 0.12 25); + --chart-7: oklch(0.5 0.15 340); + --chart-8: oklch(0.42 0.14 295); + --sidebar: oklch(0.22 0 0); + --sidebar-foreground: oklch(0.887 0 0); + --sidebar-primary: oklch(0.476 0.199 270); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.262 0.008 270); + --sidebar-accent-foreground: oklch(0.961 0.002 270); + --sidebar-border: oklch(0.266 0.005 270); + --sidebar-ring: oklch(0.852 0.004 270); + --progress: oklch(1 0 0 / 0.14); + --progress-foreground: var(--primary); + --thinking: var(--primary); + --closedloop-violet: oklch(0.61 0.256 285.5); + --highlight: rgb(0 89 255 / 0.25); + --surface-0: oklch(0.24 0.005 270); + --surface-1: oklch(0.285 0.012 270); + --surface-2: oklch(0.31 0.013 270); + --surface-3: oklch(0.335 0.014 270); + --surface-4: oklch(0.38 0.015 270); + --surface-5: oklch(0.43 0.016 270); + --progress-badge-bg: oklch(0.3 0.04 317.076); + --progress-badge-border: oklch(0.3 0.04 317.076); + --progress-badge-text: oklch(0.74 0.23 319.047); + --shadow-inset: + 0 1px 3px 0 rgb(0 0 0 / 0.35), 0 1px 2px -1px rgb(0 0 0 / 0.35); +} + +@theme inline { + --text-xs: 0.75rem; + --text-sm: 0.8125rem; + --text-base: 0.875rem; + --text-lg: 1rem; + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: "Geist", "Avenir Next", "Segoe UI", system-ui, sans-serif; + --font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-6: var(--chart-6); + --color-chart-7: var(--chart-7); + --color-chart-8: var(--chart-8); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-input-border: var(--input-border); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); + --color-success-foreground: var(--success-foreground); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-success: var(--success); + --color-progress: var(--progress); + --color-progress-foreground: var(--progress-foreground); + --color-thinking: var(--thinking); + --color-closedloop-violet: var(--closedloop-violet); + --color-highlight: var(--highlight); + --color-ai: var(--ai); + --color-ai-foreground: var(--ai-foreground); + --color-surface-0: var(--surface-0); + --color-surface-1: var(--surface-1); + --color-surface-2: var(--surface-2); + --color-surface-3: var(--surface-3); + --color-surface-4: var(--surface-4); + --color-surface-5: var(--surface-5); + --shadow-inset: var(--shadow-inset); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --animate-accordion-down: accordion-down 0.2s ease-out; + --animate-accordion-up: accordion-up 0.2s ease-out; + @keyframes accordion-down { + from { + height: 0; + } + to { + height: var(--radix-accordion-content-height); + } + } + @keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + to { + height: 0; + } + } +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + +@layer base { + ::after, + ::before, + ::backdrop, + ::file-selector-button { + @apply border-border; + } + * { + @apply min-w-0; + } + html { + text-rendering: optimizelegibility; + } + body { + @apply min-h-[100dvh]; + } + input::placeholder, + textarea::placeholder { + @apply text-muted-foreground; + } + button:not(:disabled), + [role="button"]:not(:disabled) { + @apply cursor-pointer; + } +} + +@utility prose { + --tw-prose-body: var(--color-foreground); + --tw-prose-headings: var(--color-foreground); + --tw-prose-lead: var(--color-muted-foreground); + --tw-prose-links: var(--color-primary); + --tw-prose-bold: var(--color-foreground); + --tw-prose-counters: var(--color-foreground); + --tw-prose-bullets: var(--color-muted-foreground); + --tw-prose-hr: var(--color-muted-foreground); + --tw-prose-quotes: var(--color-muted-foreground); + --tw-prose-quote-borders: var(--color-border); + --tw-prose-captions: var(--color-muted-foreground); + --tw-prose-code: var(--color-foreground); + --tw-prose-pre-code: var(--color-foreground); + --tw-prose-pre-bg: var(--color-background); + --tw-prose-th-borders: var(--color-border); + --tw-prose-td-borders: var(--color-border); + --tw-prose-invert-body: var(--color-foreground); + --tw-prose-invert-headings: var(--color-foreground); + --tw-prose-invert-lead: var(--color-muted-foreground); + --tw-prose-invert-links: var(--color-primary); + --tw-prose-invert-bold: var(--color-foreground); + --tw-prose-invert-counters: var(--color-foreground); + --tw-prose-invert-bullets: var(--color-foreground); + --tw-prose-invert-hr: var(--color-muted-foreground); + --tw-prose-invert-quotes: var(--color-muted-foreground); + --tw-prose-invert-quote-borders: var(--color-border); + --tw-prose-invert-captions: var(--color-muted-foreground); + --tw-prose-invert-code: var(--color-foreground); + --tw-prose-invert-pre-code: var(--color-foreground); + --tw-prose-invert-pre-bg: var(--color-background); + --tw-prose-invert-th-borders: var(--color-border); + --tw-prose-invert-td-borders: var(--color-border); +} + +@layer components { + .surface-panel { + @apply bg-surface-1 border-border rounded-xl border; + } +} + +@layer utilities { + .bg-card { background-color: var(--card); } + .bg-card\/95 { background-color: color-mix(in oklab, var(--card) 95%, transparent); } + .text-card-foreground { color: var(--card-foreground); } + .bg-primary { background-color: var(--primary); } + .bg-primary\/10 { background-color: color-mix(in oklab, var(--primary) 10%, transparent); } + .text-primary { color: var(--primary); } + .text-primary-foreground { color: var(--primary-foreground); } + .border-primary\/20 { border-color: color-mix(in oklab, var(--primary) 20%, transparent); } + .bg-secondary { background-color: var(--secondary); } + .text-secondary-foreground { color: var(--secondary-foreground); } + .bg-destructive { background-color: var(--destructive); } + .text-destructive-foreground { color: var(--destructive-foreground); } + .bg-destructive\/60 { background-color: color-mix(in oklab, var(--destructive) 60%, transparent); } + .text-muted-foreground { color: var(--muted-foreground); } + .bg-muted { background-color: var(--muted); } + .bg-muted\/70 { background-color: color-mix(in oklab, var(--muted) 70%, transparent); } + .bg-accent { background-color: var(--accent); } + .text-accent-foreground { color: var(--accent-foreground); } + .bg-success\/12 { background-color: color-mix(in oklab, var(--success) 12%, transparent); } + .text-success { color: var(--success); } + .border-success\/25 { border-color: color-mix(in oklab, var(--success) 25%, transparent); } + .bg-warning\/14 { background-color: color-mix(in oklab, var(--warning) 14%, transparent); } + .text-warning-foreground { color: var(--warning-foreground); } + .border-warning\/30 { border-color: color-mix(in oklab, var(--warning) 30%, transparent); } + .bg-info\/12 { background-color: color-mix(in oklab, var(--info) 12%, transparent); } + .text-info { color: var(--info); } + .border-info\/25 { border-color: color-mix(in oklab, var(--info) 25%, transparent); } + .border-border { border-color: var(--border); } + .border-border\/80 { border-color: color-mix(in oklab, var(--border) 80%, transparent); } + .border-transparent { border-color: transparent; } +} diff --git a/apps/desktop/src/renderer/hooks/useQueryCache.ts b/apps/desktop/src/renderer/hooks/useQueryCache.ts new file mode 100644 index 00000000..9052cb4c --- /dev/null +++ b/apps/desktop/src/renderer/hooks/useQueryCache.ts @@ -0,0 +1,79 @@ +import { useEffect, useRef, useState } from "react"; + +interface CacheEntry { + data: T; + fetchedAt: number; +} + +const cache = new Map>(); + +/** + * Simple in-memory query cache with TTL. Multiple components using the same + * key share a single cached result and avoid redundant IPC round-trips. + * + * @param key Stable cache key (e.g. "db:analytics") + * @param fetcher Async function that returns the data + * @param ttlMs How long the cached value is considered fresh (default 3 000 ms) + * @param pollMs Re-fetch interval; skipped while the cached value is fresh (default 5 000 ms) + */ +export function useQueryCache( + key: string, + fetcher: () => Promise, + ttlMs = 3_000, + pollMs = 5_000, +): { data: T | null; loading: boolean; error: boolean } { + const [data, setData] = useState(() => { + const cached = cache.get(key) as CacheEntry | undefined; + return cached ? cached.data : null; + }); + const [loading, setLoading] = useState(data === null); + const [error, setError] = useState(false); + const fetcherRef = useRef(fetcher); + fetcherRef.current = fetcher; + + useEffect(() => { + let mounted = true; + + const load = () => { + const existing = cache.get(key) as CacheEntry | undefined; + if (existing && Date.now() - existing.fetchedAt < ttlMs) { + if (mounted) { + setData(existing.data); + setLoading(false); + } + return; + } + + fetcherRef.current() + .then((result) => { + cache.set(key, { data: result, fetchedAt: Date.now() }); + if (mounted) { + setData(result); + setLoading(false); + setError(false); + } + }) + .catch(() => { + if (mounted) setError(true); + }); + }; + + load(); + const interval = setInterval(load, pollMs); + return () => { mounted = false; clearInterval(interval); }; + }, [key, ttlMs, pollMs]); + + return { data, loading, error }; +} + +/** Invalidate a specific cache key (e.g. after a mutation). */ +export function invalidateCache(key: string): void { + cache.delete(key); +} + +/** Invalidate all cache keys matching a prefix. */ +export function invalidateCachePrefix(prefix: string): void { + for (const k of cache.keys()) { + if (k.startsWith(prefix)) cache.delete(k); + } +} diff --git a/apps/desktop/src/renderer/main.tsx b/apps/desktop/src/renderer/main.tsx index 70afd374..f3ad1031 100644 --- a/apps/desktop/src/renderer/main.tsx +++ b/apps/desktop/src/renderer/main.tsx @@ -18,7 +18,7 @@ if (!rootElement) { createRoot(rootElement).render( - + , diff --git a/apps/desktop/src/renderer/types/desktop-api.d.ts b/apps/desktop/src/renderer/types/desktop-api.d.ts index 300e2ee3..85cf14b1 100644 --- a/apps/desktop/src/renderer/types/desktop-api.d.ts +++ b/apps/desktop/src/renderer/types/desktop-api.d.ts @@ -97,6 +97,8 @@ export interface DesktopApi { getEventCountByType: () => Promise; getTokenAnalytics: () => Promise; getAgentHierarchy: (sessionId: string) => Promise; + getAnalytics: () => Promise; + getWorkflowData: () => Promise; }; } diff --git a/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs b/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs new file mode 100644 index 00000000..3e98d89f --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs @@ -0,0 +1,51 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/badge.tsx +import * as React from "react"; +import { Slot as SlotPrimitive } from "radix-ui"; +import { cva } from "class-variance-authority"; +var badgeVariants = cva( + "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + success: "border-success/25 bg-success/12 text-success [a&]:hover:bg-success/18", + warning: "border-warning/30 bg-warning/14 text-warning-foreground [a&]:hover:bg-warning/20", + info: "border-info/25 bg-info/12 text-info [a&]:hover:bg-info/18", + accent: "border-primary/20 bg-primary/10 text-primary [a&]:hover:bg-primary/16", + muted: "border-border bg-muted/70 text-muted-foreground [a&]:hover:bg-muted", + outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground" + } + }, + defaultVariants: { + variant: "default" + } + } +); +function Badge({ + className, + variant, + asChild = false, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "span"; + return /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "badge", + className: cn(badgeVariants({ variant }), className), + ...props + } + ); +} + +export { + badgeVariants, + Badge +}; +//# sourceMappingURL=chunk-3I7NW6GS.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs.map new file mode 100644 index 00000000..32fae47a --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-3I7NW6GS.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Slot as SlotPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n success:\n \"border-success/25 bg-success/12 text-success [a&]:hover:bg-success/18\",\n warning:\n \"border-warning/30 bg-warning/14 text-warning-foreground [a&]:hover:bg-warning/20\",\n info: \"border-info/25 bg-info/12 text-info [a&]:hover:bg-info/18\",\n accent:\n \"border-primary/20 bg-primary/10 text-primary [a&]:hover:bg-primary/16\",\n muted:\n \"border-border bg-muted/70 text-muted-foreground [a&]:hover:bg-muted\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps & { asChild?: boolean }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"span\"\n\n return (\n \n )\n}\n\ntype BadgeProps = React.ComponentProps<\"span\"> &\n VariantProps & { asChild?: boolean };\n\nexport { Badge, badgeVariants }\nexport type { BadgeProps }\n"],"mappings":";;;;;AAAA,YAAY,WAAW;AACvB,SAAS,QAAQ,qBAAqB;AACtC,SAAS,WAA8B;AAIvC,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,SACE;AAAA,QACF,MAAM;AAAA,QACN,QACE;AAAA,QACF,OACE;AAAA,QACF,SACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAC8D;AAC5D,QAAM,OAAO,UAAU,cAAc,OAAO;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs b/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs new file mode 100644 index 00000000..7a2cc602 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs @@ -0,0 +1,57 @@ +import React from "react"; +// components/ui/primitives/sparkline.tsx +import { useMemo } from "react"; +function Sparkline({ + values, + width = 80, + height = 20, + className, + stroke = "currentColor" +}) { + const points = useMemo(() => { + const clean = values.map( + (value) => typeof value === "number" && Number.isFinite(value) ? value : null + ).filter((value) => value !== null); + if (clean.length < 2) { + return null; + } + const min = Math.min(...clean); + const max = Math.max(...clean); + const range = max - min || 1; + const step = width / (clean.length - 1); + return clean.map((value, index) => { + const x = index * step; + const y = height - (value - min) / range * height; + return `${x.toFixed(1)},${y.toFixed(1)}`; + }).join(" "); + }, [height, values, width]); + if (!points) { + return null; + } + return /* @__PURE__ */ React.createElement( + "svg", + { + "aria-hidden": "true", + className, + height, + viewBox: `0 0 ${width} ${height}`, + width + }, + /* @__PURE__ */ React.createElement( + "polyline", + { + fill: "none", + points, + stroke, + strokeLinecap: "round", + strokeLinejoin: "round", + strokeWidth: "1.5" + } + ) + ); +} + +export { + Sparkline +}; +//# sourceMappingURL=chunk-3VJLNCQH.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs.map new file mode 100644 index 00000000..f72b8d2e --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-3VJLNCQH.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/sparkline.tsx"],"sourcesContent":["import { useMemo } from \"react\";\n\ntype SparklineProps = {\n values: Array;\n width?: number;\n height?: number;\n className?: string;\n stroke?: string;\n};\n\nexport function Sparkline({\n values,\n width = 80,\n height = 20,\n className,\n stroke = \"currentColor\",\n}: SparklineProps) {\n const points = useMemo(() => {\n const clean = values\n .map((value) =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )\n .filter((value): value is number => value !== null);\n if (clean.length < 2) {\n return null;\n }\n const min = Math.min(...clean);\n const max = Math.max(...clean);\n const range = max - min || 1;\n const step = width / (clean.length - 1);\n return clean\n .map((value, index) => {\n const x = index * step;\n const y = height - ((value - min) / range) * height;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [height, values, width]);\n\n if (!points) {\n return null;\n }\n\n return (\n \n \n \n );\n}\n"],"mappings":";AAAA,SAAS,eAAe;AAUjB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA,SAAS;AACX,GAAmB;AACjB,QAAM,SAAS,QAAQ,MAAM;AAC3B,UAAM,QAAQ,OACX;AAAA,MAAI,CAAC,UACJ,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,IAChE,EACC,OAAO,CAAC,UAA2B,UAAU,IAAI;AACpD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAC7B,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAC7B,UAAM,QAAQ,MAAM,OAAO;AAC3B,UAAM,OAAO,SAAS,MAAM,SAAS;AACrC,WAAO,MACJ,IAAI,CAAC,OAAO,UAAU;AACrB,YAAM,IAAI,QAAQ;AAClB,YAAM,IAAI,UAAW,QAAQ,OAAO,QAAS;AAC7C,aAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,IACxC,CAAC,EACA,KAAK,GAAG;AAAA,EACb,GAAG,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAE1B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS,OAAO,KAAK,IAAI,MAAM;AAAA,MAC/B;AAAA;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAY;AAAA;AAAA,IACd;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs b/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs new file mode 100644 index 00000000..f0e3ae07 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs @@ -0,0 +1,20 @@ +// hooks/use-media-query.ts +import { useCallback, useSyncExternalStore } from "react"; +function useMediaQuery(query) { + const subscribe = useCallback( + (callback) => { + const media = globalThis.matchMedia(query); + media.addEventListener("change", callback); + return () => media.removeEventListener("change", callback); + }, + [query] + ); + const getSnapshot = () => globalThis.matchMedia(query).matches; + const getServerSnapshot = () => false; + return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); +} + +export { + useMediaQuery +}; +//# sourceMappingURL=chunk-4BFOJQ5H.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs.map new file mode 100644 index 00000000..42e8c49f --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-4BFOJQ5H.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../hooks/use-media-query.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useSyncExternalStore } from \"react\";\n\n/**\n * Subscribes to a CSS media query and re-renders when its match state changes.\n * Server snapshot is `false` to avoid hydration mismatches.\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (callback: () => void) => {\n const media = globalThis.matchMedia(query);\n media.addEventListener(\"change\", callback);\n return () => media.removeEventListener(\"change\", callback);\n },\n [query]\n );\n\n const getSnapshot = () => globalThis.matchMedia(query).matches;\n const getServerSnapshot = () => false;\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":";AAEA,SAAS,aAAa,4BAA4B;AAM3C,SAAS,cAAc,OAAwB;AACpD,QAAM,YAAY;AAAA,IAChB,CAAC,aAAyB;AACxB,YAAM,QAAQ,WAAW,WAAW,KAAK;AACzC,YAAM,iBAAiB,UAAU,QAAQ;AACzC,aAAO,MAAM,MAAM,oBAAoB,UAAU,QAAQ;AAAA,IAC3D;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,cAAc,MAAM,WAAW,WAAW,KAAK,EAAE;AACvD,QAAM,oBAAoB,MAAM;AAEhC,SAAO,qBAAqB,WAAW,aAAa,iBAAiB;AACvE;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs b/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs new file mode 100644 index 00000000..7bded3fb --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs @@ -0,0 +1,66 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/scroll-area.tsx +import * as React from "react"; +import { ScrollArea as ScrollAreaPrimitive } from "radix-ui"; +function ScrollArea({ + className, + children, + scrollbars = "vertical", + ...props +}) { + return /* @__PURE__ */ React.createElement( + ScrollAreaPrimitive.Root, + { + "data-slot": "scroll-area", + className: cn("relative", className), + ...props + }, + /* @__PURE__ */ React.createElement( + ScrollAreaPrimitive.Viewport, + { + "data-slot": "scroll-area-viewport", + className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1" + }, + children + ), + (scrollbars === "vertical" || scrollbars === "both") && /* @__PURE__ */ React.createElement(ScrollBar, { orientation: "vertical" }), + (scrollbars === "horizontal" || scrollbars === "both") && /* @__PURE__ */ React.createElement(ScrollBar, { orientation: "horizontal" }), + scrollbars === "both" && /* @__PURE__ */ React.createElement(ScrollAreaPrimitive.Corner, null) + ); +} +function ScrollBar({ + className, + orientation = "vertical", + ...props +}) { + return /* @__PURE__ */ React.createElement( + ScrollAreaPrimitive.ScrollAreaScrollbar, + { + "data-slot": "scroll-area-scrollbar", + orientation, + className: cn( + "flex touch-none p-px transition-colors select-none", + orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", + orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", + className + ), + ...props + }, + /* @__PURE__ */ React.createElement( + ScrollAreaPrimitive.ScrollAreaThumb, + { + "data-slot": "scroll-area-thumb", + className: "bg-border relative flex-1 rounded-full" + } + ) + ); +} + +export { + ScrollArea, + ScrollBar +}; +//# sourceMappingURL=chunk-4VG3CUB2.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs.map new file mode 100644 index 00000000..1b2301fc --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-4VG3CUB2.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/scroll-area.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n scrollbars = \"vertical\",\n ...props\n}: React.ComponentProps & {\n scrollbars?: \"vertical\" | \"horizontal\" | \"both\"\n}) {\n return (\n \n \n {children}\n \n {(scrollbars === \"vertical\" || scrollbars === \"both\") && (\n \n )}\n {(scrollbars === \"horizontal\" || scrollbars === \"both\") && (\n \n )}\n {scrollbars === \"both\" && }\n \n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport { ScrollArea, ScrollBar }\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,cAAc,2BAA2B;AAIlD,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,GAAG;AACL,GAEG;AACD,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA;AAAA,IAEJ;AAAA,MAAC,oBAAoB;AAAA,MAApB;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,MAET;AAAA,IACH;AAAA,KACE,eAAe,cAAc,eAAe,WAC5C,oCAAC,aAAU,aAAY,YAAW;AAAA,KAElC,eAAe,gBAAgB,eAAe,WAC9C,oCAAC,aAAU,aAAY,cAAa;AAAA,IAErC,eAAe,UAAU,oCAAC,oBAAoB,QAApB,IAA2B;AAAA,EACxD;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,GAAyE;AACvE,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,cACd;AAAA,QACF,gBAAgB,gBACd;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ;AAAA,MAAC,oBAAoB;AAAA,MAApB;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,IACZ;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs b/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs new file mode 100644 index 00000000..d5d394b0 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs @@ -0,0 +1,26 @@ +// lib/utils.ts +import { clsx } from "clsx"; +import { toast } from "sonner"; +import { twMerge } from "tailwind-merge"; +var cn = (...inputs) => twMerge(clsx(inputs)); +var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1); +var parseError = (error) => { + if (error instanceof Error) { + return error.message; + } + if (error && typeof error === "object" && "message" in error) { + return String(error.message); + } + return String(error); +}; +var handleError = (error) => { + const message = parseError(error); + toast.error(message); +}; + +export { + cn, + capitalize, + handleError +}; +//# sourceMappingURL=chunk-522NBUZJ.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs.map new file mode 100644 index 00000000..cc70be22 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-522NBUZJ.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../lib/utils.ts"],"sourcesContent":["import { clsx } from 'clsx';\nimport type { ClassValue } from 'clsx';\nimport { toast } from 'sonner';\nimport { twMerge } from 'tailwind-merge';\n\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs));\n\nexport const capitalize = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\n// mirrors packages/observability/error.ts - cannot import @repo/observability in a publishable package\nconst parseError = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return String(error);\n};\n\nexport const handleError = (error: unknown): void => {\n const message = parseError(error);\n\n toast.error(message);\n};\n"],"mappings":";AAAA,SAAS,YAAY;AAErB,SAAS,aAAa;AACtB,SAAS,eAAe;AAEjB,IAAM,KAAK,IAAI,WAAiC,QAAQ,KAAK,MAAM,CAAC;AAEpE,IAAM,aAAa,CAAC,QACzB,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAG3C,IAAM,aAAa,CAAC,UAA2B;AAC7C,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC5D,WAAO,OAAO,MAAM,OAAO;AAAA,EAC7B;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,cAAc,CAAC,UAAyB;AACnD,QAAM,UAAU,WAAW,KAAK;AAEhC,QAAM,MAAM,OAAO;AACrB;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs b/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs new file mode 100644 index 00000000..2454d263 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs @@ -0,0 +1,50 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/popover.tsx +import * as React from "react"; +import { Popover as PopoverPrimitive } from "radix-ui"; +function Popover({ + ...props +}) { + return /* @__PURE__ */ React.createElement(PopoverPrimitive.Root, { "data-slot": "popover", ...props }); +} +function PopoverTrigger({ + ...props +}) { + return /* @__PURE__ */ React.createElement(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props }); +} +function PopoverContent({ + className, + align = "center", + sideOffset = 4, + ...props +}) { + return /* @__PURE__ */ React.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React.createElement( + PopoverPrimitive.Content, + { + "data-slot": "popover-content", + align, + sideOffset, + className: cn( + "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden", + className + ), + ...props + } + )); +} +function PopoverAnchor({ + ...props +}) { + return /* @__PURE__ */ React.createElement(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props }); +} + +export { + Popover, + PopoverTrigger, + PopoverContent, + PopoverAnchor +}; +//# sourceMappingURL=chunk-547UMAL4.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs.map new file mode 100644 index 00000000..266e9ed1 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-547UMAL4.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,WAAW,wBAAwB;AAI5C,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SAAO,oCAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oCAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,GAAG;AACL,GAA0D;AACxD,SACE,oCAAC,iBAAiB,QAAjB,MACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,CACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB,GAAG;AACL,GAAyD;AACvD,SAAO,oCAAC,iBAAiB,QAAjB,EAAwB,aAAU,kBAAkB,GAAG,OAAO;AACxE;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs b/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs new file mode 100644 index 00000000..4798a8ba --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs @@ -0,0 +1,114 @@ +import React from "react"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/empty.tsx +import { cva } from "class-variance-authority"; +function Empty({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty", + className: cn( + "flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12", + className + ), + ...props + } + ); +} +function EmptyHeader({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty-header", + className: cn( + "flex max-w-sm flex-col items-center gap-2 text-center", + className + ), + ...props + } + ); +} +var emptyMediaVariants = cva( + "flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-transparent", + icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6" + } + }, + defaultVariants: { + variant: "default" + } + } +); +function EmptyMedia({ + className, + variant = "default", + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty-icon", + "data-variant": variant, + className: cn(emptyMediaVariants({ variant, className })), + ...props + } + ); +} +function EmptyTitle({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty-title", + className: cn("text-lg font-medium tracking-tight", className), + ...props + } + ); +} +function EmptyDescription({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty-description", + className: cn( + "text-muted-foreground [&>a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4", + className + ), + ...props + } + ); +} +function EmptyContent({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "empty-content", + className: cn( + "flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance", + className + ), + ...props + } + ); +} + +// components/ui/empty-state.tsx +function EmptyState({ + icon: Icon, + title, + description, + className, + action +}) { + return /* @__PURE__ */ React.createElement(Empty, { className: cn("py-12", className) }, /* @__PURE__ */ React.createElement(EmptyHeader, null, /* @__PURE__ */ React.createElement(EmptyMedia, { variant: "icon" }, /* @__PURE__ */ React.createElement(Icon, { className: "size-6" })), /* @__PURE__ */ React.createElement(EmptyTitle, null, title), description ? /* @__PURE__ */ React.createElement(EmptyDescription, null, description) : null), action ? /* @__PURE__ */ React.createElement(EmptyContent, null, action) : null); +} + +export { + EmptyState +}; +//# sourceMappingURL=chunk-5O7DGJTJ.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs.map new file mode 100644 index 00000000..e89b95f9 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5O7DGJTJ.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/empty.tsx","../components/ui/empty-state.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nconst emptyMediaVariants = cva(\n \"flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps) {\n return (\n \n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@repo/design-system/components/ui/empty\";\nimport { cn } from \"@repo/design-system/lib/utils\";\n\ntype EmptyStateProps = {\n icon: LucideIcon;\n title: string;\n description?: string;\n className?: string;\n action?: ReactNode;\n};\n\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n className,\n action,\n}: Readonly) {\n return (\n \n \n \n \n \n {title}\n {description ? {description} : null}\n \n {action ? {action} : null}\n \n );\n}\n"],"mappings":";;;;;AAAA,SAAS,WAA8B;AAIvC,SAAS,MAAM,EAAE,WAAW,GAAG,MAAM,GAAgC;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAA0E;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,mBAAmB,EAAE,SAAS,UAAU,CAAC,CAAC;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAA8B;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC1EO,SAAS,WAAW;AAAA,EACzB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE,oCAAC,SAAM,WAAW,GAAG,SAAS,SAAS,KACrC,oCAAC,mBACC,oCAAC,cAAW,SAAQ,UAClB,oCAAC,QAAK,WAAU,UAAS,CAC3B,GACA,oCAAC,kBAAY,KAAM,GAClB,cAAc,oCAAC,wBAAkB,WAAY,IAAsB,IACtE,GACC,SAAS,oCAAC,oBAAc,MAAO,IAAkB,IACpD;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs b/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs new file mode 100644 index 00000000..48174858 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs @@ -0,0 +1,51 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/radio-group.tsx +import * as React from "react"; +import { RadioGroup as RadioGroupPrimitive } from "radix-ui"; +import { CircleIcon } from "lucide-react"; +function RadioGroup({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + RadioGroupPrimitive.Root, + { + "data-slot": "radio-group", + className: cn("grid gap-3", className), + ...props + } + ); +} +function RadioGroupItem({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + RadioGroupPrimitive.Item, + { + "data-slot": "radio-group-item", + className: cn( + "border-input-border text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-input dark:bg-input aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", + className + ), + ...props + }, + /* @__PURE__ */ React.createElement( + RadioGroupPrimitive.Indicator, + { + "data-slot": "radio-group-indicator", + className: "relative flex items-center justify-center" + }, + /* @__PURE__ */ React.createElement(CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" }) + ) + ); +} + +export { + RadioGroup, + RadioGroupItem +}; +//# sourceMappingURL=chunk-5TBN72QF.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs.map new file mode 100644 index 00000000..b1a9f107 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5TBN72QF.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/radio-group.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\nimport { CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,cAAc,2BAA2B;AAClD,SAAS,kBAAkB;AAI3B,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,SAAS;AAAA,MACpC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ;AAAA,MAAC,oBAAoB;AAAA,MAApB;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,MAEV,oCAAC,cAAW,WAAU,mFAAkF;AAAA,IAC1G;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs b/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs new file mode 100644 index 00000000..7cac5b2f --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs @@ -0,0 +1,44 @@ +import React from "react"; +// components/ui/primitives/key-value-grid.tsx +function renderValue(value) { + if (value === null) { + return /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground italic" }, "null"); + } + if (typeof value === "boolean") { + return /* @__PURE__ */ React.createElement("span", { className: "rounded border border-border bg-muted px-2 py-0.5 font-mono text-[11px]" }, value ? "true" : "false"); + } + if (typeof value === "number") { + return /* @__PURE__ */ React.createElement("span", { className: "font-mono" }, value.toLocaleString()); + } + if (typeof value === "string") { + return /* @__PURE__ */ React.createElement("span", { className: "break-all font-mono text-foreground" }, value); + } + return /* @__PURE__ */ React.createElement("pre", { className: "overflow-x-auto whitespace-pre-wrap break-words font-mono text-[11px] text-foreground" }, JSON.stringify(value, null, 2)); +} +function KeyValueGrid({ + data, + priority = [] +}) { + const priorityEntries = priority.map((key) => [key, data[key]]).filter((entry) => entry[1] !== void 0); + const restEntries = Object.entries(data).filter( + ([key]) => !priority.includes(key) + ); + const rows = [...priorityEntries, ...restEntries]; + if (rows.length === 0) { + return /* @__PURE__ */ React.createElement("p", { className: "text-[11px] text-muted-foreground italic" }, "Empty"); + } + return /* @__PURE__ */ React.createElement("div", { className: "overflow-hidden rounded-xl border border-border/70 bg-card/70" }, /* @__PURE__ */ React.createElement("table", { className: "w-full border-collapse text-[11px]" }, /* @__PURE__ */ React.createElement("tbody", null, rows.map(([key, value], index) => /* @__PURE__ */ React.createElement( + "tr", + { + className: index > 0 ? "border-border/70 border-t" : void 0, + key + }, + /* @__PURE__ */ React.createElement("td", { className: "w-[28%] bg-muted/45 px-3 py-2 align-top font-mono text-muted-foreground" }, key), + /* @__PURE__ */ React.createElement("td", { className: "px-3 py-2 align-top" }, renderValue(value)) + ))))); +} + +export { + KeyValueGrid +}; +//# sourceMappingURL=chunk-5U35WVIE.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs.map new file mode 100644 index 00000000..f89f403e --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-5U35WVIE.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/key-value-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport type { JsonValue } from \"../types\";\n\ntype KeyValueGridProps = {\n data: Record;\n priority?: string[];\n};\n\nfunction renderValue(value: JsonValue) {\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"boolean\") {\n return (\n \n {value ? \"true\" : \"false\"}\n \n );\n }\n\n if (typeof value === \"number\") {\n return {value.toLocaleString()};\n }\n\n if (typeof value === \"string\") {\n return {value};\n }\n\n return (\n
\n      {JSON.stringify(value, null, 2)}\n    
\n );\n}\n\nexport function KeyValueGrid({\n data,\n priority = [],\n}: KeyValueGridProps) {\n const priorityEntries = priority\n .map((key) => [key, data[key]] as const)\n .filter((entry) => entry[1] !== undefined);\n const restEntries = Object.entries(data).filter(\n ([key]) => !priority.includes(key)\n );\n const rows = [...priorityEntries, ...restEntries];\n\n if (rows.length === 0) {\n return

Empty

;\n }\n\n return (\n
\n \n \n {rows.map(([key, value], index) => (\n 0 ? \"border-border/70 border-t\" : undefined}\n key={key}\n >\n \n \n \n ))}\n \n
\n {key}\n {renderValue(value)}
\n
\n );\n}\n"],"mappings":";AASA,SAAS,YAAY,OAAkB;AACrC,MAAI,UAAU,MAAM;AAClB,WAAO,oCAAC,UAAK,WAAU,kCAA+B,MAAI;AAAA,EAC5D;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WACE,oCAAC,UAAK,WAAU,6EACb,QAAQ,SAAS,OACpB;AAAA,EAEJ;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,oCAAC,UAAK,WAAU,eAAa,MAAM,eAAe,CAAE;AAAA,EAC7D;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,oCAAC,UAAK,WAAU,yCAAuC,KAAM;AAAA,EACtE;AAEA,SACE,oCAAC,SAAI,WAAU,2FACZ,KAAK,UAAU,OAAO,MAAM,CAAC,CAChC;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,WAAW,CAAC;AACd,GAAsB;AACpB,QAAM,kBAAkB,SACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC,CAAU,EACtC,OAAO,CAAC,UAAU,MAAM,CAAC,MAAM,MAAS;AAC3C,QAAM,cAAc,OAAO,QAAQ,IAAI,EAAE;AAAA,IACvC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,SAAS,GAAG;AAAA,EACnC;AACA,QAAM,OAAO,CAAC,GAAG,iBAAiB,GAAG,WAAW;AAEhD,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,oCAAC,OAAE,WAAU,8CAA2C,OAAK;AAAA,EACtE;AAEA,SACE,oCAAC,SAAI,WAAU,mEACb,oCAAC,WAAM,WAAU,wCACf,oCAAC,eACE,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,UACvB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,QAAQ,IAAI,8BAA8B;AAAA,MACrD;AAAA;AAAA,IAEA,oCAAC,QAAG,WAAU,6EACX,GACH;AAAA,IACA,oCAAC,QAAG,WAAU,yBAAuB,YAAY,KAAK,CAAE;AAAA,EAC1D,CACD,CACH,CACF,CACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs b/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs new file mode 100644 index 00000000..1c50044e --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs @@ -0,0 +1,24 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/textarea.tsx +import * as React from "react"; +function Textarea({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "textarea", + { + "data-slot": "textarea", + className: cn( + "border-input-border placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-input dark:bg-input flex field-sizing-content min-h-16 w-full rounded-md border px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", + className + ), + ...props + } + ); +} + +export { + Textarea +}; +//# sourceMappingURL=chunk-64QT2WSE.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs.map new file mode 100644 index 00000000..78c49b9e --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-64QT2WSE.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n \n )\n}\n\nexport { Textarea }\n"],"mappings":";;;;;AAAA,YAAY,WAAW;AAIvB,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAqC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs b/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs new file mode 100644 index 00000000..3dc88523 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs @@ -0,0 +1,136 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/dialog.tsx +import * as React from "react"; +import { Dialog as DialogPrimitive } from "radix-ui"; +import { XIcon } from "lucide-react"; +function Dialog({ + ...props +}) { + return /* @__PURE__ */ React.createElement(DialogPrimitive.Root, { "data-slot": "dialog", ...props }); +} +function DialogTrigger({ + ...props +}) { + return /* @__PURE__ */ React.createElement(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props }); +} +function DialogPortal({ + ...props +}) { + return /* @__PURE__ */ React.createElement(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props }); +} +function DialogClose({ + ...props +}) { + return /* @__PURE__ */ React.createElement(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props }); +} +function DialogOverlay({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + DialogPrimitive.Overlay, + { + "data-slot": "dialog-overlay", + className: cn( + "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", + className + ), + ...props + } + ); +} +function DialogContent({ + className, + children, + showCloseButton = true, + showOverlay = true, + ...props +}) { + return /* @__PURE__ */ React.createElement(DialogPortal, { "data-slot": "dialog-portal" }, showOverlay && /* @__PURE__ */ React.createElement(DialogOverlay, null), /* @__PURE__ */ React.createElement( + DialogPrimitive.Content, + { + "data-slot": "dialog-content", + className: cn( + "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg", + className + ), + ...props + }, + children, + showCloseButton && /* @__PURE__ */ React.createElement( + DialogPrimitive.Close, + { + "data-slot": "dialog-close", + className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4" + }, + /* @__PURE__ */ React.createElement(XIcon, null), + /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close") + ) + )); +} +function DialogHeader({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "dialog-header", + className: cn("flex flex-col gap-2 text-center sm:text-left", className), + ...props + } + ); +} +function DialogFooter({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "dialog-footer", + className: cn( + "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", + className + ), + ...props + } + ); +} +function DialogTitle({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + DialogPrimitive.Title, + { + "data-slot": "dialog-title", + className: cn("text-lg leading-none font-semibold", className), + ...props + } + ); +} +function DialogDescription({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + DialogPrimitive.Description, + { + "data-slot": "dialog-description", + className: cn("text-muted-foreground text-sm", className), + ...props + } + ); +} + +export { + Dialog, + DialogTrigger, + DialogPortal, + DialogClose, + DialogOverlay, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription +}; +//# sourceMappingURL=chunk-6LPHEING.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs.map new file mode 100644 index 00000000..09f2de9d --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6LPHEING.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/dialog.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n showOverlay = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n showOverlay?: boolean\n}) {\n return (\n \n {showOverlay && }\n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,UAAU,uBAAuB;AAC1C,SAAS,aAAa;AAItB,SAAS,OAAO;AAAA,EACd,GAAG;AACL,GAAsD;AACpD,SAAO,oCAAC,gBAAgB,MAAhB,EAAqB,aAAU,UAAU,GAAG,OAAO;AAC7D;AAEA,SAAS,cAAc;AAAA,EACrB,GAAG;AACL,GAAyD;AACvD,SAAO,oCAAC,gBAAgB,SAAhB,EAAwB,aAAU,kBAAkB,GAAG,OAAO;AACxE;AAEA,SAAS,aAAa;AAAA,EACpB,GAAG;AACL,GAAwD;AACtD,SAAO,oCAAC,gBAAgB,QAAhB,EAAuB,aAAU,iBAAiB,GAAG,OAAO;AACtE;AAEA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,oCAAC,gBAAgB,OAAhB,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,GAAG;AACL,GAAyD;AACvD,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,GAAG;AACL,GAGG;AACD,SACE,oCAAC,gBAAa,aAAU,mBACrB,eAAe,oCAAC,mBAAc,GAC/B;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,IACA,mBACC;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,MAEV,oCAAC,WAAM;AAAA,MACP,oCAAC,UAAK,WAAU,aAAU,OAAK;AAAA,IACjC;AAAA,EAEJ,CACF;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,gDAAgD,SAAS;AAAA,MACtE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs b/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs new file mode 100644 index 00000000..2c570815 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs @@ -0,0 +1,75 @@ +import { + toggleVariants +} from "./chunk-XS6N43AI.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/toggle-group.tsx +import * as React from "react"; +import { ToggleGroup as ToggleGroupPrimitive } from "radix-ui"; +var ToggleGroupContext = React.createContext({ + size: "default", + variant: "default", + spacing: 0 +}); +function ToggleGroup({ + className, + variant, + size, + spacing = 0, + children, + ...props +}) { + return /* @__PURE__ */ React.createElement( + ToggleGroupPrimitive.Root, + { + "data-slot": "toggle-group", + "data-variant": variant, + "data-size": size, + "data-spacing": spacing, + style: { "--gap": spacing }, + className: cn( + "group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs", + className + ), + ...props + }, + /* @__PURE__ */ React.createElement(ToggleGroupContext.Provider, { value: { variant, size, spacing } }, children) + ); +} +function ToggleGroupItem({ + className, + children, + variant, + size, + ...props +}) { + const context = React.useContext(ToggleGroupContext); + return /* @__PURE__ */ React.createElement( + ToggleGroupPrimitive.Item, + { + "data-slot": "toggle-group-item", + "data-variant": context.variant || variant, + "data-size": context.size || size, + "data-spacing": context.spacing, + className: cn( + toggleVariants({ + variant: context.variant || variant, + size: context.size || size + }), + "w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10", + "data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l", + className + ), + ...props + }, + children + ); +} + +export { + ToggleGroup, + ToggleGroupItem +}; +//# sourceMappingURL=chunk-6NQCPXX4.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs.map new file mode 100644 index 00000000..7a5f0a12 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6NQCPXX4.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/toggle-group.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\nimport { toggleVariants } from \"@repo/design-system/components/ui/toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps & {\n spacing?: number\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n children,\n ...props\n}: React.ComponentProps &\n VariantProps & {\n spacing?: number\n }) {\n return (\n \n \n {children}\n \n \n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps &\n VariantProps) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n \n {children}\n \n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"mappings":";;;;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,eAAe,4BAA4B;AAMpD,IAAM,qBAA2B,oBAI/B;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AAED,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAGK;AACH,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,gBAAc;AAAA,MACd,OAAO,EAAE,SAAS,QAAQ;AAAA,MAC1B,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,oCAAC,mBAAmB,UAAnB,EAA4B,OAAO,EAAE,SAAS,MAAM,QAAQ,KAC1D,QACH;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACuC;AACrC,QAAM,UAAgB,iBAAW,kBAAkB;AAEnD,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,gBAAc,QAAQ,WAAW;AAAA,MACjC,aAAW,QAAQ,QAAQ;AAAA,MAC3B,gBAAc,QAAQ;AAAA,MACtB,WAAW;AAAA,QACT,eAAe;AAAA,UACb,SAAS,QAAQ,WAAW;AAAA,UAC5B,MAAM,QAAQ,QAAQ;AAAA,QACxB,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,EACH;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs b/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs new file mode 100644 index 00000000..7482176e --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs @@ -0,0 +1,22 @@ +import React from "react"; +// components/ui/primitives/match-list.tsx +import { Search } from "lucide-react"; +function MatchList({ matches }) { + if (matches.length === 0) { + return /* @__PURE__ */ React.createElement("p", { className: "text-[11px] text-muted-foreground italic" }, "No matches"); + } + return /* @__PURE__ */ React.createElement("div", { className: "overflow-hidden rounded-xl border border-border/70 bg-card/80 shadow-sm" }, /* @__PURE__ */ React.createElement("div", { className: "border-border/60 border-b bg-muted/35 px-3 py-1.5 font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground" }, "Matches"), /* @__PURE__ */ React.createElement("div", { className: "max-h-80 overflow-auto p-2" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-1.5" }, matches.map((match, index) => /* @__PURE__ */ React.createElement( + "div", + { + className: "rounded-lg border border-border/60 bg-background/60 px-3 py-2", + key: `${match.file ?? "match"}-${match.line ?? index}-${index}` + }, + /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 text-[11px]" }, /* @__PURE__ */ React.createElement(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }), match.file ? /* @__PURE__ */ React.createElement("span", { className: "break-all font-mono text-foreground" }, match.file) : null, typeof match.line === "number" ? /* @__PURE__ */ React.createElement("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-muted-foreground" }, match.line) : null), + match.text ? /* @__PURE__ */ React.createElement("pre", { className: "mt-2 whitespace-pre-wrap break-words font-mono text-[11px] text-muted-foreground" }, match.text) : null + ))))); +} + +export { + MatchList +}; +//# sourceMappingURL=chunk-6VXOUNUH.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs.map new file mode 100644 index 00000000..cb68f323 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-6VXOUNUH.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/match-list.tsx"],"sourcesContent":["import { Search } from \"lucide-react\";\n\nexport type GrepMatch = {\n file?: string;\n line?: number;\n text?: string;\n};\n\ntype MatchListProps = {\n matches: GrepMatch[];\n};\n\nexport function MatchList({ matches }: MatchListProps) {\n if (matches.length === 0) {\n return

No matches

;\n }\n\n return (\n
\n
\n Matches\n
\n
\n
\n {matches.map((match, index) => (\n \n
\n \n {match.file ? (\n \n {match.file}\n \n ) : null}\n {typeof match.line === \"number\" ? (\n \n {match.line}\n \n ) : null}\n
\n {match.text ? (\n
\n                  {match.text}\n                
\n ) : null}\n
\n ))}\n
\n
\n
\n );\n}\n"],"mappings":";AAAA,SAAS,cAAc;AAYhB,SAAS,UAAU,EAAE,QAAQ,GAAmB;AACrD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,oCAAC,OAAE,WAAU,8CAA2C,YAAU;AAAA,EAC3E;AAEA,SACE,oCAAC,SAAI,WAAU,6EACb,oCAAC,SAAI,WAAU,+HAA4H,SAE3I,GACA,oCAAC,SAAI,WAAU,gCACb,oCAAC,SAAI,WAAU,iBACZ,QAAQ,IAAI,CAAC,OAAO,UACnB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK,GAAG,MAAM,QAAQ,OAAO,IAAI,MAAM,QAAQ,KAAK,IAAI,KAAK;AAAA;AAAA,IAE7D,oCAAC,SAAI,WAAU,yCACb,oCAAC,UAAO,WAAU,2CAA0C,GAC3D,MAAM,OACL,oCAAC,UAAK,WAAU,yCACb,MAAM,IACT,IACE,MACH,OAAO,MAAM,SAAS,WACrB,oCAAC,UAAK,WAAU,oEACb,MAAM,IACT,IACE,IACN;AAAA,IACC,MAAM,OACL,oCAAC,SAAI,WAAU,sFACZ,MAAM,IACT,IACE;AAAA,EACN,CACD,CACH,CACF,CACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs b/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs new file mode 100644 index 00000000..fa047f5b --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs @@ -0,0 +1,70 @@ +import React from "react"; +import { + Avatar, + AvatarFallback, + AvatarImage +} from "./chunk-ZI7L5RNU.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/comment-avatar.tsx +import { Bot } from "lucide-react"; +var AVATAR_BOX_CLASS_NAME = { + md: "h-8 w-8", + sm: "h-7 w-7", + xs: "h-5 w-5" +}; +var AVATAR_ICON_CLASS_NAME = { + md: "h-4 w-4", + sm: "h-3.5 w-3.5", + xs: "h-3 w-3" +}; +var AVATAR_FALLBACK_CLASS_NAME = { + md: "text-xs", + sm: "text-[10px]", + xs: "text-[9px]" +}; +function getCommentAuthorInitials(author) { + return author.split(" ").map((part) => part[0]).join("").slice(0, 2).toUpperCase(); +} +function CommentAvatar({ + author, + authorAvatar, + authorKind, + size = "md" +}) { + const box = AVATAR_BOX_CLASS_NAME[size]; + if (authorKind === "bot") { + return /* @__PURE__ */ React.createElement( + "span", + { + className: cn( + "flex shrink-0 items-center justify-center overflow-hidden rounded-[8px] bg-chart-5/15 text-chart-5", + box + ) + }, + /* @__PURE__ */ React.createElement(Bot, { "aria-hidden": true, className: AVATAR_ICON_CLASS_NAME[size] }) + ); + } + return /* @__PURE__ */ React.createElement("span", { className: cn("flex shrink-0 overflow-hidden rounded-[8px]", box) }, /* @__PURE__ */ React.createElement(Avatar, { className: cn("rounded-none", box) }, authorAvatar ? /* @__PURE__ */ React.createElement( + AvatarImage, + { + alt: author, + className: "object-cover", + src: authorAvatar + } + ) : null, /* @__PURE__ */ React.createElement( + AvatarFallback, + { + className: cn("rounded-none", AVATAR_FALLBACK_CLASS_NAME[size]) + }, + getCommentAuthorInitials(author) + ))); +} + +export { + getCommentAuthorInitials, + CommentAvatar +}; +//# sourceMappingURL=chunk-72GRQU3Q.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs.map new file mode 100644 index 00000000..1dc3f1c9 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-72GRQU3Q.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/comment-avatar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { PrCommentAuthorKind } from \"@repo/api/src/types/branch-view\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@repo/design-system/components/ui/avatar\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport { Bot } from \"lucide-react\";\n\nexport type CommentAvatarSize = \"md\" | \"sm\" | \"xs\";\n\nexport type CommentAvatarProps = {\n author: string;\n authorAvatar?: string | null;\n authorKind?: PrCommentAuthorKind;\n size?: CommentAvatarSize;\n};\n\nconst AVATAR_BOX_CLASS_NAME: Record = {\n md: \"h-8 w-8\",\n sm: \"h-7 w-7\",\n xs: \"h-5 w-5\",\n};\n\nconst AVATAR_ICON_CLASS_NAME: Record = {\n md: \"h-4 w-4\",\n sm: \"h-3.5 w-3.5\",\n xs: \"h-3 w-3\",\n};\n\nconst AVATAR_FALLBACK_CLASS_NAME: Record = {\n md: \"text-xs\",\n sm: \"text-[10px]\",\n xs: \"text-[9px]\",\n};\n\nexport function getCommentAuthorInitials(author: string): string {\n return author\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase();\n}\n\nexport function CommentAvatar({\n author,\n authorAvatar,\n authorKind,\n size = \"md\",\n}: Readonly) {\n const box = AVATAR_BOX_CLASS_NAME[size];\n\n if (authorKind === \"bot\") {\n return (\n \n \n \n );\n }\n\n return (\n \n \n {authorAvatar ? (\n \n ) : null}\n \n {getCommentAuthorInitials(author)}\n \n \n \n );\n}\n"],"mappings":";;;;;;;;;;AASA,SAAS,WAAW;AAWpB,IAAM,wBAA2D;AAAA,EAC/D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,yBAA4D;AAAA,EAChE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,6BAAgE;AAAA,EACpE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,SAAS,yBAAyB,QAAwB;AAC/D,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE,EACP,MAAM,GAAG,CAAC,EACV,YAAY;AACjB;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAiC;AAC/B,QAAM,MAAM,sBAAsB,IAAI;AAEtC,MAAI,eAAe,OAAO;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,oCAAC,OAAI,eAAW,MAAC,WAAW,uBAAuB,IAAI,GAAG;AAAA,IAC5D;AAAA,EAEJ;AAEA,SACE,oCAAC,UAAK,WAAW,GAAG,+CAA+C,GAAG,KACpE,oCAAC,UAAO,WAAW,GAAG,gBAAgB,GAAG,KACtC,eACC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,KAAK;AAAA;AAAA,EACP,IACE,MACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gBAAgB,2BAA2B,IAAI,CAAC;AAAA;AAAA,IAE7D,yBAAyB,MAAM;AAAA,EAClC,CACF,CACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs b/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs new file mode 100644 index 00000000..9d434dd4 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs @@ -0,0 +1,73 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/tabs.tsx +import * as React from "react"; +import { Tabs as TabsPrimitive } from "radix-ui"; +function Tabs({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + TabsPrimitive.Root, + { + "data-slot": "tabs", + className: cn("flex flex-col gap-2", className), + ...props + } + ); +} +function TabsList({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + TabsPrimitive.List, + { + "data-slot": "tabs-list", + className: cn( + "bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]", + className + ), + ...props + } + ); +} +function TabsTrigger({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + TabsPrimitive.Trigger, + { + "data-slot": "tabs-trigger", + className: cn( + "data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input-border dark:data-[state=active]:bg-input text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + className + ), + ...props + } + ); +} +function TabsContent({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + TabsPrimitive.Content, + { + "data-slot": "tabs-content", + className: cn("flex-1 outline-none", className), + ...props + } + ); +} + +export { + Tabs, + TabsList, + TabsTrigger, + TabsContent +}; +//# sourceMappingURL=chunk-76IVWEZL.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs.map new file mode 100644 index 00000000..f92cd8d0 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-76IVWEZL.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/tabs.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,QAAQ,qBAAqB;AAItC,SAAS,KAAK;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAoD;AAClD,SACE;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC7C,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA,GAAG;AACL,GAAoD;AAClD,SACE;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC7C,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs b/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs new file mode 100644 index 00000000..5b63baa9 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs @@ -0,0 +1,125 @@ +import React from "react"; +import { + Textarea +} from "./chunk-64QT2WSE.mjs"; +import { + Button +} from "./chunk-TT7DUYOP.mjs"; + +// components/ui/comment-composer.tsx +import { useEffect, useState } from "react"; +function CommentComposer({ + value, + defaultValue = "", + placeholder = "Add a comment...", + submitLabel = "Comment", + cancelLabel = "Cancel", + disabled = false, + isPending = false, + minHeightClassName = "min-h-[96px]", + containerClassName, + footerClassName, + leadingActions, + helperText, + onValueChange, + onSubmit, + onCancel +}) { + const [internalValue, setInternalValue] = useState(defaultValue); + const draft = value ?? internalValue; + useEffect(() => { + if (value === void 0) { + setInternalValue(defaultValue); + } + }, [defaultValue, value]); + function setDraft(nextValue) { + if (value === void 0) { + setInternalValue(nextValue); + } + onValueChange?.(nextValue); + } + function submit() { + const trimmed = draft.trim(); + if (trimmed.length === 0 || disabled || isPending) { + return; + } + onSubmit(trimmed); + if (value === void 0) { + setInternalValue(""); + onValueChange?.(""); + } + } + function handleCancelClick(event) { + event.stopPropagation(); + if (value === void 0) { + setInternalValue(defaultValue); + onValueChange?.(defaultValue); + } + onCancel?.(); + } + function handleSubmitClick(event) { + event.stopPropagation(); + submit(); + } + function handleKeyDown(event) { + if ((event.metaKey || event.ctrlKey) && event.key === "Enter") { + event.preventDefault(); + submit(); + } + } + const hasContent = draft.trim().length > 0; + return /* @__PURE__ */ React.createElement( + "div", + { + className: containerClassName ?? "flex flex-col gap-2", + "data-comment-control": "true" + }, + helperText == null ? null : helperText, + /* @__PURE__ */ React.createElement( + Textarea, + { + className: `${minHeightClassName} resize-y text-sm`, + "data-comment-control": "true", + disabled: disabled || isPending, + onChange: (event) => setDraft(event.target.value), + onKeyDown: handleKeyDown, + placeholder, + value: draft + } + ), + /* @__PURE__ */ React.createElement( + "div", + { + className: footerClassName ?? (leadingActions == null ? "flex justify-end" : "flex items-center justify-between gap-2") + }, + leadingActions == null ? null : /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-1" }, leadingActions), + /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-end gap-2" }, onCancel ? /* @__PURE__ */ React.createElement( + Button, + { + "data-comment-control": "true", + disabled: disabled || isPending, + onClick: handleCancelClick, + size: "sm", + type: "button", + variant: "outline" + }, + cancelLabel + ) : null, /* @__PURE__ */ React.createElement( + Button, + { + "data-comment-control": "true", + disabled: disabled || isPending || !hasContent, + onClick: handleSubmitClick, + size: "sm", + type: "button" + }, + submitLabel + )) + ) + ); +} + +export { + CommentComposer +}; +//# sourceMappingURL=chunk-7D373W5W.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs.map new file mode 100644 index 00000000..3d563bf0 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7D373W5W.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/comment-composer.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button } from \"@repo/design-system/components/ui/button\";\nimport { Textarea } from \"@repo/design-system/components/ui/textarea\";\nimport type { KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\nexport type CommentComposerProps = {\n value?: string;\n defaultValue?: string;\n placeholder?: string;\n submitLabel?: ReactNode;\n cancelLabel?: ReactNode;\n disabled?: boolean;\n isPending?: boolean;\n minHeightClassName?: string;\n containerClassName?: string;\n footerClassName?: string;\n leadingActions?: ReactNode;\n helperText?: ReactNode;\n onValueChange?: (value: string) => void;\n onSubmit: (body: string) => void;\n onCancel?: () => void;\n};\n\nexport function CommentComposer({\n value,\n defaultValue = \"\",\n placeholder = \"Add a comment...\",\n submitLabel = \"Comment\",\n cancelLabel = \"Cancel\",\n disabled = false,\n isPending = false,\n minHeightClassName = \"min-h-[96px]\",\n containerClassName,\n footerClassName,\n leadingActions,\n helperText,\n onValueChange,\n onSubmit,\n onCancel,\n}: Readonly) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const draft = value ?? internalValue;\n\n useEffect(() => {\n if (value === undefined) {\n setInternalValue(defaultValue);\n }\n }, [defaultValue, value]);\n\n function setDraft(nextValue: string) {\n if (value === undefined) {\n setInternalValue(nextValue);\n }\n onValueChange?.(nextValue);\n }\n\n function submit() {\n const trimmed = draft.trim();\n if (trimmed.length === 0 || disabled || isPending) {\n return;\n }\n onSubmit(trimmed);\n if (value === undefined) {\n setInternalValue(\"\");\n onValueChange?.(\"\");\n }\n }\n\n function handleCancelClick(event: MouseEvent) {\n event.stopPropagation();\n if (value === undefined) {\n setInternalValue(defaultValue);\n onValueChange?.(defaultValue);\n }\n onCancel?.();\n }\n\n function handleSubmitClick(event: MouseEvent) {\n event.stopPropagation();\n submit();\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\") {\n event.preventDefault();\n submit();\n }\n }\n\n const hasContent = draft.trim().length > 0;\n\n return (\n \n {helperText == null ? null : helperText}\n setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n value={draft}\n />\n \n {leadingActions == null ? null : (\n
{leadingActions}
\n )}\n
\n {onCancel ? (\n \n {cancelLabel}\n \n ) : null}\n \n {submitLabel}\n \n
\n
\n
\n );\n}\n"],"mappings":";;;;;;;;AAKA,SAAS,WAAW,gBAAgB;AAoB7B,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,YAAY;AAC/D,QAAM,QAAQ,SAAS;AAEvB,YAAU,MAAM;AACd,QAAI,UAAU,QAAW;AACvB,uBAAiB,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,cAAc,KAAK,CAAC;AAExB,WAAS,SAAS,WAAmB;AACnC,QAAI,UAAU,QAAW;AACvB,uBAAiB,SAAS;AAAA,IAC5B;AACA,oBAAgB,SAAS;AAAA,EAC3B;AAEA,WAAS,SAAS;AAChB,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,WAAW,KAAK,YAAY,WAAW;AACjD;AAAA,IACF;AACA,aAAS,OAAO;AAChB,QAAI,UAAU,QAAW;AACvB,uBAAiB,EAAE;AACnB,sBAAgB,EAAE;AAAA,IACpB;AAAA,EACF;AAEA,WAAS,kBAAkB,OAAsC;AAC/D,UAAM,gBAAgB;AACtB,QAAI,UAAU,QAAW;AACvB,uBAAiB,YAAY;AAC7B,sBAAgB,YAAY;AAAA,IAC9B;AACA,eAAW;AAAA,EACb;AAEA,WAAS,kBAAkB,OAAsC;AAC/D,UAAM,gBAAgB;AACtB,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAA2C;AAChE,SAAK,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,SAAS;AAC7D,YAAM,eAAe;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,KAAK,EAAE,SAAS;AAEzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,sBAAsB;AAAA,MACjC,wBAAqB;AAAA;AAAA,IAEpB,cAAc,OAAO,OAAO;AAAA,IAC7B;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,kBAAkB;AAAA,QAChC,wBAAqB;AAAA,QACrB,UAAU,YAAY;AAAA,QACtB,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,QAChD,WAAW;AAAA,QACX;AAAA,QACA,OAAO;AAAA;AAAA,IACT;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WACE,oBACC,kBAAkB,OACf,qBACA;AAAA;AAAA,MAGL,kBAAkB,OAAO,OACxB,oCAAC,SAAI,WAAU,6BAA2B,cAAe;AAAA,MAE3D,oCAAC,SAAI,WAAU,yCACZ,WACC;AAAA,QAAC;AAAA;AAAA,UACC,wBAAqB;AAAA,UACrB,UAAU,YAAY;AAAA,UACtB,SAAS;AAAA,UACT,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA;AAAA,QAEP;AAAA,MACH,IACE,MACJ;AAAA,QAAC;AAAA;AAAA,UACC,wBAAqB;AAAA,UACrB,UAAU,YAAY,aAAa,CAAC;AAAA,UACpC,SAAS;AAAA,UACT,MAAK;AAAA,UACL,MAAK;AAAA;AAAA,QAEJ;AAAA,MACH,CACF;AAAA,IACF;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs b/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs new file mode 100644 index 00000000..69da9522 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs @@ -0,0 +1,199 @@ +import { + Button, + buttonVariants +} from "./chunk-TT7DUYOP.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/calendar.tsx +import * as React from "react"; +import { + ChevronDownIcon, + ChevronLeftIcon, + ChevronRightIcon +} from "lucide-react"; +import { DayPicker, getDefaultClassNames } from "react-day-picker"; +function Calendar({ + className, + classNames, + showOutsideDays = true, + captionLayout = "label", + buttonVariant = "ghost", + formatters, + components, + ...props +}) { + const defaultClassNames = getDefaultClassNames(); + return /* @__PURE__ */ React.createElement( + DayPicker, + { + showOutsideDays, + className: cn( + "bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent", + String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`, + String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`, + className + ), + captionLayout, + formatters: { + formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" }), + ...formatters + }, + classNames: { + root: cn("w-fit", defaultClassNames.root), + months: cn( + "flex gap-4 flex-col md:flex-row relative", + defaultClassNames.months + ), + month: cn("flex flex-col w-full gap-4", defaultClassNames.month), + nav: cn( + "flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between", + defaultClassNames.nav + ), + button_previous: cn( + buttonVariants({ variant: buttonVariant }), + "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none", + defaultClassNames.button_previous + ), + button_next: cn( + buttonVariants({ variant: buttonVariant }), + "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none", + defaultClassNames.button_next + ), + month_caption: cn( + "flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)", + defaultClassNames.month_caption + ), + dropdowns: cn( + "w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5", + defaultClassNames.dropdowns + ), + dropdown_root: cn( + "relative has-focus:border-ring border border-input-border shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md", + defaultClassNames.dropdown_root + ), + dropdown: cn( + "absolute bg-popover inset-0 opacity-0", + defaultClassNames.dropdown + ), + caption_label: cn( + "select-none font-medium", + captionLayout === "label" ? "text-sm" : "rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5", + defaultClassNames.caption_label + ), + table: "w-full border-collapse", + weekdays: cn("flex", defaultClassNames.weekdays), + weekday: cn( + "text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none", + defaultClassNames.weekday + ), + week: cn("flex w-full mt-2", defaultClassNames.week), + week_number_header: cn( + "select-none w-(--cell-size)", + defaultClassNames.week_number_header + ), + week_number: cn( + "text-[0.8rem] select-none text-muted-foreground", + defaultClassNames.week_number + ), + day: cn( + "relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none", + props.showWeekNumber ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-md" : "[&:first-child[data-selected=true]_button]:rounded-l-md", + defaultClassNames.day + ), + range_start: cn( + "rounded-l-md bg-accent", + defaultClassNames.range_start + ), + range_middle: cn("rounded-none", defaultClassNames.range_middle), + range_end: cn("rounded-r-md bg-accent", defaultClassNames.range_end), + today: cn( + "bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none", + defaultClassNames.today + ), + outside: cn( + "text-muted-foreground aria-selected:text-muted-foreground", + defaultClassNames.outside + ), + disabled: cn( + "text-muted-foreground opacity-50", + defaultClassNames.disabled + ), + hidden: cn("invisible", defaultClassNames.hidden), + ...classNames + }, + components: { + Root: ({ className: className2, rootRef, ...props2 }) => { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "calendar", + ref: rootRef, + className: cn(className2), + ...props2 + } + ); + }, + Chevron: ({ className: className2, orientation, ...props2 }) => { + if (orientation === "left") { + return /* @__PURE__ */ React.createElement(ChevronLeftIcon, { className: cn("size-4", className2), ...props2 }); + } + if (orientation === "right") { + return /* @__PURE__ */ React.createElement( + ChevronRightIcon, + { + className: cn("size-4", className2), + ...props2 + } + ); + } + return /* @__PURE__ */ React.createElement(ChevronDownIcon, { className: cn("size-4", className2), ...props2 }); + }, + DayButton: CalendarDayButton, + WeekNumber: ({ children, ...props2 }) => { + return /* @__PURE__ */ React.createElement("td", { ...props2 }, /* @__PURE__ */ React.createElement("div", { className: "flex size-(--cell-size) items-center justify-center text-center" }, children)); + }, + ...components + }, + ...props + } + ); +} +function CalendarDayButton({ + className, + day, + modifiers, + ...props +}) { + const defaultClassNames = getDefaultClassNames(); + const ref = React.useRef(null); + React.useEffect(() => { + if (modifiers.focused) ref.current?.focus(); + }, [modifiers.focused]); + return /* @__PURE__ */ React.createElement( + Button, + { + ref, + variant: "ghost", + size: "icon", + "data-day": day.date.toLocaleDateString(), + "data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle, + "data-range-start": modifiers.range_start, + "data-range-end": modifiers.range_end, + "data-range-middle": modifiers.range_middle, + className: cn( + "data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70", + defaultClassNames.day, + className + ), + ...props + } + ); +} + +export { + Calendar, + CalendarDayButton +}; +//# sourceMappingURL=chunk-7SZ2QAX4.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs.map new file mode 100644 index 00000000..f18a90bb --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7SZ2QAX4.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/calendar.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport { DayButton, DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\nimport { Button, buttonVariants } from \"@repo/design-system/components/ui/button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps & {\n buttonVariant?: React.ComponentProps[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative has-focus:border-ring border border-input-border shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"rounded-r-md bg-accent\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n }\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n \n )\n }\n\n if (orientation === \"right\") {\n return (\n \n )\n }\n\n return (\n \n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n \n
\n {children}\n
\n \n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n"],"mappings":"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","names":["className","props"]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs b/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs new file mode 100644 index 00000000..bc22a5a7 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs @@ -0,0 +1,50 @@ +import React from "react"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/conversation-message.tsx +import { BotIcon, UserIcon } from "lucide-react"; +function ConversationMessage({ + role, + content, + className +}) { + const isUser = role === "user"; + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "flex gap-2", + isUser ? "flex-row-reverse" : "flex-row", + className + ) + }, + /* @__PURE__ */ React.createElement( + "span", + { + "aria-hidden": true, + className: cn( + "flex size-7 shrink-0 items-center justify-center rounded-full text-muted-foreground", + isUser ? "bg-primary/10 text-primary" : "bg-muted" + ) + }, + isUser ? /* @__PURE__ */ React.createElement(UserIcon, { className: "size-3.5" }) : /* @__PURE__ */ React.createElement(BotIcon, { className: "size-3.5" }) + ), + /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "max-w-[85%] rounded-lg px-3 py-2 text-sm", + isUser ? "bg-primary text-primary-foreground" : "bg-muted text-foreground" + ) + }, + /* @__PURE__ */ React.createElement("p", { className: "whitespace-pre-wrap break-words" }, content) + ) + ); +} + +export { + ConversationMessage +}; +//# sourceMappingURL=chunk-7VER2F6Z.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs.map new file mode 100644 index 00000000..4f2a6e40 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-7VER2F6Z.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/conversation-message.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport { BotIcon, UserIcon } from \"lucide-react\";\n\nexport type ConversationMessageRole = \"user\" | \"assistant\";\n\nexport type ConversationMessageProps = {\n role: ConversationMessageRole;\n content: string;\n className?: string;\n};\n\nexport function ConversationMessage({\n role,\n content,\n className,\n}: Readonly) {\n const isUser = role === \"user\";\n\n return (\n \n \n {isUser ? (\n \n ) : (\n \n )}\n \n \n

{content}

\n
\n
\n );\n}\n"],"mappings":";;;;;AAGA,SAAS,SAAS,gBAAgB;AAU3B,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,SAAS,SAAS;AAExB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,qBAAqB;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA,SAAS,+BAA+B;AAAA,QAC1C;AAAA;AAAA,MAEC,SACC,oCAAC,YAAS,WAAU,YAAW,IAE/B,oCAAC,WAAQ,WAAU,YAAW;AAAA,IAElC;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,SACI,uCACA;AAAA,QACN;AAAA;AAAA,MAEA,oCAAC,OAAE,WAAU,qCAAmC,OAAQ;AAAA,IAC1D;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs b/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs new file mode 100644 index 00000000..ef95f2ce --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs @@ -0,0 +1,26 @@ +// components/ui/table-filters.ts +var TableDatePreset = { + Last24h: "LAST_24H", + Last7d: "LAST_7D", + Last30d: "LAST_30D", + Last3m: "LAST_3M", + Custom: "CUSTOM" +}; +var TABLE_DATE_PRESET_LABELS = { + [TableDatePreset.Last24h]: "Last 24 hours", + [TableDatePreset.Last7d]: "Last 7 days", + [TableDatePreset.Last30d]: "Last 30 days", + [TableDatePreset.Last3m]: "Last 3 months", + [TableDatePreset.Custom]: "Custom range" +}; +var TableDateFilterField = { + CreatedAt: "CREATED_AT", + UpdatedAt: "UPDATED_AT" +}; + +export { + TableDatePreset, + TABLE_DATE_PRESET_LABELS, + TableDateFilterField +}; +//# sourceMappingURL=chunk-ASHTD3OK.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs.map new file mode 100644 index 00000000..0f79c718 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-ASHTD3OK.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/table-filters.ts"],"sourcesContent":["import type { Priority } from \"@repo/api/src/types/common\";\nimport type { DocumentStatus } from \"@repo/api/src/types/document\";\nimport type { ReactNode } from \"react\";\n\nexport const TableDatePreset = {\n Last24h: \"LAST_24H\",\n Last7d: \"LAST_7D\",\n Last30d: \"LAST_30D\",\n Last3m: \"LAST_3M\",\n Custom: \"CUSTOM\",\n} as const;\n\nexport type TableDatePreset =\n (typeof TableDatePreset)[keyof typeof TableDatePreset];\n\nexport const TABLE_DATE_PRESET_LABELS: Record = {\n [TableDatePreset.Last24h]: \"Last 24 hours\",\n [TableDatePreset.Last7d]: \"Last 7 days\",\n [TableDatePreset.Last30d]: \"Last 30 days\",\n [TableDatePreset.Last3m]: \"Last 3 months\",\n [TableDatePreset.Custom]: \"Custom range\",\n};\n\nexport const TableDateFilterField = {\n CreatedAt: \"CREATED_AT\",\n UpdatedAt: \"UPDATED_AT\",\n} as const;\n\nexport type TableDateFilterField =\n (typeof TableDateFilterField)[keyof typeof TableDateFilterField];\n\nexport type TableDateFilter = {\n field: TableDateFilterField;\n preset: TableDatePreset;\n startDate?: Date;\n endDate?: Date;\n};\n\nexport type TableFiltersState = {\n assigneeIds: string[];\n assignToMe: boolean;\n hideCompletedItems: boolean;\n favoritesOnly: boolean;\n statuses: DocumentStatus[];\n priorities: Priority[];\n date: TableDateFilter | null;\n tagIds: string[];\n};\n\nexport type TableFilterCategory =\n | \"assignee\"\n | \"status\"\n | \"priority\"\n | \"date\"\n | \"hideCompleted\"\n | \"favorites\"\n | \"tags\";\n\nexport type TableFilterChip = {\n category: TableFilterCategory;\n label: string;\n};\n\nexport type TableFilterCurrentUser = {\n id: string;\n name: string;\n avatarUrl?: string;\n};\n\nexport type TableFilterOption = {\n id: TValue;\n label: string;\n count?: number;\n icon?: ReactNode;\n avatarUrl?: string;\n color?: string;\n searchText?: string;\n};\n\nexport type TableFilterDatePresetOption = {\n value: TableDatePreset;\n label: string;\n};\n\nexport type TableFilterLabels = {\n filterButton?: string;\n filterSearchPlaceholder?: string;\n clearAll?: string;\n loading?: string;\n loadError?: string;\n noTags?: string;\n addFilter?: string;\n assignToMe?: string;\n hideCompletedItems?: string;\n favoritesOnly?: string;\n assignee?: string;\n status?: string;\n priority?: string;\n dates?: string;\n createdDate?: string;\n updatedDate?: string;\n tags?: string;\n unassigned?: string;\n};\n\nexport type TableFiltersController = {\n filters: TableFiltersState;\n toggleAssignee: (id: string) => void;\n toggleAssignToMe: () => void;\n toggleHideCompletedItems: () => void;\n toggleFavoritesOnly: () => void;\n toggleStatus: (status: DocumentStatus) => void;\n togglePriority: (priority: Priority) => void;\n setDateFilter: (date: TableDateFilter | null) => void;\n toggleTag: (tagId: string) => void;\n clearCategoryFilter: (category: TableFilterCategory) => void;\n clearAllFilters: () => void;\n activeChips: TableFilterChip[];\n};\n\nexport type TableFiltersViewModel = {\n currentUser?: TableFilterCurrentUser | null;\n teamMembers: TableFilterOption[];\n teamMembersLoading?: boolean;\n teamMembersError?: string | null;\n statusOptions: TableFilterOption[];\n priorityOptions: TableFilterOption[];\n tagOptions?: TableFilterOption[];\n hideAssignee?: boolean;\n showTags?: boolean;\n datePresets?: TableFilterDatePresetOption[];\n labels?: TableFilterLabels;\n};\n"],"mappings":";AAIO,IAAM,kBAAkB;AAAA,EAC7B,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAKO,IAAM,2BAA4D;AAAA,EACvE,CAAC,gBAAgB,OAAO,GAAG;AAAA,EAC3B,CAAC,gBAAgB,MAAM,GAAG;AAAA,EAC1B,CAAC,gBAAgB,OAAO,GAAG;AAAA,EAC3B,CAAC,gBAAgB,MAAM,GAAG;AAAA,EAC1B,CAAC,gBAAgB,MAAM,GAAG;AAC5B;AAEO,IAAM,uBAAuB;AAAA,EAClC,WAAW;AAAA,EACX,WAAW;AACb;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs b/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs new file mode 100644 index 00000000..16406372 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs @@ -0,0 +1,124 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/sheet.tsx +import * as React from "react"; +import { Dialog as SheetPrimitive } from "radix-ui"; +import { XIcon } from "lucide-react"; +function Sheet({ ...props }) { + return /* @__PURE__ */ React.createElement(SheetPrimitive.Root, { "data-slot": "sheet", ...props }); +} +function SheetTrigger({ + ...props +}) { + return /* @__PURE__ */ React.createElement(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props }); +} +function SheetClose({ + ...props +}) { + return /* @__PURE__ */ React.createElement(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props }); +} +function SheetPortal({ + ...props +}) { + return /* @__PURE__ */ React.createElement(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props }); +} +function SheetOverlay({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + SheetPrimitive.Overlay, + { + "data-slot": "sheet-overlay", + className: cn( + "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", + className + ), + ...props + } + ); +} +function SheetContent({ + className, + children, + side = "right", + ...props +}) { + return /* @__PURE__ */ React.createElement(SheetPortal, null, /* @__PURE__ */ React.createElement(SheetOverlay, null), /* @__PURE__ */ React.createElement( + SheetPrimitive.Content, + { + "data-slot": "sheet-content", + className: cn( + "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + side === "right" && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm", + side === "left" && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm", + side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b", + side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t", + className + ), + ...props + }, + children, + /* @__PURE__ */ React.createElement(SheetPrimitive.Close, { className: "ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none" }, /* @__PURE__ */ React.createElement(XIcon, { className: "size-4" }), /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close")) + )); +} +function SheetHeader({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sheet-header", + className: cn("flex flex-col gap-1.5 p-4", className), + ...props + } + ); +} +function SheetFooter({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sheet-footer", + className: cn("mt-auto flex flex-col gap-2 p-4", className), + ...props + } + ); +} +function SheetTitle({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + SheetPrimitive.Title, + { + "data-slot": "sheet-title", + className: cn("text-foreground font-semibold", className), + ...props + } + ); +} +function SheetDescription({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + SheetPrimitive.Description, + { + "data-slot": "sheet-description", + className: cn("text-muted-foreground text-sm", className), + ...props + } + ); +} + +export { + Sheet, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription +}; +//# sourceMappingURL=chunk-B7SMJA5Y.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs.map new file mode 100644 index 00000000..0ba94590 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-B7SMJA5Y.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/sheet.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps) {\n return \n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n \n \n \n {children}\n \n \n Close\n \n \n \n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"],"mappings":";;;;;AAEA,YAAY,WAAW;AACvB,SAAS,UAAU,sBAAsB;AACzC,SAAS,aAAa;AAItB,SAAS,MAAM,EAAE,GAAG,MAAM,GAAqD;AAC7E,SAAO,oCAAC,eAAe,MAAf,EAAoB,aAAU,SAAS,GAAG,OAAO;AAC3D;AAEA,SAAS,aAAa;AAAA,EACpB,GAAG;AACL,GAAwD;AACtD,SAAO,oCAAC,eAAe,SAAf,EAAuB,aAAU,iBAAiB,GAAG,OAAO;AACtE;AAEA,SAAS,WAAW;AAAA,EAClB,GAAG;AACL,GAAsD;AACpD,SAAO,oCAAC,eAAe,OAAf,EAAqB,aAAU,eAAe,GAAG,OAAO;AAClE;AAEA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,oCAAC,eAAe,QAAf,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAAwD;AACtD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAEG;AACD,SACE,oCAAC,mBACC,oCAAC,kBAAa,GACd;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,SAAS,WACP;AAAA,QACF,SAAS,UACP;AAAA,QACF,SAAS,SACP;AAAA,QACF,SAAS,YACP;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,IACD,oCAAC,eAAe,OAAf,EAAqB,WAAU,gPAC9B,oCAAC,SAAM,WAAU,UAAS,GAC1B,oCAAC,UAAK,WAAU,aAAU,OAAK,CACjC;AAAA,EACF,CACF;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mCAAmC,SAAS;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs b/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs new file mode 100644 index 00000000..7d83ef1b --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs @@ -0,0 +1,78 @@ +import React from "react"; +import { + CopyButton +} from "./chunk-L5AZJM2L.mjs"; + +// components/ui/primitives/code-block.tsx +import { FileCode } from "lucide-react"; +var toneClasses = { + default: { + wrapper: "border-border/70 bg-zinc-950/95", + chrome: "border-border/60 bg-black/30", + label: "text-zinc-400" + }, + danger: { + wrapper: "border-red-500/25 bg-red-950/20", + chrome: "border-red-500/20 bg-red-950/25", + label: "text-red-200" + }, + success: { + wrapper: "border-emerald-500/25 bg-emerald-950/20", + chrome: "border-emerald-500/20 bg-emerald-950/25", + label: "text-emerald-200" + } +}; +function CodeBlock({ + code, + children, + className, + filename, + compact = false, + label, + tone = "default", + maxHeight = "24rem", + showLineNumbers +}) { + const content = code ?? children ?? ""; + const lines = content.split("\n"); + const gutter = showLineNumbers ?? lines.length >= 4; + const palette = toneClasses[tone]; + let lineNumber = 1; + return /* @__PURE__ */ React.createElement( + "div", + { + className: `overflow-hidden rounded-xl border shadow-sm ${palette.wrapper} ${className ?? ""}` + }, + compact ? null : /* @__PURE__ */ React.createElement( + "div", + { + className: `flex items-center justify-between border-b px-3 py-1.5 ${palette.chrome}` + }, + /* @__PURE__ */ React.createElement( + "div", + { + className: `flex items-center gap-1.5 font-mono text-[10px] uppercase tracking-[0.12em] ${palette.label}` + }, + filename ? /* @__PURE__ */ React.createElement(FileCode, { className: "size-3" }) : null, + /* @__PURE__ */ React.createElement("span", null, filename ?? label ?? "code") + ), + /* @__PURE__ */ React.createElement(CopyButton, { text: content }) + ), + /* @__PURE__ */ React.createElement( + "div", + { + className: "overflow-auto", + style: maxHeight ? { maxHeight } : void 0 + }, + gutter ? /* @__PURE__ */ React.createElement("table", { className: "w-full border-collapse font-mono text-[11px] leading-relaxed" }, /* @__PURE__ */ React.createElement("tbody", null, lines.map((line) => { + const currentLine = lineNumber++; + return /* @__PURE__ */ React.createElement("tr", { key: `line-${currentLine}-${line.slice(0, 24)}` }, /* @__PURE__ */ React.createElement("td", { className: "w-10 select-none border-border/40 border-r bg-black/15 px-2 text-right text-zinc-500" }, currentLine), /* @__PURE__ */ React.createElement("td", { className: "whitespace-pre-wrap break-words px-3 py-0.5 text-zinc-100" }, line || " ")); + }))) : /* @__PURE__ */ React.createElement("pre", { className: "whitespace-pre-wrap break-words px-3 py-2 font-mono text-[11px] text-zinc-100 leading-relaxed" }, content) + ) + ); +} + +export { + CodeBlock +}; +//# sourceMappingURL=chunk-BPFSJREZ.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs.map new file mode 100644 index 00000000..81d5f4b6 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-BPFSJREZ.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/code-block.tsx"],"sourcesContent":["\"use client\";\n\nimport { FileCode } from \"lucide-react\";\nimport { CopyButton } from \"./copy-button\";\n\ntype CodeBlockProps = {\n code?: string;\n children?: string;\n className?: string;\n filename?: string;\n compact?: boolean;\n label?: string;\n tone?: \"default\" | \"danger\" | \"success\";\n maxHeight?: string | null;\n showLineNumbers?: boolean;\n};\n\nconst toneClasses = {\n default: {\n wrapper: \"border-border/70 bg-zinc-950/95\",\n chrome: \"border-border/60 bg-black/30\",\n label: \"text-zinc-400\",\n },\n danger: {\n wrapper: \"border-red-500/25 bg-red-950/20\",\n chrome: \"border-red-500/20 bg-red-950/25\",\n label: \"text-red-200\",\n },\n success: {\n wrapper: \"border-emerald-500/25 bg-emerald-950/20\",\n chrome: \"border-emerald-500/20 bg-emerald-950/25\",\n label: \"text-emerald-200\",\n },\n} as const;\n\nexport function CodeBlock({\n code,\n children,\n className,\n filename,\n compact = false,\n label,\n tone = \"default\",\n maxHeight = \"24rem\",\n showLineNumbers,\n}: CodeBlockProps) {\n const content = code ?? children ?? \"\";\n const lines = content.split(\"\\n\");\n const gutter = showLineNumbers ?? lines.length >= 4;\n const palette = toneClasses[tone];\n let lineNumber = 1;\n\n return (\n \n {compact ? null : (\n \n \n {filename ? : null}\n {filename ?? label ?? \"code\"}\n
\n \n
\n )}\n \n {gutter ? (\n \n \n {lines.map((line) => {\n const currentLine = lineNumber++;\n return (\n \n \n \n \n );\n })}\n \n
\n {currentLine}\n \n {line || \" \"}\n
\n ) : (\n
\n            {content}\n          
\n )}\n
\n
\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,gBAAgB;AAezB,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AACF,GAAmB;AACjB,QAAM,UAAU,QAAQ,YAAY;AACpC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,SAAS,mBAAmB,MAAM,UAAU;AAClD,QAAM,UAAU,YAAY,IAAI;AAChC,MAAI,aAAa;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,+CAA+C,QAAQ,OAAO,IAAI,aAAa,EAAE;AAAA;AAAA,IAE3F,UAAU,OACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,0DAA0D,QAAQ,MAAM;AAAA;AAAA,MAEnF;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,+EAA+E,QAAQ,KAAK;AAAA;AAAA,QAEtG,WAAW,oCAAC,YAAS,WAAU,UAAS,IAAK;AAAA,QAC9C,oCAAC,cAAM,YAAY,SAAS,MAAO;AAAA,MACrC;AAAA,MACA,oCAAC,cAAW,MAAM,SAAS;AAAA,IAC7B;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,YAAY,EAAE,UAAU,IAAI;AAAA;AAAA,MAElC,SACC,oCAAC,WAAM,WAAU,kEACf,oCAAC,eACE,MAAM,IAAI,CAAC,SAAS;AACnB,cAAM,cAAc;AACpB,eACE,oCAAC,QAAG,KAAK,QAAQ,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,MAC/C,oCAAC,QAAG,WAAU,0FACX,WACH,GACA,oCAAC,QAAG,WAAU,+DACX,QAAQ,GACX,CACF;AAAA,MAEJ,CAAC,CACH,CACF,IAEA,oCAAC,SAAI,WAAU,mGACZ,OACH;AAAA,IAEJ;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs b/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs new file mode 100644 index 00000000..049ed8a5 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs @@ -0,0 +1,37 @@ +import React from "react"; +// components/ui/collapsible.tsx +import { Collapsible as CollapsiblePrimitive } from "radix-ui"; +function Collapsible({ + ...props +}) { + return /* @__PURE__ */ React.createElement(CollapsiblePrimitive.Root, { "data-slot": "collapsible", ...props }); +} +function CollapsibleTrigger({ + ...props +}) { + return /* @__PURE__ */ React.createElement( + CollapsiblePrimitive.CollapsibleTrigger, + { + "data-slot": "collapsible-trigger", + ...props + } + ); +} +function CollapsibleContent({ + ...props +}) { + return /* @__PURE__ */ React.createElement( + CollapsiblePrimitive.CollapsibleContent, + { + "data-slot": "collapsible-content", + ...props + } + ); +} + +export { + Collapsible, + CollapsibleTrigger, + CollapsibleContent +}; +//# sourceMappingURL=chunk-CI7GGEKC.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs.map new file mode 100644 index 00000000..a26997cd --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-CI7GGEKC.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/collapsible.tsx"],"sourcesContent":["\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"],"mappings":";AAEA,SAAS,eAAe,4BAA4B;AAEpD,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAA2D;AACzD,SAAO,oCAAC,qBAAqB,MAArB,EAA0B,aAAU,eAAe,GAAG,OAAO;AACvE;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAAyE;AACvE,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAAyE;AACvE,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs b/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs new file mode 100644 index 00000000..ccc7e107 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs @@ -0,0 +1,4017 @@ +import { + __commonJS, + __require +} from "./chunk-LZOMFHX3.mjs"; + +// ../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs +var require_interop_require_wildcard = __commonJS({ + "../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs"(exports) { + "use strict"; + function _getRequireWildcardCache(nodeInterop) { + if (typeof WeakMap !== "function") return null; + var cacheBabelInterop = /* @__PURE__ */ new WeakMap(); + var cacheNodeInterop = /* @__PURE__ */ new WeakMap(); + return (_getRequireWildcardCache = function(nodeInterop2) { + return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop; + })(nodeInterop); + } + function _interop_require_wildcard(obj, nodeInterop) { + if (!nodeInterop && obj && obj.__esModule) return obj; + if (obj === null || typeof obj !== "object" && typeof obj !== "function") return { default: obj }; + var cache = _getRequireWildcardCache(nodeInterop); + if (cache && cache.has(obj)) return cache.get(obj); + var newObj = { __proto__: null }; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var key in obj) { + if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc); + else newObj[key] = obj[key]; + } + } + newObj.default = obj; + if (cache) cache.set(obj, newObj); + return newObj; + } + exports._ = _interop_require_wildcard; + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/querystring.js +var require_querystring = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/querystring.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + assign: function() { + return assign; + }, + searchParamsToUrlQuery: function() { + return searchParamsToUrlQuery; + }, + urlQueryToSearchParams: function() { + return urlQueryToSearchParams; + } + }); + function searchParamsToUrlQuery(searchParams) { + const query = {}; + for (const [key, value] of searchParams.entries()) { + const existing = query[key]; + if (typeof existing === "undefined") { + query[key] = value; + } else if (Array.isArray(existing)) { + existing.push(value); + } else { + query[key] = [ + existing, + value + ]; + } + } + return query; + } + function stringifyUrlQueryParam(param) { + if (typeof param === "string") { + return param; + } + if (typeof param === "number" && !isNaN(param) || typeof param === "boolean") { + return String(param); + } else { + return ""; + } + } + function urlQueryToSearchParams(query) { + const searchParams = new URLSearchParams(); + for (const [key, value] of Object.entries(query)) { + if (Array.isArray(value)) { + for (const item of value) { + searchParams.append(key, stringifyUrlQueryParam(item)); + } + } else { + searchParams.set(key, stringifyUrlQueryParam(value)); + } + } + return searchParams; + } + function assign(target, ...searchParamsList) { + for (const searchParams of searchParamsList) { + for (const key of searchParams.keys()) { + target.delete(key); + } + for (const [key, value] of searchParams.entries()) { + target.append(key, value); + } + } + return target; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/format-url.js +var require_format_url = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/format-url.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + formatUrl: function() { + return formatUrl; + }, + formatWithValidation: function() { + return formatWithValidation; + }, + urlObjectKeys: function() { + return urlObjectKeys; + } + }); + var _interop_require_wildcard = require_interop_require_wildcard(); + var _querystring = /* @__PURE__ */ _interop_require_wildcard._(require_querystring()); + var slashedProtocols = /https?|ftp|gopher|file/; + function formatUrl(urlObj) { + let { auth, hostname } = urlObj; + let protocol = urlObj.protocol || ""; + let pathname = urlObj.pathname || ""; + let hash = urlObj.hash || ""; + let query = urlObj.query || ""; + let host = false; + auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ":") + "@" : ""; + if (urlObj.host) { + host = auth + urlObj.host; + } else if (hostname) { + host = auth + (~hostname.indexOf(":") ? `[${hostname}]` : hostname); + if (urlObj.port) { + host += ":" + urlObj.port; + } + } + if (query && typeof query === "object") { + query = String(_querystring.urlQueryToSearchParams(query)); + } + let search = urlObj.search || query && `?${query}` || ""; + if (protocol && !protocol.endsWith(":")) protocol += ":"; + if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) { + host = "//" + (host || ""); + if (pathname && pathname[0] !== "/") pathname = "/" + pathname; + } else if (!host) { + host = ""; + } + if (hash && hash[0] !== "#") hash = "#" + hash; + if (search && search[0] !== "?") search = "?" + search; + pathname = pathname.replace(/[?#]/g, encodeURIComponent); + search = search.replace("#", "%23"); + return `${protocol}${host}${pathname}${search}${hash}`; + } + var urlObjectKeys = [ + "auth", + "hash", + "host", + "hostname", + "href", + "path", + "pathname", + "port", + "protocol", + "query", + "search", + "slashes" + ]; + function formatWithValidation(url) { + if (process.env.NODE_ENV === "development") { + if (url !== null && typeof url === "object") { + Object.keys(url).forEach((key) => { + if (!urlObjectKeys.includes(key)) { + console.warn(`Unknown key passed via urlObject into url.format: ${key}`); + } + }); + } + } + return formatUrl(url); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/omit.js +var require_omit = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/omit.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "omit", { + enumerable: true, + get: function() { + return omit; + } + }); + function omit(object, keys) { + const omitted = {}; + Object.keys(object).forEach((key) => { + if (!keys.includes(key)) { + omitted[key] = object[key]; + } + }); + return omitted; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/utils.js +var require_utils = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/utils.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + DecodeError: function() { + return DecodeError; + }, + MiddlewareNotFoundError: function() { + return MiddlewareNotFoundError; + }, + MissingStaticPage: function() { + return MissingStaticPage; + }, + NormalizeError: function() { + return NormalizeError; + }, + PageNotFoundError: function() { + return PageNotFoundError; + }, + SP: function() { + return SP; + }, + ST: function() { + return ST; + }, + WEB_VITALS: function() { + return WEB_VITALS; + }, + execOnce: function() { + return execOnce; + }, + getDisplayName: function() { + return getDisplayName; + }, + getLocationOrigin: function() { + return getLocationOrigin; + }, + getURL: function() { + return getURL; + }, + isAbsoluteUrl: function() { + return isAbsoluteUrl; + }, + isResSent: function() { + return isResSent; + }, + loadGetInitialProps: function() { + return loadGetInitialProps; + }, + normalizeRepeatedSlashes: function() { + return normalizeRepeatedSlashes; + }, + stringifyError: function() { + return stringifyError; + } + }); + var WEB_VITALS = [ + "CLS", + "FCP", + "FID", + "INP", + "LCP", + "TTFB" + ]; + function execOnce(fn) { + let used = false; + let result; + return (...args) => { + if (!used) { + used = true; + result = fn(...args); + } + return result; + }; + } + var ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/; + var isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url); + function getLocationOrigin() { + const { protocol, hostname, port } = window.location; + return `${protocol}//${hostname}${port ? ":" + port : ""}`; + } + function getURL() { + const { href } = window.location; + const origin = getLocationOrigin(); + return href.substring(origin.length); + } + function getDisplayName(Component) { + return typeof Component === "string" ? Component : Component.displayName || Component.name || "Unknown"; + } + function isResSent(res) { + return res.finished || res.headersSent; + } + function normalizeRepeatedSlashes(url) { + const urlParts = url.split("?"); + const urlNoQuery = urlParts[0]; + return urlNoQuery.replace(/\\/g, "/").replace(/\/\/+/g, "/") + (urlParts[1] ? `?${urlParts.slice(1).join("?")}` : ""); + } + async function loadGetInitialProps(App, ctx) { + if (process.env.NODE_ENV !== "production") { + if (App.prototype?.getInitialProps) { + const message = `"${getDisplayName(App)}.getInitialProps()" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E1035", + enumerable: false, + configurable: true + }); + } + } + const res = ctx.res || ctx.ctx && ctx.ctx.res; + if (!App.getInitialProps) { + if (ctx.ctx && ctx.Component) { + return { + pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx) + }; + } + return {}; + } + const props = await App.getInitialProps(ctx); + if (res && isResSent(res)) { + return props; + } + if (!props) { + const message = `"${getDisplayName(App)}.getInitialProps()" should resolve to an object. But found "${props}" instead.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E1025", + enumerable: false, + configurable: true + }); + } + if (process.env.NODE_ENV !== "production") { + if (Object.keys(props).length === 0 && !ctx.ctx) { + console.warn(`${getDisplayName(App)} returned an empty object from \`getInitialProps\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`); + } + } + return props; + } + var SP = typeof performance !== "undefined"; + var ST = SP && [ + "mark", + "measure", + "getEntriesByName" + ].every((method) => typeof performance[method] === "function"); + var DecodeError = class extends Error { + }; + var NormalizeError = class extends Error { + }; + var PageNotFoundError = class extends Error { + constructor(page) { + super(); + this.code = "ENOENT"; + this.name = "PageNotFoundError"; + this.message = `Cannot find module for page: ${page}`; + } + }; + var MissingStaticPage = class extends Error { + constructor(page, message) { + super(); + this.message = `Failed to load static file for page: ${page} ${message}`; + } + }; + var MiddlewareNotFoundError = class extends Error { + constructor() { + super(); + this.code = "ENOENT"; + this.message = `Cannot find the middleware module`; + } + }; + function stringifyError(error) { + return JSON.stringify({ + message: error.message, + stack: error.stack + }); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js +var require_remove_trailing_slash = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/remove-trailing-slash.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "removeTrailingSlash", { + enumerable: true, + get: function() { + return removeTrailingSlash; + } + }); + function removeTrailingSlash(route) { + return route.replace(/\/$/, "") || "/"; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/parse-path.js +var require_parse_path = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/parse-path.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "parsePath", { + enumerable: true, + get: function() { + return parsePath; + } + }); + function parsePath(path) { + const hashIndex = path.indexOf("#"); + const queryIndex = path.indexOf("?"); + const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex); + if (hasQuery || hashIndex > -1) { + return { + pathname: path.substring(0, hasQuery ? queryIndex : hashIndex), + query: hasQuery ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : void 0) : "", + hash: hashIndex > -1 ? path.slice(hashIndex) : "" + }; + } + return { + pathname: path, + query: "", + hash: "" + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/normalize-trailing-slash.js +var require_normalize_trailing_slash = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/normalize-trailing-slash.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "normalizePathTrailingSlash", { + enumerable: true, + get: function() { + return normalizePathTrailingSlash; + } + }); + var _removetrailingslash = require_remove_trailing_slash(); + var _parsepath = require_parse_path(); + var normalizePathTrailingSlash = (path) => { + if (!path.startsWith("/") || process.env.__NEXT_MANUAL_TRAILING_SLASH) { + return path; + } + const { pathname, query, hash } = (0, _parsepath.parsePath)(path); + if (process.env.__NEXT_TRAILING_SLASH) { + if (/\.[^/]+\/?$/.test(pathname)) { + return `${(0, _removetrailingslash.removeTrailingSlash)(pathname)}${query}${hash}`; + } else if (pathname.endsWith("/")) { + return `${pathname}${query}${hash}`; + } else { + return `${pathname}/${query}${hash}`; + } + } + return `${(0, _removetrailingslash.removeTrailingSlash)(pathname)}${query}${hash}`; + }; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js +var require_path_has_prefix = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/path-has-prefix.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "pathHasPrefix", { + enumerable: true, + get: function() { + return pathHasPrefix; + } + }); + var _parsepath = require_parse_path(); + function pathHasPrefix(path, prefix) { + if (typeof path !== "string") { + return false; + } + const { pathname } = (0, _parsepath.parsePath)(path); + return pathname === prefix || pathname.startsWith(prefix + "/"); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/has-base-path.js +var require_has_base_path = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/has-base-path.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "hasBasePath", { + enumerable: true, + get: function() { + return hasBasePath; + } + }); + var _pathhasprefix = require_path_has_prefix(); + var basePath = process.env.__NEXT_ROUTER_BASEPATH || ""; + function hasBasePath(path) { + return (0, _pathhasprefix.pathHasPrefix)(path, basePath); + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/is-local-url.js +var require_is_local_url = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/is-local-url.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "isLocalURL", { + enumerable: true, + get: function() { + return isLocalURL; + } + }); + var _utils = require_utils(); + var _hasbasepath = require_has_base_path(); + function isLocalURL(url) { + if (!(0, _utils.isAbsoluteUrl)(url)) return true; + try { + const locationOrigin = (0, _utils.getLocationOrigin)(); + const resolved = new URL(url, locationOrigin); + return resolved.origin === locationOrigin && (0, _hasbasepath.hasBasePath)(resolved.pathname); + } catch (_) { + return false; + } + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js +var require_sorted_routes = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/sorted-routes.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + getSortedRouteObjects: function() { + return getSortedRouteObjects; + }, + getSortedRoutes: function() { + return getSortedRoutes; + } + }); + var UrlNode = class _UrlNode { + insert(urlPath) { + this._insert(urlPath.split("/").filter(Boolean), [], false); + } + smoosh() { + return this._smoosh(); + } + _smoosh(prefix = "/") { + const childrenPaths = [ + ...this.children.keys() + ].sort(); + if (this.slugName !== null) { + childrenPaths.splice(childrenPaths.indexOf("[]"), 1); + } + if (this.restSlugName !== null) { + childrenPaths.splice(childrenPaths.indexOf("[...]"), 1); + } + if (this.optionalRestSlugName !== null) { + childrenPaths.splice(childrenPaths.indexOf("[[...]]"), 1); + } + const routes = childrenPaths.map((c) => this.children.get(c)._smoosh(`${prefix}${c}/`)).reduce((prev, curr) => [ + ...prev, + ...curr + ], []); + if (this.slugName !== null) { + routes.push(...this.children.get("[]")._smoosh(`${prefix}[${this.slugName}]/`)); + } + if (!this.placeholder) { + const r = prefix === "/" ? "/" : prefix.slice(0, -1); + if (this.optionalRestSlugName != null) { + throw Object.defineProperty(new Error(`You cannot define a route with the same specificity as a optional catch-all route ("${r}" and "${r}[[...${this.optionalRestSlugName}]]").`), "__NEXT_ERROR_CODE", { + value: "E458", + enumerable: false, + configurable: true + }); + } + routes.unshift(r); + } + if (this.restSlugName !== null) { + routes.push(...this.children.get("[...]")._smoosh(`${prefix}[...${this.restSlugName}]/`)); + } + if (this.optionalRestSlugName !== null) { + routes.push(...this.children.get("[[...]]")._smoosh(`${prefix}[[...${this.optionalRestSlugName}]]/`)); + } + return routes; + } + _insert(urlPaths, slugNames, isCatchAll) { + if (urlPaths.length === 0) { + this.placeholder = false; + return; + } + if (isCatchAll) { + throw Object.defineProperty(new Error(`Catch-all must be the last part of the URL.`), "__NEXT_ERROR_CODE", { + value: "E392", + enumerable: false, + configurable: true + }); + } + let nextSegment = urlPaths[0]; + if (nextSegment.startsWith("[") && nextSegment.endsWith("]")) { + let handleSlug = function(previousSlug, nextSlug) { + if (previousSlug !== null) { + if (previousSlug !== nextSlug) { + throw Object.defineProperty(new Error(`You cannot use different slug names for the same dynamic path ('${previousSlug}' !== '${nextSlug}').`), "__NEXT_ERROR_CODE", { + value: "E337", + enumerable: false, + configurable: true + }); + } + } + slugNames.forEach((slug) => { + if (slug === nextSlug) { + throw Object.defineProperty(new Error(`You cannot have the same slug name "${nextSlug}" repeat within a single dynamic path`), "__NEXT_ERROR_CODE", { + value: "E247", + enumerable: false, + configurable: true + }); + } + if (slug.replace(/\W/g, "") === nextSegment.replace(/\W/g, "")) { + throw Object.defineProperty(new Error(`You cannot have the slug names "${slug}" and "${nextSlug}" differ only by non-word symbols within a single dynamic path`), "__NEXT_ERROR_CODE", { + value: "E499", + enumerable: false, + configurable: true + }); + } + }); + slugNames.push(nextSlug); + }; + let segmentName = nextSegment.slice(1, -1); + let isOptional = false; + if (segmentName.startsWith("[") && segmentName.endsWith("]")) { + segmentName = segmentName.slice(1, -1); + isOptional = true; + } + if (segmentName.startsWith("\u2026")) { + throw Object.defineProperty(new Error(`Detected a three-dot character ('\u2026') at ('${segmentName}'). Did you mean ('...')?`), "__NEXT_ERROR_CODE", { + value: "E147", + enumerable: false, + configurable: true + }); + } + if (segmentName.startsWith("...")) { + segmentName = segmentName.substring(3); + isCatchAll = true; + } + if (segmentName.startsWith("[") || segmentName.endsWith("]")) { + throw Object.defineProperty(new Error(`Segment names may not start or end with extra brackets ('${segmentName}').`), "__NEXT_ERROR_CODE", { + value: "E421", + enumerable: false, + configurable: true + }); + } + if (segmentName.startsWith(".")) { + throw Object.defineProperty(new Error(`Segment names may not start with erroneous periods ('${segmentName}').`), "__NEXT_ERROR_CODE", { + value: "E288", + enumerable: false, + configurable: true + }); + } + if (isCatchAll) { + if (isOptional) { + if (this.restSlugName != null) { + throw Object.defineProperty(new Error(`You cannot use both an required and optional catch-all route at the same level ("[...${this.restSlugName}]" and "${urlPaths[0]}" ).`), "__NEXT_ERROR_CODE", { + value: "E299", + enumerable: false, + configurable: true + }); + } + handleSlug(this.optionalRestSlugName, segmentName); + this.optionalRestSlugName = segmentName; + nextSegment = "[[...]]"; + } else { + if (this.optionalRestSlugName != null) { + throw Object.defineProperty(new Error(`You cannot use both an optional and required catch-all route at the same level ("[[...${this.optionalRestSlugName}]]" and "${urlPaths[0]}").`), "__NEXT_ERROR_CODE", { + value: "E300", + enumerable: false, + configurable: true + }); + } + handleSlug(this.restSlugName, segmentName); + this.restSlugName = segmentName; + nextSegment = "[...]"; + } + } else { + if (isOptional) { + throw Object.defineProperty(new Error(`Optional route parameters are not yet supported ("${urlPaths[0]}").`), "__NEXT_ERROR_CODE", { + value: "E435", + enumerable: false, + configurable: true + }); + } + handleSlug(this.slugName, segmentName); + this.slugName = segmentName; + nextSegment = "[]"; + } + } + if (!this.children.has(nextSegment)) { + this.children.set(nextSegment, new _UrlNode()); + } + this.children.get(nextSegment)._insert(urlPaths.slice(1), slugNames, isCatchAll); + } + constructor() { + this.placeholder = true; + this.children = /* @__PURE__ */ new Map(); + this.slugName = null; + this.restSlugName = null; + this.optionalRestSlugName = null; + } + }; + function getSortedRoutes(normalizedPages) { + const root = new UrlNode(); + normalizedPages.forEach((pagePath) => root.insert(pagePath)); + return root.smoosh(); + } + function getSortedRouteObjects(objects, getter) { + const indexes = {}; + const pathnames = []; + for (let i = 0; i < objects.length; i++) { + const pathname = getter(objects[i]); + indexes[pathname] = i; + pathnames[i] = pathname; + } + const sorted = getSortedRoutes(pathnames); + return sorted.map((pathname) => objects[indexes[pathname]]); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js +var require_ensure_leading_slash = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "ensureLeadingSlash", { + enumerable: true, + get: function() { + return ensureLeadingSlash; + } + }); + function ensureLeadingSlash(path) { + return path.startsWith("/") ? path : `/${path}`; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/segment.js +var require_segment = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/segment.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + DEFAULT_SEGMENT_KEY: function() { + return DEFAULT_SEGMENT_KEY; + }, + NOT_FOUND_SEGMENT_KEY: function() { + return NOT_FOUND_SEGMENT_KEY; + }, + PAGE_SEGMENT_KEY: function() { + return PAGE_SEGMENT_KEY; + }, + addSearchParamsIfPageSegment: function() { + return addSearchParamsIfPageSegment; + }, + computeSelectedLayoutSegment: function() { + return computeSelectedLayoutSegment; + }, + getSegmentValue: function() { + return getSegmentValue; + }, + getSelectedLayoutSegmentPath: function() { + return getSelectedLayoutSegmentPath; + }, + isGroupSegment: function() { + return isGroupSegment; + }, + isParallelRouteSegment: function() { + return isParallelRouteSegment; + } + }); + function getSegmentValue(segment) { + return Array.isArray(segment) ? segment[1] : segment; + } + function isGroupSegment(segment) { + return segment[0] === "(" && segment.endsWith(")"); + } + function isParallelRouteSegment(segment) { + return segment.startsWith("@") && segment !== "@children"; + } + function addSearchParamsIfPageSegment(segment, searchParams) { + const isPageSegment = segment.includes(PAGE_SEGMENT_KEY); + if (isPageSegment) { + const stringifiedQuery = JSON.stringify(searchParams); + return stringifiedQuery !== "{}" ? PAGE_SEGMENT_KEY + "?" + stringifiedQuery : PAGE_SEGMENT_KEY; + } + return segment; + } + function computeSelectedLayoutSegment(segments, parallelRouteKey) { + if (!segments || segments.length === 0) { + return null; + } + const rawSegment = parallelRouteKey === "children" ? segments[0] : segments[segments.length - 1]; + return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment; + } + function getSelectedLayoutSegmentPath(tree, parallelRouteKey, first = true, segmentPath = []) { + let node; + if (first) { + node = tree[1][parallelRouteKey]; + } else { + const parallelRoutes = tree[1]; + node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]; + } + if (!node) return segmentPath; + const segment = node[0]; + let segmentValue = getSegmentValue(segment); + if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) { + return segmentPath; + } + segmentPath.push(segmentValue); + return getSelectedLayoutSegmentPath(node, parallelRouteKey, false, segmentPath); + } + var PAGE_SEGMENT_KEY = "__PAGE__"; + var DEFAULT_SEGMENT_KEY = "__DEFAULT__"; + var NOT_FOUND_SEGMENT_KEY = "/_not-found"; + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/app-paths.js +var require_app_paths = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/app-paths.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + compareAppPaths: function() { + return compareAppPaths; + }, + normalizeAppPath: function() { + return normalizeAppPath; + }, + normalizeRscURL: function() { + return normalizeRscURL; + } + }); + var _ensureleadingslash = require_ensure_leading_slash(); + var _segment = require_segment(); + function normalizeAppPath(route) { + return (0, _ensureleadingslash.ensureLeadingSlash)(route.split("/").reduce((pathname, segment, index, segments) => { + if (!segment) { + return pathname; + } + if ((0, _segment.isGroupSegment)(segment)) { + return pathname; + } + if (segment[0] === "@") { + return pathname; + } + if ((segment === "page" || segment === "route") && index === segments.length - 1) { + return pathname; + } + return `${pathname}/${segment}`; + }, "")); + } + function compareAppPaths(a, b) { + const aHasSlot = a.includes("/@"); + const bHasSlot = b.includes("/@"); + if (aHasSlot && !bHasSlot) return -1; + if (!aHasSlot && bHasSlot) return 1; + return a.localeCompare(b); + } + function normalizeRscURL(url) { + return url.replace( + /\.rsc($|\?)/, + // $1 ensures `?` is preserved + "$1" + ); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interception-routes.js +var require_interception_routes = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interception-routes.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + INTERCEPTION_ROUTE_MARKERS: function() { + return INTERCEPTION_ROUTE_MARKERS; + }, + extractInterceptionRouteInformation: function() { + return extractInterceptionRouteInformation; + }, + isInterceptionRouteAppPath: function() { + return isInterceptionRouteAppPath; + } + }); + var _apppaths = require_app_paths(); + var INTERCEPTION_ROUTE_MARKERS = [ + "(..)(..)", + "(.)", + "(..)", + "(...)" + ]; + function isInterceptionRouteAppPath(path) { + return path.split("/").find((segment) => INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))) !== void 0; + } + function extractInterceptionRouteInformation(path) { + let interceptingRoute; + let marker; + let interceptedRoute; + for (const segment of path.split("/")) { + marker = INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m)); + if (marker) { + ; + [interceptingRoute, interceptedRoute] = path.split(marker, 2); + break; + } + } + if (!interceptingRoute || !marker || !interceptedRoute) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Must be in the format //(..|...|..)(..)/`), "__NEXT_ERROR_CODE", { + value: "E269", + enumerable: false, + configurable: true + }); + } + interceptingRoute = (0, _apppaths.normalizeAppPath)(interceptingRoute); + switch (marker) { + case "(.)": + if (interceptingRoute === "/") { + interceptedRoute = `/${interceptedRoute}`; + } else { + interceptedRoute = interceptingRoute + "/" + interceptedRoute; + } + break; + case "(..)": + if (interceptingRoute === "/") { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`), "__NEXT_ERROR_CODE", { + value: "E207", + enumerable: false, + configurable: true + }); + } + interceptedRoute = interceptingRoute.split("/").slice(0, -1).concat(interceptedRoute).join("/"); + break; + case "(...)": + interceptedRoute = "/" + interceptedRoute; + break; + case "(..)(..)": + const splitInterceptingRoute = interceptingRoute.split("/"); + if (splitInterceptingRoute.length <= 2) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`), "__NEXT_ERROR_CODE", { + value: "E486", + enumerable: false, + configurable: true + }); + } + interceptedRoute = splitInterceptingRoute.slice(0, -2).concat(interceptedRoute).join("/"); + break; + default: + throw Object.defineProperty(new Error("Invariant: unexpected marker"), "__NEXT_ERROR_CODE", { + value: "E112", + enumerable: false, + configurable: true + }); + } + return { + interceptingRoute, + interceptedRoute + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js +var require_is_dynamic = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/is-dynamic.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "isDynamicRoute", { + enumerable: true, + get: function() { + return isDynamicRoute; + } + }); + var _interceptionroutes = require_interception_routes(); + var TEST_ROUTE = /\/[^/]*\[[^/]+\][^/]*(?=\/|$)/; + var TEST_STRICT_ROUTE = /\/\[[^/]+\](?=\/|$)/; + function isDynamicRoute(route, strict = true) { + if ((0, _interceptionroutes.isInterceptionRouteAppPath)(route)) { + route = (0, _interceptionroutes.extractInterceptionRouteInformation)(route).interceptedRoute; + } + if (strict) { + return TEST_STRICT_ROUTE.test(route); + } + return TEST_ROUTE.test(route); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/index.js +var require_utils2 = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + getSortedRouteObjects: function() { + return _sortedroutes.getSortedRouteObjects; + }, + getSortedRoutes: function() { + return _sortedroutes.getSortedRoutes; + }, + isDynamicRoute: function() { + return _isdynamic.isDynamicRoute; + } + }); + var _sortedroutes = require_sorted_routes(); + var _isdynamic = require_is_dynamic(); + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/compiled/path-to-regexp/index.js +var require_path_to_regexp = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/compiled/path-to-regexp/index.js"(exports, module) { + "use strict"; + (() => { + "use strict"; + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = __dirname + "/"; + var e = {}; + (() => { + var n = e; + Object.defineProperty(n, "__esModule", { value: true }); + n.pathToRegexp = n.tokensToRegexp = n.regexpToFunction = n.match = n.tokensToFunction = n.compile = n.parse = void 0; + function lexer(e2) { + var n2 = []; + var r = 0; + while (r < e2.length) { + var t = e2[r]; + if (t === "*" || t === "+" || t === "?") { + n2.push({ type: "MODIFIER", index: r, value: e2[r++] }); + continue; + } + if (t === "\\") { + n2.push({ type: "ESCAPED_CHAR", index: r++, value: e2[r++] }); + continue; + } + if (t === "{") { + n2.push({ type: "OPEN", index: r, value: e2[r++] }); + continue; + } + if (t === "}") { + n2.push({ type: "CLOSE", index: r, value: e2[r++] }); + continue; + } + if (t === ":") { + var a = ""; + var i = r + 1; + while (i < e2.length) { + var o = e2.charCodeAt(i); + if (o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 || o === 95) { + a += e2[i++]; + continue; + } + break; + } + if (!a) throw new TypeError("Missing parameter name at ".concat(r)); + n2.push({ type: "NAME", index: r, value: a }); + r = i; + continue; + } + if (t === "(") { + var c = 1; + var f = ""; + var i = r + 1; + if (e2[i] === "?") { + throw new TypeError('Pattern cannot start with "?" at '.concat(i)); + } + while (i < e2.length) { + if (e2[i] === "\\") { + f += e2[i++] + e2[i++]; + continue; + } + if (e2[i] === ")") { + c--; + if (c === 0) { + i++; + break; + } + } else if (e2[i] === "(") { + c++; + if (e2[i + 1] !== "?") { + throw new TypeError("Capturing groups are not allowed at ".concat(i)); + } + } + f += e2[i++]; + } + if (c) throw new TypeError("Unbalanced pattern at ".concat(r)); + if (!f) throw new TypeError("Missing pattern at ".concat(r)); + n2.push({ type: "PATTERN", index: r, value: f }); + r = i; + continue; + } + n2.push({ type: "CHAR", index: r, value: e2[r++] }); + } + n2.push({ type: "END", index: r, value: "" }); + return n2; + } + function parse(e2, n2) { + if (n2 === void 0) { + n2 = {}; + } + var r = lexer(e2); + var t = n2.prefixes, a = t === void 0 ? "./" : t, i = n2.delimiter, o = i === void 0 ? "/#?" : i; + var c = []; + var f = 0; + var u = 0; + var p = ""; + var tryConsume = function(e3) { + if (u < r.length && r[u].type === e3) return r[u++].value; + }; + var mustConsume = function(e3) { + var n3 = tryConsume(e3); + if (n3 !== void 0) return n3; + var t2 = r[u], a2 = t2.type, i2 = t2.index; + throw new TypeError("Unexpected ".concat(a2, " at ").concat(i2, ", expected ").concat(e3)); + }; + var consumeText = function() { + var e3 = ""; + var n3; + while (n3 = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) { + e3 += n3; + } + return e3; + }; + var isSafe = function(e3) { + for (var n3 = 0, r2 = o; n3 < r2.length; n3++) { + var t2 = r2[n3]; + if (e3.indexOf(t2) > -1) return true; + } + return false; + }; + var safePattern = function(e3) { + var n3 = c[c.length - 1]; + var r2 = e3 || (n3 && typeof n3 === "string" ? n3 : ""); + if (n3 && !r2) { + throw new TypeError('Must have text between two parameters, missing text after "'.concat(n3.name, '"')); + } + if (!r2 || isSafe(r2)) return "[^".concat(escapeString(o), "]+?"); + return "(?:(?!".concat(escapeString(r2), ")[^").concat(escapeString(o), "])+?"); + }; + while (u < r.length) { + var v = tryConsume("CHAR"); + var s = tryConsume("NAME"); + var d = tryConsume("PATTERN"); + if (s || d) { + var g = v || ""; + if (a.indexOf(g) === -1) { + p += g; + g = ""; + } + if (p) { + c.push(p); + p = ""; + } + c.push({ name: s || f++, prefix: g, suffix: "", pattern: d || safePattern(g), modifier: tryConsume("MODIFIER") || "" }); + continue; + } + var x = v || tryConsume("ESCAPED_CHAR"); + if (x) { + p += x; + continue; + } + if (p) { + c.push(p); + p = ""; + } + var h = tryConsume("OPEN"); + if (h) { + var g = consumeText(); + var l = tryConsume("NAME") || ""; + var m = tryConsume("PATTERN") || ""; + var T = consumeText(); + mustConsume("CLOSE"); + c.push({ name: l || (m ? f++ : ""), pattern: l && !m ? safePattern(g) : m, prefix: g, suffix: T, modifier: tryConsume("MODIFIER") || "" }); + continue; + } + mustConsume("END"); + } + return c; + } + n.parse = parse; + function compile(e2, n2) { + return tokensToFunction(parse(e2, n2), n2); + } + n.compile = compile; + function tokensToFunction(e2, n2) { + if (n2 === void 0) { + n2 = {}; + } + var r = flags(n2); + var t = n2.encode, a = t === void 0 ? function(e3) { + return e3; + } : t, i = n2.validate, o = i === void 0 ? true : i; + var c = e2.map((function(e3) { + if (typeof e3 === "object") { + return new RegExp("^(?:".concat(e3.pattern, ")$"), r); + } + })); + return function(n3) { + var r2 = ""; + for (var t2 = 0; t2 < e2.length; t2++) { + var i2 = e2[t2]; + if (typeof i2 === "string") { + r2 += i2; + continue; + } + var f = n3 ? n3[i2.name] : void 0; + var u = i2.modifier === "?" || i2.modifier === "*"; + var p = i2.modifier === "*" || i2.modifier === "+"; + if (Array.isArray(f)) { + if (!p) { + throw new TypeError('Expected "'.concat(i2.name, '" to not repeat, but got an array')); + } + if (f.length === 0) { + if (u) continue; + throw new TypeError('Expected "'.concat(i2.name, '" to not be empty')); + } + for (var v = 0; v < f.length; v++) { + var s = a(f[v], i2); + if (o && !c[t2].test(s)) { + throw new TypeError('Expected all "'.concat(i2.name, '" to match "').concat(i2.pattern, '", but got "').concat(s, '"')); + } + r2 += i2.prefix + s + i2.suffix; + } + continue; + } + if (typeof f === "string" || typeof f === "number") { + var s = a(String(f), i2); + if (o && !c[t2].test(s)) { + throw new TypeError('Expected "'.concat(i2.name, '" to match "').concat(i2.pattern, '", but got "').concat(s, '"')); + } + r2 += i2.prefix + s + i2.suffix; + continue; + } + if (u) continue; + var d = p ? "an array" : "a string"; + throw new TypeError('Expected "'.concat(i2.name, '" to be ').concat(d)); + } + return r2; + }; + } + n.tokensToFunction = tokensToFunction; + function match(e2, n2) { + var r = []; + var t = pathToRegexp(e2, r, n2); + return regexpToFunction(t, r, n2); + } + n.match = match; + function regexpToFunction(e2, n2, r) { + if (r === void 0) { + r = {}; + } + var t = r.decode, a = t === void 0 ? function(e3) { + return e3; + } : t; + return function(r2) { + var t2 = e2.exec(r2); + if (!t2) return false; + var i = t2[0], o = t2.index; + var c = /* @__PURE__ */ Object.create(null); + var _loop_1 = function(e3) { + if (t2[e3] === void 0) return "continue"; + var r3 = n2[e3 - 1]; + if (r3.modifier === "*" || r3.modifier === "+") { + c[r3.name] = t2[e3].split(r3.prefix + r3.suffix).map((function(e4) { + return a(e4, r3); + })); + } else { + c[r3.name] = a(t2[e3], r3); + } + }; + for (var f = 1; f < t2.length; f++) { + _loop_1(f); + } + return { path: i, index: o, params: c }; + }; + } + n.regexpToFunction = regexpToFunction; + function escapeString(e2) { + return e2.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1"); + } + function flags(e2) { + return e2 && e2.sensitive ? "" : "i"; + } + function regexpToRegexp(e2, n2) { + if (!n2) return e2; + var r = /\((?:\?<(.*?)>)?(?!\?)/g; + var t = 0; + var a = r.exec(e2.source); + while (a) { + n2.push({ name: a[1] || t++, prefix: "", suffix: "", modifier: "", pattern: "" }); + a = r.exec(e2.source); + } + return e2; + } + function arrayToRegexp(e2, n2, r) { + var t = e2.map((function(e3) { + return pathToRegexp(e3, n2, r).source; + })); + return new RegExp("(?:".concat(t.join("|"), ")"), flags(r)); + } + function stringToRegexp(e2, n2, r) { + return tokensToRegexp(parse(e2, r), n2, r); + } + function tokensToRegexp(e2, n2, r) { + if (r === void 0) { + r = {}; + } + var t = r.strict, a = t === void 0 ? false : t, i = r.start, o = i === void 0 ? true : i, c = r.end, f = c === void 0 ? true : c, u = r.encode, p = u === void 0 ? function(e3) { + return e3; + } : u, v = r.delimiter, s = v === void 0 ? "/#?" : v, d = r.endsWith, g = d === void 0 ? "" : d; + var x = "[".concat(escapeString(g), "]|$"); + var h = "[".concat(escapeString(s), "]"); + var l = o ? "^" : ""; + for (var m = 0, T = e2; m < T.length; m++) { + var E = T[m]; + if (typeof E === "string") { + l += escapeString(p(E)); + } else { + var w = escapeString(p(E.prefix)); + var y = escapeString(p(E.suffix)); + if (E.pattern) { + if (n2) n2.push(E); + if (w || y) { + if (E.modifier === "+" || E.modifier === "*") { + var R = E.modifier === "*" ? "?" : ""; + l += "(?:".concat(w, "((?:").concat(E.pattern, ")(?:").concat(y).concat(w, "(?:").concat(E.pattern, "))*)").concat(y, ")").concat(R); + } else { + l += "(?:".concat(w, "(").concat(E.pattern, ")").concat(y, ")").concat(E.modifier); + } + } else { + if (E.modifier === "+" || E.modifier === "*") { + throw new TypeError('Can not repeat "'.concat(E.name, '" without a prefix and suffix')); + } + l += "(".concat(E.pattern, ")").concat(E.modifier); + } + } else { + l += "(?:".concat(w).concat(y, ")").concat(E.modifier); + } + } + } + if (f) { + if (!a) l += "".concat(h, "?"); + l += !r.endsWith ? "$" : "(?=".concat(x, ")"); + } else { + var A = e2[e2.length - 1]; + var _ = typeof A === "string" ? h.indexOf(A[A.length - 1]) > -1 : A === void 0; + if (!a) { + l += "(?:".concat(h, "(?=").concat(x, "))?"); + } + if (!_) { + l += "(?=".concat(h, "|").concat(x, ")"); + } + } + return new RegExp(l, flags(r)); + } + n.tokensToRegexp = tokensToRegexp; + function pathToRegexp(e2, n2, r) { + if (e2 instanceof RegExp) return regexpToRegexp(e2, n2); + if (Array.isArray(e2)) return arrayToRegexp(e2, n2, r); + return stringToRegexp(e2, n2, r); + } + n.pathToRegexp = pathToRegexp; + })(); + module.exports = e; + })(); + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/lib/route-pattern-normalizer.js +var require_route_pattern_normalizer = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/lib/route-pattern-normalizer.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + PARAM_SEPARATOR: function() { + return PARAM_SEPARATOR; + }, + hasAdjacentParameterIssues: function() { + return hasAdjacentParameterIssues; + }, + normalizeAdjacentParameters: function() { + return normalizeAdjacentParameters; + }, + normalizeTokensForRegexp: function() { + return normalizeTokensForRegexp; + }, + stripNormalizedSeparators: function() { + return stripNormalizedSeparators; + }, + stripParameterSeparators: function() { + return stripParameterSeparators; + } + }); + var PARAM_SEPARATOR = "_NEXTSEP_"; + function hasAdjacentParameterIssues(route) { + if (typeof route !== "string") return false; + if (/\/\(\.{1,3}\):[^/\s]+/.test(route)) { + return true; + } + if (/:[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*/.test(route)) { + return true; + } + return false; + } + function normalizeAdjacentParameters(route) { + let normalized = route; + normalized = normalized.replace(/(\([^)]*\)):([^/\s]+)/g, `$1${PARAM_SEPARATOR}:$2`); + normalized = normalized.replace(/:([^:/\s)]+)(?=:)/g, `:$1${PARAM_SEPARATOR}`); + return normalized; + } + function normalizeTokensForRegexp(tokens) { + return tokens.map((token) => { + if (typeof token === "object" && token !== null && // Not all token objects have 'modifier' property (e.g., simple text tokens) + "modifier" in token && // Only repeating modifiers (* or +) cause the validation error + // Other modifiers like '?' (optional) are fine + (token.modifier === "*" || token.modifier === "+") && // Token objects can have different shapes depending on route pattern + "prefix" in token && "suffix" in token && // Both prefix and suffix must be empty strings + // This is what causes the validation error in path-to-regexp + token.prefix === "" && token.suffix === "") { + return { + ...token, + prefix: "/" + }; + } + return token; + }); + } + function stripNormalizedSeparators(pathname) { + return pathname.replace(new RegExp(`\\)${PARAM_SEPARATOR}`, "g"), ")"); + } + function stripParameterSeparators(params) { + const cleaned = {}; + for (const [key, value] of Object.entries(params)) { + if (typeof value === "string") { + cleaned[key] = value.replace(new RegExp(`^${PARAM_SEPARATOR}`), ""); + } else if (Array.isArray(value)) { + cleaned[key] = value.map((item) => typeof item === "string" ? item.replace(new RegExp(`^${PARAM_SEPARATOR}`), "") : item); + } else { + cleaned[key] = value; + } + } + return cleaned; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-match-utils.js +var require_route_match_utils = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-match-utils.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + safeCompile: function() { + return safeCompile; + }, + safePathToRegexp: function() { + return safePathToRegexp; + }, + safeRegexpToFunction: function() { + return safeRegexpToFunction; + }, + safeRouteMatcher: function() { + return safeRouteMatcher; + } + }); + var _pathtoregexp = require_path_to_regexp(); + var _routepatternnormalizer = require_route_pattern_normalizer(); + function safePathToRegexp(route, keys, options) { + if (typeof route !== "string") { + return (0, _pathtoregexp.pathToRegexp)(route, keys, options); + } + const needsNormalization = (0, _routepatternnormalizer.hasAdjacentParameterIssues)(route); + const routeToUse = needsNormalization ? (0, _routepatternnormalizer.normalizeAdjacentParameters)(route) : route; + try { + return (0, _pathtoregexp.pathToRegexp)(routeToUse, keys, options); + } catch (error) { + if (!needsNormalization) { + try { + const normalizedRoute = (0, _routepatternnormalizer.normalizeAdjacentParameters)(route); + return (0, _pathtoregexp.pathToRegexp)(normalizedRoute, keys, options); + } catch (retryError) { + throw error; + } + } + throw error; + } + } + function safeCompile(route, options) { + const needsNormalization = (0, _routepatternnormalizer.hasAdjacentParameterIssues)(route); + const routeToUse = needsNormalization ? (0, _routepatternnormalizer.normalizeAdjacentParameters)(route) : route; + try { + const compiler = (0, _pathtoregexp.compile)(routeToUse, options); + if (needsNormalization) { + return (params) => { + return (0, _routepatternnormalizer.stripNormalizedSeparators)(compiler(params)); + }; + } + return compiler; + } catch (error) { + if (!needsNormalization) { + try { + const normalizedRoute = (0, _routepatternnormalizer.normalizeAdjacentParameters)(route); + const compiler = (0, _pathtoregexp.compile)(normalizedRoute, options); + return (params) => { + return (0, _routepatternnormalizer.stripNormalizedSeparators)(compiler(params)); + }; + } catch (retryError) { + throw error; + } + } + throw error; + } + } + function safeRegexpToFunction(regexp, keys) { + const originalMatcher = (0, _pathtoregexp.regexpToFunction)(regexp, keys || []); + return (pathname) => { + const result = originalMatcher(pathname); + if (!result) return false; + return { + ...result, + params: (0, _routepatternnormalizer.stripParameterSeparators)(result.params) + }; + }; + } + function safeRouteMatcher(matcherFn) { + return (pathname) => { + const result = matcherFn(pathname); + if (!result) return false; + return (0, _routepatternnormalizer.stripParameterSeparators)(result); + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-matcher.js +var require_route_matcher = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-matcher.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "getRouteMatcher", { + enumerable: true, + get: function() { + return getRouteMatcher; + } + }); + var _utils = require_utils(); + var _routematchutils = require_route_match_utils(); + function getRouteMatcher({ re, groups }) { + const rawMatcher = (pathname) => { + const routeMatch = re.exec(pathname); + if (!routeMatch) return false; + const decode = (param) => { + try { + return decodeURIComponent(param); + } catch { + throw Object.defineProperty(new _utils.DecodeError("failed to decode param"), "__NEXT_ERROR_CODE", { + value: "E528", + enumerable: false, + configurable: true + }); + } + }; + const params = {}; + for (const [key, group] of Object.entries(groups)) { + const match = routeMatch[group.pos]; + if (match !== void 0) { + if (group.repeat) { + params[key] = match.split("/").map((entry) => decode(entry)); + } else { + params[key] = decode(match); + } + } + } + return params; + }; + return (0, _routematchutils.safeRouteMatcher)(rawMatcher); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/lib/constants.js +var require_constants = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/lib/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + ACTION_SUFFIX: function() { + return ACTION_SUFFIX; + }, + APP_DIR_ALIAS: function() { + return APP_DIR_ALIAS; + }, + CACHE_ONE_YEAR_SECONDS: function() { + return CACHE_ONE_YEAR_SECONDS; + }, + DOT_NEXT_ALIAS: function() { + return DOT_NEXT_ALIAS; + }, + ESLINT_DEFAULT_DIRS: function() { + return ESLINT_DEFAULT_DIRS; + }, + GSP_NO_RETURNED_VALUE: function() { + return GSP_NO_RETURNED_VALUE; + }, + GSSP_COMPONENT_MEMBER_ERROR: function() { + return GSSP_COMPONENT_MEMBER_ERROR; + }, + GSSP_NO_RETURNED_VALUE: function() { + return GSSP_NO_RETURNED_VALUE; + }, + HTML_CONTENT_TYPE_HEADER: function() { + return HTML_CONTENT_TYPE_HEADER; + }, + INFINITE_CACHE: function() { + return INFINITE_CACHE; + }, + INSTRUMENTATION_HOOK_FILENAME: function() { + return INSTRUMENTATION_HOOK_FILENAME; + }, + JSON_CONTENT_TYPE_HEADER: function() { + return JSON_CONTENT_TYPE_HEADER; + }, + MATCHED_PATH_HEADER: function() { + return MATCHED_PATH_HEADER; + }, + MIDDLEWARE_FILENAME: function() { + return MIDDLEWARE_FILENAME; + }, + MIDDLEWARE_LOCATION_REGEXP: function() { + return MIDDLEWARE_LOCATION_REGEXP; + }, + NEXT_BODY_SUFFIX: function() { + return NEXT_BODY_SUFFIX; + }, + NEXT_CACHE_IMPLICIT_TAG_ID: function() { + return NEXT_CACHE_IMPLICIT_TAG_ID; + }, + NEXT_CACHE_REVALIDATED_TAGS_HEADER: function() { + return NEXT_CACHE_REVALIDATED_TAGS_HEADER; + }, + NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER: function() { + return NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER; + }, + NEXT_CACHE_ROOT_PARAM_TAG_ID: function() { + return NEXT_CACHE_ROOT_PARAM_TAG_ID; + }, + NEXT_CACHE_SOFT_TAG_MAX_LENGTH: function() { + return NEXT_CACHE_SOFT_TAG_MAX_LENGTH; + }, + NEXT_CACHE_TAGS_HEADER: function() { + return NEXT_CACHE_TAGS_HEADER; + }, + NEXT_CACHE_TAG_MAX_ITEMS: function() { + return NEXT_CACHE_TAG_MAX_ITEMS; + }, + NEXT_CACHE_TAG_MAX_LENGTH: function() { + return NEXT_CACHE_TAG_MAX_LENGTH; + }, + NEXT_DATA_SUFFIX: function() { + return NEXT_DATA_SUFFIX; + }, + NEXT_INTERCEPTION_MARKER_PREFIX: function() { + return NEXT_INTERCEPTION_MARKER_PREFIX; + }, + NEXT_META_SUFFIX: function() { + return NEXT_META_SUFFIX; + }, + NEXT_NAV_DEPLOYMENT_ID_HEADER: function() { + return NEXT_NAV_DEPLOYMENT_ID_HEADER; + }, + NEXT_QUERY_PARAM_PREFIX: function() { + return NEXT_QUERY_PARAM_PREFIX; + }, + NEXT_RESUME_HEADER: function() { + return NEXT_RESUME_HEADER; + }, + NEXT_RESUME_STATE_LENGTH_HEADER: function() { + return NEXT_RESUME_STATE_LENGTH_HEADER; + }, + NON_STANDARD_NODE_ENV: function() { + return NON_STANDARD_NODE_ENV; + }, + PAGES_DIR_ALIAS: function() { + return PAGES_DIR_ALIAS; + }, + PRERENDER_REVALIDATE_HEADER: function() { + return PRERENDER_REVALIDATE_HEADER; + }, + PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER: function() { + return PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER; + }, + PROXY_FILENAME: function() { + return PROXY_FILENAME; + }, + PROXY_LOCATION_REGEXP: function() { + return PROXY_LOCATION_REGEXP; + }, + PUBLIC_DIR_MIDDLEWARE_CONFLICT: function() { + return PUBLIC_DIR_MIDDLEWARE_CONFLICT; + }, + ROOT_DIR_ALIAS: function() { + return ROOT_DIR_ALIAS; + }, + RSC_ACTION_CLIENT_WRAPPER_ALIAS: function() { + return RSC_ACTION_CLIENT_WRAPPER_ALIAS; + }, + RSC_ACTION_ENCRYPTION_ALIAS: function() { + return RSC_ACTION_ENCRYPTION_ALIAS; + }, + RSC_ACTION_PROXY_ALIAS: function() { + return RSC_ACTION_PROXY_ALIAS; + }, + RSC_ACTION_VALIDATE_ALIAS: function() { + return RSC_ACTION_VALIDATE_ALIAS; + }, + RSC_CACHE_WRAPPER_ALIAS: function() { + return RSC_CACHE_WRAPPER_ALIAS; + }, + RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS: function() { + return RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS; + }, + RSC_MOD_REF_PROXY_ALIAS: function() { + return RSC_MOD_REF_PROXY_ALIAS; + }, + RSC_SEGMENTS_DIR_SUFFIX: function() { + return RSC_SEGMENTS_DIR_SUFFIX; + }, + RSC_SEGMENT_SUFFIX: function() { + return RSC_SEGMENT_SUFFIX; + }, + RSC_SUFFIX: function() { + return RSC_SUFFIX; + }, + SERVER_PROPS_EXPORT_ERROR: function() { + return SERVER_PROPS_EXPORT_ERROR; + }, + SERVER_PROPS_GET_INIT_PROPS_CONFLICT: function() { + return SERVER_PROPS_GET_INIT_PROPS_CONFLICT; + }, + SERVER_PROPS_SSG_CONFLICT: function() { + return SERVER_PROPS_SSG_CONFLICT; + }, + SERVER_RUNTIME: function() { + return SERVER_RUNTIME; + }, + SSG_FALLBACK_EXPORT_ERROR: function() { + return SSG_FALLBACK_EXPORT_ERROR; + }, + SSG_GET_INITIAL_PROPS_CONFLICT: function() { + return SSG_GET_INITIAL_PROPS_CONFLICT; + }, + STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR: function() { + return STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR; + }, + TEXT_PLAIN_CONTENT_TYPE_HEADER: function() { + return TEXT_PLAIN_CONTENT_TYPE_HEADER; + }, + UNSTABLE_REVALIDATE_RENAME_ERROR: function() { + return UNSTABLE_REVALIDATE_RENAME_ERROR; + }, + WEBPACK_LAYERS: function() { + return WEBPACK_LAYERS; + }, + WEBPACK_RESOURCE_QUERIES: function() { + return WEBPACK_RESOURCE_QUERIES; + }, + WEB_SOCKET_MAX_RECONNECTIONS: function() { + return WEB_SOCKET_MAX_RECONNECTIONS; + } + }); + var TEXT_PLAIN_CONTENT_TYPE_HEADER = "text/plain"; + var HTML_CONTENT_TYPE_HEADER = "text/html; charset=utf-8"; + var JSON_CONTENT_TYPE_HEADER = "application/json; charset=utf-8"; + var NEXT_QUERY_PARAM_PREFIX = "nxtP"; + var NEXT_INTERCEPTION_MARKER_PREFIX = "nxtI"; + var MATCHED_PATH_HEADER = "x-matched-path"; + var PRERENDER_REVALIDATE_HEADER = "x-prerender-revalidate"; + var PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER = "x-prerender-revalidate-if-generated"; + var RSC_SEGMENTS_DIR_SUFFIX = ".segments"; + var RSC_SEGMENT_SUFFIX = ".segment.rsc"; + var RSC_SUFFIX = ".rsc"; + var ACTION_SUFFIX = ".action"; + var NEXT_DATA_SUFFIX = ".json"; + var NEXT_META_SUFFIX = ".meta"; + var NEXT_BODY_SUFFIX = ".body"; + var NEXT_NAV_DEPLOYMENT_ID_HEADER = "x-nextjs-deployment-id"; + var NEXT_CACHE_TAGS_HEADER = "x-next-cache-tags"; + var NEXT_CACHE_REVALIDATED_TAGS_HEADER = "x-next-revalidated-tags"; + var NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER = "x-next-revalidate-tag-token"; + var NEXT_RESUME_HEADER = "next-resume"; + var NEXT_RESUME_STATE_LENGTH_HEADER = "x-next-resume-state-length"; + var NEXT_CACHE_TAG_MAX_ITEMS = 128; + var NEXT_CACHE_TAG_MAX_LENGTH = 256; + var NEXT_CACHE_SOFT_TAG_MAX_LENGTH = 1024; + var NEXT_CACHE_IMPLICIT_TAG_ID = "_N_T_"; + var NEXT_CACHE_ROOT_PARAM_TAG_ID = "_N_RP_"; + var CACHE_ONE_YEAR_SECONDS = 31536e3; + var INFINITE_CACHE = 4294967294; + var MIDDLEWARE_FILENAME = "middleware"; + var MIDDLEWARE_LOCATION_REGEXP = `(?:src/)?${MIDDLEWARE_FILENAME}`; + var PROXY_FILENAME = "proxy"; + var PROXY_LOCATION_REGEXP = `(?:src/)?${PROXY_FILENAME}`; + var INSTRUMENTATION_HOOK_FILENAME = "instrumentation"; + var PAGES_DIR_ALIAS = "private-next-pages"; + var DOT_NEXT_ALIAS = "private-dot-next"; + var ROOT_DIR_ALIAS = "private-next-root-dir"; + var APP_DIR_ALIAS = "private-next-app-dir"; + var RSC_MOD_REF_PROXY_ALIAS = "private-next-rsc-mod-ref-proxy"; + var RSC_ACTION_VALIDATE_ALIAS = "private-next-rsc-action-validate"; + var RSC_ACTION_PROXY_ALIAS = "private-next-rsc-server-reference"; + var RSC_CACHE_WRAPPER_ALIAS = "private-next-rsc-cache-wrapper"; + var RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS = "private-next-rsc-track-dynamic-import"; + var RSC_ACTION_ENCRYPTION_ALIAS = "private-next-rsc-action-encryption"; + var RSC_ACTION_CLIENT_WRAPPER_ALIAS = "private-next-rsc-action-client-wrapper"; + var PUBLIC_DIR_MIDDLEWARE_CONFLICT = `You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict`; + var SSG_GET_INITIAL_PROPS_CONFLICT = `You can not use getInitialProps with getStaticProps. To use SSG, please remove your getInitialProps`; + var SERVER_PROPS_GET_INIT_PROPS_CONFLICT = `You can not use getInitialProps with getServerSideProps. Please remove getInitialProps.`; + var SERVER_PROPS_SSG_CONFLICT = `You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps`; + var STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR = `can not have getInitialProps/getServerSideProps, https://nextjs.org/docs/messages/404-get-initial-props`; + var SERVER_PROPS_EXPORT_ERROR = `pages with \`getServerSideProps\` can not be exported. See more info here: https://nextjs.org/docs/messages/gssp-export`; + var GSP_NO_RETURNED_VALUE = "Your `getStaticProps` function did not return an object. Did you forget to add a `return`?"; + var GSSP_NO_RETURNED_VALUE = "Your `getServerSideProps` function did not return an object. Did you forget to add a `return`?"; + var UNSTABLE_REVALIDATE_RENAME_ERROR = "The `unstable_revalidate` property is available for general use.\nPlease use `revalidate` instead."; + var GSSP_COMPONENT_MEMBER_ERROR = `can not be attached to a page's component and must be exported from the page. See more info here: https://nextjs.org/docs/messages/gssp-component-member`; + var NON_STANDARD_NODE_ENV = `You are using a non-standard "NODE_ENV" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://nextjs.org/docs/messages/non-standard-node-env`; + var SSG_FALLBACK_EXPORT_ERROR = `Pages with \`fallback\` enabled in \`getStaticPaths\` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export`; + var ESLINT_DEFAULT_DIRS = [ + "app", + "pages", + "components", + "lib", + "src" + ]; + var SERVER_RUNTIME = { + edge: "edge", + experimentalEdge: "experimental-edge", + nodejs: "nodejs" + }; + var WEB_SOCKET_MAX_RECONNECTIONS = 12; + var WEBPACK_LAYERS_NAMES = { + /** + * The layer for the shared code between the client and server bundles. + */ + shared: "shared", + /** + * The layer for server-only runtime and picking up `react-server` export conditions. + * Including app router RSC pages and app router custom routes and metadata routes. + */ + reactServerComponents: "rsc", + /** + * Server Side Rendering layer for app (ssr). + */ + serverSideRendering: "ssr", + /** + * The browser client bundle layer for actions. + */ + actionBrowser: "action-browser", + /** + * The Node.js bundle layer for the API routes. + */ + apiNode: "api-node", + /** + * The Edge Lite bundle layer for the API routes. + */ + apiEdge: "api-edge", + /** + * The layer for the middleware code. + */ + middleware: "middleware", + /** + * The layer for the instrumentation hooks. + */ + instrument: "instrument", + /** + * The layer for assets on the edge. + */ + edgeAsset: "edge-asset", + /** + * The browser client bundle layer for App directory. + */ + appPagesBrowser: "app-pages-browser", + /** + * The browser client bundle layer for Pages directory. + */ + pagesDirBrowser: "pages-dir-browser", + /** + * The Edge Lite bundle layer for Pages directory. + */ + pagesDirEdge: "pages-dir-edge", + /** + * The Node.js bundle layer for Pages directory. + */ + pagesDirNode: "pages-dir-node" + }; + var WEBPACK_LAYERS = { + ...WEBPACK_LAYERS_NAMES, + GROUP: { + builtinReact: [ + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.actionBrowser + ], + serverOnly: [ + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.actionBrowser, + WEBPACK_LAYERS_NAMES.instrument, + WEBPACK_LAYERS_NAMES.middleware + ], + neutralTarget: [ + // pages api + WEBPACK_LAYERS_NAMES.apiNode, + WEBPACK_LAYERS_NAMES.apiEdge + ], + clientOnly: [ + WEBPACK_LAYERS_NAMES.serverSideRendering, + WEBPACK_LAYERS_NAMES.appPagesBrowser + ], + bundled: [ + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.actionBrowser, + WEBPACK_LAYERS_NAMES.serverSideRendering, + WEBPACK_LAYERS_NAMES.appPagesBrowser, + WEBPACK_LAYERS_NAMES.shared, + WEBPACK_LAYERS_NAMES.instrument, + WEBPACK_LAYERS_NAMES.middleware + ], + appPages: [ + // app router pages and layouts + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.serverSideRendering, + WEBPACK_LAYERS_NAMES.appPagesBrowser, + WEBPACK_LAYERS_NAMES.actionBrowser + ] + } + }; + var WEBPACK_RESOURCE_QUERIES = { + edgeSSREntry: "__next_edge_ssr_entry__", + metadata: "__next_metadata__", + metadataRoute: "__next_metadata_route__", + metadataImageMeta: "__next_metadata_image_meta__" + }; + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/escape-regexp.js +var require_escape_regexp = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/escape-regexp.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "escapeStringRegexp", { + enumerable: true, + get: function() { + return escapeStringRegexp; + } + }); + var reHasRegExp = /[|\\{}()[\]^$+*?.-]/; + var reReplaceRegExp = /[|\\{}()[\]^$+*?.-]/g; + function escapeStringRegexp(str) { + if (reHasRegExp.test(str)) { + return str.replace(reReplaceRegExp, "\\$&"); + } + return str; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/invariant-error.js +var require_invariant_error = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/invariant-error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "InvariantError", { + enumerable: true, + get: function() { + return InvariantError; + } + }); + var InvariantError = class extends Error { + constructor(message, options) { + super(`Invariant: ${message.endsWith(".") ? message : message + "."} This is a bug in Next.js.`, options); + this.name = "InvariantError"; + } + }; + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js +var require_parse_loader_tree = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "parseLoaderTree", { + enumerable: true, + get: function() { + return parseLoaderTree; + } + }); + var _segment = require_segment(); + function parseLoaderTree(tree) { + const [segment, parallelRoutes, modules, staticSiblings] = tree; + const { layout, template } = modules; + let { page } = modules; + page = segment === _segment.DEFAULT_SEGMENT_KEY ? modules.defaultPage : page; + const conventionPath = layout?.[1] || template?.[1] || page?.[1]; + return { + page, + segment, + modules, + /* it can be either layout / template / page */ + conventionPath, + parallelRoutes, + staticSiblings + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/get-segment-param.js +var require_get_segment_param = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/get-segment-param.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + getParamProperties: function() { + return getParamProperties; + }, + getSegmentParam: function() { + return getSegmentParam; + }, + isCatchAll: function() { + return isCatchAll; + } + }); + var _interceptionroutes = require_interception_routes(); + function getSegmentParam(segment) { + const interceptionMarker = _interceptionroutes.INTERCEPTION_ROUTE_MARKERS.find((marker) => segment.startsWith(marker)); + if (interceptionMarker) { + segment = segment.slice(interceptionMarker.length); + } + if (segment.startsWith("[[...") && segment.endsWith("]]")) { + return { + // TODO-APP: Optional catchall does not currently work with parallel routes, + // so for now aren't handling a potential interception marker. + paramType: "optional-catchall", + paramName: segment.slice(5, -2) + }; + } + if (segment.startsWith("[...") && segment.endsWith("]")) { + return { + paramType: interceptionMarker ? `catchall-intercepted-${interceptionMarker}` : "catchall", + paramName: segment.slice(4, -1) + }; + } + if (segment.startsWith("[") && segment.endsWith("]")) { + return { + paramType: interceptionMarker ? `dynamic-intercepted-${interceptionMarker}` : "dynamic", + paramName: segment.slice(1, -1) + }; + } + return null; + } + function isCatchAll(type) { + return type === "catchall" || type === "catchall-intercepted-(..)(..)" || type === "catchall-intercepted-(.)" || type === "catchall-intercepted-(..)" || type === "catchall-intercepted-(...)" || type === "optional-catchall"; + } + function getParamProperties(paramType) { + let repeat = false; + let optional = false; + switch (paramType) { + case "catchall": + case "catchall-intercepted-(..)(..)": + case "catchall-intercepted-(.)": + case "catchall-intercepted-(..)": + case "catchall-intercepted-(...)": + repeat = true; + break; + case "optional-catchall": + repeat = true; + optional = true; + break; + case "dynamic": + case "dynamic-intercepted-(..)(..)": + case "dynamic-intercepted-(.)": + case "dynamic-intercepted-(..)": + case "dynamic-intercepted-(...)": + break; + default: + paramType; + } + return { + repeat, + optional + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/routes/app.js +var require_app = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/routes/app.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + isInterceptionAppRoute: function() { + return isInterceptionAppRoute; + }, + isNormalizedAppRoute: function() { + return isNormalizedAppRoute; + }, + parseAppRoute: function() { + return parseAppRoute; + }, + parseAppRouteSegment: function() { + return parseAppRouteSegment; + } + }); + var _invarianterror = require_invariant_error(); + var _getsegmentparam = require_get_segment_param(); + var _interceptionroutes = require_interception_routes(); + function normalizeEncodedDynamicPlaceholder(segment) { + if (!/%5b|%5d/i.test(segment)) { + return segment; + } + try { + const decodedSegment = decodeURIComponent(segment); + return (0, _getsegmentparam.getSegmentParam)(decodedSegment) ? decodedSegment : segment; + } catch { + return segment; + } + } + function parseAppRouteSegment(segment) { + if (segment === "") { + return null; + } + const interceptionMarker = _interceptionroutes.INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m)); + const param = (0, _getsegmentparam.getSegmentParam)(segment); + if (param) { + return { + type: "dynamic", + name: segment, + param, + interceptionMarker + }; + } else if (segment.startsWith("(") && segment.endsWith(")")) { + return { + type: "route-group", + name: segment, + interceptionMarker + }; + } else if (segment.startsWith("@")) { + return { + type: "parallel-route", + name: segment, + interceptionMarker + }; + } else { + return { + type: "static", + name: segment, + interceptionMarker + }; + } + } + function isNormalizedAppRoute(route) { + return route.normalized; + } + function isInterceptionAppRoute(route) { + return route.interceptionMarker !== void 0 && route.interceptingRoute !== void 0 && route.interceptedRoute !== void 0; + } + function parseAppRoute(pathname, normalized) { + const pathnameSegments = pathname.split("/").filter(Boolean); + const segments = []; + let interceptionMarker; + let interceptingRoute; + let interceptedRoute; + for (const segment of pathnameSegments) { + const normalizedSegment = normalizeEncodedDynamicPlaceholder(segment); + const appSegment = parseAppRouteSegment(normalizedSegment); + if (!appSegment) { + continue; + } + if (normalized && (appSegment.type === "route-group" || appSegment.type === "parallel-route")) { + throw Object.defineProperty(new _invarianterror.InvariantError(`${pathname} is being parsed as a normalized route, but it has a route group or parallel route segment.`), "__NEXT_ERROR_CODE", { + value: "E923", + enumerable: false, + configurable: true + }); + } + segments.push(appSegment); + if (appSegment.interceptionMarker) { + const parts = pathname.split(appSegment.interceptionMarker); + if (parts.length !== 2) { + throw Object.defineProperty(new Error(`Invalid interception route: ${pathname}`), "__NEXT_ERROR_CODE", { + value: "E924", + enumerable: false, + configurable: true + }); + } + interceptingRoute = normalized ? parseAppRoute(parts[0], true) : parseAppRoute(parts[0], false); + interceptedRoute = normalized ? parseAppRoute(parts[1], true) : parseAppRoute(parts[1], false); + interceptionMarker = appSegment.interceptionMarker; + } + } + const dynamicSegments = segments.filter((segment) => segment.type === "dynamic"); + return { + normalized, + pathname, + segments, + dynamicSegments, + interceptionMarker, + interceptingRoute, + interceptedRoute + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interception-prefix-from-param-type.js +var require_interception_prefix_from_param_type = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interception-prefix-from-param-type.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "interceptionPrefixFromParamType", { + enumerable: true, + get: function() { + return interceptionPrefixFromParamType; + } + }); + function interceptionPrefixFromParamType(paramType) { + switch (paramType) { + case "catchall-intercepted-(..)(..)": + case "dynamic-intercepted-(..)(..)": + return "(..)(..)"; + case "catchall-intercepted-(.)": + case "dynamic-intercepted-(.)": + return "(.)"; + case "catchall-intercepted-(..)": + case "dynamic-intercepted-(..)": + return "(..)"; + case "catchall-intercepted-(...)": + case "dynamic-intercepted-(...)": + return "(...)"; + case "catchall": + case "dynamic": + case "optional-catchall": + default: + return null; + } + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/resolve-param-value.js +var require_resolve_param_value = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/resolve-param-value.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "resolveParamValue", { + enumerable: true, + get: function() { + return resolveParamValue; + } + }); + var _invarianterror = require_invariant_error(); + var _interceptionprefixfromparamtype = require_interception_prefix_from_param_type(); + function getParamValueFromSegment(pathSegment, params, paramType) { + if (pathSegment.type === "dynamic") { + return params[pathSegment.param.paramName]; + } + const interceptionPrefix = (0, _interceptionprefixfromparamtype.interceptionPrefixFromParamType)(paramType); + if (interceptionPrefix === pathSegment.interceptionMarker) { + return pathSegment.name.replace(pathSegment.interceptionMarker, ""); + } + return pathSegment.name; + } + function resolveParamValue(paramName, paramType, depth, route, params) { + switch (paramType) { + case "catchall": + case "optional-catchall": + case "catchall-intercepted-(..)(..)": + case "catchall-intercepted-(.)": + case "catchall-intercepted-(..)": + case "catchall-intercepted-(...)": + const processedSegments = []; + for (let index = depth; index < route.segments.length; index++) { + const pathSegment = route.segments[index]; + if (pathSegment.type === "static") { + let value = pathSegment.name; + const interceptionPrefix = (0, _interceptionprefixfromparamtype.interceptionPrefixFromParamType)(paramType); + if (interceptionPrefix && index === depth && interceptionPrefix === pathSegment.interceptionMarker) { + value = value.replace(pathSegment.interceptionMarker, ""); + } + processedSegments.push(value); + } else { + if (!params.hasOwnProperty(pathSegment.param.paramName)) { + if (pathSegment.param.paramType === "optional-catchall") { + break; + } + return void 0; + } + const paramValue = params[pathSegment.param.paramName]; + if (Array.isArray(paramValue)) { + processedSegments.push(...paramValue); + } else { + processedSegments.push(paramValue); + } + } + } + if (processedSegments.length > 0) { + return processedSegments; + } else if (paramType === "optional-catchall") { + return void 0; + } else { + throw Object.defineProperty(new _invarianterror.InvariantError(`Unexpected empty path segments match for a route "${route.pathname}" with param "${paramName}" of type "${paramType}"`), "__NEXT_ERROR_CODE", { + value: "E931", + enumerable: false, + configurable: true + }); + } + case "dynamic": + case "dynamic-intercepted-(..)(..)": + case "dynamic-intercepted-(.)": + case "dynamic-intercepted-(..)": + case "dynamic-intercepted-(...)": + if (depth < route.segments.length) { + const pathSegment = route.segments[depth]; + if (pathSegment.type === "dynamic" && !params.hasOwnProperty(pathSegment.param.paramName)) { + return void 0; + } + return getParamValueFromSegment(pathSegment, params, paramType); + } + return void 0; + default: + paramType; + } + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js +var require_get_dynamic_param = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + PARAMETER_PATTERN: function() { + return PARAMETER_PATTERN; + }, + getDynamicParam: function() { + return getDynamicParam; + }, + interpolateParallelRouteParams: function() { + return interpolateParallelRouteParams; + }, + parseMatchedParameter: function() { + return parseMatchedParameter; + }, + parseParameter: function() { + return parseParameter; + } + }); + var _invarianterror = require_invariant_error(); + var _parseloadertree = require_parse_loader_tree(); + var _app = require_app(); + var _resolveparamvalue = require_resolve_param_value(); + function getParamValue(interpolatedParams, segmentKey, fallbackRouteParams) { + let value = interpolatedParams[segmentKey]; + if (fallbackRouteParams?.has(segmentKey)) { + const [searchValue] = fallbackRouteParams.get(segmentKey); + value = searchValue; + } else if (Array.isArray(value)) { + value = value.map((i) => encodeURIComponent(i)); + } else if (typeof value === "string") { + value = encodeURIComponent(value); + } + return value; + } + function interpolateParallelRouteParams(loaderTree, params, pagePath, fallbackRouteParams) { + const interpolated = structuredClone(params); + const stack = [ + { + tree: loaderTree, + depth: 0 + } + ]; + const route = (0, _app.parseAppRoute)(pagePath, true); + while (stack.length > 0) { + const { tree, depth } = stack.pop(); + const { segment, parallelRoutes } = (0, _parseloadertree.parseLoaderTree)(tree); + const appSegment = (0, _app.parseAppRouteSegment)(segment); + if (appSegment?.type === "dynamic" && !interpolated.hasOwnProperty(appSegment.param.paramName) && // If the param is in the fallback route params, we don't need to + // interpolate it because it's already marked as being unknown. + !fallbackRouteParams?.has(appSegment.param.paramName)) { + const { paramName, paramType } = appSegment.param; + const paramValue = (0, _resolveparamvalue.resolveParamValue)(paramName, paramType, depth, route, interpolated); + if (paramValue !== void 0) { + interpolated[paramName] = paramValue; + } else if (paramType !== "optional-catchall") { + throw Object.defineProperty(new _invarianterror.InvariantError(`Could not resolve param value for segment: ${paramName}`), "__NEXT_ERROR_CODE", { + value: "E932", + enumerable: false, + configurable: true + }); + } + } + let nextDepth = depth; + if (appSegment && appSegment.type !== "route-group" && appSegment.type !== "parallel-route") { + nextDepth++; + } + for (const parallelRoute of Object.values(parallelRoutes)) { + stack.push({ + tree: parallelRoute, + depth: nextDepth + }); + } + } + return interpolated; + } + function getDynamicParam(interpolatedParams, segmentKey, dynamicParamType, fallbackRouteParams, staticSiblings) { + let value = getParamValue(interpolatedParams, segmentKey, fallbackRouteParams); + if (!value || value.length === 0) { + if (dynamicParamType === "oc") { + return { + param: segmentKey, + value: null, + type: dynamicParamType, + treeSegment: [ + segmentKey, + "", + dynamicParamType, + staticSiblings + ] + }; + } + throw Object.defineProperty(new _invarianterror.InvariantError(`Missing value for segment key: "${segmentKey}" with dynamic param type: ${dynamicParamType}`), "__NEXT_ERROR_CODE", { + value: "E864", + enumerable: false, + configurable: true + }); + } + const paramCacheKey = Array.isArray(value) ? value.join("/") : value; + return { + param: segmentKey, + // The value that is passed to user code. + value, + // The value that is rendered in the router tree. + // TODO: If the number of static siblings exceeds some threshold (e.g., + // dozens or hundreds), consider sending a Bloom filter instead of the full + // array to reduce payload size. The client would then use the Bloom filter + // to check membership with a small false positive rate. + treeSegment: [ + segmentKey, + paramCacheKey, + dynamicParamType, + staticSiblings + ], + type: dynamicParamType + }; + } + var PARAMETER_PATTERN = /^([^[]*)\[((?:\[[^\]]*\])|[^\]]+)\](.*)$/; + function parseParameter(param) { + const match = param.match(PARAMETER_PATTERN); + if (!match) { + return parseMatchedParameter(param); + } + return parseMatchedParameter(match[2]); + } + function parseMatchedParameter(param) { + const optional = param.startsWith("[") && param.endsWith("]"); + if (optional) { + param = param.slice(1, -1); + } + const repeat = param.startsWith("..."); + if (repeat) { + param = param.slice(3); + } + return { + key: param, + repeat, + optional + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-regex.js +var require_route_regex = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/route-regex.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + getNamedMiddlewareRegex: function() { + return getNamedMiddlewareRegex; + }, + getNamedRouteRegex: function() { + return getNamedRouteRegex; + }, + getRouteRegex: function() { + return getRouteRegex; + } + }); + var _constants = require_constants(); + var _interceptionroutes = require_interception_routes(); + var _escaperegexp = require_escape_regexp(); + var _removetrailingslash = require_remove_trailing_slash(); + var _getdynamicparam = require_get_dynamic_param(); + function getParametrizedRoute(route, includeSuffix, includePrefix) { + const groups = {}; + let groupIndex = 1; + const segments = []; + for (const segment of (0, _removetrailingslash.removeTrailingSlash)(route).slice(1).split("/")) { + const markerMatch = _interceptionroutes.INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m)); + const paramMatches = segment.match(_getdynamicparam.PARAMETER_PATTERN); + if (markerMatch && paramMatches && paramMatches[2]) { + const { key, optional, repeat } = (0, _getdynamicparam.parseMatchedParameter)(paramMatches[2]); + groups[key] = { + pos: groupIndex++, + repeat, + optional + }; + segments.push(`/${(0, _escaperegexp.escapeStringRegexp)(markerMatch)}([^/]+?)`); + } else if (paramMatches && paramMatches[2]) { + const { key, repeat, optional } = (0, _getdynamicparam.parseMatchedParameter)(paramMatches[2]); + groups[key] = { + pos: groupIndex++, + repeat, + optional + }; + if (includePrefix && paramMatches[1]) { + segments.push(`/${(0, _escaperegexp.escapeStringRegexp)(paramMatches[1])}`); + } + let s = repeat ? optional ? "(?:/(.+?))?" : "/(.+?)" : "/([^/]+?)"; + if (includePrefix && paramMatches[1]) { + s = s.substring(1); + } + segments.push(s); + } else { + segments.push(`/${(0, _escaperegexp.escapeStringRegexp)(segment)}`); + } + if (includeSuffix && paramMatches && paramMatches[3]) { + segments.push((0, _escaperegexp.escapeStringRegexp)(paramMatches[3])); + } + } + return { + parameterizedRoute: segments.join(""), + groups + }; + } + function getRouteRegex(normalizedRoute, { includeSuffix = false, includePrefix = false, excludeOptionalTrailingSlash = false } = {}) { + const { parameterizedRoute, groups } = getParametrizedRoute(normalizedRoute, includeSuffix, includePrefix); + let re = parameterizedRoute; + if (!excludeOptionalTrailingSlash) { + re += "(?:/)?"; + } + return { + re: new RegExp(`^${re}$`), + groups + }; + } + function buildGetSafeRouteKey() { + let i = 0; + return () => { + let routeKey = ""; + let j = ++i; + while (j > 0) { + routeKey += String.fromCharCode(97 + (j - 1) % 26); + j = Math.floor((j - 1) / 26); + } + return routeKey; + }; + } + function getSafeKeyFromSegment({ interceptionMarker, getSafeRouteKey, segment, routeKeys, keyPrefix, backreferenceDuplicateKeys }) { + const { key, optional, repeat } = (0, _getdynamicparam.parseMatchedParameter)(segment); + let cleanedKey = key.replace(/\W/g, ""); + if (keyPrefix) { + cleanedKey = `${keyPrefix}${cleanedKey}`; + } + let invalidKey = false; + if (cleanedKey.length === 0 || cleanedKey.length > 30) { + invalidKey = true; + } + if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) { + invalidKey = true; + } + if (invalidKey) { + cleanedKey = getSafeRouteKey(); + } + const duplicateKey = cleanedKey in routeKeys; + if (keyPrefix) { + routeKeys[cleanedKey] = `${keyPrefix}${key}`; + } else { + routeKeys[cleanedKey] = key; + } + const interceptionPrefix = interceptionMarker ? (0, _escaperegexp.escapeStringRegexp)(interceptionMarker) : ""; + let pattern; + if (duplicateKey && backreferenceDuplicateKeys) { + pattern = `\\k<${cleanedKey}>`; + } else if (repeat) { + pattern = `(?<${cleanedKey}>.+?)`; + } else { + pattern = `(?<${cleanedKey}>[^/]+?)`; + } + return { + key, + pattern: optional ? `(?:/${interceptionPrefix}${pattern})?` : `/${interceptionPrefix}${pattern}`, + cleanedKey, + optional, + repeat + }; + } + function getNamedParametrizedRoute(route, prefixRouteKeys, includeSuffix, includePrefix, backreferenceDuplicateKeys, reference = { + names: {}, + intercepted: {} + }) { + const getSafeRouteKey = buildGetSafeRouteKey(); + const routeKeys = {}; + const segments = []; + const inverseParts = []; + reference = structuredClone(reference); + for (const segment of (0, _removetrailingslash.removeTrailingSlash)(route).slice(1).split("/")) { + const hasInterceptionMarker = _interceptionroutes.INTERCEPTION_ROUTE_MARKERS.some((m) => segment.startsWith(m)); + const paramMatches = segment.match(_getdynamicparam.PARAMETER_PATTERN); + const interceptionMarker = hasInterceptionMarker ? paramMatches?.[1] : void 0; + let keyPrefix; + if (interceptionMarker && paramMatches?.[2]) { + keyPrefix = prefixRouteKeys ? _constants.NEXT_INTERCEPTION_MARKER_PREFIX : void 0; + reference.intercepted[paramMatches[2]] = interceptionMarker; + } else if (paramMatches?.[2] && reference.intercepted[paramMatches[2]]) { + keyPrefix = prefixRouteKeys ? _constants.NEXT_INTERCEPTION_MARKER_PREFIX : void 0; + } else { + keyPrefix = prefixRouteKeys ? _constants.NEXT_QUERY_PARAM_PREFIX : void 0; + } + if (interceptionMarker && paramMatches && paramMatches[2]) { + const { key, pattern, cleanedKey, repeat, optional } = getSafeKeyFromSegment({ + getSafeRouteKey, + interceptionMarker, + segment: paramMatches[2], + routeKeys, + keyPrefix, + backreferenceDuplicateKeys + }); + segments.push(pattern); + inverseParts.push(`/${paramMatches[1]}:${reference.names[key] ?? cleanedKey}${repeat ? optional ? "*" : "+" : ""}`); + reference.names[key] ??= cleanedKey; + } else if (paramMatches && paramMatches[2]) { + if (includePrefix && paramMatches[1]) { + segments.push(`/${(0, _escaperegexp.escapeStringRegexp)(paramMatches[1])}`); + inverseParts.push(`/${paramMatches[1]}`); + } + const { key, pattern, cleanedKey, repeat, optional } = getSafeKeyFromSegment({ + getSafeRouteKey, + segment: paramMatches[2], + routeKeys, + keyPrefix, + backreferenceDuplicateKeys + }); + let s = pattern; + if (includePrefix && paramMatches[1]) { + s = s.substring(1); + } + segments.push(s); + inverseParts.push(`/:${reference.names[key] ?? cleanedKey}${repeat ? optional ? "*" : "+" : ""}`); + reference.names[key] ??= cleanedKey; + } else { + segments.push(`/${(0, _escaperegexp.escapeStringRegexp)(segment)}`); + inverseParts.push(`/${segment}`); + } + if (includeSuffix && paramMatches && paramMatches[3]) { + segments.push((0, _escaperegexp.escapeStringRegexp)(paramMatches[3])); + inverseParts.push(paramMatches[3]); + } + } + return { + namedParameterizedRoute: segments.join(""), + routeKeys, + pathToRegexpPattern: inverseParts.join(""), + reference + }; + } + function getNamedRouteRegex(normalizedRoute, options) { + const result = getNamedParametrizedRoute(normalizedRoute, options.prefixRouteKeys, options.includeSuffix ?? false, options.includePrefix ?? false, options.backreferenceDuplicateKeys ?? false, options.reference); + let namedRegex = result.namedParameterizedRoute; + if (!options.excludeOptionalTrailingSlash) { + namedRegex += "(?:/)?"; + } + return { + ...getRouteRegex(normalizedRoute, options), + namedRegex: `^${namedRegex}$`, + routeKeys: result.routeKeys, + pathToRegexpPattern: result.pathToRegexpPattern, + reference: result.reference + }; + } + function getNamedMiddlewareRegex(normalizedRoute, options) { + const { parameterizedRoute } = getParametrizedRoute(normalizedRoute, false, false); + const { catchAll = true } = options; + if (parameterizedRoute === "/") { + let catchAllRegex = catchAll ? ".*" : ""; + return { + namedRegex: `^/${catchAllRegex}$` + }; + } + const { namedParameterizedRoute } = getNamedParametrizedRoute(normalizedRoute, false, false, false, false, void 0); + let catchAllGroupedRegex = catchAll ? "(?:(/.*)?)" : ""; + return { + namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$` + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interpolate-as.js +var require_interpolate_as = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/interpolate-as.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "interpolateAs", { + enumerable: true, + get: function() { + return interpolateAs; + } + }); + var _routematcher = require_route_matcher(); + var _routeregex = require_route_regex(); + function interpolateAs(route, asPathname, query) { + let interpolatedRoute = ""; + const dynamicRegex = (0, _routeregex.getRouteRegex)(route); + const dynamicGroups = dynamicRegex.groups; + const dynamicMatches = ( + // Try to match the dynamic route against the asPath + (asPathname !== route ? (0, _routematcher.getRouteMatcher)(dynamicRegex)(asPathname) : "") || // Fall back to reading the values from the href + // TODO: should this take priority; also need to change in the router. + query + ); + interpolatedRoute = route; + const params = Object.keys(dynamicGroups); + if (!params.every((param) => { + let value = dynamicMatches[param] || ""; + const { repeat, optional } = dynamicGroups[param]; + let replaced = `[${repeat ? "..." : ""}${param}]`; + if (optional) { + replaced = `${!value ? "/" : ""}[${replaced}]`; + } + if (repeat && !Array.isArray(value)) value = [ + value + ]; + return (optional || param in dynamicMatches) && // Interpolate group into data URL if present + (interpolatedRoute = interpolatedRoute.replace(replaced, repeat ? value.map( + // these values should be fully encoded instead of just + // path delimiter escaped since they are being inserted + // into the URL and we expect URL encoded segments + // when parsing dynamic route params + (segment) => encodeURIComponent(segment) + ).join("/") : encodeURIComponent(value)) || "/"); + })) { + interpolatedRoute = ""; + } + return { + params, + result: interpolatedRoute + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/resolve-href.js +var require_resolve_href = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/resolve-href.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "resolveHref", { + enumerable: true, + get: function() { + return resolveHref; + } + }); + var _querystring = require_querystring(); + var _formaturl = require_format_url(); + var _omit = require_omit(); + var _utils = require_utils(); + var _normalizetrailingslash = require_normalize_trailing_slash(); + var _islocalurl = require_is_local_url(); + var _utils1 = require_utils2(); + var _interpolateas = require_interpolate_as(); + var _routeregex = require_route_regex(); + var _routematcher = require_route_matcher(); + function resolveHref(router, href, resolveAs) { + let base; + let urlAsString = typeof href === "string" ? href : (0, _formaturl.formatWithValidation)(href); + const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\/\//i); + const urlAsStringNoProto = urlProtoMatch ? urlAsString.slice(urlProtoMatch[0].length) : urlAsString; + const urlParts = urlAsStringNoProto.split("?", 1); + if ((urlParts[0] || "").match(/(\/\/|\\)/)) { + console.error(`Invalid href '${urlAsString}' passed to next/router in page: '${router.pathname}'. Repeated forward-slashes (//) or backslashes \\ are not valid in the href.`); + const normalizedUrl = (0, _utils.normalizeRepeatedSlashes)(urlAsStringNoProto); + urlAsString = (urlProtoMatch ? urlProtoMatch[0] : "") + normalizedUrl; + } + if (!(0, _islocalurl.isLocalURL)(urlAsString)) { + return resolveAs ? [ + urlAsString + ] : urlAsString; + } + try { + let baseBase = urlAsString.startsWith("#") ? router.asPath : router.pathname; + if (urlAsString.startsWith("?")) { + baseBase = router.asPath; + if ((0, _utils1.isDynamicRoute)(router.pathname)) { + baseBase = router.pathname; + const routeRegex = (0, _routeregex.getRouteRegex)(router.pathname); + const match = (0, _routematcher.getRouteMatcher)(routeRegex)(router.asPath); + if (!match) { + baseBase = router.asPath; + } + } + } + base = new URL(baseBase, "http://n"); + } catch (_) { + base = new URL("/", "http://n"); + } + try { + const finalUrl = new URL(urlAsString, base); + finalUrl.pathname = (0, _normalizetrailingslash.normalizePathTrailingSlash)(finalUrl.pathname); + let interpolatedAs = ""; + if ((0, _utils1.isDynamicRoute)(finalUrl.pathname) && finalUrl.searchParams && resolveAs) { + const query = (0, _querystring.searchParamsToUrlQuery)(finalUrl.searchParams); + const { result, params } = (0, _interpolateas.interpolateAs)(finalUrl.pathname, finalUrl.pathname, query); + if (result) { + interpolatedAs = (0, _formaturl.formatWithValidation)({ + pathname: result, + hash: finalUrl.hash, + query: (0, _omit.omit)(query, params) + }); + } + } + const resolvedHref = finalUrl.origin === base.origin ? finalUrl.href.slice(finalUrl.origin.length) : finalUrl.href; + return resolveAs ? [ + resolvedHref, + interpolatedAs || resolvedHref + ] : resolvedHref; + } catch (_) { + return resolveAs ? [ + urlAsString + ] : urlAsString; + } + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js +var require_add_path_prefix = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/add-path-prefix.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "addPathPrefix", { + enumerable: true, + get: function() { + return addPathPrefix; + } + }); + var _parsepath = require_parse_path(); + function addPathPrefix(path, prefix) { + if (!path.startsWith("/") || !prefix) { + return path; + } + const { pathname, query, hash } = (0, _parsepath.parsePath)(path); + return `${prefix}${pathname}${query}${hash}`; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/add-locale.js +var require_add_locale = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router/utils/add-locale.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "addLocale", { + enumerable: true, + get: function() { + return addLocale; + } + }); + var _addpathprefix = require_add_path_prefix(); + var _pathhasprefix = require_path_has_prefix(); + function addLocale(path, locale, defaultLocale, ignorePrefix) { + if (!locale || locale === defaultLocale) return path; + const lower = path.toLowerCase(); + if (!ignorePrefix) { + if ((0, _pathhasprefix.pathHasPrefix)(lower, "/api")) return path; + if ((0, _pathhasprefix.pathHasPrefix)(lower, `/${locale.toLowerCase()}`)) return path; + } + return (0, _addpathprefix.addPathPrefix)(path, `/${locale}`); + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/add-locale.js +var require_add_locale2 = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/add-locale.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "addLocale", { + enumerable: true, + get: function() { + return addLocale; + } + }); + var _normalizetrailingslash = require_normalize_trailing_slash(); + var addLocale = (path, ...args) => { + if (process.env.__NEXT_I18N_SUPPORT) { + return (0, _normalizetrailingslash.normalizePathTrailingSlash)(require_add_locale().addLocale(path, ...args)); + } + return path; + }; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_default.cjs +var require_interop_require_default = __commonJS({ + "../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_default.cjs"(exports) { + "use strict"; + function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + exports._ = _interop_require_default; + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router-context.shared-runtime.js +var require_router_context_shared_runtime = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/router-context.shared-runtime.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "RouterContext", { + enumerable: true, + get: function() { + return RouterContext; + } + }); + var _interop_require_default = require_interop_require_default(); + var _react = /* @__PURE__ */ _interop_require_default._(__require("react")); + var RouterContext = _react.default.createContext(null); + if (process.env.NODE_ENV !== "production") { + RouterContext.displayName = "RouterContext"; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/request-idle-callback.js +var require_request_idle_callback = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/request-idle-callback.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + cancelIdleCallback: function() { + return cancelIdleCallback; + }, + requestIdleCallback: function() { + return requestIdleCallback; + } + }); + var requestIdleCallback = typeof self !== "undefined" && self.requestIdleCallback && self.requestIdleCallback.bind(window) || function(cb) { + let start = Date.now(); + return self.setTimeout(function() { + cb({ + didTimeout: false, + timeRemaining: function() { + return Math.max(0, 50 - (Date.now() - start)); + } + }); + }, 1); + }; + var cancelIdleCallback = typeof self !== "undefined" && self.cancelIdleCallback && self.cancelIdleCallback.bind(window) || function(id) { + return clearTimeout(id); + }; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/use-intersection.js +var require_use_intersection = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/use-intersection.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "useIntersection", { + enumerable: true, + get: function() { + return useIntersection; + } + }); + var _react = __require("react"); + var _requestidlecallback = require_request_idle_callback(); + var hasIntersectionObserver = typeof IntersectionObserver === "function"; + var observers = /* @__PURE__ */ new Map(); + var idList = []; + function createObserver(options) { + const id = { + root: options.root || null, + margin: options.rootMargin || "" + }; + const existing = idList.find((obj) => obj.root === id.root && obj.margin === id.margin); + let instance; + if (existing) { + instance = observers.get(existing); + if (instance) { + return instance; + } + } + const elements = /* @__PURE__ */ new Map(); + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + const callback = elements.get(entry.target); + const isVisible = entry.isIntersecting || entry.intersectionRatio > 0; + if (callback && isVisible) { + callback(isVisible); + } + }); + }, options); + instance = { + id, + observer, + elements + }; + idList.push(id); + observers.set(id, instance); + return instance; + } + function observe(element, callback, options) { + const { id, observer, elements } = createObserver(options); + elements.set(element, callback); + observer.observe(element); + return function unobserve() { + elements.delete(element); + observer.unobserve(element); + if (elements.size === 0) { + observer.disconnect(); + observers.delete(id); + const index = idList.findIndex((obj) => obj.root === id.root && obj.margin === id.margin); + if (index > -1) { + idList.splice(index, 1); + } + } + }; + } + function useIntersection({ rootRef, rootMargin, disabled }) { + const isDisabled = disabled || !hasIntersectionObserver; + const [visible, setVisible] = (0, _react.useState)(false); + const elementRef = (0, _react.useRef)(null); + const setElement = (0, _react.useCallback)((element) => { + elementRef.current = element; + }, []); + (0, _react.useEffect)(() => { + if (hasIntersectionObserver) { + if (isDisabled || visible) return; + const element = elementRef.current; + if (element && element.tagName) { + const unobserve = observe(element, (isVisible) => isVisible && setVisible(isVisible), { + root: rootRef?.current, + rootMargin + }); + return unobserve; + } + } else { + if (!visible) { + const idleCallback = (0, _requestidlecallback.requestIdleCallback)(() => setVisible(true)); + return () => (0, _requestidlecallback.cancelIdleCallback)(idleCallback); + } + } + }, [ + isDisabled, + rootMargin, + rootRef, + visible, + elementRef.current + ]); + const resetVisible = (0, _react.useCallback)(() => { + setVisible(false); + }, []); + return [ + setElement, + visible, + resetVisible + ]; + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js +var require_normalize_locale_path = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/i18n/normalize-locale-path.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "normalizeLocalePath", { + enumerable: true, + get: function() { + return normalizeLocalePath; + } + }); + var cache = /* @__PURE__ */ new WeakMap(); + function normalizeLocalePath(pathname, locales) { + if (!locales) return { + pathname + }; + let lowercasedLocales = cache.get(locales); + if (!lowercasedLocales) { + lowercasedLocales = locales.map((locale) => locale.toLowerCase()); + cache.set(locales, lowercasedLocales); + } + let detectedLocale; + const segments = pathname.split("/", 2); + if (!segments[1]) return { + pathname + }; + const segment = segments[1].toLowerCase(); + const index = lowercasedLocales.indexOf(segment); + if (index < 0) return { + pathname + }; + detectedLocale = locales[index]; + pathname = pathname.slice(detectedLocale.length + 1) || "/"; + return { + pathname, + detectedLocale + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/normalize-locale-path.js +var require_normalize_locale_path2 = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/normalize-locale-path.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "normalizeLocalePath", { + enumerable: true, + get: function() { + return normalizeLocalePath; + } + }); + var normalizeLocalePath = (pathname, locales) => { + if (process.env.__NEXT_I18N_SUPPORT) { + return require_normalize_locale_path().normalizeLocalePath(pathname, locales); + } + return { + pathname, + detectedLocale: void 0 + }; + }; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js +var require_detect_domain_locale = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/i18n/detect-domain-locale.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "detectDomainLocale", { + enumerable: true, + get: function() { + return detectDomainLocale; + } + }); + function detectDomainLocale(domainItems, hostname, detectedLocale) { + if (!domainItems) return; + if (detectedLocale) { + detectedLocale = detectedLocale.toLowerCase(); + } + for (const item of domainItems) { + const domainHostname = item.domain?.split(":", 1)[0].toLowerCase(); + if (hostname === domainHostname || detectedLocale === item.defaultLocale.toLowerCase() || item.locales?.some((locale) => locale.toLowerCase() === detectedLocale)) { + return item; + } + } + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/detect-domain-locale.js +var require_detect_domain_locale2 = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/detect-domain-locale.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "detectDomainLocale", { + enumerable: true, + get: function() { + return detectDomainLocale; + } + }); + var detectDomainLocale = (...args) => { + if (process.env.__NEXT_I18N_SUPPORT) { + return require_detect_domain_locale().detectDomainLocale(...args); + } + }; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/get-domain-locale.js +var require_get_domain_locale = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/get-domain-locale.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "getDomainLocale", { + enumerable: true, + get: function() { + return getDomainLocale; + } + }); + var _normalizetrailingslash = require_normalize_trailing_slash(); + var basePath = process.env.__NEXT_ROUTER_BASEPATH || ""; + function getDomainLocale(path, locale, locales, domainLocales) { + if (process.env.__NEXT_I18N_SUPPORT) { + const normalizeLocalePath = require_normalize_locale_path2().normalizeLocalePath; + const detectDomainLocale = require_detect_domain_locale2().detectDomainLocale; + const target = locale || normalizeLocalePath(path, locales).detectedLocale; + const domain = detectDomainLocale(domainLocales, void 0, target); + if (domain) { + const proto = `http${domain.http ? "" : "s"}://`; + const finalLocale = target === domain.defaultLocale ? "" : `/${target}`; + return `${proto}${domain.domain}${(0, _normalizetrailingslash.normalizePathTrailingSlash)(`${basePath}${finalLocale}${path}`)}`; + } + return false; + } else { + return false; + } + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/add-base-path.js +var require_add_base_path = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/add-base-path.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "addBasePath", { + enumerable: true, + get: function() { + return addBasePath; + } + }); + var _addpathprefix = require_add_path_prefix(); + var _normalizetrailingslash = require_normalize_trailing_slash(); + var basePath = process.env.__NEXT_ROUTER_BASEPATH || ""; + function addBasePath(path, required) { + return (0, _normalizetrailingslash.normalizePathTrailingSlash)(process.env.__NEXT_MANUAL_CLIENT_BASE_PATH && !required ? path : (0, _addpathprefix.addPathPrefix)(path, basePath)); + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/use-merged-ref.js +var require_use_merged_ref = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/use-merged-ref.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "useMergedRef", { + enumerable: true, + get: function() { + return useMergedRef; + } + }); + var _react = __require("react"); + function useMergedRef(refA, refB) { + const cleanupA = (0, _react.useRef)(null); + const cleanupB = (0, _react.useRef)(null); + return (0, _react.useCallback)((current) => { + if (current === null) { + const cleanupFnA = cleanupA.current; + if (cleanupFnA) { + cleanupA.current = null; + cleanupFnA(); + } + const cleanupFnB = cleanupB.current; + if (cleanupFnB) { + cleanupB.current = null; + cleanupFnB(); + } + } else { + if (refA) { + cleanupA.current = applyRef(refA, current); + } + if (refB) { + cleanupB.current = applyRef(refB, current); + } + } + }, [ + refA, + refB + ]); + } + function applyRef(refA, current) { + if (typeof refA === "function") { + const cleanup = refA(current); + if (typeof cleanup === "function") { + return cleanup; + } else { + return () => refA(null); + } + } else { + refA.current = current; + return () => { + refA.current = null; + }; + } + } + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/utils/error-once.js +var require_error_once = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/shared/lib/utils/error-once.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "errorOnce", { + enumerable: true, + get: function() { + return errorOnce; + } + }); + var errorOnce = (_) => { + }; + if (process.env.NODE_ENV !== "production") { + const errors = /* @__PURE__ */ new Set(); + errorOnce = (msg) => { + if (!errors.has(msg)) { + console.error(msg); + } + errors.add(msg); + }; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/link.js +var require_link = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/client/link.js"(exports, module) { + "use strict"; + "use client"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + function _export(target, all) { + for (var name in all) Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); + } + _export(exports, { + default: function() { + return _default; + }, + useLinkStatus: function() { + return useLinkStatus; + } + }); + var _interop_require_wildcard = require_interop_require_wildcard(); + var _jsxruntime = __require("react/jsx-runtime"); + var _react = /* @__PURE__ */ _interop_require_wildcard._(__require("react")); + var _resolvehref = require_resolve_href(); + var _islocalurl = require_is_local_url(); + var _formaturl = require_format_url(); + var _utils = require_utils(); + var _addlocale = require_add_locale2(); + var _routercontextsharedruntime = require_router_context_shared_runtime(); + var _useintersection = require_use_intersection(); + var _getdomainlocale = require_get_domain_locale(); + var _addbasepath = require_add_base_path(); + var _usemergedref = require_use_merged_ref(); + var _erroronce = require_error_once(); + var prefetched = /* @__PURE__ */ new Set(); + function prefetch(router, href, as, options) { + if (typeof window === "undefined") { + return; + } + if (!(0, _islocalurl.isLocalURL)(href)) { + return; + } + if (!options.bypassPrefetchedCheck) { + const locale = ( + // Let the link's locale prop override the default router locale. + typeof options.locale !== "undefined" ? options.locale : "locale" in router ? router.locale : void 0 + ); + const prefetchedKey = href + "%" + as + "%" + locale; + if (prefetched.has(prefetchedKey)) { + return; + } + prefetched.add(prefetchedKey); + } + router.prefetch(href, as, options).catch((err) => { + if (process.env.NODE_ENV !== "production") { + throw err; + } + }); + } + function isModifiedEvent(event) { + const eventTarget = event.currentTarget; + const target = eventTarget.getAttribute("target"); + return target && target !== "_self" || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || // triggers resource download + event.nativeEvent && event.nativeEvent.which === 2; + } + function linkClicked(e, router, href, as, replace, shallow, scroll, locale, onNavigate) { + const { nodeName } = e.currentTarget; + const isAnchorNodeName = nodeName.toUpperCase() === "A"; + if (isAnchorNodeName && isModifiedEvent(e) || e.currentTarget.hasAttribute("download")) { + return; + } + if (!(0, _islocalurl.isLocalURL)(href)) { + if (replace) { + e.preventDefault(); + location.replace(href); + } + return; + } + e.preventDefault(); + const navigate = () => { + if (onNavigate) { + let isDefaultPrevented = false; + onNavigate({ + preventDefault: () => { + isDefaultPrevented = true; + } + }); + if (isDefaultPrevented) { + return; + } + } + const routerScroll = scroll ?? true; + if ("beforePopState" in router) { + router[replace ? "replace" : "push"](href, as, { + shallow, + locale, + scroll: routerScroll + }); + } else { + router[replace ? "replace" : "push"](as || href, { + scroll: routerScroll + }); + } + }; + navigate(); + } + function formatStringOrUrl(urlObjOrString) { + if (typeof urlObjOrString === "string") { + return urlObjOrString; + } + return (0, _formaturl.formatUrl)(urlObjOrString); + } + var Link = /* @__PURE__ */ _react.default.forwardRef(function LinkComponent(props, forwardedRef) { + let children; + const { href: hrefProp, as: asProp, children: childrenProp, prefetch: prefetchProp = null, passHref, replace, shallow, scroll, locale, onClick, onNavigate, onMouseEnter: onMouseEnterProp, onTouchStart: onTouchStartProp, legacyBehavior = false, transitionTypes, ...restProps } = props; + children = childrenProp; + if (legacyBehavior && (typeof children === "string" || typeof children === "number")) { + children = /* @__PURE__ */ (0, _jsxruntime.jsx)("a", { + children + }); + } + const router = _react.default.useContext(_routercontextsharedruntime.RouterContext); + const prefetchEnabled = prefetchProp !== false; + if (process.env.NODE_ENV !== "production") { + let createPropError = function(args) { + return Object.defineProperty(new Error(`Failed prop type: The prop \`${args.key}\` expects a ${args.expected} in \`\`, but got \`${args.actual}\` instead.` + (typeof window !== "undefined" ? "\nOpen your browser's console to view the Component stack trace." : "")), "__NEXT_ERROR_CODE", { + value: "E319", + enumerable: false, + configurable: true + }); + }; + const requiredPropsGuard = { + href: true + }; + const requiredProps = Object.keys(requiredPropsGuard); + requiredProps.forEach((key) => { + if (key === "href") { + if (props[key] == null || typeof props[key] !== "string" && typeof props[key] !== "object") { + throw createPropError({ + key, + expected: "`string` or `object`", + actual: props[key] === null ? "null" : typeof props[key] + }); + } + } else { + const _ = key; + } + }); + const optionalPropsGuard = { + as: true, + replace: true, + scroll: true, + shallow: true, + passHref: true, + prefetch: true, + locale: true, + onClick: true, + onMouseEnter: true, + onTouchStart: true, + legacyBehavior: true, + onNavigate: true, + transitionTypes: true + }; + const optionalProps = Object.keys(optionalPropsGuard); + optionalProps.forEach((key) => { + const valType = typeof props[key]; + if (key === "as") { + if (props[key] && valType !== "string" && valType !== "object") { + throw createPropError({ + key, + expected: "`string` or `object`", + actual: valType + }); + } + } else if (key === "locale") { + if (props[key] && valType !== "string") { + throw createPropError({ + key, + expected: "`string`", + actual: valType + }); + } + } else if (key === "onClick" || key === "onMouseEnter" || key === "onTouchStart" || key === "onNavigate") { + if (props[key] && valType !== "function") { + throw createPropError({ + key, + expected: "`function`", + actual: valType + }); + } + } else if (key === "replace" || key === "scroll" || key === "shallow" || key === "passHref" || key === "legacyBehavior") { + if (props[key] != null && valType !== "boolean") { + throw createPropError({ + key, + expected: "`boolean`", + actual: valType + }); + } + } else if (key === "prefetch") { + if (props[key] != null && valType !== "boolean" && props[key] !== "auto") { + throw createPropError({ + key, + expected: '`boolean | "auto"`', + actual: valType + }); + } + } else if (key === "transitionTypes") { + if (props[key] != null && !Array.isArray(props[key])) { + throw createPropError({ + key, + expected: "`string[]`", + actual: valType + }); + } + } else { + const _ = key; + } + }); + } + const { href, as } = _react.default.useMemo(() => { + if (!router) { + const resolvedHref2 = formatStringOrUrl(hrefProp); + return { + href: resolvedHref2, + as: asProp ? formatStringOrUrl(asProp) : resolvedHref2 + }; + } + const [resolvedHref, resolvedAs] = (0, _resolvehref.resolveHref)(router, hrefProp, true); + return { + href: resolvedHref, + as: asProp ? (0, _resolvehref.resolveHref)(router, asProp) : resolvedAs || resolvedHref + }; + }, [ + router, + hrefProp, + asProp + ]); + const previousHref = _react.default.useRef(href); + const previousAs = _react.default.useRef(as); + let child; + if (legacyBehavior) { + if (process.env.NODE_ENV === "development") { + if (onClick) { + console.warn(`"onClick" was passed to with \`href\` of \`${hrefProp}\` but "legacyBehavior" was set. The legacy behavior requires onClick be set on the child of next/link`); + } + if (onMouseEnterProp) { + console.warn(`"onMouseEnter" was passed to with \`href\` of \`${hrefProp}\` but "legacyBehavior" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`); + } + try { + child = _react.default.Children.only(children); + } catch (err) { + if (!children) { + throw Object.defineProperty(new Error(`No children were passed to with \`href\` of \`${hrefProp}\` but one child is required https://nextjs.org/docs/messages/link-no-children`), "__NEXT_ERROR_CODE", { + value: "E320", + enumerable: false, + configurable: true + }); + } + throw Object.defineProperty(new Error(`Multiple children were passed to with \`href\` of \`${hrefProp}\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` + (typeof window !== "undefined" ? " \nOpen your browser's console to view the Component stack trace." : "")), "__NEXT_ERROR_CODE", { + value: "E266", + enumerable: false, + configurable: true + }); + } + } else { + child = _react.default.Children.only(children); + } + } else { + if (process.env.NODE_ENV === "development") { + if (children?.type === "a") { + throw Object.defineProperty(new Error("Invalid with child. Please remove or use .\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor"), "__NEXT_ERROR_CODE", { + value: "E209", + enumerable: false, + configurable: true + }); + } + } + } + const childRef = legacyBehavior ? child && typeof child === "object" && child.ref : forwardedRef; + const [setIntersectionRef, isVisible, resetVisible] = (0, _useintersection.useIntersection)({ + rootMargin: "200px" + }); + const setIntersectionWithResetRef = _react.default.useCallback((el) => { + if (previousAs.current !== as || previousHref.current !== href) { + resetVisible(); + previousAs.current = as; + previousHref.current = href; + } + setIntersectionRef(el); + }, [ + as, + href, + resetVisible, + setIntersectionRef + ]); + const setRef = (0, _usemergedref.useMergedRef)(setIntersectionWithResetRef, childRef); + _react.default.useEffect(() => { + if (process.env.NODE_ENV !== "production") { + return; + } + if (!router) { + return; + } + if (!isVisible || !prefetchEnabled) { + return; + } + prefetch(router, href, as, { + locale + }); + }, [ + as, + href, + isVisible, + locale, + prefetchEnabled, + router?.locale, + router + ]); + const childProps = { + ref: setRef, + onClick(e) { + if (process.env.NODE_ENV !== "production") { + if (!e) { + throw Object.defineProperty(new Error(`Component rendered inside next/link has to pass click event to "onClick" prop.`), "__NEXT_ERROR_CODE", { + value: "E312", + enumerable: false, + configurable: true + }); + } + } + if (!legacyBehavior && typeof onClick === "function") { + onClick(e); + } + if (legacyBehavior && child.props && typeof child.props.onClick === "function") { + child.props.onClick(e); + } + if (!router) { + return; + } + if (e.defaultPrevented) { + return; + } + linkClicked(e, router, href, as, replace, shallow, scroll, locale, onNavigate); + }, + onMouseEnter(e) { + if (!legacyBehavior && typeof onMouseEnterProp === "function") { + onMouseEnterProp(e); + } + if (legacyBehavior && child.props && typeof child.props.onMouseEnter === "function") { + child.props.onMouseEnter(e); + } + if (!router) { + return; + } + prefetch(router, href, as, { + locale, + priority: true, + // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642} + bypassPrefetchedCheck: true + }); + }, + onTouchStart: process.env.__NEXT_LINK_NO_TOUCH_START ? void 0 : function onTouchStart(e) { + if (!legacyBehavior && typeof onTouchStartProp === "function") { + onTouchStartProp(e); + } + if (legacyBehavior && child.props && typeof child.props.onTouchStart === "function") { + child.props.onTouchStart(e); + } + if (!router) { + return; + } + prefetch(router, href, as, { + locale, + priority: true, + // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642} + bypassPrefetchedCheck: true + }); + } + }; + if ((0, _utils.isAbsoluteUrl)(as)) { + childProps.href = as; + } else if (!legacyBehavior || passHref || child.type === "a" && !("href" in child.props)) { + const curLocale = typeof locale !== "undefined" ? locale : router?.locale; + const localeDomain = router?.isLocaleDomain && (0, _getdomainlocale.getDomainLocale)(as, curLocale, router?.locales, router?.domainLocales); + childProps.href = localeDomain || (0, _addbasepath.addBasePath)((0, _addlocale.addLocale)(as, curLocale, router?.defaultLocale)); + } + if (legacyBehavior) { + if (process.env.NODE_ENV === "development") { + (0, _erroronce.errorOnce)("`legacyBehavior` is deprecated and will be removed in a future release. A codemod is available to upgrade your components:\n\nnpx @next/codemod@latest new-link .\n\nLearn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components"); + } + return /* @__PURE__ */ _react.default.cloneElement(child, childProps); + } + return /* @__PURE__ */ (0, _jsxruntime.jsx)("a", { + ...restProps, + ...childProps, + children + }); + }); + var LinkStatusContext = /* @__PURE__ */ (0, _react.createContext)({ + // We do not support link status in the Pages Router, so we always return false + pending: false + }); + var useLinkStatus = () => { + return (0, _react.useContext)(LinkStatusContext); + }; + var _default = Link; + if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") { + Object.defineProperty(exports.default, "__esModule", { value: true }); + Object.assign(exports.default, exports); + module.exports = exports.default; + } + } +}); + +// ../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/link.js +var require_link2 = __commonJS({ + "../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/link.js"(exports, module) { + "use strict"; + module.exports = require_link(); + } +}); + +export { + require_link2 as require_link +}; +//# sourceMappingURL=chunk-D6PSM7AT.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs.map new file mode 100644 index 00000000..5966f7ac --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-D6PSM7AT.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/querystring.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/format-url.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/omit.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/utils.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/remove-trailing-slash.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/parse-path.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/normalize-trailing-slash.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/path-has-prefix.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/has-base-path.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/is-local-url.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/sorted-routes.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/page-path/ensure-leading-slash.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/segment.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/app-paths.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/interception-routes.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/is-dynamic.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/index.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/dist/compiled/path-to-regexp/index.js","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/lib/route-pattern-normalizer.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/route-match-utils.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/route-matcher.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/lib/constants.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/escape-regexp.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/invariant-error.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/parse-loader-tree.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/get-segment-param.tsx","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/routes/app.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/interception-prefix-from-param-type.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/resolve-param-value.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/get-dynamic-param.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/route-regex.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/interpolate-as.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/resolve-href.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/add-path-prefix.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router/utils/add-locale.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/add-locale.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/router-context.shared-runtime.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/request-idle-callback.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/use-intersection.tsx","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/i18n/normalize-locale-path.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/normalize-locale-path.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/i18n/detect-domain-locale.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/detect-domain-locale.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/get-domain-locale.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/add-base-path.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/use-merged-ref.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/shared/lib/utils/error-once.ts","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/src/client/link.tsx","../../../node_modules/.pnpm/next@16.2.6_@babel+core@7.29.0_@opentelemetry+api@1.9.0_@playwright+test@1.60.0_babel-p_172a91d94e279b0b6d26e71653641b2b/node_modules/next/link.js"],"sourcesContent":["\"use strict\";\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== \"function\") return null;\n\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n\n return (_getRequireWildcardCache = function(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\nfunction _interop_require_wildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) return obj;\n if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") return { default: obj };\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) return cache.get(obj);\n\n var newObj = { __proto__: null };\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);\n else newObj[key] = obj[key];\n }\n }\n\n newObj.default = obj;\n\n if (cache) cache.set(obj, newObj);\n\n return newObj;\n}\nexports._ = _interop_require_wildcard;\n","import type { ParsedUrlQuery } from 'querystring'\n\nexport function searchParamsToUrlQuery(\n searchParams: URLSearchParams\n): ParsedUrlQuery {\n const query: ParsedUrlQuery = {}\n for (const [key, value] of searchParams.entries()) {\n const existing = query[key]\n if (typeof existing === 'undefined') {\n query[key] = value\n } else if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n query[key] = [existing, value]\n }\n }\n return query\n}\n\nfunction stringifyUrlQueryParam(param: unknown): string {\n if (typeof param === 'string') {\n return param\n }\n\n if (\n (typeof param === 'number' && !isNaN(param)) ||\n typeof param === 'boolean'\n ) {\n return String(param)\n } else {\n return ''\n }\n}\n\nexport function urlQueryToSearchParams(query: ParsedUrlQuery): URLSearchParams {\n const searchParams = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, stringifyUrlQueryParam(item))\n }\n } else {\n searchParams.set(key, stringifyUrlQueryParam(value))\n }\n }\n return searchParams\n}\n\nexport function assign(\n target: URLSearchParams,\n ...searchParamsList: URLSearchParams[]\n): URLSearchParams {\n for (const searchParams of searchParamsList) {\n for (const key of searchParams.keys()) {\n target.delete(key)\n }\n\n for (const [key, value] of searchParams.entries()) {\n target.append(key, value)\n }\n }\n\n return target\n}\n","// Format function modified from nodejs\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport type { UrlObject } from 'url'\nimport type { ParsedUrlQuery } from 'querystring'\nimport * as querystring from './querystring'\n\nconst slashedProtocols = /https?|ftp|gopher|file/\n\nexport function formatUrl(urlObj: UrlObject) {\n let { auth, hostname } = urlObj\n let protocol = urlObj.protocol || ''\n let pathname = urlObj.pathname || ''\n let hash = urlObj.hash || ''\n let query = urlObj.query || ''\n let host: string | false = false\n\n auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : ''\n\n if (urlObj.host) {\n host = auth + urlObj.host\n } else if (hostname) {\n host = auth + (~hostname.indexOf(':') ? `[${hostname}]` : hostname)\n if (urlObj.port) {\n host += ':' + urlObj.port\n }\n }\n\n if (query && typeof query === 'object') {\n query = String(querystring.urlQueryToSearchParams(query as ParsedUrlQuery))\n }\n\n let search = urlObj.search || (query && `?${query}`) || ''\n\n if (protocol && !protocol.endsWith(':')) protocol += ':'\n\n if (\n urlObj.slashes ||\n ((!protocol || slashedProtocols.test(protocol)) && host !== false)\n ) {\n host = '//' + (host || '')\n if (pathname && pathname[0] !== '/') pathname = '/' + pathname\n } else if (!host) {\n host = ''\n }\n\n if (hash && hash[0] !== '#') hash = '#' + hash\n if (search && search[0] !== '?') search = '?' + search\n\n pathname = pathname.replace(/[?#]/g, encodeURIComponent)\n search = search.replace('#', '%23')\n\n return `${protocol}${host}${pathname}${search}${hash}`\n}\n\nexport const urlObjectKeys = [\n 'auth',\n 'hash',\n 'host',\n 'hostname',\n 'href',\n 'path',\n 'pathname',\n 'port',\n 'protocol',\n 'query',\n 'search',\n 'slashes',\n]\n\nexport function formatWithValidation(url: UrlObject): string {\n if (process.env.NODE_ENV === 'development') {\n if (url !== null && typeof url === 'object') {\n Object.keys(url).forEach((key) => {\n if (!urlObjectKeys.includes(key)) {\n console.warn(\n `Unknown key passed via urlObject into url.format: ${key}`\n )\n }\n })\n }\n }\n\n return formatUrl(url)\n}\n","export function omit(\n object: T,\n keys: K[]\n): Omit {\n const omitted: { [key: string]: unknown } = {}\n Object.keys(object).forEach((key) => {\n if (!keys.includes(key as K)) {\n omitted[key] = object[key]\n }\n })\n return omitted as Omit\n}\n","import type { HtmlProps } from './html-context.shared-runtime'\nimport type { ComponentType, JSX } from 'react'\nimport type { DomainLocale } from '../../server/config'\nimport type { Env } from '@next/env'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextRouter } from './router/router'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { PreviewData } from '../../types'\nimport type { COMPILER_NAMES } from './constants'\nimport type fs from 'fs'\n\nexport type NextComponentType<\n Context extends BaseContext = NextPageContext,\n InitialProps = {},\n Props = {},\n> = ComponentType & {\n /**\n * Used for initial page load data population. Data returned from `getInitialProps` is serialized when server rendered.\n * Make sure to return plain `Object` without using `Date`, `Map`, `Set`.\n * @param context Context of `page`\n */\n getInitialProps?(context: Context): InitialProps | Promise\n}\n\nexport type DocumentType = NextComponentType<\n DocumentContext,\n DocumentInitialProps,\n DocumentProps\n>\n\nexport type AppType

= NextComponentType<\n AppContextType,\n P,\n AppPropsType\n>\n\nexport type AppTreeType = ComponentType<\n AppInitialProps & { [name: string]: any }\n>\n\n/**\n * Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team.\n * https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting\n */\nexport const WEB_VITALS = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'] as const\nexport type NextWebVitalsMetric = {\n id: string\n startTime: number\n value: number\n attribution?: { [key: string]: unknown }\n} & (\n | {\n label: 'web-vital'\n name: (typeof WEB_VITALS)[number]\n }\n | {\n label: 'custom'\n name:\n | 'Next.js-hydration'\n | 'Next.js-route-change-to-render'\n | 'Next.js-render'\n }\n)\n\nexport type Enhancer = (Component: C) => C\n\nexport type ComponentsEnhancer =\n | {\n enhanceApp?: Enhancer\n enhanceComponent?: Enhancer\n }\n | Enhancer\n\nexport type RenderPageResult = {\n html: string\n head?: Array\n}\n\nexport type RenderPage = (\n options?: ComponentsEnhancer\n) => DocumentInitialProps | Promise\n\nexport type BaseContext = {\n res?: ServerResponse\n [k: string]: any\n}\n\nexport type NEXT_DATA = {\n props: Record\n page: string\n query: ParsedUrlQuery\n buildId: string\n assetPrefix?: string\n nextExport?: boolean\n autoExport?: boolean\n isFallback?: boolean\n isExperimentalCompile?: boolean\n dynamicIds?: (string | number)[]\n err?: Error & {\n statusCode?: number\n source?: typeof COMPILER_NAMES.server | typeof COMPILER_NAMES.edgeServer\n }\n gsp?: boolean\n gssp?: boolean\n customServer?: boolean\n gip?: boolean\n appGip?: boolean\n locale?: string\n locales?: readonly string[]\n defaultLocale?: string\n domainLocales?: readonly DomainLocale[]\n scriptLoader?: any[]\n isPreview?: boolean\n notFoundSrcPage?: string\n}\n\n/**\n * `Next` context\n */\nexport interface NextPageContext {\n /**\n * Error object if encountered during rendering\n */\n err?: (Error & { statusCode?: number }) | null\n /**\n * `HTTP` request object.\n */\n req?: IncomingMessage\n /**\n * `HTTP` response object.\n */\n res?: ServerResponse\n /**\n * Path section of `URL`.\n */\n pathname: string\n /**\n * Query string section of `URL` parsed as an object.\n */\n query: ParsedUrlQuery\n /**\n * `String` of the actual path including query.\n */\n asPath?: string\n /**\n * The currently active locale\n */\n locale?: string\n /**\n * All configured locales\n */\n locales?: readonly string[]\n /**\n * The configured default locale\n */\n defaultLocale?: string\n /**\n * `Component` the tree of the App to use if needing to render separately\n */\n AppTree: AppTreeType\n}\n\nexport type AppContextType = {\n Component: NextComponentType\n AppTree: AppTreeType\n ctx: NextPageContext\n router: Router\n}\n\nexport type AppInitialProps = {\n pageProps: PageProps\n}\n\nexport type AppPropsType<\n Router extends NextRouter = NextRouter,\n PageProps = {},\n> = AppInitialProps & {\n Component: NextComponentType\n router: Router\n __N_SSG?: boolean\n __N_SSP?: boolean\n}\n\nexport type DocumentContext = NextPageContext & {\n renderPage: RenderPage\n defaultGetInitialProps(\n ctx: DocumentContext,\n options?: { nonce?: string }\n ): Promise\n}\n\nexport type DocumentInitialProps = RenderPageResult & {\n styles?: React.ReactElement[] | Iterable | JSX.Element\n}\n\nexport type DocumentProps = DocumentInitialProps & HtmlProps\n\n/**\n * Next `API` route request\n */\nexport interface NextApiRequest extends IncomingMessage {\n /**\n * Object of `query` values from url\n */\n query: Partial<{\n [key: string]: string | string[]\n }>\n /**\n * Object of `cookies` from header\n */\n cookies: Partial<{\n [key: string]: string\n }>\n\n body: any\n\n env: Env\n\n draftMode?: boolean\n\n preview?: boolean\n /**\n * Preview data set on the request, if any\n * */\n previewData?: PreviewData\n}\n\n/**\n * Send body of response\n */\ntype Send = (body: T) => void\n\n/**\n * Next `API` route response\n */\nexport type NextApiResponse = ServerResponse & {\n /**\n * Send data `any` data in response\n */\n send: Send\n /**\n * Send data `json` data in response\n */\n json: Send\n status: (statusCode: number) => NextApiResponse\n redirect(url: string): NextApiResponse\n redirect(status: number, url: string): NextApiResponse\n\n /**\n * Set draft mode\n */\n setDraftMode: (options: { enable: boolean }) => NextApiResponse\n\n /**\n * Set preview data for Next.js' prerender mode\n */\n setPreviewData: (\n data: object | string,\n options?: {\n /**\n * Specifies the number (in seconds) for the preview session to last for.\n * The given number will be converted to an integer by rounding down.\n * By default, no maximum age is set and the preview session finishes\n * when the client shuts down (browser is closed).\n */\n maxAge?: number\n /**\n * Specifies the path for the preview session to work under. By default,\n * the path is considered the \"default path\", i.e., any pages under \"/\".\n */\n path?: string\n }\n ) => NextApiResponse\n\n /**\n * Clear preview data for Next.js' prerender mode\n */\n clearPreviewData: (options?: { path?: string }) => NextApiResponse\n\n /**\n * Revalidate a specific page and regenerate it using On-Demand Incremental\n * Static Regeneration.\n * The path should be an actual path, not a rewritten path. E.g. for\n * \"/blog/[slug]\" this should be \"/blog/post-1\".\n * @link https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation-with-revalidatepath\n */\n revalidate: (\n urlPath: string,\n opts?: {\n unstable_onlyGenerated?: boolean\n }\n ) => Promise\n}\n\n/**\n * Next `API` route handler\n */\nexport type NextApiHandler = (\n req: NextApiRequest,\n res: NextApiResponse\n) => unknown | Promise\n\n/**\n * Utils\n */\nexport function execOnce ReturnType>(\n fn: T\n): T {\n let used = false\n let result: ReturnType\n\n return ((...args: any[]) => {\n if (!used) {\n used = true\n result = fn(...args)\n }\n return result\n }) as T\n}\n\n// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1\n// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\nconst ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/\nexport const isAbsoluteUrl = (url: string) => ABSOLUTE_URL_REGEX.test(url)\n\nexport function getLocationOrigin() {\n const { protocol, hostname, port } = window.location\n return `${protocol}//${hostname}${port ? ':' + port : ''}`\n}\n\nexport function getURL() {\n const { href } = window.location\n const origin = getLocationOrigin()\n return href.substring(origin.length)\n}\n\nexport function getDisplayName

(Component: ComponentType

) {\n return typeof Component === 'string'\n ? Component\n : Component.displayName || Component.name || 'Unknown'\n}\n\nexport function isResSent(res: ServerResponse) {\n return res.finished || res.headersSent\n}\n\nexport function normalizeRepeatedSlashes(url: string) {\n const urlParts = url.split('?')\n const urlNoQuery = urlParts[0]\n\n return (\n urlNoQuery\n // first we replace any non-encoded backslashes with forward\n // then normalize repeated forward slashes\n .replace(/\\\\/g, '/')\n .replace(/\\/\\/+/g, '/') +\n (urlParts[1] ? `?${urlParts.slice(1).join('?')}` : '')\n )\n}\n\nexport async function loadGetInitialProps<\n C extends BaseContext,\n IP = {},\n P = {},\n>(App: NextComponentType, ctx: C): Promise {\n if (process.env.NODE_ENV !== 'production') {\n if (App.prototype?.getInitialProps) {\n const message = `\"${getDisplayName(\n App\n )}.getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`\n throw new Error(message)\n }\n }\n // when called from _app `ctx` is nested in `ctx`\n const res = ctx.res || (ctx.ctx && ctx.ctx.res)\n\n if (!App.getInitialProps) {\n if (ctx.ctx && ctx.Component) {\n // @ts-ignore pageProps default\n return {\n pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx),\n }\n }\n return {} as IP\n }\n\n const props = await App.getInitialProps(ctx)\n\n if (res && isResSent(res)) {\n return props\n }\n\n if (!props) {\n const message = `\"${getDisplayName(\n App\n )}.getInitialProps()\" should resolve to an object. But found \"${props}\" instead.`\n throw new Error(message)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (Object.keys(props).length === 0 && !ctx.ctx) {\n console.warn(\n `${getDisplayName(\n App\n )} returned an empty object from \\`getInitialProps\\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`\n )\n }\n }\n\n return props\n}\n\nexport const SP = typeof performance !== 'undefined'\nexport const ST =\n SP &&\n (['mark', 'measure', 'getEntriesByName'] as const).every(\n (method) => typeof performance[method] === 'function'\n )\n\nexport class DecodeError extends Error {}\nexport class NormalizeError extends Error {}\nexport class PageNotFoundError extends Error {\n code: string\n\n constructor(page: string) {\n super()\n this.code = 'ENOENT'\n this.name = 'PageNotFoundError'\n this.message = `Cannot find module for page: ${page}`\n }\n}\n\nexport class MissingStaticPage extends Error {\n constructor(page: string, message: string) {\n super()\n this.message = `Failed to load static file for page: ${page} ${message}`\n }\n}\n\nexport class MiddlewareNotFoundError extends Error {\n code: string\n constructor() {\n super()\n this.code = 'ENOENT'\n this.message = `Cannot find the middleware module`\n }\n}\n\nexport interface CacheFs {\n existsSync: typeof fs.existsSync\n readFile: typeof fs.promises.readFile\n readFileSync: typeof fs.readFileSync\n writeFile(f: string, d: any): Promise\n mkdir(dir: string): Promise\n stat(f: string): Promise<{ mtime: Date }>\n}\n\nexport function stringifyError(error: Error) {\n return JSON.stringify({ message: error.message, stack: error.stack })\n}\n","/**\n * Removes the trailing slash for a given route or page path. Preserves the\n * root page. Examples:\n * - `/foo/bar/` -> `/foo/bar`\n * - `/foo/bar` -> `/foo/bar`\n * - `/` -> `/`\n */\nexport function removeTrailingSlash(route: string) {\n return route.replace(/\\/$/, '') || '/'\n}\n","/**\n * Given a path this function will find the pathname, query and hash and return\n * them. This is useful to parse full paths on the client side.\n * @param path A path to parse e.g. /foo/bar?id=1#hash\n */\nexport function parsePath(path: string) {\n const hashIndex = path.indexOf('#')\n const queryIndex = path.indexOf('?')\n const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex)\n\n if (hasQuery || hashIndex > -1) {\n return {\n pathname: path.substring(0, hasQuery ? queryIndex : hashIndex),\n query: hasQuery\n ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined)\n : '',\n hash: hashIndex > -1 ? path.slice(hashIndex) : '',\n }\n }\n\n return { pathname: path, query: '', hash: '' }\n}\n","import { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { parsePath } from '../shared/lib/router/utils/parse-path'\n\n/**\n * Normalizes the trailing slash of a path according to the `trailingSlash` option\n * in `next.config.js`.\n */\nexport const normalizePathTrailingSlash = (path: string) => {\n if (!path.startsWith('/') || process.env.__NEXT_MANUAL_TRAILING_SLASH) {\n return path\n }\n\n const { pathname, query, hash } = parsePath(path)\n if (process.env.__NEXT_TRAILING_SLASH) {\n if (/\\.[^/]+\\/?$/.test(pathname)) {\n return `${removeTrailingSlash(pathname)}${query}${hash}`\n } else if (pathname.endsWith('/')) {\n return `${pathname}${query}${hash}`\n } else {\n return `${pathname}/${query}${hash}`\n }\n }\n\n return `${removeTrailingSlash(pathname)}${query}${hash}`\n}\n","import { parsePath } from './parse-path'\n\n/**\n * Checks if a given path starts with a given prefix. It ensures it matches\n * exactly without containing extra chars. e.g. prefix /docs should replace\n * for /docs, /docs/, /docs/a but not /docsss\n * @param path The path to check.\n * @param prefix The prefix to check against.\n */\nexport function pathHasPrefix(path: string, prefix: string) {\n if (typeof path !== 'string') {\n return false\n }\n\n const { pathname } = parsePath(path)\n return pathname === prefix || pathname.startsWith(prefix + '/')\n}\n","import { pathHasPrefix } from '../shared/lib/router/utils/path-has-prefix'\n\nconst basePath = (process.env.__NEXT_ROUTER_BASEPATH as string) || ''\n\nexport function hasBasePath(path: string): boolean {\n return pathHasPrefix(path, basePath)\n}\n","import { isAbsoluteUrl, getLocationOrigin } from '../../utils'\nimport { hasBasePath } from '../../../../client/has-base-path'\n\n/**\n * Detects whether a given url is routable by the Next.js router (browser only).\n */\nexport function isLocalURL(url: string): boolean {\n // prevent a hydration mismatch on href for url with anchor refs\n if (!isAbsoluteUrl(url)) return true\n try {\n // absolute urls can be local if they are on the same origin\n const locationOrigin = getLocationOrigin()\n const resolved = new URL(url, locationOrigin)\n return resolved.origin === locationOrigin && hasBasePath(resolved.pathname)\n } catch (_) {\n return false\n }\n}\n","class UrlNode {\n placeholder: boolean = true\n children: Map = new Map()\n slugName: string | null = null\n restSlugName: string | null = null\n optionalRestSlugName: string | null = null\n\n insert(urlPath: string): void {\n this._insert(urlPath.split('/').filter(Boolean), [], false)\n }\n\n smoosh(): string[] {\n return this._smoosh()\n }\n\n private _smoosh(prefix: string = '/'): string[] {\n const childrenPaths = [...this.children.keys()].sort()\n if (this.slugName !== null) {\n childrenPaths.splice(childrenPaths.indexOf('[]'), 1)\n }\n if (this.restSlugName !== null) {\n childrenPaths.splice(childrenPaths.indexOf('[...]'), 1)\n }\n if (this.optionalRestSlugName !== null) {\n childrenPaths.splice(childrenPaths.indexOf('[[...]]'), 1)\n }\n\n const routes = childrenPaths\n .map((c) => this.children.get(c)!._smoosh(`${prefix}${c}/`))\n .reduce((prev, curr) => [...prev, ...curr], [])\n\n if (this.slugName !== null) {\n routes.push(\n ...this.children.get('[]')!._smoosh(`${prefix}[${this.slugName}]/`)\n )\n }\n\n if (!this.placeholder) {\n const r = prefix === '/' ? '/' : prefix.slice(0, -1)\n if (this.optionalRestSlugName != null) {\n throw new Error(\n `You cannot define a route with the same specificity as a optional catch-all route (\"${r}\" and \"${r}[[...${this.optionalRestSlugName}]]\").`\n )\n }\n\n routes.unshift(r)\n }\n\n if (this.restSlugName !== null) {\n routes.push(\n ...this.children\n .get('[...]')!\n ._smoosh(`${prefix}[...${this.restSlugName}]/`)\n )\n }\n\n if (this.optionalRestSlugName !== null) {\n routes.push(\n ...this.children\n .get('[[...]]')!\n ._smoosh(`${prefix}[[...${this.optionalRestSlugName}]]/`)\n )\n }\n\n return routes\n }\n\n private _insert(\n urlPaths: string[],\n slugNames: string[],\n isCatchAll: boolean\n ): void {\n if (urlPaths.length === 0) {\n this.placeholder = false\n return\n }\n\n if (isCatchAll) {\n throw new Error(`Catch-all must be the last part of the URL.`)\n }\n\n // The next segment in the urlPaths list\n let nextSegment = urlPaths[0]\n\n // Check if the segment matches `[something]`\n if (nextSegment.startsWith('[') && nextSegment.endsWith(']')) {\n // Strip `[` and `]`, leaving only `something`\n let segmentName = nextSegment.slice(1, -1)\n\n let isOptional = false\n if (segmentName.startsWith('[') && segmentName.endsWith(']')) {\n // Strip optional `[` and `]`, leaving only `something`\n segmentName = segmentName.slice(1, -1)\n isOptional = true\n }\n\n if (segmentName.startsWith('…')) {\n throw new Error(\n `Detected a three-dot character ('…') at ('${segmentName}'). Did you mean ('...')?`\n )\n }\n\n if (segmentName.startsWith('...')) {\n // Strip `...`, leaving only `something`\n segmentName = segmentName.substring(3)\n isCatchAll = true\n }\n\n if (segmentName.startsWith('[') || segmentName.endsWith(']')) {\n throw new Error(\n `Segment names may not start or end with extra brackets ('${segmentName}').`\n )\n }\n\n if (segmentName.startsWith('.')) {\n throw new Error(\n `Segment names may not start with erroneous periods ('${segmentName}').`\n )\n }\n\n function handleSlug(previousSlug: string | null, nextSlug: string) {\n if (previousSlug !== null) {\n // If the specific segment already has a slug but the slug is not `something`\n // This prevents collisions like:\n // pages/[post]/index.js\n // pages/[id]/index.js\n // Because currently multiple dynamic params on the same segment level are not supported\n if (previousSlug !== nextSlug) {\n // TODO: This error seems to be confusing for users, needs an error link, the description can be based on above comment.\n throw new Error(\n `You cannot use different slug names for the same dynamic path ('${previousSlug}' !== '${nextSlug}').`\n )\n }\n }\n\n slugNames.forEach((slug) => {\n if (slug === nextSlug) {\n throw new Error(\n `You cannot have the same slug name \"${nextSlug}\" repeat within a single dynamic path`\n )\n }\n\n if (slug.replace(/\\W/g, '') === nextSegment.replace(/\\W/g, '')) {\n throw new Error(\n `You cannot have the slug names \"${slug}\" and \"${nextSlug}\" differ only by non-word symbols within a single dynamic path`\n )\n }\n })\n\n slugNames.push(nextSlug)\n }\n\n if (isCatchAll) {\n if (isOptional) {\n if (this.restSlugName != null) {\n throw new Error(\n `You cannot use both an required and optional catch-all route at the same level (\"[...${this.restSlugName}]\" and \"${urlPaths[0]}\" ).`\n )\n }\n\n handleSlug(this.optionalRestSlugName, segmentName)\n // slugName is kept as it can only be one particular slugName\n this.optionalRestSlugName = segmentName\n // nextSegment is overwritten to [[...]] so that it can later be sorted specifically\n nextSegment = '[[...]]'\n } else {\n if (this.optionalRestSlugName != null) {\n throw new Error(\n `You cannot use both an optional and required catch-all route at the same level (\"[[...${this.optionalRestSlugName}]]\" and \"${urlPaths[0]}\").`\n )\n }\n\n handleSlug(this.restSlugName, segmentName)\n // slugName is kept as it can only be one particular slugName\n this.restSlugName = segmentName\n // nextSegment is overwritten to [...] so that it can later be sorted specifically\n nextSegment = '[...]'\n }\n } else {\n if (isOptional) {\n throw new Error(\n `Optional route parameters are not yet supported (\"${urlPaths[0]}\").`\n )\n }\n handleSlug(this.slugName, segmentName)\n // slugName is kept as it can only be one particular slugName\n this.slugName = segmentName\n // nextSegment is overwritten to [] so that it can later be sorted specifically\n nextSegment = '[]'\n }\n }\n\n // If this UrlNode doesn't have the nextSegment yet we create a new child UrlNode\n if (!this.children.has(nextSegment)) {\n this.children.set(nextSegment, new UrlNode())\n }\n\n this.children\n .get(nextSegment)!\n ._insert(urlPaths.slice(1), slugNames, isCatchAll)\n }\n}\n\n/**\n * @deprecated Use `sortSortableRoutes` or `sortPages` instead.\n */\nexport function getSortedRoutes(\n normalizedPages: ReadonlyArray\n): string[] {\n // First the UrlNode is created, and every UrlNode can have only 1 dynamic segment\n // Eg you can't have pages/[post]/abc.js and pages/[hello]/something-else.js\n // Only 1 dynamic segment per nesting level\n\n // So in the case that is test/integration/dynamic-routing it'll be this:\n // pages/[post]/comments.js\n // pages/blog/[post]/comment/[id].js\n // Both are fine because `pages/[post]` and `pages/blog` are on the same level\n // So in this case `UrlNode` created here has `this.slugName === 'post'`\n // And since your PR passed through `slugName` as an array basically it'd including it in too many possibilities\n // Instead what has to be passed through is the upwards path's dynamic names\n const root = new UrlNode()\n\n // Here the `root` gets injected multiple paths, and insert will break them up into sublevels\n normalizedPages.forEach((pagePath) => root.insert(pagePath))\n // Smoosh will then sort those sublevels up to the point where you get the correct route definition priority\n return root.smoosh()\n}\n\n/**\n * @deprecated Use `sortSortableRouteObjects` or `sortPageObjects` instead.\n */\nexport function getSortedRouteObjects(\n objects: T[],\n getter: (obj: T) => string\n): T[] {\n // We're assuming here that all the pathnames are unique, that way we can\n // sort the list and use the index as the key.\n const indexes: Record = {}\n const pathnames: string[] = []\n for (let i = 0; i < objects.length; i++) {\n const pathname = getter(objects[i])\n indexes[pathname] = i\n pathnames[i] = pathname\n }\n\n // Sort the pathnames.\n const sorted = getSortedRoutes(pathnames)\n\n // Map the sorted pathnames back to the original objects using the new sorted\n // index.\n return sorted.map((pathname) => objects[indexes[pathname]])\n}\n","/**\n * For a given page path, this function ensures that there is a leading slash.\n * If there is not a leading slash, one is added, otherwise it is noop.\n */\nexport function ensureLeadingSlash(path: string) {\n return path.startsWith('/') ? path : `/${path}`\n}\n","import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n // Use array[0] for performant purpose\n return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n segment: Segment,\n searchParams: Record\n) {\n const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n if (isPageSegment) {\n const stringifiedQuery = JSON.stringify(searchParams)\n return stringifiedQuery !== '{}'\n ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n : PAGE_SEGMENT_KEY\n }\n\n return segment\n}\n\nexport function computeSelectedLayoutSegment(\n segments: string[] | null,\n parallelRouteKey: string\n): string | null {\n if (!segments || segments.length === 0) {\n return null\n }\n\n // For 'children', use first segment; for other parallel routes, use last segment\n const rawSegment =\n parallelRouteKey === 'children'\n ? segments[0]\n : segments[segments.length - 1]\n\n // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n // Returning an internal value like `__DEFAULT__` would be confusing\n return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n tree: FlightRouterState,\n parallelRouteKey: string,\n first = true,\n segmentPath: string[] = []\n): string[] {\n let node: FlightRouterState\n if (first) {\n // Use the provided parallel route key on the first parallel route\n node = tree[1][parallelRouteKey]\n } else {\n // After first parallel route prefer children, if there's no children pick the first parallel route.\n const parallelRoutes = tree[1]\n node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n }\n\n if (!node) return segmentPath\n const segment = node[0]\n\n let segmentValue = getSegmentValue(segment)\n\n if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n return segmentPath\n }\n\n segmentPath.push(segmentValue)\n\n return getSelectedLayoutSegmentPath(\n node,\n parallelRouteKey,\n false,\n segmentPath\n )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\nexport const NOT_FOUND_SEGMENT_KEY = '/_not-found'\n","import { ensureLeadingSlash } from '../../page-path/ensure-leading-slash'\nimport { isGroupSegment } from '../../segment'\n\n/**\n * Normalizes an app route so it represents the actual request path. Essentially\n * performing the following transformations:\n *\n * - `/(dashboard)/user/[id]/page` to `/user/[id]`\n * - `/(dashboard)/account/page` to `/account`\n * - `/user/[id]/page` to `/user/[id]`\n * - `/account/page` to `/account`\n * - `/page` to `/`\n * - `/(dashboard)/user/[id]/route` to `/user/[id]`\n * - `/(dashboard)/account/route` to `/account`\n * - `/user/[id]/route` to `/user/[id]`\n * - `/account/route` to `/account`\n * - `/route` to `/`\n * - `/` to `/`\n *\n * @param route the app route to normalize\n * @returns the normalized pathname\n */\nexport function normalizeAppPath(route: string) {\n return ensureLeadingSlash(\n route.split('/').reduce((pathname, segment, index, segments) => {\n // Empty segments are ignored.\n if (!segment) {\n return pathname\n }\n\n // Groups are ignored.\n if (isGroupSegment(segment)) {\n return pathname\n }\n\n // Parallel segments are ignored.\n if (segment[0] === '@') {\n return pathname\n }\n\n // The last segment (if it's a leaf) should be ignored.\n if (\n (segment === 'page' || segment === 'route') &&\n index === segments.length - 1\n ) {\n return pathname\n }\n\n return `${pathname}/${segment}`\n }, '')\n )\n}\n\n/**\n * Comparator for sorting app paths so that parallel slot paths (containing\n * `/@`) come before the children/root page path. This ensures the last item\n * is always the children page, which is what `renderPageComponent` reads via\n * `appPaths[appPaths.length - 1]`.\n *\n * Without this, route group prefixes like `(group)` (char code 0x28) sort\n * before `@` (0x40), causing the children page to sort first instead of last\n * and leading to a manifest mismatch / 404 in webpack dev mode.\n */\nexport function compareAppPaths(a: string, b: string): number {\n const aHasSlot = a.includes('/@')\n const bHasSlot = b.includes('/@')\n if (aHasSlot && !bHasSlot) return -1\n if (!aHasSlot && bHasSlot) return 1\n return a.localeCompare(b)\n}\n\n/**\n * Strips the `.rsc` extension if it's in the pathname.\n * Since this function is used on full urls it checks `?` for searchParams handling.\n */\nexport function normalizeRscURL(url: string) {\n return url.replace(\n /\\.rsc($|\\?)/,\n // $1 ensures `?` is preserved\n '$1'\n )\n}\n","import { normalizeAppPath } from './app-paths'\n\n// order matters here, the first match will be used\nexport const INTERCEPTION_ROUTE_MARKERS = [\n '(..)(..)',\n '(.)',\n '(..)',\n '(...)',\n] as const\n\nexport type InterceptionMarker = (typeof INTERCEPTION_ROUTE_MARKERS)[number]\n\nexport function isInterceptionRouteAppPath(path: string): boolean {\n // TODO-APP: add more serious validation\n return (\n path\n .split('/')\n .find((segment) =>\n INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n ) !== undefined\n )\n}\n\ntype InterceptionRouteInformation = {\n /**\n * The intercepting route. This is the route that is being intercepted or the\n * route that the user was coming from. This is matched by the Next-Url\n * header.\n */\n interceptingRoute: string\n\n /**\n * The intercepted route. This is the route that is being intercepted or the\n * route that the user is going to. This is matched by the request pathname.\n */\n interceptedRoute: string\n}\n\nexport function extractInterceptionRouteInformation(\n path: string\n): InterceptionRouteInformation {\n let interceptingRoute: string | undefined\n let marker: (typeof INTERCEPTION_ROUTE_MARKERS)[number] | undefined\n let interceptedRoute: string | undefined\n\n for (const segment of path.split('/')) {\n marker = INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n if (marker) {\n ;[interceptingRoute, interceptedRoute] = path.split(marker, 2)\n break\n }\n }\n\n if (!interceptingRoute || !marker || !interceptedRoute) {\n throw new Error(\n `Invalid interception route: ${path}. Must be in the format //(..|...|..)(..)/`\n )\n }\n\n interceptingRoute = normalizeAppPath(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed\n\n switch (marker) {\n case '(.)':\n // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route\n if (interceptingRoute === '/') {\n interceptedRoute = `/${interceptedRoute}`\n } else {\n interceptedRoute = interceptingRoute + '/' + interceptedRoute\n }\n break\n case '(..)':\n // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route\n if (interceptingRoute === '/') {\n throw new Error(\n `Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`\n )\n }\n interceptedRoute = interceptingRoute\n .split('/')\n .slice(0, -1)\n .concat(interceptedRoute)\n .join('/')\n break\n case '(...)':\n // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route\n interceptedRoute = '/' + interceptedRoute\n break\n case '(..)(..)':\n // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route\n\n const splitInterceptingRoute = interceptingRoute.split('/')\n if (splitInterceptingRoute.length <= 2) {\n throw new Error(\n `Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`\n )\n }\n\n interceptedRoute = splitInterceptingRoute\n .slice(0, -2)\n .concat(interceptedRoute)\n .join('/')\n break\n default:\n throw new Error('Invariant: unexpected marker')\n }\n\n return { interceptingRoute, interceptedRoute }\n}\n","import {\n extractInterceptionRouteInformation,\n isInterceptionRouteAppPath,\n} from './interception-routes'\n\n// Identify /.*[param].*/ in route string\nconst TEST_ROUTE = /\\/[^/]*\\[[^/]+\\][^/]*(?=\\/|$)/\n\n// Identify /[param]/ in route string\nconst TEST_STRICT_ROUTE = /\\/\\[[^/]+\\](?=\\/|$)/\n\n/**\n * Check if a route is dynamic.\n *\n * @param route - The route to check.\n * @param strict - Whether to use strict mode which prohibits segments with prefixes/suffixes (default: true).\n * @returns Whether the route is dynamic.\n */\nexport function isDynamicRoute(route: string, strict: boolean = true): boolean {\n if (isInterceptionRouteAppPath(route)) {\n route = extractInterceptionRouteInformation(route).interceptedRoute\n }\n\n if (strict) {\n return TEST_STRICT_ROUTE.test(route)\n }\n\n return TEST_ROUTE.test(route)\n}\n","export { getSortedRoutes, getSortedRouteObjects } from './sorted-routes'\nexport { isDynamicRoute } from './is-dynamic'\n","(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var n=e;Object.defineProperty(n,\"__esModule\",{value:true});n.pathToRegexp=n.tokensToRegexp=n.regexpToFunction=n.match=n.tokensToFunction=n.compile=n.parse=void 0;function lexer(e){var n=[];var r=0;while(r=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122||o===95){a+=e[i++];continue}break}if(!a)throw new TypeError(\"Missing parameter name at \".concat(r));n.push({type:\"NAME\",index:r,value:a});r=i;continue}if(t===\"(\"){var c=1;var f=\"\";var i=r+1;if(e[i]===\"?\"){throw new TypeError('Pattern cannot start with \"?\" at '.concat(i))}while(i-1)return true}return false};var safePattern=function(e){var n=c[c.length-1];var r=e||(n&&typeof n===\"string\"?n:\"\");if(n&&!r){throw new TypeError('Must have text between two parameters, missing text after \"'.concat(n.name,'\"'))}if(!r||isSafe(r))return\"[^\".concat(escapeString(o),\"]+?\");return\"(?:(?!\".concat(escapeString(r),\")[^\").concat(escapeString(o),\"])+?\")};while(u)?(?!\\?)/g;var t=0;var a=r.exec(e.source);while(a){n.push({name:a[1]||t++,prefix:\"\",suffix:\"\",modifier:\"\",pattern:\"\"});a=r.exec(e.source)}return e}function arrayToRegexp(e,n,r){var t=e.map((function(e){return pathToRegexp(e,n,r).source}));return new RegExp(\"(?:\".concat(t.join(\"|\"),\")\"),flags(r))}function stringToRegexp(e,n,r){return tokensToRegexp(parse(e,r),n,r)}function tokensToRegexp(e,n,r){if(r===void 0){r={}}var t=r.strict,a=t===void 0?false:t,i=r.start,o=i===void 0?true:i,c=r.end,f=c===void 0?true:c,u=r.encode,p=u===void 0?function(e){return e}:u,v=r.delimiter,s=v===void 0?\"/#?\":v,d=r.endsWith,g=d===void 0?\"\":d;var x=\"[\".concat(escapeString(g),\"]|$\");var h=\"[\".concat(escapeString(s),\"]\");var l=o?\"^\":\"\";for(var m=0,T=e;m-1:A===undefined;if(!a){l+=\"(?:\".concat(h,\"(?=\").concat(x,\"))?\")}if(!_){l+=\"(?=\".concat(h,\"|\").concat(x,\")\")}}return new RegExp(l,flags(r))}n.tokensToRegexp=tokensToRegexp;function pathToRegexp(e,n,r){if(e instanceof RegExp)return regexpToRegexp(e,n);if(Array.isArray(e))return arrayToRegexp(e,n,r);return stringToRegexp(e,n,r)}n.pathToRegexp=pathToRegexp})();module.exports=e})();","import type { Token } from 'next/dist/compiled/path-to-regexp'\n\n/**\n * Route pattern normalization utilities for path-to-regexp compatibility.\n *\n * path-to-regexp 6.3.0+ introduced stricter validation that rejects certain\n * patterns commonly used in Next.js interception routes. This module provides\n * normalization functions to make Next.js route patterns compatible with the\n * updated library while preserving all functionality.\n */\n\n/**\n * Internal separator used to normalize adjacent parameter patterns.\n * This unique marker is inserted between adjacent parameters and stripped out\n * during parameter extraction to avoid conflicts with real URL content.\n */\nexport const PARAM_SEPARATOR = '_NEXTSEP_'\n\n/**\n * Detects if a route pattern needs normalization for path-to-regexp compatibility.\n */\nexport function hasAdjacentParameterIssues(route: string): boolean {\n if (typeof route !== 'string') return false\n\n // Check for interception route markers followed immediately by parameters\n // Pattern: /(.):param, /(..):param, /(...):param, /(.)(.):param etc.\n // These patterns cause \"Must have text between two parameters\" errors\n if (/\\/\\(\\.{1,3}\\):[^/\\s]+/.test(route)) {\n return true\n }\n\n // Check for basic adjacent parameters without separators\n // Pattern: :param1:param2 (but not :param* or other URL patterns)\n if (/:[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*/.test(route)) {\n return true\n }\n\n return false\n}\n\n/**\n * Normalizes route patterns that have adjacent parameters without text between them.\n * Inserts a unique separator that can be safely stripped out later.\n */\nexport function normalizeAdjacentParameters(route: string): string {\n let normalized = route\n\n // Handle interception route patterns: (.):param -> (.)_NEXTSEP_:param\n normalized = normalized.replace(\n /(\\([^)]*\\)):([^/\\s]+)/g,\n `$1${PARAM_SEPARATOR}:$2`\n )\n\n // Handle other adjacent parameter patterns: :param1:param2 -> :param1_NEXTSEP_:param2\n normalized = normalized.replace(/:([^:/\\s)]+)(?=:)/g, `:$1${PARAM_SEPARATOR}`)\n\n return normalized\n}\n\n/**\n * Normalizes tokens that have repeating modifiers (* or +) but empty prefix and suffix.\n *\n * path-to-regexp 6.3.0+ introduced validation that throws:\n * \"Can not repeat without prefix/suffix\"\n *\n * This occurs when a token has modifier: '*' or '+' with both prefix: '' and suffix: ''\n */\nexport function normalizeTokensForRegexp(tokens: Token[]): Token[] {\n return tokens.map((token) => {\n // Token union type: Token = string | TokenObject\n // Literal path segments are strings, parameters/wildcards are objects\n if (\n typeof token === 'object' &&\n token !== null &&\n // Not all token objects have 'modifier' property (e.g., simple text tokens)\n 'modifier' in token &&\n // Only repeating modifiers (* or +) cause the validation error\n // Other modifiers like '?' (optional) are fine\n (token.modifier === '*' || token.modifier === '+') &&\n // Token objects can have different shapes depending on route pattern\n 'prefix' in token &&\n 'suffix' in token &&\n // Both prefix and suffix must be empty strings\n // This is what causes the validation error in path-to-regexp\n token.prefix === '' &&\n token.suffix === ''\n ) {\n // Add minimal prefix to satisfy path-to-regexp validation\n // We use '/' as it's the most common path delimiter and won't break route matching\n // The prefix gets used in regex generation but doesn't affect parameter extraction\n return {\n ...token,\n prefix: '/',\n }\n }\n return token\n })\n}\n\n/**\n * Strips normalization separators from compiled pathname.\n * This removes separators that were inserted by normalizeAdjacentParameters\n * to satisfy path-to-regexp validation.\n *\n * Only removes separators in the specific contexts where they were inserted:\n * - After interception route markers: (.)_NEXTSEP_ -> (.)\n *\n * This targeted approach ensures we don't accidentally remove the separator\n * from legitimate user content.\n */\nexport function stripNormalizedSeparators(pathname: string): string {\n // Remove separator after interception route markers\n // Pattern: (.)_NEXTSEP_ -> (.), (..)_NEXTSEP_ -> (..), etc.\n // The separator appears after the closing paren of interception markers\n return pathname.replace(new RegExp(`\\\\)${PARAM_SEPARATOR}`, 'g'), ')')\n}\n\n/**\n * Strips normalization separators from extracted route parameters.\n * Used by both server and client code to clean up parameters after route matching.\n */\nexport function stripParameterSeparators(\n params: Record\n): Record {\n const cleaned: Record = {}\n\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === 'string') {\n // Remove the separator if it appears at the start of parameter values\n cleaned[key] = value.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n } else if (Array.isArray(value)) {\n // Handle array parameters (from repeated route segments)\n cleaned[key] = value.map((item) =>\n typeof item === 'string'\n ? item.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n : item\n )\n } else {\n cleaned[key] = value\n }\n }\n\n return cleaned\n}\n","/**\n * Client-safe utilities for route matching that don't import server-side\n * utilities to avoid bundling issues with Turbopack\n */\n\nimport type {\n Key,\n TokensToRegexpOptions,\n ParseOptions,\n TokensToFunctionOptions,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n pathToRegexp,\n compile,\n regexpToFunction,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n hasAdjacentParameterIssues,\n normalizeAdjacentParameters,\n stripParameterSeparators,\n stripNormalizedSeparators,\n} from '../../../../lib/route-pattern-normalizer'\n\n/**\n * Client-safe wrapper around pathToRegexp that handles path-to-regexp 6.3.0+ validation errors.\n * This includes both \"Can not repeat without prefix/suffix\" and \"Must have text between parameters\" errors.\n */\nexport function safePathToRegexp(\n route: string | RegExp | Array,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions\n): RegExp {\n if (typeof route !== 'string') {\n return pathToRegexp(route, keys, options)\n }\n\n // Check if normalization is needed and cache the result\n const needsNormalization = hasAdjacentParameterIssues(route)\n const routeToUse = needsNormalization\n ? normalizeAdjacentParameters(route)\n : route\n\n try {\n return pathToRegexp(routeToUse, keys, options)\n } catch (error) {\n // Only try normalization if we haven't already normalized\n if (!needsNormalization) {\n try {\n const normalizedRoute = normalizeAdjacentParameters(route)\n return pathToRegexp(normalizedRoute, keys, options)\n } catch (retryError) {\n // If that doesn't work, fall back to original error\n throw error\n }\n }\n throw error\n }\n}\n\n/**\n * Client-safe wrapper around compile that handles path-to-regexp 6.3.0+ validation errors.\n * No server-side error reporting to avoid bundling issues.\n * When normalization is applied, the returned compiler function automatically strips\n * the internal separator from the output URL.\n */\nexport function safeCompile(\n route: string,\n options?: TokensToFunctionOptions & ParseOptions\n) {\n // Check if normalization is needed and cache the result\n const needsNormalization = hasAdjacentParameterIssues(route)\n const routeToUse = needsNormalization\n ? normalizeAdjacentParameters(route)\n : route\n\n try {\n const compiler = compile(routeToUse, options)\n\n // If we normalized the route, wrap the compiler to strip separators from output\n // The normalization inserts _NEXTSEP_ as a literal string in the pattern to satisfy\n // path-to-regexp validation, but we don't want it in the final compiled URL\n if (needsNormalization) {\n return (params: any) => {\n return stripNormalizedSeparators(compiler(params))\n }\n }\n\n return compiler\n } catch (error) {\n // Only try normalization if we haven't already normalized\n if (!needsNormalization) {\n try {\n const normalizedRoute = normalizeAdjacentParameters(route)\n const compiler = compile(normalizedRoute, options)\n\n // Wrap the compiler to strip separators from output\n return (params: any) => {\n return stripNormalizedSeparators(compiler(params))\n }\n } catch (retryError) {\n // If that doesn't work, fall back to original error\n throw error\n }\n }\n throw error\n }\n}\n\n/**\n * Client-safe wrapper around regexpToFunction that automatically cleans parameters.\n */\nexport function safeRegexpToFunction<\n T extends Record = Record,\n>(regexp: RegExp, keys?: Key[]): (pathname: string) => { params: T } | false {\n const originalMatcher = regexpToFunction(regexp, keys || [])\n\n return (pathname: string) => {\n const result = originalMatcher(pathname)\n if (!result) return false\n\n // Clean parameters before returning\n return {\n ...result,\n params: stripParameterSeparators(result.params as any) as T,\n }\n }\n}\n\n/**\n * Safe wrapper for route matcher functions that automatically cleans parameters.\n * This is client-safe and doesn't import path-to-regexp.\n */\nexport function safeRouteMatcher>(\n matcherFn: (pathname: string) => false | T\n): (pathname: string) => false | T {\n return (pathname: string) => {\n const result = matcherFn(pathname)\n if (!result) return false\n\n // Clean parameters before returning\n return stripParameterSeparators(result) as T\n }\n}\n","import type { Group } from './route-regex'\nimport { DecodeError } from '../../utils'\nimport type { Params } from '../../../../server/request/params'\nimport { safeRouteMatcher } from './route-match-utils'\n\nexport interface RouteMatchFn {\n (pathname: string): false | Params\n}\n\ntype RouteMatcherOptions = {\n // We only use the exec method of the RegExp object. This helps us avoid using\n // type assertions that the passed in properties are of the correct type.\n re: Pick\n groups: Record\n}\n\nexport function getRouteMatcher({\n re,\n groups,\n}: RouteMatcherOptions): RouteMatchFn {\n const rawMatcher = (pathname: string) => {\n const routeMatch = re.exec(pathname)\n if (!routeMatch) return false\n\n const decode = (param: string) => {\n try {\n return decodeURIComponent(param)\n } catch {\n throw new DecodeError('failed to decode param')\n }\n }\n\n const params: Params = {}\n for (const [key, group] of Object.entries(groups)) {\n const match = routeMatch[group.pos]\n if (match !== undefined) {\n if (group.repeat) {\n params[key] = match.split('/').map((entry) => decode(entry))\n } else {\n params[key] = decode(match)\n }\n }\n }\n\n return params\n }\n\n // Wrap with safe matcher to handle parameter cleaning\n return safeRouteMatcher(rawMatcher)\n}\n","import type { ServerRuntime } from '../types'\n\nexport const TEXT_PLAIN_CONTENT_TYPE_HEADER = 'text/plain'\nexport const HTML_CONTENT_TYPE_HEADER = 'text/html; charset=utf-8'\nexport const JSON_CONTENT_TYPE_HEADER = 'application/json; charset=utf-8'\nexport const NEXT_QUERY_PARAM_PREFIX = 'nxtP'\nexport const NEXT_INTERCEPTION_MARKER_PREFIX = 'nxtI'\n\nexport const MATCHED_PATH_HEADER = 'x-matched-path'\nexport const PRERENDER_REVALIDATE_HEADER = 'x-prerender-revalidate'\nexport const PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER =\n 'x-prerender-revalidate-if-generated'\n\nexport const RSC_SEGMENTS_DIR_SUFFIX = '.segments'\nexport const RSC_SEGMENT_SUFFIX = '.segment.rsc'\nexport const RSC_SUFFIX = '.rsc'\nexport const ACTION_SUFFIX = '.action'\nexport const NEXT_DATA_SUFFIX = '.json'\nexport const NEXT_META_SUFFIX = '.meta'\nexport const NEXT_BODY_SUFFIX = '.body'\n\nexport const NEXT_NAV_DEPLOYMENT_ID_HEADER = 'x-nextjs-deployment-id'\n\nexport const NEXT_CACHE_TAGS_HEADER = 'x-next-cache-tags'\nexport const NEXT_CACHE_REVALIDATED_TAGS_HEADER = 'x-next-revalidated-tags'\nexport const NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER =\n 'x-next-revalidate-tag-token'\n\nexport const NEXT_RESUME_HEADER = 'next-resume'\nexport const NEXT_RESUME_STATE_LENGTH_HEADER = 'x-next-resume-state-length'\n\n// if these change make sure we update the related\n// documentation as well\nexport const NEXT_CACHE_TAG_MAX_ITEMS = 128\nexport const NEXT_CACHE_TAG_MAX_LENGTH = 256\nexport const NEXT_CACHE_SOFT_TAG_MAX_LENGTH = 1024\nexport const NEXT_CACHE_IMPLICIT_TAG_ID = '_N_T_'\nexport const NEXT_CACHE_ROOT_PARAM_TAG_ID = '_N_RP_'\n\n// in seconds\nexport const CACHE_ONE_YEAR_SECONDS = 31536000\n\n// in seconds, represents revalidate=false. I.e. never revaliate.\n// We use this value since it can be represented as a V8 SMI for optimal performance.\n// It can also be serialized as JSON if it ever leaks accidentally as an actual value.\nexport const INFINITE_CACHE = 0xfffffffe\n\n// Patterns to detect middleware files\nexport const MIDDLEWARE_FILENAME = 'middleware'\nexport const MIDDLEWARE_LOCATION_REGEXP = `(?:src/)?${MIDDLEWARE_FILENAME}`\n\n// Patterns to detect proxy files (replacement for middleware)\nexport const PROXY_FILENAME = 'proxy'\nexport const PROXY_LOCATION_REGEXP = `(?:src/)?${PROXY_FILENAME}`\n\n// Pattern to detect instrumentation hooks file\nexport const INSTRUMENTATION_HOOK_FILENAME = 'instrumentation'\n\n// Because on Windows absolute paths in the generated code can break because of numbers, eg 1 in the path,\n// we have to use a private alias\nexport const PAGES_DIR_ALIAS = 'private-next-pages'\nexport const DOT_NEXT_ALIAS = 'private-dot-next'\nexport const ROOT_DIR_ALIAS = 'private-next-root-dir'\nexport const APP_DIR_ALIAS = 'private-next-app-dir'\nexport const RSC_MOD_REF_PROXY_ALIAS = 'private-next-rsc-mod-ref-proxy'\nexport const RSC_ACTION_VALIDATE_ALIAS = 'private-next-rsc-action-validate'\nexport const RSC_ACTION_PROXY_ALIAS = 'private-next-rsc-server-reference'\nexport const RSC_CACHE_WRAPPER_ALIAS = 'private-next-rsc-cache-wrapper'\nexport const RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS =\n 'private-next-rsc-track-dynamic-import'\nexport const RSC_ACTION_ENCRYPTION_ALIAS = 'private-next-rsc-action-encryption'\nexport const RSC_ACTION_CLIENT_WRAPPER_ALIAS =\n 'private-next-rsc-action-client-wrapper'\n\nexport const PUBLIC_DIR_MIDDLEWARE_CONFLICT = `You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict`\n\nexport const SSG_GET_INITIAL_PROPS_CONFLICT = `You can not use getInitialProps with getStaticProps. To use SSG, please remove your getInitialProps`\n\nexport const SERVER_PROPS_GET_INIT_PROPS_CONFLICT = `You can not use getInitialProps with getServerSideProps. Please remove getInitialProps.`\n\nexport const SERVER_PROPS_SSG_CONFLICT = `You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps`\n\nexport const STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR = `can not have getInitialProps/getServerSideProps, https://nextjs.org/docs/messages/404-get-initial-props`\n\nexport const SERVER_PROPS_EXPORT_ERROR = `pages with \\`getServerSideProps\\` can not be exported. See more info here: https://nextjs.org/docs/messages/gssp-export`\n\nexport const GSP_NO_RETURNED_VALUE =\n 'Your `getStaticProps` function did not return an object. Did you forget to add a `return`?'\nexport const GSSP_NO_RETURNED_VALUE =\n 'Your `getServerSideProps` function did not return an object. Did you forget to add a `return`?'\n\nexport const UNSTABLE_REVALIDATE_RENAME_ERROR =\n 'The `unstable_revalidate` property is available for general use.\\n' +\n 'Please use `revalidate` instead.'\n\nexport const GSSP_COMPONENT_MEMBER_ERROR = `can not be attached to a page's component and must be exported from the page. See more info here: https://nextjs.org/docs/messages/gssp-component-member`\n\nexport const NON_STANDARD_NODE_ENV = `You are using a non-standard \"NODE_ENV\" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://nextjs.org/docs/messages/non-standard-node-env`\n\nexport const SSG_FALLBACK_EXPORT_ERROR = `Pages with \\`fallback\\` enabled in \\`getStaticPaths\\` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export`\n\nexport const ESLINT_DEFAULT_DIRS = ['app', 'pages', 'components', 'lib', 'src']\n\nexport const SERVER_RUNTIME: Record = {\n edge: 'edge',\n experimentalEdge: 'experimental-edge',\n nodejs: 'nodejs',\n}\n\nexport const WEB_SOCKET_MAX_RECONNECTIONS = 12\n\n/**\n * The names of the webpack layers. These layers are the primitives for the\n * webpack chunks.\n */\nconst WEBPACK_LAYERS_NAMES = {\n /**\n * The layer for the shared code between the client and server bundles.\n */\n shared: 'shared',\n /**\n * The layer for server-only runtime and picking up `react-server` export conditions.\n * Including app router RSC pages and app router custom routes and metadata routes.\n */\n reactServerComponents: 'rsc',\n /**\n * Server Side Rendering layer for app (ssr).\n */\n serverSideRendering: 'ssr',\n /**\n * The browser client bundle layer for actions.\n */\n actionBrowser: 'action-browser',\n /**\n * The Node.js bundle layer for the API routes.\n */\n apiNode: 'api-node',\n /**\n * The Edge Lite bundle layer for the API routes.\n */\n apiEdge: 'api-edge',\n /**\n * The layer for the middleware code.\n */\n middleware: 'middleware',\n /**\n * The layer for the instrumentation hooks.\n */\n instrument: 'instrument',\n /**\n * The layer for assets on the edge.\n */\n edgeAsset: 'edge-asset',\n /**\n * The browser client bundle layer for App directory.\n */\n appPagesBrowser: 'app-pages-browser',\n /**\n * The browser client bundle layer for Pages directory.\n */\n pagesDirBrowser: 'pages-dir-browser',\n /**\n * The Edge Lite bundle layer for Pages directory.\n */\n pagesDirEdge: 'pages-dir-edge',\n /**\n * The Node.js bundle layer for Pages directory.\n */\n pagesDirNode: 'pages-dir-node',\n} as const\n\nexport type WebpackLayerName =\n (typeof WEBPACK_LAYERS_NAMES)[keyof typeof WEBPACK_LAYERS_NAMES]\n\nconst WEBPACK_LAYERS = {\n ...WEBPACK_LAYERS_NAMES,\n GROUP: {\n builtinReact: [\n WEBPACK_LAYERS_NAMES.reactServerComponents,\n WEBPACK_LAYERS_NAMES.actionBrowser,\n ],\n serverOnly: [\n WEBPACK_LAYERS_NAMES.reactServerComponents,\n WEBPACK_LAYERS_NAMES.actionBrowser,\n WEBPACK_LAYERS_NAMES.instrument,\n WEBPACK_LAYERS_NAMES.middleware,\n ],\n neutralTarget: [\n // pages api\n WEBPACK_LAYERS_NAMES.apiNode,\n WEBPACK_LAYERS_NAMES.apiEdge,\n ],\n clientOnly: [\n WEBPACK_LAYERS_NAMES.serverSideRendering,\n WEBPACK_LAYERS_NAMES.appPagesBrowser,\n ],\n bundled: [\n WEBPACK_LAYERS_NAMES.reactServerComponents,\n WEBPACK_LAYERS_NAMES.actionBrowser,\n WEBPACK_LAYERS_NAMES.serverSideRendering,\n WEBPACK_LAYERS_NAMES.appPagesBrowser,\n WEBPACK_LAYERS_NAMES.shared,\n WEBPACK_LAYERS_NAMES.instrument,\n WEBPACK_LAYERS_NAMES.middleware,\n ],\n appPages: [\n // app router pages and layouts\n WEBPACK_LAYERS_NAMES.reactServerComponents,\n WEBPACK_LAYERS_NAMES.serverSideRendering,\n WEBPACK_LAYERS_NAMES.appPagesBrowser,\n WEBPACK_LAYERS_NAMES.actionBrowser,\n ],\n },\n}\n\nconst WEBPACK_RESOURCE_QUERIES = {\n edgeSSREntry: '__next_edge_ssr_entry__',\n metadata: '__next_metadata__',\n metadataRoute: '__next_metadata_route__',\n metadataImageMeta: '__next_metadata_image_meta__',\n}\n\nexport { WEBPACK_LAYERS, WEBPACK_RESOURCE_QUERIES }\n","// regexp is based on https://github.com/sindresorhus/escape-string-regexp\nconst reHasRegExp = /[|\\\\{}()[\\]^$+*?.-]/\nconst reReplaceRegExp = /[|\\\\{}()[\\]^$+*?.-]/g\n\nexport function escapeStringRegexp(str: string) {\n // see also: https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/escapeRegExp.js#L23\n if (reHasRegExp.test(str)) {\n return str.replace(reReplaceRegExp, '\\\\$&')\n }\n return str\n}\n","export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import { DEFAULT_SEGMENT_KEY } from '../../segment'\nimport type { LoaderTree } from '../../../../server/lib/app-dir-module'\n\nexport function parseLoaderTree(tree: LoaderTree) {\n const [segment, parallelRoutes, modules, staticSiblings] = tree\n const { layout, template } = modules\n let { page } = modules\n // a __DEFAULT__ segment means that this route didn't match any of the\n // segments in the route, so we should use the default page\n page = segment === DEFAULT_SEGMENT_KEY ? modules.defaultPage : page\n\n const conventionPath = layout?.[1] || template?.[1] || page?.[1]\n\n return {\n page,\n segment,\n modules,\n /* it can be either layout / template / page */\n conventionPath,\n parallelRoutes,\n staticSiblings,\n }\n}\n","import { INTERCEPTION_ROUTE_MARKERS } from './interception-routes'\nimport type { DynamicParamTypes } from '../../app-router-types'\n\nexport type SegmentParam = {\n paramName: string\n paramType: DynamicParamTypes\n}\n\n/**\n * Parse dynamic route segment to type of parameter\n */\nexport function getSegmentParam(segment: string): SegmentParam | null {\n const interceptionMarker = INTERCEPTION_ROUTE_MARKERS.find((marker) =>\n segment.startsWith(marker)\n )\n\n // if an interception marker is part of the path segment, we need to jump ahead\n // to the relevant portion for param parsing\n if (interceptionMarker) {\n segment = segment.slice(interceptionMarker.length)\n }\n\n if (segment.startsWith('[[...') && segment.endsWith(']]')) {\n return {\n // TODO-APP: Optional catchall does not currently work with parallel routes,\n // so for now aren't handling a potential interception marker.\n paramType: 'optional-catchall',\n paramName: segment.slice(5, -2),\n }\n }\n\n if (segment.startsWith('[...') && segment.endsWith(']')) {\n return {\n paramType: interceptionMarker\n ? `catchall-intercepted-${interceptionMarker}`\n : 'catchall',\n paramName: segment.slice(4, -1),\n }\n }\n\n if (segment.startsWith('[') && segment.endsWith(']')) {\n return {\n paramType: interceptionMarker\n ? `dynamic-intercepted-${interceptionMarker}`\n : 'dynamic',\n paramName: segment.slice(1, -1),\n }\n }\n\n return null\n}\n\nexport function isCatchAll(\n type: DynamicParamTypes\n): type is\n | 'catchall'\n | 'catchall-intercepted-(..)(..)'\n | 'catchall-intercepted-(.)'\n | 'catchall-intercepted-(..)'\n | 'catchall-intercepted-(...)'\n | 'optional-catchall' {\n return (\n type === 'catchall' ||\n type === 'catchall-intercepted-(..)(..)' ||\n type === 'catchall-intercepted-(.)' ||\n type === 'catchall-intercepted-(..)' ||\n type === 'catchall-intercepted-(...)' ||\n type === 'optional-catchall'\n )\n}\n\nexport function getParamProperties(paramType: DynamicParamTypes): {\n repeat: boolean\n optional: boolean\n} {\n let repeat = false\n let optional = false\n\n switch (paramType) {\n case 'catchall':\n case 'catchall-intercepted-(..)(..)':\n case 'catchall-intercepted-(.)':\n case 'catchall-intercepted-(..)':\n case 'catchall-intercepted-(...)':\n repeat = true\n break\n case 'optional-catchall':\n repeat = true\n optional = true\n break\n case 'dynamic':\n case 'dynamic-intercepted-(..)(..)':\n case 'dynamic-intercepted-(.)':\n case 'dynamic-intercepted-(..)':\n case 'dynamic-intercepted-(...)':\n break\n default:\n paramType satisfies never\n }\n\n return { repeat, optional }\n}\n","import { InvariantError } from '../../invariant-error'\nimport { getSegmentParam, type SegmentParam } from '../utils/get-segment-param'\nimport {\n INTERCEPTION_ROUTE_MARKERS,\n type InterceptionMarker,\n} from '../utils/interception-routes'\n\nexport type RouteGroupAppRouteSegment = {\n type: 'route-group'\n name: string\n\n /**\n * If present, this segment has an interception marker prefixing it.\n */\n interceptionMarker?: InterceptionMarker\n}\n\nexport type ParallelRouteAppRouteSegment = {\n type: 'parallel-route'\n name: string\n\n /**\n * If present, this segment has an interception marker prefixing it.\n */\n interceptionMarker?: InterceptionMarker\n}\n\nexport type StaticAppRouteSegment = {\n type: 'static'\n name: string\n\n /**\n * If present, this segment has an interception marker prefixing it.\n */\n interceptionMarker?: InterceptionMarker\n}\n\nexport type DynamicAppRouteSegment = {\n type: 'dynamic'\n name: string\n param: SegmentParam\n\n /**\n * If present, this segment has an interception marker prefixing it.\n */\n interceptionMarker?: InterceptionMarker\n}\n\n/**\n * Represents a single segment in a route path.\n * Can be either static (e.g., \"blog\") or dynamic (e.g., \"[slug]\").\n */\nexport type AppRouteSegment =\n | StaticAppRouteSegment\n | DynamicAppRouteSegment\n | RouteGroupAppRouteSegment\n | ParallelRouteAppRouteSegment\n\nexport type NormalizedAppRouteSegment =\n | StaticAppRouteSegment\n | DynamicAppRouteSegment\n\nfunction normalizeEncodedDynamicPlaceholder(segment: string): string {\n if (!/%5b|%5d/i.test(segment)) {\n return segment\n }\n\n try {\n const decodedSegment = decodeURIComponent(segment)\n return getSegmentParam(decodedSegment) ? decodedSegment : segment\n } catch {\n return segment\n }\n}\n\nexport function parseAppRouteSegment(segment: string): AppRouteSegment | null {\n if (segment === '') {\n return null\n }\n\n // Check if the segment starts with an interception marker\n const interceptionMarker = INTERCEPTION_ROUTE_MARKERS.find((m) =>\n segment.startsWith(m)\n )\n\n const param = getSegmentParam(segment)\n if (param) {\n return {\n type: 'dynamic',\n name: segment,\n param,\n interceptionMarker,\n }\n } else if (segment.startsWith('(') && segment.endsWith(')')) {\n return {\n type: 'route-group',\n name: segment,\n interceptionMarker,\n }\n } else if (segment.startsWith('@')) {\n return {\n type: 'parallel-route',\n name: segment,\n interceptionMarker,\n }\n } else {\n return {\n type: 'static',\n name: segment,\n interceptionMarker,\n }\n }\n}\n\nexport type AppRoute = {\n normalized: boolean\n pathname: string\n segments: AppRouteSegment[]\n dynamicSegments: DynamicAppRouteSegment[]\n interceptionMarker: InterceptionMarker | undefined\n interceptingRoute: AppRoute | undefined\n interceptedRoute: AppRoute | undefined\n}\n\nexport type NormalizedAppRoute = Omit & {\n normalized: true\n segments: NormalizedAppRouteSegment[]\n}\n\nexport function isNormalizedAppRoute(\n route: InterceptionAppRoute\n): route is NormalizedInterceptionAppRoute\nexport function isNormalizedAppRoute(\n route: AppRoute | InterceptionAppRoute\n): route is NormalizedAppRoute {\n return route.normalized\n}\n\nexport type InterceptionAppRoute = Omit<\n AppRoute,\n 'interceptionMarker' | 'interceptingRoute' | 'interceptedRoute'\n> & {\n interceptionMarker: InterceptionMarker\n interceptingRoute: AppRoute\n interceptedRoute: AppRoute\n}\n\nexport type NormalizedInterceptionAppRoute = Omit<\n InterceptionAppRoute,\n | 'normalized'\n | 'segments'\n | 'interceptionMarker'\n | 'interceptingRoute'\n | 'interceptedRoute'\n> & {\n normalized: true\n segments: NormalizedAppRouteSegment[]\n interceptionMarker: InterceptionMarker\n interceptingRoute: NormalizedAppRoute\n interceptedRoute: NormalizedAppRoute\n}\n\nexport function isInterceptionAppRoute(\n route: NormalizedAppRoute\n): route is NormalizedInterceptionAppRoute\nexport function isInterceptionAppRoute(\n route: AppRoute\n): route is InterceptionAppRoute {\n return (\n route.interceptionMarker !== undefined &&\n route.interceptingRoute !== undefined &&\n route.interceptedRoute !== undefined\n )\n}\n\nexport function parseAppRoute(\n pathname: string,\n normalized: true\n): NormalizedAppRoute\nexport function parseAppRoute(pathname: string, normalized: false): AppRoute\nexport function parseAppRoute(\n pathname: string,\n normalized: boolean\n): AppRoute | NormalizedAppRoute {\n const pathnameSegments = pathname.split('/').filter(Boolean)\n\n // Build segments array with static and dynamic segments\n const segments: AppRouteSegment[] = []\n\n // Parse if this is an interception route.\n let interceptionMarker: InterceptionMarker | undefined\n let interceptingRoute: AppRoute | NormalizedAppRoute | undefined\n let interceptedRoute: AppRoute | NormalizedAppRoute | undefined\n\n for (const segment of pathnameSegments) {\n const normalizedSegment = normalizeEncodedDynamicPlaceholder(segment)\n\n // Parse the segment into an AppSegment.\n const appSegment = parseAppRouteSegment(normalizedSegment)\n if (!appSegment) {\n continue\n }\n\n if (\n normalized &&\n (appSegment.type === 'route-group' ||\n appSegment.type === 'parallel-route')\n ) {\n throw new InvariantError(\n `${pathname} is being parsed as a normalized route, but it has a route group or parallel route segment.`\n )\n }\n\n segments.push(appSegment)\n\n if (appSegment.interceptionMarker) {\n const parts = pathname.split(appSegment.interceptionMarker)\n if (parts.length !== 2) {\n throw new Error(`Invalid interception route: ${pathname}`)\n }\n\n interceptingRoute = normalized\n ? parseAppRoute(parts[0], true)\n : parseAppRoute(parts[0], false)\n interceptedRoute = normalized\n ? parseAppRoute(parts[1], true)\n : parseAppRoute(parts[1], false)\n interceptionMarker = appSegment.interceptionMarker\n }\n }\n\n const dynamicSegments = segments.filter(\n (segment) => segment.type === 'dynamic'\n )\n\n return {\n normalized,\n pathname,\n segments,\n dynamicSegments,\n interceptionMarker,\n interceptingRoute,\n interceptedRoute,\n }\n}\n","import type { DynamicParamTypes } from '../../app-router-types'\n\nexport function interceptionPrefixFromParamType(\n paramType: DynamicParamTypes\n): string | null {\n switch (paramType) {\n case 'catchall-intercepted-(..)(..)':\n case 'dynamic-intercepted-(..)(..)':\n return '(..)(..)'\n case 'catchall-intercepted-(.)':\n case 'dynamic-intercepted-(.)':\n return '(.)'\n case 'catchall-intercepted-(..)':\n case 'dynamic-intercepted-(..)':\n return '(..)'\n case 'catchall-intercepted-(...)':\n case 'dynamic-intercepted-(...)':\n return '(...)'\n case 'catchall':\n case 'dynamic':\n case 'optional-catchall':\n default:\n return null\n }\n}\n","import type { Params } from '../../../../server/request/params'\nimport type { DynamicParamTypes } from '../../app-router-types'\nimport { InvariantError } from '../../invariant-error'\nimport type {\n NormalizedAppRoute,\n NormalizedAppRouteSegment,\n} from '../routes/app'\nimport { interceptionPrefixFromParamType } from './interception-prefix-from-param-type'\n\n/**\n * Extracts the param value from a path segment, handling interception markers\n * based on the expected param type.\n *\n * @param pathSegment - The path segment to extract the value from\n * @param params - The current params object for resolving dynamic param references\n * @param paramType - The expected param type which may include interception marker info\n * @returns The extracted param value\n */\nfunction getParamValueFromSegment(\n pathSegment: NormalizedAppRouteSegment,\n params: Params,\n paramType: DynamicParamTypes\n): string {\n // If the segment is dynamic, resolve it from the params object\n if (pathSegment.type === 'dynamic') {\n return params[pathSegment.param.paramName] as string\n }\n\n // If the paramType indicates this is an intercepted param, strip the marker\n // that matches the interception marker in the param type\n const interceptionPrefix = interceptionPrefixFromParamType(paramType)\n if (interceptionPrefix === pathSegment.interceptionMarker) {\n return pathSegment.name.replace(pathSegment.interceptionMarker, '')\n }\n\n // For static segments, use the name\n return pathSegment.name\n}\n\n/**\n * Resolves a route parameter value from the route segments at the given depth.\n * This shared logic is used by both extractPathnameRouteParamSegmentsFromLoaderTree\n * and resolveRouteParamsFromTree.\n *\n * @param paramName - The parameter name to resolve\n * @param paramType - The parameter type (dynamic, catchall, etc.)\n * @param depth - The current depth in the route tree\n * @param route - The normalized route containing segments\n * @param params - The current params object (used to resolve embedded param references)\n * @param options - Configuration options\n * @returns The resolved parameter value, or undefined if it cannot be resolved\n */\nexport function resolveParamValue(\n paramName: string,\n paramType: DynamicParamTypes,\n depth: number,\n route: NormalizedAppRoute,\n params: Params\n): string | string[] | undefined {\n switch (paramType) {\n case 'catchall':\n case 'optional-catchall':\n case 'catchall-intercepted-(..)(..)':\n case 'catchall-intercepted-(.)':\n case 'catchall-intercepted-(..)':\n case 'catchall-intercepted-(...)':\n // For catchall routes, derive from pathname using depth to determine\n // which segments to use\n const processedSegments: string[] = []\n\n // Process segments to handle any embedded dynamic params\n for (let index = depth; index < route.segments.length; index++) {\n const pathSegment = route.segments[index]\n\n if (pathSegment.type === 'static') {\n let value = pathSegment.name\n\n // For intercepted catch-all params, strip the marker from the first segment\n const interceptionPrefix = interceptionPrefixFromParamType(paramType)\n if (\n interceptionPrefix &&\n index === depth &&\n interceptionPrefix === pathSegment.interceptionMarker\n ) {\n // Strip the interception marker from the value\n value = value.replace(pathSegment.interceptionMarker, '')\n }\n\n processedSegments.push(value)\n } else {\n // If the segment is a param placeholder, check if we have its value\n if (!params.hasOwnProperty(pathSegment.param.paramName)) {\n // If the segment is an optional catchall, we can break out of the\n // loop because it's optional!\n if (pathSegment.param.paramType === 'optional-catchall') {\n break\n }\n\n // Unknown param placeholder in pathname - can't derive full value\n return undefined\n }\n\n // If the segment matches a param, use the param value\n // We don't encode values here as that's handled during retrieval.\n const paramValue = params[pathSegment.param.paramName]\n if (Array.isArray(paramValue)) {\n processedSegments.push(...paramValue)\n } else {\n processedSegments.push(paramValue as string)\n }\n }\n }\n\n if (processedSegments.length > 0) {\n return processedSegments\n } else if (paramType === 'optional-catchall') {\n return undefined\n } else {\n // We shouldn't be able to match a catchall segment without any path\n // segments if it's not an optional catchall\n throw new InvariantError(\n `Unexpected empty path segments match for a route \"${route.pathname}\" with param \"${paramName}\" of type \"${paramType}\"`\n )\n }\n case 'dynamic':\n case 'dynamic-intercepted-(..)(..)':\n case 'dynamic-intercepted-(.)':\n case 'dynamic-intercepted-(..)':\n case 'dynamic-intercepted-(...)':\n // For regular dynamic parameters, take the segment at this depth\n if (depth < route.segments.length) {\n const pathSegment = route.segments[depth]\n\n // Check if the segment at this depth is a placeholder for an unknown param\n if (\n pathSegment.type === 'dynamic' &&\n !params.hasOwnProperty(pathSegment.param.paramName)\n ) {\n // The segment is a placeholder like [category] and we don't have the value\n return undefined\n }\n\n // If the segment matches a param, use the param value from params object\n // Otherwise it's a static segment, just use it directly\n // We don't encode values here as that's handled during retrieval\n return getParamValueFromSegment(pathSegment, params, paramType)\n }\n\n return undefined\n\n default:\n paramType satisfies never\n }\n}\n","import type { DynamicParam } from '../../../../server/app-render/app-render'\nimport type { LoaderTree } from '../../../../server/lib/app-dir-module'\nimport type { OpaqueFallbackRouteParams } from '../../../../server/request/fallback-params'\nimport type { Params } from '../../../../server/request/params'\nimport type { DynamicParamTypesShort } from '../../app-router-types'\nimport { InvariantError } from '../../invariant-error'\nimport { parseLoaderTree } from './parse-loader-tree'\nimport { parseAppRoute, parseAppRouteSegment } from '../routes/app'\nimport { resolveParamValue } from './resolve-param-value'\n\n/**\n * Gets the value of a param from the params object. This correctly handles the\n * case where the param is a fallback route param and encodes the resulting\n * value.\n *\n * @param interpolatedParams - The params object.\n * @param segmentKey - The key of the segment.\n * @param fallbackRouteParams - The fallback route params.\n * @returns The value of the param.\n */\nfunction getParamValue(\n interpolatedParams: Params,\n segmentKey: string,\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n) {\n let value = interpolatedParams[segmentKey]\n\n if (fallbackRouteParams?.has(segmentKey)) {\n // We know that the fallback route params has the segment key because we\n // checked that above.\n const [searchValue] = fallbackRouteParams.get(segmentKey)!\n value = searchValue\n } else if (Array.isArray(value)) {\n value = value.map((i) => encodeURIComponent(i))\n } else if (typeof value === 'string') {\n value = encodeURIComponent(value)\n }\n\n return value\n}\n\nexport function interpolateParallelRouteParams(\n loaderTree: LoaderTree,\n params: Params,\n pagePath: string,\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n): Params {\n const interpolated = structuredClone(params)\n\n // Stack-based traversal with depth tracking\n const stack: Array<{ tree: LoaderTree; depth: number }> = [\n { tree: loaderTree, depth: 0 },\n ]\n\n // Parse the route from the provided page path.\n const route = parseAppRoute(pagePath, true)\n\n while (stack.length > 0) {\n const { tree, depth } = stack.pop()!\n const { segment, parallelRoutes } = parseLoaderTree(tree)\n\n const appSegment = parseAppRouteSegment(segment)\n\n if (\n appSegment?.type === 'dynamic' &&\n !interpolated.hasOwnProperty(appSegment.param.paramName) &&\n // If the param is in the fallback route params, we don't need to\n // interpolate it because it's already marked as being unknown.\n !fallbackRouteParams?.has(appSegment.param.paramName)\n ) {\n const { paramName, paramType } = appSegment.param\n\n const paramValue = resolveParamValue(\n paramName,\n paramType,\n depth,\n route,\n interpolated\n )\n\n if (paramValue !== undefined) {\n interpolated[paramName] = paramValue\n } else if (paramType !== 'optional-catchall') {\n throw new InvariantError(\n `Could not resolve param value for segment: ${paramName}`\n )\n }\n }\n\n // Calculate next depth - increment if this is not a route group and not empty\n let nextDepth = depth\n if (\n appSegment &&\n appSegment.type !== 'route-group' &&\n appSegment.type !== 'parallel-route'\n ) {\n nextDepth++\n }\n\n // Add all parallel routes to the stack for processing\n for (const parallelRoute of Object.values(parallelRoutes)) {\n stack.push({ tree: parallelRoute, depth: nextDepth })\n }\n }\n\n return interpolated\n}\n\n/**\n *\n * Shared logic on client and server for creating a dynamic param value.\n *\n * This code needs to be shared with the client so it can extract dynamic route\n * params from the URL without a server request.\n *\n * Because everything in this module is sent to the client, we should aim to\n * keep this code as simple as possible. The special case handling for catchall\n * and optional is, alas, unfortunate.\n */\nexport function getDynamicParam(\n interpolatedParams: Params,\n segmentKey: string,\n dynamicParamType: DynamicParamTypesShort,\n fallbackRouteParams: OpaqueFallbackRouteParams | null,\n staticSiblings: readonly string[] | null\n): DynamicParam {\n let value: string | string[] | undefined = getParamValue(\n interpolatedParams,\n segmentKey,\n fallbackRouteParams\n )\n\n // handle the case where an optional catchall does not have a value,\n // e.g. `/dashboard/[[...slug]]` when requesting `/dashboard`\n if (!value || value.length === 0) {\n if (dynamicParamType === 'oc') {\n return {\n param: segmentKey,\n value: null,\n type: dynamicParamType,\n treeSegment: [segmentKey, '', dynamicParamType, staticSiblings],\n }\n }\n\n throw new InvariantError(\n `Missing value for segment key: \"${segmentKey}\" with dynamic param type: ${dynamicParamType}`\n )\n }\n\n const paramCacheKey = Array.isArray(value) ? value.join('/') : value\n\n return {\n param: segmentKey,\n // The value that is passed to user code.\n value,\n // The value that is rendered in the router tree.\n // TODO: If the number of static siblings exceeds some threshold (e.g.,\n // dozens or hundreds), consider sending a Bloom filter instead of the full\n // array to reduce payload size. The client would then use the Bloom filter\n // to check membership with a small false positive rate.\n treeSegment: [segmentKey, paramCacheKey, dynamicParamType, staticSiblings],\n type: dynamicParamType,\n }\n}\n\n/**\n * Regular expression pattern used to match route parameters.\n * Matches both single parameters and parameter groups.\n * Examples:\n * - `[[...slug]]` matches parameter group with key 'slug', repeat: true, optional: true\n * - `[...slug]` matches parameter group with key 'slug', repeat: true, optional: false\n * - `[[foo]]` matches parameter with key 'foo', repeat: false, optional: true\n * - `[bar]` matches parameter with key 'bar', repeat: false, optional: false\n */\nexport const PARAMETER_PATTERN = /^([^[]*)\\[((?:\\[[^\\]]*\\])|[^\\]]+)\\](.*)$/\n\n/**\n * Parses a given parameter from a route to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n * - `[[...slug]]` -> `{ key: 'slug', repeat: true, optional: true }`\n * - `[...slug]` -> `{ key: 'slug', repeat: true, optional: false }`\n * - `[[foo]]` -> `{ key: 'foo', repeat: false, optional: true }`\n * - `[bar]` -> `{ key: 'bar', repeat: false, optional: false }`\n * - `fizz` -> `{ key: 'fizz', repeat: false, optional: false }`\n * @param param - The parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseParameter(param: string) {\n const match = param.match(PARAMETER_PATTERN)\n\n if (!match) {\n return parseMatchedParameter(param)\n }\n\n return parseMatchedParameter(match[2])\n}\n\n/**\n * Parses a matched parameter from the PARAMETER_PATTERN regex to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n * - `[...slug]` -> `{ key: 'slug', repeat: true, optional: true }`\n * - `...slug` -> `{ key: 'slug', repeat: true, optional: false }`\n * - `[foo]` -> `{ key: 'foo', repeat: false, optional: true }`\n * - `bar` -> `{ key: 'bar', repeat: false, optional: false }`\n * @param param - The matched parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseMatchedParameter(param: string) {\n const optional = param.startsWith('[') && param.endsWith(']')\n if (optional) {\n param = param.slice(1, -1)\n }\n const repeat = param.startsWith('...')\n if (repeat) {\n param = param.slice(3)\n }\n return { key: param, repeat, optional }\n}\n","import {\n NEXT_INTERCEPTION_MARKER_PREFIX,\n NEXT_QUERY_PARAM_PREFIX,\n} from '../../../../lib/constants'\nimport { INTERCEPTION_ROUTE_MARKERS } from './interception-routes'\nimport { escapeStringRegexp } from '../../escape-regexp'\nimport { removeTrailingSlash } from './remove-trailing-slash'\nimport { PARAMETER_PATTERN, parseMatchedParameter } from './get-dynamic-param'\n\nexport interface Group {\n pos: number\n repeat: boolean\n optional: boolean\n}\n\nexport interface RouteRegex {\n groups: { [groupName: string]: Group }\n re: RegExp\n}\n\nexport type RegexReference = {\n names: Record\n intercepted: Record\n}\n\ntype GetNamedRouteRegexOptions = {\n /**\n * Whether to prefix the route keys with the NEXT_INTERCEPTION_MARKER_PREFIX\n * or NEXT_QUERY_PARAM_PREFIX. This is only relevant when creating the\n * routes-manifest during the build.\n */\n prefixRouteKeys: boolean\n\n /**\n * Whether to include the suffix in the route regex. This means that when you\n * have something like `/[...slug].json` the `.json` part will be included\n * in the regex, yielding `/(.*).json` as the regex.\n */\n includeSuffix?: boolean\n\n /**\n * Whether to include the prefix in the route regex. This means that when you\n * have something like `/[...slug].json` the `/` part will be included\n * in the regex, yielding `^/(.*).json$` as the regex.\n *\n * Note that interception markers will already be included without the need\n */\n includePrefix?: boolean\n\n /**\n * Whether to exclude the optional trailing slash from the route regex.\n */\n excludeOptionalTrailingSlash?: boolean\n\n /**\n * Whether to backtrack duplicate keys. This is only relevant when creating\n * the routes-manifest during the build.\n */\n backreferenceDuplicateKeys?: boolean\n\n /**\n * If provided, this will be used as the reference for the dynamic parameter\n * keys instead of generating them in context. This is currently only used for\n * interception routes.\n */\n reference?: RegexReference\n}\n\ntype GetRouteRegexOptions = {\n /**\n * Whether to include extra parts in the route regex. This means that when you\n * have something like `/[...slug].json` the `.json` part will be included\n * in the regex, yielding `/(.*).json` as the regex.\n */\n includeSuffix?: boolean\n\n /**\n * Whether to include the prefix in the route regex. This means that when you\n * have something like `/[...slug].json` the `/` part will be included\n * in the regex, yielding `^/(.*).json$` as the regex.\n *\n * Note that interception markers will already be included without the need\n * of adding this option.\n */\n includePrefix?: boolean\n\n /**\n * Whether to exclude the optional trailing slash from the route regex.\n */\n excludeOptionalTrailingSlash?: boolean\n}\n\nfunction getParametrizedRoute(\n route: string,\n includeSuffix: boolean,\n includePrefix: boolean\n) {\n const groups: { [groupName: string]: Group } = {}\n let groupIndex = 1\n\n const segments: string[] = []\n for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n const markerMatch = INTERCEPTION_ROUTE_MARKERS.find((m) =>\n segment.startsWith(m)\n )\n const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n if (markerMatch && paramMatches && paramMatches[2]) {\n const { key, optional, repeat } = parseMatchedParameter(paramMatches[2])\n groups[key] = { pos: groupIndex++, repeat, optional }\n segments.push(`/${escapeStringRegexp(markerMatch)}([^/]+?)`)\n } else if (paramMatches && paramMatches[2]) {\n const { key, repeat, optional } = parseMatchedParameter(paramMatches[2])\n groups[key] = { pos: groupIndex++, repeat, optional }\n\n if (includePrefix && paramMatches[1]) {\n segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n }\n\n let s = repeat ? (optional ? '(?:/(.+?))?' : '/(.+?)') : '/([^/]+?)'\n\n // Remove the leading slash if includePrefix already added it.\n if (includePrefix && paramMatches[1]) {\n s = s.substring(1)\n }\n\n segments.push(s)\n } else {\n segments.push(`/${escapeStringRegexp(segment)}`)\n }\n\n // If there's a suffix, add it to the segments if it's enabled.\n if (includeSuffix && paramMatches && paramMatches[3]) {\n segments.push(escapeStringRegexp(paramMatches[3]))\n }\n }\n\n return {\n parameterizedRoute: segments.join(''),\n groups,\n }\n}\n\n/**\n * From a normalized route this function generates a regular expression and\n * a corresponding groups object intended to be used to store matching groups\n * from the regular expression.\n */\nexport function getRouteRegex(\n normalizedRoute: string,\n {\n includeSuffix = false,\n includePrefix = false,\n excludeOptionalTrailingSlash = false,\n }: GetRouteRegexOptions = {}\n): RouteRegex {\n const { parameterizedRoute, groups } = getParametrizedRoute(\n normalizedRoute,\n includeSuffix,\n includePrefix\n )\n\n let re = parameterizedRoute\n if (!excludeOptionalTrailingSlash) {\n re += '(?:/)?'\n }\n\n return {\n re: new RegExp(`^${re}$`),\n groups: groups,\n }\n}\n\n/**\n * Builds a function to generate a minimal routeKey using only a-z and minimal\n * number of characters.\n */\nfunction buildGetSafeRouteKey() {\n let i = 0\n\n return () => {\n let routeKey = ''\n let j = ++i\n while (j > 0) {\n routeKey += String.fromCharCode(97 + ((j - 1) % 26))\n j = Math.floor((j - 1) / 26)\n }\n return routeKey\n }\n}\n\nfunction getSafeKeyFromSegment({\n interceptionMarker,\n getSafeRouteKey,\n segment,\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n}: {\n interceptionMarker?: string\n getSafeRouteKey: () => string\n segment: string\n routeKeys: Record\n keyPrefix?: string\n backreferenceDuplicateKeys: boolean\n}) {\n const { key, optional, repeat } = parseMatchedParameter(segment)\n\n // replace any non-word characters since they can break\n // the named regex\n let cleanedKey = key.replace(/\\W/g, '')\n\n if (keyPrefix) {\n cleanedKey = `${keyPrefix}${cleanedKey}`\n }\n let invalidKey = false\n\n // check if the key is still invalid and fallback to using a known\n // safe key\n if (cleanedKey.length === 0 || cleanedKey.length > 30) {\n invalidKey = true\n }\n if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) {\n invalidKey = true\n }\n\n if (invalidKey) {\n cleanedKey = getSafeRouteKey()\n }\n\n const duplicateKey = cleanedKey in routeKeys\n\n if (keyPrefix) {\n routeKeys[cleanedKey] = `${keyPrefix}${key}`\n } else {\n routeKeys[cleanedKey] = key\n }\n\n // if the segment has an interception marker, make sure that's part of the regex pattern\n // this is to ensure that the route with the interception marker doesn't incorrectly match\n // the non-intercepted route (ie /app/(.)[username] should not match /app/[username])\n const interceptionPrefix = interceptionMarker\n ? escapeStringRegexp(interceptionMarker)\n : ''\n\n let pattern: string\n if (duplicateKey && backreferenceDuplicateKeys) {\n // Use a backreference to the key to ensure that the key is the same value\n // in each of the placeholders.\n pattern = `\\\\k<${cleanedKey}>`\n } else if (repeat) {\n pattern = `(?<${cleanedKey}>.+?)`\n } else {\n pattern = `(?<${cleanedKey}>[^/]+?)`\n }\n\n return {\n key,\n pattern: optional\n ? `(?:/${interceptionPrefix}${pattern})?`\n : `/${interceptionPrefix}${pattern}`,\n cleanedKey: cleanedKey,\n optional,\n repeat,\n }\n}\n\nfunction getNamedParametrizedRoute(\n route: string,\n prefixRouteKeys: boolean,\n includeSuffix: boolean,\n includePrefix: boolean,\n backreferenceDuplicateKeys: boolean,\n reference: RegexReference = { names: {}, intercepted: {} }\n) {\n const getSafeRouteKey = buildGetSafeRouteKey()\n const routeKeys: { [named: string]: string } = {}\n\n const segments: string[] = []\n const inverseParts: string[] = []\n\n // Ensure we don't mutate the original reference object.\n reference = structuredClone(reference)\n\n for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n const hasInterceptionMarker = INTERCEPTION_ROUTE_MARKERS.some((m) =>\n segment.startsWith(m)\n )\n\n const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n const interceptionMarker = hasInterceptionMarker\n ? paramMatches?.[1]\n : undefined\n\n let keyPrefix: string | undefined\n if (interceptionMarker && paramMatches?.[2]) {\n keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n reference.intercepted[paramMatches[2]] = interceptionMarker\n } else if (paramMatches?.[2] && reference.intercepted[paramMatches[2]]) {\n keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n } else {\n keyPrefix = prefixRouteKeys ? NEXT_QUERY_PARAM_PREFIX : undefined\n }\n\n if (interceptionMarker && paramMatches && paramMatches[2]) {\n // If there's an interception marker, add it to the segments.\n const { key, pattern, cleanedKey, repeat, optional } =\n getSafeKeyFromSegment({\n getSafeRouteKey,\n interceptionMarker,\n segment: paramMatches[2],\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n })\n\n segments.push(pattern)\n inverseParts.push(\n `/${paramMatches[1]}:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n )\n reference.names[key] ??= cleanedKey\n } else if (paramMatches && paramMatches[2]) {\n // If there's a prefix, add it to the segments if it's enabled.\n if (includePrefix && paramMatches[1]) {\n segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n inverseParts.push(`/${paramMatches[1]}`)\n }\n\n const { key, pattern, cleanedKey, repeat, optional } =\n getSafeKeyFromSegment({\n getSafeRouteKey,\n segment: paramMatches[2],\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n })\n\n // Remove the leading slash if includePrefix already added it.\n let s = pattern\n if (includePrefix && paramMatches[1]) {\n s = s.substring(1)\n }\n\n segments.push(s)\n inverseParts.push(\n `/:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n )\n reference.names[key] ??= cleanedKey\n } else {\n segments.push(`/${escapeStringRegexp(segment)}`)\n inverseParts.push(`/${segment}`)\n }\n\n // If there's a suffix, add it to the segments if it's enabled.\n if (includeSuffix && paramMatches && paramMatches[3]) {\n segments.push(escapeStringRegexp(paramMatches[3]))\n inverseParts.push(paramMatches[3])\n }\n }\n\n return {\n namedParameterizedRoute: segments.join(''),\n routeKeys,\n pathToRegexpPattern: inverseParts.join(''),\n reference,\n }\n}\n\n/**\n * This function extends `getRouteRegex` generating also a named regexp where\n * each group is named along with a routeKeys object that indexes the assigned\n * named group with its corresponding key. When the routeKeys need to be\n * prefixed to uniquely identify internally the \"prefixRouteKey\" arg should\n * be \"true\" currently this is only the case when creating the routes-manifest\n * during the build\n */\nexport function getNamedRouteRegex(\n normalizedRoute: string,\n options: GetNamedRouteRegexOptions\n) {\n const result = getNamedParametrizedRoute(\n normalizedRoute,\n options.prefixRouteKeys,\n options.includeSuffix ?? false,\n options.includePrefix ?? false,\n options.backreferenceDuplicateKeys ?? false,\n options.reference\n )\n\n let namedRegex = result.namedParameterizedRoute\n if (!options.excludeOptionalTrailingSlash) {\n namedRegex += '(?:/)?'\n }\n\n return {\n ...getRouteRegex(normalizedRoute, options),\n namedRegex: `^${namedRegex}$`,\n routeKeys: result.routeKeys,\n pathToRegexpPattern: result.pathToRegexpPattern,\n reference: result.reference,\n }\n}\n\n/**\n * Generates a named regexp.\n * This is intended to be using for build time only.\n */\nexport function getNamedMiddlewareRegex(\n normalizedRoute: string,\n options: {\n catchAll?: boolean\n }\n) {\n const { parameterizedRoute } = getParametrizedRoute(\n normalizedRoute,\n false,\n false\n )\n const { catchAll = true } = options\n if (parameterizedRoute === '/') {\n let catchAllRegex = catchAll ? '.*' : ''\n return {\n namedRegex: `^/${catchAllRegex}$`,\n }\n }\n\n const { namedParameterizedRoute } = getNamedParametrizedRoute(\n normalizedRoute,\n false,\n false,\n false,\n false,\n undefined\n )\n let catchAllGroupedRegex = catchAll ? '(?:(/.*)?)' : ''\n return {\n namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$`,\n }\n}\n","import type { ParsedUrlQuery } from 'querystring'\n\nimport { getRouteMatcher } from './route-matcher'\nimport { getRouteRegex } from './route-regex'\n\nexport function interpolateAs(\n route: string,\n asPathname: string,\n query: ParsedUrlQuery\n) {\n let interpolatedRoute = ''\n\n const dynamicRegex = getRouteRegex(route)\n const dynamicGroups = dynamicRegex.groups\n const dynamicMatches =\n // Try to match the dynamic route against the asPath\n (asPathname !== route ? getRouteMatcher(dynamicRegex)(asPathname) : '') ||\n // Fall back to reading the values from the href\n // TODO: should this take priority; also need to change in the router.\n query\n\n interpolatedRoute = route\n const params = Object.keys(dynamicGroups)\n\n if (\n !params.every((param) => {\n let value = dynamicMatches[param] || ''\n const { repeat, optional } = dynamicGroups[param]\n\n // support single-level catch-all\n // TODO: more robust handling for user-error (passing `/`)\n let replaced = `[${repeat ? '...' : ''}${param}]`\n if (optional) {\n replaced = `${!value ? '/' : ''}[${replaced}]`\n }\n if (repeat && !Array.isArray(value)) value = [value]\n\n return (\n (optional || param in dynamicMatches) &&\n // Interpolate group into data URL if present\n (interpolatedRoute =\n interpolatedRoute!.replace(\n replaced,\n repeat\n ? (value as string[])\n .map(\n // these values should be fully encoded instead of just\n // path delimiter escaped since they are being inserted\n // into the URL and we expect URL encoded segments\n // when parsing dynamic route params\n (segment) => encodeURIComponent(segment)\n )\n .join('/')\n : encodeURIComponent(value as string)\n ) || '/')\n )\n })\n ) {\n interpolatedRoute = '' // did not satisfy all requirements\n\n // n.b. We ignore this error because we handle warning for this case in\n // development in the `` component directly.\n }\n return {\n params,\n result: interpolatedRoute,\n }\n}\n","import type { NextRouter, Url } from '../shared/lib/router/router'\n\nimport { searchParamsToUrlQuery } from '../shared/lib/router/utils/querystring'\nimport { formatWithValidation } from '../shared/lib/router/utils/format-url'\nimport { omit } from '../shared/lib/router/utils/omit'\nimport { normalizeRepeatedSlashes } from '../shared/lib/utils'\nimport { normalizePathTrailingSlash } from './normalize-trailing-slash'\nimport { isLocalURL } from '../shared/lib/router/utils/is-local-url'\nimport { isDynamicRoute } from '../shared/lib/router/utils'\nimport { interpolateAs } from '../shared/lib/router/utils/interpolate-as'\nimport { getRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\n\n/**\n * Resolves a given hyperlink with a certain router state (basePath not included).\n * Preserves absolute urls.\n */\nexport function resolveHref(\n router: NextRouter,\n href: Url,\n resolveAs: true\n): [string, string] | [string]\nexport function resolveHref(\n router: NextRouter,\n href: Url,\n resolveAs?: false\n): string\nexport function resolveHref(\n router: NextRouter,\n href: Url,\n resolveAs?: boolean\n): [string, string] | [string] | string {\n // we use a dummy base url for relative urls\n let base: URL\n let urlAsString = typeof href === 'string' ? href : formatWithValidation(href)\n\n // repeated slashes and backslashes in the URL are considered\n // invalid and will never match a Next.js page/file\n // https://www.rfc-editor.org/rfc/rfc3986.html#section-3.1\n const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\\/\\//i)\n const urlAsStringNoProto = urlProtoMatch\n ? urlAsString.slice(urlProtoMatch[0].length)\n : urlAsString\n\n const urlParts = urlAsStringNoProto.split('?', 1)\n\n if ((urlParts[0] || '').match(/(\\/\\/|\\\\)/)) {\n console.error(\n `Invalid href '${urlAsString}' passed to next/router in page: '${router.pathname}'. Repeated forward-slashes (//) or backslashes \\\\ are not valid in the href.`\n )\n const normalizedUrl = normalizeRepeatedSlashes(urlAsStringNoProto)\n urlAsString = (urlProtoMatch ? urlProtoMatch[0] : '') + normalizedUrl\n }\n\n // Return because it cannot be routed by the Next.js router\n if (!isLocalURL(urlAsString)) {\n return (resolveAs ? [urlAsString] : urlAsString) as string\n }\n\n try {\n let baseBase = urlAsString.startsWith('#') ? router.asPath : router.pathname\n\n // If the provided href is only a query string, it is safer to use the asPath\n // considering rewrites.\n if (urlAsString.startsWith('?')) {\n baseBase = router.asPath\n\n // However, if is a dynamic route, we need to use the pathname to preserve the\n // query interpolation and rewrites (router.pathname will look like \"/[slug]\").\n if (isDynamicRoute(router.pathname)) {\n baseBase = router.pathname\n\n const routeRegex = getRouteRegex(router.pathname)\n const match = getRouteMatcher(routeRegex)(router.asPath)\n\n // For dynamic routes, if asPath doesn't match the pathname regex, it is a rewritten path.\n // In this case, should use asPath to preserve the current URL.\n if (!match) {\n baseBase = router.asPath\n }\n\n // Note: There is an edge case where the pathname is dynamic, and also a rewrite path to the same segment.\n // E.g. in \"/[slug]\" path, rewrite \"/foo\" -> \"/bar\"\n\n // In this case, it will be treated as a non-rewritten path and possibly interpolate the query string.\n // E.g., \"/any?slug=foo\" will become the content of \"/foo\", not rewritten as \"/bar\"\n\n // This is currently a trade-off of not resolving rewrite paths on every Router/Link call,\n // but using a lighter route regex pattern check.\n }\n }\n\n base = new URL(baseBase, 'http://n')\n } catch (_) {\n // fallback to / for invalid asPath values e.g. //\n base = new URL('/', 'http://n')\n }\n\n try {\n const finalUrl = new URL(urlAsString, base)\n finalUrl.pathname = normalizePathTrailingSlash(finalUrl.pathname)\n let interpolatedAs = ''\n\n if (\n isDynamicRoute(finalUrl.pathname) &&\n finalUrl.searchParams &&\n resolveAs\n ) {\n const query = searchParamsToUrlQuery(finalUrl.searchParams)\n\n const { result, params } = interpolateAs(\n finalUrl.pathname,\n finalUrl.pathname,\n query\n )\n\n if (result) {\n interpolatedAs = formatWithValidation({\n pathname: result,\n hash: finalUrl.hash,\n query: omit(query, params),\n })\n }\n }\n\n // if the origin didn't change, it means we received a relative href\n const resolvedHref =\n finalUrl.origin === base.origin\n ? finalUrl.href.slice(finalUrl.origin.length)\n : finalUrl.href\n\n return resolveAs\n ? [resolvedHref, interpolatedAs || resolvedHref]\n : resolvedHref\n } catch (_) {\n return resolveAs ? [urlAsString] : urlAsString\n }\n}\n","import { parsePath } from './parse-path'\n\n/**\n * Adds the provided prefix to the given path. It first ensures that the path\n * is indeed starting with a slash.\n */\nexport function addPathPrefix(path: string, prefix?: string) {\n if (!path.startsWith('/') || !prefix) {\n return path\n }\n\n const { pathname, query, hash } = parsePath(path)\n return `${prefix}${pathname}${query}${hash}`\n}\n","import { addPathPrefix } from './add-path-prefix'\nimport { pathHasPrefix } from './path-has-prefix'\n\n/**\n * For a given path and a locale, if the locale is given, it will prefix the\n * locale. The path shouldn't be an API path. If a default locale is given the\n * prefix will be omitted if the locale is already the default locale.\n */\nexport function addLocale(\n path: string,\n locale?: string | false,\n defaultLocale?: string,\n ignorePrefix?: boolean\n) {\n // If no locale was given or the locale is the default locale, we don't need\n // to prefix the path.\n if (!locale || locale === defaultLocale) return path\n\n const lower = path.toLowerCase()\n\n // If the path is an API path or the path already has the locale prefix, we\n // don't need to prefix the path.\n if (!ignorePrefix) {\n if (pathHasPrefix(lower, '/api')) return path\n if (pathHasPrefix(lower, `/${locale.toLowerCase()}`)) return path\n }\n\n // Add the locale prefix to the path.\n return addPathPrefix(path, `/${locale}`)\n}\n","import type { addLocale as Fn } from '../shared/lib/router/utils/add-locale'\nimport { normalizePathTrailingSlash } from './normalize-trailing-slash'\n\nexport const addLocale: typeof Fn = (path, ...args) => {\n if (process.env.__NEXT_I18N_SUPPORT) {\n return normalizePathTrailingSlash(\n (\n require('../shared/lib/router/utils/add-locale') as typeof import('../shared/lib/router/utils/add-locale')\n ).addLocale(path, ...args)\n )\n }\n return path\n}\n","\"use strict\";\n\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n}\nexports._ = _interop_require_default;\n","import React from 'react'\nimport type { NextRouter } from './router/router'\n\nexport const RouterContext = React.createContext(null)\n\nif (process.env.NODE_ENV !== 'production') {\n RouterContext.displayName = 'RouterContext'\n}\n","export const requestIdleCallback =\n (typeof self !== 'undefined' &&\n self.requestIdleCallback &&\n self.requestIdleCallback.bind(window)) ||\n function (cb: IdleRequestCallback): number {\n let start = Date.now()\n return self.setTimeout(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n },\n })\n }, 1)\n }\n\nexport const cancelIdleCallback =\n (typeof self !== 'undefined' &&\n self.cancelIdleCallback &&\n self.cancelIdleCallback.bind(window)) ||\n function (id: number) {\n return clearTimeout(id)\n }\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n requestIdleCallback,\n cancelIdleCallback,\n} from './request-idle-callback'\n\ntype UseIntersectionObserverInit = Pick<\n IntersectionObserverInit,\n 'rootMargin' | 'root'\n>\n\ntype UseIntersection = { disabled?: boolean } & UseIntersectionObserverInit & {\n rootRef?: React.RefObject | null\n }\ntype ObserveCallback = (isVisible: boolean) => void\ntype Identifier = {\n root: Element | Document | null\n margin: string\n}\ntype Observer = {\n id: Identifier\n observer: IntersectionObserver\n elements: Map\n}\n\nconst hasIntersectionObserver = typeof IntersectionObserver === 'function'\n\nconst observers = new Map()\nconst idList: Identifier[] = []\n\nfunction createObserver(options: UseIntersectionObserverInit): Observer {\n const id = {\n root: options.root || null,\n margin: options.rootMargin || '',\n }\n const existing = idList.find(\n (obj) => obj.root === id.root && obj.margin === id.margin\n )\n let instance: Observer | undefined\n\n if (existing) {\n instance = observers.get(existing)\n if (instance) {\n return instance\n }\n }\n\n const elements = new Map()\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const callback = elements.get(entry.target)\n const isVisible = entry.isIntersecting || entry.intersectionRatio > 0\n if (callback && isVisible) {\n callback(isVisible)\n }\n })\n }, options)\n instance = {\n id,\n observer,\n elements,\n }\n\n idList.push(id)\n observers.set(id, instance)\n return instance\n}\n\nfunction observe(\n element: Element,\n callback: ObserveCallback,\n options: UseIntersectionObserverInit\n): () => void {\n const { id, observer, elements } = createObserver(options)\n elements.set(element, callback)\n\n observer.observe(element)\n return function unobserve(): void {\n elements.delete(element)\n observer.unobserve(element)\n\n // Destroy observer when there's nothing left to watch:\n if (elements.size === 0) {\n observer.disconnect()\n observers.delete(id)\n const index = idList.findIndex(\n (obj) => obj.root === id.root && obj.margin === id.margin\n )\n if (index > -1) {\n idList.splice(index, 1)\n }\n }\n }\n}\n\nexport function useIntersection({\n rootRef,\n rootMargin,\n disabled,\n}: UseIntersection): [(element: T | null) => void, boolean, () => void] {\n const isDisabled: boolean = disabled || !hasIntersectionObserver\n\n const [visible, setVisible] = useState(false)\n const elementRef = useRef(null)\n const setElement = useCallback((element: T | null) => {\n elementRef.current = element\n }, [])\n\n useEffect(() => {\n if (hasIntersectionObserver) {\n if (isDisabled || visible) return\n\n const element = elementRef.current\n if (element && element.tagName) {\n const unobserve = observe(\n element,\n (isVisible) => isVisible && setVisible(isVisible),\n { root: rootRef?.current, rootMargin }\n )\n\n return unobserve\n }\n } else {\n if (!visible) {\n const idleCallback = requestIdleCallback(() => setVisible(true))\n return () => cancelIdleCallback(idleCallback)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled, rootMargin, rootRef, visible, elementRef.current])\n\n const resetVisible = useCallback(() => {\n setVisible(false)\n }, [])\n\n return [setElement, visible, resetVisible]\n}\n","export interface PathLocale {\n detectedLocale?: string\n pathname: string\n}\n\n/**\n * A cache of lowercased locales for each list of locales. This is stored as a\n * WeakMap so if the locales are garbage collected, the cache entry will be\n * removed as well.\n */\nconst cache = new WeakMap()\n\n/**\n * For a pathname that may include a locale from a list of locales, it\n * removes the locale from the pathname returning it alongside with the\n * detected locale.\n *\n * @param pathname A pathname that may include a locale.\n * @param locales A list of locales.\n * @returns The detected locale and pathname without locale\n */\nexport function normalizeLocalePath(\n pathname: string,\n locales?: readonly string[]\n): PathLocale {\n // If locales is undefined, return the pathname as is.\n if (!locales) return { pathname }\n\n // Get the cached lowercased locales or create a new cache entry.\n let lowercasedLocales = cache.get(locales)\n if (!lowercasedLocales) {\n lowercasedLocales = locales.map((locale) => locale.toLowerCase())\n cache.set(locales, lowercasedLocales)\n }\n\n let detectedLocale: string | undefined\n\n // The first segment will be empty, because it has a leading `/`. If\n // there is no further segment, there is no locale (or it's the default).\n const segments = pathname.split('/', 2)\n\n // If there's no second segment (ie, the pathname is just `/`), there's no\n // locale.\n if (!segments[1]) return { pathname }\n\n // The second segment will contain the locale part if any.\n const segment = segments[1].toLowerCase()\n\n // See if the segment matches one of the locales. If it doesn't, there is\n // no locale (or it's the default).\n const index = lowercasedLocales.indexOf(segment)\n if (index < 0) return { pathname }\n\n // Return the case-sensitive locale.\n detectedLocale = locales[index]\n\n // Remove the `/${locale}` part of the pathname.\n pathname = pathname.slice(detectedLocale.length + 1) || '/'\n\n return { pathname, detectedLocale }\n}\n","import type { normalizeLocalePath as Fn } from '../shared/lib/i18n/normalize-locale-path'\n\nexport const normalizeLocalePath: typeof Fn = (pathname, locales) => {\n if (process.env.__NEXT_I18N_SUPPORT) {\n return (\n require('../shared/lib/i18n/normalize-locale-path') as typeof import('../shared/lib/i18n/normalize-locale-path')\n ).normalizeLocalePath(pathname, locales)\n }\n return { pathname, detectedLocale: undefined }\n}\n","import type { DomainLocale } from '../../../server/config-shared'\n\nexport function detectDomainLocale(\n domainItems?: readonly DomainLocale[],\n hostname?: string,\n detectedLocale?: string\n) {\n if (!domainItems) return\n\n if (detectedLocale) {\n detectedLocale = detectedLocale.toLowerCase()\n }\n\n for (const item of domainItems) {\n // remove port if present\n const domainHostname = item.domain?.split(':', 1)[0].toLowerCase()\n if (\n hostname === domainHostname ||\n detectedLocale === item.defaultLocale.toLowerCase() ||\n item.locales?.some((locale) => locale.toLowerCase() === detectedLocale)\n ) {\n return item\n }\n }\n}\n","import type { detectDomainLocale as Fn } from '../shared/lib/i18n/detect-domain-locale'\n\nexport const detectDomainLocale: typeof Fn = (...args) => {\n if (process.env.__NEXT_I18N_SUPPORT) {\n return (\n require('../shared/lib/i18n/detect-domain-locale') as typeof import('../shared/lib/i18n/detect-domain-locale')\n ).detectDomainLocale(...args)\n }\n}\n","import type { DomainLocale } from '../server/config'\nimport type { normalizeLocalePath as NormalizeFn } from './normalize-locale-path'\nimport type { detectDomainLocale as DetectFn } from './detect-domain-locale'\nimport { normalizePathTrailingSlash } from './normalize-trailing-slash'\n\nconst basePath = (process.env.__NEXT_ROUTER_BASEPATH as string) || ''\n\nexport function getDomainLocale(\n path: string,\n locale?: string | false,\n locales?: readonly string[],\n domainLocales?: readonly DomainLocale[]\n) {\n if (process.env.__NEXT_I18N_SUPPORT) {\n const normalizeLocalePath: typeof NormalizeFn = (\n require('./normalize-locale-path') as typeof import('./normalize-locale-path')\n ).normalizeLocalePath\n const detectDomainLocale: typeof DetectFn = (\n require('./detect-domain-locale') as typeof import('./detect-domain-locale')\n ).detectDomainLocale\n\n const target = locale || normalizeLocalePath(path, locales).detectedLocale\n const domain = detectDomainLocale(domainLocales, undefined, target)\n if (domain) {\n const proto = `http${domain.http ? '' : 's'}://`\n const finalLocale = target === domain.defaultLocale ? '' : `/${target}`\n return `${proto}${domain.domain}${normalizePathTrailingSlash(\n `${basePath}${finalLocale}${path}`\n )}`\n }\n return false\n } else {\n return false\n }\n}\n","import { addPathPrefix } from '../shared/lib/router/utils/add-path-prefix'\nimport { normalizePathTrailingSlash } from './normalize-trailing-slash'\n\nconst basePath = (process.env.__NEXT_ROUTER_BASEPATH as string) || ''\n\nexport function addBasePath(path: string, required?: boolean): string {\n return normalizePathTrailingSlash(\n process.env.__NEXT_MANUAL_CLIENT_BASE_PATH && !required\n ? path\n : addPathPrefix(path, basePath)\n )\n}\n","import { useCallback, useRef, type Ref } from 'react'\n\n// This is a compatibility hook to support React 18 and 19 refs.\n// In 19, a cleanup function from refs may be returned.\n// In 18, returning a cleanup function creates a warning.\n// Since we take userspace refs, we don't know ahead of time if a cleanup function will be returned.\n// This implements cleanup functions with the old behavior in 18.\n// We know refs are always called alternating with `null` and then `T`.\n// So a call with `null` means we need to call the previous cleanup functions.\nexport function useMergedRef(\n refA: Ref,\n refB: Ref\n): Ref {\n const cleanupA = useRef<(() => void) | null>(null)\n const cleanupB = useRef<(() => void) | null>(null)\n\n // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.\n // (this happens often if the user doesn't pass a ref to Link/Form/Image)\n // But this can cause us to leak a cleanup-ref into user code (previously via ``),\n // and the user might pass that ref into ref-merging library that doesn't support cleanup refs\n // (because it hasn't been updated for React 19)\n // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.\n // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.\n return useCallback(\n (current: TElement | null): void => {\n if (current === null) {\n const cleanupFnA = cleanupA.current\n if (cleanupFnA) {\n cleanupA.current = null\n cleanupFnA()\n }\n const cleanupFnB = cleanupB.current\n if (cleanupFnB) {\n cleanupB.current = null\n cleanupFnB()\n }\n } else {\n if (refA) {\n cleanupA.current = applyRef(refA, current)\n }\n if (refB) {\n cleanupB.current = applyRef(refB, current)\n }\n }\n },\n [refA, refB]\n )\n}\n\nfunction applyRef(\n refA: NonNullable>,\n current: TElement\n) {\n if (typeof refA === 'function') {\n const cleanup = refA(current)\n if (typeof cleanup === 'function') {\n return cleanup\n } else {\n return () => refA(null)\n }\n } else {\n refA.current = current\n return () => {\n refA.current = null\n }\n }\n}\n","let errorOnce = (_: string) => {}\nif (process.env.NODE_ENV !== 'production') {\n const errors = new Set()\n errorOnce = (msg: string) => {\n if (!errors.has(msg)) {\n console.error(msg)\n }\n errors.add(msg)\n }\n}\n\nexport { errorOnce }\n","'use client'\n\nimport type {\n NextRouter,\n PrefetchOptions as RouterPrefetchOptions,\n} from '../shared/lib/router/router'\n\nimport React, { createContext, useContext } from 'react'\nimport type { UrlObject } from 'url'\nimport { resolveHref } from './resolve-href'\nimport { isLocalURL } from '../shared/lib/router/utils/is-local-url'\nimport { formatUrl } from '../shared/lib/router/utils/format-url'\nimport { isAbsoluteUrl } from '../shared/lib/utils'\nimport { addLocale } from './add-locale'\nimport { RouterContext } from '../shared/lib/router-context.shared-runtime'\nimport type { AppRouterInstance } from '../shared/lib/app-router-context.shared-runtime'\nimport { useIntersection } from './use-intersection'\nimport { getDomainLocale } from './get-domain-locale'\nimport { addBasePath } from './add-base-path'\nimport { useMergedRef } from './use-merged-ref'\nimport { errorOnce } from '../shared/lib/utils/error-once'\n\ntype Url = string | UrlObject\ntype RequiredKeys = {\n [K in keyof T]-?: {} extends Pick ? never : K\n}[keyof T]\ntype OptionalKeys = {\n [K in keyof T]-?: {} extends Pick ? K : never\n}[keyof T]\n\ntype OnNavigateEventHandler = (event: { preventDefault: () => void }) => void\n\ntype InternalLinkProps = {\n /**\n * The path or URL to navigate to. It can also be an object.\n *\n * @example https://nextjs.org/docs/api-reference/next/link#with-url-object\n */\n href: Url\n /**\n * Optional decorator for the path that will be shown in the browser URL bar. Before Next.js 9.5.3 this was used for dynamic routes, check our [previous docs](https://github.com/vercel/next.js/blob/v9.5.2/docs/api-reference/next/link.md#dynamic-routes) to see how it worked. Note: when this path differs from the one provided in `href` the previous `href`/`as` behavior is used as shown in the [previous docs](https://github.com/vercel/next.js/blob/v9.5.2/docs/api-reference/next/link.md#dynamic-routes).\n */\n as?: Url\n /**\n * Replace the current `history` state instead of adding a new url into the stack.\n *\n * @defaultValue `false`\n */\n replace?: boolean\n /**\n * Whether to override the default scroll behavior\n *\n * @example https://nextjs.org/docs/api-reference/next/link#disable-scrolling-to-the-top-of-the-page\n *\n * @defaultValue `true`\n */\n scroll?: boolean\n /**\n * Update the path of the current page without rerunning [`getStaticProps`](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props), [`getServerSideProps`](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props) or [`getInitialProps`](/docs/pages/api-reference/functions/get-initial-props).\n *\n * @defaultValue `false`\n */\n shallow?: boolean\n /**\n * Forces `Link` to send the `href` property to its child.\n *\n * @defaultValue `false`\n */\n passHref?: boolean\n /**\n * Prefetch the page in the background.\n * Any `` that is in the viewport (initially or through scroll) will be prefetched.\n * Prefetch can be disabled by passing `prefetch={false}`. Prefetching is only enabled in production.\n *\n * In App Router:\n * - \"auto\", null, undefined (default): For statically generated pages, this will prefetch the full React Server Component data. For dynamic pages, this will prefetch up to the nearest route segment with a [`loading.js`](https://nextjs.org/docs/app/api-reference/file-conventions/loading) file. If there is no loading file, it will not fetch the full tree to avoid fetching too much data.\n * - `true`: This will prefetch the full React Server Component data for all route segments, regardless of whether they contain a segment with `loading.js`.\n * - `false`: This will not prefetch any data, even on hover.\n *\n * In Pages Router:\n * - `true` (default): The full route & its data will be prefetched.\n * - `false`: Prefetching will not happen when entering the viewport, but will still happen on hover.\n * @defaultValue `true` (pages router) or `null` (app router)\n */\n prefetch?: boolean | 'auto' | null\n /**\n * The active locale is automatically prepended. `locale` allows for providing a different locale.\n * When `false` `href` has to include the locale as the default behavior is disabled.\n * Note: This is only available in the Pages Router.\n */\n locale?: string | false\n /**\n * Enable legacy link behavior.\n *\n * @deprecated This will be removed in a future version\n * @defaultValue `false`\n * @see https://github.com/vercel/next.js/commit/489e65ed98544e69b0afd7e0cfc3f9f6c2b803b7\n */\n legacyBehavior?: boolean\n /**\n * Optional event handler for when the mouse pointer is moved onto Link\n */\n onMouseEnter?: React.MouseEventHandler\n /**\n * Optional event handler for when Link is touched.\n */\n onTouchStart?: React.TouchEventHandler\n /**\n * Optional event handler for when Link is clicked.\n */\n onClick?: React.MouseEventHandler\n /**\n * Optional event handler for when the `` is navigated.\n */\n onNavigate?: OnNavigateEventHandler\n\n /**\n * Transition types to apply when navigating. These types are passed to\n * [`React.addTransitionType`](https://react.dev/reference/react/addTransitionType)\n * inside the navigation transition, enabling\n * [``](https://react.dev/reference/react/ViewTransition) components\n * to apply different animations based on the type of navigation.\n *\n * @example\n * ```tsx\n * About\n * ```\n */\n transitionTypes?: string[]\n}\n\n// TODO-APP: Include the full set of Anchor props\n// adding this to the publicly exported type currently breaks existing apps\n\n// `RouteInferType` is a stub here to avoid breaking `typedRoutes` when the type\n// isn't generated yet. It will be replaced when type generation runs.\n// WARNING: This should be an interface to prevent TypeScript from inlining it\n// in declarations of libraries dependending on Next.js.\n// Not trivial to reproduce so only convert to an interface when needed.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface LinkProps extends InternalLinkProps {}\ntype LinkPropsRequired = RequiredKeys\ntype LinkPropsOptional = OptionalKeys\n\nconst prefetched = new Set()\n\ntype PrefetchOptions = RouterPrefetchOptions & {\n /**\n * bypassPrefetchedCheck will bypass the check to see if the `href` has\n * already been fetched.\n */\n bypassPrefetchedCheck?: boolean\n}\n\nfunction prefetch(\n router: NextRouter,\n href: string,\n as: string,\n options: PrefetchOptions\n): void {\n if (typeof window === 'undefined') {\n return\n }\n\n if (!isLocalURL(href)) {\n return\n }\n\n // We should only dedupe requests when experimental.optimisticClientCache is\n // disabled.\n if (!options.bypassPrefetchedCheck) {\n const locale =\n // Let the link's locale prop override the default router locale.\n typeof options.locale !== 'undefined'\n ? options.locale\n : // Otherwise fallback to the router's locale.\n 'locale' in router\n ? router.locale\n : undefined\n\n const prefetchedKey = href + '%' + as + '%' + locale\n\n // If we've already fetched the key, then don't prefetch it again!\n if (prefetched.has(prefetchedKey)) {\n return\n }\n\n // Mark this URL as prefetched.\n prefetched.add(prefetchedKey)\n }\n\n // Prefetch the JSON page if asked (only in the client)\n // We need to handle a prefetch error here since we may be\n // loading with priority which can reject but we don't\n // want to force navigation since this is only a prefetch\n router.prefetch(href, as, options).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n // rethrow to show invalid URL errors\n throw err\n }\n })\n}\n\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement\n const target = eventTarget.getAttribute('target')\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\nfunction linkClicked(\n e: React.MouseEvent,\n router: NextRouter | AppRouterInstance,\n href: string,\n as: string,\n replace?: boolean,\n shallow?: boolean,\n scroll?: boolean,\n locale?: string | false,\n onNavigate?: OnNavigateEventHandler\n): void {\n const { nodeName } = e.currentTarget\n\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === 'A'\n\n if (\n (isAnchorNodeName && isModifiedEvent(e)) ||\n e.currentTarget.hasAttribute('download')\n ) {\n // ignore click for browser’s default behavior\n return\n }\n\n if (!isLocalURL(href)) {\n if (replace) {\n // browser default behavior does not replace the history state\n // so we need to do it manually\n e.preventDefault()\n location.replace(href)\n }\n\n // ignore click for browser’s default behavior\n return\n }\n\n e.preventDefault()\n\n const navigate = () => {\n if (onNavigate) {\n let isDefaultPrevented = false\n\n onNavigate({\n preventDefault: () => {\n isDefaultPrevented = true\n },\n })\n\n if (isDefaultPrevented) {\n return\n }\n }\n\n // If the router is an NextRouter instance it will have `beforePopState`\n const routerScroll = scroll ?? true\n if ('beforePopState' in router) {\n router[replace ? 'replace' : 'push'](href, as, {\n shallow,\n locale,\n scroll: routerScroll,\n })\n } else {\n router[replace ? 'replace' : 'push'](as || href, {\n scroll: routerScroll,\n })\n }\n }\n\n navigate()\n}\n\ntype LinkPropsReal = React.PropsWithChildren<\n Omit, keyof LinkProps> &\n LinkProps\n>\n\nfunction formatStringOrUrl(urlObjOrString: UrlObject | string): string {\n if (typeof urlObjOrString === 'string') {\n return urlObjOrString\n }\n\n return formatUrl(urlObjOrString)\n}\n\n/**\n * A React component that extends the HTML `` element to provide [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching)\n * and client-side navigation between routes.\n *\n * It is the primary way to navigate between routes in Next.js.\n *\n * Read more: [Next.js docs: ``](https://nextjs.org/docs/app/api-reference/components/link)\n */\nconst Link = React.forwardRef(\n function LinkComponent(props, forwardedRef) {\n let children: React.ReactNode\n\n const {\n href: hrefProp,\n as: asProp,\n children: childrenProp,\n prefetch: prefetchProp = null,\n passHref,\n replace,\n shallow,\n scroll,\n locale,\n onClick,\n onNavigate,\n onMouseEnter: onMouseEnterProp,\n onTouchStart: onTouchStartProp,\n legacyBehavior = false,\n transitionTypes,\n ...restProps\n } = props\n\n children = childrenProp\n\n if (\n legacyBehavior &&\n (typeof children === 'string' || typeof children === 'number')\n ) {\n children = {children}\n }\n\n const router = React.useContext(RouterContext)\n\n const prefetchEnabled = prefetchProp !== false\n\n if (process.env.NODE_ENV !== 'production') {\n function createPropError(args: {\n key: string\n expected: string\n actual: string\n }) {\n return new Error(\n `Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`\\`, but got \\`${args.actual}\\` instead.` +\n (typeof window !== 'undefined'\n ? // TODO: Remove this addendum if Owner Stacks are available\n \"\\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n\n // TypeScript trick for type-guarding:\n const requiredPropsGuard: Record = {\n href: true,\n } as const\n const requiredProps: LinkPropsRequired[] = Object.keys(\n requiredPropsGuard\n ) as LinkPropsRequired[]\n requiredProps.forEach((key: LinkPropsRequired) => {\n if (key === 'href') {\n if (\n props[key] == null ||\n (typeof props[key] !== 'string' && typeof props[key] !== 'object')\n ) {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key],\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n\n // TypeScript trick for type-guarding:\n const optionalPropsGuard: Record = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n locale: true,\n onClick: true,\n onMouseEnter: true,\n onTouchStart: true,\n legacyBehavior: true,\n onNavigate: true,\n transitionTypes: true,\n } as const\n const optionalProps: LinkPropsOptional[] = Object.keys(\n optionalPropsGuard\n ) as LinkPropsOptional[]\n optionalProps.forEach((key: LinkPropsOptional) => {\n const valType = typeof props[key]\n\n if (key === 'as') {\n if (props[key] && valType !== 'string' && valType !== 'object') {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: valType,\n })\n }\n } else if (key === 'locale') {\n if (props[key] && valType !== 'string') {\n throw createPropError({\n key,\n expected: '`string`',\n actual: valType,\n })\n }\n } else if (\n key === 'onClick' ||\n key === 'onMouseEnter' ||\n key === 'onTouchStart' ||\n key === 'onNavigate'\n ) {\n if (props[key] && valType !== 'function') {\n throw createPropError({\n key,\n expected: '`function`',\n actual: valType,\n })\n }\n } else if (\n key === 'replace' ||\n key === 'scroll' ||\n key === 'shallow' ||\n key === 'passHref' ||\n key === 'legacyBehavior'\n ) {\n if (props[key] != null && valType !== 'boolean') {\n throw createPropError({\n key,\n expected: '`boolean`',\n actual: valType,\n })\n }\n } else if (key === 'prefetch') {\n if (\n props[key] != null &&\n valType !== 'boolean' &&\n props[key] !== 'auto'\n ) {\n throw createPropError({\n key,\n expected: '`boolean | \"auto\"`',\n actual: valType,\n })\n }\n } else if (key === 'transitionTypes') {\n if (props[key] != null && !Array.isArray(props[key])) {\n throw createPropError({\n key,\n expected: '`string[]`',\n actual: valType,\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n }\n\n const { href, as } = React.useMemo(() => {\n if (!router) {\n const resolvedHref = formatStringOrUrl(hrefProp)\n return {\n href: resolvedHref,\n as: asProp ? formatStringOrUrl(asProp) : resolvedHref,\n }\n }\n\n const [resolvedHref, resolvedAs] = resolveHref(router, hrefProp, true)\n\n return {\n href: resolvedHref,\n as: asProp ? resolveHref(router, asProp) : resolvedAs || resolvedHref,\n }\n }, [router, hrefProp, asProp])\n\n const previousHref = React.useRef(href)\n const previousAs = React.useRef(as)\n\n // This will return the first child, if multiple are provided it will throw an error\n let child: any\n if (legacyBehavior) {\n if (process.env.NODE_ENV === 'development') {\n if (onClick) {\n console.warn(\n `\"onClick\" was passed to with \\`href\\` of \\`${hrefProp}\\` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link`\n )\n }\n if (onMouseEnterProp) {\n console.warn(\n `\"onMouseEnter\" was passed to with \\`href\\` of \\`${hrefProp}\\` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`\n )\n }\n try {\n child = React.Children.only(children)\n } catch (err) {\n if (!children) {\n throw new Error(\n `No children were passed to with \\`href\\` of \\`${hrefProp}\\` but one child is required https://nextjs.org/docs/messages/link-no-children`\n )\n }\n throw new Error(\n `Multiple children were passed to with \\`href\\` of \\`${hrefProp}\\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` +\n (typeof window !== 'undefined'\n ? \" \\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n } else {\n child = React.Children.only(children)\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if ((children as any)?.type === 'a') {\n throw new Error(\n 'Invalid with child. Please remove or use .\\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor'\n )\n }\n }\n }\n\n const childRef: any = legacyBehavior\n ? child && typeof child === 'object' && child.ref\n : forwardedRef\n\n const [setIntersectionRef, isVisible, resetVisible] = useIntersection({\n rootMargin: '200px',\n })\n const setIntersectionWithResetRef = React.useCallback(\n (el: Element | null) => {\n // Before the link getting observed, check if visible state need to be reset\n if (previousAs.current !== as || previousHref.current !== href) {\n resetVisible()\n previousAs.current = as\n previousHref.current = href\n }\n\n setIntersectionRef(el)\n },\n [as, href, resetVisible, setIntersectionRef]\n )\n\n const setRef = useMergedRef(setIntersectionWithResetRef, childRef)\n\n // Prefetch the URL if we haven't already and it's visible.\n React.useEffect(() => {\n // in dev, we only prefetch on hover to avoid wasting resources as the prefetch will trigger compiling the page.\n if (process.env.NODE_ENV !== 'production') {\n return\n }\n\n if (!router) {\n return\n }\n\n // If we don't need to prefetch the URL, don't do prefetch.\n if (!isVisible || !prefetchEnabled) {\n return\n }\n\n // Prefetch the URL.\n prefetch(router, href, as, { locale })\n }, [as, href, isVisible, locale, prefetchEnabled, router?.locale, router])\n\n const childProps: {\n onTouchStart?: React.TouchEventHandler\n onMouseEnter: React.MouseEventHandler\n onClick: React.MouseEventHandler\n href?: string\n ref?: any\n } = {\n ref: setRef,\n onClick(e) {\n if (process.env.NODE_ENV !== 'production') {\n if (!e) {\n throw new Error(\n `Component rendered inside next/link has to pass click event to \"onClick\" prop.`\n )\n }\n }\n\n if (!legacyBehavior && typeof onClick === 'function') {\n onClick(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onClick === 'function'\n ) {\n child.props.onClick(e)\n }\n\n if (!router) {\n return\n }\n\n if (e.defaultPrevented) {\n return\n }\n\n linkClicked(\n e,\n router,\n href,\n as,\n replace,\n shallow,\n scroll,\n locale,\n onNavigate\n )\n },\n onMouseEnter(e) {\n if (!legacyBehavior && typeof onMouseEnterProp === 'function') {\n onMouseEnterProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onMouseEnter === 'function'\n ) {\n child.props.onMouseEnter(e)\n }\n\n if (!router) {\n return\n }\n\n prefetch(router, href, as, {\n locale,\n priority: true,\n // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}\n bypassPrefetchedCheck: true,\n })\n },\n onTouchStart: process.env.__NEXT_LINK_NO_TOUCH_START\n ? undefined\n : function onTouchStart(e) {\n if (!legacyBehavior && typeof onTouchStartProp === 'function') {\n onTouchStartProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onTouchStart === 'function'\n ) {\n child.props.onTouchStart(e)\n }\n\n if (!router) {\n return\n }\n\n prefetch(router, href, as, {\n locale,\n priority: true,\n // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}\n bypassPrefetchedCheck: true,\n })\n },\n }\n\n // If the url is absolute, we can bypass the logic to prepend the domain and locale.\n if (isAbsoluteUrl(as)) {\n childProps.href = as\n } else if (\n !legacyBehavior ||\n passHref ||\n (child.type === 'a' && !('href' in child.props))\n ) {\n const curLocale = typeof locale !== 'undefined' ? locale : router?.locale\n\n // we only render domain locales if we are currently on a domain locale\n // so that locale links are still visitable in development/preview envs\n const localeDomain =\n router?.isLocaleDomain &&\n getDomainLocale(as, curLocale, router?.locales, router?.domainLocales)\n\n childProps.href =\n localeDomain ||\n addBasePath(addLocale(as, curLocale, router?.defaultLocale))\n }\n\n if (legacyBehavior) {\n if (process.env.NODE_ENV === 'development') {\n errorOnce(\n '`legacyBehavior` is deprecated and will be removed in a future ' +\n 'release. A codemod is available to upgrade your components:\\n\\n' +\n 'npx @next/codemod@latest new-link .\\n\\n' +\n 'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components'\n )\n }\n return React.cloneElement(child, childProps)\n }\n\n return (\n \n {children}\n \n )\n }\n)\n\nconst LinkStatusContext = createContext<{\n pending: boolean\n}>({\n // We do not support link status in the Pages Router, so we always return false\n pending: false,\n})\n\nexport const useLinkStatus = () => {\n // This behaviour is like React's useFormStatus. When the component is not under\n // a

tag, it will get the default value, instead of throwing an error.\n return useContext(LinkStatusContext)\n}\n\nexport default Link\n","module.exports = require('./dist/client/link')\n"],"mappings":";;;;;;AAAA;AAAA;AAAA;AAEA,aAAS,yBAAyB,aAAa;AAC3C,UAAI,OAAO,YAAY,WAAY,QAAO;AAE1C,UAAI,oBAAoB,oBAAI,QAAQ;AACpC,UAAI,mBAAmB,oBAAI,QAAQ;AAEnC,cAAQ,2BAA2B,SAASA,cAAa;AACrD,eAAOA,eAAc,mBAAmB;AAAA,MAC5C,GAAG,WAAW;AAAA,IAClB;AACA,aAAS,0BAA0B,KAAK,aAAa;AACjD,UAAI,CAAC,eAAe,OAAO,IAAI,WAAY,QAAO;AAClD,UAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,OAAO,QAAQ,WAAY,QAAO,EAAE,SAAS,IAAI;AAEhG,UAAI,QAAQ,yBAAyB,WAAW;AAEhD,UAAI,SAAS,MAAM,IAAI,GAAG,EAAG,QAAO,MAAM,IAAI,GAAG;AAEjD,UAAI,SAAS,EAAE,WAAW,KAAK;AAC/B,UAAI,wBAAwB,OAAO,kBAAkB,OAAO;AAE5D,eAAS,OAAO,KAAK;AACjB,YAAI,QAAQ,aAAa,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AACrE,cAAI,OAAO,wBAAwB,OAAO,yBAAyB,KAAK,GAAG,IAAI;AAC/E,cAAI,SAAS,KAAK,OAAO,KAAK,KAAM,QAAO,eAAe,QAAQ,KAAK,IAAI;AAAA,cACtE,QAAO,GAAG,IAAI,IAAI,GAAG;AAAA,QAC9B;AAAA,MACJ;AAEA,aAAO,UAAU;AAEjB,UAAI,MAAO,OAAM,IAAI,KAAK,MAAM;AAEhC,aAAO;AAAA,IACX;AACA,YAAQ,IAAI;AAAA;AAAA;;;;;;;;;;;;;;;;MCWIC,QAAM,WAAA;eAANA;;MA9CAC,wBAAsB,WAAA;eAAtBA;;MAgCAC,wBAAsB,WAAA;eAAtBA;;;AAhCT,aAASD,uBACdE,cAA6B;AAE7B,YAAMC,QAAwB,CAAC;AAC/B,iBAAW,CAACC,KAAKC,KAAAA,KAAUH,aAAaI,QAAO,GAAI;AACjD,cAAMC,WAAWJ,MAAMC,GAAAA;AACvB,YAAI,OAAOG,aAAa,aAAa;AACnCJ,gBAAMC,GAAAA,IAAOC;QACf,WAAWG,MAAMC,QAAQF,QAAAA,GAAW;AAClCA,mBAASG,KAAKL,KAAAA;QAChB,OAAO;AACLF,gBAAMC,GAAAA,IAAO;YAACG;YAAUF;;QAC1B;MACF;AACA,aAAOF;IACT;AAEA,aAASQ,uBAAuBC,OAAc;AAC5C,UAAI,OAAOA,UAAU,UAAU;AAC7B,eAAOA;MACT;AAEA,UACG,OAAOA,UAAU,YAAY,CAACC,MAAMD,KAAAA,KACrC,OAAOA,UAAU,WACjB;AACA,eAAOE,OAAOF,KAAAA;MAChB,OAAO;AACL,eAAO;MACT;IACF;AAEO,aAASX,uBAAuBE,OAAqB;AAC1D,YAAMD,eAAe,IAAIa,gBAAAA;AACzB,iBAAW,CAACX,KAAKC,KAAAA,KAAUW,OAAOV,QAAQH,KAAAA,GAAQ;AAChD,YAAIK,MAAMC,QAAQJ,KAAAA,GAAQ;AACxB,qBAAWY,QAAQZ,OAAO;AACxBH,yBAAagB,OAAOd,KAAKO,uBAAuBM,IAAAA,CAAAA;UAClD;QACF,OAAO;AACLf,uBAAaiB,IAAIf,KAAKO,uBAAuBN,KAAAA,CAAAA;QAC/C;MACF;AACA,aAAOH;IACT;AAEO,aAASH,OACdqB,WACGC,kBAAmC;AAEtC,iBAAWnB,gBAAgBmB,kBAAkB;AAC3C,mBAAWjB,OAAOF,aAAaoB,KAAI,GAAI;AACrCF,iBAAOG,OAAOnB,GAAAA;QAChB;AAEA,mBAAW,CAACA,KAAKC,KAAAA,KAAUH,aAAaI,QAAO,GAAI;AACjDc,iBAAOF,OAAOd,KAAKC,KAAAA;QACrB;MACF;AAEA,aAAOe;IACT;;;;;AC/DA;;;;;;;;;;;;;MA4BgBI,WAAS,WAAA;eAATA;;MA6DAC,sBAAoB,WAAA;eAApBA;;MAfHC,eAAa,WAAA;eAAbA;;;;wFAlDgB;AAE7B,QAAMC,mBAAmB;AAElB,aAASH,UAAUI,QAAiB;AACzC,UAAI,EAAEC,MAAMC,SAAQ,IAAKF;AACzB,UAAIG,WAAWH,OAAOG,YAAY;AAClC,UAAIC,WAAWJ,OAAOI,YAAY;AAClC,UAAIC,OAAOL,OAAOK,QAAQ;AAC1B,UAAIC,QAAQN,OAAOM,SAAS;AAC5B,UAAIC,OAAuB;AAE3BN,aAAOA,OAAOO,mBAAmBP,IAAAA,EAAMQ,QAAQ,QAAQ,GAAA,IAAO,MAAM;AAEpE,UAAIT,OAAOO,MAAM;AACfA,eAAON,OAAOD,OAAOO;MACvB,WAAWL,UAAU;AACnBK,eAAON,QAAQ,CAACC,SAASQ,QAAQ,GAAA,IAAO,IAAIR,QAAAA,MAAcA;AAC1D,YAAIF,OAAOW,MAAM;AACfJ,kBAAQ,MAAMP,OAAOW;QACvB;MACF;AAEA,UAAIL,SAAS,OAAOA,UAAU,UAAU;AACtCA,gBAAQM,OAAOC,aAAYC,uBAAuBR,KAAAA,CAAAA;MACpD;AAEA,UAAIS,SAASf,OAAOe,UAAWT,SAAS,IAAIA,KAAAA,MAAY;AAExD,UAAIH,YAAY,CAACA,SAASa,SAAS,GAAA,EAAMb,aAAY;AAErD,UACEH,OAAOiB,YACL,CAACd,YAAYJ,iBAAiBmB,KAAKf,QAAAA,MAAcI,SAAS,OAC5D;AACAA,eAAO,QAAQA,QAAQ;AACvB,YAAIH,YAAYA,SAAS,CAAA,MAAO,IAAKA,YAAW,MAAMA;MACxD,WAAW,CAACG,MAAM;AAChBA,eAAO;MACT;AAEA,UAAIF,QAAQA,KAAK,CAAA,MAAO,IAAKA,QAAO,MAAMA;AAC1C,UAAIU,UAAUA,OAAO,CAAA,MAAO,IAAKA,UAAS,MAAMA;AAEhDX,iBAAWA,SAASK,QAAQ,SAASD,kBAAAA;AACrCO,eAASA,OAAON,QAAQ,KAAK,KAAA;AAE7B,aAAO,GAAGN,QAAAA,GAAWI,IAAAA,GAAOH,QAAAA,GAAWW,MAAAA,GAASV,IAAAA;IAClD;AAEO,QAAMP,gBAAgB;MAC3B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;AAGK,aAASD,qBAAqBsB,KAAc;AACjD,UAAIC,QAAQC,IAAIC,aAAa,eAAe;AAC1C,YAAIH,QAAQ,QAAQ,OAAOA,QAAQ,UAAU;AAC3CI,iBAAOC,KAAKL,GAAAA,EAAKM,QAAQ,CAACC,QAAAA;AACxB,gBAAI,CAAC5B,cAAc6B,SAASD,GAAAA,GAAM;AAChCE,sBAAQC,KACN,qDAAqDH,GAAAA,EAAK;YAE9D;UACF,CAAA;QACF;MACF;AAEA,aAAO9B,UAAUuB,GAAAA;IACnB;;;;;;;;;;;mCCvGgBW,QAAAA;;;eAAAA;;;AAAT,aAASA,KACdC,QACAC,MAAS;AAET,YAAMC,UAAsC,CAAC;AAC7CC,aAAOF,KAAKD,MAAAA,EAAQI,QAAQ,CAACC,QAAAA;AAC3B,YAAI,CAACJ,KAAKK,SAASD,GAAAA,GAAW;AAC5BH,kBAAQG,GAAAA,IAAOL,OAAOK,GAAAA;QACxB;MACF,CAAA;AACA,aAAOH;IACT;;;;;;;;;;;;;;;;;;MCwZaK,aAAW,WAAA;eAAXA;;MAoBAC,yBAAuB,WAAA;eAAvBA;;MAPAC,mBAAiB,WAAA;eAAjBA;;MAZAC,gBAAc,WAAA;eAAdA;;MACAC,mBAAiB,WAAA;eAAjBA;;MATAC,IAAE,WAAA;eAAFA;;MACAC,IAAE,WAAA;eAAFA;;MAjXAC,YAAU,WAAA;eAAVA;;MAqQGC,UAAQ,WAAA;eAARA;;MA+BAC,gBAAc,WAAA;eAAdA;;MAXAC,mBAAiB,WAAA;eAAjBA;;MAKAC,QAAM,WAAA;eAANA;;MAPHC,eAAa,WAAA;eAAbA;;MAmBGC,WAAS,WAAA;eAATA;;MAkBMC,qBAAmB,WAAA;eAAnBA;;MAdNC,0BAAwB,WAAA;eAAxBA;;MA+GAC,gBAAc,WAAA;eAAdA;;;AA7ZT,QAAMT,aAAa;MAAC;MAAO;MAAO;MAAO;MAAO;MAAO;;AAqQvD,aAASC,SACdS,IAAK;AAEL,UAAIC,OAAO;AACX,UAAIC;AAEJ,aAAQ,IAAIC,SAAAA;AACV,YAAI,CAACF,MAAM;AACTA,iBAAO;AACPC,mBAASF,GAAAA,GAAMG,IAAAA;QACjB;AACA,eAAOD;MACT;IACF;AAIA,QAAME,qBAAqB;AACpB,QAAMT,gBAAgB,CAACU,QAAgBD,mBAAmBE,KAAKD,GAAAA;AAE/D,aAASZ,oBAAAA;AACd,YAAM,EAAEc,UAAUC,UAAUC,KAAI,IAAKC,OAAOC;AAC5C,aAAO,GAAGJ,QAAAA,KAAaC,QAAAA,GAAWC,OAAO,MAAMA,OAAO,EAAA;IACxD;AAEO,aAASf,SAAAA;AACd,YAAM,EAAEkB,KAAI,IAAKF,OAAOC;AACxB,YAAME,SAASpB,kBAAAA;AACf,aAAOmB,KAAKE,UAAUD,OAAOE,MAAM;IACrC;AAEO,aAASvB,eAAkBwB,WAA2B;AAC3D,aAAO,OAAOA,cAAc,WACxBA,YACAA,UAAUC,eAAeD,UAAUE,QAAQ;IACjD;AAEO,aAAStB,UAAUuB,KAAmB;AAC3C,aAAOA,IAAIC,YAAYD,IAAIE;IAC7B;AAEO,aAASvB,yBAAyBO,KAAW;AAClD,YAAMiB,WAAWjB,IAAIkB,MAAM,GAAA;AAC3B,YAAMC,aAAaF,SAAS,CAAA;AAE5B,aACEE,WAGGC,QAAQ,OAAO,GAAA,EACfA,QAAQ,UAAU,GAAA,KACpBH,SAAS,CAAA,IAAK,IAAIA,SAASI,MAAM,CAAA,EAAGC,KAAK,GAAA,CAAA,KAAS;IAEvD;AAEO,mBAAe9B,oBAIpB+B,KAAkCC,KAAM;AACxC,UAAIC,QAAQC,IAAIC,aAAa,cAAc;AACzC,YAAIJ,IAAIK,WAAWC,iBAAiB;AAClC,gBAAMC,UAAU,IAAI3C,eAClBoC,GAAAA,CAAAA;AAEF,gBAAM,OAAA,eAAA,IAAIQ,MAAMD,OAAAA,GAAV,qBAAA;mBAAA;wBAAA;0BAAA;UAAiB,CAAA;QACzB;MACF;AAEA,YAAMhB,MAAMU,IAAIV,OAAQU,IAAIA,OAAOA,IAAIA,IAAIV;AAE3C,UAAI,CAACS,IAAIM,iBAAiB;AACxB,YAAIL,IAAIA,OAAOA,IAAIb,WAAW;AAE5B,iBAAO;YACLqB,WAAW,MAAMxC,oBAAoBgC,IAAIb,WAAWa,IAAIA,GAAG;UAC7D;QACF;AACA,eAAO,CAAC;MACV;AAEA,YAAMS,QAAQ,MAAMV,IAAIM,gBAAgBL,GAAAA;AAExC,UAAIV,OAAOvB,UAAUuB,GAAAA,GAAM;AACzB,eAAOmB;MACT;AAEA,UAAI,CAACA,OAAO;AACV,cAAMH,UAAU,IAAI3C,eAClBoC,GAAAA,CAAAA,+DAC8DU,KAAAA;AAChE,cAAM,OAAA,eAAA,IAAIF,MAAMD,OAAAA,GAAV,qBAAA;iBAAA;sBAAA;wBAAA;QAAiB,CAAA;MACzB;AAEA,UAAIL,QAAQC,IAAIC,aAAa,cAAc;AACzC,YAAIO,OAAOC,KAAKF,KAAAA,EAAOvB,WAAW,KAAK,CAACc,IAAIA,KAAK;AAC/CY,kBAAQC,KACN,GAAGlD,eACDoC,GAAAA,CAAAA,iLACgL;QAEtL;MACF;AAEA,aAAOU;IACT;AAEO,QAAMlD,KAAK,OAAOuD,gBAAgB;AAClC,QAAMtD,KACXD,MACC;MAAC;MAAQ;MAAW;MAA8BwD,MACjD,CAACC,WAAW,OAAOF,YAAYE,MAAAA,MAAY,UAAA;AAGxC,QAAM9D,cAAN,cAA0BqD,MAAAA;IAAO;AACjC,QAAMlD,iBAAN,cAA6BkD,MAAAA;IAAO;AACpC,QAAMjD,oBAAN,cAAgCiD,MAAAA;MAGrCU,YAAYC,MAAc;AACxB,cAAK;AACL,aAAKC,OAAO;AACZ,aAAK9B,OAAO;AACZ,aAAKiB,UAAU,gCAAgCY,IAAAA;MACjD;IACF;AAEO,QAAM9D,oBAAN,cAAgCmD,MAAAA;MACrCU,YAAYC,MAAcZ,SAAiB;AACzC,cAAK;AACL,aAAKA,UAAU,wCAAwCY,IAAAA,IAAQZ,OAAAA;MACjE;IACF;AAEO,QAAMnD,0BAAN,cAAsCoD,MAAAA;MAE3CU,cAAc;AACZ,cAAK;AACL,aAAKE,OAAO;AACZ,aAAKb,UAAU;MACjB;IACF;AAWO,aAASpC,eAAekD,OAAY;AACzC,aAAOC,KAAKC,UAAU;QAAEhB,SAASc,MAAMd;QAASiB,OAAOH,MAAMG;MAAM,CAAA;IACrE;;;;;AC3cA;;;;;;mCAOgBC,uBAAAA;;;eAAAA;;;AAAT,aAASA,oBAAoBC,OAAa;AAC/C,aAAOA,MAAMC,QAAQ,OAAO,EAAA,KAAO;IACrC;;;;;ACTA;;;;;;mCAKgBC,aAAAA;;;eAAAA;;;AAAT,aAASA,UAAUC,MAAY;AACpC,YAAMC,YAAYD,KAAKE,QAAQ,GAAA;AAC/B,YAAMC,aAAaH,KAAKE,QAAQ,GAAA;AAChC,YAAME,WAAWD,aAAa,OAAOF,YAAY,KAAKE,aAAaF;AAEnE,UAAIG,YAAYH,YAAY,IAAI;AAC9B,eAAO;UACLI,UAAUL,KAAKM,UAAU,GAAGF,WAAWD,aAAaF,SAAAA;UACpDM,OAAOH,WACHJ,KAAKM,UAAUH,YAAYF,YAAY,KAAKA,YAAYO,MAAAA,IACxD;UACJC,MAAMR,YAAY,KAAKD,KAAKU,MAAMT,SAAAA,IAAa;QACjD;MACF;AAEA,aAAO;QAAEI,UAAUL;QAAMO,OAAO;QAAIE,MAAM;MAAG;IAC/C;;;;;;;;;;;mCCdaE,8BAAAA;;;eAAAA;;;;;AAAN,QAAMA,6BAA6B,CAACC,SAAAA;AACzC,UAAI,CAACA,KAAKC,WAAW,GAAA,KAAQC,QAAQC,IAAIC,8BAA8B;AACrE,eAAOJ;MACT;AAEA,YAAM,EAAEK,UAAUC,OAAOC,KAAI,KAAKC,GAAAA,WAAAA,WAAUR,IAAAA;AAC5C,UAAIE,QAAQC,IAAIM,uBAAuB;AACrC,YAAI,cAAcC,KAAKL,QAAAA,GAAW;AAChC,iBAAO,IAAGM,GAAAA,qBAAAA,qBAAoBN,QAAAA,CAAAA,GAAYC,KAAAA,GAAQC,IAAAA;QACpD,WAAWF,SAASO,SAAS,GAAA,GAAM;AACjC,iBAAO,GAAGP,QAAAA,GAAWC,KAAAA,GAAQC,IAAAA;QAC/B,OAAO;AACL,iBAAO,GAAGF,QAAAA,IAAYC,KAAAA,GAAQC,IAAAA;QAChC;MACF;AAEA,aAAO,IAAGI,GAAAA,qBAAAA,qBAAoBN,QAAAA,CAAAA,GAAYC,KAAAA,GAAQC,IAAAA;IACpD;;;;;;;;;;;;;;;;mCCfgBM,iBAAAA;;;eAAAA;;;;AAAT,aAASA,cAAcC,MAAcC,QAAc;AACxD,UAAI,OAAOD,SAAS,UAAU;AAC5B,eAAO;MACT;AAEA,YAAM,EAAEE,SAAQ,KAAKC,GAAAA,WAAAA,WAAUH,IAAAA;AAC/B,aAAOE,aAAaD,UAAUC,SAASE,WAAWH,SAAS,GAAA;IAC7D;;;;;;;;;;;mCCZgBI,eAAAA;;;eAAAA;;;;AAFhB,QAAMC,WAAYC,QAAQC,IAAIC,0BAAqC;AAE5D,aAASJ,YAAYK,MAAY;AACtC,cAAOC,GAAAA,eAAAA,eAAcD,MAAMJ,QAAAA;IAC7B;;;;;;;;;;;;;;;;mCCAgBM,cAAAA;;;eAAAA;;;;;AAAT,aAASA,WAAWC,KAAW;AAEpC,UAAI,EAACC,GAAAA,OAAAA,eAAcD,GAAAA,EAAM,QAAO;AAChC,UAAI;AAEF,cAAME,kBAAiBC,GAAAA,OAAAA,mBAAiB;AACxC,cAAMC,WAAW,IAAIC,IAAIL,KAAKE,cAAAA;AAC9B,eAAOE,SAASE,WAAWJ,mBAAkBK,GAAAA,aAAAA,aAAYH,SAASI,QAAQ;MAC5E,SAASC,GAAG;AACV,eAAO;MACT;IACF;;;;;;;;;;;;;;;;;;MCsNgBC,uBAAqB,WAAA;eAArBA;;MAzBAC,iBAAe,WAAA;eAAfA;;;AA9MhB,QAAMC,UAAN,MAAMA,SAAAA;MAOJC,OAAOC,SAAuB;AAC5B,aAAKC,QAAQD,QAAQE,MAAM,GAAA,EAAKC,OAAOC,OAAAA,GAAU,CAAA,GAAI,KAAA;MACvD;MAEAC,SAAmB;AACjB,eAAO,KAAKC,QAAO;MACrB;MAEQA,QAAQC,SAAiB,KAAe;AAC9C,cAAMC,gBAAgB;aAAI,KAAKC,SAASC,KAAI;UAAIC,KAAI;AACpD,YAAI,KAAKC,aAAa,MAAM;AAC1BJ,wBAAcK,OAAOL,cAAcM,QAAQ,IAAA,GAAO,CAAA;QACpD;AACA,YAAI,KAAKC,iBAAiB,MAAM;AAC9BP,wBAAcK,OAAOL,cAAcM,QAAQ,OAAA,GAAU,CAAA;QACvD;AACA,YAAI,KAAKE,yBAAyB,MAAM;AACtCR,wBAAcK,OAAOL,cAAcM,QAAQ,SAAA,GAAY,CAAA;QACzD;AAEA,cAAMG,SAAST,cACZU,IAAI,CAACC,MAAM,KAAKV,SAASW,IAAID,CAAAA,EAAIb,QAAQ,GAAGC,MAAAA,GAASY,CAAAA,GAAI,CAAA,EACzDE,OAAO,CAACC,MAAMC,SAAS;aAAID;aAASC;WAAO,CAAA,CAAE;AAEhD,YAAI,KAAKX,aAAa,MAAM;AAC1BK,iBAAOO,KAAI,GACN,KAAKf,SAASW,IAAI,IAAA,EAAOd,QAAQ,GAAGC,MAAAA,IAAU,KAAKK,QAAQ,IAAI,CAAA;QAEtE;AAEA,YAAI,CAAC,KAAKa,aAAa;AACrB,gBAAMC,IAAInB,WAAW,MAAM,MAAMA,OAAOoB,MAAM,GAAG,EAAC;AAClD,cAAI,KAAKX,wBAAwB,MAAM;AACrC,kBAAM,OAAA,eAAA,IAAIY,MACR,uFAAuFF,CAAAA,UAAWA,CAAAA,QAAS,KAAKV,oBAAoB,OAAO,GADvI,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AAEAC,iBAAOY,QAAQH,CAAAA;QACjB;AAEA,YAAI,KAAKX,iBAAiB,MAAM;AAC9BE,iBAAOO,KAAI,GACN,KAAKf,SACLW,IAAI,OAAA,EACJd,QAAQ,GAAGC,MAAAA,OAAa,KAAKQ,YAAY,IAAI,CAAA;QAEpD;AAEA,YAAI,KAAKC,yBAAyB,MAAM;AACtCC,iBAAOO,KAAI,GACN,KAAKf,SACLW,IAAI,SAAA,EACJd,QAAQ,GAAGC,MAAAA,QAAc,KAAKS,oBAAoB,KAAK,CAAA;QAE9D;AAEA,eAAOC;MACT;MAEQhB,QACN6B,UACAC,WACAC,YACM;AACN,YAAIF,SAASG,WAAW,GAAG;AACzB,eAAKR,cAAc;AACnB;QACF;AAEA,YAAIO,YAAY;AACd,gBAAM,OAAA,eAAA,IAAIJ,MAAM,6CAA6C,GAAvD,qBAAA;mBAAA;wBAAA;0BAAA;UAAuD,CAAA;QAC/D;AAGA,YAAIM,cAAcJ,SAAS,CAAA;AAG3B,YAAII,YAAYC,WAAW,GAAA,KAAQD,YAAYE,SAAS,GAAA,GAAM;AAmC5D,cAASC,aAAT,SAAoBC,cAA6BC,UAAgB;AAC/D,gBAAID,iBAAiB,MAAM;AAMzB,kBAAIA,iBAAiBC,UAAU;AAE7B,sBAAM,OAAA,eAAA,IAAIX,MACR,mEAAmEU,YAAAA,UAAsBC,QAAAA,KAAa,GADlG,qBAAA;yBAAA;8BAAA;gCAAA;gBAEN,CAAA;cACF;YACF;AAEAR,sBAAUS,QAAQ,CAACC,SAAAA;AACjB,kBAAIA,SAASF,UAAU;AACrB,sBAAM,OAAA,eAAA,IAAIX,MACR,uCAAuCW,QAAAA,uCAA+C,GADlF,qBAAA;yBAAA;8BAAA;gCAAA;gBAEN,CAAA;cACF;AAEA,kBAAIE,KAAKC,QAAQ,OAAO,EAAA,MAAQR,YAAYQ,QAAQ,OAAO,EAAA,GAAK;AAC9D,sBAAM,OAAA,eAAA,IAAId,MACR,mCAAmCa,IAAAA,UAAcF,QAAAA,gEAAwE,GADrH,qBAAA;yBAAA;8BAAA;gCAAA;gBAEN,CAAA;cACF;YACF,CAAA;AAEAR,sBAAUP,KAAKe,QAAAA;UACjB;AA/DA,cAAII,cAAcT,YAAYP,MAAM,GAAG,EAAC;AAExC,cAAIiB,aAAa;AACjB,cAAID,YAAYR,WAAW,GAAA,KAAQQ,YAAYP,SAAS,GAAA,GAAM;AAE5DO,0BAAcA,YAAYhB,MAAM,GAAG,EAAC;AACpCiB,yBAAa;UACf;AAEA,cAAID,YAAYR,WAAW,QAAA,GAAM;AAC/B,kBAAM,OAAA,eAAA,IAAIP,MACR,kDAA6Ce,WAAAA,2BAAsC,GAD/E,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AAEA,cAAIA,YAAYR,WAAW,KAAA,GAAQ;AAEjCQ,0BAAcA,YAAYE,UAAU,CAAA;AACpCb,yBAAa;UACf;AAEA,cAAIW,YAAYR,WAAW,GAAA,KAAQQ,YAAYP,SAAS,GAAA,GAAM;AAC5D,kBAAM,OAAA,eAAA,IAAIR,MACR,4DAA4De,WAAAA,KAAgB,GADxE,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AAEA,cAAIA,YAAYR,WAAW,GAAA,GAAM;AAC/B,kBAAM,OAAA,eAAA,IAAIP,MACR,wDAAwDe,WAAAA,KAAgB,GADpE,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AAkCA,cAAIX,YAAY;AACd,gBAAIY,YAAY;AACd,kBAAI,KAAK7B,gBAAgB,MAAM;AAC7B,sBAAM,OAAA,eAAA,IAAIa,MACR,wFAAwF,KAAKb,YAAY,WAAWe,SAAS,CAAA,CAAE,MAAM,GADjI,qBAAA;yBAAA;8BAAA;gCAAA;gBAEN,CAAA;cACF;AAEAO,yBAAW,KAAKrB,sBAAsB2B,WAAAA;AAEtC,mBAAK3B,uBAAuB2B;AAE5BT,4BAAc;YAChB,OAAO;AACL,kBAAI,KAAKlB,wBAAwB,MAAM;AACrC,sBAAM,OAAA,eAAA,IAAIY,MACR,yFAAyF,KAAKZ,oBAAoB,YAAYc,SAAS,CAAA,CAAE,KAAK,GAD1I,qBAAA;yBAAA;8BAAA;gCAAA;gBAEN,CAAA;cACF;AAEAO,yBAAW,KAAKtB,cAAc4B,WAAAA;AAE9B,mBAAK5B,eAAe4B;AAEpBT,4BAAc;YAChB;UACF,OAAO;AACL,gBAAIU,YAAY;AACd,oBAAM,OAAA,eAAA,IAAIhB,MACR,qDAAqDE,SAAS,CAAA,CAAE,KAAK,GADjE,qBAAA;uBAAA;4BAAA;8BAAA;cAEN,CAAA;YACF;AACAO,uBAAW,KAAKzB,UAAU+B,WAAAA;AAE1B,iBAAK/B,WAAW+B;AAEhBT,0BAAc;UAChB;QACF;AAGA,YAAI,CAAC,KAAKzB,SAASqC,IAAIZ,WAAAA,GAAc;AACnC,eAAKzB,SAASsC,IAAIb,aAAa,IAAIpC,SAAAA,CAAAA;QACrC;AAEA,aAAKW,SACFW,IAAIc,WAAAA,EACJjC,QAAQ6B,SAASH,MAAM,CAAA,GAAII,WAAWC,UAAAA;MAC3C;;aAvMAP,cAAuB;aACvBhB,WAAiC,oBAAIuC,IAAAA;aACrCpC,WAA0B;aAC1BG,eAA8B;aAC9BC,uBAAsC;;IAoMxC;AAKO,aAASnB,gBACdoD,iBAAsC;AAatC,YAAMC,OAAO,IAAIpD,QAAAA;AAGjBmD,sBAAgBT,QAAQ,CAACW,aAAaD,KAAKnD,OAAOoD,QAAAA,CAAAA;AAElD,aAAOD,KAAK7C,OAAM;IACpB;AAKO,aAAST,sBACdwD,SACAC,QAA0B;AAI1B,YAAMC,UAAkC,CAAC;AACzC,YAAMC,YAAsB,CAAA;AAC5B,eAASC,IAAI,GAAGA,IAAIJ,QAAQnB,QAAQuB,KAAK;AACvC,cAAMC,WAAWJ,OAAOD,QAAQI,CAAAA,CAAE;AAClCF,gBAAQG,QAAAA,IAAYD;AACpBD,kBAAUC,CAAAA,IAAKC;MACjB;AAGA,YAAMC,SAAS7D,gBAAgB0D,SAAAA;AAI/B,aAAOG,OAAOxC,IAAI,CAACuC,aAAaL,QAAQE,QAAQG,QAAAA,CAAS,CAAC;IAC5D;;;;;AC3PA;;;;;;mCAIgBE,sBAAAA;;;eAAAA;;;AAAT,aAASA,mBAAmBC,MAAY;AAC7C,aAAOA,KAAKC,WAAW,GAAA,IAAOD,OAAO,IAAIA,IAAAA;IAC3C;;;;;;;;;;;;;;;;;;MCiFaE,qBAAmB,WAAA;eAAnBA;;MACAC,uBAAqB,WAAA;eAArBA;;MAFAC,kBAAgB,WAAA;eAAhBA;;MAvEGC,8BAA4B,WAAA;eAA5BA;;MAgBAC,8BAA4B,WAAA;eAA5BA;;MA7BAC,iBAAe,WAAA;eAAfA;;MAiDAC,8BAA4B,WAAA;eAA5BA;;MA7CAC,gBAAc,WAAA;eAAdA;;MAKAC,wBAAsB,WAAA;eAAtBA;;;AATT,aAASH,gBAAgBI,SAAgB;AAC9C,aAAOC,MAAMC,QAAQF,OAAAA,IAAWA,QAAQ,CAAA,IAAKA;IAC/C;AAEO,aAASF,eAAeE,SAAe;AAE5C,aAAOA,QAAQ,CAAA,MAAO,OAAOA,QAAQG,SAAS,GAAA;IAChD;AAEO,aAASJ,uBAAuBC,SAAe;AACpD,aAAOA,QAAQI,WAAW,GAAA,KAAQJ,YAAY;IAChD;AAEO,aAASN,6BACdM,SACAK,cAA2D;AAE3D,YAAMC,gBAAgBN,QAAQO,SAASd,gBAAAA;AAEvC,UAAIa,eAAe;AACjB,cAAME,mBAAmBC,KAAKC,UAAUL,YAAAA;AACxC,eAAOG,qBAAqB,OACxBf,mBAAmB,MAAMe,mBACzBf;MACN;AAEA,aAAOO;IACT;AAEO,aAASL,6BACdgB,UACAC,kBAAwB;AAExB,UAAI,CAACD,YAAYA,SAASE,WAAW,GAAG;AACtC,eAAO;MACT;AAGA,YAAMC,aACJF,qBAAqB,aACjBD,SAAS,CAAA,IACTA,SAASA,SAASE,SAAS,CAAA;AAIjC,aAAOC,eAAevB,sBAAsB,OAAOuB;IACrD;AAGO,aAASjB,6BACdkB,MACAH,kBACAI,QAAQ,MACRC,cAAwB,CAAA,GAAE;AAE1B,UAAIC;AACJ,UAAIF,OAAO;AAETE,eAAOH,KAAK,CAAA,EAAGH,gBAAAA;MACjB,OAAO;AAEL,cAAMO,iBAAiBJ,KAAK,CAAA;AAC5BG,eAAOC,eAAeC,YAAYC,OAAOC,OAAOH,cAAAA,EAAgB,CAAA;MAClE;AAEA,UAAI,CAACD,KAAM,QAAOD;AAClB,YAAMjB,UAAUkB,KAAK,CAAA;AAErB,UAAIK,eAAe3B,gBAAgBI,OAAAA;AAEnC,UAAI,CAACuB,gBAAgBA,aAAanB,WAAWX,gBAAAA,GAAmB;AAC9D,eAAOwB;MACT;AAEAA,kBAAYO,KAAKD,YAAAA;AAEjB,aAAO1B,6BACLqB,MACAN,kBACA,OACAK,WAAAA;IAEJ;AAEO,QAAMxB,mBAAmB;AACzB,QAAMF,sBAAsB;AAC5B,QAAMC,wBAAwB;;;;;;;;;;;;;;;;;;MCzBrBiC,iBAAe,WAAA;eAAfA;;MAzCAC,kBAAgB,WAAA;eAAhBA;;MAqDAC,iBAAe,WAAA;eAAfA;;;;;AArDT,aAASD,iBAAiBE,OAAa;AAC5C,cAAOC,GAAAA,oBAAAA,oBACLD,MAAME,MAAM,GAAA,EAAKC,OAAO,CAACC,UAAUC,SAASC,OAAOC,aAAAA;AAEjD,YAAI,CAACF,SAAS;AACZ,iBAAOD;QACT;AAGA,aAAII,GAAAA,SAAAA,gBAAeH,OAAAA,GAAU;AAC3B,iBAAOD;QACT;AAGA,YAAIC,QAAQ,CAAA,MAAO,KAAK;AACtB,iBAAOD;QACT;AAGA,aACGC,YAAY,UAAUA,YAAY,YACnCC,UAAUC,SAASE,SAAS,GAC5B;AACA,iBAAOL;QACT;AAEA,eAAO,GAAGA,QAAAA,IAAYC,OAAAA;MACxB,GAAG,EAAA,CAAA;IAEP;AAYO,aAASR,gBAAgBa,GAAWC,GAAS;AAClD,YAAMC,WAAWF,EAAEG,SAAS,IAAA;AAC5B,YAAMC,WAAWH,EAAEE,SAAS,IAAA;AAC5B,UAAID,YAAY,CAACE,SAAU,QAAO;AAClC,UAAI,CAACF,YAAYE,SAAU,QAAO;AAClC,aAAOJ,EAAEK,cAAcJ,CAAAA;IACzB;AAMO,aAASZ,gBAAgBiB,KAAW;AACzC,aAAOA,IAAIC;QACT;;QAEA;MAAA;IAEJ;;;;;;;;;;;;;;;;;;MC9EaC,4BAA0B,WAAA;eAA1BA;;MAmCGC,qCAAmC,WAAA;eAAnCA;;MA1BAC,4BAA0B,WAAA;eAA1BA;;;;AATT,QAAMF,6BAA6B;MACxC;MACA;MACA;MACA;;AAKK,aAASE,2BAA2BC,MAAY;AAErD,aACEA,KACGC,MAAM,GAAA,EACNC,KAAK,CAACC,YACLN,2BAA2BK,KAAK,CAACE,MAAMD,QAAQE,WAAWD,CAAAA,CAAAA,CAAAA,MACtDE;IAEZ;AAiBO,aAASR,oCACdE,MAAY;AAEZ,UAAIO;AACJ,UAAIC;AACJ,UAAIC;AAEJ,iBAAWN,WAAWH,KAAKC,MAAM,GAAA,GAAM;AACrCO,iBAASX,2BAA2BK,KAAK,CAACE,MAAMD,QAAQE,WAAWD,CAAAA,CAAAA;AACnE,YAAII,QAAQ;;AACT,WAACD,mBAAmBE,gBAAAA,IAAoBT,KAAKC,MAAMO,QAAQ,CAAA;AAC5D;QACF;MACF;AAEA,UAAI,CAACD,qBAAqB,CAACC,UAAU,CAACC,kBAAkB;AACtD,cAAM,OAAA,eAAA,IAAIC,MACR,+BAA+BV,IAAAA,mFAAuF,GADlH,qBAAA;iBAAA;sBAAA;wBAAA;QAEN,CAAA;MACF;AAEAO,2BAAoBI,GAAAA,UAAAA,kBAAiBJ,iBAAAA;AAErC,cAAQC,QAAAA;QACN,KAAK;AAEH,cAAID,sBAAsB,KAAK;AAC7BE,+BAAmB,IAAIA,gBAAAA;UACzB,OAAO;AACLA,+BAAmBF,oBAAoB,MAAME;UAC/C;AACA;QACF,KAAK;AAEH,cAAIF,sBAAsB,KAAK;AAC7B,kBAAM,OAAA,eAAA,IAAIG,MACR,+BAA+BV,IAAAA,8DAAkE,GAD7F,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AACAS,6BAAmBF,kBAChBN,MAAM,GAAA,EACNW,MAAM,GAAG,EAAC,EACVC,OAAOJ,gBAAAA,EACPK,KAAK,GAAA;AACR;QACF,KAAK;AAEHL,6BAAmB,MAAMA;AACzB;QACF,KAAK;AAGH,gBAAMM,yBAAyBR,kBAAkBN,MAAM,GAAA;AACvD,cAAIc,uBAAuBC,UAAU,GAAG;AACtC,kBAAM,OAAA,eAAA,IAAIN,MACR,+BAA+BV,IAAAA,iEAAqE,GADhG,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;AAEAS,6BAAmBM,uBAChBH,MAAM,GAAG,EAAC,EACVC,OAAOJ,gBAAAA,EACPK,KAAK,GAAA;AACR;QACF;AACE,gBAAM,OAAA,eAAA,IAAIJ,MAAM,8BAAA,GAAV,qBAAA;mBAAA;wBAAA;0BAAA;UAAwC,CAAA;MAClD;AAEA,aAAO;QAAEH;QAAmBE;MAAiB;IAC/C;;;;;;;;;;;mCCzFgBQ,kBAAAA;;;eAAAA;;;;AAZhB,QAAMC,aAAa;AAGnB,QAAMC,oBAAoB;AASnB,aAASF,eAAeG,OAAeC,SAAkB,MAAI;AAClE,WAAIC,GAAAA,oBAAAA,4BAA2BF,KAAAA,GAAQ;AACrCA,iBAAQG,GAAAA,oBAAAA,qCAAoCH,KAAAA,EAAOI;MACrD;AAEA,UAAIH,QAAQ;AACV,eAAOF,kBAAkBM,KAAKL,KAAAA;MAChC;AAEA,aAAOF,WAAWO,KAAKL,KAAAA;IACzB;;;;;;;;;;;;;;;;;;MC5B0BM,uBAAqB,WAAA;eAArBA,cAAAA;;MAAjBC,iBAAe,WAAA;eAAfA,cAAAA;;MACAC,gBAAc,WAAA;eAAdA,WAAAA;;;;;;;;;ACDT;AAAA;AAAA;AAAA,KAAC,MAAI;AAAC;AAAa,UAAG,OAAO,wBAAsB,YAAY,qBAAoB,KAAG,YAAU;AAAI,UAAI,IAAE,CAAC;AAAE,OAAC,MAAI;AAAC,YAAI,IAAE;AAAE,eAAO,eAAe,GAAE,cAAa,EAAC,OAAM,KAAI,CAAC;AAAE,UAAE,eAAa,EAAE,iBAAe,EAAE,mBAAiB,EAAE,QAAM,EAAE,mBAAiB,EAAE,UAAQ,EAAE,QAAM;AAAO,iBAAS,MAAMC,IAAE;AAAC,cAAIC,KAAE,CAAC;AAAE,cAAI,IAAE;AAAE,iBAAM,IAAED,GAAE,QAAO;AAAC,gBAAI,IAAEA,GAAE,CAAC;AAAE,gBAAG,MAAI,OAAK,MAAI,OAAK,MAAI,KAAI;AAAC,cAAAC,GAAE,KAAK,EAAC,MAAK,YAAW,OAAM,GAAE,OAAMD,GAAE,GAAG,EAAC,CAAC;AAAE;AAAA,YAAQ;AAAC,gBAAG,MAAI,MAAK;AAAC,cAAAC,GAAE,KAAK,EAAC,MAAK,gBAAe,OAAM,KAAI,OAAMD,GAAE,GAAG,EAAC,CAAC;AAAE;AAAA,YAAQ;AAAC,gBAAG,MAAI,KAAI;AAAC,cAAAC,GAAE,KAAK,EAAC,MAAK,QAAO,OAAM,GAAE,OAAMD,GAAE,GAAG,EAAC,CAAC;AAAE;AAAA,YAAQ;AAAC,gBAAG,MAAI,KAAI;AAAC,cAAAC,GAAE,KAAK,EAAC,MAAK,SAAQ,OAAM,GAAE,OAAMD,GAAE,GAAG,EAAC,CAAC;AAAE;AAAA,YAAQ;AAAC,gBAAG,MAAI,KAAI;AAAC,kBAAI,IAAE;AAAG,kBAAI,IAAE,IAAE;AAAE,qBAAM,IAAEA,GAAE,QAAO;AAAC,oBAAI,IAAEA,GAAE,WAAW,CAAC;AAAE,oBAAG,KAAG,MAAI,KAAG,MAAI,KAAG,MAAI,KAAG,MAAI,KAAG,MAAI,KAAG,OAAK,MAAI,IAAG;AAAC,uBAAGA,GAAE,GAAG;AAAE;AAAA,gBAAQ;AAAC;AAAA,cAAK;AAAC,kBAAG,CAAC,EAAE,OAAM,IAAI,UAAU,6BAA6B,OAAO,CAAC,CAAC;AAAE,cAAAC,GAAE,KAAK,EAAC,MAAK,QAAO,OAAM,GAAE,OAAM,EAAC,CAAC;AAAE,kBAAE;AAAE;AAAA,YAAQ;AAAC,gBAAG,MAAI,KAAI;AAAC,kBAAI,IAAE;AAAE,kBAAI,IAAE;AAAG,kBAAI,IAAE,IAAE;AAAE,kBAAGD,GAAE,CAAC,MAAI,KAAI;AAAC,sBAAM,IAAI,UAAU,oCAAoC,OAAO,CAAC,CAAC;AAAA,cAAC;AAAC,qBAAM,IAAEA,GAAE,QAAO;AAAC,oBAAGA,GAAE,CAAC,MAAI,MAAK;AAAC,uBAAGA,GAAE,GAAG,IAAEA,GAAE,GAAG;AAAE;AAAA,gBAAQ;AAAC,oBAAGA,GAAE,CAAC,MAAI,KAAI;AAAC;AAAI,sBAAG,MAAI,GAAE;AAAC;AAAI;AAAA,kBAAK;AAAA,gBAAC,WAASA,GAAE,CAAC,MAAI,KAAI;AAAC;AAAI,sBAAGA,GAAE,IAAE,CAAC,MAAI,KAAI;AAAC,0BAAM,IAAI,UAAU,uCAAuC,OAAO,CAAC,CAAC;AAAA,kBAAC;AAAA,gBAAC;AAAC,qBAAGA,GAAE,GAAG;AAAA,cAAC;AAAC,kBAAG,EAAE,OAAM,IAAI,UAAU,yBAAyB,OAAO,CAAC,CAAC;AAAE,kBAAG,CAAC,EAAE,OAAM,IAAI,UAAU,sBAAsB,OAAO,CAAC,CAAC;AAAE,cAAAC,GAAE,KAAK,EAAC,MAAK,WAAU,OAAM,GAAE,OAAM,EAAC,CAAC;AAAE,kBAAE;AAAE;AAAA,YAAQ;AAAC,YAAAA,GAAE,KAAK,EAAC,MAAK,QAAO,OAAM,GAAE,OAAMD,GAAE,GAAG,EAAC,CAAC;AAAA,UAAC;AAAC,UAAAC,GAAE,KAAK,EAAC,MAAK,OAAM,OAAM,GAAE,OAAM,GAAE,CAAC;AAAE,iBAAOA;AAAA,QAAC;AAAC,iBAAS,MAAMD,IAAEC,IAAE;AAAC,cAAGA,OAAI,QAAO;AAAC,YAAAA,KAAE,CAAC;AAAA,UAAC;AAAC,cAAI,IAAE,MAAMD,EAAC;AAAE,cAAI,IAAEC,GAAE,UAAS,IAAE,MAAI,SAAO,OAAK,GAAE,IAAEA,GAAE,WAAU,IAAE,MAAI,SAAO,QAAM;AAAE,cAAI,IAAE,CAAC;AAAE,cAAI,IAAE;AAAE,cAAI,IAAE;AAAE,cAAI,IAAE;AAAG,cAAI,aAAW,SAASD,IAAE;AAAC,gBAAG,IAAE,EAAE,UAAQ,EAAE,CAAC,EAAE,SAAOA,GAAE,QAAO,EAAE,GAAG,EAAE;AAAA,UAAK;AAAE,cAAI,cAAY,SAASA,IAAE;AAAC,gBAAIC,KAAE,WAAWD,EAAC;AAAE,gBAAGC,OAAI,OAAU,QAAOA;AAAE,gBAAIC,KAAE,EAAE,CAAC,GAAEC,KAAED,GAAE,MAAKE,KAAEF,GAAE;AAAM,kBAAM,IAAI,UAAU,cAAc,OAAOC,IAAE,MAAM,EAAE,OAAOC,IAAE,aAAa,EAAE,OAAOJ,EAAC,CAAC;AAAA,UAAC;AAAE,cAAI,cAAY,WAAU;AAAC,gBAAIA,KAAE;AAAG,gBAAIC;AAAE,mBAAMA,KAAE,WAAW,MAAM,KAAG,WAAW,cAAc,GAAE;AAAC,cAAAD,MAAGC;AAAA,YAAC;AAAC,mBAAOD;AAAA,UAAC;AAAE,cAAI,SAAO,SAASA,IAAE;AAAC,qBAAQC,KAAE,GAAEI,KAAE,GAAEJ,KAAEI,GAAE,QAAOJ,MAAI;AAAC,kBAAIC,KAAEG,GAAEJ,EAAC;AAAE,kBAAGD,GAAE,QAAQE,EAAC,IAAE,GAAG,QAAO;AAAA,YAAI;AAAC,mBAAO;AAAA,UAAK;AAAE,cAAI,cAAY,SAASF,IAAE;AAAC,gBAAIC,KAAE,EAAE,EAAE,SAAO,CAAC;AAAE,gBAAII,KAAEL,OAAIC,MAAG,OAAOA,OAAI,WAASA,KAAE;AAAI,gBAAGA,MAAG,CAACI,IAAE;AAAC,oBAAM,IAAI,UAAU,8DAA8D,OAAOJ,GAAE,MAAK,GAAG,CAAC;AAAA,YAAC;AAAC,gBAAG,CAACI,MAAG,OAAOA,EAAC,EAAE,QAAM,KAAK,OAAO,aAAa,CAAC,GAAE,KAAK;AAAE,mBAAM,SAAS,OAAO,aAAaA,EAAC,GAAE,KAAK,EAAE,OAAO,aAAa,CAAC,GAAE,MAAM;AAAA,UAAC;AAAE,iBAAM,IAAE,EAAE,QAAO;AAAC,gBAAI,IAAE,WAAW,MAAM;AAAE,gBAAI,IAAE,WAAW,MAAM;AAAE,gBAAI,IAAE,WAAW,SAAS;AAAE,gBAAG,KAAG,GAAE;AAAC,kBAAI,IAAE,KAAG;AAAG,kBAAG,EAAE,QAAQ,CAAC,MAAI,IAAG;AAAC,qBAAG;AAAE,oBAAE;AAAA,cAAE;AAAC,kBAAG,GAAE;AAAC,kBAAE,KAAK,CAAC;AAAE,oBAAE;AAAA,cAAE;AAAC,gBAAE,KAAK,EAAC,MAAK,KAAG,KAAI,QAAO,GAAE,QAAO,IAAG,SAAQ,KAAG,YAAY,CAAC,GAAE,UAAS,WAAW,UAAU,KAAG,GAAE,CAAC;AAAE;AAAA,YAAQ;AAAC,gBAAI,IAAE,KAAG,WAAW,cAAc;AAAE,gBAAG,GAAE;AAAC,mBAAG;AAAE;AAAA,YAAQ;AAAC,gBAAG,GAAE;AAAC,gBAAE,KAAK,CAAC;AAAE,kBAAE;AAAA,YAAE;AAAC,gBAAI,IAAE,WAAW,MAAM;AAAE,gBAAG,GAAE;AAAC,kBAAI,IAAE,YAAY;AAAE,kBAAI,IAAE,WAAW,MAAM,KAAG;AAAG,kBAAI,IAAE,WAAW,SAAS,KAAG;AAAG,kBAAI,IAAE,YAAY;AAAE,0BAAY,OAAO;AAAE,gBAAE,KAAK,EAAC,MAAK,MAAI,IAAE,MAAI,KAAI,SAAQ,KAAG,CAAC,IAAE,YAAY,CAAC,IAAE,GAAE,QAAO,GAAE,QAAO,GAAE,UAAS,WAAW,UAAU,KAAG,GAAE,CAAC;AAAE;AAAA,YAAQ;AAAC,wBAAY,KAAK;AAAA,UAAC;AAAC,iBAAO;AAAA,QAAC;AAAC,UAAE,QAAM;AAAM,iBAAS,QAAQL,IAAEC,IAAE;AAAC,iBAAO,iBAAiB,MAAMD,IAAEC,EAAC,GAAEA,EAAC;AAAA,QAAC;AAAC,UAAE,UAAQ;AAAQ,iBAAS,iBAAiBD,IAAEC,IAAE;AAAC,cAAGA,OAAI,QAAO;AAAC,YAAAA,KAAE,CAAC;AAAA,UAAC;AAAC,cAAI,IAAE,MAAMA,EAAC;AAAE,cAAI,IAAEA,GAAE,QAAO,IAAE,MAAI,SAAO,SAASD,IAAE;AAAC,mBAAOA;AAAA,UAAC,IAAE,GAAE,IAAEC,GAAE,UAAS,IAAE,MAAI,SAAO,OAAK;AAAE,cAAI,IAAED,GAAE,KAAK,SAASA,IAAE;AAAC,gBAAG,OAAOA,OAAI,UAAS;AAAC,qBAAO,IAAI,OAAO,OAAO,OAAOA,GAAE,SAAQ,IAAI,GAAE,CAAC;AAAA,YAAC;AAAA,UAAC,EAAE;AAAE,iBAAO,SAASC,IAAE;AAAC,gBAAII,KAAE;AAAG,qBAAQH,KAAE,GAAEA,KAAEF,GAAE,QAAOE,MAAI;AAAC,kBAAIE,KAAEJ,GAAEE,EAAC;AAAE,kBAAG,OAAOE,OAAI,UAAS;AAAC,gBAAAC,MAAGD;AAAE;AAAA,cAAQ;AAAC,kBAAI,IAAEH,KAAEA,GAAEG,GAAE,IAAI,IAAE;AAAU,kBAAI,IAAEA,GAAE,aAAW,OAAKA,GAAE,aAAW;AAAI,kBAAI,IAAEA,GAAE,aAAW,OAAKA,GAAE,aAAW;AAAI,kBAAG,MAAM,QAAQ,CAAC,GAAE;AAAC,oBAAG,CAAC,GAAE;AAAC,wBAAM,IAAI,UAAU,aAAa,OAAOA,GAAE,MAAK,mCAAmC,CAAC;AAAA,gBAAC;AAAC,oBAAG,EAAE,WAAS,GAAE;AAAC,sBAAG,EAAE;AAAS,wBAAM,IAAI,UAAU,aAAa,OAAOA,GAAE,MAAK,mBAAmB,CAAC;AAAA,gBAAC;AAAC,yBAAQ,IAAE,GAAE,IAAE,EAAE,QAAO,KAAI;AAAC,sBAAI,IAAE,EAAE,EAAE,CAAC,GAAEA,EAAC;AAAE,sBAAG,KAAG,CAAC,EAAEF,EAAC,EAAE,KAAK,CAAC,GAAE;AAAC,0BAAM,IAAI,UAAU,iBAAiB,OAAOE,GAAE,MAAK,cAAc,EAAE,OAAOA,GAAE,SAAQ,cAAc,EAAE,OAAO,GAAE,GAAG,CAAC;AAAA,kBAAC;AAAC,kBAAAC,MAAGD,GAAE,SAAO,IAAEA,GAAE;AAAA,gBAAM;AAAC;AAAA,cAAQ;AAAC,kBAAG,OAAO,MAAI,YAAU,OAAO,MAAI,UAAS;AAAC,oBAAI,IAAE,EAAE,OAAO,CAAC,GAAEA,EAAC;AAAE,oBAAG,KAAG,CAAC,EAAEF,EAAC,EAAE,KAAK,CAAC,GAAE;AAAC,wBAAM,IAAI,UAAU,aAAa,OAAOE,GAAE,MAAK,cAAc,EAAE,OAAOA,GAAE,SAAQ,cAAc,EAAE,OAAO,GAAE,GAAG,CAAC;AAAA,gBAAC;AAAC,gBAAAC,MAAGD,GAAE,SAAO,IAAEA,GAAE;AAAO;AAAA,cAAQ;AAAC,kBAAG,EAAE;AAAS,kBAAI,IAAE,IAAE,aAAW;AAAW,oBAAM,IAAI,UAAU,aAAa,OAAOA,GAAE,MAAK,UAAU,EAAE,OAAO,CAAC,CAAC;AAAA,YAAC;AAAC,mBAAOC;AAAA,UAAC;AAAA,QAAC;AAAC,UAAE,mBAAiB;AAAiB,iBAAS,MAAML,IAAEC,IAAE;AAAC,cAAI,IAAE,CAAC;AAAE,cAAI,IAAE,aAAaD,IAAE,GAAEC,EAAC;AAAE,iBAAO,iBAAiB,GAAE,GAAEA,EAAC;AAAA,QAAC;AAAC,UAAE,QAAM;AAAM,iBAAS,iBAAiBD,IAAEC,IAAE,GAAE;AAAC,cAAG,MAAI,QAAO;AAAC,gBAAE,CAAC;AAAA,UAAC;AAAC,cAAI,IAAE,EAAE,QAAO,IAAE,MAAI,SAAO,SAASD,IAAE;AAAC,mBAAOA;AAAA,UAAC,IAAE;AAAE,iBAAO,SAASK,IAAE;AAAC,gBAAIH,KAAEF,GAAE,KAAKK,EAAC;AAAE,gBAAG,CAACH,GAAE,QAAO;AAAM,gBAAI,IAAEA,GAAE,CAAC,GAAE,IAAEA,GAAE;AAAM,gBAAI,IAAE,uBAAO,OAAO,IAAI;AAAE,gBAAI,UAAQ,SAASF,IAAE;AAAC,kBAAGE,GAAEF,EAAC,MAAI,OAAU,QAAM;AAAW,kBAAIK,KAAEJ,GAAED,KAAE,CAAC;AAAE,kBAAGK,GAAE,aAAW,OAAKA,GAAE,aAAW,KAAI;AAAC,kBAAEA,GAAE,IAAI,IAAEH,GAAEF,EAAC,EAAE,MAAMK,GAAE,SAAOA,GAAE,MAAM,EAAE,KAAK,SAASL,IAAE;AAAC,yBAAO,EAAEA,IAAEK,EAAC;AAAA,gBAAC,EAAE;AAAA,cAAC,OAAK;AAAC,kBAAEA,GAAE,IAAI,IAAE,EAAEH,GAAEF,EAAC,GAAEK,EAAC;AAAA,cAAC;AAAA,YAAC;AAAE,qBAAQ,IAAE,GAAE,IAAEH,GAAE,QAAO,KAAI;AAAC,sBAAQ,CAAC;AAAA,YAAC;AAAC,mBAAM,EAAC,MAAK,GAAE,OAAM,GAAE,QAAO,EAAC;AAAA,UAAC;AAAA,QAAC;AAAC,UAAE,mBAAiB;AAAiB,iBAAS,aAAaF,IAAE;AAAC,iBAAOA,GAAE,QAAQ,6BAA4B,MAAM;AAAA,QAAC;AAAC,iBAAS,MAAMA,IAAE;AAAC,iBAAOA,MAAGA,GAAE,YAAU,KAAG;AAAA,QAAG;AAAC,iBAAS,eAAeA,IAAEC,IAAE;AAAC,cAAG,CAACA,GAAE,QAAOD;AAAE,cAAI,IAAE;AAA0B,cAAI,IAAE;AAAE,cAAI,IAAE,EAAE,KAAKA,GAAE,MAAM;AAAE,iBAAM,GAAE;AAAC,YAAAC,GAAE,KAAK,EAAC,MAAK,EAAE,CAAC,KAAG,KAAI,QAAO,IAAG,QAAO,IAAG,UAAS,IAAG,SAAQ,GAAE,CAAC;AAAE,gBAAE,EAAE,KAAKD,GAAE,MAAM;AAAA,UAAC;AAAC,iBAAOA;AAAA,QAAC;AAAC,iBAAS,cAAcA,IAAEC,IAAE,GAAE;AAAC,cAAI,IAAED,GAAE,KAAK,SAASA,IAAE;AAAC,mBAAO,aAAaA,IAAEC,IAAE,CAAC,EAAE;AAAA,UAAM,EAAE;AAAE,iBAAO,IAAI,OAAO,MAAM,OAAO,EAAE,KAAK,GAAG,GAAE,GAAG,GAAE,MAAM,CAAC,CAAC;AAAA,QAAC;AAAC,iBAAS,eAAeD,IAAEC,IAAE,GAAE;AAAC,iBAAO,eAAe,MAAMD,IAAE,CAAC,GAAEC,IAAE,CAAC;AAAA,QAAC;AAAC,iBAAS,eAAeD,IAAEC,IAAE,GAAE;AAAC,cAAG,MAAI,QAAO;AAAC,gBAAE,CAAC;AAAA,UAAC;AAAC,cAAI,IAAE,EAAE,QAAO,IAAE,MAAI,SAAO,QAAM,GAAE,IAAE,EAAE,OAAM,IAAE,MAAI,SAAO,OAAK,GAAE,IAAE,EAAE,KAAI,IAAE,MAAI,SAAO,OAAK,GAAE,IAAE,EAAE,QAAO,IAAE,MAAI,SAAO,SAASD,IAAE;AAAC,mBAAOA;AAAA,UAAC,IAAE,GAAE,IAAE,EAAE,WAAU,IAAE,MAAI,SAAO,QAAM,GAAE,IAAE,EAAE,UAAS,IAAE,MAAI,SAAO,KAAG;AAAE,cAAI,IAAE,IAAI,OAAO,aAAa,CAAC,GAAE,KAAK;AAAE,cAAI,IAAE,IAAI,OAAO,aAAa,CAAC,GAAE,GAAG;AAAE,cAAI,IAAE,IAAE,MAAI;AAAG,mBAAQ,IAAE,GAAE,IAAEA,IAAE,IAAE,EAAE,QAAO,KAAI;AAAC,gBAAI,IAAE,EAAE,CAAC;AAAE,gBAAG,OAAO,MAAI,UAAS;AAAC,mBAAG,aAAa,EAAE,CAAC,CAAC;AAAA,YAAC,OAAK;AAAC,kBAAI,IAAE,aAAa,EAAE,EAAE,MAAM,CAAC;AAAE,kBAAI,IAAE,aAAa,EAAE,EAAE,MAAM,CAAC;AAAE,kBAAG,EAAE,SAAQ;AAAC,oBAAGC,GAAE,CAAAA,GAAE,KAAK,CAAC;AAAE,oBAAG,KAAG,GAAE;AAAC,sBAAG,EAAE,aAAW,OAAK,EAAE,aAAW,KAAI;AAAC,wBAAI,IAAE,EAAE,aAAW,MAAI,MAAI;AAAG,yBAAG,MAAM,OAAO,GAAE,MAAM,EAAE,OAAO,EAAE,SAAQ,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,KAAK,EAAE,OAAO,EAAE,SAAQ,MAAM,EAAE,OAAO,GAAE,GAAG,EAAE,OAAO,CAAC;AAAA,kBAAC,OAAK;AAAC,yBAAG,MAAM,OAAO,GAAE,GAAG,EAAE,OAAO,EAAE,SAAQ,GAAG,EAAE,OAAO,GAAE,GAAG,EAAE,OAAO,EAAE,QAAQ;AAAA,kBAAC;AAAA,gBAAC,OAAK;AAAC,sBAAG,EAAE,aAAW,OAAK,EAAE,aAAW,KAAI;AAAC,0BAAM,IAAI,UAAU,mBAAmB,OAAO,EAAE,MAAK,+BAA+B,CAAC;AAAA,kBAAC;AAAC,uBAAG,IAAI,OAAO,EAAE,SAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ;AAAA,gBAAC;AAAA,cAAC,OAAK;AAAC,qBAAG,MAAM,OAAO,CAAC,EAAE,OAAO,GAAE,GAAG,EAAE,OAAO,EAAE,QAAQ;AAAA,cAAC;AAAA,YAAC;AAAA,UAAC;AAAC,cAAG,GAAE;AAAC,gBAAG,CAAC,EAAE,MAAG,GAAG,OAAO,GAAE,GAAG;AAAE,iBAAG,CAAC,EAAE,WAAS,MAAI,MAAM,OAAO,GAAE,GAAG;AAAA,UAAC,OAAK;AAAC,gBAAI,IAAED,GAAEA,GAAE,SAAO,CAAC;AAAE,gBAAI,IAAE,OAAO,MAAI,WAAS,EAAE,QAAQ,EAAE,EAAE,SAAO,CAAC,CAAC,IAAE,KAAG,MAAI;AAAU,gBAAG,CAAC,GAAE;AAAC,mBAAG,MAAM,OAAO,GAAE,KAAK,EAAE,OAAO,GAAE,KAAK;AAAA,YAAC;AAAC,gBAAG,CAAC,GAAE;AAAC,mBAAG,MAAM,OAAO,GAAE,GAAG,EAAE,OAAO,GAAE,GAAG;AAAA,YAAC;AAAA,UAAC;AAAC,iBAAO,IAAI,OAAO,GAAE,MAAM,CAAC,CAAC;AAAA,QAAC;AAAC,UAAE,iBAAe;AAAe,iBAAS,aAAaA,IAAEC,IAAE,GAAE;AAAC,cAAGD,cAAa,OAAO,QAAO,eAAeA,IAAEC,EAAC;AAAE,cAAG,MAAM,QAAQD,EAAC,EAAE,QAAO,cAAcA,IAAEC,IAAE,CAAC;AAAE,iBAAO,eAAeD,IAAEC,IAAE,CAAC;AAAA,QAAC;AAAC,UAAE,eAAa;AAAA,MAAY,GAAG;AAAE,aAAO,UAAQ;AAAA,IAAC,GAAG;AAAA;AAAA;;;;;;;;;;;;;;;;MCgB/nOK,iBAAe,WAAA;eAAfA;;MAKGC,4BAA0B,WAAA;eAA1BA;;MAuBAC,6BAA2B,WAAA;eAA3BA;;MAuBAC,0BAAwB,WAAA;eAAxBA;;MA2CAC,2BAAyB,WAAA;eAAzBA;;MAWAC,0BAAwB,WAAA;eAAxBA;;;AAzGT,QAAML,kBAAkB;AAKxB,aAASC,2BAA2BK,OAAa;AACtD,UAAI,OAAOA,UAAU,SAAU,QAAO;AAKtC,UAAI,wBAAwBC,KAAKD,KAAAA,GAAQ;AACvC,eAAO;MACT;AAIA,UAAI,iDAAiDC,KAAKD,KAAAA,GAAQ;AAChE,eAAO;MACT;AAEA,aAAO;IACT;AAMO,aAASJ,4BAA4BI,OAAa;AACvD,UAAIE,aAAaF;AAGjBE,mBAAaA,WAAWC,QACtB,0BACA,KAAKT,eAAAA,KAAoB;AAI3BQ,mBAAaA,WAAWC,QAAQ,sBAAsB,MAAMT,eAAAA,EAAiB;AAE7E,aAAOQ;IACT;AAUO,aAASL,yBAAyBO,QAAe;AACtD,aAAOA,OAAOC,IAAI,CAACC,UAAAA;AAGjB,YACE,OAAOA,UAAU,YACjBA,UAAU;QAEV,cAAcA;;SAGbA,MAAMC,aAAa,OAAOD,MAAMC,aAAa;QAE9C,YAAYD,SACZ,YAAYA;;QAGZA,MAAME,WAAW,MACjBF,MAAMG,WAAW,IACjB;AAIA,iBAAO;YACL,GAAGH;YACHE,QAAQ;UACV;QACF;AACA,eAAOF;MACT,CAAA;IACF;AAaO,aAASR,0BAA0BY,UAAgB;AAIxD,aAAOA,SAASP,QAAQ,IAAIQ,OAAO,MAAMjB,eAAAA,IAAmB,GAAA,GAAM,GAAA;IACpE;AAMO,aAASK,yBACda,QAA2B;AAE3B,YAAMC,UAA+B,CAAC;AAEtC,iBAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQL,MAAAA,GAAS;AACjD,YAAI,OAAOG,UAAU,UAAU;AAE7BF,kBAAQC,GAAAA,IAAOC,MAAMZ,QAAQ,IAAIQ,OAAO,IAAIjB,eAAAA,EAAiB,GAAG,EAAA;QAClE,WAAWwB,MAAMC,QAAQJ,KAAAA,GAAQ;AAE/BF,kBAAQC,GAAAA,IAAOC,MAAMV,IAAI,CAACe,SACxB,OAAOA,SAAS,WACZA,KAAKjB,QAAQ,IAAIQ,OAAO,IAAIjB,eAAAA,EAAiB,GAAG,EAAA,IAChD0B,IAAAA;QAER,OAAO;AACLP,kBAAQC,GAAAA,IAAOC;QACjB;MACF;AAEA,aAAOF;IACT;;;;;AC/IA;;;;;;;;;;;;;MAiEgBQ,aAAW,WAAA;eAAXA;;MAtCAC,kBAAgB,WAAA;eAAhBA;;MAoFAC,sBAAoB,WAAA;eAApBA;;MAqBAC,kBAAgB,WAAA;eAAhBA;;;;;AAzGT,aAASF,iBACdG,OACAC,MACAC,SAA8C;AAE9C,UAAI,OAAOF,UAAU,UAAU;AAC7B,gBAAOG,GAAAA,cAAAA,cAAaH,OAAOC,MAAMC,OAAAA;MACnC;AAGA,YAAME,sBAAqBC,GAAAA,wBAAAA,4BAA2BL,KAAAA;AACtD,YAAMM,aAAaF,sBACfG,GAAAA,wBAAAA,6BAA4BP,KAAAA,IAC5BA;AAEJ,UAAI;AACF,gBAAOG,GAAAA,cAAAA,cAAaG,YAAYL,MAAMC,OAAAA;MACxC,SAASM,OAAO;AAEd,YAAI,CAACJ,oBAAoB;AACvB,cAAI;AACF,kBAAMK,mBAAkBF,GAAAA,wBAAAA,6BAA4BP,KAAAA;AACpD,oBAAOG,GAAAA,cAAAA,cAAaM,iBAAiBR,MAAMC,OAAAA;UAC7C,SAASQ,YAAY;AAEnB,kBAAMF;UACR;QACF;AACA,cAAMA;MACR;IACF;AAQO,aAASZ,YACdI,OACAE,SAAgD;AAGhD,YAAME,sBAAqBC,GAAAA,wBAAAA,4BAA2BL,KAAAA;AACtD,YAAMM,aAAaF,sBACfG,GAAAA,wBAAAA,6BAA4BP,KAAAA,IAC5BA;AAEJ,UAAI;AACF,cAAMW,YAAWC,GAAAA,cAAAA,SAAQN,YAAYJ,OAAAA;AAKrC,YAAIE,oBAAoB;AACtB,iBAAO,CAACS,WAAAA;AACN,oBAAOC,GAAAA,wBAAAA,2BAA0BH,SAASE,MAAAA,CAAAA;UAC5C;QACF;AAEA,eAAOF;MACT,SAASH,OAAO;AAEd,YAAI,CAACJ,oBAAoB;AACvB,cAAI;AACF,kBAAMK,mBAAkBF,GAAAA,wBAAAA,6BAA4BP,KAAAA;AACpD,kBAAMW,YAAWC,GAAAA,cAAAA,SAAQH,iBAAiBP,OAAAA;AAG1C,mBAAO,CAACW,WAAAA;AACN,sBAAOC,GAAAA,wBAAAA,2BAA0BH,SAASE,MAAAA,CAAAA;YAC5C;UACF,SAASH,YAAY;AAEnB,kBAAMF;UACR;QACF;AACA,cAAMA;MACR;IACF;AAKO,aAASV,qBAEdiB,QAAgBd,MAAY;AAC5B,YAAMe,mBAAkBC,GAAAA,cAAAA,kBAAoBF,QAAQd,QAAQ,CAAA,CAAE;AAE9D,aAAO,CAACiB,aAAAA;AACN,cAAMC,SAASH,gBAAgBE,QAAAA;AAC/B,YAAI,CAACC,OAAQ,QAAO;AAGpB,eAAO;UACL,GAAGA;UACHN,SAAQO,GAAAA,wBAAAA,0BAAyBD,OAAON,MAAM;QAChD;MACF;IACF;AAMO,aAASd,iBACdsB,WAA0C;AAE1C,aAAO,CAACH,aAAAA;AACN,cAAMC,SAASE,UAAUH,QAAAA;AACzB,YAAI,CAACC,OAAQ,QAAO;AAGpB,gBAAOC,GAAAA,wBAAAA,0BAAyBD,MAAAA;MAClC;IACF;;;;;;;;;;;mCC9HgBG,mBAAAA;;;eAAAA;;;;;AAAT,aAASA,gBAAgB,EAC9BC,IACAC,OAAM,GACc;AACpB,YAAMC,aAAa,CAACC,aAAAA;AAClB,cAAMC,aAAaJ,GAAGK,KAAKF,QAAAA;AAC3B,YAAI,CAACC,WAAY,QAAO;AAExB,cAAME,SAAS,CAACC,UAAAA;AACd,cAAI;AACF,mBAAOC,mBAAmBD,KAAAA;UAC5B,QAAQ;AACN,kBAAM,OAAA,eAAA,IAAIE,OAAAA,YAAY,wBAAA,GAAhB,qBAAA;qBAAA;0BAAA;4BAAA;YAAwC,CAAA;UAChD;QACF;AAEA,cAAMC,SAAiB,CAAC;AACxB,mBAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQb,MAAAA,GAAS;AACjD,gBAAMc,QAAQX,WAAWQ,MAAMI,GAAG;AAClC,cAAID,UAAUE,QAAW;AACvB,gBAAIL,MAAMM,QAAQ;AAChBR,qBAAOC,GAAAA,IAAOI,MAAMI,MAAM,GAAA,EAAKC,IAAI,CAACC,UAAUf,OAAOe,KAAAA,CAAAA;YACvD,OAAO;AACLX,qBAAOC,GAAAA,IAAOL,OAAOS,KAAAA;YACvB;UACF;QACF;AAEA,eAAOL;MACT;AAGA,cAAOY,GAAAA,iBAAAA,kBAAiBpB,UAAAA;IAC1B;;;;;;;;;;;;;;;;;;MCjCaqB,eAAa,WAAA;eAAbA;;MA+CAC,eAAa,WAAA;eAAbA;;MAvBAC,wBAAsB,WAAA;eAAtBA;;MAqBAC,gBAAc,WAAA;eAAdA;;MAwCAC,qBAAmB,WAAA;eAAnBA;;MAfAC,uBAAqB,WAAA;eAArBA;;MASAC,6BAA2B,WAAA;eAA3BA;;MAPAC,wBAAsB,WAAA;eAAtBA;;MArFAC,0BAAwB,WAAA;eAAxBA;;MA0CAC,gBAAc,WAAA;eAAdA;;MAWAC,+BAA6B,WAAA;eAA7BA;;MApDAC,0BAAwB,WAAA;eAAxBA;;MAIAC,qBAAmB,WAAA;eAAnBA;;MAwCAC,qBAAmB,WAAA;eAAnBA;;MACAC,4BAA0B,WAAA;eAA1BA;;MA9BAC,kBAAgB,WAAA;eAAhBA;;MAiBAC,4BAA0B,WAAA;eAA1BA;;MAZAC,oCAAkC,WAAA;eAAlCA;;MACAC,wCAAsC,WAAA;eAAtCA;;MAYAC,8BAA4B,WAAA;eAA5BA;;MAFAC,gCAA8B,WAAA;eAA9BA;;MAZAC,wBAAsB,WAAA;eAAtBA;;MAUAC,0BAAwB,WAAA;eAAxBA;;MACAC,2BAAyB,WAAA;eAAzBA;;MAjBAC,kBAAgB,WAAA;eAAhBA;;MAXAC,iCAA+B,WAAA;eAA/BA;;MAYAC,kBAAgB,WAAA;eAAhBA;;MAGAC,+BAA6B,WAAA;eAA7BA;;MAhBAC,yBAAuB,WAAA;eAAvBA;;MAuBAC,oBAAkB,WAAA;eAAlBA;;MACAC,iCAA+B,WAAA;eAA/BA;;MAoEAC,uBAAqB,WAAA;eAArBA;;MArCAC,iBAAe,WAAA;eAAfA;;MAnDAC,6BAA2B,WAAA;eAA3BA;;MACAC,4CAA0C,WAAA;eAA1CA;;MA0CAC,gBAAc,WAAA;eAAdA;;MACAC,uBAAqB,WAAA;eAArBA;;MAqBAC,gCAA8B,WAAA;eAA9BA;;MAZAC,gBAAc,WAAA;eAAdA;;MASAC,iCAA+B,WAAA;eAA/BA;;MADAC,6BAA2B,WAAA;eAA3BA;;MAJAC,wBAAsB,WAAA;eAAtBA;;MADAC,2BAAyB,WAAA;eAAzBA;;MAEAC,yBAAuB,WAAA;eAAvBA;;MACAC,kCAAgC,WAAA;eAAhCA;;MAJAC,yBAAuB,WAAA;eAAvBA;;MAnDAC,yBAAuB,WAAA;eAAvBA;;MACAC,oBAAkB,WAAA;eAAlBA;;MACAC,YAAU,WAAA;eAAVA;;MAqEAC,2BAAyB,WAAA;eAAzBA;;MANAC,sCAAoC,WAAA;eAApCA;;MAEAC,2BAAyB,WAAA;eAAzBA;;MAuBAC,gBAAc,WAAA;eAAdA;;MAJAC,2BAAyB,WAAA;eAAzBA;;MAvBAC,gCAA8B,WAAA;eAA9BA;;MAMAC,4CAA0C,WAAA;eAA1CA;;MAhFAC,gCAA8B,WAAA;eAA9BA;;MAyFAC,kCAAgC,WAAA;eAAhCA;;MAmIJC,gBAAc,WAAA;eAAdA;;MAAgBC,0BAAwB,WAAA;eAAxBA;;MAjHZC,8BAA4B,WAAA;eAA5BA;;;AA3GN,QAAMJ,iCAAiC;AACvC,QAAMhD,2BAA2B;AACjC,QAAMG,2BAA2B;AACjC,QAAMiB,0BAA0B;AAChC,QAAMH,kCAAkC;AAExC,QAAMb,sBAAsB;AAC5B,QAAMqB,8BAA8B;AACpC,QAAMC,6CACX;AAEK,QAAMY,0BAA0B;AAChC,QAAMC,qBAAqB;AAC3B,QAAMC,aAAa;AACnB,QAAMhD,gBAAgB;AACtB,QAAMwB,mBAAmB;AACzB,QAAME,mBAAmB;AACzB,QAAMX,mBAAmB;AAEzB,QAAMY,gCAAgC;AAEtC,QAAMN,yBAAyB;AAC/B,QAAMJ,qCAAqC;AAC3C,QAAMC,yCACX;AAEK,QAAMW,qBAAqB;AAC3B,QAAMC,kCAAkC;AAIxC,QAAMR,2BAA2B;AACjC,QAAMC,4BAA4B;AAClC,QAAMH,iCAAiC;AACvC,QAAMJ,6BAA6B;AACnC,QAAMG,+BAA+B;AAGrC,QAAMjB,yBAAyB;AAK/B,QAAMO,iBAAiB;AAGvB,QAAMI,sBAAsB;AAC5B,QAAMC,6BAA6B,YAAYD,mBAAAA;AAG/C,QAAMsB,iBAAiB;AACvB,QAAMC,wBAAwB,YAAYD,cAAAA;AAG1C,QAAMzB,gCAAgC;AAItC,QAAMsB,kBAAkB;AACxB,QAAM7B,iBAAiB;AACvB,QAAMmC,iBAAiB;AACvB,QAAMrC,gBAAgB;AACtB,QAAM4C,0BAA0B;AAChC,QAAMH,4BAA4B;AAClC,QAAMD,yBAAyB;AAC/B,QAAME,0BAA0B;AAChC,QAAMC,mCACX;AACK,QAAMJ,8BAA8B;AACpC,QAAMD,kCACX;AAEK,QAAMF,iCAAiC;AAEvC,QAAMiB,iCAAiC;AAEvC,QAAMJ,uCAAuC;AAE7C,QAAMC,4BAA4B;AAElC,QAAMI,6CAA6C;AAEnD,QAAMN,4BAA4B;AAElC,QAAM5C,wBACX;AACK,QAAME,yBACX;AAEK,QAAMkD,mCACX;AAGK,QAAMnD,8BAA8B;AAEpC,QAAMyB,wBAAwB;AAE9B,QAAMsB,4BAA4B;AAElC,QAAMjD,sBAAsB;MAAC;MAAO;MAAS;MAAc;MAAO;;AAElE,QAAMgD,iBAAgD;MAC3DS,MAAM;MACNC,kBAAkB;MAClBC,QAAQ;IACV;AAEO,QAAMH,+BAA+B;AAM5C,QAAMI,uBAAuB;;;;MAI3BC,QAAQ;;;;;MAKRC,uBAAuB;;;;MAIvBC,qBAAqB;;;;MAIrBC,eAAe;;;;MAIfC,SAAS;;;;MAITC,SAAS;;;;MAITC,YAAY;;;;MAIZC,YAAY;;;;MAIZC,WAAW;;;;MAIXC,iBAAiB;;;;MAIjBC,iBAAiB;;;;MAIjBC,cAAc;;;;MAIdC,cAAc;IAChB;AAKA,QAAMnB,iBAAiB;MACrB,GAAGM;MACHc,OAAO;QACLC,cAAc;UACZf,qBAAqBE;UACrBF,qBAAqBI;;QAEvBY,YAAY;UACVhB,qBAAqBE;UACrBF,qBAAqBI;UACrBJ,qBAAqBQ;UACrBR,qBAAqBO;;QAEvBU,eAAe;;UAEbjB,qBAAqBK;UACrBL,qBAAqBM;;QAEvBY,YAAY;UACVlB,qBAAqBG;UACrBH,qBAAqBU;;QAEvBS,SAAS;UACPnB,qBAAqBE;UACrBF,qBAAqBI;UACrBJ,qBAAqBG;UACrBH,qBAAqBU;UACrBV,qBAAqBC;UACrBD,qBAAqBQ;UACrBR,qBAAqBO;;QAEvBa,UAAU;;UAERpB,qBAAqBE;UACrBF,qBAAqBG;UACrBH,qBAAqBU;UACrBV,qBAAqBI;;MAEzB;IACF;AAEA,QAAMT,2BAA2B;MAC/B0B,cAAc;MACdC,UAAU;MACVC,eAAe;MACfC,mBAAmB;IACrB;;;;;AC5NA;;;;;;mCAIgBC,sBAAAA;;;eAAAA;;;AAHhB,QAAMC,cAAc;AACpB,QAAMC,kBAAkB;AAEjB,aAASF,mBAAmBG,KAAW;AAE5C,UAAIF,YAAYG,KAAKD,GAAAA,GAAM;AACzB,eAAOA,IAAIE,QAAQH,iBAAiB,MAAA;MACtC;AACA,aAAOC;IACT;;;;;;;;;;;mCCVaG,kBAAAA;;;eAAAA;;;AAAN,QAAMA,iBAAN,cAA6BC,MAAAA;MAClCC,YAAYC,SAAiBC,SAAwB;AACnD,cACE,cAAcD,QAAQE,SAAS,GAAA,IAAOF,UAAUA,UAAU,GAAA,8BAC1DC,OAAAA;AAEF,aAAKE,OAAO;MACd;IACF;;;;;;;;;;;mCCLgBC,mBAAAA;;;eAAAA;;;;AAAT,aAASA,gBAAgBC,MAAgB;AAC9C,YAAM,CAACC,SAASC,gBAAgBC,SAASC,cAAAA,IAAkBJ;AAC3D,YAAM,EAAEK,QAAQC,SAAQ,IAAKH;AAC7B,UAAI,EAAEI,KAAI,IAAKJ;AAGfI,aAAON,YAAYO,SAAAA,sBAAsBL,QAAQM,cAAcF;AAE/D,YAAMG,iBAAiBL,SAAS,CAAA,KAAMC,WAAW,CAAA,KAAMC,OAAO,CAAA;AAE9D,aAAO;QACLA;QACAN;QACAE;;QAEAO;QACAR;QACAE;MACF;IACF;;;;;;;;;;;;;;;;;;MCiDgBO,oBAAkB,WAAA;eAAlBA;;MA5DAC,iBAAe,WAAA;eAAfA;;MAyCAC,YAAU,WAAA;eAAVA;;;;AAzCT,aAASD,gBAAgBE,SAAe;AAC7C,YAAMC,qBAAqBC,oBAAAA,2BAA2BC,KAAK,CAACC,WAC1DJ,QAAQK,WAAWD,MAAAA,CAAAA;AAKrB,UAAIH,oBAAoB;AACtBD,kBAAUA,QAAQM,MAAML,mBAAmBM,MAAM;MACnD;AAEA,UAAIP,QAAQK,WAAW,OAAA,KAAYL,QAAQQ,SAAS,IAAA,GAAO;AACzD,eAAO;;;UAGLC,WAAW;UACXC,WAAWV,QAAQM,MAAM,GAAG,EAAC;QAC/B;MACF;AAEA,UAAIN,QAAQK,WAAW,MAAA,KAAWL,QAAQQ,SAAS,GAAA,GAAM;AACvD,eAAO;UACLC,WAAWR,qBACP,wBAAwBA,kBAAAA,KACxB;UACJS,WAAWV,QAAQM,MAAM,GAAG,EAAC;QAC/B;MACF;AAEA,UAAIN,QAAQK,WAAW,GAAA,KAAQL,QAAQQ,SAAS,GAAA,GAAM;AACpD,eAAO;UACLC,WAAWR,qBACP,uBAAuBA,kBAAAA,KACvB;UACJS,WAAWV,QAAQM,MAAM,GAAG,EAAC;QAC/B;MACF;AAEA,aAAO;IACT;AAEO,aAASP,WACdY,MAAuB;AAQvB,aACEA,SAAS,cACTA,SAAS,mCACTA,SAAS,8BACTA,SAAS,+BACTA,SAAS,gCACTA,SAAS;IAEb;AAEO,aAASd,mBAAmBY,WAA4B;AAI7D,UAAIG,SAAS;AACb,UAAIC,WAAW;AAEf,cAAQJ,WAAAA;QACN,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AACHG,mBAAS;AACT;QACF,KAAK;AACHA,mBAAS;AACTC,qBAAW;AACX;QACF,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AACH;QACF;AACEJ;MACJ;AAEA,aAAO;QAAEG;QAAQC;MAAS;IAC5B;;;;;;;;;;;;;;;;;;MCgEgBC,wBAAsB,WAAA;eAAtBA;;MAjCAC,sBAAoB,WAAA;eAApBA;;MAgDAC,eAAa,WAAA;eAAbA;;MAzGAC,sBAAoB,WAAA;eAApBA;;;;;;AAbhB,aAASC,mCAAmCC,SAAe;AACzD,UAAI,CAAC,WAAWC,KAAKD,OAAAA,GAAU;AAC7B,eAAOA;MACT;AAEA,UAAI;AACF,cAAME,iBAAiBC,mBAAmBH,OAAAA;AAC1C,gBAAOI,GAAAA,iBAAAA,iBAAgBF,cAAAA,IAAkBA,iBAAiBF;MAC5D,QAAQ;AACN,eAAOA;MACT;IACF;AAEO,aAASF,qBAAqBE,SAAe;AAClD,UAAIA,YAAY,IAAI;AAClB,eAAO;MACT;AAGA,YAAMK,qBAAqBC,oBAAAA,2BAA2BC,KAAK,CAACC,MAC1DR,QAAQS,WAAWD,CAAAA,CAAAA;AAGrB,YAAME,SAAQN,GAAAA,iBAAAA,iBAAgBJ,OAAAA;AAC9B,UAAIU,OAAO;AACT,eAAO;UACLC,MAAM;UACNC,MAAMZ;UACNU;UACAL;QACF;MACF,WAAWL,QAAQS,WAAW,GAAA,KAAQT,QAAQa,SAAS,GAAA,GAAM;AAC3D,eAAO;UACLF,MAAM;UACNC,MAAMZ;UACNK;QACF;MACF,WAAWL,QAAQS,WAAW,GAAA,GAAM;AAClC,eAAO;UACLE,MAAM;UACNC,MAAMZ;UACNK;QACF;MACF,OAAO;AACL,eAAO;UACLM,MAAM;UACNC,MAAMZ;UACNK;QACF;MACF;IACF;AAoBO,aAAST,qBACdkB,OAAsC;AAEtC,aAAOA,MAAMC;IACf;AA6BO,aAASpB,uBACdmB,OAAe;AAEf,aACEA,MAAMT,uBAAuBW,UAC7BF,MAAMG,sBAAsBD,UAC5BF,MAAMI,qBAAqBF;IAE/B;AAOO,aAASnB,cACdsB,UACAJ,YAAmB;AAEnB,YAAMK,mBAAmBD,SAASE,MAAM,GAAA,EAAKC,OAAOC,OAAAA;AAGpD,YAAMC,WAA8B,CAAA;AAGpC,UAAInB;AACJ,UAAIY;AACJ,UAAIC;AAEJ,iBAAWlB,WAAWoB,kBAAkB;AACtC,cAAMK,oBAAoB1B,mCAAmCC,OAAAA;AAG7D,cAAM0B,aAAa5B,qBAAqB2B,iBAAAA;AACxC,YAAI,CAACC,YAAY;AACf;QACF;AAEA,YACEX,eACCW,WAAWf,SAAS,iBACnBe,WAAWf,SAAS,mBACtB;AACA,gBAAM,OAAA,eAAA,IAAIgB,gBAAAA,eACR,GAAGR,QAAAA,6FAAqG,GADpG,qBAAA;mBAAA;wBAAA;0BAAA;UAEN,CAAA;QACF;AAEAK,iBAASI,KAAKF,UAAAA;AAEd,YAAIA,WAAWrB,oBAAoB;AACjC,gBAAMwB,QAAQV,SAASE,MAAMK,WAAWrB,kBAAkB;AAC1D,cAAIwB,MAAMC,WAAW,GAAG;AACtB,kBAAM,OAAA,eAAA,IAAIC,MAAM,+BAA+BZ,QAAAA,EAAU,GAAnD,qBAAA;qBAAA;0BAAA;4BAAA;YAAmD,CAAA;UAC3D;AAEAF,8BAAoBF,aAChBlB,cAAcgC,MAAM,CAAA,GAAI,IAAA,IACxBhC,cAAcgC,MAAM,CAAA,GAAI,KAAA;AAC5BX,6BAAmBH,aACflB,cAAcgC,MAAM,CAAA,GAAI,IAAA,IACxBhC,cAAcgC,MAAM,CAAA,GAAI,KAAA;AAC5BxB,+BAAqBqB,WAAWrB;QAClC;MACF;AAEA,YAAM2B,kBAAkBR,SAASF,OAC/B,CAACtB,YAAYA,QAAQW,SAAS,SAAA;AAGhC,aAAO;QACLI;QACAI;QACAK;QACAQ;QACA3B;QACAY;QACAC;MACF;IACF;;;;;;;;;;;mCClPgBe,mCAAAA;;;eAAAA;;;AAAT,aAASA,gCACdC,WAA4B;AAE5B,cAAQA,WAAAA;QACN,KAAK;QACL,KAAK;AACH,iBAAO;QACT,KAAK;QACL,KAAK;AACH,iBAAO;QACT,KAAK;QACL,KAAK;AACH,iBAAO;QACT,KAAK;QACL,KAAK;AACH,iBAAO;QACT,KAAK;QACL,KAAK;QACL,KAAK;QACL;AACE,iBAAO;MACX;IACF;;;;;;;;;;;mCC4BgBC,qBAAAA;;;eAAAA;;;;;AAlChB,aAASC,yBACPC,aACAC,QACAC,WAA4B;AAG5B,UAAIF,YAAYG,SAAS,WAAW;AAClC,eAAOF,OAAOD,YAAYI,MAAMC,SAAS;MAC3C;AAIA,YAAMC,sBAAqBC,GAAAA,iCAAAA,iCAAgCL,SAAAA;AAC3D,UAAII,uBAAuBN,YAAYQ,oBAAoB;AACzD,eAAOR,YAAYS,KAAKC,QAAQV,YAAYQ,oBAAoB,EAAA;MAClE;AAGA,aAAOR,YAAYS;IACrB;AAeO,aAASX,kBACdO,WACAH,WACAS,OACAC,OACAX,QAAc;AAEd,cAAQC,WAAAA;QACN,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AAGH,gBAAMW,oBAA8B,CAAA;AAGpC,mBAASC,QAAQH,OAAOG,QAAQF,MAAMG,SAASC,QAAQF,SAAS;AAC9D,kBAAMd,cAAcY,MAAMG,SAASD,KAAAA;AAEnC,gBAAId,YAAYG,SAAS,UAAU;AACjC,kBAAIc,QAAQjB,YAAYS;AAGxB,oBAAMH,sBAAqBC,GAAAA,iCAAAA,iCAAgCL,SAAAA;AAC3D,kBACEI,sBACAQ,UAAUH,SACVL,uBAAuBN,YAAYQ,oBACnC;AAEAS,wBAAQA,MAAMP,QAAQV,YAAYQ,oBAAoB,EAAA;cACxD;AAEAK,gCAAkBK,KAAKD,KAAAA;YACzB,OAAO;AAEL,kBAAI,CAAChB,OAAOkB,eAAenB,YAAYI,MAAMC,SAAS,GAAG;AAGvD,oBAAIL,YAAYI,MAAMF,cAAc,qBAAqB;AACvD;gBACF;AAGA,uBAAOkB;cACT;AAIA,oBAAMC,aAAapB,OAAOD,YAAYI,MAAMC,SAAS;AACrD,kBAAIiB,MAAMC,QAAQF,UAAAA,GAAa;AAC7BR,kCAAkBK,KAAI,GAAIG,UAAAA;cAC5B,OAAO;AACLR,kCAAkBK,KAAKG,UAAAA;cACzB;YACF;UACF;AAEA,cAAIR,kBAAkBG,SAAS,GAAG;AAChC,mBAAOH;UACT,WAAWX,cAAc,qBAAqB;AAC5C,mBAAOkB;UACT,OAAO;AAGL,kBAAM,OAAA,eAAA,IAAII,gBAAAA,eACR,qDAAqDZ,MAAMa,QAAQ,iBAAiBpB,SAAAA,cAAuBH,SAAAA,GAAY,GADnH,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;QACF,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AAEH,cAAIS,QAAQC,MAAMG,SAASC,QAAQ;AACjC,kBAAMhB,cAAcY,MAAMG,SAASJ,KAAAA;AAGnC,gBACEX,YAAYG,SAAS,aACrB,CAACF,OAAOkB,eAAenB,YAAYI,MAAMC,SAAS,GAClD;AAEA,qBAAOe;YACT;AAKA,mBAAOrB,yBAAyBC,aAAaC,QAAQC,SAAAA;UACvD;AAEA,iBAAOkB;QAET;AACElB;MACJ;IACF;;;;;;;;;;;;;;;;;;MCqBawB,mBAAiB,WAAA;eAAjBA;;MAvDGC,iBAAe,WAAA;eAAfA;;MA9EAC,gCAA8B,WAAA;eAA9BA;;MAwKAC,uBAAqB,WAAA;eAArBA;;MArBAC,gBAAc,WAAA;eAAdA;;;;;;;AAxKhB,aAASC,cACPC,oBACAC,YACAC,qBAAqD;AAErD,UAAIC,QAAQH,mBAAmBC,UAAAA;AAE/B,UAAIC,qBAAqBE,IAAIH,UAAAA,GAAa;AAGxC,cAAM,CAACI,WAAAA,IAAeH,oBAAoBI,IAAIL,UAAAA;AAC9CE,gBAAQE;MACV,WAAWE,MAAMC,QAAQL,KAAAA,GAAQ;AAC/BA,gBAAQA,MAAMM,IAAI,CAACC,MAAMC,mBAAmBD,CAAAA,CAAAA;MAC9C,WAAW,OAAOP,UAAU,UAAU;AACpCA,gBAAQQ,mBAAmBR,KAAAA;MAC7B;AAEA,aAAOA;IACT;AAEO,aAASP,+BACdgB,YACAC,QACAC,UACAZ,qBAAqD;AAErD,YAAMa,eAAeC,gBAAgBH,MAAAA;AAGrC,YAAMI,QAAoD;QACxD;UAAEC,MAAMN;UAAYO,OAAO;QAAE;;AAI/B,YAAMC,SAAQC,GAAAA,KAAAA,eAAcP,UAAU,IAAA;AAEtC,aAAOG,MAAMK,SAAS,GAAG;AACvB,cAAM,EAAEJ,MAAMC,MAAK,IAAKF,MAAMM,IAAG;AACjC,cAAM,EAAEC,SAASC,eAAc,KAAKC,GAAAA,iBAAAA,iBAAgBR,IAAAA;AAEpD,cAAMS,cAAaC,GAAAA,KAAAA,sBAAqBJ,OAAAA;AAExC,YACEG,YAAYE,SAAS,aACrB,CAACd,aAAae,eAAeH,WAAWI,MAAMC,SAAS;;QAGvD,CAAC9B,qBAAqBE,IAAIuB,WAAWI,MAAMC,SAAS,GACpD;AACA,gBAAM,EAAEA,WAAWC,UAAS,IAAKN,WAAWI;AAE5C,gBAAMG,cAAaC,GAAAA,mBAAAA,mBACjBH,WACAC,WACAd,OACAC,OACAL,YAAAA;AAGF,cAAImB,eAAeE,QAAW;AAC5BrB,yBAAaiB,SAAAA,IAAaE;UAC5B,WAAWD,cAAc,qBAAqB;AAC5C,kBAAM,OAAA,eAAA,IAAII,gBAAAA,eACR,8CAA8CL,SAAAA,EAAW,GADrD,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;QACF;AAGA,YAAIM,YAAYnB;AAChB,YACEQ,cACAA,WAAWE,SAAS,iBACpBF,WAAWE,SAAS,kBACpB;AACAS;QACF;AAGA,mBAAWC,iBAAiBC,OAAOC,OAAOhB,cAAAA,GAAiB;AACzDR,gBAAMyB,KAAK;YAAExB,MAAMqB;YAAepB,OAAOmB;UAAU,CAAA;QACrD;MACF;AAEA,aAAOvB;IACT;AAaO,aAASpB,gBACdK,oBACAC,YACA0C,kBACAzC,qBACA0C,gBAAwC;AAExC,UAAIzC,QAAuCJ,cACzCC,oBACAC,YACAC,mBAAAA;AAKF,UAAI,CAACC,SAASA,MAAMmB,WAAW,GAAG;AAChC,YAAIqB,qBAAqB,MAAM;AAC7B,iBAAO;YACLZ,OAAO9B;YACPE,OAAO;YACP0B,MAAMc;YACNE,aAAa;cAAC5C;cAAY;cAAI0C;cAAkBC;;UAClD;QACF;AAEA,cAAM,OAAA,eAAA,IAAIP,gBAAAA,eACR,mCAAmCpC,UAAAA,8BAAwC0C,gBAAAA,EAAkB,GADzF,qBAAA;iBAAA;sBAAA;wBAAA;QAEN,CAAA;MACF;AAEA,YAAMG,gBAAgBvC,MAAMC,QAAQL,KAAAA,IAASA,MAAM4C,KAAK,GAAA,IAAO5C;AAE/D,aAAO;QACL4B,OAAO9B;;QAEPE;;;;;;QAMA0C,aAAa;UAAC5C;UAAY6C;UAAeH;UAAkBC;;QAC3Df,MAAMc;MACR;IACF;AAWO,QAAMjD,oBAAoB;AAc1B,aAASI,eAAeiC,OAAa;AAC1C,YAAMiB,QAAQjB,MAAMiB,MAAMtD,iBAAAA;AAE1B,UAAI,CAACsD,OAAO;AACV,eAAOnD,sBAAsBkC,KAAAA;MAC/B;AAEA,aAAOlC,sBAAsBmD,MAAM,CAAA,CAAE;IACvC;AAaO,aAASnD,sBAAsBkC,OAAa;AACjD,YAAMkB,WAAWlB,MAAMmB,WAAW,GAAA,KAAQnB,MAAMoB,SAAS,GAAA;AACzD,UAAIF,UAAU;AACZlB,gBAAQA,MAAMqB,MAAM,GAAG,EAAC;MAC1B;AACA,YAAMC,SAAStB,MAAMmB,WAAW,KAAA;AAChC,UAAIG,QAAQ;AACVtB,gBAAQA,MAAMqB,MAAM,CAAA;MACtB;AACA,aAAO;QAAEE,KAAKvB;QAAOsB;QAAQJ;MAAS;IACxC;;;;;;;;;;;;;;;;;;MC6LgBM,yBAAuB,WAAA;eAAvBA;;MA/BAC,oBAAkB,WAAA;eAAlBA;;MArOAC,eAAa,WAAA;eAAbA;;;;;;;;AAxDhB,aAASC,qBACPC,OACAC,eACAC,eAAsB;AAEtB,YAAMC,SAAyC,CAAC;AAChD,UAAIC,aAAa;AAEjB,YAAMC,WAAqB,CAAA;AAC3B,iBAAWC,YAAWC,GAAAA,qBAAAA,qBAAoBP,KAAAA,EAAOQ,MAAM,CAAA,EAAGC,MAAM,GAAA,GAAM;AACpE,cAAMC,cAAcC,oBAAAA,2BAA2BC,KAAK,CAACC,MACnDP,QAAQQ,WAAWD,CAAAA,CAAAA;AAErB,cAAME,eAAeT,QAAQU,MAAMC,iBAAAA,iBAAiB;AAEpD,YAAIP,eAAeK,gBAAgBA,aAAa,CAAA,GAAI;AAClD,gBAAM,EAAEG,KAAKC,UAAUC,OAAM,KAAKC,GAAAA,iBAAAA,uBAAsBN,aAAa,CAAA,CAAE;AACvEZ,iBAAOe,GAAAA,IAAO;YAAEI,KAAKlB;YAAcgB;YAAQD;UAAS;AACpDd,mBAASkB,KAAK,KAAIC,GAAAA,cAAAA,oBAAmBd,WAAAA,CAAAA,UAAsB;QAC7D,WAAWK,gBAAgBA,aAAa,CAAA,GAAI;AAC1C,gBAAM,EAAEG,KAAKE,QAAQD,SAAQ,KAAKE,GAAAA,iBAAAA,uBAAsBN,aAAa,CAAA,CAAE;AACvEZ,iBAAOe,GAAAA,IAAO;YAAEI,KAAKlB;YAAcgB;YAAQD;UAAS;AAEpD,cAAIjB,iBAAiBa,aAAa,CAAA,GAAI;AACpCV,qBAASkB,KAAK,KAAIC,GAAAA,cAAAA,oBAAmBT,aAAa,CAAA,CAAE,CAAA,EAAG;UACzD;AAEA,cAAIU,IAAIL,SAAUD,WAAW,gBAAgB,WAAY;AAGzD,cAAIjB,iBAAiBa,aAAa,CAAA,GAAI;AACpCU,gBAAIA,EAAEC,UAAU,CAAA;UAClB;AAEArB,mBAASkB,KAAKE,CAAAA;QAChB,OAAO;AACLpB,mBAASkB,KAAK,KAAIC,GAAAA,cAAAA,oBAAmBlB,OAAAA,CAAAA,EAAU;QACjD;AAGA,YAAIL,iBAAiBc,gBAAgBA,aAAa,CAAA,GAAI;AACpDV,mBAASkB,MAAKC,GAAAA,cAAAA,oBAAmBT,aAAa,CAAA,CAAE,CAAA;QAClD;MACF;AAEA,aAAO;QACLY,oBAAoBtB,SAASuB,KAAK,EAAA;QAClCzB;MACF;IACF;AAOO,aAASL,cACd+B,iBACA,EACE5B,gBAAgB,OAChBC,gBAAgB,OAChB4B,+BAA+B,MAAK,IACZ,CAAC,GAAC;AAE5B,YAAM,EAAEH,oBAAoBxB,OAAM,IAAKJ,qBACrC8B,iBACA5B,eACAC,aAAAA;AAGF,UAAI6B,KAAKJ;AACT,UAAI,CAACG,8BAA8B;AACjCC,cAAM;MACR;AAEA,aAAO;QACLA,IAAI,IAAIC,OAAO,IAAID,EAAAA,GAAK;QACxB5B;MACF;IACF;AAMA,aAAS8B,uBAAAA;AACP,UAAIC,IAAI;AAER,aAAO,MAAA;AACL,YAAIC,WAAW;AACf,YAAIC,IAAI,EAAEF;AACV,eAAOE,IAAI,GAAG;AACZD,sBAAYE,OAAOC,aAAa,MAAOF,IAAI,KAAK,EAAA;AAChDA,cAAIG,KAAKC,OAAOJ,IAAI,KAAK,EAAA;QAC3B;AACA,eAAOD;MACT;IACF;AAEA,aAASM,sBAAsB,EAC7BC,oBACAC,iBACArC,SACAsC,WACAC,WACAC,2BAA0B,GAQ3B;AACC,YAAM,EAAE5B,KAAKC,UAAUC,OAAM,KAAKC,GAAAA,iBAAAA,uBAAsBf,OAAAA;AAIxD,UAAIyC,aAAa7B,IAAI8B,QAAQ,OAAO,EAAA;AAEpC,UAAIH,WAAW;AACbE,qBAAa,GAAGF,SAAAA,GAAYE,UAAAA;MAC9B;AACA,UAAIE,aAAa;AAIjB,UAAIF,WAAWG,WAAW,KAAKH,WAAWG,SAAS,IAAI;AACrDD,qBAAa;MACf;AACA,UAAI,CAACE,MAAMC,SAASL,WAAWvC,MAAM,GAAG,CAAA,CAAA,CAAA,GAAM;AAC5CyC,qBAAa;MACf;AAEA,UAAIA,YAAY;AACdF,qBAAaJ,gBAAAA;MACf;AAEA,YAAMU,eAAeN,cAAcH;AAEnC,UAAIC,WAAW;AACbD,kBAAUG,UAAAA,IAAc,GAAGF,SAAAA,GAAY3B,GAAAA;MACzC,OAAO;AACL0B,kBAAUG,UAAAA,IAAc7B;MAC1B;AAKA,YAAMoC,qBAAqBZ,sBACvBlB,GAAAA,cAAAA,oBAAmBkB,kBAAAA,IACnB;AAEJ,UAAIa;AACJ,UAAIF,gBAAgBP,4BAA4B;AAG9CS,kBAAU,OAAOR,UAAAA;MACnB,WAAW3B,QAAQ;AACjBmC,kBAAU,MAAMR,UAAAA;MAClB,OAAO;AACLQ,kBAAU,MAAMR,UAAAA;MAClB;AAEA,aAAO;QACL7B;QACAqC,SAASpC,WACL,OAAOmC,kBAAAA,GAAqBC,OAAAA,OAC5B,IAAID,kBAAAA,GAAqBC,OAAAA;QAC7BR;QACA5B;QACAC;MACF;IACF;AAEA,aAASoC,0BACPxD,OACAyD,iBACAxD,eACAC,eACA4C,4BACAY,YAA4B;MAAEC,OAAO,CAAC;MAAGC,aAAa,CAAC;IAAE,GAAC;AAE1D,YAAMjB,kBAAkBV,qBAAAA;AACxB,YAAMW,YAAyC,CAAC;AAEhD,YAAMvC,WAAqB,CAAA;AAC3B,YAAMwD,eAAyB,CAAA;AAG/BH,kBAAYI,gBAAgBJ,SAAAA;AAE5B,iBAAWpD,YAAWC,GAAAA,qBAAAA,qBAAoBP,KAAAA,EAAOQ,MAAM,CAAA,EAAGC,MAAM,GAAA,GAAM;AACpE,cAAMsD,wBAAwBpD,oBAAAA,2BAA2BqD,KAAK,CAACnD,MAC7DP,QAAQQ,WAAWD,CAAAA,CAAAA;AAGrB,cAAME,eAAeT,QAAQU,MAAMC,iBAAAA,iBAAiB;AAEpD,cAAMyB,qBAAqBqB,wBACvBhD,eAAe,CAAA,IACfkD;AAEJ,YAAIpB;AACJ,YAAIH,sBAAsB3B,eAAe,CAAA,GAAI;AAC3C8B,sBAAYY,kBAAkBS,WAAAA,kCAAkCD;AAChEP,oBAAUE,YAAY7C,aAAa,CAAA,CAAE,IAAI2B;QAC3C,WAAW3B,eAAe,CAAA,KAAM2C,UAAUE,YAAY7C,aAAa,CAAA,CAAE,GAAG;AACtE8B,sBAAYY,kBAAkBS,WAAAA,kCAAkCD;QAClE,OAAO;AACLpB,sBAAYY,kBAAkBU,WAAAA,0BAA0BF;QAC1D;AAEA,YAAIvB,sBAAsB3B,gBAAgBA,aAAa,CAAA,GAAI;AAEzD,gBAAM,EAAEG,KAAKqC,SAASR,YAAY3B,QAAQD,SAAQ,IAChDsB,sBAAsB;YACpBE;YACAD;YACApC,SAASS,aAAa,CAAA;YACtB6B;YACAC;YACAC;UACF,CAAA;AAEFzC,mBAASkB,KAAKgC,OAAAA;AACdM,uBAAatC,KACX,IAAIR,aAAa,CAAA,CAAE,IAAI2C,UAAUC,MAAMzC,GAAAA,KAAQ6B,UAAAA,GAAa3B,SAAUD,WAAW,MAAM,MAAO,EAAA,EAAI;AAEpGuC,oBAAUC,MAAMzC,GAAAA,MAAS6B;QAC3B,WAAWhC,gBAAgBA,aAAa,CAAA,GAAI;AAE1C,cAAIb,iBAAiBa,aAAa,CAAA,GAAI;AACpCV,qBAASkB,KAAK,KAAIC,GAAAA,cAAAA,oBAAmBT,aAAa,CAAA,CAAE,CAAA,EAAG;AACvD8C,yBAAatC,KAAK,IAAIR,aAAa,CAAA,CAAE,EAAE;UACzC;AAEA,gBAAM,EAAEG,KAAKqC,SAASR,YAAY3B,QAAQD,SAAQ,IAChDsB,sBAAsB;YACpBE;YACArC,SAASS,aAAa,CAAA;YACtB6B;YACAC;YACAC;UACF,CAAA;AAGF,cAAIrB,IAAI8B;AACR,cAAIrD,iBAAiBa,aAAa,CAAA,GAAI;AACpCU,gBAAIA,EAAEC,UAAU,CAAA;UAClB;AAEArB,mBAASkB,KAAKE,CAAAA;AACdoC,uBAAatC,KACX,KAAKmC,UAAUC,MAAMzC,GAAAA,KAAQ6B,UAAAA,GAAa3B,SAAUD,WAAW,MAAM,MAAO,EAAA,EAAI;AAElFuC,oBAAUC,MAAMzC,GAAAA,MAAS6B;QAC3B,OAAO;AACL1C,mBAASkB,KAAK,KAAIC,GAAAA,cAAAA,oBAAmBlB,OAAAA,CAAAA,EAAU;AAC/CuD,uBAAatC,KAAK,IAAIjB,OAAAA,EAAS;QACjC;AAGA,YAAIL,iBAAiBc,gBAAgBA,aAAa,CAAA,GAAI;AACpDV,mBAASkB,MAAKC,GAAAA,cAAAA,oBAAmBT,aAAa,CAAA,CAAE,CAAA;AAChD8C,uBAAatC,KAAKR,aAAa,CAAA,CAAE;QACnC;MACF;AAEA,aAAO;QACLqD,yBAAyB/D,SAASuB,KAAK,EAAA;QACvCgB;QACAyB,qBAAqBR,aAAajC,KAAK,EAAA;QACvC8B;MACF;IACF;AAUO,aAAS7D,mBACdgC,iBACAyC,SAAkC;AAElC,YAAMC,SAASf,0BACb3B,iBACAyC,QAAQb,iBACRa,QAAQrE,iBAAiB,OACzBqE,QAAQpE,iBAAiB,OACzBoE,QAAQxB,8BAA8B,OACtCwB,QAAQZ,SAAS;AAGnB,UAAIc,aAAaD,OAAOH;AACxB,UAAI,CAACE,QAAQxC,8BAA8B;AACzC0C,sBAAc;MAChB;AAEA,aAAO;QACL,GAAG1E,cAAc+B,iBAAiByC,OAAAA;QAClCE,YAAY,IAAIA,UAAAA;QAChB5B,WAAW2B,OAAO3B;QAClByB,qBAAqBE,OAAOF;QAC5BX,WAAWa,OAAOb;MACpB;IACF;AAMO,aAAS9D,wBACdiC,iBACAyC,SAEC;AAED,YAAM,EAAE3C,mBAAkB,IAAK5B,qBAC7B8B,iBACA,OACA,KAAA;AAEF,YAAM,EAAE4C,WAAW,KAAI,IAAKH;AAC5B,UAAI3C,uBAAuB,KAAK;AAC9B,YAAI+C,gBAAgBD,WAAW,OAAO;AACtC,eAAO;UACLD,YAAY,KAAKE,aAAAA;QACnB;MACF;AAEA,YAAM,EAAEN,wBAAuB,IAAKZ,0BAClC3B,iBACA,OACA,OACA,OACA,OACAoC,MAAAA;AAEF,UAAIU,uBAAuBF,WAAW,eAAe;AACrD,aAAO;QACLD,YAAY,IAAIJ,uBAAAA,GAA0BO,oBAAAA;MAC5C;IACF;;;;;;;;;;;mCClbgBC,iBAAAA;;;eAAAA;;;;;AAAT,aAASA,cACdC,OACAC,YACAC,OAAqB;AAErB,UAAIC,oBAAoB;AAExB,YAAMC,gBAAeC,GAAAA,YAAAA,eAAcL,KAAAA;AACnC,YAAMM,gBAAgBF,aAAaG;AACnC,YAAMC;;SAEHP,eAAeD,SAAQS,GAAAA,cAAAA,iBAAgBL,YAAAA,EAAcH,UAAAA,IAAc;;QAGpEC;;AAEFC,0BAAoBH;AACpB,YAAMU,SAASC,OAAOC,KAAKN,aAAAA;AAE3B,UACE,CAACI,OAAOG,MAAM,CAACC,UAAAA;AACb,YAAIC,QAAQP,eAAeM,KAAAA,KAAU;AACrC,cAAM,EAAEE,QAAQC,SAAQ,IAAKX,cAAcQ,KAAAA;AAI3C,YAAII,WAAW,IAAIF,SAAS,QAAQ,EAAA,GAAKF,KAAAA;AACzC,YAAIG,UAAU;AACZC,qBAAW,GAAG,CAACH,QAAQ,MAAM,EAAA,IAAMG,QAAAA;QACrC;AACA,YAAIF,UAAU,CAACG,MAAMC,QAAQL,KAAAA,EAAQA,SAAQ;UAACA;;AAE9C,gBACGE,YAAYH,SAASN;SAErBL,oBACCA,kBAAmBkB,QACjBH,UACAF,SACKD,MACEO;;;;;UAKC,CAACC,YAAYC,mBAAmBD,OAAAA;QAAAA,EAEjCE,KAAK,GAAA,IACRD,mBAAmBT,KAAAA,CAAAA,KACpB;MAEX,CAAA,GACA;AACAZ,4BAAoB;MAItB;AACA,aAAO;QACLO;QACAgB,QAAQvB;MACV;IACF;;;;;;;;;;;mCCxCgBwB,eAAAA;;;eAAAA;;;;;;;;;;;;;AAAT,aAASA,YACdC,QACAC,MACAC,WAAmB;AAGnB,UAAIC;AACJ,UAAIC,cAAc,OAAOH,SAAS,WAAWA,QAAOI,GAAAA,WAAAA,sBAAqBJ,IAAAA;AAKzE,YAAMK,gBAAgBF,YAAYG,MAAM,0BAAA;AACxC,YAAMC,qBAAqBF,gBACvBF,YAAYK,MAAMH,cAAc,CAAA,EAAGI,MAAM,IACzCN;AAEJ,YAAMO,WAAWH,mBAAmBI,MAAM,KAAK,CAAA;AAE/C,WAAKD,SAAS,CAAA,KAAM,IAAIJ,MAAM,WAAA,GAAc;AAC1CM,gBAAQC,MACN,iBAAiBV,WAAAA,qCAAgDJ,OAAOe,QAAQ,+EAA+E;AAEjK,cAAMC,iBAAgBC,GAAAA,OAAAA,0BAAyBT,kBAAAA;AAC/CJ,uBAAeE,gBAAgBA,cAAc,CAAA,IAAK,MAAMU;MAC1D;AAGA,UAAI,EAACE,GAAAA,YAAAA,YAAWd,WAAAA,GAAc;AAC5B,eAAQF,YAAY;UAACE;YAAeA;MACtC;AAEA,UAAI;AACF,YAAIe,WAAWf,YAAYgB,WAAW,GAAA,IAAOpB,OAAOqB,SAASrB,OAAOe;AAIpE,YAAIX,YAAYgB,WAAW,GAAA,GAAM;AAC/BD,qBAAWnB,OAAOqB;AAIlB,eAAIC,GAAAA,QAAAA,gBAAetB,OAAOe,QAAQ,GAAG;AACnCI,uBAAWnB,OAAOe;AAElB,kBAAMQ,cAAaC,GAAAA,YAAAA,eAAcxB,OAAOe,QAAQ;AAChD,kBAAMR,SAAQkB,GAAAA,cAAAA,iBAAgBF,UAAAA,EAAYvB,OAAOqB,MAAM;AAIvD,gBAAI,CAACd,OAAO;AACVY,yBAAWnB,OAAOqB;YACpB;UAUF;QACF;AAEAlB,eAAO,IAAIuB,IAAIP,UAAU,UAAA;MAC3B,SAASQ,GAAG;AAEVxB,eAAO,IAAIuB,IAAI,KAAK,UAAA;MACtB;AAEA,UAAI;AACF,cAAME,WAAW,IAAIF,IAAItB,aAAaD,IAAAA;AACtCyB,iBAASb,YAAWc,GAAAA,wBAAAA,4BAA2BD,SAASb,QAAQ;AAChE,YAAIe,iBAAiB;AAErB,aACER,GAAAA,QAAAA,gBAAeM,SAASb,QAAQ,KAChCa,SAASG,gBACT7B,WACA;AACA,gBAAM8B,SAAQC,GAAAA,aAAAA,wBAAuBL,SAASG,YAAY;AAE1D,gBAAM,EAAEG,QAAQC,OAAM,KAAKC,GAAAA,eAAAA,eACzBR,SAASb,UACTa,SAASb,UACTiB,KAAAA;AAGF,cAAIE,QAAQ;AACVJ,8BAAiBzB,GAAAA,WAAAA,sBAAqB;cACpCU,UAAUmB;cACVG,MAAMT,SAASS;cACfL,QAAOM,GAAAA,MAAAA,MAAKN,OAAOG,MAAAA;YACrB,CAAA;UACF;QACF;AAGA,cAAMI,eACJX,SAASY,WAAWrC,KAAKqC,SACrBZ,SAAS3B,KAAKQ,MAAMmB,SAASY,OAAO9B,MAAM,IAC1CkB,SAAS3B;AAEf,eAAOC,YACH;UAACqC;UAAcT,kBAAkBS;YACjCA;MACN,SAASZ,GAAG;AACV,eAAOzB,YAAY;UAACE;YAAeA;MACrC;IACF;;;;;;;;;;;;;;;;mCCnIgBqC,iBAAAA;;;eAAAA;;;;AAAT,aAASA,cAAcC,MAAcC,QAAe;AACzD,UAAI,CAACD,KAAKE,WAAW,GAAA,KAAQ,CAACD,QAAQ;AACpC,eAAOD;MACT;AAEA,YAAM,EAAEG,UAAUC,OAAOC,KAAI,KAAKC,GAAAA,WAAAA,WAAUN,IAAAA;AAC5C,aAAO,GAAGC,MAAAA,GAASE,QAAAA,GAAWC,KAAAA,GAAQC,IAAAA;IACxC;;;;;;;;;;;mCCLgBE,aAAAA;;;eAAAA;;;;;AAAT,aAASA,UACdC,MACAC,QACAC,eACAC,cAAsB;AAItB,UAAI,CAACF,UAAUA,WAAWC,cAAe,QAAOF;AAEhD,YAAMI,QAAQJ,KAAKK,YAAW;AAI9B,UAAI,CAACF,cAAc;AACjB,aAAIG,GAAAA,eAAAA,eAAcF,OAAO,MAAA,EAAS,QAAOJ;AACzC,aAAIM,GAAAA,eAAAA,eAAcF,OAAO,IAAIH,OAAOI,YAAW,CAAA,EAAI,EAAG,QAAOL;MAC/D;AAGA,cAAOO,GAAAA,eAAAA,eAAcP,MAAM,IAAIC,MAAAA,EAAQ;IACzC;;;;;;;;;;;mCC1BaO,aAAAA;;;eAAAA;;;;AAAN,QAAMA,YAAuB,CAACC,SAASC,SAAAA;AAC5C,UAAIC,QAAQC,IAAIC,qBAAqB;AACnC,gBAAOC,GAAAA,wBAAAA,4BAEHC,qBACAP,UAAUC,MAAAA,GAASC,IAAAA,CAAAA;MAEzB;AACA,aAAOD;IACT;;;;;;;;;;ACZA;AAAA;AAAA;AAEA,aAAS,yBAAyB,KAAK;AACnC,aAAO,OAAO,IAAI,aAAa,MAAM,EAAE,SAAS,IAAI;AAAA,IACxD;AACA,YAAQ,IAAI;AAAA;AAAA;;;;;;;;;mCCFCO,iBAAAA;;;eAAAA;;;;sEAHK,OAAA,CAAA;AAGX,QAAMA,gBAAgBC,OAAAA,QAAMC,cAAiC,IAAA;AAEpE,QAAIC,QAAQC,IAAIC,aAAa,cAAc;AACzCL,oBAAcM,cAAc;IAC9B;;;;;;;;;;;;;;;;;;MCSaC,oBAAkB,WAAA;eAAlBA;;MAhBAC,qBAAmB,WAAA;eAAnBA;;;AAAN,QAAMA,sBACV,OAAOC,SAAS,eACfA,KAAKD,uBACLC,KAAKD,oBAAoBE,KAAKC,MAAAA,KAChC,SAAUC,IAAuB;AAC/B,UAAIC,QAAQC,KAAKC,IAAG;AACpB,aAAON,KAAKO,WAAW,WAAA;AACrBJ,WAAG;UACDK,YAAY;UACZC,eAAe,WAAA;AACb,mBAAOC,KAAKC,IAAI,GAAG,MAAMN,KAAKC,IAAG,IAAKF,MAAI;UAC5C;QACF,CAAA;MACF,GAAG,CAAA;IACL;AAEK,QAAMN,qBACV,OAAOE,SAAS,eACfA,KAAKF,sBACLE,KAAKF,mBAAmBG,KAAKC,MAAAA,KAC/B,SAAUU,IAAU;AAClB,aAAOC,aAAaD,EAAAA;IACtB;;;;;;;;;;;;;;;;mCCyEcE,mBAAAA;;;eAAAA;;;2BA/FyC,OAAA;;AAyBzD,QAAMC,0BAA0B,OAAOC,yBAAyB;AAEhE,QAAMC,YAAY,oBAAIC,IAAAA;AACtB,QAAMC,SAAuB,CAAA;AAE7B,aAASC,eAAeC,SAAoC;AAC1D,YAAMC,KAAK;QACTC,MAAMF,QAAQE,QAAQ;QACtBC,QAAQH,QAAQI,cAAc;MAChC;AACA,YAAMC,WAAWP,OAAOQ,KACtB,CAACC,QAAQA,IAAIL,SAASD,GAAGC,QAAQK,IAAIJ,WAAWF,GAAGE,MAAM;AAE3D,UAAIK;AAEJ,UAAIH,UAAU;AACZG,mBAAWZ,UAAUa,IAAIJ,QAAAA;AACzB,YAAIG,UAAU;AACZ,iBAAOA;QACT;MACF;AAEA,YAAME,WAAW,oBAAIb,IAAAA;AACrB,YAAMc,WAAW,IAAIhB,qBAAqB,CAACiB,YAAAA;AACzCA,gBAAQC,QAAQ,CAACC,UAAAA;AACf,gBAAMC,WAAWL,SAASD,IAAIK,MAAME,MAAM;AAC1C,gBAAMC,YAAYH,MAAMI,kBAAkBJ,MAAMK,oBAAoB;AACpE,cAAIJ,YAAYE,WAAW;AACzBF,qBAASE,SAAAA;UACX;QACF,CAAA;MACF,GAAGjB,OAAAA;AACHQ,iBAAW;QACTP;QACAU;QACAD;MACF;AAEAZ,aAAOsB,KAAKnB,EAAAA;AACZL,gBAAUyB,IAAIpB,IAAIO,QAAAA;AAClB,aAAOA;IACT;AAEA,aAASc,QACPC,SACAR,UACAf,SAAoC;AAEpC,YAAM,EAAEC,IAAIU,UAAUD,SAAQ,IAAKX,eAAeC,OAAAA;AAClDU,eAASW,IAAIE,SAASR,QAAAA;AAEtBJ,eAASW,QAAQC,OAAAA;AACjB,aAAO,SAASC,YAAAA;AACdd,iBAASe,OAAOF,OAAAA;AAChBZ,iBAASa,UAAUD,OAAAA;AAGnB,YAAIb,SAASgB,SAAS,GAAG;AACvBf,mBAASgB,WAAU;AACnB/B,oBAAU6B,OAAOxB,EAAAA;AACjB,gBAAM2B,QAAQ9B,OAAO+B,UACnB,CAACtB,QAAQA,IAAIL,SAASD,GAAGC,QAAQK,IAAIJ,WAAWF,GAAGE,MAAM;AAE3D,cAAIyB,QAAQ,IAAI;AACd9B,mBAAOgC,OAAOF,OAAO,CAAA;UACvB;QACF;MACF;IACF;AAEO,aAASnC,gBAAmC,EACjDsC,SACA3B,YACA4B,SAAQ,GACQ;AAChB,YAAMC,aAAsBD,YAAY,CAACtC;AAEzC,YAAM,CAACwC,SAASC,UAAAA,KAAcC,GAAAA,OAAAA,UAAS,KAAA;AACvC,YAAMC,cAAaC,GAAAA,OAAAA,QAAiB,IAAA;AACpC,YAAMC,cAAaC,GAAAA,OAAAA,aAAY,CAACjB,YAAAA;AAC9Bc,mBAAWI,UAAUlB;MACvB,GAAG,CAAA,CAAE;AAELmB,OAAAA,GAAAA,OAAAA,WAAU,MAAA;AACR,YAAIhD,yBAAyB;AAC3B,cAAIuC,cAAcC,QAAS;AAE3B,gBAAMX,UAAUc,WAAWI;AAC3B,cAAIlB,WAAWA,QAAQoB,SAAS;AAC9B,kBAAMnB,YAAYF,QAChBC,SACA,CAACN,cAAcA,aAAakB,WAAWlB,SAAAA,GACvC;cAAEf,MAAM6B,SAASU;cAASrC;YAAW,CAAA;AAGvC,mBAAOoB;UACT;QACF,OAAO;AACL,cAAI,CAACU,SAAS;AACZ,kBAAMU,gBAAeC,GAAAA,qBAAAA,qBAAoB,MAAMV,WAAW,IAAA,CAAA;AAC1D,mBAAO,OAAMW,GAAAA,qBAAAA,oBAAmBF,YAAAA;UAClC;QACF;MAEF,GAAG;QAACX;QAAY7B;QAAY2B;QAASG;QAASG,WAAWI;OAAQ;AAEjE,YAAMM,gBAAeP,GAAAA,OAAAA,aAAY,MAAA;AAC/BL,mBAAW,KAAA;MACb,GAAG,CAAA,CAAE;AAEL,aAAO;QAACI;QAAYL;QAASa;;IAC/B;;;;;;;;;;;;;;;;mCCnHgBC,uBAAAA;;;eAAAA;;;AAXhB,QAAMC,QAAQ,oBAAIC,QAAAA;AAWX,aAASF,oBACdG,UACAC,SAA2B;AAG3B,UAAI,CAACA,QAAS,QAAO;QAAED;MAAS;AAGhC,UAAIE,oBAAoBJ,MAAMK,IAAIF,OAAAA;AAClC,UAAI,CAACC,mBAAmB;AACtBA,4BAAoBD,QAAQG,IAAI,CAACC,WAAWA,OAAOC,YAAW,CAAA;AAC9DR,cAAMS,IAAIN,SAASC,iBAAAA;MACrB;AAEA,UAAIM;AAIJ,YAAMC,WAAWT,SAASU,MAAM,KAAK,CAAA;AAIrC,UAAI,CAACD,SAAS,CAAA,EAAI,QAAO;QAAET;MAAS;AAGpC,YAAMW,UAAUF,SAAS,CAAA,EAAGH,YAAW;AAIvC,YAAMM,QAAQV,kBAAkBW,QAAQF,OAAAA;AACxC,UAAIC,QAAQ,EAAG,QAAO;QAAEZ;MAAS;AAGjCQ,uBAAiBP,QAAQW,KAAAA;AAGzBZ,iBAAWA,SAASc,MAAMN,eAAeO,SAAS,CAAA,KAAM;AAExD,aAAO;QAAEf;QAAUQ;MAAe;IACpC;;;;;;;;;;;mCC1DaQ,uBAAAA;;;eAAAA;;;AAAN,QAAMA,sBAAiC,CAACC,UAAUC,YAAAA;AACvD,UAAIC,QAAQC,IAAIC,qBAAqB;AACnC,eACEC,gCACAN,oBAAoBC,UAAUC,OAAAA;MAClC;AACA,aAAO;QAAED;QAAUM,gBAAgBC;MAAU;IAC/C;;;;;;;;;;;;;;;;mCCPgBC,sBAAAA;;;eAAAA;;;AAAT,aAASA,mBACdC,aACAC,UACAC,gBAAuB;AAEvB,UAAI,CAACF,YAAa;AAElB,UAAIE,gBAAgB;AAClBA,yBAAiBA,eAAeC,YAAW;MAC7C;AAEA,iBAAWC,QAAQJ,aAAa;AAE9B,cAAMK,iBAAiBD,KAAKE,QAAQC,MAAM,KAAK,CAAA,EAAG,CAAA,EAAGJ,YAAAA;AACrD,YACEF,aAAaI,kBACbH,mBAAmBE,KAAKI,cAAcL,YAAW,KACjDC,KAAKK,SAASC,KAAK,CAACC,WAAWA,OAAOR,YAAW,MAAOD,cAAAA,GACxD;AACA,iBAAOE;QACT;MACF;IACF;;;;;;;;;;;mCCtBaQ,sBAAAA;;;eAAAA;;;AAAN,QAAMA,qBAAgC,IAAIC,SAAAA;AAC/C,UAAIC,QAAQC,IAAIC,qBAAqB;AACnC,eACEC,+BACAL,mBAAkB,GAAIC,IAAAA;MAC1B;IACF;;;;;;;;;;;;;;;;mCCDgBK,mBAAAA;;;eAAAA;;;;AAFhB,QAAMC,WAAYC,QAAQC,IAAIC,0BAAqC;AAE5D,aAASJ,gBACdK,MACAC,QACAC,SACAC,eAAuC;AAEvC,UAAIN,QAAQC,IAAIM,qBAAqB;AACnC,cAAMC,sBACJC,iCACAD;AACF,cAAME,qBACJD,gCACAC;AAEF,cAAMC,SAASP,UAAUI,oBAAoBL,MAAME,OAAAA,EAASO;AAC5D,cAAMC,SAASH,mBAAmBJ,eAAeQ,QAAWH,MAAAA;AAC5D,YAAIE,QAAQ;AACV,gBAAME,QAAQ,OAAOF,OAAOG,OAAO,KAAK,GAAA;AACxC,gBAAMC,cAAcN,WAAWE,OAAOK,gBAAgB,KAAK,IAAIP,MAAAA;AAC/D,iBAAO,GAAGI,KAAAA,GAAQF,OAAOA,MAAM,IAAGM,GAAAA,wBAAAA,4BAChC,GAAGpB,QAAAA,GAAWkB,WAAAA,GAAcd,IAAAA,EAAM,CAAA;QAEtC;AACA,eAAO;MACT,OAAO;AACL,eAAO;MACT;IACF;;;;;;;;;;;;;;;;mCC7BgBiB,eAAAA;;;eAAAA;;;;;AAFhB,QAAMC,WAAYC,QAAQC,IAAIC,0BAAqC;AAE5D,aAASJ,YAAYK,MAAcC,UAAkB;AAC1D,cAAOC,GAAAA,wBAAAA,4BACLL,QAAQC,IAAIK,kCAAkC,CAACF,WAC3CD,QACAI,GAAAA,eAAAA,eAAcJ,MAAMJ,QAAAA,CAAAA;IAE5B;;;;;;;;;;;;;;;;mCCFgBS,gBAAAA;;;eAAAA;;;2BAT8B,OAAA;AASvC,aAASA,aACdC,MACAC,MAAmB;AAEnB,YAAMC,YAAWC,GAAAA,OAAAA,QAA4B,IAAA;AAC7C,YAAMC,YAAWD,GAAAA,OAAAA,QAA4B,IAAA;AAS7C,cAAOE,GAAAA,OAAAA,aACL,CAACC,YAAAA;AACC,YAAIA,YAAY,MAAM;AACpB,gBAAMC,aAAaL,SAASI;AAC5B,cAAIC,YAAY;AACdL,qBAASI,UAAU;AACnBC,uBAAAA;UACF;AACA,gBAAMC,aAAaJ,SAASE;AAC5B,cAAIE,YAAY;AACdJ,qBAASE,UAAU;AACnBE,uBAAAA;UACF;QACF,OAAO;AACL,cAAIR,MAAM;AACRE,qBAASI,UAAUG,SAAST,MAAMM,OAAAA;UACpC;AACA,cAAIL,MAAM;AACRG,qBAASE,UAAUG,SAASR,MAAMK,OAAAA;UACpC;QACF;MACF,GACA;QAACN;QAAMC;OAAK;IAEhB;AAEA,aAASQ,SACPT,MACAM,SAAiB;AAEjB,UAAI,OAAON,SAAS,YAAY;AAC9B,cAAMU,UAAUV,KAAKM,OAAAA;AACrB,YAAI,OAAOI,YAAY,YAAY;AACjC,iBAAOA;QACT,OAAO;AACL,iBAAO,MAAMV,KAAK,IAAA;QACpB;MACF,OAAO;AACLA,aAAKM,UAAUA;AACf,eAAO,MAAA;AACLN,eAAKM,UAAU;QACjB;MACF;IACF;;;;;;;;;;;;;;;;mCCvDSK,aAAAA;;;eAAAA;;;AAXT,QAAIA,YAAY,CAACC,MAAAA;IAAe;AAChC,QAAIC,QAAQC,IAAIC,aAAa,cAAc;AACzC,YAAMC,SAAS,oBAAIC,IAAAA;AACnBN,kBAAY,CAACO,QAAAA;AACX,YAAI,CAACF,OAAOG,IAAID,GAAAA,GAAM;AACpBE,kBAAQC,MAAMH,GAAAA;QAChB;AACAF,eAAOM,IAAIJ,GAAAA;MACb;IACF;;;;;ACTA;;;;;;;;;;;;;;MAguBA,SAAmB,WAAA;eAAnB;;MANaK,eAAa,WAAA;eAAbA;;;;;uEAntBoC,OAAA,CAAA;;;;;;;;;;;;AAyIjD,QAAMC,aAAa,oBAAIC,IAAAA;AAUvB,aAASC,SACPC,QACAC,MACAC,IACAC,SAAwB;AAExB,UAAI,OAAOC,WAAW,aAAa;AACjC;MACF;AAEA,UAAI,EAACC,GAAAA,YAAAA,YAAWJ,IAAAA,GAAO;AACrB;MACF;AAIA,UAAI,CAACE,QAAQG,uBAAuB;AAClC,cAAMC;;UAEJ,OAAOJ,QAAQI,WAAW,cACtBJ,QAAQI,SAER,YAAYP,SACVA,OAAOO,SACPC;;AAER,cAAMC,gBAAgBR,OAAO,MAAMC,KAAK,MAAMK;AAG9C,YAAIV,WAAWa,IAAID,aAAAA,GAAgB;AACjC;QACF;AAGAZ,mBAAWc,IAAIF,aAAAA;MACjB;AAMAT,aAAOD,SAASE,MAAMC,IAAIC,OAAAA,EAASS,MAAM,CAACC,QAAAA;AACxC,YAAIC,QAAQC,IAAIC,aAAa,cAAc;AAEzC,gBAAMH;QACR;MACF,CAAA;IACF;AAEA,aAASI,gBAAgBC,OAAuB;AAC9C,YAAMC,cAAcD,MAAME;AAC1B,YAAMC,SAASF,YAAYG,aAAa,QAAA;AACxC,aACGD,UAAUA,WAAW,WACtBH,MAAMK,WACNL,MAAMM,WACNN,MAAMO,YACNP,MAAMQ;MACLR,MAAMS,eAAeT,MAAMS,YAAYC,UAAU;IAEtD;AAEA,aAASC,YACPC,GACA9B,QACAC,MACAC,IACA6B,SACAC,SACAC,QACA1B,QACA2B,YAAmC;AAEnC,YAAM,EAAEC,SAAQ,IAAKL,EAAEV;AAGvB,YAAMgB,mBAAmBD,SAASE,YAAW,MAAO;AAEpD,UACGD,oBAAoBnB,gBAAgBa,CAAAA,KACrCA,EAAEV,cAAckB,aAAa,UAAA,GAC7B;AAEA;MACF;AAEA,UAAI,EAACjC,GAAAA,YAAAA,YAAWJ,IAAAA,GAAO;AACrB,YAAI8B,SAAS;AAGXD,YAAES,eAAc;AAChBC,mBAAST,QAAQ9B,IAAAA;QACnB;AAGA;MACF;AAEA6B,QAAES,eAAc;AAEhB,YAAME,WAAW,MAAA;AACf,YAAIP,YAAY;AACd,cAAIQ,qBAAqB;AAEzBR,qBAAW;YACTK,gBAAgB,MAAA;AACdG,mCAAqB;YACvB;UACF,CAAA;AAEA,cAAIA,oBAAoB;AACtB;UACF;QACF;AAGA,cAAMC,eAAeV,UAAU;AAC/B,YAAI,oBAAoBjC,QAAQ;AAC9BA,iBAAO+B,UAAU,YAAY,MAAA,EAAQ9B,MAAMC,IAAI;YAC7C8B;YACAzB;YACA0B,QAAQU;UACV,CAAA;QACF,OAAO;AACL3C,iBAAO+B,UAAU,YAAY,MAAA,EAAQ7B,MAAMD,MAAM;YAC/CgC,QAAQU;UACV,CAAA;QACF;MACF;AAEAF,eAAAA;IACF;AAOA,aAASG,kBAAkBC,gBAAkC;AAC3D,UAAI,OAAOA,mBAAmB,UAAU;AACtC,eAAOA;MACT;AAEA,cAAOC,GAAAA,WAAAA,WAAUD,cAAAA;IACnB;AAUA,QAAME,OAAOC,uBAAAA,QAAMC,WACjB,SAASC,cAAcC,OAAOC,cAAY;AACxC,UAAIC;AAEJ,YAAM,EACJpD,MAAMqD,UACNpD,IAAIqD,QACJF,UAAUG,cACVzD,UAAU0D,eAAe,MACzBC,UACA3B,SACAC,SACAC,QACA1B,QACAoD,SACAzB,YACA0B,cAAcC,kBACdC,cAAcC,kBACdC,iBAAiB,OACjBC,iBACA,GAAGC,UAAAA,IACDf;AAEJE,iBAAWG;AAEX,UACEQ,mBACC,OAAOX,aAAa,YAAY,OAAOA,aAAa,WACrD;AACAA,mBAAW,oBAAA,YAAA,KAACc,KAAAA;;;MACd;AAEA,YAAMnE,SAASgD,OAAAA,QAAMoB,WAAWC,4BAAAA,aAAa;AAE7C,YAAMC,kBAAkBb,iBAAiB;AAEzC,UAAI3C,QAAQC,IAAIC,aAAa,cAAc;AACzC,YAASuD,kBAAT,SAAyBC,MAIxB;AACC,iBAAO,OAAA,eAAA,IAAIC,MACT,gCAAgCD,KAAKE,GAAG,gBAAgBF,KAAKG,QAAQ,6BAA6BH,KAAKI,MAAM,iBAC1G,OAAOxE,WAAW,cAEf,qEACA,GAAC,GALF,qBAAA;mBAAA;wBAAA;0BAAA;UAMP,CAAA;QACF;AAGA,cAAMyE,qBAAsD;UAC1D5E,MAAM;QACR;AACA,cAAM6E,gBAAqCC,OAAOC,KAChDH,kBAAAA;AAEFC,sBAAcG,QAAQ,CAACP,QAAAA;AACrB,cAAIA,QAAQ,QAAQ;AAClB,gBACEvB,MAAMuB,GAAAA,KAAQ,QACb,OAAOvB,MAAMuB,GAAAA,MAAS,YAAY,OAAOvB,MAAMuB,GAAAA,MAAS,UACzD;AACA,oBAAMH,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQzB,MAAMuB,GAAAA,MAAS,OAAO,SAAS,OAAOvB,MAAMuB,GAAAA;cACtD,CAAA;YACF;UACF,OAAO;AAEL,kBAAMQ,IAAWR;UACnB;QACF,CAAA;AAGA,cAAMS,qBAAsD;UAC1DjF,IAAI;UACJ6B,SAAS;UACTE,QAAQ;UACRD,SAAS;UACT0B,UAAU;UACV3D,UAAU;UACVQ,QAAQ;UACRoD,SAAS;UACTC,cAAc;UACdE,cAAc;UACdE,gBAAgB;UAChB9B,YAAY;UACZ+B,iBAAiB;QACnB;AACA,cAAMmB,gBAAqCL,OAAOC,KAChDG,kBAAAA;AAEFC,sBAAcH,QAAQ,CAACP,QAAAA;AACrB,gBAAMW,UAAU,OAAOlC,MAAMuB,GAAAA;AAE7B,cAAIA,QAAQ,MAAM;AAChB,gBAAIvB,MAAMuB,GAAAA,KAAQW,YAAY,YAAYA,YAAY,UAAU;AAC9D,oBAAMd,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,WAAWX,QAAQ,UAAU;AAC3B,gBAAIvB,MAAMuB,GAAAA,KAAQW,YAAY,UAAU;AACtC,oBAAMd,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,WACEX,QAAQ,aACRA,QAAQ,kBACRA,QAAQ,kBACRA,QAAQ,cACR;AACA,gBAAIvB,MAAMuB,GAAAA,KAAQW,YAAY,YAAY;AACxC,oBAAMd,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,WACEX,QAAQ,aACRA,QAAQ,YACRA,QAAQ,aACRA,QAAQ,cACRA,QAAQ,kBACR;AACA,gBAAIvB,MAAMuB,GAAAA,KAAQ,QAAQW,YAAY,WAAW;AAC/C,oBAAMd,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,WAAWX,QAAQ,YAAY;AAC7B,gBACEvB,MAAMuB,GAAAA,KAAQ,QACdW,YAAY,aACZlC,MAAMuB,GAAAA,MAAS,QACf;AACA,oBAAMH,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,WAAWX,QAAQ,mBAAmB;AACpC,gBAAIvB,MAAMuB,GAAAA,KAAQ,QAAQ,CAACY,MAAMC,QAAQpC,MAAMuB,GAAAA,CAAI,GAAG;AACpD,oBAAMH,gBAAgB;gBACpBG;gBACAC,UAAU;gBACVC,QAAQS;cACV,CAAA;YACF;UACF,OAAO;AAEL,kBAAMH,IAAWR;UACnB;QACF,CAAA;MACF;AAEA,YAAM,EAAEzE,MAAMC,GAAE,IAAK8C,OAAAA,QAAMwC,QAAQ,MAAA;AACjC,YAAI,CAACxF,QAAQ;AACX,gBAAMyF,gBAAe7C,kBAAkBU,QAAAA;AACvC,iBAAO;YACLrD,MAAMwF;YACNvF,IAAIqD,SAASX,kBAAkBW,MAAAA,IAAUkC;UAC3C;QACF;AAEA,cAAM,CAACA,cAAcC,UAAAA,KAAcC,GAAAA,aAAAA,aAAY3F,QAAQsD,UAAU,IAAA;AAEjE,eAAO;UACLrD,MAAMwF;UACNvF,IAAIqD,UAASoC,GAAAA,aAAAA,aAAY3F,QAAQuD,MAAAA,IAAUmC,cAAcD;QAC3D;MACF,GAAG;QAACzF;QAAQsD;QAAUC;OAAO;AAE7B,YAAMqC,eAAe5C,OAAAA,QAAM6C,OAAe5F,IAAAA;AAC1C,YAAM6F,aAAa9C,OAAAA,QAAM6C,OAAe3F,EAAAA;AAGxC,UAAI6F;AACJ,UAAI/B,gBAAgB;AAClB,YAAIlD,QAAQC,IAAIC,aAAa,eAAe;AAC1C,cAAI2C,SAAS;AACXqC,oBAAQC,KACN,qDAAqD3C,QAAAA,wGAAgH;UAEzK;AACA,cAAIO,kBAAkB;AACpBmC,oBAAQC,KACN,0DAA0D3C,QAAAA,6GAAqH;UAEnL;AACA,cAAI;AACFyC,oBAAQ/C,OAAAA,QAAMkD,SAASC,KAAK9C,QAAAA;UAC9B,SAASxC,KAAK;AACZ,gBAAI,CAACwC,UAAU;AACb,oBAAM,OAAA,eAAA,IAAIoB,MACR,wDAAwDnB,QAAAA,gFAAwF,GAD5I,qBAAA;uBAAA;4BAAA;8BAAA;cAEN,CAAA;YACF;AACA,kBAAM,OAAA,eAAA,IAAImB,MACR,8DAA8DnB,QAAAA,gGAC3D,OAAOlD,WAAW,cACf,sEACA,GAAC,GAJH,qBAAA;qBAAA;0BAAA;4BAAA;YAKN,CAAA;UACF;QACF,OAAO;AACL2F,kBAAQ/C,OAAAA,QAAMkD,SAASC,KAAK9C,QAAAA;QAC9B;MACF,OAAO;AACL,YAAIvC,QAAQC,IAAIC,aAAa,eAAe;AAC1C,cAAKqC,UAAkB+C,SAAS,KAAK;AACnC,kBAAM,OAAA,eAAA,IAAI3B,MACR,iKAAA,GADI,qBAAA;qBAAA;0BAAA;4BAAA;YAEN,CAAA;UACF;QACF;MACF;AAEA,YAAM4B,WAAgBrC,iBAClB+B,SAAS,OAAOA,UAAU,YAAYA,MAAMO,MAC5ClD;AAEJ,YAAM,CAACmD,oBAAoBC,WAAWC,YAAAA,KAAgBC,GAAAA,iBAAAA,iBAAgB;QACpEC,YAAY;MACd,CAAA;AACA,YAAMC,8BAA8B5D,OAAAA,QAAM6D,YACxC,CAACC,OAAAA;AAEC,YAAIhB,WAAWiB,YAAY7G,MAAM0F,aAAamB,YAAY9G,MAAM;AAC9DwG,uBAAAA;AACAX,qBAAWiB,UAAU7G;AACrB0F,uBAAamB,UAAU9G;QACzB;AAEAsG,2BAAmBO,EAAAA;MACrB,GACA;QAAC5G;QAAID;QAAMwG;QAAcF;OAAmB;AAG9C,YAAMS,UAASC,GAAAA,cAAAA,cAAaL,6BAA6BP,QAAAA;AAGzDrD,aAAAA,QAAMkE,UAAU,MAAA;AAEd,YAAIpG,QAAQC,IAAIC,aAAa,cAAc;AACzC;QACF;AAEA,YAAI,CAAChB,QAAQ;AACX;QACF;AAGA,YAAI,CAACwG,aAAa,CAAClC,iBAAiB;AAClC;QACF;AAGAvE,iBAASC,QAAQC,MAAMC,IAAI;UAAEK;QAAO,CAAA;MACtC,GAAG;QAACL;QAAID;QAAMuG;QAAWjG;QAAQ+D;QAAiBtE,QAAQO;QAAQP;OAAO;AAEzE,YAAMmH,aAMF;QACFb,KAAKU;QACLrD,QAAQ7B,GAAC;AACP,cAAIhB,QAAQC,IAAIC,aAAa,cAAc;AACzC,gBAAI,CAACc,GAAG;AACN,oBAAM,OAAA,eAAA,IAAI2C,MACR,gFAAgF,GAD5E,qBAAA;uBAAA;4BAAA;8BAAA;cAEN,CAAA;YACF;UACF;AAEA,cAAI,CAACT,kBAAkB,OAAOL,YAAY,YAAY;AACpDA,oBAAQ7B,CAAAA;UACV;AAEA,cACEkC,kBACA+B,MAAM5C,SACN,OAAO4C,MAAM5C,MAAMQ,YAAY,YAC/B;AACAoC,kBAAM5C,MAAMQ,QAAQ7B,CAAAA;UACtB;AAEA,cAAI,CAAC9B,QAAQ;AACX;UACF;AAEA,cAAI8B,EAAEsF,kBAAkB;AACtB;UACF;AAEAvF,sBACEC,GACA9B,QACAC,MACAC,IACA6B,SACAC,SACAC,QACA1B,QACA2B,UAAAA;QAEJ;QACA0B,aAAa9B,GAAC;AACZ,cAAI,CAACkC,kBAAkB,OAAOH,qBAAqB,YAAY;AAC7DA,6BAAiB/B,CAAAA;UACnB;AAEA,cACEkC,kBACA+B,MAAM5C,SACN,OAAO4C,MAAM5C,MAAMS,iBAAiB,YACpC;AACAmC,kBAAM5C,MAAMS,aAAa9B,CAAAA;UAC3B;AAEA,cAAI,CAAC9B,QAAQ;AACX;UACF;AAEAD,mBAASC,QAAQC,MAAMC,IAAI;YACzBK;YACA8G,UAAU;;YAEV/G,uBAAuB;UACzB,CAAA;QACF;QACAwD,cAAchD,QAAQC,IAAIuG,6BACtB9G,SACA,SAASsD,aAAahC,GAAC;AACrB,cAAI,CAACkC,kBAAkB,OAAOD,qBAAqB,YAAY;AAC7DA,6BAAiBjC,CAAAA;UACnB;AAEA,cACEkC,kBACA+B,MAAM5C,SACN,OAAO4C,MAAM5C,MAAMW,iBAAiB,YACpC;AACAiC,kBAAM5C,MAAMW,aAAahC,CAAAA;UAC3B;AAEA,cAAI,CAAC9B,QAAQ;AACX;UACF;AAEAD,mBAASC,QAAQC,MAAMC,IAAI;YACzBK;YACA8G,UAAU;;YAEV/G,uBAAuB;UACzB,CAAA;QACF;MACN;AAGA,WAAIiH,GAAAA,OAAAA,eAAcrH,EAAAA,GAAK;AACrBiH,mBAAWlH,OAAOC;MACpB,WACE,CAAC8D,kBACDN,YACCqC,MAAMK,SAAS,OAAO,EAAE,UAAUL,MAAM5C,QACzC;AACA,cAAMqE,YAAY,OAAOjH,WAAW,cAAcA,SAASP,QAAQO;AAInE,cAAMkH,eACJzH,QAAQ0H,mBACRC,GAAAA,iBAAAA,iBAAgBzH,IAAIsH,WAAWxH,QAAQ4H,SAAS5H,QAAQ6H,aAAAA;AAE1DV,mBAAWlH,OACTwH,iBACAK,GAAAA,aAAAA,cAAYC,GAAAA,WAAAA,WAAU7H,IAAIsH,WAAWxH,QAAQgI,aAAAA,CAAAA;MACjD;AAEA,UAAIhE,gBAAgB;AAClB,YAAIlD,QAAQC,IAAIC,aAAa,eAAe;AAC1CiH,WAAAA,GAAAA,WAAAA,WACE,8RAGE;QAEN;AACA,eAAOjF,uBAAAA,QAAMkF,aAAanC,OAAOoB,UAAAA;MACnC;AAEA,aACE,oBAAA,YAAA,KAAChD,KAAAA;QAAG,GAAGD;QAAY,GAAGiD;;;IAI1B,CAAA;AAGF,QAAMgB,oBAAoBC,oBAAAA,OAAAA,eAEvB;;MAEDC,SAAS;IACX,CAAA;AAEO,QAAMzI,gBAAgB,MAAA;AAG3B,cAAOwE,GAAAA,OAAAA,YAAW+D,iBAAAA;IACpB;QAEA,WAAepF;;;;;;;;;;AChuBf,IAAAuF,gBAAA;AAAA;AAAA;AAAA,WAAO,UAAU;AAAA;AAAA;","names":["nodeInterop","assign","searchParamsToUrlQuery","urlQueryToSearchParams","searchParams","query","key","value","entries","existing","Array","isArray","push","stringifyUrlQueryParam","param","isNaN","String","URLSearchParams","Object","item","append","set","target","searchParamsList","keys","delete","formatUrl","formatWithValidation","urlObjectKeys","slashedProtocols","urlObj","auth","hostname","protocol","pathname","hash","query","host","encodeURIComponent","replace","indexOf","port","String","querystring","urlQueryToSearchParams","search","endsWith","slashes","test","url","process","env","NODE_ENV","Object","keys","forEach","key","includes","console","warn","omit","object","keys","omitted","Object","forEach","key","includes","DecodeError","MiddlewareNotFoundError","MissingStaticPage","NormalizeError","PageNotFoundError","SP","ST","WEB_VITALS","execOnce","getDisplayName","getLocationOrigin","getURL","isAbsoluteUrl","isResSent","loadGetInitialProps","normalizeRepeatedSlashes","stringifyError","fn","used","result","args","ABSOLUTE_URL_REGEX","url","test","protocol","hostname","port","window","location","href","origin","substring","length","Component","displayName","name","res","finished","headersSent","urlParts","split","urlNoQuery","replace","slice","join","App","ctx","process","env","NODE_ENV","prototype","getInitialProps","message","Error","pageProps","props","Object","keys","console","warn","performance","every","method","constructor","page","code","error","JSON","stringify","stack","removeTrailingSlash","route","replace","parsePath","path","hashIndex","indexOf","queryIndex","hasQuery","pathname","substring","query","undefined","hash","slice","normalizePathTrailingSlash","path","startsWith","process","env","__NEXT_MANUAL_TRAILING_SLASH","pathname","query","hash","parsePath","__NEXT_TRAILING_SLASH","test","removeTrailingSlash","endsWith","pathHasPrefix","path","prefix","pathname","parsePath","startsWith","hasBasePath","basePath","process","env","__NEXT_ROUTER_BASEPATH","path","pathHasPrefix","isLocalURL","url","isAbsoluteUrl","locationOrigin","getLocationOrigin","resolved","URL","origin","hasBasePath","pathname","_","getSortedRouteObjects","getSortedRoutes","UrlNode","insert","urlPath","_insert","split","filter","Boolean","smoosh","_smoosh","prefix","childrenPaths","children","keys","sort","slugName","splice","indexOf","restSlugName","optionalRestSlugName","routes","map","c","get","reduce","prev","curr","push","placeholder","r","slice","Error","unshift","urlPaths","slugNames","isCatchAll","length","nextSegment","startsWith","endsWith","handleSlug","previousSlug","nextSlug","forEach","slug","replace","segmentName","isOptional","substring","has","set","Map","normalizedPages","root","pagePath","objects","getter","indexes","pathnames","i","pathname","sorted","ensureLeadingSlash","path","startsWith","DEFAULT_SEGMENT_KEY","NOT_FOUND_SEGMENT_KEY","PAGE_SEGMENT_KEY","addSearchParamsIfPageSegment","computeSelectedLayoutSegment","getSegmentValue","getSelectedLayoutSegmentPath","isGroupSegment","isParallelRouteSegment","segment","Array","isArray","endsWith","startsWith","searchParams","isPageSegment","includes","stringifiedQuery","JSON","stringify","segments","parallelRouteKey","length","rawSegment","tree","first","segmentPath","node","parallelRoutes","children","Object","values","segmentValue","push","compareAppPaths","normalizeAppPath","normalizeRscURL","route","ensureLeadingSlash","split","reduce","pathname","segment","index","segments","isGroupSegment","length","a","b","aHasSlot","includes","bHasSlot","localeCompare","url","replace","INTERCEPTION_ROUTE_MARKERS","extractInterceptionRouteInformation","isInterceptionRouteAppPath","path","split","find","segment","m","startsWith","undefined","interceptingRoute","marker","interceptedRoute","Error","normalizeAppPath","slice","concat","join","splitInterceptingRoute","length","isDynamicRoute","TEST_ROUTE","TEST_STRICT_ROUTE","route","strict","isInterceptionRouteAppPath","extractInterceptionRouteInformation","interceptedRoute","test","getSortedRouteObjects","getSortedRoutes","isDynamicRoute","e","n","t","a","i","r","PARAM_SEPARATOR","hasAdjacentParameterIssues","normalizeAdjacentParameters","normalizeTokensForRegexp","stripNormalizedSeparators","stripParameterSeparators","route","test","normalized","replace","tokens","map","token","modifier","prefix","suffix","pathname","RegExp","params","cleaned","key","value","Object","entries","Array","isArray","item","safeCompile","safePathToRegexp","safeRegexpToFunction","safeRouteMatcher","route","keys","options","pathToRegexp","needsNormalization","hasAdjacentParameterIssues","routeToUse","normalizeAdjacentParameters","error","normalizedRoute","retryError","compiler","compile","params","stripNormalizedSeparators","regexp","originalMatcher","regexpToFunction","pathname","result","stripParameterSeparators","matcherFn","getRouteMatcher","re","groups","rawMatcher","pathname","routeMatch","exec","decode","param","decodeURIComponent","DecodeError","params","key","group","Object","entries","match","pos","undefined","repeat","split","map","entry","safeRouteMatcher","ACTION_SUFFIX","APP_DIR_ALIAS","CACHE_ONE_YEAR_SECONDS","DOT_NEXT_ALIAS","ESLINT_DEFAULT_DIRS","GSP_NO_RETURNED_VALUE","GSSP_COMPONENT_MEMBER_ERROR","GSSP_NO_RETURNED_VALUE","HTML_CONTENT_TYPE_HEADER","INFINITE_CACHE","INSTRUMENTATION_HOOK_FILENAME","JSON_CONTENT_TYPE_HEADER","MATCHED_PATH_HEADER","MIDDLEWARE_FILENAME","MIDDLEWARE_LOCATION_REGEXP","NEXT_BODY_SUFFIX","NEXT_CACHE_IMPLICIT_TAG_ID","NEXT_CACHE_REVALIDATED_TAGS_HEADER","NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER","NEXT_CACHE_ROOT_PARAM_TAG_ID","NEXT_CACHE_SOFT_TAG_MAX_LENGTH","NEXT_CACHE_TAGS_HEADER","NEXT_CACHE_TAG_MAX_ITEMS","NEXT_CACHE_TAG_MAX_LENGTH","NEXT_DATA_SUFFIX","NEXT_INTERCEPTION_MARKER_PREFIX","NEXT_META_SUFFIX","NEXT_NAV_DEPLOYMENT_ID_HEADER","NEXT_QUERY_PARAM_PREFIX","NEXT_RESUME_HEADER","NEXT_RESUME_STATE_LENGTH_HEADER","NON_STANDARD_NODE_ENV","PAGES_DIR_ALIAS","PRERENDER_REVALIDATE_HEADER","PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER","PROXY_FILENAME","PROXY_LOCATION_REGEXP","PUBLIC_DIR_MIDDLEWARE_CONFLICT","ROOT_DIR_ALIAS","RSC_ACTION_CLIENT_WRAPPER_ALIAS","RSC_ACTION_ENCRYPTION_ALIAS","RSC_ACTION_PROXY_ALIAS","RSC_ACTION_VALIDATE_ALIAS","RSC_CACHE_WRAPPER_ALIAS","RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS","RSC_MOD_REF_PROXY_ALIAS","RSC_SEGMENTS_DIR_SUFFIX","RSC_SEGMENT_SUFFIX","RSC_SUFFIX","SERVER_PROPS_EXPORT_ERROR","SERVER_PROPS_GET_INIT_PROPS_CONFLICT","SERVER_PROPS_SSG_CONFLICT","SERVER_RUNTIME","SSG_FALLBACK_EXPORT_ERROR","SSG_GET_INITIAL_PROPS_CONFLICT","STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR","TEXT_PLAIN_CONTENT_TYPE_HEADER","UNSTABLE_REVALIDATE_RENAME_ERROR","WEBPACK_LAYERS","WEBPACK_RESOURCE_QUERIES","WEB_SOCKET_MAX_RECONNECTIONS","edge","experimentalEdge","nodejs","WEBPACK_LAYERS_NAMES","shared","reactServerComponents","serverSideRendering","actionBrowser","apiNode","apiEdge","middleware","instrument","edgeAsset","appPagesBrowser","pagesDirBrowser","pagesDirEdge","pagesDirNode","GROUP","builtinReact","serverOnly","neutralTarget","clientOnly","bundled","appPages","edgeSSREntry","metadata","metadataRoute","metadataImageMeta","escapeStringRegexp","reHasRegExp","reReplaceRegExp","str","test","replace","InvariantError","Error","constructor","message","options","endsWith","name","parseLoaderTree","tree","segment","parallelRoutes","modules","staticSiblings","layout","template","page","DEFAULT_SEGMENT_KEY","defaultPage","conventionPath","getParamProperties","getSegmentParam","isCatchAll","segment","interceptionMarker","INTERCEPTION_ROUTE_MARKERS","find","marker","startsWith","slice","length","endsWith","paramType","paramName","type","repeat","optional","isInterceptionAppRoute","isNormalizedAppRoute","parseAppRoute","parseAppRouteSegment","normalizeEncodedDynamicPlaceholder","segment","test","decodedSegment","decodeURIComponent","getSegmentParam","interceptionMarker","INTERCEPTION_ROUTE_MARKERS","find","m","startsWith","param","type","name","endsWith","route","normalized","undefined","interceptingRoute","interceptedRoute","pathname","pathnameSegments","split","filter","Boolean","segments","normalizedSegment","appSegment","InvariantError","push","parts","length","Error","dynamicSegments","interceptionPrefixFromParamType","paramType","resolveParamValue","getParamValueFromSegment","pathSegment","params","paramType","type","param","paramName","interceptionPrefix","interceptionPrefixFromParamType","interceptionMarker","name","replace","depth","route","processedSegments","index","segments","length","value","push","hasOwnProperty","undefined","paramValue","Array","isArray","InvariantError","pathname","PARAMETER_PATTERN","getDynamicParam","interpolateParallelRouteParams","parseMatchedParameter","parseParameter","getParamValue","interpolatedParams","segmentKey","fallbackRouteParams","value","has","searchValue","get","Array","isArray","map","i","encodeURIComponent","loaderTree","params","pagePath","interpolated","structuredClone","stack","tree","depth","route","parseAppRoute","length","pop","segment","parallelRoutes","parseLoaderTree","appSegment","parseAppRouteSegment","type","hasOwnProperty","param","paramName","paramType","paramValue","resolveParamValue","undefined","InvariantError","nextDepth","parallelRoute","Object","values","push","dynamicParamType","staticSiblings","treeSegment","paramCacheKey","join","match","optional","startsWith","endsWith","slice","repeat","key","getNamedMiddlewareRegex","getNamedRouteRegex","getRouteRegex","getParametrizedRoute","route","includeSuffix","includePrefix","groups","groupIndex","segments","segment","removeTrailingSlash","slice","split","markerMatch","INTERCEPTION_ROUTE_MARKERS","find","m","startsWith","paramMatches","match","PARAMETER_PATTERN","key","optional","repeat","parseMatchedParameter","pos","push","escapeStringRegexp","s","substring","parameterizedRoute","join","normalizedRoute","excludeOptionalTrailingSlash","re","RegExp","buildGetSafeRouteKey","i","routeKey","j","String","fromCharCode","Math","floor","getSafeKeyFromSegment","interceptionMarker","getSafeRouteKey","routeKeys","keyPrefix","backreferenceDuplicateKeys","cleanedKey","replace","invalidKey","length","isNaN","parseInt","duplicateKey","interceptionPrefix","pattern","getNamedParametrizedRoute","prefixRouteKeys","reference","names","intercepted","inverseParts","structuredClone","hasInterceptionMarker","some","undefined","NEXT_INTERCEPTION_MARKER_PREFIX","NEXT_QUERY_PARAM_PREFIX","namedParameterizedRoute","pathToRegexpPattern","options","result","namedRegex","catchAll","catchAllRegex","catchAllGroupedRegex","interpolateAs","route","asPathname","query","interpolatedRoute","dynamicRegex","getRouteRegex","dynamicGroups","groups","dynamicMatches","getRouteMatcher","params","Object","keys","every","param","value","repeat","optional","replaced","Array","isArray","replace","map","segment","encodeURIComponent","join","result","resolveHref","router","href","resolveAs","base","urlAsString","formatWithValidation","urlProtoMatch","match","urlAsStringNoProto","slice","length","urlParts","split","console","error","pathname","normalizedUrl","normalizeRepeatedSlashes","isLocalURL","baseBase","startsWith","asPath","isDynamicRoute","routeRegex","getRouteRegex","getRouteMatcher","URL","_","finalUrl","normalizePathTrailingSlash","interpolatedAs","searchParams","query","searchParamsToUrlQuery","result","params","interpolateAs","hash","omit","resolvedHref","origin","addPathPrefix","path","prefix","startsWith","pathname","query","hash","parsePath","addLocale","path","locale","defaultLocale","ignorePrefix","lower","toLowerCase","pathHasPrefix","addPathPrefix","addLocale","path","args","process","env","__NEXT_I18N_SUPPORT","normalizePathTrailingSlash","require","RouterContext","React","createContext","process","env","NODE_ENV","displayName","cancelIdleCallback","requestIdleCallback","self","bind","window","cb","start","Date","now","setTimeout","didTimeout","timeRemaining","Math","max","id","clearTimeout","useIntersection","hasIntersectionObserver","IntersectionObserver","observers","Map","idList","createObserver","options","id","root","margin","rootMargin","existing","find","obj","instance","get","elements","observer","entries","forEach","entry","callback","target","isVisible","isIntersecting","intersectionRatio","push","set","observe","element","unobserve","delete","size","disconnect","index","findIndex","splice","rootRef","disabled","isDisabled","visible","setVisible","useState","elementRef","useRef","setElement","useCallback","current","useEffect","tagName","idleCallback","requestIdleCallback","cancelIdleCallback","resetVisible","normalizeLocalePath","cache","WeakMap","pathname","locales","lowercasedLocales","get","map","locale","toLowerCase","set","detectedLocale","segments","split","segment","index","indexOf","slice","length","normalizeLocalePath","pathname","locales","process","env","__NEXT_I18N_SUPPORT","require","detectedLocale","undefined","detectDomainLocale","domainItems","hostname","detectedLocale","toLowerCase","item","domainHostname","domain","split","defaultLocale","locales","some","locale","detectDomainLocale","args","process","env","__NEXT_I18N_SUPPORT","require","getDomainLocale","basePath","process","env","__NEXT_ROUTER_BASEPATH","path","locale","locales","domainLocales","__NEXT_I18N_SUPPORT","normalizeLocalePath","require","detectDomainLocale","target","detectedLocale","domain","undefined","proto","http","finalLocale","defaultLocale","normalizePathTrailingSlash","addBasePath","basePath","process","env","__NEXT_ROUTER_BASEPATH","path","required","normalizePathTrailingSlash","__NEXT_MANUAL_CLIENT_BASE_PATH","addPathPrefix","useMergedRef","refA","refB","cleanupA","useRef","cleanupB","useCallback","current","cleanupFnA","cleanupFnB","applyRef","cleanup","errorOnce","_","process","env","NODE_ENV","errors","Set","msg","has","console","error","add","useLinkStatus","prefetched","Set","prefetch","router","href","as","options","window","isLocalURL","bypassPrefetchedCheck","locale","undefined","prefetchedKey","has","add","catch","err","process","env","NODE_ENV","isModifiedEvent","event","eventTarget","currentTarget","target","getAttribute","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","linkClicked","e","replace","shallow","scroll","onNavigate","nodeName","isAnchorNodeName","toUpperCase","hasAttribute","preventDefault","location","navigate","isDefaultPrevented","routerScroll","formatStringOrUrl","urlObjOrString","formatUrl","Link","React","forwardRef","LinkComponent","props","forwardedRef","children","hrefProp","asProp","childrenProp","prefetchProp","passHref","onClick","onMouseEnter","onMouseEnterProp","onTouchStart","onTouchStartProp","legacyBehavior","transitionTypes","restProps","a","useContext","RouterContext","prefetchEnabled","createPropError","args","Error","key","expected","actual","requiredPropsGuard","requiredProps","Object","keys","forEach","_","optionalPropsGuard","optionalProps","valType","Array","isArray","useMemo","resolvedHref","resolvedAs","resolveHref","previousHref","useRef","previousAs","child","console","warn","Children","only","type","childRef","ref","setIntersectionRef","isVisible","resetVisible","useIntersection","rootMargin","setIntersectionWithResetRef","useCallback","el","current","setRef","useMergedRef","useEffect","childProps","defaultPrevented","priority","__NEXT_LINK_NO_TOUCH_START","isAbsoluteUrl","curLocale","localeDomain","isLocaleDomain","getDomainLocale","locales","domainLocales","addBasePath","addLocale","defaultLocale","errorOnce","cloneElement","LinkStatusContext","createContext","pending","require_link"]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs b/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs new file mode 100644 index 00000000..c49d952a --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs @@ -0,0 +1,37 @@ +import React from "react"; +import { + Progress +} from "./chunk-OBV5RENT.mjs"; +import { + Badge +} from "./chunk-3I7NW6GS.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/primitives/ranked-bar.tsx +function RankedBar({ + label, + value, + percent, + description, + badge, + className +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "space-y-2 rounded-xl border border-border/80 bg-muted/25 p-3", + className + ) + }, + /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between gap-3" }, /* @__PURE__ */ React.createElement("div", { className: "min-w-0 space-y-1" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React.createElement("span", { className: "font-medium text-sm" }, label), badge), description ? /* @__PURE__ */ React.createElement("div", { className: "text-muted-foreground text-xs" }, description) : null), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 text-right" }, /* @__PURE__ */ React.createElement("span", { className: "font-semibold text-sm" }, value), /* @__PURE__ */ React.createElement(Badge, { variant: "muted" }, percent.toFixed(percent >= 10 ? 0 : 1), "%"))), + /* @__PURE__ */ React.createElement(Progress, { value: percent }) + ); +} + +export { + RankedBar +}; +//# sourceMappingURL=chunk-DAD37JSY.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs.map new file mode 100644 index 00000000..bc4d5231 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DAD37JSY.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/ranked-bar.tsx"],"sourcesContent":["import { Badge } from \"@repo/design-system/components/ui/badge\";\nimport { Progress } from \"@repo/design-system/components/ui/progress\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport type { ReactNode } from \"react\";\n\ntype RankedBarProps = {\n label: ReactNode;\n value: string | number;\n percent: number;\n description?: ReactNode;\n badge?: ReactNode;\n className?: string;\n};\n\nexport function RankedBar({\n label,\n value,\n percent,\n description,\n badge,\n className,\n}: RankedBarProps) {\n return (\n \n
\n
\n
\n {label}\n {badge}\n
\n {description ? (\n
{description}
\n ) : null}\n
\n
\n {value}\n \n {percent.toFixed(percent >= 10 ? 0 : 1)}%\n \n
\n
\n \n
\n );\n}\n"],"mappings":";;;;;;;;;;;AAcO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,SAAI,WAAU,6CACb,oCAAC,SAAI,WAAU,uBACb,oCAAC,SAAI,WAAU,uCACb,oCAAC,UAAK,WAAU,yBAAuB,KAAM,GAC5C,KACH,GACC,cACC,oCAAC,SAAI,WAAU,mCAAiC,WAAY,IAC1D,IACN,GACA,oCAAC,SAAI,WAAU,wCACb,oCAAC,UAAK,WAAU,2BAAyB,KAAM,GAC/C,oCAAC,SAAM,SAAQ,WACZ,QAAQ,QAAQ,WAAW,KAAK,IAAI,CAAC,GAAE,GAC1C,CACF,CACF;AAAA,IACA,oCAAC,YAAS,OAAO,SAAS;AAAA,EAC5B;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs b/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs new file mode 100644 index 00000000..4edad506 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs @@ -0,0 +1,151 @@ +import { + buttonVariants +} from "./chunk-TT7DUYOP.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/alert-dialog.tsx +import * as React from "react"; +import { AlertDialog as AlertDialogPrimitive } from "radix-ui"; +function AlertDialog({ + ...props +}) { + return /* @__PURE__ */ React.createElement(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props }); +} +function AlertDialogTrigger({ + ...props +}) { + return /* @__PURE__ */ React.createElement(AlertDialogPrimitive.Trigger, { "data-slot": "alert-dialog-trigger", ...props }); +} +function AlertDialogPortal({ + ...props +}) { + return /* @__PURE__ */ React.createElement(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props }); +} +function AlertDialogOverlay({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Overlay, + { + "data-slot": "alert-dialog-overlay", + className: cn( + "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", + className + ), + ...props + } + ); +} +function AlertDialogContent({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement(AlertDialogPortal, null, /* @__PURE__ */ React.createElement(AlertDialogOverlay, null), /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Content, + { + "data-slot": "alert-dialog-content", + className: cn( + "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg", + className + ), + ...props + } + )); +} +function AlertDialogHeader({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "alert-dialog-header", + className: cn("flex flex-col gap-2 text-center sm:text-left", className), + ...props + } + ); +} +function AlertDialogFooter({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "alert-dialog-footer", + className: cn( + "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", + className + ), + ...props + } + ); +} +function AlertDialogTitle({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Title, + { + "data-slot": "alert-dialog-title", + className: cn("text-lg font-semibold", className), + ...props + } + ); +} +function AlertDialogDescription({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Description, + { + "data-slot": "alert-dialog-description", + className: cn("text-muted-foreground text-sm", className), + ...props + } + ); +} +function AlertDialogAction({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Action, + { + className: cn(buttonVariants(), className), + ...props + } + ); +} +function AlertDialogCancel({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + AlertDialogPrimitive.Cancel, + { + className: cn(buttonVariants({ variant: "outline" }), className), + ...props + } + ); +} + +export { + AlertDialog, + AlertDialogTrigger, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel +}; +//# sourceMappingURL=chunk-DAQXDCVF.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs.map new file mode 100644 index 00000000..5c72c16a --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DAQXDCVF.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/alert-dialog.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\nimport { buttonVariants } from \"@repo/design-system/components/ui/button\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n"],"mappings":";;;;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,eAAe,4BAA4B;AAKpD,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAA2D;AACzD,SAAO,oCAAC,qBAAqB,MAArB,EAA0B,aAAU,gBAAgB,GAAG,OAAO;AACxE;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAA8D;AAC5D,SACE,oCAAC,qBAAqB,SAArB,EAA6B,aAAU,wBAAwB,GAAG,OAAO;AAE9E;AAEA,SAAS,kBAAkB;AAAA,EACzB,GAAG;AACL,GAA6D;AAC3D,SACE,oCAAC,qBAAqB,QAArB,EAA4B,aAAU,uBAAuB,GAAG,OAAO;AAE5E;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,SACE,oCAAC,yBACC,oCAAC,wBAAmB,GACpB;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,CACF;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,gDAAgD,SAAS;AAAA,MACtE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAC/C,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAAkE;AAChE,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,WAAW,GAAG,eAAe,GAAG,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,WAAW,GAAG,eAAe,EAAE,SAAS,UAAU,CAAC,GAAG,SAAS;AAAA,MAC9D,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs b/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs new file mode 100644 index 00000000..3b400655 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs @@ -0,0 +1,27 @@ +import React from "react"; +// components/ui/section-header.tsx +import { ChevronDownIcon, ChevronRightIcon } from "lucide-react"; +function SectionHeader({ + title, + children, + isOpen, + onToggle +}) { + const showToggle = onToggle !== void 0 && isOpen !== void 0; + return /* @__PURE__ */ React.createElement("div", { className: "flex h-12 items-center gap-2 border-b py-2" }, showToggle ? /* @__PURE__ */ React.createElement( + "button", + { + "aria-expanded": isOpen, + className: "flex shrink-0 items-center gap-2", + onClick: onToggle, + type: "button" + }, + /* @__PURE__ */ React.createElement("span", { className: "font-semibold text-lg" }, title), + isOpen ? /* @__PURE__ */ React.createElement(ChevronDownIcon, { className: "h-4 w-4" }) : /* @__PURE__ */ React.createElement(ChevronRightIcon, { className: "h-4 w-4" }) + ) : /* @__PURE__ */ React.createElement("span", { className: "shrink-0 font-semibold text-lg" }, title), /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }), children ? /* @__PURE__ */ React.createElement("div", { className: "flex shrink-0 items-center gap-2" }, children) : null); +} + +export { + SectionHeader +}; +//# sourceMappingURL=chunk-DPPRFUOX.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs.map new file mode 100644 index 00000000..266ce498 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DPPRFUOX.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/section-header.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronDownIcon, ChevronRightIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\ntype SectionHeaderProps = {\n title: string;\n children?: ReactNode;\n isOpen?: boolean;\n onToggle?: () => void;\n};\n\nexport function SectionHeader({\n title,\n children,\n isOpen,\n onToggle,\n}: Readonly) {\n const showToggle = onToggle !== undefined && isOpen !== undefined;\n\n return (\n
\n {showToggle ? (\n \n {title}\n {isOpen ? (\n \n ) : (\n \n )}\n \n ) : (\n {title}\n )}\n
\n {children ? (\n
{children}
\n ) : null}\n
\n );\n}\n"],"mappings":";AAEA,SAAS,iBAAiB,wBAAwB;AAU3C,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,aAAa,aAAa,UAAa,WAAW;AAExD,SACE,oCAAC,SAAI,WAAU,gDACZ,aACC;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,WAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAK;AAAA;AAAA,IAEL,oCAAC,UAAK,WAAU,2BAAyB,KAAM;AAAA,IAC9C,SACC,oCAAC,mBAAgB,WAAU,WAAU,IAErC,oCAAC,oBAAiB,WAAU,WAAU;AAAA,EAE1C,IAEA,oCAAC,UAAK,WAAU,oCAAkC,KAAM,GAE1D,oCAAC,SAAI,WAAU,kBAAiB,GAC/B,WACC,oCAAC,SAAI,WAAU,sCAAoC,QAAS,IAC1D,IACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs b/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs new file mode 100644 index 00000000..45c947cf --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs @@ -0,0 +1,71 @@ +import React from "react"; +import { + Graph +} from "./chunk-XDM556TG.mjs"; +import { + Section +} from "./chunk-ZF7NKEIL.mjs"; + +// components/ui/composites/agent-collaboration-network.tsx +function AgentCollaborationNetwork({ + data, + edges +}) { + return /* @__PURE__ */ React.createElement( + Section, + { + contentClassName: "space-y-4", + description: "Directed workflow handoffs between agent types, with weighted edges and relative node volume.", + title: "Agent collaboration network" + }, + /* @__PURE__ */ React.createElement( + Graph, + { + ariaLabel: "Agent collaboration graph", + edgeLegendLabel: "A runs before B", + getLinkDescription: (link, source, target) => `${source.label ?? source.id} runs before ${target.label ?? target.id} ${link.weight} times.`, + getLinkRows: (link, source, target) => [ + { label: "Sequential pairs", value: `${link.weight}x` }, + { + label: `Share of ${source.label ?? source.id}`, + value: source.value > 0 ? `${(link.weight / source.value * 100).toFixed(1)}%` : "\u2014" + }, + { + label: `Share of ${target.label ?? target.id}`, + value: target.value > 0 ? `${(link.weight / target.value * 100).toFixed(1)}%` : "\u2014" + } + ], + getNodeDescription: (node) => `${node.label ?? node.id} appears in ${node.value} runs across the observed workflow graph.`, + getNodeRows: (node) => { + const item = data.find((entry) => entry.subagentType === node.id); + return [ + { label: "Runs", value: node.value.toLocaleString() }, + { + label: "Sessions", + value: (item?.sessions ?? 0).toLocaleString() + }, + { + label: "Success rate", + value: item ? `${item.successRate.toFixed(0)}%` : "\u2014" + } + ]; + }, + legendLabel: "Legend", + links: edges.map((edge) => ({ + ...edge, + label: `${edge.weight}x` + })), + nodes: data.map((item) => ({ + id: item.subagentType, + label: item.subagentType, + value: item.total + })) + } + ) + ); +} + +export { + AgentCollaborationNetwork +}; +//# sourceMappingURL=chunk-DSMJEATE.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs.map new file mode 100644 index 00000000..5c243aff --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DSMJEATE.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/composites/agent-collaboration-network.tsx"],"sourcesContent":["import { Section } from \"../layout/section\";\nimport { Graph } from \"../primitives/graph\";\nimport type { WorkflowEffectivenessItem } from \"../types\";\n\ntype AgentCollaborationNetworkProps = {\n data: WorkflowEffectivenessItem[];\n edges: Array<{ source: string; target: string; weight: number }>;\n};\n\nexport function AgentCollaborationNetwork({\n data,\n edges,\n}: AgentCollaborationNetworkProps) {\n return (\n \n \n `${source.label ?? source.id} runs before ${target.label ?? target.id} ${link.weight} times.`\n }\n getLinkRows={(link, source, target) => [\n { label: \"Sequential pairs\", value: `${link.weight}x` },\n {\n label: `Share of ${source.label ?? source.id}`,\n value:\n source.value > 0\n ? `${((link.weight / source.value) * 100).toFixed(1)}%`\n : \"—\",\n },\n {\n label: `Share of ${target.label ?? target.id}`,\n value:\n target.value > 0\n ? `${((link.weight / target.value) * 100).toFixed(1)}%`\n : \"—\",\n },\n ]}\n getNodeDescription={(node) =>\n `${node.label ?? node.id} appears in ${node.value} runs across the observed workflow graph.`\n }\n getNodeRows={(node) => {\n const item = data.find((entry) => entry.subagentType === node.id);\n return [\n { label: \"Runs\", value: node.value.toLocaleString() },\n {\n label: \"Sessions\",\n value: (item?.sessions ?? 0).toLocaleString(),\n },\n {\n label: \"Success rate\",\n value: item ? `${item.successRate.toFixed(0)}%` : \"—\",\n },\n ];\n }}\n legendLabel=\"Legend\"\n links={edges.map((edge) => ({\n ...edge,\n label: `${edge.weight}x`,\n }))}\n nodes={data.map((item) => ({\n id: item.subagentType,\n label: item.subagentType,\n value: item.total,\n }))}\n />\n \n );\n}\n"],"mappings":";;;;;;;;AASO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAAmC;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,kBAAiB;AAAA,MACjB,aAAY;AAAA,MACZ,OAAM;AAAA;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,iBAAgB;AAAA,QAChB,oBAAoB,CAAC,MAAM,QAAQ,WACjC,GAAG,OAAO,SAAS,OAAO,EAAE,gBAAgB,OAAO,SAAS,OAAO,EAAE,IAAI,KAAK,MAAM;AAAA,QAEtF,aAAa,CAAC,MAAM,QAAQ,WAAW;AAAA,UACrC,EAAE,OAAO,oBAAoB,OAAO,GAAG,KAAK,MAAM,IAAI;AAAA,UACtD;AAAA,YACE,OAAO,YAAY,OAAO,SAAS,OAAO,EAAE;AAAA,YAC5C,OACE,OAAO,QAAQ,IACX,IAAK,KAAK,SAAS,OAAO,QAAS,KAAK,QAAQ,CAAC,CAAC,MAClD;AAAA,UACR;AAAA,UACA;AAAA,YACE,OAAO,YAAY,OAAO,SAAS,OAAO,EAAE;AAAA,YAC5C,OACE,OAAO,QAAQ,IACX,IAAK,KAAK,SAAS,OAAO,QAAS,KAAK,QAAQ,CAAC,CAAC,MAClD;AAAA,UACR;AAAA,QACF;AAAA,QACA,oBAAoB,CAAC,SACnB,GAAG,KAAK,SAAS,KAAK,EAAE,eAAe,KAAK,KAAK;AAAA,QAEnD,aAAa,CAAC,SAAS;AACrB,gBAAM,OAAO,KAAK,KAAK,CAAC,UAAU,MAAM,iBAAiB,KAAK,EAAE;AAChE,iBAAO;AAAA,YACL,EAAE,OAAO,QAAQ,OAAO,KAAK,MAAM,eAAe,EAAE;AAAA,YACpD;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,MAAM,YAAY,GAAG,eAAe;AAAA,YAC9C;AAAA,YACA;AAAA,cACE,OAAO;AAAA,cACP,OAAO,OAAO,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,MAAM;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAAA,QACA,aAAY;AAAA,QACZ,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAC1B,GAAG;AAAA,UACH,OAAO,GAAG,KAAK,MAAM;AAAA,QACvB,EAAE;AAAA,QACF,OAAO,KAAK,IAAI,CAAC,UAAU;AAAA,UACzB,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,OAAO,KAAK;AAAA,QACd,EAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs b/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs new file mode 100644 index 00000000..ee223c2b --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs @@ -0,0 +1,517 @@ +import React from "react"; +import { + TABLE_DATE_PRESET_LABELS, + TableDateFilterField, + TableDatePreset +} from "./chunk-ASHTD3OK.mjs"; +import { + Checkbox +} from "./chunk-SF4RI47G.mjs"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuPortal, + DropdownMenuSeparator, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger +} from "./chunk-M266NC23.mjs"; +import { + Avatar, + AvatarFallback, + AvatarImage +} from "./chunk-ZI7L5RNU.mjs"; +import { + Button +} from "./chunk-TT7DUYOP.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/filter-popover.tsx +import { + CalendarIcon, + CheckIcon, + EyeOffIcon, + ListFilterIcon, + StarIcon, + TagIcon, + UsersIcon +} from "lucide-react"; +import { useMemo, useState } from "react"; +var DEFAULT_LABELS = { + filterButton: "Filter", + filterSearchPlaceholder: "Filter...", + clearAll: "Clear all", + loading: "Loading...", + loadError: "Could not load members", + noTags: "No tags created yet", + addFilter: "Add filter", + assignToMe: "Assigned to me", + hideCompletedItems: "Hide completed items", + favoritesOnly: "My Favorites", + assignee: "Assignee", + status: "Status", + priority: "Priority", + dates: "Dates", + createdDate: "Date Created", + updatedDate: "Updated Date", + tags: "Tags", + unassigned: "Unassigned" +}; +var DEFAULT_DATE_PRESETS = [ + TableDatePreset.Last24h, + TableDatePreset.Last7d, + TableDatePreset.Last30d, + TableDatePreset.Last3m +].map((value) => ({ + value, + label: TABLE_DATE_PRESET_LABELS[value] +})); +function FilterPopover({ controller, viewModel }) { + const [open, setOpen] = useState(false); + const labels = useLabels(viewModel.labels); + return /* @__PURE__ */ React.createElement(DropdownMenu, { onOpenChange: setOpen, open }, /* @__PURE__ */ React.createElement(DropdownMenuTrigger, { asChild: true }, /* @__PURE__ */ React.createElement( + Button, + { + "aria-label": labels.filterButton, + className: "h-8 shadow-none", + size: "sm", + variant: "outline" + }, + /* @__PURE__ */ React.createElement(ListFilterIcon, null), + labels.filterButton + )), /* @__PURE__ */ React.createElement(FilterMenuContent, { controller, viewModel })); +} +function FilterMenuContent({ + controller, + viewModel +}) { + const labels = useLabels(viewModel.labels); + const { + filters, + toggleAssignee, + toggleAssignToMe, + toggleHideCompletedItems, + toggleFavoritesOnly, + toggleStatus, + togglePriority, + setDateFilter, + toggleTag + } = controller; + const assigneeTotal = filters.assigneeIds.length; + const statusTotal = filters.statuses.length; + const priorityTotal = filters.priorities.length; + const datePresetOptions = viewModel.datePresets ?? DEFAULT_DATE_PRESETS; + const tagOptions = viewModel.tagOptions ?? []; + const showTags = viewModel.showTags ?? tagOptions.length > 0; + return /* @__PURE__ */ React.createElement(DropdownMenuContent, { align: "start", className: "w-52" }, /* @__PURE__ */ React.createElement(DropdownMenuGroup, null, !viewModel.hideAssignee && viewModel.currentUser && /* @__PURE__ */ React.createElement( + DropdownMenuItem, + { + onSelect: (event) => { + event.preventDefault(); + toggleAssignToMe(); + } + }, + /* @__PURE__ */ React.createElement(Avatar, { className: "size-5" }, viewModel.currentUser.avatarUrl && /* @__PURE__ */ React.createElement(AvatarImage, { src: viewModel.currentUser.avatarUrl }), /* @__PURE__ */ React.createElement(AvatarFallback, { className: "text-[10px]" }, getInitials(viewModel.currentUser.name))), + /* @__PURE__ */ React.createElement("span", { className: cn(filters.assignToMe && "font-medium") }, labels.assignToMe), + filters.assignToMe && /* @__PURE__ */ React.createElement(CheckIcon, { className: "ml-auto size-4" }) + ), /* @__PURE__ */ React.createElement( + DropdownMenuItem, + { + onSelect: (event) => { + event.preventDefault(); + toggleHideCompletedItems(); + } + }, + /* @__PURE__ */ React.createElement(EyeOffIcon, { className: "size-4" }), + /* @__PURE__ */ React.createElement("span", { className: cn(filters.hideCompletedItems && "font-medium") }, labels.hideCompletedItems), + filters.hideCompletedItems && /* @__PURE__ */ React.createElement(CheckIcon, { className: "ml-auto size-4" }) + ), /* @__PURE__ */ React.createElement( + DropdownMenuItem, + { + onSelect: (event) => { + event.preventDefault(); + toggleFavoritesOnly(); + } + }, + /* @__PURE__ */ React.createElement(StarIcon, { className: "size-4" }), + /* @__PURE__ */ React.createElement("span", { className: cn(filters.favoritesOnly && "font-medium") }, labels.favoritesOnly), + filters.favoritesOnly && /* @__PURE__ */ React.createElement(CheckIcon, { className: "ml-auto size-4" }) + )), /* @__PURE__ */ React.createElement(DropdownMenuSeparator, null), /* @__PURE__ */ React.createElement(DropdownMenuGroup, null, !viewModel.hideAssignee && /* @__PURE__ */ React.createElement( + AssigneeSubmenu, + { + controller, + labels, + viewModel + } + ), /* @__PURE__ */ React.createElement( + OptionsSubmenu, + { + count: statusTotal, + icon: /* @__PURE__ */ React.createElement("span", { className: "inline-flex size-4 items-center justify-center" }, viewModel.statusOptions[0]?.icon), + label: labels.status, + options: viewModel.statusOptions, + searchPlaceholder: labels.filterSearchPlaceholder, + selectedValues: filters.statuses, + submenuClassName: "w-60", + onToggle: toggleStatus + } + ), /* @__PURE__ */ React.createElement( + OptionsSubmenu, + { + count: priorityTotal, + icon: /* @__PURE__ */ React.createElement("span", { className: "inline-flex size-4 items-center justify-center" }, viewModel.priorityOptions[0]?.icon), + label: labels.priority, + options: viewModel.priorityOptions, + searchPlaceholder: labels.filterSearchPlaceholder, + selectedValues: filters.priorities, + submenuClassName: "w-56", + onToggle: togglePriority + } + ), /* @__PURE__ */ React.createElement( + DatesSubmenu, + { + controller, + datePresetOptions, + labels + } + ), showTags && /* @__PURE__ */ React.createElement( + TagsSubmenu, + { + labels, + options: tagOptions, + selectedTagIds: filters.tagIds, + toggleTag + } + ))); +} +function AssigneeFilterContent({ + controller, + viewModel +}) { + const labels = useLabels(viewModel.labels); + const [search, setSearch] = useState(""); + const filteredMembers = viewModel.teamMembers.filter( + (member) => (member.searchText ?? member.label).toLowerCase().includes(search.toLowerCase()) + ); + return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement( + SubMenuSearch, + { + onChange: setSearch, + placeholder: labels.filterSearchPlaceholder, + value: search + } + ), viewModel.teamMembersLoading && /* @__PURE__ */ React.createElement("div", { className: "p-4 text-center text-muted-foreground text-sm" }, labels.loading), viewModel.teamMembersError && /* @__PURE__ */ React.createElement("div", { className: "p-4 text-center text-muted-foreground text-sm" }, labels.loadError), !(viewModel.teamMembersLoading || viewModel.teamMembersError) && filteredMembers.map((member) => { + const checked = controller.filters.assigneeIds.includes(member.id); + return /* @__PURE__ */ React.createElement( + FilterRow, + { + checked, + key: member.id, + onToggle: () => controller.toggleAssignee(member.id) + }, + /* @__PURE__ */ React.createElement(OptionLeadingVisual, { option: member }), + /* @__PURE__ */ React.createElement( + "span", + { + className: cn( + "min-w-0 flex-1 truncate", + checked && "font-medium" + ) + }, + member.label + ), + /* @__PURE__ */ React.createElement(OptionCount, { count: member.count }) + ); + })); +} +function StatusFilterContent({ + controller, + viewModel +}) { + return /* @__PURE__ */ React.createElement( + OptionsFilterContent, + { + options: viewModel.statusOptions, + searchPlaceholder: useLabels(viewModel.labels).filterSearchPlaceholder, + selectedValues: controller.filters.statuses, + onToggle: controller.toggleStatus + } + ); +} +function PriorityFilterContent({ + controller, + viewModel +}) { + return /* @__PURE__ */ React.createElement( + OptionsFilterContent, + { + options: viewModel.priorityOptions, + searchPlaceholder: useLabels(viewModel.labels).filterSearchPlaceholder, + selectedValues: controller.filters.priorities, + onToggle: controller.togglePriority + } + ); +} +function DateFilterContent({ + controller, + field = TableDateFilterField.CreatedAt, + datePresetOptions +}) { + const currentPreset = controller.filters.date?.field === field ? controller.filters.date.preset : null; + const presets = datePresetOptions ?? DEFAULT_DATE_PRESETS; + return /* @__PURE__ */ React.createElement(React.Fragment, null, presets.map((preset) => { + const selected = currentPreset === preset.value; + return /* @__PURE__ */ React.createElement( + DropdownMenuItem, + { + key: preset.value, + onSelect: () => { + if (currentPreset === preset.value) { + controller.setDateFilter(null); + return; + } + controller.setDateFilter({ + field, + preset: preset.value + }); + } + }, + /* @__PURE__ */ React.createElement("span", { className: cn("flex-1", selected && "font-medium") }, preset.label), + selected && /* @__PURE__ */ React.createElement(CheckIcon, { className: "ml-auto size-4" }) + ); + })); +} +function TagsFilterContent({ + controller, + viewModel +}) { + const labels = useLabels(viewModel.labels); + const tagOptions = viewModel.tagOptions ?? []; + if (tagOptions.length === 0) { + return /* @__PURE__ */ React.createElement(DropdownMenuItem, { disabled: true }, labels.noTags); + } + return /* @__PURE__ */ React.createElement(React.Fragment, null, tagOptions.map((tag) => /* @__PURE__ */ React.createElement( + FilterRow, + { + checked: controller.filters.tagIds.includes(tag.id), + key: tag.id, + onToggle: () => controller.toggleTag(tag.id) + }, + /* @__PURE__ */ React.createElement(TagVisual, { option: tag }), + /* @__PURE__ */ React.createElement("span", { className: "min-w-0 flex-1 truncate" }, tag.label), + /* @__PURE__ */ React.createElement(OptionCount, { count: tag.count }) + ))); +} +function OptionsSubmenu({ + count, + icon, + label, + options, + searchPlaceholder, + selectedValues, + submenuClassName, + onToggle +}) { + return /* @__PURE__ */ React.createElement(DropdownMenuSub, null, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, icon, /* @__PURE__ */ React.createElement("span", { className: "flex-1" }, label), count > 0 && /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-xs" }, count)), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, { className: submenuClassName }, /* @__PURE__ */ React.createElement( + OptionsFilterContent, + { + options, + searchPlaceholder, + selectedValues, + onToggle + } + )))); +} +function OptionsFilterContent({ + options, + searchPlaceholder, + selectedValues, + onToggle +}) { + const [search, setSearch] = useState(""); + const filteredOptions = options.filter( + (option) => (option.searchText ?? option.label).toLowerCase().includes(search.toLowerCase()) + ); + return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement( + SubMenuSearch, + { + onChange: setSearch, + placeholder: searchPlaceholder, + value: search + } + ), filteredOptions.map((option) => { + const checked = selectedValues.includes(option.id); + return /* @__PURE__ */ React.createElement( + FilterRow, + { + checked, + key: option.id, + onToggle: () => onToggle(option.id) + }, + /* @__PURE__ */ React.createElement(OptionLeadingVisual, { option }), + /* @__PURE__ */ React.createElement("span", { className: cn("min-w-0 flex-1 truncate", checked && "font-medium") }, option.label), + /* @__PURE__ */ React.createElement(OptionCount, { count: option.count }) + ); + })); +} +function AssigneeSubmenu({ + controller, + viewModel, + labels +}) { + return /* @__PURE__ */ React.createElement(DropdownMenuSub, null, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, /* @__PURE__ */ React.createElement(UsersIcon, { className: "size-4" }), /* @__PURE__ */ React.createElement("span", { className: "flex-1" }, labels.assignee), controller.filters.assigneeIds.length > 0 && /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-xs" }, controller.filters.assigneeIds.length)), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, { className: "w-64" }, /* @__PURE__ */ React.createElement(AssigneeFilterContent, { controller, viewModel })))); +} +function DatesSubmenu({ + controller, + datePresetOptions, + labels +}) { + return /* @__PURE__ */ React.createElement(DropdownMenuSub, null, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, /* @__PURE__ */ React.createElement(CalendarIcon, { className: "size-4" }), /* @__PURE__ */ React.createElement("span", { className: "flex-1" }, labels.dates), controller.filters.date && /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-xs" }, "1")), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, { className: "w-48" }, /* @__PURE__ */ React.createElement( + DateFieldSubmenu, + { + controller, + datePresetOptions, + field: TableDateFilterField.CreatedAt, + label: labels.createdDate + } + ), /* @__PURE__ */ React.createElement( + DateFieldSubmenu, + { + controller, + datePresetOptions, + field: TableDateFilterField.UpdatedAt, + label: labels.updatedDate + } + )))); +} +function DateFieldSubmenu({ + controller, + datePresetOptions, + field, + label +}) { + return /* @__PURE__ */ React.createElement(DropdownMenuSub, null, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, /* @__PURE__ */ React.createElement(CalendarIcon, { className: "size-4" }), /* @__PURE__ */ React.createElement("span", { className: "flex-1" }, label)), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, { className: "w-44" }, /* @__PURE__ */ React.createElement( + DateFilterContent, + { + controller, + datePresetOptions, + field + } + )))); +} +function TagsSubmenu({ + labels, + options, + selectedTagIds, + toggleTag +}) { + return /* @__PURE__ */ React.createElement(DropdownMenuSub, null, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, /* @__PURE__ */ React.createElement(TagIcon, { className: "size-4" }), /* @__PURE__ */ React.createElement("span", { className: "flex-1" }, labels.tags), selectedTagIds.length > 0 && /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-xs" }, selectedTagIds.length)), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, { className: "w-56" }, options.length === 0 ? /* @__PURE__ */ React.createElement(DropdownMenuItem, { disabled: true }, labels.noTags) : options.map((tag) => /* @__PURE__ */ React.createElement( + FilterRow, + { + checked: selectedTagIds.includes(tag.id), + key: tag.id, + onToggle: () => toggleTag(tag.id) + }, + /* @__PURE__ */ React.createElement(TagVisual, { option: tag }), + /* @__PURE__ */ React.createElement("span", { className: "min-w-0 flex-1 truncate" }, tag.label), + /* @__PURE__ */ React.createElement(OptionCount, { count: tag.count }) + ))))); +} +function SubMenuSearch({ + value, + onChange, + placeholder +}) { + return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: "px-2 pt-0.5 pb-1.5" }, /* @__PURE__ */ React.createElement( + "input", + { + className: "h-6 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground", + onChange: (event) => onChange(event.target.value), + onKeyDown: (event) => event.stopPropagation(), + placeholder, + type: "text", + value + } + )), /* @__PURE__ */ React.createElement(DropdownMenuSeparator, { className: "mt-0 mb-1" })); +} +function FilterRow({ + checked, + onToggle, + children +}) { + return /* @__PURE__ */ React.createElement( + DropdownMenuItem, + { + className: "gap-2", + onSelect: (event) => { + event.preventDefault(); + onToggle(); + } + }, + /* @__PURE__ */ React.createElement( + Checkbox, + { + checked, + className: "[&_svg]:!text-current pointer-events-none" + } + ), + children + ); +} +function OptionLeadingVisual({ option }) { + if (option.avatarUrl) { + return /* @__PURE__ */ React.createElement(Avatar, { className: "size-5" }, /* @__PURE__ */ React.createElement(AvatarImage, { src: option.avatarUrl }), /* @__PURE__ */ React.createElement(AvatarFallback, { className: "text-[10px]" }, getInitials(option.label))); + } + if (option.icon) { + return /* @__PURE__ */ React.createElement("div", { className: "flex size-5 items-center justify-center" }, option.icon); + } + return null; +} +function TagVisual({ option }) { + return /* @__PURE__ */ React.createElement("div", { className: "inline-flex min-w-0 items-center gap-2" }, /* @__PURE__ */ React.createElement( + "span", + { + "aria-hidden": "true", + className: "size-2.5 shrink-0 rounded-full border", + style: { backgroundColor: option.color, borderColor: option.color } + } + )); +} +function OptionCount({ count }) { + if (count === void 0) { + return null; + } + return /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-xs" }, count); +} +function getInitials(name) { + const parts = name.trim().split(/\s+/).filter(Boolean); + if (parts.length === 0) { + return "?"; + } + return parts.slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join(""); +} +function useLabels(labels) { + return useMemo( + () => ({ + ...DEFAULT_LABELS, + ...labels + }), + [labels] + ); +} + +export { + FilterPopover, + FilterMenuContent, + AssigneeFilterContent, + StatusFilterContent, + PriorityFilterContent, + DateFilterContent, + TagsFilterContent +}; +//# sourceMappingURL=chunk-DU44ZW3G.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs.map new file mode 100644 index 00000000..a1839b31 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DU44ZW3G.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/filter-popover.tsx"],"sourcesContent":["\"use client\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@repo/design-system/components/ui/avatar\";\nimport { Button } from \"@repo/design-system/components/ui/button\";\nimport { Checkbox } from \"@repo/design-system/components/ui/checkbox\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@repo/design-system/components/ui/dropdown-menu\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport {\n CalendarIcon,\n CheckIcon,\n EyeOffIcon,\n ListFilterIcon,\n StarIcon,\n TagIcon,\n UserIcon,\n UsersIcon,\n} from \"lucide-react\";\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport {\n TABLE_DATE_PRESET_LABELS,\n TableDateFilterField,\n TableDatePreset,\n type TableFilterLabels,\n type TableFilterDatePresetOption,\n type TableFilterOption,\n type TableFiltersController,\n type TableFiltersViewModel,\n} from \"./table-filters\";\n\ntype FilterPopoverProps = {\n controller: TableFiltersController;\n viewModel: TableFiltersViewModel;\n};\n\nconst DEFAULT_LABELS: Required = {\n filterButton: \"Filter\",\n filterSearchPlaceholder: \"Filter...\",\n clearAll: \"Clear all\",\n loading: \"Loading...\",\n loadError: \"Could not load members\",\n noTags: \"No tags created yet\",\n addFilter: \"Add filter\",\n assignToMe: \"Assigned to me\",\n hideCompletedItems: \"Hide completed items\",\n favoritesOnly: \"My Favorites\",\n assignee: \"Assignee\",\n status: \"Status\",\n priority: \"Priority\",\n dates: \"Dates\",\n createdDate: \"Date Created\",\n updatedDate: \"Updated Date\",\n tags: \"Tags\",\n unassigned: \"Unassigned\",\n};\n\nconst DEFAULT_DATE_PRESETS: TableFilterDatePresetOption[] = [\n TableDatePreset.Last24h,\n TableDatePreset.Last7d,\n TableDatePreset.Last30d,\n TableDatePreset.Last3m,\n].map((value) => ({\n value,\n label: TABLE_DATE_PRESET_LABELS[value],\n}));\n\nexport function FilterPopover({ controller, viewModel }: FilterPopoverProps) {\n const [open, setOpen] = useState(false);\n const labels = useLabels(viewModel.labels);\n\n return (\n \n \n \n \n {labels.filterButton}\n \n \n \n \n );\n}\n\nexport function FilterMenuContent({\n controller,\n viewModel,\n}: FilterPopoverProps) {\n const labels = useLabels(viewModel.labels);\n const {\n filters,\n toggleAssignee,\n toggleAssignToMe,\n toggleHideCompletedItems,\n toggleFavoritesOnly,\n toggleStatus,\n togglePriority,\n setDateFilter,\n toggleTag,\n } = controller;\n\n const assigneeTotal = filters.assigneeIds.length;\n const statusTotal = filters.statuses.length;\n const priorityTotal = filters.priorities.length;\n const datePresetOptions = viewModel.datePresets ?? DEFAULT_DATE_PRESETS;\n const tagOptions = viewModel.tagOptions ?? [];\n const showTags = viewModel.showTags ?? tagOptions.length > 0;\n\n return (\n \n \n {!viewModel.hideAssignee && viewModel.currentUser && (\n {\n event.preventDefault();\n toggleAssignToMe();\n }}\n >\n \n {viewModel.currentUser.avatarUrl && (\n \n )}\n \n {getInitials(viewModel.currentUser.name)}\n \n \n \n {labels.assignToMe}\n \n {filters.assignToMe && }\n \n )}\n {\n event.preventDefault();\n toggleHideCompletedItems();\n }}\n >\n \n \n {labels.hideCompletedItems}\n \n {filters.hideCompletedItems && (\n \n )}\n \n {\n event.preventDefault();\n toggleFavoritesOnly();\n }}\n >\n \n \n {labels.favoritesOnly}\n \n {filters.favoritesOnly && }\n \n \n \n \n {!viewModel.hideAssignee && (\n \n )}\n {viewModel.statusOptions[0]?.icon}}\n label={labels.status}\n options={viewModel.statusOptions}\n searchPlaceholder={labels.filterSearchPlaceholder}\n selectedValues={filters.statuses}\n submenuClassName=\"w-60\"\n onToggle={toggleStatus}\n />\n {viewModel.priorityOptions[0]?.icon}}\n label={labels.priority}\n options={viewModel.priorityOptions}\n searchPlaceholder={labels.filterSearchPlaceholder}\n selectedValues={filters.priorities}\n submenuClassName=\"w-56\"\n onToggle={togglePriority}\n />\n \n {showTags && (\n \n )}\n \n \n );\n}\n\nexport function AssigneeFilterContent({\n controller,\n viewModel,\n}: FilterPopoverProps) {\n const labels = useLabels(viewModel.labels);\n const [search, setSearch] = useState(\"\");\n const filteredMembers = viewModel.teamMembers.filter((member) =>\n (member.searchText ?? member.label)\n .toLowerCase()\n .includes(search.toLowerCase())\n );\n\n return (\n <>\n \n {viewModel.teamMembersLoading && (\n
\n {labels.loading}\n
\n )}\n {viewModel.teamMembersError && (\n
\n {labels.loadError}\n
\n )}\n {!(viewModel.teamMembersLoading || viewModel.teamMembersError) &&\n filteredMembers.map((member) => {\n const checked = controller.filters.assigneeIds.includes(member.id);\n return (\n controller.toggleAssignee(member.id)}\n >\n \n \n {member.label}\n \n \n \n );\n })}\n \n );\n}\n\nexport function StatusFilterContent({\n controller,\n viewModel,\n}: FilterPopoverProps) {\n return (\n \n );\n}\n\nexport function PriorityFilterContent({\n controller,\n viewModel,\n}: FilterPopoverProps) {\n return (\n \n );\n}\n\nexport function DateFilterContent({\n controller,\n field = TableDateFilterField.CreatedAt,\n datePresetOptions,\n}: {\n controller: TableFiltersController;\n field?: TableDateFilterField;\n datePresetOptions?: TableFilterDatePresetOption[];\n}) {\n const currentPreset =\n controller.filters.date?.field === field ? controller.filters.date.preset : null;\n const presets = datePresetOptions ?? DEFAULT_DATE_PRESETS;\n\n return (\n <>\n {presets.map((preset) => {\n const selected = currentPreset === preset.value;\n return (\n {\n if (currentPreset === preset.value) {\n controller.setDateFilter(null);\n return;\n }\n controller.setDateFilter({\n field,\n preset: preset.value,\n });\n }}\n >\n \n {preset.label}\n \n {selected && }\n \n );\n })}\n \n );\n}\n\nexport function TagsFilterContent({\n controller,\n viewModel,\n}: FilterPopoverProps) {\n const labels = useLabels(viewModel.labels);\n const tagOptions = viewModel.tagOptions ?? [];\n\n if (tagOptions.length === 0) {\n return {labels.noTags};\n }\n\n return (\n <>\n {tagOptions.map((tag) => (\n controller.toggleTag(tag.id)}\n >\n \n {tag.label}\n \n \n ))}\n \n );\n}\n\nfunction OptionsSubmenu({\n count,\n icon,\n label,\n options,\n searchPlaceholder,\n selectedValues,\n submenuClassName,\n onToggle,\n}: {\n count: number;\n icon?: ReactNode;\n label: string;\n options: TableFilterOption[];\n searchPlaceholder: string;\n selectedValues: TValue[];\n submenuClassName: string;\n onToggle: (value: TValue) => void;\n}) {\n return (\n \n \n {icon}\n {label}\n {count > 0 && (\n {count}\n )}\n \n \n \n \n \n \n \n );\n}\n\nfunction OptionsFilterContent({\n options,\n searchPlaceholder,\n selectedValues,\n onToggle,\n}: {\n options: TableFilterOption[];\n searchPlaceholder: string;\n selectedValues: TValue[];\n onToggle: (value: TValue) => void;\n}) {\n const [search, setSearch] = useState(\"\");\n const filteredOptions = options.filter((option) =>\n (option.searchText ?? option.label).toLowerCase().includes(search.toLowerCase())\n );\n\n return (\n <>\n \n {filteredOptions.map((option) => {\n const checked = selectedValues.includes(option.id);\n return (\n onToggle(option.id)}\n >\n \n \n {option.label}\n \n \n \n );\n })}\n \n );\n}\n\nfunction AssigneeSubmenu({\n controller,\n viewModel,\n labels,\n}: FilterPopoverProps & { labels: Required }) {\n return (\n \n \n \n {labels.assignee}\n {controller.filters.assigneeIds.length > 0 && (\n \n {controller.filters.assigneeIds.length}\n \n )}\n \n \n \n \n \n \n \n );\n}\n\nfunction DatesSubmenu({\n controller,\n datePresetOptions,\n labels,\n}: {\n controller: TableFiltersController;\n datePresetOptions: TableFilterDatePresetOption[];\n labels: Required;\n}) {\n return (\n \n \n \n {labels.dates}\n {controller.filters.date && (\n 1\n )}\n \n \n \n \n \n \n \n \n );\n}\n\nfunction DateFieldSubmenu({\n controller,\n datePresetOptions,\n field,\n label,\n}: {\n controller: TableFiltersController;\n datePresetOptions: TableFilterDatePresetOption[];\n field: TableDateFilterField;\n label: string;\n}) {\n return (\n \n \n \n {label}\n \n \n \n \n \n \n \n );\n}\n\nfunction TagsSubmenu({\n labels,\n options,\n selectedTagIds,\n toggleTag,\n}: {\n labels: Required;\n options: TableFilterOption[];\n selectedTagIds: string[];\n toggleTag: (tagId: string) => void;\n}) {\n return (\n \n \n \n {labels.tags}\n {selectedTagIds.length > 0 && (\n \n {selectedTagIds.length}\n \n )}\n \n \n \n {options.length === 0 ? (\n {labels.noTags}\n ) : (\n options.map((tag) => (\n toggleTag(tag.id)}\n >\n \n {tag.label}\n \n \n ))\n )}\n \n \n \n );\n}\n\nfunction SubMenuSearch({\n value,\n onChange,\n placeholder,\n}: {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n}) {\n return (\n <>\n
\n onChange(event.target.value)}\n onKeyDown={(event) => event.stopPropagation()}\n placeholder={placeholder}\n type=\"text\"\n value={value}\n />\n
\n \n \n );\n}\n\nfunction FilterRow({\n checked,\n onToggle,\n children,\n}: {\n checked: boolean;\n onToggle: () => void;\n children: ReactNode;\n}) {\n return (\n {\n event.preventDefault();\n onToggle();\n }}\n >\n \n {children}\n \n );\n}\n\nfunction OptionLeadingVisual({ option }: { option: TableFilterOption }) {\n if (option.avatarUrl) {\n return (\n \n \n \n {getInitials(option.label)}\n \n \n );\n }\n\n if (option.icon) {\n return
{option.icon}
;\n }\n\n return null;\n}\n\nfunction TagVisual({ option }: { option: TableFilterOption }) {\n return (\n
\n \n
\n );\n}\n\nfunction OptionCount({ count }: { count?: number }) {\n if (count === undefined) {\n return null;\n }\n\n return {count};\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {\n return \"?\";\n }\n return parts\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\nfunction useLabels(labels?: TableFilterLabels): Required {\n return useMemo(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs b/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs new file mode 100644 index 00000000..9d17ab11 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs @@ -0,0 +1,149 @@ +import React from "react"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/comment-thread.tsx +import { ChevronDown } from "lucide-react"; +function CommentThreadCard({ + children, + className, + interactive = false, + onClick, + onKeyDown, + selected = false, + tabIndex, + testId, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "relative min-w-0 overflow-hidden rounded-lg border border-border", + interactive && (selected ? "bg-accent transition-colors" : "transition-colors hover:bg-accent/50"), + className + ), + "data-testid": testId, + onClick, + onKeyDown, + tabIndex, + ...props + }, + children + ); +} +function CommentThreadMain({ + actions, + avatar, + className, + content +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "flex w-full min-w-0 items-start gap-2 px-3 py-3 sm:gap-3 sm:px-4 sm:py-4", + className + ) + }, + avatar, + /* @__PURE__ */ React.createElement("div", { className: "flex w-0 flex-1 flex-col gap-2" }, content), + actions + ); +} +function CommentThreadHeader({ + author, + className, + metadata +}) { + return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-wrap items-center gap-2", className) }, author, metadata); +} +function CommentThreadReplies({ + children, + className, + label, + showDivider = false +}) { + return /* @__PURE__ */ React.createElement(React.Fragment, null, label ? /* @__PURE__ */ React.createElement("div", { className: "mx-4 flex items-center gap-3" }, /* @__PURE__ */ React.createElement("div", { className: "h-px flex-1 bg-border" }), /* @__PURE__ */ React.createElement("span", { className: "font-medium text-muted-foreground text-xs" }, label), /* @__PURE__ */ React.createElement("div", { className: "h-px flex-1 bg-border" })) : null, /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + showDivider ? "space-y-3 border-border border-t bg-muted/20 px-3 py-3 sm:px-4" : "space-y-3 border-muted border-l-2 bg-muted/20 px-3 py-3 pb-4 pl-8 sm:px-4 sm:pl-12", + className + ) + }, + children + )); +} +function CommentThreadReplyRow({ + actions, + avatar, + body, + header +}) { + return /* @__PURE__ */ React.createElement("div", { className: "flex items-start gap-2.5" }, avatar, /* @__PURE__ */ React.createElement("div", { className: "flex min-w-0 flex-1 flex-col gap-1" }, header, body), actions); +} +function CommentThreadBanner({ + children, + className +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "flex items-center justify-end border-b bg-muted/40 px-3 py-1", + className + ) + }, + children + ); +} +function CommentThreadAnchorPreview({ + children, + className +}) { + return /* @__PURE__ */ React.createElement( + "blockquote", + { + className: cn( + "whitespace-pre-wrap border-b bg-muted/40 px-3 py-2 text-muted-foreground text-xs italic", + className + ) + }, + children + ); +} +function CommentThreadCollapseFooter({ + className, + label, + onClick, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "button", + { + className: cn( + "flex w-full items-center justify-center gap-1.5 border-border border-t bg-muted/10 py-1.5 text-muted-foreground text-xs transition-colors hover:text-foreground", + className + ), + onClick, + type: "button", + ...props + }, + /* @__PURE__ */ React.createElement(ChevronDown, { className: "h-3.5 w-3.5 rotate-180" }), + label + ); +} + +export { + CommentThreadCard, + CommentThreadMain, + CommentThreadHeader, + CommentThreadReplies, + CommentThreadReplyRow, + CommentThreadBanner, + CommentThreadAnchorPreview, + CommentThreadCollapseFooter +}; +//# sourceMappingURL=chunk-DVNSQRIQ.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs.map new file mode 100644 index 00000000..986d7699 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-DVNSQRIQ.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/comment-thread.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport { ChevronDown } from \"lucide-react\";\nimport type {\n ComponentPropsWithoutRef,\n KeyboardEventHandler,\n MouseEventHandler,\n ReactNode,\n} from \"react\";\n\ntype CommentThreadCardProps = {\n children: ReactNode;\n className?: string;\n interactive?: boolean;\n selected?: boolean;\n onClick?: MouseEventHandler;\n onKeyDown?: KeyboardEventHandler;\n tabIndex?: number;\n testId?: string;\n} & Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"children\" | \"className\" | \"onClick\" | \"onKeyDown\" | \"tabIndex\"\n>;\n\nexport function CommentThreadCard({\n children,\n className,\n interactive = false,\n onClick,\n onKeyDown,\n selected = false,\n tabIndex,\n testId,\n ...props\n}: Readonly) {\n return (\n \n {children}\n
\n );\n}\n\ntype CommentThreadMainProps = {\n avatar: ReactNode;\n content: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport function CommentThreadMain({\n actions,\n avatar,\n className,\n content,\n}: Readonly) {\n return (\n \n {avatar}\n
{content}
\n {actions}\n
\n );\n}\n\ntype CommentThreadHeaderProps = {\n author: ReactNode;\n metadata?: ReactNode;\n className?: string;\n};\n\nexport function CommentThreadHeader({\n author,\n className,\n metadata,\n}: Readonly) {\n return (\n
\n {author}\n {metadata}\n
\n );\n}\n\ntype CommentThreadRepliesProps = {\n children: ReactNode;\n className?: string;\n label?: ReactNode;\n showDivider?: boolean;\n};\n\nexport function CommentThreadReplies({\n children,\n className,\n label,\n showDivider = false,\n}: Readonly) {\n return (\n <>\n {label ? (\n
\n
\n \n {label}\n \n
\n
\n ) : null}\n \n {children}\n
\n \n );\n}\n\ntype CommentThreadReplyRowProps = {\n avatar: ReactNode;\n header: ReactNode;\n body: ReactNode;\n actions?: ReactNode;\n};\n\nexport function CommentThreadReplyRow({\n actions,\n avatar,\n body,\n header,\n}: Readonly) {\n return (\n
\n {avatar}\n
\n {header}\n {body}\n
\n {actions}\n
\n );\n}\n\ntype CommentThreadBannerProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function CommentThreadBanner({\n children,\n className,\n}: Readonly) {\n return (\n \n {children}\n
\n );\n}\n\ntype CommentThreadAnchorPreviewProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport function CommentThreadAnchorPreview({\n children,\n className,\n}: Readonly) {\n return (\n \n {children}\n \n );\n}\n\ntype CommentThreadCollapseFooterProps = {\n label: string;\n onClick: MouseEventHandler;\n} & Omit, \"onClick\" | \"children\" | \"type\">;\n\nexport function CommentThreadCollapseFooter({\n className,\n label,\n onClick,\n ...props\n}: Readonly) {\n return (\n \n \n {label}\n \n );\n}\n"],"mappings":";;;;;AAGA,SAAS,mBAAmB;AAsBrB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqC;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,gBACG,WACG,gCACA;AAAA,QACN;AAAA,MACF;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,EACH;AAEJ;AASO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqC;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,IACD,oCAAC,SAAI,WAAU,oCAAkC,OAAQ;AAAA,IACxD;AAAA,EACH;AAEJ;AAQO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,SACE,oCAAC,SAAI,WAAW,GAAG,qCAAqC,SAAS,KAC9D,QACA,QACH;AAEJ;AASO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAwC;AACtC,SACE,0DACG,QACC,oCAAC,SAAI,WAAU,kCACb,oCAAC,SAAI,WAAU,yBAAwB,GACvC,oCAAC,UAAK,WAAU,+CACb,KACH,GACA,oCAAC,SAAI,WAAU,yBAAwB,CACzC,IACE,MACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,cACI,mEACA;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH,CACF;AAEJ;AASO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,SACE,oCAAC,SAAI,WAAU,8BACZ,QACD,oCAAC,SAAI,WAAU,wCACZ,QACA,IACH,GACC,OACH;AAEJ;AAOO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAAuC;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAOO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAA8C;AAC5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAOO,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+C;AAC7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA,MAAK;AAAA,MACJ,GAAG;AAAA;AAAA,IAEJ,oCAAC,eAAY,WAAU,0BAAyB;AAAA,IAC/C;AAAA,EACH;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs b/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs new file mode 100644 index 00000000..894fc9a1 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs @@ -0,0 +1,139 @@ +import React from "react"; +import { + ScrollArea +} from "./chunk-4VG3CUB2.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/layout/kanban-board.tsx +import { Children } from "react"; +function KanbanBoardLayout({ + children, + className, + contentClassName, + style +}) { + return /* @__PURE__ */ React.createElement( + ScrollArea, + { + className: cn("min-h-0 shrink-0", className), + scrollbars: "horizontal", + style, + type: "always" + }, + /* @__PURE__ */ React.createElement( + "div", + { + className: cn("flex min-w-max gap-3 px-4 pb-4", contentClassName), + style + }, + children + ) + ); +} +function KanbanColumnLayout({ + header, + children, + emptyState, + footer, + className, + bodyClassName +}) { + const hasChildren = Children.count(children) > 0; + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "flex min-h-0 w-[280px] shrink-0 flex-col overflow-hidden rounded-xl border bg-card/95 shadow-sm", + className + ) + }, + /* @__PURE__ */ React.createElement("div", { className: "shrink-0 border-b px-3 py-3" }, header), + /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "min-h-0 flex-1 overflow-y-auto p-1.5", + bodyClassName + ) + }, + hasChildren ? children : emptyState + ), + footer ? /* @__PURE__ */ React.createElement("div", { className: "shrink-0 border-t px-2 py-1.5" }, footer) : null + ); +} +function KanbanColumn({ + title, + count, + icon, + trailing, + children, + emptyState, + footer, + className, + bodyClassName, + headerClassName, + highlighted = false, + highlightedBodyClassName = "bg-accent/20" +}) { + return /* @__PURE__ */ React.createElement( + KanbanColumnLayout, + { + bodyClassName: cn( + "transition-colors", + highlighted && highlightedBodyClassName, + bodyClassName + ), + className, + emptyState, + footer, + header: /* @__PURE__ */ React.createElement( + KanbanColumnHeader, + { + className: headerClassName, + count, + icon, + title, + trailing + } + ) + }, + children + ); +} +function KanbanColumnHeader({ + icon, + title, + count, + trailing, + className +}) { + return /* @__PURE__ */ React.createElement("div", { className: cn("flex items-center gap-2", className) }, icon ? /* @__PURE__ */ React.createElement("span", { className: "shrink-0" }, icon) : null, /* @__PURE__ */ React.createElement("span", { className: "font-medium text-base" }, title), count !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground text-sm" }, count) : null, trailing ? /* @__PURE__ */ React.createElement("div", { className: "ml-auto shrink-0" }, trailing) : null); +} +function KanbanCardFrame({ + children, + className, + active = false +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "rounded-md border bg-card py-2 transition-colors", + active && "border-primary/35 bg-primary/8 ring-1 ring-primary/20", + className + ) + }, + children + ); +} + +export { + KanbanBoardLayout, + KanbanColumnLayout, + KanbanColumn, + KanbanColumnHeader, + KanbanCardFrame +}; +//# sourceMappingURL=chunk-EYIDES2P.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs.map new file mode 100644 index 00000000..537b2af3 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-EYIDES2P.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/layout/kanban-board.tsx"],"sourcesContent":["import { Children, type CSSProperties, type ReactNode } from \"react\";\nimport { ScrollArea } from \"@repo/design-system/components/ui/scroll-area\";\nimport { cn } from \"@repo/design-system/lib/utils\";\n\ntype KanbanBoardLayoutProps = {\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n style?: CSSProperties;\n};\n\nexport function KanbanBoardLayout({\n children,\n className,\n contentClassName,\n style,\n}: KanbanBoardLayoutProps) {\n return (\n \n \n {children}\n
\n \n );\n}\n\ntype KanbanColumnLayoutProps = {\n header: ReactNode;\n children?: ReactNode;\n emptyState?: ReactNode;\n footer?: ReactNode;\n className?: string;\n bodyClassName?: string;\n};\n\nexport function KanbanColumnLayout({\n header,\n children,\n emptyState,\n footer,\n className,\n bodyClassName,\n}: KanbanColumnLayoutProps) {\n const hasChildren = Children.count(children) > 0;\n\n return (\n \n
{header}
\n \n {hasChildren ? children : emptyState}\n
\n {footer ?
{footer}
: null}\n
\n );\n}\n\ntype KanbanColumnProps = {\n title: string;\n count?: number;\n icon?: ReactNode;\n trailing?: ReactNode;\n children?: ReactNode;\n emptyState?: ReactNode;\n footer?: ReactNode;\n className?: string;\n bodyClassName?: string;\n headerClassName?: string;\n highlighted?: boolean;\n highlightedBodyClassName?: string;\n};\n\nexport function KanbanColumn({\n title,\n count,\n icon,\n trailing,\n children,\n emptyState,\n footer,\n className,\n bodyClassName,\n headerClassName,\n highlighted = false,\n highlightedBodyClassName = \"bg-accent/20\",\n}: KanbanColumnProps) {\n return (\n \n }\n >\n {children}\n \n );\n}\n\ntype KanbanColumnHeaderProps = {\n icon?: ReactNode;\n title: string;\n count?: number;\n trailing?: ReactNode;\n className?: string;\n};\n\nexport function KanbanColumnHeader({\n icon,\n title,\n count,\n trailing,\n className,\n}: KanbanColumnHeaderProps) {\n return (\n
\n {icon ? {icon} : null}\n {title}\n {count !== undefined ? (\n {count}\n ) : null}\n {trailing ?
{trailing}
: null}\n
\n );\n}\n\ntype KanbanCardFrameProps = {\n children: ReactNode;\n className?: string;\n active?: boolean;\n};\n\nexport function KanbanCardFrame({\n children,\n className,\n active = false,\n}: KanbanCardFrameProps) {\n return (\n \n {children}\n \n );\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,gBAAoD;AAWtD,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC3C,YAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA;AAAA,IAEL;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,kCAAkC,gBAAgB;AAAA,QAChE;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,EACF;AAEJ;AAWO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,cAAc,SAAS,MAAM,QAAQ,IAAI;AAE/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,SAAI,WAAU,iCAA+B,MAAO;AAAA,IACrD;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEC,cAAc,WAAW;AAAA,IAC5B;AAAA,IACC,SAAS,oCAAC,SAAI,WAAU,mCAAiC,MAAO,IAAS;AAAA,EAC5E;AAEJ;AAiBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,2BAA2B;AAC7B,GAAsB;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAe;AAAA,QACb;AAAA,QACA,eAAe;AAAA,QACf;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,IAGD;AAAA,EACH;AAEJ;AAUO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,SACE,oCAAC,SAAI,WAAW,GAAG,2BAA2B,SAAS,KACpD,OAAO,oCAAC,UAAK,WAAU,cAAY,IAAK,IAAU,MACnD,oCAAC,UAAK,WAAU,2BAAyB,KAAM,GAC9C,UAAU,SACT,oCAAC,UAAK,WAAU,mCAAiC,KAAM,IACrD,MACH,WAAW,oCAAC,SAAI,WAAU,sBAAoB,QAAS,IAAS,IACnE;AAEJ;AAQO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAAyB;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs b/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs new file mode 100644 index 00000000..39660076 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs @@ -0,0 +1,135 @@ +import React from "react"; +import { + Badge +} from "./chunk-3I7NW6GS.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/primitives/status-badge.tsx +var sessionStatusConfig = { + active: { label: "Active", tone: "success", pulse: true }, + waiting: { label: "Waiting", tone: "accent", pulse: true }, + completed: { label: "Completed", tone: "muted" }, + error: { label: "Error", tone: "danger" }, + abandoned: { label: "Abandoned", tone: "warning" } +}; +var agentStatusConfig = { + working: { label: "Working", tone: "success", pulse: true }, + waiting: { label: "Waiting", tone: "accent", pulse: true }, + completed: { label: "Completed", tone: "muted" }, + error: { label: "Error", tone: "danger" }, + idle: { label: "Idle", tone: "default" } +}; +var toneClasses = { + default: "border-input-border bg-input text-foreground", + success: "border-success/25 bg-success/12 text-success", + warning: "border-warning/30 bg-warning/14 text-warning-foreground", + danger: "border-destructive/25 bg-destructive/12 text-destructive", + info: "border-info/25 bg-info/12 text-info", + accent: "border-primary/20 bg-primary/10 text-primary", + muted: "border-border bg-muted/70 text-muted-foreground" +}; +var harnessConfig = { + claude: { label: "Claude", tone: "accent" }, + codex: { label: "Codex", tone: "info" }, + cursor: { label: "Cursor", tone: "warning" }, + copilot: { label: "Copilot", tone: "success" }, + opencode: { label: "OpenCode", tone: "danger" } +}; +function resolveSessionStatusConfig(status) { + if (status in sessionStatusConfig) { + return sessionStatusConfig[status]; + } + if (status === "failed") { + return { label: "Failed", tone: "danger" }; + } + return { + label: status.replace(/[-_]/g, " "), + tone: "danger" + }; +} +function resolveAgentStatusConfig(status) { + if (status in agentStatusConfig) { + return agentStatusConfig[status]; + } + if (status === "failed") { + return { label: "Failed", tone: "danger" }; + } + return { + label: status.replace(/[-_]/g, " "), + tone: "danger" + }; +} +function ToneBadge({ + label, + tone = "default", + pulse = false, + className +}) { + return /* @__PURE__ */ React.createElement( + Badge, + { + className: cn( + "h-6 gap-1.5 rounded-full px-2.5 font-semibold text-[11px] tracking-[0.01em]", + toneClasses[tone], + className + ), + variant: "outline" + }, + /* @__PURE__ */ React.createElement( + "span", + { + "aria-hidden": "true", + className: cn( + "size-1.5 rounded-full bg-current", + pulse && "animate-[pulse_1.6s_ease-in-out_infinite]" + ) + } + ), + label + ); +} +function SessionStatusBadge({ + status +}) { + const config = resolveSessionStatusConfig(status); + return /* @__PURE__ */ React.createElement( + ToneBadge, + { + label: config.label, + pulse: config.pulse, + tone: config.tone + } + ); +} +function AgentStatusBadge({ + status +}) { + const config = resolveAgentStatusConfig(status); + return /* @__PURE__ */ React.createElement( + ToneBadge, + { + label: config.label, + pulse: config.pulse, + tone: config.tone + } + ); +} +function HarnessBadge({ + harness +}) { + const config = harnessConfig[(harness || "claude").toLowerCase()] || { + label: harness || "Claude", + tone: "accent" + }; + return /* @__PURE__ */ React.createElement(ToneBadge, { label: config.label, tone: config.tone }); +} + +export { + ToneBadge, + SessionStatusBadge, + AgentStatusBadge, + HarnessBadge +}; +//# sourceMappingURL=chunk-FQSOQDF7.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs.map new file mode 100644 index 00000000..0c798194 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-FQSOQDF7.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/status-badge.tsx"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@repo/design-system/components/ui/badge\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport type {\n AgentStatus,\n Harness,\n SessionStatus,\n Tone,\n} from \"../types\";\n\nconst sessionStatusConfig: Record<\n SessionStatus,\n { label: string; tone: Tone; pulse?: boolean }\n> = {\n active: { label: \"Active\", tone: \"success\", pulse: true },\n waiting: { label: \"Waiting\", tone: \"accent\", pulse: true },\n completed: { label: \"Completed\", tone: \"muted\" },\n error: { label: \"Error\", tone: \"danger\" },\n abandoned: { label: \"Abandoned\", tone: \"warning\" },\n};\n\nconst agentStatusConfig: Record<\n AgentStatus,\n { label: string; tone: Tone; pulse?: boolean }\n> = {\n working: { label: \"Working\", tone: \"success\", pulse: true },\n waiting: { label: \"Waiting\", tone: \"accent\", pulse: true },\n completed: { label: \"Completed\", tone: \"muted\" },\n error: { label: \"Error\", tone: \"danger\" },\n idle: { label: \"Idle\", tone: \"default\" },\n};\n\nconst toneClasses: Record = {\n default: \"border-input-border bg-input text-foreground\",\n success: \"border-success/25 bg-success/12 text-success\",\n warning: \"border-warning/30 bg-warning/14 text-warning-foreground\",\n danger: \"border-destructive/25 bg-destructive/12 text-destructive\",\n info: \"border-info/25 bg-info/12 text-info\",\n accent: \"border-primary/20 bg-primary/10 text-primary\",\n muted: \"border-border bg-muted/70 text-muted-foreground\",\n};\n\nconst harnessConfig: Record = {\n claude: { label: \"Claude\", tone: \"accent\" },\n codex: { label: \"Codex\", tone: \"info\" },\n cursor: { label: \"Cursor\", tone: \"warning\" },\n copilot: { label: \"Copilot\", tone: \"success\" },\n opencode: { label: \"OpenCode\", tone: \"danger\" },\n};\n\nfunction resolveSessionStatusConfig(\n status: SessionStatus | string\n): { label: string; tone: Tone; pulse?: boolean } {\n if (status in sessionStatusConfig) {\n return sessionStatusConfig[status as SessionStatus];\n }\n\n if (status === \"failed\") {\n return { label: \"Failed\", tone: \"danger\" };\n }\n\n return {\n label: status.replace(/[-_]/g, \" \"),\n tone: \"danger\",\n };\n}\n\nfunction resolveAgentStatusConfig(\n status: AgentStatus | string\n): { label: string; tone: Tone; pulse?: boolean } {\n if (status in agentStatusConfig) {\n return agentStatusConfig[status as AgentStatus];\n }\n\n if (status === \"failed\") {\n return { label: \"Failed\", tone: \"danger\" };\n }\n\n return {\n label: status.replace(/[-_]/g, \" \"),\n tone: \"danger\",\n };\n}\n\ntype ToneBadgeProps = {\n label: string;\n tone?: Tone;\n pulse?: boolean;\n className?: string;\n};\n\nexport function ToneBadge({\n label,\n tone = \"default\",\n pulse = false,\n className,\n}: ToneBadgeProps) {\n return (\n \n \n {label}\n \n );\n}\n\nexport function SessionStatusBadge({\n status,\n}: {\n status: SessionStatus | string;\n}) {\n const config = resolveSessionStatusConfig(status);\n return (\n \n );\n}\n\nexport function AgentStatusBadge({\n status,\n}: {\n status: AgentStatus | string;\n}) {\n const config = resolveAgentStatusConfig(status);\n return (\n \n );\n}\n\nexport function HarnessBadge({\n harness,\n}: {\n harness?: Harness | null;\n}) {\n const config = harnessConfig[(harness || \"claude\").toLowerCase()] || {\n label: harness || \"Claude\",\n tone: \"accent\" as const,\n };\n\n return ;\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs b/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs new file mode 100644 index 00000000..a681d367 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs @@ -0,0 +1,96 @@ +import { + Popover, + PopoverContent, + PopoverTrigger +} from "./chunk-547UMAL4.mjs"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from "./chunk-ST5QOYCX.mjs"; +import { + Avatar, + AvatarFallback, + AvatarImage +} from "./chunk-ZI7L5RNU.mjs"; +import { + Button +} from "./chunk-TT7DUYOP.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/user-select-popover.tsx +import * as React from "react"; +import { UserPlusIcon } from "lucide-react"; +function getInitials(name) { + return name.split(" ").filter((part) => part.length > 0).map((part) => part[0]).join("").toUpperCase().slice(0, 2); +} +function UserSelectPopover({ + value, + onSelect, + users, + placeholder = "Select user...", + iconOnly = false, + trigger, + disabled = false, + className +}) { + const [open, setOpen] = React.useState(false); + const handleSelect = (user) => { + onSelect(user); + setOpen(false); + }; + const handleClear = () => { + onSelect(null); + setOpen(false); + }; + const defaultTrigger = iconOnly ? /* @__PURE__ */ React.createElement( + Button, + { + variant: "ghost", + size: "icon", + className: cn("h-8 w-8 text-muted-foreground hover:text-foreground", className), + disabled + }, + /* @__PURE__ */ React.createElement(UserPlusIcon, { className: "h-4 w-4" }), + /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, placeholder) + ) : /* @__PURE__ */ React.createElement( + Button, + { + variant: "outline", + role: "combobox", + "aria-expanded": open, + className: cn("w-[200px] justify-start", className), + disabled + }, + value ? /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement(Avatar, { className: "h-5 w-5" }, value.avatarUrl && /* @__PURE__ */ React.createElement(AvatarImage, { src: value.avatarUrl, alt: value.name }), /* @__PURE__ */ React.createElement(AvatarFallback, { className: "text-[10px]" }, value.initials || getInitials(value.name))), /* @__PURE__ */ React.createElement("span", { className: "truncate" }, value.name)) : /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground" }, placeholder) + ); + return /* @__PURE__ */ React.createElement(Popover, { open, onOpenChange: setOpen }, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, trigger || defaultTrigger), /* @__PURE__ */ React.createElement(PopoverContent, { className: "w-[250px] p-0", align: "start" }, /* @__PURE__ */ React.createElement(Command, null, /* @__PURE__ */ React.createElement(CommandInput, { placeholder: "Search users..." }), /* @__PURE__ */ React.createElement(CommandList, null, /* @__PURE__ */ React.createElement(CommandEmpty, null, "No users found."), /* @__PURE__ */ React.createElement(CommandGroup, null, value && /* @__PURE__ */ React.createElement( + CommandItem, + { + onSelect: handleClear, + className: "cursor-pointer text-muted-foreground hover:bg-muted hover:text-foreground" + }, + "Clear selection" + ), users.map((user) => /* @__PURE__ */ React.createElement( + CommandItem, + { + key: user.id, + value: `${user.name} ${user.email || ""}`, + onSelect: () => handleSelect(user), + className: "cursor-pointer hover:bg-muted" + }, + /* @__PURE__ */ React.createElement(Avatar, { className: "mr-2 h-6 w-6" }, user.avatarUrl && /* @__PURE__ */ React.createElement(AvatarImage, { src: user.avatarUrl, alt: user.name }), /* @__PURE__ */ React.createElement(AvatarFallback, { className: "text-[10px]" }, user.initials || getInitials(user.name))), + /* @__PURE__ */ React.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React.createElement("span", null, user.name), user.email && /* @__PURE__ */ React.createElement("span", { className: "text-xs text-muted-foreground" }, user.email)) + ))))))); +} + +export { + getInitials, + UserSelectPopover +}; +//# sourceMappingURL=chunk-HGLBRIF4.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs.map new file mode 100644 index 00000000..8e2fc95a --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-HGLBRIF4.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/user-select-popover.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { UserPlusIcon } from \"lucide-react\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport { Button } from \"@repo/design-system/components/ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@repo/design-system/components/ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@repo/design-system/components/ui/command\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@repo/design-system/components/ui/avatar\";\n\nexport interface User {\n id: string;\n name: string;\n email?: string;\n avatarUrl?: string;\n initials?: string;\n}\n\ninterface UserSelectPopoverProps {\n /** Currently selected user */\n value?: User | null;\n /** Callback when user is selected */\n onSelect: (user: User | null) => void;\n /** List of users to choose from */\n users: User[];\n /** Placeholder text when no user is selected */\n placeholder?: string;\n /** Whether to show the trigger as just an icon (for inline use) */\n iconOnly?: boolean;\n /** Trigger element (optional, defaults to add-person icon button) */\n trigger?: React.ReactNode;\n /** Disable the popover */\n disabled?: boolean;\n /** Additional class name for trigger */\n className?: string;\n}\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .filter((part) => part.length > 0)\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n}\n\n/**\n * UserSelectPopover provides a searchable dropdown for selecting a user\n * Can be used inline in tables with icon-only mode\n */\nfunction UserSelectPopover({\n value,\n onSelect,\n users,\n placeholder = \"Select user...\",\n iconOnly = false,\n trigger,\n disabled = false,\n className,\n}: UserSelectPopoverProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleSelect = (user: User) => {\n onSelect(user);\n setOpen(false);\n };\n\n const handleClear = () => {\n onSelect(null);\n setOpen(false);\n };\n\n const defaultTrigger = iconOnly ? (\n \n \n {placeholder}\n \n ) : (\n \n {value ? (\n
\n \n {value.avatarUrl && }\n \n {value.initials || getInitials(value.name)}\n \n \n {value.name}\n
\n ) : (\n {placeholder}\n )}\n \n );\n\n return (\n \n {trigger || defaultTrigger}\n \n \n \n \n No users found.\n \n {value && (\n \n Clear selection\n \n )}\n {users.map((user) => (\n handleSelect(user)}\n className=\"cursor-pointer hover:bg-muted\"\n >\n \n {user.avatarUrl && (\n \n )}\n \n {user.initials || getInitials(user.name)}\n \n \n
\n {user.name}\n {user.email && (\n \n {user.email}\n \n )}\n
\n \n ))}\n
\n
\n
\n
\n
\n );\n}\n\nexport { UserSelectPopover, getInitials };\nexport type { UserSelectPopoverProps };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAoD7B,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,MAAM,GAAG,EACT,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AACf;AAMA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA2B;AACzB,QAAM,CAAC,MAAM,OAAO,IAAU,eAAS,KAAK;AAE5C,QAAM,eAAe,CAAC,SAAe;AACnC,aAAS,IAAI;AACb,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,cAAc,MAAM;AACxB,aAAS,IAAI;AACb,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,iBAAiB,WACrB;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,WAAW,GAAG,uDAAuD,SAAS;AAAA,MAC9E;AAAA;AAAA,IAEA,oCAAC,gBAAa,WAAU,WAAU;AAAA,IAClC,oCAAC,UAAK,WAAU,aAAW,WAAY;AAAA,EACzC,IAEA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,WAAW,GAAG,2BAA2B,SAAS;AAAA,MAClD;AAAA;AAAA,IAEC,QACC,oCAAC,SAAI,WAAU,6BACb,oCAAC,UAAO,WAAU,aACf,MAAM,aAAa,oCAAC,eAAY,KAAK,MAAM,WAAW,KAAK,MAAM,MAAM,GACxE,oCAAC,kBAAe,WAAU,iBACvB,MAAM,YAAY,YAAY,MAAM,IAAI,CAC3C,CACF,GACA,oCAAC,UAAK,WAAU,cAAY,MAAM,IAAK,CACzC,IAEA,oCAAC,UAAK,WAAU,2BAAyB,WAAY;AAAA,EAEzD;AAGF,SACE,oCAAC,WAAQ,MAAY,cAAc,WACjC,oCAAC,kBAAe,SAAO,QAAE,WAAW,cAAe,GACnD,oCAAC,kBAAe,WAAU,iBAAgB,OAAM,WAC9C,oCAAC,eACC,oCAAC,gBAAa,aAAY,mBAAkB,GAC5C,oCAAC,mBACC,oCAAC,oBAAa,iBAAe,GAC7B,oCAAC,oBACE,SACC;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAU;AAAA;AAAA,IACX;AAAA,EAED,GAED,MAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,OAAO,GAAG,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE;AAAA,MACvC,UAAU,MAAM,aAAa,IAAI;AAAA,MACjC,WAAU;AAAA;AAAA,IAEV,oCAAC,UAAO,WAAU,kBACf,KAAK,aACJ,oCAAC,eAAY,KAAK,KAAK,WAAW,KAAK,KAAK,MAAM,GAEpD,oCAAC,kBAAe,WAAU,iBACvB,KAAK,YAAY,YAAY,KAAK,IAAI,CACzC,CACF;AAAA,IACA,oCAAC,SAAI,WAAU,mBACb,oCAAC,cAAM,KAAK,IAAK,GAChB,KAAK,SACJ,oCAAC,UAAK,WAAU,mCACb,KAAK,KACR,CAEJ;AAAA,EACF,CACD,CACH,CACF,CACF,CACF,CACF;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs b/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs new file mode 100644 index 00000000..bd8b7005 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs @@ -0,0 +1,114 @@ +import React from "react"; +import { + AgentStatusBadge +} from "./chunk-FQSOQDF7.mjs"; +import { + formatDateTime +} from "./chunk-UGNO5UUO.mjs"; +import { + Button +} from "./chunk-TT7DUYOP.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/primitives/event-group-row.tsx +import { ChevronRight } from "lucide-react"; +import { useState } from "react"; +function EventGroupRow({ + group, + defaultExpanded = false +}) { + const [expanded, setExpanded] = useState(defaultExpanded); + const first = group.events[0]; + const statuses = group.events.reduce((sequence, event) => { + if (sequence[sequence.length - 1] !== event.status) { + sequence.push(event.status); + } + return sequence; + }, []); + const isMultiEvent = group.events.length > 1; + return /* @__PURE__ */ React.createElement( + "div", + { + className: cn( + "overflow-hidden rounded-xl border border-border/80 bg-card shadow-sm", + isMultiEvent && "border-l-2 border-l-cyan-500/40" + ) + }, + /* @__PURE__ */ React.createElement( + "button", + { + className: cn( + "flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/35", + isMultiEvent && "bg-cyan-500/[0.03] hover:bg-cyan-500/[0.06]" + ), + onClick: () => setExpanded((value) => !value), + type: "button" + }, + /* @__PURE__ */ React.createElement( + ChevronRight, + { + className: cn( + "size-4 shrink-0 text-muted-foreground transition-transform", + expanded && "rotate-90" + ) + } + ), + /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1 space-y-1" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React.createElement("p", { className: "truncate font-medium text-sm" }, group.title), first?.toolName ? /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] text-muted-foreground" }, first.toolName) : null, isMultiEvent ? /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] text-muted-foreground" }, group.events.length, " events") : null), /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground" }, /* @__PURE__ */ React.createElement("span", null, formatDateTime(first.createdAt)), group.durationLabel ? /* @__PURE__ */ React.createElement("span", null, group.durationLabel) : null, first.agentLabel ? /* @__PURE__ */ React.createElement("span", null, first.agentLabel) : null, first.project ? /* @__PURE__ */ React.createElement("span", null, first.project) : null)), + /* @__PURE__ */ React.createElement("div", { className: "flex shrink-0 flex-wrap items-center justify-end gap-1" }, statuses.map((status, index) => /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-1", key: `${status}-${index}` }, index > 0 ? /* @__PURE__ */ React.createElement("span", { className: "text-[10px] text-muted-foreground" }, "\u2192") : null, /* @__PURE__ */ React.createElement(AgentStatusBadge, { status })))) + ), + expanded ? /* @__PURE__ */ React.createElement("div", { className: "border-border/70 border-t bg-muted/15 px-4 py-3" }, isMultiEvent ? /* @__PURE__ */ React.createElement("div", { className: "mb-3 font-medium text-[10px] text-muted-foreground uppercase tracking-[0.12em]" }, group.events.length, " grouped events") : null, /* @__PURE__ */ React.createElement("div", { className: "space-y-3" }, group.events.map((event) => /* @__PURE__ */ React.createElement( + "div", + { + className: "rounded-lg border border-border/70 bg-background/70 p-3", + key: event.id + }, + /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React.createElement(AgentStatusBadge, { status: event.status }), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] text-muted-foreground" }, event.eventType), /* @__PURE__ */ React.createElement("span", { className: "font-medium text-sm" }, event.title), /* @__PURE__ */ React.createElement("span", { className: "ml-auto text-[11px] text-muted-foreground" }, formatDateTime(event.createdAt))), + event.summary ? /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-muted-foreground text-sm" }, event.summary) : null, + event.metadata?.length ? /* @__PURE__ */ React.createElement("div", { className: "mt-3 flex flex-wrap gap-2" }, event.metadata.map((item) => /* @__PURE__ */ React.createElement( + Button, + { + className: "h-auto px-2 py-1 font-normal text-[11px]", + key: `${event.id}-${item.label}`, + variant: "outline" + }, + /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground" }, item.label), + /* @__PURE__ */ React.createElement("span", { className: "font-mono" }, item.value) + ))) : null, + event.detail ? /* @__PURE__ */ React.createElement(EventDetailPanel, { event }) : null + )))) : null + ); +} +function EventDetailPanel({ event }) { + const detail = event.detail; + if (!detail) { + return null; + } + return /* @__PURE__ */ React.createElement("div", { className: "mt-3 space-y-3 rounded-lg border border-border/70 bg-muted/10 p-3" }, detail.summary ? /* @__PURE__ */ React.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React.createElement("p", { className: "font-medium text-sm" }, detail.summary.headline), detail.summary.bullets?.length ? /* @__PURE__ */ React.createElement("ul", { className: "list-disc space-y-1 pl-5 text-muted-foreground text-sm" }, detail.summary.bullets.map((bullet) => /* @__PURE__ */ React.createElement("li", { key: bullet }, bullet))) : null) : null, detail.fields.length ? /* @__PURE__ */ React.createElement("dl", { className: "grid gap-2 md:grid-cols-2" }, detail.fields.map((field) => /* @__PURE__ */ React.createElement( + "div", + { + className: "rounded-md border border-border/60 bg-background/80 p-2", + key: `${event.id}-${field.key}` + }, + /* @__PURE__ */ React.createElement("dt", { className: "text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground" }, field.label), + /* @__PURE__ */ React.createElement("dd", { className: "mt-1 break-words font-mono text-xs text-foreground" }, formatJsonValue(field.value)) + ))) : null); +} +function formatJsonValue(value) { + if (value === null) { + return "null"; + } + if (typeof value === "string") { + return value; + } + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + return JSON.stringify(value, null, 2); +} + +export { + EventGroupRow +}; +//# sourceMappingURL=chunk-INRGCNPT.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs.map new file mode 100644 index 00000000..a728a05c --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-INRGCNPT.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/primitives/event-group-row.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button } from \"@repo/design-system/components/ui/button\";\nimport { cn } from \"@repo/design-system/lib/utils\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { JsonValue, SessionEvent, SessionEventGroup } from \"../types\";\nimport { formatDateTime } from \"../utils\";\nimport { AgentStatusBadge } from \"./status-badge\";\n\ntype EventGroupRowProps = {\n group: SessionEventGroup;\n defaultExpanded?: boolean;\n};\n\nexport function EventGroupRow({\n group,\n defaultExpanded = false,\n}: EventGroupRowProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const first = group.events[0];\n const statuses = group.events.reduce<\n SessionEventGroup[\"events\"][number][\"status\"][]\n >((sequence, event) => {\n if (sequence[sequence.length - 1] !== event.status) {\n sequence.push(event.status);\n }\n return sequence;\n }, []);\n const isMultiEvent = group.events.length > 1;\n\n return (\n \n setExpanded((value) => !value)}\n type=\"button\"\n >\n \n
\n
\n

{group.title}

\n {first?.toolName ? (\n \n {first.toolName}\n \n ) : null}\n {isMultiEvent ? (\n \n {group.events.length} events\n \n ) : null}\n
\n
\n {formatDateTime(first.createdAt)}\n {group.durationLabel ? {group.durationLabel} : null}\n {first.agentLabel ? {first.agentLabel} : null}\n {first.project ? {first.project} : null}\n
\n
\n
\n {statuses.map((status, index) => (\n
\n {index > 0 ? (\n \n ) : null}\n \n
\n ))}\n
\n \n\n {expanded ? (\n
\n {isMultiEvent ? (\n
\n {group.events.length} grouped events\n
\n ) : null}\n
\n {group.events.map((event) => (\n \n
\n \n \n {event.eventType}\n \n {event.title}\n \n {formatDateTime(event.createdAt)}\n \n
\n {event.summary ? (\n

\n {event.summary}\n

\n ) : null}\n {event.metadata?.length ? (\n
\n {event.metadata.map((item) => (\n \n \n {item.label}\n \n {item.value}\n \n ))}\n
\n ) : null}\n {event.detail ? : null}\n
\n ))}\n
\n \n ) : null}\n \n );\n}\n\nfunction EventDetailPanel({ event }: Readonly<{ event: SessionEvent }>) {\n const detail = event.detail;\n if (!detail) {\n return null;\n }\n\n return (\n
\n {detail.summary ? (\n
\n

{detail.summary.headline}

\n {detail.summary.bullets?.length ? (\n
    \n {detail.summary.bullets.map((bullet) => (\n
  • {bullet}
  • \n ))}\n
\n ) : null}\n
\n ) : null}\n {detail.fields.length ? (\n
\n {detail.fields.map((field) => (\n \n
\n {field.label}\n
\n
\n {formatJsonValue(field.value)}\n
\n
\n ))}\n \n ) : null}\n \n );\n}\n\nfunction formatJsonValue(value: JsonValue): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value, null, 2);\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs b/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs new file mode 100644 index 00000000..c122fc03 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs @@ -0,0 +1,21 @@ +import React from "react"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/skeleton.tsx +function Skeleton({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "skeleton", + className: cn("bg-accent animate-pulse rounded-md", className), + ...props + } + ); +} + +export { + Skeleton +}; +//# sourceMappingURL=chunk-J6SXEWRG.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs.map new file mode 100644 index 00000000..196413ca --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-J6SXEWRG.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/skeleton.tsx"],"sourcesContent":["import { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Skeleton }\n"],"mappings":";;;;;AAEA,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAgC;AACtE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs b/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs new file mode 100644 index 00000000..a9332a0d --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs @@ -0,0 +1,27 @@ +import { + cn +} from "./chunk-522NBUZJ.mjs"; + +// components/ui/input.tsx +import * as React from "react"; +function Input({ className, type, ...props }) { + return /* @__PURE__ */ React.createElement( + "input", + { + type, + "data-slot": "input", + className: cn( + "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground bg-input dark:bg-input border-input-border h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", + "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", + "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + className + ), + ...props + } + ); +} + +export { + Input +}; +//# sourceMappingURL=chunk-J7MGMQSF.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs.map new file mode 100644 index 00000000..530cc1e6 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-J7MGMQSF.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/input.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@repo/design-system/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n \n )\n}\n\nexport { Input }\n"],"mappings":";;;;;AAAA,YAAY,WAAW;AAIvB,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAkC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]} \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs b/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs new file mode 100644 index 00000000..f872e991 --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs @@ -0,0 +1,698 @@ +import { + Separator +} from "./chunk-ZYUY3Y5N.mjs"; +import { + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle +} from "./chunk-B7SMJA5Y.mjs"; +import { + Input +} from "./chunk-J7MGMQSF.mjs"; +import { + Skeleton +} from "./chunk-J6SXEWRG.mjs"; +import { + require_link +} from "./chunk-D6PSM7AT.mjs"; +import { + Button +} from "./chunk-TT7DUYOP.mjs"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from "./chunk-MRSDI6D5.mjs"; +import { + cn +} from "./chunk-522NBUZJ.mjs"; +import { + useIsMobile +} from "./chunk-YM5RVC3J.mjs"; +import { + __toESM +} from "./chunk-LZOMFHX3.mjs"; + +// components/ui/sidebar.tsx +var import_link = __toESM(require_link()); +import * as React from "react"; +import { Slot as SlotPrimitive } from "radix-ui"; +import { cva } from "class-variance-authority"; +import { PanelLeftIcon } from "lucide-react"; +var SIDEBAR_COOKIE_NAME = "sidebar_state"; +var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; +var SIDEBAR_WIDTH = "16rem"; +var SIDEBAR_WIDTH_MOBILE = "18rem"; +var SIDEBAR_WIDTH_ICON = "3rem"; +var SIDEBAR_KEYBOARD_SHORTCUT = "b"; +var SidebarContext = React.createContext(null); +function useSidebar() { + const context = React.useContext(SidebarContext); + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider."); + } + return context; +} +function SidebarProvider({ + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props +}) { + const isMobile = useIsMobile(); + const [openMobile, setOpenMobile] = React.useState(false); + const [_open, _setOpen] = React.useState(defaultOpen); + const open = openProp ?? _open; + const setOpen = React.useCallback( + (value) => { + const openState = typeof value === "function" ? value(open) : value; + if (setOpenProp) { + setOpenProp(openState); + } else { + _setOpen(openState); + } + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; + }, + [setOpenProp, open] + ); + const toggleSidebar = React.useCallback(() => { + return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2); + }, [isMobile, setOpen, setOpenMobile]); + React.useEffect(() => { + const handleKeyDown = (event) => { + if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) { + event.preventDefault(); + toggleSidebar(); + } + }; + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, [toggleSidebar]); + const state = open ? "expanded" : "collapsed"; + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] + ); + return /* @__PURE__ */ React.createElement(SidebarContext.Provider, { value: contextValue }, /* @__PURE__ */ React.createElement(TooltipProvider, null, /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-wrapper", + style: { + "--sidebar-width": SIDEBAR_WIDTH, + "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, + ...style + }, + className: cn( + "group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex h-svh w-full", + className + ), + ...props + }, + children + ))); +} +function Sidebar({ + side = "left", + variant = "sidebar", + collapsible = "offcanvas", + className, + children, + ...props +}) { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); + if (collapsible === "none") { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar", + className: cn( + "bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", + className + ), + ...props + }, + children + ); + } + if (isMobile) { + return /* @__PURE__ */ React.createElement(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props }, /* @__PURE__ */ React.createElement( + SheetContent, + { + "data-sidebar": "sidebar", + "data-slot": "sidebar", + "data-mobile": "true", + className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden", + style: { + "--sidebar-width": SIDEBAR_WIDTH_MOBILE + }, + side + }, + /* @__PURE__ */ React.createElement(SheetHeader, { className: "sr-only" }, /* @__PURE__ */ React.createElement(SheetTitle, null, "Sidebar"), /* @__PURE__ */ React.createElement(SheetDescription, null, "Displays the mobile sidebar.")), + /* @__PURE__ */ React.createElement("div", { className: "flex h-full w-full flex-col" }, children) + )); + } + return /* @__PURE__ */ React.createElement( + "div", + { + className: "group peer text-sidebar-foreground hidden md:block", + "data-state": state, + "data-collapsible": state === "collapsed" ? collapsible : "", + "data-variant": variant, + "data-side": side, + "data-slot": "sidebar" + }, + /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-gap", + className: cn( + "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear", + "group-data-[collapsible=offcanvas]:w-0", + "group-data-[side=right]:rotate-180", + variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)" + ) + } + ), + /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-container", + className: cn( + "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex", + side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", + // Adjust the padding for floating and inset variants. + variant === "floating" || variant === "inset" ? "py-2 pl-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", + className + ), + ...props + }, + /* @__PURE__ */ React.createElement( + "div", + { + "data-sidebar": "sidebar", + "data-slot": "sidebar-inner", + className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm" + }, + children + ) + ) + ); +} +function SidebarTrigger({ + className, + onClick, + ...props +}) { + const { toggleSidebar } = useSidebar(); + return /* @__PURE__ */ React.createElement( + Button, + { + "data-sidebar": "trigger", + "data-slot": "sidebar-trigger", + variant: "ghost", + size: "icon-sm", + className, + onClick: (event) => { + onClick?.(event); + toggleSidebar(); + }, + ...props + }, + /* @__PURE__ */ React.createElement(PanelLeftIcon, null), + /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Toggle Sidebar") + ); +} +function SidebarRail({ className, ...props }) { + const { toggleSidebar } = useSidebar(); + return /* @__PURE__ */ React.createElement( + "button", + { + "data-sidebar": "rail", + "data-slot": "sidebar-rail", + "aria-label": "Toggle Sidebar", + tabIndex: -1, + onClick: toggleSidebar, + title: "Toggle Sidebar", + className: cn( + "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex", + "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", + "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", + "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", + "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", + "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", + className + ), + ...props + } + ); +} +function SidebarInset({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "main", + { + "data-slot": "sidebar-inset", + className: cn( + "bg-background relative flex w-full flex-1 flex-col", + "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:overflow-clip md:peer-data-[variant=inset]:rounded-xl", + className + ), + ...props + } + ); +} +function SidebarInput({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + Input, + { + "data-slot": "sidebar-input", + "data-sidebar": "input", + className: cn("bg-background h-8 w-full shadow-none", className), + ...props + } + ); +} +function SidebarHeader({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-header", + "data-sidebar": "header", + className: cn("flex flex-col gap-2 p-2", className), + ...props + } + ); +} +function SidebarFooter({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-footer", + "data-sidebar": "footer", + className: cn("flex flex-col gap-2 p-2", className), + ...props + } + ); +} +function SidebarSeparator({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + Separator, + { + "data-slot": "sidebar-separator", + "data-sidebar": "separator", + className: cn("bg-sidebar-border mx-2 w-auto", className), + ...props + } + ); +} +function SidebarContent({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-content", + "data-sidebar": "content", + className: cn( + "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", + className + ), + ...props + } + ); +} +function SidebarGroup({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-group", + "data-sidebar": "group", + className: cn("relative flex w-full min-w-0 flex-col p-2", className), + ...props + } + ); +} +function SidebarGroupLabel({ + className, + asChild = false, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "div"; + return /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "sidebar-group-label", + "data-sidebar": "group-label", + className: cn( + "text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md pl-2 pr-1 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", + "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", + className + ), + ...props + } + ); +} +function SidebarSectionHeader({ + title, + action, + className +}) { + return /* @__PURE__ */ React.createElement( + SidebarGroupLabel, + { + className: cn("flex items-center justify-between gap-2", className) + }, + /* @__PURE__ */ React.createElement("span", { className: "truncate" }, title), + action ? /* @__PURE__ */ React.createElement("div", { className: "shrink-0" }, action) : null + ); +} +function SidebarNavLinkItem({ + title, + href, + icon, + disabled = false, + isActive = false, + tooltip, + trailing, + className, + itemClassName +}) { + const content = /* @__PURE__ */ React.createElement(React.Fragment, null, icon, /* @__PURE__ */ React.createElement("span", null, title), trailing); + return /* @__PURE__ */ React.createElement(SidebarMenuItem, { className: itemClassName }, /* @__PURE__ */ React.createElement( + SidebarMenuButton, + { + asChild: !disabled && href !== void 0, + className: cn( + disabled ? "pointer-events-none cursor-not-allowed opacity-50" : "", + className + ), + isActive: !disabled && isActive, + tooltip + }, + disabled || href === void 0 ? /* @__PURE__ */ React.createElement("span", { className: "flex items-center gap-2" }, content) : /* @__PURE__ */ React.createElement(import_link.default, { href }, content) + )); +} +function SidebarGroupAction({ + className, + asChild = false, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "button"; + return /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "sidebar-group-action", + "data-sidebar": "group-action", + className: cn( + "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", + // Increases the hit area of the button on mobile. + "after:absolute after:-inset-2 md:after:hidden", + "group-data-[collapsible=icon]:hidden", + className + ), + ...props + } + ); +} +function SidebarGroupContent({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-group-content", + "data-sidebar": "group-content", + className: cn("w-full text-sm", className), + ...props + } + ); +} +function SidebarMenu({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "ul", + { + "data-slot": "sidebar-menu", + "data-sidebar": "menu", + className: cn("flex w-full min-w-0 flex-col gap-1", className), + ...props + } + ); +} +function SidebarMenuItem({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "li", + { + "data-slot": "sidebar-menu-item", + "data-sidebar": "menu-item", + className: cn("group/menu-item relative", className), + ...props + } + ); +} +var sidebarMenuButtonVariants = cva( + "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-base outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", + { + variants: { + variant: { + default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", + outline: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]" + }, + size: { + default: "h-8 text-base", + sm: "h-7 text-xs", + lg: "h-12 text-base group-data-[collapsible=icon]:p-0!" + } + }, + defaultVariants: { + variant: "default", + size: "default" + } + } +); +function SidebarMenuButton({ + asChild = false, + isActive = false, + variant = "default", + size = "default", + tooltip, + className, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "button"; + const { isMobile, state } = useSidebar(); + const button = /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "sidebar-menu-button", + "data-sidebar": "menu-button", + "data-size": size, + "data-active": isActive, + className: cn(sidebarMenuButtonVariants({ variant, size }), className), + ...props + } + ); + if (!tooltip) { + return button; + } + if (typeof tooltip === "string") { + tooltip = { + children: tooltip + }; + } + return /* @__PURE__ */ React.createElement(Tooltip, null, /* @__PURE__ */ React.createElement(TooltipTrigger, { asChild: true }, button), /* @__PURE__ */ React.createElement( + TooltipContent, + { + side: "right", + align: "center", + hidden: state !== "collapsed" || isMobile, + ...tooltip + } + )); +} +function SidebarMenuAction({ + className, + asChild = false, + showOnHover = false, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "button"; + return /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "sidebar-menu-action", + "data-sidebar": "menu-action", + className: cn( + "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", + // Increases the hit area of the button on mobile. + "after:absolute after:-inset-2 md:after:hidden", + "peer-data-[size=sm]/menu-button:top-1", + "peer-data-[size=default]/menu-button:top-1.5", + "peer-data-[size=lg]/menu-button:top-2.5", + "group-data-[collapsible=icon]:hidden", + showOnHover && "peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0", + className + ), + ...props + } + ); +} +function SidebarMenuBadge({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-menu-badge", + "data-sidebar": "menu-badge", + className: cn( + "text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none", + "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground", + "peer-data-[size=sm]/menu-button:top-1", + "peer-data-[size=default]/menu-button:top-1.5", + "peer-data-[size=lg]/menu-button:top-2.5", + "group-data-[collapsible=icon]:hidden", + className + ), + ...props + } + ); +} +function SidebarMenuSkeleton({ + className, + showIcon = false, + ...props +}) { + const width = "70%"; + return /* @__PURE__ */ React.createElement( + "div", + { + "data-slot": "sidebar-menu-skeleton", + "data-sidebar": "menu-skeleton", + className: cn("flex h-8 items-center gap-2 rounded-md px-2", className), + ...props + }, + showIcon && /* @__PURE__ */ React.createElement( + Skeleton, + { + className: "size-4 rounded-md", + "data-sidebar": "menu-skeleton-icon" + } + ), + /* @__PURE__ */ React.createElement( + Skeleton, + { + className: "h-4 max-w-(--skeleton-width) flex-1", + "data-sidebar": "menu-skeleton-text", + style: { + "--skeleton-width": width + } + } + ) + ); +} +function SidebarMenuSub({ className, ...props }) { + return /* @__PURE__ */ React.createElement( + "ul", + { + "data-slot": "sidebar-menu-sub", + "data-sidebar": "menu-sub", + className: cn( + "border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5", + "group-data-[collapsible=icon]:hidden", + className + ), + ...props + } + ); +} +function SidebarMenuSubItem({ + className, + ...props +}) { + return /* @__PURE__ */ React.createElement( + "li", + { + "data-slot": "sidebar-menu-sub-item", + "data-sidebar": "menu-sub-item", + className: cn("group/menu-sub-item relative", className), + ...props + } + ); +} +function SidebarMenuSubButton({ + asChild = false, + size = "md", + isActive = false, + className, + ...props +}) { + const Comp = asChild ? SlotPrimitive.Slot : "a"; + return /* @__PURE__ */ React.createElement( + Comp, + { + "data-slot": "sidebar-menu-sub-button", + "data-sidebar": "menu-sub-button", + "data-size": size, + "data-active": isActive, + className: cn( + "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", + "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", + size === "sm" && "text-xs", + size === "md" && "text-sm", + "group-data-[collapsible=icon]:hidden", + className + ), + ...props + } + ); +} + +export { + SIDEBAR_COOKIE_NAME, + useSidebar, + SidebarProvider, + Sidebar, + SidebarTrigger, + SidebarRail, + SidebarInset, + SidebarInput, + SidebarHeader, + SidebarFooter, + SidebarSeparator, + SidebarContent, + SidebarGroup, + SidebarGroupLabel, + SidebarSectionHeader, + SidebarNavLinkItem, + SidebarGroupAction, + SidebarGroupContent, + SidebarMenu, + SidebarMenuItem, + SidebarMenuButton, + SidebarMenuAction, + SidebarMenuBadge, + SidebarMenuSkeleton, + SidebarMenuSub, + SidebarMenuSubItem, + SidebarMenuSubButton +}; +//# sourceMappingURL=chunk-JD2ZA6DU.mjs.map \ No newline at end of file diff --git a/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs.map b/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs.map new file mode 100644 index 00000000..ab9a019a --- /dev/null +++ b/apps/desktop/vendor/design-system/dist/chunk-JD2ZA6DU.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../components/ui/sidebar.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Slot as SlotPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\nimport Link from \"next/link\"\n\nimport { useIsMobile } from \"@repo/design-system/hooks/use-mobile\"\nimport { cn } from \"@repo/design-system/lib/utils\"\nimport { Button } from \"@repo/design-system/components/ui/button\"\nimport { Input } from \"@repo/design-system/components/ui/input\"\nimport { Separator } from \"@repo/design-system/components/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@repo/design-system/components/ui/sheet\"\nimport { Skeleton } from \"@repo/design-system/components/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@repo/design-system/components/ui/tooltip\"\n\nexport const SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n \n \n \n {children}\n \n \n \n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n \n {children}\n \n )\n }\n\n if (isMobile) {\n return (\n \n button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n \n Sidebar\n Displays the mobile sidebar.\n \n
{children}
\n \n
\n )\n }\n\n return (\n