@swarmvaultai/viewer 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-DejkTRrx.js → index-BOJfMXNm.js} +49 -49
- package/dist/assets/index-BctQPYXq.css +1 -0
- package/dist/index.html +2 -2
- package/dist/lib.d.ts +66 -1
- package/dist/lib.js +63 -0
- package/package.json +10 -9
- package/LICENSE +0 -21
- package/dist/assets/index-CRcCxyS8.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root,:root[data-theme=dark]{--c-bg-base: #020617;--c-bg-surface: #0c1222;--c-bg-elevated: rgba(15, 23, 42, .88);--c-bg-inset: rgba(2, 6, 23, .82);--c-bg-input: #070d1a;--c-bg-canvas-grid: rgba(148, 163, 184, .045);--c-bg-canvas-glow: rgba(14, 165, 233, .025);--c-border: rgba(148, 163, 184, .1);--c-border-subtle: rgba(148, 163, 184, .06);--c-border-focus: rgba(125, 211, 252, .45);--c-border-focus-strong: #38bdf8;--c-border-danger: rgba(248, 113, 113, .24);--c-border-warning: rgba(251, 191, 36, .2);--c-text-primary: #e2e8f0;--c-text-secondary: #94a3b8;--c-text-muted: #94a3b8;--c-text-accent: #7dd3fc;--c-text-error: #f87171;--c-text-warning: #fbbf24;--c-text-success: #34d399;--c-accent-bg: rgba(14, 165, 233, .08);--c-accent-bg-strong: rgba(14, 165, 233, .18);--c-danger-bg: rgba(127, 29, 29, .18);--c-warning-bg: rgba(251, 191, 36, .1);--c-success-bg: rgba(34, 197, 94, .1);--c-mark-bg: rgba(125, 211, 252, .18);--c-overlay: rgba(2, 6, 23, .78);--c-shadow-elevated: 0 20px 50px -10px rgba(0, 0, 0, .6);color-scheme:dark}:root[data-theme=light]{--c-bg-base: #f8fafc;--c-bg-surface: #ffffff;--c-bg-elevated: #ffffff;--c-bg-inset: #f1f5f9;--c-bg-input: #ffffff;--c-bg-canvas-grid: rgba(15, 23, 42, .07);--c-bg-canvas-glow: rgba(14, 165, 233, .06);--c-border: rgba(15, 23, 42, .1);--c-border-subtle: rgba(15, 23, 42, .06);--c-border-focus: rgba(14, 116, 144, .55);--c-border-focus-strong: #0284c7;--c-border-danger: rgba(220, 38, 38, .3);--c-border-warning: rgba(202, 138, 4, .3);--c-text-primary: #0f172a;--c-text-secondary: #475569;--c-text-muted: #64748b;--c-text-accent: #0369a1;--c-text-error: #b91c1c;--c-text-warning: #a16207;--c-text-success: #047857;--c-accent-bg: rgba(14, 165, 233, .1);--c-accent-bg-strong: rgba(14, 165, 233, .2);--c-danger-bg: rgba(254, 226, 226, .65);--c-warning-bg: rgba(254, 243, 199, .6);--c-success-bg: rgba(220, 252, 231, .6);--c-mark-bg: rgba(14, 165, 233, .22);--c-overlay: rgba(15, 23, 42, .55);--c-shadow-elevated: 0 10px 30px -10px rgba(15, 23, 42, .3);color-scheme:light}@media(prefers-color-scheme:light){:root:not([data-theme]){--c-bg-base: #f8fafc;--c-bg-surface: #ffffff;--c-bg-elevated: #ffffff;--c-bg-inset: #f1f5f9;--c-bg-input: #ffffff;--c-bg-canvas-grid: rgba(15, 23, 42, .07);--c-bg-canvas-glow: rgba(14, 165, 233, .06);--c-border: rgba(15, 23, 42, .1);--c-border-subtle: rgba(15, 23, 42, .06);--c-border-focus: rgba(14, 116, 144, .55);--c-border-focus-strong: #0284c7;--c-border-danger: rgba(220, 38, 38, .3);--c-border-warning: rgba(202, 138, 4, .3);--c-text-primary: #0f172a;--c-text-secondary: #475569;--c-text-muted: #64748b;--c-text-accent: #0369a1;--c-text-error: #b91c1c;--c-text-warning: #a16207;--c-text-success: #047857;--c-accent-bg: rgba(14, 165, 233, .1);--c-accent-bg-strong: rgba(14, 165, 233, .2);--c-danger-bg: rgba(254, 226, 226, .65);--c-warning-bg: rgba(254, 243, 199, .6);--c-success-bg: rgba(220, 252, 231, .6);--c-mark-bg: rgba(14, 165, 233, .22);--c-overlay: rgba(15, 23, 42, .55);--c-shadow-elevated: 0 10px 30px -10px rgba(15, 23, 42, .3);color-scheme:light}}:root{--font-sans: "Inter", "Avenir Next", "Segoe UI", system-ui, sans-serif;--font-mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;--text-2xs: .6875rem;--text-xs: .75rem;--text-sm: .8125rem;--text-base: .9375rem;--text-lg: 1.0625rem;--text-xl: 1.25rem;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 20px;--sp-6: 24px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 10px;--sidebar-width: 240px;--rail-width: 400px;--bar-height: 42px;--z-overlay: 30;--z-drawer: 40;--z-modal: 50;font-family:var(--font-sans);background:var(--c-bg-base);color:var(--c-text-primary)}*,*:before,*:after{box-sizing:border-box}body{margin:0;height:100vh;overflow:hidden;font-size:var(--text-sm);line-height:1.5;-webkit-font-smoothing:antialiased;background:var(--c-bg-base);color:var(--c-text-primary)}#root{height:100vh;overflow:hidden}:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:2px;border-radius:var(--radius-sm)}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[role=button]:focus-visible,[role=tab]:focus-visible,[role=option]:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:2px}.app-shell{display:grid;grid-template-columns:var(--sidebar-width) minmax(0,1fr) var(--rail-width);grid-template-rows:var(--bar-height) minmax(0,1fr);grid-template-areas:"bar bar bar" "sidebar center rail";height:100vh;overflow:hidden}.app-bar{grid-area:bar;display:flex;align-items:center;gap:var(--sp-3);padding:0 var(--sp-5);background:var(--c-bg-surface);border-bottom:1px solid var(--c-border);z-index:10}.app-bar-title{font-size:var(--text-sm);font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-accent)}.app-bar-subtitle{font-size:var(--text-xs);color:var(--c-text-muted);letter-spacing:.04em}.app-bar-spacer{flex:1}.app-bar-actions{display:flex;gap:var(--sp-2);align-items:center}.app-bar-icon-btn{all:unset;display:inline-flex;align-items:center;justify-content:center;height:28px;min-width:28px;padding:0 var(--sp-2);border-radius:var(--radius-sm);border:1px solid var(--c-border);color:var(--c-text-secondary);cursor:pointer;font-size:var(--text-xs);background:transparent;transition:border-color .12s,color .12s,background .12s}.app-bar-icon-btn:hover{border-color:var(--c-border-focus);color:var(--c-text-primary);background:var(--c-accent-bg)}.drawer-trigger{display:none}.sidebar{grid-area:sidebar;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-right:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-3);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.sidebar-section{display:flex;flex-direction:column;gap:var(--sp-2)}.sidebar-heading{font-size:var(--text-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-muted);padding:var(--sp-1) 0;border-bottom:1px solid var(--c-border-subtle);margin-bottom:var(--sp-1)}.sidebar-section-toggle{all:unset;display:flex;align-items:center;gap:var(--sp-2);width:100%;cursor:pointer;font-size:var(--text-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-muted);padding:var(--sp-1) 0;border-bottom:1px solid var(--c-border-subtle);margin-bottom:var(--sp-1);transition:color .15s}.sidebar-section-toggle:hover{color:var(--c-text-secondary)}.sidebar-section-toggle:before{content:"▸";font-size:.6em;transition:transform .2s ease;display:inline-block}.sidebar-section-toggle.is-expanded:before{transform:rotate(90deg)}.sidebar-section-toggle .filter-badge{margin-left:auto;font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-accent);font-weight:500}.sidebar-section-body{display:grid;gap:var(--sp-2);max-height:0;overflow:hidden;transition:max-height .25s ease,opacity .2s ease;opacity:0}.sidebar-section-body.is-expanded{max-height:800px;opacity:1}.filter-group{display:flex;flex-direction:column;gap:3px}.filter-label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted)}.center-area{grid-area:center;display:flex;flex-direction:column;min-height:0;overflow:hidden}.stats-strip{display:flex;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--c-border-subtle);background:var(--c-bg-surface);align-items:center;flex-shrink:0}.stats-group{display:flex;gap:var(--sp-3);align-items:baseline}.stats-divider{width:1px;height:14px;background:var(--c-border);align-self:center;flex-shrink:0}.stat{display:flex;align-items:baseline;gap:var(--sp-1)}.stat-label{font-size:var(--text-2xs);color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.06em}.stat-value{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--c-text-primary);font-weight:500}.overview-banner{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--c-border-subtle);background:var(--c-warning-bg);color:var(--c-text-secondary);font-size:var(--text-xs);letter-spacing:.02em;flex-shrink:0}.overview-banner code{font-family:var(--font-mono);font-size:inherit;color:var(--c-text-warning)}.workbench-dashboard{border-bottom:1px solid var(--c-border);background:var(--c-bg-surface);padding:var(--sp-3) var(--sp-4);display:grid;gap:var(--sp-3);flex-shrink:0}.workbench-strip{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}.health-pill,.workbench-metric{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:26px;border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:0 var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary);background:var(--c-bg-inset)}.health-pill{font-weight:700;color:var(--c-text-primary)}.health-dot{width:7px;height:7px;border-radius:999px;background:var(--c-text-warning)}.health-ok .health-dot{background:var(--c-text-success)}.health-error .health-dot{background:var(--c-text-error)}.workbench-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-3)}.workbench-card{border:1px solid var(--c-border);border-radius:var(--radius-md);background:var(--c-bg-inset);padding:var(--sp-3);display:grid;gap:var(--sp-2);min-width:0}.workbench-card-title{margin:0;font-size:var(--text-sm);font-weight:700}.workbench-textarea{min-height:58px;resize:vertical}.workbench-error{margin:0;color:var(--c-text-error);font-size:var(--text-xs)}.workbench-checks{align-content:start}.workbench-check{display:flex;justify-content:space-between;gap:var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary);border-bottom:1px solid var(--c-border-subtle);padding-bottom:var(--sp-1)}.workbench-check.check-error{color:var(--c-text-error)}.workbench-check.check-warning{color:var(--c-text-warning)}@media(max-width:980px){.workbench-grid{grid-template-columns:1fr}}.canvas-wrap{position:relative;min-height:0;display:flex;flex-direction:column;flex:1 1 auto}.canvas{flex:1;min-height:0;background:radial-gradient(ellipse at 50% 40%,var(--c-bg-canvas-glow),transparent 65%),radial-gradient(circle at 1px 1px,var(--c-bg-canvas-grid) 1px,transparent 0),var(--c-bg-base);background-size:100% 100%,28px 28px,100% 100%}.canvas-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-3)}.loading-text{font-size:var(--text-base);color:var(--c-text-muted);letter-spacing:.06em;font-weight:400;animation:pulse-fade 2s ease-in-out infinite}@keyframes pulse-fade{0%,to{opacity:.35}50%{opacity:.85}}.canvas-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-2);color:var(--c-text-muted)}.canvas-empty-icon{font-size:2rem;opacity:.4}.canvas-toolbar{position:absolute;top:var(--sp-2);left:var(--sp-2);display:flex;flex-wrap:wrap;gap:var(--sp-2);z-index:5;background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-1) var(--sp-2);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);align-items:center;font-size:var(--text-xs)}.canvas-toolbar-group{display:flex;align-items:center;gap:var(--sp-1);padding-right:var(--sp-2);border-right:1px solid var(--c-border-subtle)}.canvas-toolbar-group:last-child{border-right:none;padding-right:0}.canvas-toolbar select.input{height:24px;padding:0 var(--sp-2);font-size:var(--text-xs);width:auto;min-width:110px}.canvas-toolbar .btn{height:24px;padding:0 var(--sp-2);font-size:var(--text-xs)}.canvas-legend{position:absolute;bottom:var(--sp-2);left:var(--sp-2);display:flex;flex-direction:column;gap:var(--sp-1);background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:5;max-width:220px}.canvas-legend-heading{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);margin-bottom:var(--sp-1)}.canvas-legend-group{display:flex;flex-direction:column;gap:2px}.legend-row{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary)}.legend-swatch{width:12px;height:12px;border-radius:2px;display:inline-block}.legend-swatch.shape-diamond{transform:rotate(45deg);width:9px;height:9px}.legend-swatch.shape-hex{clip-path:polygon(25% 0%,75% 0%,100% 50%,75% 100%,25% 100%,0% 50%)}.legend-swatch.shape-round{border-radius:50%}.legend-swatch.line-dashed{border-bottom:1.5px dashed currentColor;height:0;width:18px}.legend-swatch.line-solid{border-bottom:1.5px solid currentColor;height:0;width:18px}.legend-toggle{position:absolute;bottom:var(--sp-2);right:var(--sp-2);z-index:5}.canvas-minimap{position:absolute;top:var(--sp-2);right:var(--sp-2);width:180px;height:120px;background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);overflow:hidden;z-index:5;cursor:crosshair}.canvas-minimap-viewport{position:absolute;border:1.5px solid var(--c-border-focus-strong);background:#38bdf814;pointer-events:none}.report-tabs{border-top:1px solid var(--c-border);background:var(--c-bg-surface);max-height:360px;overflow:hidden;flex-shrink:0}.report-tabs .tabs{border:none;border-radius:0;background:transparent}.report-tabs .tab-panel{max-height:310px;overflow-y:auto}.report-tabs-empty{padding:var(--sp-3);text-align:center;color:var(--c-text-muted);font-size:var(--text-sm)}.report-stats{display:flex;gap:var(--sp-4);font-size:var(--text-sm);color:var(--c-text-secondary);flex-wrap:wrap}.report-stats strong{font-family:var(--font-mono);color:var(--c-text-primary);margin-left:var(--sp-1)}.surprise-row{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}.detail-rail{grid-area:rail;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-left:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-3);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.tabs{border-radius:var(--radius-lg);border:1px solid var(--c-border);background:var(--c-bg-elevated);overflow:hidden}.tab-bar{display:flex;border-bottom:1px solid var(--c-border);padding:0 var(--sp-1);gap:0;flex-wrap:wrap}.tab-btn{all:unset;padding:var(--sp-2) var(--sp-3);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);cursor:pointer;border-bottom:2px solid transparent;transition:color .12s,border-color .12s;white-space:nowrap}.tab-btn.is-active{color:var(--c-text-primary);border-bottom-color:var(--c-text-accent)}.tab-btn:hover:not(.is-active){color:var(--c-text-secondary)}.tab-btn:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:-2px;border-radius:var(--radius-sm)}.tab-count{margin-left:var(--sp-1);font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-accent)}.tab-panel{padding:var(--sp-3);max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.panel{background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);padding:var(--sp-3);transition:border-color .15s}.panel-heading{margin:0 0 var(--sp-2);font-size:var(--text-base);font-weight:700;text-transform:none;letter-spacing:.01em;color:var(--c-text-primary);display:flex;align-items:baseline;gap:var(--sp-2)}.panel-heading .panel-meta{font-size:var(--text-xs);font-weight:400;color:var(--c-text-muted);text-transform:none;letter-spacing:0}.page-panel{min-height:120px}.card-list{display:grid;gap:var(--sp-2)}.card{background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);display:flex;flex-direction:column;gap:4px}.card.is-selected{border-color:var(--c-border-focus-strong);background:var(--c-accent-bg-strong)}.card>.input+.input,.card>.input+.btn,.card>.btn+.input{margin-top:2px}.card-warning{border-color:var(--c-border-warning)}.card-title{font-size:var(--text-sm);font-weight:600;color:var(--c-text-primary);margin:0;line-height:1.3}.card-row{display:flex;align-items:center;gap:var(--sp-2)}.result-card{all:unset;display:flex;flex-direction:column;gap:3px;background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);cursor:pointer;transition:border-color .12s,background .12s}.result-card:hover{border-color:var(--c-border-focus);background:var(--c-accent-bg)}.result-card.is-active{border-color:var(--c-border-focus);background:var(--c-accent-bg-strong)}.input{background:var(--c-bg-input);color:var(--c-text-primary);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:6px var(--sp-2);font-family:var(--font-sans);font-size:var(--text-sm);width:100%;outline:none;transition:border-color .12s}.input:focus{border-color:var(--c-border-focus)}.input::placeholder{color:var(--c-text-muted)}select.input{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='currentColor'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:24px;text-overflow:ellipsis;color:var(--c-text-primary)}.btn{all:unset;display:inline-flex;align-items:center;gap:var(--sp-1);height:28px;padding:0 var(--sp-3);font-size:var(--text-xs);font-family:var(--font-sans);border-radius:var(--radius-sm);cursor:pointer;border:1px solid var(--c-border);background:transparent;color:var(--c-text-primary);transition:border-color .12s,background .12s;white-space:nowrap}.btn:hover{border-color:var(--c-border-focus);background:var(--c-accent-bg)}.btn:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:1px}.btn:disabled{opacity:.35;cursor:default;pointer-events:none}.btn-primary{border-color:var(--c-border-focus-strong);background:var(--c-accent-bg-strong);color:var(--c-text-primary)}.btn-danger{border-color:var(--c-border-danger);background:var(--c-danger-bg);color:var(--c-text-error)}.btn-ghost{border:none;background:transparent;color:var(--c-text-accent);padding:0 var(--sp-1);height:auto;font-size:var(--text-xs)}.btn-ghost:hover{text-decoration:underline;border:none;background:transparent}.btn-icon{width:24px;padding:0;justify-content:center}.action-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-1);align-items:center}.action-row-end{margin-left:auto}.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-1)}.chip{display:inline-flex;align-items:center;gap:var(--sp-1);padding:2px var(--sp-2);font-size:var(--text-2xs);font-family:var(--font-mono);background:var(--c-bg-inset);border:1px solid var(--c-border);color:var(--c-text-secondary);border-radius:999px;letter-spacing:0}.chip-tag{background:var(--c-accent-bg);border-color:var(--c-border-focus);color:var(--c-text-accent);cursor:pointer}.chip-tag.is-active{background:var(--c-accent-bg-strong)}.chip-static{cursor:default}.chip-danger{border-color:var(--c-border-danger);background:var(--c-danger-bg);color:var(--c-text-error)}.chip-warning{border-color:var(--c-border-warning);background:var(--c-warning-bg);color:var(--c-text-warning)}.chip-success{border-color:#22c55e66;background:var(--c-success-bg);color:var(--c-text-success)}.label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);font-weight:500}.meta-grid{display:grid;grid-template-columns:auto 1fr;gap:3px var(--sp-3);font-size:var(--text-xs);align-items:baseline}.meta-label{color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.04em;font-size:var(--text-2xs);white-space:nowrap}.meta-value{color:var(--c-text-primary);overflow-wrap:break-word;word-break:break-word}.meta-value-truncate{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.meta-value.mono,.text-mono{font-family:var(--font-mono)}.linked-section{margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--c-border-subtle)}.asset-preview{display:grid;gap:var(--sp-2);margin-top:var(--sp-2)}.asset-card{margin:0;display:grid;gap:var(--sp-1)}.asset-card img{width:100%;max-height:200px;object-fit:contain;border-radius:var(--radius-md);border:1px solid var(--c-border);background:var(--c-bg-inset)}.asset-card figcaption{color:var(--c-text-muted);font-size:var(--text-2xs)}.markdown-content{margin-top:var(--sp-3);padding:var(--sp-3);border-radius:var(--radius-md);background:var(--c-bg-inset);border:1px solid var(--c-border);color:var(--c-text-primary);font-size:var(--text-sm);line-height:1.6;overflow-wrap:break-word;word-break:break-word}.markdown-content>*:first-child{margin-top:0}.markdown-content>*:last-child{margin-bottom:0}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4{margin:1.2em 0 .5em;line-height:1.25;color:var(--c-text-primary);font-weight:600}.markdown-content h1{font-size:var(--text-xl)}.markdown-content h2{font-size:var(--text-lg)}.markdown-content h3{font-size:var(--text-base)}.markdown-content h4{font-size:var(--text-sm)}.markdown-content p{margin:.5em 0}.markdown-content a{color:var(--c-text-accent);text-decoration:underline;text-decoration-color:#7dd3fc59}.markdown-content a:hover{text-decoration-color:currentColor}.markdown-content ul,.markdown-content ol{margin:.5em 0;padding-left:1.4em}.markdown-content li{margin:.15em 0}.markdown-content blockquote{margin:.7em 0;padding:.4em var(--sp-3);border-left:3px solid var(--c-border-focus);color:var(--c-text-secondary);background:var(--c-bg-elevated);border-radius:0 var(--radius-sm) var(--radius-sm) 0}.markdown-content code{font-family:var(--font-mono);font-size:.9em;background:var(--c-bg-elevated);border:1px solid var(--c-border-subtle);border-radius:var(--radius-sm);padding:0 4px}.markdown-content pre{background:var(--c-bg-base);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-3);overflow-x:auto;margin:.7em 0;font-size:.85em;line-height:1.5}.markdown-content pre code{background:transparent;border:none;padding:0;font-size:inherit}.markdown-content table{width:100%;border-collapse:collapse;margin:.7em 0;font-size:var(--text-xs)}.markdown-content th,.markdown-content td{border:1px solid var(--c-border);padding:4px 8px;text-align:left}.markdown-content th{background:var(--c-bg-elevated);font-weight:600}.markdown-content hr{border:none;border-top:1px solid var(--c-border);margin:1em 0}.markdown-content img{max-width:100%;height:auto;border-radius:var(--radius-md)}.markdown-content .hljs{color:var(--c-text-primary);background:transparent}.markdown-content .hljs-comment,.markdown-content .hljs-quote{color:var(--c-text-muted);font-style:italic}.markdown-content .hljs-keyword,.markdown-content .hljs-selector-tag,.markdown-content .hljs-built_in,.markdown-content .hljs-tag{color:#c084fc}.markdown-content .hljs-string,.markdown-content .hljs-attr,.markdown-content .hljs-doctag{color:var(--c-text-success)}.markdown-content .hljs-title,.markdown-content .hljs-name,.markdown-content .hljs-section{color:var(--c-text-accent);font-weight:600}.markdown-content .hljs-number,.markdown-content .hljs-literal{color:var(--c-text-warning)}.markdown-content .hljs-variable,.markdown-content .hljs-template-variable,.markdown-content .hljs-symbol{color:#fbbf24}.markdown-content .hljs-type,.markdown-content .hljs-class{color:#38bdf8}.markdown-content .hljs-meta{color:var(--c-text-muted)}.markdown-content .hljs-deletion{background:var(--c-danger-bg);color:var(--c-text-error)}.markdown-content .hljs-addition{background:var(--c-success-bg);color:var(--c-text-success)}.content-pre{margin:var(--sp-2) 0 0;white-space:pre-wrap;overflow:auto;max-height:340px;padding:var(--sp-3);border-radius:var(--radius-md);background:var(--c-bg-inset);border:1px solid var(--c-border);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.55;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.content-truncation-note{margin-top:var(--sp-1);font-size:var(--text-2xs);color:var(--c-text-muted);font-style:italic}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--sp-5) var(--sp-3);color:var(--c-text-muted);text-align:center;min-height:80px;gap:var(--sp-2)}.empty-state-icon{font-size:1.5rem;opacity:.4;line-height:1}mark{background:var(--c-mark-bg);color:var(--c-text-accent);border-radius:2px;padding:0 2px}.search-controls{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);flex-wrap:wrap}.search-syntax-help{background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary)}.search-syntax-help code{background:var(--c-bg-elevated);padding:1px 4px;border-radius:var(--radius-sm)}.recent-searches{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}.text-sm{font-size:var(--text-sm)}.text-xs{font-size:var(--text-xs)}.text-muted{color:var(--c-text-muted)}.text-secondary{color:var(--c-text-secondary)}.text-accent{color:var(--c-text-accent)}.text-success{color:var(--c-text-success)}.text-warning{color:var(--c-text-warning);font-size:var(--text-xs)}.text-error{color:var(--c-text-error);font-size:var(--text-xs)}code{font-family:var(--font-mono);font-size:var(--text-xs)}p,h3,h4{margin:0}a{color:var(--c-text-accent);text-decoration:none}a:hover{text-decoration:underline}.bulk-toolbar{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2);margin-bottom:var(--sp-2);background:var(--c-accent-bg);border:1px solid var(--c-border-focus);border-radius:var(--radius-md);font-size:var(--text-xs)}.bulk-toolbar-count{color:var(--c-text-accent);font-family:var(--font-mono);font-weight:600}.list-filter-bar{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-2);align-items:center}.list-filter-bar .input{flex:1;min-width:120px}.checkbox-cell{display:inline-flex;align-items:center;gap:var(--sp-1);cursor:pointer}.checkbox-cell input{cursor:pointer;accent-color:var(--c-border-focus-strong)}.activity-feed{display:flex;flex-direction:column;gap:var(--sp-2)}.activity-item{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-2);align-items:start;font-size:var(--text-xs);padding:var(--sp-1) var(--sp-2);border-left:2px solid var(--c-border)}.activity-item.activity-success{border-left-color:var(--c-text-success)}.activity-item.activity-warning{border-left-color:var(--c-text-warning)}.activity-item.activity-error{border-left-color:var(--c-text-error)}.activity-item.activity-info{border-left-color:var(--c-text-accent)}.activity-time{font-family:var(--font-mono);color:var(--c-text-muted);font-size:var(--text-2xs);white-space:nowrap}.activity-message{color:var(--c-text-primary);overflow-wrap:break-word}.activity-meta{color:var(--c-text-muted);font-size:var(--text-2xs);margin-top:2px}.activity-status-pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:var(--text-2xs);border:1px solid var(--c-border)}.activity-status-pill.is-live{border-color:#22c55e66;color:var(--c-text-success)}.activity-status-pill.is-live:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--c-text-success);animation:pulse-fade 1.6s ease-in-out infinite}.activity-status-pill.is-offline{color:var(--c-text-muted)}.lint-finding{padding:var(--sp-2);border-left:3px solid var(--c-border);background:var(--c-bg-inset);border-radius:0 var(--radius-md) var(--radius-md) 0;font-size:var(--text-xs);display:flex;flex-direction:column;gap:4px}.lint-finding.is-error{border-left-color:var(--c-text-error)}.lint-finding.is-warning{border-left-color:var(--c-text-warning)}.lint-finding.is-info{border-left-color:var(--c-text-accent)}.palette-overlay{position:fixed;inset:0;background:var(--c-overlay);display:flex;justify-content:center;align-items:flex-start;padding-top:12vh;z-index:var(--z-modal);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.palette{width:min(560px,92vw);max-height:70vh;background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);box-shadow:var(--c-shadow-elevated);display:flex;flex-direction:column;overflow:hidden}.palette-input{border:none;border-bottom:1px solid var(--c-border);padding:var(--sp-3) var(--sp-4);font-size:var(--text-base);background:transparent;color:var(--c-text-primary);outline:none}.palette-list{overflow-y:auto;padding:var(--sp-1);display:flex;flex-direction:column;gap:2px}.palette-item{all:unset;display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:var(--radius-sm);font-size:var(--text-sm);cursor:pointer;color:var(--c-text-primary)}.palette-item.is-active,.palette-item:hover{background:var(--c-accent-bg)}.palette-item-shortcut{margin-left:auto;font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-muted);border:1px solid var(--c-border);padding:1px 6px;border-radius:var(--radius-sm)}.palette-item-section{font-size:var(--text-2xs);color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:var(--sp-2) var(--sp-3) var(--sp-1)}.palette-empty{padding:var(--sp-4);text-align:center;color:var(--c-text-muted);font-size:var(--text-sm)}.help-modal{width:min(640px,92vw);background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);box-shadow:var(--c-shadow-elevated);padding:var(--sp-4)}.shortcut-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2) var(--sp-4);margin-top:var(--sp-3)}.shortcut-row{display:flex;align-items:center;justify-content:space-between;padding:var(--sp-1) 0;border-bottom:1px dashed var(--c-border-subtle)}.kbd{display:inline-flex;align-items:center;gap:2px;font-family:var(--font-mono);font-size:var(--text-2xs);background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:1px 6px;color:var(--c-text-secondary)}.drawer-backdrop{position:fixed;inset:0;background:var(--c-overlay);z-index:var(--z-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:none}.drawer-backdrop.is-open{display:block}.diff-view{margin-top:var(--sp-3);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);background:var(--c-bg-inset)}.diff-toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-2);gap:var(--sp-2);flex-wrap:wrap}.diff-frontmatter{width:100%;margin-bottom:var(--sp-2);border-collapse:collapse;font-size:var(--text-xs)}.diff-frontmatter th,.diff-frontmatter td{text-align:left;padding:4px 8px;border-bottom:1px solid var(--c-border-subtle);vertical-align:top}.diff-frontmatter tr.is-protected{background:var(--c-danger-bg)}.label-danger{color:var(--c-text-error);margin-left:4px}.diff-hunk{margin-bottom:var(--sp-2)}.diff-hunk-header{color:var(--c-text-muted);padding:2px 4px}.diff-unified,.diff-column{font-family:var(--font-mono);font-size:12px;line-height:1.5;margin:0;padding:4px 0;overflow-x:auto;background:var(--c-bg-base);max-height:320px;overflow-y:auto}.diff-split{display:grid;grid-template-columns:1fr 1fr;gap:4px}.diff-line{display:flex;gap:8px;padding:0 8px;white-space:pre}.diff-marker{width:1ch;display:inline-block;flex-shrink:0}.diff-add{background:#16a34a2e;color:var(--c-text-success)}.diff-remove{background:#dc26262e;color:var(--c-text-error)}.diff-context{color:var(--c-text-secondary)}.btn.is-active{background:var(--c-accent-bg-strong);border-color:var(--c-border-focus-strong);color:var(--c-text-primary)}.theme-toggle-options{display:inline-flex;border:1px solid var(--c-border);border-radius:var(--radius-sm);overflow:hidden}.theme-toggle-options button{all:unset;padding:4px 8px;font-size:var(--text-2xs);cursor:pointer;color:var(--c-text-secondary);border-right:1px solid var(--c-border)}.theme-toggle-options button:last-child{border-right:none}.theme-toggle-options button:hover{color:var(--c-text-primary)}.theme-toggle-options button.is-active{background:var(--c-accent-bg-strong);color:var(--c-text-primary)}.undo-toast{position:fixed;bottom:var(--sp-4);left:50%;transform:translate(-50%);background:var(--c-bg-elevated);border:1px solid var(--c-border-focus);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);display:flex;align-items:center;gap:var(--sp-3);box-shadow:var(--c-shadow-elevated);z-index:var(--z-modal);font-size:var(--text-sm)}@media(max-width:1100px){.app-shell{grid-template-columns:1fr;grid-template-rows:var(--bar-height) minmax(0,1fr);grid-template-areas:"bar" "center";height:100vh}.drawer-trigger{display:inline-flex}.sidebar,.detail-rail{position:fixed;top:var(--bar-height);bottom:0;width:min(320px,90vw);z-index:var(--z-drawer);transform:translate(-100%);transition:transform .22s ease;box-shadow:var(--c-shadow-elevated)}.sidebar{left:0;border-right:1px solid var(--c-border)}.detail-rail{right:0;left:auto;transform:translate(100%);border-left:1px solid var(--c-border)}.sidebar.is-open,.detail-rail.is-open{transform:translate(0)}.center-area{grid-area:center}.stats-strip{flex-wrap:wrap;gap:var(--sp-2)}.canvas-toolbar{flex-wrap:wrap}}@media(max-width:600px){.sidebar,.detail-rail{width:100vw;box-shadow:none}.canvas-minimap{display:none}.canvas-legend{max-width:160px}.canvas-toolbar{left:var(--sp-1);right:var(--sp-1);top:var(--sp-1)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}
|
package/dist/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>SwarmVault Graph</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BOJfMXNm.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BctQPYXq.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/dist/lib.d.ts
CHANGED
|
@@ -254,12 +254,61 @@ type ViewerLintFinding = {
|
|
|
254
254
|
nodeId?: string;
|
|
255
255
|
detectedAt?: string;
|
|
256
256
|
};
|
|
257
|
+
type ViewerDoctorStatus = "ok" | "warning" | "error";
|
|
258
|
+
type ViewerDoctorAction = {
|
|
259
|
+
command: string;
|
|
260
|
+
description: string;
|
|
261
|
+
destructive?: boolean;
|
|
262
|
+
};
|
|
263
|
+
type ViewerDoctorCheck = {
|
|
264
|
+
id: string;
|
|
265
|
+
label: string;
|
|
266
|
+
status: ViewerDoctorStatus;
|
|
267
|
+
summary: string;
|
|
268
|
+
detail?: string;
|
|
269
|
+
actions?: ViewerDoctorAction[];
|
|
270
|
+
};
|
|
271
|
+
type ViewerDoctorReport = {
|
|
272
|
+
ok: boolean;
|
|
273
|
+
status: ViewerDoctorStatus;
|
|
274
|
+
generatedAt: string;
|
|
275
|
+
rootDir: string;
|
|
276
|
+
version: string;
|
|
277
|
+
counts: {
|
|
278
|
+
sources: number;
|
|
279
|
+
managedSources: number;
|
|
280
|
+
pages: number;
|
|
281
|
+
nodes: number;
|
|
282
|
+
edges: number;
|
|
283
|
+
approvalsPending: number;
|
|
284
|
+
candidates: number;
|
|
285
|
+
tasks: number;
|
|
286
|
+
pendingSemanticRefresh: number;
|
|
287
|
+
};
|
|
288
|
+
checks: ViewerDoctorCheck[];
|
|
289
|
+
repaired: string[];
|
|
290
|
+
};
|
|
291
|
+
type ViewerActionResult = {
|
|
292
|
+
ok?: boolean;
|
|
293
|
+
error?: string;
|
|
294
|
+
[key: string]: unknown;
|
|
295
|
+
};
|
|
296
|
+
type ViewerCapturePayload = {
|
|
297
|
+
url?: string;
|
|
298
|
+
title?: string;
|
|
299
|
+
selectionText?: string;
|
|
300
|
+
selectionHtml?: string;
|
|
301
|
+
markdown?: string;
|
|
302
|
+
tags?: string[];
|
|
303
|
+
sourceMode?: "ingest" | "add" | "inbox";
|
|
304
|
+
};
|
|
257
305
|
type ViewerWorkspaceBundle = {
|
|
258
306
|
graph: ViewerGraphArtifact;
|
|
259
307
|
approvals: ViewerApprovalSummary[];
|
|
260
308
|
candidates: ViewerCandidateRecord[];
|
|
261
309
|
memoryTasks: ViewerMemoryTaskSummary[];
|
|
262
310
|
watchStatus: ViewerWatchStatus;
|
|
311
|
+
doctor: ViewerDoctorReport | null;
|
|
263
312
|
graphReport: ViewerGraphReport | null;
|
|
264
313
|
lintFindings: ViewerLintFinding[];
|
|
265
314
|
};
|
|
@@ -392,6 +441,22 @@ declare function fetchMemoryTasks(): Promise<ViewerMemoryTaskSummary[]>;
|
|
|
392
441
|
declare function applyCandidateAction(target: string, action: "promote" | "archive"): Promise<ViewerCandidateRecord>;
|
|
393
442
|
declare function fetchWatchStatus(): Promise<ViewerWatchStatus>;
|
|
394
443
|
declare function fetchLintFindings(): Promise<ViewerLintFinding[]>;
|
|
444
|
+
declare function fetchDoctorReport(options?: {
|
|
445
|
+
repair?: boolean;
|
|
446
|
+
}): Promise<ViewerDoctorReport | null>;
|
|
447
|
+
declare function captureToVault(payload: ViewerCapturePayload): Promise<ViewerActionResult>;
|
|
448
|
+
declare function createContextPack(payload: {
|
|
449
|
+
goal: string;
|
|
450
|
+
target?: string;
|
|
451
|
+
budgetTokens?: number;
|
|
452
|
+
format?: "markdown" | "json" | "llms";
|
|
453
|
+
}): Promise<ViewerActionResult>;
|
|
454
|
+
declare function createTask(payload: {
|
|
455
|
+
goal: string;
|
|
456
|
+
target?: string;
|
|
457
|
+
budgetTokens?: number;
|
|
458
|
+
agent?: string;
|
|
459
|
+
}): Promise<ViewerActionResult>;
|
|
395
460
|
declare function fetchWorkspaceBundle(): Promise<ViewerWorkspaceBundle | null>;
|
|
396
461
|
type SubgraphExportPayload = {
|
|
397
462
|
generatedAt: string;
|
|
@@ -403,4 +468,4 @@ declare function buildSubgraphExport(graph: ViewerGraphArtifact, nodeIds: string
|
|
|
403
468
|
declare function downloadDataUrl(filename: string, dataUrl: string): void;
|
|
404
469
|
declare function downloadText(filename: string, text: string, mime?: string): void;
|
|
405
470
|
|
|
406
|
-
export { type SubgraphExportPayload, type ViewerApprovalDetail, type ViewerApprovalDiffHunk, type ViewerApprovalDiffLine, type ViewerApprovalEntry, type ViewerApprovalFrontmatterChange, type ViewerApprovalStructuredDiff, type ViewerApprovalSummary, type ViewerCandidateRecord, type ViewerGraphArtifact, type ViewerGraphEdge, type ViewerGraphExplainResult, type ViewerGraphHyperedge, type ViewerGraphNode, type ViewerGraphPage, type ViewerGraphPathResult, type ViewerGraphQueryResult, type ViewerGraphReport, type ViewerLintFinding, type ViewerMemoryTaskSummary, type ViewerOutputAsset, type ViewerPagePayload, type ViewerReviewActionResult, type ViewerSearchOptions, type ViewerSearchResult, type ViewerWatchStatus, type ViewerWorkspaceBundle, applyCandidateAction, applyReviewAction, buildSubgraphExport, downloadDataUrl, downloadText, fetchApprovalDetail, fetchApprovals, fetchCandidates, fetchGraphArtifact, fetchGraphExplain, fetchGraphPath, fetchGraphQuery, fetchGraphReport, fetchLintFindings, fetchMemoryTasks, fetchViewerPage, fetchWatchStatus, fetchWorkspaceBundle, searchViewerPages };
|
|
471
|
+
export { type SubgraphExportPayload, type ViewerActionResult, type ViewerApprovalDetail, type ViewerApprovalDiffHunk, type ViewerApprovalDiffLine, type ViewerApprovalEntry, type ViewerApprovalFrontmatterChange, type ViewerApprovalStructuredDiff, type ViewerApprovalSummary, type ViewerCandidateRecord, type ViewerCapturePayload, type ViewerDoctorAction, type ViewerDoctorCheck, type ViewerDoctorReport, type ViewerDoctorStatus, type ViewerGraphArtifact, type ViewerGraphEdge, type ViewerGraphExplainResult, type ViewerGraphHyperedge, type ViewerGraphNode, type ViewerGraphPage, type ViewerGraphPathResult, type ViewerGraphQueryResult, type ViewerGraphReport, type ViewerLintFinding, type ViewerMemoryTaskSummary, type ViewerOutputAsset, type ViewerPagePayload, type ViewerReviewActionResult, type ViewerSearchOptions, type ViewerSearchResult, type ViewerWatchStatus, type ViewerWorkspaceBundle, applyCandidateAction, applyReviewAction, buildSubgraphExport, captureToVault, createContextPack, createTask, downloadDataUrl, downloadText, fetchApprovalDetail, fetchApprovals, fetchCandidates, fetchDoctorReport, fetchGraphArtifact, fetchGraphExplain, fetchGraphPath, fetchGraphQuery, fetchGraphReport, fetchLintFindings, fetchMemoryTasks, fetchViewerPage, fetchWatchStatus, fetchWorkspaceBundle, searchViewerPages };
|
package/dist/lib.js
CHANGED
|
@@ -563,6 +563,65 @@ async function fetchLintFindings() {
|
|
|
563
563
|
}
|
|
564
564
|
return response.json();
|
|
565
565
|
}
|
|
566
|
+
async function fetchDoctorReport(options = {}) {
|
|
567
|
+
if (embeddedData()) {
|
|
568
|
+
return null;
|
|
569
|
+
}
|
|
570
|
+
const response = await fetch("/api/doctor", {
|
|
571
|
+
method: options.repair ? "POST" : "GET",
|
|
572
|
+
headers: options.repair ? { "content-type": "application/json" } : void 0,
|
|
573
|
+
body: options.repair ? JSON.stringify({ repair: true }) : void 0
|
|
574
|
+
});
|
|
575
|
+
if (response.status === 404) {
|
|
576
|
+
return null;
|
|
577
|
+
}
|
|
578
|
+
if (!response.ok) {
|
|
579
|
+
throw new Error(`Failed to load vault doctor report: ${response.status} ${response.statusText}`);
|
|
580
|
+
}
|
|
581
|
+
return response.json();
|
|
582
|
+
}
|
|
583
|
+
async function captureToVault(payload) {
|
|
584
|
+
if (embeddedData()) {
|
|
585
|
+
throw new Error("Capture is unavailable in standalone exports.");
|
|
586
|
+
}
|
|
587
|
+
const response = await fetch("/api/clip", {
|
|
588
|
+
method: "POST",
|
|
589
|
+
headers: { "content-type": "application/json" },
|
|
590
|
+
body: JSON.stringify(payload)
|
|
591
|
+
});
|
|
592
|
+
if (!response.ok) {
|
|
593
|
+
throw new Error(`Failed to capture source: ${response.status} ${response.statusText}`);
|
|
594
|
+
}
|
|
595
|
+
return response.json();
|
|
596
|
+
}
|
|
597
|
+
async function createContextPack(payload) {
|
|
598
|
+
if (embeddedData()) {
|
|
599
|
+
throw new Error("Context-pack actions are unavailable in standalone exports.");
|
|
600
|
+
}
|
|
601
|
+
const response = await fetch("/api/context-pack", {
|
|
602
|
+
method: "POST",
|
|
603
|
+
headers: { "content-type": "application/json" },
|
|
604
|
+
body: JSON.stringify(payload)
|
|
605
|
+
});
|
|
606
|
+
if (!response.ok) {
|
|
607
|
+
throw new Error(`Failed to build context pack: ${response.status} ${response.statusText}`);
|
|
608
|
+
}
|
|
609
|
+
return response.json();
|
|
610
|
+
}
|
|
611
|
+
async function createTask(payload) {
|
|
612
|
+
if (embeddedData()) {
|
|
613
|
+
throw new Error("Task actions are unavailable in standalone exports.");
|
|
614
|
+
}
|
|
615
|
+
const response = await fetch("/api/task?action=start", {
|
|
616
|
+
method: "POST",
|
|
617
|
+
headers: { "content-type": "application/json" },
|
|
618
|
+
body: JSON.stringify(payload)
|
|
619
|
+
});
|
|
620
|
+
if (!response.ok) {
|
|
621
|
+
throw new Error(`Failed to start task: ${response.status} ${response.statusText}`);
|
|
622
|
+
}
|
|
623
|
+
return response.json();
|
|
624
|
+
}
|
|
566
625
|
async function fetchWorkspaceBundle() {
|
|
567
626
|
if (embeddedData()) {
|
|
568
627
|
return null;
|
|
@@ -604,11 +663,15 @@ export {
|
|
|
604
663
|
applyCandidateAction,
|
|
605
664
|
applyReviewAction,
|
|
606
665
|
buildSubgraphExport,
|
|
666
|
+
captureToVault,
|
|
667
|
+
createContextPack,
|
|
668
|
+
createTask,
|
|
607
669
|
downloadDataUrl,
|
|
608
670
|
downloadText,
|
|
609
671
|
fetchApprovalDetail,
|
|
610
672
|
fetchApprovals,
|
|
611
673
|
fetchCandidates,
|
|
674
|
+
fetchDoctorReport,
|
|
612
675
|
fetchGraphArtifact,
|
|
613
676
|
fetchGraphExplain,
|
|
614
677
|
fetchGraphPath,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmvaultai/viewer",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Graph viewer package for SwarmVault graph artifacts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/lib.js",
|
|
@@ -37,6 +37,14 @@
|
|
|
37
37
|
"engines": {
|
|
38
38
|
"node": ">=24.0.0"
|
|
39
39
|
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "pnpm run build:lib && pnpm run build:app",
|
|
42
|
+
"build:lib": "tsup src/lib.ts --format esm --dts --out-dir dist --clean",
|
|
43
|
+
"build:app": "vite build",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"prepublishOnly": "node ../../scripts/check-release-sync.mjs && node ../../scripts/check-published-manifests.mjs"
|
|
47
|
+
},
|
|
40
48
|
"dependencies": {
|
|
41
49
|
"cytoscape": "^3.33.1",
|
|
42
50
|
"highlight.js": "^11.10.0",
|
|
@@ -61,12 +69,5 @@
|
|
|
61
69
|
"typescript": "^5.9.2",
|
|
62
70
|
"vite": "^7.1.7",
|
|
63
71
|
"vitest": "^3.2.4"
|
|
64
|
-
},
|
|
65
|
-
"scripts": {
|
|
66
|
-
"build": "pnpm run build:lib && pnpm run build:app",
|
|
67
|
-
"build:lib": "tsup src/lib.ts --format esm --dts --out-dir dist --clean",
|
|
68
|
-
"build:app": "vite build",
|
|
69
|
-
"test": "vitest run",
|
|
70
|
-
"typecheck": "tsc --noEmit"
|
|
71
72
|
}
|
|
72
|
-
}
|
|
73
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 SwarmVault
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root,:root[data-theme=dark]{--c-bg-base: #020617;--c-bg-surface: #0c1222;--c-bg-elevated: rgba(15, 23, 42, .88);--c-bg-inset: rgba(2, 6, 23, .82);--c-bg-input: #070d1a;--c-bg-canvas-grid: rgba(148, 163, 184, .045);--c-bg-canvas-glow: rgba(14, 165, 233, .025);--c-border: rgba(148, 163, 184, .1);--c-border-subtle: rgba(148, 163, 184, .06);--c-border-focus: rgba(125, 211, 252, .45);--c-border-focus-strong: #38bdf8;--c-border-danger: rgba(248, 113, 113, .24);--c-border-warning: rgba(251, 191, 36, .2);--c-text-primary: #e2e8f0;--c-text-secondary: #94a3b8;--c-text-muted: #94a3b8;--c-text-accent: #7dd3fc;--c-text-error: #f87171;--c-text-warning: #fbbf24;--c-text-success: #34d399;--c-accent-bg: rgba(14, 165, 233, .08);--c-accent-bg-strong: rgba(14, 165, 233, .18);--c-danger-bg: rgba(127, 29, 29, .18);--c-warning-bg: rgba(251, 191, 36, .1);--c-success-bg: rgba(34, 197, 94, .1);--c-mark-bg: rgba(125, 211, 252, .18);--c-overlay: rgba(2, 6, 23, .78);--c-shadow-elevated: 0 20px 50px -10px rgba(0, 0, 0, .6);color-scheme:dark}:root[data-theme=light]{--c-bg-base: #f8fafc;--c-bg-surface: #ffffff;--c-bg-elevated: #ffffff;--c-bg-inset: #f1f5f9;--c-bg-input: #ffffff;--c-bg-canvas-grid: rgba(15, 23, 42, .07);--c-bg-canvas-glow: rgba(14, 165, 233, .06);--c-border: rgba(15, 23, 42, .1);--c-border-subtle: rgba(15, 23, 42, .06);--c-border-focus: rgba(14, 116, 144, .55);--c-border-focus-strong: #0284c7;--c-border-danger: rgba(220, 38, 38, .3);--c-border-warning: rgba(202, 138, 4, .3);--c-text-primary: #0f172a;--c-text-secondary: #475569;--c-text-muted: #64748b;--c-text-accent: #0369a1;--c-text-error: #b91c1c;--c-text-warning: #a16207;--c-text-success: #047857;--c-accent-bg: rgba(14, 165, 233, .1);--c-accent-bg-strong: rgba(14, 165, 233, .2);--c-danger-bg: rgba(254, 226, 226, .65);--c-warning-bg: rgba(254, 243, 199, .6);--c-success-bg: rgba(220, 252, 231, .6);--c-mark-bg: rgba(14, 165, 233, .22);--c-overlay: rgba(15, 23, 42, .55);--c-shadow-elevated: 0 10px 30px -10px rgba(15, 23, 42, .3);color-scheme:light}@media(prefers-color-scheme:light){:root:not([data-theme]){--c-bg-base: #f8fafc;--c-bg-surface: #ffffff;--c-bg-elevated: #ffffff;--c-bg-inset: #f1f5f9;--c-bg-input: #ffffff;--c-bg-canvas-grid: rgba(15, 23, 42, .07);--c-bg-canvas-glow: rgba(14, 165, 233, .06);--c-border: rgba(15, 23, 42, .1);--c-border-subtle: rgba(15, 23, 42, .06);--c-border-focus: rgba(14, 116, 144, .55);--c-border-focus-strong: #0284c7;--c-border-danger: rgba(220, 38, 38, .3);--c-border-warning: rgba(202, 138, 4, .3);--c-text-primary: #0f172a;--c-text-secondary: #475569;--c-text-muted: #64748b;--c-text-accent: #0369a1;--c-text-error: #b91c1c;--c-text-warning: #a16207;--c-text-success: #047857;--c-accent-bg: rgba(14, 165, 233, .1);--c-accent-bg-strong: rgba(14, 165, 233, .2);--c-danger-bg: rgba(254, 226, 226, .65);--c-warning-bg: rgba(254, 243, 199, .6);--c-success-bg: rgba(220, 252, 231, .6);--c-mark-bg: rgba(14, 165, 233, .22);--c-overlay: rgba(15, 23, 42, .55);--c-shadow-elevated: 0 10px 30px -10px rgba(15, 23, 42, .3);color-scheme:light}}:root{--font-sans: "Inter", "Avenir Next", "Segoe UI", system-ui, sans-serif;--font-mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;--text-2xs: .6875rem;--text-xs: .75rem;--text-sm: .8125rem;--text-base: .9375rem;--text-lg: 1.0625rem;--text-xl: 1.25rem;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 20px;--sp-6: 24px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 10px;--sidebar-width: 240px;--rail-width: 400px;--bar-height: 42px;--z-overlay: 30;--z-drawer: 40;--z-modal: 50;font-family:var(--font-sans);background:var(--c-bg-base);color:var(--c-text-primary)}*,*:before,*:after{box-sizing:border-box}body{margin:0;height:100vh;overflow:hidden;font-size:var(--text-sm);line-height:1.5;-webkit-font-smoothing:antialiased;background:var(--c-bg-base);color:var(--c-text-primary)}#root{height:100vh;overflow:hidden}:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:2px;border-radius:var(--radius-sm)}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[role=button]:focus-visible,[role=tab]:focus-visible,[role=option]:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:2px}.app-shell{display:grid;grid-template-columns:var(--sidebar-width) minmax(0,1fr) var(--rail-width);grid-template-rows:var(--bar-height) minmax(0,1fr);grid-template-areas:"bar bar bar" "sidebar center rail";height:100vh;overflow:hidden}.app-bar{grid-area:bar;display:flex;align-items:center;gap:var(--sp-3);padding:0 var(--sp-5);background:var(--c-bg-surface);border-bottom:1px solid var(--c-border);z-index:10}.app-bar-title{font-size:var(--text-sm);font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-accent)}.app-bar-subtitle{font-size:var(--text-xs);color:var(--c-text-muted);letter-spacing:.04em}.app-bar-spacer{flex:1}.app-bar-actions{display:flex;gap:var(--sp-2);align-items:center}.app-bar-icon-btn{all:unset;display:inline-flex;align-items:center;justify-content:center;height:28px;min-width:28px;padding:0 var(--sp-2);border-radius:var(--radius-sm);border:1px solid var(--c-border);color:var(--c-text-secondary);cursor:pointer;font-size:var(--text-xs);background:transparent;transition:border-color .12s,color .12s,background .12s}.app-bar-icon-btn:hover{border-color:var(--c-border-focus);color:var(--c-text-primary);background:var(--c-accent-bg)}.drawer-trigger{display:none}.sidebar{grid-area:sidebar;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-right:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-3);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.sidebar-section{display:flex;flex-direction:column;gap:var(--sp-2)}.sidebar-heading{font-size:var(--text-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-muted);padding:var(--sp-1) 0;border-bottom:1px solid var(--c-border-subtle);margin-bottom:var(--sp-1)}.sidebar-section-toggle{all:unset;display:flex;align-items:center;gap:var(--sp-2);width:100%;cursor:pointer;font-size:var(--text-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-muted);padding:var(--sp-1) 0;border-bottom:1px solid var(--c-border-subtle);margin-bottom:var(--sp-1);transition:color .15s}.sidebar-section-toggle:hover{color:var(--c-text-secondary)}.sidebar-section-toggle:before{content:"▸";font-size:.6em;transition:transform .2s ease;display:inline-block}.sidebar-section-toggle.is-expanded:before{transform:rotate(90deg)}.sidebar-section-toggle .filter-badge{margin-left:auto;font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-accent);font-weight:500}.sidebar-section-body{display:grid;gap:var(--sp-2);max-height:0;overflow:hidden;transition:max-height .25s ease,opacity .2s ease;opacity:0}.sidebar-section-body.is-expanded{max-height:800px;opacity:1}.filter-group{display:flex;flex-direction:column;gap:3px}.filter-label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted)}.center-area{grid-area:center;display:grid;grid-template-rows:auto minmax(0,1fr) auto;overflow:hidden}.stats-strip{display:flex;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--c-border-subtle);background:var(--c-bg-surface);align-items:center}.stats-group{display:flex;gap:var(--sp-3);align-items:baseline}.stats-divider{width:1px;height:14px;background:var(--c-border);align-self:center;flex-shrink:0}.stat{display:flex;align-items:baseline;gap:var(--sp-1)}.stat-label{font-size:var(--text-2xs);color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.06em}.stat-value{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--c-text-primary);font-weight:500}.overview-banner{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--c-border-subtle);background:var(--c-warning-bg);color:var(--c-text-secondary);font-size:var(--text-xs);letter-spacing:.02em}.overview-banner code{font-family:var(--font-mono);font-size:inherit;color:var(--c-text-warning)}.canvas-wrap{position:relative;min-height:0;display:flex;flex-direction:column}.canvas{flex:1;min-height:0;background:radial-gradient(ellipse at 50% 40%,var(--c-bg-canvas-glow),transparent 65%),radial-gradient(circle at 1px 1px,var(--c-bg-canvas-grid) 1px,transparent 0),var(--c-bg-base);background-size:100% 100%,28px 28px,100% 100%}.canvas-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-3)}.loading-text{font-size:var(--text-base);color:var(--c-text-muted);letter-spacing:.06em;font-weight:400;animation:pulse-fade 2s ease-in-out infinite}@keyframes pulse-fade{0%,to{opacity:.35}50%{opacity:.85}}.canvas-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-2);color:var(--c-text-muted)}.canvas-empty-icon{font-size:2rem;opacity:.4}.canvas-toolbar{position:absolute;top:var(--sp-2);left:var(--sp-2);display:flex;flex-wrap:wrap;gap:var(--sp-2);z-index:5;background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-1) var(--sp-2);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);align-items:center;font-size:var(--text-xs)}.canvas-toolbar-group{display:flex;align-items:center;gap:var(--sp-1);padding-right:var(--sp-2);border-right:1px solid var(--c-border-subtle)}.canvas-toolbar-group:last-child{border-right:none;padding-right:0}.canvas-toolbar select.input{height:24px;padding:0 var(--sp-2);font-size:var(--text-xs);width:auto;min-width:110px}.canvas-toolbar .btn{height:24px;padding:0 var(--sp-2);font-size:var(--text-xs)}.canvas-legend{position:absolute;bottom:var(--sp-2);left:var(--sp-2);display:flex;flex-direction:column;gap:var(--sp-1);background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:5;max-width:220px}.canvas-legend-heading{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);margin-bottom:var(--sp-1)}.canvas-legend-group{display:flex;flex-direction:column;gap:2px}.legend-row{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary)}.legend-swatch{width:12px;height:12px;border-radius:2px;display:inline-block}.legend-swatch.shape-diamond{transform:rotate(45deg);width:9px;height:9px}.legend-swatch.shape-hex{clip-path:polygon(25% 0%,75% 0%,100% 50%,75% 100%,25% 100%,0% 50%)}.legend-swatch.shape-round{border-radius:50%}.legend-swatch.line-dashed{border-bottom:1.5px dashed currentColor;height:0;width:18px}.legend-swatch.line-solid{border-bottom:1.5px solid currentColor;height:0;width:18px}.legend-toggle{position:absolute;bottom:var(--sp-2);right:var(--sp-2);z-index:5}.canvas-minimap{position:absolute;top:var(--sp-2);right:var(--sp-2);width:180px;height:120px;background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);overflow:hidden;z-index:5;cursor:crosshair}.canvas-minimap-viewport{position:absolute;border:1.5px solid var(--c-border-focus-strong);background:#38bdf814;pointer-events:none}.report-tabs{border-top:1px solid var(--c-border);background:var(--c-bg-surface);max-height:360px;overflow:hidden}.report-tabs .tabs{border:none;border-radius:0;background:transparent}.report-tabs .tab-panel{max-height:310px;overflow-y:auto}.report-tabs-empty{padding:var(--sp-3);text-align:center;color:var(--c-text-muted);font-size:var(--text-sm)}.report-stats{display:flex;gap:var(--sp-4);font-size:var(--text-sm);color:var(--c-text-secondary);flex-wrap:wrap}.report-stats strong{font-family:var(--font-mono);color:var(--c-text-primary);margin-left:var(--sp-1)}.surprise-row{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}.detail-rail{grid-area:rail;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-left:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-3);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.tabs{border-radius:var(--radius-lg);border:1px solid var(--c-border);background:var(--c-bg-elevated);overflow:hidden}.tab-bar{display:flex;border-bottom:1px solid var(--c-border);padding:0 var(--sp-1);gap:0;flex-wrap:wrap}.tab-btn{all:unset;padding:var(--sp-2) var(--sp-3);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);cursor:pointer;border-bottom:2px solid transparent;transition:color .12s,border-color .12s;white-space:nowrap}.tab-btn.is-active{color:var(--c-text-primary);border-bottom-color:var(--c-text-accent)}.tab-btn:hover:not(.is-active){color:var(--c-text-secondary)}.tab-btn:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:-2px;border-radius:var(--radius-sm)}.tab-count{margin-left:var(--sp-1);font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-accent)}.tab-panel{padding:var(--sp-3);max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.panel{background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);padding:var(--sp-3);transition:border-color .15s}.panel-heading{margin:0 0 var(--sp-2);font-size:var(--text-base);font-weight:700;text-transform:none;letter-spacing:.01em;color:var(--c-text-primary);display:flex;align-items:baseline;gap:var(--sp-2)}.panel-heading .panel-meta{font-size:var(--text-xs);font-weight:400;color:var(--c-text-muted);text-transform:none;letter-spacing:0}.page-panel{min-height:120px}.card-list{display:grid;gap:var(--sp-2)}.card{background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);display:flex;flex-direction:column;gap:4px}.card.is-selected{border-color:var(--c-border-focus-strong);background:var(--c-accent-bg-strong)}.card>.input+.input,.card>.input+.btn,.card>.btn+.input{margin-top:2px}.card-warning{border-color:var(--c-border-warning)}.card-title{font-size:var(--text-sm);font-weight:600;color:var(--c-text-primary);margin:0;line-height:1.3}.card-row{display:flex;align-items:center;gap:var(--sp-2)}.result-card{all:unset;display:flex;flex-direction:column;gap:3px;background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);cursor:pointer;transition:border-color .12s,background .12s}.result-card:hover{border-color:var(--c-border-focus);background:var(--c-accent-bg)}.result-card.is-active{border-color:var(--c-border-focus);background:var(--c-accent-bg-strong)}.input{background:var(--c-bg-input);color:var(--c-text-primary);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:6px var(--sp-2);font-family:var(--font-sans);font-size:var(--text-sm);width:100%;outline:none;transition:border-color .12s}.input:focus{border-color:var(--c-border-focus)}.input::placeholder{color:var(--c-text-muted)}select.input{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='currentColor'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:24px;text-overflow:ellipsis;color:var(--c-text-primary)}.btn{all:unset;display:inline-flex;align-items:center;gap:var(--sp-1);height:28px;padding:0 var(--sp-3);font-size:var(--text-xs);font-family:var(--font-sans);border-radius:var(--radius-sm);cursor:pointer;border:1px solid var(--c-border);background:transparent;color:var(--c-text-primary);transition:border-color .12s,background .12s;white-space:nowrap}.btn:hover{border-color:var(--c-border-focus);background:var(--c-accent-bg)}.btn:focus-visible{outline:2px solid var(--c-border-focus-strong);outline-offset:1px}.btn:disabled{opacity:.35;cursor:default;pointer-events:none}.btn-primary{border-color:var(--c-border-focus-strong);background:var(--c-accent-bg-strong);color:var(--c-text-primary)}.btn-danger{border-color:var(--c-border-danger);background:var(--c-danger-bg);color:var(--c-text-error)}.btn-ghost{border:none;background:transparent;color:var(--c-text-accent);padding:0 var(--sp-1);height:auto;font-size:var(--text-xs)}.btn-ghost:hover{text-decoration:underline;border:none;background:transparent}.btn-icon{width:24px;padding:0;justify-content:center}.action-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-1);align-items:center}.action-row-end{margin-left:auto}.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-1)}.chip{display:inline-flex;align-items:center;gap:var(--sp-1);padding:2px var(--sp-2);font-size:var(--text-2xs);font-family:var(--font-mono);background:var(--c-bg-inset);border:1px solid var(--c-border);color:var(--c-text-secondary);border-radius:999px;letter-spacing:0}.chip-tag{background:var(--c-accent-bg);border-color:var(--c-border-focus);color:var(--c-text-accent);cursor:pointer}.chip-tag.is-active{background:var(--c-accent-bg-strong)}.chip-static{cursor:default}.chip-danger{border-color:var(--c-border-danger);background:var(--c-danger-bg);color:var(--c-text-error)}.chip-warning{border-color:var(--c-border-warning);background:var(--c-warning-bg);color:var(--c-text-warning)}.chip-success{border-color:#22c55e66;background:var(--c-success-bg);color:var(--c-text-success)}.label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);font-weight:500}.meta-grid{display:grid;grid-template-columns:auto 1fr;gap:3px var(--sp-3);font-size:var(--text-xs);align-items:baseline}.meta-label{color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.04em;font-size:var(--text-2xs);white-space:nowrap}.meta-value{color:var(--c-text-primary);overflow-wrap:break-word;word-break:break-word}.meta-value-truncate{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.meta-value.mono,.text-mono{font-family:var(--font-mono)}.linked-section{margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--c-border-subtle)}.asset-preview{display:grid;gap:var(--sp-2);margin-top:var(--sp-2)}.asset-card{margin:0;display:grid;gap:var(--sp-1)}.asset-card img{width:100%;max-height:200px;object-fit:contain;border-radius:var(--radius-md);border:1px solid var(--c-border);background:var(--c-bg-inset)}.asset-card figcaption{color:var(--c-text-muted);font-size:var(--text-2xs)}.markdown-content{margin-top:var(--sp-3);padding:var(--sp-3);border-radius:var(--radius-md);background:var(--c-bg-inset);border:1px solid var(--c-border);color:var(--c-text-primary);font-size:var(--text-sm);line-height:1.6;overflow-wrap:break-word;word-break:break-word}.markdown-content>*:first-child{margin-top:0}.markdown-content>*:last-child{margin-bottom:0}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4{margin:1.2em 0 .5em;line-height:1.25;color:var(--c-text-primary);font-weight:600}.markdown-content h1{font-size:var(--text-xl)}.markdown-content h2{font-size:var(--text-lg)}.markdown-content h3{font-size:var(--text-base)}.markdown-content h4{font-size:var(--text-sm)}.markdown-content p{margin:.5em 0}.markdown-content a{color:var(--c-text-accent);text-decoration:underline;text-decoration-color:#7dd3fc59}.markdown-content a:hover{text-decoration-color:currentColor}.markdown-content ul,.markdown-content ol{margin:.5em 0;padding-left:1.4em}.markdown-content li{margin:.15em 0}.markdown-content blockquote{margin:.7em 0;padding:.4em var(--sp-3);border-left:3px solid var(--c-border-focus);color:var(--c-text-secondary);background:var(--c-bg-elevated);border-radius:0 var(--radius-sm) var(--radius-sm) 0}.markdown-content code{font-family:var(--font-mono);font-size:.9em;background:var(--c-bg-elevated);border:1px solid var(--c-border-subtle);border-radius:var(--radius-sm);padding:0 4px}.markdown-content pre{background:var(--c-bg-base);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-3);overflow-x:auto;margin:.7em 0;font-size:.85em;line-height:1.5}.markdown-content pre code{background:transparent;border:none;padding:0;font-size:inherit}.markdown-content table{width:100%;border-collapse:collapse;margin:.7em 0;font-size:var(--text-xs)}.markdown-content th,.markdown-content td{border:1px solid var(--c-border);padding:4px 8px;text-align:left}.markdown-content th{background:var(--c-bg-elevated);font-weight:600}.markdown-content hr{border:none;border-top:1px solid var(--c-border);margin:1em 0}.markdown-content img{max-width:100%;height:auto;border-radius:var(--radius-md)}.markdown-content .hljs{color:var(--c-text-primary);background:transparent}.markdown-content .hljs-comment,.markdown-content .hljs-quote{color:var(--c-text-muted);font-style:italic}.markdown-content .hljs-keyword,.markdown-content .hljs-selector-tag,.markdown-content .hljs-built_in,.markdown-content .hljs-tag{color:#c084fc}.markdown-content .hljs-string,.markdown-content .hljs-attr,.markdown-content .hljs-doctag{color:var(--c-text-success)}.markdown-content .hljs-title,.markdown-content .hljs-name,.markdown-content .hljs-section{color:var(--c-text-accent);font-weight:600}.markdown-content .hljs-number,.markdown-content .hljs-literal{color:var(--c-text-warning)}.markdown-content .hljs-variable,.markdown-content .hljs-template-variable,.markdown-content .hljs-symbol{color:#fbbf24}.markdown-content .hljs-type,.markdown-content .hljs-class{color:#38bdf8}.markdown-content .hljs-meta{color:var(--c-text-muted)}.markdown-content .hljs-deletion{background:var(--c-danger-bg);color:var(--c-text-error)}.markdown-content .hljs-addition{background:var(--c-success-bg);color:var(--c-text-success)}.content-pre{margin:var(--sp-2) 0 0;white-space:pre-wrap;overflow:auto;max-height:340px;padding:var(--sp-3);border-radius:var(--radius-md);background:var(--c-bg-inset);border:1px solid var(--c-border);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.55;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.content-truncation-note{margin-top:var(--sp-1);font-size:var(--text-2xs);color:var(--c-text-muted);font-style:italic}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--sp-5) var(--sp-3);color:var(--c-text-muted);text-align:center;min-height:80px;gap:var(--sp-2)}.empty-state-icon{font-size:1.5rem;opacity:.4;line-height:1}mark{background:var(--c-mark-bg);color:var(--c-text-accent);border-radius:2px;padding:0 2px}.search-controls{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);flex-wrap:wrap}.search-syntax-help{background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);font-size:var(--text-xs);color:var(--c-text-secondary)}.search-syntax-help code{background:var(--c-bg-elevated);padding:1px 4px;border-radius:var(--radius-sm)}.recent-searches{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}.text-sm{font-size:var(--text-sm)}.text-xs{font-size:var(--text-xs)}.text-muted{color:var(--c-text-muted)}.text-secondary{color:var(--c-text-secondary)}.text-accent{color:var(--c-text-accent)}.text-success{color:var(--c-text-success)}.text-warning{color:var(--c-text-warning);font-size:var(--text-xs)}.text-error{color:var(--c-text-error);font-size:var(--text-xs)}code{font-family:var(--font-mono);font-size:var(--text-xs)}p,h3,h4{margin:0}a{color:var(--c-text-accent);text-decoration:none}a:hover{text-decoration:underline}.bulk-toolbar{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2);margin-bottom:var(--sp-2);background:var(--c-accent-bg);border:1px solid var(--c-border-focus);border-radius:var(--radius-md);font-size:var(--text-xs)}.bulk-toolbar-count{color:var(--c-text-accent);font-family:var(--font-mono);font-weight:600}.list-filter-bar{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-2);align-items:center}.list-filter-bar .input{flex:1;min-width:120px}.checkbox-cell{display:inline-flex;align-items:center;gap:var(--sp-1);cursor:pointer}.checkbox-cell input{cursor:pointer;accent-color:var(--c-border-focus-strong)}.activity-feed{display:flex;flex-direction:column;gap:var(--sp-2)}.activity-item{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-2);align-items:start;font-size:var(--text-xs);padding:var(--sp-1) var(--sp-2);border-left:2px solid var(--c-border)}.activity-item.activity-success{border-left-color:var(--c-text-success)}.activity-item.activity-warning{border-left-color:var(--c-text-warning)}.activity-item.activity-error{border-left-color:var(--c-text-error)}.activity-item.activity-info{border-left-color:var(--c-text-accent)}.activity-time{font-family:var(--font-mono);color:var(--c-text-muted);font-size:var(--text-2xs);white-space:nowrap}.activity-message{color:var(--c-text-primary);overflow-wrap:break-word}.activity-meta{color:var(--c-text-muted);font-size:var(--text-2xs);margin-top:2px}.activity-status-pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:var(--text-2xs);border:1px solid var(--c-border)}.activity-status-pill.is-live{border-color:#22c55e66;color:var(--c-text-success)}.activity-status-pill.is-live:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--c-text-success);animation:pulse-fade 1.6s ease-in-out infinite}.activity-status-pill.is-offline{color:var(--c-text-muted)}.lint-finding{padding:var(--sp-2);border-left:3px solid var(--c-border);background:var(--c-bg-inset);border-radius:0 var(--radius-md) var(--radius-md) 0;font-size:var(--text-xs);display:flex;flex-direction:column;gap:4px}.lint-finding.is-error{border-left-color:var(--c-text-error)}.lint-finding.is-warning{border-left-color:var(--c-text-warning)}.lint-finding.is-info{border-left-color:var(--c-text-accent)}.palette-overlay{position:fixed;inset:0;background:var(--c-overlay);display:flex;justify-content:center;align-items:flex-start;padding-top:12vh;z-index:var(--z-modal);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.palette{width:min(560px,92vw);max-height:70vh;background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);box-shadow:var(--c-shadow-elevated);display:flex;flex-direction:column;overflow:hidden}.palette-input{border:none;border-bottom:1px solid var(--c-border);padding:var(--sp-3) var(--sp-4);font-size:var(--text-base);background:transparent;color:var(--c-text-primary);outline:none}.palette-list{overflow-y:auto;padding:var(--sp-1);display:flex;flex-direction:column;gap:2px}.palette-item{all:unset;display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:var(--radius-sm);font-size:var(--text-sm);cursor:pointer;color:var(--c-text-primary)}.palette-item.is-active,.palette-item:hover{background:var(--c-accent-bg)}.palette-item-shortcut{margin-left:auto;font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-muted);border:1px solid var(--c-border);padding:1px 6px;border-radius:var(--radius-sm)}.palette-item-section{font-size:var(--text-2xs);color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:var(--sp-2) var(--sp-3) var(--sp-1)}.palette-empty{padding:var(--sp-4);text-align:center;color:var(--c-text-muted);font-size:var(--text-sm)}.help-modal{width:min(640px,92vw);background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);box-shadow:var(--c-shadow-elevated);padding:var(--sp-4)}.shortcut-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2) var(--sp-4);margin-top:var(--sp-3)}.shortcut-row{display:flex;align-items:center;justify-content:space-between;padding:var(--sp-1) 0;border-bottom:1px dashed var(--c-border-subtle)}.kbd{display:inline-flex;align-items:center;gap:2px;font-family:var(--font-mono);font-size:var(--text-2xs);background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:1px 6px;color:var(--c-text-secondary)}.drawer-backdrop{position:fixed;inset:0;background:var(--c-overlay);z-index:var(--z-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:none}.drawer-backdrop.is-open{display:block}.diff-view{margin-top:var(--sp-3);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2);background:var(--c-bg-inset)}.diff-toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-2);gap:var(--sp-2);flex-wrap:wrap}.diff-frontmatter{width:100%;margin-bottom:var(--sp-2);border-collapse:collapse;font-size:var(--text-xs)}.diff-frontmatter th,.diff-frontmatter td{text-align:left;padding:4px 8px;border-bottom:1px solid var(--c-border-subtle);vertical-align:top}.diff-frontmatter tr.is-protected{background:var(--c-danger-bg)}.label-danger{color:var(--c-text-error);margin-left:4px}.diff-hunk{margin-bottom:var(--sp-2)}.diff-hunk-header{color:var(--c-text-muted);padding:2px 4px}.diff-unified,.diff-column{font-family:var(--font-mono);font-size:12px;line-height:1.5;margin:0;padding:4px 0;overflow-x:auto;background:var(--c-bg-base);max-height:320px;overflow-y:auto}.diff-split{display:grid;grid-template-columns:1fr 1fr;gap:4px}.diff-line{display:flex;gap:8px;padding:0 8px;white-space:pre}.diff-marker{width:1ch;display:inline-block;flex-shrink:0}.diff-add{background:#16a34a2e;color:var(--c-text-success)}.diff-remove{background:#dc26262e;color:var(--c-text-error)}.diff-context{color:var(--c-text-secondary)}.btn.is-active{background:var(--c-accent-bg-strong);border-color:var(--c-border-focus-strong);color:var(--c-text-primary)}.theme-toggle-options{display:inline-flex;border:1px solid var(--c-border);border-radius:var(--radius-sm);overflow:hidden}.theme-toggle-options button{all:unset;padding:4px 8px;font-size:var(--text-2xs);cursor:pointer;color:var(--c-text-secondary);border-right:1px solid var(--c-border)}.theme-toggle-options button:last-child{border-right:none}.theme-toggle-options button:hover{color:var(--c-text-primary)}.theme-toggle-options button.is-active{background:var(--c-accent-bg-strong);color:var(--c-text-primary)}.undo-toast{position:fixed;bottom:var(--sp-4);left:50%;transform:translate(-50%);background:var(--c-bg-elevated);border:1px solid var(--c-border-focus);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);display:flex;align-items:center;gap:var(--sp-3);box-shadow:var(--c-shadow-elevated);z-index:var(--z-modal);font-size:var(--text-sm)}@media(max-width:1100px){.app-shell{grid-template-columns:1fr;grid-template-rows:var(--bar-height) minmax(0,1fr);grid-template-areas:"bar" "center";height:100vh}.drawer-trigger{display:inline-flex}.sidebar,.detail-rail{position:fixed;top:var(--bar-height);bottom:0;width:min(320px,90vw);z-index:var(--z-drawer);transform:translate(-100%);transition:transform .22s ease;box-shadow:var(--c-shadow-elevated)}.sidebar{left:0;border-right:1px solid var(--c-border)}.detail-rail{right:0;left:auto;transform:translate(100%);border-left:1px solid var(--c-border)}.sidebar.is-open,.detail-rail.is-open{transform:translate(0)}.center-area{grid-area:center}.stats-strip{flex-wrap:wrap;gap:var(--sp-2)}.canvas-toolbar{flex-wrap:wrap}}@media(max-width:600px){.sidebar,.detail-rail{width:100vw;box-shadow:none}.canvas-minimap{display:none}.canvas-legend{max-width:160px}.canvas-toolbar{left:var(--sp-1);right:var(--sp-1);top:var(--sp-1)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}
|