sh3-server 0.19.6 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/app/assets/{icons-nOyIoORC.svg → icons-OMmH0JiM.svg} +5 -0
  2. package/app/assets/index-CgB99H18.js +21 -0
  3. package/app/assets/index-CgB99H18.js.map +1 -0
  4. package/app/assets/index-D0Q9JGHo.css +1 -0
  5. package/app/index.html +2 -2
  6. package/dist/auth.d.ts +7 -11
  7. package/dist/auth.js +7 -19
  8. package/dist/cli.js +2 -2
  9. package/dist/doc-store/store.d.ts +6 -0
  10. package/dist/doc-store/store.js +108 -1
  11. package/dist/index.d.ts +5 -2
  12. package/dist/index.js +21 -12
  13. package/dist/middleware/project-allowlist.d.ts +4 -0
  14. package/dist/middleware/project-allowlist.js +26 -12
  15. package/dist/mounts/resolver.d.ts +21 -0
  16. package/dist/mounts/resolver.js +41 -0
  17. package/dist/mounts/routes.d.ts +4 -0
  18. package/dist/mounts/routes.js +136 -0
  19. package/dist/mounts/store.d.ts +30 -0
  20. package/dist/mounts/store.js +115 -0
  21. package/dist/routes/admin.d.ts +3 -1
  22. package/dist/routes/admin.js +6 -1
  23. package/dist/routes/boot.d.ts +7 -1
  24. package/dist/routes/boot.js +13 -4
  25. package/dist/routes/docs.js +27 -2
  26. package/dist/routes/projects.d.ts +1 -3
  27. package/dist/routes/projects.js +1 -3
  28. package/dist/scope.d.ts +1 -2
  29. package/dist/scope.js +1 -5
  30. package/dist/settings.d.ts +0 -1
  31. package/dist/settings.js +0 -4
  32. package/dist/shard-router.d.ts +1 -1
  33. package/dist/shard-router.js +23 -4
  34. package/dist/tenant-fs/http.d.ts +0 -2
  35. package/dist/tenant-fs/http.js +1 -1
  36. package/dist/tenant-fs/session-required.d.ts +1 -3
  37. package/dist/tenant-fs/session-required.js +1 -4
  38. package/dist/users.d.ts +14 -1
  39. package/dist/users.js +34 -0
  40. package/package.json +1 -1
  41. package/app/assets/index--m0u3gjJ.js +0 -21
  42. package/app/assets/index--m0u3gjJ.js.map +0 -1
  43. package/app/assets/index-DIpoXNrk.css +0 -1
@@ -0,0 +1 @@
1
+ .modal-frame.svelte-2tcvcm{position:absolute;inset:0;display:grid;place-items:center;pointer-events:auto}.modal-box.svelte-2tcvcm{background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));color:var(--sh3-fg);border:1px solid var(--sh3-border-strong);border-radius:var(--sh3-radius);min-width:320px;max-width:min(640px,90vw);max-height:90vh;overflow:auto;box-shadow:0 20px 48px #00000080;outline:none}.popup-frame.svelte-mp81cl{position:absolute;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));color:var(--sh3-fg);border:1px solid var(--sh3-border-strong);border-radius:var(--sh3-radius-sm);box-shadow:0 8px 24px #0006;min-width:120px;outline:none;pointer-events:auto}.toast.svelte-12gwnj0{pointer-events:auto;display:flex;align-items:center;gap:var(--sh3-pad-md);padding:var(--sh3-pad-sm) var(--sh3-pad-md);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));color:var(--sh3-fg);border:1px solid var(--sh3-border-strong);border-left-width:3px;border-radius:var(--sh3-radius-sm);box-shadow:0 8px 20px #0006;font-size:12px;min-width:220px;max-width:360px;cursor:pointer;animation:svelte-12gwnj0-toast-in .16s ease-out both}.toast-level.svelte-12gwnj0{text-transform:uppercase;font-family:var(--sh3-font-mono);font-size:10px;letter-spacing:.5px;color:var(--sh3-fg-muted)}.toast-message.svelte-12gwnj0{flex:1}.toast-info.svelte-12gwnj0{border-left-color:var(--sh3-accent)}.toast-success.svelte-12gwnj0{border-left-color:var(--sh3-success)}.toast-warn.svelte-12gwnj0{border-left-color:var(--sh3-warning)}.toast-error.svelte-12gwnj0{border-left-color:var(--sh3-error)}@keyframes svelte-12gwnj0-toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.sh3-conflict-text.svelte-iwgja4{display:flex;flex-direction:column;gap:12px;padding:12px;height:100%;min-height:0}.sh3-conflict-text-dual.svelte-iwgja4{display:grid;grid-template-columns:1fr 1fr;gap:8px;min-height:0;flex:1}.sh3-conflict-text-pane.svelte-iwgja4{display:flex;flex-direction:column;min-height:0;border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-sm);background:var(--sh3-input-bg, #2a2a2a);cursor:pointer}.sh3-conflict-text-pane.selected.svelte-iwgja4{border-color:var(--sh3-accent, #007acc);box-shadow:0 0 0 2px var(--sh3-focus-ring, rgba(0,122,204,.3))}.sh3-conflict-text-head.svelte-iwgja4{padding:6px 10px;font-size:.75rem;color:var(--sh3-fg-muted, #888);border-bottom:1px solid var(--sh3-border, #444)}.sh3-conflict-text-body.svelte-iwgja4{margin:0;padding:10px;flex:1;overflow:auto;font-family:var(--sh3-font-mono, monospace);font-size:.8125rem}.sh3-conflict-text-diff.svelte-iwgja4{margin-top:8px}.sh3-conflict-text-diff.svelte-iwgja4 pre:where(.svelte-iwgja4){background:var(--sh3-input-bg, #2a2a2a);padding:8px;overflow:auto;max-height:240px}.diff-left{color:var(--sh3-error, #e35)}.diff-right{color:var(--sh3-success, #3a3)}.diff-same{opacity:.7}.sh3-conflict-text-tabs.svelte-iwgja4{display:flex;flex-direction:column;gap:8px;min-height:0;flex:1}.sh3-conflict-text-picker.svelte-iwgja4 select:where(.svelte-iwgja4){background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);padding:2px 6px}.sh3-conflict-text-tablist.svelte-iwgja4{display:flex;gap:4px;flex-wrap:wrap}.sh3-conflict-text-tab.svelte-iwgja4{padding:4px 10px;background:var(--sh3-input-bg, #2a2a2a);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-sm);color:var(--sh3-fg, #e0e0e0);cursor:pointer;font-size:.8125rem}.sh3-conflict-text-tab.selected.svelte-iwgja4{border-color:var(--sh3-accent, #007acc)}.sh3-conflict-meta.svelte-1nz3djn{padding:16px;display:flex;flex-direction:column;gap:12px}.sh3-conflict-meta-note.svelte-1nz3djn{color:var(--sh3-fg-muted, #888);font-size:.875rem;font-style:italic}.sh3-conflict-meta-list.svelte-1nz3djn{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}.sh3-conflict-meta-li.svelte-1nz3djn{margin:0}.sh3-conflict-meta-row.svelte-1nz3djn{width:100%;text-align:left;padding:10px 12px;background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-sm);cursor:pointer;font:inherit}.sh3-conflict-meta-row.selected.svelte-1nz3djn{border-color:var(--sh3-accent, #007acc);box-shadow:0 0 0 2px var(--sh3-focus-ring, rgba(0,122,204,.3))}.sh3-conflict-meta-origin.svelte-1nz3djn{font-weight:600;font-size:.875rem}.sh3-conflict-meta-detail.svelte-1nz3djn{color:var(--sh3-fg-muted, #888);font-size:.75rem;margin-top:2px}.sh3-conflict-prompt.svelte-1jvtzud{padding:20px;display:flex;flex-direction:column;gap:14px;min-width:360px;max-width:480px}.sh3-conflict-prompt-title.svelte-1jvtzud{margin:0;font-size:1.0625rem;font-weight:600;color:var(--sh3-fg, #e0e0e0)}.sh3-conflict-prompt-intro.svelte-1jvtzud{margin:0;color:var(--sh3-fg-muted, #888);font-size:.875rem}.sh3-conflict-prompt-actions.svelte-1jvtzud{display:flex;flex-direction:column;gap:8px}.sh3-conflict-prompt-actions.svelte-1jvtzud button:where(.svelte-1jvtzud){padding:10px 14px;border-radius:var(--sh3-radius);border:1px solid var(--sh3-border, #444);background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left}.sh3-conflict-prompt-primary.svelte-1jvtzud{background:var(--sh3-accent, #007acc)!important;border-color:var(--sh3-accent, #007acc)!important;color:#fff!important;font-weight:600}.sh3-conflict-prompt-cancel.svelte-1jvtzud{color:var(--sh3-fg-muted, #888)!important}.sh3-conflict-detail.svelte-pw8iv6{display:flex;flex-direction:column;width:min(920px,96vw);height:min(640px,90vh);background:var(--sh3-bg, #1e1e1e);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-md);box-shadow:0 8px 32px #0006}.sh3-conflict-detail-head.svelte-pw8iv6{padding:12px 16px;border-bottom:1px solid var(--sh3-border, #444);display:flex;justify-content:space-between;align-items:center}.sh3-conflict-detail-head.svelte-pw8iv6 h3:where(.svelte-pw8iv6){margin:0;font-size:1rem;font-weight:600}.sh3-conflict-detail-counter.svelte-pw8iv6{color:var(--sh3-fg-muted, #888);font-size:.8125rem}.sh3-conflict-detail-body.svelte-pw8iv6{display:flex;flex:1;min-height:0}.sh3-conflict-detail-rail.svelte-pw8iv6{width:240px;border-right:1px solid var(--sh3-border, #444);overflow-y:auto;display:flex;flex-direction:column}.sh3-conflict-detail-rail-item.svelte-pw8iv6{display:flex;gap:8px;align-items:center;padding:6px 12px;text-align:left;background:transparent;border:none;color:inherit;cursor:pointer;font:inherit;font-size:.8125rem}.sh3-conflict-detail-rail-item.svelte-pw8iv6:hover{background:var(--sh3-input-bg, #2a2a2a)}.sh3-conflict-detail-rail-item.selected.svelte-pw8iv6{background:var(--sh3-input-bg, #2a2a2a);font-weight:600}.sh3-conflict-detail-rail-state.svelte-pw8iv6{width:1em;text-align:center;opacity:.7}.sh3-conflict-detail-rail-state.resolved.svelte-pw8iv6{color:var(--sh3-success, #3a3);opacity:1}.sh3-conflict-detail-rail-state.skipped.svelte-pw8iv6{color:var(--sh3-fg-muted, #888)}.sh3-conflict-detail-rail-label.svelte-pw8iv6{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sh3-conflict-detail-main.svelte-pw8iv6{flex:1;display:flex;flex-direction:column;min-width:0}.sh3-conflict-detail-branches.svelte-pw8iv6{display:flex;gap:12px;padding:8px 16px;border-bottom:1px solid var(--sh3-border, #444);flex-wrap:wrap}.sh3-conflict-detail-branch.svelte-pw8iv6{display:flex;gap:6px;align-items:center;font-size:.8125rem}.sh3-conflict-detail-renderer.svelte-pw8iv6{flex:1;min-height:0;overflow:auto}.sh3-conflict-detail-foot.svelte-pw8iv6{padding:10px 16px;border-top:1px solid var(--sh3-border, #444);display:flex;justify-content:space-between;gap:8px}.sh3-conflict-detail-nav.svelte-pw8iv6,.sh3-conflict-detail-actions.svelte-pw8iv6{display:flex;gap:8px}.sh3-conflict-detail-nav.svelte-pw8iv6 button:where(.svelte-pw8iv6),.sh3-conflict-detail-actions.svelte-pw8iv6 button:where(.svelte-pw8iv6){padding:6px 14px;background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font:inherit;font-size:.8125rem;cursor:pointer}.sh3-conflict-detail-nav.svelte-pw8iv6 button:where(.svelte-pw8iv6):disabled{opacity:.5;cursor:not-allowed}.sh3-conflict-detail-done.svelte-pw8iv6{background:var(--sh3-accent, #007acc)!important;color:#fff!important;font-weight:600;border-color:var(--sh3-accent, #007acc)!important}.sh3-context-menu.svelte-1667pfa{min-width:220px;background:var(--sh3-bg-elevated, #222);color:var(--sh3-fg, #eee);border-radius:4px;padding:4px 0;box-shadow:0 4px 16px #00000059;outline:none}.sh3-ctx-item.svelte-1667pfa{display:flex;align-items:center;gap:8px;width:100%;padding:4px 10px;background:none;border:0;text-align:left;color:inherit;cursor:default;font:inherit}.sh3-ctx-active.svelte-1667pfa{background:var(--sh3-accent, #6ea8fe);color:var(--sh3-fg,#e4e6eb)}.sh3-ctx-disabled.svelte-1667pfa{opacity:.45}.sh3-ctx-disabled.sh3-ctx-active.svelte-1667pfa{background:transparent}.sh3-ctx-check.svelte-1667pfa{display:inline-block;width:12px;text-align:center;opacity:.85}.sh3-ctx-label.svelte-1667pfa{flex:1}.sh3-ctx-chevron.svelte-1667pfa{opacity:.6}.sh3-ctx-shortcut.svelte-1667pfa{opacity:.6;font-size:.9em}.sh3-ctx-sep.svelte-1667pfa{height:1px;background:#ffffff1a;margin:4px 0}.sh3-palette.svelte-1qdcgk6{min-width:480px;max-width:640px;background:var(--sh3-bg-elevated, #22232a);color:var(--sh3-fg, #e4e6eb);border-radius:var(--sh3-radius-md, 6px);box-shadow:0 8px 24px #0006}.sh3-palette-input.svelte-1qdcgk6{width:100%;padding:10px;background:none;border:0;border-bottom:1px solid rgba(255,255,255,.1);color:inherit;font:inherit;outline:none}.sh3-palette-list.svelte-1qdcgk6{max-height:320px;overflow-y:auto;padding:4px 0}.sh3-palette-item.svelte-1qdcgk6{display:flex;align-items:center;gap:12px;width:100%;padding:6px 12px;background:none;border:0;color:inherit;text-align:left;font:inherit;cursor:default}.sh3-palette-active.svelte-1qdcgk6{background:var(--sh3-accent, #4a5);border-radius:0;color:#fff}.sh3-palette-label.svelte-1qdcgk6{flex:1}.sh3-palette-badge.svelte-1qdcgk6{opacity:.5;font-size:.85em}.sh3-palette-shortcut.svelte-1qdcgk6{opacity:.6;font-size:.9em}.sh3-doc-browser.svelte-16fo6d5{display:flex;flex-direction:column;max-height:85vh;overflow:hidden;color:var(--sh3-fg);font-size:.8125rem;outline:none}.sh3-doc-browser__head.svelte-16fo6d5{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--sh3-border)}.sh3-doc-browser__title.svelte-16fo6d5{font-weight:600}.sh3-doc-browser__crumbs.svelte-16fo6d5{display:flex;align-items:center;gap:2px;padding:4px 8px;border-bottom:1px solid var(--sh3-border);overflow-x:auto;flex-shrink:0}.sh3-doc-browser__crumb.svelte-16fo6d5{display:inline-flex;align-items:center;padding:1px 4px;border:none;background:none;color:var(--sh3-fg-muted);font:inherit;font-size:.75rem;cursor:pointer;border-radius:var(--sh3-radius-sm);white-space:nowrap;flex-shrink:0}.sh3-doc-browser__crumb.svelte-16fo6d5:hover{background:var(--sh3-bg);color:var(--sh3-fg)}.sh3-doc-browser__crumb--last.svelte-16fo6d5{color:var(--sh3-fg);font-weight:600}.sh3-doc-browser__crumb-sep.svelte-16fo6d5{color:var(--sh3-fg-subtle);font-size:.75rem;flex-shrink:0}.sh3-doc-browser__list.svelte-16fo6d5{flex:1;overflow-y:auto;padding:4px 0;min-height:0}.sh3-doc-browser__item.svelte-16fo6d5{display:flex;align-items:center;gap:8px;padding:5px 12px;cursor:pointer}.sh3-doc-browser__item--active.svelte-16fo6d5{background:var(--sh3-bg)}.sh3-doc-browser__item--selected.svelte-16fo6d5{background:var(--sh3-accent);color:var(--sh3-fg-on-accent)}.sh3-doc-browser__item--active.sh3-doc-browser__item--selected.svelte-16fo6d5{background:var(--sh3-accent)}.sh3-doc-browser__icon.svelte-16fo6d5{flex-shrink:0;width:18px;text-align:center;font-size:.875rem}.sh3-doc-browser__icon--folder.svelte-16fo6d5{font-size:.75rem}.sh3-doc-browser__name.svelte-16fo6d5{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--sh3-font-mono);font-size:.75rem}.sh3-doc-browser__item--folder.svelte-16fo6d5 .sh3-doc-browser__name:where(.svelte-16fo6d5){font-family:inherit;font-size:.8125rem}.sh3-doc-browser__meta.svelte-16fo6d5{display:flex;align-items:center;gap:10px;flex-shrink:0;font-size:.6875rem;color:var(--sh3-fg-muted)}.sh3-doc-browser__item--selected.svelte-16fo6d5 .sh3-doc-browser__meta:where(.svelte-16fo6d5){color:var(--sh3-fg-on-accent);opacity:.8}.sh3-doc-browser__date.svelte-16fo6d5{color:var(--sh3-fg-subtle)}.sh3-doc-browser__item--selected.svelte-16fo6d5 .sh3-doc-browser__date:where(.svelte-16fo6d5){color:var(--sh3-fg-on-accent);opacity:.65}.sh3-doc-browser__empty.svelte-16fo6d5{padding:20px 12px;text-align:center;color:var(--sh3-fg-muted);font-style:italic}.sh3-doc-browser__save-row.svelte-16fo6d5{display:flex;align-items:center;gap:8px;padding:6px 12px;border-top:1px solid var(--sh3-border)}.sh3-doc-browser__save-label.svelte-16fo6d5{font-size:.75rem;color:var(--sh3-fg-muted);flex-shrink:0}.sh3-doc-browser__save-input.svelte-16fo6d5{flex:1;height:var(--sh3-field-height-sm);padding:0 8px;background:var(--sh3-input-bg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm);color:var(--sh3-fg);font:inherit;font-family:var(--sh3-font-mono);font-size:.75rem;outline:none}.sh3-doc-browser__save-input.svelte-16fo6d5:focus{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring)}.sh3-doc-browser__footer.svelte-16fo6d5{display:flex;justify-content:flex-end;gap:8px;padding:8px 12px;border-top:1px solid var(--sh3-border)}.sh3-doc-browser__btn.svelte-16fo6d5{display:inline-flex;align-items:center;height:26px;padding:0 12px;border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm);background:var(--sh3-bg-elevated);color:var(--sh3-fg);font:inherit;font-size:.75rem;cursor:pointer}.sh3-doc-browser__btn.svelte-16fo6d5:hover{background:var(--sh3-bg)}.sh3-doc-browser__btn--primary.svelte-16fo6d5{background:var(--sh3-accent);color:var(--sh3-fg-on-accent);border-color:var(--sh3-accent)}.sh3-doc-browser__btn--primary.svelte-16fo6d5:hover{filter:brightness(1.1)}.sh3-doc-browser__btn--primary.svelte-16fo6d5:disabled{opacity:.5;cursor:not-allowed}.sh3-doc-browser__btn--primary.svelte-16fo6d5:disabled:hover{filter:none}.sh3-btn.svelte-t4hi97{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--sh3-pad-sm);padding:6px 14px;background:var(--sh3-accent);color:var(--sh3-fg-on-accent);border:none;border-radius:var(--sh3-radius);cursor:pointer;font-family:inherit;font-size:.875rem;line-height:var(--sh3-line)}.sh3-btn.svelte-t4hi97:hover:not(:disabled){filter:brightness(1.12)}.sh3-btn.svelte-t4hi97:active:not(:disabled){filter:brightness(.92)}.sh3-btn.svelte-t4hi97:focus-visible{box-shadow:var(--sh3-focus-ring);outline:none}.sh3-btn.svelte-t4hi97:disabled{opacity:.55;cursor:not-allowed}.sh3-btn--pressed.svelte-t4hi97{box-shadow:inset 0 1px 3px #00000059;filter:brightness(.88)}.sh3-btn--pressed.svelte-t4hi97:hover:not(:disabled){filter:brightness(.96)}.sh3-btn--alert.svelte-t4hi97{background:var(--sh3-error);color:var(--sh3-fg-on-error)}.sh3-btn--ghost.svelte-t4hi97{background:transparent;color:var(--sh3-fg);border:1px solid var(--sh3-border)}.sh3-btn--ghost.svelte-t4hi97:hover:not(:disabled){background:var(--sh3-bg-elevated);filter:none}.sh3-btn--icon.svelte-t4hi97{background:transparent;color:var(--sh3-fg-muted);padding:var(--sh3-pad-sm)}.sh3-btn--icon.svelte-t4hi97:hover:not(:disabled){background:var(--sh3-bg-elevated);color:var(--sh3-fg);filter:none}.sh3-btn--icon-only.svelte-t4hi97{padding:var(--sh3-pad-sm);width:26px;height:26px}.sh3-btn__icon.svelte-t4hi97{width:16px;height:16px;flex-shrink:0}.sh3-btn__label.svelte-t4hi97{display:inline-flex;white-space:nowrap}.sh3-btn__spinner.svelte-t4hi97{width:16px;height:16px;flex-shrink:0;animation:svelte-t4hi97-sh3-btn-spin .8s linear infinite}@keyframes svelte-t4hi97-sh3-btn-spin{to{transform:rotate(360deg)}}.sh3-collapsible.svelte-lvydsb{border:1px solid var(--sh3-border);border-radius:var(--sh3-radius);background:transparent}.sh3-collapsible__head.svelte-lvydsb{appearance:none;width:100%;display:inline-flex;align-items:center;gap:var(--sh3-pad-sm);padding:var(--sh3-pad-sm) 12px;background:transparent;color:var(--sh3-fg);border:none;border-radius:inherit;cursor:pointer;font-family:inherit;font-size:.875rem;line-height:var(--sh3-line);text-align:left}.sh3-collapsible__head.svelte-lvydsb:hover{background:var(--sh3-bg-elevated)}.sh3-collapsible__head.svelte-lvydsb:focus-visible{box-shadow:var(--sh3-focus-ring);outline:none}.sh3-collapsible__caret.svelte-lvydsb{width:12px;height:12px;flex-shrink:0;color:var(--sh3-fg-muted)}.sh3-collapsible--open.svelte-lvydsb .sh3-collapsible__caret:where(.svelte-lvydsb){transform:rotate(90deg)}.sh3-collapsible__title.svelte-lvydsb{flex:1}.sh3-collapsible__body.svelte-lvydsb{padding:var(--sh3-pad-sm) 12px;border-top:1px solid var(--sh3-border)}.sh3-field.svelte-m4dkl{display:inline-flex;flex-direction:column;gap:4px;font-family:var(--sh3-font-ui);font-size:.8125rem;color:var(--sh3-fg)}.sh3-field__label.svelte-m4dkl{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-field__row.svelte-m4dkl{display:inline-flex;align-items:stretch;background:var(--sh3-input-bg);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);height:var(--sh3-field-height-md);transition:border-color var(--sh3-motion-fast) var(--sh3-ease-standard),box-shadow var(--sh3-motion-fast) var(--sh3-ease-standard)}.sh3-field--sm.svelte-m4dkl .sh3-field__row:where(.svelte-m4dkl){height:var(--sh3-field-height-sm)}.sh3-field__row.svelte-m4dkl:focus-within{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring)}.sh3-field--invalid.svelte-m4dkl .sh3-field__row:where(.svelte-m4dkl){border-color:var(--sh3-error)}.sh3-field--invalid.svelte-m4dkl .sh3-field__row:where(.svelte-m4dkl):focus-within{box-shadow:0 0 0 2px color-mix(in srgb,var(--sh3-error) 40%,transparent)}.sh3-field__input.svelte-m4dkl{flex:1 1 auto;height:100%;padding:0 var(--sh3-field-pad-x);background:transparent;border:none;color:inherit;font:inherit;outline:none}.sh3-field__input.svelte-m4dkl:focus,.sh3-field__input.svelte-m4dkl:focus-visible{outline:none;box-shadow:none;border:none}.sh3-field__input.svelte-m4dkl:disabled{color:var(--sh3-fg-muted);cursor:not-allowed}.sh3-field__affix.svelte-m4dkl{display:inline-flex;align-items:center;padding:0 var(--sh3-field-pad-x);color:var(--sh3-fg-muted);flex-shrink:0}.sh3-field__affix.svelte-m4dkl:first-child{padding-right:0}.sh3-field__affix.svelte-m4dkl:last-child{padding-left:0}.sh3-field__helper.svelte-m4dkl{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-field__helper--error.svelte-m4dkl{color:var(--sh3-error)}.sh3-textarea.svelte-668c6r{display:inline-flex;flex-direction:column;gap:4px;font-family:var(--sh3-font-ui);font-size:.8125rem}.sh3-textarea__label.svelte-668c6r{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-textarea__input.svelte-668c6r{background:var(--sh3-input-bg);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);padding:var(--sh3-pad-sm) var(--sh3-field-pad-x);font:inherit;outline:none;transition:border-color var(--sh3-motion-fast) var(--sh3-ease-standard)}.sh3-textarea__input.svelte-668c6r:focus{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring)}.sh3-textarea--invalid.svelte-668c6r .sh3-textarea__input:where(.svelte-668c6r){border-color:var(--sh3-error)}.sh3-textarea__helper.svelte-668c6r{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-textarea__helper--error.svelte-668c6r{color:var(--sh3-error)}.sh3-num.svelte-1qa0x3m{display:inline-flex;flex-direction:column;gap:4px;font-size:.8125rem}.sh3-num__label.svelte-1qa0x3m{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-num__row.svelte-1qa0x3m{display:inline-flex;align-items:stretch;background:var(--sh3-input-bg);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);height:var(--sh3-field-height-md)}.sh3-num--sm.svelte-1qa0x3m .sh3-num__row:where(.svelte-1qa0x3m){height:var(--sh3-field-height-sm)}.sh3-num__row.svelte-1qa0x3m:focus-within{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring)}.sh3-num--invalid.svelte-1qa0x3m .sh3-num__row:where(.svelte-1qa0x3m){border-color:var(--sh3-error)}.sh3-num__input.svelte-1qa0x3m{flex:1 1 auto;min-width:50px;padding:0 var(--sh3-field-pad-x);background:transparent;border:none;color:var(--sh3-fg);font:inherit;outline:none;-moz-appearance:textfield;appearance:textfield}.sh3-num__input.svelte-1qa0x3m:focus,.sh3-num__input.svelte-1qa0x3m:focus-visible{outline:none;box-shadow:none;border:none}.sh3-num__input.svelte-1qa0x3m::-webkit-outer-spin-button,.sh3-num__input.svelte-1qa0x3m::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.sh3-num__affix.svelte-1qa0x3m{display:inline-flex;align-items:center;padding:0 6px;color:var(--sh3-fg-muted)}.sh3-num__steppers.svelte-1qa0x3m{display:inline-flex;flex-direction:column;border-left:1px solid var(--sh3-border)}.sh3-num__steppers.svelte-1qa0x3m button:where(.svelte-1qa0x3m){flex:1;width:18px;background:transparent;color:var(--sh3-fg-muted);border:none;border-radius:0;padding:0;cursor:pointer;font-size:8px;line-height:1}.sh3-num__steppers.svelte-1qa0x3m button:where(.svelte-1qa0x3m):hover:not(:disabled){background:var(--sh3-bg-elevated);color:var(--sh3-fg);filter:none}.sh3-num__steppers.svelte-1qa0x3m button:where(.svelte-1qa0x3m):disabled{cursor:not-allowed;opacity:.5}.sh3-num__steppers.svelte-1qa0x3m button:where(.svelte-1qa0x3m)+button:where(.svelte-1qa0x3m){border-top:1px solid var(--sh3-border)}.sh3-seg.svelte-17xsko9{display:inline-flex;background:var(--sh3-bg-sunken);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius-pill);padding:2px;height:var(--sh3-field-height-md);gap:0}.sh3-seg--sm.svelte-17xsko9{height:var(--sh3-field-height-sm)}.sh3-seg.svelte-17xsko9 button:where(.svelte-17xsko9){background:transparent;color:var(--sh3-fg-muted);border:none;padding:0 var(--sh3-field-pad-x);border-radius:var(--sh3-widget-radius-pill);font-size:.8125rem;cursor:pointer;transition:background var(--sh3-motion-fast) var(--sh3-ease-standard),color var(--sh3-motion-fast) var(--sh3-ease-standard)}.sh3-seg.svelte-17xsko9 button:where(.svelte-17xsko9):hover:not(:disabled):not(.sh3-seg__btn--active){color:var(--sh3-fg);filter:none}.sh3-seg.svelte-17xsko9 button.sh3-seg__btn--active:where(.svelte-17xsko9){background:var(--sh3-accent);color:var(--sh3-fg-on-accent);font-weight:600;box-shadow:0 1px 2px #00000040,inset 0 0 0 1px color-mix(in srgb,var(--sh3-fg-on-accent) 25%,transparent)}.sh3-seg.svelte-17xsko9 button:where(.svelte-17xsko9):disabled{opacity:.5;cursor:not-allowed}.sh3-seg.svelte-17xsko9 button:where(.svelte-17xsko9):focus-visible{outline:none;box-shadow:var(--sh3-focus-ring)}.sh3-itg.svelte-13knxr5{display:inline-flex;background:var(--sh3-bg-sunken);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);padding:2px;gap:2px}.sh3-itg.svelte-13knxr5 button:where(.svelte-13knxr5){width:26px;height:26px;background:transparent;color:var(--sh3-fg-muted);border:none;border-radius:var(--sh3-radius-sm);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;transition:background var(--sh3-motion-fast) var(--sh3-ease-standard),color var(--sh3-motion-fast) var(--sh3-ease-standard)}.sh3-itg--sm.svelte-13knxr5 button:where(.svelte-13knxr5){width:22px;height:22px}.sh3-itg.svelte-13knxr5 button:where(.svelte-13knxr5):hover:not(:disabled):not(.sh3-itg__btn--active){background:var(--sh3-bg-elevated);color:var(--sh3-fg);filter:none}.sh3-itg.svelte-13knxr5 button.sh3-itg__btn--active:where(.svelte-13knxr5){background:var(--sh3-accent);color:var(--sh3-fg-on-accent);font-weight:600;box-shadow:0 1px 2px #00000040,inset 0 0 0 1px color-mix(in srgb,var(--sh3-fg-on-accent) 25%,transparent)}.sh3-itg.svelte-13knxr5 button:where(.svelte-13knxr5):focus-visible{outline:none;box-shadow:var(--sh3-focus-ring)}.sh3-itg.svelte-13knxr5 button:where(.svelte-13knxr5):disabled{opacity:.5;cursor:not-allowed}.sh3-slider.svelte-13va6lu{--thumb-size: 14px;position:relative;display:inline-block}.sh3-slider--sm.svelte-13va6lu{--thumb-size: 12px}.sh3-slider--horizontal.svelte-13va6lu{width:200px;height:var(--thumb-size)}.sh3-slider--vertical.svelte-13va6lu{width:var(--thumb-size);height:200px}.sh3-slider__track.svelte-13va6lu{position:absolute;background:var(--sh3-track-bg);border:1px solid var(--sh3-track-border);border-radius:var(--sh3-widget-radius-pill);pointer-events:none}.sh3-slider--horizontal.svelte-13va6lu .sh3-slider__track:where(.svelte-13va6lu){top:50%;left:0;right:0;height:4px;transform:translateY(-50%)}.sh3-slider--vertical.svelte-13va6lu .sh3-slider__track:where(.svelte-13va6lu){left:50%;top:0;bottom:0;width:4px;transform:translate(-50%)}.sh3-slider__fill.svelte-13va6lu{position:absolute;background:var(--sh3-track-fill);border-radius:inherit}.sh3-slider--horizontal.svelte-13va6lu .sh3-slider__fill:where(.svelte-13va6lu){left:0;top:0;bottom:0;width:var(--pct)}.sh3-slider--vertical.svelte-13va6lu .sh3-slider__fill:where(.svelte-13va6lu){bottom:0;left:0;right:0;height:var(--pct)}.sh3-slider__tick.svelte-13va6lu{position:absolute;background:var(--sh3-tick-bg)}.sh3-slider--horizontal.svelte-13va6lu .sh3-slider__tick:where(.svelte-13va6lu){width:1px;height:8px;top:50%;transform:translate(-50%,-50%);left:var(--tick-pct)}.sh3-slider--vertical.svelte-13va6lu .sh3-slider__tick:where(.svelte-13va6lu){width:8px;height:1px;left:50%;transform:translate(-50%,50%);bottom:var(--tick-pct)}.sh3-slider__native.svelte-13va6lu{position:absolute;inset:0;width:100%;height:100%;margin:0;background:transparent;-webkit-appearance:none;appearance:none;cursor:pointer}.sh3-slider--vertical.svelte-13va6lu .sh3-slider__native:where(.svelte-13va6lu){writing-mode:vertical-lr;direction:rtl}.sh3-slider__native.svelte-13va6lu:disabled{cursor:not-allowed;opacity:1}.sh3-slider--invalid.svelte-13va6lu .sh3-slider__track:where(.svelte-13va6lu){border-color:var(--sh3-error)}.sh3-slider.svelte-13va6lu:has(.sh3-slider__native:where(.svelte-13va6lu):disabled) .sh3-slider__fill:where(.svelte-13va6lu){background:var(--sh3-border-strong)}.sh3-slider__native.svelte-13va6lu::-webkit-slider-thumb{-webkit-appearance:none;width:var(--thumb-size);height:var(--thumb-size);border-radius:50%;background:var(--sh3-thumb-bg);border:2px solid var(--sh3-thumb-border);box-shadow:var(--sh3-thumb-shadow);cursor:pointer;opacity:1}.sh3-slider__native.svelte-13va6lu::-moz-range-thumb{width:var(--thumb-size);height:var(--thumb-size);border-radius:50%;background:var(--sh3-thumb-bg);border:2px solid var(--sh3-thumb-border);box-shadow:var(--sh3-thumb-shadow);cursor:pointer;opacity:1}.sh3-slider__native.svelte-13va6lu:disabled::-webkit-slider-thumb{background:var(--sh3-fg-subtle);border-color:var(--sh3-border-strong);cursor:not-allowed;opacity:1}.sh3-slider__native.svelte-13va6lu:disabled::-moz-range-thumb{background:var(--sh3-fg-subtle);border-color:var(--sh3-border-strong);cursor:not-allowed;opacity:1}.sh3-slider__native.svelte-13va6lu::-webkit-slider-runnable-track,.sh3-slider__native.svelte-13va6lu::-moz-range-track{background:transparent}.sh3-slider__native.svelte-13va6lu:focus-visible::-webkit-slider-thumb{box-shadow:var(--sh3-focus-ring),var(--sh3-thumb-shadow)}.sh3-slider__native.svelte-13va6lu:focus-visible::-moz-range-thumb{box-shadow:var(--sh3-focus-ring),var(--sh3-thumb-shadow)}.sh3-slider__value.svelte-13va6lu{position:absolute;font-size:.75rem;color:var(--sh3-fg-muted);pointer-events:none;transform:translate(-50%)}.sh3-slider--horizontal.svelte-13va6lu .sh3-slider__value:where(.svelte-13va6lu){top:calc(100% + 4px);left:var(--pct)}.sh3-slider--vertical.svelte-13va6lu .sh3-slider__value:where(.svelte-13va6lu){left:calc(100% + 6px);bottom:var(--pct);transform:translateY(50%)}.sh3-range.svelte-rdbrc5{--thumb-size: 14px;position:relative;width:200px;height:var(--thumb-size)}.sh3-range--sm.svelte-rdbrc5{--thumb-size: 12px}.sh3-range__track.svelte-rdbrc5{position:absolute;top:50%;left:0;right:0;height:4px;transform:translateY(-50%);background:var(--sh3-track-bg);border:1px solid var(--sh3-track-border);border-radius:var(--sh3-widget-radius-pill)}.sh3-range__fill.svelte-rdbrc5{position:absolute;top:0;bottom:0;left:var(--lo);width:calc(var(--hi) - var(--lo));background:var(--sh3-track-fill);border-radius:inherit}.sh3-range__native.svelte-rdbrc5{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;background:transparent;-webkit-appearance:none;appearance:none;pointer-events:none}.sh3-range__native.svelte-rdbrc5:disabled{opacity:1;cursor:not-allowed}.sh3-range__native.svelte-rdbrc5::-webkit-slider-thumb{-webkit-appearance:none;width:var(--thumb-size);height:var(--thumb-size);border-radius:50%;background:var(--sh3-thumb-bg);border:2px solid var(--sh3-thumb-border);box-shadow:var(--sh3-thumb-shadow);pointer-events:auto;cursor:pointer;opacity:1}.sh3-range__native.svelte-rdbrc5::-moz-range-thumb{width:var(--thumb-size);height:var(--thumb-size);border-radius:50%;background:var(--sh3-thumb-bg);border:2px solid var(--sh3-thumb-border);box-shadow:var(--sh3-thumb-shadow);pointer-events:auto;cursor:pointer;opacity:1}.sh3-range__native.svelte-rdbrc5:disabled::-webkit-slider-thumb{background:var(--sh3-fg-subtle);border-color:var(--sh3-border-strong);cursor:not-allowed;opacity:1}.sh3-range__native.svelte-rdbrc5:disabled::-moz-range-thumb{background:var(--sh3-fg-subtle);border-color:var(--sh3-border-strong);cursor:not-allowed;opacity:1}.sh3-range.svelte-rdbrc5:has(.sh3-range__native:where(.svelte-rdbrc5):disabled) .sh3-range__fill:where(.svelte-rdbrc5){background:var(--sh3-border-strong)}.sh3-range__native.svelte-rdbrc5::-webkit-slider-runnable-track,.sh3-range__native.svelte-rdbrc5::-moz-range-track{background:transparent}.sh3-range--invalid.svelte-rdbrc5 .sh3-range__track:where(.svelte-rdbrc5){border-color:var(--sh3-error)}.sh3-sg.svelte-1lqyi0d{display:inline-flex;gap:var(--sh3-pad-md)}.sh3-sg--vertical.svelte-1lqyi0d{flex-direction:row;align-items:end}.sh3-sg--horizontal.svelte-1lqyi0d{flex-direction:column}.sh3-sg__channel.svelte-1lqyi0d{display:flex;gap:4px;align-items:center}.sh3-sg--vertical.svelte-1lqyi0d .sh3-sg__channel:where(.svelte-1lqyi0d){flex-direction:column-reverse;align-items:center}.sh3-sg__label.svelte-1lqyi0d{font-size:.75rem;color:var(--sh3-fg-muted);min-width:60px}.sh3-sg--vertical.svelte-1lqyi0d .sh3-sg__label:where(.svelte-1lqyi0d){min-width:0;text-align:center}.sh3-swatch.svelte-6ri2j2{display:inline-flex;flex-direction:column;gap:4px}.sh3-swatch__label.svelte-6ri2j2{font-size:.75rem;color:var(--sh3-fg-muted)}.sh3-swatch__btn.svelte-6ri2j2{display:inline-flex;align-items:center;gap:8px;height:var(--sh3-field-height-md);padding:0 var(--sh3-field-pad-x);background:var(--sh3-input-bg);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);color:var(--sh3-fg);cursor:pointer;font:inherit}.sh3-swatch--sm.svelte-6ri2j2 .sh3-swatch__btn:where(.svelte-6ri2j2){height:var(--sh3-field-height-sm)}.sh3-swatch__btn.svelte-6ri2j2:hover:not(:disabled){background:var(--sh3-bg-elevated);filter:none}.sh3-swatch__btn.svelte-6ri2j2:focus-visible{outline:none;box-shadow:var(--sh3-focus-ring)}.sh3-swatch__btn.svelte-6ri2j2:disabled{opacity:.55;cursor:not-allowed}.sh3-swatch__dot.svelte-6ri2j2{width:16px;height:16px;border:1px solid var(--sh3-border-strong);border-radius:var(--sh3-radius-sm);background:var(--swatch-color)}.sh3-swatch__hex.svelte-6ri2j2{font-family:var(--sh3-font-mono);font-size:.75rem}.sh3-fp.svelte-24jk95{display:inline-flex;align-items:stretch;height:var(--sh3-field-height-md);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);background:var(--sh3-input-bg);overflow:hidden;cursor:pointer;font-size:.8125rem}.sh3-fp--sm.svelte-24jk95{height:var(--sh3-field-height-sm)}.sh3-fp--invalid.svelte-24jk95{border-color:var(--sh3-error)}.sh3-fp.svelte-24jk95:focus-within{box-shadow:var(--sh3-focus-ring);border-color:var(--sh3-input-border-focus)}.sh3-fp__native.svelte-24jk95{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.sh3-fp__btn.svelte-24jk95{display:inline-flex;align-items:center;padding:0 var(--sh3-field-pad-x);background:var(--sh3-bg-elevated);color:var(--sh3-fg);border-right:1px solid var(--sh3-border)}.sh3-fp__name.svelte-24jk95{display:inline-flex;align-items:center;padding:0 var(--sh3-field-pad-x);color:var(--sh3-fg-muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sh3-listbox.svelte-1tyxvrs{background:var(--sh3-bg-elevated);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);box-shadow:var(--sh3-shadow-sm);min-width:180px;max-width:320px;color:var(--sh3-fg);font-size:.8125rem;overflow:hidden}.sh3-listbox__search.svelte-1tyxvrs{width:100%;height:26px;padding:0 8px;background:var(--sh3-input-bg);border:none;border-bottom:1px solid var(--sh3-border);color:var(--sh3-fg);font:inherit;outline:none}.sh3-listbox__list.svelte-1tyxvrs{max-height:280px;overflow-y:auto;padding:4px 0}.sh3-listbox__list.svelte-1tyxvrs>div:where(.svelte-1tyxvrs){display:flex;align-items:center;gap:6px;padding:4px 10px;cursor:pointer}.sh3-listbox__opt--active.svelte-1tyxvrs{background:var(--sh3-bg)}.sh3-listbox__opt--selected.svelte-1tyxvrs{color:var(--sh3-accent)}.sh3-listbox__opt--active.sh3-listbox__opt--selected.svelte-1tyxvrs{background:var(--sh3-accent);color:var(--sh3-fg-on-accent)}.sh3-listbox__list.svelte-1tyxvrs>div[aria-disabled=true]:where(.svelte-1tyxvrs){color:var(--sh3-fg-subtle);cursor:not-allowed}.sh3-listbox__check.svelte-1tyxvrs{flex-shrink:0;width:12px;height:12px}.sh3-listbox__check--on.svelte-1tyxvrs:before{content:"";display:block;width:100%;height:100%;background:var(--sh3-accent);clip-path:polygon(14% 44%,0 60%,40% 100%,100% 20%,85% 8%,38% 70%)}.sh3-listbox__opt--active.sh3-listbox__opt--selected.svelte-1tyxvrs .sh3-listbox__check--on:where(.svelte-1tyxvrs):before{background:var(--sh3-fg-on-accent)}.sh3-listbox__empty.svelte-1tyxvrs{padding:6px 10px;color:var(--sh3-fg-muted);font-style:italic}.sh3-select.svelte-1q3zxph{display:inline-flex;flex-direction:column;gap:4px;font-size:.8125rem;position:relative}.sh3-select__label.svelte-1q3zxph{color:var(--sh3-fg-muted);font-size:.75rem}.sh3-select__btn.svelte-1q3zxph{display:inline-flex;align-items:center;gap:8px;height:var(--sh3-field-height-md);min-width:140px;padding:0 var(--sh3-field-pad-x);background:var(--sh3-input-bg);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);cursor:pointer;font:inherit;text-align:left}.sh3-select--sm.svelte-1q3zxph .sh3-select__btn:where(.svelte-1q3zxph){height:var(--sh3-field-height-sm)}.sh3-select__btn.svelte-1q3zxph:focus-visible{outline:none;box-shadow:var(--sh3-focus-ring);border-color:var(--sh3-input-border-focus)}.sh3-select__btn.svelte-1q3zxph:disabled{opacity:.55;cursor:not-allowed}.sh3-select--invalid.svelte-1q3zxph .sh3-select__btn:where(.svelte-1q3zxph){border-color:var(--sh3-error)}.sh3-select__display.svelte-1q3zxph{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sh3-select__display--placeholder.svelte-1q3zxph,.sh3-select__chevron.svelte-1q3zxph{color:var(--sh3-fg-muted)}.sh3-select__native.svelte-1q3zxph{position:absolute;width:1px;height:1px;margin:0;padding:0;border:0;opacity:0;pointer-events:none}.sh3-picker.svelte-1rlwvrb{display:flex;flex-direction:column;gap:6px;border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px;background:var(--sh3-bg-elevated)}.sh3-picker__search.svelte-1rlwvrb{width:100%;padding:4px 6px;border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);background:var(--sh3-bg);color:var(--sh3-fg);font:inherit;font-size:12px}.sh3-picker__list.svelte-1rlwvrb{display:flex;flex-direction:column;max-height:200px;overflow-y:auto}.sh3-picker__row.svelte-1rlwvrb{display:flex;align-items:center;gap:8px;padding:4px 6px;cursor:pointer;border-radius:var(--sh3-radius-sm, 3px)}.sh3-picker__row.svelte-1rlwvrb:hover{background:var(--sh3-bg)}.sh3-picker__row-text.svelte-1rlwvrb{display:flex;flex-direction:column;gap:0}.sh3-picker__row-label.svelte-1rlwvrb{font-size:13px}.sh3-picker__row-sub.svelte-1rlwvrb{font-size:11px;color:var(--sh3-fg-muted)}.sh3-picker__status.svelte-1rlwvrb{margin:0;padding:8px 6px;color:var(--sh3-fg-muted);font-size:12px}.sh3-picker__status--error.svelte-1rlwvrb{color:var(--sh3-error, #c33)}.sh3-picker__retry.svelte-1rlwvrb{align-self:flex-start;margin:0 6px 8px;background:var(--sh3-bg);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:2px 8px;font:inherit;font-size:12px;cursor:pointer}.sh3-picker__footer.svelte-1rlwvrb{margin:0;font-size:11px;color:var(--sh3-fg-muted);text-align:right}.sh3-picker--disabled.svelte-1rlwvrb .sh3-picker__row:where(.svelte-1rlwvrb){cursor:not-allowed;opacity:.6}.sh3-dfp.svelte-hcr0gi{display:inline-flex;font-size:.8125rem}.sh3-dfp__btn.svelte-hcr0gi{display:inline-flex;align-items:stretch;height:var(--sh3-field-height-md);min-width:240px;border:1px solid var(--sh3-border);border-radius:var(--sh3-widget-radius);background:var(--sh3-input-bg);cursor:pointer;font:inherit;text-align:left;overflow:hidden;padding:0}.sh3-dfp--sm.svelte-hcr0gi .sh3-dfp__btn:where(.svelte-hcr0gi){height:var(--sh3-field-height-sm)}.sh3-dfp--invalid.svelte-hcr0gi .sh3-dfp__btn:where(.svelte-hcr0gi){border-color:var(--sh3-error)}.sh3-dfp__btn.svelte-hcr0gi:hover{border-color:var(--sh3-input-border-focus)}.sh3-dfp__btn.svelte-hcr0gi:focus-visible{outline:none;box-shadow:var(--sh3-focus-ring);border-color:var(--sh3-input-border-focus)}.sh3-dfp__btn.svelte-hcr0gi:disabled{opacity:.55;cursor:not-allowed}.sh3-dfp__label.svelte-hcr0gi{display:inline-flex;align-items:center;padding:0 var(--sh3-field-pad-x);background:var(--sh3-bg-elevated);color:var(--sh3-fg);border-right:1px solid var(--sh3-border);white-space:nowrap;flex-shrink:0}.sh3-dfp__path.svelte-hcr0gi{display:inline-flex;align-items:center;padding:0 var(--sh3-field-pad-x);color:var(--sh3-fg);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--sh3-font-mono);font-size:.75rem}.sh3-dfp__path--empty.svelte-hcr0gi{color:var(--sh3-fg-muted);font-family:inherit;font-size:.8125rem;font-style:italic}.sh3-dfp__chevron.svelte-hcr0gi{display:inline-flex;align-items:center;padding:0 8px;color:var(--sh3-fg-muted);flex-shrink:0}.sh3-title.svelte-foqg2v{display:inline-block;line-height:0;overflow:hidden}.sh3-title.svelte-foqg2v canvas{transform:scale(var(--sh3-title-scale));transform-origin:top left;display:block}.sh3-title-fallback.svelte-foqg2v{margin:0;font-size:42px;color:var(--sh3-accent);letter-spacing:2px}.home-section.svelte-1bwi92v{width:100%;max-width:720px;margin-bottom:28px}.home-section-header.svelte-1bwi92v{display:flex;align-items:center;gap:6px;width:100%;margin:0 0 12px;padding:0;background:transparent;border:none;color:var(--sh3-fg-subtle);font:inherit;font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;text-align:left;cursor:pointer}.home-section-header.svelte-1bwi92v:hover{color:var(--sh3-fg)}.home-section-header.svelte-1bwi92v:focus-visible{outline:2px solid var(--sh3-accent);outline-offset:2px;border-radius:2px}.home-section-chevron.svelte-1bwi92v{width:12px;height:12px;flex-shrink:0;transition:transform .12s ease}.home-section-chevron.open.svelte-1bwi92v{transform:rotate(90deg)}.home-section-title.svelte-1bwi92v{flex:1}.tabbed-panel.svelte-1kxcyhf{display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;background:var(--sh3-grad-bg, var(--sh3-bg))}.tab-strip.svelte-1kxcyhf{position:relative;flex:0 0 auto;display:flex;gap:1px;background:var(--sh3-grad-bg-sunken, var(--sh3-bg-sunken));border-bottom:1px solid var(--sh3-border);padding:0 var(--sh3-pad-sm);user-select:none}.tab.svelte-1kxcyhf{appearance:none;background:transparent;border:none;color:var(--sh3-fg-muted);font:inherit;font-size:12px;padding:var(--sh3-pad-sm) var(--sh3-pad-md);margin-top:2px;display:inline-flex;align-items:center;gap:var(--sh3-pad-sm);cursor:pointer;border-top:2px solid transparent;border-radius:2px 2px 0 0;touch-action:none}.tab.svelte-1kxcyhf:hover{color:var(--sh3-fg);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated))}.tab.active.svelte-1kxcyhf{color:var(--sh3-fg);background:var(--sh3-grad-bg, var(--sh3-bg));border-top-color:var(--sh3-accent)}.tab-icon.svelte-1kxcyhf{font-size:11px}.tab-label.svelte-1kxcyhf{white-space:nowrap}.tab-dirty.svelte-1kxcyhf{width:8px;height:8px;border-radius:50%;background:var(--sh3-accent);flex-shrink:0}.tab-close.svelte-1kxcyhf{display:inline-flex;font-size:10px;line-height:1;padding:2px;border-radius:var(--sh3-radius-sm);color:var(--sh3-fg-muted);cursor:pointer;flex-shrink:0;margin-left:auto}.tab-close.svelte-1kxcyhf:hover{color:var(--sh3-fg);background:var(--sh3-bg-sunken)}.drop-indicator.svelte-1kxcyhf{position:absolute;width:2px;background:var(--sh3-accent);box-shadow:0 0 6px var(--sh3-accent);pointer-events:none;border-radius:1px}.tab-body.svelte-1kxcyhf{flex:1 1 auto;position:relative;min-width:0;min-height:0;overflow:hidden}.tab-body-pane.svelte-1kxcyhf{position:absolute;inset:0;min-width:0;min-height:0;display:none}.tab-body-pane.active.svelte-1kxcyhf{display:block}.delete-project-dialog.svelte-6j13aq{display:flex;flex-direction:column;gap:16px;padding:20px 24px;min-width:400px;max-width:520px}.delete-project-dialog__title.svelte-6j13aq{font-size:16px;font-weight:600;color:var(--sh3-fg)}.delete-project-dialog__body.svelte-6j13aq{font-size:13px;color:var(--sh3-fg-muted, var(--sh3-fg));line-height:1.5}.delete-project-dialog__opt.svelte-6j13aq{display:flex;align-items:flex-start;gap:8px;font-size:13px;color:var(--sh3-fg);cursor:pointer}.delete-project-dialog__opt.svelte-6j13aq input[type=checkbox]:where(.svelte-6j13aq){appearance:none;-webkit-appearance:none;width:16px;height:16px;margin-top:3px;border:1px solid var(--sh3-border);border-radius:3px;background:var(--sh3-bg-elevated);cursor:pointer;flex-shrink:0;position:relative}.delete-project-dialog__opt.svelte-6j13aq input[type=checkbox]:where(.svelte-6j13aq):checked{background:var(--sh3-accent);border-color:var(--sh3-accent)}.delete-project-dialog__opt.svelte-6j13aq input[type=checkbox]:where(.svelte-6j13aq):checked:after{content:"";position:absolute;left:4px;top:1px;width:6px;height:10px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}.delete-project-dialog__opt.svelte-6j13aq input[type=checkbox]:where(.svelte-6j13aq):disabled{opacity:.5;cursor:not-allowed}.delete-project-dialog__path.svelte-6j13aq{display:block;font-family:var(--sh3-font-mono, monospace);font-size:11px;color:var(--sh3-fg-muted);background:var(--sh3-bg-elevated);padding:2px 6px;border-radius:var(--sh3-radius-sm, 3px);margin-top:2px;word-break:break-all}.delete-project-dialog__actions.svelte-6j13aq{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.delete-project-dialog__btn.svelte-6j13aq{font-size:13px;padding:6px 14px;border-radius:var(--sh3-radius-sm, 4px);border:1px solid var(--sh3-border-strong);background:transparent;color:var(--sh3-fg);cursor:pointer}.delete-project-dialog__btn.svelte-6j13aq:disabled{opacity:.6;cursor:not-allowed}.delete-project-dialog__btn--danger.svelte-6j13aq{color:var(--sh3-error, #d32f2f);border-color:var(--sh3-error, #d32f2f)}.project-manage.svelte-1oy3640{position:absolute;inset:0;display:flex;flex-direction:column;font:inherit;color:var(--sh3-fg);background:var(--sh3-bg)}.header.svelte-1oy3640{padding:16px 16px 8px;flex:0 0 auto;border-bottom:1px solid var(--sh3-border)}.tabs.svelte-1oy3640{flex:1 1 auto;min-height:0;position:relative}.tab-pane.svelte-1oy3640{padding:16px;height:100%;overflow-y:auto;box-sizing:border-box}.muted.svelte-1oy3640{color:var(--sh3-fg-muted);font-style:italic;font-size:13px}.mount-list.svelte-1oy3640{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.mount-row.svelte-1oy3640{padding:6px 0;border-bottom:1px solid var(--sh3-border);font-size:13px}.mount-row.svelte-1oy3640 label:where(.svelte-1oy3640){display:flex;align-items:center;gap:8px;cursor:pointer}.mount-row.svelte-1oy3640 input[type=checkbox]:where(.svelte-1oy3640){cursor:pointer}.mount-status.svelte-1oy3640{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:#999}.mount-status[data-status=resolved].svelte-1oy3640{background:#4caf50}.mount-status[data-status=unresolved].svelte-1oy3640{background:#ff9800}.mount-status[data-status=error].svelte-1oy3640{background:#f44336}.mount-label.svelte-1oy3640{font-weight:500}.mount-id.svelte-1oy3640{font-size:11px;color:var(--sh3-fg-muted);font-family:var(--sh3-font-mono, monospace);margin-left:auto}h2.svelte-1oy3640{margin:0 0 8px;font-size:16px}.project-id.svelte-1oy3640{font-size:12px;color:var(--sh3-fg-muted);margin:0 0 16px}.project-id.svelte-1oy3640 code:where(.svelte-1oy3640){font-family:var(--sh3-font-mono, monospace)}.field.svelte-1oy3640{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;font-size:13px}.field.svelte-1oy3640 span:where(.svelte-1oy3640){color:var(--sh3-fg-muted)}.hint.svelte-1oy3640{font-size:11px;color:var(--sh3-fg-muted)}.hint.svelte-1oy3640 code:where(.svelte-1oy3640){font-family:var(--sh3-font-mono, monospace);color:var(--sh3-fg);background:var(--sh3-bg-elevated);padding:0 4px;border-radius:var(--sh3-radius-sm, 3px)}.field.svelte-1oy3640 input:where(.svelte-1oy3640),.field.svelte-1oy3640 textarea:where(.svelte-1oy3640){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 8px;font:inherit;font-size:13px}.field.svelte-1oy3640 textarea:where(.svelte-1oy3640){resize:vertical;min-height:60px}.error.svelte-1oy3640{color:var(--sh3-error, #c33);font-size:13px;margin:0 0 8px}.actions.svelte-1oy3640{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--sh3-border);background:var(--sh3-bg);flex:0 0 auto}.actions.svelte-1oy3640 button:where(.svelte-1oy3640){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-1oy3640 button:where(.svelte-1oy3640):hover{border-color:var(--sh3-accent)}.actions.svelte-1oy3640 button.primary:where(.svelte-1oy3640){background:var(--sh3-accent);color:#fff;border-color:var(--sh3-accent)}.actions.svelte-1oy3640 button.danger:where(.svelte-1oy3640){margin-left:auto;color:var(--sh3-error, #c33)}.actions.svelte-1oy3640 button:where(.svelte-1oy3640):disabled{opacity:.5;cursor:not-allowed}.projects-grid.svelte-yosqc3{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px}.project-card-wrap.svelte-yosqc3{position:relative}.project-card.svelte-yosqc3{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:12px 14px;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-md);cursor:pointer;text-align:left;color:inherit;font:inherit;transition:border-color .12s ease,transform .12s ease;width:100%}.project-card-edit.svelte-yosqc3{position:absolute;top:6px;right:6px;background:transparent;border:0;color:var(--sh3-fg-muted);cursor:pointer;padding:2px 6px;font-size:14px;border-radius:var(--sh3-radius-sm, 3px)}.project-card-edit.svelte-yosqc3:hover{color:var(--sh3-fg);background:var(--sh3-bg-elevated)}.project-card.svelte-yosqc3:hover{border-color:var(--sh3-accent);transform:translateY(-1px)}.project-card.active.svelte-yosqc3{border-color:var(--sh3-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--sh3-accent) 40%,transparent)}.project-name.svelte-yosqc3{font-weight:600;font-size:13px}.project-meta.svelte-yosqc3{font-size:11px;color:var(--sh3-fg-muted)}.saved-layouts-grid.svelte-1ncltuf{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:18px 14px}.saved-layout-card.svelte-1ncltuf{display:flex;flex-direction:column;align-items:center;gap:6px;padding:0;background:transparent;border:none;color:inherit;font:inherit;cursor:pointer}.saved-layout-card-square.svelte-1ncltuf{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background:var(--saved-layout-color, var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated)));border:1px dashed var(--sh3-border);border-radius:var(--sh3-radius-md);box-shadow:0 2px 6px #00000040,0 1px 2px #00000026;transition:transform .12s ease,border-color .12s ease,box-shadow .12s ease,background .12s ease}.saved-layout-card.svelte-1ncltuf:hover .saved-layout-card-square:where(.svelte-1ncltuf){border-color:var(--sh3-accent);transform:translateY(-1px);box-shadow:0 6px 14px #0000004d,0 0 0 1px color-mix(in srgb,var(--sh3-accent) 35%,transparent),0 4px 12px color-mix(in srgb,var(--sh3-accent) 18%,transparent)}.saved-layout-card-icon.svelte-1ncltuf{width:28px;height:28px;color:var(--sh3-fg)}.saved-layout-card-label.svelte-1ncltuf{font-weight:600;font-size:11px;line-height:1.2;text-align:center;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;word-break:break-word}.saved-layout-card--tinted.svelte-1ncltuf .saved-layout-card-square:where(.svelte-1ncltuf){background:var(--card-color);border-style:solid}.sh3-icon-picker.svelte-h9dluc{display:flex;flex-direction:column;gap:6px}.sh3-icon-picker__label.svelte-h9dluc{font-size:13px;color:var(--sh3-fg-muted)}.sh3-icon-picker.svelte-h9dluc input[type=search]:where(.svelte-h9dluc){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 8px;font:inherit;font-size:13px}.sh3-icon-picker__grid.svelte-h9dluc{display:grid;grid-template-columns:repeat(auto-fill,minmax(36px,1fr));gap:4px;max-height:220px;overflow-y:auto;padding:4px;background:var(--sh3-bg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px)}.sh3-icon-picker__tile.svelte-h9dluc{aspect-ratio:1 / 1;display:flex;align-items:center;justify-content:center;background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid transparent;border-radius:var(--sh3-radius-sm, 3px);cursor:pointer;padding:0;font:inherit}.sh3-icon-picker__tile--none.svelte-h9dluc{font-size:16px;color:var(--sh3-fg-muted)}.sh3-icon-picker__tile.svelte-h9dluc:hover{border-color:var(--sh3-accent)}.sh3-icon-picker__tile--selected.svelte-h9dluc{outline:2px solid var(--sh3-accent);outline-offset:-2px}.sh3-icon-picker__tile.svelte-h9dluc svg:where(.svelte-h9dluc){width:18px;height:18px}.sh3-icon-picker--disabled.svelte-h9dluc .sh3-icon-picker__tile:where(.svelte-h9dluc){cursor:not-allowed;opacity:.5}.app-appearance.svelte-1v8d4f6{padding:16px 20px;max-width:460px;color:var(--sh3-fg);background:var(--sh3-bg);font:inherit}h2.svelte-1v8d4f6{margin:0 0 12px;font-size:16px}.row.svelte-1v8d4f6{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;font-size:13px}.row.svelte-1v8d4f6 span:where(.svelte-1v8d4f6){color:var(--sh3-fg-muted)}.row.svelte-1v8d4f6 span:where(.svelte-1v8d4f6) em:where(.svelte-1v8d4f6){font-style:italic;opacity:.7}.name-input.svelte-1v8d4f6{background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 8px;font:inherit;font-size:13px}.link.svelte-1v8d4f6{align-self:flex-start;background:transparent;border:none;padding:0;color:var(--sh3-accent);font:inherit;font-size:13px;cursor:pointer;text-decoration:underline}.link--align-right.svelte-1v8d4f6{align-self:flex-end;margin-top:4px}.link.svelte-1v8d4f6:hover{color:var(--sh3-fg)}.preview.svelte-1v8d4f6{display:flex;justify-content:center;margin-bottom:16px}.preview-card.svelte-1v8d4f6{display:flex;flex-direction:column;align-items:center;gap:6px;max-width:160px}.preview-card-square.svelte-1v8d4f6{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-md);box-shadow:0 2px 6px #00000040,0 1px 2px #00000026}.preview-card--tinted.svelte-1v8d4f6 .preview-card-square:where(.svelte-1v8d4f6){background:var(--card-color)}.preview-card-icon.svelte-1v8d4f6{width:28px;height:28px;color:var(--sh3-fg)}.preview-card-label.svelte-1v8d4f6{font-weight:600;font-size:11px;line-height:1.2;text-align:center;word-break:break-word;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2}.actions.svelte-1v8d4f6{display:flex;gap:8px;margin-top:16px}.actions.svelte-1v8d4f6 button:where(.svelte-1v8d4f6){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-1v8d4f6 button.primary:where(.svelte-1v8d4f6){background:var(--sh3-accent);color:#fff;border-color:var(--sh3-accent)}.actions.svelte-1v8d4f6 button:where(.svelte-1v8d4f6):hover{border-color:var(--sh3-accent)}.actions.svelte-1v8d4f6 button:where(.svelte-1v8d4f6):disabled{opacity:.5;cursor:not-allowed}.sh3-home.svelte-11gxeaw{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:48px 24px;overflow:auto;background:var(--sh3-grad-bg, var(--sh3-bg));color:var(--sh3-fg);font-family:system-ui,sans-serif}.sh3-home-header.svelte-11gxeaw{text-align:center;margin-bottom:24px;display:flex;flex-direction:column;align-items:center;gap:12px}.sh3-home-title-row.svelte-11gxeaw{display:flex;align-items:baseline;gap:6px}.sh3-home-credit.svelte-11gxeaw{font-size:11px;color:var(--sh3-fg-muted);letter-spacing:.04em;margin-top:-4px}.sh3-home-credit.svelte-11gxeaw a:where(.svelte-11gxeaw){color:var(--sh3-fg-subtle);text-decoration:none;border-bottom:1px dotted var(--sh3-fg-muted)}.sh3-home-credit.svelte-11gxeaw a:where(.svelte-11gxeaw):hover{color:var(--sh3-accent);border-bottom-color:var(--sh3-accent)}.sh3-home-version.svelte-11gxeaw{font-size:14px;color:var(--sh3-fg-subtle);letter-spacing:.04em}.sh3-home-alpha.svelte-11gxeaw{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#fff;background:var(--sh3-accent);padding:2px 8px;border-radius:8px;position:relative;top:-1px}.sh3-home-filter.svelte-11gxeaw{width:100%;max-width:720px;margin-bottom:24px}.sh3-home-filter-input.svelte-11gxeaw{width:100%;padding:10px 14px;font:inherit;font-size:14px;color:var(--sh3-fg);background:var(--sh3-bg-elevated);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-md);outline:none;transition:border-color .12s ease,box-shadow .12s ease}.sh3-home-filter-input.svelte-11gxeaw::placeholder{color:var(--sh3-fg-muted)}.sh3-home-filter-input.svelte-11gxeaw:focus{border-color:var(--sh3-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--sh3-accent) 25%,transparent)}.sh3-home-empty.svelte-11gxeaw{color:var(--sh3-fg-muted);font-style:italic}.sh3-home-grid.svelte-11gxeaw{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:18px 14px}.sh3-home-card.svelte-11gxeaw{display:flex;flex-direction:column;align-items:center;gap:6px;padding:0;background:transparent;border:none;color:inherit;font:inherit;cursor:pointer}.sh3-home-card-square.svelte-11gxeaw{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-md);box-shadow:0 2px 6px #00000040,0 1px 2px #00000026;transition:transform .12s ease,border-color .12s ease,box-shadow .12s ease,background .12s ease}.sh3-home-card.svelte-11gxeaw:hover .sh3-home-card-square:where(.svelte-11gxeaw){border-color:var(--sh3-accent);transform:translateY(-1px);box-shadow:0 6px 14px #0000004d,0 0 0 1px color-mix(in srgb,var(--sh3-accent) 35%,transparent),0 4px 12px color-mix(in srgb,var(--sh3-accent) 18%,transparent)}.sh3-home-card.svelte-11gxeaw:focus-visible{outline:none}.sh3-home-card.svelte-11gxeaw:focus-visible .sh3-home-card-square:where(.svelte-11gxeaw){border-color:var(--sh3-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--sh3-accent) 40%,transparent)}.sh3-home-card.svelte-11gxeaw:active .sh3-home-card-square:where(.svelte-11gxeaw){transform:translateY(0)}.sh3-home-card-label.svelte-11gxeaw{font-weight:600;font-size:11px;line-height:1.2;text-align:center;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;word-break:break-word}.sh3-home-card-icon.svelte-11gxeaw{width:28px;height:28px;color:var(--sh3-fg)}.sh3-home-card--tinted.svelte-11gxeaw .sh3-home-card-square:where(.svelte-11gxeaw){background:var(--card-color)}.keys-peers.svelte-1s56qq{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.keys-peers-header.svelte-1s56qq{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.keys-peers-header.svelte-1s56qq h2:where(.svelte-1s56qq){margin:0;font-size:18px}.keys-peers-list.svelte-1s56qq{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.keys-peers-item.svelte-1s56qq{display:flex;justify-content:space-between;align-items:flex-start;padding:12px 16px;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);gap:12px}.keys-peers-info.svelte-1s56qq{display:flex;flex-direction:column;gap:3px;min-width:0}.keys-peers-label.svelte-1s56qq{font-weight:600}.keys-peers-meta.svelte-1s56qq{font-size:11px;color:var(--sh3-fg-subtle)}.keys-peers-actions.svelte-1s56qq{display:flex;gap:6px;flex-shrink:0;align-items:flex-start;padding-top:2px}.keys-peers-btn-danger.svelte-1s56qq{background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);font-size:12px;padding:4px 10px;border-radius:var(--sh3-radius, 6px);cursor:pointer}.keys-peers-btn-secondary.svelte-1s56qq{background:transparent;color:var(--sh3-fg-subtle);border:1px solid var(--sh3-border, #3a3a5c);font-size:12px;padding:4px 10px;border-radius:var(--sh3-radius, 6px);cursor:pointer}.keys-peers-muted.svelte-1s56qq{color:var(--sh3-fg-muted);font-style:italic}.keys-peers-error.svelte-1s56qq{color:var(--sh3-error, #d32f2f);font-size:13px}.confirm-dialog.svelte-1k1962w{display:flex;flex-direction:column;gap:16px;padding:20px 24px;min-width:360px;max-width:480px}.confirm-dialog-title.svelte-1k1962w{font-size:16px;font-weight:600;color:var(--sh3-fg)}.confirm-dialog-body.svelte-1k1962w{font-size:13px;color:var(--sh3-fg-muted, var(--sh3-fg));line-height:1.5}.confirm-dialog-actions.svelte-1k1962w{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.confirm-dialog-btn.svelte-1k1962w{font-size:13px;padding:6px 14px;border-radius:var(--sh3-radius-sm, 4px);border:1px solid var(--sh3-border-strong);background:transparent;color:var(--sh3-fg);cursor:pointer}.confirm-dialog-btn.svelte-1k1962w:disabled{opacity:.6;cursor:not-allowed}.confirm-dialog-btn-default.svelte-1k1962w{background:var(--sh3-bg-elevated)}.confirm-dialog-btn-danger.svelte-1k1962w{background:transparent;color:var(--sh3-error, #d32f2f);border-color:var(--sh3-error, #d32f2f)}.perm-modal-backdrop.svelte-1ipp1r6{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.perm-modal-panel.svelte-1ipp1r6{background:var(--sh3-bg, #1e1e1e);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-md);box-shadow:0 8px 32px #0006;min-width:360px;max-width:520px;max-height:80vh;display:flex;flex-direction:column;font-family:var(--sh3-font-ui)}.perm-modal-header.svelte-1ipp1r6{padding:16px 20px 12px;border-bottom:1px solid var(--sh3-border, #444)}.perm-modal-header.svelte-1ipp1r6 h3:where(.svelte-1ipp1r6){margin:0 0 4px;font-size:1.0625rem;font-weight:600}.perm-modal-subtitle.svelte-1ipp1r6{font-size:.8125rem;color:var(--sh3-fg-muted, #888)}.perm-modal-author.svelte-1ipp1r6{margin-left:8px}.perm-modal-body.svelte-1ipp1r6{padding:16px 20px;overflow-y:auto;flex:1}.perm-modal-intro.svelte-1ipp1r6{margin:0 0 8px;font-size:.875rem}.perm-modal-empty.svelte-1ipp1r6{margin:0;font-size:.875rem;color:var(--sh3-fg-muted, #888);font-style:italic}.perm-modal-list.svelte-1ipp1r6{list-style:none;margin:0 0 12px;padding:0;display:flex;flex-direction:column;gap:8px}.perm-modal-item.svelte-1ipp1r6{padding:8px 10px;background:var(--sh3-input-bg, #2a2a2a);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-sm)}.perm-modal-item-title.svelte-1ipp1r6{font-size:.875rem;font-weight:600}.perm-modal-item-desc.svelte-1ipp1r6{font-size:.75rem;color:var(--sh3-fg-muted, #888);margin-top:2px}.perm-modal-added.svelte-1ipp1r6 .perm-modal-item:where(.svelte-1ipp1r6){border-color:color-mix(in srgb,var(--sh3-warning, #ff9800) 60%,var(--sh3-border, #444))}.perm-modal-removed.svelte-1ipp1r6 .perm-modal-item:where(.svelte-1ipp1r6){opacity:.75}.perm-modal-warn-heading.svelte-1ipp1r6{margin-top:12px}.perm-modal-warn-item.svelte-1ipp1r6{border-color:color-mix(in srgb,var(--sh3-warning, #ff9800) 60%,var(--sh3-border, #444));background:color-mix(in srgb,var(--sh3-warning, #ff9800) 8%,var(--sh3-input-bg, #2a2a2a))}.perm-modal-warn-item.svelte-1ipp1r6 .perm-modal-item-title:where(.svelte-1ipp1r6){color:var(--sh3-warning, #ff9800)}.perm-modal-footer.svelte-1ipp1r6{padding:12px 20px;border-top:1px solid var(--sh3-border, #444);display:flex;justify-content:flex-end;gap:8px}.perm-modal-cancel.svelte-1ipp1r6{padding:6px 14px;background:transparent;color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font-size:.8125rem;cursor:pointer}.perm-modal-confirm.svelte-1ipp1r6{padding:6px 14px;background:var(--sh3-accent, #007acc);color:#fff;border:1px solid var(--sh3-accent, #007acc);border-radius:var(--sh3-radius);font-size:.8125rem;cursor:pointer;font-weight:600}.store-view.svelte-1aafzt0{font-family:var(--sh3-font-ui);color:var(--sh3-fg, #e0e0e0);background:var(--sh3-bg, #1e1e1e);padding:16px;height:100%;overflow-y:auto;box-sizing:border-box}.store-header.svelte-1aafzt0{margin-bottom:16px}.store-header.svelte-1aafzt0 h2:where(.svelte-1aafzt0){margin:0 0 8px;font-size:1.25rem;font-weight:600}.store-controls.svelte-1aafzt0{display:flex;gap:8px;flex-wrap:wrap}.store-search.svelte-1aafzt0{flex:1;min-width:160px;padding:6px 10px;background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font-family:inherit;font-size:.875rem}.store-search.svelte-1aafzt0::placeholder{color:var(--sh3-fg-muted, #888)}.store-filter.svelte-1aafzt0{padding:6px 10px;background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font-family:inherit;font-size:.875rem}.store-refresh.svelte-1aafzt0:disabled{opacity:.6;cursor:not-allowed}.store-error.svelte-1aafzt0{padding:8px 12px;margin-bottom:12px;background:color-mix(in srgb,var(--sh3-error, #d32f2f) 15%,transparent);color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);border-radius:var(--sh3-radius);font-size:.8125rem}.store-grid.svelte-1aafzt0{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.store-card.svelte-1aafzt0{background:var(--sh3-input-bg, #2a2a2a);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius-md);padding:14px;display:flex;flex-direction:column;gap:8px}.store-card.svelte-1aafzt0:hover{border-color:var(--sh3-accent, #007acc)}.store-card-header.svelte-1aafzt0{display:flex;align-items:center;gap:10px}.store-card-icon.svelte-1aafzt0{width:36px;height:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.store-icon-img.svelte-1aafzt0{width:36px;height:36px;border-radius:var(--sh3-radius);object-fit:cover}.store-icon-placeholder.svelte-1aafzt0{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:var(--sh3-accent, #007acc);color:#fff;border-radius:var(--sh3-radius);font-weight:700;font-size:1rem}.store-card-title.svelte-1aafzt0{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.store-card-label.svelte-1aafzt0{font-weight:600;font-size:.9375rem}.store-card-badge.svelte-1aafzt0{font-size:.6875rem;padding:1px 6px;border-radius:var(--sh3-radius-sm);text-transform:uppercase;font-weight:600;letter-spacing:.04em}.badge-shard.svelte-1aafzt0{background:color-mix(in srgb,var(--sh3-accent, #007acc) 25%,transparent);color:var(--sh3-accent, #007acc)}.badge-app.svelte-1aafzt0{background:color-mix(in srgb,var(--sh3-success, #4caf50) 25%,transparent);color:var(--sh3-success, #4caf50)}.store-card-version.svelte-1aafzt0{font-size:.75rem;color:var(--sh3-fg-muted, #888)}.store-card-desc.svelte-1aafzt0{margin:0;font-size:.8125rem;color:var(--sh3-fg-muted, #888);line-height:1.4}.store-card-author.svelte-1aafzt0{font-size:.75rem;color:var(--sh3-fg-muted, #888)}.store-card-warning.svelte-1aafzt0{font-size:.75rem;color:var(--sh3-warning, #ff9800);padding:4px 8px;background:color-mix(in srgb,var(--sh3-warning, #ff9800) 10%,transparent);border-radius:var(--sh3-radius-sm)}.store-card-actions.svelte-1aafzt0{margin-top:auto;display:flex;justify-content:flex-end}.store-install-btn.svelte-1aafzt0{padding:5px 14px;font-size:.8125rem}.store-install-btn.svelte-1aafzt0:disabled{opacity:.6;cursor:not-allowed}.store-installed-label.svelte-1aafzt0{font-size:.8125rem;color:var(--sh3-success, #4caf50);font-weight:600}.store-install-wrap.svelte-1aafzt0{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.store-card-missing.svelte-1aafzt0{font-size:.75rem;color:var(--sh3-warning, #ff9800)}.store-update-btn.svelte-1aafzt0{padding:5px 14px;background:var(--sh3-warning, #fbbf24);color:var(--sh3-fg-on-warning, #1a1b1e);font-size:.8125rem}.store-update-btn.svelte-1aafzt0:hover:not(:disabled){filter:brightness(1.1)}.store-update-btn.svelte-1aafzt0:disabled{opacity:.6;cursor:not-allowed}.store-empty.svelte-1aafzt0{text-align:center;padding:32px 16px;color:var(--sh3-fg-muted, #888);font-size:.875rem}.store-registries.svelte-1aafzt0{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}.store-registry-entry.svelte-1aafzt0{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;background:var(--sh3-input-bg, #2a2a2a);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font-size:.8125rem}.store-registry-url.svelte-1aafzt0{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--sh3-fg-muted, #888)}.store-registry-remove.svelte-1aafzt0{padding:2px 8px;background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);border-radius:var(--sh3-radius-sm);font-size:.75rem;flex-shrink:0;margin-left:8px}.store-add-registry.svelte-1aafzt0{display:flex;gap:8px;margin-bottom:12px}.store-registry-input.svelte-1aafzt0{flex:1;padding:6px 10px;background:var(--sh3-input-bg, #2a2a2a);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #444);border-radius:var(--sh3-radius);font-family:inherit;font-size:.8125rem}.store-registry-input.svelte-1aafzt0::placeholder{color:var(--sh3-fg-muted, #888)}.store-add-btn.svelte-1aafzt0{font-size:.8125rem;white-space:nowrap}.store-add-btn.svelte-1aafzt0:disabled{opacity:.6;cursor:not-allowed}.app-update-modal.svelte-1tiy4hy{padding:16px 20px;max-width:460px;color:var(--sh3-fg);background:var(--sh3-bg);font:inherit}h2.svelte-1tiy4hy{margin:0 0 8px;font-size:16px}p.svelte-1tiy4hy{margin:4px 0;font-size:13px}.hint.svelte-1tiy4hy{color:var(--sh3-fg-muted);font-size:12px}.error.svelte-1tiy4hy{color:var(--sh3-error, #c33)}code.svelte-1tiy4hy{font-family:var(--sh3-font-mono, monospace);background:var(--sh3-bg-elevated);padding:0 4px;border-radius:var(--sh3-radius-sm, 3px)}.actions.svelte-1tiy4hy{display:flex;gap:8px;margin-top:16px}.actions.svelte-1tiy4hy button:where(.svelte-1tiy4hy){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-1tiy4hy button.primary:where(.svelte-1tiy4hy){background:var(--sh3-accent);color:#fff;border-color:var(--sh3-accent)}.actions.svelte-1tiy4hy button:where(.svelte-1tiy4hy):hover{border-color:var(--sh3-accent)}.actions.svelte-1tiy4hy button:where(.svelte-1tiy4hy):disabled{opacity:.5;cursor:not-allowed}.uninstall-dialog.svelte-86mxbl{padding:16px 20px;max-width:460px;color:var(--sh3-fg);background:var(--sh3-bg);font:inherit}h2.svelte-86mxbl{margin:0 0 8px;font-size:16px}p.svelte-86mxbl{margin:4px 0;font-size:13px}.hint.svelte-86mxbl{color:var(--sh3-fg-muted);font-size:12px}.error.svelte-86mxbl{color:var(--sh3-error, #c33)}code.svelte-86mxbl{font-family:var(--sh3-font-mono, monospace);background:var(--sh3-bg-elevated);padding:0 4px;border-radius:var(--sh3-radius-sm, 3px)}.actions.svelte-86mxbl{display:flex;gap:8px;margin-top:16px}.actions.svelte-86mxbl button:where(.svelte-86mxbl){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-86mxbl button.danger:where(.svelte-86mxbl){background:var(--sh3-error, #c33);color:#fff;border-color:var(--sh3-error, #c33)}.actions.svelte-86mxbl button:where(.svelte-86mxbl):hover{border-color:var(--sh3-accent)}.actions.svelte-86mxbl button:where(.svelte-86mxbl):disabled{opacity:.5;cursor:not-allowed}.app-info-modal.svelte-1w44jyn{padding:16px 20px;min-width:360px;max-width:520px;color:var(--sh3-fg);background:var(--sh3-bg);font:inherit}header.svelte-1w44jyn{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}header.svelte-1w44jyn h2:where(.svelte-1w44jyn){margin:0;font-size:16px}header.svelte-1w44jyn .id:where(.svelte-1w44jyn){font-size:12px;color:var(--sh3-fg-muted)}.version.svelte-1w44jyn{margin:4px 0 12px;font-size:13px;display:flex;align-items:center;gap:8px}.description.svelte-1w44jyn{margin:8px 0 12px}.description.svelte-1w44jyn p:where(.svelte-1w44jyn){margin:4px 0 0;font-size:13px;line-height:1.5;white-space:pre-wrap}.row.svelte-1w44jyn{margin:6px 0;font-size:13px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.label.svelte-1w44jyn{color:var(--sh3-fg-muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em;flex:0 0 auto;min-width:90px}.chips.svelte-1w44jyn{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:4px}.chips.svelte-1w44jyn code:where(.svelte-1w44jyn){padding:1px 6px;border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px)}.badge.svelte-1w44jyn{font-size:11px;padding:1px 6px;border-radius:var(--sh3-radius-sm, 3px);background:var(--sh3-bg-elevated);color:var(--sh3-fg-muted);border:1px solid var(--sh3-border)}.installed.svelte-1w44jyn{margin-top:12px;padding-top:10px;border-top:1px solid var(--sh3-border)}code.svelte-1w44jyn{font-family:var(--sh3-font-mono, monospace);background:var(--sh3-bg-elevated);padding:0 4px;border-radius:var(--sh3-radius-sm, 3px)}.actions.svelte-1w44jyn{display:flex;gap:8px;margin-top:16px;justify-content:flex-end}.actions.svelte-1w44jyn button:where(.svelte-1w44jyn){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-1w44jyn button:where(.svelte-1w44jyn):hover{border-color:var(--sh3-accent)}.shell-text.svelte-ypr8s{margin:0;padding:0 8px;font-family:var(--sh3-font-mono, monospace);white-space:pre-wrap;word-break:break-word;color:var(--sh3-fg, #ddd)}.shell-text.stderr.svelte-ypr8s{color:var(--sh3-fg-error, #f88)}.shell-prompt.svelte-u0gb59{padding:4px 8px 0;font-family:var(--sh3-font-mono, monospace);display:flex;gap:8px}.shell-prompt-cwd.svelte-u0gb59{color:var(--sh3-fg-muted, #888)}.shell-prompt-arrow.svelte-u0gb59{color:var(--sh3-accent, #6cf)}.shell-prompt-line.svelte-u0gb59{color:var(--sh3-fg, #ddd)}.shell-status.svelte-nfxdpt{padding:2px 8px;font-family:var(--sh3-font-mono, monospace);font-style:italic;white-space:pre-wrap;word-break:break-word}.shell-status.info.svelte-nfxdpt{color:var(--sh3-fg-muted, #888)}.shell-status.warn.svelte-nfxdpt{color:var(--sh3-fg-warn, #fc6)}.shell-status.error.svelte-nfxdpt{color:var(--sh3-fg-error, #f88)}.shell-rich.svelte-1rnhl05{padding:4px 8px}.shell-scrollback-wrap.svelte-isy3jt{flex:1 1 auto;position:relative;min-height:0;display:flex;flex-direction:column}.shell-scrollback.svelte-isy3jt{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-anchor:none;background:var(--sh3-bg, #111);color:var(--sh3-fg, #ddd)}.jump-pill.svelte-isy3jt{position:absolute;bottom:.75rem;right:1.5rem;z-index:1;border-radius:var(--sh3-radius);box-shadow:0 4px 12px #00000073}.jump-pill__count.svelte-isy3jt{font-size:.75rem;line-height:1}.sh3-cmdline.svelte-ngn09j{display:flex;align-items:baseline;gap:6px;padding:4px 8px;border:1px solid transparent;border-radius:var(--sh3-radius);font-family:var(--sh3-font-mono, monospace);font-size:var(--sh3-font-size, 13px);line-height:1.4;transition:border-color var(--sh3-motion-fast) var(--sh3-ease-standard),box-shadow var(--sh3-motion-fast) var(--sh3-ease-standard)}.sh3-cmdline.svelte-ngn09j:focus-within{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring)}.sh3-cmdline__prefix.svelte-ngn09j{flex-shrink:0;font:inherit;line-height:inherit;margin:0}.sh3-cmdline__input.svelte-ngn09j{flex:1 1 auto;padding:0;margin:0;background:transparent;border:0;outline:0;color:inherit;font:inherit;line-height:inherit;-webkit-appearance:none;appearance:none}.sh3-cmdline__input.svelte-ngn09j::-webkit-search-cancel-button,.sh3-cmdline__input.svelte-ngn09j::-webkit-search-decoration,.sh3-cmdline__input.svelte-ngn09j::-webkit-search-results-button,.sh3-cmdline__input.svelte-ngn09j::-webkit-search-results-decoration{display:none}.sh3-cmdline__input.svelte-ngn09j:focus,.sh3-cmdline__input.svelte-ngn09j:focus-visible{outline:none;box-shadow:none;border:none}.sh3-cmdline__decoy.svelte-ngn09j{display:none}.sh3-cmdline--disabled.svelte-ngn09j .sh3-cmdline__input:where(.svelte-ngn09j){opacity:.5;cursor:default}.shell-input-row.svelte-1dfv2gk{border-top:1px solid var(--sh3-border, #333)}.shell-input-cwd.svelte-1dfv2gk{color:var(--sh3-fg-muted, #888)}.shell-input-arrow.svelte-1dfv2gk{color:var(--sh3-accent, #6cf);margin-left:6px}.toolbar.svelte-gnowwz{display:flex;align-items:center;gap:6px;padding:4px 6px;background:var(--sh3-bg-elevated, var(--sh3-bg, #1a1a1a));border-bottom:1px solid var(--sh3-border, #333);flex-shrink:0}.toolbar-slots.svelte-gnowwz{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.mode-label.svelte-1i4cqlj{font-size:.85em;color:var(--sh3-fg-dim, var(--sh3-fg-muted, #888))}.focus-lock-btn.svelte-1q6gbap{background:none;border:1px solid var(--sh3-border, #444);border-radius:3px;cursor:pointer;padding:2px 5px;font-size:.9em;line-height:1}.focus-lock-btn.svelte-1q6gbap:hover{background:var(--sh3-hover, #222)}.target-shard.svelte-1nn2m6x{font-size:.85em;color:var(--sh3-fg-dim, #888);font-family:monospace}.busy.svelte-7wyurd{display:inline-flex;align-items:center;gap:6px;color:var(--sh3-fg-muted, #aaa);font-size:.85em}.spinner.svelte-7wyurd{width:12px;height:12px;border:2px solid var(--sh3-fg-muted, #aaa);border-top-color:transparent;border-radius:50%;animation:svelte-7wyurd-busy-spin .8s linear infinite}@keyframes svelte-7wyurd-busy-spin{to{transform:rotate(360deg)}}.shell-terminal.svelte-13komre{display:flex;flex-direction:column;height:100%;background:var(--sh3-bg, #111);color:var(--sh3-fg, #ddd)}.shell-rich-help.svelte-m248jy table:where(.svelte-m248jy){border-collapse:collapse;width:100%}.shell-rich-help.svelte-m248jy th:where(.svelte-m248jy),.shell-rich-help.svelte-m248jy td:where(.svelte-m248jy){padding:2px 8px;text-align:left}.shell-rich-help.svelte-m248jy button:where(.svelte-m248jy){background:none;border:0;color:var(--sh3-link, #6cf);cursor:pointer;padding:0;font:inherit}.shell-rich-help.svelte-m248jy button:where(.svelte-m248jy):hover{text-decoration:underline}.shell-rich-history.svelte-o8m437 ol:where(.svelte-o8m437){list-style-position:inside;margin:0;padding:0}.shell-rich-history.svelte-o8m437 li:where(.svelte-o8m437){padding:2px 0}.shell-rich-history.svelte-o8m437 button:where(.svelte-o8m437){background:none;border:0;color:var(--sh3-link, #6cf);cursor:pointer;padding:0;font:inherit;text-align:left}.shell-rich-history.svelte-o8m437 button:where(.svelte-o8m437):hover{text-decoration:underline}.shell-rich-apps.svelte-1u5krjz table:where(.svelte-1u5krjz){border-collapse:collapse;width:100%}.shell-rich-apps.svelte-1u5krjz th:where(.svelte-1u5krjz),.shell-rich-apps.svelte-1u5krjz td:where(.svelte-1u5krjz){padding:2px 8px;text-align:left}.shell-rich-apps.svelte-1u5krjz button:where(.svelte-1u5krjz){background:none;border:0;color:var(--sh3-link, #6cf);cursor:pointer;padding:0;font:inherit}.shell-rich-apps.svelte-1u5krjz button:where(.svelte-1u5krjz):hover{text-decoration:underline}.shell-rich-appcard.svelte-npcp8i{padding:8px;border:1px solid var(--sh3-border, #444)}.shell-rich-appcard.svelte-npcp8i h3:where(.svelte-npcp8i){margin:0 0 8px}.shell-rich-appcard.svelte-npcp8i p:where(.svelte-npcp8i){margin:4px 0}.shell-rich-shards.svelte-sc3ux4 table:where(.svelte-sc3ux4){border-collapse:collapse;width:100%}.shell-rich-shards.svelte-sc3ux4 th:where(.svelte-sc3ux4),.shell-rich-shards.svelte-sc3ux4 td:where(.svelte-sc3ux4){padding:2px 8px;text-align:left}.shell-rich-views.svelte-15elbr1 table:where(.svelte-15elbr1){border-collapse:collapse;width:100%}.shell-rich-views.svelte-15elbr1 th:where(.svelte-15elbr1),.shell-rich-views.svelte-15elbr1 td:where(.svelte-15elbr1){padding:2px 8px;text-align:left}.shell-rich-views.svelte-15elbr1 button:where(.svelte-15elbr1){background:none;border:0;color:var(--sh3-link, #6cf);cursor:pointer;padding:0;font:inherit}.shell-rich-views.svelte-15elbr1 button:where(.svelte-15elbr1):hover{text-decoration:underline}.shell-rich-zones.svelte-1w7onag table:where(.svelte-1w7onag){border-collapse:collapse;width:100%}.shell-rich-zones.svelte-1w7onag th:where(.svelte-1w7onag),.shell-rich-zones.svelte-1w7onag td:where(.svelte-1w7onag){padding:2px 8px;text-align:left}.shell-rich-zonetree.svelte-13iiyr1 pre:where(.svelte-13iiyr1){overflow:auto;padding:8px;background:var(--sh3-bg, #000);color:var(--sh3-fg, #fff)}.shell-rich-env.svelte-1ox8vog table:where(.svelte-1ox8vog){border-collapse:collapse;width:100%}.shell-rich-env.svelte-1ox8vog th:where(.svelte-1ox8vog),.shell-rich-env.svelte-1ox8vog td:where(.svelte-1ox8vog){padding:2px 8px;text-align:left}.layout-save.svelte-1w8uhw5{padding:16px 20px;max-width:460px;color:var(--sh3-fg);background:var(--sh3-bg);font:inherit}h2.svelte-1w8uhw5{margin:0 0 12px;font-size:16px}.row.svelte-1w8uhw5{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;font-size:13px}.row.svelte-1w8uhw5 span:where(.svelte-1w8uhw5){color:var(--sh3-fg-muted)}.name-input.svelte-1w8uhw5{background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 8px;font:inherit;font-size:13px}.preview.svelte-1w8uhw5{margin:4px 0 12px}.preview-label.svelte-1w8uhw5{font-size:12px;color:var(--sh3-fg-muted);margin-bottom:4px}.preview-list.svelte-1w8uhw5{list-style:none;padding:0;margin:0;font-size:12px;max-height:160px;overflow:auto;border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);background:var(--sh3-bg-elevated)}.preview-list.svelte-1w8uhw5 li:where(.svelte-1w8uhw5){padding:4px 8px;border-bottom:1px solid var(--sh3-border)}.preview-list.svelte-1w8uhw5 li:where(.svelte-1w8uhw5):last-child{border-bottom:0}.muted.svelte-1w8uhw5{color:var(--sh3-fg-muted)}.error.svelte-1w8uhw5{color:var(--sh3-fg-muted);font-style:italic;margin:4px 0 12px}.actions.svelte-1w8uhw5{display:flex;gap:8px;margin-top:8px}.actions.svelte-1w8uhw5 button:where(.svelte-1w8uhw5){background:var(--sh3-bg-elevated);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius-sm, 3px);padding:6px 14px;font:inherit;cursor:pointer}.actions.svelte-1w8uhw5 button.primary:where(.svelte-1w8uhw5){background:var(--sh3-accent);color:#fff;border-color:var(--sh3-accent)}.actions.svelte-1w8uhw5 button:where(.svelte-1w8uhw5):hover{border-color:var(--sh3-accent)}.actions.svelte-1w8uhw5 button:where(.svelte-1w8uhw5):disabled{opacity:.5;cursor:not-allowed}.admin-users.svelte-4q792t{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.admin-users-header.svelte-4q792t{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.admin-users-header.svelte-4q792t h2:where(.svelte-4q792t){margin:0;font-size:18px}.admin-create-form.svelte-4q792t,.admin-edit-form.svelte-4q792t{display:flex;flex-direction:column;gap:8px;margin-bottom:16px;max-width:400px}.admin-input.svelte-4q792t{padding:8px 12px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:13px}.admin-btn.svelte-4q792t{font-weight:600;font-size:13px}.admin-btn.svelte-4q792t:disabled{opacity:.6;cursor:not-allowed}.admin-btn-secondary.svelte-4q792t{background:transparent;color:var(--sh3-fg-subtle);border:1px solid var(--sh3-border);font-size:12px}.admin-btn-danger.svelte-4q792t{background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);font-size:12px}.admin-user-list.svelte-4q792t{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.admin-user-item.svelte-4q792t{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px)}.admin-user-info.svelte-4q792t{display:flex;flex-direction:column;gap:2px}.admin-user-name.svelte-4q792t{font-weight:600}.admin-user-meta.svelte-4q792t{font-size:11px;color:var(--sh3-fg-subtle)}.admin-user-actions.svelte-4q792t,.admin-edit-actions.svelte-4q792t{display:flex;gap:6px}.admin-error.svelte-4q792t{color:var(--sh3-error, #d32f2f);font-size:13px}.admin-muted.svelte-4q792t{color:var(--sh3-fg-muted);font-style:italic}.admin-mount-checklist.svelte-4q792t{list-style:none;margin:0 0 16px;padding:0;display:flex;flex-direction:column;gap:4px}.admin-mount-checklist-item.svelte-4q792t{padding:8px 0;border-bottom:1px solid var(--sh3-border, #3a3a5c)}.admin-checklist-label.svelte-4q792t{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:13px}.admin-checklist-label.svelte-4q792t input[type=checkbox]:where(.svelte-4q792t){cursor:pointer}.admin-status-dot.svelte-4q792t{width:8px;height:8px;border-radius:50%;flex-shrink:0}.admin-modal-root.svelte-4q792t{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:100}.admin-modal-backdrop.svelte-4q792t{position:absolute;inset:0;background:#0009;border:none;padding:0;margin:0;cursor:pointer}.admin-modal.svelte-4q792t{position:relative;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 8px);padding:24px;max-width:400px;width:100%}.admin-modal.svelte-4q792t h3:where(.svelte-4q792t){margin:0 0 8px}.admin-modal.svelte-4q792t p:where(.svelte-4q792t){margin:0 0 16px;font-size:13px;color:var(--sh3-fg-subtle)}.admin-modal-actions.svelte-4q792t{display:flex;gap:8px;justify-content:flex-end}.admin-mount-id.svelte-4q792t{font-size:11px;color:var(--sh3-fg-subtle);font-family:monospace;margin-left:auto}.admin-auth.svelte-1hsgdb4{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.admin-auth.svelte-1hsgdb4 h2:where(.svelte-1hsgdb4){margin:0 0 16px;font-size:18px}.admin-auth-fields.svelte-1hsgdb4{display:flex;flex-direction:column;gap:16px;max-width:480px}.admin-toggle.svelte-1hsgdb4{display:flex;flex-wrap:wrap;align-items:center;gap:8px;cursor:pointer}.admin-toggle.svelte-1hsgdb4 input:where(.svelte-1hsgdb4){accent-color:var(--sh3-accent, #7c7cf0)}.admin-hint.svelte-1hsgdb4{flex-basis:100%;font-size:11px;color:var(--sh3-fg-muted);margin-left:24px}.admin-field.svelte-1hsgdb4{display:flex;flex-direction:column;gap:4px}.admin-field.svelte-1hsgdb4 span:where(.svelte-1hsgdb4){font-size:13px}.admin-input.svelte-1hsgdb4{padding:8px 12px;background:var(--sh3-bg);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius, 6px);font-size:13px}.admin-input-sm.svelte-1hsgdb4{max-width:120px}.admin-btn.svelte-1hsgdb4{padding:8px 16px;font-weight:600;align-self:flex-start}.admin-btn.svelte-1hsgdb4:disabled{opacity:.6;cursor:not-allowed}.admin-error.svelte-1hsgdb4{margin-top:8px;color:var(--sh3-error, #d32f2f);font-size:13px}.admin-muted.svelte-1hsgdb4{color:var(--sh3-fg-muted);font-style:italic}.admin-system.svelte-1gkiloq{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.admin-system.svelte-1gkiloq h2:where(.svelte-1gkiloq){margin:0 0 16px;font-size:18px}.admin-system.svelte-1gkiloq h3:where(.svelte-1gkiloq){margin:0 0 8px;font-size:14px;text-transform:uppercase;letter-spacing:.05em;color:var(--sh3-fg-subtle)}.admin-system-info.svelte-1gkiloq{margin-bottom:24px}.admin-system-row.svelte-1gkiloq{display:flex;gap:12px;padding:8px 0;border-bottom:1px solid var(--sh3-border, #3a3a5c);font-size:13px}.admin-system-label.svelte-1gkiloq{color:var(--sh3-fg-subtle);min-width:140px}.admin-system-section.svelte-1gkiloq{margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--sh3-border, #3a3a5c)}.admin-system-section.svelte-1gkiloq:last-child{border-bottom:none}.admin-system-hint.svelte-1gkiloq{font-size:13px;color:var(--sh3-fg-subtle);margin:0 0 12px}.admin-system-readout.svelte-1gkiloq{font-size:13px;margin:8px 0 12px}.admin-system-snaps.svelte-1gkiloq{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.admin-snap.svelte-1gkiloq{padding:4px 10px;font-size:12px;background:transparent;border:1px solid var(--sh3-border, #3a3a5c);color:var(--sh3-fg);cursor:pointer;border-radius:var(--sh3-radius-sm, 3px)}.admin-snap.active.svelte-1gkiloq{background:var(--sh3-accent, #4a7bd4);color:var(--sh3-bg);border-color:var(--sh3-accent, #4a7bd4)}.admin-snap.svelte-1gkiloq:disabled{opacity:.5;cursor:not-allowed}.admin-system-actions.svelte-1gkiloq{display:flex;flex-direction:row;gap:8px;align-items:center;flex-wrap:wrap}.admin-btn.svelte-1gkiloq{padding:8px 16px;background:var(--sh3-accent, #4a7bd4);color:var(--sh3-bg);border:1px solid var(--sh3-accent, #4a7bd4);font-weight:600;cursor:pointer;border-radius:var(--sh3-radius-sm, 3px)}.admin-btn.svelte-1gkiloq:disabled{opacity:.5;cursor:not-allowed}.admin-btn-ghost.svelte-1gkiloq{padding:8px 16px;background:transparent;color:var(--sh3-fg);border:1px solid var(--sh3-border, #3a3a5c);cursor:pointer;border-radius:var(--sh3-radius-sm, 3px)}.admin-btn-ghost.svelte-1gkiloq:disabled{opacity:.5;cursor:not-allowed}.admin-btn-danger.svelte-1gkiloq{padding:8px 16px;background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);font-weight:600;cursor:pointer;border-radius:var(--sh3-radius-sm, 3px)}.admin-btn-danger.svelte-1gkiloq:disabled{opacity:.6;cursor:not-allowed}.admin-error.svelte-1gkiloq{color:var(--sh3-error, #d32f2f);font-size:13px}input[type=range].svelte-1gkiloq{width:100%;max-width:480px}.admin-keys.svelte-1afg5z5{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.admin-keys-header.svelte-1afg5z5{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.admin-keys-header.svelte-1afg5z5 h2:where(.svelte-1afg5z5){margin:0;font-size:18px}.admin-create-form.svelte-1afg5z5{display:flex;flex-direction:column;gap:8px;margin-bottom:16px;max-width:400px}.admin-input.svelte-1afg5z5{padding:8px 12px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:13px}.admin-btn.svelte-1afg5z5{font-weight:600;font-size:13px}.admin-btn.svelte-1afg5z5:disabled{opacity:.6;cursor:not-allowed}.admin-btn-secondary.svelte-1afg5z5{background:transparent;color:var(--sh3-fg-subtle);border:1px solid var(--sh3-border);font-size:12px}.admin-btn-danger.svelte-1afg5z5{background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);font-size:12px}.admin-key-list.svelte-1afg5z5{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.admin-key-item.svelte-1afg5z5{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px)}.admin-key-info.svelte-1afg5z5{display:flex;flex-direction:column;gap:2px}.admin-key-label.svelte-1afg5z5{font-weight:600}.admin-key-meta.svelte-1afg5z5{font-size:11px;color:var(--sh3-fg-subtle)}.admin-key-value.svelte-1afg5z5{font-size:12px;color:var(--sh3-fg-muted);background:var(--sh3-bg, #1a1a2e);padding:2px 6px;border-radius:3px;margin-top:2px;word-break:break-all}.admin-key-actions.svelte-1afg5z5{display:flex;gap:6px;flex-shrink:0}.admin-muted.svelte-1afg5z5{color:var(--sh3-fg-muted);font-style:italic}.admin-error.svelte-1afg5z5{color:var(--sh3-error, #d32f2f);font-size:13px}.admin-mounts.svelte-1h1ud6x{padding:24px;font-family:system-ui,sans-serif;color:var(--sh3-fg)}.admin-section-header.svelte-1h1ud6x{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.admin-section-header.svelte-1h1ud6x h2:where(.svelte-1h1ud6x){margin:0;font-size:18px}.admin-create-form.svelte-1h1ud6x,.admin-edit-form.svelte-1h1ud6x{display:flex;flex-direction:column;gap:8px;margin-bottom:16px;max-width:500px}.admin-input.svelte-1h1ud6x{padding:8px 12px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:13px}.admin-btn.svelte-1h1ud6x{font-weight:600;font-size:13px}.admin-btn.svelte-1h1ud6x:disabled{opacity:.6;cursor:not-allowed}.admin-btn-secondary.svelte-1h1ud6x{background:transparent;color:var(--sh3-fg-subtle);border:1px solid var(--sh3-border);font-size:12px}.admin-btn-danger.svelte-1h1ud6x{background:transparent;color:var(--sh3-error, #d32f2f);border:1px solid var(--sh3-error, #d32f2f);font-size:12px}.admin-mount-list.svelte-1h1ud6x{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.admin-mount-item.svelte-1h1ud6x{padding:12px 16px;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px)}.admin-mount-main.svelte-1h1ud6x{display:flex;justify-content:space-between;align-items:flex-start}.admin-mount-info.svelte-1h1ud6x{display:flex;flex-direction:column;gap:4px;flex:1}.admin-mount-top.svelte-1h1ud6x{display:flex;align-items:center;gap:8px}.admin-status-dot.svelte-1h1ud6x{width:8px;height:8px;border-radius:50%;flex-shrink:0}.admin-mount-name.svelte-1h1ud6x{font-weight:600}.admin-mount-id.svelte-1h1ud6x{font-size:11px;color:var(--sh3-fg-subtle);font-family:monospace}.admin-mount-path.svelte-1h1ud6x{font-size:12px;font-family:monospace;color:var(--sh3-fg-subtle);word-break:break-all}.admin-mount-meta.svelte-1h1ud6x{font-size:11px;color:var(--sh3-fg-muted)}.admin-mount-actions.svelte-1h1ud6x{display:flex;gap:6px;flex-shrink:0;margin-left:16px}.admin-edit-actions.svelte-1h1ud6x{display:flex;gap:6px}.admin-mount-browse.svelte-1h1ud6x{margin-top:12px;padding:12px;background:var(--sh3-bg, #1a1a2e);border-radius:var(--sh3-radius, 6px);max-height:200px;overflow-y:auto}.admin-browse-list.svelte-1h1ud6x{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.admin-browse-item.svelte-1h1ud6x{display:flex;gap:8px;font-size:12px;font-family:monospace}.admin-browse-kind.svelte-1h1ud6x{color:var(--sh3-fg-subtle);width:24px}.admin-browse-size.svelte-1h1ud6x{color:var(--sh3-fg-muted);margin-left:auto}.admin-modal-root.svelte-1h1ud6x{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:100}.admin-modal-backdrop.svelte-1h1ud6x{position:absolute;inset:0;background:#0009;border:none;padding:0;margin:0;cursor:pointer}.admin-modal.svelte-1h1ud6x{position:relative;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 8px);padding:24px;max-width:400px;width:100%}.admin-modal.svelte-1h1ud6x h3:where(.svelte-1h1ud6x){margin:0 0 8px}.admin-modal.svelte-1h1ud6x p:where(.svelte-1h1ud6x){margin:0 0 16px;font-size:13px;color:var(--sh3-fg-subtle)}.admin-modal-actions.svelte-1h1ud6x{display:flex;gap:8px;justify-content:flex-end}.admin-error.svelte-1h1ud6x{color:var(--sh3-error, #d32f2f);font-size:13px}.admin-warning.svelte-1h1ud6x{color:#ff9800;font-size:13px}.admin-muted.svelte-1h1ud6x{color:var(--sh3-fg-muted);font-style:italic}button,input[type=button],input[type=submit],input[type=reset],.sh3-base-button{padding:6px 14px;background:var(--sh3-accent);color:var(--sh3-fg-on-accent);border:none;border-radius:var(--sh3-radius);cursor:pointer;font-family:inherit;font-size:.875rem;line-height:var(--sh3-line)}button:hover,input[type=button]:hover,input[type=submit]:hover,input[type=reset]:hover,.sh3-base-button:hover{filter:brightness(1.12)}button:active,input[type=button]:active,input[type=submit]:active,input[type=reset]:active,.sh3-base-button:active{filter:brightness(.92)}input[type=text],input[type=email],input[type=password],input[type=search],input[type=url],input[type=tel],input[type=number],textarea,.sh3-base-input{padding:0 var(--sh3-field-pad-x);height:var(--sh3-field-height-md);background:var(--sh3-input-bg);color:var(--sh3-fg);border:1px solid var(--sh3-border);border-radius:var(--sh3-radius);font-family:inherit;font-size:.8125rem;line-height:var(--sh3-line)}::placeholder{color:var(--sh3-fg-muted)}input:focus-visible,textarea:focus-visible,.sh3-base-input:focus-visible{border-color:var(--sh3-input-border-focus);box-shadow:var(--sh3-focus-ring);outline:none}input:disabled,textarea:disabled,.sh3-base-input[aria-disabled=true]{opacity:.55;cursor:not-allowed}textarea{resize:vertical;min-height:calc(var(--sh3-line) * 3em);height:auto;padding:var(--sh3-pad-sm) var(--sh3-field-pad-x)}input[type=checkbox].sh3-base-check,input[type=radio].sh3-base-radio{appearance:none;width:14px;height:14px;margin:0;background:var(--sh3-input-bg);border:1px solid var(--sh3-border);cursor:pointer;display:inline-grid;place-content:center;flex-shrink:0}.sh3-base-check{border-radius:var(--sh3-radius-sm)}.sh3-base-radio{border-radius:50%}input[type=checkbox].sh3-base-check:checked,input[type=radio].sh3-base-radio:checked{background:var(--sh3-accent);border-color:var(--sh3-accent)}.sh3-base-check:checked:before{content:"";width:8px;height:8px;background:var(--sh3-fg-on-accent);clip-path:polygon(14% 44%,0 60%,40% 100%,100% 20%,85% 8%,38% 70%)}.sh3-base-radio:checked:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--sh3-fg-on-accent)}.sh3-base-check:focus-visible,.sh3-base-radio:focus-visible{box-shadow:var(--sh3-focus-ring);outline:none}.sh3-base-check:disabled,.sh3-base-radio:disabled{opacity:.55;cursor:not-allowed}input[type=checkbox].sh3-base-switch{appearance:none;position:relative;width:28px;height:16px;margin:0;background:var(--sh3-bg-sunken);border:1px solid var(--sh3-border-strong);border-radius:999px;cursor:pointer;transition:background .12s ease,border-color .12s ease,box-shadow .12s ease;flex-shrink:0;box-sizing:border-box}.sh3-base-switch:before{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;background:var(--sh3-fg);border-radius:50%;transition:transform .12s ease}input[type=checkbox].sh3-base-switch:checked{background:var(--sh3-accent);border-color:var(--sh3-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--sh3-accent) 25%,transparent)}.sh3-base-switch:checked:before{transform:translate(12px);background:var(--sh3-fg-on-accent)}.sh3-base-switch:focus-visible{box-shadow:var(--sh3-focus-ring);outline:none}.sh3-base-switch:disabled{opacity:.55;cursor:not-allowed}.splitter.svelte-1adl4o1{display:flex;width:100%;height:100%;min-width:0;min-height:0}.splitter.horizontal.svelte-1adl4o1{flex-direction:row}.splitter.vertical.svelte-1adl4o1{flex-direction:column}.splitter-pane.svelte-1adl4o1{position:relative;min-width:0;min-height:0;overflow:hidden;display:flex}.horizontal.svelte-1adl4o1>.splitter-pane:where(.svelte-1adl4o1){flex-direction:row}.vertical.svelte-1adl4o1>.splitter-pane:where(.svelte-1adl4o1){flex-direction:column}.splitter-pane.collapsed.svelte-1adl4o1{overflow:visible}.pane-content.svelte-1adl4o1{flex:1 1 0;position:relative;min-width:0;min-height:0;overflow:hidden}.collapse-header.svelte-1adl4o1{appearance:none;flex:0 0 auto;display:flex;align-items:center;justify-content:center;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border:none;color:var(--sh3-fg-muted);cursor:pointer;padding:0;font-size:10px}.collapse-header.svelte-1adl4o1:hover{color:var(--sh3-fg);background:var(--sh3-accent-muted)}body[data-dragging] .collapse-header.svelte-1adl4o1{pointer-events:none}.collapse-header.horizontal.svelte-1adl4o1{width:100%;height:100%;writing-mode:vertical-rl}.collapse-header.vertical.svelte-1adl4o1{width:100%;height:100%}.collapse-header.expanded.horizontal.svelte-1adl4o1{width:16px;height:100%;border-right:1px solid var(--sh3-border)}.collapse-header.expanded.vertical.svelte-1adl4o1{width:100%;height:16px;border-bottom:1px solid var(--sh3-border)}.splitter-handle.svelte-1adl4o1{flex:0 0 auto;background:var(--sh3-border);transition:background-color .12s ease;touch-action:none}.splitter-handle.svelte-1adl4o1:hover,.splitter-handle.dragging.svelte-1adl4o1{background:var(--sh3-accent)}body[data-dragging] .splitter-handle.svelte-1adl4o1{pointer-events:none}.splitter-handle.disabled.svelte-1adl4o1{cursor:default;pointer-events:none}.splitter-handle.frozen.svelte-1adl4o1{cursor:default;pointer-events:none;background:var(--sh3-border);opacity:.5}.splitter-handle.frozen.svelte-1adl4o1:hover{background:var(--sh3-border)}.horizontal.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1){width:4px;cursor:col-resize}.vertical.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1){height:4px;cursor:row-resize}.horizontal.svelte-1adl4o1>.splitter-handle.frozen:where(.svelte-1adl4o1){width:1px}.vertical.svelte-1adl4o1>.splitter-handle.frozen:where(.svelte-1adl4o1){height:1px}.splitter.compact.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1){pointer-events:none;cursor:default;opacity:.6}.splitter.compact.horizontal.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1){width:1px}.splitter.compact.vertical.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1){height:1px}.splitter.compact.svelte-1adl4o1>.splitter-handle:where(.svelte-1adl4o1):hover{background:var(--sh3-border)}.collapse-header.inert.svelte-1adl4o1{pointer-events:none;background:var(--sh3-bg-elevated);flex:0 0 auto}.slot.svelte-1czj0s8{position:relative;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden}.slot-placeholder.svelte-1czj0s8{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sh3-pad-sm);color:var(--sh3-fg-muted);font-size:12px;text-align:center;padding:var(--sh3-pad-md);background:repeating-linear-gradient(45deg,var(--sh3-bg) 0 10px,var(--sh3-bg-elevated) 10px 20px);border:1px dashed var(--sh3-border-strong);pointer-events:none}.slot-id.svelte-1czj0s8{color:var(--sh3-fg);font-family:var(--sh3-font-mono);font-size:13px}.slot-meta.svelte-1czj0s8 code:where(.svelte-1czj0s8){font-family:var(--sh3-font-mono);color:var(--sh3-accent)}.slot-dims.svelte-1czj0s8{font-family:var(--sh3-font-mono);color:var(--sh3-fg-subtle);font-size:11px}.slot-drop-zone.svelte-re71zu{position:absolute;inset:0;pointer-events:none}.slot-drop-zone.active.svelte-re71zu{pointer-events:auto}.quad-highlight.svelte-re71zu{position:absolute;background:var(--sh3-accent);opacity:.18;border:1px dashed var(--sh3-accent);pointer-events:none;transition:inset 80ms ease}.quad-highlight.quad-left.svelte-re71zu{inset:0 50% 0 0}.quad-highlight.quad-right.svelte-re71zu{inset:0 0 0 50%}.quad-highlight.quad-top.svelte-re71zu{inset:0 0 50%}.quad-highlight.quad-bottom.svelte-re71zu{inset:50% 0 0}.quad-target.svelte-re71zu{position:absolute;pointer-events:none}.quad-target.quad-left.svelte-re71zu{inset:0 50% 0 0}.quad-target.quad-right.svelte-re71zu{inset:0 0 0 50%}.quad-target.quad-top.svelte-re71zu{inset:0 0 50%}.quad-target.quad-bottom.svelte-re71zu{inset:50% 0 0}.sh3-carousel.svelte-1qo3ctb{position:absolute;inset:0;overflow:hidden;touch-action:pan-y}.sh3-carousel-track.svelte-1qo3ctb{position:absolute;inset:0;display:flex;flex-direction:row;transition:transform .24s cubic-bezier(.2,0,0,1);will-change:transform}.sh3-carousel-track--dragging.svelte-1qo3ctb{user-select:none;-webkit-user-select:none;cursor:grabbing}.sh3-carousel-slide.svelte-1qo3ctb{position:relative;flex:0 0 auto;height:100%;min-width:0;min-height:0}.sh3-carousel-pager.svelte-1qo3ctb{position:absolute;left:0;right:0;bottom:var(--sh3-pad-md);display:flex;justify-content:center;gap:var(--sh3-pad-sm);pointer-events:none}.sh3-carousel-dot.svelte-1qo3ctb{width:6px;height:6px;border-radius:50%;background:var(--sh3-fg-muted);opacity:.5;transition:opacity .12s,transform .12s}.sh3-carousel-dot--active.svelte-1qo3ctb{opacity:1;transform:scale(1.4);background:var(--sh3-fg)}@media (prefers-reduced-motion: reduce){.sh3-carousel-track.svelte-1qo3ctb{transition:none}}.tab-slot-wrapper.svelte-1gw9g38,.leaf-slot-wrapper.svelte-1gw9g38{position:absolute;inset:0;min-width:0;min-height:0}.empty-tabs-placeholder.svelte-1gw9g38{width:100%;height:100%;min-width:0;min-height:0;position:relative}.empty-tabs-default.svelte-1gw9g38{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--sh3-fg-muted);font-size:12px;background:repeating-linear-gradient(45deg,var(--sh3-bg) 0 10px,var(--sh3-bg-elevated) 10px 20px);border:1px dashed var(--sh3-border-strong)}.empty-tabs-custom.svelte-1gw9g38{position:absolute;inset:0}.empty-tabs-drop.svelte-1gw9g38{position:absolute;inset:0;pointer-events:auto}.drag-preview.svelte-133fiip{position:absolute;display:inline-flex;align-items:center;gap:var(--sh3-pad-sm);padding:var(--sh3-pad-sm) var(--sh3-pad-md);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));color:var(--sh3-fg);border:1px solid var(--sh3-accent);border-radius:var(--sh3-radius-sm);box-shadow:0 8px 24px #00000080;font-size:12px;font-family:var(--sh3-font-ui);pointer-events:none;opacity:.9}.drag-preview-icon.svelte-133fiip{font-size:11px}.drag-preview-label.svelte-133fiip{white-space:nowrap}.sh3-float-frame.svelte-1p734al{position:absolute;display:flex;flex-direction:column;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));color:var(--sh3-fg);border:1px solid var(--sh3-border-strong);border-radius:var(--sh3-radius);box-shadow:0 8px 24px #0006;pointer-events:auto}.sh3-float-header.svelte-1p734al{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;background:var(--sh3-grad-bg-sunken, var(--sh3-bg-sunken));cursor:move;user-select:none;border-bottom:1px solid var(--sh3-border-strong);border-top-left-radius:var(--sh3-radius);border-top-right-radius:var(--sh3-radius);flex-shrink:0;touch-action:none}.sh3-float-title.svelte-1p734al{font-size:12px;color:var(--sh3-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sh3-float-header-actions.svelte-1p734al{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}.sh3-float-popout.svelte-1p734al,.sh3-float-maximize.svelte-1p734al,.sh3-float-close.svelte-1p734al{background:transparent;border:none;color:var(--sh3-fg);line-height:1;cursor:pointer;padding:0 4px}.sh3-float-popout.svelte-1p734al,.sh3-float-maximize.svelte-1p734al{font-size:12px}.sh3-float-close.svelte-1p734al{font-size:16px}.sh3-float-body.svelte-1p734al{flex:1;position:relative;overflow:hidden;min-height:0}.sh3-float-resize-grip.svelte-1p734al{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize;touch-action:none;background:linear-gradient(135deg,transparent 0,transparent 6px,var(--sh3-border-strong) 6px,var(--sh3-border-strong) 7px,transparent 7px,transparent 10px,var(--sh3-border-strong) 10px,var(--sh3-border-strong) 11px,transparent 11px);border-bottom-right-radius:var(--sh3-radius)}.sh3-float-layer.svelte-1rzcset,.sh3-overlays.svelte-4ykdm7,.sh3-overlay-root.svelte-4ykdm7{position:absolute;inset:0;pointer-events:none}.guest-banner.svelte-pymkh{display:flex;align-items:center;justify-content:center;gap:12px;padding:6px var(--sh3-pad-md, 12px);background:color-mix(in srgb,var(--sh3-accent, #7c7cf0) 15%,transparent);border-bottom:1px solid var(--sh3-border, #3a3a5c);font-size:12px;color:var(--sh3-fg, #e0e0e0)}.guest-banner-action.svelte-pymkh{padding:3px 10px;color:var(--sh3-bg, #1a1a2e);font-size:11px;font-weight:600}.guest-signin-overlay.svelte-pymkh{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#00000080;z-index:9999}.guest-signin-card.svelte-pymkh{display:flex;flex-direction:column;gap:12px;padding:32px;background:var(--sh3-bg-elevated, #252540);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius-lg, 12px);min-width:300px}.guest-signin-form.svelte-pymkh{display:flex;flex-direction:column;gap:10px}.guest-signin-input.svelte-pymkh{padding:8px 12px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:13px}.guest-signin-input.svelte-pymkh::placeholder{color:var(--sh3-fg-muted, #888)}.guest-signin-actions.svelte-pymkh{display:flex;gap:8px}.guest-signin-btn.svelte-pymkh{flex:1;padding:8px;color:var(--sh3-bg, #1a1a2e);font-weight:600}.guest-signin-btn.svelte-pymkh:disabled{opacity:.6;cursor:not-allowed}.guest-signin-cancel.svelte-pymkh{padding:8px 12px;background:transparent;color:var(--sh3-fg-subtle, #aaa);border:1px solid var(--sh3-border, #3a3a5c)}.guest-signin-error.svelte-pymkh{padding:6px 10px;font-size:12px;color:var(--sh3-error, #d32f2f);background:color-mix(in srgb,var(--sh3-error, #d32f2f) 10%,transparent);border-radius:var(--sh3-radius, 6px)}.sh3-consent-backdrop.svelte-14me5sj{position:fixed;inset:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:9999}.sh3-consent-card.svelte-14me5sj{background:var(--sh3-bg-elevated, #222);color:var(--sh3-fg, #eee);border:1px solid var(--sh3-border, #444);padding:1.5rem;border-radius:8px;min-width:360px;max-width:520px;box-shadow:0 8px 32px #0006}.sh3-consent-title.svelte-14me5sj{margin:0 0 1rem;font-size:1rem;font-weight:600;color:var(--sh3-fg, #eee)}.sh3-consent-title.svelte-14me5sj span:where(.svelte-14me5sj){color:var(--sh3-accent, #7eb8f7)}.sh3-consent-fields.svelte-14me5sj{margin:0 0 1rem;display:grid;grid-template-columns:auto 1fr;column-gap:.75rem;row-gap:.25rem;align-items:baseline}.sh3-consent-fields.svelte-14me5sj dt:where(.svelte-14me5sj){font-weight:600;color:var(--sh3-fg-muted, #aaa);font-size:.8rem;text-transform:uppercase;letter-spacing:.05em;padding-top:.35rem}.sh3-consent-fields.svelte-14me5sj dd:where(.svelte-14me5sj){margin:0;padding-top:.35rem;word-break:break-word}.sh3-consent-scopes.svelte-14me5sj{display:flex;flex-wrap:wrap;gap:.25rem}.sh3-consent-scope.svelte-14me5sj{display:inline-block;padding:.1rem .35rem;background:#ffffff14;border:1px solid rgba(255,255,255,.12);border-radius:3px;font-size:.82em;font-family:var(--sh3-font-mono, monospace)}.sh3-consent-actions.svelte-14me5sj{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.25rem}.sh3-consent-deny.svelte-14me5sj,.sh3-consent-approve.svelte-14me5sj{padding:.4rem 1rem;border-radius:4px;font-size:.875rem;cursor:pointer;border:1px solid transparent;transition:opacity .1s}.sh3-consent-deny.svelte-14me5sj{background:transparent;color:var(--sh3-fg-muted, #aaa);border-color:var(--sh3-border, #444)}.sh3-consent-deny.svelte-14me5sj:hover{color:var(--sh3-fg, #eee);border-color:var(--sh3-fg-muted, #aaa)}.sh3-consent-approve.svelte-14me5sj{background:var(--sh3-accent, #7eb8f7);color:#000;border-color:var(--sh3-accent, #7eb8f7)}.sh3-consent-approve.svelte-14me5sj:hover{opacity:.85}.sh3-brand-slot.svelte-18lk809{display:inline-flex;align-items:center;gap:4px}.sh3-brand.svelte-18lk809{font-weight:600;color:var(--sh3-accent);letter-spacing:.5px}.sh3-brand-app.svelte-18lk809,.sh3-brand-project.svelte-18lk809{color:var(--sh3-fg)}.sh3-brand-sep.svelte-18lk809{color:var(--sh3-fg-muted);margin:0 4px}.sh3-brand-crumb.svelte-18lk809{background:transparent;border:0;color:var(--sh3-fg);font:inherit;cursor:pointer;padding:2px 6px;border-radius:var(--sh3-radius-sm, 3px)}.sh3-brand-crumb.svelte-18lk809:hover{background:var(--sh3-bg-elevated)}.sh3-brand-clickable.svelte-18lk809{background:transparent;border:0;font:inherit;cursor:pointer;padding:2px 6px;border-radius:var(--sh3-radius-sm, 3px)}.sh3-brand-clickable.svelte-18lk809:hover{background:var(--sh3-bg-elevated)}.sh3-menubar-button.svelte-bke3dt{display:inline-flex;align-items:center;gap:6px;padding:0 var(--sh3-pad-md);height:100%;background:transparent;color:var(--sh3-fg);border:0;font:inherit;cursor:default}.sh3-menubar-button.svelte-bke3dt:hover{background:var(--sh3-bg-elevated)}.sh3-menubar-icon.svelte-bke3dt{width:14px;height:14px;display:inline-block}.sh3-menubar.svelte-7gc0wa{display:inline-flex;align-items:center;height:100%}.sh3-menu-sheet.svelte-vkxo1d{display:flex;flex-direction:column;max-height:70vh;overflow:hidden;color:var(--sh3-fg)}.head.svelte-vkxo1d{display:flex;align-items:center;gap:var(--sh3-pad-xs);padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06)}.title.svelte-vkxo1d{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--sh3-fg-muted)}.scroll.svelte-vkxo1d{flex:1;min-height:0;overflow:auto;padding:4px 0}.item.svelte-vkxo1d{display:flex;align-items:center;gap:var(--sh3-pad-sm);width:100%;padding:9px var(--sh3-pad-md);border:none;background:none;color:var(--sh3-fg);text-align:left;cursor:pointer;font:inherit}.item.svelte-vkxo1d:disabled{opacity:.5;cursor:not-allowed}.item.svelte-vkxo1d:active:not(:disabled){background:var(--sh3-bg-sunken)}.label.svelte-vkxo1d{flex:1}.chevron.svelte-vkxo1d{opacity:.3;font-size:14px}.shortcut.svelte-vkxo1d{color:var(--sh3-fg-muted);font-family:var(--sh3-font-mono);font-size:.9em}.empty.svelte-vkxo1d{padding:20px 12px;text-align:center;color:var(--sh3-fg-muted);font-style:italic}.sh3-floats-sheet.svelte-cq4vzh{display:flex;flex-direction:column;max-height:70vh;overflow:hidden;color:var(--sh3-fg)}.scroll.svelte-cq4vzh{flex:1;min-height:0;overflow:auto;padding:var(--sh3-pad-sm) 0}.row.svelte-cq4vzh{display:flex;align-items:center;gap:var(--sh3-pad-sm);width:100%;padding:var(--sh3-pad-md);border:none;background:none;color:var(--sh3-fg);text-align:left;cursor:pointer;touch-action:pan-y;user-select:none}.row[data-current=true].svelte-cq4vzh{background:var(--sh3-bg-sunken);font-weight:600}.row.svelte-cq4vzh:active{background:var(--sh3-bg-sunken)}.label.svelte-cq4vzh{flex:1}.kind.svelte-cq4vzh{color:var(--sh3-fg-muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em}.cancel.svelte-cq4vzh{padding:var(--sh3-pad-md);border:none;border-top:1px solid var(--sh3-border);background:var(--sh3-bg-elevated);color:var(--sh3-fg);font-weight:600;cursor:pointer}.sh3-compact-chrome.svelte-q1hcw0{display:grid;grid-template-columns:auto 1fr auto;align-items:center;height:var(--sh3-tabbar-height);padding:0 var(--sh3-pad-sm);gap:var(--sh3-pad-sm);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border-bottom:1px solid var(--sh3-border);color:var(--sh3-fg)}.leading.svelte-q1hcw0,.trailing.svelte-q1hcw0{display:inline-flex;align-items:center;gap:var(--sh3-pad-xs)}.leading.svelte-q1hcw0>span:where(.svelte-q1hcw0){display:inline-flex;align-items:center}.title.svelte-q1hcw0{font-weight:600;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drawer-backdrop.svelte-8dp9bg{position:absolute;inset:0;background:var(--sh3-overlay-backdrop, rgba(0, 0, 0, .35));pointer-events:auto}.drawer.svelte-8dp9bg{position:absolute;background:var(--sh3-bg);color:var(--sh3-fg);box-shadow:var(--sh3-shadow-md, 0 0 16px rgba(0, 0, 0, .2));display:flex;flex-direction:column;border:1px solid var(--sh3-border);pointer-events:auto}.drawer-left.svelte-8dp9bg{top:0;bottom:0;left:0;width:min(360px,80vw)}.drawer-right.svelte-8dp9bg{top:0;bottom:0;right:0;width:min(360px,80vw)}.drawer-top.svelte-8dp9bg{left:0;right:0;top:0;height:min(50vh,360px)}header.svelte-8dp9bg{display:flex;align-items:center;padding:var(--sh3-pad-sm) var(--sh3-pad-md);gap:var(--sh3-pad-md);border-bottom:1px solid var(--sh3-border);background:var(--sh3-bg-elevated)}.title.svelte-8dp9bg{font-weight:600}.close.svelte-8dp9bg{margin-left:auto;background:none;border:none;font-size:var(--sh3-font-lg);cursor:pointer;color:var(--sh3-fg-muted);padding:0 var(--sh3-pad-sm)}.close.svelte-8dp9bg:hover{color:var(--sh3-fg)}.tab-strip.svelte-8dp9bg{display:flex;gap:2px;padding:var(--sh3-pad-xs) var(--sh3-pad-sm) 0;background:var(--sh3-bg-sunken)}.tab-strip.svelte-8dp9bg button:where(.svelte-8dp9bg){padding:var(--sh3-pad-xs) var(--sh3-pad-sm);border:1px solid var(--sh3-border);background:var(--sh3-bg-elevated);border-bottom:none;cursor:pointer;color:var(--sh3-fg)}.tab-strip.svelte-8dp9bg button.active:where(.svelte-8dp9bg){background:var(--sh3-bg)}.body.svelte-8dp9bg{flex:1;min-height:0;overflow:auto}.compact-body.svelte-1sc410j{position:absolute;inset:0}.sh3.svelte-1amm732{display:grid;grid-template-rows:var(--sh3-tabbar-height) auto 1fr var(--sh3-statusbar-height);height:100%;width:100%;position:relative;background:var(--sh3-grad-bg, var(--sh3-bg));color:var(--sh3-fg);box-sizing:border-box;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}.sh3[data-sh3-viewport=compact].svelte-1amm732{grid-template-rows:var(--sh3-tabbar-height) auto 1fr}.sh3-tabbar.svelte-1amm732{display:grid;grid-template-columns:auto auto 1fr auto;align-items:center;gap:var(--sh3-pad-md);padding:0 var(--sh3-pad-md);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border-bottom:1px solid var(--sh3-border);user-select:none}.sh3-content.svelte-1amm732{position:relative;overflow:hidden;background:var(--sh3-grad-bg, var(--sh3-bg));min-width:0;min-height:0}.sh3-statusbar.svelte-1amm732{display:flex;align-items:center;justify-content:space-between;padding:0 var(--sh3-pad-md);background:var(--sh3-grad-bg-sunken, var(--sh3-bg-sunken));border-top:1px solid var(--sh3-border);color:var(--sh3-fg-muted);font-size:11px;user-select:none}.sh3-tabbar-home-button.svelte-1amm732{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;color:var(--sh3-fg-muted);border:1px solid var(--sh3-border)}.sh3-tabbar-home-button.svelte-1amm732:hover:not(:disabled){color:var(--sh3-fg);border-color:var(--sh3-fg-muted)}.sh3-tabbar-home-button.svelte-1amm732:disabled{color:var(--sh3-fg-subtle);border-color:var(--sh3-border);cursor:default}.sh3-tabbar-home-icon.svelte-1amm732{width:14px;height:14px}.sh3-tabbar-user.svelte-1amm732{display:flex;align-items:center;gap:6px}.sh3-tabbar-user-name.svelte-1amm732{font-size:12px;color:var(--sh3-fg-subtle)}.sh3-tabbar-tag.svelte-1amm732{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--sh3-fg-on-accent);background:var(--sh3-accent);padding:1px 6px;border-radius:var(--sh3-radius-md)}.sh3-tabbar-signout.svelte-1amm732{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;color:var(--sh3-fg-muted);border:1px solid var(--sh3-border)}.sh3-tabbar-signout.svelte-1amm732:hover{color:var(--sh3-fg);border-color:var(--sh3-fg-muted)}.sh3-tabbar-signout-icon.svelte-1amm732{width:14px;height:14px}.signin-wall.svelte-lh4k15{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--sh3-grad-bg, var(--sh3-bg, #1a1a2e));color:var(--sh3-fg, #e0e0e0);font-family:system-ui,sans-serif}.signin-card.svelte-lh4k15{display:flex;flex-direction:column;align-items:center;gap:16px;padding:48px 40px;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated, #252540));border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius-lg, 12px);min-width:320px}.signin-brand.svelte-lh4k15{margin:0 0 8px;font-size:42px;color:var(--sh3-accent, #7c7cf0);letter-spacing:2px}.signin-form.svelte-lh4k15{display:flex;flex-direction:column;gap:12px;width:100%}.signin-input.svelte-lh4k15{padding:10px 14px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:14px}.signin-input.svelte-lh4k15::placeholder{color:var(--sh3-fg-muted, #888)}.signin-btn.svelte-lh4k15{padding:10px 16px;color:var(--sh3-bg, #1a1a2e);font-weight:600;font-size:14px}.signin-btn.svelte-lh4k15:disabled{opacity:.6;cursor:not-allowed}.signin-link.svelte-lh4k15{background:none;color:var(--sh3-accent, #7c7cf0);font-size:13px;padding:0}.signin-link.svelte-lh4k15:hover{text-decoration:underline}.signin-error.svelte-lh4k15{padding:8px 12px;font-size:13px;color:var(--sh3-error, #d32f2f);background:color-mix(in srgb,var(--sh3-error, #d32f2f) 10%,transparent);border-radius:var(--sh3-radius, 6px);width:100%;text-align:center}.sh3-satellite-root.svelte-191z0e1{position:absolute;inset:0;overflow:hidden;background:var(--sh3-grad-bg, var(--sh3-bg));color:var(--sh3-fg)}.sh3-satellite-root.sh3-satellite-app.svelte-191z0e1{display:grid;grid-template-rows:var(--sh3-tabbar-height) 1fr}.sh3-satellite-tabbar.svelte-191z0e1{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--sh3-pad-md);padding:0 var(--sh3-pad-md);background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));border-bottom:1px solid var(--sh3-border);user-select:none}.sh3-satellite-content.svelte-191z0e1{position:relative;overflow:hidden;background:var(--sh3-grad-bg, var(--sh3-bg));min-width:0;min-height:0}.sh3-satellite-floats-slot.svelte-191z0e1{min-width:0}:root{--sh3-bg: #1a1b1e;--sh3-bg-elevated: #22232a;--sh3-bg-sunken: #141518;--sh3-border: #2e3038;--sh3-border-strong: #3c3f4a;--sh3-fg: #e4e6eb;--sh3-fg-muted: #9aa0aa;--sh3-fg-subtle: #6b7280;--sh3-accent: #6ea8fe;--sh3-accent-muted: #3a5580;--sh3-input-bg: var(--sh3-bg-sunken);--sh3-input-border-focus: var(--sh3-accent);--sh3-focus-ring: 0 0 0 2px color-mix(in srgb, var(--sh3-accent) 40%, transparent);--sh3-error: #f87171;--sh3-warning: #fbbf24;--sh3-success: #34d399;--sh3-fg-on-accent: #ffffff;--sh3-fg-on-error: #1a1b1e;--sh3-fg-on-warning: #1a1b1e;--sh3-fg-on-success: #1a1b1e;--sh3-font-ui: system-ui, -apple-system, "Segoe UI", sans-serif;--sh3-font-mono: ui-monospace, "Cascadia Code", "Consolas", monospace;--sh3-font-size: 13px;--sh3-line: 1.45;--sh3-radius-sm: 3px;--sh3-radius: 4px;--sh3-radius-md: 6px;--sh3-radius-lg: 8px;--sh3-pad-xs: 2px;--sh3-pad-sm: 4px;--sh3-pad-md: 8px;--sh3-pad-lg: 12px;--sh3-tabbar-height: 32px;--sh3-statusbar-height: 22px;--sh3-z-layer-0: 0;--sh3-z-layer-drawers: 50;--sh3-z-layer-1: 100;--sh3-z-layer-2: 200;--sh3-z-layer-3: 300;--sh3-z-layer-4: 400;--sh3-z-layer-5: 500;--sh3-z-layer-6: 600;--sh3-field-height-sm: 24px;--sh3-field-height-md: 28px;--sh3-field-pad-x: 10px;--sh3-track-bg: var(--sh3-bg-sunken);--sh3-track-border: var(--sh3-border);--sh3-track-fill: var(--sh3-accent);--sh3-thumb-bg: #e4e6eb;--sh3-thumb-border: var(--sh3-accent);--sh3-thumb-shadow: var(--sh3-shadow-sm);--sh3-tick-bg: var(--sh3-fg-subtle);--sh3-tick-strong-bg: var(--sh3-border-strong);--sh3-widget-radius: var(--sh3-radius);--sh3-widget-radius-pill: 999px;--sh3-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--sh3-motion-fast: .12s;--sh3-ease-standard: cubic-bezier(.2, 0, 0, 1)}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0;height:100%;overflow:hidden;background:var(--sh3-grad-bg, var(--sh3-bg));color:var(--sh3-fg);font-family:var(--sh3-font-ui);font-size:var(--sh3-font-size);line-height:var(--sh3-line);-webkit-font-smoothing:antialiased}#app{height:100%}.onboarding-wall.svelte-c2abmw{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);box-sizing:border-box;background:var(--sh3-grad-bg, var(--sh3-bg, #1a1a2e));color:var(--sh3-fg, #e0e0e0);font-family:system-ui,sans-serif}.onboarding-card.svelte-c2abmw{display:flex;flex-direction:column;align-items:stretch;gap:12px;padding:48px 40px;background:var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated, #252540));border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius-lg, 12px);min-width:320px;max-width:420px}.onboarding-brand.svelte-c2abmw{margin:0;font-size:42px;color:var(--sh3-accent, #7c7cf0);letter-spacing:2px;text-align:center}.onboarding-tagline.svelte-c2abmw{margin:0 0 8px;text-align:center;color:var(--sh3-fg-muted, #888);font-size:13px}.onboarding-form.svelte-c2abmw{display:flex;flex-direction:column;gap:12px}.onboarding-input.svelte-c2abmw{padding:10px 14px;background:var(--sh3-bg, #1a1a2e);color:var(--sh3-fg, #e0e0e0);border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:14px}.onboarding-input.svelte-c2abmw::placeholder{color:var(--sh3-fg-muted, #888)}.onboarding-btn.svelte-c2abmw{padding:10px 16px;color:var(--sh3-bg, #1a1a2e);background:var(--sh3-accent, #7c7cf0);border:none;border-radius:var(--sh3-radius, 6px);font-weight:600;font-size:14px;cursor:pointer}.onboarding-btn.svelte-c2abmw:disabled,.onboarding-btn-secondary.svelte-c2abmw:disabled{opacity:.6;cursor:not-allowed}.onboarding-btn-secondary.svelte-c2abmw{padding:10px 16px;color:var(--sh3-fg, #e0e0e0);background:transparent;border:1px solid var(--sh3-border, #3a3a5c);border-radius:var(--sh3-radius, 6px);font-size:13px;cursor:pointer}.onboarding-divider.svelte-c2abmw{text-align:center;color:var(--sh3-fg-muted, #888);font-size:12px}.onboarding-hint.svelte-c2abmw{margin:0;text-align:center;color:var(--sh3-fg-muted, #888);font-size:12px}.onboarding-error.svelte-c2abmw{padding:8px 12px;font-size:13px;color:var(--sh3-error, #d32f2f);background:color-mix(in srgb,var(--sh3-error, #d32f2f) 10%,transparent);border-radius:var(--sh3-radius, 6px);text-align:center}
package/app/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>SH3</title>
8
- <script type="module" crossorigin src="/assets/index--m0u3gjJ.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-DIpoXNrk.css">
8
+ <script type="module" crossorigin src="/assets/index-CgB99H18.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-D0Q9JGHo.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="app"></div>
package/dist/auth.d.ts CHANGED
@@ -12,15 +12,14 @@
12
12
  import type { MiddlewareHandler, Context } from 'hono';
13
13
  import type { KeyStore } from './keys.js';
14
14
  import type { SessionStore } from './sessions.js';
15
- import type { SettingsStore } from './settings.js';
16
15
  /**
17
- * Session middleware — requires a valid credential on non-GET requests
18
- * when auth is required. Accepts either a session (cookie or sh3s_ bearer)
19
- * or a tenant-bound API key (sh3_ bearer). Attaches session to context;
20
- * caller identity for API keys is bound downstream by resolveCaller.
21
- * GET/HEAD requests always pass through.
16
+ * Session middleware — requires a valid credential on non-GET requests.
17
+ * Accepts either a session (cookie or sh3s_ bearer) or a tenant-bound API
18
+ * key (sh3_ bearer). Attaches session to context; caller identity for API
19
+ * keys is bound downstream by resolveCaller. GET/HEAD requests always pass
20
+ * through.
22
21
  */
23
- export declare function sessionAuth(sessions: SessionStore, settings: SettingsStore, keys?: KeyStore): MiddlewareHandler;
22
+ export declare function sessionAuth(sessions: SessionStore, keys?: KeyStore): MiddlewareHandler;
24
23
  /**
25
24
  * Admin middleware — backwards-compatible alias for `scopeRequired('admin:*')`.
26
25
  * New code should use `scopeRequired('admin:*')` directly.
@@ -28,11 +27,8 @@ export declare function sessionAuth(sessions: SessionStore, settings: SettingsSt
28
27
  * NOTE: `resolveCaller` must be mounted before any route that uses this
29
28
  * middleware. The server bootstrap in index.ts wires the chain:
30
29
  * sessionAuth → resolveCaller → scope guards.
31
- *
32
- * The legacy signature (sessions, keys, settings) is preserved so call
33
- * sites in index.ts keep compiling; arguments are ignored.
34
30
  */
35
- export declare function adminAuth(_sessions: SessionStore, _keys: KeyStore, settings?: SettingsStore): MiddlewareHandler;
31
+ export declare function adminAuth(): MiddlewareHandler;
36
32
  /**
37
33
  * Helper to set the session cookie on login.
38
34
  */
package/dist/auth.js CHANGED
@@ -42,13 +42,13 @@ function extractSessionToken(c) {
42
42
  return null;
43
43
  }
44
44
  /**
45
- * Session middleware — requires a valid credential on non-GET requests
46
- * when auth is required. Accepts either a session (cookie or sh3s_ bearer)
47
- * or a tenant-bound API key (sh3_ bearer). Attaches session to context;
48
- * caller identity for API keys is bound downstream by resolveCaller.
49
- * GET/HEAD requests always pass through.
45
+ * Session middleware — requires a valid credential on non-GET requests.
46
+ * Accepts either a session (cookie or sh3s_ bearer) or a tenant-bound API
47
+ * key (sh3_ bearer). Attaches session to context; caller identity for API
48
+ * keys is bound downstream by resolveCaller. GET/HEAD requests always pass
49
+ * through.
50
50
  */
51
- export function sessionAuth(sessions, settings, keys) {
51
+ export function sessionAuth(sessions, keys) {
52
52
  return async (c, next) => {
53
53
  const token = extractSessionToken(c);
54
54
  const session = token ? sessions.validate(token) : null;
@@ -58,12 +58,6 @@ export function sessionAuth(sessions, settings, keys) {
58
58
  if (c.req.method === 'GET' || c.req.method === 'HEAD') {
59
59
  return next();
60
60
  }
61
- // Write operations: check if auth is required
62
- const config = settings.get();
63
- if (!config.auth.required) {
64
- // Auth not enforced — allow all writes (open mode)
65
- return next();
66
- }
67
61
  if (session)
68
62
  return next();
69
63
  // No session — fall back to a tenant-bound API key if provided.
@@ -81,15 +75,9 @@ export function sessionAuth(sessions, settings, keys) {
81
75
  * NOTE: `resolveCaller` must be mounted before any route that uses this
82
76
  * middleware. The server bootstrap in index.ts wires the chain:
83
77
  * sessionAuth → resolveCaller → scope guards.
84
- *
85
- * The legacy signature (sessions, keys, settings) is preserved so call
86
- * sites in index.ts keep compiling; arguments are ignored.
87
78
  */
88
- export function adminAuth(_sessions, _keys, settings) {
79
+ export function adminAuth() {
89
80
  return async (c, next) => {
90
- if (settings && !settings.get().auth.required)
91
- return next();
92
- // Delegate to scopeRequired indirectly by checking the caller.
93
81
  const caller = c.get('caller');
94
82
  if (caller?.scopes.includes('admin:*'))
95
83
  return next();
package/dist/cli.js CHANGED
@@ -18,7 +18,7 @@ const { values } = parseArgs({
18
18
  port: { type: 'string', default: '3000' },
19
19
  data: { type: 'string', default: './data' },
20
20
  dist: { type: 'string', default: defaultDistDir },
21
- 'no-auth': { type: 'boolean', default: false },
21
+ local: { type: 'boolean', default: false },
22
22
  },
23
23
  });
24
24
  (async () => {
@@ -26,7 +26,7 @@ const { values } = parseArgs({
26
26
  port: parseInt(values.port, 10),
27
27
  dataDir: values.data,
28
28
  distDir: values.dist,
29
- noAuth: values['no-auth'],
29
+ localMode: values.local,
30
30
  });
31
31
  await server.start();
32
32
  })();
@@ -11,12 +11,14 @@ import type { PolicyCache } from './policy.js';
11
11
  import type { TickCounter } from './tick.js';
12
12
  import type { PeerRoles } from './roles.js';
13
13
  import type { ConflictBucket, ConflictRef } from './conflicts.js';
14
+ import type { MountedPathResolver } from '../mounts/resolver.js';
14
15
  export interface TenantDocStoreDeps {
15
16
  dataDir: string;
16
17
  policy: PolicyCache;
17
18
  tick: TickCounter;
18
19
  roles: PeerRoles;
19
20
  conflicts: ConflictBucket;
21
+ mountResolver?: MountedPathResolver;
20
22
  }
21
23
  /**
22
24
  * Input for {@link TenantDocStore.applyFromPeer}.
@@ -50,6 +52,10 @@ export declare class TenantDocStore {
50
52
  constructor(deps: TenantDocStoreDeps);
51
53
  /** Root filesystem directory this store reads/writes under. */
52
54
  get dataDir(): string;
55
+ /** Set the mount resolver after construction (used when the resolver is created after the store). */
56
+ setMountResolver(resolver: MountedPathResolver): void;
57
+ /** Mount resolver wired by setMountResolver, or undefined when running without the mount system. */
58
+ get mountResolver(): MountedPathResolver | undefined;
53
59
  /** Synchronous tenant enumeration for shard-ctx's `tenants()` entry point. */
54
60
  listTenantsSync(): string[];
55
61
  /**
@@ -7,7 +7,7 @@
7
7
  * and by the ServerShardContext.documents(tenant) API.
8
8
  */
9
9
  import { readFile, writeFile, mkdir, rm, readdir, stat, rename as fsRename } from 'node:fs/promises';
10
- import { readdirSync, existsSync } from 'node:fs';
10
+ import { readdirSync, existsSync, statSync } from 'node:fs';
11
11
  import { dirname, join, relative } from 'node:path';
12
12
  import { resolveSyncMode } from './policy.js';
13
13
  import { filterReservedMeta } from './reserved.js';
@@ -18,15 +18,25 @@ export class TenantDocStore {
18
18
  #tick;
19
19
  roles;
20
20
  #conflicts;
21
+ #mountResolver;
21
22
  constructor(deps) {
22
23
  this.#dataDir = deps.dataDir;
23
24
  this.#policy = deps.policy;
24
25
  this.#tick = deps.tick;
25
26
  this.roles = deps.roles;
26
27
  this.#conflicts = deps.conflicts;
28
+ this.#mountResolver = deps.mountResolver;
27
29
  }
28
30
  /** Root filesystem directory this store reads/writes under. */
29
31
  get dataDir() { return this.#dataDir; }
32
+ /** Set the mount resolver after construction (used when the resolver is created after the store). */
33
+ setMountResolver(resolver) {
34
+ this.#mountResolver = resolver;
35
+ }
36
+ /** Mount resolver wired by setMountResolver, or undefined when running without the mount system. */
37
+ get mountResolver() {
38
+ return this.#mountResolver;
39
+ }
30
40
  /** Synchronous tenant enumeration for shard-ctx's `tenants()` entry point. */
31
41
  listTenantsSync() {
32
42
  const root = join(this.#dataDir, 'docs');
@@ -61,8 +71,27 @@ export class TenantDocStore {
61
71
  #contentPath(tenant, shardId, path) {
62
72
  return join(this.#dataDir, 'docs', tenant, shardId, path);
63
73
  }
74
+ #isMountPath(shardId) {
75
+ return shardId === 'mounts' && this.#mountResolver !== undefined;
76
+ }
77
+ #resolveMountPath(tenant, path) {
78
+ const resolved = this.#mountResolver.resolve(tenant, path);
79
+ if (resolved.kind === 'mount')
80
+ return resolved.realPath;
81
+ throw new Error(resolved.kind === 'mount-unresolved' ? resolved.error : 'Invalid mount path');
82
+ }
64
83
  // ---------- reads ----------
65
84
  async read(tenant, shardId, path) {
85
+ if (this.#isMountPath(shardId)) {
86
+ try {
87
+ return await readFile(this.#resolveMountPath(tenant, path), 'utf-8');
88
+ }
89
+ catch (err) {
90
+ if (err?.code === 'ENOENT')
91
+ return null;
92
+ throw err;
93
+ }
94
+ }
66
95
  try {
67
96
  return await readFile(this.#contentPath(tenant, shardId, path), 'utf-8');
68
97
  }
@@ -76,6 +105,15 @@ export class TenantDocStore {
76
105
  return readMeta(this.#dataDir, tenant, shardId, path);
77
106
  }
78
107
  async exists(tenant, shardId, path) {
108
+ if (this.#isMountPath(shardId)) {
109
+ try {
110
+ await stat(this.#resolveMountPath(tenant, path));
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
79
117
  try {
80
118
  await stat(this.#contentPath(tenant, shardId, path));
81
119
  return true;
@@ -85,6 +123,29 @@ export class TenantDocStore {
85
123
  }
86
124
  }
87
125
  async list(tenant, shardId) {
126
+ if (this.#isMountPath(shardId)) {
127
+ const mountIds = this.#mountResolver.listTenantMountIds(tenant);
128
+ const result = [];
129
+ for (const mountId of mountIds) {
130
+ const mount = this.#mountResolver.getMount(mountId);
131
+ if (!mount)
132
+ continue;
133
+ try {
134
+ const entries = readdirSync(mount.path, { withFileTypes: true });
135
+ for (const e of entries) {
136
+ const full = join(mount.path, e.name);
137
+ const s = statSync(full);
138
+ result.push({
139
+ path: `mounts/${mountId}/${e.name}`,
140
+ size: s.size,
141
+ lastModified: s.mtimeMs,
142
+ });
143
+ }
144
+ }
145
+ catch { /* mount path not available, skip */ }
146
+ }
147
+ return result;
148
+ }
88
149
  const root = join(this.#dataDir, 'docs', tenant, shardId);
89
150
  return this.#enumerate(root, root, tenant, shardId);
90
151
  }
@@ -110,6 +171,29 @@ export class TenantDocStore {
110
171
  out.push({ ...m, shardId: e.name });
111
172
  }
112
173
  }
174
+ // Append mount entries
175
+ if (this.#mountResolver) {
176
+ const mountIds = this.#mountResolver.listTenantMountIds(tenant);
177
+ for (const mountId of mountIds) {
178
+ const mount = this.#mountResolver.getMount(mountId);
179
+ if (!mount)
180
+ continue;
181
+ try {
182
+ const entries = readdirSync(mount.path, { withFileTypes: true });
183
+ for (const e of entries) {
184
+ const full = join(mount.path, e.name);
185
+ const s = statSync(full);
186
+ out.push({
187
+ shardId: 'mounts',
188
+ path: `mounts/${mountId}/${e.name}`,
189
+ size: s.size,
190
+ lastModified: s.mtimeMs,
191
+ });
192
+ }
193
+ }
194
+ catch { /* skip unavailable mount */ }
195
+ }
196
+ }
113
197
  return out;
114
198
  }
115
199
  async #enumerate(current, base, tenant, shardId) {
@@ -153,6 +237,12 @@ export class TenantDocStore {
153
237
  }
154
238
  // ---------- Mode A write ----------
155
239
  async write(tenant, shardId, path, content, metadata) {
240
+ if (this.#isMountPath(shardId)) {
241
+ const realPath = this.#resolveMountPath(tenant, path);
242
+ await mkdir(dirname(realPath), { recursive: true });
243
+ await writeFile(realPath, content);
244
+ return { version: 1, syncState: 'synced' };
245
+ }
156
246
  const role = this.roles.get(tenant);
157
247
  const policy = await this.#policy.get(tenant);
158
248
  const syncMode = resolveSyncMode(policy, path);
@@ -192,6 +282,16 @@ export class TenantDocStore {
192
282
  }
193
283
  // ---------- Mode A delete ----------
194
284
  async delete(tenant, shardId, path) {
285
+ if (this.#isMountPath(shardId)) {
286
+ try {
287
+ await rm(this.#resolveMountPath(tenant, path));
288
+ }
289
+ catch (err) {
290
+ if (err?.code !== 'ENOENT')
291
+ throw err;
292
+ }
293
+ return;
294
+ }
195
295
  const role = this.roles.get(tenant);
196
296
  const prev = await readMeta(this.#dataDir, tenant, shardId, path);
197
297
  const prevKnown = typeof prev?.lastKnownVersion === 'number' ? prev.lastKnownVersion : 0;
@@ -227,6 +327,13 @@ export class TenantDocStore {
227
327
  }
228
328
  // ---------- Mode A rename ----------
229
329
  async rename(tenant, shardId, oldPath, newPath) {
330
+ if (this.#isMountPath(shardId)) {
331
+ const oldReal = this.#resolveMountPath(tenant, oldPath);
332
+ const newReal = this.#resolveMountPath(tenant, newPath);
333
+ await mkdir(dirname(newReal), { recursive: true });
334
+ await fsRename(oldReal, newReal);
335
+ return;
336
+ }
230
337
  const oldCp = this.#contentPath(tenant, shardId, oldPath);
231
338
  const newCp = this.#contentPath(tenant, shardId, newPath);
232
339
  if (!(await this.exists(tenant, shardId, oldPath))) {
package/dist/index.d.ts CHANGED
@@ -17,8 +17,11 @@ export interface ServerOptions {
17
17
  dataDir?: string;
18
18
  /** Directory containing the built SH3 frontend. Default: './dist' */
19
19
  distDir?: string;
20
- /** Disable auth enforcement (for Tauri sidecar / local-owner mode). */
21
- noAuth?: boolean;
20
+ /**
21
+ * Desktop sidecar mode. Persists a synthetic `local` admin user and lets
22
+ * /api/boot auto-mint sessions for it. Replaces the legacy noAuth flag.
23
+ */
24
+ localMode?: boolean;
22
25
  }
23
26
  export declare function createServer(options?: ServerOptions): Promise<{
24
27
  app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;