diff --git a/internal/webapp/frontend/e2e/layout.spec.ts b/internal/webapp/frontend/e2e/layout.spec.ts index c4a4da2..7f8e1a6 100644 --- a/internal/webapp/frontend/e2e/layout.spec.ts +++ b/internal/webapp/frontend/e2e/layout.spec.ts @@ -42,14 +42,50 @@ test("every view shares one column system", async ({ page }) => { } }; - await visit("", "app"); // project home / install guide - await visit("/history", "app"); + await visit("", "app"); // project home + await visit("/install", "app"); // the same guide, so the same column await visit("/settings", "app"); - await visit("/insights", "wide"); + await visit("/insights", "app"); // charts cap their own measure; the column is normal + await visit("/history", "read"); // a listing, like the folder view it shares rows with await visit("/index.md", "read"); // rendered markdown await visit("/notes", "read"); // folder listing }); +test("the install route and the project home render the guide identically", async ({ page }) => { + // They are two sidebar items apart and show the same component; /install + // used to wrap it in the .onboard card — 320px narrower, 90px lower. + await login(page); + const pid = await wikiId(page); + const box = async (path: string) => { + await page.goto(`http://localhost:8993/${pid}${path}`); + await page.waitForSelector(".guide"); + return page.evaluate(() => { + const r = (document.querySelector(".guide") as HTMLElement).getBoundingClientRect(); + return { left: Math.round(r.left), width: Math.round(r.width), top: Math.round(r.top) }; + }); + }; + expect(await box("/install")).toEqual(await box("")); +}); + +test("charts never scale past the size they were drawn at", async ({ page }) => { + // .in-chart SVGs are viewBox="0 0 720 …" at width:100%, so an unbounded + // column magnifies them — labels ended up larger than the page title. + await page.setViewportSize({ width: 1600, height: 900 }); + await login(page); + const pid = await wikiId(page); + await page.goto(`http://localhost:8993/${pid}/insights`); + await page.waitForSelector(".in-chart"); + const worst = await page.evaluate(() => { + let max = 0; + for (const el of document.querySelectorAll(".in-chart")) { + const vb = (el.getAttribute("viewBox") || "0 0 720 0").split(/\s+/); + max = Math.max(max, el.getBoundingClientRect().width / Number(vb[2])); + } + return max; + }); + expect(worst, "chart scale factor").toBeLessThanOrEqual(1.06); +}); + test("the gutter belongs to the scroll container, not the column", async ({ page }) => { await login(page); const pid = await wikiId(page); diff --git a/internal/webapp/frontend/src/apps/Browser.tsx b/internal/webapp/frontend/src/apps/Browser.tsx index 95506c2..a816e16 100644 --- a/internal/webapp/frontend/src/apps/Browser.tsx +++ b/internal/webapp/frontend/src/apps/Browser.tsx @@ -236,7 +236,6 @@ export default function Browser(props: { if (panel) { view = panel.body; } else if (route.view === "insights") { - pageWidth = "wide"; // treemap + coverage matrix need the room view = props.canInsights ? ( Insights is for hub admins and org owners. ); } else if (route.view === "history") { + pageWidth = "read"; // a scannable list, like the folder listing it shares rows with view = ( } : route.view === "install" ? { + // The same guide the project home shows, in the same column — + // it used to sit in the .onboard card, 320px narrower and 90px + // lower than home, two sidebar items apart. crumb: "Installation", - body: ( -
- -
- ), + body: , } : null; diff --git a/internal/webapp/frontend/src/components/shell.tsx b/internal/webapp/frontend/src/components/shell.tsx index a0f7e8c..a647606 100644 --- a/internal/webapp/frontend/src/components/shell.tsx +++ b/internal/webapp/frontend/src/components/shell.tsx @@ -84,9 +84,17 @@ export function Icon({ name }: { name: string }) { /* The column system, in one place. `#content` owns scrolling and the page gutter; `` owns width and centering — nothing else may set either. Three widths cover every view: `read` for prose and listings (line length - rules), `app` for structured views, `wide` for data-dense ones. Views used - to declare their own max-width (560px to unbounded, half of them - uncentered), so no two routes shared a column. */ + rules), `app` for structured views, `wide` for content that is itself a + page (a rendered HTML file in its frame). Views used to declare their own + max-width (560px to unbounded, half of them uncentered), so no two routes + shared a column. + + The line: sets the COLUMN, a view may still cap its own MEASURE + (`.nf-sub`, a chart's design width). What a view must never do is declare + a page-level width — that is how the tiers drifted apart the first time. + Widening a column also never means scaling content up: Insights sits at + `app` and its charts cap themselves, because at `wide` the viewBox SVGs + just zoomed (a 10.5px label painted at 21px). */ export type PageWidth = "read" | "app" | "wide"; export function Page(props: { diff --git a/internal/webapp/frontend/src/style.css b/internal/webapp/frontend/src/style.css index 5b10e7c..b9db29f 100644 --- a/internal/webapp/frontend/src/style.css +++ b/internal/webapp/frontend/src/style.css @@ -35,7 +35,7 @@ --page-read: 704px; /* prose + listings: line length rules */ --page-app: 880px; /* structured views: guide, history, settings, admin */ --page-wide: 1200px; /* data-dense: treemap, coverage matrix, big tables */ - --hero-top: 10vh; /* one vertical start for short centered states */ + --hero-top: clamp(32px, 8vh, 88px); /* one vertical start for short centered states */ } * { box-sizing: border-box; } @@ -376,8 +376,9 @@ button, input, a.btn { font-family: inherit; } .gd-step-title { font-weight: 600; font-size: 14px; color: var(--text); } .gd-desc { margin: 2px 0 8px 32px; color: var(--text-faint); font-size: 13px; line-height: 1.5; } .gd-extra { font-size: 12.5px; margin-top: 6px; } -.gd-code { position: relative; margin: 6px 0 6px 32px; padding: 10px 72px 10px 12px; background: var(--bg-raise); border: 1px solid var(--border); border-radius: var(--r-card); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px; line-height: 1.6; color: var(--text); overflow-x: auto; white-space: pre; } -.gd-copy { position: absolute; top: 7px; right: 7px; font: inherit; font-family: inherit; font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: 6px; border: 1px solid var(--border-2); background: var(--bg-raise); color: var(--text-faint); cursor: pointer; box-shadow: -14px 0 12px -6px var(--bg-raise); } +.gd-code { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 10px; margin: 6px 0 6px 32px; padding: 10px 12px; background: var(--bg-raise); border: 1px solid var(--border); border-radius: var(--r-card); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px; line-height: 1.6; color: var(--text); } +.gd-code > code { display: block; min-width: 0; overflow-x: auto; white-space: pre; } +.gd-copy { align-self: start; font: inherit; font-family: inherit; font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: 6px; border: 1px solid var(--border-2); background: var(--bg-raise); color: var(--text-faint); cursor: pointer; } .gd-copy:hover { color: var(--accent-bright); border-color: var(--accent-dim); } /* A single unnumbered step has no badge to indent under. */ .gd-solo .gd-desc, .gd-solo .gd-code { margin-left: 0; } @@ -396,7 +397,7 @@ button, input, a.btn { font-family: inherit; } .in-lens-btn { font: inherit; font-size: 12px; padding: 5px 12px; border-radius: 999px; border: 1px solid var(--border); background: none; color: var(--text-faint); cursor: pointer; } .in-lens-btn:hover { color: var(--text); } .in-lens-btn.active { color: var(--accent); border-color: var(--accent); } -.in-chart { width: 100%; height: auto; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--bg-side); margin-bottom: 6px; } +.in-chart { width: 100%; max-width: 760px; height: auto; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--bg-side); margin-bottom: 6px; } .in-axis { stroke: var(--border); stroke-width: 1; } .in-threshold { stroke: var(--border); stroke-width: 1; stroke-dasharray: 4 4; } .in-danger-zone { fill: rgba(242, 109, 109, .05); } diff --git a/internal/webapp/static/assets/index-177q_1QG.css b/internal/webapp/static/assets/index-177q_1QG.css new file mode 100644 index 0000000..cc5476a --- /dev/null +++ b/internal/webapp/static/assets/index-177q_1QG.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-widest:.1em;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-background:#0a0b0d;--color-foreground:#eef0f3;--color-popover:#15171b;--color-popover-foreground:#eef0f3;--color-primary:#f5a623;--color-primary-foreground:#1a1204;--color-secondary:#ffffff08;--color-secondary-foreground:#eef0f3;--color-muted:#ffffff0f;--color-muted-foreground:#9aa0a9;--color-accent:#ffffff0f;--color-accent-foreground:#eef0f3;--color-destructive:#f26d6d;--color-border:#ffffff12;--color-input:#ffffff1c;--color-ring:#d3861a;--radius-ctl:7px}}@layer base,components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.top-4{top:calc(var(--spacing) * 4)}.top-20{top:calc(var(--spacing) * 20)}.top-\[50\%\]{top:50%}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-\[300px\]{max-height:300px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.scroll-my-1{scroll-margin-block:var(--spacing)}.scroll-py-1{scroll-padding-block:var(--spacing)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\[2px\]{border-radius:2px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--color-input)}.bg-background{background-color:var(--color-background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-muted\/50{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:#0000}.fill-current{fill:currentColor}.fill-foreground{fill:var(--color-foreground)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.whitespace-nowrap{white-space:nowrap}.text-background{color:var(--color-background)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.running{animation-play-state:running}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--color-primary)}.selection\:bg-primary::selection{background-color:var(--color-primary)}.selection\:text-primary-foreground ::selection{color:var(--color-primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--color-primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-destructive\/90:hover{background-color:#f26d6de6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive) 90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:#f5a623e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:#ffffff06}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:#d3861a80}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[error\=true\]\:text-destructive[data-error=true]{color:var(--color-destructive)}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--color-muted-foreground)}.data-\[selected\=true\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--color-accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}:is(.\*\*\:data-\[slot\=command-input-wrapper\]\:h-12 *)[data-slot=command-input-wrapper]{height:calc(var(--spacing) * 12)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--color-muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--color-muted)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--color-destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:#f26d6d1a}@supports (color:color-mix(in lab,red,red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--color-destructive)}@media(min-width:40rem){.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(prefers-color-scheme:dark){.dark\:border-input{border-color:var(--color-input)}.dark\:bg-destructive\/60{background-color:#f26d6d99}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60{background-color:color-mix(in oklab,var(--color-destructive) 60%,transparent)}}.dark\:bg-input\/30{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30{background-color:color-mix(in oklab,var(--color-input) 30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:hover{background-color:#ffffff0e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:hover{background-color:color-mix(in oklab,var(--color-input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:#f26d6d66}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:#f26d6d66}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20[data-variant=destructive]:focus{background-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:var(--color-muted-foreground)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--color-muted-foreground)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--color-destructive)!important}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}:root{--bg: #0a0b0d;--bg-side: #0c0e10;--bg-raise: #15171b;--surface: rgba(255,255,255,.03);--hover: rgba(255,255,255,.06);--border: rgba(255,255,255,.07);--border-2: rgba(255,255,255,.11);--code-bg: #0d0f12;--text: #eef0f3;--text-dim: #9aa0a9;--text-faint: #868b93;--text-ghost: #666b74;--accent: #f5a623;--accent-bright: #ffcf85;--accent-dim: #d3861a;--accent-press: #e0951a;--glow: rgba(245,166,35,.13);--add: #4cc38a;--del: #f26d6d;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;--ui: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", "Segoe UI", Roboto, sans-serif;--r-ctl: 7px;--r-card: 10px;--r-over: 14px;--page-read: 704px;--page-app: 880px;--page-wide: 1200px;--hero-top: clamp(32px, 8vh, 88px)}*{box-sizing:border-box}[hidden]{display:none!important}html,body{height:100%;margin:0}#root{display:contents}body{display:flex;background:var(--bg);color:var(--text);font:13px/1.5 var(--ui);letter-spacing:-.006em;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}::selection{background:var(--glow);color:var(--accent-bright)}:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:5px}.sprite{position:absolute}.ico{width:16px;height:16px;flex:none;stroke:currentColor;stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round}button,input,a.btn{font-family:inherit}#sidebar{width:264px;min-width:210px;background:var(--bg-side);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}#vault{display:flex;align-items:center;gap:9px;height:52px;padding:0 12px 0 14px;border-bottom:1px solid var(--border);position:relative;z-index:45}#vault-badge{width:22px;height:22px;border-radius:6px;flex:none;display:grid;place-items:center;font-size:13px;line-height:1;background:linear-gradient(160deg,#ffcf85,#f5a623 55%,#d3861a);box-shadow:0 1px #ffffff59 inset,0 2px 6px -1px #f5a62366}#vault-name{font-weight:600;font-size:13px;letter-spacing:-.01em;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vault-actions{display:flex;align-items:center;gap:4px}#vault #signout,.icon-btn2{width:28px;height:28px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-ghost);background:transparent;border:none;cursor:pointer;text-decoration:none}#vault #signout:hover,.icon-btn2:hover{color:var(--text);background:var(--hover)}#vault #signout .ico,.icon-btn2 .ico{width:16px;height:16px}#projects{flex:none;max-height:32%;overflow-y:auto;padding:10px 8px 8px;border-bottom:1px solid var(--border)}.nav-head{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint)}.nav-add{display:grid;place-items:center;width:18px;height:18px;border:none;background:transparent;color:var(--text-ghost);cursor:pointer;border-radius:5px}.nav-add .ico{width:14px;height:14px}.nav-add:hover{color:var(--text);background:var(--hover)}#projects ul{list-style:none;margin:0;padding:0}#projects .row{display:flex;align-items:center;gap:9px;height:31px;padding:0 8px;border-radius:7px;color:var(--text-dim);cursor:pointer;position:relative;white-space:nowrap;overflow:hidden}.proj-mark{width:17px;height:17px;border-radius:5px;flex:none;display:grid;place-items:center;font-size:10px;font-weight:700;color:#0a0b0d;letter-spacing:-.02em;text-transform:uppercase}#projects .row .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}#projects .row:hover{background:var(--hover);color:var(--text)}#projects .row.active{background:var(--glow);color:var(--accent-bright)}#projects .row.active:before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;border-radius:2px;background:var(--accent)}#tree{flex:1;overflow-y:auto;padding:8px 8px 24px}.tguide{position:absolute;top:0;bottom:0;width:1px;background:var(--border);pointer-events:none}#tree .row{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;border-radius:7px;color:var(--text-dim);cursor:pointer;position:relative;white-space:nowrap;overflow:hidden}#tree .row:hover{background:var(--hover);color:var(--text)}#tree .row.active{background:var(--glow);color:var(--accent-bright)}#tree .row.active:before{content:"";position:absolute;left:0;top:5px;bottom:5px;width:2px;border-radius:2px;background:var(--accent)}#tree .chev{width:14px;height:14px;flex:none;color:var(--text-ghost);transition:transform .12s;display:flex;align-items:center;justify-content:center}#tree .chev .ico{width:13px;height:13px}#tree .ticon{flex:none;display:flex;color:var(--text-ghost)}#tree .ticon .ico{width:15px;height:15px}#tree .row:hover .ticon,#tree .row:hover .chev{color:var(--text-faint)}#tree .row.active .ticon,#tree .row.active .chev{color:var(--accent)}#tree .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}#tree .file .label{font-size:12.5px}#tree .file .chev{visibility:hidden}#tree .row.collapsed .chev{transform:rotate(-90deg)}.field-err{color:var(--del);font-size:12px;margin:6px 2px 0}.modal,#palette{translate:none}.admin-card-table{padding:0;overflow:hidden}.admin-table{width:100%;border-collapse:collapse}.admin-table tr:last-child td{border-bottom:none}.admin-table th{text-align:left;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-faint);padding:6px 10px;border-bottom:1px solid var(--border);cursor:pointer;-webkit-user-select:none;user-select:none}.admin-table th:hover{color:var(--text-dim)}.admin-table td{padding:0;border-bottom:1px solid var(--border)}.admin-table tr.admin-item{display:table-row}.admin-table tr.admin-item td{padding:8px 10px}.admin-table tr.admin-item td:first-child{width:100%}.nav-menu{list-style:none;margin:6px 0 0;padding:0}.nav-menu .row .ico{width:15px;height:15px;flex:none;color:var(--text-ghost)}.nav-menu .row.active .ico{color:var(--accent-bright)}.proj-row{display:flex;align-items:center;gap:4px;padding:0 10px 4px 12px}#project-select{flex:1;min-width:0;height:30px;padding:0 9px;display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);font:inherit;font-size:12.5px;font-weight:500;cursor:pointer;white-space:nowrap;outline:none}#project-select>span:last-of-type{overflow:hidden;text-overflow:ellipsis}#project-select:hover{background:var(--hover);border-color:var(--border-2)}#project-select svg{color:var(--text-ghost)}.proj-menu{z-index:80;min-width:var(--radix-select-trigger-width, 200px);border:1px solid var(--border-2);border-radius:9px;padding:4px;background:var(--bg-raise);box-shadow:0 10px 32px #00000059}.proj-menu [role=option]{font-size:12.5px;color:var(--text-dim);border-radius:6px;outline:none}.proj-menu [role=option][data-highlighted]{background:var(--hover);color:var(--text)}#accountbar{position:relative;border-top:1px solid var(--border);padding:7px 10px}#account-btn{width:100%;display:flex;align-items:center;gap:9px;text-align:left;padding:6px 8px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);cursor:pointer;font:inherit}#account-btn:hover{background:var(--hover);color:var(--text)}#account-btn .avatar{width:26px;height:26px;flex:none;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700}#account-btn .acct{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}#account-btn .acct b{font-size:12.5px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#account-btn .acct small{font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#account-btn>.ico{width:14px;height:14px;color:var(--text-ghost)}#account-menu{min-width:var(--radix-dropdown-menu-trigger-width, 220px);padding:5px;border:1px solid var(--border-2);border-radius:9px;background:var(--bg-raise);box-shadow:0 10px 32px #00000059;display:flex;flex-direction:column;z-index:80;outline:none}#account-menu [role=menuitem]{outline:none}#account-menu [role=menuitem][data-highlighted]{background:var(--hover);color:var(--text)}#account-menu .menu-sec{padding:7px 9px 3px;font-size:10.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-faint)}#account-menu [role=menuitem]{display:flex;align-items:center;gap:8px;padding:7px 9px;border:none;border-radius:6px;background:transparent;text-align:left;color:var(--text-dim);font:inherit;font-size:12.5px;cursor:pointer;text-decoration:none}#account-menu [role=menuitem]:hover{background:var(--hover);color:var(--text)}#account-menu [role=menuitem] b{font-weight:600}#account-menu [role=menuitem] .ico{width:15px;height:15px}#account-menu #signout{color:var(--danger, #e5534b)}#account-menu #signout:hover{color:var(--danger, #e5534b);background:var(--hover)}#main{flex:1;display:flex;flex-direction:column;min-width:0}#topbar{position:relative;display:flex;align-items:center;gap:9px;height:52px;padding:0 16px;border-bottom:1px solid var(--border)}.icon-btn{display:none;width:34px;height:34px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;border-radius:7px;align-items:center;justify-content:center}.icon-btn:hover{color:var(--text);background:var(--hover)}#crumb{font-size:12.5px;color:var(--text);font-weight:500;letter-spacing:-.01em;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#crumb .crumb-seg{color:var(--text-dim);cursor:pointer}#crumb .crumb-seg:hover{color:var(--accent-bright)}#crumb .crumb-sep{color:var(--text-ghost);margin:0 5px}#meta{flex:1;min-width:0;font-size:12px;color:var(--text-faint);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn{display:inline-flex;align-items:center;gap:6px;flex:none;height:30px;padding:0 11px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text-dim);font-size:12.5px;font-weight:500;cursor:pointer;text-decoration:none}.btn:hover{background:var(--hover);color:var(--text);border-color:var(--border-2)}.btn .ico{width:15px;height:15px}.btn.ghost{color:var(--text-dim)}.tipcard{display:flex;align-items:center;gap:7px;white-space:nowrap;padding:6px 9px;border-radius:8px;border:1px solid var(--border-2);background:var(--surface-solid, var(--bg-raise));color:var(--text);font-size:12.5px;font-weight:500;box-shadow:0 8px 24px #00000059;z-index:80}.tipcard kbd{font:11px var(--ui);color:var(--text-faint);background:var(--hover);border:1px solid var(--border-2);border-radius:5px;padding:1px 5px}#more-menu{position:absolute;right:12px;top:calc(100% - 4px);z-index:80;background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-card);box-shadow:0 18px 44px -14px #000000bf;padding:6px;min-width:168px}.more-item{display:block;width:100%;text-align:left;min-height:40px;padding:0 12px;background:transparent;border:none;cursor:pointer;color:var(--text);font:inherit;font-size:13.5px;border-radius:var(--r-ctl)}.more-item:hover{background:var(--hover)}#content{flex:1;overflow-y:auto;padding:44px 40px 110px;scroll-behavior:smooth}.page{width:100%;max-width:var(--page-app);margin-inline:auto;min-width:0}.page.read{max-width:var(--page-read)}.page.wide{max-width:var(--page-wide)}.empty{color:var(--text-faint);text-align:center;margin-top:var(--hero-top)}.empty-hint{display:block;margin-top:6px;font-size:12px;color:var(--text-faint)}.onboard{max-width:560px;margin:var(--hero-top) auto 0}.onboard h1{font-size:25px;font-weight:640;letter-spacing:-.02em;margin:0 0 8px;color:#f4f6f9}.onboard>p{color:var(--text-dim);margin:0 0 28px;font-size:14px}.ob-card{background:var(--bg-side);border:1px solid var(--border);border-radius:var(--r-card);padding:20px 22px;margin-bottom:14px}.ob-card h3{margin:0 0 6px;font-size:14.5px;font-weight:600}.ob-card p{margin:0 0 14px;font-size:13px;color:var(--text-dim)}.ob-row{display:flex;gap:9px}.ob-row input{flex:1;height:34px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:13px;outline:none}.ob-row input:focus{border-color:var(--accent);background:var(--hover)}.pbtn{display:inline-flex;align-items:center;gap:6px;flex:none;height:32px;padding:0 14px;border-radius:var(--r-ctl);border:none;background:var(--accent);color:#241704;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap}.pbtn:hover{background:var(--accent-bright)}.pbtn .ico{width:15px;height:15px}.danger-btn{display:inline-flex;align-items:center;height:32px;padding:0 14px;border-radius:var(--r-ctl);border:none;background:#b3382e;color:#fff;font-size:13px;font-weight:600;cursor:pointer}.danger-btn:hover{background:#c94336}.admin h1{font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 6px;color:#f4f6f9}.admin h3{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);font-weight:600;margin:30px 0 10px}.admin-sub{color:var(--text-dim);font-size:13.5px;margin:0 0 6px;line-height:1.55}.admin-h{display:flex;align-items:center;justify-content:space-between;margin:30px 0 10px}.admin-h h3{margin:0}.admin-row{display:flex;gap:9px;margin-bottom:8px}.admin-row input{flex:1;height:34px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:13px;outline:none}.admin-row input:focus{border-color:var(--accent);background:var(--hover)}.admin-list{border:1px solid var(--border);border-radius:var(--r-card);overflow:hidden;background:var(--bg-side)}.admin-item{display:flex;align-items:center;gap:11px;padding:11px 14px;border-bottom:1px solid var(--border);font-size:13.5px}.admin-item:last-child{border-bottom:none}.admin-item:hover{background:#ffffff04}.ai-main{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.ai-main.mono{font:12px var(--mono);color:var(--text-dim);cursor:pointer}.ai-tag{font-size:11.5px;color:var(--text-faint);flex:none}.admin-item select{height:28px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:0 8px;font:inherit;font-size:12.5px;cursor:pointer}.admin-item select:hover{border-color:var(--border-2)}.ai-btn,.ai-del{flex:none;height:27px;padding:0 11px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text-dim);font:inherit;font-size:12px;font-weight:500;cursor:pointer}.ai-btn:hover{background:var(--hover);color:var(--text);border-color:var(--border-2)}.ai-del{color:var(--del);border-color:transparent;background:transparent}.ai-del:hover{background:#f26d6d1f;color:#ff8b8b}.admin-empty{padding:14px;color:var(--text-faint);font-size:13px}.admin-item.toggle{cursor:pointer;align-items:flex-start}.admin-item.toggle .ai-main{white-space:normal}.tg-label{font-size:13.5px;font-weight:550;color:var(--text)}.tg-desc{font-size:12px;color:var(--text-faint);margin-top:3px;line-height:1.5}.admin-item.toggle input{width:16px;height:16px;margin-top:2px;accent-color:var(--accent);flex:none}.dl-title{display:flex;align-items:center;gap:10px;font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 4px;color:#f4f6f9}.dl-title-icon{display:flex;color:var(--accent)}.dl-title-icon .ico{width:20px;height:20px}.dl-sub{color:var(--text-faint);font-size:12.5px;margin:0 0 18px}.dl-items{border:1px solid var(--border);border-radius:var(--r-card);overflow:hidden;background:var(--bg-side)}.dl-row{display:flex;align-items:center;gap:11px;padding:10px 14px;border-bottom:1px solid var(--border);cursor:pointer}.dl-row:last-child{border-bottom:none}.dl-row:hover{background:var(--hover)}.dl-row .ticon{flex:none;display:flex;color:var(--text-ghost)}.dl-row .ticon .ico{width:16px;height:16px}.dl-row:hover .ticon{color:var(--text-faint)}.dl-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;color:var(--text)}.dl-meta{flex:none;font-size:12px;color:var(--text-faint);font-variant-numeric:tabular-nums}.heatdot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--accent)}.heatdot.lvl1{opacity:.3}.heatdot.lvl2{opacity:.55}.heatdot.lvl3{opacity:.8}.heatdot.lvl4{opacity:1;box-shadow:0 0 6px #f5a6238c}.dl-empty{padding:24px 14px;color:var(--text-faint);font-size:13px;border:1px dashed var(--border);border-radius:var(--r-card);text-align:center}.dl-h3{margin:28px 0 8px;font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);font-weight:600}.dl-hlist{border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);overflow:hidden;max-width:none}.dl-hlist .hentry:last-child{border-bottom:none}.hentry.clickable{cursor:pointer}.hentry.clickable:hover{background:var(--hover)}.dl-more{margin-top:10px}#vault-name.vault-link{cursor:pointer}#vault-name.vault-link:hover{color:var(--accent-bright)}.gd-tabs{display:flex;gap:2px;margin:20px 0 16px;border-bottom:1px solid var(--border);overflow-x:auto}.gd-tab{font:inherit;font-size:13px;font-weight:600;padding:7px 12px 9px;background:none;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;color:var(--text-faint);cursor:pointer;white-space:nowrap}.gd-tab:hover{color:var(--text)}.gd-tab.active{color:var(--accent-bright);border-bottom-color:var(--accent)}.gd-step{margin:0 0 18px}.gd-step-head{display:flex;align-items:center;gap:10px;margin-bottom:3px}.gd-num{flex:none;width:22px;height:22px;border-radius:50%;background:var(--glow);color:var(--accent-bright);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}.gd-step-title{font-weight:600;font-size:14px;color:var(--text)}.gd-desc{margin:2px 0 8px 32px;color:var(--text-faint);font-size:13px;line-height:1.5}.gd-extra{font-size:12.5px;margin-top:6px}.gd-code{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:10px;margin:6px 0 6px 32px;padding:10px 12px;background:var(--bg-raise);border:1px solid var(--border);border-radius:var(--r-card);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.6;color:var(--text)}.gd-code>code{display:block;min-width:0;overflow-x:auto;white-space:pre}.gd-copy{align-self:start;font:inherit;font-family:inherit;font-size:11px;font-weight:600;padding:3px 9px;border-radius:6px;border:1px solid var(--border-2);background:var(--bg-raise);color:var(--text-faint);cursor:pointer}.gd-copy:hover{color:var(--accent-bright);border-color:var(--accent-dim)}.gd-solo .gd-desc,.gd-solo .gd-code{margin-left:0}.gd-manual{margin:10px 0 0}.gd-manual>summary{display:inline-block;font-size:12.5px;font-weight:600;color:var(--text-faint);cursor:pointer;padding:4px 0}.gd-manual>summary:hover{color:var(--text)}.gd-manual .gd-desc,.gd-manual .gd-code{margin-left:0}.gd-done{margin:22px 0 8px;padding:12px 14px;border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);color:var(--text-faint);font-size:13px;line-height:1.5}.home-insights{margin-top:30px;padding-top:22px;border-top:1px solid var(--border)}.in-title{font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 4px;color:#f4f6f9}.in-title .in-scope{color:var(--text-ghost);font-weight:500;font-size:15px}.in-lens{display:flex;gap:6px;margin:0 0 14px}.in-lens-btn{font:inherit;font-size:12px;padding:5px 12px;border-radius:999px;border:1px solid var(--border);background:none;color:var(--text-faint);cursor:pointer}.in-lens-btn:hover{color:var(--text)}.in-lens-btn.active{color:var(--accent);border-color:var(--accent)}.in-chart{width:100%;max-width:760px;height:auto;border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);margin-bottom:6px}.in-axis{stroke:var(--border);stroke-width:1}.in-threshold{stroke:var(--border);stroke-width:1;stroke-dasharray:4 4}.in-danger-zone{fill:#f26d6d0d}.in-label{fill:var(--text-ghost);font-size:11px}.in-quad{fill:var(--text-ghost);font-size:10.5px;text-transform:uppercase;letter-spacing:.06em}.in-quad-danger{fill:#e07070}.in-pt{fill:var(--accent);opacity:.5;cursor:pointer}.in-pt:hover{opacity:1}.in-pt.cold{fill:var(--text-ghost);opacity:.25}.in-pt.danger{fill:#e05d5d;opacity:.6}.in-treemap{background:#0c0d10}.in-tm-group{fill:none;stroke:var(--border);stroke-width:1;cursor:pointer;pointer-events:all}.in-tm-glabel{fill:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.05em;cursor:pointer}.in-tm-cell{cursor:pointer}.in-tm-cell:hover{stroke:#fff;stroke-width:1}.in-tm-label{fill:#0c0d10;font-size:10.5px;font-weight:620;cursor:pointer;pointer-events:none}.in-hotpath{border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);overflow:hidden}.in-hp-row{display:flex;align-items:center;gap:10px;padding:6px 12px;border-bottom:1px solid var(--border);cursor:pointer}.in-hp-row:last-child{border-bottom:none}.in-hp-row:hover{background:var(--hover)}.in-hp-name{flex:0 0 300px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--text)}.in-hp-name.danger{color:var(--accent)}.in-hp-bar{flex:1;display:flex;height:10px;border-radius:3px;overflow:hidden}.in-hp-agent{background:var(--accent)}.in-hp-human{background:#5b8def}.in-hp-count{flex:none;width:40px;text-align:right;font-size:11.5px;color:var(--text-faint);font-variant-numeric:tabular-nums}.in-legend{margin:8px 2px 0;font-size:11.5px;color:var(--text-faint)}.in-sw{display:inline-block;width:10px;height:10px;border-radius:2px;vertical-align:-1px}.in-sw.agent{background:var(--accent)}.in-sw.human{background:#5b8def}.in-matrix rect{transition:opacity .1s}.in-matrix rect:hover{opacity:.85}.hentry{padding:11px 12px;border-bottom:1px solid var(--border)}.hentry:hover{background:#ffffff04}.hline{display:flex;gap:10px;align-items:center}.hkind{display:inline-flex;color:var(--add)}.hkind .ico{width:13px;height:13px}.hentry.edit .hkind{color:var(--accent)}.hentry.delete .hkind{color:var(--del)}.htag{flex:none;font-size:10px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;padding:1px 6px;border-radius:4px}.hentry.add .htag{color:var(--add);background:#4cc38a1f}.hentry.edit .htag{color:var(--accent-bright);background:var(--glow)}.hentry.delete .htag{color:#ff8b8b;background:#f26d6d1f}.hpath{font-weight:500;cursor:pointer;color:var(--text);font-size:13px}.hpath:hover{color:var(--accent-bright)}.htime{margin-left:auto;color:var(--text-faint);font-size:12px;font-variant-numeric:tabular-nums}.hmeta{display:flex;align-items:center;gap:14px;margin-top:4px;padding-left:23px;font-size:12px;color:var(--text-dim)}.hdev,.hsize{color:var(--text-faint)}.hsize{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}.hnote{margin-top:4px;padding-left:23px;font-size:12px;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.hnote:hover{color:var(--text)}.hnote.open{white-space:normal;overflow-wrap:anywhere}.hnote:before{content:"› ";color:var(--text-ghost)}.hnote a{color:var(--accent-bright);text-decoration:none}.hnote a:hover{text-decoration:underline}#palette{position:fixed;top:12vh;left:50%;transform:translate(-50%);z-index:151;display:block;width:min(560px,92vw);background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-over);box-shadow:0 24px 70px -18px #000c;overflow:hidden;outline:none;padding:0}#palette-inputwrap{display:flex;align-items:center;gap:11px;padding:14px 16px;border-bottom:1px solid var(--border)}#palette-inputwrap [data-slot=command-input-wrapper]{flex:1;display:flex;border-bottom:0;padding:0;height:auto}#palette-inputwrap [data-slot=command-input-wrapper]>svg:not(.ico){display:none}#palette input,#palette input:focus{border:none;background:transparent;box-shadow:none;outline:none;padding:0}#palette-inputwrap .ico{width:17px;height:17px;color:var(--text-faint)}#palette-input{flex:1;width:100%;border:none;background:transparent;color:var(--text);font:inherit;font-size:15px;letter-spacing:-.01em;outline:none;padding:0}#palette-input::placeholder{color:var(--text-ghost)}#palette-results{list-style:none;margin:0;padding:8px;max-height:46vh;overflow-y:auto}#palette-results [cmdk-item]{display:flex;align-items:center;gap:11px;height:38px;padding:0 10px;border-radius:9px;cursor:pointer;color:var(--text-dim);font-size:13.5px}#palette-results [cmdk-item][data-selected=true]{background:var(--glow)}#palette-results [cmdk-item][data-selected=true] .picon{color:var(--accent)}#palette-results [cmdk-item][data-selected=true] .plabel,#palette-results [cmdk-item][data-selected=true] .plabel b{color:var(--accent-bright)}#palette-results li{display:flex;align-items:center;gap:11px;height:38px;padding:0 10px;border-radius:9px;cursor:pointer;color:var(--text-dim);font-size:13.5px}#palette-results li.selected{background:var(--glow)}#palette-results li.selected .picon{color:var(--accent)}#palette-results li.selected .plabel,#palette-results li.selected .plabel b{color:var(--accent-bright)}#palette-results li .picon{width:18px;flex:none;display:flex;justify-content:center;color:var(--text-faint)}#palette-results li .picon .ico{width:15px;height:15px}#palette-results li .plabel{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text)}#palette-results li .plabel b{color:var(--accent-bright);font-weight:600}#palette-results li .pkind{flex:none;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-ghost)}#palette-results .pempty{color:var(--text-faint);cursor:default;justify-content:center;height:auto;padding:14px}#palette-hint{padding:9px 16px;border-top:1px solid var(--border);font-size:11px;color:var(--text-ghost)}[data-slot=dialog-overlay]{position:fixed;inset:0;background:#06070999;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:150}.modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:151;display:block;background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-over);padding:22px 24px;width:min(460px,calc(100vw - 40px));box-shadow:0 24px 70px -18px #000c;outline:none}.modal h3{margin:0 0 10px;font-size:16px;font-weight:620;letter-spacing:-.01em}.modal p{margin:0 0 16px;font-size:13.5px;color:var(--text-dim);line-height:1.55}.modal p b{color:var(--text)}.modal-url{font:12px var(--mono);background:var(--surface);border:1px solid var(--border);border-radius:var(--r-ctl);padding:9px 11px;color:var(--text-dim);word-break:break-all;margin-bottom:16px}.modal-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.modal-label{display:block;font-size:12.5px;color:var(--text-dim);margin:0 0 6px}.modal-msg{margin:0 0 16px;font-size:13.5px;color:var(--text-dim);line-height:1.55}.modal-input{width:100%;height:36px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:14px;margin-bottom:16px;outline:none}.modal-input:focus{border-color:var(--accent);background:var(--hover)}[data-sonner-toast]{background:var(--bg-raise)!important;color:var(--text)!important;border:1px solid var(--border-2)!important;border-radius:10px!important;font-size:13.5px!important;box-shadow:0 18px 44px -12px #000000b3!important}[data-sonner-toast][data-type=error]{border-color:#f26d6d80!important;color:#ffb0aa!important}#sb-backdrop{display:none}@media(max-width:900px){#sidebar{position:fixed;z-index:60;top:0;left:0;height:100%;transform:translate(-100%);transition:transform .2s ease;box-shadow:0 0 40px #0009}body.sb-open #sidebar{transform:translate(0)}body.sb-open #sb-backdrop{display:block;position:fixed;inset:0;background:#0000008c;z-index:50}.icon-btn{display:inline-flex;width:44px;height:44px}#content{padding:24px 18px 70px}#topbar{padding:0 8px;gap:4px}.btn .lbl{display:none}#topbar .btn{min-width:44px;min-height:44px;padding:0;justify-content:center;gap:0}#topbar .btn .ico{width:18px;height:18px}#more-btn:not([hidden]){display:inline-flex}#history-btn,#upload-btn,#download{display:none!important}#meta{display:none}#crumb{flex:1}#vault{padding:0 8px 0 12px}.icon-btn2,#signout,#tree .row,#projects .row{height:44px}#account-btn,#project-select{min-height:44px}.nav-add{min-width:44px;min-height:44px}.markdown table,pre.plain{display:block;overflow-x:auto;max-width:100%}.ob-row{flex-direction:column}.ob-row input{flex:none;min-height:44px}.admin-item{flex-wrap:wrap;row-gap:8px;padding:12px 14px}.admin-item select{height:44px}.ai-btn,.ai-del{height:auto;min-height:44px;padding:0 12px}.admin-item .ai-main{flex:1 1 100%;white-space:normal;overflow-wrap:break-word}.gd-code{min-height:62px;padding-top:12px;padding-bottom:12px}.gd-copy{min-height:44px;padding:0 14px}.gd-tab{min-height:44px}.in-lens-btn{min-height:44px;padding:0 14px}.modal-input{height:44px}.modal-actions button,.pbtn,#palette-results li{height:auto;min-height:44px}.more-item{min-height:44px}}.modal-actions .ai-del{margin-right:auto}@media(max-width:430px){.dl-meta{display:none}.ai-tag{font-size:11px}.htime{white-space:nowrap;font-size:12px}.hline{flex-wrap:wrap}.modal-actions .ai-del{flex:0 0 100%;justify-content:center;text-align:center}}.markdown h1,.markdown h2,.markdown h3,.markdown h4{color:#f4f6f9;line-height:1.25;letter-spacing:-.018em;margin:1.5em 0 .5em;text-wrap:balance}.markdown h1:first-child{margin-top:0}.markdown h1{font-size:1.85em;font-weight:660;letter-spacing:-.024em}.markdown h2{font-size:1.32em;font-weight:620;margin-top:1.7em}.markdown h3{font-size:1.08em;font-weight:620}.markdown p,.markdown li{color:#c6cbd3;font-size:14.5px;line-height:1.72}.markdown p{margin:0 0 1em}.markdown strong{color:var(--text);font-weight:620}.markdown a{color:var(--accent-bright);text-decoration:none;border-bottom:1px solid rgba(245,166,35,.28)}.markdown a:hover{border-bottom-color:var(--accent)}.markdown ul,.markdown ol{margin:0 0 1em;padding-left:1.4em}.markdown li{margin-bottom:.4em}.markdown li::marker{color:var(--text-ghost)}.markdown code{background:var(--hover);border:1px solid var(--border);padding:.1em .4em;border-radius:5px;font:12.5px/1.5 var(--mono);color:#e4d9c4}.markdown pre{background:var(--code-bg);border:1px solid var(--border);border-radius:var(--r-card);padding:14px 16px;overflow-x:auto;margin:1.3em 0}.markdown pre code{background:none;border:none;padding:0;color:#c6cbd3}.markdown blockquote{margin:1.3em 0;padding:.3em 1em;border-left:2px solid var(--accent);background:linear-gradient(90deg,var(--glow),transparent);border-radius:0 8px 8px 0;color:#d8cdb6}.markdown blockquote p{margin:.3em 0;color:#d8cdb6}.markdown table{border-collapse:collapse;margin:1.3em 0;font-size:13.5px}.markdown th,.markdown td{border-bottom:1px solid var(--border);padding:9px 13px;text-align:left}.markdown th{color:var(--text-faint);font-size:11px;text-transform:uppercase;letter-spacing:.05em;font-weight:600;border-bottom-color:var(--border-2)}.markdown tr:hover td{background:#ffffff05}.markdown img{max-width:100%;border-radius:8px;border:1px solid var(--border)}.markdown hr{border:none;border-top:1px solid var(--border);margin:2.2em 0}.markdown table.frontmatter{margin:0 0 1.8em;font-size:12px;background:var(--surface);border:1px solid var(--border);border-radius:8px;border-collapse:separate;border-spacing:0}.markdown table.frontmatter th{text-transform:none;letter-spacing:0;font-size:11.5px;color:var(--text-faint);font-weight:600;text-align:left;white-space:nowrap;vertical-align:top;padding:6px 14px 6px 12px;border-bottom:1px solid var(--border)}.markdown table.frontmatter td{color:var(--text-dim);padding:6px 12px 6px 0;border-bottom:1px solid var(--border)}.markdown table.frontmatter tr:last-child th,.markdown table.frontmatter tr:last-child td{border-bottom:none}.markdown table.frontmatter code{white-space:pre-wrap;font-size:11px}.markdown input[type=checkbox]{accent-color:var(--accent)}.htmlview{display:block;width:100%;height:calc(100vh - 150px);border:1px solid var(--border);border-radius:var(--r-card);background:#fff}.notfound{margin-top:var(--hero-top);text-align:center;color:var(--text-dim)}.notfound h1{color:var(--text);font-size:1.4em;margin-bottom:.5em}.notfound code{background:var(--hover);border:1px solid var(--border);padding:.15em .5em;border-radius:6px}.notfound .nf-sub{max-width:440px;margin:12px auto 20px;font-size:13px;color:var(--text-faint);line-height:1.6}pre.plain{background:var(--code-bg);border:1px solid var(--border);border-radius:var(--r-card);padding:14px 16px;overflow-x:auto;font:12.5px/1.6 var(--mono);color:#c6cbd3;white-space:pre-wrap;overflow-wrap:anywhere}.filecard{margin-top:var(--hero-top);text-align:center;color:var(--text-dim)}.filecard .name{font-size:1.2em;color:var(--text);margin-bottom:.3em}.filecard .btn{margin-top:14px} diff --git a/internal/webapp/static/assets/index-DgVZuodz.css b/internal/webapp/static/assets/index-DgVZuodz.css deleted file mode 100644 index 179d882..0000000 --- a/internal/webapp/static/assets/index-DgVZuodz.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-widest:.1em;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-background:#0a0b0d;--color-foreground:#eef0f3;--color-popover:#15171b;--color-popover-foreground:#eef0f3;--color-primary:#f5a623;--color-primary-foreground:#1a1204;--color-secondary:#ffffff08;--color-secondary-foreground:#eef0f3;--color-muted:#ffffff0f;--color-muted-foreground:#9aa0a9;--color-accent:#ffffff0f;--color-accent-foreground:#eef0f3;--color-destructive:#f26d6d;--color-border:#ffffff12;--color-input:#ffffff1c;--color-ring:#d3861a;--radius-ctl:7px}}@layer base,components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.top-4{top:calc(var(--spacing) * 4)}.top-20{top:calc(var(--spacing) * 20)}.top-\[50\%\]{top:50%}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-\[300px\]{max-height:300px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.scroll-my-1{scroll-margin-block:var(--spacing)}.scroll-py-1{scroll-padding-block:var(--spacing)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\[2px\]{border-radius:2px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--color-input)}.bg-background{background-color:var(--color-background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-muted\/50{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:#0000}.fill-current{fill:currentColor}.fill-foreground{fill:var(--color-foreground)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.whitespace-nowrap{white-space:nowrap}.text-background{color:var(--color-background)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.running{animation-play-state:running}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--color-primary)}.selection\:bg-primary::selection{background-color:var(--color-primary)}.selection\:text-primary-foreground ::selection{color:var(--color-primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--color-primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-destructive\/90:hover{background-color:#f26d6de6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive) 90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:#f5a623e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:#ffffff06}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:#d3861a80}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[error\=true\]\:text-destructive[data-error=true]{color:var(--color-destructive)}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--color-muted-foreground)}.data-\[selected\=true\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--color-accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}:is(.\*\*\:data-\[slot\=command-input-wrapper\]\:h-12 *)[data-slot=command-input-wrapper]{height:calc(var(--spacing) * 12)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--color-muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--color-muted)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--color-destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:#f26d6d1a}@supports (color:color-mix(in lab,red,red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--color-destructive)}@media(min-width:40rem){.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(prefers-color-scheme:dark){.dark\:border-input{border-color:var(--color-input)}.dark\:bg-destructive\/60{background-color:#f26d6d99}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60{background-color:color-mix(in oklab,var(--color-destructive) 60%,transparent)}}.dark\:bg-input\/30{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30{background-color:color-mix(in oklab,var(--color-input) 30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:hover{background-color:#ffffff0e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:hover{background-color:color-mix(in oklab,var(--color-input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:#f26d6d66}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:#f26d6d66}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20[data-variant=destructive]:focus{background-color:#f26d6d33}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:var(--color-muted-foreground)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--color-muted-foreground)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--color-destructive)!important}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}:root{--bg: #0a0b0d;--bg-side: #0c0e10;--bg-raise: #15171b;--surface: rgba(255,255,255,.03);--hover: rgba(255,255,255,.06);--border: rgba(255,255,255,.07);--border-2: rgba(255,255,255,.11);--code-bg: #0d0f12;--text: #eef0f3;--text-dim: #9aa0a9;--text-faint: #868b93;--text-ghost: #666b74;--accent: #f5a623;--accent-bright: #ffcf85;--accent-dim: #d3861a;--accent-press: #e0951a;--glow: rgba(245,166,35,.13);--add: #4cc38a;--del: #f26d6d;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;--ui: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", "Segoe UI", Roboto, sans-serif;--r-ctl: 7px;--r-card: 10px;--r-over: 14px;--page-read: 704px;--page-app: 880px;--page-wide: 1200px;--hero-top: 10vh}*{box-sizing:border-box}[hidden]{display:none!important}html,body{height:100%;margin:0}#root{display:contents}body{display:flex;background:var(--bg);color:var(--text);font:13px/1.5 var(--ui);letter-spacing:-.006em;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}::selection{background:var(--glow);color:var(--accent-bright)}:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:5px}.sprite{position:absolute}.ico{width:16px;height:16px;flex:none;stroke:currentColor;stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round}button,input,a.btn{font-family:inherit}#sidebar{width:264px;min-width:210px;background:var(--bg-side);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}#vault{display:flex;align-items:center;gap:9px;height:52px;padding:0 12px 0 14px;border-bottom:1px solid var(--border);position:relative;z-index:45}#vault-badge{width:22px;height:22px;border-radius:6px;flex:none;display:grid;place-items:center;font-size:13px;line-height:1;background:linear-gradient(160deg,#ffcf85,#f5a623 55%,#d3861a);box-shadow:0 1px #ffffff59 inset,0 2px 6px -1px #f5a62366}#vault-name{font-weight:600;font-size:13px;letter-spacing:-.01em;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vault-actions{display:flex;align-items:center;gap:4px}#vault #signout,.icon-btn2{width:28px;height:28px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-ghost);background:transparent;border:none;cursor:pointer;text-decoration:none}#vault #signout:hover,.icon-btn2:hover{color:var(--text);background:var(--hover)}#vault #signout .ico,.icon-btn2 .ico{width:16px;height:16px}#projects{flex:none;max-height:32%;overflow-y:auto;padding:10px 8px 8px;border-bottom:1px solid var(--border)}.nav-head{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint)}.nav-add{display:grid;place-items:center;width:18px;height:18px;border:none;background:transparent;color:var(--text-ghost);cursor:pointer;border-radius:5px}.nav-add .ico{width:14px;height:14px}.nav-add:hover{color:var(--text);background:var(--hover)}#projects ul{list-style:none;margin:0;padding:0}#projects .row{display:flex;align-items:center;gap:9px;height:31px;padding:0 8px;border-radius:7px;color:var(--text-dim);cursor:pointer;position:relative;white-space:nowrap;overflow:hidden}.proj-mark{width:17px;height:17px;border-radius:5px;flex:none;display:grid;place-items:center;font-size:10px;font-weight:700;color:#0a0b0d;letter-spacing:-.02em;text-transform:uppercase}#projects .row .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}#projects .row:hover{background:var(--hover);color:var(--text)}#projects .row.active{background:var(--glow);color:var(--accent-bright)}#projects .row.active:before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;border-radius:2px;background:var(--accent)}#tree{flex:1;overflow-y:auto;padding:8px 8px 24px}.tguide{position:absolute;top:0;bottom:0;width:1px;background:var(--border);pointer-events:none}#tree .row{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;border-radius:7px;color:var(--text-dim);cursor:pointer;position:relative;white-space:nowrap;overflow:hidden}#tree .row:hover{background:var(--hover);color:var(--text)}#tree .row.active{background:var(--glow);color:var(--accent-bright)}#tree .row.active:before{content:"";position:absolute;left:0;top:5px;bottom:5px;width:2px;border-radius:2px;background:var(--accent)}#tree .chev{width:14px;height:14px;flex:none;color:var(--text-ghost);transition:transform .12s;display:flex;align-items:center;justify-content:center}#tree .chev .ico{width:13px;height:13px}#tree .ticon{flex:none;display:flex;color:var(--text-ghost)}#tree .ticon .ico{width:15px;height:15px}#tree .row:hover .ticon,#tree .row:hover .chev{color:var(--text-faint)}#tree .row.active .ticon,#tree .row.active .chev{color:var(--accent)}#tree .label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}#tree .file .label{font-size:12.5px}#tree .file .chev{visibility:hidden}#tree .row.collapsed .chev{transform:rotate(-90deg)}.field-err{color:var(--del);font-size:12px;margin:6px 2px 0}.modal,#palette{translate:none}.admin-card-table{padding:0;overflow:hidden}.admin-table{width:100%;border-collapse:collapse}.admin-table tr:last-child td{border-bottom:none}.admin-table th{text-align:left;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-faint);padding:6px 10px;border-bottom:1px solid var(--border);cursor:pointer;-webkit-user-select:none;user-select:none}.admin-table th:hover{color:var(--text-dim)}.admin-table td{padding:0;border-bottom:1px solid var(--border)}.admin-table tr.admin-item{display:table-row}.admin-table tr.admin-item td{padding:8px 10px}.admin-table tr.admin-item td:first-child{width:100%}.nav-menu{list-style:none;margin:6px 0 0;padding:0}.nav-menu .row .ico{width:15px;height:15px;flex:none;color:var(--text-ghost)}.nav-menu .row.active .ico{color:var(--accent-bright)}.proj-row{display:flex;align-items:center;gap:4px;padding:0 10px 4px 12px}#project-select{flex:1;min-width:0;height:30px;padding:0 9px;display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);font:inherit;font-size:12.5px;font-weight:500;cursor:pointer;white-space:nowrap;outline:none}#project-select>span:last-of-type{overflow:hidden;text-overflow:ellipsis}#project-select:hover{background:var(--hover);border-color:var(--border-2)}#project-select svg{color:var(--text-ghost)}.proj-menu{z-index:80;min-width:var(--radix-select-trigger-width, 200px);border:1px solid var(--border-2);border-radius:9px;padding:4px;background:var(--bg-raise);box-shadow:0 10px 32px #00000059}.proj-menu [role=option]{font-size:12.5px;color:var(--text-dim);border-radius:6px;outline:none}.proj-menu [role=option][data-highlighted]{background:var(--hover);color:var(--text)}#accountbar{position:relative;border-top:1px solid var(--border);padding:7px 10px}#account-btn{width:100%;display:flex;align-items:center;gap:9px;text-align:left;padding:6px 8px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);cursor:pointer;font:inherit}#account-btn:hover{background:var(--hover);color:var(--text)}#account-btn .avatar{width:26px;height:26px;flex:none;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700}#account-btn .acct{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}#account-btn .acct b{font-size:12.5px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#account-btn .acct small{font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#account-btn>.ico{width:14px;height:14px;color:var(--text-ghost)}#account-menu{min-width:var(--radix-dropdown-menu-trigger-width, 220px);padding:5px;border:1px solid var(--border-2);border-radius:9px;background:var(--bg-raise);box-shadow:0 10px 32px #00000059;display:flex;flex-direction:column;z-index:80;outline:none}#account-menu [role=menuitem]{outline:none}#account-menu [role=menuitem][data-highlighted]{background:var(--hover);color:var(--text)}#account-menu .menu-sec{padding:7px 9px 3px;font-size:10.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-faint)}#account-menu [role=menuitem]{display:flex;align-items:center;gap:8px;padding:7px 9px;border:none;border-radius:6px;background:transparent;text-align:left;color:var(--text-dim);font:inherit;font-size:12.5px;cursor:pointer;text-decoration:none}#account-menu [role=menuitem]:hover{background:var(--hover);color:var(--text)}#account-menu [role=menuitem] b{font-weight:600}#account-menu [role=menuitem] .ico{width:15px;height:15px}#account-menu #signout{color:var(--danger, #e5534b)}#account-menu #signout:hover{color:var(--danger, #e5534b);background:var(--hover)}#main{flex:1;display:flex;flex-direction:column;min-width:0}#topbar{position:relative;display:flex;align-items:center;gap:9px;height:52px;padding:0 16px;border-bottom:1px solid var(--border)}.icon-btn{display:none;width:34px;height:34px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;border-radius:7px;align-items:center;justify-content:center}.icon-btn:hover{color:var(--text);background:var(--hover)}#crumb{font-size:12.5px;color:var(--text);font-weight:500;letter-spacing:-.01em;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#crumb .crumb-seg{color:var(--text-dim);cursor:pointer}#crumb .crumb-seg:hover{color:var(--accent-bright)}#crumb .crumb-sep{color:var(--text-ghost);margin:0 5px}#meta{flex:1;min-width:0;font-size:12px;color:var(--text-faint);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn{display:inline-flex;align-items:center;gap:6px;flex:none;height:30px;padding:0 11px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text-dim);font-size:12.5px;font-weight:500;cursor:pointer;text-decoration:none}.btn:hover{background:var(--hover);color:var(--text);border-color:var(--border-2)}.btn .ico{width:15px;height:15px}.btn.ghost{color:var(--text-dim)}.tipcard{display:flex;align-items:center;gap:7px;white-space:nowrap;padding:6px 9px;border-radius:8px;border:1px solid var(--border-2);background:var(--surface-solid, var(--bg-raise));color:var(--text);font-size:12.5px;font-weight:500;box-shadow:0 8px 24px #00000059;z-index:80}.tipcard kbd{font:11px var(--ui);color:var(--text-faint);background:var(--hover);border:1px solid var(--border-2);border-radius:5px;padding:1px 5px}#more-menu{position:absolute;right:12px;top:calc(100% - 4px);z-index:80;background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-card);box-shadow:0 18px 44px -14px #000000bf;padding:6px;min-width:168px}.more-item{display:block;width:100%;text-align:left;min-height:40px;padding:0 12px;background:transparent;border:none;cursor:pointer;color:var(--text);font:inherit;font-size:13.5px;border-radius:var(--r-ctl)}.more-item:hover{background:var(--hover)}#content{flex:1;overflow-y:auto;padding:44px 40px 110px;scroll-behavior:smooth}.page{width:100%;max-width:var(--page-app);margin-inline:auto;min-width:0}.page.read{max-width:var(--page-read)}.page.wide{max-width:var(--page-wide)}.empty{color:var(--text-faint);text-align:center;margin-top:var(--hero-top)}.empty-hint{display:block;margin-top:6px;font-size:12px;color:var(--text-faint)}.onboard{max-width:560px;margin:var(--hero-top) auto 0}.onboard h1{font-size:25px;font-weight:640;letter-spacing:-.02em;margin:0 0 8px;color:#f4f6f9}.onboard>p{color:var(--text-dim);margin:0 0 28px;font-size:14px}.ob-card{background:var(--bg-side);border:1px solid var(--border);border-radius:var(--r-card);padding:20px 22px;margin-bottom:14px}.ob-card h3{margin:0 0 6px;font-size:14.5px;font-weight:600}.ob-card p{margin:0 0 14px;font-size:13px;color:var(--text-dim)}.ob-row{display:flex;gap:9px}.ob-row input{flex:1;height:34px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:13px;outline:none}.ob-row input:focus{border-color:var(--accent);background:var(--hover)}.pbtn{display:inline-flex;align-items:center;gap:6px;flex:none;height:32px;padding:0 14px;border-radius:var(--r-ctl);border:none;background:var(--accent);color:#241704;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap}.pbtn:hover{background:var(--accent-bright)}.pbtn .ico{width:15px;height:15px}.danger-btn{display:inline-flex;align-items:center;height:32px;padding:0 14px;border-radius:var(--r-ctl);border:none;background:#b3382e;color:#fff;font-size:13px;font-weight:600;cursor:pointer}.danger-btn:hover{background:#c94336}.admin h1{font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 6px;color:#f4f6f9}.admin h3{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);font-weight:600;margin:30px 0 10px}.admin-sub{color:var(--text-dim);font-size:13.5px;margin:0 0 6px;line-height:1.55}.admin-h{display:flex;align-items:center;justify-content:space-between;margin:30px 0 10px}.admin-h h3{margin:0}.admin-row{display:flex;gap:9px;margin-bottom:8px}.admin-row input{flex:1;height:34px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:13px;outline:none}.admin-row input:focus{border-color:var(--accent);background:var(--hover)}.admin-list{border:1px solid var(--border);border-radius:var(--r-card);overflow:hidden;background:var(--bg-side)}.admin-item{display:flex;align-items:center;gap:11px;padding:11px 14px;border-bottom:1px solid var(--border);font-size:13.5px}.admin-item:last-child{border-bottom:none}.admin-item:hover{background:#ffffff04}.ai-main{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.ai-main.mono{font:12px var(--mono);color:var(--text-dim);cursor:pointer}.ai-tag{font-size:11.5px;color:var(--text-faint);flex:none}.admin-item select{height:28px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:0 8px;font:inherit;font-size:12.5px;cursor:pointer}.admin-item select:hover{border-color:var(--border-2)}.ai-btn,.ai-del{flex:none;height:27px;padding:0 11px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text-dim);font:inherit;font-size:12px;font-weight:500;cursor:pointer}.ai-btn:hover{background:var(--hover);color:var(--text);border-color:var(--border-2)}.ai-del{color:var(--del);border-color:transparent;background:transparent}.ai-del:hover{background:#f26d6d1f;color:#ff8b8b}.admin-empty{padding:14px;color:var(--text-faint);font-size:13px}.admin-item.toggle{cursor:pointer;align-items:flex-start}.admin-item.toggle .ai-main{white-space:normal}.tg-label{font-size:13.5px;font-weight:550;color:var(--text)}.tg-desc{font-size:12px;color:var(--text-faint);margin-top:3px;line-height:1.5}.admin-item.toggle input{width:16px;height:16px;margin-top:2px;accent-color:var(--accent);flex:none}.dl-title{display:flex;align-items:center;gap:10px;font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 4px;color:#f4f6f9}.dl-title-icon{display:flex;color:var(--accent)}.dl-title-icon .ico{width:20px;height:20px}.dl-sub{color:var(--text-faint);font-size:12.5px;margin:0 0 18px}.dl-items{border:1px solid var(--border);border-radius:var(--r-card);overflow:hidden;background:var(--bg-side)}.dl-row{display:flex;align-items:center;gap:11px;padding:10px 14px;border-bottom:1px solid var(--border);cursor:pointer}.dl-row:last-child{border-bottom:none}.dl-row:hover{background:var(--hover)}.dl-row .ticon{flex:none;display:flex;color:var(--text-ghost)}.dl-row .ticon .ico{width:16px;height:16px}.dl-row:hover .ticon{color:var(--text-faint)}.dl-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;color:var(--text)}.dl-meta{flex:none;font-size:12px;color:var(--text-faint);font-variant-numeric:tabular-nums}.heatdot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--accent)}.heatdot.lvl1{opacity:.3}.heatdot.lvl2{opacity:.55}.heatdot.lvl3{opacity:.8}.heatdot.lvl4{opacity:1;box-shadow:0 0 6px #f5a6238c}.dl-empty{padding:24px 14px;color:var(--text-faint);font-size:13px;border:1px dashed var(--border);border-radius:var(--r-card);text-align:center}.dl-h3{margin:28px 0 8px;font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);font-weight:600}.dl-hlist{border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);overflow:hidden;max-width:none}.dl-hlist .hentry:last-child{border-bottom:none}.hentry.clickable{cursor:pointer}.hentry.clickable:hover{background:var(--hover)}.dl-more{margin-top:10px}#vault-name.vault-link{cursor:pointer}#vault-name.vault-link:hover{color:var(--accent-bright)}.gd-tabs{display:flex;gap:2px;margin:20px 0 16px;border-bottom:1px solid var(--border);overflow-x:auto}.gd-tab{font:inherit;font-size:13px;font-weight:600;padding:7px 12px 9px;background:none;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;color:var(--text-faint);cursor:pointer;white-space:nowrap}.gd-tab:hover{color:var(--text)}.gd-tab.active{color:var(--accent-bright);border-bottom-color:var(--accent)}.gd-step{margin:0 0 18px}.gd-step-head{display:flex;align-items:center;gap:10px;margin-bottom:3px}.gd-num{flex:none;width:22px;height:22px;border-radius:50%;background:var(--glow);color:var(--accent-bright);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}.gd-step-title{font-weight:600;font-size:14px;color:var(--text)}.gd-desc{margin:2px 0 8px 32px;color:var(--text-faint);font-size:13px;line-height:1.5}.gd-extra{font-size:12.5px;margin-top:6px}.gd-code{position:relative;margin:6px 0 6px 32px;padding:10px 72px 10px 12px;background:var(--bg-raise);border:1px solid var(--border);border-radius:var(--r-card);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.6;color:var(--text);overflow-x:auto;white-space:pre}.gd-copy{position:absolute;top:7px;right:7px;font:inherit;font-family:inherit;font-size:11px;font-weight:600;padding:3px 9px;border-radius:6px;border:1px solid var(--border-2);background:var(--bg-raise);color:var(--text-faint);cursor:pointer;box-shadow:-14px 0 12px -6px var(--bg-raise)}.gd-copy:hover{color:var(--accent-bright);border-color:var(--accent-dim)}.gd-solo .gd-desc,.gd-solo .gd-code{margin-left:0}.gd-manual{margin:10px 0 0}.gd-manual>summary{display:inline-block;font-size:12.5px;font-weight:600;color:var(--text-faint);cursor:pointer;padding:4px 0}.gd-manual>summary:hover{color:var(--text)}.gd-manual .gd-desc,.gd-manual .gd-code{margin-left:0}.gd-done{margin:22px 0 8px;padding:12px 14px;border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);color:var(--text-faint);font-size:13px;line-height:1.5}.home-insights{margin-top:30px;padding-top:22px;border-top:1px solid var(--border)}.in-title{font-size:21px;font-weight:640;letter-spacing:-.02em;margin:0 0 4px;color:#f4f6f9}.in-title .in-scope{color:var(--text-ghost);font-weight:500;font-size:15px}.in-lens{display:flex;gap:6px;margin:0 0 14px}.in-lens-btn{font:inherit;font-size:12px;padding:5px 12px;border-radius:999px;border:1px solid var(--border);background:none;color:var(--text-faint);cursor:pointer}.in-lens-btn:hover{color:var(--text)}.in-lens-btn.active{color:var(--accent);border-color:var(--accent)}.in-chart{width:100%;height:auto;border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);margin-bottom:6px}.in-axis{stroke:var(--border);stroke-width:1}.in-threshold{stroke:var(--border);stroke-width:1;stroke-dasharray:4 4}.in-danger-zone{fill:#f26d6d0d}.in-label{fill:var(--text-ghost);font-size:11px}.in-quad{fill:var(--text-ghost);font-size:10.5px;text-transform:uppercase;letter-spacing:.06em}.in-quad-danger{fill:#e07070}.in-pt{fill:var(--accent);opacity:.5;cursor:pointer}.in-pt:hover{opacity:1}.in-pt.cold{fill:var(--text-ghost);opacity:.25}.in-pt.danger{fill:#e05d5d;opacity:.6}.in-treemap{background:#0c0d10}.in-tm-group{fill:none;stroke:var(--border);stroke-width:1;cursor:pointer;pointer-events:all}.in-tm-glabel{fill:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.05em;cursor:pointer}.in-tm-cell{cursor:pointer}.in-tm-cell:hover{stroke:#fff;stroke-width:1}.in-tm-label{fill:#0c0d10;font-size:10.5px;font-weight:620;cursor:pointer;pointer-events:none}.in-hotpath{border:1px solid var(--border);border-radius:var(--r-card);background:var(--bg-side);overflow:hidden}.in-hp-row{display:flex;align-items:center;gap:10px;padding:6px 12px;border-bottom:1px solid var(--border);cursor:pointer}.in-hp-row:last-child{border-bottom:none}.in-hp-row:hover{background:var(--hover)}.in-hp-name{flex:0 0 300px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--text)}.in-hp-name.danger{color:var(--accent)}.in-hp-bar{flex:1;display:flex;height:10px;border-radius:3px;overflow:hidden}.in-hp-agent{background:var(--accent)}.in-hp-human{background:#5b8def}.in-hp-count{flex:none;width:40px;text-align:right;font-size:11.5px;color:var(--text-faint);font-variant-numeric:tabular-nums}.in-legend{margin:8px 2px 0;font-size:11.5px;color:var(--text-faint)}.in-sw{display:inline-block;width:10px;height:10px;border-radius:2px;vertical-align:-1px}.in-sw.agent{background:var(--accent)}.in-sw.human{background:#5b8def}.in-matrix rect{transition:opacity .1s}.in-matrix rect:hover{opacity:.85}.hentry{padding:11px 12px;border-bottom:1px solid var(--border)}.hentry:hover{background:#ffffff04}.hline{display:flex;gap:10px;align-items:center}.hkind{display:inline-flex;color:var(--add)}.hkind .ico{width:13px;height:13px}.hentry.edit .hkind{color:var(--accent)}.hentry.delete .hkind{color:var(--del)}.htag{flex:none;font-size:10px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;padding:1px 6px;border-radius:4px}.hentry.add .htag{color:var(--add);background:#4cc38a1f}.hentry.edit .htag{color:var(--accent-bright);background:var(--glow)}.hentry.delete .htag{color:#ff8b8b;background:#f26d6d1f}.hpath{font-weight:500;cursor:pointer;color:var(--text);font-size:13px}.hpath:hover{color:var(--accent-bright)}.htime{margin-left:auto;color:var(--text-faint);font-size:12px;font-variant-numeric:tabular-nums}.hmeta{display:flex;align-items:center;gap:14px;margin-top:4px;padding-left:23px;font-size:12px;color:var(--text-dim)}.hdev,.hsize{color:var(--text-faint)}.hsize{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}.hnote{margin-top:4px;padding-left:23px;font-size:12px;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.hnote:hover{color:var(--text)}.hnote.open{white-space:normal;overflow-wrap:anywhere}.hnote:before{content:"› ";color:var(--text-ghost)}.hnote a{color:var(--accent-bright);text-decoration:none}.hnote a:hover{text-decoration:underline}#palette{position:fixed;top:12vh;left:50%;transform:translate(-50%);z-index:151;display:block;width:min(560px,92vw);background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-over);box-shadow:0 24px 70px -18px #000c;overflow:hidden;outline:none;padding:0}#palette-inputwrap{display:flex;align-items:center;gap:11px;padding:14px 16px;border-bottom:1px solid var(--border)}#palette-inputwrap [data-slot=command-input-wrapper]{flex:1;display:flex;border-bottom:0;padding:0;height:auto}#palette-inputwrap [data-slot=command-input-wrapper]>svg:not(.ico){display:none}#palette input,#palette input:focus{border:none;background:transparent;box-shadow:none;outline:none;padding:0}#palette-inputwrap .ico{width:17px;height:17px;color:var(--text-faint)}#palette-input{flex:1;width:100%;border:none;background:transparent;color:var(--text);font:inherit;font-size:15px;letter-spacing:-.01em;outline:none;padding:0}#palette-input::placeholder{color:var(--text-ghost)}#palette-results{list-style:none;margin:0;padding:8px;max-height:46vh;overflow-y:auto}#palette-results [cmdk-item]{display:flex;align-items:center;gap:11px;height:38px;padding:0 10px;border-radius:9px;cursor:pointer;color:var(--text-dim);font-size:13.5px}#palette-results [cmdk-item][data-selected=true]{background:var(--glow)}#palette-results [cmdk-item][data-selected=true] .picon{color:var(--accent)}#palette-results [cmdk-item][data-selected=true] .plabel,#palette-results [cmdk-item][data-selected=true] .plabel b{color:var(--accent-bright)}#palette-results li{display:flex;align-items:center;gap:11px;height:38px;padding:0 10px;border-radius:9px;cursor:pointer;color:var(--text-dim);font-size:13.5px}#palette-results li.selected{background:var(--glow)}#palette-results li.selected .picon{color:var(--accent)}#palette-results li.selected .plabel,#palette-results li.selected .plabel b{color:var(--accent-bright)}#palette-results li .picon{width:18px;flex:none;display:flex;justify-content:center;color:var(--text-faint)}#palette-results li .picon .ico{width:15px;height:15px}#palette-results li .plabel{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text)}#palette-results li .plabel b{color:var(--accent-bright);font-weight:600}#palette-results li .pkind{flex:none;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-ghost)}#palette-results .pempty{color:var(--text-faint);cursor:default;justify-content:center;height:auto;padding:14px}#palette-hint{padding:9px 16px;border-top:1px solid var(--border);font-size:11px;color:var(--text-ghost)}[data-slot=dialog-overlay]{position:fixed;inset:0;background:#06070999;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:150}.modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:151;display:block;background:var(--bg-raise);border:1px solid var(--border-2);border-radius:var(--r-over);padding:22px 24px;width:min(460px,calc(100vw - 40px));box-shadow:0 24px 70px -18px #000c;outline:none}.modal h3{margin:0 0 10px;font-size:16px;font-weight:620;letter-spacing:-.01em}.modal p{margin:0 0 16px;font-size:13.5px;color:var(--text-dim);line-height:1.55}.modal p b{color:var(--text)}.modal-url{font:12px var(--mono);background:var(--surface);border:1px solid var(--border);border-radius:var(--r-ctl);padding:9px 11px;color:var(--text-dim);word-break:break-all;margin-bottom:16px}.modal-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.modal-label{display:block;font-size:12.5px;color:var(--text-dim);margin:0 0 6px}.modal-msg{margin:0 0 16px;font-size:13.5px;color:var(--text-dim);line-height:1.55}.modal-input{width:100%;height:36px;padding:0 12px;border-radius:var(--r-ctl);border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-size:14px;margin-bottom:16px;outline:none}.modal-input:focus{border-color:var(--accent);background:var(--hover)}[data-sonner-toast]{background:var(--bg-raise)!important;color:var(--text)!important;border:1px solid var(--border-2)!important;border-radius:10px!important;font-size:13.5px!important;box-shadow:0 18px 44px -12px #000000b3!important}[data-sonner-toast][data-type=error]{border-color:#f26d6d80!important;color:#ffb0aa!important}#sb-backdrop{display:none}@media(max-width:900px){#sidebar{position:fixed;z-index:60;top:0;left:0;height:100%;transform:translate(-100%);transition:transform .2s ease;box-shadow:0 0 40px #0009}body.sb-open #sidebar{transform:translate(0)}body.sb-open #sb-backdrop{display:block;position:fixed;inset:0;background:#0000008c;z-index:50}.icon-btn{display:inline-flex;width:44px;height:44px}#content{padding:24px 18px 70px}#topbar{padding:0 8px;gap:4px}.btn .lbl{display:none}#topbar .btn{min-width:44px;min-height:44px;padding:0;justify-content:center;gap:0}#topbar .btn .ico{width:18px;height:18px}#more-btn:not([hidden]){display:inline-flex}#history-btn,#upload-btn,#download{display:none!important}#meta{display:none}#crumb{flex:1}#vault{padding:0 8px 0 12px}.icon-btn2,#signout,#tree .row,#projects .row{height:44px}#account-btn,#project-select{min-height:44px}.nav-add{min-width:44px;min-height:44px}.markdown table,pre.plain{display:block;overflow-x:auto;max-width:100%}.ob-row{flex-direction:column}.ob-row input{flex:none;min-height:44px}.admin-item{flex-wrap:wrap;row-gap:8px;padding:12px 14px}.admin-item select{height:44px}.ai-btn,.ai-del{height:auto;min-height:44px;padding:0 12px}.admin-item .ai-main{flex:1 1 100%;white-space:normal;overflow-wrap:break-word}.gd-code{min-height:62px;padding-top:12px;padding-bottom:12px}.gd-copy{min-height:44px;padding:0 14px}.gd-tab{min-height:44px}.in-lens-btn{min-height:44px;padding:0 14px}.modal-input{height:44px}.modal-actions button,.pbtn,#palette-results li{height:auto;min-height:44px}.more-item{min-height:44px}}.modal-actions .ai-del{margin-right:auto}@media(max-width:430px){.dl-meta{display:none}.ai-tag{font-size:11px}.htime{white-space:nowrap;font-size:12px}.hline{flex-wrap:wrap}.modal-actions .ai-del{flex:0 0 100%;justify-content:center;text-align:center}}.markdown h1,.markdown h2,.markdown h3,.markdown h4{color:#f4f6f9;line-height:1.25;letter-spacing:-.018em;margin:1.5em 0 .5em;text-wrap:balance}.markdown h1:first-child{margin-top:0}.markdown h1{font-size:1.85em;font-weight:660;letter-spacing:-.024em}.markdown h2{font-size:1.32em;font-weight:620;margin-top:1.7em}.markdown h3{font-size:1.08em;font-weight:620}.markdown p,.markdown li{color:#c6cbd3;font-size:14.5px;line-height:1.72}.markdown p{margin:0 0 1em}.markdown strong{color:var(--text);font-weight:620}.markdown a{color:var(--accent-bright);text-decoration:none;border-bottom:1px solid rgba(245,166,35,.28)}.markdown a:hover{border-bottom-color:var(--accent)}.markdown ul,.markdown ol{margin:0 0 1em;padding-left:1.4em}.markdown li{margin-bottom:.4em}.markdown li::marker{color:var(--text-ghost)}.markdown code{background:var(--hover);border:1px solid var(--border);padding:.1em .4em;border-radius:5px;font:12.5px/1.5 var(--mono);color:#e4d9c4}.markdown pre{background:var(--code-bg);border:1px solid var(--border);border-radius:var(--r-card);padding:14px 16px;overflow-x:auto;margin:1.3em 0}.markdown pre code{background:none;border:none;padding:0;color:#c6cbd3}.markdown blockquote{margin:1.3em 0;padding:.3em 1em;border-left:2px solid var(--accent);background:linear-gradient(90deg,var(--glow),transparent);border-radius:0 8px 8px 0;color:#d8cdb6}.markdown blockquote p{margin:.3em 0;color:#d8cdb6}.markdown table{border-collapse:collapse;margin:1.3em 0;font-size:13.5px}.markdown th,.markdown td{border-bottom:1px solid var(--border);padding:9px 13px;text-align:left}.markdown th{color:var(--text-faint);font-size:11px;text-transform:uppercase;letter-spacing:.05em;font-weight:600;border-bottom-color:var(--border-2)}.markdown tr:hover td{background:#ffffff05}.markdown img{max-width:100%;border-radius:8px;border:1px solid var(--border)}.markdown hr{border:none;border-top:1px solid var(--border);margin:2.2em 0}.markdown table.frontmatter{margin:0 0 1.8em;font-size:12px;background:var(--surface);border:1px solid var(--border);border-radius:8px;border-collapse:separate;border-spacing:0}.markdown table.frontmatter th{text-transform:none;letter-spacing:0;font-size:11.5px;color:var(--text-faint);font-weight:600;text-align:left;white-space:nowrap;vertical-align:top;padding:6px 14px 6px 12px;border-bottom:1px solid var(--border)}.markdown table.frontmatter td{color:var(--text-dim);padding:6px 12px 6px 0;border-bottom:1px solid var(--border)}.markdown table.frontmatter tr:last-child th,.markdown table.frontmatter tr:last-child td{border-bottom:none}.markdown table.frontmatter code{white-space:pre-wrap;font-size:11px}.markdown input[type=checkbox]{accent-color:var(--accent)}.htmlview{display:block;width:100%;height:calc(100vh - 150px);border:1px solid var(--border);border-radius:var(--r-card);background:#fff}.notfound{margin-top:var(--hero-top);text-align:center;color:var(--text-dim)}.notfound h1{color:var(--text);font-size:1.4em;margin-bottom:.5em}.notfound code{background:var(--hover);border:1px solid var(--border);padding:.15em .5em;border-radius:6px}.notfound .nf-sub{max-width:440px;margin:12px auto 20px;font-size:13px;color:var(--text-faint);line-height:1.6}pre.plain{background:var(--code-bg);border:1px solid var(--border);border-radius:var(--r-card);padding:14px 16px;overflow-x:auto;font:12.5px/1.6 var(--mono);color:#c6cbd3;white-space:pre-wrap;overflow-wrap:anywhere}.filecard{margin-top:var(--hero-top);text-align:center;color:var(--text-dim)}.filecard .name{font-size:1.2em;color:var(--text);margin-bottom:.3em}.filecard .btn{margin-top:14px} diff --git a/internal/webapp/static/assets/index-BZydVmgc.js b/internal/webapp/static/assets/index-Dnpnr_Sl.js similarity index 99% rename from internal/webapp/static/assets/index-BZydVmgc.js rename to internal/webapp/static/assets/index-Dnpnr_Sl.js index 0325e2d..5edd13b 100644 --- a/internal/webapp/static/assets/index-BZydVmgc.js +++ b/internal/webapp/static/assets/index-Dnpnr_Sl.js @@ -118,4 +118,4 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs. bdrive skill install --agent `+e.agent+` bdrive login `+window.location.origin+` bdrive init --project `+n.id+` -bdrive hooks install --agent `+e.agent}function j6(){try{return localStorage.getItem("bdrive-guide-agent")||"claude"}catch{return"claude"}}function I_({project:e}){const[n,r]=x.useState(j6),i=Fh.find(l=>l.key===n)||Fh[0],s=O6(i,e);return v.jsxs("div",{className:"guide",children:[v.jsx("h1",{className:"in-title",children:e.name}),v.jsx("p",{className:"dl-sub",children:"Mount this project as a folder on any machine and connect your coding agent: files sync both ways in the background, every change is journaled with who made it, and agent reads feed Insights."}),v.jsx("div",{className:"gd-tabs",children:Fh.map(l=>v.jsx("button",{className:"gd-tab"+(l.key===i.key?" active":""),"data-key":l.key,onClick:()=>{r(l.key);try{localStorage.setItem("bdrive-guide-agent",l.key)}catch{}},children:l.label},l.key))}),v.jsxs("div",{className:"gd-body",children:[s.map((l,c)=>v.jsxs("div",{className:"gd-step"+(s.length>1?"":" gd-solo"),children:[v.jsxs("div",{className:"gd-step-head",children:[s.length>1&&v.jsx("span",{className:"gd-num",children:c+1}),v.jsx("span",{className:"gd-step-title",children:l.title})]}),l.desc&&v.jsx("p",{className:"gd-desc",children:l.desc}),l.code&&v.jsx(CS,{code:l.code}),l.extra&&v.jsx("p",{className:"gd-desc gd-extra",children:l.extra})]},c)),i.agent&&v.jsxs("details",{className:"gd-manual",children:[v.jsx("summary",{children:"Or run it yourself"}),v.jsx("p",{className:"gd-desc",children:"Same result, in the folder you want the files. Don't skip the last line — the hooks are what keep every turn starting from the latest state."}),v.jsx(CS,{code:M6(i,e)})]}),v.jsx("p",{className:"gd-done",children:"That's it — the folder now syncs on its own. Every agent turn starts from the latest state, edits appear here (and on every teammate's mount) within seconds, and what your agents read shows up in Insights."})]})]})}function CS({code:e}){const[n,r]=x.useState("Copy");return v.jsxs("pre",{className:"gd-code",children:[v.jsx("code",{children:e}),v.jsx("button",{className:"gd-copy",onClick:async()=>{r(await Js(e)?"Copied":"Copy failed"),setTimeout(()=>r("Copy"),1400)},children:n})]})}const D6=Yc({invite:$p().trim().refine(e=>/join\/([0-9a-f]+)/.test(e)||/^[0-9a-f]{8,}$/.test(e),{message:"That doesn't look like an invite link."})}),z6=Yc({name:$p().trim().min(1,"Give the project a name.").max(60,"Keep it under 60 characters.")});function N6({authEnabled:e,onCreate:n}){const r=uc({resolver:mc(D6),defaultValues:{invite:""}}),i=uc({resolver:mc(z6),defaultValues:{name:""}});return v.jsxs("div",{className:"onboard",children:[v.jsx("h1",{children:"Welcome to BearDrive"}),v.jsx("p",{children:"You're signed in, but you're not part of any project yet."}),e&&v.jsxs("div",{className:"ob-card",children:[v.jsx("h3",{children:"Have an invite link?"}),v.jsx("p",{children:"A teammate can send you a join link. Paste it here:"}),v.jsxs("form",{className:"ob-row",onSubmit:r.handleSubmit(({invite:s})=>{const l=s.match(/join\/([0-9a-f]+)/)||s.match(/^([0-9a-f]{8,})$/);location.href="/join/"+l[1]}),children:[v.jsx("input",{id:"ob-invite",type:"text",placeholder:"https://…/join/…",autoComplete:"off",...r.register("invite")}),v.jsx(Yt,{id:"ob-join",variant:"primary",type:"submit",children:"Join"})]}),r.formState.errors.invite&&v.jsx("p",{className:"field-err",children:r.formState.errors.invite.message})]}),v.jsxs("div",{className:"ob-card",children:[v.jsx("h3",{children:"Or start a new project"}),v.jsx("p",{children:"Create a shared space for your team's files."}),v.jsxs("form",{className:"ob-row",onSubmit:i.handleSubmit(({name:s})=>n(s)),children:[v.jsx("input",{id:"ob-name",type:"text",placeholder:"Project name, e.g. wiki",autoComplete:"off",...i.register("name")}),v.jsx(Yt,{id:"ob-create",variant:"primary",type:"submit",children:"Create"})]}),i.formState.errors.name&&v.jsx("p",{className:"field-err",children:i.formState.errors.name.message})]})]})}function k6(e,n=!0){const r=jn({queryKey:["tree",e],queryFn:()=>Fn(e+"tree"),enabled:n,refetchInterval:15e3}),i=x.useMemo(()=>{const s=[],l=new Map,c=d=>{for(const h of d.children||[])h.dir?(l.set(h.path,h),c(h)):s.push(h)};return r.data&&c(r.data),{flatFiles:s,dirIndex:l}},[r.data]);return{tree:r.data,...i,loaded:!!r.data}}function L6(e,n){return jn({queryKey:["heat",e],queryFn:()=>Fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function I6(e,n,r){return jn({queryKey:["history",e,"prefix",n,20],queryFn:()=>Fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function ES(e,n,r){if(!e)return null;if(!r)return e[n]||null;const i={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(i.human+=l.human||0,i.agent+=l.agent||0,i.share+=l.share||0);return i.human||i.agent||i.share?i:null}function Ws(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function Zu(e){const n=Ws(e);if(!n)return"";let r=n+(n===1?" read":" reads");return e.agent&&(r+=" ("+e.agent+" agent)"),r}function $6(e){const n=Ws(e);return n?n<3?1:n<10?2:n<30?3:4:0}function V6(e,n,r){const i=new Array(e);return new Proxy(i,{get(s,l,c){if(typeof l=="string"){const d=l.charCodeAt(0);if(d>=48&&d<=57){const h=+l;if(Number.isInteger(h)&&h>=0&&hi[y]!==m))&&(i=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return c.updateDeps=d=>{i=d},c}function RS(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const F6=(e,n)=>Math.abs(e-n)<1.01,U6=(e,n,r)=>{let i;return function(...s){e.clearTimeout(i),i=e.setTimeout(()=>n.apply(this,s),r)}};let Ds;const Uh=()=>{if(Ds!==void 0)return Ds;if(typeof navigator>"u")return Ds=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Ds=!0;const e=navigator.maxTouchPoints;return Ds=navigator.platform==="MacIntel"&&e!==void 0&&e>0},TS=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},P6=e=>e,H6=e=>{const n=Math.max(e.startIndex-e.overscan,0),i=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(i);for(let l=0;l{const r=e.scrollElement;if(!r)return;const i=e.targetWindow;if(!i)return;const s=c=>{const{width:d,height:h}=c;n({width:Math.round(d),height:Math.round(h)})};if(s(TS(r)),!i.ResizeObserver)return()=>{};const l=new i.ResizeObserver(c=>{const d=()=>{const h=c[0];if(h?.borderBoxSize){const m=h.borderBoxSize[0];if(m){s({width:m.inlineSize,height:m.blockSize});return}}s(TS(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},gc={passive:!0},q6=typeof window>"u"?!0:"onscrollend"in window,G6=(e,n,r)=>{const i=e.scrollElement;if(!i)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&q6;let c=0;const d=l?null:U6(s,()=>n(c,!1),e.options.isScrollingResetDelay),h=g=>()=>{c=r(i),d?.(),n(c,g)},m=h(!0),y=h(!1);return i.addEventListener("scroll",m,gc),l&&i.addEventListener("scrollend",y,gc),()=>{i.removeEventListener("scroll",m),l&&i.removeEventListener("scrollend",y)}},Z6=(e,n)=>G6(e,n,r=>{const{horizontal:i,isRtl:s}=e.options;return i?r.scrollLeft*(s&&-1||1):r.scrollTop}),K6=(e,n,r)=>{if(r.options.useCachedMeasurements){const i=r.indexFromElement(e),s=r.options.getItemKey(i);return r.itemSizeCache.get(s)??r.options.estimateSize(i)}if(n?.borderBoxSize){const i=n.borderBoxSize[0];if(i)return Math.round(i[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const i=r.indexFromElement(e),s=r.options.getItemKey(i),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},Y6=(e,{adjustments:n=0,behavior:r},i)=>{var s,l;(l=(s=i.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[i.options.horizontal?"left":"top"]:e+n,behavior:r})},Q6=Y6;class X6{constructor(n){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var r,i,s;return((s=(i=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:i.now)==null?void 0:s.call(i))??Date.now()},this.observer=(()=>{let r=null;const i=()=>r||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:r=new this.targetWindow.ResizeObserver(s=>{s.forEach(l=>{const c=()=>{const d=l.target,h=this.indexFromElement(d);if(!d.isConnected){this.observer.unobserve(d);for(const[m,y]of this.elementsCache)if(y===d){this.elementsCache.delete(m);break}return}this.shouldMeasureDuringScroll(h)&&this.resizeItem(h,this.options.measureElement(d,l,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(c):c()})}));return{disconnect:()=>{var s;(s=i())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=i())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=i())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var i,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:P6,rangeExtractor:H6,onChange:()=>{},measureElement:K6,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,anchorTo:"start",followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",useCachedMeasurements:!1};for(const b in r){const S=r[b];S!==void 0&&(l[b]=S)}const c=this.options;let d=null,h=null,m=!1;if(c!==void 0&&c.enabled&&l.enabled&&l.anchorTo==="end"&&this.scrollElement!==null){const b=c.count,S=l.count,_=this.getMeasurements(),C=b>0?((i=_[0])==null?void 0:i.key)??c.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??c.getItemKey(b-1):null;if(S!==b||b>0&&S>0&&(l.getItemKey(0)!==C||l.getItemKey(S-1)!==E)){m=!0;const A=b>0?this.getVirtualItemForOffset(this.getScrollOffset())??_[0]:null;A&&(d=[A.key,this.getScrollOffset()-A.start]);const k=l.followOnAppend===!0?"auto":l.followOnAppend||null;k&&S>b&&this.isAtEnd(c.scrollEndThreshold)&&(b===0||l.getItemKey(S-1)!==E)&&(h=k)}}this.options=l,m&&(this.pendingMin=0,this.itemSizeCacheVersion++);let y=!1,g=0;if(d&&this.scrollOffset!==null){const[b,S]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var i,s;(s=(i=this.options).onChange)==null||s.call(i,this,r)},this.maybeNotify=ba(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),r=>{this.notify(r)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(r=>r()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var r;const i=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==i){if(this.cleanup(),!i){this.maybeNotify();return}if(this.scrollElement=i,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((r=this.scrollElement)==null?void 0:r.window)??null,this.elementsCache.forEach(l=>{this.observer.observe(l)}),this.unsubs.push(this.options.observeElementRect(this,l=>{this.scrollRect=l,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(l,c)=>{if(c&&this._intendedScrollOffset===null&&l===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(l-this._intendedScrollOffset)<1.5&&(l=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;const d=this.getScrollOffset();this.scrollDirection=c?d===l?this.scrollDirection:d{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},d=()=>{this._iosTouching=!1,!(!Uh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",c,gc),l.addEventListener("touchend",d,gc),this.unsubs.push(()=>{l.removeEventListener("touchstart",c),l.removeEventListener("touchend",d),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}const s=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,s&&this.scrollElement&&this.options.enabled){const[l,c,d,h]=s;l!==null&&!d&&(Uh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?h!==0&&(this._iosDeferredAdjustment+=h):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),d&&this.scrollToEnd({behavior:d})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const r=this.getScrollOffset(),i=this.getMaxScrollOffset();if(r<0||r>i)return;const s=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(r,{adjustments:this.scrollAdjustments+=s,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=ba(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(r,i,s,l,c,d,h,m)=>(this.prevLanes!==void 0&&this.prevLanes!==d&&(this.lanesChangedFlag=!0),this.prevLanes=d,this.pendingMin=null,{count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:c,lanes:d,laneAssignmentMode:h,gap:m}),{key:!1}),this.getMeasurements=ba(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:c,lanes:d,laneAssignmentMode:h,gap:m},y)=>{const g=this.itemSizeCache;if(!c)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>r)for(const T of this.laneAssignments.keys())T>=r&&this.laneAssignments.delete(T);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(T=>{this.itemSizeCache.set(T.key,T.size)}));const b=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===r&&(this.lanesSettling=!1),d===1){const T=r*2;let O=this._flatMeasurements;if(!O||O.length0&&L.set(O.subarray(0,b*2)),O=L,this._flatMeasurements=O}let A;if(b===0)A=i+s;else{const L=b-1;A=O[L*2]+O[L*2+1]+m}for(let L=b;L1){k=A;const ge=_[k],de=ge!==void 0?S[ge]:void 0;L=de?de.end+m:i+s}else if(E===d){let ge=0,de=C[0],le=_[0];for(let ae=1;aethis.options.debug}),this.calculateRange=ba(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,i,s,l)=>r.length===0||i===0?(this.range=null,null):(this.range=W6(r,i,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=ba(()=>{let r=null,i=null;const s=this.calculateRange();return s&&(r=s.startIndex,i=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,i]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,i]},(r,i,s,l,c)=>l===null||c===null?[]:r({startIndex:l,endIndex:c,overscan:i,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const i=this.options.indexAttribute,s=r.getAttribute(i);return s?parseInt(s,10):(console.warn(`Missing attribute name '${i}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var i;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((i=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:i.index);if(s!==void 0&&this.range){const l=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),c=Math.max(0,s-l),d=Math.min(this.options.count-1,s+l);return r>=c&&r<=d}return!0},this.measureElement=r=>{if(!r){this.elementsCache.forEach((c,d)=>{c.isConnected||(this.observer.unobserve(c),this.elementsCache.delete(d))});return}const i=this.indexFromElement(r),s=this.options.getItemKey(i),l=this.elementsCache.get(s);l!==r&&(l&&this.observer.unobserve(l),this.observer.observe(r),this.elementsCache.set(s,r)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(i)&&this.resizeItem(i,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,i)=>{var s,l;if(r<0||r>=this.options.count)return;let c,d,h;const m=this._flatMeasurements;if(this.options.lanes===1&&m!==null)h=this.options.getItemKey(r),d=m[r*2],c=m[r*2+1];else{const b=this.measurementsCache[r];if(!b)return;h=b.key,d=b.start,c=b.size}const y=this.itemSizeCache.get(h)??c,g=i-y;if(g!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,S=b?this.getTotalSize():0,_=((l=this.scrollState)==null?void 0:l.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[r]??{index:r,key:h,start:d,size:c,end:d+c,lane:0},g,this):d[this.getVirtualIndexes(),this.getMeasurements()],(r,i)=>{const s=[];for(let l=0,c=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const i=this.getMeasurements();if(i.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,c=$_(0,i.length-1,l?d=>s[d*2]:d=>RS(i[d]).start,r);return RS(i[c])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const r=this.scrollElement.document.documentElement;return this.options.horizontal?r.scrollWidth-this.scrollElement.innerWidth:r.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(r=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=r,this.getOffsetForAlignment=(r,i,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),c=this.getScrollOffset();i==="auto"&&(i=r>=c+l?"end":"start"),i==="center"?r+=(s-l)/2:i==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,i="auto")=>{r=Math.max(0,Math.min(r,this.options.count-1));const s=this.getSize(),l=this.getScrollOffset(),c=this.measurementsCache[r];if(!c)return;if(i==="auto")if(c.end>=l+s-this.options.scrollPaddingEnd)i="end";else if(c.start<=l+this.options.scrollPaddingStart)i="start";else return[l,i];if(i==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),i];const d=i==="end"?c.end+this.options.scrollPaddingEnd:c.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,i,c.size),i]},this.scrollToOffset=(r,{align:i="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,i),c=this.now();this.scrollState={index:null,align:i,behavior:s,startedAt:c,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:i="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,i);if(!l)return;const[c,d]=l,h=this.now();this.scrollState={index:r,align:d,behavior:s,startedAt:h,lastTargetOffset:c,stableFrames:0},this._scrollToOffset(c,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollBy=(r,{behavior:i="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:i,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:r="auto"}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:"end",behavior:r});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:r})},this.getTotalSize=()=>{var r;const i=this.getMeasurements();let s;if(i.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=i.length-1,c=this._flatMeasurements;c!=null?s=c[l*2]+c[l*2+1]:s=((r=i[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let c=i.length-1;for(;c>=0&&l.some(d=>d===null);){const d=i[c];l[d.lane]===null&&(l[d.lane]=d.end),c--}s=Math.max(...l.filter(d=>d!==null))}return Math.max(s-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const r=[];if(this.itemSizeCache.size===0)return r;const i=this.getMeasurements();for(const s of i)s&&this.itemSizeCache.has(s.key)&&r.push({index:s.index,key:s.key,start:s.start,size:s.size,end:s.end,lane:s.lane});return r},this._scrollToOffset=(r,{adjustments:i,behavior:s})=>{this._intendedScrollOffset=r+(i??0),this.options.scrollToFn(r,{behavior:s,adjustments:i},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(n)}applyScrollAdjustment(n,r){n!==0&&(Uh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=n:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=n,behavior:r}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const i=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=i?i[0]:this.scrollState.lastTargetOffset,l=1,c=s!==this.scrollState.lastTargetOffset;if(!c&&F6(s,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=l){this.getScrollOffset()!==s&&this._scrollToOffset(s,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,c){const d=this.getSize()||600,h=Math.abs(s-this.getScrollOffset()),m=this.scrollState.behavior==="smooth"&&h>d;this.scrollState.lastTargetOffset=s,m||(this.scrollState.behavior="auto"),this._scrollToOffset(s,{adjustments:void 0,behavior:m?"smooth":"auto"})}this.scheduleScrollReconcile()}}const $_=(e,n,r,i)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(li)n=s-1;else return s}return e>0?e-1:0};function J6(e,n,r){let i=0;for(;i<=n;){const s=(i+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return i>0?i-1:0}function W6(e,n,r,i,s){const l=e.length-1;if(e.length<=i)return{startIndex:0,endIndex:l};if(i===1&&s!==null){const m=J6(s,l,r);let y=m;const g=r+n;for(;ye[m].start,r),h=d;if(i===1)for(;h1){const m=Array(i).fill(0);for(;hg=0&&y.some(g=>g>=r);){const g=e[d];y[g.lane]=g.start,d--}d=Math.max(0,d-d%i),h=Math.min(l,h+(i-1-h%i))}return{startIndex:d,endIndex:h}}const Ph=typeof document<"u"?x.useLayoutEffect:x.useEffect;function eI({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...i}){const s=x.useReducer(m=>m+1,0)[1],l=x.useRef({enabled:n,mode:r,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});l.current.enabled=n,l.current.mode=r;const c=m=>{const y=l.current;if(!y.enabled||!y.container)return;const g=m.getTotalSize();if(g!==y.lastSize){y.lastSize=g;const T=m.options.horizontal?"width":"height";y.container.style[T]=`${g}px`}const b=!!m.options.horizontal,S=y.mode==="transform",_=b?"left":"top",C=m.options.scrollMargin,E=m.getVirtualItems();for(const T of E){const O=T.start-C,A=m.elementsCache.get(T.key);A&&y.lastPositions.get(A)!==O&&(y.lastPositions.set(A,O),S?A.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:A.style[_]=`${O}px`)}},d={...i,onChange:(m,y)=>{var g;const b=l.current;let S=!0;if(b.enabled){c(m);const _=m.range,C=b.prevRange;S=!C||C.isScrolling!==m.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,S&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:m.isScrolling}:null)}S&&(e&&y?Si.flushSync(s):s()),(g=i.onChange)==null||g.call(i,m,y)}},[h]=x.useState(()=>{const m=new X6(d);return Object.assign(m,{containerRef:y=>{const g=l.current;if(g.container=y,g.lastSize=null,y&&g.enabled){const b=m.getTotalSize();g.lastSize=b;const S=m.options.horizontal?"width":"height";y.style[S]=`${b}px`}}})});return h.setOptions(d),Ph(()=>h._didMount(),[]),Ph(()=>h._willUpdate()),Ph(()=>{c(h)}),h}function tI(e){return eI({observeElementRect:B6,observeElementOffset:Z6,scrollToFn:Q6,...e})}function nI(e,n){const r=[],i=(s,l)=>{for(const c of s)r.push({node:c,depth:l}),c.dir&&n.has(c.path)&&i(c.children||[],l+1)};return i(e?.children||[],0),r}function rI(e){const{root:n,expanded:r,onToggle:i,currentPath:s,listingShowing:l,onOpen:c}=e,d=x.useRef(null),h=x.useMemo(()=>nI(n,r),[n,r]),m=tI({count:h.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>h[y].node.path});return x.useEffect(()=>{if(!s)return;const y=h.findIndex(g=>g.node.path===s);y>=0&&m.scrollToIndex(y,{align:"auto"})},[s,h]),v.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:v.jsx("div",{style:{height:m.getTotalSize(),position:"relative"},children:m.getVirtualItems().map(y=>{const{node:g,depth:b}=h[y.index],S=g.dir?r.has(g.path):!1,_=()=>{if(g.dir&&s===g.path&&l){i(g.path);return}c(g.path),g.dir||fr()};return v.jsxs("div",{className:"row "+(g.dir?"dir":"file")+(s===g.path?" active":"")+(g.dir&&!S?" collapsed":""),"data-path":g.path,tabIndex:0,role:"button",title:g.name,"aria-expanded":g.dir?S:void 0,style:{position:"absolute",top:0,left:0,right:0,transform:`translateY(${y.start}px)`,paddingLeft:8+b*13},onClick:_,onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),_())},children:[Array.from({length:b},(C,E)=>v.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),v.jsx("span",{className:"chev",onClick:C=>{g.dir&&(C.stopPropagation(),i(g.path))},children:v.jsx(Kt,{name:"chevd"})}),v.jsx("span",{className:"ticon",children:v.jsx(Kt,{name:g.dir?"folder":"doc"})}),v.jsx("span",{className:"label",children:g.name})]},y.key)})})})}function oI(e){const n=e.split("/"),r=[];let i="";for(let s=0;s{i=i?i+"/"+s:s;const c=i,d=l===r.length-1;return v.jsxs("span",{children:[l>0&&v.jsx("span",{className:"crumb-sep",children:"/"}),d?v.jsx("span",{children:s}):v.jsx("span",{className:"crumb-seg",title:c,onClick:()=>n(c),children:s})]},c)})})}const aI={add:"plus",edit:"edit",delete:"x"},sI={add:"added",edit:"edited",delete:"deleted"};function V_({entry:e,onOpen:n}){const[r,i]=x.useState(!1),s=e.kind==="put"?"edit":e.kind,l=e.user_name?`${e.user_name} <${e.user}>`:e.user||e.author||"unknown",c=[e.device.name||e.device.id,e.device.os,e.device.ip].filter(Boolean).join(" · "),d=s!=="delete",h=m=>{m.target.tagName!=="A"&&d&&n(e.path)};return v.jsxs("div",{className:"hentry "+s+(d?" clickable":""),tabIndex:d?0:void 0,role:d?"button":void 0,onClick:h,onKeyDown:m=>{d&&(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),n(e.path))},children:[v.jsxs("div",{className:"hline",children:[v.jsx("span",{className:"hkind",children:v.jsx(Kt,{name:aI[s]||"dot"})}),v.jsx("span",{className:"hpath",children:e.path}),v.jsx("span",{className:"htag",children:sI[s]||s}),v.jsx("span",{className:"htime",children:new Date(e.time).toLocaleString()})]}),v.jsxs("div",{className:"hmeta",children:[v.jsx("span",{className:"hwho",children:l}),v.jsx("span",{className:"hdev",children:c}),v.jsx("span",{className:"hsize",children:e.size?A_(e.size):""})]}),e.note&&v.jsx("div",{className:"hnote"+(r?" open":""),tabIndex:0,role:"button",title:r?"Collapse note":"Show full note","aria-expanded":r,onClick:m=>{m.stopPropagation(),m.target.tagName!=="A"&&i(!r)},onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),m.stopPropagation(),i(!r))},children:e.note.split(/(https?:\/\/\S+)/).map((m,y)=>/^https?:\/\//.test(m)?v.jsx("a",{href:m,target:"_blank",rel:"noopener",children:m},y):m)})]})}function lI(e){const{node:n,heatMap:r,onOpen:i}=e,s=(n.children||[]).slice().sort((m,y)=>Number(y.dir||!1)-Number(m.dir||!1)||m.name.localeCompare(y.name)),l=s.filter(m=>m.dir).length,c=s.length-l,d=[];l&&d.push(l+(l===1?" folder":" folders")),c&&d.push(c+(c===1?" file":" files"));const h=ES(r,n.path,!0);return h&&d.push(Zu(h)+" in 30 days"),v.jsxs("div",{className:"dirlist",children:[v.jsxs("h1",{className:"dl-title",children:[v.jsx("span",{className:"dl-title-icon",children:v.jsx(Kt,{name:"folder"})}),v.jsx("span",{children:n.name})]}),v.jsx("p",{className:"dl-sub",children:d.join(" · ")||"Empty folder"}),s.length===0?v.jsx("div",{className:"dl-empty",children:"Nothing in this folder yet."}):v.jsx("div",{className:"dl-items",children:s.map(m=>{let y="";if(m.dir){const b=(m.children||[]).length;y=b+(b===1?" item":" items")}else y=[m.size?A_(m.size):"",m.time?new Date(m.time).toLocaleDateString():""].filter(Boolean).join(" · ");const g=ES(r,m.path,!!m.dir);return g&&(y=Zu(g)+(y?" · "+y:"")),v.jsxs("div",{className:"dl-row",tabIndex:0,role:"button",title:m.path,onClick:()=>i(m.path),onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),i(m.path))},children:[v.jsx("span",{className:"ticon",children:v.jsx(Kt,{name:m.dir?"folder":"doc"})}),v.jsx("span",{className:"dl-name",children:m.name}),g&&v.jsx("span",{className:"heatdot lvl"+$6(g),title:Zu(g)+" in 30 days"}),v.jsx("span",{className:"dl-meta",children:y})]},m.path)})}),e.hub&&v.jsx(uI,{apiBase:e.apiBase,prefix:n.path+"/",onOpen:i,onFullHistory:()=>e.onFullHistory(n.path+"/"),onRendered:e.onRendered})]})}function uI(e){const n=I6(e.apiBase,e.prefix,!0),{onRendered:r}=e;return x.useEffect(()=>{n&&n.length&&r&&r()},[n,r]),!n||n.length===0?null:v.jsxs("div",{className:"dl-history",children:[v.jsx("h3",{className:"dl-h3",children:"Recent changes"}),v.jsx("div",{className:"history dl-hlist",children:n.map((i,s)=>v.jsx(V_,{entry:i,onOpen:e.onOpen},s))}),v.jsx("button",{className:"ai-btn dl-more",onClick:e.onFullHistory,children:"Full history"})]})}function cI(e){const{apiBase:n,path:r,onMeta:i}=e,s=n+"file?path="+encodeURIComponent(r);return x.useEffect(()=>()=>i(""),[r,i]),s6.test(r)?v.jsx(dI,{...e}):O_.test(r)?v.jsx("iframe",{className:"htmlview",sandbox:"allow-scripts",src:s,title:r,onLoad:e.onRendered}):l6.test(r)?v.jsx(mI,{src:s,alt:r,onRendered:e.onRendered}):u6.test(r)?v.jsx(pI,{...e,fileURL:s}):v.jsxs("div",{className:"filecard",children:[v.jsx("div",{className:"name",children:r.split("/").pop()}),v.jsx("p",{children:"No preview for this file type."}),v.jsx("a",{className:"btn",download:!0,href:n+"download?path="+encodeURIComponent(r),children:"Download"})]})}function dI(e){const{apiBase:n,path:r,heatMap:i,flatFiles:s,onOpenFile:l,onMeta:c,onRendered:d}=e,{data:h,error:m}=jn({queryKey:["render",n,r],queryFn:()=>Fn(n+"render?path="+encodeURIComponent(r))}),y=x.useMemo(()=>h?hI(h.html,r,n):"",[h,r,n]);return x.useEffect(()=>{if(!h)return;const g=[];h.author&&g.push(h.author+(h.device?" on "+h.device:"")),h.time&&g.push(new Date(h.time).toLocaleString());const b=i&&i[h.path];b&&Ws(b)&&g.push(Zu(b)+" / 30d"),c(g.join(" · ")),d?.()},[h,i,c,d]),m?v.jsxs("div",{className:"empty",children:["Could not load file: ",m.message]}):h?v.jsx("div",{dangerouslySetInnerHTML:{__html:y},onClick:g=>fI(g,r,s,l)}):null}function fI(e,n,r,i){const s=e.target.closest("a");if(!s||!e.currentTarget.contains(s))return;const l=s.getAttribute("href")||"",c=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"";l.startsWith("wiki:")?(e.preventDefault(),gI(decodeURIComponent(l.slice(5)),r,i)):/^([a-z]+:|\/|#)/i.test(l)||(e.preventDefault(),i(M_(c,decodeURIComponent(l))))}function hI(e,n,r){const i=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"",s=c=>r+"file?path="+encodeURIComponent(c),l=new DOMParser().parseFromString(e,"text/html");for(const c of l.querySelectorAll("img")){const d=c.getAttribute("src")||"";/^([a-z]+:|\/)/i.test(d)||c.setAttribute("src",s(M_(i,d)))}for(const c of l.querySelectorAll("a")){const d=c.getAttribute("href")||"";/^https?:/i.test(d)&&(c.setAttribute("target","_blank"),c.setAttribute("rel","noopener"))}return l.body.innerHTML}function mI({src:e,alt:n,onRendered:r}){return v.jsx("img",{src:e,alt:n,onLoad:r})}function pI(e){const{path:n,fileURL:r,onRendered:i}=e,{data:s,error:l}=jn({queryKey:["text",r],queryFn:async()=>{const c=await fetch(r);if(!c.ok)throw new Error(await c.text());return c.text()}});return x.useEffect(()=>{s!=null&&i?.()},[s,i]),l?v.jsxs("div",{className:"empty",children:["Could not load file: ",l.message]}):s==null?null:v.jsx("pre",{className:"plain",children:s},n)}function gI(e,n,r){const i=e.toLowerCase(),s=n.find(l=>l.path.toLowerCase()===i||l.path.toLowerCase()===i+".md")||n.find(l=>{const c=l.name.toLowerCase();return c===i||c===i+".md"});s&&r(s.path)}function vI({url:e,copied:n,onClose:r}){const i=e.split("/s/")[1];return v.jsx(bp,{open:!0,onOpenChange:s=>!s&&r(),children:v.jsxs(Sp,{className:"modal",showCloseButton:!1,children:[v.jsx(Ic,{asChild:!0,children:v.jsx("h3",{children:"Public link created"})}),v.jsxs("p",{children:[v.jsx("b",{children:"Anyone with this link can view this file"})," — no account needed. It always shows the latest version until you revoke it."]}),v.jsx("div",{className:"modal-url",children:e}),v.jsxs("div",{className:"modal-actions",children:[v.jsx(Yt,{variant:"primary",onClick:()=>Js(e).then(s=>Je(s?"Copied.":"Select and copy the link above.")),children:n?"Copied ✓":"Copy link"}),v.jsx(Yt,{variant:"subtle",onClick:()=>window.open(e,"_blank"),children:"Open"}),v.jsx(Yt,{variant:"subtle",className:"ai-del",onClick:async()=>{try{await Ao("DELETE","/api/shares/"+i),Je("Link revoked — it no longer works."),r()}catch(s){Je(s.message,!0)}},children:"Revoke"}),v.jsx(Yt,{variant:"subtle",onClick:r,children:"Done"})]})]})})}var OS=1,yI=.9,bI=.8,SI=.17,Hh=.1,Bh=.999,xI=.9999,wI=.99,_I=/[\\\/_+.#"@\[\(\{&]/,CI=/[\\\/_+.#"@\[\(\{&]/g,EI=/[\s-]/,F_=/[\s-]/g;function Am(e,n,r,i,s,l,c){if(l===n.length)return s===e.length?OS:wI;var d=`${s},${l}`;if(c[d]!==void 0)return c[d];for(var h=i.charAt(l),m=r.indexOf(h,s),y=0,g,b,S,_;m>=0;)g=Am(e,n,r,i,m+1,l+1,c),g>y&&(m===s?g*=OS:_I.test(e.charAt(m-1))?(g*=bI,S=e.slice(s,m-1).match(CI),S&&s>0&&(g*=Math.pow(Bh,S.length))):EI.test(e.charAt(m-1))?(g*=yI,_=e.slice(s,m-1).match(F_),_&&s>0&&(g*=Math.pow(Bh,_.length))):(g*=SI,s>0&&(g*=Math.pow(Bh,m-s))),e.charAt(m)!==n.charAt(l)&&(g*=xI)),(gg&&(g=b*Hh)),g>y&&(y=g),m=r.indexOf(h,m+1);return c[d]=y,y}function AS(e){return e.toLowerCase().replace(F_," ")}function RI(e,n,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,Am(e,n,AS(e),AS(n),0,0,{})}var zs='[cmdk-group=""]',qh='[cmdk-group-items=""]',TI='[cmdk-group-heading=""]',U_='[cmdk-item=""]',MS=`${U_}:not([aria-disabled="true"])`,Mm="cmdk-item-select",Sa="data-value",OI=(e,n,r)=>RI(e,n,r),P_=x.createContext(void 0),dl=()=>x.useContext(P_),H_=x.createContext(void 0),Vp=()=>x.useContext(H_),B_=x.createContext(void 0),q_=x.forwardRef((e,n)=>{let r=xa(()=>{var j,P;return{search:"",value:(P=(j=e.value)!=null?j:e.defaultValue)!=null?P:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),i=xa(()=>new Set),s=xa(()=>new Map),l=xa(()=>new Map),c=xa(()=>new Set),d=G_(e),{label:h,children:m,value:y,onValueChange:g,filter:b,shouldFilter:S,loop:_,disablePointerSelection:C=!1,vimBindings:E=!0,...T}=e,O=hn(),A=hn(),k=hn(),L=x.useRef(null),U=VI();bi(()=>{if(y!==void 0){let j=y.trim();r.current.value=j,B.emit()}},[y]),bi(()=>{U(6,ae)},[]);let B=x.useMemo(()=>({subscribe:j=>(c.current.add(j),()=>c.current.delete(j)),snapshot:()=>r.current,setState:(j,P,Q)=>{var Z,re,ee,pe;if(!Object.is(r.current[j],P)){if(r.current[j]=P,j==="search")le(),ge(),U(1,de);else if(j==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let be=document.getElementById(k);be?be.focus():(Z=document.getElementById(O))==null||Z.focus()}if(U(7,()=>{var be;r.current.selectedItemId=(be=he())==null?void 0:be.id,B.emit()}),Q||U(5,ae),((re=d.current)==null?void 0:re.value)!==void 0){let be=P??"";(pe=(ee=d.current).onValueChange)==null||pe.call(ee,be);return}}B.emit()}},emit:()=>{c.current.forEach(j=>j())}}),[]),H=x.useMemo(()=>({value:(j,P,Q)=>{var Z;P!==((Z=l.current.get(j))==null?void 0:Z.value)&&(l.current.set(j,{value:P,keywords:Q}),r.current.filtered.items.set(j,ve(P,Q)),U(2,()=>{ge(),B.emit()}))},item:(j,P)=>(i.current.add(j),P&&(s.current.has(P)?s.current.get(P).add(j):s.current.set(P,new Set([j]))),U(3,()=>{le(),ge(),r.current.value||de(),B.emit()}),()=>{l.current.delete(j),i.current.delete(j),r.current.filtered.items.delete(j);let Q=he();U(4,()=>{le(),Q?.getAttribute("id")===j&&de(),B.emit()})}),group:j=>(s.current.has(j)||s.current.set(j,new Set),()=>{l.current.delete(j),s.current.delete(j)}),filter:()=>d.current.shouldFilter,label:h||e["aria-label"],getDisablePointerSelection:()=>d.current.disablePointerSelection,listId:O,inputId:k,labelId:A,listInnerRef:L}),[]);function ve(j,P){var Q,Z;let re=(Z=(Q=d.current)==null?void 0:Q.filter)!=null?Z:OI;return j?re(j,r.current.search,P):0}function ge(){if(!r.current.search||d.current.shouldFilter===!1)return;let j=r.current.filtered.items,P=[];r.current.filtered.groups.forEach(Z=>{let re=s.current.get(Z),ee=0;re.forEach(pe=>{let be=j.get(pe);ee=Math.max(be,ee)}),P.push([Z,ee])});let Q=L.current;ye().sort((Z,re)=>{var ee,pe;let be=Z.getAttribute("id"),ze=re.getAttribute("id");return((ee=j.get(ze))!=null?ee:0)-((pe=j.get(be))!=null?pe:0)}).forEach(Z=>{let re=Z.closest(qh);re?re.appendChild(Z.parentElement===re?Z:Z.closest(`${qh} > *`)):Q.appendChild(Z.parentElement===Q?Z:Z.closest(`${qh} > *`))}),P.sort((Z,re)=>re[1]-Z[1]).forEach(Z=>{var re;let ee=(re=L.current)==null?void 0:re.querySelector(`${zs}[${Sa}="${encodeURIComponent(Z[0])}"]`);ee?.parentElement.appendChild(ee)})}function de(){let j=ye().find(Q=>Q.getAttribute("aria-disabled")!=="true"),P=j?.getAttribute(Sa);B.setState("value",P||void 0)}function le(){var j,P,Q,Z;if(!r.current.search||d.current.shouldFilter===!1){r.current.filtered.count=i.current.size;return}r.current.filtered.groups=new Set;let re=0;for(let ee of i.current){let pe=(P=(j=l.current.get(ee))==null?void 0:j.value)!=null?P:"",be=(Z=(Q=l.current.get(ee))==null?void 0:Q.keywords)!=null?Z:[],ze=ve(pe,be);r.current.filtered.items.set(ee,ze),ze>0&&re++}for(let[ee,pe]of s.current)for(let be of pe)if(r.current.filtered.items.get(be)>0){r.current.filtered.groups.add(ee);break}r.current.filtered.count=re}function ae(){var j,P,Q;let Z=he();Z&&(((j=Z.parentElement)==null?void 0:j.firstChild)===Z&&((Q=(P=Z.closest(zs))==null?void 0:P.querySelector(TI))==null||Q.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function he(){var j;return(j=L.current)==null?void 0:j.querySelector(`${U_}[aria-selected="true"]`)}function ye(){var j;return Array.from(((j=L.current)==null?void 0:j.querySelectorAll(MS))||[])}function N(j){let P=ye()[j];P&&B.setState("value",P.getAttribute(Sa))}function Y(j){var P;let Q=he(),Z=ye(),re=Z.findIndex(pe=>pe===Q),ee=Z[re+j];(P=d.current)!=null&&P.loop&&(ee=re+j<0?Z[Z.length-1]:re+j===Z.length?Z[0]:Z[re+j]),ee&&B.setState("value",ee.getAttribute(Sa))}function ne(j){let P=he(),Q=P?.closest(zs),Z;for(;Q&&!Z;)Q=j>0?II(Q,zs):$I(Q,zs),Z=Q?.querySelector(MS);Z?B.setState("value",Z.getAttribute(Sa)):Y(j)}let J=()=>N(ye().length-1),W=j=>{j.preventDefault(),j.metaKey?J():j.altKey?ne(1):Y(1)},D=j=>{j.preventDefault(),j.metaKey?N(0):j.altKey?ne(-1):Y(-1)};return x.createElement(Ue.div,{ref:n,tabIndex:-1,...T,"cmdk-root":"",onKeyDown:j=>{var P;(P=T.onKeyDown)==null||P.call(T,j);let Q=j.nativeEvent.isComposing||j.keyCode===229;if(!(j.defaultPrevented||Q))switch(j.key){case"n":case"j":{E&&j.ctrlKey&&W(j);break}case"ArrowDown":{W(j);break}case"p":case"k":{E&&j.ctrlKey&&D(j);break}case"ArrowUp":{D(j);break}case"Home":{j.preventDefault(),N(0);break}case"End":{j.preventDefault(),J();break}case"Enter":{j.preventDefault();let Z=he();if(Z){let re=new Event(Mm);Z.dispatchEvent(re)}}}}},x.createElement("label",{"cmdk-label":"",htmlFor:H.inputId,id:H.labelId,style:UI},h),Xc(e,j=>x.createElement(H_.Provider,{value:B},x.createElement(P_.Provider,{value:H},j))))}),AI=x.forwardRef((e,n)=>{var r,i;let s=hn(),l=x.useRef(null),c=x.useContext(B_),d=dl(),h=G_(e),m=(i=(r=h.current)==null?void 0:r.forceMount)!=null?i:c?.forceMount;bi(()=>{if(!m)return d.item(s,c?.id)},[m]);let y=Z_(s,l,[e.value,e.children,l],e.keywords),g=Vp(),b=Io(U=>U.value&&U.value===y.current),S=Io(U=>m||d.filter()===!1?!0:U.search?U.filtered.items.get(s)>0:!0);x.useEffect(()=>{let U=l.current;if(!(!U||e.disabled))return U.addEventListener(Mm,_),()=>U.removeEventListener(Mm,_)},[S,e.onSelect,e.disabled]);function _(){var U,B;C(),(B=(U=h.current).onSelect)==null||B.call(U,y.current)}function C(){g.setState("value",y.current,!0)}if(!S)return null;let{disabled:E,value:T,onSelect:O,forceMount:A,keywords:k,...L}=e;return x.createElement(Ue.div,{ref:Aa(l,n),...L,id:s,"cmdk-item":"",role:"option","aria-disabled":!!E,"aria-selected":!!b,"data-disabled":!!E,"data-selected":!!b,onPointerMove:E||d.getDisablePointerSelection()?void 0:C,onClick:E?void 0:_},e.children)}),MI=x.forwardRef((e,n)=>{let{heading:r,children:i,forceMount:s,...l}=e,c=hn(),d=x.useRef(null),h=x.useRef(null),m=hn(),y=dl(),g=Io(S=>s||y.filter()===!1?!0:S.search?S.filtered.groups.has(c):!0);bi(()=>y.group(c),[]),Z_(c,d,[e.value,e.heading,h]);let b=x.useMemo(()=>({id:c,forceMount:s}),[s]);return x.createElement(Ue.div,{ref:Aa(d,n),...l,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&x.createElement("div",{ref:h,"cmdk-group-heading":"","aria-hidden":!0,id:m},r),Xc(e,S=>x.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?m:void 0},x.createElement(B_.Provider,{value:b},S))))}),jI=x.forwardRef((e,n)=>{let{alwaysRender:r,...i}=e,s=x.useRef(null),l=Io(c=>!c.search);return!r&&!l?null:x.createElement(Ue.div,{ref:Aa(s,n),...i,"cmdk-separator":"",role:"separator"})}),DI=x.forwardRef((e,n)=>{let{onValueChange:r,...i}=e,s=e.value!=null,l=Vp(),c=Io(m=>m.search),d=Io(m=>m.selectedItemId),h=dl();return x.useEffect(()=>{e.value!=null&&l.setState("search",e.value)},[e.value]),x.createElement(Ue.input,{ref:n,...i,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":h.listId,"aria-labelledby":h.labelId,"aria-activedescendant":d,id:h.inputId,type:"text",value:s?e.value:c,onChange:m=>{s||l.setState("search",m.target.value),r?.(m.target.value)}})}),zI=x.forwardRef((e,n)=>{let{children:r,label:i="Suggestions",...s}=e,l=x.useRef(null),c=x.useRef(null),d=Io(m=>m.selectedItemId),h=dl();return x.useEffect(()=>{if(c.current&&l.current){let m=c.current,y=l.current,g,b=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let S=m.offsetHeight;y.style.setProperty("--cmdk-list-height",S.toFixed(1)+"px")})});return b.observe(m),()=>{cancelAnimationFrame(g),b.unobserve(m)}}},[]),x.createElement(Ue.div,{ref:Aa(l,n),...s,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":d,"aria-label":i,id:h.listId},Xc(e,m=>x.createElement("div",{ref:Aa(c,h.listInnerRef),"cmdk-list-sizer":""},m)))}),NI=x.forwardRef((e,n)=>{let{open:r,onOpenChange:i,overlayClassName:s,contentClassName:l,container:c,...d}=e;return x.createElement(Um,{open:r,onOpenChange:i},x.createElement(Hm,{container:c},x.createElement(Bm,{"cmdk-overlay":"",className:s}),x.createElement(qm,{"aria-label":e.label,"cmdk-dialog":"",className:l},x.createElement(q_,{ref:n,...d}))))}),kI=x.forwardRef((e,n)=>Io(r=>r.filtered.count===0)?x.createElement(Ue.div,{ref:n,...e,"cmdk-empty":"",role:"presentation"}):null),LI=x.forwardRef((e,n)=>{let{progress:r,children:i,label:s="Loading...",...l}=e;return x.createElement(Ue.div,{ref:n,...l,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":s},Xc(e,c=>x.createElement("div",{"aria-hidden":!0},c)))}),Qc=Object.assign(q_,{List:zI,Item:AI,Input:DI,Group:MI,Separator:jI,Dialog:NI,Empty:kI,Loading:LI});function II(e,n){let r=e.nextElementSibling;for(;r;){if(r.matches(n))return r;r=r.nextElementSibling}}function $I(e,n){let r=e.previousElementSibling;for(;r;){if(r.matches(n))return r;r=r.previousElementSibling}}function G_(e){let n=x.useRef(e);return bi(()=>{n.current=e}),n}var bi=typeof window>"u"?x.useEffect:x.useLayoutEffect;function xa(e){let n=x.useRef();return n.current===void 0&&(n.current=e()),n}function Io(e){let n=Vp(),r=()=>e(n.snapshot());return x.useSyncExternalStore(n.subscribe,r,r)}function Z_(e,n,r,i=[]){let s=x.useRef(),l=dl();return bi(()=>{var c;let d=(()=>{var m;for(let y of r){if(typeof y=="string")return y.trim();if(typeof y=="object"&&"current"in y)return y.current?(m=y.current.textContent)==null?void 0:m.trim():s.current}})(),h=i.map(m=>m.trim());l.value(e,d,h),(c=n.current)==null||c.setAttribute(Sa,d),s.current=d}),s}var VI=()=>{let[e,n]=x.useState(),r=xa(()=>new Map);return bi(()=>{r.current.forEach(i=>i()),r.current=new Map},[e]),(i,s)=>{r.current.set(i,s),n({})}};function FI(e){let n=e.type;return typeof n=="function"?n(e.props):"render"in n?n.render(e.props):e}function Xc({asChild:e,children:n},r){return e&&x.isValidElement(n)?x.cloneElement(FI(n),{ref:n.ref},r(n.props.children)):r(n)}var UI={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function PI({className:e,...n}){return v.jsx(Qc,{"data-slot":"command",className:St("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",e),...n})}function HI({className:e,...n}){return v.jsxs("div",{"data-slot":"command-input-wrapper",className:"flex h-9 items-center gap-2 border-b px-3",children:[v.jsx(C1,{className:"size-4 shrink-0 opacity-50"}),v.jsx(Qc.Input,{"data-slot":"command-input",className:St("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n})]})}function BI({className:e,...n}){return v.jsx(Qc.List,{"data-slot":"command-list",className:St("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",e),...n})}function qI({className:e,...n}){return v.jsx(Qc.Item,{"data-slot":"command-item",className:St("relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",e),...n})}function jS(e,n){if(!e)return{score:0,hits:[]};const r=e.toLowerCase(),i=n.toLowerCase();let s=0,l=0,c=0;const d=[];for(let h=0;h3&&i.endsWith("ies")?s=i.slice(0,-3)+"y":i.length>3&&i.endsWith("es")?s=i.slice(0,-2):i.length>2&&i.endsWith("s")&&(s=i.slice(0,-1)),s?jS(s,n):null}function ZI({text:e,hits:n}){const r=[];let i=0;return n.forEach((s,l)=>{s>i&&r.push(e.slice(i,s)),r.push(v.jsx("b",{children:e[s]},l)),i=s+1}),r.push(e.slice(i)),v.jsx("span",{className:"plabel",children:r})}function KI({open:e,onClose:n,candidates:r}){const[i,s]=x.useState(""),l=x.useMemo(()=>{if(!e)return[];const d=[];for(const h of r()){const m=GI(i,h.label);m&&d.push({...h,score:m.score,hits:m.hits})}return d.sort((h,m)=>m.score-h.score),d.slice(0,40)},[e,i,r]);x.useEffect(()=>{e&&s("")},[e]);const c=d=>{n(),d.run()};return v.jsx(bp,{open:e,onOpenChange:d=>!d&&n(),children:v.jsxs(Sp,{id:"palette",className:"palette",showCloseButton:!1,"aria-describedby":void 0,children:[v.jsx(Ic,{className:"sr-only",children:"Search and quick actions"}),v.jsxs(PI,{shouldFilter:!1,loop:!0,children:[v.jsxs("div",{id:"palette-inputwrap",children:[v.jsx(Kt,{name:"search"}),v.jsx(HI,{id:"palette-input",placeholder:"Search file names, projects, actions…",autoComplete:"off",spellCheck:!1,value:i,onValueChange:s})]}),v.jsx(BI,{id:"palette-results",children:l.length===0?v.jsx("div",{className:"pempty",children:"No matches — search covers file names, projects, and actions"}):l.map(d=>v.jsxs(qI,{value:d.kind+":"+d.label,onSelect:()=>c(d),children:[v.jsx("span",{className:"picon",children:v.jsx(Kt,{name:d.icon})}),v.jsx(ZI,{text:d.label,hits:d.hits}),v.jsx("span",{className:"pkind",children:d.kind})]},d.kind+":"+d.label))}),v.jsx("footer",{id:"palette-hint",children:"↑↓ navigate · ⏎ select · esc close"})]})]})})}const Is=3,wa=30;function YI(e,n){return jn({queryKey:["heatDevices",e],queryFn:()=>Fn(e+"heat?by=device&days=30"),enabled:n,retry:!1,staleTime:6e4}).data?.devices??null}function DS(e){const[n,r]=x.useState("all"),{flatFiles:i,heatMap:s,devices:l,scope:c}=e,d=b=>!c||b===c||b.startsWith(c+"/"),h=c?i.filter(b=>d(b.path)):i,m=l&&c?l.map(b=>{const S={};for(const[_,C]of Object.entries(b.folders||{}))d(_)&&(S[_]=C);return{...b,folders:S}}).filter(b=>Object.keys(b.folders).length>0):l,y=Date.now(),g=h.map(b=>{const S=s&&s[b.path]||{},_=b.time?Math.max(0,(y-new Date(b.time).getTime())/864e5):0,C=n==="all"?Ws(S):S[n]||0;return{path:b.path,reads:C,agent:S.agent||0,total:Ws(S),days:_,danger:C>=Is&&_>=wa}});return v.jsxs("div",{className:"insights",children:[v.jsxs("h1",{className:"in-title",children:["Knowledge insights",c?v.jsxs("span",{className:"in-scope",children:[" · ",c]}):null]}),v.jsx("p",{className:"dl-sub",children:c?`Reads over the last 30 days × freshness, for ${c} and everything in it.`:"Reads over the last 30 days × how long since each file changed. Hot but stale knowledge — read a lot, maintained by nobody — is the danger zone."}),v.jsx("div",{className:"in-lens",children:["all","human","agent"].map(b=>v.jsx("button",{className:"in-lens-btn"+(b===n?" active":""),onClick:()=>r(b),children:b==="all"?"All reads":b==="human"?"Human reads":"Agent reads"},b))}),v.jsx("h3",{className:"dl-h3",children:"Map — cell size = reads, color = freshness"}),v.jsx(XI,{pts:g,onOpenFile:e.onOpenFile,onOpenFolder:e.onOpenFolder,isFolder:e.isFolder}),v.jsx("h3",{className:"dl-h3",children:"Reads × freshness"}),v.jsx(JI,{pts:g,onOpenFile:e.onOpenFile}),v.jsx("h3",{className:"dl-h3",children:"Hot path — top files by reads"}),v.jsx(WI,{pts:g,lens:n,onOpenFile:e.onOpenFile}),m&&m.length>0&&v.jsxs(v.Fragment,{children:[v.jsx("h3",{className:"dl-h3",children:"Agent coverage — which agents read which areas"}),v.jsx(e$,{devices:m})]})]})}function QI(e){const n=[[76,195,138],[232,196,84],[224,93,93]],r=Math.min(1,Math.max(0,e/300))*(n.length-1),i=Math.min(n.length-2,Math.floor(r)),s=r-i,l=n[i].map((c,d)=>Math.round(c+(n[i+1][d]-c)*s));return`rgb(${l[0]},${l[1]},${l[2]})`}function zS(e,n,r,i,s){const l=e.reduce((m,y)=>m+y.value,0);if(!l||i<=0||s<=0)return[];const c=e.slice().sort((m,y)=>y.value-m.value).map(m=>({it:m,a:m.value/l*i*s})),d=(m,y)=>{const b=m.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of m){const C=_.a/b;S=Math.max(S,C/b,b/C)}return S},h=[];for(;c.length;){const m=i>=s,y=m?s:i,g=[c.shift()];for(;c.length&&d(g.concat(c[0]),y)<=d(g,y);)g.push(c.shift());const b=g.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of g){const C=_.a/b;m?h.push({item:_.it,x:n,y:r+S,w:b,h:C}):h.push({item:_.it,x:n+S,y:r,w:C,h:b}),S+=C}m?(n+=b,i-=b):(r+=b,s-=b)}return h}const Gh=15;function XI({pts:e,onOpenFile:n,onOpenFolder:r,isFolder:i}){const c=new Map;for(const h of e){const m=h.path.includes("/")?h.path.split("/")[0]:"/";let y=c.get(m);y||c.set(m,y={name:m,files:[],value:0}),y.files.push(h),y.value+=h.reads+1}const d=[];for(const h of zS([...c.values()],0,0,720,480)){const m=h.item,y=m.name==="/"?"":m.name;if(d.push(v.jsx("rect",{x:h.x+1,y:h.y+1,width:Math.max(0,h.w-2),height:Math.max(0,h.h-2),rx:3,className:"in-tm-group","data-dir":y},"g"+m.name)),h.w>46&&h.h>Gh+10){let b=m.name==="/"?"(root)":m.name;const S=Math.floor((h.w-8)/6);b.length>S&&(b=b.slice(0,Math.max(1,S-1))+"…"),d.push(v.jsx("text",{x:h.x+5,y:h.y+12,className:"in-tm-glabel","data-dir":y,children:b},"gl"+m.name))}const g=zS(m.files.map(b=>({...b,name:b.path.split("/").pop(),value:b.reads+1})),h.x+2,h.y+Gh,Math.max(0,h.w-4),Math.max(0,h.h-Gh-2));for(const b of g)if(d.push(v.jsx("rect",{x:b.x+.6,y:b.y+.6,width:Math.max(.4,b.w-1.2),height:Math.max(.4,b.h-1.2),rx:1.5,fill:QI(b.item.days),className:"in-tm-cell","data-path":b.item.path,children:v.jsx("title",{children:`${b.item.path} — ${b.item.reads} read${b.item.reads===1?"":"s"}/30d · changed ${Math.round(b.item.days)}d ago`})},b.item.path)),b.w>54&&b.h>16){const S=Math.floor((b.w-8)/6);let _=(b.item.danger?"⚠ ":"")+b.item.name;_.length>S&&(_=_.slice(0,Math.max(1,S-1))+"…"),S>=5&&d.push(v.jsx("text",{x:b.x+4.5,y:b.y+12.5,className:"in-tm-label","data-path":b.item.path,children:_},"l"+b.item.path))}}return v.jsx("svg",{viewBox:"0 0 720 480",className:"in-chart in-treemap",onClick:h=>{const m=h.target.closest("[data-path], [data-dir]");if(!m)return;const y=m.getAttribute("data-path");if(y)return n(y);const g=m.getAttribute("data-dir");g&&i(g)&&r(g)},children:d})}function JI({pts:e,onOpenFile:n}){const s={l:44,r:16,t:20,b:34},l=Math.max(wa*2,...e.map(g=>g.days)),c=Math.max(Is*2,...e.map(g=>g.reads)),d=g=>Math.log10(g+1)/Math.log10(l+1),h=g=>Math.log10(g+1)/Math.log10(c+1),m=g=>s.l+d(g)*(720-s.l-s.r),y=g=>360-s.b-h(g)*(360-s.t-s.b);return v.jsxs("svg",{viewBox:"0 0 720 360",className:"in-chart",children:[v.jsx("rect",{x:m(wa),y:s.t,width:720-s.r-m(wa),height:y(Is)-s.t,className:"in-danger-zone"}),v.jsx("line",{x1:m(wa),y1:s.t,x2:m(wa),y2:360-s.b,className:"in-threshold"}),v.jsx("line",{x1:s.l,y1:y(Is),x2:720-s.r,y2:y(Is),className:"in-threshold"}),v.jsx("line",{x1:s.l,y1:360-s.b,x2:720-s.r,y2:360-s.b,className:"in-axis"}),v.jsx("line",{x1:s.l,y1:s.t,x2:s.l,y2:360-s.b,className:"in-axis"}),v.jsx("text",{x:(s.l+720-s.r)/2,y:352,className:"in-label",children:"days since last change →"}),v.jsx("text",{x:12,y:(s.t+360-s.b)/2,className:"in-label",transform:`rotate(-90 12 ${(s.t+360-s.b)/2})`,children:"reads / 30d →"}),v.jsx("text",{x:720-s.r-6,y:s.t+14,className:"in-quad in-quad-danger",textAnchor:"end",children:"hot + stale"}),v.jsx("text",{x:s.l+6,y:s.t+14,className:"in-quad",children:"hot + fresh"}),v.jsx("text",{x:720-s.r-6,y:360-s.b-8,className:"in-quad",textAnchor:"end",children:"cold + stale"}),v.jsx("text",{x:720-s.r-6,y:s.t+28,className:"in-label",textAnchor:"end",children:"dot size = agent share of reads"}),e.map(g=>{const b=g.total?(g.agent||0)/g.total:0;return v.jsx("circle",{cx:Number(m(g.days).toFixed(1)),cy:Number(y(g.reads).toFixed(1)),r:Number((3+4*b).toFixed(1)),className:"in-pt"+(g.danger?" danger":g.reads?"":" cold"),onClick:()=>n(g.path),children:v.jsx("title",{children:`${g.path} — ${g.reads} read${g.reads===1?"":"s"} / 30d · changed ${Math.round(g.days)}d ago`})},g.path)})]})}function WI({pts:e,lens:n,onOpenFile:r}){const i=e.filter(l=>l.reads>0).sort((l,c)=>c.reads-l.reads||c.days-l.days).slice(0,20);if(!i.length)return v.jsx("div",{className:"dl-empty",children:"No reads in the window yet."});const s=i[0].reads;return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:"in-hotpath",children:i.map(l=>{const c=n==="agent"?1:n==="human"?0:l.total?l.agent/l.total:0,d=l.reads/s*100;return v.jsxs("div",{className:"in-hp-row",tabIndex:0,role:"button",title:l.danger?`${l.reads} read${l.reads===1?"":"s"}/30d · unchanged ${Math.round(l.days)}d — review this file`:l.path,onClick:()=>r(l.path),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),r(l.path))},children:[v.jsx("span",{className:"in-hp-name"+(l.danger?" danger":""),children:l.path+(l.danger?" ⚠":"")}),v.jsxs("span",{className:"in-hp-bar",children:[v.jsx("span",{className:"in-hp-agent",style:{width:(d*c).toFixed(1)+"%"}}),v.jsx("span",{className:"in-hp-human",style:{width:(d*(1-c)).toFixed(1)+"%"}})]}),v.jsx("span",{className:"in-hp-count",children:l.reads})]},l.path)})}),v.jsxs("p",{className:"in-legend",children:[v.jsx("span",{className:"in-sw agent"})," agent reads ",v.jsx("span",{className:"in-sw human"})," human reads"]})]})}function e$({devices:e}){const n=new Map;for(const b of e)for(const[S,_]of Object.entries(b.folders||{}))n.set(S,(n.get(S)||0)+_);const r=[...n.entries()].sort((b,S)=>S[1]-b[1]).slice(0,12).map(b=>b[0]),i=e.slice(0,12),s=140,l=6,c=Math.min(76,Math.max(34,(720-s-8)/r.length)),d=26,h=720,m=l+i.length*d+58,y=Math.max(1,...i.flatMap(b=>r.map(S=>(b.folders||{})[S]||0))),g=b=>{const S=[23,25,31],_=[245,166,35],C=S.map((E,T)=>Math.round(E+(_[T]-E)*b));return`rgb(${C[0]},${C[1]},${C[2]})`};return v.jsxs("svg",{viewBox:`0 0 ${h} ${m}`,className:"in-chart in-matrix",children:[i.map((b,S)=>{let _=b.name||b.id||"";return _.length>20&&(_=_.slice(0,19)+"…"),v.jsxs("g",{children:[v.jsx("text",{x:s-8,y:l+S*d+17,textAnchor:"end",className:"in-label",children:_}),r.map((C,E)=>{const T=(b.folders||{})[C]||0;return v.jsx("rect",{x:s+E*c,y:l+S*d,width:c-4,height:d-4,rx:3,fill:g(Math.sqrt(T/y)),children:v.jsx("title",{children:`${b.name||b.id} × ${C||"(root)"}: ${T} read${T===1?"":"s"}/30d`})},C)})]},b.id||S)}),r.map((b,S)=>{const _=s+S*c+(c-4)/2,C=l+i.length*d+14;return v.jsx("text",{x:_,y:C,className:"in-label",textAnchor:"end",transform:`rotate(-28 ${_} ${C})`,children:b||"(root)"},b)})]})}function t$(e){const{apiBase:n,target:r,isFolder:i,onMeta:s,onRendered:l}=e,c=r?i(r)?{prefix:r+"/"}:{path:r}:{prefix:""},d="path"in c&&c.path!==void 0?"path="+encodeURIComponent(c.path):"prefix="+encodeURIComponent(c.prefix??""),{data:h,error:m}=jn({queryKey:["history",n,d,200],queryFn:()=>Fn(n+"history?"+d+"&n=200"),staleTime:15e3});if(x.useEffect(()=>{m&&s("History unavailable: "+m.message)},[m,s]),x.useEffect(()=>{h&&l?.()},[h,l]),!h)return null;const y=h.entries||[];return v.jsxs("div",{className:"history",children:[y.length===0&&v.jsx("div",{className:"empty",children:"No history yet."}),y.map((g,b)=>v.jsx(V_,{entry:g,onOpen:e.onOpen},b))]})}function n$(e,n){return e?n(e)?e+"/ (folder)":e:"all changes"}function K_(e){const{config:n,apiBase:r,route:i,hub:s,project:l}=e,c=wp(),d=tl(),{tree:h,flatFiles:m,dirIndex:y,loaded:g}=k6(r,!s||!!l),b=L6(r,s&&!!l&&!!n.reads?.enabled),S=s&&!!l&&!i.path&&!i.view,_=!!e.canInsights&&(i.view==="insights"||S),C=YI(r,_);x.useEffect(()=>{_&&d.invalidateQueries({queryKey:["heat",r]})},[_,r,d]);const E=i.path,T=E||(i.view==="insights"||i.view==="history")&&i.viewTarget||"",O=!!E&&y.has(E),A=!!E&&g&&!O&&m.some($e=>$e.path===E),k=!!E&&g&&!O&&!A,L=O&&!i.view,[U,B]=x.useState(()=>new Set),H=x.useRef(!0);x.useEffect(()=>{if(!h||!H.current)return;H.current=!1;const $e=(h.children||[]).filter(De=>De.dir);$e.length===1&&B(De=>new Set(De).add($e[0].path))},[h]),x.useEffect(()=>{!T||!g||B($e=>{const De=new Set($e);for(const Xe of oI(T))De.add(Xe);return y.has(T)&&De.add(T),De})},[T,g,y]);const ve=x.useCallback($e=>{B(De=>{const Xe=new Set(De);return Xe.has($e)?Xe.delete($e):Xe.add($e),Xe})},[]),ge=x.useRef(null),de=x.useRef(new Map),le=x.useRef({key:"",want:0,attempts:0});x.useEffect(()=>{le.current={key:c,want:bN()==="POP"?de.current.get(c)??0:0,attempts:0}},[c]);const ae=x.useCallback(()=>{const $e=ge.current,De=le.current;!$e||De.key!==c||De.attempts>=3||(De.attempts++,$e.scrollTo({top:De.want,behavior:"instant"}))},[c]),he=x.useCallback(()=>{ge.current&&de.current.set(c,ge.current.scrollTop)},[c]),ye=x.useCallback($e=>{An(yN($e,l?.id)),fr()},[l?.id]),N=x.useCallback($e=>An(_a("history",l?.id,$e)),[l?.id]),[Y,ne]=x.useState(""),[J,W]=x.useState(null),[D,j]=x.useState(!1),[P,Q]=x.useState(!1);x.useEffect(()=>yD(()=>Q(!0)),[]);const Z=x.useRef(null),re=e.panel??null,ee=!re&&s&&!!l&&A,pe=!re&&s&&!!l,be=!re&&A,ze=!re&&(A||s&&!!l&&O),Ie=r+"download?path="+encodeURIComponent(E),Fe=x.useCallback(async()=>{try{const $e=await fetch(r+"shares",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:E})});if(!$e.ok)throw new Error(await $e.text());const De=await $e.json(),Xe=await Js(De.url);W({url:De.url,copied:Xe})}catch($e){Je("Share failed: "+$e.message,!0)}},[r,E]),st=x.useCallback(()=>{if(!E)return N("");N(O?E+"/":E)},[E,O,N]);x.useEffect(()=>{const $e=De=>{(De.metaKey||De.ctrlKey)&&De.key.toLowerCase()==="k"&&(De.preventDefault(),Q(Xe=>!Xe))};return window.addEventListener("keydown",$e),()=>window.removeEventListener("keydown",$e)},[]);const Qe=x.useCallback(()=>{const $e=[],De=(Xe,Dt,eo,or)=>$e.push({icon:Xe,label:Dt,kind:eo,run:or});if(s&&l&&E&&(A&&De("share","Share: "+E,"action",Fe),De("hist","History: "+E,"action",st),A&&De("download","Download: "+E,"action",()=>Z.current?.click())),s&&l&&De("hist","History: whole project","action",()=>N("")),s)for(const Xe of e.projects||[])(!l||Xe.id!==l.id)&&De("folder","Switch to project: "+Xe.name,"project",()=>An("/"+Xe.id));n.auth?.enabled&&De("power","Sign out","action",()=>window.location.href="/auth/logout");for(const Xe of y.keys())De("folder",Xe,"folder",()=>ye(Xe));for(const Xe of m)De("doc",Xe.path,"file",()=>ye(Xe.path));return $e},[s,l,E,A,n.auth?.enabled,y,m,e.projects,Fe,st,N,ye]);x.useEffect(()=>{if(!D)return;const $e=()=>j(!1);return document.addEventListener("click",$e),()=>document.removeEventListener("click",$e)},[D]);const Xt=x.useCallback($e=>y.has($e),[y]);let Jt="app",Bt,Ft;re?Ft=re.body:i.view==="insights"?(Jt="wide",Ft=e.canInsights?v.jsx(DS,{flatFiles:m,heatMap:b,devices:C,scope:i.viewTarget||"",onOpenFile:ye,onOpenFolder:ye,isFolder:Xt}):v.jsx("div",{className:"empty",children:"Insights is for hub admins and org owners."})):i.view==="history"?Ft=v.jsx(t$,{apiBase:r,target:i.viewTarget||"",isFolder:Xt,onOpen:ye,onMeta:ne,onRendered:ae}):E?g?k?Ft=v.jsxs("div",{className:"notfound",children:[v.jsx("h1",{children:"Couldn't find that"}),v.jsxs("p",{children:[v.jsx("code",{children:E})," isn't in this project right now."]}),v.jsx("p",{className:"nf-sub",children:"If it was just created, it may still be uploading or syncing from a teammate's device — this page checks again automatically every few seconds, so refresh or come back in a moment."}),v.jsx("button",{className:"pbtn",onClick:()=>d.invalidateQueries({queryKey:["tree",r]}),children:"Check again"})]}):O?(Jt="read",Ft=v.jsx(lI,{node:y.get(E),heatMap:b,hub:s&&!!l,apiBase:r,onOpen:ye,onFullHistory:N,onRendered:ae})):(Jt=O_.test(E)?"wide":"read",Bt="markdown",Ft=v.jsx(cI,{apiBase:r,path:E,heatMap:b,flatFiles:m,onOpenFile:ye,onMeta:ne,onRendered:ae})):Ft=v.jsx("div",{className:"empty",children:"Loading…"}):S?Ft=v.jsxs(v.Fragment,{children:[v.jsx(I_,{project:l}),e.canInsights&&v.jsx("div",{className:"home-insights",children:v.jsx(DS,{flatFiles:m,heatMap:b,devices:C,onOpenFile:ye,onOpenFolder:ye,isFolder:Xt})})]}):Ft=v.jsx("div",{className:"empty",children:"Select a file to read it."});const Ut=re?re.crumb:E?v.jsx(iI,{path:E,onOpenFolder:ye}):i.view==="insights"?"Insights — "+(i.viewTarget||l?.name||""):i.view==="history"?"History — "+n$(i.viewTarget||"",Xt):S?l.name:null,rr=v.jsx(Ys,{crumb:Ut,meta:Y,actions:v.jsxs(v.Fragment,{children:[ee&&v.jsx(Yt,{id:"share-btn",variant:"toolbar",className:"icon-only",title:"Share","aria-label":"Share",onClick:Fe,children:v.jsx(Kt,{name:"share"})}),pe&&!E&&!i.view&&v.jsxs(Yt,{id:"history-btn",variant:"toolbar",onClick:st,children:[v.jsx(Kt,{name:"hist"})," ",v.jsx("span",{className:"lbl",children:"History"})]}),be&&v.jsx("a",{id:"download",hidden:!0,download:!0,href:Ie,ref:Z,children:"Download"}),ze&&v.jsx(Yt,{id:"more-btn",variant:"toolbar",className:"icon-only",title:"More actions","aria-label":"More actions",onClick:$e=>{$e.stopPropagation(),j(!D)},children:v.jsx(Kt,{name:"dots"})}),D&&v.jsxs("div",{id:"more-menu",role:"menu",children:[pe&&v.jsx("button",{className:"more-item",onClick:st,children:"History"}),be&&v.jsx("button",{className:"more-item",onClick:()=>Z.current?.click(),children:"Download"}),e.canInsights&&v.jsx("button",{className:"more-item",onClick:()=>{e.onClosePanel?.(),An(_a("insights",l?.id,E))},children:"Insights"})]})]})});return v.jsxs(v.Fragment,{children:[v.jsx(Ks,{vault:e.sidebar.vault,projectsNav:e.sidebar.projectsNav,orgBar:e.sidebar.orgBar,tree:v.jsx(rI,{root:h,expanded:U,onToggle:ve,currentPath:T,listingShowing:L,onOpen:ye}),topbar:rr,contentRef:ge,onContentScroll:he,children:v.jsx(oc,{width:Jt,className:Bt,children:Ft})}),J&&v.jsx(vI,{url:J.url,copied:J.copied,onClose:()=>W(null)}),v.jsx(KI,{open:P,onClose:()=>Q(!1),candidates:Qe})]})}function r$({config:e}){const n=wp(),r=M1(),[i,s]=x.useState(null),[l,c]=x.useState(null);x.useEffect(()=>c(null),[n]);const d=x.useMemo(()=>{const U=n.match(/^\/join\/([0-9a-f]+)\/?$/);return U?U[1]:null},[n]),{data:h}=pN(!d),{data:m}=gN(!d),y=!!e.auth.admin,{data:g}=A1(y),b=x.useMemo(()=>D1(n,"hub"),[n]),S=x.useMemo(()=>h&&(h.find(U=>U.id===b.project)||i&&h.find(U=>U.org===i)||h[0])||null,[h,b.project,i]);if(x.useEffect(()=>{document.title=S?S.name+" — BearDrive":e.brand||e.volume||"BearDrive"},[S,e]),d)return v.jsx(o$,{token:d,onDone:async U=>{s(U),await r(),An("/",{replace:!0})}});const _=e.brand||e.volume||"BearDrive",C=S&&m?.find(U=>U.id===S.org)||null,E=y||(C?C.role==="owner":!1),T=v.jsx(Lc,{name:_,onHome:()=>An("/"),search:!!S}),O=e.me?v.jsx(R6,{me:e.me,org:C,admin:y?{pending:g?.length||0,onClick:()=>{c({kind:"hub"}),fr()}}:void 0,onOrgSettings:U=>{c({kind:"org",orgId:U.id}),fr()}}):void 0;if(!h||!m)return v.jsx(Ks,{vault:T,topbar:v.jsx(Ys,{}),children:v.jsx(oc,{children:v.jsx("div",{className:"empty",children:"Loading…"})})});if(!S)return v.jsx(Ks,{vault:T,projectsNav:v.jsx(_S,{projects:h}),orgBar:O,topbar:v.jsx(Ys,{}),children:v.jsx(oc,{width:"read",children:v.jsx(N6,{authEnabled:e.auth.enabled,onCreate:async U=>{if(!U){Je("Give the project a name.",!0);return}try{const B=await Oa("/api/projects",{name:U});await r(),An("/"+B.project.id),Je(`Created “${B.project.name}”.`)}catch(B){Je("Could not create the project: "+B.message,!0)}}})})});const A=l?.kind==="org"?m.find(U=>U.id===l.orgId):null,k=l?.kind==="hub"?{crumb:"Signup & access",body:v.jsx(p6,{})}:A?{crumb:A.name,body:v.jsx(d6,{org:A,projects:h,myEmail:e.me?.email||"",onProjectsChanged:r})}:null,L=b.view==="settings"?{crumb:"Project settings",body:v.jsx(T6,{project:S,org:C})}:b.view==="install"?{crumb:"Installation",body:v.jsx("div",{className:"onboard",children:v.jsx(I_,{project:S})})}:null;return b.project!==S.id?v.jsx(SN,{to:"/"+S.id}):v.jsx(K_,{config:e,apiBase:"/api/p/"+S.id+"/",route:b,hub:!0,project:S,projects:h,canInsights:E,sidebar:{vault:T,projectsNav:v.jsx(_S,{projects:h,currentId:S.id,menu:{active:l?null:b.view==="insights"&&!b.viewTarget?"dashboard":b.view==="install"?"install":b.view==="history"&&!b.viewTarget?"history":b.view==="settings"?"settings":null,onDashboard:()=>{c(null),An(_a("insights",S.id)),fr()},onInstall:()=>{c(null),An(_a("install",S.id)),fr()},onHistory:()=>{c(null),An(_a("history",S.id)),fr()},onSettings:()=>{c(null),An(_a("settings",S.id)),fr()}}}),orgBar:O},panel:k||L,onClosePanel:()=>c(null)},S.id)}function o$({token:e,onDone:n}){return x.useEffect(()=>{let r=!1;return Oa("/api/invites/"+e).then(i=>{r||(Je(`Welcome — you joined the “${i.org.name}” team. Opening its projects…`),n(i.org.id))}).catch(i=>{r||String(i.message).includes("signing in")||(Je("Could not accept the invite: "+i.message,!0),n(null))}),()=>{r=!0}},[e]),v.jsx(Ks,{vault:v.jsx(Lc,{name:"BearDrive"}),topbar:v.jsx(Ys,{}),children:v.jsx(oc,{children:v.jsx("div",{className:"empty",children:"Joining…"})})})}function i$({config:e}){const n=wp(),r=e.volume||"BearDrive";x.useEffect(()=>{document.title=e.brand||r},[e,r]);const i=x.useMemo(()=>D1(n,"volume"),[n]);return v.jsx(K_,{config:e,apiBase:"/api/",route:i,hub:!1,sidebar:{vault:v.jsx(Lc,{name:r,showSignout:e.auth.enabled,search:!0})}})}function a$(){const{data:e}=eT();return v.jsxs(mD,{delayDuration:150,children:[e?e.mode==="hub"?v.jsx(r$,{config:e}):v.jsx(i$,{config:e}):v.jsx(Ks,{vault:v.jsx(Lc,{name:"…",showSignout:!1}),topbar:v.jsx(Ys,{}),children:v.jsx("div",{className:"empty",children:"Loading…"})}),v.jsx(sN,{}),v.jsx(fN,{})]})}const s$=new UR({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});pR.createRoot(document.getElementById("root")).render(v.jsx(x.StrictMode,{children:v.jsx(PR,{client:s$,children:v.jsx(a$,{})})})); +bdrive hooks install --agent `+e.agent}function j6(){try{return localStorage.getItem("bdrive-guide-agent")||"claude"}catch{return"claude"}}function I_({project:e}){const[n,r]=x.useState(j6),i=Fh.find(l=>l.key===n)||Fh[0],s=O6(i,e);return v.jsxs("div",{className:"guide",children:[v.jsx("h1",{className:"in-title",children:e.name}),v.jsx("p",{className:"dl-sub",children:"Mount this project as a folder on any machine and connect your coding agent: files sync both ways in the background, every change is journaled with who made it, and agent reads feed Insights."}),v.jsx("div",{className:"gd-tabs",children:Fh.map(l=>v.jsx("button",{className:"gd-tab"+(l.key===i.key?" active":""),"data-key":l.key,onClick:()=>{r(l.key);try{localStorage.setItem("bdrive-guide-agent",l.key)}catch{}},children:l.label},l.key))}),v.jsxs("div",{className:"gd-body",children:[s.map((l,c)=>v.jsxs("div",{className:"gd-step"+(s.length>1?"":" gd-solo"),children:[v.jsxs("div",{className:"gd-step-head",children:[s.length>1&&v.jsx("span",{className:"gd-num",children:c+1}),v.jsx("span",{className:"gd-step-title",children:l.title})]}),l.desc&&v.jsx("p",{className:"gd-desc",children:l.desc}),l.code&&v.jsx(CS,{code:l.code}),l.extra&&v.jsx("p",{className:"gd-desc gd-extra",children:l.extra})]},c)),i.agent&&v.jsxs("details",{className:"gd-manual",children:[v.jsx("summary",{children:"Or run it yourself"}),v.jsx("p",{className:"gd-desc",children:"Same result, in the folder you want the files. Don't skip the last line — the hooks are what keep every turn starting from the latest state."}),v.jsx(CS,{code:M6(i,e)})]}),v.jsx("p",{className:"gd-done",children:"That's it — the folder now syncs on its own. Every agent turn starts from the latest state, edits appear here (and on every teammate's mount) within seconds, and what your agents read shows up in Insights."})]})]})}function CS({code:e}){const[n,r]=x.useState("Copy");return v.jsxs("pre",{className:"gd-code",children:[v.jsx("code",{children:e}),v.jsx("button",{className:"gd-copy",onClick:async()=>{r(await Js(e)?"Copied":"Copy failed"),setTimeout(()=>r("Copy"),1400)},children:n})]})}const D6=Yc({invite:$p().trim().refine(e=>/join\/([0-9a-f]+)/.test(e)||/^[0-9a-f]{8,}$/.test(e),{message:"That doesn't look like an invite link."})}),z6=Yc({name:$p().trim().min(1,"Give the project a name.").max(60,"Keep it under 60 characters.")});function N6({authEnabled:e,onCreate:n}){const r=uc({resolver:mc(D6),defaultValues:{invite:""}}),i=uc({resolver:mc(z6),defaultValues:{name:""}});return v.jsxs("div",{className:"onboard",children:[v.jsx("h1",{children:"Welcome to BearDrive"}),v.jsx("p",{children:"You're signed in, but you're not part of any project yet."}),e&&v.jsxs("div",{className:"ob-card",children:[v.jsx("h3",{children:"Have an invite link?"}),v.jsx("p",{children:"A teammate can send you a join link. Paste it here:"}),v.jsxs("form",{className:"ob-row",onSubmit:r.handleSubmit(({invite:s})=>{const l=s.match(/join\/([0-9a-f]+)/)||s.match(/^([0-9a-f]{8,})$/);location.href="/join/"+l[1]}),children:[v.jsx("input",{id:"ob-invite",type:"text",placeholder:"https://…/join/…",autoComplete:"off",...r.register("invite")}),v.jsx(Yt,{id:"ob-join",variant:"primary",type:"submit",children:"Join"})]}),r.formState.errors.invite&&v.jsx("p",{className:"field-err",children:r.formState.errors.invite.message})]}),v.jsxs("div",{className:"ob-card",children:[v.jsx("h3",{children:"Or start a new project"}),v.jsx("p",{children:"Create a shared space for your team's files."}),v.jsxs("form",{className:"ob-row",onSubmit:i.handleSubmit(({name:s})=>n(s)),children:[v.jsx("input",{id:"ob-name",type:"text",placeholder:"Project name, e.g. wiki",autoComplete:"off",...i.register("name")}),v.jsx(Yt,{id:"ob-create",variant:"primary",type:"submit",children:"Create"})]}),i.formState.errors.name&&v.jsx("p",{className:"field-err",children:i.formState.errors.name.message})]})]})}function k6(e,n=!0){const r=jn({queryKey:["tree",e],queryFn:()=>Fn(e+"tree"),enabled:n,refetchInterval:15e3}),i=x.useMemo(()=>{const s=[],l=new Map,c=d=>{for(const h of d.children||[])h.dir?(l.set(h.path,h),c(h)):s.push(h)};return r.data&&c(r.data),{flatFiles:s,dirIndex:l}},[r.data]);return{tree:r.data,...i,loaded:!!r.data}}function L6(e,n){return jn({queryKey:["heat",e],queryFn:()=>Fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function I6(e,n,r){return jn({queryKey:["history",e,"prefix",n,20],queryFn:()=>Fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function ES(e,n,r){if(!e)return null;if(!r)return e[n]||null;const i={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(i.human+=l.human||0,i.agent+=l.agent||0,i.share+=l.share||0);return i.human||i.agent||i.share?i:null}function Ws(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function Zu(e){const n=Ws(e);if(!n)return"";let r=n+(n===1?" read":" reads");return e.agent&&(r+=" ("+e.agent+" agent)"),r}function $6(e){const n=Ws(e);return n?n<3?1:n<10?2:n<30?3:4:0}function V6(e,n,r){const i=new Array(e);return new Proxy(i,{get(s,l,c){if(typeof l=="string"){const d=l.charCodeAt(0);if(d>=48&&d<=57){const h=+l;if(Number.isInteger(h)&&h>=0&&hi[y]!==m))&&(i=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return c.updateDeps=d=>{i=d},c}function RS(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const F6=(e,n)=>Math.abs(e-n)<1.01,U6=(e,n,r)=>{let i;return function(...s){e.clearTimeout(i),i=e.setTimeout(()=>n.apply(this,s),r)}};let Ds;const Uh=()=>{if(Ds!==void 0)return Ds;if(typeof navigator>"u")return Ds=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Ds=!0;const e=navigator.maxTouchPoints;return Ds=navigator.platform==="MacIntel"&&e!==void 0&&e>0},TS=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},P6=e=>e,H6=e=>{const n=Math.max(e.startIndex-e.overscan,0),i=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(i);for(let l=0;l{const r=e.scrollElement;if(!r)return;const i=e.targetWindow;if(!i)return;const s=c=>{const{width:d,height:h}=c;n({width:Math.round(d),height:Math.round(h)})};if(s(TS(r)),!i.ResizeObserver)return()=>{};const l=new i.ResizeObserver(c=>{const d=()=>{const h=c[0];if(h?.borderBoxSize){const m=h.borderBoxSize[0];if(m){s({width:m.inlineSize,height:m.blockSize});return}}s(TS(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},gc={passive:!0},q6=typeof window>"u"?!0:"onscrollend"in window,G6=(e,n,r)=>{const i=e.scrollElement;if(!i)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&q6;let c=0;const d=l?null:U6(s,()=>n(c,!1),e.options.isScrollingResetDelay),h=g=>()=>{c=r(i),d?.(),n(c,g)},m=h(!0),y=h(!1);return i.addEventListener("scroll",m,gc),l&&i.addEventListener("scrollend",y,gc),()=>{i.removeEventListener("scroll",m),l&&i.removeEventListener("scrollend",y)}},Z6=(e,n)=>G6(e,n,r=>{const{horizontal:i,isRtl:s}=e.options;return i?r.scrollLeft*(s&&-1||1):r.scrollTop}),K6=(e,n,r)=>{if(r.options.useCachedMeasurements){const i=r.indexFromElement(e),s=r.options.getItemKey(i);return r.itemSizeCache.get(s)??r.options.estimateSize(i)}if(n?.borderBoxSize){const i=n.borderBoxSize[0];if(i)return Math.round(i[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const i=r.indexFromElement(e),s=r.options.getItemKey(i),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},Y6=(e,{adjustments:n=0,behavior:r},i)=>{var s,l;(l=(s=i.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[i.options.horizontal?"left":"top"]:e+n,behavior:r})},Q6=Y6;class X6{constructor(n){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var r,i,s;return((s=(i=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:i.now)==null?void 0:s.call(i))??Date.now()},this.observer=(()=>{let r=null;const i=()=>r||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:r=new this.targetWindow.ResizeObserver(s=>{s.forEach(l=>{const c=()=>{const d=l.target,h=this.indexFromElement(d);if(!d.isConnected){this.observer.unobserve(d);for(const[m,y]of this.elementsCache)if(y===d){this.elementsCache.delete(m);break}return}this.shouldMeasureDuringScroll(h)&&this.resizeItem(h,this.options.measureElement(d,l,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(c):c()})}));return{disconnect:()=>{var s;(s=i())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=i())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=i())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var i,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:P6,rangeExtractor:H6,onChange:()=>{},measureElement:K6,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,anchorTo:"start",followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",useCachedMeasurements:!1};for(const b in r){const S=r[b];S!==void 0&&(l[b]=S)}const c=this.options;let d=null,h=null,m=!1;if(c!==void 0&&c.enabled&&l.enabled&&l.anchorTo==="end"&&this.scrollElement!==null){const b=c.count,S=l.count,_=this.getMeasurements(),C=b>0?((i=_[0])==null?void 0:i.key)??c.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??c.getItemKey(b-1):null;if(S!==b||b>0&&S>0&&(l.getItemKey(0)!==C||l.getItemKey(S-1)!==E)){m=!0;const A=b>0?this.getVirtualItemForOffset(this.getScrollOffset())??_[0]:null;A&&(d=[A.key,this.getScrollOffset()-A.start]);const k=l.followOnAppend===!0?"auto":l.followOnAppend||null;k&&S>b&&this.isAtEnd(c.scrollEndThreshold)&&(b===0||l.getItemKey(S-1)!==E)&&(h=k)}}this.options=l,m&&(this.pendingMin=0,this.itemSizeCacheVersion++);let y=!1,g=0;if(d&&this.scrollOffset!==null){const[b,S]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var i,s;(s=(i=this.options).onChange)==null||s.call(i,this,r)},this.maybeNotify=ba(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),r=>{this.notify(r)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(r=>r()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var r;const i=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==i){if(this.cleanup(),!i){this.maybeNotify();return}if(this.scrollElement=i,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((r=this.scrollElement)==null?void 0:r.window)??null,this.elementsCache.forEach(l=>{this.observer.observe(l)}),this.unsubs.push(this.options.observeElementRect(this,l=>{this.scrollRect=l,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(l,c)=>{if(c&&this._intendedScrollOffset===null&&l===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(l-this._intendedScrollOffset)<1.5&&(l=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;const d=this.getScrollOffset();this.scrollDirection=c?d===l?this.scrollDirection:d{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},d=()=>{this._iosTouching=!1,!(!Uh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",c,gc),l.addEventListener("touchend",d,gc),this.unsubs.push(()=>{l.removeEventListener("touchstart",c),l.removeEventListener("touchend",d),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}const s=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,s&&this.scrollElement&&this.options.enabled){const[l,c,d,h]=s;l!==null&&!d&&(Uh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?h!==0&&(this._iosDeferredAdjustment+=h):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),d&&this.scrollToEnd({behavior:d})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const r=this.getScrollOffset(),i=this.getMaxScrollOffset();if(r<0||r>i)return;const s=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(r,{adjustments:this.scrollAdjustments+=s,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=ba(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(r,i,s,l,c,d,h,m)=>(this.prevLanes!==void 0&&this.prevLanes!==d&&(this.lanesChangedFlag=!0),this.prevLanes=d,this.pendingMin=null,{count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:c,lanes:d,laneAssignmentMode:h,gap:m}),{key:!1}),this.getMeasurements=ba(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:c,lanes:d,laneAssignmentMode:h,gap:m},y)=>{const g=this.itemSizeCache;if(!c)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>r)for(const T of this.laneAssignments.keys())T>=r&&this.laneAssignments.delete(T);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(T=>{this.itemSizeCache.set(T.key,T.size)}));const b=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===r&&(this.lanesSettling=!1),d===1){const T=r*2;let O=this._flatMeasurements;if(!O||O.length0&&L.set(O.subarray(0,b*2)),O=L,this._flatMeasurements=O}let A;if(b===0)A=i+s;else{const L=b-1;A=O[L*2]+O[L*2+1]+m}for(let L=b;L1){k=A;const ge=_[k],de=ge!==void 0?S[ge]:void 0;L=de?de.end+m:i+s}else if(E===d){let ge=0,de=C[0],le=_[0];for(let ae=1;aethis.options.debug}),this.calculateRange=ba(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,i,s,l)=>r.length===0||i===0?(this.range=null,null):(this.range=W6(r,i,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=ba(()=>{let r=null,i=null;const s=this.calculateRange();return s&&(r=s.startIndex,i=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,i]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,i]},(r,i,s,l,c)=>l===null||c===null?[]:r({startIndex:l,endIndex:c,overscan:i,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const i=this.options.indexAttribute,s=r.getAttribute(i);return s?parseInt(s,10):(console.warn(`Missing attribute name '${i}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var i;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((i=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:i.index);if(s!==void 0&&this.range){const l=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),c=Math.max(0,s-l),d=Math.min(this.options.count-1,s+l);return r>=c&&r<=d}return!0},this.measureElement=r=>{if(!r){this.elementsCache.forEach((c,d)=>{c.isConnected||(this.observer.unobserve(c),this.elementsCache.delete(d))});return}const i=this.indexFromElement(r),s=this.options.getItemKey(i),l=this.elementsCache.get(s);l!==r&&(l&&this.observer.unobserve(l),this.observer.observe(r),this.elementsCache.set(s,r)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(i)&&this.resizeItem(i,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,i)=>{var s,l;if(r<0||r>=this.options.count)return;let c,d,h;const m=this._flatMeasurements;if(this.options.lanes===1&&m!==null)h=this.options.getItemKey(r),d=m[r*2],c=m[r*2+1];else{const b=this.measurementsCache[r];if(!b)return;h=b.key,d=b.start,c=b.size}const y=this.itemSizeCache.get(h)??c,g=i-y;if(g!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,S=b?this.getTotalSize():0,_=((l=this.scrollState)==null?void 0:l.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[r]??{index:r,key:h,start:d,size:c,end:d+c,lane:0},g,this):d[this.getVirtualIndexes(),this.getMeasurements()],(r,i)=>{const s=[];for(let l=0,c=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const i=this.getMeasurements();if(i.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,c=$_(0,i.length-1,l?d=>s[d*2]:d=>RS(i[d]).start,r);return RS(i[c])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const r=this.scrollElement.document.documentElement;return this.options.horizontal?r.scrollWidth-this.scrollElement.innerWidth:r.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(r=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=r,this.getOffsetForAlignment=(r,i,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),c=this.getScrollOffset();i==="auto"&&(i=r>=c+l?"end":"start"),i==="center"?r+=(s-l)/2:i==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,i="auto")=>{r=Math.max(0,Math.min(r,this.options.count-1));const s=this.getSize(),l=this.getScrollOffset(),c=this.measurementsCache[r];if(!c)return;if(i==="auto")if(c.end>=l+s-this.options.scrollPaddingEnd)i="end";else if(c.start<=l+this.options.scrollPaddingStart)i="start";else return[l,i];if(i==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),i];const d=i==="end"?c.end+this.options.scrollPaddingEnd:c.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,i,c.size),i]},this.scrollToOffset=(r,{align:i="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,i),c=this.now();this.scrollState={index:null,align:i,behavior:s,startedAt:c,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:i="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,i);if(!l)return;const[c,d]=l,h=this.now();this.scrollState={index:r,align:d,behavior:s,startedAt:h,lastTargetOffset:c,stableFrames:0},this._scrollToOffset(c,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollBy=(r,{behavior:i="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:i,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:r="auto"}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:"end",behavior:r});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:r})},this.getTotalSize=()=>{var r;const i=this.getMeasurements();let s;if(i.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=i.length-1,c=this._flatMeasurements;c!=null?s=c[l*2]+c[l*2+1]:s=((r=i[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let c=i.length-1;for(;c>=0&&l.some(d=>d===null);){const d=i[c];l[d.lane]===null&&(l[d.lane]=d.end),c--}s=Math.max(...l.filter(d=>d!==null))}return Math.max(s-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const r=[];if(this.itemSizeCache.size===0)return r;const i=this.getMeasurements();for(const s of i)s&&this.itemSizeCache.has(s.key)&&r.push({index:s.index,key:s.key,start:s.start,size:s.size,end:s.end,lane:s.lane});return r},this._scrollToOffset=(r,{adjustments:i,behavior:s})=>{this._intendedScrollOffset=r+(i??0),this.options.scrollToFn(r,{behavior:s,adjustments:i},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(n)}applyScrollAdjustment(n,r){n!==0&&(Uh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=n:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=n,behavior:r}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const i=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=i?i[0]:this.scrollState.lastTargetOffset,l=1,c=s!==this.scrollState.lastTargetOffset;if(!c&&F6(s,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=l){this.getScrollOffset()!==s&&this._scrollToOffset(s,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,c){const d=this.getSize()||600,h=Math.abs(s-this.getScrollOffset()),m=this.scrollState.behavior==="smooth"&&h>d;this.scrollState.lastTargetOffset=s,m||(this.scrollState.behavior="auto"),this._scrollToOffset(s,{adjustments:void 0,behavior:m?"smooth":"auto"})}this.scheduleScrollReconcile()}}const $_=(e,n,r,i)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(li)n=s-1;else return s}return e>0?e-1:0};function J6(e,n,r){let i=0;for(;i<=n;){const s=(i+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return i>0?i-1:0}function W6(e,n,r,i,s){const l=e.length-1;if(e.length<=i)return{startIndex:0,endIndex:l};if(i===1&&s!==null){const m=J6(s,l,r);let y=m;const g=r+n;for(;ye[m].start,r),h=d;if(i===1)for(;h1){const m=Array(i).fill(0);for(;hg=0&&y.some(g=>g>=r);){const g=e[d];y[g.lane]=g.start,d--}d=Math.max(0,d-d%i),h=Math.min(l,h+(i-1-h%i))}return{startIndex:d,endIndex:h}}const Ph=typeof document<"u"?x.useLayoutEffect:x.useEffect;function eI({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...i}){const s=x.useReducer(m=>m+1,0)[1],l=x.useRef({enabled:n,mode:r,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});l.current.enabled=n,l.current.mode=r;const c=m=>{const y=l.current;if(!y.enabled||!y.container)return;const g=m.getTotalSize();if(g!==y.lastSize){y.lastSize=g;const T=m.options.horizontal?"width":"height";y.container.style[T]=`${g}px`}const b=!!m.options.horizontal,S=y.mode==="transform",_=b?"left":"top",C=m.options.scrollMargin,E=m.getVirtualItems();for(const T of E){const O=T.start-C,A=m.elementsCache.get(T.key);A&&y.lastPositions.get(A)!==O&&(y.lastPositions.set(A,O),S?A.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:A.style[_]=`${O}px`)}},d={...i,onChange:(m,y)=>{var g;const b=l.current;let S=!0;if(b.enabled){c(m);const _=m.range,C=b.prevRange;S=!C||C.isScrolling!==m.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,S&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:m.isScrolling}:null)}S&&(e&&y?Si.flushSync(s):s()),(g=i.onChange)==null||g.call(i,m,y)}},[h]=x.useState(()=>{const m=new X6(d);return Object.assign(m,{containerRef:y=>{const g=l.current;if(g.container=y,g.lastSize=null,y&&g.enabled){const b=m.getTotalSize();g.lastSize=b;const S=m.options.horizontal?"width":"height";y.style[S]=`${b}px`}}})});return h.setOptions(d),Ph(()=>h._didMount(),[]),Ph(()=>h._willUpdate()),Ph(()=>{c(h)}),h}function tI(e){return eI({observeElementRect:B6,observeElementOffset:Z6,scrollToFn:Q6,...e})}function nI(e,n){const r=[],i=(s,l)=>{for(const c of s)r.push({node:c,depth:l}),c.dir&&n.has(c.path)&&i(c.children||[],l+1)};return i(e?.children||[],0),r}function rI(e){const{root:n,expanded:r,onToggle:i,currentPath:s,listingShowing:l,onOpen:c}=e,d=x.useRef(null),h=x.useMemo(()=>nI(n,r),[n,r]),m=tI({count:h.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>h[y].node.path});return x.useEffect(()=>{if(!s)return;const y=h.findIndex(g=>g.node.path===s);y>=0&&m.scrollToIndex(y,{align:"auto"})},[s,h]),v.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:v.jsx("div",{style:{height:m.getTotalSize(),position:"relative"},children:m.getVirtualItems().map(y=>{const{node:g,depth:b}=h[y.index],S=g.dir?r.has(g.path):!1,_=()=>{if(g.dir&&s===g.path&&l){i(g.path);return}c(g.path),g.dir||fr()};return v.jsxs("div",{className:"row "+(g.dir?"dir":"file")+(s===g.path?" active":"")+(g.dir&&!S?" collapsed":""),"data-path":g.path,tabIndex:0,role:"button",title:g.name,"aria-expanded":g.dir?S:void 0,style:{position:"absolute",top:0,left:0,right:0,transform:`translateY(${y.start}px)`,paddingLeft:8+b*13},onClick:_,onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),_())},children:[Array.from({length:b},(C,E)=>v.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),v.jsx("span",{className:"chev",onClick:C=>{g.dir&&(C.stopPropagation(),i(g.path))},children:v.jsx(Kt,{name:"chevd"})}),v.jsx("span",{className:"ticon",children:v.jsx(Kt,{name:g.dir?"folder":"doc"})}),v.jsx("span",{className:"label",children:g.name})]},y.key)})})})}function oI(e){const n=e.split("/"),r=[];let i="";for(let s=0;s{i=i?i+"/"+s:s;const c=i,d=l===r.length-1;return v.jsxs("span",{children:[l>0&&v.jsx("span",{className:"crumb-sep",children:"/"}),d?v.jsx("span",{children:s}):v.jsx("span",{className:"crumb-seg",title:c,onClick:()=>n(c),children:s})]},c)})})}const aI={add:"plus",edit:"edit",delete:"x"},sI={add:"added",edit:"edited",delete:"deleted"};function V_({entry:e,onOpen:n}){const[r,i]=x.useState(!1),s=e.kind==="put"?"edit":e.kind,l=e.user_name?`${e.user_name} <${e.user}>`:e.user||e.author||"unknown",c=[e.device.name||e.device.id,e.device.os,e.device.ip].filter(Boolean).join(" · "),d=s!=="delete",h=m=>{m.target.tagName!=="A"&&d&&n(e.path)};return v.jsxs("div",{className:"hentry "+s+(d?" clickable":""),tabIndex:d?0:void 0,role:d?"button":void 0,onClick:h,onKeyDown:m=>{d&&(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),n(e.path))},children:[v.jsxs("div",{className:"hline",children:[v.jsx("span",{className:"hkind",children:v.jsx(Kt,{name:aI[s]||"dot"})}),v.jsx("span",{className:"hpath",children:e.path}),v.jsx("span",{className:"htag",children:sI[s]||s}),v.jsx("span",{className:"htime",children:new Date(e.time).toLocaleString()})]}),v.jsxs("div",{className:"hmeta",children:[v.jsx("span",{className:"hwho",children:l}),v.jsx("span",{className:"hdev",children:c}),v.jsx("span",{className:"hsize",children:e.size?A_(e.size):""})]}),e.note&&v.jsx("div",{className:"hnote"+(r?" open":""),tabIndex:0,role:"button",title:r?"Collapse note":"Show full note","aria-expanded":r,onClick:m=>{m.stopPropagation(),m.target.tagName!=="A"&&i(!r)},onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),m.stopPropagation(),i(!r))},children:e.note.split(/(https?:\/\/\S+)/).map((m,y)=>/^https?:\/\//.test(m)?v.jsx("a",{href:m,target:"_blank",rel:"noopener",children:m},y):m)})]})}function lI(e){const{node:n,heatMap:r,onOpen:i}=e,s=(n.children||[]).slice().sort((m,y)=>Number(y.dir||!1)-Number(m.dir||!1)||m.name.localeCompare(y.name)),l=s.filter(m=>m.dir).length,c=s.length-l,d=[];l&&d.push(l+(l===1?" folder":" folders")),c&&d.push(c+(c===1?" file":" files"));const h=ES(r,n.path,!0);return h&&d.push(Zu(h)+" in 30 days"),v.jsxs("div",{className:"dirlist",children:[v.jsxs("h1",{className:"dl-title",children:[v.jsx("span",{className:"dl-title-icon",children:v.jsx(Kt,{name:"folder"})}),v.jsx("span",{children:n.name})]}),v.jsx("p",{className:"dl-sub",children:d.join(" · ")||"Empty folder"}),s.length===0?v.jsx("div",{className:"dl-empty",children:"Nothing in this folder yet."}):v.jsx("div",{className:"dl-items",children:s.map(m=>{let y="";if(m.dir){const b=(m.children||[]).length;y=b+(b===1?" item":" items")}else y=[m.size?A_(m.size):"",m.time?new Date(m.time).toLocaleDateString():""].filter(Boolean).join(" · ");const g=ES(r,m.path,!!m.dir);return g&&(y=Zu(g)+(y?" · "+y:"")),v.jsxs("div",{className:"dl-row",tabIndex:0,role:"button",title:m.path,onClick:()=>i(m.path),onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),i(m.path))},children:[v.jsx("span",{className:"ticon",children:v.jsx(Kt,{name:m.dir?"folder":"doc"})}),v.jsx("span",{className:"dl-name",children:m.name}),g&&v.jsx("span",{className:"heatdot lvl"+$6(g),title:Zu(g)+" in 30 days"}),v.jsx("span",{className:"dl-meta",children:y})]},m.path)})}),e.hub&&v.jsx(uI,{apiBase:e.apiBase,prefix:n.path+"/",onOpen:i,onFullHistory:()=>e.onFullHistory(n.path+"/"),onRendered:e.onRendered})]})}function uI(e){const n=I6(e.apiBase,e.prefix,!0),{onRendered:r}=e;return x.useEffect(()=>{n&&n.length&&r&&r()},[n,r]),!n||n.length===0?null:v.jsxs("div",{className:"dl-history",children:[v.jsx("h3",{className:"dl-h3",children:"Recent changes"}),v.jsx("div",{className:"history dl-hlist",children:n.map((i,s)=>v.jsx(V_,{entry:i,onOpen:e.onOpen},s))}),v.jsx("button",{className:"ai-btn dl-more",onClick:e.onFullHistory,children:"Full history"})]})}function cI(e){const{apiBase:n,path:r,onMeta:i}=e,s=n+"file?path="+encodeURIComponent(r);return x.useEffect(()=>()=>i(""),[r,i]),s6.test(r)?v.jsx(dI,{...e}):O_.test(r)?v.jsx("iframe",{className:"htmlview",sandbox:"allow-scripts",src:s,title:r,onLoad:e.onRendered}):l6.test(r)?v.jsx(mI,{src:s,alt:r,onRendered:e.onRendered}):u6.test(r)?v.jsx(pI,{...e,fileURL:s}):v.jsxs("div",{className:"filecard",children:[v.jsx("div",{className:"name",children:r.split("/").pop()}),v.jsx("p",{children:"No preview for this file type."}),v.jsx("a",{className:"btn",download:!0,href:n+"download?path="+encodeURIComponent(r),children:"Download"})]})}function dI(e){const{apiBase:n,path:r,heatMap:i,flatFiles:s,onOpenFile:l,onMeta:c,onRendered:d}=e,{data:h,error:m}=jn({queryKey:["render",n,r],queryFn:()=>Fn(n+"render?path="+encodeURIComponent(r))}),y=x.useMemo(()=>h?hI(h.html,r,n):"",[h,r,n]);return x.useEffect(()=>{if(!h)return;const g=[];h.author&&g.push(h.author+(h.device?" on "+h.device:"")),h.time&&g.push(new Date(h.time).toLocaleString());const b=i&&i[h.path];b&&Ws(b)&&g.push(Zu(b)+" / 30d"),c(g.join(" · ")),d?.()},[h,i,c,d]),m?v.jsxs("div",{className:"empty",children:["Could not load file: ",m.message]}):h?v.jsx("div",{dangerouslySetInnerHTML:{__html:y},onClick:g=>fI(g,r,s,l)}):null}function fI(e,n,r,i){const s=e.target.closest("a");if(!s||!e.currentTarget.contains(s))return;const l=s.getAttribute("href")||"",c=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"";l.startsWith("wiki:")?(e.preventDefault(),gI(decodeURIComponent(l.slice(5)),r,i)):/^([a-z]+:|\/|#)/i.test(l)||(e.preventDefault(),i(M_(c,decodeURIComponent(l))))}function hI(e,n,r){const i=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"",s=c=>r+"file?path="+encodeURIComponent(c),l=new DOMParser().parseFromString(e,"text/html");for(const c of l.querySelectorAll("img")){const d=c.getAttribute("src")||"";/^([a-z]+:|\/)/i.test(d)||c.setAttribute("src",s(M_(i,d)))}for(const c of l.querySelectorAll("a")){const d=c.getAttribute("href")||"";/^https?:/i.test(d)&&(c.setAttribute("target","_blank"),c.setAttribute("rel","noopener"))}return l.body.innerHTML}function mI({src:e,alt:n,onRendered:r}){return v.jsx("img",{src:e,alt:n,onLoad:r})}function pI(e){const{path:n,fileURL:r,onRendered:i}=e,{data:s,error:l}=jn({queryKey:["text",r],queryFn:async()=>{const c=await fetch(r);if(!c.ok)throw new Error(await c.text());return c.text()}});return x.useEffect(()=>{s!=null&&i?.()},[s,i]),l?v.jsxs("div",{className:"empty",children:["Could not load file: ",l.message]}):s==null?null:v.jsx("pre",{className:"plain",children:s},n)}function gI(e,n,r){const i=e.toLowerCase(),s=n.find(l=>l.path.toLowerCase()===i||l.path.toLowerCase()===i+".md")||n.find(l=>{const c=l.name.toLowerCase();return c===i||c===i+".md"});s&&r(s.path)}function vI({url:e,copied:n,onClose:r}){const i=e.split("/s/")[1];return v.jsx(bp,{open:!0,onOpenChange:s=>!s&&r(),children:v.jsxs(Sp,{className:"modal",showCloseButton:!1,children:[v.jsx(Ic,{asChild:!0,children:v.jsx("h3",{children:"Public link created"})}),v.jsxs("p",{children:[v.jsx("b",{children:"Anyone with this link can view this file"})," — no account needed. It always shows the latest version until you revoke it."]}),v.jsx("div",{className:"modal-url",children:e}),v.jsxs("div",{className:"modal-actions",children:[v.jsx(Yt,{variant:"primary",onClick:()=>Js(e).then(s=>Je(s?"Copied.":"Select and copy the link above.")),children:n?"Copied ✓":"Copy link"}),v.jsx(Yt,{variant:"subtle",onClick:()=>window.open(e,"_blank"),children:"Open"}),v.jsx(Yt,{variant:"subtle",className:"ai-del",onClick:async()=>{try{await Ao("DELETE","/api/shares/"+i),Je("Link revoked — it no longer works."),r()}catch(s){Je(s.message,!0)}},children:"Revoke"}),v.jsx(Yt,{variant:"subtle",onClick:r,children:"Done"})]})]})})}var OS=1,yI=.9,bI=.8,SI=.17,Hh=.1,Bh=.999,xI=.9999,wI=.99,_I=/[\\\/_+.#"@\[\(\{&]/,CI=/[\\\/_+.#"@\[\(\{&]/g,EI=/[\s-]/,F_=/[\s-]/g;function Am(e,n,r,i,s,l,c){if(l===n.length)return s===e.length?OS:wI;var d=`${s},${l}`;if(c[d]!==void 0)return c[d];for(var h=i.charAt(l),m=r.indexOf(h,s),y=0,g,b,S,_;m>=0;)g=Am(e,n,r,i,m+1,l+1,c),g>y&&(m===s?g*=OS:_I.test(e.charAt(m-1))?(g*=bI,S=e.slice(s,m-1).match(CI),S&&s>0&&(g*=Math.pow(Bh,S.length))):EI.test(e.charAt(m-1))?(g*=yI,_=e.slice(s,m-1).match(F_),_&&s>0&&(g*=Math.pow(Bh,_.length))):(g*=SI,s>0&&(g*=Math.pow(Bh,m-s))),e.charAt(m)!==n.charAt(l)&&(g*=xI)),(gg&&(g=b*Hh)),g>y&&(y=g),m=r.indexOf(h,m+1);return c[d]=y,y}function AS(e){return e.toLowerCase().replace(F_," ")}function RI(e,n,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,Am(e,n,AS(e),AS(n),0,0,{})}var zs='[cmdk-group=""]',qh='[cmdk-group-items=""]',TI='[cmdk-group-heading=""]',U_='[cmdk-item=""]',MS=`${U_}:not([aria-disabled="true"])`,Mm="cmdk-item-select",Sa="data-value",OI=(e,n,r)=>RI(e,n,r),P_=x.createContext(void 0),dl=()=>x.useContext(P_),H_=x.createContext(void 0),Vp=()=>x.useContext(H_),B_=x.createContext(void 0),q_=x.forwardRef((e,n)=>{let r=xa(()=>{var j,P;return{search:"",value:(P=(j=e.value)!=null?j:e.defaultValue)!=null?P:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),i=xa(()=>new Set),s=xa(()=>new Map),l=xa(()=>new Map),c=xa(()=>new Set),d=G_(e),{label:h,children:m,value:y,onValueChange:g,filter:b,shouldFilter:S,loop:_,disablePointerSelection:C=!1,vimBindings:E=!0,...T}=e,O=hn(),A=hn(),k=hn(),L=x.useRef(null),U=VI();bi(()=>{if(y!==void 0){let j=y.trim();r.current.value=j,B.emit()}},[y]),bi(()=>{U(6,ae)},[]);let B=x.useMemo(()=>({subscribe:j=>(c.current.add(j),()=>c.current.delete(j)),snapshot:()=>r.current,setState:(j,P,Q)=>{var Z,re,ee,pe;if(!Object.is(r.current[j],P)){if(r.current[j]=P,j==="search")le(),ge(),U(1,de);else if(j==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let be=document.getElementById(k);be?be.focus():(Z=document.getElementById(O))==null||Z.focus()}if(U(7,()=>{var be;r.current.selectedItemId=(be=he())==null?void 0:be.id,B.emit()}),Q||U(5,ae),((re=d.current)==null?void 0:re.value)!==void 0){let be=P??"";(pe=(ee=d.current).onValueChange)==null||pe.call(ee,be);return}}B.emit()}},emit:()=>{c.current.forEach(j=>j())}}),[]),H=x.useMemo(()=>({value:(j,P,Q)=>{var Z;P!==((Z=l.current.get(j))==null?void 0:Z.value)&&(l.current.set(j,{value:P,keywords:Q}),r.current.filtered.items.set(j,ve(P,Q)),U(2,()=>{ge(),B.emit()}))},item:(j,P)=>(i.current.add(j),P&&(s.current.has(P)?s.current.get(P).add(j):s.current.set(P,new Set([j]))),U(3,()=>{le(),ge(),r.current.value||de(),B.emit()}),()=>{l.current.delete(j),i.current.delete(j),r.current.filtered.items.delete(j);let Q=he();U(4,()=>{le(),Q?.getAttribute("id")===j&&de(),B.emit()})}),group:j=>(s.current.has(j)||s.current.set(j,new Set),()=>{l.current.delete(j),s.current.delete(j)}),filter:()=>d.current.shouldFilter,label:h||e["aria-label"],getDisablePointerSelection:()=>d.current.disablePointerSelection,listId:O,inputId:k,labelId:A,listInnerRef:L}),[]);function ve(j,P){var Q,Z;let re=(Z=(Q=d.current)==null?void 0:Q.filter)!=null?Z:OI;return j?re(j,r.current.search,P):0}function ge(){if(!r.current.search||d.current.shouldFilter===!1)return;let j=r.current.filtered.items,P=[];r.current.filtered.groups.forEach(Z=>{let re=s.current.get(Z),ee=0;re.forEach(pe=>{let be=j.get(pe);ee=Math.max(be,ee)}),P.push([Z,ee])});let Q=L.current;ye().sort((Z,re)=>{var ee,pe;let be=Z.getAttribute("id"),ze=re.getAttribute("id");return((ee=j.get(ze))!=null?ee:0)-((pe=j.get(be))!=null?pe:0)}).forEach(Z=>{let re=Z.closest(qh);re?re.appendChild(Z.parentElement===re?Z:Z.closest(`${qh} > *`)):Q.appendChild(Z.parentElement===Q?Z:Z.closest(`${qh} > *`))}),P.sort((Z,re)=>re[1]-Z[1]).forEach(Z=>{var re;let ee=(re=L.current)==null?void 0:re.querySelector(`${zs}[${Sa}="${encodeURIComponent(Z[0])}"]`);ee?.parentElement.appendChild(ee)})}function de(){let j=ye().find(Q=>Q.getAttribute("aria-disabled")!=="true"),P=j?.getAttribute(Sa);B.setState("value",P||void 0)}function le(){var j,P,Q,Z;if(!r.current.search||d.current.shouldFilter===!1){r.current.filtered.count=i.current.size;return}r.current.filtered.groups=new Set;let re=0;for(let ee of i.current){let pe=(P=(j=l.current.get(ee))==null?void 0:j.value)!=null?P:"",be=(Z=(Q=l.current.get(ee))==null?void 0:Q.keywords)!=null?Z:[],ze=ve(pe,be);r.current.filtered.items.set(ee,ze),ze>0&&re++}for(let[ee,pe]of s.current)for(let be of pe)if(r.current.filtered.items.get(be)>0){r.current.filtered.groups.add(ee);break}r.current.filtered.count=re}function ae(){var j,P,Q;let Z=he();Z&&(((j=Z.parentElement)==null?void 0:j.firstChild)===Z&&((Q=(P=Z.closest(zs))==null?void 0:P.querySelector(TI))==null||Q.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function he(){var j;return(j=L.current)==null?void 0:j.querySelector(`${U_}[aria-selected="true"]`)}function ye(){var j;return Array.from(((j=L.current)==null?void 0:j.querySelectorAll(MS))||[])}function N(j){let P=ye()[j];P&&B.setState("value",P.getAttribute(Sa))}function Y(j){var P;let Q=he(),Z=ye(),re=Z.findIndex(pe=>pe===Q),ee=Z[re+j];(P=d.current)!=null&&P.loop&&(ee=re+j<0?Z[Z.length-1]:re+j===Z.length?Z[0]:Z[re+j]),ee&&B.setState("value",ee.getAttribute(Sa))}function ne(j){let P=he(),Q=P?.closest(zs),Z;for(;Q&&!Z;)Q=j>0?II(Q,zs):$I(Q,zs),Z=Q?.querySelector(MS);Z?B.setState("value",Z.getAttribute(Sa)):Y(j)}let J=()=>N(ye().length-1),W=j=>{j.preventDefault(),j.metaKey?J():j.altKey?ne(1):Y(1)},D=j=>{j.preventDefault(),j.metaKey?N(0):j.altKey?ne(-1):Y(-1)};return x.createElement(Ue.div,{ref:n,tabIndex:-1,...T,"cmdk-root":"",onKeyDown:j=>{var P;(P=T.onKeyDown)==null||P.call(T,j);let Q=j.nativeEvent.isComposing||j.keyCode===229;if(!(j.defaultPrevented||Q))switch(j.key){case"n":case"j":{E&&j.ctrlKey&&W(j);break}case"ArrowDown":{W(j);break}case"p":case"k":{E&&j.ctrlKey&&D(j);break}case"ArrowUp":{D(j);break}case"Home":{j.preventDefault(),N(0);break}case"End":{j.preventDefault(),J();break}case"Enter":{j.preventDefault();let Z=he();if(Z){let re=new Event(Mm);Z.dispatchEvent(re)}}}}},x.createElement("label",{"cmdk-label":"",htmlFor:H.inputId,id:H.labelId,style:UI},h),Xc(e,j=>x.createElement(H_.Provider,{value:B},x.createElement(P_.Provider,{value:H},j))))}),AI=x.forwardRef((e,n)=>{var r,i;let s=hn(),l=x.useRef(null),c=x.useContext(B_),d=dl(),h=G_(e),m=(i=(r=h.current)==null?void 0:r.forceMount)!=null?i:c?.forceMount;bi(()=>{if(!m)return d.item(s,c?.id)},[m]);let y=Z_(s,l,[e.value,e.children,l],e.keywords),g=Vp(),b=Io(U=>U.value&&U.value===y.current),S=Io(U=>m||d.filter()===!1?!0:U.search?U.filtered.items.get(s)>0:!0);x.useEffect(()=>{let U=l.current;if(!(!U||e.disabled))return U.addEventListener(Mm,_),()=>U.removeEventListener(Mm,_)},[S,e.onSelect,e.disabled]);function _(){var U,B;C(),(B=(U=h.current).onSelect)==null||B.call(U,y.current)}function C(){g.setState("value",y.current,!0)}if(!S)return null;let{disabled:E,value:T,onSelect:O,forceMount:A,keywords:k,...L}=e;return x.createElement(Ue.div,{ref:Aa(l,n),...L,id:s,"cmdk-item":"",role:"option","aria-disabled":!!E,"aria-selected":!!b,"data-disabled":!!E,"data-selected":!!b,onPointerMove:E||d.getDisablePointerSelection()?void 0:C,onClick:E?void 0:_},e.children)}),MI=x.forwardRef((e,n)=>{let{heading:r,children:i,forceMount:s,...l}=e,c=hn(),d=x.useRef(null),h=x.useRef(null),m=hn(),y=dl(),g=Io(S=>s||y.filter()===!1?!0:S.search?S.filtered.groups.has(c):!0);bi(()=>y.group(c),[]),Z_(c,d,[e.value,e.heading,h]);let b=x.useMemo(()=>({id:c,forceMount:s}),[s]);return x.createElement(Ue.div,{ref:Aa(d,n),...l,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&x.createElement("div",{ref:h,"cmdk-group-heading":"","aria-hidden":!0,id:m},r),Xc(e,S=>x.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?m:void 0},x.createElement(B_.Provider,{value:b},S))))}),jI=x.forwardRef((e,n)=>{let{alwaysRender:r,...i}=e,s=x.useRef(null),l=Io(c=>!c.search);return!r&&!l?null:x.createElement(Ue.div,{ref:Aa(s,n),...i,"cmdk-separator":"",role:"separator"})}),DI=x.forwardRef((e,n)=>{let{onValueChange:r,...i}=e,s=e.value!=null,l=Vp(),c=Io(m=>m.search),d=Io(m=>m.selectedItemId),h=dl();return x.useEffect(()=>{e.value!=null&&l.setState("search",e.value)},[e.value]),x.createElement(Ue.input,{ref:n,...i,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":h.listId,"aria-labelledby":h.labelId,"aria-activedescendant":d,id:h.inputId,type:"text",value:s?e.value:c,onChange:m=>{s||l.setState("search",m.target.value),r?.(m.target.value)}})}),zI=x.forwardRef((e,n)=>{let{children:r,label:i="Suggestions",...s}=e,l=x.useRef(null),c=x.useRef(null),d=Io(m=>m.selectedItemId),h=dl();return x.useEffect(()=>{if(c.current&&l.current){let m=c.current,y=l.current,g,b=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let S=m.offsetHeight;y.style.setProperty("--cmdk-list-height",S.toFixed(1)+"px")})});return b.observe(m),()=>{cancelAnimationFrame(g),b.unobserve(m)}}},[]),x.createElement(Ue.div,{ref:Aa(l,n),...s,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":d,"aria-label":i,id:h.listId},Xc(e,m=>x.createElement("div",{ref:Aa(c,h.listInnerRef),"cmdk-list-sizer":""},m)))}),NI=x.forwardRef((e,n)=>{let{open:r,onOpenChange:i,overlayClassName:s,contentClassName:l,container:c,...d}=e;return x.createElement(Um,{open:r,onOpenChange:i},x.createElement(Hm,{container:c},x.createElement(Bm,{"cmdk-overlay":"",className:s}),x.createElement(qm,{"aria-label":e.label,"cmdk-dialog":"",className:l},x.createElement(q_,{ref:n,...d}))))}),kI=x.forwardRef((e,n)=>Io(r=>r.filtered.count===0)?x.createElement(Ue.div,{ref:n,...e,"cmdk-empty":"",role:"presentation"}):null),LI=x.forwardRef((e,n)=>{let{progress:r,children:i,label:s="Loading...",...l}=e;return x.createElement(Ue.div,{ref:n,...l,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":s},Xc(e,c=>x.createElement("div",{"aria-hidden":!0},c)))}),Qc=Object.assign(q_,{List:zI,Item:AI,Input:DI,Group:MI,Separator:jI,Dialog:NI,Empty:kI,Loading:LI});function II(e,n){let r=e.nextElementSibling;for(;r;){if(r.matches(n))return r;r=r.nextElementSibling}}function $I(e,n){let r=e.previousElementSibling;for(;r;){if(r.matches(n))return r;r=r.previousElementSibling}}function G_(e){let n=x.useRef(e);return bi(()=>{n.current=e}),n}var bi=typeof window>"u"?x.useEffect:x.useLayoutEffect;function xa(e){let n=x.useRef();return n.current===void 0&&(n.current=e()),n}function Io(e){let n=Vp(),r=()=>e(n.snapshot());return x.useSyncExternalStore(n.subscribe,r,r)}function Z_(e,n,r,i=[]){let s=x.useRef(),l=dl();return bi(()=>{var c;let d=(()=>{var m;for(let y of r){if(typeof y=="string")return y.trim();if(typeof y=="object"&&"current"in y)return y.current?(m=y.current.textContent)==null?void 0:m.trim():s.current}})(),h=i.map(m=>m.trim());l.value(e,d,h),(c=n.current)==null||c.setAttribute(Sa,d),s.current=d}),s}var VI=()=>{let[e,n]=x.useState(),r=xa(()=>new Map);return bi(()=>{r.current.forEach(i=>i()),r.current=new Map},[e]),(i,s)=>{r.current.set(i,s),n({})}};function FI(e){let n=e.type;return typeof n=="function"?n(e.props):"render"in n?n.render(e.props):e}function Xc({asChild:e,children:n},r){return e&&x.isValidElement(n)?x.cloneElement(FI(n),{ref:n.ref},r(n.props.children)):r(n)}var UI={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function PI({className:e,...n}){return v.jsx(Qc,{"data-slot":"command",className:St("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",e),...n})}function HI({className:e,...n}){return v.jsxs("div",{"data-slot":"command-input-wrapper",className:"flex h-9 items-center gap-2 border-b px-3",children:[v.jsx(C1,{className:"size-4 shrink-0 opacity-50"}),v.jsx(Qc.Input,{"data-slot":"command-input",className:St("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n})]})}function BI({className:e,...n}){return v.jsx(Qc.List,{"data-slot":"command-list",className:St("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",e),...n})}function qI({className:e,...n}){return v.jsx(Qc.Item,{"data-slot":"command-item",className:St("relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",e),...n})}function jS(e,n){if(!e)return{score:0,hits:[]};const r=e.toLowerCase(),i=n.toLowerCase();let s=0,l=0,c=0;const d=[];for(let h=0;h3&&i.endsWith("ies")?s=i.slice(0,-3)+"y":i.length>3&&i.endsWith("es")?s=i.slice(0,-2):i.length>2&&i.endsWith("s")&&(s=i.slice(0,-1)),s?jS(s,n):null}function ZI({text:e,hits:n}){const r=[];let i=0;return n.forEach((s,l)=>{s>i&&r.push(e.slice(i,s)),r.push(v.jsx("b",{children:e[s]},l)),i=s+1}),r.push(e.slice(i)),v.jsx("span",{className:"plabel",children:r})}function KI({open:e,onClose:n,candidates:r}){const[i,s]=x.useState(""),l=x.useMemo(()=>{if(!e)return[];const d=[];for(const h of r()){const m=GI(i,h.label);m&&d.push({...h,score:m.score,hits:m.hits})}return d.sort((h,m)=>m.score-h.score),d.slice(0,40)},[e,i,r]);x.useEffect(()=>{e&&s("")},[e]);const c=d=>{n(),d.run()};return v.jsx(bp,{open:e,onOpenChange:d=>!d&&n(),children:v.jsxs(Sp,{id:"palette",className:"palette",showCloseButton:!1,"aria-describedby":void 0,children:[v.jsx(Ic,{className:"sr-only",children:"Search and quick actions"}),v.jsxs(PI,{shouldFilter:!1,loop:!0,children:[v.jsxs("div",{id:"palette-inputwrap",children:[v.jsx(Kt,{name:"search"}),v.jsx(HI,{id:"palette-input",placeholder:"Search file names, projects, actions…",autoComplete:"off",spellCheck:!1,value:i,onValueChange:s})]}),v.jsx(BI,{id:"palette-results",children:l.length===0?v.jsx("div",{className:"pempty",children:"No matches — search covers file names, projects, and actions"}):l.map(d=>v.jsxs(qI,{value:d.kind+":"+d.label,onSelect:()=>c(d),children:[v.jsx("span",{className:"picon",children:v.jsx(Kt,{name:d.icon})}),v.jsx(ZI,{text:d.label,hits:d.hits}),v.jsx("span",{className:"pkind",children:d.kind})]},d.kind+":"+d.label))}),v.jsx("footer",{id:"palette-hint",children:"↑↓ navigate · ⏎ select · esc close"})]})]})})}const Is=3,wa=30;function YI(e,n){return jn({queryKey:["heatDevices",e],queryFn:()=>Fn(e+"heat?by=device&days=30"),enabled:n,retry:!1,staleTime:6e4}).data?.devices??null}function DS(e){const[n,r]=x.useState("all"),{flatFiles:i,heatMap:s,devices:l,scope:c}=e,d=b=>!c||b===c||b.startsWith(c+"/"),h=c?i.filter(b=>d(b.path)):i,m=l&&c?l.map(b=>{const S={};for(const[_,C]of Object.entries(b.folders||{}))d(_)&&(S[_]=C);return{...b,folders:S}}).filter(b=>Object.keys(b.folders).length>0):l,y=Date.now(),g=h.map(b=>{const S=s&&s[b.path]||{},_=b.time?Math.max(0,(y-new Date(b.time).getTime())/864e5):0,C=n==="all"?Ws(S):S[n]||0;return{path:b.path,reads:C,agent:S.agent||0,total:Ws(S),days:_,danger:C>=Is&&_>=wa}});return v.jsxs("div",{className:"insights",children:[v.jsxs("h1",{className:"in-title",children:["Knowledge insights",c?v.jsxs("span",{className:"in-scope",children:[" · ",c]}):null]}),v.jsx("p",{className:"dl-sub",children:c?`Reads over the last 30 days × freshness, for ${c} and everything in it.`:"Reads over the last 30 days × how long since each file changed. Hot but stale knowledge — read a lot, maintained by nobody — is the danger zone."}),v.jsx("div",{className:"in-lens",children:["all","human","agent"].map(b=>v.jsx("button",{className:"in-lens-btn"+(b===n?" active":""),onClick:()=>r(b),children:b==="all"?"All reads":b==="human"?"Human reads":"Agent reads"},b))}),v.jsx("h3",{className:"dl-h3",children:"Map — cell size = reads, color = freshness"}),v.jsx(XI,{pts:g,onOpenFile:e.onOpenFile,onOpenFolder:e.onOpenFolder,isFolder:e.isFolder}),v.jsx("h3",{className:"dl-h3",children:"Reads × freshness"}),v.jsx(JI,{pts:g,onOpenFile:e.onOpenFile}),v.jsx("h3",{className:"dl-h3",children:"Hot path — top files by reads"}),v.jsx(WI,{pts:g,lens:n,onOpenFile:e.onOpenFile}),m&&m.length>0&&v.jsxs(v.Fragment,{children:[v.jsx("h3",{className:"dl-h3",children:"Agent coverage — which agents read which areas"}),v.jsx(e$,{devices:m})]})]})}function QI(e){const n=[[76,195,138],[232,196,84],[224,93,93]],r=Math.min(1,Math.max(0,e/300))*(n.length-1),i=Math.min(n.length-2,Math.floor(r)),s=r-i,l=n[i].map((c,d)=>Math.round(c+(n[i+1][d]-c)*s));return`rgb(${l[0]},${l[1]},${l[2]})`}function zS(e,n,r,i,s){const l=e.reduce((m,y)=>m+y.value,0);if(!l||i<=0||s<=0)return[];const c=e.slice().sort((m,y)=>y.value-m.value).map(m=>({it:m,a:m.value/l*i*s})),d=(m,y)=>{const b=m.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of m){const C=_.a/b;S=Math.max(S,C/b,b/C)}return S},h=[];for(;c.length;){const m=i>=s,y=m?s:i,g=[c.shift()];for(;c.length&&d(g.concat(c[0]),y)<=d(g,y);)g.push(c.shift());const b=g.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of g){const C=_.a/b;m?h.push({item:_.it,x:n,y:r+S,w:b,h:C}):h.push({item:_.it,x:n+S,y:r,w:C,h:b}),S+=C}m?(n+=b,i-=b):(r+=b,s-=b)}return h}const Gh=15;function XI({pts:e,onOpenFile:n,onOpenFolder:r,isFolder:i}){const c=new Map;for(const h of e){const m=h.path.includes("/")?h.path.split("/")[0]:"/";let y=c.get(m);y||c.set(m,y={name:m,files:[],value:0}),y.files.push(h),y.value+=h.reads+1}const d=[];for(const h of zS([...c.values()],0,0,720,480)){const m=h.item,y=m.name==="/"?"":m.name;if(d.push(v.jsx("rect",{x:h.x+1,y:h.y+1,width:Math.max(0,h.w-2),height:Math.max(0,h.h-2),rx:3,className:"in-tm-group","data-dir":y},"g"+m.name)),h.w>46&&h.h>Gh+10){let b=m.name==="/"?"(root)":m.name;const S=Math.floor((h.w-8)/6);b.length>S&&(b=b.slice(0,Math.max(1,S-1))+"…"),d.push(v.jsx("text",{x:h.x+5,y:h.y+12,className:"in-tm-glabel","data-dir":y,children:b},"gl"+m.name))}const g=zS(m.files.map(b=>({...b,name:b.path.split("/").pop(),value:b.reads+1})),h.x+2,h.y+Gh,Math.max(0,h.w-4),Math.max(0,h.h-Gh-2));for(const b of g)if(d.push(v.jsx("rect",{x:b.x+.6,y:b.y+.6,width:Math.max(.4,b.w-1.2),height:Math.max(.4,b.h-1.2),rx:1.5,fill:QI(b.item.days),className:"in-tm-cell","data-path":b.item.path,children:v.jsx("title",{children:`${b.item.path} — ${b.item.reads} read${b.item.reads===1?"":"s"}/30d · changed ${Math.round(b.item.days)}d ago`})},b.item.path)),b.w>54&&b.h>16){const S=Math.floor((b.w-8)/6);let _=(b.item.danger?"⚠ ":"")+b.item.name;_.length>S&&(_=_.slice(0,Math.max(1,S-1))+"…"),S>=5&&d.push(v.jsx("text",{x:b.x+4.5,y:b.y+12.5,className:"in-tm-label","data-path":b.item.path,children:_},"l"+b.item.path))}}return v.jsx("svg",{viewBox:"0 0 720 480",className:"in-chart in-treemap",onClick:h=>{const m=h.target.closest("[data-path], [data-dir]");if(!m)return;const y=m.getAttribute("data-path");if(y)return n(y);const g=m.getAttribute("data-dir");g&&i(g)&&r(g)},children:d})}function JI({pts:e,onOpenFile:n}){const s={l:44,r:16,t:20,b:34},l=Math.max(wa*2,...e.map(g=>g.days)),c=Math.max(Is*2,...e.map(g=>g.reads)),d=g=>Math.log10(g+1)/Math.log10(l+1),h=g=>Math.log10(g+1)/Math.log10(c+1),m=g=>s.l+d(g)*(720-s.l-s.r),y=g=>360-s.b-h(g)*(360-s.t-s.b);return v.jsxs("svg",{viewBox:"0 0 720 360",className:"in-chart",children:[v.jsx("rect",{x:m(wa),y:s.t,width:720-s.r-m(wa),height:y(Is)-s.t,className:"in-danger-zone"}),v.jsx("line",{x1:m(wa),y1:s.t,x2:m(wa),y2:360-s.b,className:"in-threshold"}),v.jsx("line",{x1:s.l,y1:y(Is),x2:720-s.r,y2:y(Is),className:"in-threshold"}),v.jsx("line",{x1:s.l,y1:360-s.b,x2:720-s.r,y2:360-s.b,className:"in-axis"}),v.jsx("line",{x1:s.l,y1:s.t,x2:s.l,y2:360-s.b,className:"in-axis"}),v.jsx("text",{x:(s.l+720-s.r)/2,y:352,className:"in-label",children:"days since last change →"}),v.jsx("text",{x:12,y:(s.t+360-s.b)/2,className:"in-label",transform:`rotate(-90 12 ${(s.t+360-s.b)/2})`,children:"reads / 30d →"}),v.jsx("text",{x:720-s.r-6,y:s.t+14,className:"in-quad in-quad-danger",textAnchor:"end",children:"hot + stale"}),v.jsx("text",{x:s.l+6,y:s.t+14,className:"in-quad",children:"hot + fresh"}),v.jsx("text",{x:720-s.r-6,y:360-s.b-8,className:"in-quad",textAnchor:"end",children:"cold + stale"}),v.jsx("text",{x:720-s.r-6,y:s.t+28,className:"in-label",textAnchor:"end",children:"dot size = agent share of reads"}),e.map(g=>{const b=g.total?(g.agent||0)/g.total:0;return v.jsx("circle",{cx:Number(m(g.days).toFixed(1)),cy:Number(y(g.reads).toFixed(1)),r:Number((3+4*b).toFixed(1)),className:"in-pt"+(g.danger?" danger":g.reads?"":" cold"),onClick:()=>n(g.path),children:v.jsx("title",{children:`${g.path} — ${g.reads} read${g.reads===1?"":"s"} / 30d · changed ${Math.round(g.days)}d ago`})},g.path)})]})}function WI({pts:e,lens:n,onOpenFile:r}){const i=e.filter(l=>l.reads>0).sort((l,c)=>c.reads-l.reads||c.days-l.days).slice(0,20);if(!i.length)return v.jsx("div",{className:"dl-empty",children:"No reads in the window yet."});const s=i[0].reads;return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:"in-hotpath",children:i.map(l=>{const c=n==="agent"?1:n==="human"?0:l.total?l.agent/l.total:0,d=l.reads/s*100;return v.jsxs("div",{className:"in-hp-row",tabIndex:0,role:"button",title:l.danger?`${l.reads} read${l.reads===1?"":"s"}/30d · unchanged ${Math.round(l.days)}d — review this file`:l.path,onClick:()=>r(l.path),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),r(l.path))},children:[v.jsx("span",{className:"in-hp-name"+(l.danger?" danger":""),children:l.path+(l.danger?" ⚠":"")}),v.jsxs("span",{className:"in-hp-bar",children:[v.jsx("span",{className:"in-hp-agent",style:{width:(d*c).toFixed(1)+"%"}}),v.jsx("span",{className:"in-hp-human",style:{width:(d*(1-c)).toFixed(1)+"%"}})]}),v.jsx("span",{className:"in-hp-count",children:l.reads})]},l.path)})}),v.jsxs("p",{className:"in-legend",children:[v.jsx("span",{className:"in-sw agent"})," agent reads ",v.jsx("span",{className:"in-sw human"})," human reads"]})]})}function e$({devices:e}){const n=new Map;for(const b of e)for(const[S,_]of Object.entries(b.folders||{}))n.set(S,(n.get(S)||0)+_);const r=[...n.entries()].sort((b,S)=>S[1]-b[1]).slice(0,12).map(b=>b[0]),i=e.slice(0,12),s=140,l=6,c=Math.min(76,Math.max(34,(720-s-8)/r.length)),d=26,h=720,m=l+i.length*d+58,y=Math.max(1,...i.flatMap(b=>r.map(S=>(b.folders||{})[S]||0))),g=b=>{const S=[23,25,31],_=[245,166,35],C=S.map((E,T)=>Math.round(E+(_[T]-E)*b));return`rgb(${C[0]},${C[1]},${C[2]})`};return v.jsxs("svg",{viewBox:`0 0 ${h} ${m}`,className:"in-chart in-matrix",children:[i.map((b,S)=>{let _=b.name||b.id||"";return _.length>20&&(_=_.slice(0,19)+"…"),v.jsxs("g",{children:[v.jsx("text",{x:s-8,y:l+S*d+17,textAnchor:"end",className:"in-label",children:_}),r.map((C,E)=>{const T=(b.folders||{})[C]||0;return v.jsx("rect",{x:s+E*c,y:l+S*d,width:c-4,height:d-4,rx:3,fill:g(Math.sqrt(T/y)),children:v.jsx("title",{children:`${b.name||b.id} × ${C||"(root)"}: ${T} read${T===1?"":"s"}/30d`})},C)})]},b.id||S)}),r.map((b,S)=>{const _=s+S*c+(c-4)/2,C=l+i.length*d+14;return v.jsx("text",{x:_,y:C,className:"in-label",textAnchor:"end",transform:`rotate(-28 ${_} ${C})`,children:b||"(root)"},b)})]})}function t$(e){const{apiBase:n,target:r,isFolder:i,onMeta:s,onRendered:l}=e,c=r?i(r)?{prefix:r+"/"}:{path:r}:{prefix:""},d="path"in c&&c.path!==void 0?"path="+encodeURIComponent(c.path):"prefix="+encodeURIComponent(c.prefix??""),{data:h,error:m}=jn({queryKey:["history",n,d,200],queryFn:()=>Fn(n+"history?"+d+"&n=200"),staleTime:15e3});if(x.useEffect(()=>{m&&s("History unavailable: "+m.message)},[m,s]),x.useEffect(()=>{h&&l?.()},[h,l]),!h)return null;const y=h.entries||[];return v.jsxs("div",{className:"history",children:[y.length===0&&v.jsx("div",{className:"empty",children:"No history yet."}),y.map((g,b)=>v.jsx(V_,{entry:g,onOpen:e.onOpen},b))]})}function n$(e,n){return e?n(e)?e+"/ (folder)":e:"all changes"}function K_(e){const{config:n,apiBase:r,route:i,hub:s,project:l}=e,c=wp(),d=tl(),{tree:h,flatFiles:m,dirIndex:y,loaded:g}=k6(r,!s||!!l),b=L6(r,s&&!!l&&!!n.reads?.enabled),S=s&&!!l&&!i.path&&!i.view,_=!!e.canInsights&&(i.view==="insights"||S),C=YI(r,_);x.useEffect(()=>{_&&d.invalidateQueries({queryKey:["heat",r]})},[_,r,d]);const E=i.path,T=E||(i.view==="insights"||i.view==="history")&&i.viewTarget||"",O=!!E&&y.has(E),A=!!E&&g&&!O&&m.some($e=>$e.path===E),k=!!E&&g&&!O&&!A,L=O&&!i.view,[U,B]=x.useState(()=>new Set),H=x.useRef(!0);x.useEffect(()=>{if(!h||!H.current)return;H.current=!1;const $e=(h.children||[]).filter(De=>De.dir);$e.length===1&&B(De=>new Set(De).add($e[0].path))},[h]),x.useEffect(()=>{!T||!g||B($e=>{const De=new Set($e);for(const Xe of oI(T))De.add(Xe);return y.has(T)&&De.add(T),De})},[T,g,y]);const ve=x.useCallback($e=>{B(De=>{const Xe=new Set(De);return Xe.has($e)?Xe.delete($e):Xe.add($e),Xe})},[]),ge=x.useRef(null),de=x.useRef(new Map),le=x.useRef({key:"",want:0,attempts:0});x.useEffect(()=>{le.current={key:c,want:bN()==="POP"?de.current.get(c)??0:0,attempts:0}},[c]);const ae=x.useCallback(()=>{const $e=ge.current,De=le.current;!$e||De.key!==c||De.attempts>=3||(De.attempts++,$e.scrollTo({top:De.want,behavior:"instant"}))},[c]),he=x.useCallback(()=>{ge.current&&de.current.set(c,ge.current.scrollTop)},[c]),ye=x.useCallback($e=>{An(yN($e,l?.id)),fr()},[l?.id]),N=x.useCallback($e=>An(_a("history",l?.id,$e)),[l?.id]),[Y,ne]=x.useState(""),[J,W]=x.useState(null),[D,j]=x.useState(!1),[P,Q]=x.useState(!1);x.useEffect(()=>yD(()=>Q(!0)),[]);const Z=x.useRef(null),re=e.panel??null,ee=!re&&s&&!!l&&A,pe=!re&&s&&!!l,be=!re&&A,ze=!re&&(A||s&&!!l&&O),Ie=r+"download?path="+encodeURIComponent(E),Fe=x.useCallback(async()=>{try{const $e=await fetch(r+"shares",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:E})});if(!$e.ok)throw new Error(await $e.text());const De=await $e.json(),Xe=await Js(De.url);W({url:De.url,copied:Xe})}catch($e){Je("Share failed: "+$e.message,!0)}},[r,E]),st=x.useCallback(()=>{if(!E)return N("");N(O?E+"/":E)},[E,O,N]);x.useEffect(()=>{const $e=De=>{(De.metaKey||De.ctrlKey)&&De.key.toLowerCase()==="k"&&(De.preventDefault(),Q(Xe=>!Xe))};return window.addEventListener("keydown",$e),()=>window.removeEventListener("keydown",$e)},[]);const Qe=x.useCallback(()=>{const $e=[],De=(Xe,Dt,eo,or)=>$e.push({icon:Xe,label:Dt,kind:eo,run:or});if(s&&l&&E&&(A&&De("share","Share: "+E,"action",Fe),De("hist","History: "+E,"action",st),A&&De("download","Download: "+E,"action",()=>Z.current?.click())),s&&l&&De("hist","History: whole project","action",()=>N("")),s)for(const Xe of e.projects||[])(!l||Xe.id!==l.id)&&De("folder","Switch to project: "+Xe.name,"project",()=>An("/"+Xe.id));n.auth?.enabled&&De("power","Sign out","action",()=>window.location.href="/auth/logout");for(const Xe of y.keys())De("folder",Xe,"folder",()=>ye(Xe));for(const Xe of m)De("doc",Xe.path,"file",()=>ye(Xe.path));return $e},[s,l,E,A,n.auth?.enabled,y,m,e.projects,Fe,st,N,ye]);x.useEffect(()=>{if(!D)return;const $e=()=>j(!1);return document.addEventListener("click",$e),()=>document.removeEventListener("click",$e)},[D]);const Xt=x.useCallback($e=>y.has($e),[y]);let Jt="app",Bt,Ft;re?Ft=re.body:i.view==="insights"?Ft=e.canInsights?v.jsx(DS,{flatFiles:m,heatMap:b,devices:C,scope:i.viewTarget||"",onOpenFile:ye,onOpenFolder:ye,isFolder:Xt}):v.jsx("div",{className:"empty",children:"Insights is for hub admins and org owners."}):i.view==="history"?(Jt="read",Ft=v.jsx(t$,{apiBase:r,target:i.viewTarget||"",isFolder:Xt,onOpen:ye,onMeta:ne,onRendered:ae})):E?g?k?Ft=v.jsxs("div",{className:"notfound",children:[v.jsx("h1",{children:"Couldn't find that"}),v.jsxs("p",{children:[v.jsx("code",{children:E})," isn't in this project right now."]}),v.jsx("p",{className:"nf-sub",children:"If it was just created, it may still be uploading or syncing from a teammate's device — this page checks again automatically every few seconds, so refresh or come back in a moment."}),v.jsx("button",{className:"pbtn",onClick:()=>d.invalidateQueries({queryKey:["tree",r]}),children:"Check again"})]}):O?(Jt="read",Ft=v.jsx(lI,{node:y.get(E),heatMap:b,hub:s&&!!l,apiBase:r,onOpen:ye,onFullHistory:N,onRendered:ae})):(Jt=O_.test(E)?"wide":"read",Bt="markdown",Ft=v.jsx(cI,{apiBase:r,path:E,heatMap:b,flatFiles:m,onOpenFile:ye,onMeta:ne,onRendered:ae})):Ft=v.jsx("div",{className:"empty",children:"Loading…"}):S?Ft=v.jsxs(v.Fragment,{children:[v.jsx(I_,{project:l}),e.canInsights&&v.jsx("div",{className:"home-insights",children:v.jsx(DS,{flatFiles:m,heatMap:b,devices:C,onOpenFile:ye,onOpenFolder:ye,isFolder:Xt})})]}):Ft=v.jsx("div",{className:"empty",children:"Select a file to read it."});const Ut=re?re.crumb:E?v.jsx(iI,{path:E,onOpenFolder:ye}):i.view==="insights"?"Insights — "+(i.viewTarget||l?.name||""):i.view==="history"?"History — "+n$(i.viewTarget||"",Xt):S?l.name:null,rr=v.jsx(Ys,{crumb:Ut,meta:Y,actions:v.jsxs(v.Fragment,{children:[ee&&v.jsx(Yt,{id:"share-btn",variant:"toolbar",className:"icon-only",title:"Share","aria-label":"Share",onClick:Fe,children:v.jsx(Kt,{name:"share"})}),pe&&!E&&!i.view&&v.jsxs(Yt,{id:"history-btn",variant:"toolbar",onClick:st,children:[v.jsx(Kt,{name:"hist"})," ",v.jsx("span",{className:"lbl",children:"History"})]}),be&&v.jsx("a",{id:"download",hidden:!0,download:!0,href:Ie,ref:Z,children:"Download"}),ze&&v.jsx(Yt,{id:"more-btn",variant:"toolbar",className:"icon-only",title:"More actions","aria-label":"More actions",onClick:$e=>{$e.stopPropagation(),j(!D)},children:v.jsx(Kt,{name:"dots"})}),D&&v.jsxs("div",{id:"more-menu",role:"menu",children:[pe&&v.jsx("button",{className:"more-item",onClick:st,children:"History"}),be&&v.jsx("button",{className:"more-item",onClick:()=>Z.current?.click(),children:"Download"}),e.canInsights&&v.jsx("button",{className:"more-item",onClick:()=>{e.onClosePanel?.(),An(_a("insights",l?.id,E))},children:"Insights"})]})]})});return v.jsxs(v.Fragment,{children:[v.jsx(Ks,{vault:e.sidebar.vault,projectsNav:e.sidebar.projectsNav,orgBar:e.sidebar.orgBar,tree:v.jsx(rI,{root:h,expanded:U,onToggle:ve,currentPath:T,listingShowing:L,onOpen:ye}),topbar:rr,contentRef:ge,onContentScroll:he,children:v.jsx(oc,{width:Jt,className:Bt,children:Ft})}),J&&v.jsx(vI,{url:J.url,copied:J.copied,onClose:()=>W(null)}),v.jsx(KI,{open:P,onClose:()=>Q(!1),candidates:Qe})]})}function r$({config:e}){const n=wp(),r=M1(),[i,s]=x.useState(null),[l,c]=x.useState(null);x.useEffect(()=>c(null),[n]);const d=x.useMemo(()=>{const U=n.match(/^\/join\/([0-9a-f]+)\/?$/);return U?U[1]:null},[n]),{data:h}=pN(!d),{data:m}=gN(!d),y=!!e.auth.admin,{data:g}=A1(y),b=x.useMemo(()=>D1(n,"hub"),[n]),S=x.useMemo(()=>h&&(h.find(U=>U.id===b.project)||i&&h.find(U=>U.org===i)||h[0])||null,[h,b.project,i]);if(x.useEffect(()=>{document.title=S?S.name+" — BearDrive":e.brand||e.volume||"BearDrive"},[S,e]),d)return v.jsx(o$,{token:d,onDone:async U=>{s(U),await r(),An("/",{replace:!0})}});const _=e.brand||e.volume||"BearDrive",C=S&&m?.find(U=>U.id===S.org)||null,E=y||(C?C.role==="owner":!1),T=v.jsx(Lc,{name:_,onHome:()=>An("/"),search:!!S}),O=e.me?v.jsx(R6,{me:e.me,org:C,admin:y?{pending:g?.length||0,onClick:()=>{c({kind:"hub"}),fr()}}:void 0,onOrgSettings:U=>{c({kind:"org",orgId:U.id}),fr()}}):void 0;if(!h||!m)return v.jsx(Ks,{vault:T,topbar:v.jsx(Ys,{}),children:v.jsx(oc,{children:v.jsx("div",{className:"empty",children:"Loading…"})})});if(!S)return v.jsx(Ks,{vault:T,projectsNav:v.jsx(_S,{projects:h}),orgBar:O,topbar:v.jsx(Ys,{}),children:v.jsx(oc,{width:"read",children:v.jsx(N6,{authEnabled:e.auth.enabled,onCreate:async U=>{if(!U){Je("Give the project a name.",!0);return}try{const B=await Oa("/api/projects",{name:U});await r(),An("/"+B.project.id),Je(`Created “${B.project.name}”.`)}catch(B){Je("Could not create the project: "+B.message,!0)}}})})});const A=l?.kind==="org"?m.find(U=>U.id===l.orgId):null,k=l?.kind==="hub"?{crumb:"Signup & access",body:v.jsx(p6,{})}:A?{crumb:A.name,body:v.jsx(d6,{org:A,projects:h,myEmail:e.me?.email||"",onProjectsChanged:r})}:null,L=b.view==="settings"?{crumb:"Project settings",body:v.jsx(T6,{project:S,org:C})}:b.view==="install"?{crumb:"Installation",body:v.jsx(I_,{project:S})}:null;return b.project!==S.id?v.jsx(SN,{to:"/"+S.id}):v.jsx(K_,{config:e,apiBase:"/api/p/"+S.id+"/",route:b,hub:!0,project:S,projects:h,canInsights:E,sidebar:{vault:T,projectsNav:v.jsx(_S,{projects:h,currentId:S.id,menu:{active:l?null:b.view==="insights"&&!b.viewTarget?"dashboard":b.view==="install"?"install":b.view==="history"&&!b.viewTarget?"history":b.view==="settings"?"settings":null,onDashboard:()=>{c(null),An(_a("insights",S.id)),fr()},onInstall:()=>{c(null),An(_a("install",S.id)),fr()},onHistory:()=>{c(null),An(_a("history",S.id)),fr()},onSettings:()=>{c(null),An(_a("settings",S.id)),fr()}}}),orgBar:O},panel:k||L,onClosePanel:()=>c(null)},S.id)}function o$({token:e,onDone:n}){return x.useEffect(()=>{let r=!1;return Oa("/api/invites/"+e).then(i=>{r||(Je(`Welcome — you joined the “${i.org.name}” team. Opening its projects…`),n(i.org.id))}).catch(i=>{r||String(i.message).includes("signing in")||(Je("Could not accept the invite: "+i.message,!0),n(null))}),()=>{r=!0}},[e]),v.jsx(Ks,{vault:v.jsx(Lc,{name:"BearDrive"}),topbar:v.jsx(Ys,{}),children:v.jsx(oc,{children:v.jsx("div",{className:"empty",children:"Joining…"})})})}function i$({config:e}){const n=wp(),r=e.volume||"BearDrive";x.useEffect(()=>{document.title=e.brand||r},[e,r]);const i=x.useMemo(()=>D1(n,"volume"),[n]);return v.jsx(K_,{config:e,apiBase:"/api/",route:i,hub:!1,sidebar:{vault:v.jsx(Lc,{name:r,showSignout:e.auth.enabled,search:!0})}})}function a$(){const{data:e}=eT();return v.jsxs(mD,{delayDuration:150,children:[e?e.mode==="hub"?v.jsx(r$,{config:e}):v.jsx(i$,{config:e}):v.jsx(Ks,{vault:v.jsx(Lc,{name:"…",showSignout:!1}),topbar:v.jsx(Ys,{}),children:v.jsx("div",{className:"empty",children:"Loading…"})}),v.jsx(sN,{}),v.jsx(fN,{})]})}const s$=new UR({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});pR.createRoot(document.getElementById("root")).render(v.jsx(x.StrictMode,{children:v.jsx(PR,{client:s$,children:v.jsx(a$,{})})})); diff --git a/internal/webapp/static/index.html b/internal/webapp/static/index.html index 068178c..9c0c01f 100644 --- a/internal/webapp/static/index.html +++ b/internal/webapp/static/index.html @@ -5,8 +5,8 @@ BearDrive - - + +