From a1f1a97e25de10e994b4da762a1ed36ccf786490 Mon Sep 17 00:00:00 2001 From: Mayank Lal Date: Fri, 19 Jun 2026 16:51:23 +0530 Subject: [PATCH] Updated the ui of aerograph and added a dark mode feature in it. --- apps/web/package.json | 12 +- apps/web/src/App.tsx | 150 ++++-- apps/web/src/styles.css | 1102 +++++++++++++++------------------------ apps/web/vite.config.ts | 3 +- package-lock.json | 621 +++++++++++++++++++--- 5 files changed, 1089 insertions(+), 799 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index 7f67ab3..669a211 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,19 +12,21 @@ }, "dependencies": { "@aerograph/contracts": "0.2.1", + "@tailwindcss/vite": "^4.3.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "reactflow": "^11.11.4" + "reactflow": "^11.11.4", + "tailwindcss": "^4.3.1" }, "devDependencies": { + "@eslint/js": "^9.9.0", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", "typescript": "^5.6.0", + "typescript-eslint": "^8.0.0", "vite": "^5.4.0", - "vitest": "^2.1.0", - "eslint": "^9.9.0", - "@eslint/js": "^9.9.0", - "typescript-eslint": "^8.0.0" + "vitest": "^2.1.0" } } diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 3d6641a..cabc51c 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -6,6 +6,7 @@ import ReactFlow, { MarkerType, Handle, Position, + useReactFlow, type NodeTypes, type Node, type Edge, @@ -276,6 +277,19 @@ function buildPremiumGraph( // ─── Main App ───────────────────────────────────────────────────────────────── type Selected = { event: TraceEvent }; +function FitViewOnUpdate({ nodesCount }: { nodesCount: number }) { + const { fitView } = useReactFlow(); + useEffect(() => { + if (nodesCount > 0) { + const timeoutId = setTimeout(() => { + fitView({ padding: 0.15, maxZoom: 1 }); + }, 50); + return () => clearTimeout(timeoutId); + } + }, [nodesCount, fitView]); + return null; +} + export default function App() { const api = useMemo(() => createApi(), []); @@ -287,6 +301,17 @@ export default function App() { const [selected, setSelected] = useState(null); const [error, setError] = useState(""); const [liveUpdating, setLiveUpdating] = useState(true); + const [leftSidebarOpen, setLeftSidebarOpen] = useState(true); + const [rightSidebarOpen, setRightSidebarOpen] = useState(true); + const [traceSearch, setTraceSearch] = useState(""); + const [isDark, setIsDark] = useState(true); + const [lineageOpen, setLineageOpen] = useState(false); + + useEffect(() => { + if (isDark) document.documentElement.classList.add("dark"); + else document.documentElement.classList.remove("dark"); + }, [isDark]); + const [playbackCursor, setPlaybackCursor] = useState(-1); const [diffResult, setDiffResult] = useState(null); const [compareTargetId, setCompareTargetId] = useState(""); @@ -444,7 +469,7 @@ export default function App() { if (!selected) { return (
- 🔍 +
Click a node in the graph
@@ -568,25 +593,6 @@ export default function App() {
- {/* Trace selector */} - - {/* Live toggle */}
} {/* Body */} -
+
+ {/* Left Sidebar: Traces */} + {/* Graph canvas */}
+ + + + {/* Playback controls */}
)}
-
+
+
+
Breadcrumb
{!lineage || !traceId ? (
@@ -887,6 +969,8 @@ export default function App() { )}
+
+
{/* T044: Loop warnings panel */}
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index 27b4b56..1beeaff 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -1,728 +1,438 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap'); - -/* ═══════════════════════════════════════════════════════════════ - DESIGN SYSTEM TOKENS -═══════════════════════════════════════════════════════════════ */ -:root { - /* Color Palette */ - --bg-base: #050810; - --bg-surface: #0c1122; - --bg-elevated: #111827; - --bg-card: #161f35; - --bg-hover: #1e2a45; - - --border-subtle: rgba(99, 130, 255, 0.12); - --border-active: rgba(99, 130, 255, 0.35); - - --accent: #6366f1; - --accent-glow: rgba(99, 102, 241, 0.35); - --accent-light: #818cf8; - --accent-faint: rgba(99, 102, 241, 0.08); - - --green: #10b981; - --green-glow: rgba(16, 185, 129, 0.25); - --green-faint: rgba(16, 185, 129, 0.1); - - --red: #ef4444; - --red-glow: rgba(239, 68, 68, 0.3); - --red-faint: rgba(239, 68, 68, 0.1); - - --amber: #f59e0b; - --amber-faint: rgba(245, 158, 11, 0.12); - - --cyan: #06b6d4; - --cyan-faint: rgba(6, 182, 212, 0.1); - - --text-primary: #f1f5f9; - --text-secondary: #94a3b8; - --text-muted: #475569; - --text-accent: #818cf8; - - /* Spacing */ - --radius-sm: 6px; - --radius-md: 10px; - --radius-lg: 16px; - --radius-xl: 22px; - - /* Shadows */ - --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.4); - --shadow-glow: 0 0 20px var(--accent-glow); -} - -/* ═══════════════════════════════════════════════════════════════ - RESET & BASE -═══════════════════════════════════════════════════════════════ */ -*, *::before, *::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -html, body { - height: 100%; - font-family: 'Inter', system-ui, -apple-system, sans-serif; - background: var(--bg-base); - color: var(--text-primary); - -webkit-font-smoothing: antialiased; - overflow: hidden; -} - -#root { - height: 100%; -} - -/* ═══════════════════════════════════════════════════════════════ - LAYOUT SHELL -═══════════════════════════════════════════════════════════════ */ -.layout { - height: 100%; - display: flex; - flex-direction: column; - background: var(--bg-base); -} - -/* ═══════════════════════════════════════════════════════════════ - HEADER -═══════════════════════════════════════════════════════════════ */ -.header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 20px; - height: 56px; - background: var(--bg-surface); - border-bottom: 1px solid var(--border-subtle); - position: relative; - z-index: 10; - flex-shrink: 0; -} - -.header::after { - content: ''; - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 1px; - background: linear-gradient(90deg, transparent, var(--accent-glow), transparent); -} - -.header-brand { - display: flex; - align-items: center; - gap: 10px; -} - -.header-logo { - width: 30px; - height: 30px; - background: linear-gradient(135deg, var(--accent), #a78bfa); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - font-size: 15px; - box-shadow: 0 0 12px var(--accent-glow); - flex-shrink: 0; -} - -.title { - font-weight: 700; - font-size: 15px; - letter-spacing: -0.01em; - color: var(--text-primary); -} - -.title-badge { - font-size: 10px; - font-weight: 600; - padding: 2px 7px; - border-radius: 99px; - background: var(--accent-faint); - color: var(--accent-light); - border: 1px solid var(--border-active); - letter-spacing: 0.04em; -} - -/* ═══════════════════════════════════════════════════════════════ - CONTROLS (header right) -═══════════════════════════════════════════════════════════════ */ -.controls { - display: flex; - gap: 10px; - align-items: center; -} - -.controls label { - display: flex; - gap: 6px; - align-items: center; - font-size: 12px; - color: var(--text-secondary); -} - -.trace-select { - appearance: none; - background: var(--bg-card); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-sm); - color: var(--text-primary); - font-family: 'Inter', sans-serif; - font-size: 12px; - padding: 6px 28px 6px 10px; - cursor: pointer; - transition: border-color 0.2s, box-shadow 0.2s; - min-width: 220px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right 8px center; -} - -.trace-select:hover { - border-color: var(--border-active); - box-shadow: 0 0 0 3px var(--accent-faint); -} - -.trace-select:focus { - outline: none; - border-color: var(--accent); - box-shadow: 0 0 0 3px var(--accent-faint); -} - -/* Live toggle */ -.live-toggle { - display: flex; - align-items: center; - gap: 7px; - background: var(--bg-card); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-sm); - padding: 5px 10px; - font-size: 12px; - color: var(--text-secondary); - cursor: pointer; - transition: all 0.2s; - user-select: none; -} - -.live-toggle:hover { - border-color: var(--border-active); -} - -.live-toggle input[type="checkbox"] { - display: none; -} - -.live-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--text-muted); - transition: background 0.2s, box-shadow 0.2s; -} - -.live-dot.active { - background: var(--green); - box-shadow: 0 0 6px var(--green-glow); - animation: pulse 2s ease-in-out infinite; -} - -@keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.5; } -} - -/* Buttons */ -.btn { - font-family: 'Inter', sans-serif; - font-size: 12px; - font-weight: 500; - padding: 6px 12px; - border-radius: var(--radius-sm); - border: 1px solid var(--border-subtle); - background: var(--bg-card); - color: var(--text-secondary); - cursor: pointer; - transition: all 0.18s; - display: flex; - align-items: center; - gap: 5px; -} - -.btn:hover { - background: var(--bg-hover); - border-color: var(--border-active); - color: var(--text-primary); -} - -.btn-accent { - background: var(--accent-faint); - border-color: var(--accent); - color: var(--accent-light); -} - -.btn-accent:hover { - background: var(--accent); - color: white; - box-shadow: 0 0 12px var(--accent-glow); -} - -.btn-fork { - background: rgba(167, 139, 250, 0.1); - border-color: rgba(167, 139, 250, 0.4); - color: #c4b5fd; - font-family: 'Inter', sans-serif; - font-size: 12px; - font-weight: 600; - width: 100%; - justify-content: center; - padding: 8px 12px; - border-radius: var(--radius-sm); - transition: all 0.18s; -} - -.btn-fork:hover:not(:disabled) { - background: rgba(139, 92, 246, 0.25); - border-color: #a78bfa; - color: white; - box-shadow: 0 0 14px rgba(139,92,246,0.4); -} - -.btn:disabled { - opacity: 0.35; - cursor: not-allowed; -} - -/* ═══════════════════════════════════════════════════════════════ - ERROR BAR -═══════════════════════════════════════════════════════════════ */ -.error { - padding: 8px 20px; - font-size: 12px; - color: #fca5a5; - background: rgba(239, 68, 68, 0.1); - border-bottom: 1px solid rgba(239, 68, 68, 0.2); - display: flex; - align-items: center; - gap: 6px; -} - -/* ═══════════════════════════════════════════════════════════════ - MAIN AREA -═══════════════════════════════════════════════════════════════ */ -.main { - flex: 1; - display: grid; - grid-template-columns: 1fr 380px; - min-height: 0; -} - -/* ═══════════════════════════════════════════════════════════════ - GRAPH CANVAS -═══════════════════════════════════════════════════════════════ */ -.graph { - position: relative; - min-height: 0; - background: var(--bg-base); - background-image: - radial-gradient(ellipse 60% 40% at 50% 0%, rgba(99, 102, 241, 0.06) 0%, transparent 70%), - linear-gradient(rgba(99, 130, 255, 0.03) 1px, transparent 1px), - linear-gradient(90deg, rgba(99, 130, 255, 0.03) 1px, transparent 1px); - background-size: 100% 100%, 40px 40px, 40px 40px; -} - -/* React Flow overrides */ -.react-flow__background { - background: transparent !important; -} - -.react-flow__node { - transition: filter 0.2s; -} - -.react-flow__node:hover { - filter: brightness(1.1); -} - +@import "tailwindcss"; + +@layer base { + :root { + --bg-base: #FAF9F6; + --bg-surface: #FFFFFF; + --bg-hover: #F2EFE9; + + --border-subtle: #E2DFD8; + --border-active: #A3A09A; + --grid-color: #EAE7E0; + + --text-primary: #2C2C2A; + --text-secondary: #7A7873; + --text-muted: #A3A09A; + + --accent: #556B58; + --accent-faint: rgba(85, 107, 88, 0.1); + --accent-blue: #4A6D8C; + --accent-alert: #C26D5C; + --accent-alert-bg: #FDF5F3; + + --amber: #9A7C50; + --cyan: #4A8C8A; + --red: #C26D5C; + + --shadow-sm: 0 2px 8px rgba(0,0,0,0.04); + --shadow-md: 0 6px 16px rgba(0,0,0,0.08); + } + + .dark { + --bg-base: #111111; + --bg-surface: #181818; + --bg-hover: #222222; + + --border-subtle: #2C2C2C; + --border-active: #666560; + --grid-color: #191919; + + --text-primary: #E3E1D9; + --text-secondary: #A09E96; + --text-muted: #666560; + + --accent: #758F7B; + --accent-faint: rgba(117, 143, 123, 0.15); + --accent-blue: #6484A0; + --accent-alert: #C97A6D; + --accent-alert-bg: rgba(201, 122, 109, 0.08); + + --amber: #B89C72; + --cyan: #699996; + --red: #C97A6D; + + --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4); + } + + html, body { + @apply h-full bg-bg-base text-text-primary font-sans antialiased overflow-hidden text-[13px]; + } + #root { + @apply h-full; + } +} + +@theme { + --color-bg-base: var(--bg-base); + --color-bg-surface: var(--bg-surface); + --color-bg-hover: var(--bg-hover); + --color-border-subtle: var(--border-subtle); + --color-border-active: var(--border-active); + --color-grid-color: var(--grid-color); + + --color-text-primary: var(--text-primary); + --color-text-secondary: var(--text-secondary); + --color-text-muted: var(--text-muted); + + --color-accent: var(--accent); + --color-accent-faint: var(--accent-faint); + --color-accent-blue: var(--accent-blue); + --color-accent-alert: var(--accent-alert); + --color-accent-alert-bg: var(--accent-alert-bg); + + --color-amber: var(--amber); + --color-cyan: var(--cyan); + --color-red: var(--red); + + --shadow-sm: var(--shadow-sm); + --shadow-md: var(--shadow-md); + + --font-serif: 'Lora', serif; + --font-sans: 'Inter', sans-serif; + --font-mono: 'JetBrains Mono', monospace; +} + +@layer components { + /* Layout */ + .layout { + @apply flex flex-col h-full bg-bg-base overflow-hidden; + } + + /* Header */ + .header { + @apply flex items-center justify-between px-6 h-[60px] bg-bg-surface border-b border-border-subtle relative z-10 shrink-0; + } + .header::after { + @apply hidden; + } + .header-brand { + @apply flex items-center gap-[10px]; + } + .header-logo { + @apply w-7 h-7 bg-bg-base border border-border-subtle rounded-[4px] flex items-center justify-center text-accent-blue text-[15px] shadow-none; + } + .title { + @apply font-serif text-[20px] font-medium text-text-primary; + } + .title-badge { + @apply font-mono text-[11px] px-2 py-1 rounded-full border border-border-subtle text-accent-blue bg-bg-base; + } + + /* Controls */ + .controls { + @apply flex gap-4 items-center; + } + .controls label { + @apply flex gap-1.5 items-center text-[12px] text-text-muted; + } + .trace-select { + @apply appearance-none bg-bg-base border border-border-subtle rounded-md text-text-primary font-mono text-[12px] py-1.5 pr-7 pl-3 cursor-pointer min-w-[220px] outline-none shadow-none transition-colors; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23A3A09A' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 8px center; + } + .trace-select:hover { + @apply border-border-active; + } + .trace-select:focus { + @apply border-accent-blue ring-2 ring-accent-blue/10; + } + + /* Live Toggle */ + .live-toggle { + @apply flex items-center gap-1.5 bg-bg-surface border border-border-subtle px-3 py-1.5 rounded-md text-[13px] text-text-primary cursor-pointer select-none transition-colors; + } + .live-toggle:hover { + @apply bg-bg-hover; + } + .live-dot { + @apply w-1.5 h-1.5 rounded-full bg-text-muted shadow-none; + } + .live-dot.active { + @apply bg-accent; + animation: none; + } + + /* Buttons */ + .btn { + @apply font-sans text-[13px] px-3 py-1.5 rounded-md border border-border-subtle bg-bg-surface text-text-primary cursor-pointer transition-colors flex items-center gap-1.5; + } + .btn:hover { + @apply bg-bg-hover border-border-subtle text-text-primary; + } + .btn-accent { + @apply bg-accent-alert-bg border-accent-alert text-accent-alert; + } + .btn-accent:hover { + @apply bg-accent-alert text-bg-base shadow-none; + } + .btn-fork { + @apply bg-bg-base border-border-subtle text-accent-blue font-sans text-[12px] font-semibold w-full justify-center px-3 py-2 rounded-md transition-colors shadow-none; + } + .btn-fork:hover:not(:disabled) { + @apply bg-accent-blue border-accent-blue text-bg-base shadow-md; + } + + /* Error */ + .error { + @apply px-5 py-2 text-[12px] text-accent-alert bg-accent-alert-bg border-b border-accent-alert/30 flex items-center gap-1.5; + } + + /* Main Area */ + .main { + @apply flex-1 grid min-h-0 overflow-hidden; + grid-template-rows: minmax(0, 1fr); + } + + /* Graph */ + .graph { + @apply relative min-h-0 bg-bg-base; + background-image: + linear-gradient(var(--grid-color) 1px, transparent 1px), + linear-gradient(90deg, var(--grid-color) 1px, transparent 1px); + background-size: 32px 32px; + background-position: -1px -1px; + } + + /* Playback Controls */ + .playback-controls { + @apply fixed top-[84px] left-[calc(50%-190px)] -translate-x-1/2 bg-bg-surface border border-border-subtle rounded-[20px] flex items-center px-1.5 py-1 gap-3 shadow-sm z-20; + backdrop-filter: none; + } + .playback-btn { + @apply bg-transparent border-none cursor-pointer text-text-muted p-1 w-auto h-auto rounded-none hover:text-text-primary transition-colors shadow-none; + } + .playback-btn:hover:not(:disabled) { + @apply bg-transparent border-none text-text-primary shadow-none; + } + .playback-counter { + @apply font-mono text-[12px] font-medium min-w-[48px] text-center text-text-secondary; + } + .playback-counter span { + @apply text-text-primary font-semibold; + } + .playback-live { + @apply text-[10px] font-mono font-semibold text-accent border border-border-subtle px-1.5 py-0.5 rounded-[10px] uppercase bg-transparent; + } + .playback-live:hover { + @apply bg-bg-base text-accent; + } + + /* Sidebars */ + .side { + @apply bg-bg-surface flex flex-col overflow-y-auto overflow-x-hidden z-20 min-h-0 h-full w-full; + } + .side-left { + @apply border-r border-border-subtle; + } + .side-right { + @apply border-l border-border-subtle; + } + + .sidebar-toggle-btn { + @apply absolute top-1/2 -translate-y-1/2 flex items-center justify-center w-5 h-10 bg-bg-surface border border-border-subtle cursor-pointer text-text-muted transition-all duration-300 z-30 shadow-sm text-[10px]; + } + .sidebar-toggle-btn:hover { + @apply text-text-primary bg-bg-hover shadow-md; + } + .sidebar-toggle-btn.closed { + @apply w-7 h-12 text-[14px] bg-bg-surface border-border-active shadow-md; + } + .sidebar-toggle-left { + @apply left-0 -translate-x-1/2 rounded-full; + } + .sidebar-toggle-right { + @apply right-0 translate-x-1/2 rounded-full; + } + + .trace-list-item { + @apply flex flex-col gap-1 px-4 py-3 border-b border-border-subtle cursor-pointer hover:bg-bg-hover transition-colors; + } + .trace-list-item.active { + @apply bg-bg-hover border-l-[3px] border-l-accent-blue; + padding-left: 13px; /* account for 3px border */ + } + .side-empty { + @apply flex-1 flex flex-col items-center justify-center gap-3 text-text-muted text-[13px] p-6 text-center; + } + .side-header { + @apply px-6 py-6 border-b border-border-subtle flex items-center justify-between shrink-0; + } + .side-title { + @apply text-[11px] font-semibold uppercase text-text-muted tracking-normal; + } + + .accordion-content { + display: grid; + grid-template-rows: 0fr; + transition: all 0.3s ease-in-out; + } + .accordion-content.open { + grid-template-rows: 1fr; + } + .accordion-inner { + overflow: hidden; + } + + /* Trace Meta */ + .trace-meta-strip { + @apply px-6 py-6 border-b border-border-subtle flex flex-col gap-2 bg-bg-surface shrink-0; + } + .trace-meta-id { + @apply font-mono text-[12px] bg-bg-base border border-border-subtle px-2 py-1 rounded w-fit text-text-secondary; + } + .trace-meta-row { + @apply flex gap-2.5 flex-wrap mt-2; + } + .trace-stat { + @apply flex flex-col gap-1.5 text-[11px] text-text-muted uppercase; + } + .trace-stat-num { + @apply text-[13px] font-sans text-text-primary lowercase font-semibold; + } + + /* Badges */ + .kind-badge { + @apply inline-flex items-center gap-1 text-[10px] font-mono font-bold uppercase px-[9px] py-[3px] rounded-full border bg-bg-base; + } + .kind-prompt { @apply text-accent-blue border-border-subtle; } + .kind-response { @apply text-accent border-border-subtle; } + .kind-tool_call { @apply text-amber border-border-subtle; } + .kind-tool_result { @apply text-cyan border-border-subtle; } + .kind-error { @apply text-red border-border-subtle; } + .kind-handoff { @apply text-[#A07494] border-border-subtle; } + .kind-note { @apply text-text-secondary border-border-subtle; } + + .status-badge { + @apply inline-flex items-center gap-1 text-[10px] font-mono px-1.5 py-0.5 rounded border; + } + .status-ok { @apply bg-accent-faint text-accent border-accent-faint; } + .status-error { @apply bg-accent-alert-bg text-accent-alert border-accent-alert/30; } + + /* Detail Body */ + .detail-body { + @apply px-6 py-6 flex flex-col gap-4 shrink-0; + } + .detail-section { + @apply mb-0 flex flex-col gap-4 border-b border-border-subtle pb-6; + } + .detail-section:last-child { + @apply border-none pb-0; + } + .detail-section-label { + @apply text-[11px] font-semibold uppercase text-text-muted tracking-normal mb-0; + } + + /* Key Value Grid */ + .kv-grid { + @apply flex flex-col gap-1.5; + } + .kv-row { + @apply grid gap-2 items-start; + grid-template-columns: 90px 1fr; + } + .kv-key { + @apply text-[11px] text-text-muted uppercase font-semibold; + } + .kv-val { + @apply font-mono text-[13px] text-text-primary break-all leading-relaxed; + } + .kv-val-text { + @apply font-sans text-[13px] text-text-primary leading-relaxed whitespace-pre-wrap break-words; + } + + /* Code block */ + .code-block { + @apply bg-bg-base border border-border-subtle rounded-md p-3 font-mono text-[11px] text-text-secondary overflow-auto max-h-[280px] whitespace-pre leading-relaxed; + } + + .divider { + @apply h-[1px] bg-border-subtle my-3; + } +} + +/* React Flow specifics */ +.react-flow__background { background: transparent !important; } .react-flow__edge-path { - stroke: var(--accent-light) !important; - stroke-opacity: 0.8 !important; - stroke-width: 2px !important; + stroke: var(--text-muted) !important; + stroke-opacity: 0.7 !important; + stroke-width: 1.5 !important; + stroke-dasharray: 8 8 !important; + animation: march 1s linear infinite !important; } - .react-flow__edge.selected .react-flow__edge-path { + stroke: var(--accent-blue) !important; + stroke-width: 2 !important; stroke-opacity: 1 !important; } - -/* Diff highlight: amber pulse on changed nodes */ -.node-diff-highlight { - animation: diff-pulse 2s ease-in-out infinite; -} - -@keyframes diff-pulse { - 0%, 100% { box-shadow: 0 0 0 3px rgba(245,158,11,0.25), 0 0 18px rgba(245,158,11,0.45); } - 50% { box-shadow: 0 0 0 5px rgba(245,158,11,0.4), 0 0 28px rgba(245,158,11,0.65); } -} - -/* Loop highlight: purple pulse on flagged nodes */ -.node-loop-highlight { - animation: loop-pulse 1.8s ease-in-out infinite; -} - -@keyframes loop-pulse { - 0%, 100% { box-shadow: 0 0 0 3px rgba(139,92,246,0.3), 0 0 20px rgba(139,92,246,0.5); } - 50% { box-shadow: 0 0 0 6px rgba(139,92,246,0.5), 0 0 32px rgba(139,92,246,0.7); } +@keyframes march { + to { stroke-dashoffset: -16; } } .react-flow__controls { - background: var(--bg-card) !important; - border: 1px solid var(--border-subtle) !important; - border-radius: var(--radius-md) !important; - box-shadow: var(--shadow-card) !important; - overflow: hidden; + @apply bg-bg-surface border border-border-subtle rounded-md shadow-sm overflow-hidden; } - .react-flow__controls-button { - background: var(--bg-card) !important; - border-bottom: 1px solid var(--border-subtle) !important; - color: var(--text-secondary) !important; - transition: background 0.15s !important; + @apply bg-bg-surface border-b border-border-subtle text-text-muted transition-colors hover:bg-bg-hover hover:text-text-primary; } - -.react-flow__controls-button:hover { - background: var(--bg-hover) !important; - color: var(--text-primary) !important; -} - -.react-flow__controls-button svg path, -.react-flow__controls-button svg rect { +.react-flow__controls-button svg path { fill: currentColor !important; } -/* ═══════════════════════════════════════════════════════════════ - PLAYBACK CONTROLS (floating inside graph) -═══════════════════════════════════════════════════════════════ */ -.playback-controls { - position: absolute; - top: 14px; - left: 50%; - transform: translateX(-50%); - z-index: 5; - display: flex; - align-items: center; - gap: 8px; - background: var(--bg-card); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-xl); - padding: 6px 14px; - box-shadow: var(--shadow-card); - backdrop-filter: blur(12px); -} - -.playback-btn { - width: 28px; - height: 28px; - border-radius: 50%; - border: 1px solid var(--border-subtle); - background: var(--bg-elevated); - color: var(--text-secondary); - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.15s; - font-size: 13px; -} - -.playback-btn:hover:not(:disabled) { - background: var(--accent); - border-color: var(--accent); - color: white; - box-shadow: 0 0 10px var(--accent-glow); -} - -.playback-btn:disabled { - opacity: 0.3; - cursor: not-allowed; -} - -.playback-counter { - font-family: 'JetBrains Mono', monospace; - font-size: 12px; - color: var(--text-secondary); - min-width: 48px; - text-align: center; -} - -.playback-counter span { - color: var(--accent-light); - font-weight: 600; -} - -.playback-live { - font-size: 10px; - font-weight: 600; - padding: 2px 8px; - border-radius: 99px; - background: var(--green-faint); - color: var(--green); - border: 1px solid rgba(16, 185, 129, 0.3); - cursor: pointer; - transition: all 0.15s; -} - -.playback-live:hover { - background: var(--green); - color: var(--bg-base); -} - -/* ═══════════════════════════════════════════════════════════════ - SIDEBAR (DETAIL PANEL) -═══════════════════════════════════════════════════════════════ */ -.side { - border-left: 1px solid var(--border-subtle); - background: var(--bg-surface); - overflow: auto; - display: flex; - flex-direction: column; -} - -.side-empty { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 12px; - color: var(--text-muted); - font-size: 13px; - padding: 24px; - text-align: center; -} - -.side-empty-icon { - font-size: 32px; - opacity: 0.5; -} - -.side-header { - padding: 14px 16px 10px; - border-bottom: 1px solid var(--border-subtle); - display: flex; - align-items: center; - justify-content: space-between; - flex-shrink: 0; -} - -.side-title { - font-size: 11px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--text-muted); -} - -/* ═══════════════════════════════════════════════════════════════ - EVENT KIND BADGE -═══════════════════════════════════════════════════════════════ */ -.kind-badge { - display: inline-flex; - align-items: center; - gap: 5px; - font-size: 10px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.06em; - padding: 3px 9px; - border-radius: 99px; -} - -.kind-prompt { background: rgba(99, 102, 241, 0.15); color: #818cf8; border: 1px solid rgba(99,102,241,0.3); } -.kind-response { background: rgba(16, 185, 129, 0.12); color: #34d399; border: 1px solid rgba(16,185,129,0.3); } -.kind-tool_call { background: rgba(245, 158, 11, 0.12); color: #fbbf24; border: 1px solid rgba(245,158,11,0.3); } -.kind-tool_result { background: rgba(6, 182, 212, 0.12); color: #22d3ee; border: 1px solid rgba(6,182,212,0.3); } -.kind-error { background: rgba(239, 68, 68, 0.12); color: #f87171; border: 1px solid rgba(239,68,68,0.3); } -.kind-handoff { background: rgba(168, 85, 247, 0.12); color: #c084fc; border: 1px solid rgba(168,85,247,0.3); } -.kind-note { background: rgba(148, 163, 184, 0.1); color: #94a3b8; border: 1px solid rgba(148,163,184,0.2); } - -/* ═══════════════════════════════════════════════════════════════ - STATUS BADGE -═══════════════════════════════════════════════════════════════ */ -.status-badge { - display: inline-flex; - align-items: center; - gap: 4px; - font-size: 10px; - font-weight: 600; - padding: 2px 8px; - border-radius: 99px; -} - -.status-ok { background: var(--green-faint); color: var(--green); border: 1px solid rgba(16,185,129,0.25); } -.status-error { background: var(--red-faint); color: var(--red); border: 1px solid rgba(239,68,68,0.25); } +::-webkit-scrollbar { @apply w-2 h-2; } +::-webkit-scrollbar-track { @apply bg-transparent; } +::-webkit-scrollbar-thumb { @apply bg-border-subtle rounded-full; } -/* ═══════════════════════════════════════════════════════════════ - DETAIL PANEL BODY -═══════════════════════════════════════════════════════════════ */ -.detail-body { - padding: 14px 16px; - flex: 1; - overflow: auto; +/* Custom Nodes - Overriding inline styles using !important via Tailwind utility prefix ! */ +.react-flow__node > div { + @apply !bg-bg-surface !border !border-border-subtle !rounded-md !min-w-[180px] !max-w-[240px] !cursor-pointer !shadow-sm !transition-all !font-sans !text-text-primary !p-0 !overflow-hidden; } - -.detail-section { - margin-bottom: 16px; +.react-flow__node > div:hover { + @apply !border-border-active !shadow-md; } - -.detail-section-label { - font-size: 10px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--text-muted); - margin-bottom: 8px; +.react-flow__node.selected > div { + @apply !border-2 !border-accent-blue; + box-shadow: 0 4px 16px rgba(100, 132, 160, 0.2) !important; } -.kv-grid { - display: flex; - flex-direction: column; - gap: 6px; +/* Hide handles visually */ +.react-flow__handle { + @apply !opacity-0 !w-1 !h-1; } -.kv-row { - display: grid; - grid-template-columns: 90px 1fr; - gap: 8px; - align-items: start; +/* Node Top (Kind badge row) */ +.react-flow__node > div > div:nth-child(3) { + @apply !px-3 !py-2 !border-b !border-border-subtle !bg-bg-base !flex !items-center !justify-between !rounded-t-md !mb-0; } -.kv-key { - font-size: 11px; - color: var(--text-muted); - font-weight: 500; - padding-top: 1px; -} - -.kv-val { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--text-secondary); - word-break: break-all; - line-height: 1.5; -} - -.kv-val-text { - font-family: 'Inter', sans-serif; - font-size: 12px; - color: var(--text-primary); - line-height: 1.6; - white-space: pre-wrap; - word-break: break-word; -} - -/* ═══════════════════════════════════════════════════════════════ - CODE BLOCK (payload viewer) -═══════════════════════════════════════════════════════════════ */ -.code-block { - background: var(--bg-base); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-md); - padding: 12px; - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--text-secondary); - overflow: auto; - max-height: 280px; - white-space: pre; - line-height: 1.6; -} - -/* ═══════════════════════════════════════════════════════════════ - TRACE META STRIP (top of sidebar) -═══════════════════════════════════════════════════════════════ */ -.trace-meta-strip { - padding: 12px 16px; - border-bottom: 1px solid var(--border-subtle); - display: flex; - flex-direction: column; - gap: 6px; - background: var(--bg-card); - flex-shrink: 0; -} - -.trace-meta-id { - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - color: var(--accent-light); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.trace-meta-row { - display: flex; - gap: 10px; - flex-wrap: wrap; -} - -.trace-stat { - display: flex; - align-items: center; - gap: 5px; - font-size: 11px; - color: var(--text-secondary); -} - -.trace-stat-num { - font-weight: 600; - color: var(--text-primary); - font-family: 'JetBrains Mono', monospace; +/* Node Actor */ +.react-flow__node > div > div:nth-child(4) { + @apply !text-[11px] !px-3 !pt-2.5 !mb-1; + color: var(--text-secondary) !important; + font-family: var(--font-sans) !important; } -/* ═══════════════════════════════════════════════════════════════ - CUSTOM REACT FLOW NODE STYLES (injected via inline style in App) -═══════════════════════════════════════════════════════════════ */ -.afr-node { - background: var(--bg-card); - border: 1px solid var(--border-subtle); - border-radius: var(--radius-md); - padding: 10px 14px; - min-width: 180px; - max-width: 240px; - cursor: pointer; - transition: border-color 0.2s, box-shadow 0.2s, transform 0.15s; - font-family: 'Inter', sans-serif; +/* Node Preview Action */ +.react-flow__node > div > div:nth-child(5) { + @apply !text-[12px] !font-serif !font-medium !px-3 !pb-2.5; + color: var(--text-primary) !important; + font-family: var(--font-serif) !important; } -.afr-node:hover { - border-color: var(--border-active); - box-shadow: 0 0 0 3px var(--accent-faint), var(--shadow-card); - transform: translateY(-1px); +/* Fix any inline styles explicitly if needed */ +.node-diff-highlight > div { + animation: diff-pulse 2s ease-in-out infinite !important; } - -.afr-node.selected { - border-color: var(--accent); - box-shadow: 0 0 0 3px var(--accent-faint), 0 0 16px var(--accent-glow); +@keyframes diff-pulse { + 0%, 100% { box-shadow: 0 0 0 3px rgba(184,156,114,0.25), 0 0 18px rgba(184,156,114,0.45) !important; } + 50% { box-shadow: 0 0 0 5px rgba(184,156,114,0.4), 0 0 28px rgba(184,156,114,0.65) !important; } } -.afr-node.error { - border-color: var(--red); - box-shadow: 0 0 0 3px var(--red-faint), 0 0 12px var(--red-glow); +.node-loop-highlight > div { + animation: loop-pulse 1.8s ease-in-out infinite !important; } - -/* ═══════════════════════════════════════════════════════════════ - SCROLLBAR STYLE -═══════════════════════════════════════════════════════════════ */ -::-webkit-scrollbar { width: 5px; height: 5px; } -::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { background: var(--bg-hover); border-radius: 99px; } -::-webkit-scrollbar-thumb:hover { background: var(--border-active); } - -/* ═══════════════════════════════════════════════════════════════ - DIVIDER -═══════════════════════════════════════════════════════════════ */ -.divider { - height: 1px; - background: var(--border-subtle); - margin: 12px 0; +@keyframes loop-pulse { + 0%, 100% { box-shadow: 0 0 0 3px rgba(201,122,109,0.3), 0 0 20px rgba(201,122,109,0.5) !important; } + 50% { box-shadow: 0 0 0 6px rgba(201,122,109,0.5), 0 0 32px rgba(201,122,109,0.7) !important; } } \ No newline at end of file diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 5072d0b..6ac6c6d 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,8 +1,9 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ - plugins: [react()], + plugins: [react(), tailwindcss()], server: { port: 5173 } diff --git a/package-lock.json b/package-lock.json index d72f787..609f5b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@aerograph/contracts/-/contracts-0.2.0.tgz", "integrity": "sha512-uA0gf/KmAE26qatM03KAfJ+C77WNnbHNUUmZJEIn7mCOAPEPWqDqaDW1qQVt47tJRXG5UCIRdeNAAI4u5NwN3w==", + "extraneous": true, "license": "Apache-2.0", "dependencies": { "zod": "^3.25.0" @@ -74,9 +75,11 @@ "version": "0.2.1", "dependencies": { "@aerograph/contracts": "0.2.1", + "@tailwindcss/vite": "^4.3.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "reactflow": "^11.11.4" + "reactflow": "^11.11.4", + "tailwindcss": "^4.3.1" }, "devDependencies": { "@eslint/js": "^9.9.0", @@ -1689,7 +1692,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1700,7 +1702,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1711,7 +1712,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1721,14 +1721,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1941,7 +1939,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1955,7 +1952,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1969,7 +1965,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1983,7 +1978,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1997,7 +1991,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2011,7 +2004,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2025,7 +2017,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2039,7 +2030,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2053,7 +2043,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2067,7 +2056,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2081,7 +2069,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2095,7 +2082,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2109,7 +2095,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2123,7 +2108,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2137,7 +2121,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2151,7 +2134,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2165,7 +2147,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2179,7 +2160,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2193,7 +2173,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2207,7 +2186,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2221,7 +2199,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2235,7 +2212,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2249,7 +2225,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2263,7 +2238,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2277,13 +2251,269 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@tailwindcss/node": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", + "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", + "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-x64": "4.3.1", + "@tailwindcss/oxide-freebsd-x64": "4.3.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-x64-musl": "4.3.1", + "@tailwindcss/oxide-wasm32-wasi": "4.3.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", + "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", + "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", + "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", + "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", + "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", + "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", + "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", + "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", + "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", + "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", + "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", + "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", + "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.1", + "@tailwindcss/oxide": "4.3.1", + "tailwindcss": "4.3.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", @@ -4220,6 +4450,19 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4828,7 +5071,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4939,6 +5181,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5136,6 +5384,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tiktoken": { "version": "1.0.21", "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", @@ -5384,6 +5641,255 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5440,7 +5946,6 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -5926,7 +6431,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -5946,7 +6450,6 @@ "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5975,7 +6478,6 @@ "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, "funding": [ { "type": "github", @@ -6213,7 +6715,6 @@ "version": "4.60.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -6258,7 +6759,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/safe-buffer": { @@ -6523,7 +7023,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6645,6 +7144,25 @@ "node": ">=8" } }, + "node_modules/tailwindcss": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -7015,7 +7533,6 @@ "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", @@ -7101,7 +7618,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7118,7 +7634,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7135,7 +7650,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7152,7 +7666,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7169,7 +7682,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7186,7 +7698,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7203,7 +7714,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7220,7 +7730,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7237,7 +7746,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7254,7 +7762,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7271,7 +7778,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7288,7 +7794,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7305,7 +7810,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7322,7 +7826,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7339,7 +7842,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7356,7 +7858,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7373,7 +7874,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7390,7 +7890,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7407,7 +7906,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7424,7 +7922,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7441,7 +7938,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7458,7 +7954,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7475,7 +7970,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7489,7 +7983,6 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": {