@wildwinter/app-shell 0.55.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,55 @@
1
1
  import { PickSource } from '@wildwinter/toolkit/extensions';
2
2
  import { FieldDeclLike } from './value-control.cjs';
3
3
 
4
+ /**
5
+ * Whether a node's value for `decl` is set: held, and not the declaration's default. A record counts as its
6
+ * default when each of its fields does and it holds no other key, so `{}` and a record of defaults are both
7
+ * unset; anything else is compared with `defaultOf`, deeply and regardless of key order.
8
+ */
9
+ declare function isSet(decl: ValueDecl, value: unknown): boolean;
10
+ interface FoldSectionOptions {
11
+ /** The extension's id: the fold is remembered by it. */
12
+ extension: string;
13
+ /** The extension's name, the caption. */
14
+ caption: string;
15
+ /** The node the section is for, by any key unique to it: a row cleared while folded stays while the host
16
+ * keeps drawing this node. */
17
+ node: string;
18
+ /** The extension's fields for the node's kind, in the manifest's order. */
19
+ fields: readonly ValueDecl[];
20
+ /** The node's values for the extension, or undefined where it holds none. */
21
+ entry: Record<string, unknown> | undefined;
22
+ /** One field's row, drawn by the host. */
23
+ row: (decl: ValueDecl) => HTMLElement;
24
+ /** A heading above the first shown field of a group. */
25
+ group: (name: string) => HTMLElement;
26
+ /** Shown above the rows, folded or not (a lock line). */
27
+ lead?: readonly HTMLElement[];
28
+ /** Shown after the rows, folded or not (keys the extension doesn't declare). */
29
+ tail?: readonly HTMLElement[];
30
+ /** The section's own class, beside `shell-fold`. */
31
+ className?: string;
32
+ /** The caption's class, beside `shell-fold-cap`. */
33
+ captionClassName?: string;
34
+ }
35
+ interface ExtensionFold {
36
+ /** Draw one extension's section for one node: the caption and disclosure, then the rows the fold shows. */
37
+ section(o: FoldSectionOptions): HTMLElement;
38
+ /** Whether an extension's section is open (every field). Folded until opened. */
39
+ isOpen(extension: string): boolean;
40
+ setOpen(extension: string, open: boolean): void;
41
+ /** After a redraw: forget the rows kept for nodes it didn't draw, so leaving a node and coming back shows
42
+ * only what is set. A host that redraws its whole view calls it at the end of each, as a row cache's. */
43
+ sweep(): void;
44
+ }
45
+ /** The caption's words: the name, and the count when anything is set. */
46
+ declare function foldCaption(name: string, set: number): string;
47
+ /**
48
+ * The fold for a host's inspector: one per host, kept across its redraws, so the fold stays as left from node
49
+ * to node.
50
+ */
51
+ declare function extensionFold(): ExtensionFold;
52
+
4
53
  /** A declaration of any type, as an extension's manifest writes it. */
5
54
  interface ValueDecl extends FieldDeclLike {
6
55
  /** The caption; the name when absent. */
@@ -86,4 +135,4 @@ interface ValueRows {
86
135
  }
87
136
  declare function valueRows(): ValueRows;
88
137
 
89
- export { type ValueAdapter, type ValueDecl, type ValueNode, type ValueRowHandle, type ValueRowOptions, type ValueRows, valueRow, valueRows };
138
+ export { type ExtensionFold, type FoldSectionOptions, type ValueAdapter, type ValueDecl, type ValueNode, type ValueRowHandle, type ValueRowOptions, type ValueRows, extensionFold, foldCaption, isSet, valueRow, valueRows };
@@ -1,6 +1,55 @@
1
1
  import { PickSource } from '@wildwinter/toolkit/extensions';
2
2
  import { FieldDeclLike } from './value-control.js';
3
3
 
4
+ /**
5
+ * Whether a node's value for `decl` is set: held, and not the declaration's default. A record counts as its
6
+ * default when each of its fields does and it holds no other key, so `{}` and a record of defaults are both
7
+ * unset; anything else is compared with `defaultOf`, deeply and regardless of key order.
8
+ */
9
+ declare function isSet(decl: ValueDecl, value: unknown): boolean;
10
+ interface FoldSectionOptions {
11
+ /** The extension's id: the fold is remembered by it. */
12
+ extension: string;
13
+ /** The extension's name, the caption. */
14
+ caption: string;
15
+ /** The node the section is for, by any key unique to it: a row cleared while folded stays while the host
16
+ * keeps drawing this node. */
17
+ node: string;
18
+ /** The extension's fields for the node's kind, in the manifest's order. */
19
+ fields: readonly ValueDecl[];
20
+ /** The node's values for the extension, or undefined where it holds none. */
21
+ entry: Record<string, unknown> | undefined;
22
+ /** One field's row, drawn by the host. */
23
+ row: (decl: ValueDecl) => HTMLElement;
24
+ /** A heading above the first shown field of a group. */
25
+ group: (name: string) => HTMLElement;
26
+ /** Shown above the rows, folded or not (a lock line). */
27
+ lead?: readonly HTMLElement[];
28
+ /** Shown after the rows, folded or not (keys the extension doesn't declare). */
29
+ tail?: readonly HTMLElement[];
30
+ /** The section's own class, beside `shell-fold`. */
31
+ className?: string;
32
+ /** The caption's class, beside `shell-fold-cap`. */
33
+ captionClassName?: string;
34
+ }
35
+ interface ExtensionFold {
36
+ /** Draw one extension's section for one node: the caption and disclosure, then the rows the fold shows. */
37
+ section(o: FoldSectionOptions): HTMLElement;
38
+ /** Whether an extension's section is open (every field). Folded until opened. */
39
+ isOpen(extension: string): boolean;
40
+ setOpen(extension: string, open: boolean): void;
41
+ /** After a redraw: forget the rows kept for nodes it didn't draw, so leaving a node and coming back shows
42
+ * only what is set. A host that redraws its whole view calls it at the end of each, as a row cache's. */
43
+ sweep(): void;
44
+ }
45
+ /** The caption's words: the name, and the count when anything is set. */
46
+ declare function foldCaption(name: string, set: number): string;
47
+ /**
48
+ * The fold for a host's inspector: one per host, kept across its redraws, so the fold stays as left from node
49
+ * to node.
50
+ */
51
+ declare function extensionFold(): ExtensionFold;
52
+
4
53
  /** A declaration of any type, as an extension's manifest writes it. */
5
54
  interface ValueDecl extends FieldDeclLike {
6
55
  /** The caption; the name when absent. */
@@ -86,4 +135,4 @@ interface ValueRows {
86
135
  }
87
136
  declare function valueRows(): ValueRows;
88
137
 
89
- export { type ValueAdapter, type ValueDecl, type ValueNode, type ValueRowHandle, type ValueRowOptions, type ValueRows, valueRow, valueRows };
138
+ export { type ExtensionFold, type FoldSectionOptions, type ValueAdapter, type ValueDecl, type ValueNode, type ValueRowHandle, type ValueRowOptions, type ValueRows, extensionFold, foldCaption, isSet, valueRow, valueRows };
@@ -1,12 +1,90 @@
1
1
  import { fieldRow, fieldRowFocus } from './chunk-XJM733E6.js';
2
- import { el, iconBtn, moveItem } from './chunk-W4WC4FO5.js';
3
- import { pickChoices, valueProblems, defaultOf } from '@wildwinter/toolkit/extensions';
2
+ import { el, iconNode, iconBtn, moveItem } from './chunk-W4WC4FO5.js';
3
+ import { stableStringify, defaultOf, pickChoices, valueProblems } from '@wildwinter/toolkit/extensions';
4
4
 
5
+ var isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
6
+ function isSet(decl, value) {
7
+ if (value === void 0) return false;
8
+ if (decl.type === "record" && decl.default === void 0 && isObject(value)) {
9
+ const fields = decl.fields ?? [];
10
+ const declared = new Set(fields.map((f) => f.name));
11
+ if (Object.entries(value).some(([k, v]) => !declared.has(k) && v !== void 0)) return true;
12
+ return fields.some((f) => isSet(f, value[f.name]));
13
+ }
14
+ return stableStringify(value) !== stableStringify(defaultOf(decl));
15
+ }
16
+ function foldCaption(name, set) {
17
+ return set > 0 ? `${name} (${set} set)` : name;
18
+ }
19
+ function extensionFold() {
20
+ const open = /* @__PURE__ */ new Set();
21
+ const shown = /* @__PURE__ */ new Map();
22
+ const keyOf = (o) => `${o.extension}\0${o.node}`;
23
+ const visible = (o, setNames) => {
24
+ const was = shown.get(keyOf(o));
25
+ const fields = was ? /* @__PURE__ */ new Set([...was.fields, ...setNames]) : new Set(setNames);
26
+ shown.set(keyOf(o), { fields, used: true });
27
+ return fields;
28
+ };
29
+ const fold = {
30
+ isOpen: (extension) => open.has(extension),
31
+ setOpen(extension, on) {
32
+ if (on) open.add(extension);
33
+ else open.delete(extension);
34
+ for (const key of shown.keys()) if (key.startsWith(`${extension}\0`)) shown.delete(key);
35
+ },
36
+ sweep() {
37
+ for (const [key, entry] of shown) {
38
+ if (!entry.used) shown.delete(key);
39
+ else entry.used = false;
40
+ }
41
+ },
42
+ section(o) {
43
+ const sec = el("div", `shell-fold${o.className ? ` ${o.className}` : ""}`);
44
+ sec.dataset["extension"] = o.extension;
45
+ const cap = el("button", `shell-fold-cap${o.captionClassName ? ` ${o.captionClassName}` : ""}`);
46
+ cap.type = "button";
47
+ const body = el("div", "shell-fold-body");
48
+ sec.append(cap, body);
49
+ const draw = () => {
50
+ const isOpen = open.has(o.extension);
51
+ const setNames = new Set(o.fields.filter((f) => isSet(f, o.entry?.[f.name])).map((f) => f.name));
52
+ const show = isOpen ? void 0 : visible(o, setNames);
53
+ cap.replaceChildren(iconNode(isOpen ? "expanded" : "collapsed"), el("span", "shell-fold-name", foldCaption(o.caption, setNames.size)));
54
+ cap.setAttribute("aria-expanded", String(isOpen));
55
+ cap.dataset["tip"] = isOpen ? `Show only the fields set here` : `Show every ${o.caption} field`;
56
+ sec.classList.toggle("shell-fold-open", isOpen);
57
+ const rows = [...o.lead ?? []];
58
+ let group;
59
+ for (const decl of o.fields) {
60
+ if (show && !show.has(decl.name)) continue;
61
+ const g = decl.group;
62
+ if (g !== void 0 && g !== group) {
63
+ group = g;
64
+ rows.push(o.group(g));
65
+ }
66
+ rows.push(o.row(decl));
67
+ }
68
+ rows.push(...o.tail ?? []);
69
+ body.replaceChildren(...rows);
70
+ };
71
+ cap.addEventListener("click", () => {
72
+ fold.setOpen(o.extension, !open.has(o.extension));
73
+ draw();
74
+ });
75
+ draw();
76
+ return sec;
77
+ }
78
+ };
79
+ return fold;
80
+ }
81
+
82
+ // src/value-rows.ts
5
83
  function nodeLabel(adapter, kind, id) {
6
84
  return adapter.nodes(kind).find((n) => n.id === id)?.label ?? adapter.label?.(kind, id);
7
85
  }
8
86
  var SCALARS = /* @__PURE__ */ new Set(["text", "multiline", "number", "boolean", "enum", "flags", "quality", "string"]);
9
- var isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
87
+ var isObject2 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
10
88
  var nameOf = (decl) => decl.label ?? decl.name;
11
89
  var asDecl = (d, name) => ({ ...d, name: d.name ?? name });
12
90
  function ownProblems(decl, value, adapter) {
@@ -245,31 +323,31 @@ function structuredRow(initial) {
245
323
  }, controls));
246
324
  };
247
325
  if (decl.type === "record") {
248
- const value = isObject(o.value) ? o.value : void 0;
326
+ const value = isObject2(o.value) ? o.value : void 0;
249
327
  const required = value === void 0 ? [] : valueProblems(decl, value).filter((p) => p.code === "required");
250
328
  for (const f of decl.fields ?? []) {
251
329
  const missing = required.find((p) => p.path === f.name);
252
330
  child(`f:${f.name}`, f, value?.[f.name], (v) => {
253
- const next = { ...isObject(opts.value) ? opts.value : {} };
331
+ const next = { ...isObject2(opts.value) ? opts.value : {} };
254
332
  if (v === void 0) delete next[f.name];
255
333
  else next[f.name] = v;
256
334
  commit(Object.keys(next).length > 0 ? next : void 0);
257
335
  }, void 0, void 0, missing ? "Required." : void 0);
258
336
  }
259
337
  } else if (decl.type === "map" && decl.of) {
260
- const value = isObject(o.value) ? o.value : {};
338
+ const value = isObject2(o.value) ? o.value : {};
261
339
  const keyNodes = decl.key?.type === "reference" && o.adapter ? o.adapter.nodes(decl.key.to ?? "") : void 0;
262
340
  const keyKind = decl.key?.to ?? "";
263
341
  const keyLabel = (k) => (o.adapter && keyNodes !== void 0 ? nodeLabel(o.adapter, keyKind, k) : void 0) ?? k;
264
342
  for (const k of Object.keys(value)) {
265
343
  const remove = editable() ? [iconBtn("close", `Remove ${keyLabel(k)}`, () => {
266
- const next = { ...isObject(opts.value) ? opts.value : {} };
344
+ const next = { ...isObject2(opts.value) ? opts.value : {} };
267
345
  delete next[k];
268
346
  commit(Object.keys(next).length > 0 ? next : void 0);
269
347
  })] : [];
270
348
  const gone = keyNodes !== void 0 && o.adapter && nodeLabel(o.adapter, keyKind, k) === void 0 ? `${k} is not here any more.` : void 0;
271
349
  child(`k:${k}`, asDecl(decl.of, k), value[k], (v) => {
272
- const next = { ...isObject(opts.value) ? opts.value : {} };
350
+ const next = { ...isObject2(opts.value) ? opts.value : {} };
273
351
  next[k] = v === void 0 ? defaultOf(decl.of) : v;
274
352
  commit(next);
275
353
  }, remove, keyLabel(k), gone);
@@ -313,7 +391,7 @@ function structuredRow(initial) {
313
391
  }
314
392
  } else if (decl.type === "list" && decl.of) {
315
393
  const value = Array.isArray(o.value) ? o.value : [];
316
- const idOf = (item, i) => decl.id !== void 0 && isObject(item) && typeof item[decl.id] === "string" ? `id:${item[decl.id]}` : `i:${i}`;
394
+ const idOf = (item, i) => decl.id !== void 0 && isObject2(item) && typeof item[decl.id] === "string" ? `id:${item[decl.id]}` : `i:${i}`;
317
395
  value.forEach((item, i) => {
318
396
  const set = (next) => commit(next.length > 0 ? next : void 0);
319
397
  const controls = editable() ? [
@@ -327,7 +405,7 @@ function structuredRow(initial) {
327
405
  }, i === value.length - 1),
328
406
  iconBtn("close", "Remove", () => set(value.filter((_, j) => j !== i)), false, true)
329
407
  ] : [];
330
- const itemLabel = decl.id !== void 0 && isObject(item) && typeof item[decl.id] === "string" ? item[decl.id] : `${i + 1}`;
408
+ const itemLabel = decl.id !== void 0 && isObject2(item) && typeof item[decl.id] === "string" ? item[decl.id] : `${i + 1}`;
331
409
  child(idOf(item, i), asDecl(decl.of, itemLabel), item, (v) => {
332
410
  const next = [...Array.isArray(opts.value) ? opts.value : []];
333
411
  next[i] = v === void 0 ? defaultOf(decl.of) : v;
@@ -338,8 +416,8 @@ function structuredRow(initial) {
338
416
  if (editable()) {
339
417
  adder.append(iconBtn("add", "Add", () => {
340
418
  const fresh = defaultOf(decl.of);
341
- if (decl.id !== void 0 && isObject(fresh)) {
342
- const taken = new Set(value.map((x) => isObject(x) ? x[decl.id] : void 0));
419
+ if (decl.id !== void 0 && isObject2(fresh)) {
420
+ const taken = new Set(value.map((x) => isObject2(x) ? x[decl.id] : void 0));
343
421
  let n = value.length + 1;
344
422
  while (taken.has(`item-${n}`)) n++;
345
423
  fresh[decl.id] = `item-${n}`;
@@ -388,6 +466,6 @@ function valueRows() {
388
466
  };
389
467
  }
390
468
 
391
- export { valueRow, valueRows };
469
+ export { extensionFold, foldCaption, isSet, valueRow, valueRows };
392
470
  //# sourceMappingURL=value-rows.js.map
393
471
  //# sourceMappingURL=value-rows.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/value-rows.ts"],"names":["n"],"mappings":"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","file":"value-rows.js","sourcesContent":["// ---------------------------------------------------------------------------\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"]}
1
+ {"version":3,"sources":["../src/value-fold.ts","../src/value-rows.ts"],"names":["isObject","defaultOf","n"],"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// 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wildwinter/app-shell",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
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",