From 6faa3bdc9396de9ab123074a0f66635e9997119d Mon Sep 17 00:00:00 2001 From: Sasha Fortel <166897058+sashathelambo@users.noreply.github.com> Date: Mon, 25 May 2026 19:10:48 -0500 Subject: [PATCH] chore: remove web/ source directory (assets preserved in rust/web-dist) --- web/.gitignore | 1 - web/dist/assets/index-BDXAD0jB.css | 1 - web/dist/assets/index-CAORPbg2.js | 16 - web/dist/index.html | 13 - web/index.html | 12 - web/package-lock.json | 1942 ------------------------- web/package.json | 20 - web/scripts/reference-opencode.sh | 55 - web/src/App.tsx | 650 --------- web/src/assets/mcpway-ascii-logo.svg | 21 - web/src/main.tsx | 10 - web/src/styles.css | 405 ------ web/src/ui/brand-logo.tsx | 19 - web/src/ui/primitives/button.css | 103 -- web/src/ui/primitives/button.tsx | 29 - web/src/ui/primitives/card.css | 41 - web/src/ui/primitives/card.tsx | 23 - web/src/ui/primitives/icon-button.css | 65 - web/src/ui/primitives/icon-button.tsx | 30 - web/src/ui/primitives/index.css | 9 - web/src/ui/primitives/index.ts | 6 - web/src/ui/primitives/scroll-view.css | 29 - web/src/ui/primitives/scroll-view.tsx | 20 - web/src/ui/primitives/select.css | 156 -- web/src/ui/primitives/select.tsx | 93 -- web/src/ui/primitives/shared.css | 13 - web/src/ui/primitives/text-field.css | 85 -- web/src/ui/primitives/text-field.tsx | 111 -- web/src/ui/surfaces/error-format.ts | 145 -- web/src/ui/surfaces/error-overlay.css | 271 ---- web/src/ui/surfaces/error-overlay.tsx | 153 -- web/src/ui/surfaces/error-screen.css | 102 -- web/src/ui/surfaces/error-screen.tsx | 40 - web/src/ui/theme/base.css | 40 - web/src/ui/theme/tokens.css | 88 -- web/tsconfig.json | 11 - web/vite.config.ts | 14 - 37 files changed, 4842 deletions(-) delete mode 100644 web/.gitignore delete mode 100644 web/dist/assets/index-BDXAD0jB.css delete mode 100644 web/dist/assets/index-CAORPbg2.js delete mode 100644 web/dist/index.html delete mode 100644 web/index.html delete mode 100644 web/package-lock.json delete mode 100644 web/package.json delete mode 100755 web/scripts/reference-opencode.sh delete mode 100644 web/src/App.tsx delete mode 100644 web/src/assets/mcpway-ascii-logo.svg delete mode 100644 web/src/main.tsx delete mode 100644 web/src/styles.css delete mode 100644 web/src/ui/brand-logo.tsx delete mode 100644 web/src/ui/primitives/button.css delete mode 100644 web/src/ui/primitives/button.tsx delete mode 100644 web/src/ui/primitives/card.css delete mode 100644 web/src/ui/primitives/card.tsx delete mode 100644 web/src/ui/primitives/icon-button.css delete mode 100644 web/src/ui/primitives/icon-button.tsx delete mode 100644 web/src/ui/primitives/index.css delete mode 100644 web/src/ui/primitives/index.ts delete mode 100644 web/src/ui/primitives/scroll-view.css delete mode 100644 web/src/ui/primitives/scroll-view.tsx delete mode 100644 web/src/ui/primitives/select.css delete mode 100644 web/src/ui/primitives/select.tsx delete mode 100644 web/src/ui/primitives/shared.css delete mode 100644 web/src/ui/primitives/text-field.css delete mode 100644 web/src/ui/primitives/text-field.tsx delete mode 100644 web/src/ui/surfaces/error-format.ts delete mode 100644 web/src/ui/surfaces/error-overlay.css delete mode 100644 web/src/ui/surfaces/error-overlay.tsx delete mode 100644 web/src/ui/surfaces/error-screen.css delete mode 100644 web/src/ui/surfaces/error-screen.tsx delete mode 100644 web/src/ui/theme/base.css delete mode 100644 web/src/ui/theme/tokens.css delete mode 100644 web/tsconfig.json delete mode 100644 web/vite.config.ts diff --git a/web/.gitignore b/web/.gitignore deleted file mode 100644 index c2658d7..0000000 --- a/web/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/web/dist/assets/index-BDXAD0jB.css b/web/dist/assets/index-BDXAD0jB.css deleted file mode 100644 index fdb8bba..0000000 --- a/web/dist/assets/index-BDXAD0jB.css +++ /dev/null @@ -1 +0,0 @@ -@layer theme{:root{color-scheme:dark;--font-family-sans: "Inter", "IBM Plex Sans", "Segoe UI", sans-serif;--font-family-mono: "IBM Plex Mono", "JetBrains Mono", "Fira Code", monospace;--font-size-small: 12px;--font-size-base: 14px;--font-size-large: 16px;--font-weight-regular: 400;--font-weight-medium: 500;--line-height-normal: 1.3;--line-height-large: 1.45;--radius-sm: .25rem;--radius-md: .375rem;--bg: #101114;--fg: #dde1ea;--cursor: #f5f7fa;--accent: #4a90e2;--muted: #3a3f4b;--ok: #27c93f;--warn: #ffbd2e;--err: #ff5f56;--surface-1: color-mix(in oklab, var(--bg) 89%, white 11%);--surface-2: color-mix(in oklab, var(--bg) 84%, white 16%);--surface-3: color-mix(in oklab, var(--bg) 79%, white 21%);--surface-disabled: color-mix(in oklab, var(--surface-2) 84%, black 16%);--line-soft: color-mix(in oklab, var(--fg) 18%, transparent);--line-strong: color-mix(in oklab, var(--fg) 31%, transparent);--panel-shadow: 0 18px 50px color-mix(in oklab, black 42%, transparent);--background-base: var(--bg);--background-weak: var(--surface-1);--surface-inset-base: color-mix(in oklab, var(--surface-2) 90%, black 10%);--surface-base-hover: color-mix(in oklab, var(--surface-2) 82%, black 18%);--surface-base-active: color-mix(in oklab, var(--surface-2) 74%, black 26%);--surface-raised-base: var(--surface-2);--surface-raised-base-active: color-mix(in oklab, var(--surface-2) 68%, black 32%);--surface-raised-base-hover: color-mix(in oklab, var(--surface-2) 74%, white 26%);--surface-raised-stronger-non-alpha: var(--surface-1);--input-base: color-mix(in oklab, var(--surface-2) 90%, black 10%);--input-hover: color-mix(in oklab, var(--surface-2) 85%, black 15%);--text-strong: var(--fg);--text-base: color-mix(in oklab, var(--fg) 87%, transparent);--text-weak: color-mix(in oklab, var(--fg) 70%, transparent);--button-secondary-base: color-mix(in oklab, var(--surface-2) 90%, black 10%);--button-secondary-hover: color-mix(in oklab, var(--surface-2) 78%, white 22%);--button-primary-base: color-mix(in oklab, var(--accent) 78%, black 22%);--border-base: var(--line-strong);--border-weak-base: var(--line-soft);--border-weaker-base: color-mix(in oklab, var(--line-soft) 70%, transparent);--border-strong-base: color-mix(in oklab, var(--line-strong) 92%, white 8%);--border-critical-base: color-mix(in oklab, var(--err) 62%, transparent);--border-selected: color-mix(in oklab, var(--accent) 75%, white 25%);--border-weak-selected: color-mix(in oklab, var(--accent) 35%, transparent);--surface-critical-weak: color-mix(in oklab, var(--surface-2) 70%, var(--err) 30%);--text-on-critical-base: color-mix(in oklab, var(--err) 82%, white 18%);--icon-base: color-mix(in oklab, var(--fg) 68%, transparent);--icon-disabled: color-mix(in oklab, var(--fg) 42%, transparent);--icon-strong-base: color-mix(in oklab, var(--fg) 92%, transparent);--icon-strong-hover: color-mix(in oklab, var(--button-primary-base) 84%, black 16%);--icon-strong-focus: color-mix(in oklab, var(--button-primary-base) 80%, black 20%);--icon-strong-active: color-mix(in oklab, var(--button-primary-base) 72%, black 28%);--icon-strong-disabled: color-mix(in oklab, var(--button-primary-base) 36%, black 64%);--icon-invert-base: color-mix(in oklab, var(--fg) 96%, white 4%);--shadow-xs-border-base: 0 0 0 1px var(--border-weak-base), 0 1px 2px -1px color-mix(in oklab, black 40%, transparent), 0 1px 2px 0 color-mix(in oklab, black 30%, transparent);--shadow-xs-border: var(--shadow-xs-border-base);--shadow-xs-border-focus: 0 0 0 3px var(--border-weak-selected), 0 0 0 1px var(--border-selected), 0 1px 2px -1px color-mix(in oklab, black 42%, transparent), 0 1px 2px 0 color-mix(in oklab, black 32%, transparent)}}@layer base{*,*:before,*:after{box-sizing:border-box}html,body,#root{margin:0;width:100%;min-width:0;height:100%;min-height:100dvh}body{font-family:var(--font-family-mono);color:var(--text-strong);background:radial-gradient(120% 120% at 100% 0%,color-mix(in oklab,var(--accent) 14%,transparent) 0%,transparent 45%),radial-gradient(140% 120% at 0% 100%,color-mix(in oklab,var(--muted) 28%,transparent) 0%,transparent 56%),repeating-linear-gradient(90deg,color-mix(in oklab,var(--bg) 95%,white 5%) 0 1px,transparent 1px 20px),linear-gradient(160deg,color-mix(in oklab,var(--bg) 94%,white 6%) 0%,var(--bg) 62%);overflow:hidden}button,input,select,textarea{font:inherit;color:inherit}}@layer components;@layer components.components{.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}}@layer components.components{[data-component=button]{display:inline-flex;align-items:center;justify-content:center;border-style:solid;border-width:1px;border-radius:var(--radius-md);text-decoration:none;user-select:none;cursor:pointer;outline:none;white-space:nowrap;&[data-variant=primary]{background-color:var(--button-primary-base);border-color:var(--border-weak-base);color:var(--icon-invert-base);&:hover:not(:disabled){background-color:var(--icon-strong-hover)}&:focus:not(:disabled){background-color:var(--icon-strong-focus)}&:active:not(:disabled){background-color:var(--icon-strong-active)}&:disabled{background-color:var(--icon-strong-disabled)}}&[data-variant=ghost]{border-color:transparent;background-color:transparent;color:var(--text-strong);&:hover:not(:disabled),&:focus-visible:not(:disabled){background-color:var(--surface-base-hover)}&:active:not(:disabled){background-color:var(--surface-base-active)}&:disabled{color:var(--text-weak);cursor:not-allowed}}&[data-variant=secondary]{border:transparent;background-color:var(--button-secondary-base);color:var(--text-strong);box-shadow:var(--shadow-xs-border-base);&:hover:not(:disabled){background-color:var(--button-secondary-hover)}&:focus-visible:not(:active){background-color:var(--button-secondary-base);box-shadow:var(--shadow-xs-border-focus)}&:disabled{background-color:var(--surface-disabled);color:var(--text-weak);cursor:not-allowed}}&[data-size=small]{height:24px;padding:0 8px;font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}&[data-size=normal]{height:28px;padding:0 10px;font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}&[data-size=large]{height:32px;padding:0 12px;font-family:var(--font-family-sans);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}&:focus{outline:none}}}@layer components.components{[data-component=icon-button]{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);text-decoration:none;user-select:none;aspect-ratio:1;flex-shrink:0;border:1px solid transparent;&[data-size=small]{width:20px;height:20px;font-size:.8rem}&[data-size=normal]{width:24px;height:24px;font-size:.9rem}&[data-size=large]{width:32px;height:32px;font-size:1rem}&[data-variant=secondary]{background-color:var(--button-secondary-base);color:var(--text-strong);box-shadow:var(--shadow-xs-border-base);&:hover:not(:disabled){background-color:var(--button-secondary-hover)}}&[data-variant=primary]{background-color:var(--icon-strong-base);color:var(--icon-invert-base);&:hover:not(:disabled){background-color:var(--icon-strong-hover)}}&[data-variant=ghost]{background-color:transparent;color:var(--icon-base);&:hover:not(:disabled),&:focus-visible:not(:disabled){background-color:var(--surface-base-hover)}}&:disabled{opacity:.65;cursor:not-allowed}}}@layer components.components{[data-component=card]{width:100%;display:flex;flex-direction:column;background-color:var(--surface-inset-base);border:1px solid var(--border-weaker-base);border-radius:var(--radius-md);padding:6px 12px;overflow:clip;color:var(--text-base)}[data-component=card][data-variant=error]{background-color:var(--surface-critical-weak);border-color:var(--border-critical-base);color:var(--text-on-critical-base);font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-regular);line-height:var(--line-height-large)}[data-component=card][data-variant=warning]{border-color:color-mix(in oklab,var(--warn) 55%,transparent);background:color-mix(in oklab,var(--surface-3) 80%,var(--warn) 20%);color:color-mix(in oklab,var(--warn) 90%,white 10%)}[data-component=card][data-variant=success]{border-color:color-mix(in oklab,var(--ok) 55%,transparent);background:color-mix(in oklab,var(--surface-3) 80%,var(--ok) 20%);color:color-mix(in oklab,var(--ok) 90%,white 10%)}[data-component=card][data-variant=info]{border-color:color-mix(in oklab,var(--accent) 55%,transparent);background:color-mix(in oklab,var(--surface-3) 80%,var(--accent) 20%);color:color-mix(in oklab,var(--accent) 90%,white 10%)}}@layer components.components{[data-component=input]{width:100%;[data-slot=input-input]{width:100%;color:var(--text-strong);font-family:var(--font-family-sans);font-size:var(--font-size-base);font-weight:var(--font-weight-regular);line-height:var(--line-height-large);&:focus{outline:none}&::placeholder{color:var(--text-weak)}}&[data-variant=normal]{display:flex;flex-direction:column;align-items:flex-start;gap:8px;[data-slot=input-label]{color:var(--text-weak);font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}[data-slot=input-wrapper]{display:flex;align-items:start;justify-content:space-between;width:100%;border-radius:var(--radius-md);border:1px solid var(--border-weak-base);background:var(--input-base);&:focus-within:not(:has([readonly])){border-color:transparent;box-shadow:var(--shadow-xs-border-focus)}}[data-slot=input-input]{color:var(--text-strong);display:flex;min-height:32px;padding:6px 10px;align-items:center;flex:1;min-width:0;background:transparent;border:none}textarea[data-slot=input-input]{height:auto;min-height:76px;resize:vertical}[data-slot=input-error]{color:var(--text-on-critical-base);font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}[data-slot=input-description]{color:var(--text-weak);font-family:var(--font-family-sans);font-size:var(--font-size-small);line-height:var(--line-height-large)}}}}@layer components.components{[data-component=select-field]{width:100%;display:grid;gap:8px;[data-slot=select-label]{color:var(--text-weak);font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large)}[data-slot=select-error]{margin:0;color:var(--text-on-critical-base);font-family:var(--font-family-sans);font-size:var(--font-size-small);line-height:var(--line-height-large)}}[data-component=select]{[data-slot=select-select-trigger]{width:100%;justify-content:space-between;padding:0 8px 0 10px;box-shadow:none;[data-slot=select-select-trigger-value]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-slot=select-select-trigger-icon]{width:16px;height:16px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--text-weak);transition:transform .1s ease-in-out}&[data-expanded]{background-color:var(--button-secondary-hover);box-shadow:var(--shadow-xs-border-base);[data-slot=select-select-trigger-icon]{transform:rotate(180deg)}}&:not([data-expanded]):focus-visible{background-color:var(--button-secondary-base)}}}[data-component=select-content]{width:max(var(--kb-popper-anchor-width, 0px),160px);min-width:max(var(--kb-popper-anchor-width, 0px),160px);max-width:min(23rem,var(--kb-popper-content-available-width, 23rem));overflow:hidden;border-radius:var(--radius-md);background-color:var(--surface-raised-stronger-non-alpha);padding:4px;box-shadow:var(--shadow-xs-border);border:1px solid var(--border-weaker-base);z-index:120;&[data-expanded]{animation:select-open .15s ease-out}[data-slot=select-select-content-list]{width:100%;margin:0;padding:0;list-style:none;overflow-y:auto;max-height:12rem;white-space:nowrap;overflow-x:hidden;display:flex;flex-direction:column;&:focus{outline:none}>*:not([role=presentation])+*:not([role=presentation]){margin-top:2px}}[data-slot=select-select-item]{position:relative;display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:2px 8px;gap:12px;border-radius:4px;cursor:default;font-family:var(--font-family-sans);font-size:var(--font-size-small);font-weight:var(--font-weight-medium);line-height:var(--line-height-large);color:var(--text-strong);transition:background-color .2s ease-in-out,color .2s ease-in-out;outline:none;user-select:none;&[data-highlighted]{background:var(--surface-raised-base-hover)}&:hover{background:var(--surface-raised-base-hover)}[data-slot=select-select-item-indicator]{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:16px;height:16px}[data-slot=select-select-item-label]{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}}}@keyframes select-open{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}}@layer components.components{[data-component=scroll-view]{position:relative;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--border-weaker-base) transparent}[data-component=scroll-view]::-webkit-scrollbar{width:10px;height:10px}[data-component=scroll-view]::-webkit-scrollbar-track{background:transparent}[data-component=scroll-view]::-webkit-scrollbar-thumb{background:var(--border-weaker-base);border-radius:999px;border:2px solid transparent;background-clip:content-box}[data-component=scroll-view]::-webkit-scrollbar-thumb:hover{background:var(--border-strong-base);background-clip:content-box}}@layer components{.fatal-error-page{width:100%;min-height:100dvh;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(120% 120% at 100% 0%,color-mix(in oklab,var(--err) 12%,transparent) 0%,transparent 42%),radial-gradient(140% 120% at 0% 100%,color-mix(in oklab,var(--accent) 12%,transparent) 0%,transparent 56%),linear-gradient(160deg,color-mix(in oklab,var(--bg) 95%,black 5%) 0%,var(--bg) 62%)}.fatal-error-card{width:min(900px,100%);max-height:calc(100dvh - 56px);border:1px solid color-mix(in oklab,var(--err) 52%,transparent);background:color-mix(in oklab,var(--surface-1) 92%,black 8%);box-shadow:0 30px 100px color-mix(in oklab,black 58%,transparent);padding:18px;display:grid;gap:14px}.fatal-error-logo{width:min(420px,100%);height:auto;display:block;filter:drop-shadow(0 0 10px color-mix(in oklab,var(--accent) 28%,transparent))}.fatal-error-header{display:grid;gap:6px}.fatal-error-header h1{margin:0;font-family:var(--font-family-sans);font-size:1.04rem;font-weight:640;letter-spacing:.08em;text-transform:uppercase}.fatal-error-header p{margin:0;font-family:var(--font-family-sans);font-size:.84rem;color:color-mix(in oklab,var(--fg) 78%,transparent)}.fatal-error-field{width:100%}.fatal-error-field [data-slot=input-wrapper]{width:100%;box-sizing:border-box;border-radius:0;min-height:min(50dvh,420px)}.fatal-error-field [data-slot=input-input]{width:100%;box-sizing:border-box;border-radius:0;min-height:min(50dvh,420px);font-family:var(--font-family-mono);font-size:.78rem;line-height:1.48;white-space:pre-wrap}.fatal-error-actions{display:flex;align-items:center;gap:8px;justify-content:flex-end}@media (max-width: 760px){.fatal-error-page{padding:12px}.fatal-error-card{max-height:calc(100dvh - 24px);padding:12px}.fatal-error-actions{width:100%;flex-direction:column}.fatal-error-actions [data-component=button]{width:100%}}}@layer components{.app-overlay-backdrop[data-component=dialog-overlay]{position:fixed;inset:0;z-index:9998;background-color:var(--background-base);backdrop-filter:none}.app-overlay[data-component=dialog]{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;pointer-events:none}.app-overlay-container[data-slot=dialog-container]{position:relative;z-index:9999;width:min(calc(100vw - 16px),640px);height:min(calc(100dvh - 16px),560px);display:flex;flex-direction:column}.app-overlay-card{width:100%;height:100%;min-height:320px;pointer-events:auto;overflow:hidden;border:1px solid color-mix(in oklab,var(--err) 60%,transparent);border-radius:0;background:var(--surface-raised-stronger-non-alpha);box-shadow:none;display:grid;grid-template-rows:auto auto auto minmax(0,1fr) auto;gap:0;scrollbar-width:none;-ms-overflow-style:none}.app-overlay-card::-webkit-scrollbar{display:none}.app-overlay-header{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:20px 20px 14px;border-bottom:1px solid color-mix(in oklab,var(--line-soft) 74%,transparent);background:color-mix(in oklab,var(--surface-2) 90%,black 10%)}.app-overlay-title{margin:0;font-family:var(--font-family-sans);font-size:var(--font-size-large);font-weight:var(--font-weight-medium);line-height:1.5;letter-spacing:-.01em}.app-overlay-header-actions{display:flex;align-items:center;gap:6px;flex:0 0 auto}.app-overlay-message{margin:0;padding:14px 20px 12px;font-family:var(--font-family-sans);color:color-mix(in oklab,var(--fg) 88%,transparent);font-size:var(--font-size-base);line-height:var(--line-height-large);border-bottom:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent);background:color-mix(in oklab,var(--surface-1) 90%,black 10%)}.app-overlay-meta{margin:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent);background:color-mix(in oklab,var(--surface-1) 92%,black 8%)}.app-overlay-meta>div{min-width:0;display:grid;gap:4px;padding:8px 14px}.app-overlay-meta>div+div{border-left:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent)}.app-overlay-meta dt{margin:0;font-family:var(--font-family-sans);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;color:color-mix(in oklab,var(--fg) 65%,transparent)}.app-overlay-meta dd{margin:0;font-size:.76rem;color:color-mix(in oklab,var(--fg) 94%,transparent);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.app-overlay-meta-kind dd{display:flex;align-items:center}.app-overlay-body{min-height:0;padding:12px 20px;display:grid;gap:8px;align-content:start;background:color-mix(in oklab,var(--surface-1) 92%,black 8%)}.app-overlay-section-title{margin:0;font-family:var(--font-family-sans);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in oklab,var(--fg) 72%,transparent)}.app-overlay-details{margin:0;width:100%;box-sizing:border-box;border:1px solid var(--line-soft);border-radius:0;background:color-mix(in oklab,var(--surface-3) 84%,black 16%);padding:10px;font-size:.74rem;line-height:1.4;max-height:min(44vh,340px);overflow:auto;white-space:pre-wrap;word-break:break-word}.app-overlay-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px;padding:14px 20px 20px;border-top:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent);background:color-mix(in oklab,var(--surface-2) 90%,black 10%)}.app-overlay-backdrop[data-component=dialog-overlay]{animation:overlayHide .1s ease-in forwards}.app-overlay-backdrop[data-component=dialog-overlay][data-expanded]{animation:overlayShow .15s ease-out}.app-overlay-card[data-slot=dialog-content]{animation:contentHide .1s ease-in forwards}.app-overlay-card[data-slot=dialog-content][data-expanded]{animation:contentShow .15s ease-out}@media (max-width: 760px){.app-overlay-container[data-slot=dialog-container]{width:min(calc(100vw - 12px),640px);height:min(calc(100dvh - 12px),560px)}.app-overlay-header{padding:14px 12px 10px}.app-overlay-meta{grid-template-columns:1fr}.app-overlay-meta>div{padding:8px 12px}.app-overlay-meta>div+div{border-left:none;border-top:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent)}.app-overlay-body{padding:10px 12px}.app-overlay-details{max-height:min(46vh,300px)}.app-overlay-actions{width:100%;flex-direction:column;padding:10px 12px 12px}.app-overlay-actions [data-component=button]{width:100%}}@keyframes overlayShow{0%{opacity:0}to{opacity:1}}@keyframes overlayHide{0%{opacity:1}to{opacity:0}}@keyframes contentShow{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}@keyframes contentHide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.98)}}}.shell{width:100%;min-width:0;min-height:100dvh;height:100dvh;padding:16px;display:grid;grid-template-rows:auto minmax(0,1fr);gap:14px}.topbar{border:1px solid var(--line-strong);background:color-mix(in oklab,var(--surface-2) 92%,black 8%);box-shadow:var(--panel-shadow);padding:12px 14px;display:flex;justify-content:space-between;align-items:center;gap:12px}.topbar-copy{min-width:0;flex:1 1 auto}.topbar-brand-inline{display:flex;align-items:center;gap:12px;min-width:0}.topbar-logo{--topbar-logo-height: clamp(42px, 4.8vw, 58px);height:var(--topbar-logo-height);width:auto;max-width:clamp(160px,24vw,240px);display:block;image-rendering:auto;filter:drop-shadow(0 0 8px color-mix(in oklab,var(--accent) 24%,transparent))}.topbar-subtitle{margin:0;color:color-mix(in oklab,var(--fg) 74%,transparent);font-family:var(--font-family-sans);font-size:.83rem;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.topbar-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:nowrap;flex:0 0 auto}.status-badge{border:1px solid var(--line-strong);background:color-mix(in oklab,var(--surface-3) 92%,black 8%);padding:7px 10px;text-transform:uppercase;letter-spacing:.08em;font-family:var(--font-family-sans);font-size:.72rem;white-space:nowrap}.status-live{color:var(--ok)}.status-connecting{color:var(--warn)}.status-disconnected,.status-stream-error,.status-stream-parse-error,.status-auth-required-or-api-unavailable{color:var(--err)}.error-kind{border:1px solid var(--line-soft);padding:3px 6px;font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;background:color-mix(in oklab,var(--surface-2) 85%,black 15%)}.error-kind-runtime,.error-kind-promise{color:color-mix(in oklab,var(--err) 82%,white 18%)}.error-kind-network{color:color-mix(in oklab,var(--warn) 82%,white 18%)}.error-kind-socket{color:color-mix(in oklab,var(--accent) 82%,white 18%)}.layout{min-height:0;height:100%}.layout-grid-fixed{min-height:0;height:100%;display:grid;grid-template-columns:1fr 2fr 1fr;gap:14px}.panel{display:grid;min-height:0;overflow:hidden;border:1px solid var(--line-soft);background:color-mix(in oklab,var(--surface-1) 93%,black 7%);box-shadow:var(--panel-shadow)}.sidebar{grid-template-rows:auto minmax(0,1fr)}.sidebar-body{padding:12px;display:grid;gap:12px;align-content:start;overflow:auto}.group{border:1px solid color-mix(in oklab,var(--line-soft) 80%,transparent);background:color-mix(in oklab,var(--surface-2) 90%,black 10%);padding:10px;display:grid;gap:8px}.sidebar h2,.metrics h2,.logs h2{margin:0;text-transform:uppercase;letter-spacing:.1em;font-family:var(--font-family-sans);font-size:.7rem;color:color-mix(in oklab,var(--fg) 72%,transparent)}.panel-error{margin:0;width:100%;box-sizing:border-box;border-radius:0}.sessions{max-height:190px;overflow:auto;display:grid;gap:6px}.sessions code,.empty{border:1px solid var(--line-soft);background:color-mix(in oklab,var(--surface-3) 84%,black 16%);padding:5px 7px;font-size:.73rem}.logs,.metrics{grid-template-rows:auto auto minmax(0,1fr)}.metrics{grid-template-rows:auto minmax(0,1fr)}.panel-header{padding:10px 12px;border-bottom:1px solid var(--line-soft);display:flex;align-items:center;justify-content:space-between;background:color-mix(in oklab,var(--surface-2) 90%,black 10%)}.meta{color:color-mix(in oklab,var(--fg) 70%,transparent);text-transform:uppercase;letter-spacing:.08em;font-family:var(--font-family-sans);font-size:.68rem}.log-grid{overflow:auto;display:grid;align-content:start}.log-row{display:grid;grid-template-columns:88px 66px 130px minmax(0,1fr);gap:10px;align-items:center;padding:9px 11px;border-bottom:1px solid color-mix(in oklab,var(--line-soft) 68%,transparent);font-size:.8rem}.log-row:nth-child(odd){background:color-mix(in oklab,var(--surface-1) 96%,black 4%)}.log-row:hover{background:color-mix(in oklab,var(--accent) 6%,var(--surface-2))}.log-time{color:color-mix(in oklab,var(--fg) 66%,transparent)}.level{text-transform:uppercase;letter-spacing:.06em;font-family:var(--font-family-sans);font-size:.68rem}.level-debug{color:color-mix(in oklab,var(--muted) 82%,white 18%)}.level-info{color:color-mix(in oklab,var(--accent) 84%,white 16%)}.level-warn{color:color-mix(in oklab,var(--warn) 82%,white 18%)}.level-error{color:color-mix(in oklab,var(--err) 82%,white 18%)}.log-source{color:color-mix(in oklab,var(--fg) 78%,transparent);font-size:.73rem}.log-message{margin:0;line-height:1.42;font-size:.81rem;color:color-mix(in oklab,var(--fg) 93%,transparent);white-space:pre-wrap;word-break:break-word}.metrics-body{padding:12px;display:grid;align-content:start;gap:12px;overflow:auto}.metrics dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:6px 10px;font-size:.8rem}.metrics dt{color:color-mix(in oklab,var(--fg) 72%,transparent)}.metrics dd{margin:0}.metrics pre{margin:0;padding:10px;border:1px solid var(--line-soft);background:color-mix(in oklab,var(--surface-3) 84%,black 16%);overflow:auto;font-size:.72rem;line-height:1.44;max-height:none}.metrics-scroll{max-height:56vh}@media (max-width: 1120px){.shell{min-height:100dvh;height:100dvh;padding:12px}.topbar{flex-wrap:wrap;align-items:center}.topbar-copy{flex:1 1 440px}.topbar-actions{flex-wrap:wrap}.layout-grid-fixed{grid-template-columns:1fr;gap:14px;height:auto}.logs{min-height:52vh}.log-row{grid-template-columns:72px 52px 100px minmax(0,1fr);font-size:.78rem}}@media (max-width: 760px){.topbar{flex-direction:column;align-items:stretch;gap:10px}.topbar-copy{width:100%;flex:1 1 auto}.topbar-brand-inline{align-items:center;gap:10px}.topbar-logo{--topbar-logo-height: clamp(36px, 11vw, 44px)}.topbar-subtitle{white-space:normal;font-size:.8rem}.topbar-actions{width:100%;flex-wrap:wrap}.status-badge,.topbar-actions [data-component=button]{width:100%;justify-content:center;text-align:center}.log-row{grid-template-columns:64px 48px minmax(0,1fr);gap:8px}.log-source{grid-column:span 2}.log-message{grid-column:span 3}} diff --git a/web/dist/assets/index-CAORPbg2.js b/web/dist/assets/index-CAORPbg2.js deleted file mode 100644 index c866301..0000000 --- a/web/dist/assets/index-CAORPbg2.js +++ /dev/null @@ -1,16 +0,0 @@ -var Yi=Object.defineProperty;var Zi=(e,t,n)=>t in e?Yi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var me=(e,t,n)=>Zi(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&o(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();const G={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return mo(this.context.count)},getNextContextId(){return mo(this.context.count++)}};function mo(e){const t=String(e),n=t.length-1;return G.context.id+(n?String.fromCharCode(96+n):"")+t}function Ji(e){G.context=e}const Qi=!1,es=(e,t)=>e===t,$t=Symbol("solid-proxy"),sr=typeof Proxy=="function",lr=Symbol("solid-track"),Rt={equals:es};let ar=fr;const Me=1,_t=2,cr={owned:null,cleanups:null,context:null,owner:null};var B=null;let yn=null,ts=null,H=null,re=null,Te=null,jt=0;function qe(e,t){const n=H,o=B,r=e.length===0,i=t===void 0?o:t,l=r?cr:{owned:null,cleanups:null,context:i?i.context:null,owner:i},s=r?e:()=>e(()=>Q(()=>bt(l)));B=l,H=null;try{return at(s,!0)}finally{H=n,B=o}}function P(e,t){t=t?Object.assign({},Rt,t):Rt;const n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0},o=r=>(typeof r=="function"&&(r=r(n.value)),dr(n,r));return[ur.bind(n),o]}function ns(e,t,n){const o=qt(e,t,!0,Me);lt(o)}function ie(e,t,n){const o=qt(e,t,!1,Me);lt(o)}function K(e,t,n){ar=ss;const o=qt(e,t,!1,Me);(!n||!n.render)&&(o.user=!0),Te?Te.push(o):lt(o)}function T(e,t,n){n=n?Object.assign({},Rt,n):Rt;const o=qt(e,t,!0,0);return o.observers=null,o.observerSlots=null,o.comparator=n.equals||void 0,lt(o),ur.bind(o)}function Q(e){if(H===null)return e();const t=H;H=null;try{return e()}finally{H=t}}function Ye(e,t,n){const o=Array.isArray(e);let r,i=n&&n.defer;return l=>{let s;if(o){s=Array(e.length);for(let c=0;ct(s,r,l));return r=s,a}}function Gt(e){K(()=>Q(e))}function $(e){return B===null||(B.cleanups===null?B.cleanups=[e]:B.cleanups.push(e)),e}function yo(){return B}function os(e,t){const n=B,o=H;B=e,H=null;try{return at(t,!0)}catch(r){Bn(r)}finally{B=n,H=o}}function $e(e,t){const n=Symbol("context");return{id:n,Provider:as(n),defaultValue:e}}function Re(e){let t;return B&&B.context&&(t=B.context[e.id])!==void 0?t:e.defaultValue}function Vn(e){const t=T(e),n=T(()=>An(t()));return n.toArray=()=>{const o=n();return Array.isArray(o)?o:o!=null?[o]:[]},n}function ur(){if(this.sources&&this.state)if(this.state===Me)lt(this);else{const e=re;re=null,at(()=>Vt(this),!1),re=e}if(H){const e=this.observers?this.observers.length:0;H.sources?(H.sources.push(this),H.sourceSlots.push(e)):(H.sources=[this],H.sourceSlots=[e]),this.observers?(this.observers.push(H),this.observerSlots.push(H.sources.length-1)):(this.observers=[H],this.observerSlots=[H.sources.length-1])}return this.value}function dr(e,t,n){let o=e.value;return(!e.comparator||!e.comparator(o,t))&&(e.value=t,e.observers&&e.observers.length&&at(()=>{for(let r=0;r1e6)throw re=[],new Error},!1)),t}function lt(e){if(!e.fn)return;bt(e);const t=jt;rs(e,e.value,t)}function rs(e,t,n){let o;const r=B,i=H;H=B=e;try{o=e.fn(t)}catch(l){return e.pure&&(e.state=Me,e.owned&&e.owned.forEach(bt),e.owned=null),e.updatedAt=n+1,Bn(l)}finally{H=i,B=r}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&"observers"in e?dr(e,o):e.value=o,e.updatedAt=n)}function qt(e,t,n,o=Me,r){const i={fn:e,state:o,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:B,context:B?B.context:null,pure:n};return B===null||B!==cr&&(B.owned?B.owned.push(i):B.owned=[i]),i}function Nt(e){if(e.state===0)return;if(e.state===_t)return Vt(e);if(e.suspense&&Q(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt=0;n--)if(e=t[n],e.state===Me)lt(e);else if(e.state===_t){const o=re;re=null,at(()=>Vt(e,t[0]),!1),re=o}}function at(e,t){if(re)return e();let n=!1;t||(re=[]),Te?n=!0:Te=[],jt++;try{const o=e();return is(n),o}catch(o){n||(Te=null),re=null,Bn(o)}}function is(e){if(re&&(fr(re),re=null),e)return;const t=Te;Te=null,t.length&&at(()=>ar(t),!1)}function fr(e){for(let t=0;t=0;t--)bt(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)bt(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function ls(e){return e instanceof Error?e:new Error(typeof e=="string"?e:"Unknown error",{cause:e})}function Bn(e,t=B){throw ls(e)}function An(e){if(typeof e=="function"&&!e.length)return An(e());if(Array.isArray(e)){const t=[];for(let n=0;nr=Q(()=>(B.context={...B.context,[e]:o.value},Vn(()=>o.children))),void 0),r}}const cs=Symbol("fallback");function bo(e){for(let t=0;t1?[]:null;return $(()=>bo(i)),()=>{let a=e()||[],c=a.length,u,d;return a[lr],Q(()=>{let g,h,y,m,w,p,S,C,E;if(c===0)l!==0&&(bo(i),i=[],o=[],r=[],l=0,s&&(s=[])),n.fallback&&(o=[cs],r[0]=qe(I=>(i[0]=I,n.fallback())),l=1);else if(l===0){for(r=new Array(c),d=0;d=p&&C>=p&&o[S]===a[C];S--,C--)y[C]=r[S],m[C]=i[S],s&&(w[C]=s[S]);for(g=new Map,h=new Array(C+1),d=C;d>=p;d--)E=a[d],u=g.get(E),h[d]=u===void 0?-1:u,g.set(E,d);for(u=p;u<=S;u++)E=o[u],d=g.get(E),d!==void 0&&d!==-1?(y[d]=r[u],m[d]=i[u],s&&(w[d]=s[u]),d=h[d],g.set(E,d)):i[u]();for(d=p;de(t||{}))}function Kt(){return!0}const Pn={get(e,t,n){return t===$t?n:e.get(t)},has(e,t){return t===$t?!0:e.has(t)},set:Kt,deleteProperty:Kt,getOwnPropertyDescriptor(e,t){return{configurable:!0,enumerable:!0,get(){return e.get(t)},set:Kt,deleteProperty:Kt}},ownKeys(e){return e.keys()}};function bn(e){return(e=typeof e=="function"?e():e)?e:{}}function ds(){for(let e=0,t=this.length;e=0;s--){const a=bn(e[s])[l];if(a!==void 0)return a}},has(l){for(let s=e.length-1;s>=0;s--)if(l in bn(e[s]))return!0;return!1},keys(){const l=[];for(let s=0;s=0;l--){const s=e[l];if(!s)continue;const a=Object.getOwnPropertyNames(s);for(let c=a.length-1;c>=0;c--){const u=a[c];if(u==="__proto__"||u==="constructor")continue;const d=Object.getOwnPropertyDescriptor(s,u);if(!o[u])o[u]=d.get?{enumerable:!0,configurable:!0,get:ds.bind(n[u]=[d.get.bind(s)])}:d.value!==void 0?d:void 0;else{const f=n[u];f&&(d.get?f.push(d.get.bind(s)):d.value!==void 0&&f.push(()=>d.value))}}}const r={},i=Object.keys(o);for(let l=i.length-1;l>=0;l--){const s=i[l],a=o[s];a&&a.get?Object.defineProperty(r,s,a):r[s]=a?a.value:void 0}return r}function R(e,...t){const n=t.length;if(sr&&$t in e){const r=n>1?t.flat():t[0],i=t.map(l=>new Proxy({get(s){return l.includes(s)?e[s]:void 0},has(s){return l.includes(s)&&s in e},keys(){return l.filter(s=>s in e)}},Pn));return i.push(new Proxy({get(l){return r.includes(l)?void 0:e[l]},has(l){return r.includes(l)?!1:l in e},keys(){return Object.keys(e).filter(l=>!r.includes(l))}},Pn)),i}const o=[];for(let r=0;r<=n;r++)o[r]={};for(const r of Object.getOwnPropertyNames(e)){let i=n;for(let a=0;a`Stale read from <${e}>.`;function Bt(e){const t="fallback"in e&&{fallback:()=>e.fallback};return T(us(()=>e.each,e.children,t||void 0))}function q(e){const t=e.keyed,n=T(()=>e.when,void 0,void 0),o=t?n:T(n,void 0,{equals:(r,i)=>!r==!i});return T(()=>{const r=o();if(r){const i=e.children;return typeof i=="function"&&i.length>0?Q(()=>i(t?r:()=>{if(!Q(o))throw hr("Show");return n()})):i}return e.fallback},void 0,void 0)}function gs(e){const t=Vn(()=>e.children),n=T(()=>{const o=t(),r=Array.isArray(o)?o:[o];let i=()=>{};for(let l=0;lc()?void 0:a.when,void 0,void 0),d=a.keyed?u:T(u,void 0,{equals:(f,g)=>!f==!g});i=()=>c()||(d()?[s,u,a]:void 0)}return i});return T(()=>{const o=n()();if(!o)return e.fallback;const[r,i,l]=o,s=l.children;return typeof s=="function"&&s.length>0?Q(()=>s(l.keyed?i():()=>{if(Q(n)()?.[0]!==r)throw hr("Match");return i()})):s},void 0,void 0)}function vo(e){return e}const hs=["allowfullscreen","async","alpha","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","adauctionheaders","browsingtopics","credentialless","defaultchecked","defaultmuted","defaultselected","defer","disablepictureinpicture","disableremoteplayback","preservespitch","shadowrootclonable","shadowrootcustomelementregistry","shadowrootdelegatesfocus","shadowrootserializable","sharedstoragewritable"],ps=new Set(["className","value","readOnly","noValidate","formNoValidate","isMap","noModule","playsInline","adAuctionHeaders","allowFullscreen","browsingTopics","defaultChecked","defaultMuted","defaultSelected","disablePictureInPicture","disableRemotePlayback","preservesPitch","shadowRootClonable","shadowRootCustomElementRegistry","shadowRootDelegatesFocus","shadowRootSerializable","sharedStorageWritable",...hs]),ms=new Set(["innerHTML","textContent","innerText","children"]),ys=Object.assign(Object.create(null),{className:"class",htmlFor:"for"}),bs=Object.assign(Object.create(null),{class:"className",novalidate:{$:"noValidate",FORM:1},formnovalidate:{$:"formNoValidate",BUTTON:1,INPUT:1},ismap:{$:"isMap",IMG:1},nomodule:{$:"noModule",SCRIPT:1},playsinline:{$:"playsInline",VIDEO:1},readonly:{$:"readOnly",INPUT:1,TEXTAREA:1},adauctionheaders:{$:"adAuctionHeaders",IFRAME:1},allowfullscreen:{$:"allowFullscreen",IFRAME:1},browsingtopics:{$:"browsingTopics",IMG:1},defaultchecked:{$:"defaultChecked",INPUT:1},defaultmuted:{$:"defaultMuted",AUDIO:1,VIDEO:1},defaultselected:{$:"defaultSelected",OPTION:1},disablepictureinpicture:{$:"disablePictureInPicture",VIDEO:1},disableremoteplayback:{$:"disableRemotePlayback",AUDIO:1,VIDEO:1},preservespitch:{$:"preservesPitch",AUDIO:1,VIDEO:1},shadowrootclonable:{$:"shadowRootClonable",TEMPLATE:1},shadowrootdelegatesfocus:{$:"shadowRootDelegatesFocus",TEMPLATE:1},shadowrootserializable:{$:"shadowRootSerializable",TEMPLATE:1},sharedstoragewritable:{$:"sharedStorageWritable",IFRAME:1,IMG:1}});function vs(e,t){const n=bs[e];return typeof n=="object"?n[t]?n.$:void 0:n}const ws=new Set(["beforeinput","click","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"]),Ss=new Set(["altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","circle","clipPath","color-profile","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","font","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignObject","g","glyph","glyphRef","hkern","image","line","linearGradient","marker","mask","metadata","missing-glyph","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","stop","svg","switch","symbol","text","textPath","tref","tspan","use","view","vkern"]),xs={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},Oe=e=>T(()=>e());function Cs(e,t,n){let o=n.length,r=t.length,i=o,l=0,s=0,a=t[r-1].nextSibling,c=null;for(;lu-s){const h=t[l];for(;s{r=i,t===document?e():L(t,e(),t.firstChild?null:void 0,n)},o.owner),()=>{r(),t.textContent=""}}function U(e,t,n,o){let r;const i=()=>{const s=o?document.createElementNS("http://www.w3.org/1998/Math/MathML","template"):document.createElement("template");return s.innerHTML=e,n?s.content.firstChild.firstChild:o?s.firstChild:s.content.firstChild},l=t?()=>Q(()=>document.importNode(r||(r=i()),!0)):()=>(r||(r=i())).cloneNode(!0);return l.cloneNode=l,l}function Os(e,t=window.document){const n=t[wo]||(t[wo]=new Set);for(let o=0,r=e.length;or.call(e,n[1],i))}else e.addEventListener(t,n,typeof n!="function"&&n)}function Is(e,t,n={}){const o=Object.keys(t||{}),r=Object.keys(n);let i,l;for(i=0,l=r.length;ir.children=wt(e,t.children,r.children)),ie(()=>typeof t.ref=="function"&&mr(t.ref,e)),ie(()=>Ls(e,t,n,!0,r,!0)),r}function mr(e,t,n){return Q(()=>e(t,n))}function L(e,t,n,o){if(n!==void 0&&!o&&(o=[]),typeof t!="function")return wt(e,t,o,n);ie(r=>wt(e,t(),r,n),o)}function Ls(e,t,n,o,r={},i=!1){t||(t={});for(const l in r)if(!(l in t)){if(l==="children")continue;r[l]=xo(e,l,null,r[l],n,i,t)}for(const l in t){if(l==="children")continue;const s=t[l];r[l]=xo(e,l,s,r[l],n,i,t)}}function Ts(e){let t,n;return!Je()||!(t=G.registry.get(n=ks()))?e():(G.completed&&G.completed.add(t),G.registry.delete(n),t)}function Je(e){return!!G.context&&!0&&(!e||e.isConnected)}function Ks(e){return e.toLowerCase().replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}function So(e,t,n){const o=t.trim().split(/\s+/);for(let r=0,i=o.length;r-1&&xs[t.split(":")[0]];f?Ds(e,f,t,n):Ke(e,ys[t]||t,n)}return n}function Fs(e){let t=e.target;const n=`$$${e.type}`,o=e.target,r=e.currentTarget,i=a=>Object.defineProperty(e,"target",{configurable:!0,value:a}),l=()=>{const a=t[n];if(a&&!t.disabled){const c=t[`${n}Data`];if(c!==void 0?a.call(t,c,e):a.call(t,e),e.cancelBubble)return}return t.host&&typeof t.host!="string"&&!t.host._$host&&t.contains(e.target)&&i(t.host),!0},s=()=>{for(;l()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get(){return t||document}}),e.composedPath){const a=e.composedPath();i(a[0]);for(let c=0;c{let a=t();for(;typeof a=="function";)a=a();n=wt(e,a,n,o)}),()=>n;if(Array.isArray(t)){const a=[],c=n&&Array.isArray(n);if(In(a,t,n,r))return ie(()=>n=wt(e,a,n,o,!0)),()=>n;if(i){if(!a.length)return n;if(o===void 0)return n=[...e.childNodes];let u=a[0];if(u.parentNode!==e)return n;const d=[u];for(;(u=u.nextSibling)!==o;)d.push(u);return n=d}if(a.length===0){if(n=nt(e,n,o),s)return n}else c?n.length===0?Co(e,a,o):Cs(e,n,a):(n&&nt(e),Co(e,a));n=a}else if(t.nodeType){if(i&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=nt(e,n,o,t);nt(e,n,null,t)}else n==null||n===""||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}}return n}function In(e,t,n,o){let r=!1;for(let i=0,l=t.length;i=0;l--){const s=t[l];if(r!==s){const a=s.parentNode===e;!i&&!l?a?e.replaceChild(r,s):e.insertBefore(r,n):a&&s.remove()}else i=!0}}else e.insertBefore(r,n);return[r]}function ks(){return G.getNextContextId()}const Ms="http://www.w3.org/2000/svg";function yr(e,t=!1,n=void 0){return t?document.createElementNS(Ms,e):document.createElement(e,{is:n})}function br(e){const{useShadow:t}=e,n=document.createTextNode(""),o=()=>e.mount||document.body,r=yo();let i,l=!!G.context;return K(()=>{l&&(yo().user=l=!1),i||(i=os(r,()=>T(()=>e.children)));const s=o();if(s instanceof HTMLHeadElement){const[a,c]=P(!1),u=()=>c(!0);qe(d=>L(s,()=>a()?d():i(),null)),$(u)}else{const a=yr(e.isSVG?"g":"div",e.isSVG),c=t&&a.attachShadow?a.attachShadow({mode:"open"}):a;Object.defineProperty(a,"_$host",{get(){return n.parentNode},configurable:!0}),L(c,i),s.appendChild(a),e.ref&&e.ref(a),$(()=>s.removeChild(a))}},void 0,{render:!l}),n}function $s(e,t){const n=T(e);return T(()=>{const o=n();switch(typeof o){case"function":return Q(()=>o(t));case"string":const r=Ss.has(o),i=G.context?Ts():yr(o,r,Q(()=>t.is));return Xt(i,t,r),i}})}function Rs(e){const[,t]=R(e,["component"]);return $s(()=>e.component,t)}const _s="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZwogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICB3aWR0aD0iMTIwMCIKICBoZWlnaHQ9IjMwMCIKICB2aWV3Qm94PSIwIDAgMTIwMCAzMDAiCiAgcm9sZT0iaW1nIgogIGFyaWEtbGFiZWw9Im1jcHdheSBhc2NpaSBsb2dvIgo+CiAgPGcKICAgIGZpbGw9IiMwMEU1RkYiCiAgICBmb250LWZhbWlseT0iSmV0QnJhaW5zIE1vbm8sIEZpcmEgQ29kZSwgQ29uc29sYXMsIE1lbmxvLCBEZWphVnUgU2FucyBNb25vLCBOb3RvIFNhbnMgTW9ubywgTGliZXJhdGlvbiBNb25vLCBtb25vc3BhY2UiCiAgICBmb250LXNpemU9IjQ4IgogICAgdGV4dC1hbmNob3I9Im1pZGRsZSIKICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgPgogICAgPHRleHQgeD0iNjAwIiB5PSIxMTAiPuKWkeKWiOKWhOKWiOKWkeKWiOKWgOKWgOKWkeKWiOKWgOKWiOKWkeKWiOKWkeKWiOKWkeKWiOKWgOKWiOKWkeKWiOKWkeKWiDwvdGV4dD4KICAgIDx0ZXh0IHg9IjYwMCIgeT0iMTcwIj7ilpHilojilpHilojilpHilojilpHilpHilpHilojiloDiloDilpHilojiloTilojilpHilojiloDilojilpHilpHilojilpE8L3RleHQ+CiAgICA8dGV4dCB4PSI2MDAiIHk9IjIzMCI+4paR4paA4paR4paA4paR4paA4paA4paA4paR4paA4paR4paR4paR4paA4paR4paA4paR4paA4paR4paA4paR4paR4paA4paRPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==";var Ns=U("",!0,!1,!1);function vr(e){return(()=>{var t=Ns();return Ke(t,"src",_s),Ke(t,"draggable",!1),ie(n=>{var o=e.alt??"MCPway",r=e.class;return o!==n.e&&Ke(t,"alt",n.e=o),r!==n.t&&vt(t,n.t=r),n},{e:void 0,t:void 0}),t})()}function Vs(e){return(...t)=>{for(const n of e)n&&n(...t)}}const v=e=>typeof e=="function"&&!e.length?e():e,Eo=e=>Array.isArray(e)?e:e?[e]:[];function Bs(e,...t){return typeof e=="function"?e(...t):e}const Ws=$;function zs(e,t,n,o){return e.addEventListener(t,n,o),Ws(e.removeEventListener.bind(e,t,n,o))}function Hs(e,t,n,o){const r=()=>{Eo(v(e)).forEach(i=>{i&&Eo(v(t)).forEach(l=>zs(i,l,n,o))})};typeof e=="function"?K(r):ie(r)}const vn=Symbol("fallback");function Oo(e){for(const t of e)t.dispose()}function Us(e,t,n,o={}){const r=new Map;return $(()=>Oo(r.values())),()=>{const l=e()||[];return l[lr],Q(()=>{if(!l.length)return Oo(r.values()),r.clear(),o.fallback?[qe(d=>(r.set(vn,{dispose:d}),o.fallback()))]:[];const s=new Array(l.length),a=r.get(vn);if(!r.size||a){a?.dispose(),r.delete(vn);for(let u=0;ud)):i(s,d,u,f)}for(const u of c)r.get(u)?.dispose(),r.delete(u);return s})};function i(l,s,a,c){qe(u=>{const[d,f]=P(s),g={setItem:f,dispose:u};if(n.length>1){const[h,y]=P(a);g.setIndex=y,g.mapped=n(d,h)}else g.mapped=n(d);r.set(c,g),l[a]=g.mapped})}}function js(e){const{by:t}=e;return T(Us(()=>e.each,typeof t=="function"?t:n=>n[t],e.children,"fallback"in e?{fallback:()=>e.fallback}:void 0))}const Gs=/((?:--)?(?:\w+-?)+)\s*:\s*([^;]*)/g;function Do(e){const t={};let n;for(;n=Gs.exec(e);)t[n[1]]=n[2];return t}function Yt(e,t){if(typeof e=="string"){if(typeof t=="string")return`${e};${t}`;e=Do(e)}else typeof t=="string"&&(t=Do(t));return{...e,...t}}function se(...e){return Vs(e)}function Ao(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}function qs(e){return typeof e=="number"}function ot(e){return Object.prototype.toString.call(e)==="[object String]"}function Wn(e){return typeof e=="function"}function ct(e){return t=>`${e()}-${t}`}function Ie(e,t){return e?e===t||e.contains(t):!1}function mt(e,t=!1){const{activeElement:n}=Fe(e);if(!n?.nodeName)return null;if(wr(n)&&n.contentDocument)return mt(n.contentDocument.body,t);if(t){const o=n.getAttribute("aria-activedescendant");if(o){const r=Fe(n).getElementById(o);if(r)return r}}return n}function Xs(e){return Fe(e).defaultView||window}function Fe(e){return e?e.ownerDocument||e:document}function wr(e){return e.tagName==="IFRAME"}var Sr=(e=>(e.Escape="Escape",e.Enter="Enter",e.Tab="Tab",e.Space=" ",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight",e.ArrowUp="ArrowUp",e.End="End",e.Home="Home",e.PageDown="PageDown",e.PageUp="PageUp",e))(Sr||{});function xr(e){return typeof window>"u"||window.navigator==null?!1:window.navigator.userAgentData?.brands.some(t=>e.test(t.brand))||e.test(window.navigator.userAgent)}function zn(e){return typeof window<"u"&&window.navigator!=null?e.test(window.navigator.userAgentData?.platform||window.navigator.platform):!1}function Ct(){return zn(/^Mac/i)}function Ys(){return zn(/^iPhone/i)}function Zs(){return zn(/^iPad/i)||Ct()&&navigator.maxTouchPoints>1}function Js(){return Ys()||Zs()}function Qs(){return Ct()||Js()}function el(){return xr(/AppleWebKit/i)&&!tl()}function tl(){return xr(/Chrome/i)}function ae(e,t){return t&&(Wn(t)?t(e):t[0](t[1],e)),e?.defaultPrevented}function ce(e){return t=>{for(const n of e)ae(t,n)}}function nl(e){return Ct()?e.metaKey&&!e.ctrlKey:e.ctrlKey&&!e.metaKey}function oe(e){if(e)if(ol())e.focus({preventScroll:!0});else{const t=rl(e);e.focus(),il(t)}}var Ft=null;function ol(){if(Ft==null){Ft=!1;try{document.createElement("div").focus({get preventScroll(){return Ft=!0,!0}})}catch{}}return Ft}function rl(e){let t=e.parentNode;const n=[],o=document.scrollingElement||document.documentElement;for(;t instanceof HTMLElement&&t!==o;)(t.offsetHeight{if(wr(r)&&r.contentDocument){const l=r.contentDocument.body,s=Er(l,!1);o.splice(i,1,...s)}}),o}function Po(e){return Or(e)&&!al(e)}function Or(e){return e.matches(Hn)&&Un(e)}function al(e){return Number.parseInt(e.getAttribute("tabindex")||"0",10)<0}function Un(e,t){return e.nodeName!=="#comment"&&cl(e)&&ul(e,t)&&(!e.parentElement||Un(e.parentElement,e))}function cl(e){if(!(e instanceof HTMLElement)&&!(e instanceof SVGElement))return!1;const{display:t,visibility:n}=e.style;let o=t!=="none"&&n!=="hidden"&&n!=="collapse";if(o){if(!e.ownerDocument.defaultView)return o;const{getComputedStyle:r}=e.ownerDocument.defaultView,{display:i,visibility:l}=r(e);o=i!=="none"&&l!=="hidden"&&l!=="collapse"}return o}function ul(e,t){return!e.hasAttribute("hidden")&&(e.nodeName==="DETAILS"&&t&&t.nodeName!=="SUMMARY"?e.hasAttribute("open"):!0)}function dl(e,t,n){const o=t?.tabbable?ll:Hn,r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode(i){return t?.from?.contains(i)?NodeFilter.FILTER_REJECT:i.matches(o)&&Un(i)&&(!t?.accept||t.accept(i))?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});return t?.from&&(r.currentNode=t.from),r}function fl(){}function W(e,t){return F(e,t)}var ht=new Map,Io=new Set;function Lo(){if(typeof window>"u")return;const e=n=>{if(!n.target)return;let o=ht.get(n.target);o||(o=new Set,ht.set(n.target,o),n.target.addEventListener("transitioncancel",t)),o.add(n.propertyName)},t=n=>{if(!n.target)return;const o=ht.get(n.target);if(o&&(o.delete(n.propertyName),o.size===0&&(n.target.removeEventListener("transitioncancel",t),ht.delete(n.target)),ht.size===0)){for(const r of Io)r();Io.clear()}};document.body.addEventListener("transitionrun",e),document.body.addEventListener("transitionend",t)}typeof document<"u"&&(document.readyState!=="loading"?Lo():document.addEventListener("DOMContentLoaded",Lo));function To(e,t){const n=Ko(e,t,"left"),o=Ko(e,t,"top"),r=t.offsetWidth,i=t.offsetHeight;let l=e.scrollLeft,s=e.scrollTop;const a=l+e.offsetWidth,c=s+e.offsetHeight;n<=l?l=n:n+r>a&&(l+=n+r-a),o<=s?s=o:o+i>c&&(s+=o+i-c),e.scrollLeft=l,e.scrollTop=s}function Ko(e,t,n){const o=n==="left"?"offsetLeft":"offsetTop";let r=0;for(;t.offsetParent&&(r+=t[o],t.offsetParent!==e);){if(t.offsetParent.contains(e)){r-=e[o];break}t=t.offsetParent}return r}var Dr={border:"0",clip:"rect(0 0 0 0)","clip-path":"inset(50%)",height:"1px",margin:"0 -1px -1px 0",overflow:"hidden",padding:"0",position:"absolute",width:"1px","white-space":"nowrap"};function Ar(e,t){const[n,o]=P(Fo(t?.()));return K(()=>{o(e()?.tagName.toLowerCase()||Fo(t?.()))}),n}function Fo(e){return ot(e)?e:void 0}function X(e){const[t,n]=R(e,["as"]);if(!t.as)throw new Error("[kobalte]: Polymorphic is missing the required `as` prop.");return b(Rs,F(n,{get component(){return t.as}}))}var gl=Object.defineProperty,Et=(e,t)=>{for(var n in t)gl(e,n,{get:t[n],enumerable:!0})},hl={};Et(hl,{Button:()=>jn,Root:()=>Ot});var pl=["button","color","file","image","reset","submit"];function ml(e){const t=e.tagName.toLowerCase();return t==="button"?!0:t==="input"&&e.type?pl.indexOf(e.type)!==-1:!1}function Ot(e){let t;const n=W({type:"button"},e),[o,r]=R(n,["ref","type","disabled"]),i=Ar(()=>t,()=>"button"),l=T(()=>{const c=i();return c==null?!1:ml({tagName:c,type:o.type})}),s=T(()=>i()==="input"),a=T(()=>i()==="a"&&t?.getAttribute("href")!=null);return b(X,F({as:"button",ref(c){var u=se(d=>t=d,o.ref);typeof u=="function"&&u(c)},get type(){return Oe(()=>!!(l()||s()))()?o.type:void 0},get role(){return!l()&&!a()?"button":void 0},get tabIndex(){return!l()&&!a()&&!o.disabled?0:void 0},get disabled(){return Oe(()=>!!(l()||s()))()?o.disabled:void 0},get"aria-disabled"(){return!l()&&!s()&&o.disabled?!0:void 0},get"data-disabled"(){return o.disabled?"":void 0}},r))}var jn=Ot;function Ne(e){const[t,n]=R(e,["variant","size","class","classList"]);return b(jn,F(n,{"data-component":"button",get"data-size"(){return t.size??"normal"},get"data-variant"(){return t.variant??"secondary"},get classList(){return{...t.classList??{},[t.class??""]:!!t.class}},get children(){return e.children}}))}function yl(e){const[t,n]=R(e,["label","size","variant","class","classList"]);return b(jn,F(n,{get"aria-label"(){return t.label},get title(){return t.label},"data-component":"icon-button",get"data-size"(){return t.size??"normal"},get"data-variant"(){return t.variant??"ghost"},get classList(){return{...t.classList??{},[t.class??""]:!!t.class}},get children(){return e.children}}))}var bl=U("
");function Ln(e){const[t,n]=R(e,["variant","class","classList"]);return(()=>{var o=bl();return Xt(o,F(n,{"data-component":"card",get"data-variant"(){return t.variant??"normal"},get classList(){return{...t.classList??{},[t.class??""]:!!t.class}}}),!1,!0),L(o,()=>e.children),o})()}var vl=U("
");function wn(e){const[t,n]=R(e,["class","classList"]);return(()=>{var o=vl();return Xt(o,F(n,{"data-component":"scroll-view",get classList(){return{...t.classList??{},[t.class??""]:!!t.class}}}),!1,!0),L(o,()=>e.children),o})()}function Pr(e){let t=e.startIndex??0;const n=e.startLevel??0,o=[],r=a=>{if(a==null)return"";const c=e.getKey??"key",u=ot(c)?a[c]:c(a);return u!=null?String(u):""},i=a=>{if(a==null)return"";const c=e.getTextValue??"textValue",u=ot(c)?a[c]:c(a);return u!=null?String(u):""},l=a=>{if(a==null)return!1;const c=e.getDisabled??"disabled";return(ot(c)?a[c]:c(a))??!1},s=a=>{if(a!=null)return ot(e.getSectionChildren)?a[e.getSectionChildren]:e.getSectionChildren?.(a)};for(const a of e.dataSource){if(ot(a)||qs(a)){o.push({type:"item",rawValue:a,key:String(a),textValue:String(a),disabled:l(a),level:n,index:t}),t++;continue}if(s(a)!=null){o.push({type:"section",rawValue:a,key:"",textValue:"",disabled:!1,level:n,index:t}),t++;const c=s(a)??[];if(c.length>0){const u=Pr({dataSource:c,getKey:e.getKey,getTextValue:e.getTextValue,getDisabled:e.getDisabled,getSectionChildren:e.getSectionChildren,startIndex:t,startLevel:n+1});o.push(...u),t+=u.length}}else o.push({type:"item",rawValue:a,key:r(a),textValue:i(a),disabled:l(a),level:n,index:t}),t++}return o}function wl(e,t=[]){return T(()=>{const n=Pr({dataSource:v(e.dataSource),getKey:v(e.getKey),getTextValue:v(e.getTextValue),getDisabled:v(e.getDisabled),getSectionChildren:v(e.getSectionChildren)});for(let o=0;oe());return Gt(()=>{yt.size===0&&window.addEventListener("languagechange",ko),yt.add(t),$(()=>{yt.delete(t),yt.size===0&&window.removeEventListener("languagechange",ko)})}),{locale:()=>n().locale,direction:()=>n().direction}}var Dl=$e();function Gn(){const e=Ol();return Re(Dl)||e}var Sn=new Map;function Lr(e){const{locale:t}=Gn(),n=T(()=>t()+(e?Object.entries(e).sort((o,r)=>o[0]{const o=n();let r;return Sn.has(o)&&(r=Sn.get(o)),r||(r=new Intl.Collator(t(),e),Sn.set(o,r)),r})}function qn(e){const[t,n]=P(e.defaultValue?.()),o=T(()=>e.value?.()!==void 0),r=T(()=>o()?e.value?.():t());return[r,l=>{Q(()=>{const s=Bs(l,r());return Object.is(s,r())||(o()||n(s),e.onChange?.(s)),s})}]}function Al(e){const[t,n]=qn(e);return[()=>t()??!1,n]}var Ce=class Tr extends Set{constructor(n,o,r){super(n);me(this,"anchorKey");me(this,"currentKey");n instanceof Tr?(this.anchorKey=o||n.anchorKey,this.currentKey=r||n.currentKey):(this.anchorKey=o,this.currentKey=r)}};function Pl(e){const[t,n]=qn(e);return[()=>t()??new Ce,n]}function Kr(e){return Qs()?e.altKey:e.ctrlKey}function rt(e){return Ct()?e.metaKey:e.ctrlKey}function Mo(e){return new Ce(e)}function Fr(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function Il(e){const t=W({selectionMode:"none",selectionBehavior:"toggle"},e),[n,o]=P(!1),[r,i]=P(),l=T(()=>{const y=v(t.selectedKeys);return y!=null?Mo(y):y}),s=T(()=>{const y=v(t.defaultSelectedKeys);return y!=null?Mo(y):new Ce}),[a,c]=Pl({value:l,defaultValue:s,onChange:y=>t.onSelectionChange?.(y)}),[u,d]=P(v(t.selectionBehavior)),f=()=>v(t.selectionMode),g=()=>v(t.disallowEmptySelection)??!1,h=y=>{(v(t.allowDuplicateSelectionEvents)||!Fr(y,a()))&&c(y)};return K(()=>{const y=a();v(t.selectionBehavior)==="replace"&&u()==="toggle"&&typeof y=="object"&&y.size===0&&d("replace")}),K(()=>{d(v(t.selectionBehavior)??"toggle")}),{selectionMode:f,disallowEmptySelection:g,selectionBehavior:u,setSelectionBehavior:d,isFocused:n,setFocused:o,focusedKey:r,setFocusedKey:i,selectedKeys:a,setSelectedKeys:h}}function kr(e){const[t,n]=P(""),[o,r]=P(-1);return{typeSelectHandlers:{onKeyDown:l=>{if(v(e.isDisabled))return;const s=v(e.keyboardDelegate),a=v(e.selectionManager);if(!s.getKeyForSearch)return;const c=Ll(l.key);if(!c||l.ctrlKey||l.metaKey)return;c===" "&&t().trim().length>0&&(l.preventDefault(),l.stopPropagation());let u=n(f=>f+c),d=s.getKeyForSearch(u,a.focusedKey())??s.getKeyForSearch(u);d==null&&Tl(u)&&(u=u[0],d=s.getKeyForSearch(u,a.focusedKey())??s.getKeyForSearch(u)),d!=null&&(a.setFocusedKey(d),e.onTypeSelect?.(d)),clearTimeout(o()),r(window.setTimeout(()=>n(""),500))}}}}function Ll(e){return e.length===1||!/^[A-Z]/i.test(e)?e:""}function Tl(e){return e.split("").every(t=>t===e[0])}function Kl(e,t,n){const r=F({selectOnFocus:()=>v(e.selectionManager).selectionBehavior()==="replace"},e),i=()=>n?.()??t(),{direction:l}=Gn();let s={top:0,left:0};Hs(()=>v(r.isVirtualized)?void 0:i(),"scroll",()=>{const m=i();m&&(s={top:m.scrollTop,left:m.scrollLeft})});const{typeSelectHandlers:a}=kr({isDisabled:()=>v(r.disallowTypeAhead),keyboardDelegate:()=>v(r.keyboardDelegate),selectionManager:()=>v(r.selectionManager)}),c=()=>v(r.orientation)??"vertical",u=m=>{ae(m,a.onKeyDown),m.altKey&&m.key==="Tab"&&m.preventDefault();const w=t();if(!w?.contains(m.target))return;const p=v(r.selectionManager),S=v(r.selectOnFocus),C=O=>{O!=null&&(p.setFocusedKey(O),m.shiftKey&&p.selectionMode()==="multiple"?p.extendSelection(O):S&&!Kr(m)&&p.replaceSelection(O))},E=v(r.keyboardDelegate),I=v(r.shouldFocusWrap),A=p.focusedKey();switch(m.key){case(c()==="vertical"?"ArrowDown":"ArrowRight"):{if(E.getKeyBelow){m.preventDefault();let O;A!=null?O=E.getKeyBelow(A):O=E.getFirstKey?.(),O==null&&I&&(O=E.getFirstKey?.(A)),C(O)}break}case(c()==="vertical"?"ArrowUp":"ArrowLeft"):{if(E.getKeyAbove){m.preventDefault();let O;A!=null?O=E.getKeyAbove(A):O=E.getLastKey?.(),O==null&&I&&(O=E.getLastKey?.(A)),C(O)}break}case(c()==="vertical"?"ArrowLeft":"ArrowUp"):{if(E.getKeyLeftOf){m.preventDefault();const O=l()==="rtl";let M;A!=null?M=E.getKeyLeftOf(A):M=O?E.getFirstKey?.():E.getLastKey?.(),C(M)}break}case(c()==="vertical"?"ArrowRight":"ArrowDown"):{if(E.getKeyRightOf){m.preventDefault();const O=l()==="rtl";let M;A!=null?M=E.getKeyRightOf(A):M=O?E.getLastKey?.():E.getFirstKey?.(),C(M)}break}case"Home":if(E.getFirstKey){m.preventDefault();const O=E.getFirstKey(A,rt(m));O!=null&&(p.setFocusedKey(O),rt(m)&&m.shiftKey&&p.selectionMode()==="multiple"?p.extendSelection(O):S&&p.replaceSelection(O))}break;case"End":if(E.getLastKey){m.preventDefault();const O=E.getLastKey(A,rt(m));O!=null&&(p.setFocusedKey(O),rt(m)&&m.shiftKey&&p.selectionMode()==="multiple"?p.extendSelection(O):S&&p.replaceSelection(O))}break;case"PageDown":if(E.getKeyPageBelow&&A!=null){m.preventDefault();const O=E.getKeyPageBelow(A);C(O)}break;case"PageUp":if(E.getKeyPageAbove&&A!=null){m.preventDefault();const O=E.getKeyPageAbove(A);C(O)}break;case"a":rt(m)&&p.selectionMode()==="multiple"&&v(r.disallowSelectAll)!==!0&&(m.preventDefault(),p.selectAll());break;case"Escape":m.defaultPrevented||(m.preventDefault(),v(r.disallowEmptySelection)||p.clearSelection());break;case"Tab":if(!v(r.allowsTabNavigation)){if(m.shiftKey)w.focus();else{const O=dl(w,{tabbable:!0});let M,_;do _=O.lastChild(),_&&(M=_);while(_);M&&!M.contains(document.activeElement)&&oe(M)}break}}},d=m=>{const w=v(r.selectionManager),p=v(r.keyboardDelegate),S=v(r.selectOnFocus);if(w.isFocused()){m.currentTarget.contains(m.target)||w.setFocused(!1);return}if(m.currentTarget.contains(m.target)){if(w.setFocused(!0),w.focusedKey()==null){const C=I=>{I!=null&&(w.setFocusedKey(I),S&&w.replaceSelection(I))},E=m.relatedTarget;E&&m.currentTarget.compareDocumentPosition(E)&Node.DOCUMENT_POSITION_FOLLOWING?C(w.lastSelectedKey()??p.getLastKey?.()):C(w.firstSelectedKey()??p.getFirstKey?.())}else if(!v(r.isVirtualized)){const C=i();if(C){C.scrollTop=s.top,C.scrollLeft=s.left;const E=C.querySelector(`[data-key="${w.focusedKey()}"]`);E&&(oe(E),To(C,E))}}}},f=m=>{const w=v(r.selectionManager);m.currentTarget.contains(m.relatedTarget)||w.setFocused(!1)},g=m=>{i()===m.target&&m.preventDefault()},h=()=>{const m=v(r.autoFocus);if(!m)return;const w=v(r.selectionManager),p=v(r.keyboardDelegate);let S;m==="first"&&(S=p.getFirstKey?.()),m==="last"&&(S=p.getLastKey?.());const C=w.selectedKeys();C.size&&(S=C.values().next().value),w.setFocused(!0),w.setFocusedKey(S);const E=t();E&&S==null&&!v(r.shouldUseVirtualFocus)&&oe(E)};return Gt(()=>{r.deferAutoFocus?setTimeout(h,0):h()}),K(Ye([i,()=>v(r.isVirtualized),()=>v(r.selectionManager).focusedKey()],m=>{const[w,p,S]=m;if(p)S&&r.scrollToKey?.(S);else if(S&&w){const C=w.querySelector(`[data-key="${S}"]`);C&&To(w,C)}})),{tabIndex:T(()=>{if(!v(r.shouldUseVirtualFocus))return v(r.selectionManager).focusedKey()==null?0:-1}),onKeyDown:u,onMouseDown:g,onFocusIn:d,onFocusOut:f}}function Fl(e,t){const n=()=>v(e.selectionManager),o=()=>v(e.key),r=()=>v(e.shouldUseVirtualFocus),i=p=>{n().selectionMode()!=="none"&&(n().selectionMode()==="single"?n().isSelected(o())&&!n().disallowEmptySelection()?n().toggleSelection(o()):n().replaceSelection(o()):p?.shiftKey?n().extendSelection(o()):n().selectionBehavior()==="toggle"||rt(p)||"pointerType"in p&&p.pointerType==="touch"?n().toggleSelection(o()):n().replaceSelection(o()))},l=()=>n().isSelected(o()),s=()=>v(e.disabled)||n().isDisabled(o()),a=()=>!s()&&n().canSelectItem(o());let c=null;const u=p=>{a()&&(c=p.pointerType,p.pointerType==="mouse"&&p.button===0&&!v(e.shouldSelectOnPressUp)&&i(p))},d=p=>{a()&&p.pointerType==="mouse"&&p.button===0&&v(e.shouldSelectOnPressUp)&&v(e.allowsDifferentPressOrigin)&&i(p)},f=p=>{a()&&(v(e.shouldSelectOnPressUp)&&!v(e.allowsDifferentPressOrigin)||c!=="mouse")&&i(p)},g=p=>{!a()||!["Enter"," "].includes(p.key)||(Kr(p)?n().toggleSelection(o()):i(p))},h=p=>{s()&&p.preventDefault()},y=p=>{const S=t();r()||s()||!S||p.target===S&&n().setFocusedKey(o())},m=T(()=>{if(!(r()||s()))return o()===n().focusedKey()?0:-1}),w=T(()=>v(e.virtualized)?void 0:o());return K(Ye([t,o,r,()=>n().focusedKey(),()=>n().isFocused()],([p,S,C,E,I])=>{p&&S===E&&I&&!C&&document.activeElement!==p&&(e.focus?e.focus():oe(p))})),{isSelected:l,isDisabled:s,allowsSelection:a,tabIndex:m,dataKey:w,onPointerDown:u,onPointerUp:d,onClick:f,onKeyDown:g,onMouseDown:h,onFocus:y}}var kl=class{constructor(e,t){me(this,"collection");me(this,"state");this.collection=e,this.state=t}selectionMode(){return this.state.selectionMode()}disallowEmptySelection(){return this.state.disallowEmptySelection()}selectionBehavior(){return this.state.selectionBehavior()}setSelectionBehavior(e){this.state.setSelectionBehavior(e)}isFocused(){return this.state.isFocused()}setFocused(e){this.state.setFocused(e)}focusedKey(){return this.state.focusedKey()}setFocusedKey(e){(e==null||this.collection().getItem(e))&&this.state.setFocusedKey(e)}selectedKeys(){return this.state.selectedKeys()}isSelected(e){if(this.state.selectionMode()==="none")return!1;const t=this.getKey(e);return t==null?!1:this.state.selectedKeys().has(t)}isEmpty(){return this.state.selectedKeys().size===0}isSelectAll(){if(this.isEmpty())return!1;const e=this.state.selectedKeys();return this.getAllSelectableKeys().every(t=>e.has(t))}firstSelectedKey(){let e;for(const t of this.state.selectedKeys()){const n=this.collection().getItem(t),o=n?.index!=null&&e?.index!=null&&n.indexe.index;(!e||o)&&(e=n)}return e?.key}extendSelection(e){if(this.selectionMode()==="none")return;if(this.selectionMode()==="single"){this.replaceSelection(e);return}const t=this.getKey(e);if(t==null)return;const n=this.state.selectedKeys(),o=n.anchorKey||t,r=new Ce(n,o,t);for(const i of this.getKeyRange(o,n.currentKey||t))r.delete(i);for(const i of this.getKeyRange(t,o))this.canSelectItem(i)&&r.add(i);this.state.setSelectedKeys(r)}getKeyRange(e,t){const n=this.collection().getItem(e),o=this.collection().getItem(t);return n&&o?n.index!=null&&o.index!=null&&n.index<=o.index?this.getKeyRangeInternal(e,t):this.getKeyRangeInternal(t,e):[]}getKeyRangeInternal(e,t){const n=[];let o=e;for(;o!=null;){const r=this.collection().getItem(o);if(r&&r.type==="item"&&n.push(o),o===t)return n;o=this.collection().getKeyAfter(o)}return[]}getKey(e){const t=this.collection().getItem(e);return t?!t||t.type!=="item"?null:t.key:e}toggleSelection(e){if(this.selectionMode()==="none")return;if(this.selectionMode()==="single"&&!this.isSelected(e)){this.replaceSelection(e);return}const t=this.getKey(e);if(t==null)return;const n=new Ce(this.state.selectedKeys());n.has(t)?n.delete(t):this.canSelectItem(t)&&(n.add(t),n.anchorKey=t,n.currentKey=t),!(this.disallowEmptySelection()&&n.size===0)&&this.state.setSelectedKeys(n)}replaceSelection(e){if(this.selectionMode()==="none")return;const t=this.getKey(e);if(t==null)return;const n=this.canSelectItem(t)?new Ce([t],t,t):new Ce;this.state.setSelectedKeys(n)}setSelectedKeys(e){if(this.selectionMode()==="none")return;const t=new Ce;for(const n of e){const o=this.getKey(n);if(o!=null&&(t.add(o),this.selectionMode()==="single"))break}this.state.setSelectedKeys(t)}selectAll(){this.selectionMode()==="multiple"&&this.state.setSelectedKeys(new Set(this.getAllSelectableKeys()))}clearSelection(){const e=this.state.selectedKeys();!this.disallowEmptySelection()&&e.size>0&&this.state.setSelectedKeys(new Ce)}toggleSelectAll(){this.isSelectAll()?this.clearSelection():this.selectAll()}select(e,t){this.selectionMode()!=="none"&&(this.selectionMode()==="single"?this.isSelected(e)&&!this.disallowEmptySelection()?this.toggleSelection(e):this.replaceSelection(e):this.selectionBehavior()==="toggle"||t&&t.pointerType==="touch"?this.toggleSelection(e):this.replaceSelection(e))}isSelectionEqual(e){if(e===this.state.selectedKeys())return!0;const t=this.selectedKeys();if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;for(const n of t)if(!e.has(n))return!1;return!0}canSelectItem(e){if(this.state.selectionMode()==="none")return!1;const t=this.collection().getItem(e);return t!=null&&!t.disabled}isDisabled(e){const t=this.collection().getItem(e);return!t||t.disabled}getAllSelectableKeys(){const e=[];return(n=>{for(;n!=null;){if(this.canSelectItem(n)){const o=this.collection().getItem(n);if(!o)continue;o.type==="item"&&e.push(n)}n=this.collection().getKeyAfter(n)}})(this.collection().getFirstKey()),e}},$o=class{constructor(e){me(this,"keyMap",new Map);me(this,"iterable");me(this,"firstKey");me(this,"lastKey");this.iterable=e;for(const o of e)this.keyMap.set(o.key,o);if(this.keyMap.size===0)return;let t,n=0;for(const[o,r]of this.keyMap)t?(t.nextKey=o,r.prevKey=t.key):(this.firstKey=o,r.prevKey=void 0),r.type==="item"&&(r.index=n++),t=r,t.nextKey=void 0;this.lastKey=t.key}*[Symbol.iterator](){yield*this.iterable}getSize(){return this.keyMap.size}getKeys(){return this.keyMap.keys()}getKeyBefore(e){return this.keyMap.get(e)?.prevKey}getKeyAfter(e){return this.keyMap.get(e)?.nextKey}getFirstKey(){return this.firstKey}getLastKey(){return this.lastKey}getItem(e){return this.keyMap.get(e)}at(e){const t=[...this.getKeys()];return this.getItem(t[e])}};function Mr(e){const t=Il(e),o=wl({dataSource:()=>v(e.dataSource),getKey:()=>v(e.getKey),getTextValue:()=>v(e.getTextValue),getDisabled:()=>v(e.getDisabled),getSectionChildren:()=>v(e.getSectionChildren),factory:i=>e.filter?new $o(e.filter(i)):new $o(i)},[()=>e.filter]),r=new kl(o,t);return ns(()=>{const i=t.focusedKey();i!=null&&!o().getItem(i)&&t.setFocusedKey(void 0)}),{collection:o,selectionManager:()=>r}}function be(e){return t=>(e(t),()=>e(void 0))}var $r=["id","name","validationState","required","disabled","readOnly"];function Rr(e){const t=`form-control-${Ze()}`,n=W({id:t},e),[o,r]=P(),[i,l]=P(),[s,a]=P(),[c,u]=P(),d=(y,m,w)=>{const p=w!=null||o()!=null;return[w,o(),p&&m!=null?y:void 0].filter(Boolean).join(" ")||void 0},f=y=>[s(),c(),y].filter(Boolean).join(" ")||void 0,g=T(()=>({"data-valid":v(n.validationState)==="valid"?"":void 0,"data-invalid":v(n.validationState)==="invalid"?"":void 0,"data-required":v(n.required)?"":void 0,"data-disabled":v(n.disabled)?"":void 0,"data-readonly":v(n.readOnly)?"":void 0}));return{formControlContext:{name:()=>v(n.name)??v(n.id),dataset:g,validationState:()=>v(n.validationState),isRequired:()=>v(n.required),isDisabled:()=>v(n.disabled),isReadOnly:()=>v(n.readOnly),labelId:o,fieldId:i,descriptionId:s,errorMessageId:c,getAriaLabelledBy:d,getAriaDescribedBy:f,generateId:ct(()=>v(n.id)),registerLabel:be(r),registerField:be(l),registerDescription:be(a),registerErrorMessage:be(u)}}}var Xn=$e();function ze(){const e=Re(Xn);if(e===void 0)throw new Error("[kobalte]: `useFormControlContext` must be used within a `FormControlContext.Provider` component");return e}function Zt(e){const t=ze(),n=W({id:t.generateId("description")},e);return K(()=>$(t.registerDescription(n.id))),b(X,F({as:"div"},()=>t.dataset(),n))}var Ml=U("
- - -
-
-

Logs

- {filteredLogs().length} rows -
- - - {(message) => ( - - {message()} - - )} - - - - - {(entry) => ( -
- - {entry.level} - - {entry.mode}:{entry.transport} - -

{entry.message || "(no message)"}

-
- )} -
-
-
- -
-
-

Runtime

- {runtimeSessions().length} sessions -
-
- - {(message) => ( - - {message()} - - )} - - -
-
Health
-
{runtimeHealth()}
-
- -

Metrics Snapshot

- -
{JSON.stringify(runtimeMetrics(), null, 2)}
-
-
-
-
- - - - - } - > - {(error) => ( - void copyFatalErrorDetails()} - /> - )} - - ); -} diff --git a/web/src/assets/mcpway-ascii-logo.svg b/web/src/assets/mcpway-ascii-logo.svg deleted file mode 100644 index aa174c5..0000000 --- a/web/src/assets/mcpway-ascii-logo.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - ░█▄█░█▀▀░█▀█░█░█░█▀█░█░█ - ░█░█░█░░░█▀▀░█▄█░█▀█░░█░ - ░▀░▀░▀▀▀░▀░░░▀░▀░▀░▀░░▀░ - - diff --git a/web/src/main.tsx b/web/src/main.tsx deleted file mode 100644 index fc3a95c..0000000 --- a/web/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { render } from "solid-js/web"; -import { App } from "./App"; -import "./ui/theme/tokens.css"; -import "./ui/theme/base.css"; -import "./ui/primitives/index.css"; -import "./ui/surfaces/error-screen.css"; -import "./ui/surfaces/error-overlay.css"; -import "./styles.css"; - -render(() => , document.getElementById("root")!); diff --git a/web/src/styles.css b/web/src/styles.css deleted file mode 100644 index 9f3b36b..0000000 --- a/web/src/styles.css +++ /dev/null @@ -1,405 +0,0 @@ -.shell { - width: 100%; - min-width: 0; - min-height: 100dvh; - height: 100dvh; - padding: 16px; - display: grid; - grid-template-rows: auto minmax(0, 1fr); - gap: 14px; -} - -.topbar { - border: 1px solid var(--line-strong); - background: color-mix(in oklab, var(--surface-2) 92%, black 8%); - box-shadow: var(--panel-shadow); - padding: 12px 14px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; -} - -.topbar-copy { - min-width: 0; - flex: 1 1 auto; -} - -.topbar-brand-inline { - display: flex; - align-items: center; - gap: 12px; - min-width: 0; -} - -.topbar-logo { - --topbar-logo-height: clamp(42px, 4.8vw, 58px); - height: var(--topbar-logo-height); - width: auto; - max-width: clamp(160px, 24vw, 240px); - display: block; - image-rendering: auto; - filter: drop-shadow(0 0 8px color-mix(in oklab, var(--accent) 24%, transparent)); -} - -.topbar-subtitle { - margin: 0; - color: color-mix(in oklab, var(--fg) 74%, transparent); - font-family: var(--font-family-sans); - font-size: 0.83rem; - line-height: 1.3; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - min-width: 0; -} - -.topbar-actions { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 8px; - flex-wrap: nowrap; - flex: 0 0 auto; -} - -.status-badge { - border: 1px solid var(--line-strong); - background: color-mix(in oklab, var(--surface-3) 92%, black 8%); - padding: 7px 10px; - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: var(--font-family-sans); - font-size: 0.72rem; - white-space: nowrap; -} - -.status-live { - color: var(--ok); -} - -.status-connecting { - color: var(--warn); -} - -.status-disconnected, -.status-stream-error, -.status-stream-parse-error, -.status-auth-required-or-api-unavailable { - color: var(--err); -} - -.error-kind { - border: 1px solid var(--line-soft); - padding: 3px 6px; - font-size: 0.68rem; - text-transform: uppercase; - letter-spacing: 0.08em; - background: color-mix(in oklab, var(--surface-2) 85%, black 15%); -} - -.error-kind-runtime, -.error-kind-promise { - color: color-mix(in oklab, var(--err) 82%, white 18%); -} - -.error-kind-network { - color: color-mix(in oklab, var(--warn) 82%, white 18%); -} - -.error-kind-socket { - color: color-mix(in oklab, var(--accent) 82%, white 18%); -} - -.layout { - min-height: 0; - height: 100%; -} - -.layout-grid-fixed { - min-height: 0; - height: 100%; - display: grid; - grid-template-columns: 1fr 2fr 1fr; - gap: 14px; -} - -.panel { - display: grid; - min-height: 0; - overflow: hidden; - border: 1px solid var(--line-soft); - background: color-mix(in oklab, var(--surface-1) 93%, black 7%); - box-shadow: var(--panel-shadow); -} - -.sidebar { - grid-template-rows: auto minmax(0, 1fr); -} - -.sidebar-body { - padding: 12px; - display: grid; - gap: 12px; - align-content: start; - overflow: auto; -} - -.group { - border: 1px solid color-mix(in oklab, var(--line-soft) 80%, transparent); - background: color-mix(in oklab, var(--surface-2) 90%, black 10%); - padding: 10px; - display: grid; - gap: 8px; -} - -.sidebar h2, -.metrics h2, -.logs h2 { - margin: 0; - text-transform: uppercase; - letter-spacing: 0.1em; - font-family: var(--font-family-sans); - font-size: 0.7rem; - color: color-mix(in oklab, var(--fg) 72%, transparent); -} - -.panel-error { - margin: 0; - width: 100%; - box-sizing: border-box; - border-radius: 0; -} - -.sessions { - max-height: 190px; - overflow: auto; - display: grid; - gap: 6px; -} - -.sessions code, -.empty { - border: 1px solid var(--line-soft); - background: color-mix(in oklab, var(--surface-3) 84%, black 16%); - padding: 5px 7px; - font-size: 0.73rem; -} - -.logs, -.metrics { - grid-template-rows: auto auto minmax(0, 1fr); -} - -.metrics { - grid-template-rows: auto minmax(0, 1fr); -} - -.panel-header { - padding: 10px 12px; - border-bottom: 1px solid var(--line-soft); - display: flex; - align-items: center; - justify-content: space-between; - background: color-mix(in oklab, var(--surface-2) 90%, black 10%); -} - -.meta { - color: color-mix(in oklab, var(--fg) 70%, transparent); - text-transform: uppercase; - letter-spacing: 0.08em; - font-family: var(--font-family-sans); - font-size: 0.68rem; -} - -.log-grid { - overflow: auto; - display: grid; - align-content: start; -} - -.log-row { - display: grid; - grid-template-columns: 88px 66px 130px minmax(0, 1fr); - gap: 10px; - align-items: center; - padding: 9px 11px; - border-bottom: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - font-size: 0.8rem; -} - -.log-row:nth-child(odd) { - background: color-mix(in oklab, var(--surface-1) 96%, black 4%); -} - -.log-row:hover { - background: color-mix(in oklab, var(--accent) 6%, var(--surface-2)); -} - -.log-time { - color: color-mix(in oklab, var(--fg) 66%, transparent); -} - -.level { - text-transform: uppercase; - letter-spacing: 0.06em; - font-family: var(--font-family-sans); - font-size: 0.68rem; -} - -.level-debug { - color: color-mix(in oklab, var(--muted) 82%, white 18%); -} - -.level-info { - color: color-mix(in oklab, var(--accent) 84%, white 16%); -} - -.level-warn { - color: color-mix(in oklab, var(--warn) 82%, white 18%); -} - -.level-error { - color: color-mix(in oklab, var(--err) 82%, white 18%); -} - -.log-source { - color: color-mix(in oklab, var(--fg) 78%, transparent); - font-size: 0.73rem; -} - -.log-message { - margin: 0; - line-height: 1.42; - font-size: 0.81rem; - color: color-mix(in oklab, var(--fg) 93%, transparent); - white-space: pre-wrap; - word-break: break-word; -} - -.metrics-body { - padding: 12px; - display: grid; - align-content: start; - gap: 12px; - overflow: auto; -} - -.metrics dl { - margin: 0; - display: grid; - grid-template-columns: auto 1fr; - gap: 6px 10px; - font-size: 0.8rem; -} - -.metrics dt { - color: color-mix(in oklab, var(--fg) 72%, transparent); -} - -.metrics dd { - margin: 0; -} - -.metrics pre { - margin: 0; - padding: 10px; - border: 1px solid var(--line-soft); - background: color-mix(in oklab, var(--surface-3) 84%, black 16%); - overflow: auto; - font-size: 0.72rem; - line-height: 1.44; - max-height: none; -} - -.metrics-scroll { - max-height: 56vh; -} - -@media (max-width: 1120px) { - .shell { - min-height: 100dvh; - height: 100dvh; - padding: 12px; - } - - .topbar { - flex-wrap: wrap; - align-items: center; - } - - .topbar-copy { - flex: 1 1 440px; - } - - .topbar-actions { - flex-wrap: wrap; - } - - .layout-grid-fixed { - grid-template-columns: 1fr; - gap: 14px; - height: auto; - } - - .logs { - min-height: 52vh; - } - - .log-row { - grid-template-columns: 72px 52px 100px minmax(0, 1fr); - font-size: 0.78rem; - } -} - -@media (max-width: 760px) { - .topbar { - flex-direction: column; - align-items: stretch; - gap: 10px; - } - - .topbar-copy { - width: 100%; - flex: 1 1 auto; - } - - .topbar-brand-inline { - align-items: center; - gap: 10px; - } - - .topbar-logo { - --topbar-logo-height: clamp(36px, 11vw, 44px); - } - - .topbar-subtitle { - white-space: normal; - font-size: 0.8rem; - } - - .topbar-actions { - width: 100%; - flex-wrap: wrap; - } - - .status-badge, - .topbar-actions [data-component="button"] { - width: 100%; - justify-content: center; - text-align: center; - } - - .log-row { - grid-template-columns: 64px 48px minmax(0, 1fr); - gap: 8px; - } - - .log-source { - grid-column: span 2; - } - - .log-message { - grid-column: span 3; - } -} diff --git a/web/src/ui/brand-logo.tsx b/web/src/ui/brand-logo.tsx deleted file mode 100644 index c7b080d..0000000 --- a/web/src/ui/brand-logo.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import logoUrl from "../assets/mcpway-ascii-logo.svg"; - -export interface BrandLogoProps { - class?: string; - alt?: string; -} - -export function BrandLogo(props: BrandLogoProps) { - return ( - {props.alt - ); -} diff --git a/web/src/ui/primitives/button.css b/web/src/ui/primitives/button.css deleted file mode 100644 index 3d06f3a..0000000 --- a/web/src/ui/primitives/button.css +++ /dev/null @@ -1,103 +0,0 @@ -@layer components { - [data-component="button"] { - display: inline-flex; - align-items: center; - justify-content: center; - border-style: solid; - border-width: 1px; - border-radius: var(--radius-md); - text-decoration: none; - user-select: none; - cursor: pointer; - outline: none; - white-space: nowrap; - - &[data-variant="primary"] { - background-color: var(--button-primary-base); - border-color: var(--border-weak-base); - color: var(--icon-invert-base); - - &:hover:not(:disabled) { - background-color: var(--icon-strong-hover); - } - &:focus:not(:disabled) { - background-color: var(--icon-strong-focus); - } - &:active:not(:disabled) { - background-color: var(--icon-strong-active); - } - &:disabled { - background-color: var(--icon-strong-disabled); - } - } - - &[data-variant="ghost"] { - border-color: transparent; - background-color: transparent; - color: var(--text-strong); - - &:hover:not(:disabled), - &:focus-visible:not(:disabled) { - background-color: var(--surface-base-hover); - } - &:active:not(:disabled) { - background-color: var(--surface-base-active); - } - &:disabled { - color: var(--text-weak); - cursor: not-allowed; - } - } - - &[data-variant="secondary"] { - border: transparent; - background-color: var(--button-secondary-base); - color: var(--text-strong); - box-shadow: var(--shadow-xs-border-base); - - &:hover:not(:disabled) { - background-color: var(--button-secondary-hover); - } - &:focus-visible:not(:active) { - background-color: var(--button-secondary-base); - box-shadow: var(--shadow-xs-border-focus); - } - &:disabled { - background-color: var(--surface-disabled); - color: var(--text-weak); - cursor: not-allowed; - } - } - - &[data-size="small"] { - height: 24px; - padding: 0 8px; - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - &[data-size="normal"] { - height: 28px; - padding: 0 10px; - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - &[data-size="large"] { - height: 32px; - padding: 0 12px; - font-family: var(--font-family-sans); - font-size: var(--font-size-base); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - &:focus { - outline: none; - } - } -} diff --git a/web/src/ui/primitives/button.tsx b/web/src/ui/primitives/button.tsx deleted file mode 100644 index 6e0994d..0000000 --- a/web/src/ui/primitives/button.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Button as KobalteButton } from "@kobalte/core/button"; -import { splitProps, type ComponentProps } from "solid-js"; - -export type ButtonVariant = "primary" | "secondary" | "ghost"; -export type ButtonSize = "small" | "normal" | "large"; - -export type ButtonProps = ComponentProps & { - variant?: ButtonVariant; - size?: ButtonSize; -}; - -export function Button(props: ButtonProps) { - const [local, rest] = splitProps(props, ["variant", "size", "class", "classList"]); - - return ( - - {props.children} - - ); -} diff --git a/web/src/ui/primitives/card.css b/web/src/ui/primitives/card.css deleted file mode 100644 index 91c032b..0000000 --- a/web/src/ui/primitives/card.css +++ /dev/null @@ -1,41 +0,0 @@ -@layer components { - [data-component="card"] { - width: 100%; - display: flex; - flex-direction: column; - background-color: var(--surface-inset-base); - border: 1px solid var(--border-weaker-base); - border-radius: var(--radius-md); - padding: 6px 12px; - overflow: clip; - color: var(--text-base); - } - - [data-component="card"][data-variant="error"] { - background-color: var(--surface-critical-weak); - border-color: var(--border-critical-base); - color: var(--text-on-critical-base); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-regular); - line-height: var(--line-height-large); - } - - [data-component="card"][data-variant="warning"] { - border-color: color-mix(in oklab, var(--warn) 55%, transparent); - background: color-mix(in oklab, var(--surface-3) 80%, var(--warn) 20%); - color: color-mix(in oklab, var(--warn) 90%, white 10%); - } - - [data-component="card"][data-variant="success"] { - border-color: color-mix(in oklab, var(--ok) 55%, transparent); - background: color-mix(in oklab, var(--surface-3) 80%, var(--ok) 20%); - color: color-mix(in oklab, var(--ok) 90%, white 10%); - } - - [data-component="card"][data-variant="info"] { - border-color: color-mix(in oklab, var(--accent) 55%, transparent); - background: color-mix(in oklab, var(--surface-3) 80%, var(--accent) 20%); - color: color-mix(in oklab, var(--accent) 90%, white 10%); - } -} diff --git a/web/src/ui/primitives/card.tsx b/web/src/ui/primitives/card.tsx deleted file mode 100644 index fc9d0d7..0000000 --- a/web/src/ui/primitives/card.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { splitProps, type ComponentProps } from "solid-js"; - -export interface CardProps extends ComponentProps<"div"> { - variant?: "normal" | "error" | "warning" | "success" | "info"; -} - -export function Card(props: CardProps) { - const [local, rest] = splitProps(props, ["variant", "class", "classList"]); - - return ( -
- {props.children} -
- ); -} diff --git a/web/src/ui/primitives/icon-button.css b/web/src/ui/primitives/icon-button.css deleted file mode 100644 index 7d89ba4..0000000 --- a/web/src/ui/primitives/icon-button.css +++ /dev/null @@ -1,65 +0,0 @@ -@layer components { - [data-component="icon-button"] { - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: var(--radius-sm); - text-decoration: none; - user-select: none; - aspect-ratio: 1; - flex-shrink: 0; - border: 1px solid transparent; - - &[data-size="small"] { - width: 20px; - height: 20px; - font-size: 0.8rem; - } - - &[data-size="normal"] { - width: 24px; - height: 24px; - font-size: 0.9rem; - } - - &[data-size="large"] { - width: 32px; - height: 32px; - font-size: 1rem; - } - - &[data-variant="secondary"] { - background-color: var(--button-secondary-base); - color: var(--text-strong); - box-shadow: var(--shadow-xs-border-base); - - &:hover:not(:disabled) { - background-color: var(--button-secondary-hover); - } - } - - &[data-variant="primary"] { - background-color: var(--icon-strong-base); - color: var(--icon-invert-base); - - &:hover:not(:disabled) { - background-color: var(--icon-strong-hover); - } - } - - &[data-variant="ghost"] { - background-color: transparent; - color: var(--icon-base); - - &:hover:not(:disabled), - &:focus-visible:not(:disabled) { - background-color: var(--surface-base-hover); - } - } - - &:disabled { - opacity: 0.65; - cursor: not-allowed; - } - } -} diff --git a/web/src/ui/primitives/icon-button.tsx b/web/src/ui/primitives/icon-button.tsx deleted file mode 100644 index 6358f38..0000000 --- a/web/src/ui/primitives/icon-button.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Button as KobalteButton } from "@kobalte/core/button"; -import { splitProps, type ComponentProps } from "solid-js"; -import type { ButtonSize, ButtonVariant } from "./button"; - -export interface IconButtonProps extends ComponentProps { - label: string; - size?: ButtonSize; - variant?: ButtonVariant; -} - -export function IconButton(props: IconButtonProps) { - const [local, rest] = splitProps(props, ["label", "size", "variant", "class", "classList"]); - - return ( - - {props.children} - - ); -} diff --git a/web/src/ui/primitives/index.css b/web/src/ui/primitives/index.css deleted file mode 100644 index 1d4ecf1..0000000 --- a/web/src/ui/primitives/index.css +++ /dev/null @@ -1,9 +0,0 @@ -@layer components; - -@import "./shared.css" layer(components); -@import "./button.css" layer(components); -@import "./icon-button.css" layer(components); -@import "./card.css" layer(components); -@import "./text-field.css" layer(components); -@import "./select.css" layer(components); -@import "./scroll-view.css" layer(components); diff --git a/web/src/ui/primitives/index.ts b/web/src/ui/primitives/index.ts deleted file mode 100644 index 4af3db5..0000000 --- a/web/src/ui/primitives/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from "./button"; -export { IconButton, type IconButtonProps } from "./icon-button"; -export { Card, type CardProps } from "./card"; -export { ScrollView, type ScrollViewProps } from "./scroll-view"; -export { Select, type SelectOption, type SelectProps } from "./select"; -export { TextField, type TextFieldProps } from "./text-field"; diff --git a/web/src/ui/primitives/scroll-view.css b/web/src/ui/primitives/scroll-view.css deleted file mode 100644 index 2c99aa9..0000000 --- a/web/src/ui/primitives/scroll-view.css +++ /dev/null @@ -1,29 +0,0 @@ -@layer components { - [data-component="scroll-view"] { - position: relative; - overflow: auto; - scrollbar-width: thin; - scrollbar-color: var(--border-weaker-base) transparent; - } - - [data-component="scroll-view"]::-webkit-scrollbar { - width: 10px; - height: 10px; - } - - [data-component="scroll-view"]::-webkit-scrollbar-track { - background: transparent; - } - - [data-component="scroll-view"]::-webkit-scrollbar-thumb { - background: var(--border-weaker-base); - border-radius: 999px; - border: 2px solid transparent; - background-clip: content-box; - } - - [data-component="scroll-view"]::-webkit-scrollbar-thumb:hover { - background: var(--border-strong-base); - background-clip: content-box; - } -} diff --git a/web/src/ui/primitives/scroll-view.tsx b/web/src/ui/primitives/scroll-view.tsx deleted file mode 100644 index cb10458..0000000 --- a/web/src/ui/primitives/scroll-view.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { splitProps, type ComponentProps } from "solid-js"; - -export interface ScrollViewProps extends ComponentProps<"div"> {} - -export function ScrollView(props: ScrollViewProps) { - const [local, rest] = splitProps(props, ["class", "classList"]); - - return ( -
- {props.children} -
- ); -} diff --git a/web/src/ui/primitives/select.css b/web/src/ui/primitives/select.css deleted file mode 100644 index 9498cf3..0000000 --- a/web/src/ui/primitives/select.css +++ /dev/null @@ -1,156 +0,0 @@ -@layer components { - [data-component="select-field"] { - width: 100%; - display: grid; - gap: 8px; - - [data-slot="select-label"] { - color: var(--text-weak); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - [data-slot="select-error"] { - margin: 0; - color: var(--text-on-critical-base); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - line-height: var(--line-height-large); - } - } - - [data-component="select"] { - [data-slot="select-select-trigger"] { - width: 100%; - justify-content: space-between; - padding: 0 8px 0 10px; - box-shadow: none; - - [data-slot="select-select-trigger-value"] { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - [data-slot="select-select-trigger-icon"] { - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - color: var(--text-weak); - transition: transform 0.1s ease-in-out; - } - - &[data-expanded] { - background-color: var(--button-secondary-hover); - box-shadow: var(--shadow-xs-border-base); - - [data-slot="select-select-trigger-icon"] { - transform: rotate(180deg); - } - } - - &:not([data-expanded]):focus-visible { - background-color: var(--button-secondary-base); - } - } - } - - [data-component="select-content"] { - width: max(var(--kb-popper-anchor-width, 0px), 160px); - min-width: max(var(--kb-popper-anchor-width, 0px), 160px); - max-width: min(23rem, var(--kb-popper-content-available-width, 23rem)); - overflow: hidden; - border-radius: 0; - background-color: var(--surface-raised-stronger-non-alpha); - padding: 4px; - box-shadow: var(--shadow-xs-border); - border: 1px solid var(--border-weaker-base); - z-index: 120; - - &[data-expanded] { - animation: select-open 0.15s ease-out; - } - - [data-slot="select-select-content-list"] { - width: 100%; - margin: 0; - padding: 0; - list-style: none; - overflow-y: auto; - max-height: 12rem; - white-space: nowrap; - overflow-x: hidden; - display: flex; - flex-direction: column; - - &:focus { - outline: none; - } - - > *:not([role="presentation"]) + *:not([role="presentation"]) { - margin-top: 2px; - } - } - - [data-slot="select-select-item"] { - position: relative; - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - box-sizing: border-box; - padding: 2px 8px; - gap: 12px; - border-radius: 0; - cursor: default; - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - color: var(--text-strong); - transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - outline: none; - user-select: none; - - &[data-highlighted] { - background: var(--surface-raised-base-hover); - } - - &:hover { - background: var(--surface-raised-base-hover); - } - - [data-slot="select-select-item-indicator"] { - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - width: 16px; - height: 16px; - } - - [data-slot="select-select-item-label"] { - flex: 1 1 auto; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - } - } - } - - @keyframes select-open { - from { - opacity: 0; - transform: scale(0.95); - } - to { - opacity: 1; - transform: scale(1); - } - } -} diff --git a/web/src/ui/primitives/select.tsx b/web/src/ui/primitives/select.tsx deleted file mode 100644 index afe6dad..0000000 --- a/web/src/ui/primitives/select.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { Select as KobalteSelect } from "@kobalte/core/select"; -import { Show, createMemo, splitProps } from "solid-js"; -import { Button, type ButtonSize, type ButtonVariant } from "./button"; - -export type SelectOption = { - value: string; - label: string; -}; - -export interface SelectProps { - label?: string; - placeholder?: string; - options: SelectOption[]; - current?: string; - disabled?: boolean; - error?: string; - size?: ButtonSize; - variant?: ButtonVariant; - onSelect?: (value: string | undefined) => void; -} - -export function Select(props: SelectProps) { - const [local] = splitProps(props, [ - "label", - "placeholder", - "options", - "current", - "disabled", - "error", - "size", - "variant", - "onSelect" - ]); - - const hasOptions = createMemo(() => local.options.length > 0); - const current = createMemo(() => local.options.find((item) => item.value === local.current)); - - return ( -
- - - - - - data-component="select" - placement="bottom-start" - gutter={4} - flip - sameWidth - options={local.options} - value={current()} - optionValue={(option) => option.value} - optionTextValue={(option) => option.label} - disallowEmptySelection={hasOptions()} - onChange={(value) => local.onSelect?.(value?.value)} - itemComponent={(itemProps) => ( - - {itemProps.item.rawValue.label} - - - )} - > - - data-slot="select-select-trigger-value"> - {(state) => - state.selectedOption()?.label ?? - current()?.label ?? - local.placeholder ?? - (hasOptions() ? "Select option" : "No options") - } - - - - - - - - - - - - -

{local.error}

-
-
- ); -} diff --git a/web/src/ui/primitives/shared.css b/web/src/ui/primitives/shared.css deleted file mode 100644 index ff125cb..0000000 --- a/web/src/ui/primitives/shared.css +++ /dev/null @@ -1,13 +0,0 @@ -@layer components { - .sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - border: 0; - overflow: hidden; - clip: rect(0 0 0 0); - white-space: nowrap; - } -} diff --git a/web/src/ui/primitives/text-field.css b/web/src/ui/primitives/text-field.css deleted file mode 100644 index 8a4bf0e..0000000 --- a/web/src/ui/primitives/text-field.css +++ /dev/null @@ -1,85 +0,0 @@ -@layer components { - [data-component="input"] { - width: 100%; - - [data-slot="input-input"] { - width: 100%; - color: var(--text-strong); - font-family: var(--font-family-sans); - font-size: var(--font-size-base); - font-weight: var(--font-weight-regular); - line-height: var(--line-height-large); - - &:focus { - outline: none; - } - - &::placeholder { - color: var(--text-weak); - } - } - - &[data-variant="normal"] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; - - [data-slot="input-label"] { - color: var(--text-weak); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - [data-slot="input-wrapper"] { - display: flex; - align-items: start; - justify-content: space-between; - width: 100%; - border-radius: var(--radius-md); - border: 1px solid var(--border-weak-base); - background: var(--input-base); - - &:focus-within:not(:has([readonly])) { - border-color: transparent; - box-shadow: var(--shadow-xs-border-focus); - } - } - - [data-slot="input-input"] { - color: var(--text-strong); - display: flex; - min-height: 32px; - padding: 6px 10px; - align-items: center; - flex: 1; - min-width: 0; - background: transparent; - border: none; - } - - textarea[data-slot="input-input"] { - height: auto; - min-height: 76px; - resize: vertical; - } - - [data-slot="input-error"] { - color: var(--text-on-critical-base); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - font-weight: var(--font-weight-medium); - line-height: var(--line-height-large); - } - - [data-slot="input-description"] { - color: var(--text-weak); - font-family: var(--font-family-sans); - font-size: var(--font-size-small); - line-height: var(--line-height-large); - } - } - } -} diff --git a/web/src/ui/primitives/text-field.tsx b/web/src/ui/primitives/text-field.tsx deleted file mode 100644 index 9589f79..0000000 --- a/web/src/ui/primitives/text-field.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { TextField as KobalteTextField } from "@kobalte/core/text-field"; -import { Show, splitProps, type ComponentProps, type JSX } from "solid-js"; - -export interface TextFieldProps { - label?: string; - hideLabel?: boolean; - description?: string; - error?: string; - variant?: "normal" | "ghost"; - value?: string; - defaultValue?: string; - placeholder?: string; - type?: string; - multiline?: boolean; - readOnly?: boolean; - disabled?: boolean; - required?: boolean; - name?: string; - autocomplete?: string; - onInput?: JSX.EventHandlerUnion; - onKeyDown?: JSX.EventHandlerUnion; - class?: string; - classList?: ComponentProps<"div">["classList"]; -} - -export function TextField(props: TextFieldProps) { - const [local] = splitProps(props, [ - "label", - "hideLabel", - "description", - "error", - "variant", - "value", - "defaultValue", - "placeholder", - "type", - "multiline", - "readOnly", - "disabled", - "required", - "name", - "autocomplete", - "onInput", - "onKeyDown", - "class", - "classList" - ]); - - return ( - - - - {local.label} - - - -
- } - onKeyDown={local.onKeyDown as JSX.EventHandler} - /> - } - > - } - onKeyDown={local.onKeyDown as JSX.EventHandler} - /> - -
- - - {local.description} - - - {local.error} - -
- ); -} diff --git a/web/src/ui/surfaces/error-format.ts b/web/src/ui/surfaces/error-format.ts deleted file mode 100644 index dcdf531..0000000 --- a/web/src/ui/surfaces/error-format.ts +++ /dev/null @@ -1,145 +0,0 @@ -const ERROR_CHAIN_SEPARATOR = `\n${"─".repeat(40)}\n`; - -export function safeJson(value: unknown): string { - const seen = new WeakSet(); - const json = JSON.stringify( - value, - (_key, part) => { - if (typeof part === "bigint") { - return part.toString(); - } - if (typeof part === "object" && part) { - if (seen.has(part)) { - return "[Circular]"; - } - seen.add(part); - } - return part; - }, - 2 - ); - return json ?? String(value); -} - -export function formatErrorChain(error: unknown, depth = 0, parentMessage?: string): string { - if (!error) { - return "Unknown error"; - } - - if (error instanceof Error) { - const isDuplicate = depth > 0 && parentMessage === error.message; - const prefix = depth > 0 ? `\n${ERROR_CHAIN_SEPARATOR}Caused by:\n` : ""; - const header = `${error.name}${error.message ? `: ${error.message}` : ""}`; - const lines: string[] = []; - const stack = error.stack?.trim(); - - if (stack) { - const startsWithHeader = stack.startsWith(header); - if (!isDuplicate) { - lines.push(prefix + (startsWithHeader ? stack : `${header}\n${stack}`)); - } else if (!startsWithHeader) { - lines.push(prefix + stack); - } else { - const trace = stack.split("\n").slice(1).join("\n").trim(); - if (trace) { - lines.push(prefix + trace); - } - } - } else if (!isDuplicate) { - lines.push(prefix + header); - } - - const causedBy = "cause" in error ? (error as { cause?: unknown }).cause : undefined; - if (causedBy) { - const nested = formatErrorChain(causedBy, depth + 1, error.message); - if (nested) { - lines.push(nested); - } - } - return lines.join("\n\n"); - } - - if (typeof error === "string") { - if (depth > 0 && parentMessage === error) { - return ""; - } - const prefix = depth > 0 ? `\n${ERROR_CHAIN_SEPARATOR}Caused by:\n` : ""; - return prefix + error; - } - - const prefix = depth > 0 ? `\n${ERROR_CHAIN_SEPARATOR}Caused by:\n` : ""; - return prefix + safeJson(error); -} - -export function formatFatalError(error: unknown): string { - return formatErrorChain(error, 0); -} - -export function detailsFromUnknown(input: unknown, fallbackMessage: string): { message: string; details?: string } { - if (input instanceof Error) { - return { - message: input.message || fallbackMessage, - details: input.stack - }; - } - - if (typeof input === "string") { - return { - message: input || fallbackMessage - }; - } - - try { - const serialized = JSON.stringify(input); - if (serialized && serialized !== "{}") { - return { - message: fallbackMessage, - details: serialized - }; - } - } catch { - // Keep fallback values. - } - - return { - message: fallbackMessage - }; -} - -export function detailsFromViteError(payload: unknown): { message: string; details?: string } { - if (!payload || typeof payload !== "object") { - return detailsFromUnknown(payload, "Build error"); - } - - const data = payload as { - err?: { - message?: string; - stack?: string; - frame?: string; - id?: string; - plugin?: string; - loc?: { - file?: string; - line?: number; - column?: number; - }; - }; - }; - - const err = data.err; - if (!err) { - return detailsFromUnknown(payload, "Build error"); - } - - const message = err.message?.trim() || "Build error"; - const location = - err.loc && typeof err.loc.line === "number" && typeof err.loc.column === "number" - ? `${err.loc.file ?? err.id ?? "unknown"}:${err.loc.line}:${err.loc.column}` - : undefined; - const detailsParts = [location, err.plugin ? `plugin: ${err.plugin}` : undefined, err.frame, err.stack].filter(Boolean); - - return { - message, - details: detailsParts.length > 0 ? detailsParts.join("\n\n") : undefined - }; -} diff --git a/web/src/ui/surfaces/error-overlay.css b/web/src/ui/surfaces/error-overlay.css deleted file mode 100644 index 7307119..0000000 --- a/web/src/ui/surfaces/error-overlay.css +++ /dev/null @@ -1,271 +0,0 @@ -@layer components { - .app-overlay-backdrop[data-component="dialog-overlay"] { - position: fixed; - inset: 0; - z-index: 9998; - background-color: var(--background-base); - backdrop-filter: none; - } - - .app-overlay[data-component="dialog"] { - position: fixed; - inset: 0; - z-index: 9999; - display: flex; - align-items: center; - justify-content: center; - pointer-events: none; - } - - .app-overlay-container[data-slot="dialog-container"] { - position: relative; - z-index: 9999; - width: min(calc(100vw - 16px), 640px); - height: min(calc(100dvh - 16px), 560px); - display: flex; - flex-direction: column; - } - - .app-overlay-card { - width: 100%; - height: 100%; - min-height: 320px; - pointer-events: auto; - overflow: hidden; - border: 1px solid color-mix(in oklab, var(--err) 60%, transparent); - border-radius: 0; - background: var(--surface-raised-stronger-non-alpha); - box-shadow: none; - display: grid; - grid-template-rows: auto auto auto minmax(0, 1fr) auto; - gap: 0; - - scrollbar-width: none; - -ms-overflow-style: none; - } - - .app-overlay-card::-webkit-scrollbar { - display: none; - } - - .app-overlay-header { - display: flex; - justify-content: space-between; - align-items: center; - gap: 10px; - padding: 20px 20px 14px; - border-bottom: 1px solid color-mix(in oklab, var(--line-soft) 74%, transparent); - background: color-mix(in oklab, var(--surface-2) 90%, black 10%); - } - - .app-overlay-title { - margin: 0; - font-family: var(--font-family-sans); - font-size: var(--font-size-large); - font-weight: var(--font-weight-medium); - line-height: 1.5; - letter-spacing: -0.01em; - } - - .app-overlay-header-actions { - display: flex; - align-items: center; - gap: 6px; - flex: 0 0 auto; - } - - .app-overlay-message { - margin: 0; - padding: 14px 20px 12px; - font-family: var(--font-family-sans); - color: color-mix(in oklab, var(--fg) 88%, transparent); - font-size: var(--font-size-base); - line-height: var(--line-height-large); - border-bottom: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - background: color-mix(in oklab, var(--surface-1) 90%, black 10%); - } - - .app-overlay-meta { - margin: 0; - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - border-bottom: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - background: color-mix(in oklab, var(--surface-1) 92%, black 8%); - } - - .app-overlay-meta > div { - min-width: 0; - display: grid; - gap: 4px; - padding: 8px 14px; - } - - .app-overlay-meta > div + div { - border-left: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - } - - .app-overlay-meta dt { - margin: 0; - font-family: var(--font-family-sans); - font-size: 0.66rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: color-mix(in oklab, var(--fg) 65%, transparent); - } - - .app-overlay-meta dd { - margin: 0; - font-size: 0.76rem; - color: color-mix(in oklab, var(--fg) 94%, transparent); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .app-overlay-meta-kind dd { - display: flex; - align-items: center; - } - - .app-overlay-body { - min-height: 0; - padding: 12px 20px; - display: grid; - gap: 8px; - align-content: start; - background: color-mix(in oklab, var(--surface-1) 92%, black 8%); - } - - .app-overlay-section-title { - margin: 0; - font-family: var(--font-family-sans); - font-size: 0.7rem; - text-transform: uppercase; - letter-spacing: 0.08em; - color: color-mix(in oklab, var(--fg) 72%, transparent); - } - - .app-overlay-details { - margin: 0; - width: 100%; - box-sizing: border-box; - border: 1px solid var(--line-soft); - border-radius: 0; - background: color-mix(in oklab, var(--surface-3) 84%, black 16%); - padding: 10px; - font-size: 0.74rem; - line-height: 1.4; - max-height: min(44vh, 340px); - overflow: auto; - white-space: pre-wrap; - word-break: break-word; - } - - .app-overlay-actions { - display: flex; - justify-content: center; - flex-wrap: wrap; - gap: 8px; - padding: 14px 20px 20px; - border-top: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - background: color-mix(in oklab, var(--surface-2) 90%, black 10%); - } - - .app-overlay-backdrop[data-component="dialog-overlay"] { - animation: overlayHide 100ms ease-in forwards; - } - - .app-overlay-backdrop[data-component="dialog-overlay"][data-expanded] { - animation: overlayShow 150ms ease-out; - } - - .app-overlay-card[data-slot="dialog-content"] { - animation: contentHide 100ms ease-in forwards; - } - - .app-overlay-card[data-slot="dialog-content"][data-expanded] { - animation: contentShow 150ms ease-out; - } - - @media (max-width: 760px) { - .app-overlay-container[data-slot="dialog-container"] { - width: min(calc(100vw - 12px), 640px); - height: min(calc(100dvh - 12px), 560px); - } - - .app-overlay-header { - padding: 14px 12px 10px; - } - - .app-overlay-meta { - grid-template-columns: 1fr; - } - - .app-overlay-meta > div { - padding: 8px 12px; - } - - .app-overlay-meta > div + div { - border-left: none; - border-top: 1px solid color-mix(in oklab, var(--line-soft) 68%, transparent); - } - - .app-overlay-body { - padding: 10px 12px; - } - - .app-overlay-details { - max-height: min(46vh, 300px); - } - - .app-overlay-actions { - width: 100%; - flex-direction: column; - padding: 10px 12px 12px; - } - - .app-overlay-actions [data-component="button"] { - width: 100%; - } - } - - @keyframes overlayShow { - from { - opacity: 0; - } - to { - opacity: 1; - } - } - - @keyframes overlayHide { - from { - opacity: 1; - } - to { - opacity: 0; - } - } - - @keyframes contentShow { - from { - opacity: 0; - transform: scale(0.98); - } - to { - opacity: 1; - transform: scale(1); - } - } - - @keyframes contentHide { - from { - opacity: 1; - transform: scale(1); - } - to { - opacity: 0; - transform: scale(0.98); - } - } -} diff --git a/web/src/ui/surfaces/error-overlay.tsx b/web/src/ui/surfaces/error-overlay.tsx deleted file mode 100644 index ccbbce2..0000000 --- a/web/src/ui/surfaces/error-overlay.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { Dialog } from "@kobalte/core/dialog"; -import { Show, createEffect, createMemo, createSignal, onCleanup } from "solid-js"; -import { Button, IconButton } from "../primitives"; - -export type OverlayErrorEntry = { - kind: "runtime" | "promise" | "network" | "socket"; - message: string; - details?: string; - scope?: "global" | "logs" | "runtime" | "themes"; - ts?: number; -}; - -export interface ErrorOverlayProps { - entry: OverlayErrorEntry | null; - onRetry: () => void; - onDismiss: () => void; -} - -export function ErrorOverlay(props: ErrorOverlayProps) { - const [copyState, setCopyState] = createSignal<"idle" | "copied" | "failed">("idle"); - let resetTimer: number | undefined; - - const detailText = createMemo(() => { - const current = props.entry; - if (!current) { - return ""; - } - if (current.details?.trim()) { - return current.details.trim(); - } - return `No stack trace or extra diagnostics were captured for this ${current.kind} error.`; - }); - - const detailPayload = createMemo(() => { - const current = props.entry; - if (!current) { - return ""; - } - - const at = current.ts ? new Date(current.ts).toISOString() : new Date().toISOString(); - const scope = current.scope ?? "global"; - return [ - "MCPway Runtime Error", - `kind: ${current.kind}`, - `scope: ${scope}`, - `timestamp: ${at}`, - "", - `message: ${current.message}`, - "", - "details:", - detailText() - ].join("\n"); - }); - - createEffect(() => { - props.entry; - setCopyState("idle"); - }); - - onCleanup(() => { - if (resetTimer !== undefined) { - window.clearTimeout(resetTimer); - } - }); - - async function copyDetails() { - const payload = detailPayload(); - if (!payload || !props.entry) { - return; - } - - try { - await navigator.clipboard.writeText(payload); - setCopyState("copied"); - } catch (error) { - console.error("Failed to copy overlay error details", error); - setCopyState("failed"); - } - - if (resetTimer !== undefined) { - window.clearTimeout(resetTimer); - } - resetTimer = window.setTimeout(() => setCopyState("idle"), 2400); - } - - return ( - !isOpen && props.onDismiss()}> - - -
-
- - - {(entry) => ( - <> -
- - MCPway Runtime Error - -
- - × - -
-
- - - {entry().message} - - -
-
-
Kind
-
- {entry().kind} -
-
-
-
Scope
-
{entry().scope ?? "global"}
-
-
-
Time
-
{entry().ts ? new Date(entry().ts).toLocaleString() : "now"}
-
-
- -
-

Details

-
{detailText()}
-
- -
- - - -
- - )} -
-
-
-
-
-
- ); -} diff --git a/web/src/ui/surfaces/error-screen.css b/web/src/ui/surfaces/error-screen.css deleted file mode 100644 index 9e23da3..0000000 --- a/web/src/ui/surfaces/error-screen.css +++ /dev/null @@ -1,102 +0,0 @@ -@layer components { - .fatal-error-page { - width: 100%; - min-height: 100dvh; - display: flex; - align-items: center; - justify-content: center; - padding: 24px; - background: - radial-gradient(120% 120% at 100% 0%, color-mix(in oklab, var(--err) 12%, transparent) 0%, transparent 42%), - radial-gradient(140% 120% at 0% 100%, color-mix(in oklab, var(--accent) 12%, transparent) 0%, transparent 56%), - linear-gradient(160deg, color-mix(in oklab, var(--bg) 95%, black 5%) 0%, var(--bg) 62%); - } - - .fatal-error-card { - width: min(900px, 100%); - max-height: calc(100dvh - 56px); - border: 1px solid color-mix(in oklab, var(--err) 52%, transparent); - background: color-mix(in oklab, var(--surface-1) 92%, black 8%); - box-shadow: 0 30px 100px color-mix(in oklab, black 58%, transparent); - padding: 18px; - display: grid; - gap: 14px; - } - - .fatal-error-logo { - width: min(420px, 100%); - height: auto; - display: block; - filter: drop-shadow(0 0 10px color-mix(in oklab, var(--accent) 28%, transparent)); - } - - .fatal-error-header { - display: grid; - gap: 6px; - } - - .fatal-error-header h1 { - margin: 0; - font-family: var(--font-family-sans); - font-size: 1.04rem; - font-weight: 640; - letter-spacing: 0.08em; - text-transform: uppercase; - } - - .fatal-error-header p { - margin: 0; - font-family: var(--font-family-sans); - font-size: 0.84rem; - color: color-mix(in oklab, var(--fg) 78%, transparent); - } - - .fatal-error-field { - width: 100%; - } - - .fatal-error-field [data-slot="input-wrapper"] { - width: 100%; - box-sizing: border-box; - border-radius: 0; - min-height: min(50dvh, 420px); - } - - .fatal-error-field [data-slot="input-input"] { - width: 100%; - box-sizing: border-box; - border-radius: 0; - min-height: min(50dvh, 420px); - font-family: var(--font-family-mono); - font-size: 0.78rem; - line-height: 1.48; - white-space: pre-wrap; - } - - .fatal-error-actions { - display: flex; - align-items: center; - gap: 8px; - justify-content: flex-end; - } - - @media (max-width: 760px) { - .fatal-error-page { - padding: 12px; - } - - .fatal-error-card { - max-height: calc(100dvh - 24px); - padding: 12px; - } - - .fatal-error-actions { - width: 100%; - flex-direction: column; - } - - .fatal-error-actions [data-component="button"] { - width: 100%; - } - } -} diff --git a/web/src/ui/surfaces/error-screen.tsx b/web/src/ui/surfaces/error-screen.tsx deleted file mode 100644 index e2a3e78..0000000 --- a/web/src/ui/surfaces/error-screen.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Card, Button, TextField } from "../primitives"; -import { BrandLogo } from "../brand-logo"; -import { formatFatalError } from "./error-format"; - -export interface ErrorScreenProps { - error: unknown; - copied: boolean; - onRetry: () => void; - onCopy: () => void | Promise; -} - -export function ErrorScreen(props: ErrorScreenProps) { - return ( - - ); -} diff --git a/web/src/ui/theme/base.css b/web/src/ui/theme/base.css deleted file mode 100644 index 7f712f2..0000000 --- a/web/src/ui/theme/base.css +++ /dev/null @@ -1,40 +0,0 @@ -@layer base { - *, - *::before, - *::after { - box-sizing: border-box; - } - - html, - body, - #root { - margin: 0; - width: 100%; - min-width: 0; - height: 100%; - min-height: 100dvh; - } - - body { - font-family: var(--font-family-mono); - color: var(--text-strong); - background: - radial-gradient(120% 120% at 100% 0%, color-mix(in oklab, var(--accent) 14%, transparent) 0%, transparent 45%), - radial-gradient(140% 120% at 0% 100%, color-mix(in oklab, var(--muted) 28%, transparent) 0%, transparent 56%), - repeating-linear-gradient( - 90deg, - color-mix(in oklab, var(--bg) 95%, white 5%) 0 1px, - transparent 1px 20px - ), - linear-gradient(160deg, color-mix(in oklab, var(--bg) 94%, white 6%) 0%, var(--bg) 62%); - overflow: hidden; - } - - button, - input, - select, - textarea { - font: inherit; - color: inherit; - } -} diff --git a/web/src/ui/theme/tokens.css b/web/src/ui/theme/tokens.css deleted file mode 100644 index b476ee2..0000000 --- a/web/src/ui/theme/tokens.css +++ /dev/null @@ -1,88 +0,0 @@ -@layer theme { - :root { - color-scheme: dark; - - --font-family-sans: "Inter", "IBM Plex Sans", "Segoe UI", sans-serif; - --font-family-mono: "IBM Plex Mono", "JetBrains Mono", "Fira Code", monospace; - - --font-size-small: 12px; - --font-size-base: 14px; - --font-size-large: 16px; - - --font-weight-regular: 400; - --font-weight-medium: 500; - - --line-height-normal: 1.3; - --line-height-large: 1.45; - - --radius-sm: 0; - --radius-md: 0; - - --bg: #101114; - --fg: #dde1ea; - --cursor: #f5f7fa; - --accent: #4a90e2; - --muted: #3a3f4b; - --ok: #27c93f; - --warn: #ffbd2e; - --err: #ff5f56; - - --surface-1: color-mix(in oklab, var(--bg) 89%, white 11%); - --surface-2: color-mix(in oklab, var(--bg) 84%, white 16%); - --surface-3: color-mix(in oklab, var(--bg) 79%, white 21%); - --surface-disabled: color-mix(in oklab, var(--surface-2) 84%, black 16%); - --line-soft: color-mix(in oklab, var(--fg) 18%, transparent); - --line-strong: color-mix(in oklab, var(--fg) 31%, transparent); - --panel-shadow: 0 18px 50px color-mix(in oklab, black 42%, transparent); - - --background-base: var(--bg); - --background-weak: var(--surface-1); - --surface-inset-base: color-mix(in oklab, var(--surface-2) 90%, black 10%); - --surface-base-hover: color-mix(in oklab, var(--surface-2) 82%, black 18%); - --surface-base-active: color-mix(in oklab, var(--surface-2) 74%, black 26%); - --surface-raised-base: var(--surface-2); - --surface-raised-base-active: color-mix(in oklab, var(--surface-2) 68%, black 32%); - --surface-raised-base-hover: color-mix(in oklab, var(--surface-2) 74%, white 26%); - --surface-raised-stronger-non-alpha: var(--surface-1); - - --input-base: color-mix(in oklab, var(--surface-2) 90%, black 10%); - --input-hover: color-mix(in oklab, var(--surface-2) 85%, black 15%); - - --text-strong: var(--fg); - --text-base: color-mix(in oklab, var(--fg) 87%, transparent); - --text-weak: color-mix(in oklab, var(--fg) 70%, transparent); - - --button-secondary-base: color-mix(in oklab, var(--surface-2) 90%, black 10%); - --button-secondary-hover: color-mix(in oklab, var(--surface-2) 78%, white 22%); - --button-primary-base: color-mix(in oklab, var(--accent) 78%, black 22%); - - --border-base: var(--line-strong); - --border-weak-base: var(--line-soft); - --border-weaker-base: color-mix(in oklab, var(--line-soft) 70%, transparent); - --border-strong-base: color-mix(in oklab, var(--line-strong) 92%, white 8%); - --border-critical-base: color-mix(in oklab, var(--err) 62%, transparent); - --border-selected: color-mix(in oklab, var(--accent) 75%, white 25%); - --border-weak-selected: color-mix(in oklab, var(--accent) 35%, transparent); - - --surface-critical-weak: color-mix(in oklab, var(--surface-2) 70%, var(--err) 30%); - --text-on-critical-base: color-mix(in oklab, var(--err) 82%, white 18%); - - --icon-base: color-mix(in oklab, var(--fg) 68%, transparent); - --icon-disabled: color-mix(in oklab, var(--fg) 42%, transparent); - --icon-strong-base: color-mix(in oklab, var(--fg) 92%, transparent); - --icon-strong-hover: color-mix(in oklab, var(--button-primary-base) 84%, black 16%); - --icon-strong-focus: color-mix(in oklab, var(--button-primary-base) 80%, black 20%); - --icon-strong-active: color-mix(in oklab, var(--button-primary-base) 72%, black 28%); - --icon-strong-disabled: color-mix(in oklab, var(--button-primary-base) 36%, black 64%); - --icon-invert-base: color-mix(in oklab, var(--fg) 96%, white 4%); - - --shadow-xs-border-base: - 0 0 0 1px var(--border-weak-base), 0 1px 2px -1px color-mix(in oklab, black 40%, transparent), - 0 1px 2px 0 color-mix(in oklab, black 30%, transparent); - --shadow-xs-border: var(--shadow-xs-border-base); - --shadow-xs-border-focus: - 0 0 0 3px var(--border-weak-selected), 0 0 0 1px var(--border-selected), - 0 1px 2px -1px color-mix(in oklab, black 42%, transparent), - 0 1px 2px 0 color-mix(in oklab, black 32%, transparent); - } -} diff --git a/web/tsconfig.json b/web/tsconfig.json deleted file mode 100644 index be4ed23..0000000 --- a/web/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "Bundler", - "strict": true, - "jsx": "preserve", - "jsxImportSource": "solid-js", - "types": ["vite/client"] - } -} diff --git a/web/vite.config.ts b/web/vite.config.ts deleted file mode 100644 index bc56da0..0000000 --- a/web/vite.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "vite"; -import solid from "vite-plugin-solid"; - -export default defineConfig({ - plugins: [solid()], - server: { - hmr: { - overlay: false - } - }, - build: { - target: "es2020" - } -});