staffa 0.22.1 → 0.23.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/README.md +2 -2
- package/dist/components/main.d.ts +14 -1
- package/dist/components/main.js +9 -1
- package/dist/components/panels.d.ts +13 -0
- package/dist/components/panels.js +21 -8
- package/dist/components/textarea.js +7 -2
- package/dist/index.d.ts +1 -1
- package/dist/staffa.esm.js +1 -1
- package/package.json +1 -1
- package/skill/MainOptions.md +15 -0
- package/skill/Panel.md +4 -0
- package/skill/SKILL.md +9 -2
- package/src/components/main.ts +23 -2
- package/src/components/panels.ts +33 -8
- package/src/components/textarea.ts +7 -2
- package/src/index.ts +1 -1
package/README.md
CHANGED
|
@@ -164,7 +164,7 @@ Each handler gets a `$panel` proxy: the params from its route, plus what the she
|
|
|
164
164
|
|
|
165
165
|
**The stack is an object, not a global.** `S.main()` hands back the `PanelStack` — `pushPanel`, `replacePanel`, `openPanelStack`, `closePanel`, and the live, reactive `panels` / `currentPanel` / `currentPanelIndex` — and every panel gets that same object as `$panel.stack`, which is what a route handler uses, since it runs while the `S.main()` call is still going. Every navigation settles asynchronously (closes travel through the browser's history), so each method returns a `Promise<boolean>`. Don't hold a `Panel` across a navigation; read it fresh. To navigate on behalf of one particular screen — a row's click handler — use that panel's own `$panel.open(href, how?)`, which does exactly what a link inside it does; `pushPanel` builds on the *current* panel instead.
|
|
166
166
|
|
|
167
|
-
**Columns and widths.** The content area is the window minus the nav sidebar, or `S.main({ maxWidth })` of it, centred — the same width whatever is open, so the sidebar, top bar and footer never move. It divides into the fewest whole number of columns of at most **540px** each, never narrower than **360px**; `$panel.maxWidth` asks for one, two (the default), three of them or the lot. A column's width depends only on the window, never on what else is open, so opening or closing a panel never resizes another. Its ask is a ceiling, never a floor: aim your layout at 360px and let it degrade gracefully below that. `$panel.width` is the resolved figure in pixels, correct before your handler draws.
|
|
167
|
+
**Columns and widths.** The content area is the window minus the nav sidebar, or `S.main({ maxWidth })` of it, centred — the same width whatever is open, so the sidebar, top bar and footer never move. It divides into the fewest whole number of columns of at most **540px** each, never narrower than **360px**; `$panel.maxWidth` asks for one, two (the default), three of them or the lot. A column's width depends only on the window, never on what else is open, so opening or closing a panel never resizes another. Its ask is a ceiling, never a floor: aim your layout at 360px and let it degrade gracefully below that. `$panel.width` is the resolved figure in pixels, correct before your handler draws. Columns that don't fill the area centre in it; `S.main({ alignment })` puts them `"left"`, `"right"` or `"spaced"` (the leftover room shared out evenly beside and between them) instead.
|
|
168
168
|
|
|
169
169
|
**A panel declares its chrome; the shell places it.** A screen says what it is called and what it can do; everything else in its column — headings, cards, boxes — is the screen's own content, drawn like any other.
|
|
170
170
|
|
|
@@ -215,7 +215,7 @@ Return the paths shallowest first, or nothing to fall back to the parent-path wa
|
|
|
215
215
|
|
|
216
216
|
- Search params and the `#hash` belong to the current panel only; anything another panel needs in order to redraw itself has to live in its path. (A panel you browse away from does get its search and hash back when a crumb makes it current again.)
|
|
217
217
|
- A closed panel is torn down at once: its `A.clean()` hooks run the moment it closes, so subscriptions, timers and requests stop there and then.
|
|
218
|
-
- `columns: "single"` shows only the current panel however wide the screen — only the display changes. It, `linkNavigation` and `maxWidth` are live: pass a proxied options object and a change is adopted in place, every panel keeping its state.
|
|
218
|
+
- `columns: "single"` shows only the current panel however wide the screen — only the display changes. It, `alignment`, `linkNavigation` and `maxWidth` are live: pass a proxied options object and a change is adopted in place, every panel keeping its state.
|
|
219
219
|
- Only one routed `S.main()` can be mounted at a time; a second one throws, since the URL is global. Nothing else is.
|
|
220
220
|
- Aberdeen's own `route.go()` works, but builds the whole stack from the path; prefer the stack's methods. A guard your app registered with `route.setGuard` keeps working — Staffa registers none of its own.
|
|
221
221
|
- Deep links need your static server to serve the app for unknown paths (the usual SPA fallback; `-P` for `http-server`, as in the demo command below).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Slot, type Attributes } from "../core.js";
|
|
2
2
|
import { type MenuOptions } from "./menu.js";
|
|
3
|
-
import { type PanelStack, type AncestorTable, type RouteHandler, type RouteTable, type Routes } from "./panels.js";
|
|
3
|
+
import { type PanelStack, type PanelAlignment, type AncestorTable, type RouteHandler, type RouteTable, type Routes } from "./panels.js";
|
|
4
4
|
/** Options for {@link main}. */
|
|
5
5
|
export interface MainOptions<R = Routes> {
|
|
6
6
|
/** Aberdeen attr/style string applied to the outermost shell element. */
|
|
@@ -190,6 +190,19 @@ export interface MainOptions<R = Routes> {
|
|
|
190
190
|
* state.
|
|
191
191
|
*/
|
|
192
192
|
columns?: "auto" | "single";
|
|
193
|
+
/**
|
|
194
|
+
* Where the open columns sit when they don't fill the content area — on a
|
|
195
|
+
* wide screen with a single small panel open, say. `"center"` (the default)
|
|
196
|
+
* splits the leftover room between both sides, `"left"` and `"right"` put it
|
|
197
|
+
* all on one side, and `"spaced"` shares it out evenly over the gutters
|
|
198
|
+
* beside *and between* the columns. Columns crowded out on the left take
|
|
199
|
+
* precedence: while there are any, the run hugs the left edge whatever this
|
|
200
|
+
* says. Routed mode only.
|
|
201
|
+
*
|
|
202
|
+
* Live, like {@link MainOptions.columns}: a change is adopted in one layout
|
|
203
|
+
* pass, every panel keeping its state.
|
|
204
|
+
*/
|
|
205
|
+
alignment?: PanelAlignment;
|
|
193
206
|
/**
|
|
194
207
|
* What a link *without* a `data-panel` attribute does — the per-link
|
|
195
208
|
* attribute always wins. The three keep less and less of the link's own
|
package/dist/components/main.js
CHANGED
|
@@ -166,6 +166,7 @@ export function main(opts = {}) {
|
|
|
166
166
|
// Live: each in its own scope, so a change on a proxied options object
|
|
167
167
|
// re-runs only that scope — the columns relayout in place, panels intact.
|
|
168
168
|
A(() => ctl.setColumns(opts.columns));
|
|
169
|
+
A(() => ctl.setAlignment(opts.alignment));
|
|
169
170
|
A(() => ctl.setLinkNavigation(opts.linkNavigation));
|
|
170
171
|
}
|
|
171
172
|
// Where the brand mark and the app's name link; nowhere under `home: null`.
|
|
@@ -242,8 +243,15 @@ export function main(opts = {}) {
|
|
|
242
243
|
// falling back to the app's chrome. Promoted actions are marked
|
|
243
244
|
// `.s-panel-origin`, so a link among them still builds on the
|
|
244
245
|
// current panel — see `interceptLinks` in panels.ts.
|
|
246
|
+
//
|
|
247
|
+
// Which slot wins is derived, so a panel swap that doesn't change
|
|
248
|
+
// the answer — neither screen declaring actions, the app's `menu`
|
|
249
|
+
// standing on both sides — leaves the slot's DOM alone. This is
|
|
250
|
+
// where an app puts its stateful chrome (`menu`'s search box), and
|
|
251
|
+
// rebuilding it would drop focus, caret and IME composition.
|
|
252
|
+
const $promoted = A.derive(() => ($shell.narrow ? ctl?.currentPanel?.actions : undefined));
|
|
245
253
|
A(() => {
|
|
246
|
-
const actions = $
|
|
254
|
+
const actions = $promoted.value;
|
|
247
255
|
const slot = actions ?? opts.menu;
|
|
248
256
|
if (slot != null)
|
|
249
257
|
A(`div.s-menu${actions != null ? ".s-panel-origin" : ""}`, () => drawSlot(slot));
|
|
@@ -84,6 +84,11 @@ export type AncestorTable<R> = {
|
|
|
84
84
|
* they all come to the same thing.
|
|
85
85
|
*/
|
|
86
86
|
export type PanelSize = "small" | "medium" | "large" | "none";
|
|
87
|
+
/**
|
|
88
|
+
* Where the open columns sit when they don't fill the content area; see
|
|
89
|
+
* {@link MainOptions.alignment}.
|
|
90
|
+
*/
|
|
91
|
+
export type PanelAlignment = "left" | "right" | "center" | "spaced";
|
|
87
92
|
/**
|
|
88
93
|
* What a route handler gets: the params from its route, plus everything the
|
|
89
94
|
* shell needs to know about the panel it is drawing. It's an Aberdeen proxy, so
|
|
@@ -135,6 +140,10 @@ export interface Panel<P = Record<string, string | number | string[]>> {
|
|
|
135
140
|
* They are drawn in exactly one of those places at a time, so crossing the
|
|
136
141
|
* threshold redraws them; anything stateful inside (the focus in a search
|
|
137
142
|
* box) is lost. Buttons and menus are fine.
|
|
143
|
+
*
|
|
144
|
+
* Assign one function and keep it: a fresh closure on every redraw of your
|
|
145
|
+
* handler is a new slot, so the shell redraws the actions — and on a narrow
|
|
146
|
+
* shell, where they sit in the top bar, the app's own chrome with them.
|
|
138
147
|
*/
|
|
139
148
|
actions?: Slot;
|
|
140
149
|
/**
|
|
@@ -303,6 +312,8 @@ export interface PanelStackOptions {
|
|
|
303
312
|
ancestors?: Record<string, AncestorsHandler | undefined>;
|
|
304
313
|
/** How many panels are shown at a time. See {@link MainOptions.columns}. */
|
|
305
314
|
columns?: "auto" | "single";
|
|
315
|
+
/** Where a short run of columns sits in the area. See {@link MainOptions.alignment}. */
|
|
316
|
+
alignment?: PanelAlignment;
|
|
306
317
|
/** What a bare link does. See {@link MainOptions.linkNavigation}. */
|
|
307
318
|
linkNavigation?: "push" | "replace" | "open";
|
|
308
319
|
/** The shell's own title, used as the suffix of `document.title`. */
|
|
@@ -639,6 +650,8 @@ export declare class PanelStackController implements PanelStack {
|
|
|
639
650
|
closePanel(path?: string): Promise<boolean>;
|
|
640
651
|
/** Adopt a changed `columns` setting: one layout pass, nothing redrawn. */
|
|
641
652
|
setColumns(columns: "auto" | "single" | undefined): void;
|
|
653
|
+
/** Adopt a changed `alignment`: one layout pass, nothing redrawn. */
|
|
654
|
+
setAlignment(alignment: PanelAlignment | undefined): void;
|
|
642
655
|
/** Adopt a changed `linkNavigation` default; the next click reads it. */
|
|
643
656
|
setLinkNavigation(mode: "push" | "replace" | "open" | undefined): void;
|
|
644
657
|
/**
|
|
@@ -167,7 +167,8 @@ A.insertGlobalCss({
|
|
|
167
167
|
`z-index:2 transition: transform ${PAGE_MS}ms ease-out, opacity ${PAGE_MS}ms linear;`,
|
|
168
168
|
// The hairline between two columns, fading at both ends (like the sidebar's
|
|
169
169
|
// `.s-nav-sep`). Columns tile with no gutter — each brings its own `$3` of
|
|
170
|
-
// padding — so this sits exactly on the boundary.
|
|
170
|
+
// padding — so this sits exactly on the boundary. A `"spaced"` alignment,
|
|
171
|
+
// which does put a gutter between them, leaves it off (see `layout`).
|
|
171
172
|
"&.s-panel-sep::before": "content:'' position:absolute left:0 top:0.6rem bottom:0.6rem width:1px z-index:1 " +
|
|
172
173
|
"background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);",
|
|
173
174
|
// Still owed or playing its entry fade: beneath the settled panels, so
|
|
@@ -952,6 +953,13 @@ export class PanelStackController {
|
|
|
952
953
|
this.opts.columns = columns;
|
|
953
954
|
this.scheduleLayout();
|
|
954
955
|
}
|
|
956
|
+
/** Adopt a changed `alignment`: one layout pass, nothing redrawn. */
|
|
957
|
+
setAlignment(alignment) {
|
|
958
|
+
if (this.opts.alignment === alignment)
|
|
959
|
+
return;
|
|
960
|
+
this.opts.alignment = alignment;
|
|
961
|
+
this.scheduleLayout();
|
|
962
|
+
}
|
|
955
963
|
/** Adopt a changed `linkNavigation` default; the next click reads it. */
|
|
956
964
|
setLinkNavigation(mode) {
|
|
957
965
|
this.opts.linkNavigation = mode;
|
|
@@ -1294,11 +1302,16 @@ export class PanelStackController {
|
|
|
1294
1302
|
first = i;
|
|
1295
1303
|
}
|
|
1296
1304
|
}
|
|
1297
|
-
// A run that doesn't fill the fixed-width area
|
|
1298
|
-
//
|
|
1299
|
-
//
|
|
1300
|
-
//
|
|
1301
|
-
|
|
1305
|
+
// A run that doesn't fill the fixed-width area is placed in it by the
|
|
1306
|
+
// shell's `alignment`, `"spaced"` sharing the slack out over the gutters
|
|
1307
|
+
// around and between the columns. Unless panels sit crowded out on the
|
|
1308
|
+
// run's left: then it hugs the left edge, so the strip crosses that edge
|
|
1309
|
+
// with no gap, a reveal is a plain slide back in, and no gutter lets a
|
|
1310
|
+
// crowded-out panel peek through.
|
|
1311
|
+
const slack = first > 0 ? 0 : geom.area - runSum;
|
|
1312
|
+
const align = this.opts.alignment ?? "center";
|
|
1313
|
+
const gap = align === "spaced" ? slack / (cur - first + 2) : 0;
|
|
1314
|
+
const left = align === "left" ? 0 : align === "right" ? slack : align === "spaced" ? gap : slack / 2;
|
|
1302
1315
|
for (let i = first; i <= cur; i++)
|
|
1303
1316
|
live[i].width = width(live[i]);
|
|
1304
1317
|
// Never-visible panels get their would-be width, so a reveal doesn't start
|
|
@@ -1378,14 +1391,14 @@ export class PanelStackController {
|
|
|
1378
1391
|
}
|
|
1379
1392
|
}
|
|
1380
1393
|
el.style.width = `${entry.width}px`;
|
|
1381
|
-
x += entry.width;
|
|
1394
|
+
x += entry.width + gap;
|
|
1382
1395
|
// Written only on a change, so per-panel UI hanging off `visible` or
|
|
1383
1396
|
// `width` isn't rebuilt by every pass.
|
|
1384
1397
|
if (entry.$panel.visible !== shown)
|
|
1385
1398
|
entry.$panel.visible = shown;
|
|
1386
1399
|
if (entry.$panel.width !== entry.width)
|
|
1387
1400
|
entry.$panel.width = entry.width;
|
|
1388
|
-
el.classList.toggle("s-panel-sep", shown && i > first);
|
|
1401
|
+
el.classList.toggle("s-panel-sep", shown && i > first && !gap);
|
|
1389
1402
|
// Off-screen panels stop rendering, keeping their DOM. A revealed
|
|
1390
1403
|
// panel is visible at once; one sliding offstage stays visible for
|
|
1391
1404
|
// the whole slide, its visibility class deferred to the slide's
|
|
@@ -10,7 +10,9 @@ A.insertGlobalCss({
|
|
|
10
10
|
// a prefix/suffix gives it one.
|
|
11
11
|
"textarea.s-input, .s-inset.s-inset-bottom": "flex: 0 1 100%; min-height:0",
|
|
12
12
|
"textarea.s-input": "resize:vertical min-height:3em line-height:1.45",
|
|
13
|
-
|
|
13
|
+
// Sized to its text there is nothing to scroll, so `auto` shows no bar — until
|
|
14
|
+
// a caller caps the height (`inputAttrs: "max-height:12em"`), when it should.
|
|
15
|
+
"textarea.s-input.s-autoGrow": "resize:none min-height:2.5em overflow-y:auto",
|
|
14
16
|
});
|
|
15
17
|
/**
|
|
16
18
|
* A multi-line text input. Shares the field chrome and styling of
|
|
@@ -76,5 +78,8 @@ export function textarea(opts = {}) {
|
|
|
76
78
|
}
|
|
77
79
|
function fitToContent(el) {
|
|
78
80
|
el.style.height = "auto";
|
|
79
|
-
|
|
81
|
+
// `scrollHeight` measures the padding box, while the height we set sizes the
|
|
82
|
+
// border box: add the borders back, or the text ends up two pixels too tall
|
|
83
|
+
// for its box and the textarea scrolls by that much.
|
|
84
|
+
el.style.height = `${el.scrollHeight + el.offsetHeight - el.clientHeight}px`;
|
|
80
85
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -40,7 +40,7 @@ export { buttonGroup, type ButtonGroupOptions } from "./components/buttonGroup.j
|
|
|
40
40
|
export { checkbox, type CheckboxOptions } from "./components/checkbox.js";
|
|
41
41
|
export { form, type FormOptions } from "./components/form.js";
|
|
42
42
|
export { main, closeNav, type MainOptions } from "./components/main.js";
|
|
43
|
-
export { type PanelStack, type Panel, type PanelSize, type Routes, type RouteHandler, type RouteTable, type AncestorsHandler, type AncestorTable, type PathParams, type SegParams } from "./components/panels.js";
|
|
43
|
+
export { type PanelStack, type Panel, type PanelSize, type PanelAlignment, type Routes, type RouteHandler, type RouteTable, type AncestorsHandler, type AncestorTable, type PathParams, type SegParams } from "./components/panels.js";
|
|
44
44
|
export { menu, menuButton, showFloatingMenu, addContextMenu, isFloatingMenuOpen, closeFloatingMenu, type MenuListOptions, type MenuOptions, type MenuEntry, type MenuItem, type MenuSeparator, type FloatingMenuOptions, type ContextMenuOptions } from "./components/menu.js";
|
|
45
45
|
export { dialog, alert, confirm, prompt, isDialogOpen, type DialogOptions } from "./components/dialog.js";
|
|
46
46
|
export { select, type SelectOptions, type SelectOptionInput } from "./components/select.js";
|
package/dist/staffa.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import I from"aberdeen";var p2=t=>`background: $s-bg linear-gradient(${t}, color-mix(in oklab, $s-bg, white 9%), color-mix(in oklab, $s-bg, black 9%));`,O1=p2("170deg"),q1=p2("180deg"),T1="staffa:darkMode",r2=I.proxy({value:N2()});function N2(){try{let t=localStorage.getItem(T1);if(t==="dark")return!0;if(t==="light")return!1}catch{}}function G2(t){r2.value=t;try{t===void 0?localStorage.removeItem(T1):localStorage.setItem(T1,t?"dark":"light")}catch{}}function o2(t=!1){let a=r2.value;return a===void 0&&!t?I.darkMode():a}I(()=>{o2()?I.insertGlobalCss({":root, .s-s.neutral":"--s-bg:#0e0f12 --s-text:#e9eaec",".s-s.neutral":"--s-bg:#191b1f --s-text:#e9eaec",".s-s.neutral .s-s.neutral":"--s-bg:#23262b"}):I.insertGlobalCss({":root, .s-s.neutral":"--s-bg:#eef0f3 --s-text:#1d1f24",".s-s.neutral, .s-s.neutral":"--s-bg:#ffffff --s-text:#1d1f24",".s-s.neutral .s-s.neutral":"--s-bg:#f6f7f9"})});I.setSpacingCssVars(1.1);I.insertGlobalCss({"*, *::before, *::after":"box-sizing:border-box",html:"text-size-adjust:100%",body:"m:0 p:$3 min-height:100dvh line-height:1.5 font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -webkit-font-smoothing:antialiased text:$s-text "+O1,a:"color: $s-link-fg; text-decoration:underline text-underline-offset:2px; transition: color 0.12s, filter 0.12s;","a:hover":"filter: brightness(1.15)","input, button, textarea, select, optgroup":"font:inherit color:inherit","input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=image],[type=submit],[type=button],[type=reset],[type=hidden])), textarea, select":"background:$s-bg border: 1px solid $s-faint; r:$s-radius-sm padding: 0.45em 0.65em; max-width:100%","input:where([type=checkbox],[type=radio])":"width:1.15em height:1.15em cursor:pointer","input[type=range]":"appearance:none background:transparent cursor:pointer vertical-align:middle","input[type=range]::-webkit-slider-runnable-track":"height:4px r:99px background:$s-faint","input[type=range]::-moz-range-track":"height:4px r:99px background:$s-faint","input[type=range]::-moz-range-progress":"height:4px r:99px background:$s-accent","input[type=range]::-webkit-slider-thumb":"appearance:none width:16px height:16px margin-top:-6px r:50% background:$s-accent","input[type=range]::-moz-range-thumb":"width:16px height:16px border:0 r:50% background:$s-accent","input[type=file]":"cursor:pointer",progress:"appearance:none border:0 height:6px r:99px background:$s-faint overflow:hidden vertical-align:middle","progress::-webkit-progress-bar":"background:$s-faint r:99px","progress::-webkit-progress-value":"background:$s-accent r:99px","progress::-moz-progress-bar":"background:$s-accent r:99px",meter:"vertical-align:middle",fieldset:"border: 1px solid $s-faint; r:$s-radius-sm padding:$2 min-width:0",legend:"padding: 0 $1; font-weight:600","code, kbd, samp, pre":"font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;",code:"background: color-mix(in oklab, $s-text, $s-bg 86%); padding: 0.12em 0.34em; r:4px font-size:0.9em",pre:"background: color-mix(in oklab, $s-text, $s-bg 92%); p:$3 r: $s-radius; overflow:auto","pre code":"background:transparent p:0","img, svg, video, canvas":"max-width:100% h:auto",hr:"border:0 border-top: 1px solid $s-faint;","::placeholder":"color: $s-muted; opacity:1",":focus-visible":"outline: 2px solid $s-focus; outline-offset:2px",small:"color:$s-muted font-size:0.9em","@media (prefers-reduced-motion: reduce)":{"*, *::before, *::after":"transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; scroll-behavior: auto !important;"},":root":"--s-primary:#00a884 --s-danger:#dc5b41 --s-success:#00a884 --s-warning:#ef6b00 --s-link:#3f8cd8 --s-radius-sm:6px --s-radius:12px --s-radius-lg:18px --s-focus: color-mix(in srgb, $s-primary 38%, transparent); --s-gradient: linear-gradient(135deg, color-mix(in oklab, $s-primary, white 16%), color-mix(in oklab, $s-primary, black 14%));",":root, .s-s.neutral":"--s-accent:$s-primary --s-link-fg:$s-link",".s-s:not(.neutral)":"--s-bg:$s-primary border:0 --s-text:#eee --s-accent:#fff --s-link-fg:#eef --s-muted: color-mix(in srgb, #fff 70%, transparent); --s-faint: color-mix(in srgb, #fff 30%, transparent);",".s-s.danger":"--s-bg:$s-danger",".s-s.success":"--s-bg:$s-success",".s-s.warning":"--s-bg:$s-warning",".s-s.link":"--s-bg:$s-link",".s-s.primary":"--s-bg:$s-primary",":root, .s-s":"--s-muted: color-mix(in oklab, $s-text, $s-bg 42%); --s-faint: color-mix(in oklab, $s-text, $s-bg 80%); color:$s-text accent-color:$s-accent scrollbar-width:thin scrollbar-color: $s-faint transparent;",".s-s":O1+" r:$s-radius",":where(.s-s.neutral)":"border: 1px solid $s-faint;",".s-s::-webkit-scrollbar, .s-s ::-webkit-scrollbar":"width:10px height:10px",".s-s::-webkit-scrollbar-track, .s-s ::-webkit-scrollbar-track":"background:transparent",".s-s::-webkit-scrollbar-thumb, .s-s ::-webkit-scrollbar-thumb":"background:$s-faint border-radius:99px border: 2px solid transparent; background-clip:padding-box",".s-s.shadow.neutral:not(.s-btn)":"box-shadow: 0 4px 14px rgba(0,0,0,0.13);",".s-s.extra-shadow.neutral:not(.s-btn)":"box-shadow: 0 18px 50px rgba(0,0,0,0.28);",".s-s.shadow:not(.neutral):not(.tonal):not(.outlined)":"box-shadow: 0 4px 14px color-mix(in srgb, $s-bg 30%, transparent);",".s-s.extra-shadow:not(.neutral):not(.tonal):not(.outlined)":"box-shadow: 0 14px 40px color-mix(in srgb, $s-bg 40%, transparent);",".s-s.no-shadow":"box-shadow: none !important;",".s-s:not(.neutral).tonal, .s-s:not(.neutral).outlined":{"&":"--s-text:$s-bg --s-accent:$s-bg --s-link-fg:$s-bg --s-faint: color-mix(in srgb, $s-bg 30%, transparent); --s-muted: color-mix(in srgb, $s-bg 70%, transparent);",code:"background:transparent padding:0",pre:"background:transparent border: 1px solid $s-faint;"},".s-s:not(.neutral).tonal":"background: color-mix(in srgb, $s-bg 15%, transparent); border: 1px solid $s-faint;",".s-s:not(.neutral).outlined":"background: transparent; border: 1px solid color-mix(in srgb, $s-bg 45%, transparent);",".s-s:not(.neutral) .s-s.tonal, .s-s:not(.neutral) .s-s.outlined":"--s-text:#fff --s-accent:#fff --s-link-fg:#fff "+O1+" border-color: transparent;"});I.insertGlobalCss({".s-preload, .s-preload *, .s-preload *::before, .s-preload *::after":"transition: none !important; animation: none !important;"});if(typeof document<"u"&&typeof requestAnimationFrame=="function"){let t=document.documentElement;t.classList.add("s-preload"),requestAnimationFrame(()=>requestAnimationFrame(()=>t.classList.remove("s-preload")))}I.insertGlobalCss({":disabled, [aria-disabled=true]":"opacity:0.45 filter:saturate(0.6) user-select:none",":disabled, [aria-disabled=true], :disabled *, [aria-disabled=true] *":"pointer-events:none cursor:not-allowed"});var X2="p, ul, ol, dl, blockquote, pre, table, figure, hr, h1, h2, h3, h4, h5, h6";I.insertGlobalCss({[`${X2}`]:{"&":"margin:0","&:not(:first-child)":"margin-top:$3"},"h1, h2, h3, h4, h5, h6":{"&":"line-height:1.15 font-weight:700 text-wrap:balance","&:not(:first-child)":"margin-top:1.4em"},h1:"font-size:2em font-weight:800 letter-spacing:-0.022em",h2:"font-size:1.55em letter-spacing:-0.018em",h3:"font-size:1.3em letter-spacing:-0.011em",h4:"font-size:1.1em",h5:"font-size:0.95em letter-spacing:0.005em",h6:"font-size:0.8em fg:$s-muted text-transform:uppercase letter-spacing:0.07em","ul, ol":{"&":"padding-left:1.5em","> li:not(:first-child), li > &:not(:first-child)":"margin-top:$1"},blockquote:"border-left: 3px solid $s-faint; padding-left: $3; fg: $s-muted",table:"border-collapse:collapse","th, td":"text-align:left padding: $1 $2; border-bottom: 1px solid $s-faint; vertical-align:top",th:"font-weight:600","thead th":"border-bottom: 2px solid $s-faint;",dt:"font-weight:600",dd:"margin-left: 1.5em",figcaption:"fg:$s-muted font-size:0.9em margin-top:$1 text-align:center"});import R1 from"aberdeen";var y1=typeof navigator<"u"&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent),_2={esc:"escape",space:" "},j2={" ":"Space",escape:"Esc",arrowup:"\u2191",arrowdown:"\u2193",arrowleft:"\u2190",arrowright:"\u2192"},f1=new WeakMap,q=[];function n2(){let t=R1();if(!t)throw new Error("Staffa: claimKeyboard needs a current element");return q.push(t),()=>{let a=q.indexOf(t);a>=0&&q.splice(a,1)}}function c2(t){let[,a,e,h]=/^(mod\+)?(shift\+)?(.*)$/i.exec(t),p=h.toLowerCase();if(p=_2[p]??p,!p||p.length>1&&/[-+]/.test(p))throw new Error(`Staffa: can't parse key "${t}" \u2014 write "k", "f2", "mod+k" or "mod+shift+f2"`);if(e&&p.toUpperCase()===p)throw new Error(`Staffa: "${t}" \u2014 write the shifted character itself ("?", not "shift+/")`);return(a?"mod+":"")+(e?"shift+":"")+p}function Q2(t){if(t.altKey||(y1?t.ctrlKey:t.metaKey))return null;let a=t.key.toLowerCase(),e=t.shiftKey&&(a.length>1||t.key.toUpperCase()!==a);return((y1?t.metaKey:t.ctrlKey)?"mod+":"")+(e?"shift+":"")+a}function i2(t,a){if(!(a instanceof HTMLElement))return!1;let e=t.startsWith("mod+"),h=t.replace(/^(mod\+)?(shift\+)?/,"");if(h==="enter"&&a.closest("a[href]")!=null||!e&&(h==="enter"||h===" ")&&a.closest("button, summary, [role=button]")!=null)return!0;let p=a.tagName;return!e&&h!=="escape"&&(p==="INPUT"||p==="TEXTAREA"||p==="SELECT"||a.isContentEditable)}function s2(t,a){let e=q[q.length-1];return a.global===!0||!e||e.contains(t)}function J2(t){for(let a=q.length-1;a>=0;a--)if(q[a].contains(t))return q[a]}function l2(){return q[q.length-1]??document.body}function M2(t){let a=q[q.length-1];return a&&!(t&&a.contains(t))?a:t??document.body}var d2=!1;function Y2(t){if(t.defaultPrevented||t.repeat||t.isComposing)return;let a=Q2(t),e=t.target instanceof Element?t.target:null;if(!(a==null||i2(a,e)))for(let h=M2(e);h;h=h.parentElement){let p=f1.get(h)?.get(a);if(p&&s2(h,p)){p.press&&(t.preventDefault(),p.press(t));return}}}function x2(t){let a=new Map;for(let e=M2(t);e;e=e.parentElement){let h=f1.get(e);if(h)for(let[p,r]of h)!a.has(p)&&s2(e,r)&&!i2(p,t)&&a.set(p,r)}return[...a]}function P(t,a,e,h="normal"){let p=R1(),r=h==="global"?document.body:h==="local"?p:h==="normal"?(p&&J2(p))??document.body:h;if(!r)throw new Error("Staffa: a local key binding needs a current element");let o=c2(t),d=f1.get(r);d||f1.set(r,d=new Map);let n={description:a,press:e,global:h==="global",prev:d.get(o)};d.set(o,n),d2||(d2=!0,document.addEventListener("keydown",Y2)),R1.clean(()=>{let c=d.get(o);if(c===n)n.prev?d.set(o,n.prev):d.delete(o);else for(;c;c=c.prev)if(c.prev===n){c.prev=n.prev;break}})}function R(t,a=!1){let e=c2(t),h=e.startsWith("mod+"),p=h?e.slice(4):e,r=p.startsWith("shift+"),o=r?p.slice(6):p,d=o.length===1?o.toUpperCase():o[0].toUpperCase()+o.slice(1);if(a){let c=o===" "?"Space":r||o.length>1?d:o;return(h?y1?"Meta+":"Control+":"")+(r?"Shift+":"")+c}let n=j2[o]??d;return y1?(r?"\u21E7":"")+(h?"\u2318":"")+n:(h?"Ctrl+":"")+(r?"Shift+":"")+n}import J from"aberdeen";import D1 from"aberdeen";var g1=640,t0=0;function j(t="s"){return`${t}-${++t0}`}function M(t,...a){t!=null&&(typeof t=="function"?t(...a):D1("rich=",t))}var a0="a[href], button, input, select, textarea, [tabindex]",m2=t=>t instanceof HTMLElement&&!t.hasAttribute("disabled")&&t.getAttribute("aria-disabled")!=="true"&&t.tabIndex>=0&&t.getClientRects().length>0;function Z1(t){return[...t.querySelectorAll(a0)].filter(m2)}function p1(t,a){let e=(a?[...t.querySelectorAll(a)].find(m2):void 0)??Z1(t)[0];return e?.focus(),e!=null}function F(t){queueMicrotask(()=>D1(t))}var v2=["scroll","resize","transitionstart","animationstart"];function r1(t,a){let e="",h=0,p=0,r=()=>{let d=t instanceof Element?t.getBoundingClientRect():t,n=`${d.left} ${d.top} ${d.bottom} ${d.width}`;n!==e&&(e=n,a(d),p=0),h=++p>30?0:requestAnimationFrame(r)},o=()=>{p=0,h||r()};for(let d of v2)window.addEventListener(d,o,!0);return D1.clean(()=>{cancelAnimationFrame(h);for(let d of v2)window.removeEventListener(d,o,!0)}),r(),()=>{e="",o()}}import g from"aberdeen";import $ from"aberdeen";import Z from"aberdeen";Z.insertGlobalCss({".s-tt-tip":{"&":"position:fixed z-index:500 max-width:20rem w:max-content padding: 0.3em 0.65em; font-size:0.85em line-height:1.4 pointer-events:none"}});var o1=Z.proxy(void 0),K=null;function e0(t,a,e,h){let r=window.innerWidth,o=window.innerHeight,d=0,n=0;return h==="bottom"?(d=t.left+(t.width-a)/2,n=t.bottom+7,n+e>o-8&&(n=t.top-e-7)):h==="left"?(d=t.left-a-7,n=t.top+(t.height-e)/2,d<8&&(d=t.right+7)):h==="right"?(d=t.right+7,n=t.top+(t.height-e)/2,d+a>r-8&&(d=t.left-a-7)):(d=t.left+(t.width-a)/2,n=t.top-e-7,n<8&&(n=t.bottom+7)),{x:Math.max(8,Math.min(d,r-a-8)),y:Math.max(8,Math.min(n,o-e-8))}}function B1(){K&&clearTimeout(K),K=setTimeout(()=>{o1.value=void 0,K=null},100)}F(()=>{let t=o1.value;if(!t)return;let{opts:a,anchor:e}=t,h=a.placement??"top",p=Z("div.s-tt-tip.s-s.neutral.shadow role=tooltip",a.attrs,()=>{Z("mouseenter=",()=>{K&&(clearTimeout(K),K=null)}),Z("mouseleave=",B1),M(a.tip)});r1(e,r=>{if(r.bottom<0||r.top>window.innerHeight||r.right<0||r.left>window.innerWidth||e.closest("[inert]")){o1.value=void 0;return}let{x:o,y:d}=e0(r,p.offsetWidth,p.offsetHeight,h);p.style.left=o+"px",p.style.top=d+"px"})});function s1(t){let a=e=>{K&&(clearTimeout(K),K=null),o1.value={opts:t,anchor:e.currentTarget}};Z("mouseenter=",a),Z("mouseleave=",B1),Z("focusin=",e=>{e.target.matches?.(":focus-visible")&&a(e)}),Z("focusout=",B1),Z.clean(()=>{Z.unproxy(o1).value?.opts===t&&(o1.value=void 0)})}$.insertGlobalCss({".s-btn":{"&":"display:inline-flex align-items:center justify-content:center gap:$2 font-weight:450 line-height:1.1 white-space:nowrap cursor:pointer text-decoration:none padding: $m2 $m3; transition: background 0.15s, border-color 0.15s, color 0.15s, filter 0.15s, box-shadow 0.15s, transform 0.08s;","&:focus-visible":"outline: 3px solid $s-focus; outline-offset: 1px;","&:hover:not([aria-disabled=true])":"filter: brightness(1.06)","&.tonal:hover:not([aria-disabled=true]), &.outlined:hover:not([aria-disabled=true])":"background: color-mix(in srgb, $s-bg 24%, transparent);","&.neutral:hover:not([aria-disabled=true])":"filter:none background: color-mix(in srgb, $s-text 8%, $s-bg);","> svg":"width:1.25em height:1.25em","&:active:not(:disabled):not([aria-disabled=true])":"transform: translateY(1px)","&[aria-disabled=true]":"pointer-events:auto cursor:not-allowed","&.small, .small > &":"padding: $m1 $m2; font-size:0.85em border-radius:$s-radius-sm","&.large, .large > &":"font-size:1.4em border-radius:$s-radius-lg"},".s-icon-btn":{"&":"display:inline-flex align-items:center justify-content:center flex-shrink:0 width:2rem height:2rem p:0 border:0 background:transparent cursor:pointer fg:$s-muted r:$s-radius-sm line-height:1 font-size:1rem text-decoration:none transition: color 0.12s, background 0.12s;","> svg":"width:1.25em height:1.25em","&:hover:not(:disabled):not([aria-disabled=true])":"fg:$s-text background: color-mix(in srgb, $s-text 10%, transparent);","&:focus-visible":"outline: 3px solid $s-focus; outline-offset:1px","&[aria-disabled=true]":"pointer-events:auto cursor:not-allowed","&.small, .small > &":"width:1.6rem height:1.6rem font-size:0.8rem","&.large, .large > &":"width:2.4rem height:2.4rem font-size:1.2rem"},".s-btn.s-busy, .s-icon-btn.s-busy, .s-busy .s-btn[type=submit]":"pointer-events:none cursor:progress",".s-btn.s-busy::after, .s-icon-btn.s-busy::after, .s-busy .s-btn[type=submit]::after":"content:'' flex-shrink:0 width:1em height:1em r:50% border: 2px solid currentColor; border-top-color: transparent; animation: s-spin 0.7s linear infinite;",".s-icon-btn.s-busy > svg":"display:none","@keyframes s-spin":{to:"transform: rotate(360deg)"}});function l1(t){let a=t.href!=null?"a":"button",e=t.tooltip===!1?void 0:t.tooltip,h=t.ariaLabel??(typeof e=="string"?y2(e):void 0);$(`${a}.s-icon-btn`,t.attrs,()=>{u2(t,e!=null),$("aria-label=",h),f2(t.tooltip,t.key,h,t.disabled),M(t.icon)})}function u2(t,a=!1){t.href!=null?($("role=button"),t.disabled?$("aria-disabled=true"):$("href=",t.href)):t.disabled&&a?($("type=",t.type??"button"),$("aria-disabled=true tabindex=-1"),$("click=",e=>{e.preventDefault(),e.stopPropagation()})):($("type=",t.type??"button"),t.disabled&&$("disabled=true")),t.click&&!t.disabled&&h0(t.click)}function h0(t){let a=$.proxy({value:!1});$(()=>{a.value&&$(".s-busy aria-busy=true")}),$("click=",e=>{if(a.value)return;let h=t(e);if(!h||typeof h.then!="function")return;a.value=!0;let p=()=>{a.value=!1};Promise.resolve(h).then(p,r=>{throw p(),r})})}function y2(t){return t.replace(/\*\*(.+?)\*\*|\*(.+?)\*|`(.+?)`|\[(.+?)\]\((.+?)\)/g,(a,e,h,p,r)=>e??h??p??r)}function f2(t,a,e,h){if(t!==!1&&(t!=null||a)&&s1({tip:()=>{M(t),a&&$("#",t==null?R(a):` \xB7 ${R(a)}`)}}),a&&!h){let p=$();$("aria-keyshortcuts=",R(a,!0)),P(a,e,()=>p.click())}}function B(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t,e=a.href!=null?"a":"button",h=a.tooltip===!1?void 0:a.tooltip,p=a.ariaLabel??(a.content==null&&typeof h=="string"?y2(h):void 0);$(`${e}.s-btn.s-s.shadow`,a.attrs,()=>{u2(a,h!=null),p&&$("aria-label=",p),f2(a.tooltip,a.key,typeof a.content=="string"?a.content:p,a.disabled),M(a.icon),M(a.content)})}import g2 from"aberdeen";g2.insertGlobalCss({".s-bgroup":{"&":"display:inline-flex align-items:stretch","&.s-spaced":"gap:$2 flex-wrap:wrap","&.s-vertical":"flex-direction:column","&.s-attached":"gap:0","&.s-attached:not(.s-vertical) > .s-btn:not(:first-child)":"margin-left:-1px","&.s-attached:not(.s-vertical) > .s-btn:not(:first-child):not(:last-child)":"r:0","&.s-attached:not(.s-vertical) > .s-btn:first-child:not(:last-child)":"border-top-right-radius:0 border-bottom-right-radius:0","&.s-attached:not(.s-vertical) > .s-btn:last-child:not(:first-child)":"border-top-left-radius:0 border-bottom-left-radius:0","&.s-attached.s-vertical > .s-btn:not(:first-child)":"margin-top:-1px","&.s-attached.s-vertical > .s-btn:not(:first-child):not(:last-child)":"r:0","&.s-attached.s-vertical > .s-btn:first-child:not(:last-child)":"border-bottom-left-radius:0 border-bottom-right-radius:0","&.s-attached.s-vertical > .s-btn:last-child:not(:first-child)":"border-top-left-radius:0 border-top-right-radius:0","&.s-attached > .s-btn:hover, &.s-attached > .s-btn:focus-visible":"z-index:1"}});function t1(t={}){let e=`.s-${t.layout??"attached"}${t.vertical?".s-vertical":""}`;g2(`div.s-bgroup${e} role=group`,t.attrs,()=>{if(t.buttons)for(let h of t.buttons)B(h);M(t.content)})}import a1 from"aberdeen";import L from"aberdeen";L.insertGlobalCss({".s-field":{"&":"display:flex flex-direction:column gap:$1","> label":"font-weight:600 font-size:0.9em fg:$s-text user-select:none"},".s-req":"fg:$s-danger margin-left:2px",".s-help":"font-size:0.82em fg:$s-muted",".s-error":"font-size:0.82em fg:$s-danger",".s-input":{"&":"w:100% background: color-mix(in oklab, $s-bg, $s-text 4%); color:$s-text border: 1px solid $s-faint; r:$s-radius padding: 0.55em 0.7em; transition: border-color 0.15s, box-shadow 0.15s;","&:hover:not(:disabled)":"border-color: color-mix(in oklab, $s-text, $s-bg 55%);","&:focus-visible":"border-color:$s-accent box-shadow: 0 0 0 3px $s-focus; outline:none","&[aria-invalid=true]":"border-color:$s-danger"},".s-inset":{"&":"display:contents --s-inset-start:0px --s-inset-end:0px","&:has(> .s-inset_start), &:has(> .s-inset_end)":"position:relative display:grid","> .s-input":"padding-inline-start: calc(0.7em + var(--s-inset-start)); padding-inline-end: calc(0.7em + var(--s-inset-end));","> .s-inset_start, > .s-inset_end":"position:absolute top:0 bottom:0 display:flex align-items:center gap:$1 fg:$s-muted","> .s-inset_start":"left:0.35em","> .s-inset_end":"right:0.35em","&.s-inset-bottom > .s-inset_start, &.s-inset-bottom > .s-inset_end":"top:auto padding-bottom:0.35em","> .s-inset_start > svg, > .s-inset_end > svg":"width:1.15em height:1.15em","&:has(> .s-inset_end) > input[type=number]":"appearance:textfield","&:has(> .s-inset_end) > input[type=number]::-webkit-inner-spin-button":"appearance:none margin:0"},".s-inset_start, .s-inset_end":"pointer-events:none",".s-inset_start :where(button, a, input, select, textarea, label, [tabindex])":"pointer-events:auto",".s-inset_end :where(button, a, input, select, textarea, label, [tabindex])":"pointer-events:auto"});function Q(t,a){let e=t.id??j("field"),h=()=>!!t.error;L("div.s-field",t.attrs,()=>{L(()=>{t.label!=null&&L("label for=",e,()=>{M(t.label),t.required&&L("span.s-req aria-hidden=true #*")})}),a(e,h),L(()=>{t.help!=null&&!t.error&&L("div.s-help",()=>M(t.help))}),L(()=>{t.error&&L("div.s-error role=alert #",t.error)})})}function d1(t,a,e,h){L("id=",a),t.name&&L("name=",t.name),L(()=>{t.disabled&&L("disabled=true")}),L(()=>{t.required&&L("aria-required=true")}),L(()=>L("aria-invalid=",e()?"true":"false")),h&&L("bind=",h)}function b1(t,a,e){L("div.s-inset",()=>{a&&L(".s-inset-bottom"),e(),b2(()=>t.prefix,"s-inset_start","--s-inset-start"),b2(()=>t.suffix,"s-inset_end","--s-inset-end")})}function b2(t,a,e){L(()=>{let h=t();if(h==null)return;let p=L(`div.${a}.small`,()=>M(h)),r=p.parentElement,o=new ResizeObserver(()=>r?.style.setProperty(e,`${p.offsetWidth}px`));o.observe(p),L.clean(()=>{o.disconnect(),r?.style.setProperty(e,"0px")})})}function I1(t={}){Q(t,(a,e)=>{b1(t,!1,()=>{a1("input.s-input",t.inputAttrs,()=>{a1("type=",t.type??"text"),t.placeholder!=null&&a1("placeholder=",t.placeholder),t.autocomplete!=null&&a1("autocomplete=",t.autocomplete),t.value!=null&&!t.bind&&a1("value=",t.value),t.input&&a1("input=",t.input),t.change&&a1("change=",t.change),d1(t,a,e,t.bind)})})})}var w2=200;g.insertGlobalCss({".s-backdrop":{"&":"position:fixed inset:0 z-index:200 display:block background: rgba(0,0,0,0.55); transition: opacity 0.4s ease-in-out;","&.hidden":"opacity:0 pointer-events:none"},".s-dialog":{"&":"position:fixed z-index:200 top:50% left:50% display:flex flex-direction:column transform:translate(-50%,-50%) min-width:min(20rem,90vw) max-width:min(90vw,44rem) max-height:min(88vh,800px) r: $s-radius-lg; overflow:hidden transition: opacity 0.2s ease-out, transform 0.2s ease-out;","> header":"display:flex align-items:center gap:$2 padding: $2 $3; border:0 border-bottom: 1px solid $s-faint; r:0 font-weight:600 flex-shrink:0","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 padding: $2 $3; border:0 border-top: 1px solid $s-faint; r:0 flex-shrink:0","> div":"p:$3 gap:$3 display:flex flex-direction:column overflow-y:auto flex:1 min-height:0","&.hidden":"opacity:0 pointer-events:none transform: translate(-50%, calc(-50% + 20px)); pointer-events:none"}});var n1=g.proxy({}),p0=0,F1=g.derive(()=>{let t=Object.keys(n1);if(t.length)return t[t.length-1]});function K1(){return F1.value!=null}F(()=>{g.onEach(n1,({resolve:t,opts:a},e)=>{let h=()=>{delete n1[e]};g.clean(()=>{a.onClose?.(),t()});let p=document.activeElement;g.clean(()=>{p instanceof HTMLElement&&document.contains(p)&&p.focus()});let r=g.derive(()=>F1.value!=e),o=g("div.s-backdrop create=hidden destroy=hidden .hidden=",r,"click=",()=>{a.allowCancel!==!1&&h()}),d=`s-dialog-title-${e}`,n=g("div.s-dialog.neutral.s-s.extra-shadow role=dialog create=hidden destroy=hidden",a.attrs,()=>{if(!a.keyboardTransparent){let A=g();g.clean(n2()),g("aria-modal=true"),g("keydown=",w=>r0(A,w))}let i=l2();g(()=>{let A=a.allowCancel!==!1;P("esc",A?"Close this dialog":void 0,A?h:()=>{},i)}),g(()=>{a.header!=null&&(g("aria-labelledby=",d),g("header.s-s.neutral id=",d,a.headerAttrs,()=>M(a.header)))}),g("div",a.contentAttrs,()=>{M(a.content,h)}),g(()=>{a.footer!=null&&g("footer.s-s.neutral",a.footerAttrs,()=>M(a.footer))})}),c=0;g(()=>{let i=Object.keys(n1).indexOf(e);i>=0&&(c=i),o.style.zIndex=`${w2+2*c}`,n.style.zIndex=`${w2+2*c+1}`}),requestAnimationFrame(()=>{g.peek(()=>F1.value)===e&&document.body.contains(n)&&p1(n)})},(t,a)=>+a)});function r0(t,a){if(a.key!=="Tab"||a.altKey||a.ctrlKey||a.metaKey)return;let e=Z1(t),h=a.shiftKey?e[0]:e[e.length-1];!h||document.activeElement!==h||(a.preventDefault(),(a.shiftKey?e[e.length-1]:e[0]).focus())}function c1(t){let a=++p0;return t.cancelWithScope!==!1&&g.clean(()=>{delete n1[a]}),new Promise(e=>{n1[a]={resolve:e,opts:t}})}function o0(t,a={}){return c1({header:"Alert",allowCancel:!0,content:e=>{g("p",()=>{g("#",t)}),t1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"OK",click:e})}})},...a})}function d0(t,a={}){return new Promise(e=>{let h=!1;c1({header:"Confirm",allowCancel:!0,content:p=>{g("p",()=>{g("#",t)}),t1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"Cancel",attrs:".neutral",click:p}),B({content:"OK",click:()=>{h=!0,p()}})}})},...a,onClose:()=>{e(h),a.onClose?.()}})})}function n0(t,a="",e={}){return new Promise(h=>{let p=null;c1({header:"Input",allowCancel:!0,content:r=>{g("p",()=>{g("#",t)});let o=g.proxy({value:a});g("form display:contents",()=>{g("submit=",d=>{d.preventDefault(),p=o.value,r()}),I1({bind:g.ref(o,"value")}),t1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"Cancel",attrs:".neutral",type:"button",click:r}),B({content:"OK",type:"submit"})}})})},...e,onClose:()=>{h(p),e.onClose?.()}})})}J.insertGlobalCss({".s-keyhelp":{"&":"display:flex flex-direction:column gap:$1 min-width:14rem","> div":"display:flex align-items:baseline justify-content:space-between gap:$4",kbd:"font-family:inherit font-size:0.85em fg:$s-muted white-space:nowrap border: 1px solid $s-faint; r:$s-radius-sm padding: 0 0.4em;"}});var w1=null;function U1(){if(w1){w1();return}let t=x2(document.activeElement);c1({header:"Keyboard shortcuts",cancelWithScope:!1,keyboardTransparent:!0,onClose:()=>{w1=null},content:a=>{w1=a;let e=h=>{h.repeat||["Control","Shift","Alt","Meta","Escape","?"].includes(h.key)||a()};document.addEventListener("keydown",e,!0),J.clean(()=>document.removeEventListener("keydown",e,!0)),J("div.s-keyhelp",()=>{for(let[h,p]of t)p.description!==void 0&&J("div",()=>{J("span",()=>M(p.description)),J("kbd text=",R(h))})})}})}var H2=J.proxy(!0);function c0(t){H2.value=t}J(()=>{H2.value&&(P("?",void 0,U1,"global"),P("mod+?","This overview",U1,"global"))});import x from"aberdeen";x.insertGlobalCss({".s-ac":{"> .s-control":"display:flex flex-wrap:wrap align-items:center gap:$1 background: color-mix(in oklab, $s-bg, $s-text 4%); color:$s-text border: 1px solid $s-faint; r:$s-radius padding: 0.3em 0.4em; cursor:text; transition: border-color 0.15s, box-shadow 0.15s;","> .s-control:hover":"border-color: color-mix(in oklab, $s-text, $s-bg 55%);","> .s-control:focus-within":"border-color:$s-accent box-shadow: 0 0 0 3px $s-focus;","&[aria-invalid=true] > .s-control":"border-color:$s-danger",".s-chip":"display:inline-flex align-items:center gap:$1 font-size:0.85em background: color-mix(in oklab, $s-bg, $s-text 10%); border: 1px solid $s-faint; r:$s-radius padding: 0.1em 0.2em 0.1em 0.5em;",".s-chip > button":"cursor:pointer border:0 background:transparent fg:$s-muted font-size:1.1em line-height:1 padding: 0 0.2em; r:4px",".s-chip > button:hover":"fg:$s-text background:$s-faint",input:"flex:1 min-width:6ch border:0 background:transparent color:inherit outline:none padding:0.25em"},".s-ac-menu.s-s":{"&":"position:fixed max-height:15rem overflow-y:auto list-style:none p:$1 margin:0",li:"margin:0",".s-option":"padding: 0.45em 0.6em; r:6px cursor:pointer transition: background 0.1s;",".s-option[aria-selected=true]":"background: color-mix(in srgb, $s-text 10%, transparent);",".s-add":"fg:$s-accent font-style:italic",".s-empty":"padding: 0.45em 0.6em; fg:$s-muted"}});var H1=x.proxy({cur:null});function i0(t,a){t.style.maxHeight="";let p=t.offsetHeight,r=window.innerHeight-a.bottom-4-8,o=a.top-4-8,d=p>r&&o>r;t.style.left=`${a.left}px`,t.style.width=`${a.width}px`,t.style.maxHeight=`${Math.min(p,Math.max(d?o:r,60))}px`,t.style.top=d?"auto":`${a.bottom+4}px`,t.style.bottom=d?`${window.innerHeight-a.top+4}px`:"auto"}F(()=>{let t=H1.cur;if(!t)return;let a,e=x("ul.s-ac-menu.s-s.neutral.shadow role=listbox",`id=${t.id} z-index:${t.zIndex}`,()=>{x("mousedown=",h=>h.preventDefault()),t.draw(),a?.()});a=r1(t.anchor,h=>i0(e,h))});function s0(t){let a=[];for(let e of t.matchAll(/\p{N}+|\p{Lu}+(?=\p{Lu}\p{Ll})|\p{Lu}?\p{Ll}+|\p{Lu}+/gu))a.push(e.index);return a}function A2(t,a){let e=a.toLowerCase().split(/\s+/).filter(Boolean).sort((r,o)=>o.length-r.length);if(!e.length)return!0;let h=s0(t),p=[];return e.every(r=>{let o=h.findIndex((d,n)=>!p[n]&&t.slice(d,d+r.length).toLowerCase()===r);return o<0?!1:(p[o]=!0,!0)})}function l0(t){return typeof t=="string"?{value:t,label:t}:{value:t.value,label:t.label??t.value}}function M0(t){let a=j("ac-menu"),e=x.proxy({query:"",open:!1,active:0}),h=()=>(typeof t.options=="function"?t.options():t.options).map(l0),p=()=>{let v=t.bind?.value;return v==null||v===""?[]:Array.isArray(v)?v:[v]},r=v=>h().find(H=>H.value===v)?.label??v,o=v=>v?h().find(H=>H.label.toLowerCase()===v.toLowerCase())?.value??v:"";if(!t.multi){let v=t.bind?x.peek(t.bind,"value"):void 0;typeof v=="string"&&v&&(e.query=x.peek(()=>r(v)))}let d=()=>{let v=new Set(p()),H=h();t.multi&&(H=H.filter(f=>!v.has(f.value)));let V=e.query.trim();return V&&(H=H.filter(f=>(t.match??A2)(f.label,V))),H},n=(v,H)=>{if(t.multi){let V=Array.isArray(t.bind?.value)?[...t.bind.value]:[];V.includes(v)||V.push(v),t.bind&&(t.bind.value=V),e.query=""}else t.bind&&(t.bind.value=v),e.query=r(v),e.open=!1;e.active=0,H?.focus()},c=v=>{if(!t.bind)return;let H=t.bind.value??[];t.bind.value=H.filter(V=>V!==v)},i,A=()=>{let v=d(),H=e.query.trim(),V=t.allowCustom!==!1&&H!==""&&!v.some(f=>f.label.toLowerCase()===H.toLowerCase());v.forEach((f,C)=>{x("li.s-option role=option",`id=${a}-opt-${C}`,()=>{x(()=>x("aria-selected=",e.active===C?"true":"false")),x("#",f.label),x("click=",()=>n(f.value,i)),x("mousemove=",()=>{e.active=C})})}),V&&x("li.s-option.s-add role=option",()=>{x("#",`Add "${H}"`),x("click=",()=>n(H,i))}),v.length===0&&!V&&x("li.s-empty #No matches")};Q(t,(v,H)=>{x("div.s-ac",t.inputAttrs,()=>{x(()=>x("aria-invalid=",H()?"true":"false"));let V=x("div.s-control",()=>{x("click=",()=>i?.focus()),x(()=>{if(t.multi)for(let f of p())x("span.s-chip",()=>{x("span #",x.peek(()=>r(f))),x("button type=button aria-label=",`Remove ${f}`,()=>{x("#\xD7"),x("click=",C=>{C.stopPropagation(),c(f),i?.focus()})})})}),i=x("input type=text role=combobox autocomplete=off",()=>{x("id=",v,`aria-controls=${a} aria-autocomplete=list`),t.placeholder!=null&&x("placeholder=",t.placeholder),t.disabled&&x("disabled=true"),t.required&&x("aria-required=true"),x("bind=",x.ref(e,"query")),x(()=>x("aria-expanded=",e.open?"true":"false")),x(()=>{let C=d()[e.active];x("aria-activedescendant=",e.open&&C?`${a}-opt-${e.active}`:"")}),x("input=",()=>{e.open=!0,e.active=0}),x("focus=",()=>{e.open=!0}),x("blur=",()=>{setTimeout(()=>D(),150)}),x("keydown=",f=>w(f,i))})});x(()=>{if(!e.open)return;let f=V.closest(".s-dialog")?350:150;H1.cur={id:a,anchor:V,zIndex:f,draw:A},x.clean(()=>{H1.cur?.id===a&&(H1.cur=null)})}),x(()=>{if(t.name)if(t.multi)for(let f of p())x("input type=hidden",()=>{x("name=",t.name),x("value=",f)});else x("input type=hidden",()=>{x("name=",t.name),x("value=",p()[0]??"")})})})});function w(v,H){let V=d(),f=V.length-1;if(v.key==="ArrowDown")v.preventDefault(),e.open=!0,e.active=Math.min(f,e.active+1);else if(v.key==="ArrowUp")v.preventDefault(),e.active=Math.max(0,e.active-1);else if(v.key==="Enter"){v.preventDefault();let C=e.query.trim(),s=e.open?V[e.active]:void 0;s?n(s.value,H):t.allowCustom!==!1&&(C||!t.multi)?n(o(C),H):e.open&&(e.open=!1)}else if(v.key==="Escape")e.open&&(v.preventDefault(),e.open=!1);else if(v.key==="Backspace"&&t.multi&&e.query===""){let C=p();C.length&&c(C[C.length-1])}}function D(){e.open=!1,t.multi?e.query="":t.allowCustom!==!1?n(o(e.query.trim())):e.query=r(p()[0]??"")}}import e1 from"aberdeen";import x0 from"aberdeen";var M1={size:24,color:"currentColor",strokeWidth:2,cap:"round",join:"round"};function v0(t,a){let e=a.size??M1.size,h=x0('svg.s-icon aria-hidden=true viewBox="0 0 24 24" fill=none',"width=",e,"height=",e,"stroke=",a.color??M1.color,"stroke-width=",a.strokeWidth??M1.strokeWidth,"stroke-linecap=",a.cap??M1.cap,"stroke-linejoin=",a.join??M1.join,a.attrs);h.innerHTML=t}function O(t){return(a={})=>v0(t,a)}var V2=O('<path d="m9 18 6-6-6-6" />');var k2=O('<circle cx="12" cy="12" r="10" />');var L2=O('<path d="M15 3h6v6" /><path d="M10 14 21 3" /><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />');var C2=O('<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />');var A1=O('<path d="M4 5h16" /><path d="M4 12h16" /><path d="M4 19h16" />');var z2=O('<path d="M12 17v5" /><path d="M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89" /><path d="m2 2 20 20" /><path d="M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11" />'),W1=O('<path d="M12 17v5" /><path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" />');var $2=O('<path d="M22 2 2 22" />');var i1=O('<path d="M18 6 6 18" /><path d="m6 6 12 12" />');e1.insertGlobalCss({".s-box":{"&":"display:flex flex-direction:column overflow:hidden r: $s-radius-lg; position:relative","&:not(:first-child)":"margin-top: $3","> header":"display:flex align-items:center gap:$2 padding: $2 $3; border:0 border-bottom: 1px solid $s-faint; r:0 font-weight:600","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 padding: $2 $3; border:0 border-top: 1px solid $s-faint; r:0","> div":"p:$3 gap:$3","> header > .s-box-close":"margin-left:auto","> .s-box-close":"position:absolute top:$2 right:$2 z-index:1"}});function m0(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t;e1("section.s-box.s-s.neutral.shadow",a.attrs,()=>{e1(()=>{a.header!=null?e1("header.s-s.neutral",a.headerAttrs,()=>{M(a.header),typeof a.close=="function"&&S2(a.close)}):typeof a.close=="function"&&S2(a.close)}),e1("div",a.contentAttrs,()=>{M(a.content)}),e1(()=>{a.footer!=null&&e1("footer.s-s.neutral",a.footerAttrs,()=>M(a.footer))})})}function S2(t){l1({icon:i1,ariaLabel:"Close",click:t,attrs:".s-box-close"})}import N1 from"aberdeen";function u0(t){N1(()=>{let a=t.bind.value;t1({attrs:t.attrs,buttons:Object.entries(t.options).map(([e,h])=>({content:h,ariaLabel:typeof h=="function"?e:void 0,attrs:a===e?".primary":".neutral",click:()=>{t.bind.value=t.allowDeselect&&a===e?void 0:e}}))})}),t.name&&N1(()=>N1("input type=hidden name=",t.name,"value=",t.bind.value??""))}import E from"aberdeen";E.insertGlobalCss({".s-check":{"&":"display:flex flex-direction:column gap:$1","> label":"display:flex align-items:center gap:$2 cursor:pointer user-select:none","> label:has(input:disabled)":"cursor:not-allowed opacity:0.45 filter:saturate(0.6)",input:"cursor:inherit m:0"}});function y0(t={}){let a=t.id??j("check");E("div.s-check",t.attrs,()=>{E("label for=",a,()=>{E("input type=checkbox",t.inputAttrs,()=>{E("id=",a),t.name&&E("name=",t.name),t.checked&&!t.bind&&E("checked=true"),t.change&&E("change=",t.change),E(()=>{t.disabled&&E("disabled=true")}),E(()=>{t.required&&E("aria-required=true")}),t.bind&&E("bind=",t.bind)}),E(()=>{t.label!=null&&M(t.label),t.required&&E("span.s-req aria-hidden=true #*")})}),E(()=>{t.help!=null&&!t.error&&E("div.s-help",()=>M(t.help))}),E(()=>{t.error&&E("div.s-error role=alert #",t.error)})})}import U from"aberdeen";U.insertGlobalCss({".s-form":{"&":"display:flex flex-direction:column gap:$3","&.grid":"display:grid grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap:$3","&.grid > .s-wide, &.grid > footer":"grid-column: 1 / -1;","&.grid > .s-field":"align-self: start","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 flex-wrap:wrap margin-top:$1"}});function f0(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t,e=U.proxy({value:!1});U("form.s-form",a.attrs,()=>{U(()=>{U(".grid=",a.layout==="grid")}),U(()=>{e.value&&U(".s-busy aria-busy=true")}),U("submit=",h=>{if(h.preventDefault(),a.submit&&!e.value){let p=new FormData(h.target),r={};for(let d of new Set(p.keys())){let n=p.getAll(d);r[d]=n.length===1?n[0]:n}let o=a.submit(r,h);if(o&&typeof o.then=="function"){e.value=!0;let d=()=>{e.value=!1};Promise.resolve(o).then(d,n=>{throw d(),n})}}}),M(a.content),U(()=>{a.actions&&U("footer",a.actionsAttrs,()=>M(a.actions))})})}import m from"aberdeen";import{current as h2}from"aberdeen/route";import y from"aberdeen";import{matchCurrent as H0,current as k1,go as P2}from"aberdeen/route";import S from"aberdeen";import{grow as g0,shrink as b0}from"aberdeen/transitions";S.insertGlobalCss({".s-toasts":"position:fixed bottom:$3 right:$3 z-index:400 display:flex flex-direction:column gap:$2 pointer-events:none max-width:min(90vw,24rem) w:24rem",".s-toast":{"&":"display:flex align-items:flex-start gap:$2 padding: $3; pointer-events:auto position:relative overflow:hidden",".s-toast-body":"display:flex flex-direction:column gap:$1 flex:1 min-width:0",".s-toast-title":"font-weight:700 line-height:1.3",".s-toast-close":"cursor:pointer border:0 background:transparent fg:$s-muted font-size:1.1em line-height:1 padding: 0 0.15em; r:4px flex-shrink:0 align-self:flex-start",".s-toast-close:hover":"fg:$s-text",".s-toast-close:focus-visible":"outline:none box-shadow: 0 0 0 3px $s-focus; fg:$s-text",".s-toast-progress":"position:absolute bottom:0 left:0 right:0 height:2px background:$s-accent width:100%"}});var w0=0,x1=S.proxy({});F(()=>{S.peek(()=>S.isEmpty(x1))&&S.isEmpty(x1)||S("div.s-toasts",()=>{S.onEach(x1,t=>{let{opts:a,id:e}=t,h=a.type==="danger"||a.type==="warning"?"alert":"status",p=a.type==null||a.type==="neutral"?"neutral":a.type,r=a.duration??6e3,o,d=null,n=()=>{clearTimeout(o),d&&(d.style.transition="none",d.style.width="100%",d.offsetWidth,d.style.transition=`width ${r}ms linear`,d.style.width="0%"),o=setTimeout(()=>G1(e),r)},c=()=>{clearTimeout(o),o=void 0,d&&(d.style.transition="none",d.style.width="100%")};S.clean(()=>clearTimeout(o)),S(`div.s-toast.s-s.${p}.extra-shadow aria-live=polite role=${h}`,"create=",g0,"destroy=",b0,a.attrs,()=>{r>0&&(S("mouseenter=",c),S("mouseleave=",n)),S("div.s-toast-body",()=>{S(()=>{a.title!=null&&S("div.s-toast-title",()=>M(a.title))}),S("div.s-toast-msg",()=>M(a.message))}),S(()=>{a.dismissible!==!1&&S("button.s-toast-close type=button aria-label=Dismiss",()=>{S("#\xD7"),S("click=",()=>G1(e))})}),r>0&&(d=S("div.s-toast-progress"))}),r>0&&requestAnimationFrame(n)})})});function G1(t){delete x1[t]}function V1(t){let a=++w0;return x1[a]={id:a,opts:t},()=>G1(a)}y.insertGlobalCss({".s-menu-list":"position:fixed z-index:350 min-width:10rem display:flex flex-direction:column p:$1 r:$s-radius-lg max-width: calc(100vw - 16px); overflow-y:auto max-height:min(80vh,28rem) transition: opacity 0.15s, transform 0.15s, visibility 0s;",".s-menu-list.hidden":"opacity:0 pointer-events:none transform:translateY(-6px) visibility:hidden transition: opacity 0.15s, transform 0.15s, visibility 0.15s;",".s-menu-item":"display:flex align-items:center gap:$2 w:100% scroll-margin:$2 padding: $m2 0; line-height:1.1 r:$s-radius cursor:pointer text-align:left font-weight:450 font-size:0.9em border:0 background:transparent fg:$s-text text-decoration:none transition: color 0.12s, transform 0.12s, text-shadow 0.12s;",".s-menu-item:focus-visible:not([aria-current=page]), .s-menu-item:hover:not([aria-disabled=true]):not([aria-current=page])":"filter:none color: color-mix(in lab, $s-primary 33%, $s-text);",".s-menu-item:focus-visible":"outline-offset:-2px background: color-mix(in srgb, $s-accent 14%, transparent);",".s-menu-item[aria-current=page]":"color:$s-accent filter:none",".s-menu-list .s-menu-item":"padding-inline:$2",".s-menu-item[aria-disabled=true]":"opacity:0.45 cursor:not-allowed pointer-events:none",".s-menu-icon":"flex-shrink:0",".s-menu-list .s-menu-icon":"display:flex",".s-menu-list .s-menu-icon > svg":"width:1.25em height:1.25em","hr.s-menu-sep":"border:0 height:1px margin: $1 0.6rem; background: linear-gradient(to right, transparent, $s-faint 18%, $s-faint 82%, transparent);",".s-menu-key":"margin-left:auto padding-left:$2 font-family:inherit font-size:0.8em opacity:0.55 white-space:nowrap flex-shrink:0","@media (hover: none) and (pointer: coarse)":{".s-menu-key":"display:none"},".s-menu-tt-key":"font-family:inherit font-size:0.85em opacity:0.7 white-space:nowrap",".s-tt-tip hr.s-menu-sep":"margin: 0.35em 0;",".s-menu-chevron":"margin-left:auto flex-shrink:0 display:flex transition: transform 0.15s ease;",".s-menu-key + .s-menu-chevron":"margin-left:0",".s-menu-chevron > svg":"width:1em height:1em",".s-menu-details":{"> summary":"list-style:none","> summary::-webkit-details-marker":"display:none","&::details-content":"interpolate-size:allow-keywords block-size:0 overflow-y:clip transition: block-size 0.15s ease, content-visibility 0.15s allow-discrete;","&[open]::details-content":"block-size:auto","&[open] > summary .s-menu-chevron":"transform:rotate(90deg)"},".s-menu-sub":"display:flex flex-direction:column gap:$1 padding-left:$3",".s-menu-inline":"display:flex flex-direction:column gap:$1"});function v1(t,a,e){y("keydown=",h=>{if(h.key==="Enter"&&!h.ctrlKey&&!h.metaKey&&!h.shiftKey&&!h.altKey&&h.target.tagName==="A"){queueMicrotask(()=>a?.());return}if(h.key!=="ArrowDown"&&h.key!=="ArrowUp"&&h.key!=="Home"&&h.key!=="End")return;h.preventDefault();let r=[...h.currentTarget.querySelectorAll(".s-menu-item")].filter(c=>c.getAttribute("aria-disabled")!=="true"&&!k0(c));if(!r.length)return;let o=r.indexOf(document.activeElement),d=h.key==="ArrowUp"?-1:1,n=h.key==="Home"?0:h.key==="End"?r.length-1:o<0?d>0?0:r.length-1:(o+d+r.length)%r.length;r[n].focus()}),O2(t,{onLeafSelect:a,keyHints:e,$hasCurrent:y.derive(()=>X1(t))})}function O2(t,a){for(let e of t){if(typeof e=="string"||typeof e=="function"){M(e);continue}if("separator"in e){y("hr.s-menu-sep");continue}e.items?V0(e,a):A0(e,a)}}function A0(t,a){let e=!1,h=y(t.href?"a.s-menu-item data-panel=open":"button.s-menu-item type=button",t.attrs,()=>{t.href&&(y("href=",t.href),t.target&&y("target=",t.target),y(()=>{let p=!e;e=!0,_1(t)&&(y("aria-current=page"),requestAnimationFrame(()=>h.scrollIntoView({block:"nearest",behavior:p?"instant":"smooth"})))})),t.disabled&&y("aria-disabled=true"),t.key&&y("aria-keyshortcuts=",R(t.key,!0)),y("click=",p=>{if(t.disabled){p.preventDefault();return}a.onLeafSelect?.(),t.click?.(p)}),t.icon&&y("span.s-menu-icon",()=>M(t.icon)),M(t.label),R2(t,a)})}var T2=new Map;function E2(t,a){return T2.set(t,a),a}function V0(t,a){let e=t.href??q2(t.items),h=e!=null?y.derive(()=>j1(t)?E2(e,!0):a.$hasCurrent.value?E2(e,!1):T2.get(e)??!1):null;y("details.s-menu-details",()=>{h&&y(()=>{h.value&&y("open=true")}),y("summary.s-menu-item.s-menu-branch",t.attrs,()=>{t.disabled&&y("aria-disabled=true"),t.key&&y("aria-keyshortcuts=",R(t.key,!0)),y(()=>{_1(t)&&y("aria-current=page")}),y("click=",p=>{if(t.disabled){p.preventDefault();return}e!=null&&(p.preventDefault(),C0(e),P2(e)),t.click?.(p)}),t.icon&&y("span.s-menu-icon",()=>M(t.icon)),M(t.label),R2(t,a),y("span.s-menu-chevron aria-hidden=true",()=>V2())}),y("div.s-menu-sub",()=>O2(t.items,a))})}function k0(t){for(let a=t.closest("details");a;a=a.parentElement&&a.parentElement.closest("details"))if(!a.open&&t.closest("summary")?.parentElement!==a)return!0;return!1}function X1(t){return t.some(a=>typeof a!="string"&&typeof a!="function"&&!("separator"in a)&&j1(a))}function _1(t){if(t.href!=null&&H0(t.href))return!0;let a=t.match;if(a==null)return!1;let e=k1.path;if(typeof a=="function")return a(e);let h=a.replace(/\/+$/,"")||"/";return e===h||e.startsWith(h==="/"?"/":h+"/")}function j1(t){if(_1(t))return!0;for(let a of t.items??[])if(!(typeof a=="string"||typeof a=="function"||"separator"in a)&&j1(a))return!0;return!1}function q2(t){for(let a of t){if(typeof a=="string"||typeof a=="function"||"separator"in a)continue;let e=a.href??(a.items?q2(a.items):void 0);if(e!=null)return e}}function R2(t,a){let e=a.keyHints?void 0:t.key;t.key&&!e&&y("kbd.s-menu-key aria-hidden=true text=",R(t.key)),!(t.tooltip==null&&!e)&&s1({placement:"right",tip:()=>{M(t.tooltip),e&&(t.tooltip!=null&&y("hr.s-menu-sep"),y("kbd.s-menu-tt-key aria-hidden=true text=",R(e)))}})}function m1(t,a){y(()=>{for(let e of D2(t(),[]))P(e.key,e.label,h=>{Z2(),a?.(),e.click?.(h),e.href!=null&&L0(e.href,e.target)})})}function D2(t,a){for(let e of t)typeof e=="string"||typeof e=="function"||"separator"in e||(e.key&&!e.disabled&&a.push(e),e.items&&D2(e.items,a));return a}function L0(t,a){let e=new URL(t,location.href);a?window.open(e.href,a,a==="_blank"?"noopener":""):e.origin!==location.origin?location.href=e.href:P2(t)}var L1=null;function C0(t){try{L1=new URL(t,location.href).pathname.replace(/\/+$/,"")||"/"}catch{L1=null}}function Q1(t){return L1!==t?!1:(L1=null,!0)}var Y=y.proxy({opts:null});function _(){let t=Y.opts?.anchor;Y.opts=null,t?.focus()}function C1(t){let a=Y.opts;return a!=null&&(t==null||a.anchor===t)}function Z2(t){C1(t)&&_()}function z0(t,a){let e=t.offsetWidth,h=t.offsetHeight,p=window.innerWidth,r=window.innerHeight,o=4,d=a.left;d+e>p-8&&(d=Math.max(8,a.right-e));let n=a.bottom+o;n+h>r-8&&a.top-h-o>=8&&(n=a.top-h-o),t.style.left=Math.max(8,d)+"px",t.style.top=Math.max(8,n)+"px"}function $0(t){return[{label:"Open in new tab",icon:L2,click:()=>{window.open(t,"_blank","noopener")}},{label:"Copy link",icon:C2,click:()=>{S0(t)}}]}async function S0(t){let a=new URL(t,location.href).href;try{await navigator.clipboard.writeText(a),V1({message:"Link copied."})}catch{V1({message:"Couldn't copy the link.",type:"danger"})}}F(()=>{let t=Y.opts;if(!t)return;let a=y("div.s-menu-list.s-s.neutral.shadow create=hidden destroy=hidden",t.dropdownAttrs,()=>{v1(t.link!=null?[...$0(t.link),{separator:!0},...t.items]:t.items,_,!0)}),e=r=>{let o=r.target;!a.contains(o)&&(t.closeOnAnchorClick||!t.anchor.contains(o))&&_()},h=r=>{(r.key==="Escape"||r.key==="Tab")&&(r.preventDefault(),_())},p=y.peek(k1,"path");y(()=>{k1.path!==p&&!Q1(k1.path)&&_()}),document.addEventListener("click",e,!0),document.addEventListener("keydown",h,!0),y.clean(()=>{document.removeEventListener("click",e,!0),document.removeEventListener("keydown",h,!0)}),r1(t.at?new DOMRect(t.at.x,t.at.y,0,0):t.anchor,r=>z0(a,r)),requestAnimationFrame(()=>{document.body.contains(a)&&p1(a,".s-menu-item[aria-current=page]")})});function E0(t){y("nav.s-menu-inline",t.attrs,()=>{m1(()=>t.items,()=>t.onLeafSelect?.()),v1(t.items,t.onLeafSelect)})}function J1(t){return Y.opts=t,_}function Y1(t){m1(()=>t.items);let a=null;y.clean(()=>{Y.opts?.anchor===a&&_()}),y("contextmenu=",e=>{e.preventDefault(),a=e.currentTarget,J1({...t,anchor:a,at:{x:e.clientX,y:e.clientY},closeOnAnchorClick:!0})})}function P0(t){m1(()=>t.items);let a=null;y.clean(()=>{Y.opts?.anchor===a&&_()}),B({icon:A1,...t.button?.content==null?{ariaLabel:"Open menu"}:null,attrs:".neutral",...t.button,click:e=>{if(a=e.currentTarget,Y.opts?.anchor===a){_();return}J1({items:t.items,anchor:a,dropdownAttrs:t.dropdownAttrs})}})}import l,{OPAQUE as I2}from"aberdeen";import*as b from"aberdeen/route";import z from"aberdeen";var O0=O('<path d="m15 18-6-6 6-6"/>'),T0=O('<path d="m9 18 6-6-6-6"/>');z.insertGlobalCss({".s-strip":{"&":"position:relative display:flex min-width:0","> .s-strip-row":"display:flex align-items:center flex:1 min-width:0 overflow-x:auto overflow-y:hidden scrollbar-width:none scroll-behavior:smooth","> .s-strip-row::-webkit-scrollbar":"display:none","> .s-strip-btn":"position:absolute top:0 bottom:0 z-index:1 display:none align-items:center justify-content:center width:2.4em border:0 padding:0 cursor:pointer fg:$s-muted transition: color 0.15s;","> .s-strip-btn:hover":"fg:$s-text","> .s-strip-btn-left":"left:0 justify-content:flex-start background: linear-gradient(to right, $s-bg 45%, transparent)","> .s-strip-btn-right":"right:0 justify-content:flex-end background: linear-gradient(to left, $s-bg 45%, transparent)","&.s-can-left > .s-strip-btn-left, &.s-can-right > .s-strip-btn-right":"display:flex"},".s-tabs":{"&":"display:flex flex-direction:column gap:$3",".s-tabbar":"border-bottom: 1px solid $s-faint;",".s-tablist":"gap:$1 align-items:stretch margin-bottom:-1px",".s-tab":"display:inline-flex align-items:center gap:$2 cursor:pointer background:transparent border:0 color: $s-muted; font-weight:600 padding: 0.6em 0.9em; white-space:nowrap border-bottom: 3px solid transparent; transition: color 0.15s, background 0.15s, border-color 0.15s;",".s-tab:hover:not(:disabled), .s-tab[aria-selected=true]":"color: $s-text;",".s-tab:focus-visible":"outline:none box-shadow: inset 0 0 0 2px $s-focus; r: $s-radius;",".s-tab[aria-selected=true]":"border-image: $s-gradient 1;",".s-tabpanel":"display:block"}});function z1(t){z("div.s-strip",t.attrs,()=>{let a=z("div.s-strip-row",t.stripAttrs,()=>M(t.content));B2(a,-1),B2(a,1),R0(a)})}function $1(t){let a=t.parentElement;if(!a||!t.isConnected)return;let e=parseFloat(getComputedStyle(a).fontSize)*2.6,h=t.getBoundingClientRect(),p=a.getBoundingClientRect(),r=h.left-p.left,o=h.right-p.right;r<e?a.scrollBy({left:r-e,behavior:"smooth"}):o>-e&&a.scrollBy({left:o+e,behavior:"smooth"})}function q0(t){let a=j("tabs"),e=(r,o)=>r.id??String(o),h=t.bind??z.proxy(e(t.tabs[0]??{label:""},0));t.tabs.length>0&&!t.tabs.some((r,o)=>e(r,o)===z.peek(()=>h.value))&&(h.value=e(t.tabs[0],0));let p=(r,o)=>{r.disabled||(h.value=e(r,o))};z("div.s-tabs",t.attrs,()=>{z1({attrs:".s-tabbar",stripAttrs:".s-tablist role=tablist",content:()=>{t.tabs.forEach((r,o)=>{let d=e(r,o),n=z("button.s-tab type=button role=tab",()=>{z("id=",`${a}-tab-${d}`,"aria-controls=",`${a}-panel-${d}`),z(()=>{let c=h.value===d;z("aria-selected=",c?"true":"false"),z("tabindex=",c?"0":"-1"),c&&requestAnimationFrame(()=>$1(n))}),r.disabled&&z("disabled=true"),z("click=",()=>p(r,o)),z("keydown=",c=>D0(c,t.tabs,o,p)),M(r.icon),M(r.label)})})}}),z("div.s-tabpanel role=tabpanel",t.contentAttrs,()=>{z(()=>{let r=h.value,o=t.tabs.findIndex((n,c)=>e(n,c)===r),d=t.tabs[o]??t.tabs[0];d&&(z("id=",`${a}-panel-${e(d,o)}`,"aria-labelledby=",`${a}-tab-${e(d,o)}`),M(d.content))})})})}function B2(t,a){z(`button.s-strip-btn.s-strip-btn-${a<0?"left":"right"} type=button`,()=>{z("tabindex=-1 aria-hidden=true"),z("click=",()=>t.scrollBy({left:a*t.clientWidth*.8,behavior:"smooth"})),(a<0?O0:T0)({size:"1.1em"})})}function R0(t){let a=t.parentElement;if(!a||typeof ResizeObserver>"u")return;let e=()=>{let r=t.scrollWidth-t.clientWidth;a.classList.toggle("s-can-left",t.scrollLeft>1),a.classList.toggle("s-can-right",t.scrollLeft<r-1)};t.addEventListener("scroll",e,{passive:!0});let h=new ResizeObserver(e);h.observe(t);let p=typeof MutationObserver>"u"?void 0:new MutationObserver(r=>{for(let o of r){for(let d of o.addedNodes)d instanceof Element&&h.observe(d);for(let d of o.removedNodes)d instanceof Element&&h.unobserve(d)}e()});p?.observe(t,{childList:!0});for(let r of Array.from(t.children))h.observe(r);e(),z.clean(()=>{t.removeEventListener("scroll",e),h.disconnect(),p?.disconnect()})}function D0(t,a,e,h){let p=e;if(t.key==="ArrowRight"||t.key==="ArrowDown")p=(e+1)%a.length;else if(t.key==="ArrowLeft"||t.key==="ArrowUp")p=(e-1+a.length)%a.length;else if(t.key==="Home")p=0;else if(t.key==="End")p=a.length-1;else return;t.preventDefault();let r=p>=e?1:-1;for(let o=0;o<a.length;o++){let d=a[p];if(d&&!d.disabled){h(d,p),t.currentTarget?.parentElement?.children[p]?.focus();return}p=(p+r+a.length)%a.length}}var e2={integer(t){if(!/^(0|-?[1-9]\d*)$/.test(t))return;let a=Number(t);return Number.isSafeInteger(a)?a:void 0}};function W(t){let a=String(t).replace(/\/+$/,"");return a.startsWith("/")||(a=`/${a}`),a}function u1(t){let a=W(t);return a==="/"?[]:a.slice(1).split("/")}function F2(t){let a=u1(t),e=a.map((h,p)=>{if(!h.startsWith("[")||!h.endsWith("]"))return{kind:"lit",value:h};let r=/^\[\.\.\.([A-Za-z_$][\w$]*)\]$/.exec(h);if(r){if(p!==a.length-1)throw new Error(`Staffa: "${h}" must be the last segment of route "${t}"`);return{kind:"rest",name:r[1]}}let o=/^\[([A-Za-z_$][\w$]*)(?:=([A-Za-z_$][\w$]*))?\]$/.exec(h);if(!o)throw new Error(`Staffa: malformed param "${h}" in route "${t}"`);let[,d,n]=o;if(n&&!(n in e2))throw new Error(`Staffa: unknown matcher "${n}" in route "${t}" (known: ${Object.keys(e2).join(", ")})`);return{kind:"param",name:d,matcher:n}});return{key:t,segs:e}}function Z0(t){try{return decodeURIComponent(t)}catch{return t}}function t2(t,a){let e={};for(let h=0;h<t.segs.length;h++){let p=t.segs[h];if(p.kind==="rest")return h>=a.length?null:(e[p.name]=a.slice(h).join("/"),e);if(h>=a.length)return null;let r=a[h];if(p.kind==="lit"){if(r!==p.value)return null}else if(p.matcher){let o=e2[p.matcher](r);if(o===void 0)return null;e[p.name]=o}else e[p.name]=Z0(r)}return t.segs.length===a.length?e:null}var N=250,B0=300,I0=360,S1=540;l.insertGlobalCss({":root":`--s-panel-ms:${N}ms`,".s-panels":"flex:1 min-width:0 min-height:0 position:relative overflow:clip isolation:isolate "+q1,".s-panel":{"&":"position:absolute top:0 bottom:0 left:0 display:flex flex-direction:column "+q1+` z-index:2 transition: transform ${N}ms ease-out, opacity ${N}ms linear;`,"&.s-panel-sep::before":"content:'' position:absolute left:0 top:0.6rem bottom:0.6rem width:1px z-index:1 background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);","&.s-panel-new":"z-index:1","&.s-panel-closing":"z-index:0 opacity:0 pointer-events:none","&.s-panel-enter":"opacity:0","&.s-panel-hidden, &.s-panel-parked":"visibility:hidden"},".s-panel > .s-content":"flex:1 min-height:0 overflow-y:auto overflow-x:hidden p:$3",".s-panel-actions":"display:flex align-items:center justify-content:flex-end gap:$1 flex-shrink:0 padding: $3 $3 0;",".s-crumbs > .s-strip-row":"gap:$m1",".s-crumb":{"&":"flex: 1 0 4rem; font-size:0.85em line-height:1.5 fg:$s-muted text-decoration:none white-space:nowrap max-width:max-content overflow:hidden text-overflow:ellipsis transition: color 0.12s;","&.s-crumb-on":"font-weight:600 fg:$s-text","a&:hover":"filter:none color: color-mix(in lab, $s-primary 33%, $s-text);","svg.s-crumb-pin":"vertical-align:-0.12em margin-right:0.3em opacity:0.8 fill:currentColor","svg.s-crumb-unsaved":"vertical-align:0.08em margin-right:0.3em fill:currentColor"},"svg.s-crumb-sep":"flex-shrink:0 opacity:0.4",".s-main.s-shell-snap .s-panel":"transition:none",".s-panel-loading":{"&":"position:absolute inset:0 display:flex align-items:center justify-content:center gap:$1 pointer-events:none",i:"width:0.5rem height:0.5rem r:50% background:$s-muted opacity:0.45 animation: s-panel-pulse 1s ease-in-out infinite;","i:nth-child(2)":"animation-delay:0.15s","i:nth-child(3)":"animation-delay:0.3s"},"@keyframes s-panel-pulse":{"0%, 100%":"opacity:0.25 transform:scale(0.8)","50%":"opacity:0.7 transform:scale(1)"}});var a2=!1,E1=class{[I2]=!0;compiled;ancestors;opts;$state=l.proxy({live:[],focus:0});$open=l.proxy({});nextOrder=0;containerEl;geom;lastGeom;layoutQueued=!1;timers=new Set;exiting=new Set;intent=null;settling=null;lastSeen=null;queued=null;constructor(a){if(a2)throw new Error("Staffa: only one routed S.main() (one with `routes`) can be active at a time");a2=!0,this.opts=a,this.compiled=Object.entries(a.routes).map(([e,h])=>({...F2(e),draw:h})),this.ancestors=Object.entries(a.ancestors??{}).filter(e=>e[1]!=null).map(([e,h])=>({...F2(e),fn:h})),l(()=>{let e=this.computeTarget(),h={...b.current.search},p=b.current.hash;l.peek(()=>{let r=this.lastSeen;if(r&&r.path!==b.current.path){let o=this.$state.live.find(d=>d.path===r.path);o&&(o.search=r.search,o.hash=r.hash)}this.lastSeen={path:b.current.path,search:h,hash:p},this.propose(e),Array.isArray(b.current.state.panels)||Object.assign(b.current.state,this.stateFor({stack:this.paths(),focus:this.$state.focus}))})}),this.interceptLinks(),this.watchTitle(),this.guardTabClose(),l.clean(()=>{for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.queued?.settle(!1),this.queued=null,a2=!1})}resolve(a){let e=u1(a);for(let h of this.compiled){let p=t2(h,e);if(p)return{draw:h.draw,params:p}}return{draw:this.opts.notFound??U0,params:{}}}matches(a){let e=u1(a);return this.compiled.some(h=>t2(h,e)!=null)}deriveStack(a){let e=W(a),h=this.askAncestors(e),p=h?h.map(W):this.prefixesOf(e),r=[];for(let o of p)o!==e&&!r.includes(o)&&this.matches(o)&&r.push(o);return r.push(e),r}askAncestors(a){let e=u1(a);for(let h of this.ancestors){let p=t2(h,e);if(p)return h.fn(p,a)??void 0}}prefixesOf(a){let e=u1(a),h=[];for(let p=1;p<e.length;p++)h.push("/"+e.slice(0,p).join("/"));return h}pinnedIn(a,e){return a.filter(h=>e.includes(h)?!1:this.$state.live.find(p=>p.path===h)?.$panel.pinned===!0)}unsavedAt(a){return this.$state.live.find(e=>e.path===a)?.$panel.unsaved===!0}targetFor(a,e){let h=Array.isArray(e?.panels)?e.panels.map(String):null;if(h){let p=Array.isArray(e.parked)?e.parked.map(String):[],r=W(a),o=new Set([r]),d=c=>c.map(W).filter(i=>!o.has(i)&&!!o.add(i)),n=d(h);return{stack:[...n,r,...d(p)],focus:n.length}}return l.peek(()=>{let p=this.deriveStack(a).slice(0,-1),r=[...p,...this.pinnedIn(this.paths(),[...p,W(a)]),W(a)];return{stack:r,focus:r.length-1}})}computeTarget(){return this.targetFor(b.current.path,b.current.state)}paths(){return this.$state.live.map(a=>a.path)}propose(a){let e=this.$state.live.filter(h=>!a.stack.includes(h.path)&&h.$panel.unsaved).map(h=>h.path);e.length&&(a={stack:[...a.stack,...e],focus:a.focus}),!(K2(this.paths(),a.stack)&&a.focus===this.$state.focus)&&this.commit(a,b.current.nav)}commit(a,e){this.geom=void 0;let h=b.current.state.pinned,p=new Set(Array.isArray(h)?h.map(String):[]),r=new Map(this.$state.live.map(n=>[n.path,n])),o=[];for(let n of a.stack){let c=r.get(n);if(c){r.delete(n),o.push(c);continue}let i=this.createEntry(n,o.length<=a.focus,p.has(n));e!=="load"&&(i.enter=!0),o.push(i),this.$open[n]=i}let d;for(let n of this.$state.live)r.has(n.path)?this.beginClose(n,d):d=n.path;this.$state.live=o,this.$state.focus=Math.min(a.focus,o.length-1),this.scheduleLayout()}createEntry(a,e,h){let{draw:p,params:r}=this.resolve(a),o={[I2]:!0,order:this.nextOrder++,path:a,draw:p,$ui:l.proxy({holding:!1}),maxWidth:"medium",width:0};return o.$panel=l.proxy({stack:this,params:r,path:a,width:0,visible:e,pinned:h||void 0,close:()=>this.closePath(o.path),open:(d,n)=>this.navigate(d,{from:o.path,how:n})}),o}beginClose(a,e){a.closing=!0,a.anchor=e,a.$panel.visible=!1,delete this.$open[a.path]}playExit(a,e){if(!a.closing){e.remove();return}e.classList.add("s-panel-closing"),e.setAttribute("inert","");let h=a.placed?{el:e,anchor:a.anchor,ride:0}:null;h&&this.exiting.add(h),this.afterTransition(e,"opacity",()=>{h&&this.exiting.delete(h),e.remove()})}afterTransition(a,e,h){let p=!1,r=setTimeout(()=>d(),N+80);this.timers.add(r);let o=()=>{clearTimeout(r),this.timers.delete(r)},d=()=>{o(),p||(p=!0,h())},n=c=>i=>{i.target===a&&i.propertyName===e&&c()};a.addEventListener("transitionrun",n(o)),a.addEventListener("transitionend",n(d)),a.addEventListener("transitioncancel",n(d))}intended(){return this.intent??{stack:this.paths(),focus:this.$state.focus}}stateFor(a){return{panels:a.stack.slice(0,a.focus),parked:a.stack.slice(a.focus+1),pinned:this.pinnedPaths()}}pinnedPaths(){return this.$state.live.filter(a=>a.$panel.pinned).map(a=>a.path)}issue(a,e){return this.intent=a,this.settling?(this.queued?.settle(!1),new Promise(h=>{this.queued={run:e,settle:h}})):this.start(e)}start(a){let e=p=>{this.settling=null;let r=this.queued;return this.queued=null,p&&r?this.start(r.run).then(r.settle,()=>r.settle(!1)):(this.intent=null,r?.settle(!1)),p},h=Promise.resolve(a()).then(e,p=>(console.error(p),e(!1)));return this.settling=h,h}focusAt(a){let e=this.intended();if(a<0||a>=e.stack.length||a===e.focus)return Promise.resolve(!1);let h={stack:e.stack,focus:a},p=e.stack[a];return this.issue(h,()=>{let r=this.$state.live.find(o=>o.path===p);return b.go({path:p,search:r?.search,hash:r?.hash,state:this.stateFor(h)})})}back(){return l.peek(()=>{let a=this.intended();return a.focus===a.stack.length-1&&!this.unsavedAt(a.stack[a.focus])?this.closePath(a.stack[a.focus]??""):a.focus===0?Promise.resolve(!1):this.focusAt(a.focus-1)})}closePath(a){return l.peek(()=>{let e=this.intended(),h=e.stack.indexOf(W(a));if(h<0||e.stack.length<2||this.unsavedAt(e.stack[h]))return Promise.resolve(!1);let p=e.stack.filter((c,i)=>i!==h),r=h===e.focus?Math.max(0,h-1):e.focus-(h<e.focus?1:0),o={stack:p,focus:r};if(h===e.focus&&h===e.stack.length-1){let c=this.$state.live.find(w=>w.path===p[r]),i={};c?.search&&(i.search=c.search),c?.hash&&(i.hash=c.hash);let A=p.filter(w=>this.$state.live.find(D=>D.path===w)?.$panel.pinned===!0);return this.issue(o,()=>Promise.resolve(b.back({path:p[r],state:{panels:p.slice(0,r),parked:[]}},i)).then(w=>(w&&(b.current.state.pinned=A),w)))}let d=p[r],n=d!==e.stack[e.focus];return this.issue(o,()=>{let c=n?this.$state.live.find(i=>i.path===d):void 0;return b.go({path:d,search:n?c?.search:{...b.current.search},hash:n?c?.hash:b.current.hash,state:this.stateFor(o)})})})}navigate(a,{from:e,how:h,beneath:p}={}){let r=h??this.opts.linkNavigation,o=r==="open"?null:e??null,d=r==="replace";return l.peek(()=>{let n;try{n=new URL(a,location.href)}catch{return Promise.resolve(!1)}let c=W(n.pathname),i=this.intended(),A=p?-1:i.stack.indexOf(c),w;if(A>=0&&r!=="replace"&&r!=="open"){let f=this.pinnedIn(i.stack.slice(A+1),[]);w={stack:[...i.stack.slice(0,A+1),...f],focus:A}}else{let f=o==null?-1:i.stack.indexOf(o),s=(p?p.map(W):f<0?this.deriveStack(c).slice(0,-1):i.stack.slice(0,d?f:f+1)).filter((k,X,h1)=>k!==c&&h1.indexOf(k)===X),u=[...s,...this.pinnedIn(i.stack,[...s,c,d?o:null])];w={stack:[...u,c],focus:u.length}}let D=A>=0?this.$state.live.find(f=>f.path===c):void 0,v=n.search?Object.fromEntries(new URLSearchParams(n.search)):D?.search??{},H=n.hash||D?.hash||"";if(w.focus===i.focus&&K2(w.stack,i.stack)&&n.search===location.search&&(n.hash||"")===(location.hash||""))return Promise.resolve(!0);let V=this.stateFor(w);return d?this.issue(w,()=>(b.current.path=c,b.current.search=v,b.current.hash=H,b.current.state=V,l.runQueue(),b.current.path===c)):this.issue(w,()=>b.go({path:c,search:v,hash:H,state:V}))})}pushPath(a,e){return l.peek(()=>{let h=this.intended();return this.navigate(a,{from:h.stack[h.focus],how:e?"replace":"push"})})}interceptLinks(){b.interceptLinks((a,e,h)=>{if(h instanceof KeyboardEvent&&(h.ctrlKey||h.metaKey||h.shiftKey||h.altKey))return!1;let p=e.getAttribute("data-panel")??void 0,r=e.closest(".s-panel"),o=r?this.$state.live.find(d=>d.el===r):e.closest(".s-panel-origin")?this.$state.live[this.$state.focus]:void 0;return this.navigate(a.href,{from:o?.path,how:p}),!0})}get currentPanel(){return this.$state.live[this.$state.focus]?.$panel}get panels(){return this.$state.live.map(a=>a.$panel)}get currentPanelIndex(){return this.$state.focus}pushPanel(a){return this.pushPath(a,!1)}replacePanel(a){return this.pushPath(a,!0)}openPanelStack(a,e){return this.navigate(a,{how:"open",beneath:e})}closePanel(a){return l.peek(()=>{let e=this.intended();return this.closePath(a??e.stack[e.focus]??"")})}setColumns(a){this.opts.columns!==a&&(this.opts.columns=a,this.scheduleLayout())}setLinkNavigation(a){this.opts.linkNavigation=a}drawCrumbs(){z1({attrs:".s-crumbs role=navigation aria-label=Breadcrumbs",content:()=>{l(()=>{let a=this.panels.map(p=>p.path),e=this.currentPanelIndex,h;for(let p=0;p<a.length;p++){p&&$2({size:"0.85em",attrs:".s-crumb-sep"});let r=this.drawCrumb(a[p],p,p===e);p===e&&(h=r)}requestAnimationFrame(()=>{h&&$1(h)})})}})}drawCrumb(a,e,h){let p=this.$state.live[e];return l(h?"span.s-crumb aria-current=page":"a.s-crumb",()=>{h||l("href=",a),l(()=>{p?.$panel.visible&&l(".s-crumb-on")}),l(()=>{p?.$panel.unsaved&&k2({size:"0.45em",attrs:".s-crumb-unsaved"})}),l(()=>{p?.$panel.pinned&&W1({size:"0.85em",attrs:".s-crumb-pin"})}),l(()=>{l("#",p?.$panel.title??p?.$ui.fallback??(a.split("/").pop()||a))}),Y1({link:a,items:[{label:()=>{l(()=>{l("#",p?.$panel.pinned?"Unpin":"Pin")})},icon:()=>{l(()=>{(p?.$panel.pinned?z2:W1)()})},click:()=>{p&&this.togglePin(p)}},{label:"Close",icon:i1,disabled:p?.$panel.unsaved===!0,click:()=>{this.closePath(a)}}]})})}togglePin(a){a.$panel.pinned=!a.$panel.pinned||void 0,b.current.state.pinned=this.pinnedPaths()}watchTitle(){let a=document.title;l(()=>{let e=this.$state.live[this.$state.focus],h=e?.$panel.title??e?.$ui.fallback,p=typeof this.opts.title=="string"?this.opts.title:void 0,r=this.$state.live.some(d=>d.$panel.unsaved),o=h&&p?`${h} \xB7 ${p}`:h||p;o&&(document.title=(r?"\u2022 ":"")+o)}),l.clean(()=>{document.title=a})}guardTabClose(){if(typeof window>"u")return;let a=e=>{let h=this.$state.live.find(p=>p.$panel.unsaved);h&&(e.preventDefault(),e.returnValue=!0,this.flushLayout(),h.$panel.visible||this.focusAt(this.intended().stack.indexOf(h.path)))};l(()=>{this.$state.live.some(e=>e.$panel.unsaved)&&(window.addEventListener("beforeunload",a),l.clean(()=>window.removeEventListener("beforeunload",a)))})}drawColumns(){let a=l("div.s-panels role=main",()=>{this.containerEl=l(),l.onEach(this.$open,e=>this.drawPanel(e),e=>e.order)});if(typeof ResizeObserver<"u"){let e=new ResizeObserver(()=>this.layout());e.observe(a),l.clean(()=>e.disconnect())}l.clean(()=>{this.containerEl===a&&(this.containerEl=void 0)}),this.scheduleLayout()}drawPanel(a){let e;l(()=>{let h=a.$panel.maxWidth;a.maxWidth=h==="small"||h==="large"||h==="none"?h:"medium";let p=this.roomFor(a.maxWidth);p&&(a.width=p,l.peek(a.$panel,"width")!==p&&(a.$panel.width=p),e&&(e.style.width=`${p}px`,this.scheduleLayout()))}),e=l(`section.s-panel${a.width?` w:${a.width}px`:""}`,"destroy=",h=>this.playExit(a,h),()=>{l(()=>this.drawActions(a)),l("div.s-content",()=>{if(a.draw(a.$panel),b.persistScroll(a.path),l.peek(a.$panel,"title")==null){let h=K0(l());h&&l.peek(a.$ui,"fallback")!==h&&(a.$ui.fallback=h)}}),l(()=>{!a.$panel.loading||a.$ui.holding||l("div.s-panel-loading aria-hidden=true",()=>{l("i"),l("i"),l("i")})})}),a.el=e,a.placed=!1,e.style.transition="none",l.clean(()=>{a.el===e&&(a.el=void 0)}),l(()=>{a.$panel.loading,this.scheduleLayout()}),this.scheduleLayout()}drawActions(a){this.opts.$shell.narrow||a.$panel.actions==null||l("div.s-panel-actions",()=>M(a.$panel.actions))}scheduleLayout(){this.layoutQueued||(this.layoutQueued=!0,requestAnimationFrame(()=>this.flushLayout()))}flushLayout(){this.layoutQueued&&(this.layoutQueued=!1,this.layout())}measure(){let a=this.containerEl,e=a?a.getBoundingClientRect().width:0;if(!e)return;let h=Math.ceil(e/S1),p=e/h>=I0?e/h:Math.min(e,S1),r=o=>Math.min(o*p,e);return{area:e,size:{small:p,medium:r(2),large:r(3),none:e}}}geometry(){return this.geom??=this.measure()}roomFor(a){return this.geometry()?.size[a]??0}layout(){let a=this.containerEl,e=a?.closest(".s-main");if(!a||!e)return;let h=this.$state.live,p=h.length;if(!p||h.some(s=>!s.el))return;this.geom=void 0;let r=this.geometry();if(!r)return;let o=this.opts.columns==="single",d=this.lastGeom?.area!==r.area;d&&(this.lastGeom=r,e.classList.add("s-shell-snap"));let n=s=>r.size[s.maxWidth],c=Math.min(this.$state.focus,p-1),i=c,A=n(h[c]);if(!o)for(let s=c-1;s>=0;s--){let u=A+n(h[s]);if(u>r.area)break;A=u,i=s}let w=i>0?0:(r.area-A)/2;for(let s=i;s<=c;s++)h[s].width=n(h[s]);for(let s of h)s.width||(s.width=n(s));let D=[],v=[],H=new Map,V=new Map;if(!d)for(let s of h)s.placed&&V.set(s,F0(s.el));let f=w,C=0;for(let s=0;s<i;s++)f-=h[s].width;for(let s=0;s<p;s++){let u=h[s],k=u.el,X=s>=i&&s<=c;s===c+1&&(f=Math.max(f,r.area)),(u.enter||!u.placed)&&(!u.$panel.loading||u.holdDone?u.$ui.holding=!1:u.$ui.holding||(u.$ui.holding=!0,this.holdEnter(u))),u.placed?(C=parseFloat(k.style.left)-f,H.set(u.path,C),C&&!d&&(k.style.transition=`opacity ${N}ms linear`,k.style.transform=`translateX(${(V.get(u)??0)+C}px)`,v.push(k)),k.style.left=`${f}px`,u.enter&&!u.$ui.holding&&this.releaseEnter(u)):(D.push(u),k.style.left=`${f}px`,u.enter&&X&&(k.style.transform=`translateX(${C}px)`,k.classList.add("s-panel-enter","s-panel-new"))),k.style.width=`${u.width}px`,f+=u.width,u.$panel.visible!==X&&(u.$panel.visible=X),u.$panel.width!==u.width&&(u.$panel.width=u.width),k.classList.toggle("s-panel-sep",X&&s>i);let h1=s<i,W2=k.classList.contains("s-panel-hidden")||k.classList.contains("s-panel-parked");X?k.classList.remove("s-panel-hidden","s-panel-parked"):W2||!u.placed||d?(k.classList.toggle("s-panel-hidden",h1),k.classList.toggle("s-panel-parked",!h1)):this.afterTransition(k,"transform",()=>{u.el!==k||!u.offstage||(k.classList.toggle("s-panel-hidden",h1),k.classList.toggle("s-panel-parked",!h1))}),u.offstage=!X,k.toggleAttribute("inert",!X)}for(let s of this.exiting){let u=s.anchor==null?void 0:H.get(s.anchor);u&&(s.ride-=u,s.el.style.transform=`translateX(${s.ride}px)`)}(D.length||v.length||d)&&a.offsetWidth,d&&e.classList.remove("s-shell-snap");for(let s of v)s.style.transition="",s.style.transform="";for(let s of D){let u=s.el;u.style.transition="",u.style.transform="",s.placed=!0,s.$ui.holding||this.releaseEnter(s)}}releaseEnter(a){a.enter=!1;let e=a.el;!e||!e.classList.contains("s-panel-enter")||(e.classList.remove("s-panel-enter"),this.afterTransition(e,"opacity",()=>e.classList.remove("s-panel-new")))}holdEnter(a){let e=setTimeout(()=>{this.timers.delete(e),a.holdDone=!0,a.$ui.holding&&(a.$ui.holding=!1,this.scheduleLayout())},B0);this.timers.add(e)}};function K2(t,a){return t.length===a.length&&t.every((e,h)=>e===a[h])}function F0(t){let a=getComputedStyle(t).transform;return a&&a!=="none"?new DOMMatrixReadOnly(a).m41:0}function K0(t){let a=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(let e=a.nextNode();e;e=a.nextNode()){let h=e.textContent.trim();if(h)return h.length>48?`${h.slice(0,47).trimEnd()}\u2026`:h}}function U0(t){l("p fg:$s-muted",()=>l("#",`No panel at ${t.path}`))}var W0=200;m.insertGlobalCss({".s-main":{"&":"display:flex flex-direction:column min-height:100vh max-height:100vh container-type:inline-size","body > &":"margin: calc(-1 * $3)","> header":"border:0 border-bottom: 1px solid $s-faint; r:0 position:sticky top:0 z-index:10","> footer":"border-top: 1px solid $s-faint; fg:$s-muted","> header > .s-bar, > footer > .s-bar":"display:flex align-items:center width:100% margin-inline:auto gap:$3 padding: $2 $3;","> header .s-logo, > header .s-nav-trigger":"display:flex align-items:center flex-shrink:0","> header .s-nav-trigger":"margin-left:-0.375rem","> header .s-logo":"font-size:1.4em background: $s-gradient; -webkit-background-clip:text; background-clip:text; color:transparent;","> header .s-titles":"display:flex flex-direction:column min-width:5rem flex: 0 1 auto;","> header .s-subtitle":"fg:$s-muted font-size:0.85em line-height:1.5 overflow:hidden text-overflow:ellipsis white-space:nowrap","> header .s-title":"font-weight:800 font-size:1.1em line-height:1.2 overflow:hidden text-overflow:ellipsis white-space:nowrap letter-spacing:-0.01em background: $s-gradient; -webkit-background-clip:text; background-clip:text; color:transparent; width:fit-content max-width:100%","> header a.s-logo, > header a.s-title":"text-decoration:none filter:none cursor:pointer","> header .s-menu":"display:flex align-items:center justify-content:flex-end gap:$2 flex: 1 1 auto;",".s-body":"flex:1 overflow:clip display:flex flex-direction:row min-height:0 justify-content:center position:relative",".s-body-inner":"flex:1 min-width:0 display:flex flex-direction:row min-height:0","&.s-nav-right .s-body-inner":"flex-direction:row-reverse",".s-nav-sep":"width:1px flex-shrink:0 align-self:stretch margin: 0.6rem 0; border:0 background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);",".s-body main":`flex:1 min-width:0 min-height:0 overflow-x:hidden overflow-y:auto display:flex flex-direction:column transition: transform ${N}ms ease;`,".s-body main.s-slide-in":"transform: translateX(100%); transition:none",".s-body main > .s-content":"width:100% flex:1 p:$3",".s-body main.s-scroll-y":"margin-right:$3"},".s-nav-panel":{"&":"display:flex flex-direction:column overflow-y:auto flex-shrink:0 width: calc(var(--s-nav-w) - 1px); padding:$3 gap:$1"},".s-nav-page":{"&":`position:absolute inset:0 z-index:5 display:flex flex-direction:column overflow-y:auto overscroll-behavior:contain border:0 r:0 padding:$2 gap:$1 transition: transform ${N}ms ease, visibility 0s;`,"&.s-nav-page-off":`transform:translateX(-100%) pointer-events:none visibility:hidden transition: transform ${N}ms ease, visibility 0s ${N}ms;`,".s-menu-item":"padding: $2 $3; min-height:3rem font-size:1.05em gap:$3"},[`@container (max-width: ${g1}px)`]:{".s-main .s-nav-panel, .s-main .s-nav-sep":"display:none",".s-main > header > .s-bar":"gap:$1 padding: $1 $2;",".s-main .s-body main.s-scroll-y":"margin-right:0"},[`@container (max-width: ${S1}px)`]:{".s-content > .s-box":"margin-inline: calc(-1 * $3); r:0 border-inline:0"}});function N0(t={}){let a=t.nav,e=t.navPosition??"left",h=m.proxy({open:!1}),p=m.proxy({narrow:typeof document<"u"&&document.documentElement.clientWidth<=g1}),r=t.routes;if(r!=null&&t.content!=null)throw new Error("Staffa: S.main() takes either `content` or `routes`, not both");let o=r?new E1({routes:r,notFound:t.notFound,ancestors:t.ancestors,title:t.title,$shell:p}):null;o&&(m(()=>o.setColumns(t.columns)),m(()=>o.setLinkNavigation(t.linkNavigation)));let d=o&&t.home!==null?t.home??"/":null,n=()=>{t.maxWidth!=null&&m("max-width:",t.maxWidth)},c=m("div.s-main",t.attrs,()=>{m(()=>{a==null||!a.items.length?m("--s-nav-w: 0px"):m(`.s-nav-${e}`,`--s-nav-w: ${t.navWidth??W0}px`)}),m(()=>{(o!=null||t.title!=null||t.subtitle!=null||t.logo!=null||t.menu!=null||a!=null&&a.items.length>0)&&m("header.s-s.neutral",t.topbarAttrs,()=>{m("div.s-bar",()=>{m(n),m(()=>{if(p.narrow&&a!=null&&a.items.length){m("div.s-nav-trigger",()=>Q0(a,h));return}t.logo!=null&&m(d!=null?"a.s-logo aria-label=Home":"div.s-logo",()=>{d!=null&&m("href=",d),M(t.logo)})}),m("div.s-titles",()=>{m(()=>{t.title!=null&&m(d!=null?"a.s-title":"div.s-title",()=>{d!=null&&m("href=",d),M(t.title)})}),X0(t,o,a,p)}),m(()=>{let A=p.narrow?o?.currentPanel?.actions:void 0,w=A??t.menu;w!=null&&m(`div.s-menu${A!=null?".s-panel-origin":""}`,()=>M(w))})})})}),m("div.s-body",()=>{m("div.s-body-inner",()=>{m(n),m(()=>{a==null||!a.items.length||(m(`nav.s-nav-panel.s-nav-${e}`,t.navAttrs,()=>{v1(a.items)}),m("div.s-nav-sep aria-hidden=true"))}),tt(t,o)}),m(()=>{a!=null&&a.items.length&&h.open&&J0(a,t.navPageAttrs,h,p)})}),m(()=>{t.footer!=null&&m("footer",()=>{m("div.s-bar",()=>{m(n),M(t.footer)})})})});return j0(c,p),a!=null&&m1(()=>a.items,()=>{h.open=!1}),(a!=null||o)&&m(()=>{let i=w=>()=>{K1()||C1()||w()},A=()=>c.querySelector(".s-nav-trigger button");h.open?P("Esc","Close the navigation",i(()=>{h.open=!1,A()?.focus()}),"global"):o&&o.currentPanelIndex>0?P("Esc","Back to the previous panel",i(()=>{o.back()}),"global"):P("Esc","Jump to the navigation",i(()=>{let w=c.querySelector(".s-nav-panel");w?.offsetParent!=null?(w.querySelector("[aria-current=page]")??w.querySelector(".s-menu-item:not([aria-disabled=true])"))?.focus():A()?.click()}),"global")}),o??void 0}var P1=null;function G0(){P1?.()}function X0(t,a,e,h){m(()=>{if(t.subtitle!=null&&(a==null||_0(a,e,h))){m("div.s-subtitle",()=>M(t.subtitle));return}a?.drawCrumbs()})}function _0(t,a,e){return e.narrow||a==null||t.panels.length>1?!1:X1(a.items)}function j0(t,a){if(typeof ResizeObserver>"u")return;let e=new ResizeObserver(h=>{let p=h[0]?.contentBoxSize?.[0],r=p?p.inlineSize:h[0]?.contentRect.width;r!=null&&(a.narrow=r<=g1)});e.observe(t),m.clean(()=>e.disconnect())}function Q0(t,a){l1({icon:t.button?.icon??(()=>m(()=>(a.open?i1:A1)())),ariaLabel:t.button?.ariaLabel??"Open navigation",attrs:t.button?.attrs,click:()=>{a.open=!a.open}})}function J0(t,a,e,h){let p=!1,r=()=>{p=!0,e.open=!1},o=m("nav.s-nav-page.s-s.neutral aria-label=Navigation create=s-nav-page-off destroy=s-nav-page-off",a,()=>v1(t.items,r));P1=r,m.clean(()=>{P1===r&&(P1=null)});let d=m.peek(h2,"path");m(()=>{h2.path!==d&&!Q1(h2.path)&&r()});let n=o.closest(".s-main"),c=o.parentElement?.querySelector(":scope > .s-body-inner"),i=c?.querySelector(":scope > main");c?.setAttribute("inert",""),m(()=>{h.narrow||(e.open=!1)}),m.clean(()=>{c?.removeAttribute("inert"),p&&(i&&Y0(i),n?.querySelector(".s-nav-trigger button")?.focus())}),requestAnimationFrame(()=>{document.body.contains(o)&&p1(o,".s-menu-item[aria-current=page]")})}function Y0(t){t.classList.add("s-slide-in"),t.offsetWidth,t.classList.remove("s-slide-in")}function tt(t,a){if(a){a.drawColumns();return}let e=m("main",()=>{m("div.s-content",t.contentAttrs,()=>{M(t.content)})});at(e)}function at(t){if(typeof ResizeObserver>"u")return;let a=()=>t.classList.toggle("s-scroll-y",t.offsetWidth>t.clientWidth),e=new ResizeObserver(a);e.observe(t),t.firstElementChild&&e.observe(t.firstElementChild),a(),m.clean(()=>e.disconnect())}import T from"aberdeen";T.insertGlobalCss({".s-select_wrap":{"&":"position:relative display:block",select:"w:100% cursor:pointer padding-right:2.2em; appearance:none","&::after":"content: '\u25BE'; position:absolute right:0.7em top:50%; transform: translateY(-50%); pointer-events:none fg:$s-muted font-size:0.85em"}});function et(t){Q(t,(a,e)=>{T("div.s-select_wrap",()=>{T("select.s-input",t.inputAttrs,()=>{d1(t,a,e),T("change=",h=>{t.bind&&(t.bind.value=h.target.value)}),T(()=>{let h=typeof t.options=="function"?t.options():t.options,p=t.bind?.value??"";t.placeholder!=null&&T("option",()=>{T("value= disabled=true hidden=true"),p||T("selected=true"),T("#",t.placeholder)});for(let r of h){let o=typeof r=="string"?{value:r,label:r}:{value:r.value,label:r.label??r.value};T("option",()=>{T("value=",o.value),o.value===p&&T("selected=true"),T("#",o.label)})}})})})})}import G from"aberdeen";G.insertGlobalCss({"textarea.s-input, .s-inset.s-inset-bottom":"flex: 0 1 100%; min-height:0","textarea.s-input":"resize:vertical min-height:3em line-height:1.45","textarea.s-input.s-autoGrow":"resize:none min-height:2.5em overflow-y:hidden"});function ht(t={}){let a=t.autoGrow!==!1;Q(t,(e,h)=>{b1(t,!0,()=>{let p=G("textarea.s-input",t.inputAttrs,()=>{a?(G(".s-autoGrow"),G("input=",r=>{U2(r.currentTarget),t.input&&t.input(r)})):(G("rows=",t.rows??4),G("resize:",t.resize??(t.suffix?"none":"vertical")),t.input&&G("input=",t.input)),t.placeholder!=null&&G("placeholder=",t.placeholder),t.value!=null&&!t.bind&&G("value=",t.value),t.change&&G("change=",t.change),d1(t,e,h,t.bind)});a&&requestAnimationFrame(()=>U2(p))})})}function U2(t){t.style.height="auto",t.style.height=`${t.scrollHeight}px`}export{Y1 as addContextMenu,s1 as addTooltip,o0 as alert,M0 as autocomplete,P as bindKey,m0 as box,B as button,u0 as buttonChooser,t1 as buttonGroup,y0 as checkbox,Z2 as closeFloatingMenu,G0 as closeNav,d0 as confirm,c1 as dialog,f0 as form,R as formatKey,o2 as getDarkMode,l1 as iconButton,K1 as isDialogOpen,C1 as isFloatingMenuOpen,N0 as main,A2 as matchWords,E0 as menu,P0 as menuButton,n0 as prompt,$1 as revealInStrip,z1 as scrollStrip,et as select,G2 as setDarkMode,c0 as setKeyHelp,J1 as showFloatingMenu,U1 as showKeyHelp,q0 as tabs,ht as textarea,I1 as textline,V1 as toast};
|
|
1
|
+
import F from"aberdeen";var d2=t=>`background: $s-bg linear-gradient(${t}, color-mix(in oklab, $s-bg, white 9%), color-mix(in oklab, $s-bg, black 9%));`,R1=d2("170deg"),Z1=d2("180deg"),D1="staffa:darkMode",n2=F.proxy({value:_2()});function _2(){try{let t=localStorage.getItem(D1);if(t==="dark")return!0;if(t==="light")return!1}catch{}}function j2(t){n2.value=t;try{t===void 0?localStorage.removeItem(D1):localStorage.setItem(D1,t?"dark":"light")}catch{}}function c2(t=!1){let a=n2.value;return a===void 0&&!t?F.darkMode():a}F(()=>{c2()?F.insertGlobalCss({":root, .s-s.neutral":"--s-bg:#0e0f12 --s-text:#e9eaec",".s-s.neutral":"--s-bg:#191b1f --s-text:#e9eaec",".s-s.neutral .s-s.neutral":"--s-bg:#23262b"}):F.insertGlobalCss({":root, .s-s.neutral":"--s-bg:#eef0f3 --s-text:#1d1f24",".s-s.neutral, .s-s.neutral":"--s-bg:#ffffff --s-text:#1d1f24",".s-s.neutral .s-s.neutral":"--s-bg:#f6f7f9"})});F.setSpacingCssVars(1.1);F.insertGlobalCss({"*, *::before, *::after":"box-sizing:border-box",html:"text-size-adjust:100%",body:"m:0 p:$3 min-height:100dvh line-height:1.5 font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; -webkit-font-smoothing:antialiased text:$s-text "+R1,a:"color: $s-link-fg; text-decoration:underline text-underline-offset:2px; transition: color 0.12s, filter 0.12s;","a:hover":"filter: brightness(1.15)","input, button, textarea, select, optgroup":"font:inherit color:inherit","input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=image],[type=submit],[type=button],[type=reset],[type=hidden])), textarea, select":"background:$s-bg border: 1px solid $s-faint; r:$s-radius-sm padding: 0.45em 0.65em; max-width:100%","input:where([type=checkbox],[type=radio])":"width:1.15em height:1.15em cursor:pointer","input[type=range]":"appearance:none background:transparent cursor:pointer vertical-align:middle","input[type=range]::-webkit-slider-runnable-track":"height:4px r:99px background:$s-faint","input[type=range]::-moz-range-track":"height:4px r:99px background:$s-faint","input[type=range]::-moz-range-progress":"height:4px r:99px background:$s-accent","input[type=range]::-webkit-slider-thumb":"appearance:none width:16px height:16px margin-top:-6px r:50% background:$s-accent","input[type=range]::-moz-range-thumb":"width:16px height:16px border:0 r:50% background:$s-accent","input[type=file]":"cursor:pointer",progress:"appearance:none border:0 height:6px r:99px background:$s-faint overflow:hidden vertical-align:middle","progress::-webkit-progress-bar":"background:$s-faint r:99px","progress::-webkit-progress-value":"background:$s-accent r:99px","progress::-moz-progress-bar":"background:$s-accent r:99px",meter:"vertical-align:middle",fieldset:"border: 1px solid $s-faint; r:$s-radius-sm padding:$2 min-width:0",legend:"padding: 0 $1; font-weight:600","code, kbd, samp, pre":"font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;",code:"background: color-mix(in oklab, $s-text, $s-bg 86%); padding: 0.12em 0.34em; r:4px font-size:0.9em",pre:"background: color-mix(in oklab, $s-text, $s-bg 92%); p:$3 r: $s-radius; overflow:auto","pre code":"background:transparent p:0","img, svg, video, canvas":"max-width:100% h:auto",hr:"border:0 border-top: 1px solid $s-faint;","::placeholder":"color: $s-muted; opacity:1",":focus-visible":"outline: 2px solid $s-focus; outline-offset:2px",small:"color:$s-muted font-size:0.9em","@media (prefers-reduced-motion: reduce)":{"*, *::before, *::after":"transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; scroll-behavior: auto !important;"},":root":"--s-primary:#00a884 --s-danger:#dc5b41 --s-success:#00a884 --s-warning:#ef6b00 --s-link:#3f8cd8 --s-radius-sm:6px --s-radius:12px --s-radius-lg:18px --s-focus: color-mix(in srgb, $s-primary 38%, transparent); --s-gradient: linear-gradient(135deg, color-mix(in oklab, $s-primary, white 16%), color-mix(in oklab, $s-primary, black 14%));",":root, .s-s.neutral":"--s-accent:$s-primary --s-link-fg:$s-link",".s-s:not(.neutral)":"--s-bg:$s-primary border:0 --s-text:#eee --s-accent:#fff --s-link-fg:#eef --s-muted: color-mix(in srgb, #fff 70%, transparent); --s-faint: color-mix(in srgb, #fff 30%, transparent);",".s-s.danger":"--s-bg:$s-danger",".s-s.success":"--s-bg:$s-success",".s-s.warning":"--s-bg:$s-warning",".s-s.link":"--s-bg:$s-link",".s-s.primary":"--s-bg:$s-primary",":root, .s-s":"--s-muted: color-mix(in oklab, $s-text, $s-bg 42%); --s-faint: color-mix(in oklab, $s-text, $s-bg 80%); color:$s-text accent-color:$s-accent scrollbar-width:thin scrollbar-color: $s-faint transparent;",".s-s":R1+" r:$s-radius",":where(.s-s.neutral)":"border: 1px solid $s-faint;",".s-s::-webkit-scrollbar, .s-s ::-webkit-scrollbar":"width:10px height:10px",".s-s::-webkit-scrollbar-track, .s-s ::-webkit-scrollbar-track":"background:transparent",".s-s::-webkit-scrollbar-thumb, .s-s ::-webkit-scrollbar-thumb":"background:$s-faint border-radius:99px border: 2px solid transparent; background-clip:padding-box",".s-s.shadow.neutral:not(.s-btn)":"box-shadow: 0 4px 14px rgba(0,0,0,0.13);",".s-s.extra-shadow.neutral:not(.s-btn)":"box-shadow: 0 18px 50px rgba(0,0,0,0.28);",".s-s.shadow:not(.neutral):not(.tonal):not(.outlined)":"box-shadow: 0 4px 14px color-mix(in srgb, $s-bg 30%, transparent);",".s-s.extra-shadow:not(.neutral):not(.tonal):not(.outlined)":"box-shadow: 0 14px 40px color-mix(in srgb, $s-bg 40%, transparent);",".s-s.no-shadow":"box-shadow: none !important;",".s-s:not(.neutral).tonal, .s-s:not(.neutral).outlined":{"&":"--s-text:$s-bg --s-accent:$s-bg --s-link-fg:$s-bg --s-faint: color-mix(in srgb, $s-bg 30%, transparent); --s-muted: color-mix(in srgb, $s-bg 70%, transparent);",code:"background:transparent padding:0",pre:"background:transparent border: 1px solid $s-faint;"},".s-s:not(.neutral).tonal":"background: color-mix(in srgb, $s-bg 15%, transparent); border: 1px solid $s-faint;",".s-s:not(.neutral).outlined":"background: transparent; border: 1px solid color-mix(in srgb, $s-bg 45%, transparent);",".s-s:not(.neutral) .s-s.tonal, .s-s:not(.neutral) .s-s.outlined":"--s-text:#fff --s-accent:#fff --s-link-fg:#fff "+R1+" border-color: transparent;"});F.insertGlobalCss({".s-preload, .s-preload *, .s-preload *::before, .s-preload *::after":"transition: none !important; animation: none !important;"});if(typeof document<"u"&&typeof requestAnimationFrame=="function"){let t=document.documentElement;t.classList.add("s-preload"),requestAnimationFrame(()=>requestAnimationFrame(()=>t.classList.remove("s-preload")))}F.insertGlobalCss({":disabled, [aria-disabled=true]":"opacity:0.45 filter:saturate(0.6) user-select:none",":disabled, [aria-disabled=true], :disabled *, [aria-disabled=true] *":"pointer-events:none cursor:not-allowed"});var Q2="p, ul, ol, dl, blockquote, pre, table, figure, hr, h1, h2, h3, h4, h5, h6";F.insertGlobalCss({[`${Q2}`]:{"&":"margin:0","&:not(:first-child)":"margin-top:$3"},"h1, h2, h3, h4, h5, h6":{"&":"line-height:1.15 font-weight:700 text-wrap:balance","&:not(:first-child)":"margin-top:1.4em"},h1:"font-size:2em font-weight:800 letter-spacing:-0.022em",h2:"font-size:1.55em letter-spacing:-0.018em",h3:"font-size:1.3em letter-spacing:-0.011em",h4:"font-size:1.1em",h5:"font-size:0.95em letter-spacing:0.005em",h6:"font-size:0.8em fg:$s-muted text-transform:uppercase letter-spacing:0.07em","ul, ol":{"&":"padding-left:1.5em","> li:not(:first-child), li > &:not(:first-child)":"margin-top:$1"},blockquote:"border-left: 3px solid $s-faint; padding-left: $3; fg: $s-muted",table:"border-collapse:collapse","th, td":"text-align:left padding: $1 $2; border-bottom: 1px solid $s-faint; vertical-align:top",th:"font-weight:600","thead th":"border-bottom: 2px solid $s-faint;",dt:"font-weight:600",dd:"margin-left: 1.5em",figcaption:"fg:$s-muted font-size:0.9em margin-top:$1 text-align:center"});import B1 from"aberdeen";var b1=typeof navigator<"u"&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent),J2={esc:"escape",space:" "},Y2={" ":"Space",escape:"Esc",arrowup:"\u2191",arrowdown:"\u2193",arrowleft:"\u2190",arrowright:"\u2192"},w1=new WeakMap,R=[];function s2(){let t=B1();if(!t)throw new Error("Staffa: claimKeyboard needs a current element");return R.push(t),()=>{let a=R.indexOf(t);a>=0&&R.splice(a,1)}}function l2(t){let[,a,e,h]=/^(mod\+)?(shift\+)?(.*)$/i.exec(t),p=h.toLowerCase();if(p=J2[p]??p,!p||p.length>1&&/[-+]/.test(p))throw new Error(`Staffa: can't parse key "${t}" \u2014 write "k", "f2", "mod+k" or "mod+shift+f2"`);if(e&&p.toUpperCase()===p)throw new Error(`Staffa: "${t}" \u2014 write the shifted character itself ("?", not "shift+/")`);return(a?"mod+":"")+(e?"shift+":"")+p}function t0(t){if(t.altKey||(b1?t.ctrlKey:t.metaKey))return null;let a=t.key.toLowerCase(),e=t.shiftKey&&(a.length>1||t.key.toUpperCase()!==a);return((b1?t.metaKey:t.ctrlKey)?"mod+":"")+(e?"shift+":"")+a}function M2(t,a){if(!(a instanceof HTMLElement))return!1;let e=t.startsWith("mod+"),h=t.replace(/^(mod\+)?(shift\+)?/,"");if(h==="enter"&&a.closest("a[href]")!=null||!e&&(h==="enter"||h===" ")&&a.closest("button, summary, [role=button]")!=null)return!0;let p=a.tagName;return!e&&h!=="escape"&&(p==="INPUT"||p==="TEXTAREA"||p==="SELECT"||a.isContentEditable)}function x2(t,a){let e=R[R.length-1];return a.global===!0||!e||e.contains(t)}function a0(t){for(let a=R.length-1;a>=0;a--)if(R[a].contains(t))return R[a]}function v2(){return R[R.length-1]??document.body}function m2(t){let a=R[R.length-1];return a&&!(t&&a.contains(t))?a:t??document.body}var i2=!1;function e0(t){if(t.defaultPrevented||t.repeat||t.isComposing)return;let a=t0(t),e=t.target instanceof Element?t.target:null;if(!(a==null||M2(a,e)))for(let h=m2(e);h;h=h.parentElement){let p=w1.get(h)?.get(a);if(p&&x2(h,p)){p.press&&(t.preventDefault(),p.press(t));return}}}function u2(t){let a=new Map;for(let e=m2(t);e;e=e.parentElement){let h=w1.get(e);if(h)for(let[p,r]of h)!a.has(p)&&x2(e,r)&&!M2(p,t)&&a.set(p,r)}return[...a]}function O(t,a,e,h="normal"){let p=B1(),r=h==="global"?document.body:h==="local"?p:h==="normal"?(p&&a0(p))??document.body:h;if(!r)throw new Error("Staffa: a local key binding needs a current element");let o=l2(t),d=w1.get(r);d||w1.set(r,d=new Map);let n={description:a,press:e,global:h==="global",prev:d.get(o)};d.set(o,n),i2||(i2=!0,document.addEventListener("keydown",e0)),B1.clean(()=>{let c=d.get(o);if(c===n)n.prev?d.set(o,n.prev):d.delete(o);else for(;c;c=c.prev)if(c.prev===n){c.prev=n.prev;break}})}function D(t,a=!1){let e=l2(t),h=e.startsWith("mod+"),p=h?e.slice(4):e,r=p.startsWith("shift+"),o=r?p.slice(6):p,d=o.length===1?o.toUpperCase():o[0].toUpperCase()+o.slice(1);if(a){let c=o===" "?"Space":r||o.length>1?d:o;return(h?b1?"Meta+":"Control+":"")+(r?"Shift+":"")+c}let n=Y2[o]??d;return b1?(r?"\u21E7":"")+(h?"\u2318":"")+n:(h?"Ctrl+":"")+(r?"Shift+":"")+n}import t1 from"aberdeen";import I1 from"aberdeen";var H1=640,h0=0;function J(t="s"){return`${t}-${++h0}`}function l(t,...a){t!=null&&(typeof t=="function"?t(...a):I1("rich=",t))}var p0="a[href], button, input, select, textarea, [tabindex]",f2=t=>t instanceof HTMLElement&&!t.hasAttribute("disabled")&&t.getAttribute("aria-disabled")!=="true"&&t.tabIndex>=0&&t.getClientRects().length>0;function F1(t){return[...t.querySelectorAll(p0)].filter(f2)}function o1(t,a){let e=(a?[...t.querySelectorAll(a)].find(f2):void 0)??F1(t)[0];return e?.focus(),e!=null}function K(t){queueMicrotask(()=>I1(t))}var y2=["scroll","resize","transitionstart","animationstart"];function d1(t,a){let e="",h=0,p=0,r=()=>{let d=t instanceof Element?t.getBoundingClientRect():t,n=`${d.left} ${d.top} ${d.bottom} ${d.width}`;n!==e&&(e=n,a(d),p=0),h=++p>30?0:requestAnimationFrame(r)},o=()=>{p=0,h||r()};for(let d of y2)window.addEventListener(d,o,!0);return I1.clean(()=>{cancelAnimationFrame(h);for(let d of y2)window.removeEventListener(d,o,!0)}),r(),()=>{e="",o()}}import g from"aberdeen";import z from"aberdeen";import Z from"aberdeen";Z.insertGlobalCss({".s-tt-tip":{"&":"position:fixed z-index:500 max-width:20rem w:max-content padding: 0.3em 0.65em; font-size:0.85em line-height:1.4 pointer-events:none"}});var n1=Z.proxy(void 0),U=null;function r0(t,a,e,h){let r=window.innerWidth,o=window.innerHeight,d=0,n=0;return h==="bottom"?(d=t.left+(t.width-a)/2,n=t.bottom+7,n+e>o-8&&(n=t.top-e-7)):h==="left"?(d=t.left-a-7,n=t.top+(t.height-e)/2,d<8&&(d=t.right+7)):h==="right"?(d=t.right+7,n=t.top+(t.height-e)/2,d+a>r-8&&(d=t.left-a-7)):(d=t.left+(t.width-a)/2,n=t.top-e-7,n<8&&(n=t.bottom+7)),{x:Math.max(8,Math.min(d,r-a-8)),y:Math.max(8,Math.min(n,o-e-8))}}function K1(){U&&clearTimeout(U),U=setTimeout(()=>{n1.value=void 0,U=null},100)}K(()=>{let t=n1.value;if(!t)return;let{opts:a,anchor:e}=t,h=a.placement??"top",p=Z("div.s-tt-tip.s-s.neutral.shadow role=tooltip",a.attrs,()=>{Z("mouseenter=",()=>{U&&(clearTimeout(U),U=null)}),Z("mouseleave=",K1),l(a.tip)});d1(e,r=>{if(r.bottom<0||r.top>window.innerHeight||r.right<0||r.left>window.innerWidth||e.closest("[inert]")){n1.value=void 0;return}let{x:o,y:d}=r0(r,p.offsetWidth,p.offsetHeight,h);p.style.left=o+"px",p.style.top=d+"px"})});function M1(t){let a=e=>{U&&(clearTimeout(U),U=null),n1.value={opts:t,anchor:e.currentTarget}};Z("mouseenter=",a),Z("mouseleave=",K1),Z("focusin=",e=>{e.target.matches?.(":focus-visible")&&a(e)}),Z("focusout=",K1),Z.clean(()=>{Z.unproxy(n1).value?.opts===t&&(n1.value=void 0)})}z.insertGlobalCss({".s-btn":{"&":"display:inline-flex align-items:center justify-content:center gap:$2 font-weight:450 line-height:1.1 white-space:nowrap cursor:pointer text-decoration:none padding: $m2 $m3; transition: background 0.15s, border-color 0.15s, color 0.15s, filter 0.15s, box-shadow 0.15s, transform 0.08s;","&:focus-visible":"outline: 3px solid $s-focus; outline-offset: 1px;","&:hover:not([aria-disabled=true])":"filter: brightness(1.06)","&.tonal:hover:not([aria-disabled=true]), &.outlined:hover:not([aria-disabled=true])":"background: color-mix(in srgb, $s-bg 24%, transparent);","&.neutral:hover:not([aria-disabled=true])":"filter:none background: color-mix(in srgb, $s-text 8%, $s-bg);","> svg":"width:1.25em height:1.25em","&:active:not(:disabled):not([aria-disabled=true])":"transform: translateY(1px)","&[aria-disabled=true]":"pointer-events:auto cursor:not-allowed","&.small, .small > &":"padding: $m1 $m2; font-size:0.85em border-radius:$s-radius-sm","&.large, .large > &":"font-size:1.4em border-radius:$s-radius-lg"},".s-icon-btn":{"&":"display:inline-flex align-items:center justify-content:center flex-shrink:0 width:2rem height:2rem p:0 border:0 background:transparent cursor:pointer fg:$s-muted r:$s-radius-sm line-height:1 font-size:1rem text-decoration:none transition: color 0.12s, background 0.12s;","> svg":"width:1.25em height:1.25em","&:hover:not(:disabled):not([aria-disabled=true])":"fg:$s-text background: color-mix(in srgb, $s-text 10%, transparent);","&:focus-visible":"outline: 3px solid $s-focus; outline-offset:1px","&[aria-disabled=true]":"pointer-events:auto cursor:not-allowed","&.small, .small > &":"width:1.6rem height:1.6rem font-size:0.8rem","&.large, .large > &":"width:2.4rem height:2.4rem font-size:1.2rem"},".s-btn.s-busy, .s-icon-btn.s-busy, .s-busy .s-btn[type=submit]":"pointer-events:none cursor:progress",".s-btn.s-busy::after, .s-icon-btn.s-busy::after, .s-busy .s-btn[type=submit]::after":"content:'' flex-shrink:0 width:1em height:1em r:50% border: 2px solid currentColor; border-top-color: transparent; animation: s-spin 0.7s linear infinite;",".s-icon-btn.s-busy > svg":"display:none","@keyframes s-spin":{to:"transform: rotate(360deg)"}});function x1(t){let a=t.href!=null?"a":"button",e=t.tooltip===!1?void 0:t.tooltip,h=t.ariaLabel??(typeof e=="string"?b2(e):void 0);z(`${a}.s-icon-btn`,t.attrs,()=>{g2(t,e!=null),z("aria-label=",h),w2(t.tooltip,t.key,h,t.disabled),l(t.icon)})}function g2(t,a=!1){t.href!=null?(z("role=button"),t.disabled?z("aria-disabled=true"):z("href=",t.href)):t.disabled&&a?(z("type=",t.type??"button"),z("aria-disabled=true tabindex=-1"),z("click=",e=>{e.preventDefault(),e.stopPropagation()})):(z("type=",t.type??"button"),t.disabled&&z("disabled=true")),t.click&&!t.disabled&&o0(t.click)}function o0(t){let a=z.proxy({value:!1});z(()=>{a.value&&z(".s-busy aria-busy=true")}),z("click=",e=>{if(a.value)return;let h=t(e);if(!h||typeof h.then!="function")return;a.value=!0;let p=()=>{a.value=!1};Promise.resolve(h).then(p,r=>{throw p(),r})})}function b2(t){return t.replace(/\*\*(.+?)\*\*|\*(.+?)\*|`(.+?)`|\[(.+?)\]\((.+?)\)/g,(a,e,h,p,r)=>e??h??p??r)}function w2(t,a,e,h){if(t!==!1&&(t!=null||a)&&M1({tip:()=>{l(t),a&&z("#",t==null?D(a):` \xB7 ${D(a)}`)}}),a&&!h){let p=z();z("aria-keyshortcuts=",D(a,!0)),O(a,e,()=>p.click())}}function B(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t,e=a.href!=null?"a":"button",h=a.tooltip===!1?void 0:a.tooltip,p=a.ariaLabel??(a.content==null&&typeof h=="string"?b2(h):void 0);z(`${e}.s-btn.s-s.shadow`,a.attrs,()=>{g2(a,h!=null),p&&z("aria-label=",p),w2(a.tooltip,a.key,typeof a.content=="string"?a.content:p,a.disabled),l(a.icon),l(a.content)})}import H2 from"aberdeen";H2.insertGlobalCss({".s-bgroup":{"&":"display:inline-flex align-items:stretch","&.s-spaced":"gap:$2 flex-wrap:wrap","&.s-vertical":"flex-direction:column","&.s-attached":"gap:0","&.s-attached:not(.s-vertical) > .s-btn:not(:first-child)":"margin-left:-1px","&.s-attached:not(.s-vertical) > .s-btn:not(:first-child):not(:last-child)":"r:0","&.s-attached:not(.s-vertical) > .s-btn:first-child:not(:last-child)":"border-top-right-radius:0 border-bottom-right-radius:0","&.s-attached:not(.s-vertical) > .s-btn:last-child:not(:first-child)":"border-top-left-radius:0 border-bottom-left-radius:0","&.s-attached.s-vertical > .s-btn:not(:first-child)":"margin-top:-1px","&.s-attached.s-vertical > .s-btn:not(:first-child):not(:last-child)":"r:0","&.s-attached.s-vertical > .s-btn:first-child:not(:last-child)":"border-bottom-left-radius:0 border-bottom-right-radius:0","&.s-attached.s-vertical > .s-btn:last-child:not(:first-child)":"border-top-left-radius:0 border-top-right-radius:0","&.s-attached > .s-btn:hover, &.s-attached > .s-btn:focus-visible":"z-index:1"}});function h1(t={}){let e=`.s-${t.layout??"attached"}${t.vertical?".s-vertical":""}`;H2(`div.s-bgroup${e} role=group`,t.attrs,()=>{if(t.buttons)for(let h of t.buttons)B(h);l(t.content)})}import p1 from"aberdeen";import k from"aberdeen";k.insertGlobalCss({".s-field":{"&":"display:flex flex-direction:column gap:$1","> label":"font-weight:600 font-size:0.9em fg:$s-text user-select:none"},".s-req":"fg:$s-danger margin-left:2px",".s-help":"font-size:0.82em fg:$s-muted",".s-error":"font-size:0.82em fg:$s-danger",".s-input":{"&":"w:100% background: color-mix(in oklab, $s-bg, $s-text 4%); color:$s-text border: 1px solid $s-faint; r:$s-radius padding: 0.55em 0.7em; transition: border-color 0.15s, box-shadow 0.15s;","&:hover:not(:disabled)":"border-color: color-mix(in oklab, $s-text, $s-bg 55%);","&:focus-visible":"border-color:$s-accent box-shadow: 0 0 0 3px $s-focus; outline:none","&[aria-invalid=true]":"border-color:$s-danger"},".s-inset":{"&":"display:contents --s-inset-start:0px --s-inset-end:0px","&:has(> .s-inset_start), &:has(> .s-inset_end)":"position:relative display:grid","> .s-input":"padding-inline-start: calc(0.7em + var(--s-inset-start)); padding-inline-end: calc(0.7em + var(--s-inset-end));","> .s-inset_start, > .s-inset_end":"position:absolute top:0 bottom:0 display:flex align-items:center gap:$1 fg:$s-muted","> .s-inset_start":"left:0.35em","> .s-inset_end":"right:0.35em","&.s-inset-bottom > .s-inset_start, &.s-inset-bottom > .s-inset_end":"top:auto padding-bottom:0.35em","> .s-inset_start > svg, > .s-inset_end > svg":"width:1.15em height:1.15em","&:has(> .s-inset_end) > input[type=number]":"appearance:textfield","&:has(> .s-inset_end) > input[type=number]::-webkit-inner-spin-button":"appearance:none margin:0"},".s-inset_start, .s-inset_end":"pointer-events:none",".s-inset_start :where(button, a, input, select, textarea, label, [tabindex])":"pointer-events:auto",".s-inset_end :where(button, a, input, select, textarea, label, [tabindex])":"pointer-events:auto"});function Y(t,a){let e=t.id??J("field"),h=()=>!!t.error;k("div.s-field",t.attrs,()=>{k(()=>{t.label!=null&&k("label for=",e,()=>{l(t.label),t.required&&k("span.s-req aria-hidden=true #*")})}),a(e,h),k(()=>{t.help!=null&&!t.error&&k("div.s-help",()=>l(t.help))}),k(()=>{t.error&&k("div.s-error role=alert #",t.error)})})}function c1(t,a,e,h){k("id=",a),t.name&&k("name=",t.name),k(()=>{t.disabled&&k("disabled=true")}),k(()=>{t.required&&k("aria-required=true")}),k(()=>k("aria-invalid=",e()?"true":"false")),h&&k("bind=",h)}function A1(t,a,e){k("div.s-inset",()=>{a&&k(".s-inset-bottom"),e(),A2(()=>t.prefix,"s-inset_start","--s-inset-start"),A2(()=>t.suffix,"s-inset_end","--s-inset-end")})}function A2(t,a,e){k(()=>{let h=t();if(h==null)return;let p=k(`div.${a}.small`,()=>l(h)),r=p.parentElement,o=new ResizeObserver(()=>r?.style.setProperty(e,`${p.offsetWidth}px`));o.observe(p),k.clean(()=>{o.disconnect(),r?.style.setProperty(e,"0px")})})}function U1(t={}){Y(t,(a,e)=>{A1(t,!1,()=>{p1("input.s-input",t.inputAttrs,()=>{p1("type=",t.type??"text"),t.placeholder!=null&&p1("placeholder=",t.placeholder),t.autocomplete!=null&&p1("autocomplete=",t.autocomplete),t.value!=null&&!t.bind&&p1("value=",t.value),t.input&&p1("input=",t.input),t.change&&p1("change=",t.change),c1(t,a,e,t.bind)})})})}var V2=200;g.insertGlobalCss({".s-backdrop":{"&":"position:fixed inset:0 z-index:200 display:block background: rgba(0,0,0,0.55); transition: opacity 0.4s ease-in-out;","&.hidden":"opacity:0 pointer-events:none"},".s-dialog":{"&":"position:fixed z-index:200 top:50% left:50% display:flex flex-direction:column transform:translate(-50%,-50%) min-width:min(20rem,90vw) max-width:min(90vw,44rem) max-height:min(88vh,800px) r: $s-radius-lg; overflow:hidden transition: opacity 0.2s ease-out, transform 0.2s ease-out;","> header":"display:flex align-items:center gap:$2 padding: $2 $3; border:0 border-bottom: 1px solid $s-faint; r:0 font-weight:600 flex-shrink:0","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 padding: $2 $3; border:0 border-top: 1px solid $s-faint; r:0 flex-shrink:0","> div":"p:$3 gap:$3 display:flex flex-direction:column overflow-y:auto flex:1 min-height:0","&.hidden":"opacity:0 pointer-events:none transform: translate(-50%, calc(-50% + 20px)); pointer-events:none"}});var i1=g.proxy({}),d0=0,W1=g.derive(()=>{let t=Object.keys(i1);if(t.length)return t[t.length-1]});function N1(){return W1.value!=null}K(()=>{g.onEach(i1,({resolve:t,opts:a},e)=>{let h=()=>{delete i1[e]};g.clean(()=>{a.onClose?.(),t()});let p=document.activeElement;g.clean(()=>{p instanceof HTMLElement&&document.contains(p)&&p.focus()});let r=g.derive(()=>W1.value!=e),o=g("div.s-backdrop create=hidden destroy=hidden .hidden=",r,"click=",()=>{a.allowCancel!==!1&&h()}),d=`s-dialog-title-${e}`,n=g("div.s-dialog.neutral.s-s.extra-shadow role=dialog create=hidden destroy=hidden",a.attrs,()=>{if(!a.keyboardTransparent){let V=g();g.clean(s2()),g("aria-modal=true"),g("keydown=",b=>n0(V,b))}let i=v2();g(()=>{let V=a.allowCancel!==!1;O("esc",V?"Close this dialog":void 0,V?h:()=>{},i)}),g(()=>{a.header!=null&&(g("aria-labelledby=",d),g("header.s-s.neutral id=",d,a.headerAttrs,()=>l(a.header)))}),g("div",a.contentAttrs,()=>{l(a.content,h)}),g(()=>{a.footer!=null&&g("footer.s-s.neutral",a.footerAttrs,()=>l(a.footer))})}),c=0;g(()=>{let i=Object.keys(i1).indexOf(e);i>=0&&(c=i),o.style.zIndex=`${V2+2*c}`,n.style.zIndex=`${V2+2*c+1}`}),requestAnimationFrame(()=>{g.peek(()=>W1.value)===e&&document.body.contains(n)&&o1(n)})},(t,a)=>+a)});function n0(t,a){if(a.key!=="Tab"||a.altKey||a.ctrlKey||a.metaKey)return;let e=F1(t),h=a.shiftKey?e[0]:e[e.length-1];!h||document.activeElement!==h||(a.preventDefault(),(a.shiftKey?e[e.length-1]:e[0]).focus())}function s1(t){let a=++d0;return t.cancelWithScope!==!1&&g.clean(()=>{delete i1[a]}),new Promise(e=>{i1[a]={resolve:e,opts:t}})}function c0(t,a={}){return s1({header:"Alert",allowCancel:!0,content:e=>{g("p",()=>{g("#",t)}),h1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"OK",click:e})}})},...a})}function i0(t,a={}){return new Promise(e=>{let h=!1;s1({header:"Confirm",allowCancel:!0,content:p=>{g("p",()=>{g("#",t)}),h1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"Cancel",attrs:".neutral",click:p}),B({content:"OK",click:()=>{h=!0,p()}})}})},...a,onClose:()=>{e(h),a.onClose?.()}})})}function s0(t,a="",e={}){return new Promise(h=>{let p=null;s1({header:"Input",allowCancel:!0,content:r=>{g("p",()=>{g("#",t)});let o=g.proxy({value:a});g("form display:contents",()=>{g("submit=",d=>{d.preventDefault(),p=o.value,r()}),U1({bind:g.ref(o,"value")}),h1({layout:"spaced",attrs:"align-self:flex-end",content:()=>{B({content:"Cancel",attrs:".neutral",type:"button",click:r}),B({content:"OK",type:"submit"})}})})},...e,onClose:()=>{h(p),e.onClose?.()}})})}t1.insertGlobalCss({".s-keyhelp":{"&":"display:flex flex-direction:column gap:$1 min-width:14rem","> div":"display:flex align-items:baseline justify-content:space-between gap:$4",kbd:"font-family:inherit font-size:0.85em fg:$s-muted white-space:nowrap border: 1px solid $s-faint; r:$s-radius-sm padding: 0 0.4em;"}});var V1=null;function G1(){if(V1){V1();return}let t=u2(document.activeElement);s1({header:"Keyboard shortcuts",cancelWithScope:!1,keyboardTransparent:!0,onClose:()=>{V1=null},content:a=>{V1=a;let e=h=>{h.repeat||["Control","Shift","Alt","Meta","Escape","?"].includes(h.key)||a()};document.addEventListener("keydown",e,!0),t1.clean(()=>document.removeEventListener("keydown",e,!0)),t1("div.s-keyhelp",()=>{for(let[h,p]of t)p.description!==void 0&&t1("div",()=>{t1("span",()=>l(p.description)),t1("kbd text=",D(h))})})}})}var k2=t1.proxy(!0);function l0(t){k2.value=t}t1(()=>{k2.value&&(O("?",void 0,G1,"global"),O("mod+?","This overview",G1,"global"))});import M from"aberdeen";M.insertGlobalCss({".s-ac":{"> .s-control":"display:flex flex-wrap:wrap align-items:center gap:$1 background: color-mix(in oklab, $s-bg, $s-text 4%); color:$s-text border: 1px solid $s-faint; r:$s-radius padding: 0.3em 0.4em; cursor:text; transition: border-color 0.15s, box-shadow 0.15s;","> .s-control:hover":"border-color: color-mix(in oklab, $s-text, $s-bg 55%);","> .s-control:focus-within":"border-color:$s-accent box-shadow: 0 0 0 3px $s-focus;","&[aria-invalid=true] > .s-control":"border-color:$s-danger",".s-chip":"display:inline-flex align-items:center gap:$1 font-size:0.85em background: color-mix(in oklab, $s-bg, $s-text 10%); border: 1px solid $s-faint; r:$s-radius padding: 0.1em 0.2em 0.1em 0.5em;",".s-chip > button":"cursor:pointer border:0 background:transparent fg:$s-muted font-size:1.1em line-height:1 padding: 0 0.2em; r:4px",".s-chip > button:hover":"fg:$s-text background:$s-faint",input:"flex:1 min-width:6ch border:0 background:transparent color:inherit outline:none padding:0.25em"},".s-ac-menu.s-s":{"&":"position:fixed max-height:15rem overflow-y:auto list-style:none p:$1 margin:0",li:"margin:0",".s-option":"padding: 0.45em 0.6em; r:6px cursor:pointer transition: background 0.1s;",".s-option[aria-selected=true]":"background: color-mix(in srgb, $s-text 10%, transparent);",".s-add":"fg:$s-accent font-style:italic",".s-empty":"padding: 0.45em 0.6em; fg:$s-muted"}});var k1=M.proxy({cur:null});function M0(t,a){t.style.maxHeight="";let p=t.offsetHeight,r=window.innerHeight-a.bottom-4-8,o=a.top-4-8,d=p>r&&o>r;t.style.left=`${a.left}px`,t.style.width=`${a.width}px`,t.style.maxHeight=`${Math.min(p,Math.max(d?o:r,60))}px`,t.style.top=d?"auto":`${a.bottom+4}px`,t.style.bottom=d?`${window.innerHeight-a.top+4}px`:"auto"}K(()=>{let t=k1.cur;if(!t)return;let a,e=M("ul.s-ac-menu.s-s.neutral.shadow role=listbox",`id=${t.id} z-index:${t.zIndex}`,()=>{M("mousedown=",h=>h.preventDefault()),t.draw(),a?.()});a=d1(t.anchor,h=>M0(e,h))});function x0(t){let a=[];for(let e of t.matchAll(/\p{N}+|\p{Lu}+(?=\p{Lu}\p{Ll})|\p{Lu}?\p{Ll}+|\p{Lu}+/gu))a.push(e.index);return a}function L2(t,a){let e=a.toLowerCase().split(/\s+/).filter(Boolean).sort((r,o)=>o.length-r.length);if(!e.length)return!0;let h=x0(t),p=[];return e.every(r=>{let o=h.findIndex((d,n)=>!p[n]&&t.slice(d,d+r.length).toLowerCase()===r);return o<0?!1:(p[o]=!0,!0)})}function v0(t){return typeof t=="string"?{value:t,label:t}:{value:t.value,label:t.label??t.value}}function m0(t){let a=J("ac-menu"),e=M.proxy({query:"",open:!1,active:0}),h=()=>(typeof t.options=="function"?t.options():t.options).map(v0),p=()=>{let m=t.bind?.value;return m==null||m===""?[]:Array.isArray(m)?m:[m]},r=m=>h().find(H=>H.value===m)?.label??m,o=m=>m?h().find(H=>H.label.toLowerCase()===m.toLowerCase())?.value??m:"";if(!t.multi){let m=t.bind?M.peek(t.bind,"value"):void 0;typeof m=="string"&&m&&(e.query=M.peek(()=>r(m)))}let d=()=>{let m=new Set(p()),H=h();t.multi&&(H=H.filter(f=>!m.has(f.value)));let A=e.query.trim();return A&&(H=H.filter(f=>(t.match??L2)(f.label,A))),H},n=(m,H)=>{if(t.multi){let A=Array.isArray(t.bind?.value)?[...t.bind.value]:[];A.includes(m)||A.push(m),t.bind&&(t.bind.value=A),e.query=""}else t.bind&&(t.bind.value=m),e.query=r(m),e.open=!1;e.active=0,H?.focus()},c=m=>{if(!t.bind)return;let H=t.bind.value??[];t.bind.value=H.filter(A=>A!==m)},i,V=()=>{let m=d(),H=e.query.trim(),A=t.allowCustom!==!1&&H!==""&&!m.some(f=>f.label.toLowerCase()===H.toLowerCase());m.forEach((f,P)=>{M("li.s-option role=option",`id=${a}-opt-${P}`,()=>{M(()=>M("aria-selected=",e.active===P?"true":"false")),M("#",f.label),M("click=",()=>n(f.value,i)),M("mousemove=",()=>{e.active=P})})}),A&&M("li.s-option.s-add role=option",()=>{M("#",`Add "${H}"`),M("click=",()=>n(H,i))}),m.length===0&&!A&&M("li.s-empty #No matches")};Y(t,(m,H)=>{M("div.s-ac",t.inputAttrs,()=>{M(()=>M("aria-invalid=",H()?"true":"false"));let A=M("div.s-control",()=>{M("click=",()=>i?.focus()),M(()=>{if(t.multi)for(let f of p())M("span.s-chip",()=>{M("span #",M.peek(()=>r(f))),M("button type=button aria-label=",`Remove ${f}`,()=>{M("#\xD7"),M("click=",P=>{P.stopPropagation(),c(f),i?.focus()})})})}),i=M("input type=text role=combobox autocomplete=off",()=>{M("id=",m,`aria-controls=${a} aria-autocomplete=list`),t.placeholder!=null&&M("placeholder=",t.placeholder),t.disabled&&M("disabled=true"),t.required&&M("aria-required=true"),M("bind=",M.ref(e,"query")),M(()=>M("aria-expanded=",e.open?"true":"false")),M(()=>{let P=d()[e.active];M("aria-activedescendant=",e.open&&P?`${a}-opt-${e.active}`:"")}),M("input=",()=>{e.open=!0,e.active=0}),M("focus=",()=>{e.open=!0}),M("blur=",()=>{setTimeout(()=>E(),150)}),M("keydown=",f=>b(f,i))})});M(()=>{if(!e.open)return;let f=A.closest(".s-dialog")?350:150;k1.cur={id:a,anchor:A,zIndex:f,draw:V},M.clean(()=>{k1.cur?.id===a&&(k1.cur=null)})}),M(()=>{if(t.name)if(t.multi)for(let f of p())M("input type=hidden",()=>{M("name=",t.name),M("value=",f)});else M("input type=hidden",()=>{M("name=",t.name),M("value=",p()[0]??"")})})})});function b(m,H){let A=d(),f=A.length-1;if(m.key==="ArrowDown")m.preventDefault(),e.open=!0,e.active=Math.min(f,e.active+1);else if(m.key==="ArrowUp")m.preventDefault(),e.active=Math.max(0,e.active-1);else if(m.key==="Enter"){m.preventDefault();let P=e.query.trim(),j=e.open?A[e.active]:void 0;j?n(j.value,H):t.allowCustom!==!1&&(P||!t.multi)?n(o(P),H):e.open&&(e.open=!1)}else if(m.key==="Escape")e.open&&(m.preventDefault(),e.open=!1);else if(m.key==="Backspace"&&t.multi&&e.query===""){let P=p();P.length&&c(P[P.length-1])}}function E(){e.open=!1,t.multi?e.query="":t.allowCustom!==!1?n(o(e.query.trim())):e.query=r(p()[0]??"")}}import r1 from"aberdeen";import u0 from"aberdeen";var v1={size:24,color:"currentColor",strokeWidth:2,cap:"round",join:"round"};function y0(t,a){let e=a.size??v1.size,h=u0('svg.s-icon aria-hidden=true viewBox="0 0 24 24" fill=none',"width=",e,"height=",e,"stroke=",a.color??v1.color,"stroke-width=",a.strokeWidth??v1.strokeWidth,"stroke-linecap=",a.cap??v1.cap,"stroke-linejoin=",a.join??v1.join,a.attrs);h.innerHTML=t}function T(t){return(a={})=>y0(t,a)}var C2=T('<path d="m9 18 6-6-6-6" />');var z2=T('<circle cx="12" cy="12" r="10" />');var $2=T('<path d="M15 3h6v6" /><path d="M10 14 21 3" /><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />');var S2=T('<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />');var L1=T('<path d="M4 5h16" /><path d="M4 12h16" /><path d="M4 19h16" />');var P2=T('<path d="M12 17v5" /><path d="M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89" /><path d="m2 2 20 20" /><path d="M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11" />'),X1=T('<path d="M12 17v5" /><path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" />');var E2=T('<path d="M22 2 2 22" />');var l1=T('<path d="M18 6 6 18" /><path d="m6 6 12 12" />');r1.insertGlobalCss({".s-box":{"&":"display:flex flex-direction:column overflow:hidden r: $s-radius-lg; position:relative","&:not(:first-child)":"margin-top: $3","> header":"display:flex align-items:center gap:$2 padding: $2 $3; border:0 border-bottom: 1px solid $s-faint; r:0 font-weight:600","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 padding: $2 $3; border:0 border-top: 1px solid $s-faint; r:0","> div":"p:$3 gap:$3","> header > .s-box-close":"margin-left:auto","> .s-box-close":"position:absolute top:$2 right:$2 z-index:1"}});function f0(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t;r1("section.s-box.s-s.neutral.shadow",a.attrs,()=>{r1(()=>{a.header!=null?r1("header.s-s.neutral",a.headerAttrs,()=>{l(a.header),typeof a.close=="function"&&O2(a.close)}):typeof a.close=="function"&&O2(a.close)}),r1("div",a.contentAttrs,()=>{l(a.content)}),r1(()=>{a.footer!=null&&r1("footer.s-s.neutral",a.footerAttrs,()=>l(a.footer))})})}function O2(t){x1({icon:l1,ariaLabel:"Close",click:t,attrs:".s-box-close"})}import _1 from"aberdeen";function g0(t){_1(()=>{let a=t.bind.value;h1({attrs:t.attrs,buttons:Object.entries(t.options).map(([e,h])=>({content:h,ariaLabel:typeof h=="function"?e:void 0,attrs:a===e?".primary":".neutral",click:()=>{t.bind.value=t.allowDeselect&&a===e?void 0:e}}))})}),t.name&&_1(()=>_1("input type=hidden name=",t.name,"value=",t.bind.value??""))}import S from"aberdeen";S.insertGlobalCss({".s-check":{"&":"display:flex flex-direction:column gap:$1","> label":"display:flex align-items:center gap:$2 cursor:pointer user-select:none","> label:has(input:disabled)":"cursor:not-allowed opacity:0.45 filter:saturate(0.6)",input:"cursor:inherit m:0"}});function b0(t={}){let a=t.id??J("check");S("div.s-check",t.attrs,()=>{S("label for=",a,()=>{S("input type=checkbox",t.inputAttrs,()=>{S("id=",a),t.name&&S("name=",t.name),t.checked&&!t.bind&&S("checked=true"),t.change&&S("change=",t.change),S(()=>{t.disabled&&S("disabled=true")}),S(()=>{t.required&&S("aria-required=true")}),t.bind&&S("bind=",t.bind)}),S(()=>{t.label!=null&&l(t.label),t.required&&S("span.s-req aria-hidden=true #*")})}),S(()=>{t.help!=null&&!t.error&&S("div.s-help",()=>l(t.help))}),S(()=>{t.error&&S("div.s-error role=alert #",t.error)})})}import W from"aberdeen";W.insertGlobalCss({".s-form":{"&":"display:flex flex-direction:column gap:$3","&.grid":"display:grid grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap:$3","&.grid > .s-wide, &.grid > footer":"grid-column: 1 / -1;","&.grid > .s-field":"align-self: start","> footer":"display:flex align-items:center justify-content:flex-end gap:$2 flex-wrap:wrap margin-top:$1"}});function w0(t={}){let a=typeof t=="string"||typeof t=="function"?{content:t}:t,e=W.proxy({value:!1});W("form.s-form",a.attrs,()=>{W(()=>{W(".grid=",a.layout==="grid")}),W(()=>{e.value&&W(".s-busy aria-busy=true")}),W("submit=",h=>{if(h.preventDefault(),a.submit&&!e.value){let p=new FormData(h.target),r={};for(let d of new Set(p.keys())){let n=p.getAll(d);r[d]=n.length===1?n[0]:n}let o=a.submit(r,h);if(o&&typeof o.then=="function"){e.value=!0;let d=()=>{e.value=!1};Promise.resolve(o).then(d,n=>{throw d(),n})}}}),l(a.content),W(()=>{a.actions&&W("footer",a.actionsAttrs,()=>l(a.actions))})})}import x from"aberdeen";import{current as o2}from"aberdeen/route";import y from"aberdeen";import{matchCurrent as k0,current as z1,go as q2}from"aberdeen/route";import $ from"aberdeen";import{grow as H0,shrink as A0}from"aberdeen/transitions";$.insertGlobalCss({".s-toasts":"position:fixed bottom:$3 right:$3 z-index:400 display:flex flex-direction:column gap:$2 pointer-events:none max-width:min(90vw,24rem) w:24rem",".s-toast":{"&":"display:flex align-items:flex-start gap:$2 padding: $3; pointer-events:auto position:relative overflow:hidden",".s-toast-body":"display:flex flex-direction:column gap:$1 flex:1 min-width:0",".s-toast-title":"font-weight:700 line-height:1.3",".s-toast-close":"cursor:pointer border:0 background:transparent fg:$s-muted font-size:1.1em line-height:1 padding: 0 0.15em; r:4px flex-shrink:0 align-self:flex-start",".s-toast-close:hover":"fg:$s-text",".s-toast-close:focus-visible":"outline:none box-shadow: 0 0 0 3px $s-focus; fg:$s-text",".s-toast-progress":"position:absolute bottom:0 left:0 right:0 height:2px background:$s-accent width:100%"}});var V0=0,m1=$.proxy({});K(()=>{$.peek(()=>$.isEmpty(m1))&&$.isEmpty(m1)||$("div.s-toasts",()=>{$.onEach(m1,t=>{let{opts:a,id:e}=t,h=a.type==="danger"||a.type==="warning"?"alert":"status",p=a.type==null||a.type==="neutral"?"neutral":a.type,r=a.duration??6e3,o,d=null,n=()=>{clearTimeout(o),d&&(d.style.transition="none",d.style.width="100%",d.offsetWidth,d.style.transition=`width ${r}ms linear`,d.style.width="0%"),o=setTimeout(()=>j1(e),r)},c=()=>{clearTimeout(o),o=void 0,d&&(d.style.transition="none",d.style.width="100%")};$.clean(()=>clearTimeout(o)),$(`div.s-toast.s-s.${p}.extra-shadow aria-live=polite role=${h}`,"create=",H0,"destroy=",A0,a.attrs,()=>{r>0&&($("mouseenter=",c),$("mouseleave=",n)),$("div.s-toast-body",()=>{$(()=>{a.title!=null&&$("div.s-toast-title",()=>l(a.title))}),$("div.s-toast-msg",()=>l(a.message))}),$(()=>{a.dismissible!==!1&&$("button.s-toast-close type=button aria-label=Dismiss",()=>{$("#\xD7"),$("click=",()=>j1(e))})}),r>0&&(d=$("div.s-toast-progress"))}),r>0&&requestAnimationFrame(n)})})});function j1(t){delete m1[t]}function C1(t){let a=++V0;return m1[a]={id:a,opts:t},()=>j1(a)}y.insertGlobalCss({".s-menu-list":"position:fixed z-index:350 min-width:10rem display:flex flex-direction:column p:$1 r:$s-radius-lg max-width: calc(100vw - 16px); overflow-y:auto max-height:min(80vh,28rem) transition: opacity 0.15s, transform 0.15s, visibility 0s;",".s-menu-list.hidden":"opacity:0 pointer-events:none transform:translateY(-6px) visibility:hidden transition: opacity 0.15s, transform 0.15s, visibility 0.15s;",".s-menu-item":"display:flex align-items:center gap:$2 w:100% scroll-margin:$2 padding: $m2 0; line-height:1.1 r:$s-radius cursor:pointer text-align:left font-weight:450 font-size:0.9em border:0 background:transparent fg:$s-text text-decoration:none transition: color 0.12s, transform 0.12s, text-shadow 0.12s;",".s-menu-item:focus-visible:not([aria-current=page]), .s-menu-item:hover:not([aria-disabled=true]):not([aria-current=page])":"filter:none color: color-mix(in lab, $s-primary 33%, $s-text);",".s-menu-item:focus-visible":"outline-offset:-2px background: color-mix(in srgb, $s-accent 14%, transparent);",".s-menu-item[aria-current=page]":"color:$s-accent filter:none",".s-menu-list .s-menu-item":"padding-inline:$2",".s-menu-item[aria-disabled=true]":"opacity:0.45 cursor:not-allowed pointer-events:none",".s-menu-icon":"flex-shrink:0",".s-menu-list .s-menu-icon":"display:flex",".s-menu-list .s-menu-icon > svg":"width:1.25em height:1.25em","hr.s-menu-sep":"border:0 height:1px margin: $1 0.6rem; background: linear-gradient(to right, transparent, $s-faint 18%, $s-faint 82%, transparent);",".s-menu-key":"margin-left:auto padding-left:$2 font-family:inherit font-size:0.8em opacity:0.55 white-space:nowrap flex-shrink:0","@media (hover: none) and (pointer: coarse)":{".s-menu-key":"display:none"},".s-menu-tt-key":"font-family:inherit font-size:0.85em opacity:0.7 white-space:nowrap",".s-tt-tip hr.s-menu-sep":"margin: 0.35em 0;",".s-menu-chevron":"margin-left:auto flex-shrink:0 display:flex transition: transform 0.15s ease;",".s-menu-key + .s-menu-chevron":"margin-left:0",".s-menu-chevron > svg":"width:1em height:1em",".s-menu-details":{"> summary":"list-style:none","> summary::-webkit-details-marker":"display:none","&::details-content":"interpolate-size:allow-keywords block-size:0 overflow-y:clip transition: block-size 0.15s ease, content-visibility 0.15s allow-discrete;","&[open]::details-content":"block-size:auto","&[open] > summary .s-menu-chevron":"transform:rotate(90deg)"},".s-menu-sub":"display:flex flex-direction:column gap:$1 padding-left:$3",".s-menu-inline":"display:flex flex-direction:column gap:$1"});function u1(t,a,e){y("keydown=",h=>{if(h.key==="Enter"&&!h.ctrlKey&&!h.metaKey&&!h.shiftKey&&!h.altKey&&h.target.tagName==="A"){queueMicrotask(()=>a?.());return}if(h.key!=="ArrowDown"&&h.key!=="ArrowUp"&&h.key!=="Home"&&h.key!=="End")return;h.preventDefault();let r=[...h.currentTarget.querySelectorAll(".s-menu-item")].filter(c=>c.getAttribute("aria-disabled")!=="true"&&!z0(c));if(!r.length)return;let o=r.indexOf(document.activeElement),d=h.key==="ArrowUp"?-1:1,n=h.key==="Home"?0:h.key==="End"?r.length-1:o<0?d>0?0:r.length-1:(o+d+r.length)%r.length;r[n].focus()}),R2(t,{onLeafSelect:a,keyHints:e,$hasCurrent:y.derive(()=>Q1(t))})}function R2(t,a){for(let e of t){if(typeof e=="string"||typeof e=="function"){l(e);continue}if("separator"in e){y("hr.s-menu-sep");continue}e.items?C0(e,a):L0(e,a)}}function L0(t,a){let e=!1,h=y(t.href?"a.s-menu-item data-panel=open":"button.s-menu-item type=button",t.attrs,()=>{t.href&&(y("href=",t.href),t.target&&y("target=",t.target),y(()=>{let p=!e;e=!0,J1(t)&&(y("aria-current=page"),requestAnimationFrame(()=>h.scrollIntoView({block:"nearest",behavior:p?"instant":"smooth"})))})),t.disabled&&y("aria-disabled=true"),t.key&&y("aria-keyshortcuts=",D(t.key,!0)),y("click=",p=>{if(t.disabled){p.preventDefault();return}a.onLeafSelect?.(),t.click?.(p)}),t.icon&&y("span.s-menu-icon",()=>l(t.icon)),l(t.label),B2(t,a)})}var D2=new Map;function T2(t,a){return D2.set(t,a),a}function C0(t,a){let e=t.href??Z2(t.items),h=e!=null?y.derive(()=>Y1(t)?T2(e,!0):a.$hasCurrent.value?T2(e,!1):D2.get(e)??!1):null;y("details.s-menu-details",()=>{h&&y(()=>{h.value&&y("open=true")}),y("summary.s-menu-item.s-menu-branch",t.attrs,()=>{t.disabled&&y("aria-disabled=true"),t.key&&y("aria-keyshortcuts=",D(t.key,!0)),y(()=>{J1(t)&&y("aria-current=page")}),y("click=",p=>{if(t.disabled){p.preventDefault();return}e!=null&&(p.preventDefault(),S0(e),q2(e)),t.click?.(p)}),t.icon&&y("span.s-menu-icon",()=>l(t.icon)),l(t.label),B2(t,a),y("span.s-menu-chevron aria-hidden=true",()=>C2())}),y("div.s-menu-sub",()=>R2(t.items,a))})}function z0(t){for(let a=t.closest("details");a;a=a.parentElement&&a.parentElement.closest("details"))if(!a.open&&t.closest("summary")?.parentElement!==a)return!0;return!1}function Q1(t){return t.some(a=>typeof a!="string"&&typeof a!="function"&&!("separator"in a)&&Y1(a))}function J1(t){if(t.href!=null&&k0(t.href))return!0;let a=t.match;if(a==null)return!1;let e=z1.path;if(typeof a=="function")return a(e);let h=a.replace(/\/+$/,"")||"/";return e===h||e.startsWith(h==="/"?"/":h+"/")}function Y1(t){if(J1(t))return!0;for(let a of t.items??[])if(!(typeof a=="string"||typeof a=="function"||"separator"in a)&&Y1(a))return!0;return!1}function Z2(t){for(let a of t){if(typeof a=="string"||typeof a=="function"||"separator"in a)continue;let e=a.href??(a.items?Z2(a.items):void 0);if(e!=null)return e}}function B2(t,a){let e=a.keyHints?void 0:t.key;t.key&&!e&&y("kbd.s-menu-key aria-hidden=true text=",D(t.key)),!(t.tooltip==null&&!e)&&M1({placement:"right",tip:()=>{l(t.tooltip),e&&(t.tooltip!=null&&y("hr.s-menu-sep"),y("kbd.s-menu-tt-key aria-hidden=true text=",D(e)))}})}function y1(t,a){y(()=>{for(let e of I2(t(),[]))O(e.key,e.label,h=>{F2(),a?.(),e.click?.(h),e.href!=null&&$0(e.href,e.target)})})}function I2(t,a){for(let e of t)typeof e=="string"||typeof e=="function"||"separator"in e||(e.key&&!e.disabled&&a.push(e),e.items&&I2(e.items,a));return a}function $0(t,a){let e=new URL(t,location.href);a?window.open(e.href,a,a==="_blank"?"noopener":""):e.origin!==location.origin?location.href=e.href:q2(t)}var $1=null;function S0(t){try{$1=new URL(t,location.href).pathname.replace(/\/+$/,"")||"/"}catch{$1=null}}function t2(t){return $1!==t?!1:($1=null,!0)}var a1=y.proxy({opts:null});function _(){let t=a1.opts?.anchor;a1.opts=null,t?.focus()}function S1(t){let a=a1.opts;return a!=null&&(t==null||a.anchor===t)}function F2(t){S1(t)&&_()}function P0(t,a){let e=t.offsetWidth,h=t.offsetHeight,p=window.innerWidth,r=window.innerHeight,o=4,d=a.left;d+e>p-8&&(d=Math.max(8,a.right-e));let n=a.bottom+o;n+h>r-8&&a.top-h-o>=8&&(n=a.top-h-o),t.style.left=Math.max(8,d)+"px",t.style.top=Math.max(8,n)+"px"}function E0(t){return[{label:"Open in new tab",icon:$2,click:()=>{window.open(t,"_blank","noopener")}},{label:"Copy link",icon:S2,click:()=>{O0(t)}}]}async function O0(t){let a=new URL(t,location.href).href;try{await navigator.clipboard.writeText(a),C1({message:"Link copied."})}catch{C1({message:"Couldn't copy the link.",type:"danger"})}}K(()=>{let t=a1.opts;if(!t)return;let a=y("div.s-menu-list.s-s.neutral.shadow create=hidden destroy=hidden",t.dropdownAttrs,()=>{u1(t.link!=null?[...E0(t.link),{separator:!0},...t.items]:t.items,_,!0)}),e=r=>{let o=r.target;!a.contains(o)&&(t.closeOnAnchorClick||!t.anchor.contains(o))&&_()},h=r=>{(r.key==="Escape"||r.key==="Tab")&&(r.preventDefault(),_())},p=y.peek(z1,"path");y(()=>{z1.path!==p&&!t2(z1.path)&&_()}),document.addEventListener("click",e,!0),document.addEventListener("keydown",h,!0),y.clean(()=>{document.removeEventListener("click",e,!0),document.removeEventListener("keydown",h,!0)}),d1(t.at?new DOMRect(t.at.x,t.at.y,0,0):t.anchor,r=>P0(a,r)),requestAnimationFrame(()=>{document.body.contains(a)&&o1(a,".s-menu-item[aria-current=page]")})});function T0(t){y("nav.s-menu-inline",t.attrs,()=>{y1(()=>t.items,()=>t.onLeafSelect?.()),u1(t.items,t.onLeafSelect)})}function a2(t){return a1.opts=t,_}function e2(t){y1(()=>t.items);let a=null;y.clean(()=>{a1.opts?.anchor===a&&_()}),y("contextmenu=",e=>{e.preventDefault(),a=e.currentTarget,a2({...t,anchor:a,at:{x:e.clientX,y:e.clientY},closeOnAnchorClick:!0})})}function q0(t){y1(()=>t.items);let a=null;y.clean(()=>{a1.opts?.anchor===a&&_()}),B({icon:L1,...t.button?.content==null?{ariaLabel:"Open menu"}:null,attrs:".neutral",...t.button,click:e=>{if(a=e.currentTarget,a1.opts?.anchor===a){_();return}a2({items:t.items,anchor:a,dropdownAttrs:t.dropdownAttrs})}})}import s,{OPAQUE as U2}from"aberdeen";import*as w from"aberdeen/route";import L from"aberdeen";var R0=T('<path d="m15 18-6-6 6-6"/>'),D0=T('<path d="m9 18 6-6-6-6"/>');L.insertGlobalCss({".s-strip":{"&":"position:relative display:flex min-width:0","> .s-strip-row":"display:flex align-items:center flex:1 min-width:0 overflow-x:auto overflow-y:hidden scrollbar-width:none scroll-behavior:smooth","> .s-strip-row::-webkit-scrollbar":"display:none","> .s-strip-btn":"position:absolute top:0 bottom:0 z-index:1 display:none align-items:center justify-content:center width:2.4em border:0 padding:0 cursor:pointer fg:$s-muted transition: color 0.15s;","> .s-strip-btn:hover":"fg:$s-text","> .s-strip-btn-left":"left:0 justify-content:flex-start background: linear-gradient(to right, $s-bg 45%, transparent)","> .s-strip-btn-right":"right:0 justify-content:flex-end background: linear-gradient(to left, $s-bg 45%, transparent)","&.s-can-left > .s-strip-btn-left, &.s-can-right > .s-strip-btn-right":"display:flex"},".s-tabs":{"&":"display:flex flex-direction:column gap:$3",".s-tabbar":"border-bottom: 1px solid $s-faint;",".s-tablist":"gap:$1 align-items:stretch margin-bottom:-1px",".s-tab":"display:inline-flex align-items:center gap:$2 cursor:pointer background:transparent border:0 color: $s-muted; font-weight:600 padding: 0.6em 0.9em; white-space:nowrap border-bottom: 3px solid transparent; transition: color 0.15s, background 0.15s, border-color 0.15s;",".s-tab:hover:not(:disabled), .s-tab[aria-selected=true]":"color: $s-text;",".s-tab:focus-visible":"outline:none box-shadow: inset 0 0 0 2px $s-focus; r: $s-radius;",".s-tab[aria-selected=true]":"border-image: $s-gradient 1;",".s-tabpanel":"display:block"}});function P1(t){L("div.s-strip",t.attrs,()=>{let a=L("div.s-strip-row",t.stripAttrs,()=>l(t.content));K2(a,-1),K2(a,1),B0(a)})}function E1(t){let a=t.parentElement;if(!a||!t.isConnected)return;let e=parseFloat(getComputedStyle(a).fontSize)*2.6,h=t.getBoundingClientRect(),p=a.getBoundingClientRect(),r=h.left-p.left,o=h.right-p.right;r<e?a.scrollBy({left:r-e,behavior:"smooth"}):o>-e&&a.scrollBy({left:o+e,behavior:"smooth"})}function Z0(t){let a=J("tabs"),e=(r,o)=>r.id??String(o),h=t.bind??L.proxy(e(t.tabs[0]??{label:""},0));t.tabs.length>0&&!t.tabs.some((r,o)=>e(r,o)===L.peek(()=>h.value))&&(h.value=e(t.tabs[0],0));let p=(r,o)=>{r.disabled||(h.value=e(r,o))};L("div.s-tabs",t.attrs,()=>{P1({attrs:".s-tabbar",stripAttrs:".s-tablist role=tablist",content:()=>{t.tabs.forEach((r,o)=>{let d=e(r,o),n=L("button.s-tab type=button role=tab",()=>{L("id=",`${a}-tab-${d}`,"aria-controls=",`${a}-panel-${d}`),L(()=>{let c=h.value===d;L("aria-selected=",c?"true":"false"),L("tabindex=",c?"0":"-1"),c&&requestAnimationFrame(()=>E1(n))}),r.disabled&&L("disabled=true"),L("click=",()=>p(r,o)),L("keydown=",c=>I0(c,t.tabs,o,p)),l(r.icon),l(r.label)})})}}),L("div.s-tabpanel role=tabpanel",t.contentAttrs,()=>{L(()=>{let r=h.value,o=t.tabs.findIndex((n,c)=>e(n,c)===r),d=t.tabs[o]??t.tabs[0];d&&(L("id=",`${a}-panel-${e(d,o)}`,"aria-labelledby=",`${a}-tab-${e(d,o)}`),l(d.content))})})})}function K2(t,a){L(`button.s-strip-btn.s-strip-btn-${a<0?"left":"right"} type=button`,()=>{L("tabindex=-1 aria-hidden=true"),L("click=",()=>t.scrollBy({left:a*t.clientWidth*.8,behavior:"smooth"})),(a<0?R0:D0)({size:"1.1em"})})}function B0(t){let a=t.parentElement;if(!a||typeof ResizeObserver>"u")return;let e=()=>{let r=t.scrollWidth-t.clientWidth;a.classList.toggle("s-can-left",t.scrollLeft>1),a.classList.toggle("s-can-right",t.scrollLeft<r-1)};t.addEventListener("scroll",e,{passive:!0});let h=new ResizeObserver(e);h.observe(t);let p=typeof MutationObserver>"u"?void 0:new MutationObserver(r=>{for(let o of r){for(let d of o.addedNodes)d instanceof Element&&h.observe(d);for(let d of o.removedNodes)d instanceof Element&&h.unobserve(d)}e()});p?.observe(t,{childList:!0});for(let r of Array.from(t.children))h.observe(r);e(),L.clean(()=>{t.removeEventListener("scroll",e),h.disconnect(),p?.disconnect()})}function I0(t,a,e,h){let p=e;if(t.key==="ArrowRight"||t.key==="ArrowDown")p=(e+1)%a.length;else if(t.key==="ArrowLeft"||t.key==="ArrowUp")p=(e-1+a.length)%a.length;else if(t.key==="Home")p=0;else if(t.key==="End")p=a.length-1;else return;t.preventDefault();let r=p>=e?1:-1;for(let o=0;o<a.length;o++){let d=a[p];if(d&&!d.disabled){h(d,p),t.currentTarget?.parentElement?.children[p]?.focus();return}p=(p+r+a.length)%a.length}}var r2={integer(t){if(!/^(0|-?[1-9]\d*)$/.test(t))return;let a=Number(t);return Number.isSafeInteger(a)?a:void 0}};function N(t){let a=String(t).replace(/\/+$/,"");return a.startsWith("/")||(a=`/${a}`),a}function f1(t){let a=N(t);return a==="/"?[]:a.slice(1).split("/")}function W2(t){let a=f1(t),e=a.map((h,p)=>{if(!h.startsWith("[")||!h.endsWith("]"))return{kind:"lit",value:h};let r=/^\[\.\.\.([A-Za-z_$][\w$]*)\]$/.exec(h);if(r){if(p!==a.length-1)throw new Error(`Staffa: "${h}" must be the last segment of route "${t}"`);return{kind:"rest",name:r[1]}}let o=/^\[([A-Za-z_$][\w$]*)(?:=([A-Za-z_$][\w$]*))?\]$/.exec(h);if(!o)throw new Error(`Staffa: malformed param "${h}" in route "${t}"`);let[,d,n]=o;if(n&&!(n in r2))throw new Error(`Staffa: unknown matcher "${n}" in route "${t}" (known: ${Object.keys(r2).join(", ")})`);return{kind:"param",name:d,matcher:n}});return{key:t,segs:e}}function F0(t){try{return decodeURIComponent(t)}catch{return t}}function h2(t,a){let e={};for(let h=0;h<t.segs.length;h++){let p=t.segs[h];if(p.kind==="rest")return h>=a.length?null:(e[p.name]=a.slice(h).join("/"),e);if(h>=a.length)return null;let r=a[h];if(p.kind==="lit"){if(r!==p.value)return null}else if(p.matcher){let o=r2[p.matcher](r);if(o===void 0)return null;e[p.name]=o}else e[p.name]=F0(r)}return t.segs.length===a.length?e:null}var G=250,K0=300,U0=360,O1=540;s.insertGlobalCss({":root":`--s-panel-ms:${G}ms`,".s-panels":"flex:1 min-width:0 min-height:0 position:relative overflow:clip isolation:isolate "+Z1,".s-panel":{"&":"position:absolute top:0 bottom:0 left:0 display:flex flex-direction:column "+Z1+` z-index:2 transition: transform ${G}ms ease-out, opacity ${G}ms linear;`,"&.s-panel-sep::before":"content:'' position:absolute left:0 top:0.6rem bottom:0.6rem width:1px z-index:1 background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);","&.s-panel-new":"z-index:1","&.s-panel-closing":"z-index:0 opacity:0 pointer-events:none","&.s-panel-enter":"opacity:0","&.s-panel-hidden, &.s-panel-parked":"visibility:hidden"},".s-panel > .s-content":"flex:1 min-height:0 overflow-y:auto overflow-x:hidden p:$3",".s-panel-actions":"display:flex align-items:center justify-content:flex-end gap:$1 flex-shrink:0 padding: $3 $3 0;",".s-crumbs > .s-strip-row":"gap:$m1",".s-crumb":{"&":"flex: 1 0 4rem; font-size:0.85em line-height:1.5 fg:$s-muted text-decoration:none white-space:nowrap max-width:max-content overflow:hidden text-overflow:ellipsis transition: color 0.12s;","&.s-crumb-on":"font-weight:600 fg:$s-text","a&:hover":"filter:none color: color-mix(in lab, $s-primary 33%, $s-text);","svg.s-crumb-pin":"vertical-align:-0.12em margin-right:0.3em opacity:0.8 fill:currentColor","svg.s-crumb-unsaved":"vertical-align:0.08em margin-right:0.3em fill:currentColor"},"svg.s-crumb-sep":"flex-shrink:0 opacity:0.4",".s-main.s-shell-snap .s-panel":"transition:none",".s-panel-loading":{"&":"position:absolute inset:0 display:flex align-items:center justify-content:center gap:$1 pointer-events:none",i:"width:0.5rem height:0.5rem r:50% background:$s-muted opacity:0.45 animation: s-panel-pulse 1s ease-in-out infinite;","i:nth-child(2)":"animation-delay:0.15s","i:nth-child(3)":"animation-delay:0.3s"},"@keyframes s-panel-pulse":{"0%, 100%":"opacity:0.25 transform:scale(0.8)","50%":"opacity:0.7 transform:scale(1)"}});var p2=!1,T1=class{[U2]=!0;compiled;ancestors;opts;$state=s.proxy({live:[],focus:0});$open=s.proxy({});nextOrder=0;containerEl;geom;lastGeom;layoutQueued=!1;timers=new Set;exiting=new Set;intent=null;settling=null;lastSeen=null;queued=null;constructor(a){if(p2)throw new Error("Staffa: only one routed S.main() (one with `routes`) can be active at a time");p2=!0,this.opts=a,this.compiled=Object.entries(a.routes).map(([e,h])=>({...W2(e),draw:h})),this.ancestors=Object.entries(a.ancestors??{}).filter(e=>e[1]!=null).map(([e,h])=>({...W2(e),fn:h})),s(()=>{let e=this.computeTarget(),h={...w.current.search},p=w.current.hash;s.peek(()=>{let r=this.lastSeen;if(r&&r.path!==w.current.path){let o=this.$state.live.find(d=>d.path===r.path);o&&(o.search=r.search,o.hash=r.hash)}this.lastSeen={path:w.current.path,search:h,hash:p},this.propose(e),Array.isArray(w.current.state.panels)||Object.assign(w.current.state,this.stateFor({stack:this.paths(),focus:this.$state.focus}))})}),this.interceptLinks(),this.watchTitle(),this.guardTabClose(),s.clean(()=>{for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.queued?.settle(!1),this.queued=null,p2=!1})}resolve(a){let e=f1(a);for(let h of this.compiled){let p=h2(h,e);if(p)return{draw:h.draw,params:p}}return{draw:this.opts.notFound??G0,params:{}}}matches(a){let e=f1(a);return this.compiled.some(h=>h2(h,e)!=null)}deriveStack(a){let e=N(a),h=this.askAncestors(e),p=h?h.map(N):this.prefixesOf(e),r=[];for(let o of p)o!==e&&!r.includes(o)&&this.matches(o)&&r.push(o);return r.push(e),r}askAncestors(a){let e=f1(a);for(let h of this.ancestors){let p=h2(h,e);if(p)return h.fn(p,a)??void 0}}prefixesOf(a){let e=f1(a),h=[];for(let p=1;p<e.length;p++)h.push("/"+e.slice(0,p).join("/"));return h}pinnedIn(a,e){return a.filter(h=>e.includes(h)?!1:this.$state.live.find(p=>p.path===h)?.$panel.pinned===!0)}unsavedAt(a){return this.$state.live.find(e=>e.path===a)?.$panel.unsaved===!0}targetFor(a,e){let h=Array.isArray(e?.panels)?e.panels.map(String):null;if(h){let p=Array.isArray(e.parked)?e.parked.map(String):[],r=N(a),o=new Set([r]),d=c=>c.map(N).filter(i=>!o.has(i)&&!!o.add(i)),n=d(h);return{stack:[...n,r,...d(p)],focus:n.length}}return s.peek(()=>{let p=this.deriveStack(a).slice(0,-1),r=[...p,...this.pinnedIn(this.paths(),[...p,N(a)]),N(a)];return{stack:r,focus:r.length-1}})}computeTarget(){return this.targetFor(w.current.path,w.current.state)}paths(){return this.$state.live.map(a=>a.path)}propose(a){let e=this.$state.live.filter(h=>!a.stack.includes(h.path)&&h.$panel.unsaved).map(h=>h.path);e.length&&(a={stack:[...a.stack,...e],focus:a.focus}),!(N2(this.paths(),a.stack)&&a.focus===this.$state.focus)&&this.commit(a,w.current.nav)}commit(a,e){this.geom=void 0;let h=w.current.state.pinned,p=new Set(Array.isArray(h)?h.map(String):[]),r=new Map(this.$state.live.map(n=>[n.path,n])),o=[];for(let n of a.stack){let c=r.get(n);if(c){r.delete(n),o.push(c);continue}let i=this.createEntry(n,o.length<=a.focus,p.has(n));e!=="load"&&(i.enter=!0),o.push(i),this.$open[n]=i}let d;for(let n of this.$state.live)r.has(n.path)?this.beginClose(n,d):d=n.path;this.$state.live=o,this.$state.focus=Math.min(a.focus,o.length-1),this.scheduleLayout()}createEntry(a,e,h){let{draw:p,params:r}=this.resolve(a),o={[U2]:!0,order:this.nextOrder++,path:a,draw:p,$ui:s.proxy({holding:!1}),maxWidth:"medium",width:0};return o.$panel=s.proxy({stack:this,params:r,path:a,width:0,visible:e,pinned:h||void 0,close:()=>this.closePath(o.path),open:(d,n)=>this.navigate(d,{from:o.path,how:n})}),o}beginClose(a,e){a.closing=!0,a.anchor=e,a.$panel.visible=!1,delete this.$open[a.path]}playExit(a,e){if(!a.closing){e.remove();return}e.classList.add("s-panel-closing"),e.setAttribute("inert","");let h=a.placed?{el:e,anchor:a.anchor,ride:0}:null;h&&this.exiting.add(h),this.afterTransition(e,"opacity",()=>{h&&this.exiting.delete(h),e.remove()})}afterTransition(a,e,h){let p=!1,r=setTimeout(()=>d(),G+80);this.timers.add(r);let o=()=>{clearTimeout(r),this.timers.delete(r)},d=()=>{o(),p||(p=!0,h())},n=c=>i=>{i.target===a&&i.propertyName===e&&c()};a.addEventListener("transitionrun",n(o)),a.addEventListener("transitionend",n(d)),a.addEventListener("transitioncancel",n(d))}intended(){return this.intent??{stack:this.paths(),focus:this.$state.focus}}stateFor(a){return{panels:a.stack.slice(0,a.focus),parked:a.stack.slice(a.focus+1),pinned:this.pinnedPaths()}}pinnedPaths(){return this.$state.live.filter(a=>a.$panel.pinned).map(a=>a.path)}issue(a,e){return this.intent=a,this.settling?(this.queued?.settle(!1),new Promise(h=>{this.queued={run:e,settle:h}})):this.start(e)}start(a){let e=p=>{this.settling=null;let r=this.queued;return this.queued=null,p&&r?this.start(r.run).then(r.settle,()=>r.settle(!1)):(this.intent=null,r?.settle(!1)),p},h=Promise.resolve(a()).then(e,p=>(console.error(p),e(!1)));return this.settling=h,h}focusAt(a){let e=this.intended();if(a<0||a>=e.stack.length||a===e.focus)return Promise.resolve(!1);let h={stack:e.stack,focus:a},p=e.stack[a];return this.issue(h,()=>{let r=this.$state.live.find(o=>o.path===p);return w.go({path:p,search:r?.search,hash:r?.hash,state:this.stateFor(h)})})}back(){return s.peek(()=>{let a=this.intended();return a.focus===a.stack.length-1&&!this.unsavedAt(a.stack[a.focus])?this.closePath(a.stack[a.focus]??""):a.focus===0?Promise.resolve(!1):this.focusAt(a.focus-1)})}closePath(a){return s.peek(()=>{let e=this.intended(),h=e.stack.indexOf(N(a));if(h<0||e.stack.length<2||this.unsavedAt(e.stack[h]))return Promise.resolve(!1);let p=e.stack.filter((c,i)=>i!==h),r=h===e.focus?Math.max(0,h-1):e.focus-(h<e.focus?1:0),o={stack:p,focus:r};if(h===e.focus&&h===e.stack.length-1){let c=this.$state.live.find(b=>b.path===p[r]),i={};c?.search&&(i.search=c.search),c?.hash&&(i.hash=c.hash);let V=p.filter(b=>this.$state.live.find(E=>E.path===b)?.$panel.pinned===!0);return this.issue(o,()=>Promise.resolve(w.back({path:p[r],state:{panels:p.slice(0,r),parked:[]}},i)).then(b=>(b&&(w.current.state.pinned=V),b)))}let d=p[r],n=d!==e.stack[e.focus];return this.issue(o,()=>{let c=n?this.$state.live.find(i=>i.path===d):void 0;return w.go({path:d,search:n?c?.search:{...w.current.search},hash:n?c?.hash:w.current.hash,state:this.stateFor(o)})})})}navigate(a,{from:e,how:h,beneath:p}={}){let r=h??this.opts.linkNavigation,o=r==="open"?null:e??null,d=r==="replace";return s.peek(()=>{let n;try{n=new URL(a,location.href)}catch{return Promise.resolve(!1)}let c=N(n.pathname),i=this.intended(),V=p?-1:i.stack.indexOf(c),b;if(V>=0&&r!=="replace"&&r!=="open"){let f=this.pinnedIn(i.stack.slice(V+1),[]);b={stack:[...i.stack.slice(0,V+1),...f],focus:V}}else{let f=o==null?-1:i.stack.indexOf(o),j=(p?p.map(N):f<0?this.deriveStack(c).slice(0,-1):i.stack.slice(0,d?f:f+1)).filter((Q,v,u)=>Q!==c&&u.indexOf(Q)===v),I=[...j,...this.pinnedIn(i.stack,[...j,c,d?o:null])];b={stack:[...I,c],focus:I.length}}let E=V>=0?this.$state.live.find(f=>f.path===c):void 0,m=n.search?Object.fromEntries(new URLSearchParams(n.search)):E?.search??{},H=n.hash||E?.hash||"";if(b.focus===i.focus&&N2(b.stack,i.stack)&&n.search===location.search&&(n.hash||"")===(location.hash||""))return Promise.resolve(!0);let A=this.stateFor(b);return d?this.issue(b,()=>(w.current.path=c,w.current.search=m,w.current.hash=H,w.current.state=A,s.runQueue(),w.current.path===c)):this.issue(b,()=>w.go({path:c,search:m,hash:H,state:A}))})}pushPath(a,e){return s.peek(()=>{let h=this.intended();return this.navigate(a,{from:h.stack[h.focus],how:e?"replace":"push"})})}interceptLinks(){w.interceptLinks((a,e,h)=>{if(h instanceof KeyboardEvent&&(h.ctrlKey||h.metaKey||h.shiftKey||h.altKey))return!1;let p=e.getAttribute("data-panel")??void 0,r=e.closest(".s-panel"),o=r?this.$state.live.find(d=>d.el===r):e.closest(".s-panel-origin")?this.$state.live[this.$state.focus]:void 0;return this.navigate(a.href,{from:o?.path,how:p}),!0})}get currentPanel(){return this.$state.live[this.$state.focus]?.$panel}get panels(){return this.$state.live.map(a=>a.$panel)}get currentPanelIndex(){return this.$state.focus}pushPanel(a){return this.pushPath(a,!1)}replacePanel(a){return this.pushPath(a,!0)}openPanelStack(a,e){return this.navigate(a,{how:"open",beneath:e})}closePanel(a){return s.peek(()=>{let e=this.intended();return this.closePath(a??e.stack[e.focus]??"")})}setColumns(a){this.opts.columns!==a&&(this.opts.columns=a,this.scheduleLayout())}setAlignment(a){this.opts.alignment!==a&&(this.opts.alignment=a,this.scheduleLayout())}setLinkNavigation(a){this.opts.linkNavigation=a}drawCrumbs(){P1({attrs:".s-crumbs role=navigation aria-label=Breadcrumbs",content:()=>{s(()=>{let a=this.panels.map(p=>p.path),e=this.currentPanelIndex,h;for(let p=0;p<a.length;p++){p&&E2({size:"0.85em",attrs:".s-crumb-sep"});let r=this.drawCrumb(a[p],p,p===e);p===e&&(h=r)}requestAnimationFrame(()=>{h&&E1(h)})})}})}drawCrumb(a,e,h){let p=this.$state.live[e];return s(h?"span.s-crumb aria-current=page":"a.s-crumb",()=>{h||s("href=",a),s(()=>{p?.$panel.visible&&s(".s-crumb-on")}),s(()=>{p?.$panel.unsaved&&z2({size:"0.45em",attrs:".s-crumb-unsaved"})}),s(()=>{p?.$panel.pinned&&X1({size:"0.85em",attrs:".s-crumb-pin"})}),s(()=>{s("#",p?.$panel.title??p?.$ui.fallback??(a.split("/").pop()||a))}),e2({link:a,items:[{label:()=>{s(()=>{s("#",p?.$panel.pinned?"Unpin":"Pin")})},icon:()=>{s(()=>{(p?.$panel.pinned?P2:X1)()})},click:()=>{p&&this.togglePin(p)}},{label:"Close",icon:l1,disabled:p?.$panel.unsaved===!0,click:()=>{this.closePath(a)}}]})})}togglePin(a){a.$panel.pinned=!a.$panel.pinned||void 0,w.current.state.pinned=this.pinnedPaths()}watchTitle(){let a=document.title;s(()=>{let e=this.$state.live[this.$state.focus],h=e?.$panel.title??e?.$ui.fallback,p=typeof this.opts.title=="string"?this.opts.title:void 0,r=this.$state.live.some(d=>d.$panel.unsaved),o=h&&p?`${h} \xB7 ${p}`:h||p;o&&(document.title=(r?"\u2022 ":"")+o)}),s.clean(()=>{document.title=a})}guardTabClose(){if(typeof window>"u")return;let a=e=>{let h=this.$state.live.find(p=>p.$panel.unsaved);h&&(e.preventDefault(),e.returnValue=!0,this.flushLayout(),h.$panel.visible||this.focusAt(this.intended().stack.indexOf(h.path)))};s(()=>{this.$state.live.some(e=>e.$panel.unsaved)&&(window.addEventListener("beforeunload",a),s.clean(()=>window.removeEventListener("beforeunload",a)))})}drawColumns(){let a=s("div.s-panels role=main",()=>{this.containerEl=s(),s.onEach(this.$open,e=>this.drawPanel(e),e=>e.order)});if(typeof ResizeObserver<"u"){let e=new ResizeObserver(()=>this.layout());e.observe(a),s.clean(()=>e.disconnect())}s.clean(()=>{this.containerEl===a&&(this.containerEl=void 0)}),this.scheduleLayout()}drawPanel(a){let e;s(()=>{let h=a.$panel.maxWidth;a.maxWidth=h==="small"||h==="large"||h==="none"?h:"medium";let p=this.roomFor(a.maxWidth);p&&(a.width=p,s.peek(a.$panel,"width")!==p&&(a.$panel.width=p),e&&(e.style.width=`${p}px`,this.scheduleLayout()))}),e=s(`section.s-panel${a.width?` w:${a.width}px`:""}`,"destroy=",h=>this.playExit(a,h),()=>{s(()=>this.drawActions(a)),s("div.s-content",()=>{if(a.draw(a.$panel),w.persistScroll(a.path),s.peek(a.$panel,"title")==null){let h=N0(s());h&&s.peek(a.$ui,"fallback")!==h&&(a.$ui.fallback=h)}}),s(()=>{!a.$panel.loading||a.$ui.holding||s("div.s-panel-loading aria-hidden=true",()=>{s("i"),s("i"),s("i")})})}),a.el=e,a.placed=!1,e.style.transition="none",s.clean(()=>{a.el===e&&(a.el=void 0)}),s(()=>{a.$panel.loading,this.scheduleLayout()}),this.scheduleLayout()}drawActions(a){this.opts.$shell.narrow||a.$panel.actions==null||s("div.s-panel-actions",()=>l(a.$panel.actions))}scheduleLayout(){this.layoutQueued||(this.layoutQueued=!0,requestAnimationFrame(()=>this.flushLayout()))}flushLayout(){this.layoutQueued&&(this.layoutQueued=!1,this.layout())}measure(){let a=this.containerEl,e=a?a.getBoundingClientRect().width:0;if(!e)return;let h=Math.ceil(e/O1),p=e/h>=U0?e/h:Math.min(e,O1),r=o=>Math.min(o*p,e);return{area:e,size:{small:p,medium:r(2),large:r(3),none:e}}}geometry(){return this.geom??=this.measure()}roomFor(a){return this.geometry()?.size[a]??0}layout(){let a=this.containerEl,e=a?.closest(".s-main");if(!a||!e)return;let h=this.$state.live,p=h.length;if(!p||h.some(v=>!v.el))return;this.geom=void 0;let r=this.geometry();if(!r)return;let o=this.opts.columns==="single",d=this.lastGeom?.area!==r.area;d&&(this.lastGeom=r,e.classList.add("s-shell-snap"));let n=v=>r.size[v.maxWidth],c=Math.min(this.$state.focus,p-1),i=c,V=n(h[c]);if(!o)for(let v=c-1;v>=0;v--){let u=V+n(h[v]);if(u>r.area)break;V=u,i=v}let b=i>0?0:r.area-V,E=this.opts.alignment??"center",m=E==="spaced"?b/(c-i+2):0,H=E==="left"?0:E==="right"?b:E==="spaced"?m:b/2;for(let v=i;v<=c;v++)h[v].width=n(h[v]);for(let v of h)v.width||(v.width=n(v));let A=[],f=[],P=new Map,j=new Map;if(!d)for(let v of h)v.placed&&j.set(v,W0(v.el));let I=H,Q=0;for(let v=0;v<i;v++)I-=h[v].width;for(let v=0;v<p;v++){let u=h[v],C=u.el,e1=v>=i&&v<=c;v===c+1&&(I=Math.max(I,r.area)),(u.enter||!u.placed)&&(!u.$panel.loading||u.holdDone?u.$ui.holding=!1:u.$ui.holding||(u.$ui.holding=!0,this.holdEnter(u))),u.placed?(Q=parseFloat(C.style.left)-I,P.set(u.path,Q),Q&&!d&&(C.style.transition=`opacity ${G}ms linear`,C.style.transform=`translateX(${(j.get(u)??0)+Q}px)`,f.push(C)),C.style.left=`${I}px`,u.enter&&!u.$ui.holding&&this.releaseEnter(u)):(A.push(u),C.style.left=`${I}px`,u.enter&&e1&&(C.style.transform=`translateX(${Q}px)`,C.classList.add("s-panel-enter","s-panel-new"))),C.style.width=`${u.width}px`,I+=u.width+m,u.$panel.visible!==e1&&(u.$panel.visible=e1),u.$panel.width!==u.width&&(u.$panel.width=u.width),C.classList.toggle("s-panel-sep",e1&&v>i&&!m);let g1=v<i,X2=C.classList.contains("s-panel-hidden")||C.classList.contains("s-panel-parked");e1?C.classList.remove("s-panel-hidden","s-panel-parked"):X2||!u.placed||d?(C.classList.toggle("s-panel-hidden",g1),C.classList.toggle("s-panel-parked",!g1)):this.afterTransition(C,"transform",()=>{u.el!==C||!u.offstage||(C.classList.toggle("s-panel-hidden",g1),C.classList.toggle("s-panel-parked",!g1))}),u.offstage=!e1,C.toggleAttribute("inert",!e1)}for(let v of this.exiting){let u=v.anchor==null?void 0:P.get(v.anchor);u&&(v.ride-=u,v.el.style.transform=`translateX(${v.ride}px)`)}(A.length||f.length||d)&&a.offsetWidth,d&&e.classList.remove("s-shell-snap");for(let v of f)v.style.transition="",v.style.transform="";for(let v of A){let u=v.el;u.style.transition="",u.style.transform="",v.placed=!0,v.$ui.holding||this.releaseEnter(v)}}releaseEnter(a){a.enter=!1;let e=a.el;!e||!e.classList.contains("s-panel-enter")||(e.classList.remove("s-panel-enter"),this.afterTransition(e,"opacity",()=>e.classList.remove("s-panel-new")))}holdEnter(a){let e=setTimeout(()=>{this.timers.delete(e),a.holdDone=!0,a.$ui.holding&&(a.$ui.holding=!1,this.scheduleLayout())},K0);this.timers.add(e)}};function N2(t,a){return t.length===a.length&&t.every((e,h)=>e===a[h])}function W0(t){let a=getComputedStyle(t).transform;return a&&a!=="none"?new DOMMatrixReadOnly(a).m41:0}function N0(t){let a=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(let e=a.nextNode();e;e=a.nextNode()){let h=e.textContent.trim();if(h)return h.length>48?`${h.slice(0,47).trimEnd()}\u2026`:h}}function G0(t){s("p fg:$s-muted",()=>s("#",`No panel at ${t.path}`))}var X0=200;x.insertGlobalCss({".s-main":{"&":"display:flex flex-direction:column min-height:100vh max-height:100vh container-type:inline-size","body > &":"margin: calc(-1 * $3)","> header":"border:0 border-bottom: 1px solid $s-faint; r:0 position:sticky top:0 z-index:10","> footer":"border-top: 1px solid $s-faint; fg:$s-muted","> header > .s-bar, > footer > .s-bar":"display:flex align-items:center width:100% margin-inline:auto gap:$3 padding: $2 $3;","> header .s-logo, > header .s-nav-trigger":"display:flex align-items:center flex-shrink:0","> header .s-nav-trigger":"margin-left:-0.375rem","> header .s-logo":"font-size:1.4em background: $s-gradient; -webkit-background-clip:text; background-clip:text; color:transparent;","> header .s-titles":"display:flex flex-direction:column min-width:5rem flex: 0 1 auto;","> header .s-subtitle":"fg:$s-muted font-size:0.85em line-height:1.5 overflow:hidden text-overflow:ellipsis white-space:nowrap","> header .s-title":"font-weight:800 font-size:1.1em line-height:1.2 overflow:hidden text-overflow:ellipsis white-space:nowrap letter-spacing:-0.01em background: $s-gradient; -webkit-background-clip:text; background-clip:text; color:transparent; width:fit-content max-width:100%","> header a.s-logo, > header a.s-title":"text-decoration:none filter:none cursor:pointer","> header .s-menu":"display:flex align-items:center justify-content:flex-end gap:$2 flex: 1 1 auto;",".s-body":"flex:1 overflow:clip display:flex flex-direction:row min-height:0 justify-content:center position:relative",".s-body-inner":"flex:1 min-width:0 display:flex flex-direction:row min-height:0","&.s-nav-right .s-body-inner":"flex-direction:row-reverse",".s-nav-sep":"width:1px flex-shrink:0 align-self:stretch margin: 0.6rem 0; border:0 background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);",".s-body main":`flex:1 min-width:0 min-height:0 overflow-x:hidden overflow-y:auto display:flex flex-direction:column transition: transform ${G}ms ease;`,".s-body main.s-slide-in":"transform: translateX(100%); transition:none",".s-body main > .s-content":"width:100% flex:1 p:$3",".s-body main.s-scroll-y":"margin-right:$3"},".s-nav-panel":{"&":"display:flex flex-direction:column overflow-y:auto flex-shrink:0 width: calc(var(--s-nav-w) - 1px); padding:$3 gap:$1"},".s-nav-page":{"&":`position:absolute inset:0 z-index:5 display:flex flex-direction:column overflow-y:auto overscroll-behavior:contain border:0 r:0 padding:$2 gap:$1 transition: transform ${G}ms ease, visibility 0s;`,"&.s-nav-page-off":`transform:translateX(-100%) pointer-events:none visibility:hidden transition: transform ${G}ms ease, visibility 0s ${G}ms;`,".s-menu-item":"padding: $2 $3; min-height:3rem font-size:1.05em gap:$3"},[`@container (max-width: ${H1}px)`]:{".s-main .s-nav-panel, .s-main .s-nav-sep":"display:none",".s-main > header > .s-bar":"gap:$1 padding: $1 $2;",".s-main .s-body main.s-scroll-y":"margin-right:0"},[`@container (max-width: ${O1}px)`]:{".s-content > .s-box":"margin-inline: calc(-1 * $3); r:0 border-inline:0"}});function _0(t={}){let a=t.nav,e=t.navPosition??"left",h=x.proxy({open:!1}),p=x.proxy({narrow:typeof document<"u"&&document.documentElement.clientWidth<=H1}),r=t.routes;if(r!=null&&t.content!=null)throw new Error("Staffa: S.main() takes either `content` or `routes`, not both");let o=r?new T1({routes:r,notFound:t.notFound,ancestors:t.ancestors,title:t.title,$shell:p}):null;o&&(x(()=>o.setColumns(t.columns)),x(()=>o.setAlignment(t.alignment)),x(()=>o.setLinkNavigation(t.linkNavigation)));let d=o&&t.home!==null?t.home??"/":null,n=()=>{t.maxWidth!=null&&x("max-width:",t.maxWidth)},c=x("div.s-main",t.attrs,()=>{x(()=>{a==null||!a.items.length?x("--s-nav-w: 0px"):x(`.s-nav-${e}`,`--s-nav-w: ${t.navWidth??X0}px`)}),x(()=>{(o!=null||t.title!=null||t.subtitle!=null||t.logo!=null||t.menu!=null||a!=null&&a.items.length>0)&&x("header.s-s.neutral",t.topbarAttrs,()=>{x("div.s-bar",()=>{x(n),x(()=>{if(p.narrow&&a!=null&&a.items.length){x("div.s-nav-trigger",()=>tt(a,h));return}t.logo!=null&&x(d!=null?"a.s-logo aria-label=Home":"div.s-logo",()=>{d!=null&&x("href=",d),l(t.logo)})}),x("div.s-titles",()=>{x(()=>{t.title!=null&&x(d!=null?"a.s-title":"div.s-title",()=>{d!=null&&x("href=",d),l(t.title)})}),Q0(t,o,a,p)});let V=x.derive(()=>p.narrow?o?.currentPanel?.actions:void 0);x(()=>{let b=V.value,E=b??t.menu;E!=null&&x(`div.s-menu${b!=null?".s-panel-origin":""}`,()=>l(E))})})})}),x("div.s-body",()=>{x("div.s-body-inner",()=>{x(n),x(()=>{a==null||!a.items.length||(x(`nav.s-nav-panel.s-nav-${e}`,t.navAttrs,()=>{u1(a.items)}),x("div.s-nav-sep aria-hidden=true"))}),ht(t,o)}),x(()=>{a!=null&&a.items.length&&h.open&&at(a,t.navPageAttrs,h,p)})}),x(()=>{t.footer!=null&&x("footer",()=>{x("div.s-bar",()=>{x(n),l(t.footer)})})})});return Y0(c,p),a!=null&&y1(()=>a.items,()=>{h.open=!1}),(a!=null||o)&&x(()=>{let i=b=>()=>{N1()||S1()||b()},V=()=>c.querySelector(".s-nav-trigger button");h.open?O("Esc","Close the navigation",i(()=>{h.open=!1,V()?.focus()}),"global"):o&&o.currentPanelIndex>0?O("Esc","Back to the previous panel",i(()=>{o.back()}),"global"):O("Esc","Jump to the navigation",i(()=>{let b=c.querySelector(".s-nav-panel");b?.offsetParent!=null?(b.querySelector("[aria-current=page]")??b.querySelector(".s-menu-item:not([aria-disabled=true])"))?.focus():V()?.click()}),"global")}),o??void 0}var q1=null;function j0(){q1?.()}function Q0(t,a,e,h){x(()=>{if(t.subtitle!=null&&(a==null||J0(a,e,h))){x("div.s-subtitle",()=>l(t.subtitle));return}a?.drawCrumbs()})}function J0(t,a,e){return e.narrow||a==null||t.panels.length>1?!1:Q1(a.items)}function Y0(t,a){if(typeof ResizeObserver>"u")return;let e=new ResizeObserver(h=>{let p=h[0]?.contentBoxSize?.[0],r=p?p.inlineSize:h[0]?.contentRect.width;r!=null&&(a.narrow=r<=H1)});e.observe(t),x.clean(()=>e.disconnect())}function tt(t,a){x1({icon:t.button?.icon??(()=>x(()=>(a.open?l1:L1)())),ariaLabel:t.button?.ariaLabel??"Open navigation",attrs:t.button?.attrs,click:()=>{a.open=!a.open}})}function at(t,a,e,h){let p=!1,r=()=>{p=!0,e.open=!1},o=x("nav.s-nav-page.s-s.neutral aria-label=Navigation create=s-nav-page-off destroy=s-nav-page-off",a,()=>u1(t.items,r));q1=r,x.clean(()=>{q1===r&&(q1=null)});let d=x.peek(o2,"path");x(()=>{o2.path!==d&&!t2(o2.path)&&r()});let n=o.closest(".s-main"),c=o.parentElement?.querySelector(":scope > .s-body-inner"),i=c?.querySelector(":scope > main");c?.setAttribute("inert",""),x(()=>{h.narrow||(e.open=!1)}),x.clean(()=>{c?.removeAttribute("inert"),p&&(i&&et(i),n?.querySelector(".s-nav-trigger button")?.focus())}),requestAnimationFrame(()=>{document.body.contains(o)&&o1(o,".s-menu-item[aria-current=page]")})}function et(t){t.classList.add("s-slide-in"),t.offsetWidth,t.classList.remove("s-slide-in")}function ht(t,a){if(a){a.drawColumns();return}let e=x("main",()=>{x("div.s-content",t.contentAttrs,()=>{l(t.content)})});pt(e)}function pt(t){if(typeof ResizeObserver>"u")return;let a=()=>t.classList.toggle("s-scroll-y",t.offsetWidth>t.clientWidth),e=new ResizeObserver(a);e.observe(t),t.firstElementChild&&e.observe(t.firstElementChild),a(),x.clean(()=>e.disconnect())}import q from"aberdeen";q.insertGlobalCss({".s-select_wrap":{"&":"position:relative display:block",select:"w:100% cursor:pointer padding-right:2.2em; appearance:none","&::after":"content: '\u25BE'; position:absolute right:0.7em top:50%; transform: translateY(-50%); pointer-events:none fg:$s-muted font-size:0.85em"}});function rt(t){Y(t,(a,e)=>{q("div.s-select_wrap",()=>{q("select.s-input",t.inputAttrs,()=>{c1(t,a,e),q("change=",h=>{t.bind&&(t.bind.value=h.target.value)}),q(()=>{let h=typeof t.options=="function"?t.options():t.options,p=t.bind?.value??"";t.placeholder!=null&&q("option",()=>{q("value= disabled=true hidden=true"),p||q("selected=true"),q("#",t.placeholder)});for(let r of h){let o=typeof r=="string"?{value:r,label:r}:{value:r.value,label:r.label??r.value};q("option",()=>{q("value=",o.value),o.value===p&&q("selected=true"),q("#",o.label)})}})})})})}import X from"aberdeen";X.insertGlobalCss({"textarea.s-input, .s-inset.s-inset-bottom":"flex: 0 1 100%; min-height:0","textarea.s-input":"resize:vertical min-height:3em line-height:1.45","textarea.s-input.s-autoGrow":"resize:none min-height:2.5em overflow-y:auto"});function ot(t={}){let a=t.autoGrow!==!1;Y(t,(e,h)=>{A1(t,!0,()=>{let p=X("textarea.s-input",t.inputAttrs,()=>{a?(X(".s-autoGrow"),X("input=",r=>{G2(r.currentTarget),t.input&&t.input(r)})):(X("rows=",t.rows??4),X("resize:",t.resize??(t.suffix?"none":"vertical")),t.input&&X("input=",t.input)),t.placeholder!=null&&X("placeholder=",t.placeholder),t.value!=null&&!t.bind&&X("value=",t.value),t.change&&X("change=",t.change),c1(t,e,h,t.bind)});a&&requestAnimationFrame(()=>G2(p))})})}function G2(t){t.style.height="auto",t.style.height=`${t.scrollHeight+t.offsetHeight-t.clientHeight}px`}export{e2 as addContextMenu,M1 as addTooltip,c0 as alert,m0 as autocomplete,O as bindKey,f0 as box,B as button,g0 as buttonChooser,h1 as buttonGroup,b0 as checkbox,F2 as closeFloatingMenu,j0 as closeNav,i0 as confirm,s1 as dialog,w0 as form,D as formatKey,c2 as getDarkMode,x1 as iconButton,N1 as isDialogOpen,S1 as isFloatingMenuOpen,_0 as main,L2 as matchWords,T0 as menu,q0 as menuButton,s0 as prompt,E1 as revealInStrip,P1 as scrollStrip,rt as select,j2 as setDarkMode,l0 as setKeyHelp,a2 as showFloatingMenu,G1 as showKeyHelp,Z0 as tabs,ot as textarea,U1 as textline,C1 as toast};
|
package/package.json
CHANGED
package/skill/MainOptions.md
CHANGED
|
@@ -218,6 +218,21 @@ state.
|
|
|
218
218
|
|
|
219
219
|
**Type:** `"auto" | "single"`
|
|
220
220
|
|
|
221
|
+
### mainOptions.alignment · member
|
|
222
|
+
|
|
223
|
+
Where the open columns sit when they don't fill the content area — on a
|
|
224
|
+
wide screen with a single small panel open, say. `"center"` (the default)
|
|
225
|
+
splits the leftover room between both sides, `"left"` and `"right"` put it
|
|
226
|
+
all on one side, and `"spaced"` shares it out evenly over the gutters
|
|
227
|
+
beside *and between* the columns. Columns crowded out on the left take
|
|
228
|
+
precedence: while there are any, the run hugs the left edge whatever this
|
|
229
|
+
says. Routed mode only.
|
|
230
|
+
|
|
231
|
+
Live, like `MainOptions.columns`: a change is adopted in one layout
|
|
232
|
+
pass, every panel keeping its state.
|
|
233
|
+
|
|
234
|
+
**Type:** `PanelAlignment`
|
|
235
|
+
|
|
221
236
|
### mainOptions.linkNavigation · member
|
|
222
237
|
|
|
223
238
|
What a link *without* a `data-panel` attribute does — the per-link
|
package/skill/Panel.md
CHANGED
|
@@ -65,6 +65,10 @@ They are drawn in exactly one of those places at a time, so crossing the
|
|
|
65
65
|
threshold redraws them; anything stateful inside (the focus in a search
|
|
66
66
|
box) is lost. Buttons and menus are fine.
|
|
67
67
|
|
|
68
|
+
Assign one function and keep it: a fresh closure on every redraw of your
|
|
69
|
+
handler is a new slot, so the shell redraws the actions — and on a narrow
|
|
70
|
+
shell, where they sit in the top bar, the app's own chrome with them.
|
|
71
|
+
|
|
68
72
|
**Type:** `Slot`
|
|
69
73
|
|
|
70
74
|
### panel.width · member
|
package/skill/SKILL.md
CHANGED
|
@@ -169,7 +169,7 @@ Each handler gets a `$panel` proxy: the params from its route, plus what the she
|
|
|
169
169
|
|
|
170
170
|
**The stack is an object, not a global.** `S.main()` hands back the `PanelStack` — `pushPanel`, `replacePanel`, `openPanelStack`, `closePanel`, and the live, reactive `panels` / `currentPanel` / `currentPanelIndex` — and every panel gets that same object as `$panel.stack`, which is what a route handler uses, since it runs while the `S.main()` call is still going. Every navigation settles asynchronously (closes travel through the browser's history), so each method returns a `Promise<boolean>`. Don't hold a `Panel` across a navigation; read it fresh. To navigate on behalf of one particular screen — a row's click handler — use that panel's own `$panel.open(href, how?)`, which does exactly what a link inside it does; `pushPanel` builds on the *current* panel instead.
|
|
171
171
|
|
|
172
|
-
**Columns and widths.** The content area is the window minus the nav sidebar, or `S.main({ maxWidth })` of it, centred — the same width whatever is open, so the sidebar, top bar and footer never move. It divides into the fewest whole number of columns of at most **540px** each, never narrower than **360px**; `$panel.maxWidth` asks for one, two (the default), three of them or the lot. A column's width depends only on the window, never on what else is open, so opening or closing a panel never resizes another. Its ask is a ceiling, never a floor: aim your layout at 360px and let it degrade gracefully below that. `$panel.width` is the resolved figure in pixels, correct before your handler draws.
|
|
172
|
+
**Columns and widths.** The content area is the window minus the nav sidebar, or `S.main({ maxWidth })` of it, centred — the same width whatever is open, so the sidebar, top bar and footer never move. It divides into the fewest whole number of columns of at most **540px** each, never narrower than **360px**; `$panel.maxWidth` asks for one, two (the default), three of them or the lot. A column's width depends only on the window, never on what else is open, so opening or closing a panel never resizes another. Its ask is a ceiling, never a floor: aim your layout at 360px and let it degrade gracefully below that. `$panel.width` is the resolved figure in pixels, correct before your handler draws. Columns that don't fill the area centre in it; `S.main({ alignment })` puts them `"left"`, `"right"` or `"spaced"` (the leftover room shared out evenly beside and between them) instead.
|
|
173
173
|
|
|
174
174
|
**A panel declares its chrome; the shell places it.** A screen says what it is called and what it can do; everything else in its column — headings, cards, boxes — is the screen's own content, drawn like any other.
|
|
175
175
|
|
|
@@ -220,7 +220,7 @@ Return the paths shallowest first, or nothing to fall back to the parent-path wa
|
|
|
220
220
|
|
|
221
221
|
- Search params and the `#hash` belong to the current panel only; anything another panel needs in order to redraw itself has to live in its path. (A panel you browse away from does get its search and hash back when a crumb makes it current again.)
|
|
222
222
|
- A closed panel is torn down at once: its `A.clean()` hooks run the moment it closes, so subscriptions, timers and requests stop there and then.
|
|
223
|
-
- `columns: "single"` shows only the current panel however wide the screen — only the display changes. It, `linkNavigation` and `maxWidth` are live: pass a proxied options object and a change is adopted in place, every panel keeping its state.
|
|
223
|
+
- `columns: "single"` shows only the current panel however wide the screen — only the display changes. It, `alignment`, `linkNavigation` and `maxWidth` are live: pass a proxied options object and a change is adopted in place, every panel keeping its state.
|
|
224
224
|
- Only one routed `S.main()` can be mounted at a time; a second one throws, since the URL is global. Nothing else is.
|
|
225
225
|
- Aberdeen's own `route.go()` works, but builds the whole stack from the path; prefer the stack's methods. A guard your app registered with `route.setGuard` keeps working — Staffa registers none of its own.
|
|
226
226
|
- Deep links need your static server to serve the app for unknown paths (the usual SPA fallback; `-P` for `http-server`, as in the demo command below).
|
|
@@ -549,6 +549,13 @@ they all come to the same thing.
|
|
|
549
549
|
|
|
550
550
|
**Type:** `"small" | "medium" | "large" | "none"`
|
|
551
551
|
|
|
552
|
+
## PanelAlignment · type
|
|
553
|
+
|
|
554
|
+
Where the open columns sit when they don't fill the content area; see
|
|
555
|
+
`MainOptions.alignment`.
|
|
556
|
+
|
|
557
|
+
**Type:** `"left" | "right" | "center" | "spaced"`
|
|
558
|
+
|
|
552
559
|
## Routes · type
|
|
553
560
|
|
|
554
561
|
A route table: path templates mapped to panel draw functions. Used as the
|
package/src/components/main.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { type MenuOptions, drawMenu, isFloatingMenuOpen, consumeBranchNav, anyCu
|
|
|
7
7
|
import { menu as menuIcon, x as closeIcon } from "../icons.js";
|
|
8
8
|
import { iconButton } from "./button.js";
|
|
9
9
|
import { isDialogOpen } from "./dialog.js";
|
|
10
|
-
import { PAGE_MS, PanelStackController, SMALL_MAX_PX, type PanelStack, type AncestorTable, type Panel, type RouteHandler, type RouteTable, type Routes } from "./panels.js";
|
|
10
|
+
import { PAGE_MS, PanelStackController, SMALL_MAX_PX, type PanelStack, type PanelAlignment, type AncestorTable, type Panel, type RouteHandler, type RouteTable, type Routes } from "./panels.js";
|
|
11
11
|
|
|
12
12
|
/** Options for {@link main}. */
|
|
13
13
|
export interface MainOptions<R = Routes> {
|
|
@@ -201,6 +201,19 @@ export interface MainOptions<R = Routes> {
|
|
|
201
201
|
* state.
|
|
202
202
|
*/
|
|
203
203
|
columns?: "auto" | "single";
|
|
204
|
+
/**
|
|
205
|
+
* Where the open columns sit when they don't fill the content area — on a
|
|
206
|
+
* wide screen with a single small panel open, say. `"center"` (the default)
|
|
207
|
+
* splits the leftover room between both sides, `"left"` and `"right"` put it
|
|
208
|
+
* all on one side, and `"spaced"` shares it out evenly over the gutters
|
|
209
|
+
* beside *and between* the columns. Columns crowded out on the left take
|
|
210
|
+
* precedence: while there are any, the run hugs the left edge whatever this
|
|
211
|
+
* says. Routed mode only.
|
|
212
|
+
*
|
|
213
|
+
* Live, like {@link MainOptions.columns}: a change is adopted in one layout
|
|
214
|
+
* pass, every panel keeping its state.
|
|
215
|
+
*/
|
|
216
|
+
alignment?: PanelAlignment;
|
|
204
217
|
/**
|
|
205
218
|
* What a link *without* a `data-panel` attribute does — the per-link
|
|
206
219
|
* attribute always wins. The three keep less and less of the link's own
|
|
@@ -486,6 +499,7 @@ export function main<R extends RouteTable<R>>(opts: MainOptions<R> = {}): PanelS
|
|
|
486
499
|
// Live: each in its own scope, so a change on a proxied options object
|
|
487
500
|
// re-runs only that scope — the columns relayout in place, panels intact.
|
|
488
501
|
A(() => ctl.setColumns(opts.columns));
|
|
502
|
+
A(() => ctl.setAlignment(opts.alignment));
|
|
489
503
|
A(() => ctl.setLinkNavigation(opts.linkNavigation));
|
|
490
504
|
}
|
|
491
505
|
// Where the brand mark and the app's name link; nowhere under `home: null`.
|
|
@@ -560,8 +574,15 @@ export function main<R extends RouteTable<R>>(opts: MainOptions<R> = {}): PanelS
|
|
|
560
574
|
// falling back to the app's chrome. Promoted actions are marked
|
|
561
575
|
// `.s-panel-origin`, so a link among them still builds on the
|
|
562
576
|
// current panel — see `interceptLinks` in panels.ts.
|
|
577
|
+
//
|
|
578
|
+
// Which slot wins is derived, so a panel swap that doesn't change
|
|
579
|
+
// the answer — neither screen declaring actions, the app's `menu`
|
|
580
|
+
// standing on both sides — leaves the slot's DOM alone. This is
|
|
581
|
+
// where an app puts its stateful chrome (`menu`'s search box), and
|
|
582
|
+
// rebuilding it would drop focus, caret and IME composition.
|
|
583
|
+
const $promoted = A.derive(() => ($shell.narrow ? ctl?.currentPanel?.actions : undefined));
|
|
563
584
|
A(() => {
|
|
564
|
-
const actions = $
|
|
585
|
+
const actions = $promoted.value;
|
|
565
586
|
const slot = actions ?? opts.menu;
|
|
566
587
|
if (slot != null) A(`div.s-menu${actions != null ? ".s-panel-origin" : ""}`, () => drawSlot(slot));
|
|
567
588
|
});
|
package/src/components/panels.ts
CHANGED
|
@@ -102,6 +102,12 @@ export type AncestorTable<R> = {
|
|
|
102
102
|
*/
|
|
103
103
|
export type PanelSize = "small" | "medium" | "large" | "none";
|
|
104
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Where the open columns sit when they don't fill the content area; see
|
|
107
|
+
* {@link MainOptions.alignment}.
|
|
108
|
+
*/
|
|
109
|
+
export type PanelAlignment = "left" | "right" | "center" | "spaced";
|
|
110
|
+
|
|
105
111
|
/**
|
|
106
112
|
* What a route handler gets: the params from its route, plus everything the
|
|
107
113
|
* shell needs to know about the panel it is drawing. It's an Aberdeen proxy, so
|
|
@@ -153,6 +159,10 @@ export interface Panel<P = Record<string, string | number | string[]>> {
|
|
|
153
159
|
* They are drawn in exactly one of those places at a time, so crossing the
|
|
154
160
|
* threshold redraws them; anything stateful inside (the focus in a search
|
|
155
161
|
* box) is lost. Buttons and menus are fine.
|
|
162
|
+
*
|
|
163
|
+
* Assign one function and keep it: a fresh closure on every redraw of your
|
|
164
|
+
* handler is a new slot, so the shell redraws the actions — and on a narrow
|
|
165
|
+
* shell, where they sit in the top bar, the app's own chrome with them.
|
|
156
166
|
*/
|
|
157
167
|
actions?: Slot;
|
|
158
168
|
/**
|
|
@@ -477,7 +487,8 @@ A.insertGlobalCss({
|
|
|
477
487
|
`z-index:2 transition: transform ${PAGE_MS}ms ease-out, opacity ${PAGE_MS}ms linear;`,
|
|
478
488
|
// The hairline between two columns, fading at both ends (like the sidebar's
|
|
479
489
|
// `.s-nav-sep`). Columns tile with no gutter — each brings its own `$3` of
|
|
480
|
-
// padding — so this sits exactly on the boundary.
|
|
490
|
+
// padding — so this sits exactly on the boundary. A `"spaced"` alignment,
|
|
491
|
+
// which does put a gutter between them, leaves it off (see `layout`).
|
|
481
492
|
"&.s-panel-sep::before":
|
|
482
493
|
"content:'' position:absolute left:0 top:0.6rem bottom:0.6rem width:1px z-index:1 " +
|
|
483
494
|
"background: linear-gradient(to bottom, transparent, $s-faint 18%, $s-faint 82%, transparent);",
|
|
@@ -672,6 +683,8 @@ export interface PanelStackOptions {
|
|
|
672
683
|
ancestors?: Record<string, AncestorsHandler | undefined>;
|
|
673
684
|
/** How many panels are shown at a time. See {@link MainOptions.columns}. */
|
|
674
685
|
columns?: "auto" | "single";
|
|
686
|
+
/** Where a short run of columns sits in the area. See {@link MainOptions.alignment}. */
|
|
687
|
+
alignment?: PanelAlignment;
|
|
675
688
|
/** What a bare link does. See {@link MainOptions.linkNavigation}. */
|
|
676
689
|
linkNavigation?: "push" | "replace" | "open";
|
|
677
690
|
/** The shell's own title, used as the suffix of `document.title`. */
|
|
@@ -1505,6 +1518,13 @@ export class PanelStackController implements PanelStack {
|
|
|
1505
1518
|
this.scheduleLayout();
|
|
1506
1519
|
}
|
|
1507
1520
|
|
|
1521
|
+
/** Adopt a changed `alignment`: one layout pass, nothing redrawn. */
|
|
1522
|
+
setAlignment(alignment: PanelAlignment | undefined): void {
|
|
1523
|
+
if (this.opts.alignment === alignment) return;
|
|
1524
|
+
this.opts.alignment = alignment;
|
|
1525
|
+
this.scheduleLayout();
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1508
1528
|
/** Adopt a changed `linkNavigation` default; the next click reads it. */
|
|
1509
1529
|
setLinkNavigation(mode: "push" | "replace" | "open" | undefined): void {
|
|
1510
1530
|
this.opts.linkNavigation = mode;
|
|
@@ -1854,11 +1874,16 @@ export class PanelStackController implements PanelStack {
|
|
|
1854
1874
|
}
|
|
1855
1875
|
}
|
|
1856
1876
|
|
|
1857
|
-
// A run that doesn't fill the fixed-width area
|
|
1858
|
-
//
|
|
1859
|
-
//
|
|
1860
|
-
//
|
|
1861
|
-
|
|
1877
|
+
// A run that doesn't fill the fixed-width area is placed in it by the
|
|
1878
|
+
// shell's `alignment`, `"spaced"` sharing the slack out over the gutters
|
|
1879
|
+
// around and between the columns. Unless panels sit crowded out on the
|
|
1880
|
+
// run's left: then it hugs the left edge, so the strip crosses that edge
|
|
1881
|
+
// with no gap, a reveal is a plain slide back in, and no gutter lets a
|
|
1882
|
+
// crowded-out panel peek through.
|
|
1883
|
+
const slack = first > 0 ? 0 : geom.area - runSum;
|
|
1884
|
+
const align = this.opts.alignment ?? "center";
|
|
1885
|
+
const gap = align === "spaced" ? slack / (cur - first + 2) : 0;
|
|
1886
|
+
const left = align === "left" ? 0 : align === "right" ? slack : align === "spaced" ? gap : slack / 2;
|
|
1862
1887
|
|
|
1863
1888
|
for (let i = first; i <= cur; i++) live[i].width = width(live[i]);
|
|
1864
1889
|
// Never-visible panels get their would-be width, so a reveal doesn't start
|
|
@@ -1926,12 +1951,12 @@ export class PanelStackController implements PanelStack {
|
|
|
1926
1951
|
}
|
|
1927
1952
|
}
|
|
1928
1953
|
el.style.width = `${entry.width}px`;
|
|
1929
|
-
x += entry.width;
|
|
1954
|
+
x += entry.width + gap;
|
|
1930
1955
|
// Written only on a change, so per-panel UI hanging off `visible` or
|
|
1931
1956
|
// `width` isn't rebuilt by every pass.
|
|
1932
1957
|
if (entry.$panel.visible !== shown) entry.$panel.visible = shown;
|
|
1933
1958
|
if (entry.$panel.width !== entry.width) entry.$panel.width = entry.width;
|
|
1934
|
-
el.classList.toggle("s-panel-sep", shown && i > first);
|
|
1959
|
+
el.classList.toggle("s-panel-sep", shown && i > first && !gap);
|
|
1935
1960
|
// Off-screen panels stop rendering, keeping their DOM. A revealed
|
|
1936
1961
|
// panel is visible at once; one sliding offstage stays visible for
|
|
1937
1962
|
// the whole slide, its visibility class deferred to the slide's
|
|
@@ -41,7 +41,9 @@ A.insertGlobalCss({
|
|
|
41
41
|
// a prefix/suffix gives it one.
|
|
42
42
|
"textarea.s-input, .s-inset.s-inset-bottom": "flex: 0 1 100%; min-height:0",
|
|
43
43
|
"textarea.s-input": "resize:vertical min-height:3em line-height:1.45",
|
|
44
|
-
|
|
44
|
+
// Sized to its text there is nothing to scroll, so `auto` shows no bar — until
|
|
45
|
+
// a caller caps the height (`inputAttrs: "max-height:12em"`), when it should.
|
|
46
|
+
"textarea.s-input.s-autoGrow": "resize:none min-height:2.5em overflow-y:auto",
|
|
45
47
|
});
|
|
46
48
|
|
|
47
49
|
/**
|
|
@@ -104,5 +106,8 @@ export function textarea(opts: TextareaOptions = {}): void {
|
|
|
104
106
|
|
|
105
107
|
function fitToContent(el: HTMLTextAreaElement): void {
|
|
106
108
|
el.style.height = "auto";
|
|
107
|
-
|
|
109
|
+
// `scrollHeight` measures the padding box, while the height we set sizes the
|
|
110
|
+
// border box: add the borders back, or the text ends up two pixels too tall
|
|
111
|
+
// for its box and the textarea scrolls by that much.
|
|
112
|
+
el.style.height = `${el.scrollHeight + el.offsetHeight - el.clientHeight}px`;
|
|
108
113
|
}
|
package/src/index.ts
CHANGED
|
@@ -42,7 +42,7 @@ export { buttonGroup, type ButtonGroupOptions } from "./components/buttonGroup.j
|
|
|
42
42
|
export { checkbox, type CheckboxOptions } from "./components/checkbox.js";
|
|
43
43
|
export { form, type FormOptions } from "./components/form.js";
|
|
44
44
|
export { main, closeNav, type MainOptions } from "./components/main.js";
|
|
45
|
-
export { type PanelStack, type Panel, type PanelSize, type Routes, type RouteHandler, type RouteTable, type AncestorsHandler, type AncestorTable, type PathParams, type SegParams } from "./components/panels.js";
|
|
45
|
+
export { type PanelStack, type Panel, type PanelSize, type PanelAlignment, type Routes, type RouteHandler, type RouteTable, type AncestorsHandler, type AncestorTable, type PathParams, type SegParams } from "./components/panels.js";
|
|
46
46
|
export { menu, menuButton, showFloatingMenu, addContextMenu, isFloatingMenuOpen, closeFloatingMenu, type MenuListOptions, type MenuOptions, type MenuEntry, type MenuItem, type MenuSeparator, type FloatingMenuOptions, type ContextMenuOptions } from "./components/menu.js";
|
|
47
47
|
export { dialog, alert, confirm, prompt, isDialogOpen, type DialogOptions } from "./components/dialog.js";
|
|
48
48
|
export { select, type SelectOptions, type SelectOptionInput } from "./components/select.js";
|