sh3-server 0.17.2 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/assets/{icons-2eVU8BA9.svg → icons-nOyIoORC.svg} +31 -0
- package/app/assets/index-B2O71AUN.js +21 -0
- package/app/assets/index-B2O71AUN.js.map +1 -0
- package/app/assets/index-BAOxUjcN.css +1 -0
- package/app/assets/index-BRw5Wfxx.js +2 -0
- package/app/assets/index-BRw5Wfxx.js.map +1 -0
- package/app/assets/{tauri-backend-C24Wzcc_.js → tauri-backend-CPdbYLHz.js} +2 -2
- package/app/assets/{tauri-backend-C24Wzcc_.js.map → tauri-backend-CPdbYLHz.js.map} +1 -1
- package/app/index.html +3 -3
- package/dist/doc-store/store.d.ts +18 -1
- package/dist/doc-store/store.js +15 -7
- package/dist/index.js +12 -13
- package/dist/routes/boot.d.ts +1 -1
- package/dist/routes/boot.js +2 -1
- package/package.json +2 -1
- package/app/assets/index-D7Ewdarf.css +0 -1
- package/app/assets/index-YGsF1N98.js +0 -2
- package/app/assets/index-YGsF1N98.js.map +0 -1
- package/app/assets/index-gLLDkQ7R.js +0 -21
- package/app/assets/index-gLLDkQ7R.js.map +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-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-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}.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:where(.svelte-6j13aq){margin-top:3px}.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)}.body.svelte-1oy3640{flex:1;overflow-y:auto;padding:16px 16px 8px}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-section.svelte-yosqc3{width:100%;max-width:720px;margin-bottom:28px}.projects-heading.svelte-yosqc3{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--sh3-fg-subtle);margin:0 0 12px}.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-section.svelte-1ncltuf{width:100%;max-width:720px;margin-bottom:28px}.saved-layouts-heading.svelte-1ncltuf{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--sh3-fg-subtle);margin:0 0 12px}.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-section.svelte-11gxeaw{width:100%;max-width:720px;margin-bottom:28px}.sh3-home-section-title.svelte-11gxeaw{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--sh3-fg-subtle);margin:0 0 12px}.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-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.svelte-isy3jt{flex:1 1 auto;overflow-y:auto;overflow-anchor:none;background:var(--sh3-bg, #111);color:var(--sh3-fg, #ddd)}.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-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}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}.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}.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}.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;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%}.backdrop.svelte-vkxo1d{position:absolute;inset:0;background:var(--sh3-overlay-backdrop, rgba(0, 0, 0, .35));pointer-events:auto;z-index:var(--sh3-z-layer-4)}.sheet.svelte-vkxo1d{position:absolute;left:0;right:0;bottom:0;max-height:70vh;display:flex;flex-direction:column;background:var(--sh3-bg);color:var(--sh3-fg);border-top:1px solid var(--sh3-border);box-shadow:var(--sh3-shadow-md, 0 -4px 16px rgba(0, 0, 0, .2));pointer-events:auto;z-index:var(--sh3-z-layer-4)}.scroll.svelte-vkxo1d{flex:1;min-height:0;overflow:auto;padding:var(--sh3-pad-sm) 0}.container.svelte-vkxo1d{display:flex;align-items:center;gap:var(--sh3-pad-sm);width:100%;padding:var(--sh3-pad-sm) var(--sh3-pad-md);border:none;background:none;color:var(--sh3-fg);font-weight:600;text-align:left;cursor:pointer}.container.svelte-vkxo1d:active{background:var(--sh3-bg-sunken)}.items.svelte-vkxo1d,.subitems.svelte-vkxo1d{padding-left:var(--sh3-pad-md)}.item.svelte-vkxo1d{display:flex;align-items:center;gap:var(--sh3-pad-sm);width:100%;padding:var(--sh3-pad-sm) var(--sh3-pad-md);border:none;background:none;color:var(--sh3-fg);text-align:left;cursor:pointer}.item.svelte-vkxo1d:disabled{opacity:.5;cursor:not-allowed}.item.svelte-vkxo1d:active:not(:disabled){background:var(--sh3-bg-sunken)}.item.child.svelte-vkxo1d{padding-left:calc(var(--sh3-pad-md) * 2)}.label.svelte-vkxo1d{flex:1}.shortcut.svelte-vkxo1d{color:var(--sh3-fg-muted);font-family:var(--sh3-font-mono)}.caret.svelte-vkxo1d{display:inline-block;width:1em;transition:transform .12s}.caret.open.svelte-vkxo1d{transform:rotate(90deg)}.cancel.svelte-vkxo1d{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}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{invoke as e,transformCallback as c,Resource as l}from"./core-DsojzR6k.js";var n;(function(a){a.WINDOW_RESIZED="tauri://resize",a.WINDOW_MOVED="tauri://move",a.WINDOW_CLOSE_REQUESTED="tauri://close-requested",a.WINDOW_DESTROYED="tauri://destroyed",a.WINDOW_FOCUS="tauri://focus",a.WINDOW_BLUR="tauri://blur",a.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",a.WINDOW_THEME_CHANGED="tauri://theme-changed",a.WINDOW_CREATED="tauri://window-created",a.WINDOW_SUSPENDED="tauri://suspended",a.WINDOW_RESUMED="tauri://resumed",a.WEBVIEW_CREATED="tauri://webview-created",a.DRAG_ENTER="tauri://drag-enter",a.DRAG_OVER="tauri://drag-over",a.DRAG_DROP="tauri://drag-drop",a.DRAG_LEAVE="tauri://drag-leave"})(n||(n={}));async function h(a,t){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(a,t),await e("plugin:event|unlisten",{event:a,eventId:t})}async function o(a,t,s){var r;const u=(r=void 0)!==null&&r!==void 0?r:{kind:"Any"};return e("plugin:event|listen",{event:a,target:u,handler:c(t)}).then(d=>async()=>h(a,d))}async function y(a,t){return await i.load(a,t)}async function g(a){return await i.get(a)}class p{get store(){return this._store||(this._store=y(this.path,this.options)),this._store}constructor(t,s){this.path=t,this.options=s}async init(){await this.store}async set(t,s){return(await this.store).set(t,s)}async get(t){return(await this.store).get(t)}async has(t){return(await this.store).has(t)}async delete(t){return(await this.store).delete(t)}async clear(){await(await this.store).clear()}async reset(){await(await this.store).reset()}async keys(){return(await this.store).keys()}async values(){return(await this.store).values()}async entries(){return(await this.store).entries()}async length(){return(await this.store).length()}async reload(t){await(await this.store).reload(t)}async save(){await(await this.store).save()}async onKeyChange(t,s){return(await this.store).onKeyChange(t,s)}async onChange(t){return(await this.store).onChange(t)}async close(){this._store&&await(await this._store).close()}}class i extends l{constructor(t){super(t)}static async load(t,s){const r=await e("plugin:store|load",{path:t,options:s});return new i(r)}static async get(t){return await e("plugin:store|get_store",{path:t}).then(s=>s?new i(s):null)}async set(t,s){await e("plugin:store|set",{rid:this.rid,key:t,value:s})}async get(t){const[s,r]=await e("plugin:store|get",{rid:this.rid,key:t});return r?s:void 0}async has(t){return await e("plugin:store|has",{rid:this.rid,key:t})}async delete(t){return await e("plugin:store|delete",{rid:this.rid,key:t})}async clear(){await e("plugin:store|clear",{rid:this.rid})}async reset(){await e("plugin:store|reset",{rid:this.rid})}async keys(){return await e("plugin:store|keys",{rid:this.rid})}async values(){return await e("plugin:store|values",{rid:this.rid})}async entries(){return await e("plugin:store|entries",{rid:this.rid})}async length(){return await e("plugin:store|length",{rid:this.rid})}async reload(t){await e("plugin:store|reload",{rid:this.rid,...t})}async save(){await e("plugin:store|save",{rid:this.rid})}async onKeyChange(t,s){return await o("store://change",r=>{r.payload.resourceId===this.rid&&r.payload.key===t&&s(r.payload.exists?r.payload.value:void 0)})}async onChange(t){return await o("store://change",s=>{s.payload.resourceId===this.rid&&t(s.payload.key,s.payload.exists?s.payload.value:void 0)})}}export{p as LazyStore,i as Store,g as getStore,y as load};
|
|
2
|
+
//# sourceMappingURL=index-BRw5Wfxx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BRw5Wfxx.js","sources":["../../../../node_modules/@tauri-apps/api/event.js","../../../../node_modules/@tauri-apps/plugin-store/dist-js/index.js"],"sourcesContent":["import { invoke, transformCallback } from './core.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * The event system allows you to emit events to the backend and listen to events from it.\n *\n * This package is also accessible with `window.__TAURI__.event` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * @since 1.1.0\n */\nvar TauriEvent;\n(function (TauriEvent) {\n TauriEvent[\"WINDOW_RESIZED\"] = \"tauri://resize\";\n TauriEvent[\"WINDOW_MOVED\"] = \"tauri://move\";\n TauriEvent[\"WINDOW_CLOSE_REQUESTED\"] = \"tauri://close-requested\";\n TauriEvent[\"WINDOW_DESTROYED\"] = \"tauri://destroyed\";\n TauriEvent[\"WINDOW_FOCUS\"] = \"tauri://focus\";\n TauriEvent[\"WINDOW_BLUR\"] = \"tauri://blur\";\n TauriEvent[\"WINDOW_SCALE_FACTOR_CHANGED\"] = \"tauri://scale-change\";\n TauriEvent[\"WINDOW_THEME_CHANGED\"] = \"tauri://theme-changed\";\n TauriEvent[\"WINDOW_CREATED\"] = \"tauri://window-created\";\n TauriEvent[\"WINDOW_SUSPENDED\"] = \"tauri://suspended\";\n TauriEvent[\"WINDOW_RESUMED\"] = \"tauri://resumed\";\n TauriEvent[\"WEBVIEW_CREATED\"] = \"tauri://webview-created\";\n TauriEvent[\"DRAG_ENTER\"] = \"tauri://drag-enter\";\n TauriEvent[\"DRAG_OVER\"] = \"tauri://drag-over\";\n TauriEvent[\"DRAG_DROP\"] = \"tauri://drag-drop\";\n TauriEvent[\"DRAG_LEAVE\"] = \"tauri://drag-leave\";\n})(TauriEvent || (TauriEvent = {}));\n/**\n * Unregister the event listener associated with the given name and id.\n *\n * @ignore\n * @param event The event name\n * @param eventId Event identifier\n * @returns\n */\nasync function _unlisten(event, eventId) {\n window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(event, eventId);\n await invoke('plugin:event|unlisten', {\n event,\n eventId\n });\n}\n/**\n * Listen to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { listen } from '@tauri-apps/api/event';\n * const unlisten = await listen<string>('error', (event) => {\n * console.log(`Got error, payload: ${event.payload}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function listen(event, handler, options) {\n var _a;\n const target = typeof (options === null || options === void 0 ? void 0 : options.target) === 'string'\n ? { kind: 'AnyLabel', label: options.target }\n : ((_a = options === null || options === void 0 ? void 0 : options.target) !== null && _a !== void 0 ? _a : { kind: 'Any' });\n return invoke('plugin:event|listen', {\n event,\n target,\n handler: transformCallback(handler)\n }).then((eventId) => {\n return async () => _unlisten(event, eventId);\n });\n}\n/**\n * Listens once to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { once } from '@tauri-apps/api/event';\n * interface LoadedPayload {\n * loggedIn: boolean,\n * token: string\n * }\n * const unlisten = await once<LoadedPayload>('loaded', (event) => {\n * console.log(`App is loaded, loggedIn: ${event.payload.loggedIn}, token: ${event.payload.token}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function once(event, handler, options) {\n return listen(event, (eventData) => {\n void _unlisten(event, eventData.id);\n handler(eventData);\n }, options);\n}\n/**\n * Emits an event to all {@link EventTarget|targets}.\n *\n * @example\n * ```typescript\n * import { emit } from '@tauri-apps/api/event';\n * await emit('frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 1.0.0\n */\nasync function emit(event, payload) {\n await invoke('plugin:event|emit', {\n event,\n payload\n });\n}\n/**\n * Emits an event to all {@link EventTarget|targets} matching the given target.\n *\n * @example\n * ```typescript\n * import { emitTo } from '@tauri-apps/api/event';\n * await emitTo('main', 'frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param target Label of the target Window/Webview/WebviewWindow or raw {@link EventTarget} object.\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 2.0.0\n */\nasync function emitTo(target, event, payload) {\n const eventTarget = typeof target === 'string' ? { kind: 'AnyLabel', label: target } : target;\n await invoke('plugin:event|emit_to', {\n target: eventTarget,\n event,\n payload\n });\n}\n\nexport { TauriEvent, emit, emitTo, listen, once };\n","import { listen } from '@tauri-apps/api/event';\nimport { Resource, invoke } from '@tauri-apps/api/core';\n\n// Copyright 2019-2023 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * Create a new Store or load the existing store with the path.\n *\n * @example\n * ```typescript\n * import { Store } from '@tauri-apps/api/store';\n * const store = await Store.load('store.json');\n * ```\n *\n * @param path Path to save the store in `app_data_dir`\n * @param options Store configuration options\n */\nasync function load(path, options) {\n return await Store.load(path, options);\n}\n/**\n * Gets an already loaded store.\n *\n * If the store is not loaded, returns `null`. In this case you must {@link Store.load load} it.\n *\n * This function is more useful when you already know the store is loaded\n * and just need to access its instance. Prefer {@link Store.load} otherwise.\n *\n * @example\n * ```typescript\n * import { getStore } from '@tauri-apps/api/store';\n * const store = await getStore('store.json');\n * ```\n *\n * @param path Path of the store.\n */\nasync function getStore(path) {\n return await Store.get(path);\n}\n/**\n * A lazy loaded key-value store persisted by the backend layer.\n */\nclass LazyStore {\n get store() {\n if (!this._store) {\n this._store = load(this.path, this.options);\n }\n return this._store;\n }\n /**\n * Note that the options are not applied if someone else already created the store\n * @param path Path to save the store in `app_data_dir`\n * @param options Store configuration options\n */\n constructor(path, options) {\n this.path = path;\n this.options = options;\n }\n /**\n * Init/load the store if it's not loaded already\n */\n async init() {\n await this.store;\n }\n async set(key, value) {\n return (await this.store).set(key, value);\n }\n async get(key) {\n return (await this.store).get(key);\n }\n async has(key) {\n return (await this.store).has(key);\n }\n async delete(key) {\n return (await this.store).delete(key);\n }\n async clear() {\n await (await this.store).clear();\n }\n async reset() {\n await (await this.store).reset();\n }\n async keys() {\n return (await this.store).keys();\n }\n async values() {\n return (await this.store).values();\n }\n async entries() {\n return (await this.store).entries();\n }\n async length() {\n return (await this.store).length();\n }\n async reload(options) {\n await (await this.store).reload(options);\n }\n async save() {\n await (await this.store).save();\n }\n async onKeyChange(key, cb) {\n return (await this.store).onKeyChange(key, cb);\n }\n async onChange(cb) {\n return (await this.store).onChange(cb);\n }\n async close() {\n if (this._store) {\n await (await this._store).close();\n }\n }\n}\n/**\n * A key-value store persisted by the backend layer.\n */\nclass Store extends Resource {\n constructor(rid) {\n super(rid);\n }\n /**\n * Create a new Store or load the existing store with the path.\n *\n * @example\n * ```typescript\n * import { Store } from '@tauri-apps/api/store';\n * const store = await Store.load('store.json');\n * ```\n *\n * @param path Path to save the store in `app_data_dir`\n * @param options Store configuration options\n */\n static async load(path, options) {\n const rid = await invoke('plugin:store|load', {\n path,\n options\n });\n return new Store(rid);\n }\n /**\n * Gets an already loaded store.\n *\n * If the store is not loaded, returns `null`. In this case you must {@link Store.load load} it.\n *\n * This function is more useful when you already know the store is loaded\n * and just need to access its instance. Prefer {@link Store.load} otherwise.\n *\n * @example\n * ```typescript\n * import { Store } from '@tauri-apps/api/store';\n * let store = await Store.get('store.json');\n * if (!store) {\n * store = await Store.load('store.json');\n * }\n * ```\n *\n * @param path Path of the store.\n */\n static async get(path) {\n return await invoke('plugin:store|get_store', { path }).then((rid) => (rid ? new Store(rid) : null));\n }\n async set(key, value) {\n await invoke('plugin:store|set', {\n rid: this.rid,\n key,\n value\n });\n }\n async get(key) {\n const [value, exists] = await invoke('plugin:store|get', {\n rid: this.rid,\n key\n });\n return exists ? value : undefined;\n }\n async has(key) {\n return await invoke('plugin:store|has', {\n rid: this.rid,\n key\n });\n }\n async delete(key) {\n return await invoke('plugin:store|delete', {\n rid: this.rid,\n key\n });\n }\n async clear() {\n await invoke('plugin:store|clear', { rid: this.rid });\n }\n async reset() {\n await invoke('plugin:store|reset', { rid: this.rid });\n }\n async keys() {\n return await invoke('plugin:store|keys', { rid: this.rid });\n }\n async values() {\n return await invoke('plugin:store|values', { rid: this.rid });\n }\n async entries() {\n return await invoke('plugin:store|entries', { rid: this.rid });\n }\n async length() {\n return await invoke('plugin:store|length', { rid: this.rid });\n }\n async reload(options) {\n await invoke('plugin:store|reload', { rid: this.rid, ...options });\n }\n async save() {\n await invoke('plugin:store|save', { rid: this.rid });\n }\n async onKeyChange(key, cb) {\n return await listen('store://change', (event) => {\n if (event.payload.resourceId === this.rid && event.payload.key === key) {\n cb(event.payload.exists ? event.payload.value : undefined);\n }\n });\n }\n async onChange(cb) {\n return await listen('store://change', (event) => {\n if (event.payload.resourceId === this.rid) {\n cb(event.payload.key, event.payload.exists ? event.payload.value : undefined);\n }\n });\n }\n}\n\nexport { LazyStore, Store, getStore, load };\n"],"names":["TauriEvent","_unlisten","event","eventId","invoke","listen","handler","options","_a","target","transformCallback","load","path","Store","getStore","LazyStore","key","value","cb","Resource","rid","exists"],"mappings":"iFAcA,IAAIA,GACH,SAAUA,EAAY,CACnBA,EAAW,eAAoB,iBAC/BA,EAAW,aAAkB,eAC7BA,EAAW,uBAA4B,0BACvCA,EAAW,iBAAsB,oBACjCA,EAAW,aAAkB,gBAC7BA,EAAW,YAAiB,eAC5BA,EAAW,4BAAiC,uBAC5CA,EAAW,qBAA0B,wBACrCA,EAAW,eAAoB,yBAC/BA,EAAW,iBAAsB,oBACjCA,EAAW,eAAoB,kBAC/BA,EAAW,gBAAqB,0BAChCA,EAAW,WAAgB,qBAC3BA,EAAW,UAAe,oBAC1BA,EAAW,UAAe,oBAC1BA,EAAW,WAAgB,oBAC/B,GAAGA,IAAeA,EAAa,CAAA,EAAG,EASlC,eAAeC,EAAUC,EAAOC,EAAS,CACrC,OAAO,iCAAiC,mBAAmBD,EAAOC,CAAO,EACzE,MAAMC,EAAO,wBAAyB,CAClC,MAAAF,EACA,QAAAC,CACR,CAAK,CACL,CAuBA,eAAeE,EAAOH,EAAOI,EAASC,EAAS,CAC3C,IAAIC,EACJ,MAAMC,GAEED,EAA8C,UAA6B,MAAQA,IAAO,OAASA,EAAK,CAAE,KAAM,KAAK,EAC7H,OAAOJ,EAAO,sBAAuB,CACjC,MAAAF,EACA,OAAAO,EACA,QAASC,EAAkBJ,CAAO,CAC1C,CAAK,EAAE,KAAMH,GACE,SAAYF,EAAUC,EAAOC,CAAO,CAC9C,CACL,CChEA,eAAeQ,EAAKC,EAAML,EAAS,CAC/B,OAAO,MAAMM,EAAM,KAAKD,EAAML,CAAO,CACzC,CAiBA,eAAeO,EAASF,EAAM,CAC1B,OAAO,MAAMC,EAAM,IAAID,CAAI,CAC/B,CAIA,MAAMG,CAAU,CACZ,IAAI,OAAQ,CACR,OAAK,KAAK,SACN,KAAK,OAASJ,EAAK,KAAK,KAAM,KAAK,OAAO,GAEvC,KAAK,MAChB,CAMA,YAAYC,EAAML,EAAS,CACvB,KAAK,KAAOK,EACZ,KAAK,QAAUL,CACnB,CAIA,MAAM,MAAO,CACT,MAAM,KAAK,KACf,CACA,MAAM,IAAIS,EAAKC,EAAO,CAClB,OAAQ,MAAM,KAAK,OAAO,IAAID,EAAKC,CAAK,CAC5C,CACA,MAAM,IAAID,EAAK,CACX,OAAQ,MAAM,KAAK,OAAO,IAAIA,CAAG,CACrC,CACA,MAAM,IAAIA,EAAK,CACX,OAAQ,MAAM,KAAK,OAAO,IAAIA,CAAG,CACrC,CACA,MAAM,OAAOA,EAAK,CACd,OAAQ,MAAM,KAAK,OAAO,OAAOA,CAAG,CACxC,CACA,MAAM,OAAQ,CACV,MAAO,MAAM,KAAK,OAAO,MAAK,CAClC,CACA,MAAM,OAAQ,CACV,MAAO,MAAM,KAAK,OAAO,MAAK,CAClC,CACA,MAAM,MAAO,CACT,OAAQ,MAAM,KAAK,OAAO,KAAI,CAClC,CACA,MAAM,QAAS,CACX,OAAQ,MAAM,KAAK,OAAO,OAAM,CACpC,CACA,MAAM,SAAU,CACZ,OAAQ,MAAM,KAAK,OAAO,QAAO,CACrC,CACA,MAAM,QAAS,CACX,OAAQ,MAAM,KAAK,OAAO,OAAM,CACpC,CACA,MAAM,OAAOT,EAAS,CAClB,MAAO,MAAM,KAAK,OAAO,OAAOA,CAAO,CAC3C,CACA,MAAM,MAAO,CACT,MAAO,MAAM,KAAK,OAAO,KAAI,CACjC,CACA,MAAM,YAAYS,EAAKE,EAAI,CACvB,OAAQ,MAAM,KAAK,OAAO,YAAYF,EAAKE,CAAE,CACjD,CACA,MAAM,SAASA,EAAI,CACf,OAAQ,MAAM,KAAK,OAAO,SAASA,CAAE,CACzC,CACA,MAAM,OAAQ,CACN,KAAK,QACL,MAAO,MAAM,KAAK,QAAQ,MAAK,CAEvC,CACJ,CAIA,MAAML,UAAcM,CAAS,CACzB,YAAYC,EAAK,CACb,MAAMA,CAAG,CACb,CAaA,aAAa,KAAKR,EAAML,EAAS,CAC7B,MAAMa,EAAM,MAAMhB,EAAO,oBAAqB,CAC1C,KAAAQ,EACA,QAAAL,CACZ,CAAS,EACD,OAAO,IAAIM,EAAMO,CAAG,CACxB,CAoBA,aAAa,IAAIR,EAAM,CACnB,OAAO,MAAMR,EAAO,yBAA0B,CAAE,KAAAQ,CAAI,CAAE,EAAE,KAAMQ,GAASA,EAAM,IAAIP,EAAMO,CAAG,EAAI,IAAK,CACvG,CACA,MAAM,IAAIJ,EAAKC,EAAO,CAClB,MAAMb,EAAO,mBAAoB,CAC7B,IAAK,KAAK,IACV,IAAAY,EACA,MAAAC,CACZ,CAAS,CACL,CACA,MAAM,IAAID,EAAK,CACX,KAAM,CAACC,EAAOI,CAAM,EAAI,MAAMjB,EAAO,mBAAoB,CACrD,IAAK,KAAK,IACV,IAAAY,CACZ,CAAS,EACD,OAAOK,EAASJ,EAAQ,MAC5B,CACA,MAAM,IAAID,EAAK,CACX,OAAO,MAAMZ,EAAO,mBAAoB,CACpC,IAAK,KAAK,IACV,IAAAY,CACZ,CAAS,CACL,CACA,MAAM,OAAOA,EAAK,CACd,OAAO,MAAMZ,EAAO,sBAAuB,CACvC,IAAK,KAAK,IACV,IAAAY,CACZ,CAAS,CACL,CACA,MAAM,OAAQ,CACV,MAAMZ,EAAO,qBAAsB,CAAE,IAAK,KAAK,GAAG,CAAE,CACxD,CACA,MAAM,OAAQ,CACV,MAAMA,EAAO,qBAAsB,CAAE,IAAK,KAAK,GAAG,CAAE,CACxD,CACA,MAAM,MAAO,CACT,OAAO,MAAMA,EAAO,oBAAqB,CAAE,IAAK,KAAK,IAAK,CAC9D,CACA,MAAM,QAAS,CACX,OAAO,MAAMA,EAAO,sBAAuB,CAAE,IAAK,KAAK,IAAK,CAChE,CACA,MAAM,SAAU,CACZ,OAAO,MAAMA,EAAO,uBAAwB,CAAE,IAAK,KAAK,IAAK,CACjE,CACA,MAAM,QAAS,CACX,OAAO,MAAMA,EAAO,sBAAuB,CAAE,IAAK,KAAK,IAAK,CAChE,CACA,MAAM,OAAOG,EAAS,CAClB,MAAMH,EAAO,sBAAuB,CAAE,IAAK,KAAK,IAAK,GAAGG,EAAS,CACrE,CACA,MAAM,MAAO,CACT,MAAMH,EAAO,oBAAqB,CAAE,IAAK,KAAK,GAAG,CAAE,CACvD,CACA,MAAM,YAAYY,EAAKE,EAAI,CACvB,OAAO,MAAMb,EAAO,iBAAmBH,GAAU,CACzCA,EAAM,QAAQ,aAAe,KAAK,KAAOA,EAAM,QAAQ,MAAQc,GAC/DE,EAAGhB,EAAM,QAAQ,OAASA,EAAM,QAAQ,MAAQ,MAAS,CAEjE,CAAC,CACL,CACA,MAAM,SAASgB,EAAI,CACf,OAAO,MAAMb,EAAO,iBAAmBH,GAAU,CACzCA,EAAM,QAAQ,aAAe,KAAK,KAClCgB,EAAGhB,EAAM,QAAQ,IAAKA,EAAM,QAAQ,OAASA,EAAM,QAAQ,MAAQ,MAAS,CAEpF,CAAC,CACL,CACJ","x_google_ignoreList":[0,1]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{LazyStore as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=tauri-backend-
|
|
1
|
+
import{LazyStore as i}from"./index-BRw5Wfxx.js";import"./core-DsojzR6k.js";class n{#t;#e=new Map;constructor(e){this.#t=new i(`${e}.json`,{defaults:{},autoSave:!0})}read(e){return this.#e.get(e)}write(e,t){this.#e.set(e,t),this.#t.set(e,t).catch(s=>console.warn("SH3: store write failed",s))}delete(e){this.#e.delete(e),this.#t.delete(e).catch(t=>console.warn("SH3: store delete failed",t))}list(){return[...this.#e.keys()]}async init(){const e=await this.#t.entries();for(const[t,s]of e)this.#e.set(t,s);await this.#t.onChange((t,s)=>{s===void 0?this.#e.delete(t):this.#e.set(t,s)})}}export{n as TauriStoreBackend};
|
|
2
|
+
//# sourceMappingURL=tauri-backend-CPdbYLHz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-backend-
|
|
1
|
+
{"version":3,"file":"tauri-backend-CPdbYLHz.js","sources":["../../../sh3-core/src/platform/tauri-backend.ts"],"sourcesContent":["/*\n * TauriStoreBackend — implements the sh3 Backend interface using\n * @tauri-apps/plugin-store. Each zone gets its own .json store file\n * (e.g. \"workspace.json\", \"user.json\") in Tauri's app data directory.\n *\n * tauri-plugin-store v2 keeps an in-memory cache and flushes to disk\n * automatically. We pre-load the full store into a local Map during\n * init(), then serve reads/lists synchronously from that cache —\n * matching the Backend interface contract. Writes go to both the\n * local cache and the Tauri store (fire-and-forget async).\n *\n * Multi-window coherence: each Tauri WebviewWindow runs its own JS\n * context, so each gets its own TauriStoreBackend instance with an\n * independent #cache. Without coordination, a satellite window booted\n * from the host would never see writes made in the host (or vice\n * versa). init() subscribes to plugin-store's onChange event so any\n * cross-window write is mirrored into the local cache. The same event\n * fires for this window's own writes too, but the cache.set there is\n * idempotent.\n */\n\nimport { LazyStore } from '@tauri-apps/plugin-store';\nimport type { Backend } from '../state/types';\n\nexport class TauriStoreBackend implements Backend {\n #store: LazyStore;\n #cache = new Map<string, unknown>();\n\n constructor(zoneName: string) {\n this.#store = new LazyStore(`${zoneName}.json`, { defaults: {}, autoSave: true });\n }\n\n read(shardId: string): unknown | undefined {\n return this.#cache.get(shardId);\n }\n\n write(shardId: string, value: unknown): void {\n this.#cache.set(shardId, value);\n // Fire-and-forget — autoSave flushes to disk.\n this.#store.set(shardId, value).catch((e: unknown) => console.warn('SH3: store write failed', e));\n }\n\n delete(shardId: string): void {\n this.#cache.delete(shardId);\n this.#store.delete(shardId).catch((e: unknown) => console.warn('SH3: store delete failed', e));\n }\n\n list(): string[] {\n return [...this.#cache.keys()];\n }\n\n /**\n * Load the store from disk into the local cache and start mirroring\n * cross-window writes. Must be called once before read/list return\n * meaningful data. Called by the platform resolver at boot.\n */\n async init(): Promise<void> {\n const entries = await this.#store.entries<unknown>();\n for (const [key, value] of entries) {\n this.#cache.set(key, value);\n }\n // Mirror writes from other WebviewWindows (and our own) into the\n // local cache so reads stay coherent across the host + satellites.\n // The unlisten fn is intentionally not retained — the backend lives\n // for the page session and the subscription tears down with it.\n await this.#store.onChange<unknown>((key, value) => {\n if (value === undefined) {\n this.#cache.delete(key);\n } else {\n this.#cache.set(key, value);\n }\n });\n }\n}\n"],"names":["TauriStoreBackend","#store","#cache","zoneName","LazyStore","shardId","value","e","entries","key"],"mappings":"2EAwBO,MAAMA,CAAqC,CAChDC,GACAC,OAAa,IAEb,YAAYC,EAAkB,CAC5B,KAAKF,GAAS,IAAIG,EAAU,GAAGD,CAAQ,QAAS,CAAE,SAAU,CAAA,EAAI,SAAU,EAAA,CAAM,CAClF,CAEA,KAAKE,EAAsC,CACzC,OAAO,KAAKH,GAAO,IAAIG,CAAO,CAChC,CAEA,MAAMA,EAAiBC,EAAsB,CAC3C,KAAKJ,GAAO,IAAIG,EAASC,CAAK,EAE9B,KAAKL,GAAO,IAAII,EAASC,CAAK,EAAE,MAAOC,GAAe,QAAQ,KAAK,0BAA2BA,CAAC,CAAC,CAClG,CAEA,OAAOF,EAAuB,CAC5B,KAAKH,GAAO,OAAOG,CAAO,EAC1B,KAAKJ,GAAO,OAAOI,CAAO,EAAE,MAAOE,GAAe,QAAQ,KAAK,2BAA4BA,CAAC,CAAC,CAC/F,CAEA,MAAiB,CACf,MAAO,CAAC,GAAG,KAAKL,GAAO,MAAM,CAC/B,CAOA,MAAM,MAAsB,CAC1B,MAAMM,EAAU,MAAM,KAAKP,GAAO,QAAA,EAClC,SAAW,CAACQ,EAAKH,CAAK,IAAKE,EACzB,KAAKN,GAAO,IAAIO,EAAKH,CAAK,EAM5B,MAAM,KAAKL,GAAO,SAAkB,CAACQ,EAAKH,IAAU,CAC9CA,IAAU,OACZ,KAAKJ,GAAO,OAAOO,CAAG,EAEtB,KAAKP,GAAO,IAAIO,EAAKH,CAAK,CAE9B,CAAC,CACH,CACF"}
|
package/app/index.html
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-B2O71AUN.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BAOxUjcN.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="app"></div>
|
|
@@ -18,11 +18,20 @@ export interface TenantDocStoreDeps {
|
|
|
18
18
|
roles: PeerRoles;
|
|
19
19
|
conflicts: ConflictBucket;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Input for {@link TenantDocStore.applyFromPeer}.
|
|
23
|
+
*
|
|
24
|
+
* `assignedVersion` is written as-is to the store. The store does NOT
|
|
25
|
+
* auto-increment it. Callers are responsible for computing the correct next
|
|
26
|
+
* version (typically `expectedLocalVersion + 1` when a primary accepts a
|
|
27
|
+
* replica push).
|
|
28
|
+
*/
|
|
21
29
|
export interface ApplyFromPeerInput {
|
|
22
30
|
shardId: string;
|
|
23
31
|
path: string;
|
|
24
32
|
content: string | Buffer;
|
|
25
|
-
|
|
33
|
+
/** The exact version the store will write. Not auto-incremented. */
|
|
34
|
+
assignedVersion: number;
|
|
26
35
|
expectedLocalVersion: number;
|
|
27
36
|
origin: string;
|
|
28
37
|
deleted?: boolean;
|
|
@@ -65,6 +74,14 @@ export declare class TenantDocStore {
|
|
|
65
74
|
}>;
|
|
66
75
|
delete(tenant: string, shardId: string, path: string): Promise<void>;
|
|
67
76
|
rename(tenant: string, shardId: string, oldPath: string, newPath: string): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Apply a document version received from a peer.
|
|
79
|
+
*
|
|
80
|
+
* `input.assignedVersion` is written as-is to the store. The store does NOT
|
|
81
|
+
* auto-increment it. Callers are responsible for computing the correct next
|
|
82
|
+
* version (typically `expectedLocalVersion + 1` when a primary accepts a
|
|
83
|
+
* replica push).
|
|
84
|
+
*/
|
|
68
85
|
applyFromPeer(tenant: string, input: ApplyFromPeerInput): Promise<ApplyResult>;
|
|
69
86
|
listConflicts(tenant: string): Promise<ConflictRef[]>;
|
|
70
87
|
readConflict(tenant: string, shardId: string, path: string): Promise<ConflictFile | null>;
|
package/dist/doc-store/store.js
CHANGED
|
@@ -270,19 +270,27 @@ export class TenantDocStore {
|
|
|
270
270
|
await this.#tick.bump(tenant);
|
|
271
271
|
}
|
|
272
272
|
// ---------- Mode B — applyFromPeer ----------
|
|
273
|
+
/**
|
|
274
|
+
* Apply a document version received from a peer.
|
|
275
|
+
*
|
|
276
|
+
* `input.assignedVersion` is written as-is to the store. The store does NOT
|
|
277
|
+
* auto-increment it. Callers are responsible for computing the correct next
|
|
278
|
+
* version (typically `expectedLocalVersion + 1` when a primary accepts a
|
|
279
|
+
* replica push).
|
|
280
|
+
*/
|
|
273
281
|
async applyFromPeer(tenant, input) {
|
|
274
|
-
const { shardId, path, content,
|
|
282
|
+
const { shardId, path, content, assignedVersion, expectedLocalVersion, origin } = input;
|
|
275
283
|
const prev = await readMeta(this.#dataDir, tenant, shardId, path);
|
|
276
284
|
const prevVersion = typeof prev?.version === 'number' ? prev.version : 0;
|
|
277
285
|
const prevState = prev?.syncState;
|
|
278
286
|
if (!prev) {
|
|
279
|
-
await this.#overwriteFromPeer(tenant, shardId, path, content,
|
|
280
|
-
return { applied: true, version:
|
|
287
|
+
await this.#overwriteFromPeer(tenant, shardId, path, content, assignedVersion, origin, input.deleted);
|
|
288
|
+
return { applied: true, version: assignedVersion };
|
|
281
289
|
}
|
|
282
290
|
if (prevState === 'synced') {
|
|
283
291
|
if (prevVersion === expectedLocalVersion) {
|
|
284
|
-
await this.#overwriteFromPeer(tenant, shardId, path, content,
|
|
285
|
-
return { applied: true, version:
|
|
292
|
+
await this.#overwriteFromPeer(tenant, shardId, path, content, assignedVersion, origin, input.deleted);
|
|
293
|
+
return { applied: true, version: assignedVersion };
|
|
286
294
|
}
|
|
287
295
|
return { applied: false, reason: 'stale' };
|
|
288
296
|
}
|
|
@@ -296,7 +304,7 @@ export class TenantDocStore {
|
|
|
296
304
|
});
|
|
297
305
|
await this.#conflicts.append(tenant, shardId, path, {
|
|
298
306
|
origin,
|
|
299
|
-
version:
|
|
307
|
+
version: assignedVersion,
|
|
300
308
|
content: typeof content === 'string' ? content : content.toString('utf-8'),
|
|
301
309
|
at: Date.now(),
|
|
302
310
|
});
|
|
@@ -307,7 +315,7 @@ export class TenantDocStore {
|
|
|
307
315
|
// prevState === 'conflict'
|
|
308
316
|
await this.#conflicts.append(tenant, shardId, path, {
|
|
309
317
|
origin,
|
|
310
|
-
version:
|
|
318
|
+
version: assignedVersion,
|
|
311
319
|
content: typeof content === 'string' ? content : content.toString('utf-8'),
|
|
312
320
|
at: Date.now(),
|
|
313
321
|
});
|
package/dist/index.js
CHANGED
|
@@ -101,20 +101,19 @@ export async function createServer(options = {}) {
|
|
|
101
101
|
// CORS
|
|
102
102
|
app.use('*', cors({ origin: '*', credentials: true }));
|
|
103
103
|
// --- Public routes (no auth) ---
|
|
104
|
-
// Server version
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
104
|
+
// Server version — resolved once so both /api/version and /api/boot
|
|
105
|
+
// surface the same string without re-reading the file each request.
|
|
106
|
+
let serverVersion;
|
|
107
|
+
try {
|
|
108
|
+
serverVersion = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf-8')).version;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// In a SEA binary, import.meta.url is unavailable; esbuild define inlines __SEA_VERSION__.
|
|
112
|
+
serverVersion = typeof __SEA_VERSION__ !== 'undefined' ? __SEA_VERSION__ : 'unknown';
|
|
113
|
+
}
|
|
114
|
+
app.get('/api/version', (c) => c.json({ version: serverVersion }));
|
|
116
115
|
// Boot config
|
|
117
|
-
app.route('/api/boot', createBootRouter(sessions, users, settings));
|
|
116
|
+
app.route('/api/boot', createBootRouter(sessions, users, settings, serverVersion));
|
|
118
117
|
// Auth endpoints (login, logout, register, verify)
|
|
119
118
|
app.route('/api/auth', createAuthRouter(keys, users, sessions, settings));
|
|
120
119
|
// --- Session-gated routes ---
|
package/dist/routes/boot.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ import { Hono } from 'hono';
|
|
|
8
8
|
import type { SessionStore } from '../sessions.js';
|
|
9
9
|
import type { UserStore } from '../users.js';
|
|
10
10
|
import type { SettingsStore } from '../settings.js';
|
|
11
|
-
export declare function createBootRouter(sessions: SessionStore, users: UserStore, settings: SettingsStore): Hono;
|
|
11
|
+
export declare function createBootRouter(sessions: SessionStore, users: UserStore, settings: SettingsStore, version: string): Hono;
|
package/dist/routes/boot.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Hono } from 'hono';
|
|
8
8
|
import { randomUUID } from 'node:crypto';
|
|
9
|
-
export function createBootRouter(sessions, users, settings) {
|
|
9
|
+
export function createBootRouter(sessions, users, settings, version) {
|
|
10
10
|
const router = new Hono();
|
|
11
11
|
router.get('/', (c) => {
|
|
12
12
|
const config = settings.get();
|
|
@@ -50,6 +50,7 @@ export function createBootRouter(sessions, users, settings) {
|
|
|
50
50
|
expiresAt: session.expiresAt,
|
|
51
51
|
} : null,
|
|
52
52
|
tenantId,
|
|
53
|
+
version,
|
|
53
54
|
});
|
|
54
55
|
});
|
|
55
56
|
return router;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sh3-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sh3-server": "dist/cli.js"
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@hono/node-server": "^1.13.0",
|
|
31
31
|
"@hono/node-ws": "^1.3.0",
|
|
32
|
+
"@tauri-apps/plugin-http": "^2.5.9",
|
|
32
33
|
"bcrypt": "^6.0.0",
|
|
33
34
|
"hono": "^4.6.0"
|
|
34
35
|
},
|