@wildwinter/app-shell 0.56.0 → 0.58.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 +215 -0
- package/dist/chunk-4JQWNC6Z.js +319 -0
- package/dist/chunk-4JQWNC6Z.js.map +1 -0
- package/dist/chunk-ICYPXUNA.js +8 -0
- package/dist/chunk-ICYPXUNA.js.map +1 -0
- package/dist/{chunk-CPNTROWD.js → chunk-OZQ2BYXH.js} +13 -4
- package/dist/chunk-OZQ2BYXH.js.map +1 -0
- package/dist/controls.css +52 -0
- package/dist/controls.css.map +1 -1
- package/dist/index.cjs +352 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/tool-window.cjs +11 -2
- package/dist/tool-window.cjs.map +1 -1
- package/dist/tool-window.d.cts +10 -4
- package/dist/tool-window.d.ts +10 -4
- package/dist/tool-window.js +1 -1
- package/dist/updater.cjs.map +1 -1
- package/dist/updater.js +1 -1
- package/dist/value-rows.cjs +200 -10
- package/dist/value-rows.cjs.map +1 -1
- package/dist/value-rows.d.cts +36 -1
- package/dist/value-rows.d.ts +36 -1
- package/dist/value-rows.js +197 -12
- package/dist/value-rows.js.map +1 -1
- package/dist/view-client.cjs +172 -0
- package/dist/view-client.cjs.map +1 -0
- package/dist/view-client.d.cts +46 -0
- package/dist/view-client.d.ts +46 -0
- package/dist/view-client.js +165 -0
- package/dist/view-client.js.map +1 -0
- package/dist/view-host-web.cjs +327 -0
- package/dist/view-host-web.cjs.map +1 -0
- package/dist/view-host-web.d.cts +61 -0
- package/dist/view-host-web.d.ts +61 -0
- package/dist/view-host-web.js +4 -0
- package/dist/view-host-web.js.map +1 -0
- package/dist/view-host.cjs +532 -0
- package/dist/view-host.cjs.map +1 -0
- package/dist/view-host.d.cts +178 -0
- package/dist/view-host.d.ts +178 -0
- package/dist/view-host.js +426 -0
- package/dist/view-host.js.map +1 -0
- package/dist/view-preload.cjs +16 -0
- package/dist/view-preload.cjs.map +1 -0
- package/dist/view-preload.js +8 -0
- package/dist/view-preload.js.map +1 -0
- package/dist/view-protocol.cjs +12 -0
- package/dist/view-protocol.cjs.map +1 -0
- package/dist/view-protocol.d.cts +257 -0
- package/dist/view-protocol.d.ts +257 -0
- package/dist/view-protocol.js +3 -0
- package/dist/view-protocol.js.map +1 -0
- package/package.json +25 -4
- package/dist/chunk-CPNTROWD.js.map +0 -1
|
@@ -124,6 +124,9 @@ function openToolWindow(existing, opts) {
|
|
|
124
124
|
existing.focus();
|
|
125
125
|
return existing;
|
|
126
126
|
}
|
|
127
|
+
if (opts.url === void 0 && (opts.page === void 0 || opts.rendererDir === void 0)) {
|
|
128
|
+
throw new Error("openToolWindow needs a url, or a page and its rendererDir");
|
|
129
|
+
}
|
|
127
130
|
const w = new BrowserWindow({
|
|
128
131
|
...opts.rect,
|
|
129
132
|
...opts.min !== void 0 ? { minWidth: opts.min.width, minHeight: opts.min.height } : {},
|
|
@@ -134,14 +137,20 @@ function openToolWindow(existing, opts) {
|
|
|
134
137
|
contextIsolation: true,
|
|
135
138
|
nodeIntegration: false,
|
|
136
139
|
sandbox: true,
|
|
137
|
-
|
|
140
|
+
// Electron's defaults, said out loud: no webview tag, and a dropped file never navigates the window.
|
|
141
|
+
webviewTag: false,
|
|
142
|
+
navigateOnDragDrop: false,
|
|
143
|
+
preload: opts.preload,
|
|
144
|
+
...opts.partition !== void 0 ? { partition: opts.partition } : {},
|
|
145
|
+
...opts.devTools !== void 0 ? { devTools: opts.devTools } : {}
|
|
138
146
|
}
|
|
139
147
|
});
|
|
140
148
|
if (opts.pinTo !== void 0) pinToolWindow(w, opts.pinTo(), opts.pinned ?? false);
|
|
141
149
|
if (opts.remember) rememberBounds(w, opts.remember);
|
|
142
150
|
w.once("ready-to-show", () => w.show());
|
|
143
151
|
if (opts.onClosed) w.on("closed", opts.onClosed);
|
|
144
|
-
if (
|
|
152
|
+
if (opts.url !== void 0) void w.loadURL(opts.url);
|
|
153
|
+
else if (process.env["ELECTRON_RENDERER_URL"]) void w.loadURL(`${process.env["ELECTRON_RENDERER_URL"]}/${opts.page}`);
|
|
145
154
|
else void w.loadFile(join(opts.rendererDir, opts.page));
|
|
146
155
|
return w;
|
|
147
156
|
}
|
|
@@ -209,5 +218,5 @@ function defineToolWindows(specs, env) {
|
|
|
209
218
|
}
|
|
210
219
|
|
|
211
220
|
export { centeredOnPrimary, defineToolWindows, frontForModal, openToolWindow, pinToolWindow, rememberBounds, rescueToolWindow, savedWindowRect };
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
221
|
+
//# sourceMappingURL=chunk-OZQ2BYXH.js.map
|
|
222
|
+
//# sourceMappingURL=chunk-OZQ2BYXH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tool-window.ts"],"names":[],"mappings":"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","file":"chunk-OZQ2BYXH.js","sourcesContent":["// ---------------------------------------------------------------------------\n// The tool-window kit, MAIN-PROCESS half: the detached helper-window\n// machinery both apps had grown four copies of (Patterpad's Play + Search +\n// Coverage, Storyletter's Board + Find). Remembered bounds with a\n// disconnected-monitor guard, debounced persistence, the Reset View rescue,\n// and the pinnable window factory they compose into.\n//\n// This module imports electron, so it ships as its own subpath\n// (@wildwinter/app-shell/tool-window) - never import it from renderer code.\n// The renderer half (pin button, .swin drag-bar grammar) lives in the root\n// export + tool-window.css.\n//\n// Two deliberate corrections over the Patterpad originals, for when it\n// migrates here: rescueToolWindow re-pins EVERY window it rescues (Patterpad\n// re-pinned only Play, so its store lied about Search + Coverage), and the\n// factory always wires closed-cleanup through an identity guard.\n// ---------------------------------------------------------------------------\n\nimport { BrowserWindow, app, screen } from \"electron\";\nimport { join } from \"node:path\";\nimport type { Satellite } from \"./session.js\";\n\nexport interface ToolWindowSize {\n width: number;\n height: number;\n}\n\nexport interface ToolWindowBounds {\n x?: number;\n y?: number;\n width: number;\n height: number;\n}\n\n/** The per-window store slice every app remembers: where it was, whether it\n * floats. (Patterpad's PlayWindowState, generalised.) */\nexport interface ToolWindowState {\n bounds?: ToolWindowBounds;\n pinned: boolean;\n}\n\n/** Use a remembered rect only if it still intersects a live display (a window\n * saved on a now-disconnected monitor must not open offscreen). Falls back\n * to the default size; a remembered size is kept even when the position is\n * dropped (Electron then centres it). */\nexport function savedWindowRect(\n saved: ToolWindowBounds | undefined,\n def: ToolWindowSize,\n min: ToolWindowSize,\n): ToolWindowBounds {\n if (!saved) return { ...def };\n const w = Math.max(min.width, saved.width), h = Math.max(min.height, saved.height);\n if (saved.x != null && saved.y != null) {\n const onScreen = screen.getAllDisplays().some((d) => {\n const a = d.workArea;\n return saved.x! + w > a.x + 40 && saved.x! < a.x + a.width - 40 && saved.y! + h > a.y + 20 && saved.y! < a.y + a.height - 20;\n });\n if (onScreen) return { x: saved.x, y: saved.y, width: w, height: h };\n }\n return { width: w, height: h };\n}\n\n/** Persist a helper window's bounds as the user moves / resizes / closes it\n * (debounced 400ms; close flushes synchronously). */\nexport function rememberBounds(w: BrowserWindow, write: (bounds: ToolWindowBounds) => void): void {\n const saveBounds = (): void => { if (!w.isDestroyed()) write(w.getBounds()); };\n let boundsTimer: ReturnType<typeof setTimeout> | undefined;\n const queueSave = (): void => { clearTimeout(boundsTimer); boundsTimer = setTimeout(saveBounds, 400); };\n w.on(\"resize\", queueSave);\n w.on(\"move\", queueSave);\n w.on(\"close\", () => { clearTimeout(boundsTimer); saveBounds(); });\n}\n\n/** Centre a rect on the primary display's work area. */\nexport function centeredOnPrimary(size: ToolWindowSize): { x: number; y: number } {\n const a = screen.getPrimaryDisplay().workArea;\n return { x: Math.round(a.x + (a.width - size.width) / 2), y: Math.round(a.y + (a.height - size.height) / 2) };\n}\n\n/** Reset View's per-window half: un-minimise, re-pin (always - the store\n * says pinned:true after a rescue, so the window must agree), default size,\n * centred on the primary display, shown. The host clears its remembered\n * bounds itself (that's a store concern). No focus steal: helpers show\n * behind the editor. */\nexport function rescueToolWindow(w: BrowserWindow | undefined | null, def: ToolWindowSize): void {\n if (!w || w.isDestroyed()) return;\n if (w.isMinimized()) w.restore();\n w.setBounds({ ...def, ...centeredOnPrimary(def) });\n w.show();\n // Raise within OUR stack. This used to setAlwaysOnTop(true), which on macOS\n // and Windows floats the window above every other APPLICATION - and stuck\n // that way, since nothing ever unset it.\n w.moveTop();\n}\n\n/** macOS pinned windows, for the activation toggle below. */\nconst macPinned = new Set<BrowserWindow>();\nlet macActivationWired = false;\nfunction wireMacActivation(): void {\n if (macActivationWired) return;\n macActivationWired = true;\n // Floating is a GLOBAL window level: left on while another app is front,\n // the pinned window would sit over that app too - the exact 2026-08-25\n // complaint. Scoping it to our app's active state keeps the pin meaning\n // \"above my editor\" and nothing more.\n // Not while a modal has the pins held (frontForModal): the editor is in\n // front for it, and coming back to the app must not cover it again.\n app.on(\"did-become-active\", () => { if (pinsHeld > 0) return; for (const w of macPinned) if (!w.isDestroyed()) w.setAlwaysOnTop(true, \"floating\"); });\n app.on(\"did-resign-active\", () => { for (const w of macPinned) if (!w.isDestroyed()) w.setAlwaysOnTop(false); });\n}\n\n/**\n * The pin: keep a tool window above THIS APP'S MAIN WINDOW, not above the\n * world. Two findings shaped the mechanism, one per platform family:\n *\n * - Bare `alwaysOnTop` (the first implementation) floats the window over\n * every other application on macOS and Windows, so a pinned Board meant\n * nothing else on the machine could come to the front (a Storyletter user\n * report, 2026-08-25).\n * - A CHILD window (the second implementation) is position-coupled to its\n * parent on macOS: dragging the editor dragged the Board with it (a\n * Storyletter user report, 2026-08-28). Windows and Linux owned windows do\n * not move with their owner, so the child mechanism stays right for them.\n *\n * So: on macOS the pin is ACTIVATION-SCOPED alwaysOnTop - floating while\n * this app is active, dropped the moment it resigns - which is above the\n * editor without following its drags and without covering anyone else. On\n * Windows and Linux the pin is a child window, which stays over its parent\n * and stacks normally against everything else. Each branch clears the other\n * mechanism first, which also heals a window an older build pinned the old\n * way. `platform` is a seam for the tests; leave it defaulted.\n */\nexport function pinToolWindow(\n w: BrowserWindow | undefined | null, parent: BrowserWindow | undefined | null, on: boolean,\n platform: NodeJS.Platform = process.platform,\n): void {\n if (!w || w.isDestroyed()) return;\n if (platform === \"darwin\") {\n w.setParentWindow(null);\n if (on) {\n if (!macPinned.has(w)) {\n macPinned.add(w);\n w.once(\"closed\", () => macPinned.delete(w));\n }\n wireMacActivation();\n // Raise only when the app is active now and no modal has the pins\n // held; otherwise the next did-become-active, or the release, raises it.\n w.setAlwaysOnTop(pinsHeld === 0 && BrowserWindow.getFocusedWindow() !== null, \"floating\");\n } else {\n macPinned.delete(w);\n w.setAlwaysOnTop(false);\n }\n return;\n }\n w.setAlwaysOnTop(false);\n const owner = on && parent && !parent.isDestroyed() ? parent : null;\n // While a modal has the pins held, remember the choice and apply it at the\n // release, so the editor stays in front until the modal closes.\n if (pinsHeld > 0) {\n if (owner) heldChildren.set(w, owner); else heldChildren.delete(w);\n w.setParentWindow(null);\n return;\n }\n w.setParentWindow(owner);\n}\n\n// ---------------------------------------------------------------------------\n// Fronting the main window for a modal. A pinned tool window rides above the\n// editor by design, so a modal the EDITOR shows (the updater's prompts) opened\n// underneath one: the editor blurred behind its scrim and the prompt was\n// hidden, with nothing on screen to say why (both apps, 2026-10-02, the Play\n// window over the editor). While such a modal is up the pins step aside and\n// the editor comes forward; when it closes, every pin goes back as it was.\n// ---------------------------------------------------------------------------\n\n/** How many modals are holding the pins down. The pins return at zero. */\nlet pinsHeld = 0;\n/** Windows and Linux: the tool windows unparented by the hold, and the window\n * each goes back to. */\nconst heldChildren = new Map<BrowserWindow, BrowserWindow>();\n\n/**\n * Bring `main` in front of every tool window, pinned ones included, for as\n * long as a modal it shows is open: un-minimise, show, focus, with the pins\n * set aside. Returns the release, which puts the pins back (idempotent; holds\n * nest, and the pins return when the last is released). Call it only while\n * the app is active: focusing a window of an inactive app is the focus steal\n * the platforms forbid. `platform` is a seam for the tests.\n */\nexport function frontForModal(main: BrowserWindow, platform: NodeJS.Platform = process.platform): () => void {\n if (main.isDestroyed()) return () => {};\n pinsHeld++;\n if (platform === \"darwin\") {\n for (const w of macPinned) if (!w.isDestroyed()) w.setAlwaysOnTop(false);\n } else {\n for (const w of BrowserWindow.getAllWindows()) {\n if (w === main || w.isDestroyed()) continue;\n const owner = w.getParentWindow();\n if (owner !== main) continue;\n heldChildren.set(w, main);\n w.setParentWindow(null);\n }\n }\n if (main.isMinimized()) main.restore();\n main.show();\n main.focus();\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--pinsHeld > 0) return;\n if (platform === \"darwin\") {\n // Only float again if the app is active; otherwise did-become-active does.\n const active = BrowserWindow.getFocusedWindow() !== null;\n if (active) for (const w of macPinned) if (!w.isDestroyed()) w.setAlwaysOnTop(true, \"floating\");\n } else {\n for (const [w, owner] of heldChildren) {\n if (!w.isDestroyed() && !owner.isDestroyed()) w.setParentWindow(owner);\n }\n heldChildren.clear();\n }\n };\n}\n\nexport interface ToolWindowOptions {\n title: string;\n /** Renderer entry, relative to rendererDir (e.g. \"table.html\", \"search/index.html\"). Not used with `url`. */\n page?: string;\n /** Absolute path of the built renderer dir (join(import.meta.dirname, \"../renderer\")). Not used with `url`. */\n rendererDir?: string;\n /** Load this URL instead of a page from the renderer dir (a view window's `patter-view://...`). */\n url?: string;\n /** Absolute path of the preload bridge. */\n preload: string;\n /** A session partition of the window's own (a view's in-memory `view-<id>`); the default session otherwise. */\n partition?: string;\n /** Whether the window may open devtools; Electron's default (yes) when absent. */\n devTools?: boolean;\n rect: ToolWindowBounds;\n min?: ToolWindowSize;\n /** false = frameless: the renderer draws its own slim drag bar (.swin-head). */\n frame?: boolean;\n /** The window to PIN ABOVE: the app's main window, resolved at open time (a\n * getter, because the main window can be recreated). With `pinned` true\n * the new tool window rides above it - on macOS via activation-scoped\n * alwaysOnTop (a child window there follows the editor's drags), on\n * Windows and Linux as a child window (bare alwaysOnTop there floats over\n * the whole machine). See pinToolWindow for both findings. */\n pinTo?: () => BrowserWindow | undefined;\n /** Start pinned (the host remembers); flip later with `pinToolWindow`. */\n pinned?: boolean;\n /** Wire debounced bounds persistence into the host's store slice. */\n remember?: (bounds: ToolWindowBounds) => void;\n /** Fired when THIS window closes (identity-guarded; a stale close never\n * clears a newer window). Null the host's handle here. */\n onClosed?: () => void;\n}\n\n/** The pinnable detached-window factory (hardened webPreferences, one\n * preload, electron-vite's dev-URL/file split). Focuses and returns the\n * existing window when there is one; otherwise creates, wires, and loads. */\nexport function openToolWindow(existing: BrowserWindow | undefined | null, opts: ToolWindowOptions): BrowserWindow {\n if (existing && !existing.isDestroyed()) { existing.focus(); return existing; }\n if (opts.url === undefined && (opts.page === undefined || opts.rendererDir === undefined)) {\n throw new Error(\"openToolWindow needs a url, or a page and its rendererDir\");\n }\n const w = new BrowserWindow({\n ...opts.rect,\n ...(opts.min !== undefined ? { minWidth: opts.min.width, minHeight: opts.min.height } : {}),\n show: false,\n title: opts.title,\n ...(opts.frame !== undefined ? { frame: opts.frame } : {}),\n webPreferences: {\n contextIsolation: true, nodeIntegration: false, sandbox: true,\n // Electron's defaults, said out loud: no webview tag, and a dropped file never navigates the window.\n webviewTag: false, navigateOnDragDrop: false,\n preload: opts.preload,\n ...(opts.partition !== undefined ? { partition: opts.partition } : {}),\n ...(opts.devTools !== undefined ? { devTools: opts.devTools } : {}),\n },\n });\n if (opts.pinTo !== undefined) pinToolWindow(w, opts.pinTo(), opts.pinned ?? false);\n if (opts.remember) rememberBounds(w, opts.remember);\n w.once(\"ready-to-show\", () => w.show());\n if (opts.onClosed) w.on(\"closed\", opts.onClosed);\n if (opts.url !== undefined) void w.loadURL(opts.url);\n else if (process.env[\"ELECTRON_RENDERER_URL\"]) void w.loadURL(`${process.env[\"ELECTRON_RENDERER_URL\"]}/${opts.page}`);\n else void w.loadFile(join(opts.rendererDir!, opts.page!));\n return w;\n}\n\n// ---------------------------------------------------------------------------\n// The tool windows AS DATA: one row per window, and everything that walks the\n// windows walks the rows. Lifted from Storyletter's TOOL_WINDOWS table +\n// openToolWindowFor + rescueWindows (studio/src/main/index.ts), where it had\n// replaced four near-identical openX() functions whose differences were all\n// mistakes (only one forwarded its console; Reset View rescued two of four).\n// Patterpad's three hand copies (createPlayWindow / createSearchWindow /\n// createCoverageWindow and a four-branch rescueWindows) become three rows.\n//\n// Two things the table makes structurally impossible: forgetting to register\n// a window as a satellite for the project-changed nudge (every row is\n// registered when a session is given), and Reset View rescuing a subset (it\n// walks the rows).\n// ---------------------------------------------------------------------------\n\n\nexport interface ToolWindowSpec<N extends string = string> {\n /** The window's key: the store slice it remembers under, the dev-console\n * prefix, and what `open(name)` takes. */\n name: N;\n title: string;\n /** Renderer entry, relative to the env's rendererDir. */\n page: string;\n def: ToolWindowSize;\n min: ToolWindowSize;\n /** The remembered rect, read at open time (a store read-through). */\n bounds: () => ToolWindowBounds | undefined;\n /** Persist a moved / resized rect (debounced by the factory). */\n remember: (bounds: ToolWindowBounds) => void;\n /** Whether it starts pinned above the editor (both apps default true). */\n pinned: () => boolean;\n /** Frameless (the family's shape: the renderer draws `toolWindowHead`).\n * Default false = frameless; pass `frame: true` for an OS title bar. */\n frame?: boolean;\n /** The project-changed channel for THIS window when it differs from the\n * env's (Storyletter's Links window listens on \"links:focus\"). */\n channel?: string;\n /** Drop what main caches for the outgoing project on this window's behalf\n * (a coverage report, a search anchor). Runs whether the window is open\n * or not: see session.ts. */\n clear?: () => void;\n}\n\nexport interface ToolWindowEnv {\n /** Absolute path of the built renderer dir. */\n rendererDir: string;\n /** Absolute path of the preload bridge. */\n preload: string;\n /** The window to pin above: the app's main window, resolved at open time. */\n pinTo: () => BrowserWindow | undefined;\n /** Register every row as a satellite of the project session, so a new\n * project cannot open underneath a tool window that still shows the old\n * one. `channel` is the nudge each window listens on (a row may override). */\n session?: { addSatellite: (satellite: Satellite) => () => void; channel: string };\n /** Reset View's store half, run first: forget every remembered rect and\n * set pinned true (`resetWindows(store)` from app-store, or the app's own). */\n resetStore?: () => void;\n /** The channel a rescued window's renderer hears its re-pin on, so its pin\n * button agrees with the store (default \"state:pinned\"). */\n pinChannel?: string;\n /** Runs once per window created: forward its console in dev, say. */\n onOpened?: (w: BrowserWindow, name: string) => void;\n}\n\nexport interface ToolWindows<N extends string> {\n /** Open (or focus) one window by name. */\n open(name: N): BrowserWindow;\n /** The live window, if open. */\n get(name: N): BrowserWindow | undefined;\n /** Reset View's window half, over the table: store reset, then every open\n * window restored, default size, centred, re-pinned, and told so. */\n rescue(): void;\n /** Every window that is open right now. */\n all(): BrowserWindow[];\n readonly names: readonly N[];\n}\n\n/** Build the table. The windows are owned here: a host reads them through\n * `get(name)` rather than holding module variables of its own. */\nexport function defineToolWindows<N extends string>(specs: ToolWindowSpec<N>[], env: ToolWindowEnv): ToolWindows<N> {\n const live = new Map<N, BrowserWindow>();\n const byName = (name: N): ToolWindowSpec<N> => {\n const found = specs.find((s) => s.name === name);\n if (!found) throw new Error(`no tool window \"${name}\"`);\n return found;\n };\n const get = (name: N): BrowserWindow | undefined => {\n const w = live.get(name);\n return w && !w.isDestroyed() ? w : undefined;\n };\n if (env.session) {\n for (const spec of specs) {\n env.session.addSatellite({\n window: () => get(spec.name),\n channel: spec.channel ?? env.session.channel,\n ...(spec.clear ? { clear: spec.clear } : {}),\n });\n }\n }\n const open = (name: N): BrowserWindow => {\n const spec = byName(name);\n const existing = get(name);\n const opened = openToolWindow(existing, {\n title: spec.title, page: spec.page, frame: spec.frame ?? false,\n rendererDir: env.rendererDir, preload: env.preload,\n rect: savedWindowRect(spec.bounds(), spec.def, spec.min),\n min: spec.min,\n pinTo: env.pinTo,\n pinned: spec.pinned(),\n remember: spec.remember,\n });\n if (opened !== existing) {\n live.set(name, opened);\n // Identity-guarded: a stale close never clears a newer window.\n opened.on(\"closed\", () => { if (live.get(name) === opened) live.delete(name); });\n env.onOpened?.(opened, name);\n }\n return opened;\n };\n const rescue = (): void => {\n env.resetStore?.();\n for (const spec of specs) rescueToolWindow(get(spec.name), spec.def);\n // ACTUALLY pin them, then tell them. `rescueToolWindow` restores, resizes,\n // centres and raises but never pins; the store now says pinned, so the\n // window and its button have to agree before the claim is made.\n for (const spec of specs) {\n const w = get(spec.name);\n if (!w) continue;\n pinToolWindow(w, env.pinTo(), true);\n w.webContents.send(env.pinChannel ?? \"state:pinned\", true);\n }\n };\n return {\n open, get, rescue,\n all: () => specs.map((s) => get(s.name)).filter((w): w is BrowserWindow => w !== undefined),\n names: specs.map((s) => s.name),\n };\n}\n"]}
|
package/dist/controls.css
CHANGED
|
@@ -377,4 +377,56 @@ kbd {
|
|
|
377
377
|
.shell-fold-body:empty {
|
|
378
378
|
display: none;
|
|
379
379
|
}
|
|
380
|
+
.shell-recordgrid-table {
|
|
381
|
+
width: 100%;
|
|
382
|
+
border-collapse: collapse;
|
|
383
|
+
}
|
|
384
|
+
.shell-recordgrid-table th {
|
|
385
|
+
font: 600 12px/1.3 var(--font-ui);
|
|
386
|
+
color: var(--muted);
|
|
387
|
+
text-align: left;
|
|
388
|
+
padding: 4px 6px;
|
|
389
|
+
vertical-align: top;
|
|
390
|
+
}
|
|
391
|
+
.shell-recordgrid-table td {
|
|
392
|
+
padding: 3px 6px;
|
|
393
|
+
vertical-align: top;
|
|
394
|
+
}
|
|
395
|
+
.shell-recordgrid-table tbody tr {
|
|
396
|
+
border-top: 1px solid var(--line);
|
|
397
|
+
}
|
|
398
|
+
.shell-recordgrid-table th.shell-recordgrid-key {
|
|
399
|
+
color: var(--ink);
|
|
400
|
+
padding-top: 9px;
|
|
401
|
+
white-space: nowrap;
|
|
402
|
+
}
|
|
403
|
+
.shell-recordgrid-gone {
|
|
404
|
+
color: var(--danger);
|
|
405
|
+
font-weight: 400;
|
|
406
|
+
}
|
|
407
|
+
.shell-recordgrid-tools {
|
|
408
|
+
width: 1%;
|
|
409
|
+
white-space: nowrap;
|
|
410
|
+
}
|
|
411
|
+
.shell-recordgrid-cell {
|
|
412
|
+
display: block;
|
|
413
|
+
}
|
|
414
|
+
.shell-recordgrid-cell > .shell-fieldrow-label,
|
|
415
|
+
.shell-recordgrid-cell .shell-fieldrow-purpose,
|
|
416
|
+
.shell-recordgrid-cell .shell-fieldrow-valuehelp {
|
|
417
|
+
display: none;
|
|
418
|
+
}
|
|
419
|
+
.shell-recordgrid-cell select,
|
|
420
|
+
.shell-recordgrid-cell input {
|
|
421
|
+
width: 100%;
|
|
422
|
+
min-width: 7em;
|
|
423
|
+
}
|
|
424
|
+
.shell-recordgrid-empty {
|
|
425
|
+
margin: 6px 0;
|
|
426
|
+
font: 12.5px/1.4 var(--font-ui);
|
|
427
|
+
color: var(--muted);
|
|
428
|
+
}
|
|
429
|
+
.shell-recordgrid-add {
|
|
430
|
+
margin-top: 8px;
|
|
431
|
+
}
|
|
380
432
|
/*# sourceMappingURL=controls.css.map */
|
package/dist/controls.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/controls.css"],"sourcesContent":["/* ============================================================================\n The family's control grammar: one button, one field, one segmented control,\n one pill, one empty-state line, one keycap. Class-scoped throughout, never\n an element reset: a stylesheet that restyles every <button> in a window is a\n blast radius, and the two apps had five spellings of \"primary button\" using\n four foreground tokens between them (ui-review-2026-09, finding 20).\n\n Reads the token grammar (tokens.css) and the app's palette (--surface,\n --card, --ink, --muted, --line, --accent, --danger, --on-accent; optional\n --accent-soft, --line-soft, --font-mono). The keyboard focus ring is the\n family's one rule in tokens.css, so nothing here draws another.\n\n \"Controls have edges\" (design-language.md, 2026-09-16): a button has a\n border or a fill at rest, and text a person can read without hovering.\n Ghost styling is ONLY for icon-only toolbar buttons in a bar that is itself\n the affordance. And \"Motion is interpolation\", as amended: the only thing\n that transitions on hover is colour, at --dur-quick. No lift, no shadow\n change, no scale.\n ============================================================================ */\n\n/* --- buttons ---------------------------------------------------------------- */\n.btn {\n display: inline-flex; align-items: center; justify-content: center; gap: 0.35em;\n padding: 5px 11px;\n border: 1px solid var(--line); border-radius: var(--radius-sm);\n background: var(--surface); color: var(--ink);\n font: 600 12.5px var(--font-ui); letter-spacing: 0.02em; line-height: 1.2;\n cursor: pointer; white-space: nowrap;\n -webkit-user-select: none; user-select: none;\n transition: color var(--dur-quick) var(--ease-standard),\n background var(--dur-quick) var(--ease-standard),\n border-color var(--dur-quick) var(--ease-standard);\n}\n.btn:hover:not(:disabled) {\n border-color: var(--accent);\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 10%, transparent));\n}\n.btn:disabled { opacity: 0.45; cursor: default; }\n\n/* The one action a dialog or a bar is for: accent fill, the palette's own ink\n on it (never a raw white, which read white-on-tan on the dark palettes). */\n.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }\n.btn.primary:hover:not(:disabled) {\n background: color-mix(in oklab, var(--accent) 88%, var(--ink));\n border-color: color-mix(in oklab, var(--accent) 88%, var(--ink));\n color: var(--on-accent);\n}\n\n/* The destructive action, and it names its object (\"Delete scene\"). */\n.btn.danger { background: var(--danger); border-color: var(--danger); color: var(--surface); }\n.btn.danger:hover:not(:disabled) {\n background: color-mix(in oklab, var(--danger) 88%, var(--ink));\n border-color: color-mix(in oklab, var(--danger) 88%, var(--ink));\n color: var(--surface);\n}\n\n/* ONLY for an icon-only button in a toolbar: borderless, muted, a wash on\n hover. A text action drawn this way is the \"bare muted text on the ground\"\n the design language rules out. */\n.btn.ghost { border-color: transparent; background: none; color: var(--muted); }\n.btn.ghost:hover:not(:disabled) {\n border-color: transparent; color: var(--ink);\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 10%, transparent));\n}\n\n/* A square button holding one glyph, centred explicitly: a bare <button>\n centres by the font's metrics plus UA padding, which parks an arrow up-left\n of the square's visual centre. */\n.btn.icon { width: 28px; height: 28px; padding: 0; line-height: 1; font-size: 13.5px; }\n\n/* --- fields ----------------------------------------------------------------- */\n.field {\n font: inherit; font-size: 13.5px; line-height: 1.4;\n padding: 6px 9px;\n border: 1px solid var(--line); border-radius: var(--radius-sm);\n background: var(--card); color: var(--ink);\n -webkit-user-select: text; user-select: text;\n transition: border-color var(--dur-quick) var(--ease-standard);\n}\n.field:focus-visible { border-color: var(--accent); outline-offset: 0; }\n/* A placeholder is a hint, not content: lighter and italic, its opacity\n pinned so no engine fades an already-muted colour a second time. */\n.field::placeholder { color: var(--muted); font-style: italic; opacity: 1; }\n/* `.invalid` is the dup guard's (a value that clashes with another row);\n `.illegal` is a value that breaks a rule. Both can be true at once, so they\n are separate classes that draw the same. */\n.field.invalid, .field.illegal { border-color: var(--danger); }\n.field:disabled { opacity: 0.55; cursor: default; }\ntextarea.field { resize: vertical; }\n\n/* --- segmented control ------------------------------------------------------ */\n/* One bordered strip, options divided by hairlines, the chosen one washed. Seven\n hand-rolled copies across the two apps agreed on everything but the radius\n (finding 21); this is the one they converge on. */\n.seg { display: inline-flex; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }\n.seg-opt {\n background: none; border: 0; cursor: pointer;\n color: var(--muted); font: 600 12px var(--font-ui); padding: 3px 9.5px; white-space: nowrap;\n transition: color var(--dur-quick) var(--ease-standard), background var(--dur-quick) var(--ease-standard);\n}\n.seg-opt + .seg-opt { border-left: 1px solid var(--line); }\n.seg-opt:hover:not(.on) { color: var(--ink); }\n.seg-opt.on {\n color: var(--accent); cursor: default;\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 14%, transparent));\n}\n\n/* A quality's value as its ladder (value-control.ts rungStrip): the rungs in order, the current one marked.\n Stage names keep the mono voice values use. An unset value's fallback rung is marked quietly; a value that\n is no longer a stage is shown after the ladder, in the warning colour, until a rung is picked. */\n.shell-rungs { flex-wrap: wrap; }\n.shell-rung { font-family: var(--font-mono); font-weight: 400; padding: 2px 7px; }\n.shell-rung.on { font-weight: 600; }\n.shell-rung.fallback { color: var(--ink); text-decoration: underline dotted; text-underline-offset: 3px; }\n.shell-rung-default { font-family: var(--font-ui); }\n.shell-rung.stray { color: var(--warn, var(--danger, var(--accent))); text-decoration: line-through; cursor: default; }\nspan.shell-rung { cursor: default; }\n\n/* A declared field's value as a row (value-control.ts fieldRow): the caption, then the control with the\n purpose and any message under it. The grid is the app's (it passes its own row class); these are the\n parts both apps share. A flags value is a picker of the declared values: chips, the set ones washed. */\n.shell-fieldrow-body { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; min-width: 0; }\n.shell-fieldrow-textual .shell-fieldrow-body { align-items: stretch; }\n.shell-fieldrow-text { min-width: 0; }\ntextarea.shell-fieldrow-text { min-height: 3.6em; font-family: inherit; line-height: 1.4; }\n.shell-fieldrow-purpose { margin: 0; font: 12px/1.4 var(--font-ui); color: var(--muted); max-width: 60ch; }\n.shell-fieldrow-problem { margin: 0; font: 12px/1.4 var(--font-ui); color: var(--warn, var(--danger, var(--accent))); }\n.shell-fieldrow.has-problem .shell-fieldrow-text { border-color: var(--warn, var(--danger)); }\n.shell-flags { display: inline-flex; flex-wrap: wrap; gap: 4px; }\n.shell-flag {\n display: inline-flex; align-items: center; border: 1px solid var(--line); border-radius: var(--radius-pill);\n background: none; color: var(--muted); font: 12px var(--font-mono); padding: 1px 8px; cursor: pointer;\n}\n.shell-flag:hover:not(.on):not(span) { color: var(--ink); }\n.shell-flag.on { color: var(--accent); border-color: var(--accent); background: var(--accent-soft, color-mix(in oklab, var(--accent) 14%, transparent)); }\n.shell-flag.fallback { color: var(--ink); border-style: dashed; background: none; }\n.shell-flag-default { font-family: var(--font-ui); }\n.shell-flag-default.on { cursor: default; }\n.shell-flag.stray { color: var(--warn, var(--danger, var(--accent))); border-color: currentColor; background: none; text-decoration: line-through; }\nspan.shell-flag { cursor: default; }\n\n/* --- small things ----------------------------------------------------------- */\n/* A pill: a small bordered label (a class, a count, a state). */\n.pill {\n display: inline-flex; align-items: center; gap: 4px;\n font: 11.5px/1.3 var(--font-ui); color: var(--muted);\n border: 1px solid var(--line-soft, var(--line)); border-radius: var(--radius-pill);\n padding: 1px 7px; white-space: nowrap;\n}\n\n/* The inline empty state: one muted italic sentence where a list would be. */\n.empty { margin: 0; color: var(--muted); font: italic 13px/1.45 var(--font-ui); }\n\n/* A keycap. A key hint is an element, never a typed \"↑↓ move\" string. The\n element rule is the floor for a hand-written <kbd>; the shell's own hint\n helpers (keys.ts) stamp `.shell-kbd`, drawn in keys.css. */\nkbd {\n display: inline-block;\n font: 11px/1.3 var(--font-mono, ui-monospace, monospace);\n color: var(--muted);\n border: 1px solid var(--line); border-bottom-width: 2px; border-radius: var(--radius-sm);\n padding: 1px 5px; vertical-align: baseline;\n}\n\n/* --- metadata and breadcrumbs ---------------------------------------------- */\n/* A metadata line (`metaLine` in dom.ts): parts in a row, each after the first\n led by a DRAWN 3px disc. Never a \"·\" character: that is a typed separator,\n and it renders at whatever weight and height the symbol font has. The disc\n is the muted ink, the row inherits its size from wherever it sits. */\n.shell-meta { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; min-width: 0; }\n.shell-meta-part { display: inline-flex; align-items: center; gap: 8px; min-width: 0; white-space: nowrap; }\n.shell-meta-part + .shell-meta-part::before {\n content: \"\"; flex: none; width: 3px; height: 3px;\n border-radius: var(--radius-pill); background: var(--muted);\n}\n\n/* A breadcrumb trail (`breadcrumb` in dom.ts): crumbs with the vocabulary's\n `forward` chevron drawn between them. A crumb that goes somewhere is a\n button coloured as a link (it reads as a control with the pointer parked);\n the last crumb is where the reader is, in the ink. */\n.shell-crumbs { display: inline-flex; align-items: center; gap: 2px; min-width: 0; font: 12.5px/1.3 var(--font-ui); }\n.shell-crumb { color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }\n.shell-crumb[aria-current] { color: var(--ink); }\n.shell-crumb-sep { flex: none; color: var(--muted); opacity: 0.7; }\n.shell-crumb-link {\n font: inherit; background: none; border: 0; padding: 0 2px; margin: 0;\n border-radius: var(--radius-sm); color: var(--accent); cursor: pointer;\n transition: color var(--dur-quick) var(--ease-standard);\n}\n.shell-crumb-link:hover { color: var(--ink); text-decoration: underline; }\n\n/* Structured values (record, map, list): the parts, each a field row of its own, indented under the\n caption, with a map's and a list's own controls beside each part. */\n.shell-valuerow-parts { gap: 6px; padding-left: 10px; border-left: 1px solid var(--line, color-mix(in oklab, var(--ink) 14%, transparent)); }\n.shell-valuerow-part { display: flex; align-items: flex-start; gap: 6px; width: 100%; }\n.shell-valuerow-part > .shell-fieldrow { flex: 1; min-width: 0; }\n.shell-valuerow-controls { display: inline-flex; gap: 2px; padding-top: 2px; }\n.shell-valuerow-controls:empty { display: none; }\n.shell-valuerow-add { display: inline-flex; align-items: center; gap: 4px; }\n.shell-valuerow-key { min-width: 10em; }\n/* The chosen value's own help (a manifest's valueHelp): a line per chosen flag. */\n.shell-fieldrow-valuehelp { white-space: pre-line; }\n\n/* An extension's section, folded to the fields a node sets (value-rows' extensionFold). The caption is the\n disclosure: a quiet full-width button, the chevron then the name and its count. */\n.shell-fold-cap {\n display: flex; align-items: center; gap: 4px; width: 100%;\n padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer;\n}\n.shell-fold-cap svg { flex: none; color: var(--muted); }\n.shell-fold-cap:hover svg, .shell-fold-cap:focus-visible svg { color: var(--ink); }\n.shell-fold-cap:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }\n.shell-fold-body:empty { display: none; }\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/controls.css"],"sourcesContent":["/* ============================================================================\n The family's control grammar: one button, one field, one segmented control,\n one pill, one empty-state line, one keycap. Class-scoped throughout, never\n an element reset: a stylesheet that restyles every <button> in a window is a\n blast radius, and the two apps had five spellings of \"primary button\" using\n four foreground tokens between them (ui-review-2026-09, finding 20).\n\n Reads the token grammar (tokens.css) and the app's palette (--surface,\n --card, --ink, --muted, --line, --accent, --danger, --on-accent; optional\n --accent-soft, --line-soft, --font-mono). The keyboard focus ring is the\n family's one rule in tokens.css, so nothing here draws another.\n\n \"Controls have edges\" (design-language.md, 2026-09-16): a button has a\n border or a fill at rest, and text a person can read without hovering.\n Ghost styling is ONLY for icon-only toolbar buttons in a bar that is itself\n the affordance. And \"Motion is interpolation\", as amended: the only thing\n that transitions on hover is colour, at --dur-quick. No lift, no shadow\n change, no scale.\n ============================================================================ */\n\n/* --- buttons ---------------------------------------------------------------- */\n.btn {\n display: inline-flex; align-items: center; justify-content: center; gap: 0.35em;\n padding: 5px 11px;\n border: 1px solid var(--line); border-radius: var(--radius-sm);\n background: var(--surface); color: var(--ink);\n font: 600 12.5px var(--font-ui); letter-spacing: 0.02em; line-height: 1.2;\n cursor: pointer; white-space: nowrap;\n -webkit-user-select: none; user-select: none;\n transition: color var(--dur-quick) var(--ease-standard),\n background var(--dur-quick) var(--ease-standard),\n border-color var(--dur-quick) var(--ease-standard);\n}\n.btn:hover:not(:disabled) {\n border-color: var(--accent);\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 10%, transparent));\n}\n.btn:disabled { opacity: 0.45; cursor: default; }\n\n/* The one action a dialog or a bar is for: accent fill, the palette's own ink\n on it (never a raw white, which read white-on-tan on the dark palettes). */\n.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }\n.btn.primary:hover:not(:disabled) {\n background: color-mix(in oklab, var(--accent) 88%, var(--ink));\n border-color: color-mix(in oklab, var(--accent) 88%, var(--ink));\n color: var(--on-accent);\n}\n\n/* The destructive action, and it names its object (\"Delete scene\"). */\n.btn.danger { background: var(--danger); border-color: var(--danger); color: var(--surface); }\n.btn.danger:hover:not(:disabled) {\n background: color-mix(in oklab, var(--danger) 88%, var(--ink));\n border-color: color-mix(in oklab, var(--danger) 88%, var(--ink));\n color: var(--surface);\n}\n\n/* ONLY for an icon-only button in a toolbar: borderless, muted, a wash on\n hover. A text action drawn this way is the \"bare muted text on the ground\"\n the design language rules out. */\n.btn.ghost { border-color: transparent; background: none; color: var(--muted); }\n.btn.ghost:hover:not(:disabled) {\n border-color: transparent; color: var(--ink);\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 10%, transparent));\n}\n\n/* A square button holding one glyph, centred explicitly: a bare <button>\n centres by the font's metrics plus UA padding, which parks an arrow up-left\n of the square's visual centre. */\n.btn.icon { width: 28px; height: 28px; padding: 0; line-height: 1; font-size: 13.5px; }\n\n/* --- fields ----------------------------------------------------------------- */\n.field {\n font: inherit; font-size: 13.5px; line-height: 1.4;\n padding: 6px 9px;\n border: 1px solid var(--line); border-radius: var(--radius-sm);\n background: var(--card); color: var(--ink);\n -webkit-user-select: text; user-select: text;\n transition: border-color var(--dur-quick) var(--ease-standard);\n}\n.field:focus-visible { border-color: var(--accent); outline-offset: 0; }\n/* A placeholder is a hint, not content: lighter and italic, its opacity\n pinned so no engine fades an already-muted colour a second time. */\n.field::placeholder { color: var(--muted); font-style: italic; opacity: 1; }\n/* `.invalid` is the dup guard's (a value that clashes with another row);\n `.illegal` is a value that breaks a rule. Both can be true at once, so they\n are separate classes that draw the same. */\n.field.invalid, .field.illegal { border-color: var(--danger); }\n.field:disabled { opacity: 0.55; cursor: default; }\ntextarea.field { resize: vertical; }\n\n/* --- segmented control ------------------------------------------------------ */\n/* One bordered strip, options divided by hairlines, the chosen one washed. Seven\n hand-rolled copies across the two apps agreed on everything but the radius\n (finding 21); this is the one they converge on. */\n.seg { display: inline-flex; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }\n.seg-opt {\n background: none; border: 0; cursor: pointer;\n color: var(--muted); font: 600 12px var(--font-ui); padding: 3px 9.5px; white-space: nowrap;\n transition: color var(--dur-quick) var(--ease-standard), background var(--dur-quick) var(--ease-standard);\n}\n.seg-opt + .seg-opt { border-left: 1px solid var(--line); }\n.seg-opt:hover:not(.on) { color: var(--ink); }\n.seg-opt.on {\n color: var(--accent); cursor: default;\n background: var(--accent-soft, color-mix(in oklab, var(--accent) 14%, transparent));\n}\n\n/* A quality's value as its ladder (value-control.ts rungStrip): the rungs in order, the current one marked.\n Stage names keep the mono voice values use. An unset value's fallback rung is marked quietly; a value that\n is no longer a stage is shown after the ladder, in the warning colour, until a rung is picked. */\n.shell-rungs { flex-wrap: wrap; }\n.shell-rung { font-family: var(--font-mono); font-weight: 400; padding: 2px 7px; }\n.shell-rung.on { font-weight: 600; }\n.shell-rung.fallback { color: var(--ink); text-decoration: underline dotted; text-underline-offset: 3px; }\n.shell-rung-default { font-family: var(--font-ui); }\n.shell-rung.stray { color: var(--warn, var(--danger, var(--accent))); text-decoration: line-through; cursor: default; }\nspan.shell-rung { cursor: default; }\n\n/* A declared field's value as a row (value-control.ts fieldRow): the caption, then the control with the\n purpose and any message under it. The grid is the app's (it passes its own row class); these are the\n parts both apps share. A flags value is a picker of the declared values: chips, the set ones washed. */\n.shell-fieldrow-body { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; min-width: 0; }\n.shell-fieldrow-textual .shell-fieldrow-body { align-items: stretch; }\n.shell-fieldrow-text { min-width: 0; }\ntextarea.shell-fieldrow-text { min-height: 3.6em; font-family: inherit; line-height: 1.4; }\n.shell-fieldrow-purpose { margin: 0; font: 12px/1.4 var(--font-ui); color: var(--muted); max-width: 60ch; }\n.shell-fieldrow-problem { margin: 0; font: 12px/1.4 var(--font-ui); color: var(--warn, var(--danger, var(--accent))); }\n.shell-fieldrow.has-problem .shell-fieldrow-text { border-color: var(--warn, var(--danger)); }\n.shell-flags { display: inline-flex; flex-wrap: wrap; gap: 4px; }\n.shell-flag {\n display: inline-flex; align-items: center; border: 1px solid var(--line); border-radius: var(--radius-pill);\n background: none; color: var(--muted); font: 12px var(--font-mono); padding: 1px 8px; cursor: pointer;\n}\n.shell-flag:hover:not(.on):not(span) { color: var(--ink); }\n.shell-flag.on { color: var(--accent); border-color: var(--accent); background: var(--accent-soft, color-mix(in oklab, var(--accent) 14%, transparent)); }\n.shell-flag.fallback { color: var(--ink); border-style: dashed; background: none; }\n.shell-flag-default { font-family: var(--font-ui); }\n.shell-flag-default.on { cursor: default; }\n.shell-flag.stray { color: var(--warn, var(--danger, var(--accent))); border-color: currentColor; background: none; text-decoration: line-through; }\nspan.shell-flag { cursor: default; }\n\n/* --- small things ----------------------------------------------------------- */\n/* A pill: a small bordered label (a class, a count, a state). */\n.pill {\n display: inline-flex; align-items: center; gap: 4px;\n font: 11.5px/1.3 var(--font-ui); color: var(--muted);\n border: 1px solid var(--line-soft, var(--line)); border-radius: var(--radius-pill);\n padding: 1px 7px; white-space: nowrap;\n}\n\n/* The inline empty state: one muted italic sentence where a list would be. */\n.empty { margin: 0; color: var(--muted); font: italic 13px/1.45 var(--font-ui); }\n\n/* A keycap. A key hint is an element, never a typed \"↑↓ move\" string. The\n element rule is the floor for a hand-written <kbd>; the shell's own hint\n helpers (keys.ts) stamp `.shell-kbd`, drawn in keys.css. */\nkbd {\n display: inline-block;\n font: 11px/1.3 var(--font-mono, ui-monospace, monospace);\n color: var(--muted);\n border: 1px solid var(--line); border-bottom-width: 2px; border-radius: var(--radius-sm);\n padding: 1px 5px; vertical-align: baseline;\n}\n\n/* --- metadata and breadcrumbs ---------------------------------------------- */\n/* A metadata line (`metaLine` in dom.ts): parts in a row, each after the first\n led by a DRAWN 3px disc. Never a \"·\" character: that is a typed separator,\n and it renders at whatever weight and height the symbol font has. The disc\n is the muted ink, the row inherits its size from wherever it sits. */\n.shell-meta { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; min-width: 0; }\n.shell-meta-part { display: inline-flex; align-items: center; gap: 8px; min-width: 0; white-space: nowrap; }\n.shell-meta-part + .shell-meta-part::before {\n content: \"\"; flex: none; width: 3px; height: 3px;\n border-radius: var(--radius-pill); background: var(--muted);\n}\n\n/* A breadcrumb trail (`breadcrumb` in dom.ts): crumbs with the vocabulary's\n `forward` chevron drawn between them. A crumb that goes somewhere is a\n button coloured as a link (it reads as a control with the pointer parked);\n the last crumb is where the reader is, in the ink. */\n.shell-crumbs { display: inline-flex; align-items: center; gap: 2px; min-width: 0; font: 12.5px/1.3 var(--font-ui); }\n.shell-crumb { color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }\n.shell-crumb[aria-current] { color: var(--ink); }\n.shell-crumb-sep { flex: none; color: var(--muted); opacity: 0.7; }\n.shell-crumb-link {\n font: inherit; background: none; border: 0; padding: 0 2px; margin: 0;\n border-radius: var(--radius-sm); color: var(--accent); cursor: pointer;\n transition: color var(--dur-quick) var(--ease-standard);\n}\n.shell-crumb-link:hover { color: var(--ink); text-decoration: underline; }\n\n/* Structured values (record, map, list): the parts, each a field row of its own, indented under the\n caption, with a map's and a list's own controls beside each part. */\n.shell-valuerow-parts { gap: 6px; padding-left: 10px; border-left: 1px solid var(--line, color-mix(in oklab, var(--ink) 14%, transparent)); }\n.shell-valuerow-part { display: flex; align-items: flex-start; gap: 6px; width: 100%; }\n.shell-valuerow-part > .shell-fieldrow { flex: 1; min-width: 0; }\n.shell-valuerow-controls { display: inline-flex; gap: 2px; padding-top: 2px; }\n.shell-valuerow-controls:empty { display: none; }\n.shell-valuerow-add { display: inline-flex; align-items: center; gap: 4px; }\n.shell-valuerow-key { min-width: 10em; }\n/* The chosen value's own help (a manifest's valueHelp): a line per chosen flag. */\n.shell-fieldrow-valuehelp { white-space: pre-line; }\n\n/* An extension's section, folded to the fields a node sets (value-rows' extensionFold). The caption is the\n disclosure: a quiet full-width button, the chevron then the name and its count. */\n.shell-fold-cap {\n display: flex; align-items: center; gap: 4px; width: 100%;\n padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer;\n}\n.shell-fold-cap svg { flex: none; color: var(--muted); }\n.shell-fold-cap:hover svg, .shell-fold-cap:focus-visible svg { color: var(--ink); }\n.shell-fold-cap:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }\n.shell-fold-body:empty { display: none; }\n\n/* A map of records as a grid (value-rows' recordMapGrid): a row per key, a column per record field, each\n cell the field's own row with its caption and help left to the column head. */\n.shell-recordgrid-table { width: 100%; border-collapse: collapse; }\n.shell-recordgrid-table th { font: 600 12px/1.3 var(--font-ui); color: var(--muted); text-align: left; padding: 4px 6px; vertical-align: top; }\n.shell-recordgrid-table td { padding: 3px 6px; vertical-align: top; }\n.shell-recordgrid-table tbody tr { border-top: 1px solid var(--line); }\n.shell-recordgrid-table th.shell-recordgrid-key { color: var(--ink); padding-top: 9px; white-space: nowrap; }\n.shell-recordgrid-gone { color: var(--danger); font-weight: 400; }\n.shell-recordgrid-tools { width: 1%; white-space: nowrap; }\n.shell-recordgrid-cell { display: block; }\n.shell-recordgrid-cell > .shell-fieldrow-label,\n.shell-recordgrid-cell .shell-fieldrow-purpose,\n.shell-recordgrid-cell .shell-fieldrow-valuehelp { display: none; }\n.shell-recordgrid-cell select, .shell-recordgrid-cell input { width: 100%; min-width: 7em; }\n.shell-recordgrid-empty { margin: 6px 0; font: 12.5px/1.4 var(--font-ui); color: var(--muted); }\n.shell-recordgrid-add { margin-top: 8px; }\n"],"mappings":"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","names":[]}
|