@wildwinter/app-shell 0.58.0 → 0.58.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { fieldRow, fieldRowFocus } from './chunk-XJM733E6.js';
1
+ import { fieldRow, valueHelpText, fieldRowFocus } from './chunk-OO6O4LEL.js';
2
2
  import { el, iconBtn, iconNode, moveItem } from './chunk-W4WC4FO5.js';
3
3
  import { stableStringify, defaultOf, pickChoices, valueProblems } from '@wildwinter/toolkit/extensions';
4
4
 
@@ -381,9 +381,10 @@ function pickRow(initial) {
381
381
  const body = el("div", "shell-fieldrow-body");
382
382
  const sel = el("select", "field shell-fieldrow-select");
383
383
  const help = el("p", "shell-fieldrow-purpose");
384
+ const valueHelp = el("p", "shell-fieldrow-purpose shell-fieldrow-valuehelp");
384
385
  const problem = el("p", "shell-fieldrow-problem");
385
386
  problem.setAttribute("role", "status");
386
- body.append(sel, help, problem);
387
+ body.append(sel, help, valueHelp, problem);
387
388
  row.append(caption, body);
388
389
  sel.addEventListener("change", () => {
389
390
  const v = sel.value === "" ? void 0 : sel.value;
@@ -439,6 +440,8 @@ function pickRow(initial) {
439
440
  sel.disabled = o.onCommit === void 0 || o.disabled === true;
440
441
  help.textContent = o.decl.help ?? o.decl.purpose ?? "";
441
442
  help.hidden = help.textContent === "";
443
+ valueHelp.textContent = valueHelpText(o.decl, o.value);
444
+ valueHelp.hidden = valueHelp.textContent === "";
442
445
  const words = o.replaceProblem ?? [ownProblems(o.decl, o.value, o.adapter), o.problem ?? ""].filter((w) => w !== "").join(" ");
443
446
  problem.textContent = words;
444
447
  problem.hidden = words === "";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/value-fold.ts","../src/record-map.ts","../src/value-rows.ts"],"names":["isObject","defaultOf","n","pickChoices"],"mappings":"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","file":"value-rows.js","sourcesContent":["// ---------------------------------------------------------------------------\n// An extension's fields folded to the ones a node sets (Pattershot's brief,\n// \"extension fields folded\", rulings F1 to F9, 2026-10-20). An extension meant\n// to be left alone on most nodes drew every field on every node, nearly all\n// empty. Folded, its section is the caption, with a disclosure and a count,\n// and only the fields set; unfolded, every field, as before.\n//\n// One rule for the family, so Patterpad and Storyletter fold alike:\n// - set means the node holds a value that differs from the toolkit's\n// `defaultOf`, compared deeply (`isSet`); a field is set or not as a whole;\n// - the fold is per extension, and stays as left while the author moves\n// between nodes (for the session: it isn't stored);\n// - a value cleared while folded keeps its row until the author leaves the\n// node (a redraw that doesn't draw it, then `sweep`), so a row never vanishes\n// under the cursor;\n// - keys the extension doesn't declare, and the host's lead (a lock line),\n// always show.\n//\n// The host draws each row (its own cache, classes and problems); this draws\n// the section around them. Project Settings doesn't fold: it's where an\n// author goes to set things, and draws its rows directly.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, stableStringify } from \"@wildwinter/toolkit/extensions\";\nimport type { TypeDecl } from \"@wildwinter/toolkit/extensions\";\nimport { el } from \"./dom.js\";\nimport { iconNode } from \"./icons.js\";\nimport type { ValueDecl } from \"./value-rows.js\";\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/**\n * Whether a node's value for `decl` is set: held, and not the declaration's default. A record counts as its\n * default when each of its fields does and it holds no other key, so `{}` and a record of defaults are both\n * unset; anything else is compared with `defaultOf`, deeply and regardless of key order.\n */\nexport function isSet(decl: ValueDecl, value: unknown): boolean {\n if (value === undefined) return false;\n if (decl.type === \"record\" && decl.default === undefined && isObject(value)) {\n const fields = decl.fields ?? [];\n const declared = new Set(fields.map((f) => f.name));\n if (Object.entries(value).some(([k, v]) => !declared.has(k) && v !== undefined)) return true;\n return fields.some((f) => isSet(f, value[f.name]));\n }\n return stableStringify(value) !== stableStringify(defaultOf(decl as unknown as TypeDecl));\n}\n\nexport interface FoldSectionOptions {\n /** The extension's id: the fold is remembered by it. */\n extension: string;\n /** The extension's name, the caption. */\n caption: string;\n /** The node the section is for, by any key unique to it: a row cleared while folded stays while the host\n * keeps drawing this node. */\n node: string;\n /** The extension's fields for the node's kind, in the manifest's order. */\n fields: readonly ValueDecl[];\n /** The node's values for the extension, or undefined where it holds none. */\n entry: Record<string, unknown> | undefined;\n /** One field's row, drawn by the host. */\n row: (decl: ValueDecl) => HTMLElement;\n /** A heading above the first shown field of a group. */\n group: (name: string) => HTMLElement;\n /** Shown above the rows, folded or not (a lock line). */\n lead?: readonly HTMLElement[];\n /** Shown after the rows, folded or not (keys the extension doesn't declare). */\n tail?: readonly HTMLElement[];\n /** The section's own class, beside `shell-fold`. */\n className?: string;\n /** The caption's class, beside `shell-fold-cap`. */\n captionClassName?: string;\n}\n\nexport interface ExtensionFold {\n /** Draw one extension's section for one node: the caption and disclosure, then the rows the fold shows. */\n section(o: FoldSectionOptions): HTMLElement;\n /** Whether an extension's section is open (every field). Folded until opened. */\n isOpen(extension: string): boolean;\n setOpen(extension: string, open: boolean): void;\n /** After a redraw: forget the rows kept for nodes it didn't draw, so leaving a node and coming back shows\n * only what is set. A host that redraws its whole view calls it at the end of each, as a row cache's. */\n sweep(): void;\n}\n\n/** The caption's words: the name, and the count when anything is set. */\nexport function foldCaption(name: string, set: number): string {\n return set > 0 ? `${name} (${set} set)` : name;\n}\n\n/**\n * The fold for a host's inspector: one per host, kept across its redraws, so the fold stays as left from node\n * to node.\n */\nexport function extensionFold(): ExtensionFold {\n const open = new Set<string>();\n // Per extension and node: the fields shown while folded, so a value cleared there keeps its row until the\n // author moves on. An inspector shows several nodes at once (a line, its block, its scene), so each keeps\n // its own; `sweep` drops the ones a redraw didn't draw.\n const shown = new Map<string, { fields: Set<string>; used: boolean }>();\n const keyOf = (o: FoldSectionOptions): string => `${o.extension}\\u0000${o.node}`;\n\n const visible = (o: FoldSectionOptions, setNames: ReadonlySet<string>): Set<string> => {\n const was = shown.get(keyOf(o));\n const fields = was ? new Set([...was.fields, ...setNames]) : new Set(setNames);\n shown.set(keyOf(o), { fields, used: true });\n return fields;\n };\n\n const fold: ExtensionFold = {\n isOpen: (extension) => open.has(extension),\n setOpen(extension, on) {\n if (on) open.add(extension); else open.delete(extension);\n // Folding again starts from what is set now.\n for (const key of shown.keys()) if (key.startsWith(`${extension}\\u0000`)) shown.delete(key);\n },\n sweep() {\n for (const [key, entry] of shown) { if (!entry.used) shown.delete(key); else entry.used = false; }\n },\n section(o) {\n const sec = el(\"div\", `shell-fold${o.className ? ` ${o.className}` : \"\"}`);\n sec.dataset[\"extension\"] = o.extension;\n const cap = el(\"button\", `shell-fold-cap${o.captionClassName ? ` ${o.captionClassName}` : \"\"}`);\n cap.type = \"button\";\n const body = el(\"div\", \"shell-fold-body\");\n sec.append(cap, body);\n\n const draw = (): void => {\n const isOpen = open.has(o.extension);\n const setNames = new Set(o.fields.filter((f) => isSet(f, o.entry?.[f.name])).map((f) => f.name));\n const show = isOpen ? undefined : visible(o, setNames);\n cap.replaceChildren(iconNode(isOpen ? \"expanded\" : \"collapsed\"), el(\"span\", \"shell-fold-name\", foldCaption(o.caption, setNames.size)));\n cap.setAttribute(\"aria-expanded\", String(isOpen));\n cap.dataset[\"tip\"] = isOpen ? `Show only the fields set here` : `Show every ${o.caption} field`;\n sec.classList.toggle(\"shell-fold-open\", isOpen);\n const rows: HTMLElement[] = [...(o.lead ?? [])];\n let group: string | undefined;\n for (const decl of o.fields) {\n if (show && !show.has(decl.name)) continue;\n const g = (decl as { group?: string }).group;\n if (g !== undefined && g !== group) { group = g; rows.push(o.group(g)); }\n rows.push(o.row(decl));\n }\n rows.push(...(o.tail ?? []));\n body.replaceChildren(...rows);\n };\n cap.addEventListener(\"click\", () => { fold.setOpen(o.extension, !open.has(o.extension)); draw(); });\n draw();\n return sec;\n },\n };\n return fold;\n}\n","// ---------------------------------------------------------------------------\n// A map whose values are records, edited as a grid (Pattershot's brief, \"a map\n// of records edited in a helper window\", rulings H1 to H5, 2026-10-20).\n// Pattershot's `performance` (a record of look, expression and gesture for\n// each member of the cast on a line) drew a record of rows per character in the\n// inspector's column: far too big. Such a field now shows in the inspector as a\n// short summary, a line per key, and is edited in a helper window that follows\n// the selection, as a grid: a row per key, a column per record field, each\n// cell the row value-rows draws for that field.\n//\n// Which fields: any map of records (`isRecordMap`), with no manifest change.\n// The window, its head and its messaging are each app's; the summary and the\n// grid are here, so both apps draw them alike.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, pickChoices } from \"@wildwinter/toolkit/extensions\";\nimport type { TypeDecl } from \"@wildwinter/toolkit/extensions\";\nimport { el, iconBtn } from \"./dom.js\";\nimport { fieldRowFocus } from \"./value-control.js\";\nimport { valueRow, type ValueAdapter, type ValueDecl, type ValueRowHandle } from \"./value-rows.js\";\nimport { isSet } from \"./value-fold.js\";\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** A map whose values are records: edited in the grid, summarised in the inspector. */\nexport function isRecordMap(decl: ValueDecl): boolean {\n return decl.type === \"map\" && decl.of?.type === \"record\";\n}\n\n/** A map key's name: a node's from the host, else the key itself. */\nexport function recordMapKeyLabel(decl: ValueDecl, key: string, adapter?: ValueAdapter): string {\n const kind = decl.key?.type === \"reference\" ? decl.key.to ?? \"\" : undefined;\n if (kind === undefined || !adapter) return key;\n return adapter.nodes(kind).find((n) => n.id === key)?.label ?? adapter.label?.(kind, key) ?? key;\n}\n\n/** A value as words, the way its control shows it: a pick's or a reference's name, flags joined, a boolean as\n * the field's own name. Empty for a value that isn't set. */\nexport function valueText(decl: ValueDecl, value: unknown, adapter?: ValueAdapter): string {\n if (!isSet(decl, value)) return \"\";\n if (decl.type === \"pick\" && typeof value === \"string\") {\n const choice = pickChoices(decl as unknown as TypeDecl, {\n ...(adapter ? { nodes: (kind: string) => adapter.nodes(kind) } : {}),\n ...(adapter?.list ? { list: (name: string) => adapter.list!(name) } : {}),\n }).find((c) => c.value === value);\n return choice?.label ?? value;\n }\n if (decl.type === \"reference\" && typeof value === \"string\" && decl.to !== undefined && adapter) {\n return adapter.nodes(decl.to).find((n) => n.id === value)?.label ?? adapter.label?.(decl.to, value) ?? value;\n }\n if (decl.type === \"boolean\") return value === true ? decl.label ?? decl.name : \"\";\n if (Array.isArray(value)) return value.map(String).join(\", \");\n if (isObject(value)) return JSON.stringify(value);\n return String(value);\n}\n\n/** The inspector's summary of a map of records: a line per key, \"TAM: smile, nod, WREN\", the record's set\n * fields in the manifest's order; a key with nothing set is its name alone. */\nexport function recordMapSummary(decl: ValueDecl, value: unknown, adapter?: ValueAdapter): string[] {\n if (!isObject(value)) return [];\n const fields = decl.of?.fields ?? [];\n return Object.entries(value).map(([key, record]) => {\n const name = recordMapKeyLabel(decl, key, adapter);\n const words = isObject(record) ? fields.map((f) => valueText(f, record[f.name], adapter)).filter((w) => w !== \"\") : [];\n return words.length > 0 ? `${name}: ${words.join(\", \")}` : name;\n });\n}\n\nexport interface RecordMapGridOptions {\n /** The map's declaration: `isRecordMap`. */\n decl: ValueDecl;\n /** The node's value, or undefined where it holds none. */\n value: unknown;\n /** The host's nodes, for a reference key and the cells' picks and references. */\n adapter?: ValueAdapter;\n /** Commit the whole map; undefined clears it. Absent: read-only. */\n onCommit?: (value: unknown) => void;\n disabled?: boolean;\n /** The class on each cell's control, as the host's own rows carry. */\n controlClassName?: string;\n}\n\nexport interface RecordMapGrid {\n readonly el: HTMLElement;\n update(opts: RecordMapGridOptions): void;\n}\n\n/**\n * The grid: a row per key, a column per record field, each cell the row value-rows draws for that field (so\n * picks, their checks and their problems are the same as in the inspector), a remove button per row, and the\n * key adder under it. Keeps its cells across `update`, so a host that redraws on every change keeps the\n * author's place.\n */\nexport function recordMapGrid(initial: RecordMapGridOptions): RecordMapGrid {\n let opts = initial;\n const root = el(\"div\", \"shell-recordgrid\");\n const table = el(\"table\", \"shell-recordgrid-table\");\n const head = el(\"thead\");\n const body = el(\"tbody\");\n table.append(head, body);\n const adder = el(\"div\", \"shell-recordgrid-add\");\n const empty = el(\"p\", \"shell-recordgrid-empty\");\n root.append(table, empty, adder);\n const cells = new Map<string, ValueRowHandle>();\n let addKey = \"\";\n\n const editable = (): boolean => opts.onCommit !== undefined && opts.disabled !== true;\n const held = (): Record<string, unknown> => (isObject(opts.value) ? opts.value : {});\n const commit = (next: Record<string, unknown>): void => {\n const v = Object.keys(next).length > 0 ? next : undefined;\n opts = { ...opts, value: v };\n draw();\n opts.onCommit?.(v);\n };\n\n const cell = (key: string, field: ValueDecl, record: Record<string, unknown>): HTMLElement => {\n const id = `${key}\\u0000${field.name}`;\n const o = {\n decl: field, value: record[field.name],\n ...(opts.adapter ? { adapter: opts.adapter } : {}),\n ...(opts.disabled !== undefined ? { disabled: opts.disabled } : {}),\n ...(opts.controlClassName !== undefined ? { controlClassName: opts.controlClassName } : {}),\n ...(editable() ? {\n onCommit: (v: unknown) => {\n const map = held();\n const rec: Record<string, unknown> = { ...(isObject(map[key]) ? map[key] as Record<string, unknown> : {}) };\n if (v === undefined) delete rec[field.name]; else rec[field.name] = v;\n commit({ ...map, [key]: rec });\n },\n } : {}),\n className: \"shell-recordgrid-cell\",\n };\n const had = cells.get(id);\n if (had && had.el.dataset[\"type\"] === field.type) {\n fieldRowFocus.settle(had.el);\n had.update(o);\n fieldRowFocus.restore(had.el);\n return had.el;\n }\n const handle = valueRow(o);\n handle.el.dataset[\"type\"] = field.type;\n cells.set(id, handle);\n return handle.el;\n };\n\n const draw = (): void => {\n const decl = opts.decl;\n const fields = decl.of?.fields ?? [];\n const map = held();\n const keys = Object.keys(map);\n const adapter = opts.adapter;\n const keyKind = decl.key?.type === \"reference\" ? decl.key.to ?? \"\" : undefined;\n const keyNodes = keyKind !== undefined && adapter ? adapter.nodes(keyKind) : undefined;\n\n const hr = el(\"tr\");\n hr.append(el(\"th\", \"shell-recordgrid-keyhead\", recordMapKeyHeading(decl)));\n for (const f of fields) {\n const th = el(\"th\", undefined, f.label ?? f.name);\n const help = f.help ?? f.purpose;\n if (help) th.dataset[\"tip\"] = help;\n hr.append(th);\n }\n hr.append(el(\"th\", \"shell-recordgrid-tools\"));\n head.replaceChildren(hr);\n\n const used = new Set<string>();\n const rows: HTMLElement[] = [];\n for (const key of keys) {\n const record = isObject(map[key]) ? map[key] as Record<string, unknown> : {};\n const tr = el(\"tr\");\n tr.dataset[\"key\"] = key;\n const name = recordMapKeyLabel(decl, key, adapter);\n const keyCell = el(\"th\", \"shell-recordgrid-key\", name);\n keyCell.setAttribute(\"scope\", \"row\");\n if (keyNodes !== undefined && adapter && keyNodes.every((n) => n.id !== key) && adapter.label?.(keyKind!, key) === undefined) {\n keyCell.append(el(\"span\", \"shell-recordgrid-gone\", \" (not here any more)\"));\n }\n tr.append(keyCell);\n for (const f of fields) {\n used.add(`${key}\\u0000${f.name}`);\n const td = el(\"td\");\n td.append(cell(key, f, record));\n tr.append(td);\n }\n const tools = el(\"td\", \"shell-recordgrid-tools\");\n if (editable()) tools.append(iconBtn(\"close\", `Remove ${name}`, () => { const next = { ...held() }; delete next[key]; commit(next); }));\n tr.append(tools);\n rows.push(tr);\n }\n for (const id of [...cells.keys()]) if (!used.has(id)) cells.delete(id);\n body.replaceChildren(...rows);\n table.hidden = keys.length === 0;\n empty.textContent = keys.length === 0 ? \"None yet.\" : \"\";\n empty.hidden = keys.length !== 0;\n\n adder.replaceChildren();\n if (!editable()) return;\n const add = (k: string): void => {\n if (k === \"\" || Object.prototype.hasOwnProperty.call(held(), k)) return;\n commit({ ...held(), [k]: defaultOf(decl.of as unknown as TypeDecl) });\n };\n if (keyNodes !== undefined) {\n const pick = el(\"select\", `field shell-valuerow-key${opts.controlClassName ? ` ${opts.controlClassName}` : \"\"}`);\n const first = el(\"option\", undefined, \"Add...\"); first.value = \"\"; pick.append(first);\n for (const n of keyNodes.filter((n) => !Object.prototype.hasOwnProperty.call(map, n.id))) {\n const opt = el(\"option\", undefined, n.label); opt.value = n.id; pick.append(opt);\n }\n pick.disabled = pick.options.length === 1;\n pick.addEventListener(\"change\", () => add(pick.value));\n adder.append(pick);\n } else {\n const input = el(\"input\", \"field shell-valuerow-key\");\n input.type = \"text\"; input.placeholder = \"New key\"; input.value = addKey;\n input.addEventListener(\"input\", () => { addKey = input.value; });\n const go = (): void => { const k = input.value.trim(); addKey = \"\"; add(k); };\n input.addEventListener(\"keydown\", (e) => { if ((e as KeyboardEvent).key === \"Enter\") go(); });\n adder.append(input, iconBtn(\"add\", \"Add\", go));\n }\n };\n\n draw();\n return { el: root, update: (o) => { opts = o; draw(); } };\n}\n\n/** The key column's heading: the key's node kind (\"Cast\"), else \"Key\". */\nfunction recordMapKeyHeading(decl: ValueDecl): string {\n const to = decl.key?.type === \"reference\" ? decl.key.to : undefined;\n return to ? to.charAt(0).toUpperCase() + to.slice(1) : \"Key\";\n}\n","// ---------------------------------------------------------------------------\n// Rows for a value of ANY declared type: the seven scalars through the field\n// row, and the types an extension's fields add (patterkit design/proposals/\n// patter-storylet-extensions.md, \"Tier 1: fields\"): a `reference` to one of the\n// host's nodes, a `pick` of one choice from the sources its manifest names, a\n// `record` of named fields, a `map` keyed by a reference or by text, and a `list`\n// with ids or without.\n//\n// A structured value is drawn as its parts, each part a row of its own, so the\n// family's field rules hold all the way down: commit as typed, Escape restores,\n// the unset state names what it falls back to, a value the declaration refuses\n// is said under it, and a row keeps its element (and its focus) across a redraw.\n// The checks are `@wildwinter/toolkit/extensions`' (`valueProblems`), the same\n// ones the command lines run, so the editor and validation never disagree.\n//\n// The host supplies what only it knows through an adapter: which nodes there are\n// of a kind (a map keyed by tag offers the tags, a reference to a card the\n// cards), and the lists of text on the extension's project node a pick offers.\n// No Electron, no app state: DOM only.\n//\n// Its own entry (`@wildwinter/app-shell/value-rows`) rather than part of\n// value-control, because it needs `@wildwinter/toolkit/extensions` (an optional\n// peer, toolkit 0.2.5 or later) and the scalar row does not: a host that draws\n// only the family's seven types takes nothing new.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, pickChoices, valueProblems } from \"@wildwinter/toolkit/extensions\";\nimport type { PickSource, TypeDecl, ValueContext } from \"@wildwinter/toolkit/extensions\";\nimport { el, iconBtn, moveItem } from \"./dom.js\";\nimport { fieldRow, fieldRowFocus } from \"./value-control.js\";\nimport type { FieldDeclLike, FieldRowHandle, FieldValue } from \"./value-control.js\";\n\n/** A declaration of any type, as an extension's manifest writes it. */\nexport interface ValueDecl extends FieldDeclLike {\n /** The caption; the name when absent. */\n label?: string;\n /** A sentence or two shown under the control (an extension's `help`, a field's `purpose`). */\n help?: string;\n /** A reference's node kind. */\n to?: string;\n /** A pick's sources, in the order its choices are shown: fixed words, a node kind, a project list. */\n from?: readonly PickSource[];\n /** A record's fields. */\n fields?: ValueDecl[];\n /** A map's key: text, or a reference to a node kind. */\n key?: { type: string; to?: string };\n /** A map's or a list's value type. */\n of?: Omit<ValueDecl, \"name\"> & { name?: string };\n /** A list's id field: the text field of its records that keys each item. */\n id?: string;\n min?: number;\n max?: number;\n required?: boolean;\n}\n\n/** One node the host offers, by id, with the name the author knows it by. */\nexport interface ValueNode { id: string; label: string }\n\n/** What only the host knows: the nodes of a kind (`card`, `tag`, `cast`...), for references, map keys and picks,\n * and the lists of text on the extension's own project node, for picks. */\nexport interface ValueAdapter {\n nodes(kind: string): readonly ValueNode[];\n /**\n * The entries of a list of text on the extension's own project node, by field name, for a pick's `list` source\n * (the toolkit's `pickLists` reads them off the project entry). A host scopes it to the extension whose rows it\n * draws. Absent: a pick offers no list entries, and doesn't check against them.\n */\n list?(name: string): readonly string[] | undefined;\n /**\n * The name of a node by kind and id, for a value that holds one `nodes` does not offer (a node outside the\n * choices, say): undefined when there is no such node, which is then shown as gone. Absent: a held id `nodes`\n * does not list is taken to be gone.\n */\n label?(kind: string, id: string): string | undefined;\n}\n\n/** A node's name: from the choices, else the host's `label`; undefined when the host says there is none. */\nfunction nodeLabel(adapter: ValueAdapter, kind: string, id: string): string | undefined {\n return adapter.nodes(kind).find((n) => n.id === id)?.label ?? adapter.label?.(kind, id);\n}\n\nexport interface ValueRowOptions {\n decl: ValueDecl;\n /** The node's own value, or undefined where it sets none. */\n value: unknown;\n /** Commit a value; undefined clears it, back to the default. Absent: read-only. */\n onCommit?: (value: unknown) => void;\n /** The host's nodes, for references and map keys. Absent: a reference is typed as an id. */\n adapter?: ValueAdapter;\n disabled?: boolean;\n /** A message of the app's own about this value, shown under it. */\n problem?: string;\n /** The app's own sentence instead of the row's own checks, as the field row's `replaceProblem`. */\n replaceProblem?: string;\n /** The caption; default the declaration's label, else its name. */\n label?: string | Node;\n className?: string;\n labelClassName?: string;\n controlClassName?: string;\n}\n\nexport interface ValueRowHandle {\n readonly el: HTMLElement;\n update(opts: ValueRowOptions): void;\n}\n\nconst SCALARS = new Set([\"text\", \"multiline\", \"number\", \"boolean\", \"enum\", \"flags\", \"quality\", \"string\"]);\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\nconst nameOf = (decl: ValueDecl): string => decl.label ?? decl.name;\nconst asDecl = (d: Omit<ValueDecl, \"name\"> & { name?: string }, name: string): ValueDecl => ({ ...d, name: d.name ?? name });\n\n/** The toolkit's checks for this value, as words for the row itself (the parts say their own). */\nfunction ownProblems(decl: ValueDecl, value: unknown, adapter: ValueAdapter | undefined): string {\n if (value === undefined) return \"\";\n return valueProblems(decl as unknown as TypeDecl, value, contextOf(adapter))\n .filter((p) => p.path === \"\" && (p.severity === \"error\" || p.code === \"pick-ambiguous\") && p.code !== \"not-a-value\" && p.code !== \"not-a-stage\")\n .map((p) => `${p.message.replace(/^the value/, \"The value\")}.`)\n .join(\" \");\n}\n\n/** The adapter as the toolkit's checks take it: whether a node exists, and a project list's entries. */\nfunction contextOf(adapter: ValueAdapter | undefined): ValueContext {\n if (!adapter) return {};\n return {\n exists: (kind: string, id: string) => nodeLabel(adapter, kind, id) !== undefined,\n ...(adapter.list ? { list: (name: string) => adapter.list!(name) } : {}),\n };\n}\n\n/**\n * A row for a value of `decl`'s type, whatever it is: a scalar as the field row, a reference as a choice of\n * the host's nodes, and a record, map or list as its parts, each a row of its own. Keeps its element, and its\n * parts' elements, across `update`, so a host that redraws on every change keeps the author's place.\n */\nexport function valueRow(initial: ValueRowOptions): ValueRowHandle {\n const decl = initial.decl;\n if (SCALARS.has(decl.type)) return scalarRow(initial);\n if (decl.type === \"reference\") return referenceRow(initial);\n if (decl.type === \"pick\") return pickRow(initial);\n return structuredRow(initial);\n}\n\n/** The field row, with an extension's help as its purpose and the toolkit's range checks. */\nfunction scalarRow(initial: ValueRowOptions): ValueRowHandle {\n const map = (o: ValueRowOptions) => {\n const range = ownProblems(o.decl, o.value, o.adapter);\n const problem = [range, o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n return {\n decl: { ...o.decl, ...(o.decl.help !== undefined && o.decl.purpose === undefined ? { purpose: o.decl.help } : {}) },\n value: o.value,\n ...(o.onCommit ? { onCommit: (v: FieldValue | undefined) => o.onCommit!(v) } : {}),\n ...(o.disabled !== undefined ? { disabled: o.disabled } : {}),\n ...(problem !== \"\" ? { problem } : {}),\n ...(o.replaceProblem !== undefined ? { replaceProblem: o.replaceProblem } : {}),\n label: o.label ?? nameOf(o.decl),\n ...(o.className !== undefined ? { className: o.className } : {}),\n ...(o.labelClassName !== undefined ? { labelClassName: o.labelClassName } : {}),\n ...(o.controlClassName !== undefined ? { controlClassName: o.controlClassName } : {}),\n };\n };\n const handle: FieldRowHandle = fieldRow(map(initial));\n return { el: handle.el, update: (o) => handle.update(map(o)) };\n}\n\n/** A reference: a choice of the host's nodes of its kind, \"default (none)\" first; a node that has gone stays\n * visible as what is held. Without an adapter, the id is typed. */\nfunction referenceRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n if (!opts.adapter) {\n const inner = scalarRow({ ...opts, decl: { ...opts.decl, type: \"text\" } });\n return { el: inner.el, update: (o) => { opts = o; inner.update({ ...o, decl: { ...o.decl, type: \"text\" } }); } };\n }\n const row = el(\"div\", \"shell-fieldrow shell-valuerow-ref\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body\");\n const sel = el(\"select\", \"field shell-fieldrow-select\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n body.append(sel, help, problem);\n row.append(caption, body);\n sel.addEventListener(\"change\", () => {\n const v = sel.value === \"\" ? undefined : sel.value;\n opts = { ...opts, value: v };\n draw(opts);\n opts.onCommit?.(v);\n });\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n row.className = `shell-fieldrow shell-valuerow-ref${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(o.decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n if (o.controlClassName) sel.className = `shell-fieldrow-select ${o.controlClassName}`;\n const nodes = o.adapter!.nodes(o.decl.to ?? \"\");\n const held = typeof o.value === \"string\" ? o.value : \"\";\n sel.replaceChildren();\n const add = (v: string, text: string): void => { const opt = el(\"option\", undefined, text); opt.value = v; sel.append(opt); };\n add(\"\", \"default (none)\");\n for (const n of nodes) add(n.id, n.label);\n if (held !== \"\" && !nodes.some((n) => n.id === held)) {\n // A node outside the choices keeps its name; only one the host says does not exist reads as gone.\n const name = o.adapter!.label?.(o.decl.to ?? \"\", held);\n add(held, name ?? `${held} (gone)`);\n }\n sel.value = held;\n sel.disabled = o.onCommit === undefined || o.disabled === true;\n help.textContent = o.decl.help ?? o.decl.purpose ?? \"\";\n help.hidden = help.textContent === \"\";\n const words = o.replaceProblem ?? [ownProblems(o.decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n row.classList.toggle(\"has-problem\", words !== \"\");\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/**\n * A pick: one choice, \"auto\" (empty) first, then each source's choices in the declared order, a node kind's and a\n * project list's under their names. A value no source holds stays visible as what is held, marked missing; a\n * name two sources hold is said under it. Without an adapter, a pick of fixed words alone is still a choice of\n * them, and one with other sources is typed as text.\n */\nfunction pickRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n if (!opts.adapter && (opts.decl.from ?? []).some((s) => !(\"words\" in s))) {\n const inner = scalarRow({ ...opts, decl: { ...opts.decl, type: \"text\" } });\n return { el: inner.el, update: (o) => { opts = o; inner.update({ ...o, decl: { ...o.decl, type: \"text\" } }); } };\n }\n const row = el(\"div\", \"shell-fieldrow shell-valuerow-pick\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body\");\n const sel = el(\"select\", \"field shell-fieldrow-select\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n body.append(sel, help, problem);\n row.append(caption, body);\n sel.addEventListener(\"change\", () => {\n const v = sel.value === \"\" ? undefined : sel.value;\n opts = { ...opts, value: v };\n draw(opts);\n opts.onCommit?.(v);\n });\n const groupName = (s: PickSource): string | undefined =>\n \"to\" in s ? (s.to === \"cast\" ? \"Cast\" : s.to.charAt(0).toUpperCase() + s.to.slice(1)) : \"list\" in s ? s.list : undefined;\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n row.className = `shell-fieldrow shell-valuerow-pick${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(o.decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n if (o.controlClassName) sel.className = `shell-fieldrow-select ${o.controlClassName}`;\n const adapter = o.adapter;\n const choices = pickChoices(o.decl as unknown as TypeDecl, {\n ...(adapter ? { nodes: (kind: string) => adapter.nodes(kind) } : {}),\n ...(adapter?.list ? { list: (name: string) => adapter.list!(name) } : {}),\n });\n const held = typeof o.value === \"string\" ? o.value : \"\";\n sel.replaceChildren();\n const option = (v: string, text: string): HTMLOptionElement => { const opt = el(\"option\", undefined, text); opt.value = v; return opt; };\n sel.append(option(\"\", \"auto\"));\n // One group per source, in order; a value two sources hold is offered by the first only, so the select\n // shows one choice for what it holds (the row says the name is ambiguous).\n const offered = new Set<string>();\n let group: { source: PickSource; el: HTMLElement } | undefined;\n for (const c of choices) {\n if (offered.has(c.value)) continue;\n offered.add(c.value);\n const name = groupName(c.source);\n if (name === undefined) { group = undefined; sel.append(option(c.value, c.label)); continue; }\n if (group?.source !== c.source) {\n const og = el(\"optgroup\");\n og.setAttribute(\"label\", name);\n sel.append(og);\n group = { source: c.source, el: og };\n }\n group.el.append(option(c.value, c.label));\n }\n if (held !== \"\" && !offered.has(held)) {\n // A node outside the choices keeps its name (as a reference's does); anything else is missing.\n const named = (o.decl.from ?? []).map((s) => (\"to\" in s && adapter ? adapter.label?.(s.to, held) : undefined)).find((n) => n !== undefined);\n sel.append(option(held, named ?? `${held} (missing)`));\n }\n sel.value = held;\n sel.disabled = o.onCommit === undefined || o.disabled === true;\n help.textContent = o.decl.help ?? o.decl.purpose ?? \"\";\n help.hidden = help.textContent === \"\";\n const words = o.replaceProblem ?? [ownProblems(o.decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n row.classList.toggle(\"has-problem\", words !== \"\");\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/** A part of a structured value: a row, keyed so it is the same element next time. */\ninterface Part { key: string; handle: ValueRowHandle; holder: HTMLElement; tools: HTMLElement }\n\n/** A record, a map or a list: a caption, then its parts, each a row of its own, with the controls the type\n * calls for (add and remove for a map; add, remove and move for a list). */\nfunction structuredRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n const row = el(\"div\", \"shell-fieldrow shell-valuerow\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body shell-valuerow-parts\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n const adder = el(\"div\", \"shell-valuerow-add\");\n row.append(caption, body);\n const parts = new Map<string, Part>();\n /** The parts kept from the last draw, whose focus goes back to them once they are in the page again. */\n let kept: HTMLElement[] = [];\n let addKey = \"\";\n\n const editable = (): boolean => opts.onCommit !== undefined && opts.disabled !== true;\n const commit = (v: unknown): void => { opts = { ...opts, value: v }; draw(opts); opts.onCommit?.(v); };\n\n /** The row for one part, the same element as last time for the same key. */\n const part = (key: string, o: ValueRowOptions, controls: HTMLElement[] = []): HTMLElement => {\n const had = parts.get(key);\n if (had && had.handle.el.dataset[\"type\"] === o.decl.type) {\n fieldRowFocus.settle(had.handle.el);\n had.handle.update(o);\n // Its own slot, not the first one inside it: a structured part has slots of its own further down.\n had.tools.replaceChildren(...controls);\n kept.push(had.handle.el);\n return had.holder;\n }\n const handle = valueRow(o);\n handle.el.dataset[\"type\"] = o.decl.type;\n const holder = el(\"div\", \"shell-valuerow-part\");\n const tools = el(\"span\", \"shell-valuerow-controls\");\n tools.append(...controls);\n holder.append(handle.el, tools);\n parts.set(key, { key, handle, holder, tools });\n return holder;\n };\n\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n kept = [];\n const decl = o.decl;\n row.className = `shell-fieldrow shell-valuerow shell-valuerow-${decl.type}${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n const used = new Set<string>();\n const rows: HTMLElement[] = [];\n const child = (key: string, childDecl: ValueDecl, value: unknown, onCommit: (v: unknown) => void, controls?: HTMLElement[], childLabel?: string, extraProblem?: string): void => {\n used.add(key);\n rows.push(part(key, {\n decl: childDecl, value,\n ...(editable() ? { onCommit } : {}),\n ...(o.adapter ? { adapter: o.adapter } : {}),\n ...(o.disabled !== undefined ? { disabled: o.disabled } : {}),\n ...(childLabel !== undefined ? { label: childLabel } : {}),\n ...(extraProblem ? { problem: extraProblem } : {}),\n ...(o.controlClassName !== undefined ? { controlClassName: o.controlClassName } : {}),\n }, controls));\n };\n\n if (decl.type === \"record\") {\n const value = isObject(o.value) ? o.value : undefined;\n const required = value === undefined ? [] : valueProblems(decl as unknown as TypeDecl, value).filter((p) => p.code === \"required\");\n for (const f of decl.fields ?? []) {\n const missing = required.find((p) => p.path === f.name);\n child(`f:${f.name}`, f, value?.[f.name], (v) => {\n const next: Record<string, unknown> = { ...(isObject(opts.value) ? opts.value : {}) };\n if (v === undefined) delete next[f.name]; else next[f.name] = v;\n commit(Object.keys(next).length > 0 ? next : undefined);\n }, undefined, undefined, missing ? \"Required.\" : undefined);\n }\n } else if (decl.type === \"map\" && decl.of) {\n const value = isObject(o.value) ? o.value : {};\n const keyNodes = decl.key?.type === \"reference\" && o.adapter ? o.adapter.nodes(decl.key.to ?? \"\") : undefined;\n const keyKind = decl.key?.to ?? \"\";\n const keyLabel = (k: string): string => (o.adapter && keyNodes !== undefined ? nodeLabel(o.adapter, keyKind, k) : undefined) ?? k;\n for (const k of Object.keys(value)) {\n const remove = editable() ? [iconBtn(\"close\", `Remove ${keyLabel(k)}`, () => {\n const next = { ...(isObject(opts.value) ? opts.value : {}) };\n delete next[k];\n commit(Object.keys(next).length > 0 ? next : undefined);\n })] : [];\n const gone = keyNodes !== undefined && o.adapter && nodeLabel(o.adapter, keyKind, k) === undefined ? `${k} is not here any more.` : undefined;\n child(`k:${k}`, asDecl(decl.of, k), value[k], (v) => {\n const next = { ...(isObject(opts.value) ? opts.value : {}) };\n next[k] = v === undefined ? defaultOf(decl.of as unknown as TypeDecl) : v;\n commit(next);\n }, remove, keyLabel(k), gone);\n }\n adder.replaceChildren();\n if (editable()) {\n const add = (k: string): void => {\n if (k === \"\" || Object.prototype.hasOwnProperty.call(value, k)) return;\n commit({ ...value, [k]: defaultOf(decl.of as unknown as TypeDecl) });\n };\n if (keyNodes !== undefined) {\n const pick = el(\"select\", \"field shell-valuerow-key\");\n const first = el(\"option\", undefined, \"Add...\"); first.value = \"\"; pick.append(first);\n for (const n of keyNodes.filter((n) => !Object.prototype.hasOwnProperty.call(value, n.id))) {\n const opt = el(\"option\", undefined, n.label); opt.value = n.id; pick.append(opt);\n }\n pick.addEventListener(\"change\", () => add(pick.value));\n adder.append(pick);\n } else {\n const input = el(\"input\", \"field shell-valuerow-key\");\n input.type = \"text\"; input.placeholder = \"New key\"; input.value = addKey;\n input.addEventListener(\"input\", () => { addKey = input.value; });\n const go = (): void => { const k = input.value.trim(); addKey = \"\"; add(k); };\n input.addEventListener(\"keydown\", (e) => { if ((e as KeyboardEvent).key === \"Enter\") go(); });\n adder.append(input, iconBtn(\"add\", \"Add\", go));\n }\n }\n } else if (decl.type === \"list\" && decl.of) {\n const value = Array.isArray(o.value) ? o.value : [];\n const idOf = (item: unknown, i: number): string =>\n decl.id !== undefined && isObject(item) && typeof item[decl.id] === \"string\" ? `id:${item[decl.id] as string}` : `i:${i}`;\n value.forEach((item, i) => {\n const set = (next: unknown[]): void => commit(next.length > 0 ? next : undefined);\n const controls = editable() ? [\n iconBtn(\"up\", \"Move up\", () => { const next = [...value]; if (moveItem(next, i, -1)) set(next); }, i === 0),\n iconBtn(\"down\", \"Move down\", () => { const next = [...value]; if (moveItem(next, i, 1)) set(next); }, i === value.length - 1),\n iconBtn(\"close\", \"Remove\", () => set(value.filter((_, j) => j !== i)), false, true),\n ] : [];\n const itemLabel = decl.id !== undefined && isObject(item) && typeof item[decl.id] === \"string\" ? item[decl.id] as string : `${i + 1}`;\n child(idOf(item, i), asDecl(decl.of!, itemLabel), item, (v) => {\n const next = [...(Array.isArray(opts.value) ? opts.value : [])];\n next[i] = v === undefined ? defaultOf(decl.of as unknown as TypeDecl) : v;\n set(next);\n }, controls, itemLabel);\n });\n adder.replaceChildren();\n if (editable()) {\n adder.append(iconBtn(\"add\", \"Add\", () => {\n const fresh = defaultOf(decl.of as unknown as TypeDecl);\n if (decl.id !== undefined && isObject(fresh)) {\n const taken = new Set(value.map((x) => (isObject(x) ? x[decl.id!] : undefined)));\n let n = value.length + 1;\n while (taken.has(`item-${n}`)) n++;\n fresh[decl.id] = `item-${n}`;\n }\n commit([...value, fresh]);\n }));\n }\n }\n\n for (const key of [...parts.keys()]) if (!used.has(key)) parts.delete(key);\n body.replaceChildren(...rows);\n if (decl.type !== \"record\" && editable()) body.append(adder);\n help.textContent = decl.help ?? decl.purpose ?? \"\";\n if (help.textContent !== \"\") body.append(help);\n const words = o.replaceProblem ?? [ownProblems(decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n body.append(problem);\n row.classList.toggle(\"has-problem\", words !== \"\");\n for (const k of kept) fieldRowFocus.restore(k);\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/** A cache of value rows for a host that redraws its whole view (as `fieldRows` is for the scalar row). */\nexport interface ValueRows {\n row(key: string, opts: ValueRowOptions): HTMLElement;\n sweep(): void;\n}\n\nexport function valueRows(): ValueRows {\n const rows = new Map<string, { handle: ValueRowHandle; type: string; used: boolean }>();\n return {\n row(key, opts) {\n const had = rows.get(key);\n if (had && had.type === opts.decl.type) {\n had.used = true;\n fieldRowFocus.settle(had.handle.el);\n had.handle.update(opts);\n fieldRowFocus.restore(had.handle.el);\n return had.handle.el;\n }\n const handle = valueRow(opts);\n rows.set(key, { handle, type: opts.decl.type, used: true });\n return handle.el;\n },\n sweep() {\n for (const [key, entry] of rows) { if (!entry.used) rows.delete(key); else entry.used = false; }\n },\n };\n}\n\n// An extension's section folded to the fields a node sets (value-fold.ts), under this entry so a host takes\n// the rows and the fold together.\nexport { isSet, extensionFold, foldCaption } from \"./value-fold.js\";\nexport type { ExtensionFold, FoldSectionOptions } from \"./value-fold.js\";\n\n// A map of records (record-map.ts): the inspector's summary and the helper window's grid.\nexport { isRecordMap, recordMapGrid, recordMapKeyLabel, recordMapSummary, valueText } from \"./record-map.js\";\nexport type { RecordMapGrid, RecordMapGridOptions } from \"./record-map.js\";\n"]}
1
+ {"version":3,"sources":["../src/value-fold.ts","../src/record-map.ts","../src/value-rows.ts"],"names":["isObject","defaultOf","n","pickChoices"],"mappings":"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","file":"value-rows.js","sourcesContent":["// ---------------------------------------------------------------------------\n// An extension's fields folded to the ones a node sets (Pattershot's brief,\n// \"extension fields folded\", rulings F1 to F9, 2026-10-20). An extension meant\n// to be left alone on most nodes drew every field on every node, nearly all\n// empty. Folded, its section is the caption, with a disclosure and a count,\n// and only the fields set; unfolded, every field, as before.\n//\n// One rule for the family, so Patterpad and Storyletter fold alike:\n// - set means the node holds a value that differs from the toolkit's\n// `defaultOf`, compared deeply (`isSet`); a field is set or not as a whole;\n// - the fold is per extension, and stays as left while the author moves\n// between nodes (for the session: it isn't stored);\n// - a value cleared while folded keeps its row until the author leaves the\n// node (a redraw that doesn't draw it, then `sweep`), so a row never vanishes\n// under the cursor;\n// - keys the extension doesn't declare, and the host's lead (a lock line),\n// always show.\n//\n// The host draws each row (its own cache, classes and problems); this draws\n// the section around them. Project Settings doesn't fold: it's where an\n// author goes to set things, and draws its rows directly.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, stableStringify } from \"@wildwinter/toolkit/extensions\";\nimport type { TypeDecl } from \"@wildwinter/toolkit/extensions\";\nimport { el } from \"./dom.js\";\nimport { iconNode } from \"./icons.js\";\nimport type { ValueDecl } from \"./value-rows.js\";\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/**\n * Whether a node's value for `decl` is set: held, and not the declaration's default. A record counts as its\n * default when each of its fields does and it holds no other key, so `{}` and a record of defaults are both\n * unset; anything else is compared with `defaultOf`, deeply and regardless of key order.\n */\nexport function isSet(decl: ValueDecl, value: unknown): boolean {\n if (value === undefined) return false;\n if (decl.type === \"record\" && decl.default === undefined && isObject(value)) {\n const fields = decl.fields ?? [];\n const declared = new Set(fields.map((f) => f.name));\n if (Object.entries(value).some(([k, v]) => !declared.has(k) && v !== undefined)) return true;\n return fields.some((f) => isSet(f, value[f.name]));\n }\n return stableStringify(value) !== stableStringify(defaultOf(decl as unknown as TypeDecl));\n}\n\nexport interface FoldSectionOptions {\n /** The extension's id: the fold is remembered by it. */\n extension: string;\n /** The extension's name, the caption. */\n caption: string;\n /** The node the section is for, by any key unique to it: a row cleared while folded stays while the host\n * keeps drawing this node. */\n node: string;\n /** The extension's fields for the node's kind, in the manifest's order. */\n fields: readonly ValueDecl[];\n /** The node's values for the extension, or undefined where it holds none. */\n entry: Record<string, unknown> | undefined;\n /** One field's row, drawn by the host. */\n row: (decl: ValueDecl) => HTMLElement;\n /** A heading above the first shown field of a group. */\n group: (name: string) => HTMLElement;\n /** Shown above the rows, folded or not (a lock line). */\n lead?: readonly HTMLElement[];\n /** Shown after the rows, folded or not (keys the extension doesn't declare). */\n tail?: readonly HTMLElement[];\n /** The section's own class, beside `shell-fold`. */\n className?: string;\n /** The caption's class, beside `shell-fold-cap`. */\n captionClassName?: string;\n}\n\nexport interface ExtensionFold {\n /** Draw one extension's section for one node: the caption and disclosure, then the rows the fold shows. */\n section(o: FoldSectionOptions): HTMLElement;\n /** Whether an extension's section is open (every field). Folded until opened. */\n isOpen(extension: string): boolean;\n setOpen(extension: string, open: boolean): void;\n /** After a redraw: forget the rows kept for nodes it didn't draw, so leaving a node and coming back shows\n * only what is set. A host that redraws its whole view calls it at the end of each, as a row cache's. */\n sweep(): void;\n}\n\n/** The caption's words: the name, and the count when anything is set. */\nexport function foldCaption(name: string, set: number): string {\n return set > 0 ? `${name} (${set} set)` : name;\n}\n\n/**\n * The fold for a host's inspector: one per host, kept across its redraws, so the fold stays as left from node\n * to node.\n */\nexport function extensionFold(): ExtensionFold {\n const open = new Set<string>();\n // Per extension and node: the fields shown while folded, so a value cleared there keeps its row until the\n // author moves on. An inspector shows several nodes at once (a line, its block, its scene), so each keeps\n // its own; `sweep` drops the ones a redraw didn't draw.\n const shown = new Map<string, { fields: Set<string>; used: boolean }>();\n const keyOf = (o: FoldSectionOptions): string => `${o.extension}\\u0000${o.node}`;\n\n const visible = (o: FoldSectionOptions, setNames: ReadonlySet<string>): Set<string> => {\n const was = shown.get(keyOf(o));\n const fields = was ? new Set([...was.fields, ...setNames]) : new Set(setNames);\n shown.set(keyOf(o), { fields, used: true });\n return fields;\n };\n\n const fold: ExtensionFold = {\n isOpen: (extension) => open.has(extension),\n setOpen(extension, on) {\n if (on) open.add(extension); else open.delete(extension);\n // Folding again starts from what is set now.\n for (const key of shown.keys()) if (key.startsWith(`${extension}\\u0000`)) shown.delete(key);\n },\n sweep() {\n for (const [key, entry] of shown) { if (!entry.used) shown.delete(key); else entry.used = false; }\n },\n section(o) {\n const sec = el(\"div\", `shell-fold${o.className ? ` ${o.className}` : \"\"}`);\n sec.dataset[\"extension\"] = o.extension;\n const cap = el(\"button\", `shell-fold-cap${o.captionClassName ? ` ${o.captionClassName}` : \"\"}`);\n cap.type = \"button\";\n const body = el(\"div\", \"shell-fold-body\");\n sec.append(cap, body);\n\n const draw = (): void => {\n const isOpen = open.has(o.extension);\n const setNames = new Set(o.fields.filter((f) => isSet(f, o.entry?.[f.name])).map((f) => f.name));\n const show = isOpen ? undefined : visible(o, setNames);\n cap.replaceChildren(iconNode(isOpen ? \"expanded\" : \"collapsed\"), el(\"span\", \"shell-fold-name\", foldCaption(o.caption, setNames.size)));\n cap.setAttribute(\"aria-expanded\", String(isOpen));\n cap.dataset[\"tip\"] = isOpen ? `Show only the fields set here` : `Show every ${o.caption} field`;\n sec.classList.toggle(\"shell-fold-open\", isOpen);\n const rows: HTMLElement[] = [...(o.lead ?? [])];\n let group: string | undefined;\n for (const decl of o.fields) {\n if (show && !show.has(decl.name)) continue;\n const g = (decl as { group?: string }).group;\n if (g !== undefined && g !== group) { group = g; rows.push(o.group(g)); }\n rows.push(o.row(decl));\n }\n rows.push(...(o.tail ?? []));\n body.replaceChildren(...rows);\n };\n cap.addEventListener(\"click\", () => { fold.setOpen(o.extension, !open.has(o.extension)); draw(); });\n draw();\n return sec;\n },\n };\n return fold;\n}\n","// ---------------------------------------------------------------------------\n// A map whose values are records, edited as a grid (Pattershot's brief, \"a map\n// of records edited in a helper window\", rulings H1 to H5, 2026-10-20).\n// Pattershot's `performance` (a record of look, expression and gesture for\n// each member of the cast on a line) drew a record of rows per character in the\n// inspector's column: far too big. Such a field now shows in the inspector as a\n// short summary, a line per key, and is edited in a helper window that follows\n// the selection, as a grid: a row per key, a column per record field, each\n// cell the row value-rows draws for that field.\n//\n// Which fields: any map of records (`isRecordMap`), with no manifest change.\n// The window, its head and its messaging are each app's; the summary and the\n// grid are here, so both apps draw them alike.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, pickChoices } from \"@wildwinter/toolkit/extensions\";\nimport type { TypeDecl } from \"@wildwinter/toolkit/extensions\";\nimport { el, iconBtn } from \"./dom.js\";\nimport { fieldRowFocus } from \"./value-control.js\";\nimport { valueRow, type ValueAdapter, type ValueDecl, type ValueRowHandle } from \"./value-rows.js\";\nimport { isSet } from \"./value-fold.js\";\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** A map whose values are records: edited in the grid, summarised in the inspector. */\nexport function isRecordMap(decl: ValueDecl): boolean {\n return decl.type === \"map\" && decl.of?.type === \"record\";\n}\n\n/** A map key's name: a node's from the host, else the key itself. */\nexport function recordMapKeyLabel(decl: ValueDecl, key: string, adapter?: ValueAdapter): string {\n const kind = decl.key?.type === \"reference\" ? decl.key.to ?? \"\" : undefined;\n if (kind === undefined || !adapter) return key;\n return adapter.nodes(kind).find((n) => n.id === key)?.label ?? adapter.label?.(kind, key) ?? key;\n}\n\n/** A value as words, the way its control shows it: a pick's or a reference's name, flags joined, a boolean as\n * the field's own name. Empty for a value that isn't set. */\nexport function valueText(decl: ValueDecl, value: unknown, adapter?: ValueAdapter): string {\n if (!isSet(decl, value)) return \"\";\n if (decl.type === \"pick\" && typeof value === \"string\") {\n const choice = pickChoices(decl as unknown as TypeDecl, {\n ...(adapter ? { nodes: (kind: string) => adapter.nodes(kind) } : {}),\n ...(adapter?.list ? { list: (name: string) => adapter.list!(name) } : {}),\n }).find((c) => c.value === value);\n return choice?.label ?? value;\n }\n if (decl.type === \"reference\" && typeof value === \"string\" && decl.to !== undefined && adapter) {\n return adapter.nodes(decl.to).find((n) => n.id === value)?.label ?? adapter.label?.(decl.to, value) ?? value;\n }\n if (decl.type === \"boolean\") return value === true ? decl.label ?? decl.name : \"\";\n if (Array.isArray(value)) return value.map(String).join(\", \");\n if (isObject(value)) return JSON.stringify(value);\n return String(value);\n}\n\n/** The inspector's summary of a map of records: a line per key, \"TAM: smile, nod, WREN\", the record's set\n * fields in the manifest's order; a key with nothing set is its name alone. */\nexport function recordMapSummary(decl: ValueDecl, value: unknown, adapter?: ValueAdapter): string[] {\n if (!isObject(value)) return [];\n const fields = decl.of?.fields ?? [];\n return Object.entries(value).map(([key, record]) => {\n const name = recordMapKeyLabel(decl, key, adapter);\n const words = isObject(record) ? fields.map((f) => valueText(f, record[f.name], adapter)).filter((w) => w !== \"\") : [];\n return words.length > 0 ? `${name}: ${words.join(\", \")}` : name;\n });\n}\n\nexport interface RecordMapGridOptions {\n /** The map's declaration: `isRecordMap`. */\n decl: ValueDecl;\n /** The node's value, or undefined where it holds none. */\n value: unknown;\n /** The host's nodes, for a reference key and the cells' picks and references. */\n adapter?: ValueAdapter;\n /** Commit the whole map; undefined clears it. Absent: read-only. */\n onCommit?: (value: unknown) => void;\n disabled?: boolean;\n /** The class on each cell's control, as the host's own rows carry. */\n controlClassName?: string;\n}\n\nexport interface RecordMapGrid {\n readonly el: HTMLElement;\n update(opts: RecordMapGridOptions): void;\n}\n\n/**\n * The grid: a row per key, a column per record field, each cell the row value-rows draws for that field (so\n * picks, their checks and their problems are the same as in the inspector), a remove button per row, and the\n * key adder under it. Keeps its cells across `update`, so a host that redraws on every change keeps the\n * author's place.\n */\nexport function recordMapGrid(initial: RecordMapGridOptions): RecordMapGrid {\n let opts = initial;\n const root = el(\"div\", \"shell-recordgrid\");\n const table = el(\"table\", \"shell-recordgrid-table\");\n const head = el(\"thead\");\n const body = el(\"tbody\");\n table.append(head, body);\n const adder = el(\"div\", \"shell-recordgrid-add\");\n const empty = el(\"p\", \"shell-recordgrid-empty\");\n root.append(table, empty, adder);\n const cells = new Map<string, ValueRowHandle>();\n let addKey = \"\";\n\n const editable = (): boolean => opts.onCommit !== undefined && opts.disabled !== true;\n const held = (): Record<string, unknown> => (isObject(opts.value) ? opts.value : {});\n const commit = (next: Record<string, unknown>): void => {\n const v = Object.keys(next).length > 0 ? next : undefined;\n opts = { ...opts, value: v };\n draw();\n opts.onCommit?.(v);\n };\n\n const cell = (key: string, field: ValueDecl, record: Record<string, unknown>): HTMLElement => {\n const id = `${key}\\u0000${field.name}`;\n const o = {\n decl: field, value: record[field.name],\n ...(opts.adapter ? { adapter: opts.adapter } : {}),\n ...(opts.disabled !== undefined ? { disabled: opts.disabled } : {}),\n ...(opts.controlClassName !== undefined ? { controlClassName: opts.controlClassName } : {}),\n ...(editable() ? {\n onCommit: (v: unknown) => {\n const map = held();\n const rec: Record<string, unknown> = { ...(isObject(map[key]) ? map[key] as Record<string, unknown> : {}) };\n if (v === undefined) delete rec[field.name]; else rec[field.name] = v;\n commit({ ...map, [key]: rec });\n },\n } : {}),\n className: \"shell-recordgrid-cell\",\n };\n const had = cells.get(id);\n if (had && had.el.dataset[\"type\"] === field.type) {\n fieldRowFocus.settle(had.el);\n had.update(o);\n fieldRowFocus.restore(had.el);\n return had.el;\n }\n const handle = valueRow(o);\n handle.el.dataset[\"type\"] = field.type;\n cells.set(id, handle);\n return handle.el;\n };\n\n const draw = (): void => {\n const decl = opts.decl;\n const fields = decl.of?.fields ?? [];\n const map = held();\n const keys = Object.keys(map);\n const adapter = opts.adapter;\n const keyKind = decl.key?.type === \"reference\" ? decl.key.to ?? \"\" : undefined;\n const keyNodes = keyKind !== undefined && adapter ? adapter.nodes(keyKind) : undefined;\n\n const hr = el(\"tr\");\n hr.append(el(\"th\", \"shell-recordgrid-keyhead\", recordMapKeyHeading(decl)));\n for (const f of fields) {\n const th = el(\"th\", undefined, f.label ?? f.name);\n const help = f.help ?? f.purpose;\n if (help) th.dataset[\"tip\"] = help;\n hr.append(th);\n }\n hr.append(el(\"th\", \"shell-recordgrid-tools\"));\n head.replaceChildren(hr);\n\n const used = new Set<string>();\n const rows: HTMLElement[] = [];\n for (const key of keys) {\n const record = isObject(map[key]) ? map[key] as Record<string, unknown> : {};\n const tr = el(\"tr\");\n tr.dataset[\"key\"] = key;\n const name = recordMapKeyLabel(decl, key, adapter);\n const keyCell = el(\"th\", \"shell-recordgrid-key\", name);\n keyCell.setAttribute(\"scope\", \"row\");\n if (keyNodes !== undefined && adapter && keyNodes.every((n) => n.id !== key) && adapter.label?.(keyKind!, key) === undefined) {\n keyCell.append(el(\"span\", \"shell-recordgrid-gone\", \" (not here any more)\"));\n }\n tr.append(keyCell);\n for (const f of fields) {\n used.add(`${key}\\u0000${f.name}`);\n const td = el(\"td\");\n td.append(cell(key, f, record));\n tr.append(td);\n }\n const tools = el(\"td\", \"shell-recordgrid-tools\");\n if (editable()) tools.append(iconBtn(\"close\", `Remove ${name}`, () => { const next = { ...held() }; delete next[key]; commit(next); }));\n tr.append(tools);\n rows.push(tr);\n }\n for (const id of [...cells.keys()]) if (!used.has(id)) cells.delete(id);\n body.replaceChildren(...rows);\n table.hidden = keys.length === 0;\n empty.textContent = keys.length === 0 ? \"None yet.\" : \"\";\n empty.hidden = keys.length !== 0;\n\n adder.replaceChildren();\n if (!editable()) return;\n const add = (k: string): void => {\n if (k === \"\" || Object.prototype.hasOwnProperty.call(held(), k)) return;\n commit({ ...held(), [k]: defaultOf(decl.of as unknown as TypeDecl) });\n };\n if (keyNodes !== undefined) {\n const pick = el(\"select\", `field shell-valuerow-key${opts.controlClassName ? ` ${opts.controlClassName}` : \"\"}`);\n const first = el(\"option\", undefined, \"Add...\"); first.value = \"\"; pick.append(first);\n for (const n of keyNodes.filter((n) => !Object.prototype.hasOwnProperty.call(map, n.id))) {\n const opt = el(\"option\", undefined, n.label); opt.value = n.id; pick.append(opt);\n }\n pick.disabled = pick.options.length === 1;\n pick.addEventListener(\"change\", () => add(pick.value));\n adder.append(pick);\n } else {\n const input = el(\"input\", \"field shell-valuerow-key\");\n input.type = \"text\"; input.placeholder = \"New key\"; input.value = addKey;\n input.addEventListener(\"input\", () => { addKey = input.value; });\n const go = (): void => { const k = input.value.trim(); addKey = \"\"; add(k); };\n input.addEventListener(\"keydown\", (e) => { if ((e as KeyboardEvent).key === \"Enter\") go(); });\n adder.append(input, iconBtn(\"add\", \"Add\", go));\n }\n };\n\n draw();\n return { el: root, update: (o) => { opts = o; draw(); } };\n}\n\n/** The key column's heading: the key's node kind (\"Cast\"), else \"Key\". */\nfunction recordMapKeyHeading(decl: ValueDecl): string {\n const to = decl.key?.type === \"reference\" ? decl.key.to : undefined;\n return to ? to.charAt(0).toUpperCase() + to.slice(1) : \"Key\";\n}\n","// ---------------------------------------------------------------------------\n// Rows for a value of ANY declared type: the seven scalars through the field\n// row, and the types an extension's fields add (patterkit design/proposals/\n// patter-storylet-extensions.md, \"Tier 1: fields\"): a `reference` to one of the\n// host's nodes, a `pick` of one choice from the sources its manifest names, a\n// `record` of named fields, a `map` keyed by a reference or by text, and a `list`\n// with ids or without.\n//\n// A structured value is drawn as its parts, each part a row of its own, so the\n// family's field rules hold all the way down: commit as typed, Escape restores,\n// the unset state names what it falls back to, a value the declaration refuses\n// is said under it, and a row keeps its element (and its focus) across a redraw.\n// The checks are `@wildwinter/toolkit/extensions`' (`valueProblems`), the same\n// ones the command lines run, so the editor and validation never disagree.\n//\n// The host supplies what only it knows through an adapter: which nodes there are\n// of a kind (a map keyed by tag offers the tags, a reference to a card the\n// cards), and the lists of text on the extension's project node a pick offers.\n// No Electron, no app state: DOM only.\n//\n// Its own entry (`@wildwinter/app-shell/value-rows`) rather than part of\n// value-control, because it needs `@wildwinter/toolkit/extensions` (an optional\n// peer, toolkit 0.2.5 or later) and the scalar row does not: a host that draws\n// only the family's seven types takes nothing new.\n// ---------------------------------------------------------------------------\n\nimport { defaultOf, pickChoices, valueProblems } from \"@wildwinter/toolkit/extensions\";\nimport type { PickSource, TypeDecl, ValueContext } from \"@wildwinter/toolkit/extensions\";\nimport { el, iconBtn, moveItem } from \"./dom.js\";\nimport { fieldRow, fieldRowFocus, valueHelpText } from \"./value-control.js\";\nimport type { FieldDeclLike, FieldRowHandle, FieldValue } from \"./value-control.js\";\n\n/** A declaration of any type, as an extension's manifest writes it. */\nexport interface ValueDecl extends FieldDeclLike {\n /** The caption; the name when absent. */\n label?: string;\n /** A sentence or two shown under the control (an extension's `help`, a field's `purpose`). */\n help?: string;\n /** A reference's node kind. */\n to?: string;\n /** A pick's sources, in the order its choices are shown: fixed words, a node kind, a project list. */\n from?: readonly PickSource[];\n /** A record's fields. */\n fields?: ValueDecl[];\n /** A map's key: text, or a reference to a node kind. */\n key?: { type: string; to?: string };\n /** A map's or a list's value type. */\n of?: Omit<ValueDecl, \"name\"> & { name?: string };\n /** A list's id field: the text field of its records that keys each item. */\n id?: string;\n min?: number;\n max?: number;\n required?: boolean;\n}\n\n/** One node the host offers, by id, with the name the author knows it by. */\nexport interface ValueNode { id: string; label: string }\n\n/** What only the host knows: the nodes of a kind (`card`, `tag`, `cast`...), for references, map keys and picks,\n * and the lists of text on the extension's own project node, for picks. */\nexport interface ValueAdapter {\n nodes(kind: string): readonly ValueNode[];\n /**\n * The entries of a list of text on the extension's own project node, by field name, for a pick's `list` source\n * (the toolkit's `pickLists` reads them off the project entry). A host scopes it to the extension whose rows it\n * draws. Absent: a pick offers no list entries, and doesn't check against them.\n */\n list?(name: string): readonly string[] | undefined;\n /**\n * The name of a node by kind and id, for a value that holds one `nodes` does not offer (a node outside the\n * choices, say): undefined when there is no such node, which is then shown as gone. Absent: a held id `nodes`\n * does not list is taken to be gone.\n */\n label?(kind: string, id: string): string | undefined;\n}\n\n/** A node's name: from the choices, else the host's `label`; undefined when the host says there is none. */\nfunction nodeLabel(adapter: ValueAdapter, kind: string, id: string): string | undefined {\n return adapter.nodes(kind).find((n) => n.id === id)?.label ?? adapter.label?.(kind, id);\n}\n\nexport interface ValueRowOptions {\n decl: ValueDecl;\n /** The node's own value, or undefined where it sets none. */\n value: unknown;\n /** Commit a value; undefined clears it, back to the default. Absent: read-only. */\n onCommit?: (value: unknown) => void;\n /** The host's nodes, for references and map keys. Absent: a reference is typed as an id. */\n adapter?: ValueAdapter;\n disabled?: boolean;\n /** A message of the app's own about this value, shown under it. */\n problem?: string;\n /** The app's own sentence instead of the row's own checks, as the field row's `replaceProblem`. */\n replaceProblem?: string;\n /** The caption; default the declaration's label, else its name. */\n label?: string | Node;\n className?: string;\n labelClassName?: string;\n controlClassName?: string;\n}\n\nexport interface ValueRowHandle {\n readonly el: HTMLElement;\n update(opts: ValueRowOptions): void;\n}\n\nconst SCALARS = new Set([\"text\", \"multiline\", \"number\", \"boolean\", \"enum\", \"flags\", \"quality\", \"string\"]);\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\nconst nameOf = (decl: ValueDecl): string => decl.label ?? decl.name;\nconst asDecl = (d: Omit<ValueDecl, \"name\"> & { name?: string }, name: string): ValueDecl => ({ ...d, name: d.name ?? name });\n\n/** The toolkit's checks for this value, as words for the row itself (the parts say their own). */\nfunction ownProblems(decl: ValueDecl, value: unknown, adapter: ValueAdapter | undefined): string {\n if (value === undefined) return \"\";\n return valueProblems(decl as unknown as TypeDecl, value, contextOf(adapter))\n .filter((p) => p.path === \"\" && (p.severity === \"error\" || p.code === \"pick-ambiguous\") && p.code !== \"not-a-value\" && p.code !== \"not-a-stage\")\n .map((p) => `${p.message.replace(/^the value/, \"The value\")}.`)\n .join(\" \");\n}\n\n/** The adapter as the toolkit's checks take it: whether a node exists, and a project list's entries. */\nfunction contextOf(adapter: ValueAdapter | undefined): ValueContext {\n if (!adapter) return {};\n return {\n exists: (kind: string, id: string) => nodeLabel(adapter, kind, id) !== undefined,\n ...(adapter.list ? { list: (name: string) => adapter.list!(name) } : {}),\n };\n}\n\n/**\n * A row for a value of `decl`'s type, whatever it is: a scalar as the field row, a reference as a choice of\n * the host's nodes, and a record, map or list as its parts, each a row of its own. Keeps its element, and its\n * parts' elements, across `update`, so a host that redraws on every change keeps the author's place.\n */\nexport function valueRow(initial: ValueRowOptions): ValueRowHandle {\n const decl = initial.decl;\n if (SCALARS.has(decl.type)) return scalarRow(initial);\n if (decl.type === \"reference\") return referenceRow(initial);\n if (decl.type === \"pick\") return pickRow(initial);\n return structuredRow(initial);\n}\n\n/** The field row, with an extension's help as its purpose and the toolkit's range checks. */\nfunction scalarRow(initial: ValueRowOptions): ValueRowHandle {\n const map = (o: ValueRowOptions) => {\n const range = ownProblems(o.decl, o.value, o.adapter);\n const problem = [range, o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n return {\n decl: { ...o.decl, ...(o.decl.help !== undefined && o.decl.purpose === undefined ? { purpose: o.decl.help } : {}) },\n value: o.value,\n ...(o.onCommit ? { onCommit: (v: FieldValue | undefined) => o.onCommit!(v) } : {}),\n ...(o.disabled !== undefined ? { disabled: o.disabled } : {}),\n ...(problem !== \"\" ? { problem } : {}),\n ...(o.replaceProblem !== undefined ? { replaceProblem: o.replaceProblem } : {}),\n label: o.label ?? nameOf(o.decl),\n ...(o.className !== undefined ? { className: o.className } : {}),\n ...(o.labelClassName !== undefined ? { labelClassName: o.labelClassName } : {}),\n ...(o.controlClassName !== undefined ? { controlClassName: o.controlClassName } : {}),\n };\n };\n const handle: FieldRowHandle = fieldRow(map(initial));\n return { el: handle.el, update: (o) => handle.update(map(o)) };\n}\n\n/** A reference: a choice of the host's nodes of its kind, \"default (none)\" first; a node that has gone stays\n * visible as what is held. Without an adapter, the id is typed. */\nfunction referenceRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n if (!opts.adapter) {\n const inner = scalarRow({ ...opts, decl: { ...opts.decl, type: \"text\" } });\n return { el: inner.el, update: (o) => { opts = o; inner.update({ ...o, decl: { ...o.decl, type: \"text\" } }); } };\n }\n const row = el(\"div\", \"shell-fieldrow shell-valuerow-ref\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body\");\n const sel = el(\"select\", \"field shell-fieldrow-select\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n body.append(sel, help, problem);\n row.append(caption, body);\n sel.addEventListener(\"change\", () => {\n const v = sel.value === \"\" ? undefined : sel.value;\n opts = { ...opts, value: v };\n draw(opts);\n opts.onCommit?.(v);\n });\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n row.className = `shell-fieldrow shell-valuerow-ref${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(o.decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n if (o.controlClassName) sel.className = `shell-fieldrow-select ${o.controlClassName}`;\n const nodes = o.adapter!.nodes(o.decl.to ?? \"\");\n const held = typeof o.value === \"string\" ? o.value : \"\";\n sel.replaceChildren();\n const add = (v: string, text: string): void => { const opt = el(\"option\", undefined, text); opt.value = v; sel.append(opt); };\n add(\"\", \"default (none)\");\n for (const n of nodes) add(n.id, n.label);\n if (held !== \"\" && !nodes.some((n) => n.id === held)) {\n // A node outside the choices keeps its name; only one the host says does not exist reads as gone.\n const name = o.adapter!.label?.(o.decl.to ?? \"\", held);\n add(held, name ?? `${held} (gone)`);\n }\n sel.value = held;\n sel.disabled = o.onCommit === undefined || o.disabled === true;\n help.textContent = o.decl.help ?? o.decl.purpose ?? \"\";\n help.hidden = help.textContent === \"\";\n const words = o.replaceProblem ?? [ownProblems(o.decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n row.classList.toggle(\"has-problem\", words !== \"\");\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/**\n * A pick: one choice, \"auto\" (empty) first, then each source's choices in the declared order, a node kind's and a\n * project list's under their names. A value no source holds stays visible as what is held, marked missing; a\n * name two sources hold is said under it. Without an adapter, a pick of fixed words alone is still a choice of\n * them, and one with other sources is typed as text.\n */\nfunction pickRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n if (!opts.adapter && (opts.decl.from ?? []).some((s) => !(\"words\" in s))) {\n const inner = scalarRow({ ...opts, decl: { ...opts.decl, type: \"text\" } });\n return { el: inner.el, update: (o) => { opts = o; inner.update({ ...o, decl: { ...o.decl, type: \"text\" } }); } };\n }\n const row = el(\"div\", \"shell-fieldrow shell-valuerow-pick\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body\");\n const sel = el(\"select\", \"field shell-fieldrow-select\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const valueHelp = el(\"p\", \"shell-fieldrow-purpose shell-fieldrow-valuehelp\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n body.append(sel, help, valueHelp, problem);\n row.append(caption, body);\n sel.addEventListener(\"change\", () => {\n const v = sel.value === \"\" ? undefined : sel.value;\n opts = { ...opts, value: v };\n draw(opts);\n opts.onCommit?.(v);\n });\n const groupName = (s: PickSource): string | undefined =>\n \"to\" in s ? (s.to === \"cast\" ? \"Cast\" : s.to.charAt(0).toUpperCase() + s.to.slice(1)) : \"list\" in s ? s.list : undefined;\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n row.className = `shell-fieldrow shell-valuerow-pick${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(o.decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n if (o.controlClassName) sel.className = `shell-fieldrow-select ${o.controlClassName}`;\n const adapter = o.adapter;\n const choices = pickChoices(o.decl as unknown as TypeDecl, {\n ...(adapter ? { nodes: (kind: string) => adapter.nodes(kind) } : {}),\n ...(adapter?.list ? { list: (name: string) => adapter.list!(name) } : {}),\n });\n const held = typeof o.value === \"string\" ? o.value : \"\";\n sel.replaceChildren();\n const option = (v: string, text: string): HTMLOptionElement => { const opt = el(\"option\", undefined, text); opt.value = v; return opt; };\n sel.append(option(\"\", \"auto\"));\n // One group per source, in order; a value two sources hold is offered by the first only, so the select\n // shows one choice for what it holds (the row says the name is ambiguous).\n const offered = new Set<string>();\n let group: { source: PickSource; el: HTMLElement } | undefined;\n for (const c of choices) {\n if (offered.has(c.value)) continue;\n offered.add(c.value);\n const name = groupName(c.source);\n if (name === undefined) { group = undefined; sel.append(option(c.value, c.label)); continue; }\n if (group?.source !== c.source) {\n const og = el(\"optgroup\");\n og.setAttribute(\"label\", name);\n sel.append(og);\n group = { source: c.source, el: og };\n }\n group.el.append(option(c.value, c.label));\n }\n if (held !== \"\" && !offered.has(held)) {\n // A node outside the choices keeps its name (as a reference's does); anything else is missing.\n const named = (o.decl.from ?? []).map((s) => (\"to\" in s && adapter ? adapter.label?.(s.to, held) : undefined)).find((n) => n !== undefined);\n sel.append(option(held, named ?? `${held} (missing)`));\n }\n sel.value = held;\n sel.disabled = o.onCommit === undefined || o.disabled === true;\n help.textContent = o.decl.help ?? o.decl.purpose ?? \"\";\n help.hidden = help.textContent === \"\";\n // The chosen word's own help, as an enum's value has (a pick's help describes its fixed words only).\n valueHelp.textContent = valueHelpText(o.decl, o.value);\n valueHelp.hidden = valueHelp.textContent === \"\";\n const words = o.replaceProblem ?? [ownProblems(o.decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n row.classList.toggle(\"has-problem\", words !== \"\");\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/** A part of a structured value: a row, keyed so it is the same element next time. */\ninterface Part { key: string; handle: ValueRowHandle; holder: HTMLElement; tools: HTMLElement }\n\n/** A record, a map or a list: a caption, then its parts, each a row of its own, with the controls the type\n * calls for (add and remove for a map; add, remove and move for a list). */\nfunction structuredRow(initial: ValueRowOptions): ValueRowHandle {\n let opts = initial;\n const row = el(\"div\", \"shell-fieldrow shell-valuerow\");\n const caption = el(\"span\", \"shell-fieldrow-label\");\n const body = el(\"div\", \"shell-fieldrow-body shell-valuerow-parts\");\n const help = el(\"p\", \"shell-fieldrow-purpose\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n const adder = el(\"div\", \"shell-valuerow-add\");\n row.append(caption, body);\n const parts = new Map<string, Part>();\n /** The parts kept from the last draw, whose focus goes back to them once they are in the page again. */\n let kept: HTMLElement[] = [];\n let addKey = \"\";\n\n const editable = (): boolean => opts.onCommit !== undefined && opts.disabled !== true;\n const commit = (v: unknown): void => { opts = { ...opts, value: v }; draw(opts); opts.onCommit?.(v); };\n\n /** The row for one part, the same element as last time for the same key. */\n const part = (key: string, o: ValueRowOptions, controls: HTMLElement[] = []): HTMLElement => {\n const had = parts.get(key);\n if (had && had.handle.el.dataset[\"type\"] === o.decl.type) {\n fieldRowFocus.settle(had.handle.el);\n had.handle.update(o);\n // Its own slot, not the first one inside it: a structured part has slots of its own further down.\n had.tools.replaceChildren(...controls);\n kept.push(had.handle.el);\n return had.holder;\n }\n const handle = valueRow(o);\n handle.el.dataset[\"type\"] = o.decl.type;\n const holder = el(\"div\", \"shell-valuerow-part\");\n const tools = el(\"span\", \"shell-valuerow-controls\");\n tools.append(...controls);\n holder.append(handle.el, tools);\n parts.set(key, { key, handle, holder, tools });\n return holder;\n };\n\n const draw = (o: ValueRowOptions): void => {\n opts = o;\n kept = [];\n const decl = o.decl;\n row.className = `shell-fieldrow shell-valuerow shell-valuerow-${decl.type}${o.className ? ` ${o.className}` : \"\"}`;\n const label = o.label ?? nameOf(decl);\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n const used = new Set<string>();\n const rows: HTMLElement[] = [];\n const child = (key: string, childDecl: ValueDecl, value: unknown, onCommit: (v: unknown) => void, controls?: HTMLElement[], childLabel?: string, extraProblem?: string): void => {\n used.add(key);\n rows.push(part(key, {\n decl: childDecl, value,\n ...(editable() ? { onCommit } : {}),\n ...(o.adapter ? { adapter: o.adapter } : {}),\n ...(o.disabled !== undefined ? { disabled: o.disabled } : {}),\n ...(childLabel !== undefined ? { label: childLabel } : {}),\n ...(extraProblem ? { problem: extraProblem } : {}),\n ...(o.controlClassName !== undefined ? { controlClassName: o.controlClassName } : {}),\n }, controls));\n };\n\n if (decl.type === \"record\") {\n const value = isObject(o.value) ? o.value : undefined;\n const required = value === undefined ? [] : valueProblems(decl as unknown as TypeDecl, value).filter((p) => p.code === \"required\");\n for (const f of decl.fields ?? []) {\n const missing = required.find((p) => p.path === f.name);\n child(`f:${f.name}`, f, value?.[f.name], (v) => {\n const next: Record<string, unknown> = { ...(isObject(opts.value) ? opts.value : {}) };\n if (v === undefined) delete next[f.name]; else next[f.name] = v;\n commit(Object.keys(next).length > 0 ? next : undefined);\n }, undefined, undefined, missing ? \"Required.\" : undefined);\n }\n } else if (decl.type === \"map\" && decl.of) {\n const value = isObject(o.value) ? o.value : {};\n const keyNodes = decl.key?.type === \"reference\" && o.adapter ? o.adapter.nodes(decl.key.to ?? \"\") : undefined;\n const keyKind = decl.key?.to ?? \"\";\n const keyLabel = (k: string): string => (o.adapter && keyNodes !== undefined ? nodeLabel(o.adapter, keyKind, k) : undefined) ?? k;\n for (const k of Object.keys(value)) {\n const remove = editable() ? [iconBtn(\"close\", `Remove ${keyLabel(k)}`, () => {\n const next = { ...(isObject(opts.value) ? opts.value : {}) };\n delete next[k];\n commit(Object.keys(next).length > 0 ? next : undefined);\n })] : [];\n const gone = keyNodes !== undefined && o.adapter && nodeLabel(o.adapter, keyKind, k) === undefined ? `${k} is not here any more.` : undefined;\n child(`k:${k}`, asDecl(decl.of, k), value[k], (v) => {\n const next = { ...(isObject(opts.value) ? opts.value : {}) };\n next[k] = v === undefined ? defaultOf(decl.of as unknown as TypeDecl) : v;\n commit(next);\n }, remove, keyLabel(k), gone);\n }\n adder.replaceChildren();\n if (editable()) {\n const add = (k: string): void => {\n if (k === \"\" || Object.prototype.hasOwnProperty.call(value, k)) return;\n commit({ ...value, [k]: defaultOf(decl.of as unknown as TypeDecl) });\n };\n if (keyNodes !== undefined) {\n const pick = el(\"select\", \"field shell-valuerow-key\");\n const first = el(\"option\", undefined, \"Add...\"); first.value = \"\"; pick.append(first);\n for (const n of keyNodes.filter((n) => !Object.prototype.hasOwnProperty.call(value, n.id))) {\n const opt = el(\"option\", undefined, n.label); opt.value = n.id; pick.append(opt);\n }\n pick.addEventListener(\"change\", () => add(pick.value));\n adder.append(pick);\n } else {\n const input = el(\"input\", \"field shell-valuerow-key\");\n input.type = \"text\"; input.placeholder = \"New key\"; input.value = addKey;\n input.addEventListener(\"input\", () => { addKey = input.value; });\n const go = (): void => { const k = input.value.trim(); addKey = \"\"; add(k); };\n input.addEventListener(\"keydown\", (e) => { if ((e as KeyboardEvent).key === \"Enter\") go(); });\n adder.append(input, iconBtn(\"add\", \"Add\", go));\n }\n }\n } else if (decl.type === \"list\" && decl.of) {\n const value = Array.isArray(o.value) ? o.value : [];\n const idOf = (item: unknown, i: number): string =>\n decl.id !== undefined && isObject(item) && typeof item[decl.id] === \"string\" ? `id:${item[decl.id] as string}` : `i:${i}`;\n value.forEach((item, i) => {\n const set = (next: unknown[]): void => commit(next.length > 0 ? next : undefined);\n const controls = editable() ? [\n iconBtn(\"up\", \"Move up\", () => { const next = [...value]; if (moveItem(next, i, -1)) set(next); }, i === 0),\n iconBtn(\"down\", \"Move down\", () => { const next = [...value]; if (moveItem(next, i, 1)) set(next); }, i === value.length - 1),\n iconBtn(\"close\", \"Remove\", () => set(value.filter((_, j) => j !== i)), false, true),\n ] : [];\n const itemLabel = decl.id !== undefined && isObject(item) && typeof item[decl.id] === \"string\" ? item[decl.id] as string : `${i + 1}`;\n child(idOf(item, i), asDecl(decl.of!, itemLabel), item, (v) => {\n const next = [...(Array.isArray(opts.value) ? opts.value : [])];\n next[i] = v === undefined ? defaultOf(decl.of as unknown as TypeDecl) : v;\n set(next);\n }, controls, itemLabel);\n });\n adder.replaceChildren();\n if (editable()) {\n adder.append(iconBtn(\"add\", \"Add\", () => {\n const fresh = defaultOf(decl.of as unknown as TypeDecl);\n if (decl.id !== undefined && isObject(fresh)) {\n const taken = new Set(value.map((x) => (isObject(x) ? x[decl.id!] : undefined)));\n let n = value.length + 1;\n while (taken.has(`item-${n}`)) n++;\n fresh[decl.id] = `item-${n}`;\n }\n commit([...value, fresh]);\n }));\n }\n }\n\n for (const key of [...parts.keys()]) if (!used.has(key)) parts.delete(key);\n body.replaceChildren(...rows);\n if (decl.type !== \"record\" && editable()) body.append(adder);\n help.textContent = decl.help ?? decl.purpose ?? \"\";\n if (help.textContent !== \"\") body.append(help);\n const words = o.replaceProblem ?? [ownProblems(decl, o.value, o.adapter), o.problem ?? \"\"].filter((w) => w !== \"\").join(\" \");\n problem.textContent = words;\n problem.hidden = words === \"\";\n body.append(problem);\n row.classList.toggle(\"has-problem\", words !== \"\");\n for (const k of kept) fieldRowFocus.restore(k);\n };\n draw(initial);\n return { el: row, update: draw };\n}\n\n/** A cache of value rows for a host that redraws its whole view (as `fieldRows` is for the scalar row). */\nexport interface ValueRows {\n row(key: string, opts: ValueRowOptions): HTMLElement;\n sweep(): void;\n}\n\nexport function valueRows(): ValueRows {\n const rows = new Map<string, { handle: ValueRowHandle; type: string; used: boolean }>();\n return {\n row(key, opts) {\n const had = rows.get(key);\n if (had && had.type === opts.decl.type) {\n had.used = true;\n fieldRowFocus.settle(had.handle.el);\n had.handle.update(opts);\n fieldRowFocus.restore(had.handle.el);\n return had.handle.el;\n }\n const handle = valueRow(opts);\n rows.set(key, { handle, type: opts.decl.type, used: true });\n return handle.el;\n },\n sweep() {\n for (const [key, entry] of rows) { if (!entry.used) rows.delete(key); else entry.used = false; }\n },\n };\n}\n\n// An extension's section folded to the fields a node sets (value-fold.ts), under this entry so a host takes\n// the rows and the fold together.\nexport { isSet, extensionFold, foldCaption } from \"./value-fold.js\";\nexport type { ExtensionFold, FoldSectionOptions } from \"./value-fold.js\";\n\n// A map of records (record-map.ts): the inspector's summary and the helper window's grid.\nexport { isRecordMap, recordMapGrid, recordMapKeyLabel, recordMapSummary, valueText } from \"./record-map.js\";\nexport type { RecordMapGrid, RecordMapGridOptions } from \"./record-map.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wildwinter/app-shell",
3
- "version": "0.58.0",
3
+ "version": "0.58.1",
4
4
  "description": "The shared shell for the editor family (Patterpad, Storylet Studio): the app-agnostic design-token grammar, the per-entity colour hash, and the vanilla-TS DOM primitive. Two palettes, one grammar - each app supplies its own palette/fonts over these tokens.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/value-control.ts"],"names":[],"mappings":"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","file":"chunk-XJM733E6.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Typed value controls: how both apps show and set a value of a declared type.\n//\n// The first is the quality's. A quality is a step on a ladder, so its value is\n// shown as the LADDER, with the current rung marked, rather than a dropdown that\n// shows one name and hides where it stands (patterkit design/proposals/\n// patter-qualities.md section 4). Storyletter's Board drew it this way first;\n// it lives here so Storyletter's Fields tab, Patterpad's play panel and Game\n// Data rows, and the play inspectors all draw the same strip.\n//\n// An UNSET value (a field or game-data value the node leaves out) names what it\n// falls back to, \"default (x)\", by the family's one rule: the declaration's own\n// default, else the type's (a quality's first stage). A value that is no longer\n// a stage (a deleted one) is shown as such, so it can be put back on the ladder.\n//\n// No Electron, no app state: this module is DOM only, and is its own entry point\n// (`@wildwinter/app-shell/value-control`) so a play inspector outside the apps\n// can take it.\n// ---------------------------------------------------------------------------\n\nimport { el, tagChips } from \"./dom.js\";\n\n/** A declaration as these controls read it: a property's, a field's or a game-data field's. */\nexport interface ValueDeclLike {\n type: string;\n default?: unknown;\n /** enum / flags */\n values?: readonly string[];\n /** quality: the ladder, in order */\n stages?: readonly string[];\n}\n\n/**\n * What an unset value of `decl` falls back to, as the words a control shows: its own default where it has\n * one, else its type's (False, 0, the first value, no flags, the first stage, empty text). The kernel's\n * `defaultFor`, in words; a host reads the same value from the bundle.\n */\nexport function fallbackText(decl: ValueDeclLike): string {\n const d = decl.default;\n if (d !== undefined && d !== null) {\n if (typeof d === \"boolean\") return d ? \"True\" : \"False\";\n if (Array.isArray(d)) return d.length === 0 ? \"none\" : d.join(\", \");\n return d === \"\" ? \"none\" : String(d);\n }\n switch (decl.type) {\n case \"boolean\": return \"False\";\n case \"number\": return \"0\";\n case \"enum\": return decl.values?.[0] ?? \"none\";\n case \"quality\": return decl.stages?.[0] ?? \"first stage\";\n case \"flags\": return \"none\";\n default: return \"empty\";\n }\n}\n\n/** The label an unset value shows: \"default (x)\", naming what it falls back to. */\nexport const defaultLabel = (decl: ValueDeclLike): string => `default (${fallbackText(decl)})`;\n\n/**\n * The quiet line under a ladder that has just been reordered: how many gates order against it. A reorder\n * changes no value, and is the one edit that changes what a gate MEANS without saying so (patter-qualities.md\n * section 2), so the editor says so. Empty when no gate orders the quality.\n */\nexport function stageGateNote(gates: number): string {\n if (gates <= 0) return \"\";\n return gates === 1\n ? \"1 gate compares against this ladder, and it now reads the new order.\"\n : `${gates} gates compare against this ladder, and each now reads the new order.`;\n}\n\nexport interface RungStripOptions {\n /** The ladder, in order. */\n stages: readonly string[];\n /** The value held, or undefined when unset: a field or game-data value the node leaves out. */\n value: string | undefined;\n /** The declaration, for what an unset value falls back to (its default, else the first stage). */\n decl?: ValueDeclLike;\n /** Pick a stage. Absent: the strip is read-only. */\n onPick?: (stage: string) => void;\n /** Clear back to unset. With it, the strip leads with \"default (x)\", which clears the value. */\n onClear?: () => void;\n /** The rollover on a rung that is not the current one (default: `Set to \"x\"`). */\n pickTip?: (stage: string) => string;\n /**\n * The document to build in, for a host outside the apps (a play inspector in a page or a frame of its\n * own). Given, rollovers are plain `title`s and the family's themed tooltips are not mounted; the host\n * styles `.seg`, `.seg-opt` and `.shell-rung` itself. Absent: the apps' document and themed rollovers.\n */\n doc?: Document;\n}\n\n/**\n * A quality's value as its ladder: one rung per stage, in order, the current one marked (`on`). Unset, the\n * rung it falls back to is marked as the fallback (`fallback`), and with `onClear` a leading \"default (x)\"\n * option is the current choice. A value that is not a stage (a deleted one) is shown after the ladder,\n * marked `stray`, until a rung is picked.\n */\nexport function rungStrip(opts: RungStripOptions): HTMLElement {\n const make = opts.doc === undefined ? el : (tag: \"span\" | \"button\", props: { className: string; text?: string; tip?: string; onClick?: () => void }) => {\n const node = opts.doc!.createElement(tag);\n node.className = props.className;\n if (props.text !== undefined) node.textContent = props.text;\n if (props.tip !== undefined) { node.title = props.tip; node.setAttribute(\"aria-label\", props.tip); }\n if (props.onClick) node.addEventListener(\"click\", props.onClick);\n if (tag === \"button\") (node as HTMLButtonElement).type = \"button\";\n return node;\n };\n const strip = make(\"span\", { className: \"seg shell-rungs\" });\n const decl: ValueDeclLike = opts.decl ?? { type: \"quality\", stages: opts.stages };\n const unset = opts.value === undefined;\n const fallback = typeof decl.default === \"string\" && opts.stages.includes(decl.default) ? decl.default : opts.stages[0];\n const readOnly = opts.onPick === undefined;\n if (opts.onClear) {\n strip.append(make(\"button\", {\n className: `seg-opt shell-rung shell-rung-default${unset ? \" on\" : \"\"}`, text: defaultLabel(decl),\n tip: unset ? \"Not set here: the declared default holds\" : \"Clear the value, back to the default\",\n onClick: () => { if (!unset) opts.onClear!(); },\n }));\n }\n for (const stage of opts.stages) {\n const current = opts.value === stage;\n const falls = unset && stage === fallback;\n const rung = make(readOnly ? \"span\" : \"button\", {\n className: `seg-opt shell-rung${current ? \" on\" : \"\"}${falls ? \" fallback\" : \"\"}`, text: stage,\n tip: current ? \"The current stage\" : falls ? \"The stage it falls back to\" : readOnly ? stage : (opts.pickTip?.(stage) ?? `Set to \"${stage}\"`),\n ...(readOnly ? {} : { onClick: () => { if (!current) opts.onPick!(stage); } }),\n });\n strip.append(rung);\n }\n if (!unset && !opts.stages.includes(opts.value!)) {\n strip.append(make(\"span\", {\n className: \"seg-opt shell-rung stray on\", text: opts.value!,\n tip: `\"${opts.value}\" is not one of the stages: pick the one it belongs at now`,\n }));\n }\n return strip;\n}\n\n// ---------------------------------------------------------------------------\n// The field row: ONE control for a node's value of a declared field, driven by\n// the declared type, for the family's seven types (text, multiline, number,\n// boolean, enum, flags, quality). Storyletter's card and outcome Fields and\n// Patterpad's Game Data rows both draw it, which settles the disagreements the\n// parity review found (patterkit design/family-parity-2026-10.md item 10):\n//\n// - the declared purpose is shown, under the control, not hidden in a rollover;\n// - unset says what it falls back to, \"default (x)\", by `defaultLabel`;\n// - flags are a picker of the declared values, not comma-separated text;\n// - multiline is a text area;\n// - a value the declaration refuses (not a number, not one of the values, not\n// a stage) is said under the control, and the app may add its own message;\n// - text commits as typed, and Escape puts back what the field held when it\n// took focus (the family's field rule).\n//\n// Committing as typed means a host that redraws on every change (Patterpad's\n// inspector rebuilds its whole stack) would drop the focus at every keystroke.\n// `fieldRows()` is the answer: it hands back the SAME element for the same key\n// across a redraw, updated in place, and gives the focus (and the caret) back\n// to it once the redraw has put it in the page again.\n// ---------------------------------------------------------------------------\n\n/** A value a field row commits: a flags value is the list of names set. */\nexport type FieldValue = string | number | boolean | string[];\n\n/** A field's declaration as the row reads it: a card field's, an outcome field's or a game-data field's. */\nexport interface FieldDeclLike extends ValueDeclLike {\n name: string;\n /** What the field is for, shown under the control. */\n purpose?: string;\n /** A sentence about each value (an enum's values, the flags, a quality's stages), as an extension's manifest\n * gives them: the chosen value's is shown under the control, and each chosen flag's. */\n valueHelp?: Readonly<Record<string, string>>;\n}\n\n/**\n * The help for what `decl` holds: the chosen enum value's or stage's (the one it falls back to, when unset), or\n * each chosen flag's, \"name: sentence\" a line each. Empty when the declaration describes none of them.\n */\nexport function valueHelpText(decl: FieldDeclLike, value: unknown): string {\n const help = decl.valueHelp;\n if (help === undefined) return \"\";\n const said = (v: string): string | undefined => (Object.prototype.hasOwnProperty.call(help, v) ? help[v] : undefined);\n if (decl.type === \"enum\" || decl.type === \"quality\") {\n const held = typeof value === \"string\" && value !== \"\" ? value\n : typeof decl.default === \"string\" && decl.default !== \"\" ? decl.default\n : decl.type === \"enum\" ? decl.values?.[0] : decl.stages?.[0];\n return held === undefined ? \"\" : said(held) ?? \"\";\n }\n if (decl.type === \"flags\") {\n const held = Array.isArray(value) ? value.map(String) : Array.isArray(decl.default) ? decl.default.map(String) : [];\n return held.flatMap((v) => { const h = said(v); return h === undefined ? [] : [`${v}: ${h}`]; }).join(\"\\n\");\n }\n return \"\";\n}\n\nexport interface FieldRowOptions {\n decl: FieldDeclLike;\n /** The node's own value, typed (a flags value is a string list), or undefined where the node sets none. */\n value: unknown;\n /** Commit a value; `undefined` clears it, back to the default. Absent: the row is read-only. */\n onCommit?: (value: FieldValue | undefined) => void;\n /** Drawn but not editable, as when there is no node to write to. */\n disabled?: boolean;\n /** A message of the app's own about this value (a check the row cannot make), shown under the control. */\n problem?: string;\n /** The app's own sentence INSTEAD of the row's (a renamed stage said better than \"not one of the stages\").\n * Given, it is the whole message; `problem` is ignored. */\n replaceProblem?: string;\n /** The caption; default the field's name. */\n label?: string | Node;\n /** Added to the row and its caption, so a row sits in its app's layout. */\n className?: string;\n labelClassName?: string;\n /** The app's class for a text field or select, used instead of the shell's `.field`. */\n controlClassName?: string;\n}\n\nexport interface FieldRowHandle {\n /** The row: its caption, then the control with the purpose and any message under it. */\n readonly el: HTMLElement;\n /** Redraw for a new value, declaration or message, keeping the element. A field being typed in keeps its\n * text: what the author is typing is newer than what the app last stored. */\n update(opts: FieldRowOptions): void;\n}\n\n/** The type's fallback as a value, for a flags picker to start from when the node sets none. */\nconst fallbackFlags = (decl: ValueDeclLike): string[] => (Array.isArray(decl.default) ? decl.default.filter((v): v is string => typeof v === \"string\") : []);\n\n/** What the row says about a value the declaration refuses, or \"\" when it fits. */\nexport function fieldValueProblem(decl: ValueDeclLike, value: unknown): string {\n if (value === undefined || value === null || value === \"\") return \"\";\n switch (decl.type) {\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) ? \"\" : \"Not a number.\";\n case \"boolean\":\n return typeof value === \"boolean\" ? \"\" : \"Not True or False.\";\n case \"enum\":\n return decl.values && !decl.values.includes(String(value)) ? `\"${String(value)}\" is not one of the values.` : \"\";\n case \"quality\":\n return decl.stages && !decl.stages.includes(String(value)) ? `\"${String(value)}\" is not one of the stages.` : \"\";\n case \"flags\": {\n if (!Array.isArray(value)) return \"Not a list of flags.\";\n const strays = decl.values ? value.filter((v) => !decl.values!.includes(String(v))) : [];\n if (strays.length === 0) return \"\";\n return strays.length === 1 ? `\"${String(strays[0])}\" is not one of the values.` : `${strays.map((s) => `\"${String(s)}\"`).join(\", \")} are not among the values.`;\n }\n default:\n return \"\";\n }\n}\n\nconst isTextual = (type: string): boolean => type !== \"boolean\" && type !== \"enum\" && type !== \"flags\" && type !== \"quality\";\n\n/** Everything that decides which control is drawn: a change here rebuilds it, anything else updates it. */\nconst controlShape = (o: FieldRowOptions): string => JSON.stringify([\n o.decl.type, o.decl.values ?? null, o.decl.stages ?? null, o.decl.default ?? null,\n o.onCommit === undefined, o.disabled === true, o.controlClassName ?? \"\",\n o.decl.type === \"quality\" && (o.decl.stages?.length ?? 0) === 0,\n]);\n\n/**\n * One declared field's value as a row: the caption, then the control the declared type calls for, with the\n * purpose and any message under it. See the section comment above for the rules it carries.\n */\nexport function fieldRow(initial: FieldRowOptions): FieldRowHandle {\n let opts = initial;\n const row = el(\"div\", `shell-fieldrow${opts.className ? ` ${opts.className}` : \"\"}`);\n const caption = el(\"span\", `shell-fieldrow-label${opts.labelClassName ? ` ${opts.labelClassName}` : \"\"}`);\n caption.id = `shell-fr-${Math.random().toString(36).slice(2, 9)}`;\n const body = el(\"div\", \"shell-fieldrow-body\");\n const purpose = el(\"p\", \"shell-fieldrow-purpose\");\n const valueHelp = el(\"p\", \"shell-fieldrow-purpose shell-fieldrow-valuehelp\");\n const problem = el(\"p\", \"shell-fieldrow-problem\");\n problem.setAttribute(\"role\", \"status\");\n row.append(caption, body);\n\n let shape = \"\";\n /** Redraw the control for the current value; set by whichever control is built. */\n let show: (value: unknown) => void = () => {};\n /** A local problem the control found while typing (a number that is not one yet). */\n let typing = \"\";\n\n const commit = (v: FieldValue | undefined): void => { opts.onCommit?.(v); };\n const editable = (): boolean => opts.onCommit !== undefined && opts.disabled !== true;\n // An app's own field class replaces the shell's `.field`, so its controls look like its other fields.\n const ctl = (base: string): string => (opts.controlClassName ? `${base.replace(/^field /, \"\")} ${opts.controlClassName}` : base);\n const labelledBy = (node: HTMLElement): void => {\n node.setAttribute(\"aria-labelledby\", caption.id);\n const described = [purpose.id, problem.id].filter(Boolean).join(\" \");\n if (described) node.setAttribute(\"aria-describedby\", described);\n };\n purpose.id = `${caption.id}-p`; problem.id = `${caption.id}-m`;\n\n const sayProblem = (): void => {\n // The chosen value's own help travels with every change of value, as the message does.\n const help = valueHelpText(opts.decl, opts.value);\n valueHelp.textContent = help;\n valueHelp.hidden = help === \"\";\n const words = opts.replaceProblem !== undefined\n ? [opts.replaceProblem].filter((w) => w !== \"\")\n : [typing || fieldValueProblem(opts.decl, opts.value), opts.problem ?? \"\"].filter((w) => w !== \"\");\n problem.textContent = words.join(\" \");\n problem.hidden = words.length === 0;\n row.classList.toggle(\"has-problem\", words.length > 0);\n row.classList.toggle(\"shell-fieldrow-textual\", isTextual(opts.decl.type));\n };\n\n const build = (): HTMLElement => {\n const decl = opts.decl;\n typing = \"\";\n if (decl.type === \"quality\" && (decl.stages?.length ?? 0) > 0) {\n const holder = el(\"span\", \"shell-fieldrow-rungs\");\n show = (value) => {\n holder.replaceChildren(rungStrip({\n stages: decl.stages!, value: typeof value === \"string\" && value !== \"\" ? value : undefined, decl,\n ...(editable() ? { onPick: (stage: string) => { opts = { ...opts, value: stage }; show(stage); sayProblem(); commit(stage); }, onClear: () => { opts = { ...opts, value: undefined }; show(undefined); sayProblem(); commit(undefined); } } : {}),\n }));\n const strip = holder.firstElementChild as HTMLElement | null;\n if (strip) { strip.setAttribute(\"role\", \"group\"); labelledBy(strip); }\n };\n return holder;\n }\n if (decl.type === \"boolean\" || decl.type === \"enum\") {\n const sel = el(\"select\", ctl(\"field shell-fieldrow-select\"));\n labelledBy(sel);\n sel.disabled = !editable();\n const choices: Array<[string, string]> = decl.type === \"boolean\"\n ? [[\"true\", \"True\"], [\"false\", \"False\"]]\n : (decl.values ?? []).map((v): [string, string] => [v, v]);\n show = (value) => {\n const current = value === undefined || value === null || value === \"\" ? \"\" : String(value);\n sel.replaceChildren();\n const add = (v: string, label: string): void => { const o = el(\"option\", undefined, label); o.value = v; sel.append(o); };\n add(\"\", defaultLabel(decl));\n for (const [v, label] of choices) add(v, label);\n // A value the declaration no longer offers stays visible, so the author sees what is held.\n if (current !== \"\" && !choices.some(([v]) => v === current)) add(current, current);\n sel.value = current;\n };\n sel.addEventListener(\"change\", () => {\n const raw = sel.value;\n const v: FieldValue | undefined = raw === \"\" ? undefined : decl.type === \"boolean\" ? raw === \"true\" : raw;\n opts = { ...opts, value: v }; sayProblem(); commit(v);\n });\n return sel;\n }\n if (decl.type === \"flags\" && (decl.values?.length ?? 0) > 0) {\n const holder = el(\"span\", \"shell-flags\");\n holder.setAttribute(\"role\", \"group\");\n labelledBy(holder);\n show = (value) => {\n const unset = !Array.isArray(value);\n const held = unset ? fallbackFlags(decl) : (value as unknown[]).map(String);\n holder.replaceChildren();\n const chip = (text: string, cls: string, pressed: boolean | undefined, tip: string, onClick?: () => void): void => {\n const b = el(onClick && editable() ? \"button\" : \"span\", { className: `shell-flag${cls}`, text, tip });\n b.setAttribute(\"aria-label\", `${text}: ${tip}`); // the tip alone would hide the value's name\n if (b instanceof HTMLButtonElement) { b.type = \"button\"; b.addEventListener(\"click\", onClick!); }\n if (pressed !== undefined) b.setAttribute(\"aria-pressed\", String(pressed));\n holder.append(b);\n };\n const set = (next: string[] | undefined): void => { opts = { ...opts, value: next }; show(next); sayProblem(); commit(next); };\n chip(defaultLabel(decl), ` shell-flag-default${unset ? \" on\" : \"\"}`, undefined,\n unset ? \"Not set here: the declared default holds\" : \"Clear the value, back to the default\",\n unset ? undefined : () => set(undefined));\n for (const v of decl.values!) {\n const on = held.includes(v);\n chip(v, `${on ? \" on\" : \"\"}${on && unset ? \" fallback\" : \"\"}`, on, on ? `Unset ${v}` : `Set ${v}`,\n () => set(on ? held.filter((x) => x !== v) : decl.values!.filter((x) => x === v || held.includes(x)).concat(held.filter((x) => !decl.values!.includes(x)))));\n }\n // A held value the declaration does not offer: shown, struck, and a click drops it.\n for (const v of held.filter((x) => !decl.values!.includes(x))) {\n chip(v, \" stray on\", true, `\"${v}\" is not one of the values: click to drop it`, () => set(held.filter((x) => x !== v)));\n }\n };\n return holder;\n }\n if (decl.type === \"flags\") {\n // No values declared to pick from: the shell's chip editor, each name typed.\n const holder = el(\"span\", \"shell-fieldrow-chips\");\n show = (value) => {\n const box = { values: Array.isArray(value) ? (value as unknown[]).map(String) : [] };\n const chips = tagChips(box, () => {\n const next = box.values.length > 0 ? [...box.values] : undefined;\n opts = { ...opts, value: next }; sayProblem(); commit(next);\n });\n const input = chips.querySelector(\"input\");\n if (input) { labelledBy(input); input.placeholder = Array.isArray(value) ? \"Add value\" : defaultLabel(decl); input.disabled = !editable(); }\n chips.querySelectorAll(\"button\").forEach((b) => { (b as HTMLButtonElement).disabled = !editable(); });\n holder.replaceChildren(chips);\n };\n return holder;\n }\n // text, multiline, number, and any type the row does not know: typed, committed as typed.\n const multiline = decl.type === \"multiline\";\n const field = multiline ? el(\"textarea\", ctl(\"field shell-fieldrow-text\")) : el(\"input\", ctl(\"field shell-fieldrow-text\"));\n if (field instanceof HTMLInputElement) {\n field.type = \"text\";\n if (decl.type === \"number\") field.inputMode = \"decimal\";\n } else field.rows = 3;\n labelledBy(field);\n field.placeholder = defaultLabel(decl);\n field.disabled = !editable();\n const asText = (value: unknown): string =>\n value === undefined || value === null ? \"\" : Array.isArray(value) ? value.join(\", \") : String(value);\n const read = (raw: string): { value?: FieldValue; bad?: string } => {\n if (raw.trim() === \"\") return {};\n if (decl.type !== \"number\") return { value: raw };\n const n = Number(raw.trim());\n return Number.isFinite(n) ? { value: n } : { bad: \"Not a number.\" };\n };\n let atFocus = \"\";\n show = (value) => {\n // What the author is typing is newer than the stored value, so a focused field keeps its text.\n // So does one the author was in when a redraw took the row out of the page, until they leave it.\n if (field.ownerDocument.activeElement === field || keeper.restoring(field) || keeper.holds(row)) return;\n field.value = asText(value);\n };\n const take = (): void => {\n const r = read(field.value);\n typing = r.bad ?? \"\";\n if (r.bad === undefined) opts = { ...opts, value: r.value };\n sayProblem();\n if (r.bad === undefined) commit(r.value);\n };\n field.addEventListener(\"focus\", () => { if (!keeper.restoring(field)) atFocus = field.value; });\n field.addEventListener(\"input\", take);\n field.addEventListener(\"keydown\", (e) => {\n if ((e as KeyboardEvent).key !== \"Escape\" || field.value === atFocus) return;\n field.value = atFocus;\n take();\n });\n return field;\n };\n\n const draw = (next: FieldRowOptions): void => {\n const decl = next.decl;\n const label = next.label ?? decl.name;\n if (typeof label === \"string\") caption.textContent = label; else caption.replaceChildren(label);\n caption.className = `shell-fieldrow-label${next.labelClassName ? ` ${next.labelClassName}` : \"\"}`;\n row.className = `shell-fieldrow${next.className ? ` ${next.className}` : \"\"}`;\n const nextShape = controlShape(next);\n opts = next;\n if (nextShape !== shape) {\n shape = nextShape;\n body.replaceChildren(build());\n }\n show(next.value);\n purpose.textContent = decl.purpose ?? \"\";\n if (decl.purpose) body.append(purpose); else purpose.remove();\n body.append(valueHelp, problem);\n sayProblem();\n };\n\n draw(initial);\n keeper.watch(row);\n return { el: row, update: draw };\n}\n\n// --- keeping the focus across a redraw -------------------------------------\n//\n// A host that rebuilds its view takes the row out of the page and puts it back.\n// Taking a focused element out drops its focus, which is the same thing as\n// the author losing their place mid-word. So a row remembers whether the\n// author was in it, and where the caret was, and the cache gives both back\n// once the row is in the page again (a microtask: after the host's redraw).\n\ninterface FocusMemo { field: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement; start: number | null; end: number | null }\n\nconst keeper = (() => {\n const memos = new WeakMap<HTMLElement, FocusMemo>();\n const restoringNow = new WeakSet<Element>();\n /** When each row was last handed back by the cache, to tell a move's late blur from the author's. */\n const redrawn = new WeakMap<HTMLElement, number>();\n const put = (row: HTMLElement): void => {\n const memo = memos.get(row);\n if (!memo) return;\n const doc = row.ownerDocument;\n const active = doc.activeElement;\n if (!row.isConnected || !memo.field.isConnected || !row.contains(memo.field)) return;\n if (active && active !== doc.body && !row.contains(active)) { memos.delete(row); return; }\n if (active === memo.field && memo.field.matches(\":focus\")) return;\n restoringNow.add(memo.field);\n try {\n memo.field.focus({ preventScroll: true });\n if (!(memo.field instanceof HTMLSelectElement) && memo.start !== null) memo.field.setSelectionRange(memo.start, memo.end ?? memo.start);\n } finally { restoringNow.delete(memo.field); }\n };\n return {\n watch(row: HTMLElement): void {\n const note = (e: Event): void => {\n const t = e.target;\n if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement || t instanceof HTMLSelectElement)) return;\n const text = !(t instanceof HTMLSelectElement);\n memos.set(row, { field: t, start: text ? (t as HTMLInputElement).selectionStart : null, end: text ? (t as HTMLInputElement).selectionEnd : null });\n };\n row.addEventListener(\"focusin\", note);\n row.addEventListener(\"input\", note);\n row.addEventListener(\"keyup\", note);\n row.addEventListener(\"mouseup\", note);\n // A blur the author made (the row still in the page) forgets; one caused by the row leaving the page\n // does not, and is what the cache puts back. Chromium drops the focus of a moved element LATE: the\n // blur arrives after the redraw, the row already back in the page, so a blur to nowhere just after a\n // redraw is the move's, and the focus goes straight back.\n // Chromium may also fire that blur synchronously, as the host clears its view and before the cache\n // has handed the row back: so the decision waits for the microtask, by which time a row the redraw\n // asked for again is marked as redrawn since the blur.\n row.addEventListener(\"focusout\", (e) => {\n const at = performance.now();\n const late = (e as FocusEvent).relatedTarget === null && at - (redrawn.get(row) ?? -Infinity) < 250;\n if (late && memos.has(row)) { queueMicrotask(() => put(row)); return; }\n queueMicrotask(() => {\n if ((redrawn.get(row) ?? -Infinity) >= at) { put(row); return; }\n if (row.isConnected && !row.contains(row.ownerDocument.activeElement)) memos.delete(row);\n });\n });\n },\n /** Give the focus back to the row, if the author was in it and has not gone anywhere else since. */\n restore(row: HTMLElement): void {\n if (!memos.has(row)) return;\n redrawn.set(row, performance.now());\n // At the microtask, not now: the event that caused the redraw may still note the caret.\n queueMicrotask(() => put(row));\n },\n restoring: (field: Element): boolean => restoringNow.has(field),\n /** Forget the row's focus if the author has since gone somewhere else (before the row is redrawn). */\n settle(row: HTMLElement): void {\n const active = row.ownerDocument.activeElement;\n if (active && active !== row.ownerDocument.body && !row.contains(active)) memos.delete(row);\n },\n /** The row the author is in (before a redraw takes it out). */\n holds: (row: HTMLElement): boolean => memos.has(row),\n };\n})();\n\n/**\n * The focus keeping `fieldRows` does, for a host (or a structured row) that keeps row elements itself: call\n * `settle` before it updates a row and `restore` once the row is back in the page.\n */\nexport const fieldRowFocus = {\n settle: (row: HTMLElement): void => keeper.settle(row),\n restore: (row: HTMLElement): void => keeper.restore(row),\n};\n\nexport interface FieldRows {\n /**\n * The row for `key` (a node and a field, say `${nodeId}:${field}`): the same element as last time when\n * there was one, updated for these options, else a new one. A row the author was typing in gets its focus\n * and caret back once the redraw has put it in the page.\n */\n row(key: string, opts: FieldRowOptions): HTMLElement;\n /** Forget every row not asked for since the last sweep (call at the end of a redraw). */\n sweep(): void;\n}\n\n/** A cache of field rows for a host that redraws its whole view on every change. */\nexport function fieldRows(): FieldRows {\n const rows = new Map<string, { handle: FieldRowHandle; used: boolean }>();\n return {\n row(key, opts) {\n const had = rows.get(key);\n if (had) {\n had.used = true;\n keeper.settle(had.handle.el);\n had.handle.update(opts);\n keeper.restore(had.handle.el);\n return had.handle.el;\n }\n const handle = fieldRow(opts);\n rows.set(key, { handle, used: true });\n return handle.el;\n },\n sweep() {\n for (const [key, entry] of rows) { if (!entry.used) rows.delete(key); else entry.used = false; }\n },\n };\n}\n"]}