@wildwinter/expr-editor 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ast.ts","../src/tree.ts","../src/ops.ts","../src/schema.ts","../src/validate.ts","../src/dom.ts","../src/flat.ts","../src/clausewizard.ts","../src/treeview.ts","../src/mount.ts","../src/valuewizard.ts","../src/effects.ts","../src/preview.ts"],"names":["row","rowActions"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// AST path mutation — pure functions over `@wildwinter/expr`'s ExprNode, with\n// structural sharing (only the spine from root to the changed node is rebuilt;\n// sibling subtrees are reused by reference). These are the substrate the visual\n// editor mutates the tree with; ported from the storylets editor's astMutation.\n//\n// Path encoding (matches the validator's AstPath): field-name segments with a\n// numeric index after \"args\".\n// binary.left -> [\"left\"]\n// binary.right.args[0] -> [\"right\", \"args\", 0]\n// top-level node -> []\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\n\n// --- small node constructors (one place for the node shapes) ---------------\nexport const boolLit = (value: boolean): ExprNode => ({ kind: \"bool\", value });\nexport const numLit = (value: number): ExprNode => ({ kind: \"number\", value });\nexport const strLit = (value: string): ExprNode => ({ kind: \"string\", value });\nexport const scopedVar = (scope: string, name: string): ExprNode => ({ kind: \"scopedvar\", scope, name: name.toLowerCase() });\nexport const binary = (op: BinaryOp, left: ExprNode, right: ExprNode): ExprNode => ({ kind: \"binary\", op, left, right });\nexport const notNode = (operand: ExprNode): ExprNode => ({ kind: \"unary\", op: \"not\", operand });\nexport const callNode = (name: string, args: ExprNode[]): ExprNode => ({ kind: \"call\", name, args });\nexport const flagDelta = (sign: \"+\" | \"-\", name: string): ExprNode => ({ kind: \"flagdelta\", sign, name });\n\n/** A no-op sentinel: `true and X === X`, `false or X === X`, so a half-filled slot is inert. */\nexport const placeholderForOp = (op: \"and\" | \"or\"): ExprNode => boolLit(op === \"and\");\nexport const isPlaceholderForOp = (node: ExprNode, op: \"and\" | \"or\"): boolean =>\n node.kind === \"bool\" && node.value === (op === \"and\");\n\nconst COMPARISON = new Set<BinaryOp>([\"==\", \"!=\", \">\", \">=\", \"<\", \"<=\"]);\nexport const isComparisonOp = (op: BinaryOp): boolean => COMPARISON.has(op);\n\n// --- read --------------------------------------------------------------------\n\n/** The node at `path`, or null if any segment fails to resolve. */\nexport function getNodeAt(ast: ExprNode, path: AstPath): ExprNode | null {\n let node: ExprNode | null = ast;\n for (let i = 0; i < path.length; i++) {\n if (!node) return null;\n const seg = path[i];\n if (node.kind === \"binary\" && seg === \"left\") node = node.left;\n else if (node.kind === \"binary\" && seg === \"right\") node = node.right;\n else if (node.kind === \"unary\" && seg === \"operand\") node = node.operand;\n else if (node.kind === \"call\" && seg === \"args\") { node = node.args[path[++i] as number] ?? null; }\n else return null;\n }\n return node;\n}\n\n// --- write (structural sharing) ---------------------------------------------\n\n/** Replace the node at `path` with `next`. `path.length === 0` returns `next`. */\nexport function setNodeAt(ast: ExprNode, path: AstPath, next: ExprNode): ExprNode {\n if (path.length === 0) return next;\n const [seg, ...rest] = path;\n if (ast.kind === \"binary\" && seg === \"left\") return { ...ast, left: setNodeAt(ast.left, rest, next) };\n if (ast.kind === \"binary\" && seg === \"right\") return { ...ast, right: setNodeAt(ast.right, rest, next) };\n if (ast.kind === \"unary\" && seg === \"operand\") return { ...ast, operand: setNodeAt(ast.operand, rest, next) };\n if (ast.kind === \"call\" && seg === \"args\") {\n const idx = rest[0] as number;\n const args = ast.args.map((a, i) => (i === idx ? setNodeAt(a, rest.slice(1), next) : a));\n return { ...ast, args };\n }\n throw new Error(`cannot descend into ${ast.kind} via '${String(seg)}'`);\n}\n\n/**\n * Delete the node at `path`, collapsing its parent:\n * - binary parent -> the surviving sibling replaces the parent (`A and B`, del B -> `A`)\n * - unary parent -> the operand replaces the unary (strips the wrapper)\n * - call parent -> the arg is spliced out\n * Deleting the root (`path === []`) returns null (the caller clears the expression).\n */\nexport function deleteAt(ast: ExprNode, path: AstPath): ExprNode | null {\n if (path.length === 0) return null;\n const last = path[path.length - 1];\n // call arg: [..., \"args\", index]\n if (typeof last === \"number\" && path[path.length - 2] === \"args\") {\n const callPath = path.slice(0, -2);\n const call = getNodeAt(ast, callPath);\n if (call?.kind !== \"call\") return ast;\n return setNodeAt(ast, callPath, { ...call, args: call.args.filter((_, i) => i !== last) });\n }\n const parentPath = path.slice(0, -1);\n const parent = getNodeAt(ast, parentPath);\n if (parent?.kind === \"binary\") {\n const survivor = last === \"left\" ? parent.right : parent.left;\n return setNodeAt(ast, parentPath, survivor);\n }\n if (parent?.kind === \"unary\") {\n return setNodeAt(ast, parentPath, parent.operand);\n }\n return ast; // nothing sensible to collapse\n}\n\n/** Wrap the node at `path` in a new `binary(op, …)`, the clause on `side`. */\nexport function insertSiblingClauseAt(\n ast: ExprNode, path: AstPath, op: \"and\" | \"or\", side: \"left\" | \"right\", clause: ExprNode,\n): ExprNode {\n const target = getNodeAt(ast, path);\n if (!target) return ast;\n const wrapped = side === \"right\" ? binary(op, target, clause) : binary(op, clause, target);\n return setNodeAt(ast, path, wrapped);\n}\n\n/** True iff the node at `path` is the operand of a `not`. */\nexport function isWrappedInNot(ast: ExprNode, path: AstPath): boolean {\n if (path[path.length - 1] !== \"operand\") return false;\n const parent = getNodeAt(ast, path.slice(0, -1));\n return parent?.kind === \"unary\" && parent.op === \"not\";\n}\n\n/** Wrap the node at `path` in `not(…)`. */\nexport function wrapInNotAt(ast: ExprNode, path: AstPath): ExprNode {\n const target = getNodeAt(ast, path);\n return target ? setNodeAt(ast, path, notNode(target)) : ast;\n}\n\n/** Add a `not` if absent, strip it if present. */\nexport function toggleNotAt(ast: ExprNode, path: AstPath): ExprNode {\n if (isWrappedInNot(ast, path)) {\n const inner = getNodeAt(ast, path);\n return inner ? setNodeAt(ast, path.slice(0, -1), inner) : ast;\n }\n return wrapInNotAt(ast, path);\n}\n\n/**\n * If the node at `path` is one operand of an equality comparison (`==` / `!=`)\n * whose OTHER operand is a property reference, return that property — so a string\n * literal can offer the property's enum values. Null otherwise.\n */\nexport function findEnumPeer(ast: ExprNode, path: AstPath): { scope: string; name: string } | null {\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return null;\n const parent = getNodeAt(ast, path.slice(0, -1));\n if (parent?.kind !== \"binary\" || (parent.op !== \"==\" && parent.op !== \"!=\")) return null;\n const other = last === \"left\" ? parent.right : parent.left;\n return other.kind === \"scopedvar\" ? { scope: other.scope, name: other.name } : null;\n}\n\n/**\n * DFS for the first unfilled slot in a template-inserted clause: an empty string\n * literal (a tag / value the author still has to set) or an unnamed flag delta.\n * Returns its path relative to `node`, or null when the clause is complete —\n * wizard-built clauses have no empty slots, so they never auto-open anything.\n */\nexport function firstEmptyLeafPath(node: ExprNode, base: AstPath = []): AstPath | null {\n switch (node.kind) {\n case \"string\": return node.value === \"\" ? base : null;\n case \"flagdelta\": return node.name === \"\" ? base : null;\n case \"unary\": return firstEmptyLeafPath(node.operand, [...base, \"operand\"]);\n case \"binary\":\n return firstEmptyLeafPath(node.left, [...base, \"left\"]) ?? firstEmptyLeafPath(node.right, [...base, \"right\"]);\n case \"call\": {\n for (let i = 0; i < node.args.length; i++) {\n const p = firstEmptyLeafPath(node.args[i]!, [...base, \"args\", i]);\n if (p) return p;\n }\n return null;\n }\n default: return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// The AND/OR tree model. The ExprNode stays the source of truth; the renderable\n// row tree is DERIVED on each render (never stored). Same-operator left-folded\n// binary chains collapse to one container with N children; a leading `not`\n// surfaces as a per-row `negated` flag. Ported from the storylets tree model.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\nimport { binary, isComparisonOp, isPlaceholderForOp, placeholderForOp, setNodeAt, getNodeAt } from \"./ast.js\";\n\nexport type TreeRow =\n | { kind: \"container\"; op: \"and\" | \"or\"; negated: boolean; children: TreeRow[]; path: AstPath; chainPath: AstPath }\n | { kind: \"comparison\"; left: ExprNode; op: BinaryOp; right: ExprNode; negated: boolean; path: AstPath; contentPath: AstPath }\n | { kind: \"wrapped\"; node: ExprNode; negated: boolean; path: AstPath; contentPath: AstPath };\n\nconst isLogical = (n: ExprNode | null): n is ExprNode & { kind: \"binary\"; op: \"and\" | \"or\" } =>\n n != null && n.kind === \"binary\" && (n.op === \"and\" || n.op === \"or\");\n\n/** Flatten a same-operator left-folded chain into its leaf rows, in document order. */\nfunction collectChain(node: ExprNode, path: AstPath, op: \"and\" | \"or\"): TreeRow[] {\n if (node.kind === \"binary\" && node.op === op) {\n return [\n ...collectChain(node.left, [...path, \"left\"], op),\n ...collectChain(node.right, [...path, \"right\"], op),\n ];\n }\n return [astToTree(node, path)];\n}\n\nfunction containerRow(chain: ExprNode & { kind: \"binary\"; op: \"and\" | \"or\" }, chainPath: AstPath, negated: boolean, path: AstPath): TreeRow {\n return {\n kind: \"container\", op: chain.op, negated, path, chainPath,\n children: [\n ...collectChain(chain.left, [...chainPath, \"left\"], chain.op),\n ...collectChain(chain.right, [...chainPath, \"right\"], chain.op),\n ],\n };\n}\n\n/** Derive the renderable row for `node` (at `path` in the whole AST). */\nexport function astToTree(node: ExprNode, path: AstPath = []): TreeRow {\n // 1/2. AND/OR container (optionally negated).\n if (node.kind === \"unary\" && node.op === \"not\" && isLogical(node.operand)) {\n return containerRow(node.operand, [...path, \"operand\"], true, path);\n }\n if (isLogical(node)) return containerRow(node, path, false, path);\n\n // 3/4. Comparison (optionally negated).\n if (node.kind === \"unary\" && node.op === \"not\" && node.operand.kind === \"binary\" && isComparisonOp(node.operand.op)) {\n const inner = node.operand;\n return { kind: \"comparison\", left: inner.left, op: inner.op, right: inner.right, negated: true, path, contentPath: [...path, \"operand\"] };\n }\n if (node.kind === \"binary\" && isComparisonOp(node.op)) {\n return { kind: \"comparison\", left: node.left, op: node.op, right: node.right, negated: false, path, contentPath: path };\n }\n\n // 5. Negated anything else.\n if (node.kind === \"unary\" && node.op === \"not\") {\n return { kind: \"wrapped\", node: node.operand, negated: true, path, contentPath: [...path, \"operand\"] };\n }\n\n // 6. Wrapped: calls, arithmetic, a bare boolean var, a literal.\n return { kind: \"wrapped\", node, negated: false, path, contentPath: path };\n}\n\n// --- container mutations -----------------------------------------------------\n\n/** Append `clause` to the chain at `chainPath` (left-folded; inherits the chain op, default \"and\"). */\nexport function addChildToContainer(ast: ExprNode, chainPath: AstPath, clause: ExprNode): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!node) return ast;\n const op: \"and\" | \"or\" = isLogical(node) ? node.op : \"and\";\n return setNodeAt(ast, chainPath, binary(op, node, clause));\n}\n\n/** Flip every binary in the chain at `chainPath` from its current op to `newOp` (placeholders re-polarise). */\nexport function flipContainerOp(ast: ExprNode, chainPath: AstPath, newOp: \"and\" | \"or\"): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!isLogical(node) || node.op === newOp) return ast;\n const oldOp = node.op;\n const flip = (n: ExprNode): ExprNode => {\n if (n.kind === \"binary\" && n.op === oldOp) return binary(newOp, flip(n.left), flip(n.right));\n if (isPlaceholderForOp(n, oldOp)) return placeholderForOp(newOp);\n return n;\n };\n return setNodeAt(ast, chainPath, flip(node));\n}\n\n/** Wrap the node at `path` in `not(…)`, or strip the `not` if it already is one. */\nexport function toggleContainerNot(ast: ExprNode, path: AstPath): ExprNode {\n const node = getNodeAt(ast, path);\n if (!node) return ast;\n if (node.kind === \"unary\" && node.op === \"not\") return setNodeAt(ast, path, node.operand);\n return setNodeAt(ast, path, { kind: \"unary\", op: \"not\", operand: node });\n}\n\n/** A new sub-group: its op is the OPPOSITE of the parent's (same-op would just flatten away). */\nexport function buildSubGroupClause(parentOp: \"and\" | \"or\", firstClause: ExprNode): ExprNode {\n const childOp: \"and\" | \"or\" = parentOp === \"and\" ? \"or\" : \"and\";\n return binary(childOp, firstClause, placeholderForOp(childOp));\n}\n\nconst chainNodes = (node: ExprNode, op: \"and\" | \"or\"): ExprNode[] =>\n node.kind === \"binary\" && node.op === op ? [...chainNodes(node.left, op), ...chainNodes(node.right, op)] : [node];\n\nconst buildChain = (op: \"and\" | \"or\", nodes: ExprNode[]): ExprNode =>\n nodes.reduce((acc, n) => (acc ? binary(op, acc, n) : n));\n\n/**\n * Walk one step up from `path` to its parent binary AND/OR; if the sibling at\n * that level is a placeholder for the parent's op, return the PARENT's path so a\n * downstream `deleteAt` collapses the whole half-filled sub-group rather than\n * leaving the placeholder (`true`/`false`) floating up as a bare clause. Returns\n * `path` unchanged otherwise. Ported from the storylets tree editor; fixes the\n * \"delete the last real clause of a temp OR/AND group leaves `false`\" case.\n */\nexport function redirectDeleteForPlaceholderSibling(ast: ExprNode, path: AstPath): AstPath {\n if (path.length === 0) return path;\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return path;\n const parentPath = path.slice(0, -1);\n const parent = getNodeAt(ast, parentPath);\n if (!isLogical(parent)) return path;\n const sibling = last === \"left\" ? parent.right : parent.left;\n return isPlaceholderForOp(sibling, parent.op) ? parentPath : path;\n}\n\n/** Move a child within its container chain (reorder). Out-of-range is a no-op. */\nexport function moveChildInContainer(ast: ExprNode, chainPath: AstPath, from: number, to: number): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!isLogical(node)) return ast;\n const arr = chainNodes(node, node.op);\n if (from < 0 || to < 0 || from >= arr.length || to >= arr.length || from === to) return ast;\n const [moved] = arr.splice(from, 1);\n arr.splice(to, 0, moved!);\n return setNodeAt(ast, chainPath, buildChain(node.op, arr));\n}\n","// ---------------------------------------------------------------------------\n// Operator metadata: display labels, swap groups, precedence/parenthesisation,\n// and number formatting. Pure data + helpers shared by the renderer. Ported from\n// the storylets editor's pillStyles.\n// ---------------------------------------------------------------------------\n\nimport type { BinaryOp, UnaryOp, PropertyType } from \"@wildwinter/expr\";\n\n/** Human label for a binary operator (words for logical, glyphs for relational). */\nexport const BINARY_LABEL: Record<BinaryOp, string> = {\n and: \"AND\", or: \"OR\",\n \"==\": \"is\", \"!=\": \"≠\", \">\": \">\", \">=\": \"≥\", \"<\": \"<\", \"<=\": \"≤\",\n \"+\": \"+\", \"-\": \"−\", \"*\": \"×\", \"/\": \"÷\",\n};\n\nexport const UNARY_LABEL: Record<UnaryOp, string> = { not: \"NOT\", neg: \"−\" };\n\nexport const COMPARISON_OPS: BinaryOp[] = [\"==\", \"!=\", \">\", \">=\", \"<\", \"<=\"];\nexport const ARITHMETIC_OPS: BinaryOp[] = [\"+\", \"-\", \"*\", \"/\"];\n\n/** Property types a comparison clause can be built on - what the clause wizard offers as a left-hand\n * side. `flags` is absent because its clause is the flag-check wizard, not a comparison. */\nexport const COMPARABLE_TYPES: PropertyType[] = [\"boolean\", \"number\", \"string\", \"enum\", \"quality\"];\n\n/** The operators offered for a comparison on a property of this type.\n *\n * Ordered types get the full set; the rest get equality only. A QUALITY is ordered: its stages are a\n * ladder, and \"at or past a stage\" is the gate the type exists for, so offering it `==` alone (as the\n * editor did before 0.11.0) hides the feature behind hand-written source. */\nexport const comparisonOpsFor = (t: PropertyType): BinaryOp[] =>\n (t === \"number\" || t === \"quality\" ? COMPARISON_OPS : EQUALITY_OPS);\n\nexport const EQUALITY_OPS: BinaryOp[] = [\"==\", \"!=\"];\n\n/** The property types a comparison's RIGHT-hand side may be picked from, given the left's type.\n * A quality accepts only another quality: a plain string would name a stage nothing validates, and\n * comparing across two ladders is an error the engine raises by design. */\nexport const rhsTypesFor = (t: PropertyType): PropertyType[] =>\n t === \"number\" ? [\"number\"]\n : t === \"boolean\" ? [\"boolean\"]\n : t === \"quality\" ? [\"quality\"]\n : t === \"enum\" ? [\"enum\", \"string\"] : [\"string\", \"enum\"];\n\n/** The set of operators a given operator can be swapped to inline, or null if structural (and/or/not). */\nexport function opSwapGroup(op: BinaryOp): BinaryOp[] | null {\n if (COMPARISON_OPS.includes(op)) return COMPARISON_OPS;\n if (ARITHMETIC_OPS.includes(op)) return ARITHMETIC_OPS;\n return null; // and / or are structural (flipped at the container level)\n}\n\n/** Binding precedence (higher binds tighter) — for minimal parenthesisation. */\nconst PREC: Record<BinaryOp, number> = {\n or: 1, and: 2,\n \"==\": 4, \"!=\": 4, \">\": 4, \">=\": 4, \"<\": 4, \"<=\": 4,\n \"+\": 5, \"-\": 5, \"*\": 6, \"/\": 6,\n};\n\n/** Whether a child binary needs parentheses inside a parent binary on the given side. */\nexport function needsParens(childOp: BinaryOp, parentOp: BinaryOp, side: \"left\" | \"right\"): boolean {\n if (PREC[childOp] < PREC[parentOp]) return true;\n // right operand of a left-associative non-commutative op (− / ÷) at equal precedence\n return PREC[childOp] === PREC[parentOp] && side === \"right\" && (parentOp === \"-\" || parentOp === \"/\");\n}\n\n/** Render a number without IEEE-754 noise (integers plain; floats trimmed). */\nexport function formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n);\n return String(parseFloat(n.toFixed(12)));\n}\n","// ---------------------------------------------------------------------------\n// The property catalogue the picker offers — a flat list of available properties\n// (scope + name + type + optional enum values + a free-text \"purpose\" the search\n// matches), plus filtering / grouping / ref-formatting helpers. The host builds\n// the catalogue from its project (e.g. patter from buildSchema's properties).\n// ---------------------------------------------------------------------------\n\nimport type { PropertyType } from \"@wildwinter/expr\";\n\nexport type { PropertyType } from \"@wildwinter/expr\";\n\nexport interface CatalogueEntry {\n scope: string;\n /** Property name (stored lowercased to match parsed scopedvar names). */\n name: string;\n type: PropertyType;\n enumValues?: string[];\n /** A quality's ORDERED stage ladder. Separate from `enumValues` because the order carries meaning\n * here (comparisons are positional, `advance()` walks it) - a host that smuggled stages through\n * `enumValues` got a value picker but no ordering affordances. */\n stages?: string[];\n /** Free-text description; the picker search matches it alongside the name. */\n purpose?: string;\n}\n\n/** The CLOSED set of values a property can hold, when it has one: a quality's stages (in ladder\n * order) or an enum's values. Everything that offers \"pick a value\" for a property goes through\n * this, so a quality is never mistaken for free text. `stages` falls back to `enumValues` for a\n * host still passing a quality's ladder the old way. */\nexport const choicesOf = (e: { type: PropertyType; enumValues?: string[]; stages?: string[] } | null | undefined): string[] | undefined => {\n if (!e) return undefined;\n if (e.type === \"quality\") return e.stages?.length ? e.stages : e.enumValues;\n if (e.type === \"enum\") return e.enumValues;\n return undefined;\n};\n\nexport interface Filter {\n acceptTypes?: PropertyType[];\n acceptScopes?: string[];\n}\n\n/** The reference string for an entry: `@name` for the default scope, else `@scope.name`. */\nexport const refOf = (e: { scope: string; name: string }, defaultScope: string): string =>\n e.scope === defaultScope ? `@${e.name}` : `@${e.scope}.${e.name}`;\n\n/** The label shown in the picker / on a property pill. */\nexport const displayName = (e: { scope: string; name: string }, defaultScope: string): string =>\n e.scope === defaultScope ? e.name : `${e.scope}.${e.name}`;\n\nexport function filterCatalogue(entries: readonly CatalogueEntry[], filter: Filter = {}): CatalogueEntry[] {\n return entries.filter(\n (e) => (!filter.acceptTypes || filter.acceptTypes.includes(e.type)) &&\n (!filter.acceptScopes || filter.acceptScopes.includes(e.scope)),\n );\n}\n\n/** Filter by a case-insensitive query against the display name AND the purpose text. */\nexport function searchCatalogue(entries: readonly CatalogueEntry[], query: string, defaultScope: string): CatalogueEntry[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...entries];\n return entries.filter((e) =>\n displayName(e, defaultScope).toLowerCase().includes(q) || (e.purpose ?? \"\").toLowerCase().includes(q));\n}\n\n/** Group entries by scope, scopes in `scopeOrder` first (then alphabetical), names sorted within. */\nexport function groupByScope(entries: readonly CatalogueEntry[], scopeOrder: string[] = []): Array<{ scope: string; entries: CatalogueEntry[] }> {\n const byScope = new Map<string, CatalogueEntry[]>();\n for (const e of entries) {\n const list = byScope.get(e.scope) ?? [];\n list.push(e);\n byScope.set(e.scope, list);\n }\n const rank = (s: string): number => { const i = scopeOrder.indexOf(s); return i === -1 ? scopeOrder.length : i; };\n return [...byScope.keys()]\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))\n .map((scope) => ({ scope, entries: byScope.get(scope)!.slice().sort((a, b) => a.name.localeCompare(b.name)) }));\n}\n\n/** Find an entry by scope + name (name compared case-insensitively). */\nexport function lookup(entries: readonly CatalogueEntry[], scope: string, name: string): CatalogueEntry | null {\n const n = name.toLowerCase();\n return entries.find((e) => e.scope === scope && e.name.toLowerCase() === n) ?? null;\n}\n","// ---------------------------------------------------------------------------\n// Validation wrapper over @wildwinter/expr's parseAndValidate, plus an\n// issue-by-path index so the renderer can ring the offending pill. A parse error\n// (kind \"unparseable\") is what drives the host into the raw-text fallback.\n// ---------------------------------------------------------------------------\n\nimport { parseAndValidate } from \"@wildwinter/expr\";\nimport type {\n ExprNode, AstPath, Dialect, ExpressionSchema, ExpressionValidationIssue, ExpressionValidationResult,\n} from \"@wildwinter/expr\";\n\nexport type { ExpressionValidationIssue, ExpressionValidationResult } from \"@wildwinter/expr\";\n\n/** Stable string key for an AST path (for the issue index). */\nexport const pathKey = (p: AstPath): string => p.join(\"/\");\n\nexport interface Validation extends ExpressionValidationResult {\n ast: ExprNode | null;\n /** Issues keyed by `pathKey(issue.path)`. */\n byPath: Map<string, ExpressionValidationIssue[]>;\n /** True when the source could not even be parsed (the editor should fall back to raw text). */\n unparseable: boolean;\n}\n\nexport function validateSource(src: string, schema: ExpressionSchema, dialect: Dialect): Validation {\n const r = parseAndValidate(src, schema, dialect);\n const byPath = new Map<string, ExpressionValidationIssue[]>();\n for (const issue of r.issues) {\n const k = pathKey(issue.path);\n const list = byPath.get(k) ?? [];\n list.push(issue);\n byPath.set(k, list);\n }\n const unparseable = r.issues.some((i) => i.kind === \"unparseable\");\n return { ...r, byPath, unparseable };\n}\n\n/** Issues attached to a specific node path. */\nexport const issuesAt = (byPath: Map<string, ExpressionValidationIssue[]>, path: AstPath): ExpressionValidationIssue[] =>\n byPath.get(pathKey(path)) ?? [];\n","// ---------------------------------------------------------------------------\n// Tiny DOM helpers — element creation, child clearing, and a floating popover\n// primitive (positioned under an anchor, closes on outside-click / Escape). No\n// framework, no dependencies; everything the vanilla UI needs.\n// ---------------------------------------------------------------------------\n\nexport type Attrs = Record<string, string | number | boolean | undefined>;\n\n/** Create an element with a class, attrs, and children (strings become text). */\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K, cls?: string, children?: Array<Node | string | null | undefined>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (cls) node.className = cls;\n for (const c of children ?? []) {\n if (c == null) continue;\n node.append(typeof c === \"string\" ? document.createTextNode(c) : c);\n }\n return node;\n}\n\n/** A <button type=button> with a class, label, and click handler. `aria` sets an\n * aria-label (for glyph/icon buttons whose text isn't a good accessible name). */\nexport function button(cls: string, label: string | Node, onClick: (e: MouseEvent) => void, title?: string, aria?: string): HTMLButtonElement {\n const b = el(\"button\", cls, [label]);\n b.type = \"button\";\n if (title) b.title = title;\n if (aria) b.setAttribute(\"aria-label\", aria);\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\nexport const clear = (node: HTMLElement): void => node.replaceChildren();\n\nexport interface Popover {\n el: HTMLElement;\n close(): void;\n}\n\nexport interface PopoverOptions {\n /**\n * Where to append the popover. Defaults to document.body. Pass a container\n * inside a focus-trapping dialog (Radix, etc.) so the popover counts as\n * \"inside\" that layer and interacting with it does not dismiss the dialog.\n * The container should establish a containing block (a full-screen modal\n * layer or the dialog content element both qualify); the popover is then\n * positioned relative to that container's box rather than the document.\n */\n container?: HTMLElement;\n /** Called after the popover closes, for any reason. */\n onClose?: () => void;\n}\n\n/**\n * Open a floating popover anchored under `anchor`. `render(close)` builds the\n * content (call `close` to dismiss). Closes on Escape and on a pointer-down\n * outside the popover or the anchor. Only one popover lives at a time per call;\n * the caller tracks the handle to close it programmatically.\n */\nexport function openPopover(anchor: HTMLElement, render: (close: () => void) => Node, opts: PopoverOptions = {}): Popover {\n const container = opts.container ?? document.body;\n const pop = el(\"div\", \"exed-pop\");\n let closed = false;\n const close = (): void => {\n if (closed) return;\n closed = true;\n document.removeEventListener(\"pointerdown\", onDown, true);\n document.removeEventListener(\"keydown\", onKey, true);\n pop.remove();\n opts.onClose?.();\n };\n const onDown = (e: PointerEvent): void => {\n const t = e.target as Node;\n if (!pop.contains(t) && !anchor.contains(t)) close();\n };\n const onKey = (e: KeyboardEvent): void => { if (e.key === \"Escape\") { e.stopPropagation(); close(); } };\n\n pop.append(render(close));\n container.append(pop);\n\n // Position under the anchor (viewport coords), flipped up if it would overflow.\n const a = anchor.getBoundingClientRect();\n const ph = pop.getBoundingClientRect();\n let top = a.bottom + 4;\n if (top + ph.height > window.innerHeight - 8 && a.top - ph.height - 4 > 8) top = a.top - ph.height - 4;\n let left = a.left;\n if (left + ph.width > window.innerWidth - 8) left = Math.max(8, window.innerWidth - 8 - ph.width);\n if (container === document.body) {\n // Document-coordinate placement (the unchanged default).\n pop.style.top = `${Math.round(top + window.scrollY)}px`;\n pop.style.left = `${Math.round(left + window.scrollX)}px`;\n } else {\n // Placement relative to the container's own box - it is the containing block\n // for the absolutely-positioned popover.\n const cr = container.getBoundingClientRect();\n pop.style.top = `${Math.round(top - cr.top + container.scrollTop)}px`;\n pop.style.left = `${Math.round(left - cr.left + container.scrollLeft)}px`;\n }\n\n // Defer listener attach so the opening click doesn't immediately close it.\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", onDown, true);\n document.addEventListener(\"keydown\", onKey, true);\n }, 0);\n\n return { el: pop, close };\n}\n\n/** A labelled text input that commits on Enter / a button, never submitting a form. */\nexport function textField(opts: {\n initial?: string; caption?: string; placeholder?: string; submitLabel?: string;\n validate?: (v: string) => boolean; onCommit: (v: string) => void;\n}): HTMLElement {\n const wrap = el(\"div\", \"exed-field\");\n if (opts.caption) wrap.append(el(\"div\", \"exed-field-cap\", [opts.caption]));\n const input = el(\"input\", \"exed-input\");\n input.type = \"text\";\n input.value = opts.initial ?? \"\";\n if (opts.placeholder) input.placeholder = opts.placeholder;\n const submit = button(\"exed-btn primary\", opts.submitLabel ?? \"Apply\", () => commit());\n const ok = (): boolean => (opts.validate ? opts.validate(input.value) : true);\n const sync = (): void => { submit.disabled = !ok(); };\n const commit = (): void => { if (ok()) opts.onCommit(input.value); };\n input.addEventListener(\"input\", sync);\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); commit(); }\n });\n sync();\n wrap.append(el(\"div\", \"exed-field-row\", [input, submit]));\n setTimeout(() => input.focus(), 0);\n return wrap;\n}\n","// ---------------------------------------------------------------------------\n// The flat editor: render an ExprNode as a strip of clickable PILLS, each opening\n// a popover micro-editor (property picker / literal / operator swap / flag delta /\n// call). Used standalone and inside each tree-row's content. Ported from the\n// storylets ExpressionEditor, retargeted to @wildwinter/expr's ExprNode.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\nimport { setNodeAt, deleteAt, findEnumPeer, getNodeAt as pathNode, boolLit, numLit, strLit, scopedVar, flagDelta, isComparisonOp } from \"./ast.js\";\nimport { BINARY_LABEL, UNARY_LABEL, opSwapGroup, needsParens, formatNumber } from \"./ops.js\";\nimport {\n type CatalogueEntry, choicesOf, displayName, refOf, lookup, filterCatalogue, searchCatalogue, groupByScope, type PropertyType,\n} from \"./schema.js\";\nimport { el, button, textField } from \"./dom.js\";\nimport { issuesAt } from \"./validate.js\";\nimport type { EditCtx } from \"./types.js\";\n\nconst FLAG_FNS = new Set([\"check_flags\", \"set_flags\"]);\nconst TAG_ARG0_FNS = new Set([\"seen\", \"patter_seen\", \"visits\", \"patter_visits\"]);\n\n/** A pill button. `kind` selects the colour class; `issues` rings it red. `path`\n * tags the element (data-exed-path) so the mount can find and auto-open it.\n * `aria` overrides the accessible name (for glyph labels like operators). */\nfunction pill(kind: string, label: string, onClick: (b: HTMLButtonElement) => void, opts: { issue?: string; title?: string; path?: AstPath; aria?: string } = {}): HTMLButtonElement {\n const b = button(`exed-pill exed-pill-${kind}${opts.issue ? \" exed-pill-err\" : \"\"}`, label, () => onClick(b), opts.issue ?? opts.title, opts.aria);\n b.setAttribute(\"aria-haspopup\", \"dialog\"); // every pill opens a popover micro-editor\n if (opts.path) b.dataset[\"exedPath\"] = opts.path.join(\"/\");\n return b;\n}\n\n/** Plain-language names for operators, for the pill's accessible label. */\nconst OP_ARIA: Record<string, string> = {\n \"==\": \"equals\", \"!=\": \"not equal to\", \">\": \"greater than\", \">=\": \"at least\",\n \"<\": \"less than\", \"<=\": \"at most\", \"and\": \"and\", \"or\": \"or\",\n \"+\": \"plus\", \"-\": \"minus\", \"*\": \"times\", \"/\": \"divided by\",\n};\n\nconst issueText = (ctx: EditCtx, path: AstPath): string | undefined => {\n const list = issuesAt(ctx.byPath, path);\n return list.length ? list.map((i) => i.message).join(\"; \") : undefined;\n};\n\n/** Commit a replacement node at `path`. */\nconst replace = (ctx: EditCtx, path: AstPath, next: ExprNode): void => ctx.apply(setNodeAt(ctx.getAst(), path, next));\n\n// --- the recursive pill renderer --------------------------------------------\n\n/** Render `node` (at `path`) as inline pills. `parentOp`/`side` drive parenthesisation. */\nexport function renderNode(node: ExprNode, path: AstPath, ctx: EditCtx, parentOp?: BinaryOp, side?: \"left\" | \"right\"): HTMLElement {\n const issue = issueText(ctx, path);\n switch (node.kind) {\n case \"bool\":\n return pill(\"bool\", node.value ? \"true\" : \"false\", (b) => boolEditor(ctx, path, node.value, b), { issue });\n case \"number\":\n return pill(\"number\", formatNumber(node.value), (b) => numberEditor(ctx, path, node.value, b), { issue });\n case \"string\": {\n const isArg = path[path.length - 2] === \"args\"; // a call argument (the segment before the index)\n // A node-reference arg (seen/visits arg0) gets a flow-node picker when the host provides one,\n // instead of a free-text field - the value is a node id, shown via its readable label.\n const call = isArg ? pathNode(ctx.getAst(), path.slice(0, -2)) : null;\n const isNodeRef = !!ctx.pickNode && call?.kind === \"call\" && TAG_ARG0_FNS.has(call.name) && path[path.length - 1] === 0;\n if (isNodeRef) {\n const openPick = (b: HTMLButtonElement): void => ctx.pickNode!(b, node.value, (id) => replace(ctx, path, strLit(id)));\n return node.value === \"\"\n ? pill(\"placeholder\", \"pick a node…\", openPick, { issue, path })\n : pill(\"node\", ctx.nodeLabel?.(node.value) ?? node.value, openPick, { issue, title: node.value });\n }\n // An empty literal is an unfilled slot, not the literal text \"empty\": render\n // it as a clearly-placeholder pill so it can't be mistaken for real content.\n if (node.value === \"\")\n return pill(\"placeholder\", isArg ? \"set a tag…\" : \"set a value…\", (b) => stringEditor(ctx, path, node, b), { issue, path });\n return pill(isArg ? \"tag\" : \"string\", node.value, (b) => stringEditor(ctx, path, node, b), { issue });\n }\n case \"scopedvar\": {\n const entry = lookup(ctx.catalogue, node.scope, node.name);\n const label = displayName({ scope: node.scope, name: node.name }, ctx.defaultScope);\n const varPill = pill(\"var\", label, (b) => variableEditor(ctx, path, node, b), { issue: issue ?? (entry ? undefined : `Unknown property ${label}`) });\n attachPropertyMenu(ctx, node, varPill);\n return varPill;\n }\n case \"flagdelta\":\n return pill(node.sign === \"+\" ? \"flagpos\" : \"flagneg\", `${node.sign}${node.name || \"flag\"}`, (b) => flagEditor(ctx, path, node, b), { issue, path });\n case \"call\": {\n // Read-only compact form for a flag-delta call: `@prop: +a -b`, dropping\n // the function name and parens (the flag pills carry the meaning). Only\n // when the shape is clean (a property then flag deltas); the editable\n // tree keeps the explicit call so the function stays obvious to edit.\n if (ctx.compact\n && ctx.dialect.functions[node.name]?.flagDeltaArgs\n && node.args.length >= 2\n && node.args[0]!.kind === \"scopedvar\"\n && node.args.slice(1).every((a) => a.kind === \"flagdelta\")) {\n const row = el(\"span\", \"exed-call exed-call-flags\");\n row.append(renderNode(node.args[0]!, [...path, \"args\", 0], ctx));\n row.append(el(\"span\", \"exed-flagsep\", [\":\"]));\n for (let i = 1; i < node.args.length; i++) row.append(renderNode(node.args[i]!, [...path, \"args\", i], ctx));\n return row;\n }\n const row = el(\"span\", \"exed-call\");\n row.append(pill(\"func\", node.name, (b) => callEditor(ctx, path, node, b), { issue }));\n row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n node.args.forEach((arg, i) => {\n if (i > 0) row.append(el(\"span\", \"exed-comma\", [\", \"]));\n row.append(renderNode(arg, [...path, \"args\", i], ctx));\n });\n row.append(el(\"span\", \"exed-paren\", [\")\"]));\n return row;\n }\n case \"unary\": {\n const row = el(\"span\", \"exed-unary\");\n row.append(pill(\"op\", UNARY_LABEL[node.op], () => ctx.apply(deleteOrUnwrapNot(ctx, path, node)), { title: \"remove\", aria: `${OP_ARIA[node.op] ?? node.op} (click to remove)` }));\n row.append(renderNode(node.operand, [...path, \"operand\"], ctx));\n return row;\n }\n case \"binary\": {\n const row = el(\"span\", \"exed-binary\");\n const wrap = parentOp && needsParens(node.op, parentOp, side ?? \"left\");\n if (wrap) row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n row.append(renderNode(node.left, [...path, \"left\"], ctx, node.op, \"left\"));\n const swap = opSwapGroup(node.op);\n const opPill = pill(\"op\", BINARY_LABEL[node.op], (b) => { if (swap) operatorEditor(ctx, path, node.op, swap, b); }, { title: swap ? \"swap operator\" : undefined, aria: OP_ARIA[node.op] ?? node.op });\n if (!swap) opPill.classList.add(\"exed-op-structural\");\n row.append(opPill);\n row.append(renderNode(node.right, [...path, \"right\"], ctx, node.op, \"right\"));\n if (wrap) row.append(el(\"span\", \"exed-paren\", [\")\"]));\n return row;\n }\n }\n}\n\n/**\n * The +set / −unset toggle shared by every flag editor (the add-flag chip and\n * the per-pill flag editor). Two flex buttons themed emerald / rose via\n * --exed-flagpos / --exed-flagneg, matching the flag-delta pill colours.\n */\nexport function signToggle(current: \"+\" | \"-\", onPick: (s: \"+\" | \"-\") => void): HTMLElement {\n const row = el(\"div\", \"exed-sign\");\n ([\"+\", \"-\"] as const).forEach((s) => {\n const cls = `exed-signbtn${s === current ? (s === \"+\" ? \" sel-pos\" : \" sel-neg\") : \"\"}`;\n row.append(button(cls, s === \"+\" ? \"+ set\" : \"− unset\", () => onPick(s)));\n });\n return row;\n}\n\nconst deleteOrUnwrapNot = (ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"unary\" }): ExprNode | null =>\n // clicking the NOT pill strips it (keeps the operand)\n setNodeAt(ctx.getAst(), path, node.operand);\n\n/** Right-click a property pill -> a menu of host actions (e.g. go to definition). */\nfunction attachPropertyMenu(ctx: EditCtx, node: ExprNode & { kind: \"scopedvar\" }, pillEl: HTMLButtonElement): void {\n if (!ctx.propertyActions) return;\n const actions = ctx.propertyActions({ scope: node.scope, name: node.name });\n if (!actions.length) return;\n const open = ctx.openMenu ?? ctx.openPopover;\n pillEl.addEventListener(\"contextmenu\", (e) => {\n e.preventDefault();\n open(pillEl, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n for (const a of actions) wrap.append(button(\"exed-opt\", a.label, () => { a.run(); close(); }));\n return wrap;\n });\n });\n}\n\n/** A comparison whose operands are a numeric dialect-function call and a number\n * literal - a wizard-inserted unit that should delete atomically (half a\n * comparison is meaningless). Dialect-driven: the call's returnType is \"number\". */\nfunction isCompoundComparison(node: ExprNode, ctx: EditCtx): boolean {\n if (node.kind !== \"binary\" || !isComparisonOp(node.op)) return false;\n const numCall = (n: ExprNode): boolean => n.kind === \"call\" && ctx.dialect.functions[n.name]?.returnType === \"number\";\n const isNum = (n: ExprNode): boolean => n.kind === \"number\";\n return (numCall(node.left) && isNum(node.right)) || (numCall(node.right) && isNum(node.left));\n}\n\n/** Redirect a delete of a compound-comparison operand to the whole comparison. */\nfunction effectiveDeletePath(ctx: EditCtx, path: AstPath): AstPath {\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return path;\n const parentPath = path.slice(0, -1);\n const parent = pathNode(ctx.getAst(), parentPath);\n return parent && isCompoundComparison(parent, ctx) ? parentPath : path;\n}\n\n// --- popover micro-editors ---------------------------------------------------\n\nfunction boolEditor(ctx: EditCtx, path: AstPath, value: boolean, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Boolean value\"]));\n for (const v of [true, false]) {\n wrap.append(button(`exed-opt${v === value ? \" sel\" : \"\"}`, String(v), () => { replace(ctx, path, boolLit(v)); close(); }));\n }\n return wrap;\n });\n}\n\nfunction numberEditor(ctx: EditCtx, path: AstPath, value: number, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => textField({\n initial: formatNumber(value), caption: \"Number value\", placeholder: \"0\",\n validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)),\n onCommit: (v) => { replace(ctx, path, numLit(Number(v))); close(); },\n }));\n}\n\nfunction stringEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"string\" }, anchor: HTMLButtonElement): void {\n const peer = findEnumPeer(ctx.getAst(), path);\n const enumEntry = peer ? lookup(ctx.catalogue, peer.scope, peer.name) : null;\n // The closed value list comes from a comparison peer (an enum's values, or a quality's stages in\n // LADDER order), or - for the single root literal of a value field - from the target's declared\n // values (ctx.valueEnumValues).\n const rootValueEnums = path.length === 0 && ctx.valueEnumValues?.length ? ctx.valueEnumValues : null;\n const peerChoices = choicesOf(enumEntry);\n const enumValues = peerChoices?.length ? peerChoices : rootValueEnums;\n // \"stage\", not \"value\", when the peer is a quality: the word is the whole point of the type.\n const enumHeadLabel = enumEntry\n ? `${displayName(enumEntry, ctx.defaultScope)} ${enumEntry.type === \"quality\" ? \"stage\" : \"value\"}`\n : \"Value\";\n ctx.openPopover(anchor, (close) => {\n // Enum value list when compared against an enum property or as an enum value field.\n if (enumValues?.length) {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [enumHeadLabel]));\n for (const v of enumValues) {\n wrap.append(button(`exed-opt${v === node.value ? \" sel\" : \"\"}`, v, () => { replace(ctx, path, strLit(v)); close(); }));\n }\n return wrap;\n }\n return textField({\n initial: node.value, caption: \"Text value\", placeholder: \"value\",\n onCommit: (v) => { replace(ctx, path, strLit(v)); close(); },\n });\n });\n}\n\nfunction operatorEditor(ctx: EditCtx, path: AstPath, current: BinaryOp, group: BinaryOp[], anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Operator\"]));\n for (const op of group) {\n wrap.append(button(`exed-opt${op === current ? \" sel\" : \"\"}`, `${BINARY_LABEL[op]} ${op}`, () => {\n const node = ctx.getAst();\n const cur = setNodeAt(node, path, { ...(getBinary(ctx, path)), op } as ExprNode);\n ctx.apply(cur); close();\n }));\n }\n return wrap;\n });\n}\n\nconst getBinary = (ctx: EditCtx, path: AstPath): ExprNode & { kind: \"binary\" } => {\n const n = pathNode(ctx.getAst(), path);\n if (n?.kind !== \"binary\") throw new Error(\"expected binary\");\n return n;\n};\n\nfunction flagEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"flagdelta\" }, anchor: HTMLButtonElement): void {\n // The flags property is the call's first arg (the sibling at args[0]).\n const callPath = path.slice(0, -2);\n const call = pathNode(ctx.getAst(), callPath);\n const flagsVar = call?.kind === \"call\" ? call.args[0] : undefined;\n const entry = flagsVar?.kind === \"scopedvar\" ? lookup(ctx.catalogue, flagsVar.scope, flagsVar.name) : null;\n const flagCount = call?.kind === \"call\" ? call.args.filter((a) => a.kind === \"flagdelta\").length : 0;\n const used = call?.kind === \"call\"\n ? call.args.filter((a, i): a is ExprNode & { kind: \"flagdelta\" } => a.kind === \"flagdelta\" && i !== (path[path.length - 1] as number)).map((a) => a.name)\n : [];\n // The last flag delta can't be removed when the field must stay non-empty\n // (a set_flags value cell must always carry at least one flag).\n const canRemove = !(ctx.requireNonEmpty && flagCount <= 1);\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Flag set?\"]));\n wrap.append(signToggle(node.sign, (s) => { replace(ctx, path, flagDelta(s, node.name)); close(); }));\n const names = (entry?.enumValues ?? []).filter((n) => !used.includes(n));\n if (names.length) {\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Flag\"]));\n for (const n of names) wrap.append(button(`exed-opt${n === node.name ? \" sel\" : \"\"}`, n, () => { replace(ctx, path, flagDelta(node.sign, n)); close(); }));\n } else {\n wrap.append(textField({ initial: node.name, caption: \"Flag name\", onCommit: (v) => { replace(ctx, path, flagDelta(node.sign, v)); close(); } }));\n }\n if (canRemove) {\n wrap.append(button(\"exed-opt danger\", \"Remove flag\", () => { ctx.apply(deleteAt(ctx.getAst(), path)); close(); }));\n }\n return wrap;\n });\n}\n\n// A root-emptying delete is withheld when the field must stay non-empty (a\n// single-value field). Check the EFFECTIVE path (a compound-comparison operand\n// redirects to the whole comparison), so deleting one is blocked when the\n// comparison is the whole value.\nconst canDelete = (ctx: EditCtx, path: AstPath): boolean =>\n !(ctx.requireNonEmpty && effectiveDeletePath(ctx, path).length === 0);\n\nfunction callEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"call\" }, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [node.name]));\n wrap.append(el(\"div\", \"exed-hint\", [\"Edit the arguments by clicking each one.\"]));\n if (FLAG_FNS.has(node.name)) {\n wrap.append(button(\"exed-opt\", \"+ add flag\", () => { replace(ctx, path, { ...node, args: [...node.args, flagDelta(\"+\", \"\")] }); close(); }));\n }\n if (canDelete(ctx, path)) {\n wrap.append(button(\"exed-opt danger\", \"Delete\", () => { ctx.apply(deleteAt(ctx.getAst(), effectiveDeletePath(ctx, path))); close(); }));\n }\n return wrap;\n });\n}\n\nfunction variableEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"scopedvar\" }, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => propertyPicker(ctx, {\n current: refOf(node, ctx.defaultScope),\n onPick: (entry) => { replace(ctx, path, scopedVar(entry.scope, entry.name)); close(); },\n ...(canDelete(ctx, path)\n ? { footer: button(\"exed-opt danger\", \"Delete\", () => { ctx.apply(deleteAt(ctx.getAst(), effectiveDeletePath(ctx, path))); close(); }) }\n : {}),\n }));\n}\n\n// --- property picker ---------------------------------------------------------\n\nexport function propertyPicker(ctx: EditCtx, opts: {\n current?: string; accept?: PropertyType[]; onPick: (e: CatalogueEntry) => void; footer?: Node;\n}): HTMLElement {\n const wrap = el(\"div\", \"exed-picker\");\n const search = el(\"input\", \"exed-input\");\n search.type = \"text\"; search.placeholder = \"Search properties…\";\n const list = el(\"div\", \"exed-picker-list\");\n const pool = filterCatalogue(ctx.catalogue, { acceptTypes: opts.accept });\n const draw = (): void => {\n list.replaceChildren();\n const groups = groupByScope(searchCatalogue(pool, search.value, ctx.defaultScope), ctx.scopeOrder);\n if (!groups.length) { list.append(el(\"div\", \"exed-hint\", [\"No matching properties.\"])); return; }\n for (const g of groups) {\n list.append(el(\"div\", \"exed-picker-scope\", [g.scope]));\n for (const e of g.entries) {\n const label = displayName(e, ctx.defaultScope);\n const sel = opts.current === refOf(e, ctx.defaultScope);\n const row = button(`exed-opt${sel ? \" sel\" : \"\"}`, \"\", () => opts.onPick(e));\n row.append(el(\"span\", \"exed-opt-name\", [label]), el(\"span\", \"exed-opt-type\", [e.type]));\n if (e.purpose) row.append(el(\"span\", \"exed-opt-purpose\", [e.purpose]));\n list.append(row);\n }\n }\n };\n search.addEventListener(\"input\", draw);\n draw();\n wrap.append(search, list);\n if (opts.footer) wrap.append(el(\"div\", \"exed-picker-foot\", [opts.footer]));\n setTimeout(() => search.focus(), 0);\n return wrap;\n}\n","// ---------------------------------------------------------------------------\n// Condition CLAUSE wizards — multi-step guided builders for the \"Add a clause\"\n// menu, ported from the storylets condition editor (clauseWizards.tsx) to\n// vanilla-TS / ExprNode. Each wizard renders its steps into a popover host\n// element (rebuilt in place as the author advances) and commits a finished\n// ExprNode. No clause is inserted with placeholder defaults the author then has\n// to chase down.\n//\n// comparisonWizard — property → operator → value (literal or property)\n// booleanWizard — pick a boolean property (the bare `@flag` clause)\n// checkFlagsWizard — flags property → +set/−unset → flag\n// randomWizard — range(a,b) → operator → value\n// ---------------------------------------------------------------------------\n\nimport type { BinaryOp, ExprNode } from \"@wildwinter/expr\";\nimport { el, button, textField } from \"./dom.js\";\nimport { propertyPicker } from \"./flat.js\";\nimport { binary, scopedVar, numLit, strLit, boolLit, callNode, flagDelta } from \"./ast.js\";\nimport { BINARY_LABEL, COMPARISON_OPS, COMPARABLE_TYPES, comparisonOpsFor, rhsTypesFor } from \"./ops.js\";\nimport { choicesOf, type CatalogueEntry, type PropertyType } from \"./schema.js\";\nimport type { EditCtx, WizardSpec, WizardValue } from \"./types.js\";\n\nexport interface ClauseWizardCtx {\n catalogue: CatalogueEntry[];\n scopeOrder: string[];\n defaultScope: string;\n}\n\ntype Commit = (node: ExprNode) => void;\ntype Cancel = () => void;\n\n/** The left-hand property of a comparison clause, carrying whatever closed value list it has. */\ninterface LhsSpec { ref: string; type: PropertyType; enumValues?: string[]; stages?: string[] }\n\n/** Plain-language gloss for each comparison op (shown beside its glyph, matching storylets). */\nconst OP_WORD: Partial<Record<BinaryOp, string>> = {\n \"==\": \"equals\", \"!=\": \"not equal to\", \">\": \"greater than\", \">=\": \"at least\", \"<\": \"less than\", \"<=\": \"at most\",\n};\n/** An operator option button: glyph + plain-language word (never the glyph twice). */\nconst opButton = (o: BinaryOp, onClick: () => void): HTMLButtonElement => {\n const b = button(\"exed-opt\", \"\", onClick);\n b.append(el(\"span\", \"exed-opt-name\", [BINARY_LABEL[o]]), el(\"span\", \"exed-opt-purpose\", [OP_WORD[o] ?? \"\"]));\n return b;\n};\n\n\n/** Shared chrome: a step header with a back/cancel control and a title. */\nfunction header(host: HTMLElement, title: string | Node, back: (() => void) | undefined, cancel: Cancel | undefined): void {\n const h = el(\"div\", \"exed-vwiz-head\");\n if (back) h.append(button(\"exed-vwiz-back\", \"←\", back, \"Back\"));\n else if (cancel) h.append(button(\"exed-vwiz-back\", \"✕\", cancel, \"Cancel\"));\n h.append(el(\"span\", \"exed-vwiz-title\", [title]));\n host.append(h);\n}\n\nconst mono = (s: string): HTMLElement => el(\"span\", \"exed-vwiz-mono\", [s]);\nconst pickCtxOf = (w: ClauseWizardCtx): EditCtx =>\n ({ catalogue: w.catalogue, defaultScope: w.defaultScope, scopeOrder: w.scopeOrder } as unknown as EditCtx);\n\n/** The shared \"pick a value\" step: type-appropriate literal input, or switch to a property. */\nfunction valueStep(host: HTMLElement, w: ClauseWizardCtx, lhs: LhsSpec, op: BinaryOp, back: () => void, cancel: Cancel, commit: Commit): void {\n let mode: \"value\" | \"property\" = \"value\";\n const draw = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [mono(lhs.ref), \" \", BINARY_LABEL[op], \" …\"]), back, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const swap = (): HTMLButtonElement => button(\"exed-vwiz-other\", mode === \"value\" ? \"↩ use a property instead\" : \"↩ use a value instead\", () => { mode = mode === \"value\" ? \"property\" : \"value\"; draw(); });\n\n const done = (rhs: ExprNode): void => commit(binary(op, lhsVar(w, lhs.ref), rhs));\n if (mode === \"property\") {\n body.append(propertyPicker(pickCtxOf(w), { accept: rhsTypesFor(lhs.type), onPick: (e) => done(scopedVar(e.scope, e.name)) }));\n body.append(swap());\n return;\n }\n if (lhs.type === \"boolean\") {\n const row = el(\"div\", \"exed-field-row\");\n row.append(button(\"exed-opt\", \"true\", () => done(boolLit(true))), button(\"exed-opt\", \"false\", () => done(boolLit(false))));\n body.append(row);\n } else if (choicesOf(lhs)?.length) {\n // Enum values, or a quality's stages IN LADDER ORDER - the order is the affordance: reading down\n // the list is reading the story's progression, so \"at or past\" has an obvious meaning.\n for (const v of choicesOf(lhs)!) body.append(button(\"exed-opt\", v, () => done(strLit(v))));\n } else if (lhs.type === \"number\") {\n body.append(textField({ caption: \"Number\", placeholder: \"e.g. 3\", validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)), onCommit: (v) => done(numLit(Number(v))) }));\n } else {\n body.append(textField({ caption: \"Text\", placeholder: \"e.g. autumn\", onCommit: (v) => done(strLit(v)) }));\n }\n body.append(swap());\n };\n draw();\n}\n\n/** Resolve a \"@scope.name\" / \"@name\" display ref into a scopedvar node (default scope when bare). */\nfunction lhsVar(w: ClauseWizardCtx, ref: string): ExprNode {\n const bare = ref.replace(/^@/, \"\");\n const dot = bare.indexOf(\".\");\n return dot >= 0 ? scopedVar(bare.slice(0, dot), bare.slice(dot + 1)) : scopedVar(w.defaultScope, bare);\n}\n\n/** Property → operator → value. */\nexport function comparisonWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickLhs = (): void => {\n host.replaceChildren();\n header(host, \"Pick a property to compare\", undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), {\n accept: COMPARABLE_TYPES,\n onPick: (e) => pickOp({\n ref: refDisplay(w, e), type: e.type,\n ...(e.enumValues ? { enumValues: e.enumValues } : {}),\n ...(e.stages ? { stages: e.stages } : {}),\n }),\n }));\n };\n const pickOp = (lhs: LhsSpec): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Operator for \", mono(lhs.ref)]), pickLhs, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n for (const o of comparisonOpsFor(lhs.type)) {\n body.append(opButton(o, () => valueStep(host, w, lhs, o, () => pickOp(lhs), cancel, commit)));\n }\n };\n pickLhs();\n}\n\n/** Pick a boolean property — the bare `@flag` clause. */\nexport function booleanWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n host.replaceChildren();\n header(host, \"Pick a boolean property\", undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), { accept: [\"boolean\"], onPick: (e) => commit(scopedVar(e.scope, e.name)) }));\n}\n\n/** Flags property → +set / −unset → flag. */\nexport function checkFlagsWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickProp = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Flags property for \", mono(\"check_flags()\")]), undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), { accept: [\"flags\"], onPick: (e) => pickFlag(e) }));\n };\n const pickFlag = (prop: CatalogueEntry): void => {\n let sign: \"+\" | \"-\" = \"+\";\n const draw = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Flag on \", mono(refDisplay(w, prop))]), pickProp, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const signRow = el(\"div\", \"exed-field-row\");\n signRow.append(\n button(`exed-opt${sign === \"+\" ? \" sel\" : \"\"}`, \"+ set\", () => { sign = \"+\"; draw(); }),\n button(`exed-opt${sign === \"-\" ? \" sel\" : \"\"}`, \"- unset\", () => { sign = \"-\"; draw(); }),\n );\n body.append(signRow);\n const flags = prop.enumValues ?? [];\n if (!flags.length) body.append(el(\"div\", \"exed-hint\", [`${refDisplay(w, prop)} declares no flag values yet.`]));\n for (const f of flags) body.append(button(\"exed-opt\", f, () => commit(callNode(\"check_flags\", [scopedVar(prop.scope, prop.name), flagDelta(sign, f)]))));\n };\n draw();\n };\n pickProp();\n}\n\n/** random(a, b) → operator → value (a whole number in a..b, compared). */\nexport function randomWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickRange = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Range for \", mono(\"random(a, b)\")]), undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n let a = \"1\";\n body.append(textField({ caption: \"Low (a)\", initial: \"1\", placeholder: \"e.g. 1\", validate: numOk, onCommit: (v) => { a = v; } }));\n body.append(textField({\n caption: \"High (b)\", initial: \"6\", placeholder: \"e.g. 6\", submitLabel: \"Next →\", validate: numOk,\n onCommit: (b) => pickOp(Math.round(Number(a)), Math.round(Number(b))),\n }));\n };\n const pickOp = (a: number, b: number): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Operator for \", mono(`random(${a}, ${b})`)]), pickRange, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n for (const o of COMPARISON_OPS) {\n body.append(opButton(o, () => pickValue(a, b, o)));\n }\n };\n const pickValue = (a: number, b: number, op: BinaryOp): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [mono(`random(${a}, ${b})`), ` ${BINARY_LABEL[op]} …`]), () => pickOp(a, b), cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(textField({ caption: \"Compare to\", placeholder: \"e.g. 1\", validate: numOk, onCommit: (v) => commit(binary(op, callNode(\"random\", [numLit(a), numLit(b)]), numLit(Number(v)))) }));\n };\n pickRange();\n}\n\nconst numOk = (v: string): boolean => v.trim() !== \"\" && Number.isFinite(Number(v));\n\n/**\n * Generic runner for a declarative WizardSpec: walks the steps in order with the\n * shared back/cancel chrome, collects one value per step, and commits\n * `spec.build(values)`. Lets a dialect add guided flows (tag -> operator ->\n * threshold and the like) without any upstream code.\n */\nexport function genericWizard(host: HTMLElement, spec: WizardSpec, commit: Commit, cancel: Cancel): void {\n const values: WizardValue[] = [];\n const stepAt = (i: number): void => {\n const step = spec.steps[i];\n if (!step) return;\n host.replaceChildren();\n const back = i > 0 ? (): void => { values.length = i - 1; stepAt(i - 1); } : undefined;\n header(host, step.title, back, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const last = i === spec.steps.length - 1;\n const done = (v: WizardValue): void => {\n values[i] = v;\n if (last) commit(spec.build(values));\n else stepAt(i + 1);\n };\n switch (step.kind) {\n case \"string\":\n body.append(textField({\n caption: step.caption ?? \"Text\", placeholder: step.placeholder,\n submitLabel: last ? \"Apply\" : \"Next →\",\n validate: (v) => v.trim() !== \"\",\n onCommit: (v) => done(v.trim()),\n }));\n break;\n case \"number\":\n body.append(textField({\n caption: step.caption ?? \"Number\", placeholder: step.placeholder,\n initial: step.initial !== undefined ? String(step.initial) : undefined,\n submitLabel: last ? \"Apply\" : \"Next →\",\n validate: numOk,\n onCommit: (v) => done(Number(v)),\n }));\n break;\n case \"op\":\n for (const o of step.ops ?? COMPARISON_OPS) body.append(opButton(o, () => done(o)));\n break;\n }\n };\n stepAt(0);\n}\n\n/** A property's display ref (\"@name\" in the default scope, else \"@scope.name\"). */\nfunction refDisplay(w: ClauseWizardCtx, e: CatalogueEntry): string {\n return e.scope === w.defaultScope ? `@${e.name}` : `@${e.scope}.${e.name}`;\n}\n","// ---------------------------------------------------------------------------\n// The tree chrome: render the derived TreeRow model as nested AND/OR groups +\n// leaf rows, with per-row NOT / move / delete, container op-flip + NOT, and the\n// \"+ Add condition\" / \"+ Add group\" affordances. Each leaf delegates its content\n// to the flat pill editor (flat.ts). Ported from the storylets tree editor.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, AstPath } from \"@wildwinter/expr\";\nimport {\n deleteAt, binary, scopedVar, strLit, isPlaceholderForOp, getNodeAt as getNode, setNodeAt, firstEmptyLeafPath,\n} from \"./ast.js\";\nimport {\n astToTree, addChildToContainer, flipContainerOp, toggleContainerNot, buildSubGroupClause, moveChildInContainer,\n redirectDeleteForPlaceholderSibling, type TreeRow,\n} from \"./tree.js\";\nimport { el, button } from \"./dom.js\";\nimport { renderNode } from \"./flat.js\";\nimport { comparisonWizard, booleanWizard, checkFlagsWizard, randomWizard, genericWizard, type ClauseWizardCtx } from \"./clausewizard.js\";\nimport type { EditCtx, FunctionTemplateSpec } from \"./types.js\";\n\n/** Ask the mount to auto-open the first unfilled slot of a just-inserted clause\n * (insert-then-refine templates: the author lands straight in the empty tag /\n * flag pill). `base` is where the clause sits in the post-insert AST. */\nexport function requestFocusForInsert(ctx: EditCtx, clause: ExprNode, base: AstPath): void {\n const rel = firstEmptyLeafPath(clause);\n if (rel) ctx.requestFocus?.([...base, ...rel]);\n}\n\n/** Render the whole expression as a tree into a fresh element. */\nexport function renderTree(ctx: EditCtx): HTMLElement {\n const row = astToTree(ctx.getAst(), []);\n const wrap = el(\"div\", \"exed-tree\");\n wrap.append(renderRow(ctx, row, { root: true }));\n // A single-condition root has no container add-bar of its own; give it one so it can grow.\n if (row.kind !== \"container\") wrap.append(rootAddBar(ctx));\n return wrap;\n}\n\ninterface RowEnv { root?: boolean; index?: number; count?: number; chainPath?: AstPath; }\n\nfunction renderRow(ctx: EditCtx, row: TreeRow, env: RowEnv): HTMLElement {\n if (row.kind === \"container\") return renderContainer(ctx, row, env);\n return renderLeaf(ctx, row, env);\n}\n\nfunction notToggle(ctx: EditCtx, path: AstPath, pressed: boolean): HTMLButtonElement {\n const b = button(\"exed-rowbtn\", \"NOT\", () => ctx.apply(toggleContainerNot(ctx.getAst(), path)), \"toggle NOT\", pressed ? \"remove NOT\" : \"apply NOT\");\n b.setAttribute(\"aria-pressed\", String(pressed));\n return b;\n}\n\nfunction rowActions(ctx: EditCtx, row: TreeRow, env: RowEnv): HTMLElement {\n const acts = el(\"div\", \"exed-rowacts\");\n acts.append(notToggle(ctx, row.path, row.negated));\n if (env.chainPath && env.count != null && env.index != null) {\n if (env.index > 0) acts.append(button(\"exed-rowbtn\", \"↑\", () => ctx.apply(moveChildInContainer(ctx.getAst(), env.chainPath!, env.index!, env.index! - 1)), \"move up\", \"move up\"));\n if (env.index < env.count - 1) acts.append(button(\"exed-rowbtn\", \"↓\", () => ctx.apply(moveChildInContainer(ctx.getAst(), env.chainPath!, env.index!, env.index! + 1)), \"move down\", \"move down\"));\n }\n acts.append(button(\"exed-rowbtn danger\", \"✕\", () => {\n if (env.root) { ctx.apply(null); return; }\n // If this row's AST sibling is a temp group placeholder, collapse the whole\n // half-filled sub-group instead of leaving the placeholder (`true`/`false`)\n // floating up as a bare clause.\n const target = redirectDeleteForPlaceholderSibling(ctx.getAst(), row.path);\n ctx.apply(deleteAt(ctx.getAst(), target));\n }, \"delete\", \"delete this condition\"));\n return acts;\n}\n\nfunction renderLeaf(ctx: EditCtx, row: Extract<TreeRow, { kind: \"comparison\" | \"wrapped\" }>, env: RowEnv): HTMLElement {\n // A placeholder sentinel renders as a dashed \"click to add\" row.\n if (row.kind === \"wrapped\" && (isPlaceholderForOp(row.node, \"and\") || isPlaceholderForOp(row.node, \"or\"))) {\n return placeholderRow(ctx, row.path);\n }\n const line = el(\"div\", \"exed-row\");\n if (row.negated) line.append(el(\"span\", \"exed-not\", [\"NOT\"]));\n const content = row.kind === \"comparison\"\n ? renderNode(nodeAtContent(ctx, row.contentPath), row.contentPath, ctx)\n : renderNode(row.node, row.contentPath, ctx);\n line.append(el(\"span\", \"exed-rowcontent\", [content]));\n line.append(rowActions(ctx, row, env));\n return line;\n}\n\nconst nodeAtContent = (ctx: EditCtx, path: AstPath): ExprNode => {\n // For a comparison row the content is the binary at contentPath.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getNode(ctx.getAst(), path)!;\n};\n\nfunction renderContainer(ctx: EditCtx, row: Extract<TreeRow, { kind: \"container\" }>, env: RowEnv): HTMLElement {\n const box = el(\"div\", `exed-group exed-group-${row.op}`);\n const head = el(\"div\", \"exed-grouphead\");\n if (row.negated) head.append(el(\"span\", \"exed-not\", [\"NOT\"]));\n // Root container can flip op; a sub-group's op is fixed (flipping would dissolve it).\n const label = row.op === \"and\" ? \"ALL OF THESE:\" : \"ANY OF THESE:\";\n if (env.root) {\n head.append(button(\"exed-flip\", label, () => ctx.apply(flipContainerOp(ctx.getAst(), row.chainPath, row.op === \"and\" ? \"or\" : \"and\")), \"switch AND / OR\"));\n } else {\n head.append(el(\"span\", \"exed-grouplabel\", [label]));\n }\n const headActs = el(\"div\", \"exed-rowacts\");\n headActs.append(notToggle(ctx, row.path, row.negated));\n if (!env.root) headActs.append(button(\"exed-rowbtn danger\", \"✕\", () => ctx.apply(deleteAt(ctx.getAst(), row.path)), \"delete group\", \"delete this group\"));\n head.append(headActs);\n box.append(head);\n\n const body = el(\"div\", \"exed-groupbody\");\n row.children.forEach((child, i) => {\n // Each child sits in a flex row with a left-gutter AND/OR connector, so the\n // chain reads as a sentence (\"X · AND · Y · AND · Z\"). The first child has an\n // empty gutter (keeps every row's content column-aligned).\n const childRow = el(\"div\", \"exed-child\");\n childRow.append(el(\"span\", \"exed-connector\", [i === 0 ? \"\" : row.op.toUpperCase()]));\n childRow.append(renderRow(ctx, child, { index: i, count: row.children.length, chainPath: row.chainPath }));\n body.append(childRow);\n });\n body.append(addBar(ctx, row.chainPath, row.op));\n box.append(body);\n return box;\n}\n\nfunction placeholderRow(ctx: EditCtx, path: AstPath): HTMLElement {\n const b = button(\"exed-placeholder\", \"Click to add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, path);\n ctx.apply(replaceAt(ctx, path, node));\n });\n });\n return b;\n}\n\n/** \"+ condition\" and \"+ AND/OR group\" controls for a container chain. */\nfunction addBar(ctx: EditCtx, chainPath: AstPath, op: \"and\" | \"or\"): HTMLElement {\n const bar = el(\"div\", \"exed-addbar\");\n bar.append(button(\"exed-add\", \"+ Add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n // addChildToContainer appends as binary(op, chain, clause) at chainPath,\n // so the inserted clause lands at chainPath + \"right\".\n requestFocusForInsert(ctx, node, [...chainPath, \"right\"]);\n ctx.apply(addChildToContainer(ctx.getAst(), chainPath, node));\n });\n }));\n bar.append(button(\"exed-add\", `+ Add ${op === \"and\" ? \"OR\" : \"AND\"} group`, () => {\n ctx.apply(addChildToContainer(ctx.getAst(), chainPath, buildSubGroupClause(op, seedClause(ctx))));\n }, \"add a nested group\"));\n return bar;\n}\n\n/** The root add-bar (for a single-condition or empty root): grows it into a chain. */\nexport function rootAddBar(ctx: EditCtx): HTMLElement {\n const bar = el(\"div\", \"exed-addbar\");\n bar.append(button(\"exed-add\", \"+ Add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, [\"right\"]);\n ctx.apply(addChildToContainer(ctx.getAst(), [], node));\n });\n }));\n bar.append(button(\"exed-add\", \"+ Add group\", () => {\n ctx.apply(addChildToContainer(ctx.getAst(), [], buildSubGroupClause(\"and\", seedClause(ctx))));\n }));\n return bar;\n}\n\n// --- clause templates --------------------------------------------------------\n\n/** A sensible first clause: the first property compared to an empty value, else `true`. */\nexport function seedClause(ctx: EditCtx): ExprNode {\n const first = ctx.catalogue[0];\n if (!first) return { kind: \"bool\", value: true };\n if (first.type === \"boolean\") return scopedVar(first.scope, first.name);\n return binary(\"==\", scopedVar(first.scope, first.name), first.type === \"number\" ? { kind: \"number\", value: 0 } : strLit(\"\"));\n}\n\n/** The \"+ Add condition\" template menu: generic property clauses + the dialect's functions. */\nexport function clauseMenu(ctx: EditCtx, anchor: HTMLElement, onPick: (node: ExprNode) => void): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add a clause\"]));\n const add = (label: string, hint: string | undefined, make: () => void, disabled = false): void => {\n const b = button(`exed-opt${disabled ? \" disabled\" : \"\"}`, \"\", () => { if (disabled) return; make(); close(); });\n if (disabled) b.disabled = true;\n b.append(el(\"span\", \"exed-opt-name\", [label]));\n if (hint) b.append(el(\"span\", \"exed-opt-purpose\", [hint]));\n wrap.append(b);\n };\n // Launch a guided wizard into a fresh popover, committing the built clause.\n const wctx: ClauseWizardCtx = { catalogue: ctx.catalogue, scopeOrder: ctx.scopeOrder, defaultScope: ctx.defaultScope };\n const launch = (run: (host: HTMLElement, w: ClauseWizardCtx, commit: (n: ExprNode) => void, cancel: () => void) => void): void => {\n ctx.openPopover(anchor, (close2) => {\n const host = el(\"div\", \"exed-vwiz\");\n run(host, wctx, (node) => { onPick(node); close2(); }, close2);\n return host;\n });\n };\n const addFn = (fn: FunctionTemplateSpec): void => add(fn.label, fn.hint, () => {\n if (fn.wizard === \"check_flags\") launch(checkFlagsWizard);\n else if (fn.wizard === \"random\") launch(randomWizard);\n else if (fn.wizard && typeof fn.wizard === \"object\") {\n const spec = fn.wizard;\n launch((host, _w, commit, cancel) => genericWizard(host, spec, commit, cancel));\n } else onPick(fn.build());\n }, !!fn.disabled);\n // Dialect flag functions lead (matching storylets' menu), then the generic\n // property clauses, then the remaining dialect functions.\n const flagFns = ctx.functions.filter((f) => f.name === \"check_flags\");\n const otherFns = ctx.functions.filter((f) => f.name !== \"check_flags\");\n flagFns.forEach(addFn);\n add(\"Property comparison\", \"a property vs a value\", () => launch(comparisonWizard));\n add(\"Property is true\", \"a boolean property on its own\", () => launch(booleanWizard));\n otherFns.forEach(addFn);\n return wrap;\n });\n}\n\n// keep the template list reusable for the host\nexport type { FunctionTemplateSpec };\n\nconst replaceAt = (ctx: EditCtx, path: AstPath, node: ExprNode): ExprNode => setNodeAt(ctx.getAst(), path, node);\n","// ---------------------------------------------------------------------------\n// mountExpressionEditor — the public, framework-neutral entry. Mounts the hybrid\n// tree / flat / raw-text editor into a host element, parses the name-form `value`\n// to an ExprNode, and emits name-form on every mutation. Scopes, properties and\n// the function templates are injected, so it is tool-agnostic.\n// ---------------------------------------------------------------------------\n\nimport { unparse } from \"@wildwinter/expr\";\nimport type { ExprNode, BinaryOp, Dialect, ExpressionSchema, AstPath } from \"@wildwinter/expr\";\nimport { boolLit, binary, numLit, scopedVar, strLit, callNode, flagDelta } from \"./ast.js\";\nimport { validateSource } from \"./validate.js\";\nimport { ARITHMETIC_OPS, BINARY_LABEL } from \"./ops.js\";\nimport type { CatalogueEntry } from \"./schema.js\";\nimport { el, button, textField, openPopover, type Popover } from \"./dom.js\";\nimport { renderNode, propertyPicker, signToggle } from \"./flat.js\";\nimport { renderTree, clauseMenu, requestFocusForInsert } from \"./treeview.js\";\nimport type { EditCtx, FunctionTemplateSpec } from \"./types.js\";\n\nexport type { FunctionTemplateSpec } from \"./types.js\";\n\nexport interface ExpressionEditorOptions {\n /** Current expression in name-form (`@gold > 0 and @met`); \"\" = always / empty. */\n value: string;\n schema: ExpressionSchema;\n dialect: Dialect;\n /** Properties the picker offers. */\n catalogue: CatalogueEntry[];\n /** Scope display order for the picker groups. */\n scopeOrder?: string[];\n /** Dialect-specific clause templates (beyond the generic property comparisons). */\n functions?: FunctionTemplateSpec[];\n /** \"tree\" (default) for conditions, \"flat\" for a single inline expression. */\n mode?: \"tree\" | \"flat\";\n /** Flat mode only: show an optional \"+ term\" affordance that extends the value with one more term -\n * type-led: \"arithmetic\" extends a number (`5` → `5 + @bonus`); \"boolean\" extends a true/false value\n * with a logical term (`true` → `true and @met`). Omit for text / enum (no meaningful extension). */\n addTerm?: \"arithmetic\" | \"boolean\";\n /** Label for the empty/always pill (default \"always\"). */\n nullLabel?: string;\n /** Host picker for flow-node reference args (seen/visits); renders those args as a node pill. */\n pickNode?: EditCtx[\"pickNode\"];\n /** Resolve a node id to a readable label for node-ref pills. */\n nodeLabel?: EditCtx[\"nodeLabel\"];\n /** Start in raw-text mode (the host's global \"show as text\" toggle drives this; no inline `</>`). */\n text?: boolean;\n /** Render the editor's own validation message list under the pills (default true).\n * Hosts that display their own validation messages pass false to avoid doubling up. */\n messages?: boolean;\n /** Where to append the popover micro-editors (default document.body). Pass a\n * container inside a focus-trapping dialog (Radix, etc.) so opening a pill's\n * popover does not dismiss the surrounding dialog. */\n popoverContainer?: HTMLElement;\n /** Block a delete that would empty the whole expression (single-value fields\n * that must always hold a term). Conditions leave this off (empty = always). */\n requireNonEmpty?: boolean;\n /** Enum values for the single root literal of a value field (an enum-typed\n * target): the literal editor then offers them as a picker. Flat mode only. */\n valueEnumValues?: string[];\n /** Flat single-value field: an empty value renders one editable \"set a value…\"\n * placeholder pill (a root string literal) rather than the condition\n * clause-menu empty state. Pairs with mode:\"flat\". */\n valueField?: boolean;\n /** Flat compact editor for a `set_flags(@target, +a, -b)` value whose target is\n * implied by context (an outcome row's target column). Renders only the\n * flag-delta pills plus an \"+ flag\" chip, hiding the function name and target\n * arg. `target` is the name-form ref of the flags property (e.g. \"@quests\"),\n * `flags` its declared flag names (offered by the \"+ flag\" picker). Pairs\n * with mode:\"flat\"; set requireNonEmpty so the last flag can't be removed. */\n flagValue?: { target: string; flags: string[] };\n /** Placeholder for the raw-text textarea (defaults to a generic example).\n * Value cells pass a value-flavoured hint (e.g. \"autumn or @count + 1\"). */\n rawPlaceholder?: string;\n /** Host actions for a property pill, shown on right-click (e.g. go to\n * definition). Receives the property ref; returns the menu items. */\n propertyActions?(ref: { scope: string; name: string }): Array<{ label: string; run: () => void }>;\n /** Emitted on every edit (name-form; \"\" when cleared). */\n onChange: (src: string) => void;\n /** Notified when the author starts (true) / stops (false) editing inside a popover\n * micro-editor — lets the host suppress its own validation display mid-edit. */\n onEditingChange?: (editing: boolean) => void;\n}\n\nexport interface ExpressionEditorHandle {\n setValue(v: string): void;\n /** Flip between the pill view and the raw-text view (driven by the host's global toggle). */\n setText(on: boolean): void;\n destroy(): void;\n}\n\nexport function mountExpressionEditor(host: HTMLElement, opts: ExpressionEditorOptions): ExpressionEditorHandle {\n const defaultScope = opts.dialect.defaultScope;\n let src = opts.value ?? \"\";\n let raw = opts.text ?? false; // raw-text view (host-driven) / forced when unparseable\n let activePopover: Popover | null = null;\n let editing = false;\n let pendingFocus: AstPath | null = null; // pill to auto-open after the next render\n host.classList.add(\"exed-root\");\n\n const emit = (next: string): void => { src = next; opts.onChange(src); render(); };\n const toSrc = (ast: ExprNode | null): string => (ast ? unparse(ast, { defaultScope }) : \"\");\n\n const setEditing = (on: boolean): void => {\n if (on === editing) return;\n editing = on;\n opts.onEditingChange?.(on);\n };\n const closePopover = (): void => { activePopover?.close(); activePopover = null; };\n\n function buildCtx(ast: ExprNode): EditCtx {\n const v = validateSource(src, opts.schema, opts.dialect);\n return {\n schema: opts.schema, dialect: opts.dialect, defaultScope,\n catalogue: opts.catalogue, scopeOrder: opts.scopeOrder ?? [], functions: opts.functions ?? [],\n byPath: v.byPath,\n getAst: () => ast,\n apply: (next) => emit(toSrc(next)),\n openPopover: (anchor, r) => {\n closePopover();\n const pop = openPopover(anchor, r, {\n container: opts.popoverContainer,\n onClose: () => {\n if (activePopover === pop) activePopover = null;\n setEditing(false);\n },\n });\n activePopover = pop;\n setEditing(true);\n },\n requestFocus: (p) => { pendingFocus = p; },\n ...(opts.requireNonEmpty ? { requireNonEmpty: true } : {}),\n ...(opts.valueEnumValues ? { valueEnumValues: opts.valueEnumValues } : {}),\n ...(opts.propertyActions ? { propertyActions: opts.propertyActions } : {}),\n ...(opts.pickNode ? { pickNode: opts.pickNode } : {}),\n ...(opts.nodeLabel ? { nodeLabel: opts.nodeLabel } : {}),\n };\n }\n\n function render(): void {\n closePopover();\n host.replaceChildren();\n const v = validateSource(src, opts.schema, opts.dialect);\n\n const flagCompact = !!opts.flagValue && (opts.mode ?? \"tree\") === \"flat\";\n const astIsFlagCall = v.ast?.kind === \"call\" && (v.ast.name === \"set_flags\" || v.ast.name === \"check_flags\");\n\n if (raw || v.unparseable || (flagCompact && !!v.ast && !astIsFlagCall)) {\n // Raw for unparseable input, or a flag-value field holding a non-flag-call\n // expression (hand-typed) that the compact view can't represent.\n host.append(rawArea());\n } else if (flagCompact) {\n host.append(flagValueBody(astIsFlagCall ? (v.ast as ExprNode & { kind: \"call\" }) : null));\n } else if (!src.trim() || !v.ast) {\n host.append(opts.valueField ? valueEmptyState() : emptyState());\n } else {\n const ctx = buildCtx(v.ast);\n const body = el(\"div\", \"exed-body\");\n if ((opts.mode ?? \"tree\") === \"flat\") {\n const flat = el(\"div\", \"exed-flat\", [renderNode(v.ast, [], ctx)]);\n if (opts.addTerm) flat.append(addTermControl(ctx)); // optional \"+ term\" for values\n body.append(flat);\n } else body.append(renderTree(ctx));\n host.append(body);\n }\n\n if ((opts.messages ?? true) && (!v.unparseable || src.trim())) host.append(messages(v.issues));\n\n // Insert-then-refine follow-through: a template just inserted a clause with an\n // unfilled slot — open that pill's micro-editor so the author lands in it.\n if (pendingFocus) {\n const key = pendingFocus.join(\"/\");\n pendingFocus = null;\n host.querySelector<HTMLElement>(`[data-exed-path=\"${key}\"]`)?.click();\n }\n }\n\n // --- chrome ---------------------------------------------------------------\n\n function rawArea(): HTMLElement {\n const ta = el(\"textarea\", \"exed-raw\");\n ta.value = src;\n ta.placeholder = opts.rawPlaceholder ?? \"@gold > 0 and @met_anna\";\n ta.rows = 2;\n ta.addEventListener(\"input\", () => {\n src = ta.value; opts.onChange(src);\n msgHost.replaceChildren(messages(validateSource(src, opts.schema, opts.dialect).issues));\n });\n const msgHost = el(\"div\", \"exed-rawmsg\");\n const wrap = el(\"div\", \"exed-rawwrap\", [ta, msgHost]);\n return wrap;\n }\n\n function emptyState(): HTMLElement {\n const wrap = el(\"div\", \"exed-empty\");\n wrap.append(el(\"span\", \"exed-pill exed-pill-always\", [opts.nullLabel ?? \"always\"]));\n const ctx = buildCtx(boolLit(true));\n wrap.append(button(\"exed-add\", \"+ Add your first condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, []); // the clause becomes the root\n emit(toSrc(node));\n });\n }));\n return wrap;\n }\n\n // A flat value field's empty state: a single \"set a value…\" placeholder pill\n // (a root empty-string literal). Editing it commits the value; the empty\n // string unparses back to \"\" so no spurious write happens before the author\n // types. valueEnumValues (an enum target) drives the picker via the ctx.\n function valueEmptyState(): HTMLElement {\n const ctx = buildCtx(strLit(\"\"));\n return el(\"div\", \"exed-flat\", [renderNode(strLit(\"\"), [], ctx)]);\n }\n\n /** Parse a name-form property ref (\"@name\" / \"@scope.name\") to a scopedvar. */\n function parseRef(ref: string): ExprNode {\n const bare = ref.replace(/^@/, \"\");\n const dot = bare.indexOf(\".\");\n return dot >= 0 ? scopedVar(bare.slice(0, dot), bare.slice(dot + 1)) : scopedVar(defaultScope, bare);\n }\n\n // Compact flags value: render a set_flags(@target, +a, -b) call as only its\n // flag-delta pills (reusing the flat flag-delta editor) plus an \"+ flag\" chip.\n // The function name and target arg are hidden - the target is implied by the\n // row's target column. An empty value shows just the chip, which seeds the call.\n function flagValueBody(call: (ExprNode & { kind: \"call\" }) | null): HTMLElement {\n const wrap = el(\"div\", \"exed-flat exed-flagvalue\");\n const ctx = buildCtx(call ?? boolLit(true));\n if (call) {\n call.args.forEach((arg, i) => {\n if (arg.kind === \"flagdelta\") wrap.append(renderNode(arg, [\"args\", i], ctx));\n });\n }\n wrap.append(addFlagChip(ctx, call));\n return wrap;\n }\n\n // The \"+ flag\" chip opens a sign + name picker and commits a COMPLETE flag\n // delta - an empty flag name is not a valid AST (unlike an empty string), so\n // we never seed one; we build the full delta up front and add it in one step.\n function addFlagChip(ctx: EditCtx, call: (ExprNode & { kind: \"call\" }) | null): HTMLElement {\n const flags = opts.flagValue?.flags ?? [];\n const used = call ? call.args.filter((a): a is ExprNode & { kind: \"flagdelta\" } => a.kind === \"flagdelta\").map((a) => a.name) : [];\n const available = flags.filter((f) => !used.includes(f));\n return button(\"exed-add exed-addflag\", \"+ flag\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n ctx.openPopover(anchor, (close) => {\n let sign: \"+\" | \"-\" = \"+\";\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add flag\"]));\n const signHost = el(\"div\");\n const drawSign = (): void => { signHost.replaceChildren(signToggle(sign, (s) => { sign = s; drawSign(); })); };\n drawSign();\n wrap.append(signHost);\n const commit = (name: string): void => {\n const delta = flagDelta(sign, name);\n emit(toSrc(call\n ? { ...call, args: [...call.args, delta] }\n : callNode(\"set_flags\", [parseRef(opts.flagValue!.target), delta])));\n close();\n };\n if (available.length) {\n for (const n of available) wrap.append(button(\"exed-opt\", n, () => commit(n)));\n } else {\n wrap.append(el(\"div\", \"exed-hint\", [flags.length === 0\n ? \"This flags property declares no flag values yet.\"\n : \"All declared flags are already used.\"]));\n }\n return wrap;\n });\n }, \"add a flag\");\n }\n\n /** The optional \"+ term\" affordance (flat value mode): extend the value with one more arithmetic\n * term. Pick the operator (default +) and an operand (a number, or a property), and the whole\n * current value is wrapped left: `5` → `5 + 1`. NOT a forced step - just an \"add one more\" chip. */\n function addTermControl(ctx: EditCtx): HTMLElement {\n // Type-led: a boolean value extends with a logical term (and / or + a true/false or boolean property);\n // a number extends with an arithmetic term (+ − × ÷ + a number or numeric property).\n const boolean = opts.addTerm === \"boolean\";\n const ops: BinaryOp[] = boolean ? [\"and\", \"or\"] : ARITHMETIC_OPS;\n const operandType = boolean ? \"boolean\" : \"number\";\n return button(\"exed-add exed-addterm\", \"+ term\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n let op: BinaryOp = ops[0]!;\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add term\"]));\n const commit = (operand: ExprNode): void => { ctx.apply(binary(op, ctx.getAst(), operand)); close(); };\n const opRow = el(\"div\", \"exed-field-row\");\n const drawOps = (): void => {\n opRow.replaceChildren();\n for (const o of ops) opRow.append(button(`exed-opt${o === op ? \" sel\" : \"\"}`, BINARY_LABEL[o], () => { op = o; drawOps(); }));\n };\n drawOps();\n wrap.append(opRow);\n if (boolean) {\n const row = el(\"div\", \"exed-field-row\");\n row.append(button(\"exed-opt\", \"true\", () => commit(boolLit(true))), button(\"exed-opt\", \"false\", () => commit(boolLit(false))));\n wrap.append(row);\n } else {\n wrap.append(textField({\n caption: \"by\", placeholder: \"e.g. 1\",\n validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)),\n onCommit: (v) => commit(numLit(Number(v))),\n }));\n }\n wrap.append(button(\"exed-opt\", \"…or a property\", () => {\n ctx.openPopover(anchor, (c2) => propertyPicker(ctx, { accept: [operandType], onPick: (en) => { commit(scopedVar(en.scope, en.name)); c2(); } }));\n }));\n return wrap;\n });\n }, boolean ? \"add a logical term\" : \"add an arithmetic term\");\n }\n\n function messages(issues: ReturnType<typeof validateSource>[\"issues\"]): HTMLElement {\n const box = el(\"div\", \"exed-msgs\");\n for (const i of issues) {\n box.append(el(\"div\", `exed-msg exed-msg-${i.severity}`, [i.severity === \"error\" ? \"⚠ \" : \"△ \", i.message]));\n }\n return box;\n }\n\n render();\n return {\n setValue: (v) => { src = v ?? \"\"; render(); }, // text mode is host-driven; don't reset it here\n setText: (on) => { raw = on; render(); },\n destroy: () => { closePopover(); host.replaceChildren(); host.classList.remove(\"exed-root\"); },\n };\n}\n","// ---------------------------------------------------------------------------\n// The VALUE wizard: a small guided popover for picking the value of a `set`\n// target (or an `emit` argument), modelled on the storylets Outcomes\n// \"ChangeValueStep\". It picks ONE value - a property reference, or a type-\n// appropriate literal (number / text / true-false / enum) - and commits it.\n// No operator step: extending into `x + y` is done afterwards, optionally, via\n// the inline editor's \"+ term\" affordance (not a forced popup).\n//\n// Commits a name-form source string (`5`, `\"autumn\"`, `true`, `@gold`).\n// ---------------------------------------------------------------------------\n\nimport { el, button, textField } from \"./dom.js\";\nimport { propertyPicker } from \"./flat.js\";\nimport { refOf, type CatalogueEntry, type PropertyType } from \"./schema.js\";\nimport type { EditCtx } from \"./types.js\";\n\nexport interface ValueWizardOptions {\n catalogue: CatalogueEntry[];\n scopeOrder: string[];\n defaultScope: string;\n /** When known (a `set` target's declared type), the picker leads straight to that input. */\n expectedType?: PropertyType;\n expectedEnumValues?: string[];\n /** Receives the chosen value as name-form source. */\n onCommit: (src: string) => void;\n /** Optional cancel (the ✕ on the step). */\n onCancel?: () => void;\n}\n\nconst isIdent = (v: string): boolean => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(v);\n/** An enum / bare string commits unquoted only when it's a safe identifier, else JSON-quoted. */\nconst enumSrc = (v: string): string => (isIdent(v) ? v : JSON.stringify(v));\n\n/** Build the wizard UI into a fresh element (drive it via the host's popover). */\nexport function valueWizard(opts: ValueWizardOptions): HTMLElement {\n const host = el(\"div\", \"exed-vwiz\");\n // propertyPicker only reads catalogue / defaultScope / scopeOrder off the ctx.\n const pickCtx = { catalogue: opts.catalogue, defaultScope: opts.defaultScope, scopeOrder: opts.scopeOrder } as unknown as EditCtx;\n const optBtn = (label: string, onClick: () => void): HTMLButtonElement => button(\"exed-opt\", label, onClick);\n\n const head = (title: string): HTMLElement => {\n const h = el(\"div\", \"exed-vwiz-head\");\n if (opts.onCancel) h.append(button(\"exed-vwiz-back\", \"✕\", opts.onCancel, \"Cancel\"));\n h.append(el(\"span\", \"exed-vwiz-title\", [title]));\n return h;\n };\n\n host.append(head(\"Pick a value\"));\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n\n // Lead straight to a known target type's input; otherwise show the kind chooser.\n let kind: \"menu\" | \"property\" | \"number\" | \"text\" | \"bool\" | \"enum\" =\n opts.expectedType === \"number\" ? \"number\" : opts.expectedType === \"string\" ? \"text\"\n : opts.expectedType === \"boolean\" ? \"bool\"\n : opts.expectedType === \"enum\" && opts.expectedEnumValues?.length ? \"enum\" : \"menu\";\n\n const draw = (): void => {\n body.replaceChildren();\n const other = (): HTMLButtonElement => button(\"exed-vwiz-other\", \"↩ a different kind\", () => { kind = \"menu\"; draw(); });\n switch (kind) {\n case \"menu\":\n body.append(optBtn(\"A property…\", () => { kind = \"property\"; draw(); }));\n body.append(optBtn(\"A number\", () => { kind = \"number\"; draw(); }));\n body.append(optBtn(\"Text\", () => { kind = \"text\"; draw(); }));\n body.append(optBtn(\"True / False\", () => { kind = \"bool\"; draw(); }));\n if (opts.expectedEnumValues?.length) body.append(optBtn(\"A listed value\", () => { kind = \"enum\"; draw(); }));\n break;\n case \"property\":\n body.append(propertyPicker(pickCtx, { onPick: (e) => opts.onCommit(refOf(e, opts.defaultScope)) }));\n body.append(other());\n break;\n case \"number\":\n body.append(textField({ caption: \"Number\", placeholder: \"e.g. 5 or 0.5\", validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)), onCommit: (v) => opts.onCommit(String(Number(v))) }));\n body.append(other());\n break;\n case \"text\":\n body.append(textField({ caption: \"Text\", placeholder: \"e.g. autumn\", onCommit: (v) => opts.onCommit(JSON.stringify(v)) }));\n body.append(other());\n break;\n case \"bool\": {\n const row = el(\"div\", \"exed-field-row\");\n row.append(optBtn(\"true\", () => opts.onCommit(\"true\")), optBtn(\"false\", () => opts.onCommit(\"false\")));\n body.append(row, other());\n break;\n }\n case \"enum\":\n for (const v of opts.expectedEnumValues ?? []) body.append(optBtn(v, () => opts.onCommit(enumSrc(v))));\n body.append(other());\n break;\n }\n };\n draw();\n return host;\n}\n","// ---------------------------------------------------------------------------\n// mountEffectsEditor — a framework-neutral visual editor for a LIST of effects\n// (outcomes). Each effect is either a `set` (assign a property a value) or an\n// `emit` (raise a host event with argument expressions). It is the sibling of\n// mountExpressionEditor: where that edits one boolean condition, this edits an\n// ordered list of mutations. Every value / argument is itself a full pill/tree\n// expression, edited by an embedded mountExpressionEditor (flat mode) — so the\n// \"visual-and-text\" richness of the condition editor carries straight through.\n//\n// Modelled on the storylets outcome editor (the same system): pick a target\n// property, then refine its value by clicking pills. `emit` adds host events\n// on top (storylets had no equivalent).\n// ---------------------------------------------------------------------------\n\nimport type { Dialect, ExpressionSchema } from \"@wildwinter/expr\";\nimport { el, button, openPopover, type Popover } from \"./dom.js\";\nimport {\n type CatalogueEntry, type PropertyType,\n filterCatalogue, searchCatalogue, groupByScope, displayName, refOf,\n choicesOf,\n} from \"./schema.js\";\nimport type { FunctionTemplateSpec } from \"./types.js\";\nimport { valueWizard } from \"./valuewizard.js\";\nimport { mountExpressionEditor, type ExpressionEditorHandle } from \"./mount.js\";\n\n/** One effect in name-form: a property assignment or a host event. Mirrors the\n * host's own Effect model (patter's `set` / `emit`) so it round-trips verbatim. */\nexport type EditorEffect =\n | { kind: \"set\"; target: string; value: string }\n | { kind: \"emit\"; event: string; args: string[] };\n\nexport interface EffectsEditorOptions {\n /** The current effect list (edited in place via onChange). */\n effects: EditorEffect[];\n schema: ExpressionSchema;\n dialect: Dialect;\n /** Properties the target picker + value editors offer. */\n catalogue: CatalogueEntry[];\n scopeOrder?: string[];\n /** Dialect clause templates passed through to each value editor. */\n functions?: FunctionTemplateSpec[];\n /** Known host event names to suggest when adding an `emit` (optional). */\n events?: string[];\n /** Offer the \"+ emit event\" affordance (default true). A host whose effects are SET-ONLY (e.g.\n * patter, where host events ride on gameData, not effects) passes false to hide it entirely. */\n allowEmit?: boolean;\n /** Start each inline value editor in raw-text mode (host's global \"show as text\" toggle drives this). */\n text?: boolean;\n /** Where to append popover micro-editors (default document.body). Pass a container\n * inside a focus-trapping dialog so popovers do not dismiss it. Threaded to the\n * target/event pickers here and to every inline value editor. */\n popoverContainer?: HTMLElement;\n /** Emitted on every structural / value edit with the whole new list. */\n onChange: (effects: EditorEffect[]) => void;\n}\n\nexport interface EffectsEditorHandle {\n setValue(effects: EditorEffect[]): void;\n /** Flip every inline value editor between pills and raw text (host's global toggle). */\n setText(on: boolean): void;\n destroy(): void;\n}\n\n// --- pure list operations (exported for testing) ---------------------------\n\nconst clone = (list: EditorEffect[]): EditorEffect[] => list.map((e) =>\n e.kind === \"set\" ? { ...e } : { ...e, args: [...e.args] });\n\nexport const addSet = (list: EditorEffect[], target: string, value: string): EditorEffect[] =>\n [...clone(list), { kind: \"set\", target, value }];\n\nexport const addEmit = (list: EditorEffect[], event: string): EditorEffect[] =>\n [...clone(list), { kind: \"emit\", event, args: [] }];\n\nexport const removeAt = (list: EditorEffect[], i: number): EditorEffect[] =>\n clone(list).filter((_, idx) => idx !== i);\n\nexport function moveAt(list: EditorEffect[], i: number, dir: -1 | 1): EditorEffect[] {\n const next = clone(list);\n const j = i + dir;\n if (j < 0 || j >= next.length) return next;\n [next[i], next[j]] = [next[j]!, next[i]!];\n return next;\n}\n\nexport function updateAt(list: EditorEffect[], i: number, patch: Partial<EditorEffect>): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur) return next;\n next[i] = { ...cur, ...patch } as EditorEffect;\n return next;\n}\n\nexport function setArgAt(list: EditorEffect[], i: number, argIdx: number, value: string): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args[argIdx] = value;\n return next;\n}\n\nexport function addArg(list: EditorEffect[], i: number, value = \"0\"): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args.push(value);\n return next;\n}\n\nexport function removeArgAt(list: EditorEffect[], i: number, argIdx: number): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args.splice(argIdx, 1);\n return next;\n}\n\n/** A sensible starting value-expression for a freshly targeted property. Literals\n * are seeded so the value editor opens on an editable pill, never the empty state.\n *\n * A QUALITY seeds to `advance(<ref>)` when the target's ref is known: moving to the next stage is\n * what outcomes on a ladder overwhelmingly do, and it is the form that keeps a story insertion-safe\n * (it names no destination, so a stage added later routes through it). Pass no ref and it falls back\n * to the first stage as a literal, which the author can still swap to `advance(...)`. */\nexport function seedValueSrc(type: PropertyType, values?: string[], ref?: string): string {\n switch (type) {\n case \"boolean\": return \"true\";\n case \"number\": return \"0\";\n case \"enum\": return JSON.stringify(values?.[0] ?? \"\");\n case \"quality\": return ref ? `advance(${ref})` : JSON.stringify(values?.[0] ?? \"\");\n case \"string\": return '\"\"';\n default: return \"0\"; // flags / unknown — user refines via pills or raw text\n }\n}\n\n// --- mount -----------------------------------------------------------------\n\nexport function mountEffectsEditor(host: HTMLElement, opts: EffectsEditorOptions): EffectsEditorHandle {\n const defaultScope = opts.dialect.defaultScope;\n let effects = clone(opts.effects ?? []);\n let textMode = opts.text ?? false; // raw-text view for every inline value editor (host-driven)\n let popover: Popover | null = null;\n const inner: ExpressionEditorHandle[] = []; // inline value / arg editors, destroyed on re-render\n host.classList.add(\"exed-root\", \"exed-effects-root\");\n\n const closePopover = (): void => { popover?.close(); popover = null; };\n const commit = (next: EditorEffect[]): void => { effects = clone(next); opts.onChange(effects); render(); };\n\n /** Open the guided value wizard anchored to `anchor`; commit its built source. */\n const openValueWizard = (anchor: HTMLElement, expected: CatalogueEntry | undefined, onCommit: (src: string) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => valueWizard({\n catalogue: opts.catalogue, scopeOrder: opts.scopeOrder ?? [], defaultScope,\n ...(expected?.type ? { expectedType: expected.type } : {}),\n ...(expected?.enumValues ? { expectedEnumValues: expected.enumValues } : {}),\n onCommit: (src) => { onCommit(src); close(); },\n onCancel: close,\n }), { container: opts.popoverContainer });\n };\n\n /** The declared type of a `set` target (resolved from the catalogue by its ref), so the value editor\n * offers the right \"+ term\" extension (arithmetic for numbers, logical for booleans, none else). */\n const targetType = (target: string): PropertyType | undefined =>\n opts.catalogue.find((e) => refOf(e, defaultScope) === target)?.type;\n\n /** The committed value as an INLINE editable pill editor (click pills to edit; \"+ term\" to extend) -\n * the storylets ExpressionField model. The initial value is picked via the wizard; this edits it.\n * `addTerm` is type-led: numbers extend arithmetically, booleans logically, others not at all. */\n const valueDisplay = (value: string, onChange: (src: string) => void, type?: PropertyType): HTMLElement => {\n const sub = el(\"div\", \"exed-effect-value\");\n const addTerm = type === \"number\" ? \"arithmetic\" : type === \"boolean\" ? \"boolean\" : undefined;\n inner.push(mountExpressionEditor(sub, {\n value, schema: opts.schema, dialect: opts.dialect, catalogue: opts.catalogue,\n scopeOrder: opts.scopeOrder, functions: opts.functions, mode: \"flat\",\n ...(addTerm ? { addTerm } : {}),\n ...(opts.popoverContainer ? { popoverContainer: opts.popoverContainer } : {}),\n text: textMode, onChange,\n }));\n return sub;\n };\n\n /** The target-property picker popover (reuses the catalogue helpers). */\n const pickTarget = (anchor: HTMLElement, accept: PropertyType[] | undefined, onPick: (e: CatalogueEntry) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-picker\");\n const search = el(\"input\", \"exed-input\");\n search.type = \"text\"; search.placeholder = \"Search properties…\";\n const list = el(\"div\", \"exed-picker-list\");\n const pool = filterCatalogue(opts.catalogue, { acceptTypes: accept });\n const draw = (): void => {\n list.replaceChildren();\n const groups = groupByScope(searchCatalogue(pool, search.value, defaultScope), opts.scopeOrder ?? []);\n if (!groups.length) { list.append(el(\"div\", \"exed-hint\", [\"No matching properties.\"])); return; }\n for (const g of groups) {\n list.append(el(\"div\", \"exed-picker-scope\", [g.scope]));\n for (const e of g.entries) {\n const row = button(\"exed-opt\", \"\", () => { onPick(e); close(); });\n row.append(el(\"span\", \"exed-opt-name\", [displayName(e, defaultScope)]), el(\"span\", \"exed-opt-type\", [e.type]));\n if (e.purpose) row.append(el(\"span\", \"exed-opt-purpose\", [e.purpose]));\n list.append(row);\n }\n }\n };\n search.addEventListener(\"input\", draw);\n draw();\n wrap.append(search, list);\n setTimeout(() => search.focus(), 0);\n return wrap;\n }, { container: opts.popoverContainer });\n };\n\n const iconBtn = (glyph: string, title: string, onClick: () => void, danger = false): HTMLButtonElement =>\n button(`exed-eff-icon${danger ? \" danger\" : \"\"}`, glyph, onClick, title);\n\n function setRow(eff: Extract<EditorEffect, { kind: \"set\" }>, i: number): HTMLElement {\n // One line, storylets-style: [target] = [value inline] [actions].\n const row = el(\"div\", \"exed-effect exed-effect-set\");\n // Target pill — click to repick (re-seeds the value to match the new type).\n const targetBtn = button(\"exed-pill exed-pill-prop\", eff.target || \"(pick property)\", (e) => {\n pickTarget(e.currentTarget as HTMLElement, undefined, (entry) => {\n const ref = refOf(entry, defaultScope);\n commit(updateAt(effects, i, { target: ref, value: seedValueSrc(entry.type, choicesOf(entry), ref) }));\n });\n }, \"change the target property\");\n row.append(targetBtn, el(\"span\", \"exed-effect-eq\", [\"=\"]));\n // Value — an inline pill editor; capture its edits WITHOUT a re-render (it owns its own DOM). The\n // \"+ term\" extension follows the target's declared type (arithmetic / logical / none).\n row.append(valueDisplay(eff.value, (src) => { effects = updateAt(effects, i, { value: src }); opts.onChange(effects); }, targetType(eff.target)));\n row.append(rowActions(i));\n return row;\n }\n\n function emitRow(eff: Extract<EditorEffect, { kind: \"emit\" }>, i: number): HTMLElement {\n const row = el(\"div\", \"exed-effect exed-effect-emit\");\n const head = el(\"div\", \"exed-effect-head\");\n head.append(el(\"span\", \"exed-effect-kw\", [\"emit\"]));\n // The event name is free author text (a label for the host), not a defined dialect function -\n // so it reads as a STRING, not a function call.\n const eventBtn = button(\"exed-pill exed-pill-event\", eff.event ? `\"${eff.event}\"` : \"(name)\", (e) => {\n editEvent(e.currentTarget as HTMLElement, eff.event, (name) => commit(updateAt(effects, i, { event: name })));\n }, \"name the host event\");\n head.append(eventBtn);\n head.append(rowActions(i));\n row.append(head);\n // Arguments — each its own value editor; \"+ arg\" / remove per slot.\n const args = el(\"div\", \"exed-effect-args\");\n eff.args.forEach((a, ai) => {\n const slot = el(\"div\", \"exed-effect-arg\");\n slot.append(valueDisplay(a, (src) => { effects = setArgAt(effects, i, ai, src); opts.onChange(effects); }));\n slot.append(iconBtn(\"✕\", \"remove argument\", () => commit(removeArgAt(effects, i, ai)), true));\n args.append(slot);\n });\n args.append(button(\"exed-eff-add\", \"+ argument\", (e) =>\n openValueWizard(e.currentTarget as HTMLElement, undefined, (src) => commit(addArg(effects, i, src)))));\n row.append(args);\n return row;\n }\n\n /** Event-name editor: a text field, optionally listing known events as quick picks. */\n const editEvent = (anchor: HTMLElement, current: string, onName: (name: string) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-picker\");\n const input = el(\"input\", \"exed-input\");\n input.type = \"text\"; input.value = current; input.placeholder = \"event name\";\n const apply = (): void => { const v = input.value.trim(); if (v) onName(v); close(); };\n input.addEventListener(\"keydown\", (e) => { if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); apply(); } });\n wrap.append(input);\n for (const name of opts.events ?? []) {\n if (name === current) continue;\n wrap.append(button(\"exed-opt\", name, () => { onName(name); close(); }));\n }\n wrap.append(button(\"exed-btn primary\", \"Apply\", apply));\n setTimeout(() => input.focus(), 0);\n return wrap;\n }, { container: opts.popoverContainer });\n };\n\n const rowActions = (i: number): HTMLElement => {\n const acts = el(\"div\", \"exed-effect-acts\");\n if (i > 0) acts.append(iconBtn(\"↑\", \"move up\", () => commit(moveAt(effects, i, -1))));\n if (i < effects.length - 1) acts.append(iconBtn(\"↓\", \"move down\", () => commit(moveAt(effects, i, 1))));\n acts.append(iconBtn(\"✕\", \"remove effect\", () => commit(removeAt(effects, i)), true));\n return acts;\n };\n\n function render(): void {\n closePopover();\n for (const h of inner.splice(0)) h.destroy(); // tear down the previous value editors\n host.replaceChildren();\n\n const listEl = el(\"div\", \"exed-effect-list\");\n if (!effects.length) listEl.append(el(\"div\", \"exed-effect-empty\", [\"No effects yet.\"]));\n effects.forEach((eff, i) => listEl.append(eff.kind === \"set\" ? setRow(eff, i) : emitRow(eff, i)));\n host.append(listEl);\n\n const bar = el(\"div\", \"exed-effect-addbar\");\n bar.append(button(\"exed-eff-add\", \"+ set property\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n // Pick the target property, then build its value with the guided wizard (type-aware).\n pickTarget(anchor, undefined, (entry) =>\n openValueWizard(anchor, entry, (src) => commit(addSet(effects, refOf(entry, defaultScope), src))));\n }));\n // Emit needs a name first: open the event-name wizard immediately; only add the effect once named.\n // Hidden when the host opts out of emit (set-only effects, e.g. patter - emission rides on gameData).\n if (opts.allowEmit !== false) {\n bar.append(button(\"exed-eff-add\", \"+ emit event\", (e) =>\n editEvent(e.currentTarget as HTMLElement, \"\", (name) => commit(addEmit(effects, name)))));\n }\n host.append(bar);\n }\n\n render();\n return {\n setValue: (next) => { effects = clone(next ?? []); render(); },\n // Flip every live inline value editor in place — keeps any open target/wizard popover alive.\n setText: (on) => { textMode = on; for (const h of inner) h.setText(on); },\n destroy: () => { closePopover(); for (const h of inner.splice(0)) h.destroy(); host.replaceChildren(); host.classList.remove(\"exed-root\", \"exed-effects-root\"); },\n };\n}\n","// ---------------------------------------------------------------------------\n// Read-only PILL previews of a condition / an effects list, for surfaces that\n// show the value compactly (e.g. an inspector row) but want the same pill\n// rendering as the editor - so non-coders read pills everywhere, not name-form\n// text. The pills are non-interactive (pointer-events suppressed in CSS), so a\n// click falls through to whatever wraps the preview (typically a \"open editor\"\n// button). The host keeps a `</>` text fallback for the raw name-form.\n// ---------------------------------------------------------------------------\n\nimport type { Dialect, ExprNode, ExpressionSchema } from \"@wildwinter/expr\";\nimport { validateSource } from \"./validate.js\";\nimport { renderNode } from \"./flat.js\";\nimport { el, openPopover } from \"./dom.js\";\nimport type { CatalogueEntry } from \"./schema.js\";\nimport type { EditCtx } from \"./types.js\";\nimport type { EditorEffect } from \"./effects.js\";\n\nexport interface PreviewOptions {\n schema: ExpressionSchema;\n dialect: Dialect;\n catalogue: CatalogueEntry[];\n scopeOrder?: string[];\n /** Resolve a node id to a readable label for seen()/visits() node pills. */\n nodeLabel?: (id: string) => string;\n /** Host actions for a property pill (e.g. \"Go to definition\"). When set, the\n * preview becomes right-click interactive on property pills (left-click still\n * falls through to the host); otherwise the preview is fully non-interactive. */\n propertyActions?(ref: { scope: string; name: string }): Array<{ label: string; run: () => void }>;\n /** Where the property menu mounts (default document.body). */\n popoverContainer?: HTMLElement;\n}\n\n/** A frozen edit-context: enough for `renderNode` to draw pills, but every editing hook is a no-op\n * (the preview is non-interactive for left-click). `pickNode` is stubbed so node-ref args still\n * render as labelled node pills. When `propertyActions` is set, `openMenu` opens a real popover so\n * the property right-click menu works while left-click editing stays inert (openPopover no-op). */\nfunction frozenCtx(src: string, o: PreviewOptions): { ctx: EditCtx; ast: ExprNode | null } {\n const v = validateSource(src, o.schema, o.dialect);\n const ctx: EditCtx = {\n schema: o.schema, dialect: o.dialect, defaultScope: o.dialect.defaultScope,\n catalogue: o.catalogue, scopeOrder: o.scopeOrder ?? [], functions: [],\n compact: true,\n byPath: v.byPath,\n getAst: () => v.ast as ExprNode,\n apply: () => {},\n openPopover: () => {},\n pickNode: () => {}, // enables labelled node pills; never fires (preview is read-only)\n ...(o.nodeLabel ? { nodeLabel: o.nodeLabel } : {}),\n ...(o.propertyActions ? {\n propertyActions: o.propertyActions,\n openMenu: (anchor, render) => { openPopover(anchor, render, { container: o.popoverContainer }); },\n } : {}),\n };\n return { ctx, ast: v.ast };\n}\n\n/** Pills for one expression string (a condition, or an effect's value / arg). Unparseable -> raw text. */\nfunction exprPills(src: string, o: PreviewOptions): HTMLElement {\n const { ctx, ast } = frozenCtx(src, o);\n return ast ? renderNode(ast, [], ctx) : el(\"span\", \"exed-preview-raw\", [src]);\n}\n\n/** Read-only pill strip for a condition (name-form). Empty/unparseable is the caller's concern; a\n * non-empty unparseable string falls back to its raw text. */\nexport function renderConditionPreview(src: string, o: PreviewOptions): HTMLElement {\n // With propertyActions the preview is right-click interactive (a class enables\n // pointer events on property pills); without, it stays fully non-interactive.\n const cls = o.propertyActions ? \"exed-preview exed-preview-interactive\" : \"exed-preview\";\n return el(\"div\", cls, [exprPills(src, o)]);\n}\n\n/** Read-only pill strip for an effects list: each `set` as `target = value`, each `emit` as\n * `emit event(args…)`, one per line. */\nexport function renderEffectsPreview(effects: EditorEffect[], o: PreviewOptions): HTMLElement {\n const wrap = el(\"div\", \"exed-preview exed-preview-effects\");\n for (const eff of effects) {\n const row = el(\"div\", \"exed-preview-eff\");\n if (eff.kind === \"set\") {\n row.append(el(\"span\", \"exed-pill exed-pill-prop\", [eff.target || \"(property)\"]));\n row.append(el(\"span\", \"exed-effect-eq\", [\"=\"]));\n row.append(exprPills(eff.value, o));\n } else {\n row.append(el(\"span\", \"exed-effect-kw\", [\"emit\"]));\n row.append(el(\"span\", \"exed-pill exed-pill-event\", [eff.event ? `\"${eff.event}\"` : \"(name)\"]));\n row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n eff.args.forEach((a, i) => {\n if (i > 0) row.append(el(\"span\", \"exed-comma\", [\", \"]));\n row.append(exprPills(a, o));\n });\n row.append(el(\"span\", \"exed-paren\", [\")\"]));\n }\n wrap.append(row);\n }\n return wrap;\n}\n"]}
1
+ {"version":3,"sources":["../src/ast.ts","../src/tree.ts","../src/ops.ts","../src/schema.ts","../src/validate.ts","../src/dom.ts","../src/flat.ts","../src/clausewizard.ts","../src/treeview.ts","../src/mount.ts","../src/valuewizard.ts","../src/effects.ts","../src/preview.ts"],"names":["row","rowActions"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// AST path mutation — pure functions over `@wildwinter/expr`'s ExprNode, with\n// structural sharing (only the spine from root to the changed node is rebuilt;\n// sibling subtrees are reused by reference). These are the substrate the visual\n// editor mutates the tree with; ported from the storylets editor's astMutation.\n//\n// Path encoding (matches the validator's AstPath): field-name segments with a\n// numeric index after \"args\".\n// binary.left -> [\"left\"]\n// binary.right.args[0] -> [\"right\", \"args\", 0]\n// top-level node -> []\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\n\n// --- small node constructors (one place for the node shapes) ---------------\nexport const boolLit = (value: boolean): ExprNode => ({ kind: \"bool\", value });\nexport const numLit = (value: number): ExprNode => ({ kind: \"number\", value });\nexport const strLit = (value: string): ExprNode => ({ kind: \"string\", value });\nexport const scopedVar = (scope: string, name: string): ExprNode => ({ kind: \"scopedvar\", scope, name: name.toLowerCase() });\nexport const binary = (op: BinaryOp, left: ExprNode, right: ExprNode): ExprNode => ({ kind: \"binary\", op, left, right });\nexport const notNode = (operand: ExprNode): ExprNode => ({ kind: \"unary\", op: \"not\", operand });\nexport const callNode = (name: string, args: ExprNode[]): ExprNode => ({ kind: \"call\", name, args });\nexport const flagDelta = (sign: \"+\" | \"-\", name: string): ExprNode => ({ kind: \"flagdelta\", sign, name });\n\n/** A no-op sentinel: `true and X === X`, `false or X === X`, so a half-filled slot is inert. */\nexport const placeholderForOp = (op: \"and\" | \"or\"): ExprNode => boolLit(op === \"and\");\nexport const isPlaceholderForOp = (node: ExprNode, op: \"and\" | \"or\"): boolean =>\n node.kind === \"bool\" && node.value === (op === \"and\");\n\nconst COMPARISON = new Set<BinaryOp>([\"==\", \"!=\", \">\", \">=\", \"<\", \"<=\"]);\nexport const isComparisonOp = (op: BinaryOp): boolean => COMPARISON.has(op);\n\n// --- read --------------------------------------------------------------------\n\n/** The node at `path`, or null if any segment fails to resolve. */\nexport function getNodeAt(ast: ExprNode, path: AstPath): ExprNode | null {\n let node: ExprNode | null = ast;\n for (let i = 0; i < path.length; i++) {\n if (!node) return null;\n const seg = path[i];\n if (node.kind === \"binary\" && seg === \"left\") node = node.left;\n else if (node.kind === \"binary\" && seg === \"right\") node = node.right;\n else if (node.kind === \"unary\" && seg === \"operand\") node = node.operand;\n else if (node.kind === \"call\" && seg === \"args\") { node = node.args[path[++i] as number] ?? null; }\n else return null;\n }\n return node;\n}\n\n// --- write (structural sharing) ---------------------------------------------\n\n/** Replace the node at `path` with `next`. `path.length === 0` returns `next`. */\nexport function setNodeAt(ast: ExprNode, path: AstPath, next: ExprNode): ExprNode {\n if (path.length === 0) return next;\n const [seg, ...rest] = path;\n if (ast.kind === \"binary\" && seg === \"left\") return { ...ast, left: setNodeAt(ast.left, rest, next) };\n if (ast.kind === \"binary\" && seg === \"right\") return { ...ast, right: setNodeAt(ast.right, rest, next) };\n if (ast.kind === \"unary\" && seg === \"operand\") return { ...ast, operand: setNodeAt(ast.operand, rest, next) };\n if (ast.kind === \"call\" && seg === \"args\") {\n const idx = rest[0] as number;\n const args = ast.args.map((a, i) => (i === idx ? setNodeAt(a, rest.slice(1), next) : a));\n return { ...ast, args };\n }\n throw new Error(`cannot descend into ${ast.kind} via '${String(seg)}'`);\n}\n\n/**\n * Delete the node at `path`, collapsing its parent:\n * - binary parent -> the surviving sibling replaces the parent (`A and B`, del B -> `A`)\n * - unary parent -> the operand replaces the unary (strips the wrapper)\n * - call parent -> the arg is spliced out\n * Deleting the root (`path === []`) returns null (the caller clears the expression).\n */\nexport function deleteAt(ast: ExprNode, path: AstPath): ExprNode | null {\n if (path.length === 0) return null;\n const last = path[path.length - 1];\n // call arg: [..., \"args\", index]\n if (typeof last === \"number\" && path[path.length - 2] === \"args\") {\n const callPath = path.slice(0, -2);\n const call = getNodeAt(ast, callPath);\n if (call?.kind !== \"call\") return ast;\n return setNodeAt(ast, callPath, { ...call, args: call.args.filter((_, i) => i !== last) });\n }\n const parentPath = path.slice(0, -1);\n const parent = getNodeAt(ast, parentPath);\n if (parent?.kind === \"binary\") {\n const survivor = last === \"left\" ? parent.right : parent.left;\n return setNodeAt(ast, parentPath, survivor);\n }\n if (parent?.kind === \"unary\") {\n return setNodeAt(ast, parentPath, parent.operand);\n }\n return ast; // nothing sensible to collapse\n}\n\n/** Wrap the node at `path` in a new `binary(op, …)`, the clause on `side`. */\nexport function insertSiblingClauseAt(\n ast: ExprNode, path: AstPath, op: \"and\" | \"or\", side: \"left\" | \"right\", clause: ExprNode,\n): ExprNode {\n const target = getNodeAt(ast, path);\n if (!target) return ast;\n const wrapped = side === \"right\" ? binary(op, target, clause) : binary(op, clause, target);\n return setNodeAt(ast, path, wrapped);\n}\n\n/** True iff the node at `path` is the operand of a `not`. */\nexport function isWrappedInNot(ast: ExprNode, path: AstPath): boolean {\n if (path[path.length - 1] !== \"operand\") return false;\n const parent = getNodeAt(ast, path.slice(0, -1));\n return parent?.kind === \"unary\" && parent.op === \"not\";\n}\n\n/** Wrap the node at `path` in `not(…)`. */\nexport function wrapInNotAt(ast: ExprNode, path: AstPath): ExprNode {\n const target = getNodeAt(ast, path);\n return target ? setNodeAt(ast, path, notNode(target)) : ast;\n}\n\n/** Add a `not` if absent, strip it if present. */\nexport function toggleNotAt(ast: ExprNode, path: AstPath): ExprNode {\n if (isWrappedInNot(ast, path)) {\n const inner = getNodeAt(ast, path);\n return inner ? setNodeAt(ast, path.slice(0, -1), inner) : ast;\n }\n return wrapInNotAt(ast, path);\n}\n\n/**\n * If the node at `path` is one operand of an equality comparison (`==` / `!=`)\n * whose OTHER operand is a property reference, return that property — so a string\n * literal can offer the property's enum values. Null otherwise.\n */\nexport function findEnumPeer(ast: ExprNode, path: AstPath): { scope: string; name: string } | null {\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return null;\n const parent = getNodeAt(ast, path.slice(0, -1));\n if (parent?.kind !== \"binary\" || (parent.op !== \"==\" && parent.op !== \"!=\")) return null;\n const other = last === \"left\" ? parent.right : parent.left;\n return other.kind === \"scopedvar\" ? { scope: other.scope, name: other.name } : null;\n}\n\n/**\n * DFS for the first unfilled slot in a template-inserted clause: an empty string\n * literal (a tag / value the author still has to set) or an unnamed flag delta.\n * Returns its path relative to `node`, or null when the clause is complete —\n * wizard-built clauses have no empty slots, so they never auto-open anything.\n */\nexport function firstEmptyLeafPath(node: ExprNode, base: AstPath = []): AstPath | null {\n switch (node.kind) {\n case \"string\": return node.value === \"\" ? base : null;\n case \"flagdelta\": return node.name === \"\" ? base : null;\n case \"unary\": return firstEmptyLeafPath(node.operand, [...base, \"operand\"]);\n case \"binary\":\n return firstEmptyLeafPath(node.left, [...base, \"left\"]) ?? firstEmptyLeafPath(node.right, [...base, \"right\"]);\n case \"call\": {\n for (let i = 0; i < node.args.length; i++) {\n const p = firstEmptyLeafPath(node.args[i]!, [...base, \"args\", i]);\n if (p) return p;\n }\n return null;\n }\n default: return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// The AND/OR tree model. The ExprNode stays the source of truth; the renderable\n// row tree is DERIVED on each render (never stored). Same-operator left-folded\n// binary chains collapse to one container with N children; a leading `not`\n// surfaces as a per-row `negated` flag. Ported from the storylets tree model.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\nimport { binary, isComparisonOp, isPlaceholderForOp, placeholderForOp, setNodeAt, getNodeAt } from \"./ast.js\";\n\nexport type TreeRow =\n | { kind: \"container\"; op: \"and\" | \"or\"; negated: boolean; children: TreeRow[]; path: AstPath; chainPath: AstPath }\n | { kind: \"comparison\"; left: ExprNode; op: BinaryOp; right: ExprNode; negated: boolean; path: AstPath; contentPath: AstPath }\n | { kind: \"wrapped\"; node: ExprNode; negated: boolean; path: AstPath; contentPath: AstPath };\n\nconst isLogical = (n: ExprNode | null): n is ExprNode & { kind: \"binary\"; op: \"and\" | \"or\" } =>\n n != null && n.kind === \"binary\" && (n.op === \"and\" || n.op === \"or\");\n\n/** Flatten a same-operator left-folded chain into its leaf rows, in document order. */\nfunction collectChain(node: ExprNode, path: AstPath, op: \"and\" | \"or\"): TreeRow[] {\n if (node.kind === \"binary\" && node.op === op) {\n return [\n ...collectChain(node.left, [...path, \"left\"], op),\n ...collectChain(node.right, [...path, \"right\"], op),\n ];\n }\n return [astToTree(node, path)];\n}\n\nfunction containerRow(chain: ExprNode & { kind: \"binary\"; op: \"and\" | \"or\" }, chainPath: AstPath, negated: boolean, path: AstPath): TreeRow {\n return {\n kind: \"container\", op: chain.op, negated, path, chainPath,\n children: [\n ...collectChain(chain.left, [...chainPath, \"left\"], chain.op),\n ...collectChain(chain.right, [...chainPath, \"right\"], chain.op),\n ],\n };\n}\n\n/** Derive the renderable row for `node` (at `path` in the whole AST). */\nexport function astToTree(node: ExprNode, path: AstPath = []): TreeRow {\n // 1/2. AND/OR container (optionally negated).\n if (node.kind === \"unary\" && node.op === \"not\" && isLogical(node.operand)) {\n return containerRow(node.operand, [...path, \"operand\"], true, path);\n }\n if (isLogical(node)) return containerRow(node, path, false, path);\n\n // 3/4. Comparison (optionally negated).\n if (node.kind === \"unary\" && node.op === \"not\" && node.operand.kind === \"binary\" && isComparisonOp(node.operand.op)) {\n const inner = node.operand;\n return { kind: \"comparison\", left: inner.left, op: inner.op, right: inner.right, negated: true, path, contentPath: [...path, \"operand\"] };\n }\n if (node.kind === \"binary\" && isComparisonOp(node.op)) {\n return { kind: \"comparison\", left: node.left, op: node.op, right: node.right, negated: false, path, contentPath: path };\n }\n\n // 5. Negated anything else.\n if (node.kind === \"unary\" && node.op === \"not\") {\n return { kind: \"wrapped\", node: node.operand, negated: true, path, contentPath: [...path, \"operand\"] };\n }\n\n // 6. Wrapped: calls, arithmetic, a bare boolean var, a literal.\n return { kind: \"wrapped\", node, negated: false, path, contentPath: path };\n}\n\n// --- container mutations -----------------------------------------------------\n\n/** Append `clause` to the chain at `chainPath` (left-folded; inherits the chain op, default \"and\"). */\nexport function addChildToContainer(ast: ExprNode, chainPath: AstPath, clause: ExprNode): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!node) return ast;\n const op: \"and\" | \"or\" = isLogical(node) ? node.op : \"and\";\n return setNodeAt(ast, chainPath, binary(op, node, clause));\n}\n\n/** Flip every binary in the chain at `chainPath` from its current op to `newOp` (placeholders re-polarise). */\nexport function flipContainerOp(ast: ExprNode, chainPath: AstPath, newOp: \"and\" | \"or\"): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!isLogical(node) || node.op === newOp) return ast;\n const oldOp = node.op;\n const flip = (n: ExprNode): ExprNode => {\n if (n.kind === \"binary\" && n.op === oldOp) return binary(newOp, flip(n.left), flip(n.right));\n if (isPlaceholderForOp(n, oldOp)) return placeholderForOp(newOp);\n return n;\n };\n return setNodeAt(ast, chainPath, flip(node));\n}\n\n/** Wrap the node at `path` in `not(…)`, or strip the `not` if it already is one. */\nexport function toggleContainerNot(ast: ExprNode, path: AstPath): ExprNode {\n const node = getNodeAt(ast, path);\n if (!node) return ast;\n if (node.kind === \"unary\" && node.op === \"not\") return setNodeAt(ast, path, node.operand);\n return setNodeAt(ast, path, { kind: \"unary\", op: \"not\", operand: node });\n}\n\n/** A new sub-group: its op is the OPPOSITE of the parent's (same-op would just flatten away). */\nexport function buildSubGroupClause(parentOp: \"and\" | \"or\", firstClause: ExprNode): ExprNode {\n const childOp: \"and\" | \"or\" = parentOp === \"and\" ? \"or\" : \"and\";\n return binary(childOp, firstClause, placeholderForOp(childOp));\n}\n\nconst chainNodes = (node: ExprNode, op: \"and\" | \"or\"): ExprNode[] =>\n node.kind === \"binary\" && node.op === op ? [...chainNodes(node.left, op), ...chainNodes(node.right, op)] : [node];\n\nconst buildChain = (op: \"and\" | \"or\", nodes: ExprNode[]): ExprNode =>\n nodes.reduce((acc, n) => (acc ? binary(op, acc, n) : n));\n\n/**\n * Walk one step up from `path` to its parent binary AND/OR; if the sibling at\n * that level is a placeholder for the parent's op, return the PARENT's path so a\n * downstream `deleteAt` collapses the whole half-filled sub-group rather than\n * leaving the placeholder (`true`/`false`) floating up as a bare clause. Returns\n * `path` unchanged otherwise. Ported from the storylets tree editor; fixes the\n * \"delete the last real clause of a temp OR/AND group leaves `false`\" case.\n */\nexport function redirectDeleteForPlaceholderSibling(ast: ExprNode, path: AstPath): AstPath {\n if (path.length === 0) return path;\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return path;\n const parentPath = path.slice(0, -1);\n const parent = getNodeAt(ast, parentPath);\n if (!isLogical(parent)) return path;\n const sibling = last === \"left\" ? parent.right : parent.left;\n return isPlaceholderForOp(sibling, parent.op) ? parentPath : path;\n}\n\n/** Move a child within its container chain (reorder). Out-of-range is a no-op. */\nexport function moveChildInContainer(ast: ExprNode, chainPath: AstPath, from: number, to: number): ExprNode {\n const node = getNodeAt(ast, chainPath);\n if (!isLogical(node)) return ast;\n const arr = chainNodes(node, node.op);\n if (from < 0 || to < 0 || from >= arr.length || to >= arr.length || from === to) return ast;\n const [moved] = arr.splice(from, 1);\n arr.splice(to, 0, moved!);\n return setNodeAt(ast, chainPath, buildChain(node.op, arr));\n}\n","// ---------------------------------------------------------------------------\n// Operator metadata: display labels, swap groups, precedence/parenthesisation,\n// and number formatting. Pure data + helpers shared by the renderer. Ported from\n// the storylets editor's pillStyles.\n// ---------------------------------------------------------------------------\n\nimport type { BinaryOp, UnaryOp, PropertyType } from \"@wildwinter/expr\";\n\n/** Human label for a binary operator (words for logical, glyphs for relational). */\nexport const BINARY_LABEL: Record<BinaryOp, string> = {\n and: \"AND\", or: \"OR\",\n \"==\": \"is\", \"!=\": \"≠\", \">\": \">\", \">=\": \"≥\", \"<\": \"<\", \"<=\": \"≤\",\n \"+\": \"+\", \"-\": \"−\", \"*\": \"×\", \"/\": \"÷\",\n};\n\nexport const UNARY_LABEL: Record<UnaryOp, string> = { not: \"NOT\", neg: \"−\" };\n\nexport const COMPARISON_OPS: BinaryOp[] = [\"==\", \"!=\", \">\", \">=\", \"<\", \"<=\"];\nexport const ARITHMETIC_OPS: BinaryOp[] = [\"+\", \"-\", \"*\", \"/\"];\n\n/** Property types a comparison clause can be built on - what the clause wizard offers as a left-hand\n * side. `flags` is absent because its clause is the flag-check wizard, not a comparison. */\nexport const COMPARABLE_TYPES: PropertyType[] = [\"boolean\", \"number\", \"string\", \"enum\", \"quality\"];\n\n/** The operators offered for a comparison on a property of this type.\n *\n * Ordered types get the full set; the rest get equality only. A QUALITY is ordered: its stages are a\n * ladder, and \"at or past a stage\" is the gate the type exists for, so offering it `==` alone (as the\n * editor did before 0.11.0) hides the feature behind hand-written source. */\nexport const comparisonOpsFor = (t: PropertyType): BinaryOp[] =>\n (t === \"number\" || t === \"quality\" ? COMPARISON_OPS : EQUALITY_OPS);\n\nexport const EQUALITY_OPS: BinaryOp[] = [\"==\", \"!=\"];\n\n/** The property types a comparison's RIGHT-hand side may be picked from, given the left's type.\n * A quality accepts only another quality: a plain string would name a stage nothing validates, and\n * comparing across two ladders is an error the engine raises by design. */\nexport const rhsTypesFor = (t: PropertyType): PropertyType[] =>\n t === \"number\" ? [\"number\"]\n : t === \"boolean\" ? [\"boolean\"]\n : t === \"quality\" ? [\"quality\"]\n : t === \"enum\" ? [\"enum\", \"string\"] : [\"string\", \"enum\"];\n\n/** The set of operators a given operator can be swapped to inline, or null if structural (and/or/not). */\nexport function opSwapGroup(op: BinaryOp): BinaryOp[] | null {\n if (COMPARISON_OPS.includes(op)) return COMPARISON_OPS;\n if (ARITHMETIC_OPS.includes(op)) return ARITHMETIC_OPS;\n return null; // and / or are structural (flipped at the container level)\n}\n\n/** Binding precedence (higher binds tighter) — for minimal parenthesisation. */\nconst PREC: Record<BinaryOp, number> = {\n or: 1, and: 2,\n \"==\": 4, \"!=\": 4, \">\": 4, \">=\": 4, \"<\": 4, \"<=\": 4,\n \"+\": 5, \"-\": 5, \"*\": 6, \"/\": 6,\n};\n\n/** Whether a child binary needs parentheses inside a parent binary on the given side. */\nexport function needsParens(childOp: BinaryOp, parentOp: BinaryOp, side: \"left\" | \"right\"): boolean {\n if (PREC[childOp] < PREC[parentOp]) return true;\n // right operand of a left-associative non-commutative op (− / ÷) at equal precedence\n return PREC[childOp] === PREC[parentOp] && side === \"right\" && (parentOp === \"-\" || parentOp === \"/\");\n}\n\n/** Render a number without IEEE-754 noise (integers plain; floats trimmed). */\nexport function formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n);\n return String(parseFloat(n.toFixed(12)));\n}\n","// ---------------------------------------------------------------------------\n// The property catalogue the picker offers — a flat list of available properties\n// (scope + name + type + optional enum values + a free-text \"purpose\" the search\n// matches), plus filtering / grouping / ref-formatting helpers. The host builds\n// the catalogue from its project (e.g. patter from buildSchema's properties).\n// ---------------------------------------------------------------------------\n\nimport type { PropertyType } from \"@wildwinter/expr\";\n\nexport type { PropertyType } from \"@wildwinter/expr\";\n\nexport interface CatalogueEntry {\n scope: string;\n /** Property name (stored lowercased to match parsed scopedvar names). */\n name: string;\n type: PropertyType;\n enumValues?: string[];\n /** A quality's ORDERED stage ladder. Separate from `enumValues` because the order carries meaning\n * here (comparisons are positional, `advance()` walks it) - a host that smuggled stages through\n * `enumValues` got a value picker but no ordering affordances. */\n stages?: string[];\n /** Free-text description; the picker search matches it alongside the name. */\n purpose?: string;\n}\n\n/** The CLOSED set of values a property can hold, when it has one: a quality's stages (in ladder\n * order) or an enum's values. Everything that offers \"pick a value\" for a property goes through\n * this, so a quality is never mistaken for free text. `stages` falls back to `enumValues` for a\n * host still passing a quality's ladder the old way. */\nexport const choicesOf = (e: { type: PropertyType; enumValues?: string[]; stages?: string[] } | null | undefined): string[] | undefined => {\n if (!e) return undefined;\n if (e.type === \"quality\") return e.stages?.length ? e.stages : e.enumValues;\n if (e.type === \"enum\") return e.enumValues;\n return undefined;\n};\n\nexport interface Filter {\n acceptTypes?: PropertyType[];\n acceptScopes?: string[];\n}\n\n/** The reference string for an entry: `@name` for the default scope, else `@scope.name`. */\nexport const refOf = (e: { scope: string; name: string }, defaultScope: string): string =>\n e.scope === defaultScope ? `@${e.name}` : `@${e.scope}.${e.name}`;\n\n/** The label shown in the picker / on a property pill. */\nexport const displayName = (e: { scope: string; name: string }, defaultScope: string): string =>\n e.scope === defaultScope ? e.name : `${e.scope}.${e.name}`;\n\nexport function filterCatalogue(entries: readonly CatalogueEntry[], filter: Filter = {}): CatalogueEntry[] {\n return entries.filter(\n (e) => (!filter.acceptTypes || filter.acceptTypes.includes(e.type)) &&\n (!filter.acceptScopes || filter.acceptScopes.includes(e.scope)),\n );\n}\n\n/** Filter by a case-insensitive query against the display name AND the purpose text. */\nexport function searchCatalogue(entries: readonly CatalogueEntry[], query: string, defaultScope: string): CatalogueEntry[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...entries];\n return entries.filter((e) =>\n displayName(e, defaultScope).toLowerCase().includes(q) || (e.purpose ?? \"\").toLowerCase().includes(q));\n}\n\n/** Group entries by scope, scopes in `scopeOrder` first (then alphabetical), names sorted within. */\nexport function groupByScope(entries: readonly CatalogueEntry[], scopeOrder: string[] = []): Array<{ scope: string; entries: CatalogueEntry[] }> {\n const byScope = new Map<string, CatalogueEntry[]>();\n for (const e of entries) {\n const list = byScope.get(e.scope) ?? [];\n list.push(e);\n byScope.set(e.scope, list);\n }\n const rank = (s: string): number => { const i = scopeOrder.indexOf(s); return i === -1 ? scopeOrder.length : i; };\n return [...byScope.keys()]\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))\n .map((scope) => ({ scope, entries: byScope.get(scope)!.slice().sort((a, b) => a.name.localeCompare(b.name)) }));\n}\n\n/** Find an entry by scope + name (name compared case-insensitively). */\nexport function lookup(entries: readonly CatalogueEntry[], scope: string, name: string): CatalogueEntry | null {\n const n = name.toLowerCase();\n return entries.find((e) => e.scope === scope && e.name.toLowerCase() === n) ?? null;\n}\n","// ---------------------------------------------------------------------------\n// Validation wrapper over @wildwinter/expr's parseAndValidate, plus an\n// issue-by-path index so the renderer can ring the offending pill. A parse error\n// (kind \"unparseable\") is what drives the host into the raw-text fallback.\n// ---------------------------------------------------------------------------\n\nimport { parseAndValidate } from \"@wildwinter/expr\";\nimport type {\n ExprNode, AstPath, Dialect, ExpressionSchema, ExpressionValidationIssue, ExpressionValidationResult,\n} from \"@wildwinter/expr\";\n\nexport type { ExpressionValidationIssue, ExpressionValidationResult } from \"@wildwinter/expr\";\n\n/** Stable string key for an AST path (for the issue index). */\nexport const pathKey = (p: AstPath): string => p.join(\"/\");\n\nexport interface Validation extends ExpressionValidationResult {\n ast: ExprNode | null;\n /** Issues keyed by `pathKey(issue.path)`. */\n byPath: Map<string, ExpressionValidationIssue[]>;\n /** True when the source could not even be parsed (the editor should fall back to raw text). */\n unparseable: boolean;\n}\n\nexport function validateSource(src: string, schema: ExpressionSchema, dialect: Dialect): Validation {\n const r = parseAndValidate(src, schema, dialect);\n const byPath = new Map<string, ExpressionValidationIssue[]>();\n for (const issue of r.issues) {\n const k = pathKey(issue.path);\n const list = byPath.get(k) ?? [];\n list.push(issue);\n byPath.set(k, list);\n }\n const unparseable = r.issues.some((i) => i.kind === \"unparseable\");\n return { ...r, byPath, unparseable };\n}\n\n/** Issues attached to a specific node path. */\nexport const issuesAt = (byPath: Map<string, ExpressionValidationIssue[]>, path: AstPath): ExpressionValidationIssue[] =>\n byPath.get(pathKey(path)) ?? [];\n","// ---------------------------------------------------------------------------\n// Tiny DOM helpers — element creation, child clearing, and a floating popover\n// primitive (positioned under an anchor, closes on outside-click / Escape). No\n// framework, no dependencies; everything the vanilla UI needs.\n// ---------------------------------------------------------------------------\n\nexport type Attrs = Record<string, string | number | boolean | undefined>;\n\n/** Create an element with a class, attrs, and children (strings become text). */\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K, cls?: string, children?: Array<Node | string | null | undefined>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (cls) node.className = cls;\n for (const c of children ?? []) {\n if (c == null) continue;\n node.append(typeof c === \"string\" ? document.createTextNode(c) : c);\n }\n return node;\n}\n\n/** A <button type=button> with a class, label, and click handler. `aria` sets an\n * aria-label (for glyph/icon buttons whose text isn't a good accessible name). */\nexport function button(cls: string, label: string | Node, onClick: (e: MouseEvent) => void, title?: string, aria?: string): HTMLButtonElement {\n const b = el(\"button\", cls, [label]);\n b.type = \"button\";\n if (title) b.title = title;\n if (aria) b.setAttribute(\"aria-label\", aria);\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\nexport const clear = (node: HTMLElement): void => node.replaceChildren();\n\nexport interface Popover {\n el: HTMLElement;\n close(): void;\n}\n\nexport interface PopoverOptions {\n /**\n * Where to append the popover. Defaults to document.body. Pass a container\n * inside a focus-trapping dialog (Radix, etc.) so the popover counts as\n * \"inside\" that layer and interacting with it does not dismiss the dialog.\n * The container should establish a containing block (a full-screen modal\n * layer or the dialog content element both qualify); the popover is then\n * positioned relative to that container's box rather than the document.\n */\n container?: HTMLElement;\n /** Called after the popover closes, for any reason. */\n onClose?: () => void;\n}\n\n/**\n * Open a floating popover anchored under `anchor`. `render(close)` builds the\n * content (call `close` to dismiss). Closes on Escape and on a pointer-down\n * outside the popover or the anchor. Only one popover lives at a time per call;\n * the caller tracks the handle to close it programmatically.\n */\nexport function openPopover(anchor: HTMLElement, render: (close: () => void) => Node, opts: PopoverOptions = {}): Popover {\n const container = opts.container ?? document.body;\n const pop = el(\"div\", \"exed-pop\");\n let closed = false;\n const close = (): void => {\n if (closed) return;\n closed = true;\n document.removeEventListener(\"pointerdown\", onDown, true);\n document.removeEventListener(\"keydown\", onKey, true);\n pop.remove();\n opts.onClose?.();\n };\n const onDown = (e: PointerEvent): void => {\n const t = e.target as Node;\n if (!pop.contains(t) && !anchor.contains(t)) close();\n };\n const onKey = (e: KeyboardEvent): void => { if (e.key === \"Escape\") { e.stopPropagation(); close(); } };\n\n pop.append(render(close));\n container.append(pop);\n\n // Position under the anchor (viewport coords), flipped up if it would overflow.\n const a = anchor.getBoundingClientRect();\n const ph = pop.getBoundingClientRect();\n let top = a.bottom + 4;\n if (top + ph.height > window.innerHeight - 8 && a.top - ph.height - 4 > 8) top = a.top - ph.height - 4;\n let left = a.left;\n if (left + ph.width > window.innerWidth - 8) left = Math.max(8, window.innerWidth - 8 - ph.width);\n if (container === document.body) {\n // Document-coordinate placement (the unchanged default).\n pop.style.top = `${Math.round(top + window.scrollY)}px`;\n pop.style.left = `${Math.round(left + window.scrollX)}px`;\n } else {\n // Placement relative to the container's own box - it is the containing block\n // for the absolutely-positioned popover.\n const cr = container.getBoundingClientRect();\n pop.style.top = `${Math.round(top - cr.top + container.scrollTop)}px`;\n pop.style.left = `${Math.round(left - cr.left + container.scrollLeft)}px`;\n }\n\n // Defer listener attach so the opening click doesn't immediately close it.\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", onDown, true);\n document.addEventListener(\"keydown\", onKey, true);\n }, 0);\n\n return { el: pop, close };\n}\n\n/** A labelled text input that commits on Enter / a button, never submitting a form. */\nexport function textField(opts: {\n initial?: string; caption?: string; placeholder?: string; submitLabel?: string;\n validate?: (v: string) => boolean; onCommit: (v: string) => void;\n}): HTMLElement {\n const wrap = el(\"div\", \"exed-field\");\n if (opts.caption) wrap.append(el(\"div\", \"exed-field-cap\", [opts.caption]));\n const input = el(\"input\", \"exed-input\");\n input.type = \"text\";\n input.value = opts.initial ?? \"\";\n if (opts.placeholder) input.placeholder = opts.placeholder;\n const submit = button(\"exed-btn primary\", opts.submitLabel ?? \"Apply\", () => commit());\n const ok = (): boolean => (opts.validate ? opts.validate(input.value) : true);\n const sync = (): void => { submit.disabled = !ok(); };\n const commit = (): void => { if (ok()) opts.onCommit(input.value); };\n input.addEventListener(\"input\", sync);\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); commit(); }\n });\n sync();\n wrap.append(el(\"div\", \"exed-field-row\", [input, submit]));\n setTimeout(() => input.focus(), 0);\n return wrap;\n}\n","// ---------------------------------------------------------------------------\n// The flat editor: render an ExprNode as a strip of clickable PILLS, each opening\n// a popover micro-editor (property picker / literal / operator swap / flag delta /\n// call). Used standalone and inside each tree-row's content. Ported from the\n// storylets ExpressionEditor, retargeted to @wildwinter/expr's ExprNode.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, BinaryOp, AstPath } from \"@wildwinter/expr\";\nimport { setNodeAt, deleteAt, findEnumPeer, getNodeAt as pathNode, boolLit, numLit, strLit, scopedVar, flagDelta, isComparisonOp } from \"./ast.js\";\nimport { BINARY_LABEL, UNARY_LABEL, opSwapGroup, needsParens, formatNumber } from \"./ops.js\";\nimport {\n type CatalogueEntry, choicesOf, displayName, refOf, lookup, filterCatalogue, searchCatalogue, groupByScope, type PropertyType,\n} from \"./schema.js\";\nimport { el, button, textField } from \"./dom.js\";\nimport { issuesAt } from \"./validate.js\";\nimport type { EditCtx } from \"./types.js\";\n\nconst FLAG_FNS = new Set([\"check_flags\", \"set_flags\"]);\nconst TAG_ARG0_FNS = new Set([\"seen\", \"patter_seen\", \"visits\", \"patter_visits\"]);\n\n/** A pill button. `kind` selects the colour class; `issues` rings it red. `path`\n * tags the element (data-exed-path) so the mount can find and auto-open it.\n * `aria` overrides the accessible name (for glyph labels like operators). */\nfunction pill(kind: string, label: string, onClick: (b: HTMLButtonElement) => void, opts: { issue?: string; title?: string; path?: AstPath; aria?: string } = {}): HTMLButtonElement {\n const b = button(`exed-pill exed-pill-${kind}${opts.issue ? \" exed-pill-err\" : \"\"}`, label, () => onClick(b), opts.issue ?? opts.title, opts.aria);\n b.setAttribute(\"aria-haspopup\", \"dialog\"); // every pill opens a popover micro-editor\n if (opts.path) b.dataset[\"exedPath\"] = opts.path.join(\"/\");\n return b;\n}\n\n/** Plain-language names for operators, for the pill's accessible label. */\nconst OP_ARIA: Record<string, string> = {\n \"==\": \"equals\", \"!=\": \"not equal to\", \">\": \"greater than\", \">=\": \"at least\",\n \"<\": \"less than\", \"<=\": \"at most\", \"and\": \"and\", \"or\": \"or\",\n \"+\": \"plus\", \"-\": \"minus\", \"*\": \"times\", \"/\": \"divided by\",\n};\n\nconst issueText = (ctx: EditCtx, path: AstPath): string | undefined => {\n const list = issuesAt(ctx.byPath, path);\n return list.length ? list.map((i) => i.message).join(\"; \") : undefined;\n};\n\n/** Commit a replacement node at `path`. */\nconst replace = (ctx: EditCtx, path: AstPath, next: ExprNode): void => ctx.apply(setNodeAt(ctx.getAst(), path, next));\n\n// --- the recursive pill renderer --------------------------------------------\n\n/** Render `node` (at `path`) as inline pills. `parentOp`/`side` drive parenthesisation. */\nexport function renderNode(node: ExprNode, path: AstPath, ctx: EditCtx, parentOp?: BinaryOp, side?: \"left\" | \"right\"): HTMLElement {\n const issue = issueText(ctx, path);\n switch (node.kind) {\n case \"bool\":\n return pill(\"bool\", node.value ? \"true\" : \"false\", (b) => boolEditor(ctx, path, node.value, b), { issue });\n case \"number\":\n return pill(\"number\", formatNumber(node.value), (b) => numberEditor(ctx, path, node.value, b), { issue });\n case \"string\": {\n const isArg = path[path.length - 2] === \"args\"; // a call argument (the segment before the index)\n // A node-reference arg (seen/visits arg0) gets a flow-node picker when the host provides one,\n // instead of a free-text field - the value is a node id, shown via its readable label.\n const call = isArg ? pathNode(ctx.getAst(), path.slice(0, -2)) : null;\n const isNodeRef = !!ctx.pickNode && call?.kind === \"call\" && TAG_ARG0_FNS.has(call.name) && path[path.length - 1] === 0;\n if (isNodeRef) {\n const openPick = (b: HTMLButtonElement): void => ctx.pickNode!(b, node.value, (id) => replace(ctx, path, strLit(id)));\n return node.value === \"\"\n ? pill(\"placeholder\", \"pick a node…\", openPick, { issue, path })\n : pill(\"node\", ctx.nodeLabel?.(node.value) ?? node.value, openPick, { issue, title: node.value });\n }\n // An empty literal is an unfilled slot, not the literal text \"empty\": render\n // it as a clearly-placeholder pill so it can't be mistaken for real content.\n if (node.value === \"\")\n return pill(\"placeholder\", isArg ? \"set a tag…\" : \"set a value…\", (b) => stringEditor(ctx, path, node, b), { issue, path });\n return pill(isArg ? \"tag\" : \"string\", node.value, (b) => stringEditor(ctx, path, node, b), { issue });\n }\n case \"scopedvar\": {\n const entry = lookup(ctx.catalogue, node.scope, node.name);\n const label = displayName({ scope: node.scope, name: node.name }, ctx.defaultScope);\n const varPill = pill(\"var\", label, (b) => variableEditor(ctx, path, node, b), { issue: issue ?? (entry ? undefined : `Unknown property ${label}`) });\n attachPropertyMenu(ctx, node, varPill);\n return varPill;\n }\n case \"flagdelta\":\n return pill(node.sign === \"+\" ? \"flagpos\" : \"flagneg\", `${node.sign}${node.name || \"flag\"}`, (b) => flagEditor(ctx, path, node, b), { issue, path });\n case \"call\": {\n // Read-only compact form for a flag-delta call: `@prop: +a -b`, dropping\n // the function name and parens (the flag pills carry the meaning). Only\n // when the shape is clean (a property then flag deltas); the editable\n // tree keeps the explicit call so the function stays obvious to edit.\n if (ctx.compact\n && ctx.dialect.functions[node.name]?.flagDeltaArgs\n && node.args.length >= 2\n && node.args[0]!.kind === \"scopedvar\"\n && node.args.slice(1).every((a) => a.kind === \"flagdelta\")) {\n const row = el(\"span\", \"exed-call exed-call-flags\");\n row.append(renderNode(node.args[0]!, [...path, \"args\", 0], ctx));\n row.append(el(\"span\", \"exed-flagsep\", [\":\"]));\n for (let i = 1; i < node.args.length; i++) row.append(renderNode(node.args[i]!, [...path, \"args\", i], ctx));\n return row;\n }\n const row = el(\"span\", \"exed-call\");\n row.append(pill(\"func\", node.name, (b) => callEditor(ctx, path, node, b), { issue }));\n row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n node.args.forEach((arg, i) => {\n if (i > 0) row.append(el(\"span\", \"exed-comma\", [\", \"]));\n row.append(renderNode(arg, [...path, \"args\", i], ctx));\n });\n row.append(el(\"span\", \"exed-paren\", [\")\"]));\n return row;\n }\n case \"unary\": {\n const row = el(\"span\", \"exed-unary\");\n row.append(pill(\"op\", UNARY_LABEL[node.op], () => ctx.apply(deleteOrUnwrapNot(ctx, path, node)), { title: \"remove\", aria: `${OP_ARIA[node.op] ?? node.op} (click to remove)` }));\n row.append(renderNode(node.operand, [...path, \"operand\"], ctx));\n return row;\n }\n case \"binary\": {\n const row = el(\"span\", \"exed-binary\");\n const wrap = parentOp && needsParens(node.op, parentOp, side ?? \"left\");\n if (wrap) row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n row.append(renderNode(node.left, [...path, \"left\"], ctx, node.op, \"left\"));\n const swap = opSwapGroup(node.op);\n const opPill = pill(\"op\", BINARY_LABEL[node.op], (b) => { if (swap) operatorEditor(ctx, path, node.op, swap, b); }, { title: swap ? \"swap operator\" : undefined, aria: OP_ARIA[node.op] ?? node.op });\n if (!swap) opPill.classList.add(\"exed-op-structural\");\n row.append(opPill);\n row.append(renderNode(node.right, [...path, \"right\"], ctx, node.op, \"right\"));\n if (wrap) row.append(el(\"span\", \"exed-paren\", [\")\"]));\n return row;\n }\n }\n}\n\n/**\n * The +set / −unset toggle shared by every flag editor (the add-flag chip and\n * the per-pill flag editor). Two flex buttons themed emerald / rose via\n * --exed-flagpos / --exed-flagneg, matching the flag-delta pill colours.\n */\nexport function signToggle(current: \"+\" | \"-\", onPick: (s: \"+\" | \"-\") => void): HTMLElement {\n const row = el(\"div\", \"exed-sign\");\n ([\"+\", \"-\"] as const).forEach((s) => {\n const cls = `exed-signbtn${s === current ? (s === \"+\" ? \" sel-pos\" : \" sel-neg\") : \"\"}`;\n row.append(button(cls, s === \"+\" ? \"+ set\" : \"− unset\", () => onPick(s)));\n });\n return row;\n}\n\nconst deleteOrUnwrapNot = (ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"unary\" }): ExprNode | null =>\n // clicking the NOT pill strips it (keeps the operand)\n setNodeAt(ctx.getAst(), path, node.operand);\n\n/** Right-click a property pill -> a menu of host actions (e.g. go to definition). */\nfunction attachPropertyMenu(ctx: EditCtx, node: ExprNode & { kind: \"scopedvar\" }, pillEl: HTMLButtonElement): void {\n if (!ctx.propertyActions) return;\n const actions = ctx.propertyActions({ scope: node.scope, name: node.name });\n if (!actions.length) return;\n const open = ctx.openMenu ?? ctx.openPopover;\n pillEl.addEventListener(\"contextmenu\", (e) => {\n e.preventDefault();\n open(pillEl, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n for (const a of actions) wrap.append(button(\"exed-opt\", a.label, () => { a.run(); close(); }));\n return wrap;\n });\n });\n}\n\n/** A comparison whose operands are a numeric dialect-function call and a number\n * literal - a wizard-inserted unit that should delete atomically (half a\n * comparison is meaningless). Dialect-driven: the call's returnType is \"number\". */\nfunction isCompoundComparison(node: ExprNode, ctx: EditCtx): boolean {\n if (node.kind !== \"binary\" || !isComparisonOp(node.op)) return false;\n const numCall = (n: ExprNode): boolean => n.kind === \"call\" && ctx.dialect.functions[n.name]?.returnType === \"number\";\n const isNum = (n: ExprNode): boolean => n.kind === \"number\";\n return (numCall(node.left) && isNum(node.right)) || (numCall(node.right) && isNum(node.left));\n}\n\n/** Redirect a delete of a compound-comparison operand to the whole comparison. */\nfunction effectiveDeletePath(ctx: EditCtx, path: AstPath): AstPath {\n const last = path[path.length - 1];\n if (last !== \"left\" && last !== \"right\") return path;\n const parentPath = path.slice(0, -1);\n const parent = pathNode(ctx.getAst(), parentPath);\n return parent && isCompoundComparison(parent, ctx) ? parentPath : path;\n}\n\n// --- popover micro-editors ---------------------------------------------------\n\nfunction boolEditor(ctx: EditCtx, path: AstPath, value: boolean, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Boolean value\"]));\n for (const v of [true, false]) {\n wrap.append(button(`exed-opt${v === value ? \" sel\" : \"\"}`, String(v), () => { replace(ctx, path, boolLit(v)); close(); }));\n }\n return wrap;\n });\n}\n\nfunction numberEditor(ctx: EditCtx, path: AstPath, value: number, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => textField({\n initial: formatNumber(value), caption: \"Number value\", placeholder: \"0\",\n validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)),\n onCommit: (v) => { replace(ctx, path, numLit(Number(v))); close(); },\n }));\n}\n\nfunction stringEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"string\" }, anchor: HTMLButtonElement): void {\n const peer = findEnumPeer(ctx.getAst(), path);\n const enumEntry = peer ? lookup(ctx.catalogue, peer.scope, peer.name) : null;\n // The closed value list comes from a comparison peer (an enum's values, or a quality's stages in\n // LADDER order), or - for the single root literal of a value field - from the target's declared\n // values (ctx.valueEnumValues).\n const rootValueEnums = path.length === 0 && ctx.valueEnumValues?.length ? ctx.valueEnumValues : null;\n const peerChoices = choicesOf(enumEntry);\n const enumValues = peerChoices?.length ? peerChoices : rootValueEnums;\n // \"stage\", not \"value\", when the peer is a quality: the word is the whole point of the type.\n const enumHeadLabel = enumEntry\n ? `${displayName(enumEntry, ctx.defaultScope)} ${enumEntry.type === \"quality\" ? \"stage\" : \"value\"}`\n : \"Value\";\n ctx.openPopover(anchor, (close) => {\n // Enum value list when compared against an enum property or as an enum value field.\n if (enumValues?.length) {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [enumHeadLabel]));\n for (const v of enumValues) {\n wrap.append(button(`exed-opt${v === node.value ? \" sel\" : \"\"}`, v, () => { replace(ctx, path, strLit(v)); close(); }));\n }\n return wrap;\n }\n return textField({\n initial: node.value, caption: \"Text value\", placeholder: \"value\",\n onCommit: (v) => { replace(ctx, path, strLit(v)); close(); },\n });\n });\n}\n\nfunction operatorEditor(ctx: EditCtx, path: AstPath, current: BinaryOp, group: BinaryOp[], anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Operator\"]));\n for (const op of group) {\n wrap.append(button(`exed-opt${op === current ? \" sel\" : \"\"}`, `${BINARY_LABEL[op]} ${op}`, () => {\n const node = ctx.getAst();\n const cur = setNodeAt(node, path, { ...(getBinary(ctx, path)), op } as ExprNode);\n ctx.apply(cur); close();\n }));\n }\n return wrap;\n });\n}\n\nconst getBinary = (ctx: EditCtx, path: AstPath): ExprNode & { kind: \"binary\" } => {\n const n = pathNode(ctx.getAst(), path);\n if (n?.kind !== \"binary\") throw new Error(\"expected binary\");\n return n;\n};\n\nfunction flagEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"flagdelta\" }, anchor: HTMLButtonElement): void {\n // The flags property is the call's first arg (the sibling at args[0]).\n const callPath = path.slice(0, -2);\n const call = pathNode(ctx.getAst(), callPath);\n const flagsVar = call?.kind === \"call\" ? call.args[0] : undefined;\n const entry = flagsVar?.kind === \"scopedvar\" ? lookup(ctx.catalogue, flagsVar.scope, flagsVar.name) : null;\n const flagCount = call?.kind === \"call\" ? call.args.filter((a) => a.kind === \"flagdelta\").length : 0;\n const used = call?.kind === \"call\"\n ? call.args.filter((a, i): a is ExprNode & { kind: \"flagdelta\" } => a.kind === \"flagdelta\" && i !== (path[path.length - 1] as number)).map((a) => a.name)\n : [];\n // The last flag delta can't be removed when the field must stay non-empty\n // (a set_flags value cell must always carry at least one flag).\n const canRemove = !(ctx.requireNonEmpty && flagCount <= 1);\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Flag set?\"]));\n wrap.append(signToggle(node.sign, (s) => { replace(ctx, path, flagDelta(s, node.name)); close(); }));\n const names = (entry?.enumValues ?? []).filter((n) => !used.includes(n));\n if (names.length) {\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Flag\"]));\n for (const n of names) wrap.append(button(`exed-opt${n === node.name ? \" sel\" : \"\"}`, n, () => { replace(ctx, path, flagDelta(node.sign, n)); close(); }));\n } else {\n wrap.append(textField({ initial: node.name, caption: \"Flag name\", onCommit: (v) => { replace(ctx, path, flagDelta(node.sign, v)); close(); } }));\n }\n if (canRemove) {\n wrap.append(button(\"exed-opt danger\", \"Remove flag\", () => { ctx.apply(deleteAt(ctx.getAst(), path)); close(); }));\n }\n return wrap;\n });\n}\n\n// A root-emptying delete is withheld when the field must stay non-empty (a\n// single-value field). Check the EFFECTIVE path (a compound-comparison operand\n// redirects to the whole comparison), so deleting one is blocked when the\n// comparison is the whole value.\nconst canDelete = (ctx: EditCtx, path: AstPath): boolean =>\n !(ctx.requireNonEmpty && effectiveDeletePath(ctx, path).length === 0);\n\nfunction callEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"call\" }, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [node.name]));\n wrap.append(el(\"div\", \"exed-hint\", [\"Edit the arguments by clicking each one.\"]));\n if (FLAG_FNS.has(node.name)) {\n wrap.append(button(\"exed-opt\", \"+ add flag\", () => { replace(ctx, path, { ...node, args: [...node.args, flagDelta(\"+\", \"\")] }); close(); }));\n }\n if (canDelete(ctx, path)) {\n wrap.append(button(\"exed-opt danger\", \"Delete\", () => { ctx.apply(deleteAt(ctx.getAst(), effectiveDeletePath(ctx, path))); close(); }));\n }\n return wrap;\n });\n}\n\nfunction variableEditor(ctx: EditCtx, path: AstPath, node: ExprNode & { kind: \"scopedvar\" }, anchor: HTMLButtonElement): void {\n ctx.openPopover(anchor, (close) => propertyPicker(ctx, {\n current: refOf(node, ctx.defaultScope),\n onPick: (entry) => { replace(ctx, path, scopedVar(entry.scope, entry.name)); close(); },\n ...(canDelete(ctx, path)\n ? { footer: button(\"exed-opt danger\", \"Delete\", () => { ctx.apply(deleteAt(ctx.getAst(), effectiveDeletePath(ctx, path))); close(); }) }\n : {}),\n }));\n}\n\n// --- property picker ---------------------------------------------------------\n\nexport function propertyPicker(ctx: EditCtx, opts: {\n current?: string; accept?: PropertyType[]; onPick: (e: CatalogueEntry) => void; footer?: Node;\n}): HTMLElement {\n const wrap = el(\"div\", \"exed-picker\");\n const search = el(\"input\", \"exed-input\");\n search.type = \"text\"; search.placeholder = \"Search properties…\";\n const list = el(\"div\", \"exed-picker-list\");\n const pool = filterCatalogue(ctx.catalogue, { acceptTypes: opts.accept });\n const draw = (): void => {\n list.replaceChildren();\n const groups = groupByScope(searchCatalogue(pool, search.value, ctx.defaultScope), ctx.scopeOrder);\n if (!groups.length) { list.append(el(\"div\", \"exed-hint\", [\"No matching properties.\"])); return; }\n for (const g of groups) {\n list.append(el(\"div\", \"exed-picker-scope\", [g.scope]));\n for (const e of g.entries) {\n const label = displayName(e, ctx.defaultScope);\n const sel = opts.current === refOf(e, ctx.defaultScope);\n const row = button(`exed-opt${sel ? \" sel\" : \"\"}`, \"\", () => opts.onPick(e));\n row.append(el(\"span\", \"exed-opt-name\", [label]), el(\"span\", \"exed-opt-type\", [e.type]));\n if (e.purpose) row.append(el(\"span\", \"exed-opt-purpose\", [e.purpose]));\n list.append(row);\n }\n }\n };\n search.addEventListener(\"input\", draw);\n draw();\n wrap.append(search, list);\n if (opts.footer) wrap.append(el(\"div\", \"exed-picker-foot\", [opts.footer]));\n setTimeout(() => search.focus(), 0);\n return wrap;\n}\n","// ---------------------------------------------------------------------------\n// Condition CLAUSE wizards — multi-step guided builders for the \"Add a clause\"\n// menu, ported from the storylets condition editor (clauseWizards.tsx) to\n// vanilla-TS / ExprNode. Each wizard renders its steps into a popover host\n// element (rebuilt in place as the author advances) and commits a finished\n// ExprNode. No clause is inserted with placeholder defaults the author then has\n// to chase down.\n//\n// comparisonWizard — property → operator → value (literal or property)\n// booleanWizard — pick a boolean property (the bare `@flag` clause)\n// checkFlagsWizard — flags property → +set/−unset → flag\n// randomWizard — range(a,b) → operator → value\n// ---------------------------------------------------------------------------\n\nimport type { BinaryOp, ExprNode } from \"@wildwinter/expr\";\nimport { el, button, textField } from \"./dom.js\";\nimport { propertyPicker } from \"./flat.js\";\nimport { binary, scopedVar, numLit, strLit, boolLit, callNode, flagDelta } from \"./ast.js\";\nimport { BINARY_LABEL, COMPARISON_OPS, COMPARABLE_TYPES, comparisonOpsFor, rhsTypesFor } from \"./ops.js\";\nimport { choicesOf, type CatalogueEntry, type PropertyType } from \"./schema.js\";\nimport type { EditCtx, WizardSpec, WizardValue } from \"./types.js\";\n\nexport interface ClauseWizardCtx {\n catalogue: CatalogueEntry[];\n scopeOrder: string[];\n defaultScope: string;\n}\n\ntype Commit = (node: ExprNode) => void;\ntype Cancel = () => void;\n\n/** The left-hand property of a comparison clause, carrying whatever closed value list it has. */\ninterface LhsSpec { ref: string; type: PropertyType; enumValues?: string[]; stages?: string[] }\n\n/** Plain-language gloss for each comparison op (shown beside its glyph, matching storylets). */\nconst OP_WORD: Partial<Record<BinaryOp, string>> = {\n \"==\": \"equals\", \"!=\": \"not equal to\", \">\": \"greater than\", \">=\": \"at least\", \"<\": \"less than\", \"<=\": \"at most\",\n};\n/** An operator option button: glyph + plain-language word (never the glyph twice). */\nconst opButton = (o: BinaryOp, onClick: () => void): HTMLButtonElement => {\n const b = button(\"exed-opt\", \"\", onClick);\n b.append(el(\"span\", \"exed-opt-name\", [BINARY_LABEL[o]]), el(\"span\", \"exed-opt-purpose\", [OP_WORD[o] ?? \"\"]));\n return b;\n};\n\n\n/** Shared chrome: a step header with a back/cancel control and a title. */\nfunction header(host: HTMLElement, title: string | Node, back: (() => void) | undefined, cancel: Cancel | undefined): void {\n const h = el(\"div\", \"exed-vwiz-head\");\n if (back) h.append(button(\"exed-vwiz-back\", \"←\", back, \"Back\"));\n else if (cancel) h.append(button(\"exed-vwiz-back\", \"✕\", cancel, \"Cancel\"));\n h.append(el(\"span\", \"exed-vwiz-title\", [title]));\n host.append(h);\n}\n\nconst mono = (s: string): HTMLElement => el(\"span\", \"exed-vwiz-mono\", [s]);\nconst pickCtxOf = (w: ClauseWizardCtx): EditCtx =>\n ({ catalogue: w.catalogue, defaultScope: w.defaultScope, scopeOrder: w.scopeOrder } as unknown as EditCtx);\n\n/** The shared \"pick a value\" step: type-appropriate literal input, or switch to a property. */\nfunction valueStep(host: HTMLElement, w: ClauseWizardCtx, lhs: LhsSpec, op: BinaryOp, back: () => void, cancel: Cancel, commit: Commit): void {\n let mode: \"value\" | \"property\" = \"value\";\n const draw = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [mono(lhs.ref), \" \", BINARY_LABEL[op], \" …\"]), back, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const swap = (): HTMLButtonElement => button(\"exed-vwiz-other\", mode === \"value\" ? \"↩ use a property instead\" : \"↩ use a value instead\", () => { mode = mode === \"value\" ? \"property\" : \"value\"; draw(); });\n\n const done = (rhs: ExprNode): void => commit(binary(op, lhsVar(w, lhs.ref), rhs));\n if (mode === \"property\") {\n body.append(propertyPicker(pickCtxOf(w), { accept: rhsTypesFor(lhs.type), onPick: (e) => done(scopedVar(e.scope, e.name)) }));\n body.append(swap());\n return;\n }\n if (lhs.type === \"boolean\") {\n const row = el(\"div\", \"exed-field-row\");\n row.append(button(\"exed-opt\", \"true\", () => done(boolLit(true))), button(\"exed-opt\", \"false\", () => done(boolLit(false))));\n body.append(row);\n } else if (choicesOf(lhs)?.length) {\n // Enum values, or a quality's stages IN LADDER ORDER - the order is the affordance: reading down\n // the list is reading the story's progression, so \"at or past\" has an obvious meaning.\n for (const v of choicesOf(lhs)!) body.append(button(\"exed-opt\", v, () => done(strLit(v))));\n } else if (lhs.type === \"number\") {\n body.append(textField({ caption: \"Number\", placeholder: \"e.g. 3\", validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)), onCommit: (v) => done(numLit(Number(v))) }));\n } else {\n body.append(textField({ caption: \"Text\", placeholder: \"e.g. autumn\", onCommit: (v) => done(strLit(v)) }));\n }\n body.append(swap());\n };\n draw();\n}\n\n/** Resolve a \"@scope.name\" / \"@name\" display ref into a scopedvar node (default scope when bare). */\nfunction lhsVar(w: ClauseWizardCtx, ref: string): ExprNode {\n const bare = ref.replace(/^@/, \"\");\n const dot = bare.indexOf(\".\");\n return dot >= 0 ? scopedVar(bare.slice(0, dot), bare.slice(dot + 1)) : scopedVar(w.defaultScope, bare);\n}\n\n/** Property → operator → value. */\nexport function comparisonWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickLhs = (): void => {\n host.replaceChildren();\n header(host, \"Pick a property to compare\", undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), {\n accept: COMPARABLE_TYPES,\n onPick: (e) => pickOp({\n ref: refDisplay(w, e), type: e.type,\n ...(e.enumValues ? { enumValues: e.enumValues } : {}),\n ...(e.stages ? { stages: e.stages } : {}),\n }),\n }));\n };\n const pickOp = (lhs: LhsSpec): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Operator for \", mono(lhs.ref)]), pickLhs, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n for (const o of comparisonOpsFor(lhs.type)) {\n body.append(opButton(o, () => valueStep(host, w, lhs, o, () => pickOp(lhs), cancel, commit)));\n }\n };\n pickLhs();\n}\n\n/** Pick a boolean property — the bare `@flag` clause. */\nexport function booleanWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n host.replaceChildren();\n header(host, \"Pick a boolean property\", undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), { accept: [\"boolean\"], onPick: (e) => commit(scopedVar(e.scope, e.name)) }));\n}\n\n/** Flags property → +set / −unset → flag. */\nexport function checkFlagsWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickProp = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Flags property for \", mono(\"check_flags()\")]), undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(propertyPicker(pickCtxOf(w), { accept: [\"flags\"], onPick: (e) => pickFlag(e) }));\n };\n const pickFlag = (prop: CatalogueEntry): void => {\n let sign: \"+\" | \"-\" = \"+\";\n const draw = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Flag on \", mono(refDisplay(w, prop))]), pickProp, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const signRow = el(\"div\", \"exed-field-row\");\n signRow.append(\n button(`exed-opt${sign === \"+\" ? \" sel\" : \"\"}`, \"+ set\", () => { sign = \"+\"; draw(); }),\n button(`exed-opt${sign === \"-\" ? \" sel\" : \"\"}`, \"- unset\", () => { sign = \"-\"; draw(); }),\n );\n body.append(signRow);\n const flags = prop.enumValues ?? [];\n if (!flags.length) body.append(el(\"div\", \"exed-hint\", [`${refDisplay(w, prop)} declares no flag values yet.`]));\n for (const f of flags) body.append(button(\"exed-opt\", f, () => commit(callNode(\"check_flags\", [scopedVar(prop.scope, prop.name), flagDelta(sign, f)]))));\n };\n draw();\n };\n pickProp();\n}\n\n/** random(a, b) → operator → value (a whole number in a..b, compared). */\nexport function randomWizard(host: HTMLElement, w: ClauseWizardCtx, commit: Commit, cancel: Cancel): void {\n const pickRange = (): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Range for \", mono(\"random(a, b)\")]), undefined, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n let a = \"1\";\n body.append(textField({ caption: \"Low (a)\", initial: \"1\", placeholder: \"e.g. 1\", validate: numOk, onCommit: (v) => { a = v; } }));\n body.append(textField({\n caption: \"High (b)\", initial: \"6\", placeholder: \"e.g. 6\", submitLabel: \"Next →\", validate: numOk,\n onCommit: (b) => pickOp(Math.round(Number(a)), Math.round(Number(b))),\n }));\n };\n const pickOp = (a: number, b: number): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [\"Operator for \", mono(`random(${a}, ${b})`)]), pickRange, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n for (const o of COMPARISON_OPS) {\n body.append(opButton(o, () => pickValue(a, b, o)));\n }\n };\n const pickValue = (a: number, b: number, op: BinaryOp): void => {\n host.replaceChildren();\n header(host, el(\"span\", undefined, [mono(`random(${a}, ${b})`), ` ${BINARY_LABEL[op]} …`]), () => pickOp(a, b), cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n body.append(textField({ caption: \"Compare to\", placeholder: \"e.g. 1\", validate: numOk, onCommit: (v) => commit(binary(op, callNode(\"random\", [numLit(a), numLit(b)]), numLit(Number(v)))) }));\n };\n pickRange();\n}\n\nconst numOk = (v: string): boolean => v.trim() !== \"\" && Number.isFinite(Number(v));\n\n/**\n * Generic runner for a declarative WizardSpec: walks the steps in order with the\n * shared back/cancel chrome, collects one value per step, and commits\n * `spec.build(values)`. Lets a dialect add guided flows (tag -> operator ->\n * threshold and the like) without any upstream code.\n */\nexport function genericWizard(host: HTMLElement, spec: WizardSpec, commit: Commit, cancel: Cancel): void {\n const values: WizardValue[] = [];\n const stepAt = (i: number): void => {\n const step = spec.steps[i];\n if (!step) return;\n host.replaceChildren();\n const back = i > 0 ? (): void => { values.length = i - 1; stepAt(i - 1); } : undefined;\n header(host, step.title, back, cancel);\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n const last = i === spec.steps.length - 1;\n const done = (v: WizardValue): void => {\n values[i] = v;\n if (last) commit(spec.build(values));\n else stepAt(i + 1);\n };\n switch (step.kind) {\n case \"string\":\n body.append(textField({\n caption: step.caption ?? \"Text\", placeholder: step.placeholder,\n submitLabel: last ? \"Apply\" : \"Next →\",\n validate: (v) => v.trim() !== \"\",\n onCommit: (v) => done(v.trim()),\n }));\n break;\n case \"number\":\n body.append(textField({\n caption: step.caption ?? \"Number\", placeholder: step.placeholder,\n initial: step.initial !== undefined ? String(step.initial) : undefined,\n submitLabel: last ? \"Apply\" : \"Next →\",\n validate: numOk,\n onCommit: (v) => done(Number(v)),\n }));\n break;\n case \"op\":\n for (const o of step.ops ?? COMPARISON_OPS) body.append(opButton(o, () => done(o)));\n break;\n }\n };\n stepAt(0);\n}\n\n/** A property's display ref (\"@name\" in the default scope, else \"@scope.name\"). */\nfunction refDisplay(w: ClauseWizardCtx, e: CatalogueEntry): string {\n return e.scope === w.defaultScope ? `@${e.name}` : `@${e.scope}.${e.name}`;\n}\n","// ---------------------------------------------------------------------------\n// The tree chrome: render the derived TreeRow model as nested AND/OR groups +\n// leaf rows, with per-row NOT / move / delete, container op-flip + NOT, and the\n// \"+ Add condition\" / \"+ Add group\" affordances. Each leaf delegates its content\n// to the flat pill editor (flat.ts). Ported from the storylets tree editor.\n// ---------------------------------------------------------------------------\n\nimport type { ExprNode, AstPath } from \"@wildwinter/expr\";\nimport {\n deleteAt, binary, scopedVar, strLit, isPlaceholderForOp, getNodeAt as getNode, setNodeAt, firstEmptyLeafPath,\n} from \"./ast.js\";\nimport {\n astToTree, addChildToContainer, flipContainerOp, toggleContainerNot, buildSubGroupClause, moveChildInContainer,\n redirectDeleteForPlaceholderSibling, type TreeRow,\n} from \"./tree.js\";\nimport { el, button } from \"./dom.js\";\nimport { renderNode } from \"./flat.js\";\nimport { comparisonWizard, booleanWizard, checkFlagsWizard, randomWizard, genericWizard, type ClauseWizardCtx } from \"./clausewizard.js\";\nimport type { EditCtx, FunctionTemplateSpec } from \"./types.js\";\n\n/** Ask the mount to auto-open the first unfilled slot of a just-inserted clause\n * (insert-then-refine templates: the author lands straight in the empty tag /\n * flag pill). `base` is where the clause sits in the post-insert AST. */\nexport function requestFocusForInsert(ctx: EditCtx, clause: ExprNode, base: AstPath): void {\n const rel = firstEmptyLeafPath(clause);\n if (rel) ctx.requestFocus?.([...base, ...rel]);\n}\n\n/** Render the whole expression as a tree into a fresh element. */\nexport function renderTree(ctx: EditCtx): HTMLElement {\n const row = astToTree(ctx.getAst(), []);\n const wrap = el(\"div\", \"exed-tree\");\n wrap.append(renderRow(ctx, row, { root: true }));\n // A single-condition root has no container add-bar of its own; give it one so it can grow.\n if (row.kind !== \"container\") wrap.append(rootAddBar(ctx));\n return wrap;\n}\n\ninterface RowEnv { root?: boolean; index?: number; count?: number; chainPath?: AstPath; }\n\nfunction renderRow(ctx: EditCtx, row: TreeRow, env: RowEnv): HTMLElement {\n if (row.kind === \"container\") return renderContainer(ctx, row, env);\n return renderLeaf(ctx, row, env);\n}\n\nfunction notToggle(ctx: EditCtx, path: AstPath, pressed: boolean): HTMLButtonElement {\n const b = button(\"exed-rowbtn\", \"NOT\", () => ctx.apply(toggleContainerNot(ctx.getAst(), path)), \"toggle NOT\", pressed ? \"remove NOT\" : \"apply NOT\");\n b.setAttribute(\"aria-pressed\", String(pressed));\n return b;\n}\n\nfunction rowActions(ctx: EditCtx, row: TreeRow, env: RowEnv): HTMLElement {\n const acts = el(\"div\", \"exed-rowacts\");\n acts.append(notToggle(ctx, row.path, row.negated));\n if (env.chainPath && env.count != null && env.index != null) {\n if (env.index > 0) acts.append(button(\"exed-rowbtn\", \"↑\", () => ctx.apply(moveChildInContainer(ctx.getAst(), env.chainPath!, env.index!, env.index! - 1)), \"move up\", \"move up\"));\n if (env.index < env.count - 1) acts.append(button(\"exed-rowbtn\", \"↓\", () => ctx.apply(moveChildInContainer(ctx.getAst(), env.chainPath!, env.index!, env.index! + 1)), \"move down\", \"move down\"));\n }\n acts.append(button(\"exed-rowbtn danger\", \"✕\", () => {\n if (env.root) { ctx.apply(null); return; }\n // If this row's AST sibling is a temp group placeholder, collapse the whole\n // half-filled sub-group instead of leaving the placeholder (`true`/`false`)\n // floating up as a bare clause.\n const target = redirectDeleteForPlaceholderSibling(ctx.getAst(), row.path);\n ctx.apply(deleteAt(ctx.getAst(), target));\n }, \"delete\", \"delete this condition\"));\n return acts;\n}\n\nfunction renderLeaf(ctx: EditCtx, row: Extract<TreeRow, { kind: \"comparison\" | \"wrapped\" }>, env: RowEnv): HTMLElement {\n // A placeholder sentinel renders as a dashed \"click to add\" row.\n if (row.kind === \"wrapped\" && (isPlaceholderForOp(row.node, \"and\") || isPlaceholderForOp(row.node, \"or\"))) {\n return placeholderRow(ctx, row.path);\n }\n const line = el(\"div\", \"exed-row\");\n if (row.negated) line.append(el(\"span\", \"exed-not\", [\"NOT\"]));\n const content = row.kind === \"comparison\"\n ? renderNode(nodeAtContent(ctx, row.contentPath), row.contentPath, ctx)\n : renderNode(row.node, row.contentPath, ctx);\n line.append(el(\"span\", \"exed-rowcontent\", [content]));\n line.append(rowActions(ctx, row, env));\n return line;\n}\n\nconst nodeAtContent = (ctx: EditCtx, path: AstPath): ExprNode => {\n // For a comparison row the content is the binary at contentPath.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getNode(ctx.getAst(), path)!;\n};\n\nfunction renderContainer(ctx: EditCtx, row: Extract<TreeRow, { kind: \"container\" }>, env: RowEnv): HTMLElement {\n const box = el(\"div\", `exed-group exed-group-${row.op}`);\n const head = el(\"div\", \"exed-grouphead\");\n if (row.negated) head.append(el(\"span\", \"exed-not\", [\"NOT\"]));\n // Root container can flip op; a sub-group's op is fixed (flipping would dissolve it).\n const label = row.op === \"and\" ? \"ALL OF THESE:\" : \"ANY OF THESE:\";\n if (env.root) {\n head.append(button(\"exed-flip\", label, () => ctx.apply(flipContainerOp(ctx.getAst(), row.chainPath, row.op === \"and\" ? \"or\" : \"and\")), \"switch AND / OR\"));\n } else {\n head.append(el(\"span\", \"exed-grouplabel\", [label]));\n }\n const headActs = el(\"div\", \"exed-rowacts\");\n headActs.append(notToggle(ctx, row.path, row.negated));\n if (!env.root) headActs.append(button(\"exed-rowbtn danger\", \"✕\", () => ctx.apply(deleteAt(ctx.getAst(), row.path)), \"delete group\", \"delete this group\"));\n head.append(headActs);\n box.append(head);\n\n const body = el(\"div\", \"exed-groupbody\");\n row.children.forEach((child, i) => {\n // Each child sits in a flex row with a left-gutter AND/OR connector, so the\n // chain reads as a sentence (\"X · AND · Y · AND · Z\"). The first child has an\n // empty gutter (keeps every row's content column-aligned).\n const childRow = el(\"div\", \"exed-child\");\n childRow.append(el(\"span\", \"exed-connector\", [i === 0 ? \"\" : row.op.toUpperCase()]));\n childRow.append(renderRow(ctx, child, { index: i, count: row.children.length, chainPath: row.chainPath }));\n body.append(childRow);\n });\n body.append(addBar(ctx, row.chainPath, row.op));\n box.append(body);\n return box;\n}\n\nfunction placeholderRow(ctx: EditCtx, path: AstPath): HTMLElement {\n const b = button(\"exed-placeholder\", \"Click to add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, path);\n ctx.apply(replaceAt(ctx, path, node));\n });\n });\n return b;\n}\n\n/** \"+ condition\" and \"+ AND/OR group\" controls for a container chain. */\nfunction addBar(ctx: EditCtx, chainPath: AstPath, op: \"and\" | \"or\"): HTMLElement {\n const bar = el(\"div\", \"exed-addbar\");\n bar.append(button(\"exed-add\", \"+ Add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n // addChildToContainer appends as binary(op, chain, clause) at chainPath,\n // so the inserted clause lands at chainPath + \"right\".\n requestFocusForInsert(ctx, node, [...chainPath, \"right\"]);\n ctx.apply(addChildToContainer(ctx.getAst(), chainPath, node));\n });\n }));\n bar.append(button(\"exed-add\", `+ Add ${op === \"and\" ? \"OR\" : \"AND\"} group`, () => {\n ctx.apply(addChildToContainer(ctx.getAst(), chainPath, buildSubGroupClause(op, seedClause(ctx))));\n }, \"add a nested group\"));\n return bar;\n}\n\n/** The root add-bar (for a single-condition or empty root): grows it into a chain. */\nexport function rootAddBar(ctx: EditCtx): HTMLElement {\n const bar = el(\"div\", \"exed-addbar\");\n bar.append(button(\"exed-add\", \"+ Add condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, [\"right\"]);\n ctx.apply(addChildToContainer(ctx.getAst(), [], node));\n });\n }));\n bar.append(button(\"exed-add\", \"+ Add group\", () => {\n ctx.apply(addChildToContainer(ctx.getAst(), [], buildSubGroupClause(\"and\", seedClause(ctx))));\n }));\n return bar;\n}\n\n// --- clause templates --------------------------------------------------------\n\n/** A sensible first clause: the first property compared to an empty value, else `true`. */\nexport function seedClause(ctx: EditCtx): ExprNode {\n const first = ctx.catalogue[0];\n if (!first) return { kind: \"bool\", value: true };\n if (first.type === \"boolean\") return scopedVar(first.scope, first.name);\n return binary(\"==\", scopedVar(first.scope, first.name), first.type === \"number\" ? { kind: \"number\", value: 0 } : strLit(\"\"));\n}\n\n/** The \"+ Add condition\" template menu: generic property clauses + the dialect's functions. */\nexport function clauseMenu(ctx: EditCtx, anchor: HTMLElement, onPick: (node: ExprNode) => void): void {\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add a clause\"]));\n const add = (label: string, hint: string | undefined, make: () => void, disabled = false): void => {\n const b = button(`exed-opt${disabled ? \" disabled\" : \"\"}`, \"\", () => { if (disabled) return; make(); close(); });\n if (disabled) b.disabled = true;\n b.append(el(\"span\", \"exed-opt-name\", [label]));\n if (hint) b.append(el(\"span\", \"exed-opt-purpose\", [hint]));\n wrap.append(b);\n };\n // Launch a guided wizard into a fresh popover, committing the built clause.\n const wctx: ClauseWizardCtx = { catalogue: ctx.catalogue, scopeOrder: ctx.scopeOrder, defaultScope: ctx.defaultScope };\n const launch = (run: (host: HTMLElement, w: ClauseWizardCtx, commit: (n: ExprNode) => void, cancel: () => void) => void): void => {\n ctx.openPopover(anchor, (close2) => {\n const host = el(\"div\", \"exed-vwiz\");\n run(host, wctx, (node) => { onPick(node); close2(); }, close2);\n return host;\n });\n };\n const addFn = (fn: FunctionTemplateSpec): void => add(fn.label, fn.hint, () => {\n if (fn.wizard === \"check_flags\") launch(checkFlagsWizard);\n else if (fn.wizard === \"random\") launch(randomWizard);\n else if (fn.wizard && typeof fn.wizard === \"object\") {\n const spec = fn.wizard;\n launch((host, _w, commit, cancel) => genericWizard(host, spec, commit, cancel));\n } else onPick(fn.build());\n }, !!fn.disabled);\n // Dialect flag functions lead (matching storylets' menu), then the generic\n // property clauses, then the remaining dialect functions.\n const flagFns = ctx.functions.filter((f) => f.name === \"check_flags\");\n const otherFns = ctx.functions.filter((f) => f.name !== \"check_flags\");\n flagFns.forEach(addFn);\n add(\"Property comparison\", \"a property vs a value\", () => launch(comparisonWizard));\n add(\"Property is true\", \"a boolean property on its own\", () => launch(booleanWizard));\n otherFns.forEach(addFn);\n return wrap;\n });\n}\n\n// keep the template list reusable for the host\nexport type { FunctionTemplateSpec };\n\nconst replaceAt = (ctx: EditCtx, path: AstPath, node: ExprNode): ExprNode => setNodeAt(ctx.getAst(), path, node);\n","// ---------------------------------------------------------------------------\n// mountExpressionEditor — the public, framework-neutral entry. Mounts the hybrid\n// tree / flat / raw-text editor into a host element, parses the name-form `value`\n// to an ExprNode, and emits name-form on every mutation. Scopes, properties and\n// the function templates are injected, so it is tool-agnostic.\n// ---------------------------------------------------------------------------\n\nimport { unparse } from \"@wildwinter/expr\";\nimport type { ExprNode, BinaryOp, Dialect, ExpressionSchema, AstPath } from \"@wildwinter/expr\";\nimport { boolLit, binary, numLit, scopedVar, strLit, callNode, flagDelta } from \"./ast.js\";\nimport { validateSource } from \"./validate.js\";\nimport { ARITHMETIC_OPS, BINARY_LABEL } from \"./ops.js\";\nimport type { CatalogueEntry } from \"./schema.js\";\nimport { el, button, textField, openPopover, type Popover } from \"./dom.js\";\nimport { renderNode, propertyPicker, signToggle } from \"./flat.js\";\nimport { renderTree, clauseMenu, requestFocusForInsert } from \"./treeview.js\";\nimport type { EditCtx, FunctionTemplateSpec } from \"./types.js\";\n\nexport type { FunctionTemplateSpec } from \"./types.js\";\n\nexport interface ExpressionEditorOptions {\n /** Current expression in name-form (`@gold > 0 and @met`); \"\" = always / empty. */\n value: string;\n schema: ExpressionSchema;\n dialect: Dialect;\n /** Properties the picker offers. */\n catalogue: CatalogueEntry[];\n /** Scope display order for the picker groups. */\n scopeOrder?: string[];\n /** Dialect-specific clause templates (beyond the generic property comparisons). */\n functions?: FunctionTemplateSpec[];\n /** \"tree\" (default) for conditions, \"flat\" for a single inline expression. */\n mode?: \"tree\" | \"flat\";\n /** Flat mode only: show an optional \"+ term\" affordance that extends the value with one more term -\n * type-led: \"arithmetic\" extends a number (`5` → `5 + @bonus`); \"boolean\" extends a true/false value\n * with a logical term (`true` → `true and @met`). Omit for text / enum (no meaningful extension). */\n addTerm?: \"arithmetic\" | \"boolean\";\n /** Label for the empty/always pill (default \"always\"). */\n nullLabel?: string;\n /** Host picker for flow-node reference args (seen/visits); renders those args as a node pill. */\n pickNode?: EditCtx[\"pickNode\"];\n /** Resolve a node id to a readable label for node-ref pills. */\n nodeLabel?: EditCtx[\"nodeLabel\"];\n /** Start in raw-text mode (the host's global \"show as text\" toggle drives this; no inline `</>`). */\n text?: boolean;\n /** Render the editor's own validation message list under the pills (default true).\n * Hosts that display their own validation messages pass false to avoid doubling up. */\n messages?: boolean;\n /** Where to append the popover micro-editors (default document.body). Pass a\n * container inside a focus-trapping dialog (Radix, etc.) so opening a pill's\n * popover does not dismiss the surrounding dialog. */\n popoverContainer?: HTMLElement;\n /** Block a delete that would empty the whole expression (single-value fields\n * that must always hold a term). Conditions leave this off (empty = always). */\n requireNonEmpty?: boolean;\n /** Enum values for the single root literal of a value field (an enum-typed\n * target): the literal editor then offers them as a picker. Flat mode only. */\n valueEnumValues?: string[];\n /** Flat single-value field: an empty value renders one editable \"set a value…\"\n * placeholder pill (a root string literal) rather than the condition\n * clause-menu empty state. Pairs with mode:\"flat\". */\n valueField?: boolean;\n /** Flat compact editor for a `set_flags(@target, +a, -b)` value whose target is\n * implied by context (an outcome row's target column). Renders only the\n * flag-delta pills plus an \"+ flag\" chip, hiding the function name and target\n * arg. `target` is the name-form ref of the flags property (e.g. \"@quests\"),\n * `flags` its declared flag names (offered by the \"+ flag\" picker). Pairs\n * with mode:\"flat\"; set requireNonEmpty so the last flag can't be removed. */\n flagValue?: { target: string; flags: string[] };\n /** Placeholder for the raw-text textarea (defaults to a generic example).\n * Value cells pass a value-flavoured hint (e.g. \"autumn or @count + 1\"). */\n rawPlaceholder?: string;\n /** Host actions for a property pill, shown on right-click (e.g. go to\n * definition). Receives the property ref; returns the menu items. */\n propertyActions?(ref: { scope: string; name: string }): Array<{ label: string; run: () => void }>;\n /** Emitted on every edit (name-form; \"\" when cleared). */\n onChange: (src: string) => void;\n /** Notified when the author starts (true) / stops (false) editing inside a popover\n * micro-editor — lets the host suppress its own validation display mid-edit. */\n onEditingChange?: (editing: boolean) => void;\n}\n\nexport interface ExpressionEditorHandle {\n setValue(v: string): void;\n /** Flip between the pill view and the raw-text view (driven by the host's global toggle). */\n setText(on: boolean): void;\n destroy(): void;\n}\n\nexport function mountExpressionEditor(host: HTMLElement, opts: ExpressionEditorOptions): ExpressionEditorHandle {\n const defaultScope = opts.dialect.defaultScope;\n let src = opts.value ?? \"\";\n let raw = opts.text ?? false; // raw-text view (host-driven) / forced when unparseable\n let activePopover: Popover | null = null;\n let editing = false;\n let pendingFocus: AstPath | null = null; // pill to auto-open after the next render\n host.classList.add(\"exed-root\");\n\n const emit = (next: string): void => { src = next; opts.onChange(src); render(); };\n const toSrc = (ast: ExprNode | null): string => (ast ? unparse(ast, { defaultScope }) : \"\");\n\n const setEditing = (on: boolean): void => {\n if (on === editing) return;\n editing = on;\n opts.onEditingChange?.(on);\n };\n const closePopover = (): void => { activePopover?.close(); activePopover = null; };\n\n function buildCtx(ast: ExprNode): EditCtx {\n const v = validateSource(src, opts.schema, opts.dialect);\n return {\n schema: opts.schema, dialect: opts.dialect, defaultScope,\n catalogue: opts.catalogue, scopeOrder: opts.scopeOrder ?? [], functions: opts.functions ?? [],\n byPath: v.byPath,\n getAst: () => ast,\n apply: (next) => emit(toSrc(next)),\n openPopover: (anchor, r) => {\n closePopover();\n const pop = openPopover(anchor, r, {\n container: opts.popoverContainer,\n onClose: () => {\n if (activePopover === pop) activePopover = null;\n setEditing(false);\n },\n });\n activePopover = pop;\n setEditing(true);\n },\n requestFocus: (p) => { pendingFocus = p; },\n ...(opts.requireNonEmpty ? { requireNonEmpty: true } : {}),\n ...(opts.valueEnumValues ? { valueEnumValues: opts.valueEnumValues } : {}),\n ...(opts.propertyActions ? { propertyActions: opts.propertyActions } : {}),\n ...(opts.pickNode ? { pickNode: opts.pickNode } : {}),\n ...(opts.nodeLabel ? { nodeLabel: opts.nodeLabel } : {}),\n };\n }\n\n function render(): void {\n closePopover();\n host.replaceChildren();\n const v = validateSource(src, opts.schema, opts.dialect);\n\n const flagCompact = !!opts.flagValue && (opts.mode ?? \"tree\") === \"flat\";\n const astIsFlagCall = v.ast?.kind === \"call\" && (v.ast.name === \"set_flags\" || v.ast.name === \"check_flags\");\n\n if (raw || v.unparseable || (flagCompact && !!v.ast && !astIsFlagCall)) {\n // Raw for unparseable input, or a flag-value field holding a non-flag-call\n // expression (hand-typed) that the compact view can't represent.\n host.append(rawArea());\n } else if (flagCompact) {\n host.append(flagValueBody(astIsFlagCall ? (v.ast as ExprNode & { kind: \"call\" }) : null));\n } else if (!src.trim() || !v.ast) {\n host.append(opts.valueField ? valueEmptyState() : emptyState());\n } else {\n const ctx = buildCtx(v.ast);\n const body = el(\"div\", \"exed-body\");\n if ((opts.mode ?? \"tree\") === \"flat\") {\n const flat = el(\"div\", \"exed-flat\", [renderNode(v.ast, [], ctx)]);\n if (opts.addTerm) flat.append(addTermControl(ctx)); // optional \"+ term\" for values\n body.append(flat);\n } else body.append(renderTree(ctx));\n host.append(body);\n }\n\n if ((opts.messages ?? true) && (!v.unparseable || src.trim())) host.append(messages(v.issues));\n\n // Insert-then-refine follow-through: a template just inserted a clause with an\n // unfilled slot — open that pill's micro-editor so the author lands in it.\n if (pendingFocus) {\n const key = pendingFocus.join(\"/\");\n pendingFocus = null;\n host.querySelector<HTMLElement>(`[data-exed-path=\"${key}\"]`)?.click();\n }\n }\n\n // --- chrome ---------------------------------------------------------------\n\n function rawArea(): HTMLElement {\n const ta = el(\"textarea\", \"exed-raw\");\n ta.value = src;\n ta.placeholder = opts.rawPlaceholder ?? \"@gold > 0 and @met_anna\";\n ta.rows = 2;\n ta.addEventListener(\"input\", () => {\n src = ta.value; opts.onChange(src);\n msgHost.replaceChildren(messages(validateSource(src, opts.schema, opts.dialect).issues));\n });\n const msgHost = el(\"div\", \"exed-rawmsg\");\n const wrap = el(\"div\", \"exed-rawwrap\", [ta, msgHost]);\n return wrap;\n }\n\n function emptyState(): HTMLElement {\n const wrap = el(\"div\", \"exed-empty\");\n wrap.append(el(\"span\", \"exed-pill exed-pill-always\", [opts.nullLabel ?? \"always\"]));\n const ctx = buildCtx(boolLit(true));\n wrap.append(button(\"exed-add\", \"+ Add your first condition\", (e) => {\n clauseMenu(ctx, e.currentTarget as HTMLElement, (node) => {\n requestFocusForInsert(ctx, node, []); // the clause becomes the root\n emit(toSrc(node));\n });\n }));\n return wrap;\n }\n\n // A flat value field's empty state: a single \"set a value…\" placeholder pill\n // (a root empty-string literal). Editing it commits the value; the empty\n // string unparses back to \"\" so no spurious write happens before the author\n // types. valueEnumValues (an enum target) drives the picker via the ctx.\n function valueEmptyState(): HTMLElement {\n const ctx = buildCtx(strLit(\"\"));\n return el(\"div\", \"exed-flat\", [renderNode(strLit(\"\"), [], ctx)]);\n }\n\n /** Parse a name-form property ref (\"@name\" / \"@scope.name\") to a scopedvar. */\n function parseRef(ref: string): ExprNode {\n const bare = ref.replace(/^@/, \"\");\n const dot = bare.indexOf(\".\");\n return dot >= 0 ? scopedVar(bare.slice(0, dot), bare.slice(dot + 1)) : scopedVar(defaultScope, bare);\n }\n\n // Compact flags value: render a set_flags(@target, +a, -b) call as only its\n // flag-delta pills (reusing the flat flag-delta editor) plus an \"+ flag\" chip.\n // The function name and target arg are hidden - the target is implied by the\n // row's target column. An empty value shows just the chip, which seeds the call.\n function flagValueBody(call: (ExprNode & { kind: \"call\" }) | null): HTMLElement {\n const wrap = el(\"div\", \"exed-flat exed-flagvalue\");\n const ctx = buildCtx(call ?? boolLit(true));\n if (call) {\n call.args.forEach((arg, i) => {\n if (arg.kind === \"flagdelta\") wrap.append(renderNode(arg, [\"args\", i], ctx));\n });\n }\n wrap.append(addFlagChip(ctx, call));\n return wrap;\n }\n\n // The \"+ flag\" chip opens a sign + name picker and commits a COMPLETE flag\n // delta - an empty flag name is not a valid AST (unlike an empty string), so\n // we never seed one; we build the full delta up front and add it in one step.\n function addFlagChip(ctx: EditCtx, call: (ExprNode & { kind: \"call\" }) | null): HTMLElement {\n const flags = opts.flagValue?.flags ?? [];\n const used = call ? call.args.filter((a): a is ExprNode & { kind: \"flagdelta\" } => a.kind === \"flagdelta\").map((a) => a.name) : [];\n const available = flags.filter((f) => !used.includes(f));\n return button(\"exed-add exed-addflag\", \"+ flag\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n ctx.openPopover(anchor, (close) => {\n let sign: \"+\" | \"-\" = \"+\";\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add flag\"]));\n const signHost = el(\"div\");\n const drawSign = (): void => { signHost.replaceChildren(signToggle(sign, (s) => { sign = s; drawSign(); })); };\n drawSign();\n wrap.append(signHost);\n const commit = (name: string): void => {\n const delta = flagDelta(sign, name);\n emit(toSrc(call\n ? { ...call, args: [...call.args, delta] }\n : callNode(\"set_flags\", [parseRef(opts.flagValue!.target), delta])));\n close();\n };\n if (available.length) {\n for (const n of available) wrap.append(button(\"exed-opt\", n, () => commit(n)));\n } else {\n wrap.append(el(\"div\", \"exed-hint\", [flags.length === 0\n ? \"This flags property declares no flag values yet.\"\n : \"All declared flags are already used.\"]));\n }\n return wrap;\n });\n }, \"add a flag\");\n }\n\n /** The optional \"+ term\" affordance (flat value mode): extend the value with one more arithmetic\n * term. Pick the operator (default +) and an operand (a number, or a property), and the whole\n * current value is wrapped left: `5` → `5 + 1`. NOT a forced step - just an \"add one more\" chip. */\n function addTermControl(ctx: EditCtx): HTMLElement {\n // Type-led: a boolean value extends with a logical term (and / or + a true/false or boolean property);\n // a number extends with an arithmetic term (+ − × ÷ + a number or numeric property).\n const boolean = opts.addTerm === \"boolean\";\n const ops: BinaryOp[] = boolean ? [\"and\", \"or\"] : ARITHMETIC_OPS;\n const operandType = boolean ? \"boolean\" : \"number\";\n return button(\"exed-add exed-addterm\", \"+ term\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n let op: BinaryOp = ops[0]!;\n ctx.openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-menu\");\n wrap.append(el(\"div\", \"exed-menu-head\", [\"Add term\"]));\n const commit = (operand: ExprNode): void => { ctx.apply(binary(op, ctx.getAst(), operand)); close(); };\n const opRow = el(\"div\", \"exed-field-row\");\n const drawOps = (): void => {\n opRow.replaceChildren();\n for (const o of ops) opRow.append(button(`exed-opt${o === op ? \" sel\" : \"\"}`, BINARY_LABEL[o], () => { op = o; drawOps(); }));\n };\n drawOps();\n wrap.append(opRow);\n if (boolean) {\n const row = el(\"div\", \"exed-field-row\");\n row.append(button(\"exed-opt\", \"true\", () => commit(boolLit(true))), button(\"exed-opt\", \"false\", () => commit(boolLit(false))));\n wrap.append(row);\n } else {\n wrap.append(textField({\n caption: \"by\", placeholder: \"e.g. 1\",\n validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)),\n onCommit: (v) => commit(numLit(Number(v))),\n }));\n }\n wrap.append(button(\"exed-opt\", \"…or a property\", () => {\n ctx.openPopover(anchor, (c2) => propertyPicker(ctx, { accept: [operandType], onPick: (en) => { commit(scopedVar(en.scope, en.name)); c2(); } }));\n }));\n return wrap;\n });\n }, boolean ? \"add a logical term\" : \"add an arithmetic term\");\n }\n\n function messages(issues: ReturnType<typeof validateSource>[\"issues\"]): HTMLElement {\n const box = el(\"div\", \"exed-msgs\");\n for (const i of issues) {\n box.append(el(\"div\", `exed-msg exed-msg-${i.severity}`, [i.severity === \"error\" ? \"⚠ \" : \"△ \", i.message]));\n }\n return box;\n }\n\n render();\n return {\n setValue: (v) => { src = v ?? \"\"; render(); }, // text mode is host-driven; don't reset it here\n setText: (on) => { raw = on; render(); },\n destroy: () => { closePopover(); host.replaceChildren(); host.classList.remove(\"exed-root\"); },\n };\n}\n","// ---------------------------------------------------------------------------\n// The VALUE wizard: a small guided popover for picking the value of a `set`\n// target (or an `emit` argument), modelled on the storylets Outcomes\n// \"ChangeValueStep\". It picks ONE value - a property reference, or a type-\n// appropriate literal (number / text / true-false / enum) - and commits it.\n// No operator step: extending into `x + y` is done afterwards, optionally, via\n// the inline editor's \"+ term\" affordance (not a forced popup).\n//\n// Commits a name-form source string (`5`, `\"autumn\"`, `true`, `@gold`).\n// ---------------------------------------------------------------------------\n\nimport { el, button, textField } from \"./dom.js\";\nimport { propertyPicker } from \"./flat.js\";\nimport { refOf, type CatalogueEntry, type PropertyType } from \"./schema.js\";\nimport type { EditCtx } from \"./types.js\";\n\nexport interface ValueWizardOptions {\n catalogue: CatalogueEntry[];\n scopeOrder: string[];\n defaultScope: string;\n /** When known (a `set` target's declared type), the picker leads straight to that input. */\n expectedType?: PropertyType;\n /** The target's closed set of values, when it has one: an enum's values, or a QUALITY's stages in\n * ladder order. Callers should fill this with `choicesOf(entry)` rather than reading a single\n * field, so a quality is never handed a wizard that knows its type but not its ladder. */\n expectedChoices?: string[];\n /** @deprecated Use `expectedChoices`. Kept so a 0.11.x caller keeps working. */\n expectedEnumValues?: string[];\n /** Receives the chosen value as name-form source. */\n onCommit: (src: string) => void;\n /** Optional cancel (the ✕ on the step). */\n onCancel?: () => void;\n}\n\nconst isIdent = (v: string): boolean => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(v);\n/** An enum / bare string commits unquoted only when it's a safe identifier, else JSON-quoted. */\nconst enumSrc = (v: string): string => (isIdent(v) ? v : JSON.stringify(v));\n\n/** Build the wizard UI into a fresh element (drive it via the host's popover). */\nexport function valueWizard(opts: ValueWizardOptions): HTMLElement {\n const host = el(\"div\", \"exed-vwiz\");\n // propertyPicker only reads catalogue / defaultScope / scopeOrder off the ctx.\n const pickCtx = { catalogue: opts.catalogue, defaultScope: opts.defaultScope, scopeOrder: opts.scopeOrder } as unknown as EditCtx;\n const optBtn = (label: string, onClick: () => void): HTMLButtonElement => button(\"exed-opt\", label, onClick);\n\n const head = (title: string): HTMLElement => {\n const h = el(\"div\", \"exed-vwiz-head\");\n if (opts.onCancel) h.append(button(\"exed-vwiz-back\", \"✕\", opts.onCancel, \"Cancel\"));\n h.append(el(\"span\", \"exed-vwiz-title\", [title]));\n return h;\n };\n\n host.append(head(\"Pick a value\"));\n const body = el(\"div\", \"exed-vwiz-body\");\n host.append(body);\n\n const choices = opts.expectedChoices?.length ? opts.expectedChoices : opts.expectedEnumValues;\n // A quality's list is of STAGES on a ladder, and saying so is the difference between \"pick one of\n // these\" and \"pick where the story now stands\".\n const isStage = opts.expectedType === \"quality\";\n \n // Lead straight to a known target type's input; otherwise show the kind chooser.\n // Any type with a closed set of values leads straight to it - a quality included, which fell through\n // to the generic chooser before 0.12.0 because the test named only `enum`.\n let kind: \"menu\" | \"property\" | \"number\" | \"text\" | \"bool\" | \"enum\" =\n opts.expectedType === \"number\" ? \"number\" : opts.expectedType === \"string\" ? \"text\"\n : opts.expectedType === \"boolean\" ? \"bool\"\n : (opts.expectedType === \"enum\" || opts.expectedType === \"quality\") && choices?.length ? \"enum\" : \"menu\";\n\n const draw = (): void => {\n body.replaceChildren();\n const other = (): HTMLButtonElement => button(\"exed-vwiz-other\", \"↩ a different kind\", () => { kind = \"menu\"; draw(); });\n switch (kind) {\n case \"menu\":\n body.append(optBtn(\"A property…\", () => { kind = \"property\"; draw(); }));\n body.append(optBtn(\"A number\", () => { kind = \"number\"; draw(); }));\n body.append(optBtn(\"Text\", () => { kind = \"text\"; draw(); }));\n body.append(optBtn(\"True / False\", () => { kind = \"bool\"; draw(); }));\n if (choices?.length) body.append(optBtn(isStage ? \"A stage\" : \"A listed value\", () => { kind = \"enum\"; draw(); }));\n break;\n case \"property\":\n body.append(propertyPicker(pickCtx, { onPick: (e) => opts.onCommit(refOf(e, opts.defaultScope)) }));\n body.append(other());\n break;\n case \"number\":\n body.append(textField({ caption: \"Number\", placeholder: \"e.g. 5 or 0.5\", validate: (v) => v.trim() !== \"\" && Number.isFinite(Number(v)), onCommit: (v) => opts.onCommit(String(Number(v))) }));\n body.append(other());\n break;\n case \"text\":\n body.append(textField({ caption: \"Text\", placeholder: \"e.g. autumn\", onCommit: (v) => opts.onCommit(JSON.stringify(v)) }));\n body.append(other());\n break;\n case \"bool\": {\n const row = el(\"div\", \"exed-field-row\");\n row.append(optBtn(\"true\", () => opts.onCommit(\"true\")), optBtn(\"false\", () => opts.onCommit(\"false\")));\n body.append(row, other());\n break;\n }\n case \"enum\":\n body.append(el(\"div\", \"exed-vwiz-note\", [isStage ? \"Stages, in ladder order:\" : \"\"]));\n for (const v of choices ?? []) body.append(optBtn(v, () => opts.onCommit(enumSrc(v))));\n body.append(other());\n break;\n }\n };\n draw();\n return host;\n}\n","// ---------------------------------------------------------------------------\n// mountEffectsEditor — a framework-neutral visual editor for a LIST of effects\n// (outcomes). Each effect is either a `set` (assign a property a value) or an\n// `emit` (raise a host event with argument expressions). It is the sibling of\n// mountExpressionEditor: where that edits one boolean condition, this edits an\n// ordered list of mutations. Every value / argument is itself a full pill/tree\n// expression, edited by an embedded mountExpressionEditor (flat mode) — so the\n// \"visual-and-text\" richness of the condition editor carries straight through.\n//\n// Modelled on the storylets outcome editor (the same system): pick a target\n// property, then refine its value by clicking pills. `emit` adds host events\n// on top (storylets had no equivalent).\n// ---------------------------------------------------------------------------\n\nimport type { Dialect, ExpressionSchema } from \"@wildwinter/expr\";\nimport { el, button, openPopover, type Popover } from \"./dom.js\";\nimport {\n type CatalogueEntry, type PropertyType,\n filterCatalogue, searchCatalogue, groupByScope, displayName, refOf,\n choicesOf,\n} from \"./schema.js\";\nimport type { FunctionTemplateSpec } from \"./types.js\";\nimport { valueWizard } from \"./valuewizard.js\";\nimport { mountExpressionEditor, type ExpressionEditorHandle } from \"./mount.js\";\n\n/** One effect in name-form: a property assignment or a host event. Mirrors the\n * host's own Effect model (patter's `set` / `emit`) so it round-trips verbatim. */\nexport type EditorEffect =\n | { kind: \"set\"; target: string; value: string }\n | { kind: \"emit\"; event: string; args: string[] };\n\nexport interface EffectsEditorOptions {\n /** The current effect list (edited in place via onChange). */\n effects: EditorEffect[];\n schema: ExpressionSchema;\n dialect: Dialect;\n /** Properties the target picker + value editors offer. */\n catalogue: CatalogueEntry[];\n scopeOrder?: string[];\n /** Dialect clause templates passed through to each value editor. */\n functions?: FunctionTemplateSpec[];\n /** Known host event names to suggest when adding an `emit` (optional). */\n events?: string[];\n /** Offer the \"+ emit event\" affordance (default true). A host whose effects are SET-ONLY (e.g.\n * patter, where host events ride on gameData, not effects) passes false to hide it entirely. */\n allowEmit?: boolean;\n /** Start each inline value editor in raw-text mode (host's global \"show as text\" toggle drives this). */\n text?: boolean;\n /** Where to append popover micro-editors (default document.body). Pass a container\n * inside a focus-trapping dialog so popovers do not dismiss it. Threaded to the\n * target/event pickers here and to every inline value editor. */\n popoverContainer?: HTMLElement;\n /** Emitted on every structural / value edit with the whole new list. */\n onChange: (effects: EditorEffect[]) => void;\n}\n\nexport interface EffectsEditorHandle {\n setValue(effects: EditorEffect[]): void;\n /** Flip every inline value editor between pills and raw text (host's global toggle). */\n setText(on: boolean): void;\n destroy(): void;\n}\n\n// --- pure list operations (exported for testing) ---------------------------\n\nconst clone = (list: EditorEffect[]): EditorEffect[] => list.map((e) =>\n e.kind === \"set\" ? { ...e } : { ...e, args: [...e.args] });\n\nexport const addSet = (list: EditorEffect[], target: string, value: string): EditorEffect[] =>\n [...clone(list), { kind: \"set\", target, value }];\n\nexport const addEmit = (list: EditorEffect[], event: string): EditorEffect[] =>\n [...clone(list), { kind: \"emit\", event, args: [] }];\n\nexport const removeAt = (list: EditorEffect[], i: number): EditorEffect[] =>\n clone(list).filter((_, idx) => idx !== i);\n\nexport function moveAt(list: EditorEffect[], i: number, dir: -1 | 1): EditorEffect[] {\n const next = clone(list);\n const j = i + dir;\n if (j < 0 || j >= next.length) return next;\n [next[i], next[j]] = [next[j]!, next[i]!];\n return next;\n}\n\nexport function updateAt(list: EditorEffect[], i: number, patch: Partial<EditorEffect>): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur) return next;\n next[i] = { ...cur, ...patch } as EditorEffect;\n return next;\n}\n\nexport function setArgAt(list: EditorEffect[], i: number, argIdx: number, value: string): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args[argIdx] = value;\n return next;\n}\n\nexport function addArg(list: EditorEffect[], i: number, value = \"0\"): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args.push(value);\n return next;\n}\n\nexport function removeArgAt(list: EditorEffect[], i: number, argIdx: number): EditorEffect[] {\n const next = clone(list);\n const cur = next[i];\n if (!cur || cur.kind !== \"emit\") return next;\n cur.args.splice(argIdx, 1);\n return next;\n}\n\n/**\n * What a freshly targeted property's value should be, and whether the guided value wizard still has a\n * question worth asking.\n *\n * BOTH paths that target a property go through this - \"+ set property\" (add) and re-picking an\n * existing effect's target - because when they answered separately they drifted: 0.11.0 seeded a\n * quality with `advance(...)` on re-pick while the add path opened a wizard that did not know what a\n * quality was, so the same job offered two different affordances depending on how you arrived.\n *\n * `ask: false` means the type has a canonical outcome and the wizard would be ceremony: a QUALITY\n * moves to its next stage, which is the insertion-safe form the type exists for, and an author who\n * meant a specific stage clicks the pill.\n */\nexport function initialValueFor(entry: CatalogueEntry, defaultScope: string): { src: string; ask: boolean } {\n const ref = refOf(entry, defaultScope);\n return {\n src: seedValueSrc(entry.type, choicesOf(entry), ref),\n ask: entry.type !== \"quality\",\n };\n}\n\n/** A sensible starting value-expression for a freshly targeted property. Literals\n * are seeded so the value editor opens on an editable pill, never the empty state.\n *\n * A QUALITY seeds to `advance(<ref>)` when the target's ref is known: moving to the next stage is\n * what outcomes on a ladder overwhelmingly do, and it is the form that keeps a story insertion-safe\n * (it names no destination, so a stage added later routes through it). Pass no ref and it falls back\n * to the first stage as a literal, which the author can still swap to `advance(...)`. */\nexport function seedValueSrc(type: PropertyType, values?: string[], ref?: string): string {\n switch (type) {\n case \"boolean\": return \"true\";\n case \"number\": return \"0\";\n case \"enum\": return JSON.stringify(values?.[0] ?? \"\");\n case \"quality\": return ref ? `advance(${ref})` : JSON.stringify(values?.[0] ?? \"\");\n case \"string\": return '\"\"';\n default: return \"0\"; // flags / unknown — user refines via pills or raw text\n }\n}\n\n// --- mount -----------------------------------------------------------------\n\nexport function mountEffectsEditor(host: HTMLElement, opts: EffectsEditorOptions): EffectsEditorHandle {\n const defaultScope = opts.dialect.defaultScope;\n let effects = clone(opts.effects ?? []);\n let textMode = opts.text ?? false; // raw-text view for every inline value editor (host-driven)\n let popover: Popover | null = null;\n const inner: ExpressionEditorHandle[] = []; // inline value / arg editors, destroyed on re-render\n host.classList.add(\"exed-root\", \"exed-effects-root\");\n\n const closePopover = (): void => { popover?.close(); popover = null; };\n const commit = (next: EditorEffect[]): void => { effects = clone(next); opts.onChange(effects); render(); };\n\n /** Open the guided value wizard anchored to `anchor`; commit its built source. */\n const openValueWizard = (anchor: HTMLElement, expected: CatalogueEntry | undefined, onCommit: (src: string) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => valueWizard({\n catalogue: opts.catalogue, scopeOrder: opts.scopeOrder ?? [], defaultScope,\n ...(expected?.type ? { expectedType: expected.type } : {}),\n // choicesOf, never a raw field: a quality's ladder lives in `stages`, and reading `enumValues`\n // here told the wizard the type and withheld the values.\n ...(choicesOf(expected) ? { expectedChoices: choicesOf(expected) } : {}),\n onCommit: (src) => { onCommit(src); close(); },\n onCancel: close,\n }), { container: opts.popoverContainer });\n };\n\n /** The declared type of a `set` target (resolved from the catalogue by its ref), so the value editor\n * offers the right \"+ term\" extension (arithmetic for numbers, logical for booleans, none else). */\n const targetType = (target: string): PropertyType | undefined =>\n opts.catalogue.find((e) => refOf(e, defaultScope) === target)?.type;\n\n /** The committed value as an INLINE editable pill editor (click pills to edit; \"+ term\" to extend) -\n * the storylets ExpressionField model. The initial value is picked via the wizard; this edits it.\n * `addTerm` is type-led: numbers extend arithmetically, booleans logically, others not at all. */\n const valueDisplay = (value: string, onChange: (src: string) => void, type?: PropertyType): HTMLElement => {\n const sub = el(\"div\", \"exed-effect-value\");\n const addTerm = type === \"number\" ? \"arithmetic\" : type === \"boolean\" ? \"boolean\" : undefined;\n inner.push(mountExpressionEditor(sub, {\n value, schema: opts.schema, dialect: opts.dialect, catalogue: opts.catalogue,\n scopeOrder: opts.scopeOrder, functions: opts.functions, mode: \"flat\",\n ...(addTerm ? { addTerm } : {}),\n ...(opts.popoverContainer ? { popoverContainer: opts.popoverContainer } : {}),\n text: textMode, onChange,\n }));\n return sub;\n };\n\n /** The target-property picker popover (reuses the catalogue helpers). */\n const pickTarget = (anchor: HTMLElement, accept: PropertyType[] | undefined, onPick: (e: CatalogueEntry) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-picker\");\n const search = el(\"input\", \"exed-input\");\n search.type = \"text\"; search.placeholder = \"Search properties…\";\n const list = el(\"div\", \"exed-picker-list\");\n const pool = filterCatalogue(opts.catalogue, { acceptTypes: accept });\n const draw = (): void => {\n list.replaceChildren();\n const groups = groupByScope(searchCatalogue(pool, search.value, defaultScope), opts.scopeOrder ?? []);\n if (!groups.length) { list.append(el(\"div\", \"exed-hint\", [\"No matching properties.\"])); return; }\n for (const g of groups) {\n list.append(el(\"div\", \"exed-picker-scope\", [g.scope]));\n for (const e of g.entries) {\n const row = button(\"exed-opt\", \"\", () => { onPick(e); close(); });\n row.append(el(\"span\", \"exed-opt-name\", [displayName(e, defaultScope)]), el(\"span\", \"exed-opt-type\", [e.type]));\n if (e.purpose) row.append(el(\"span\", \"exed-opt-purpose\", [e.purpose]));\n list.append(row);\n }\n }\n };\n search.addEventListener(\"input\", draw);\n draw();\n wrap.append(search, list);\n setTimeout(() => search.focus(), 0);\n return wrap;\n }, { container: opts.popoverContainer });\n };\n\n const iconBtn = (glyph: string, title: string, onClick: () => void, danger = false): HTMLButtonElement =>\n button(`exed-eff-icon${danger ? \" danger\" : \"\"}`, glyph, onClick, title);\n\n function setRow(eff: Extract<EditorEffect, { kind: \"set\" }>, i: number): HTMLElement {\n // One line, storylets-style: [target] = [value inline] [actions].\n const row = el(\"div\", \"exed-effect exed-effect-set\");\n // Target pill — click to repick (re-seeds the value to match the new type).\n const targetBtn = button(\"exed-pill exed-pill-prop\", eff.target || \"(pick property)\", (e) => {\n pickTarget(e.currentTarget as HTMLElement, undefined, (entry) => {\n commit(updateAt(effects, i, { target: refOf(entry, defaultScope), value: initialValueFor(entry, defaultScope).src }));\n });\n }, \"change the target property\");\n row.append(targetBtn, el(\"span\", \"exed-effect-eq\", [\"=\"]));\n // Value — an inline pill editor; capture its edits WITHOUT a re-render (it owns its own DOM). The\n // \"+ term\" extension follows the target's declared type (arithmetic / logical / none).\n row.append(valueDisplay(eff.value, (src) => { effects = updateAt(effects, i, { value: src }); opts.onChange(effects); }, targetType(eff.target)));\n row.append(rowActions(i));\n return row;\n }\n\n function emitRow(eff: Extract<EditorEffect, { kind: \"emit\" }>, i: number): HTMLElement {\n const row = el(\"div\", \"exed-effect exed-effect-emit\");\n const head = el(\"div\", \"exed-effect-head\");\n head.append(el(\"span\", \"exed-effect-kw\", [\"emit\"]));\n // The event name is free author text (a label for the host), not a defined dialect function -\n // so it reads as a STRING, not a function call.\n const eventBtn = button(\"exed-pill exed-pill-event\", eff.event ? `\"${eff.event}\"` : \"(name)\", (e) => {\n editEvent(e.currentTarget as HTMLElement, eff.event, (name) => commit(updateAt(effects, i, { event: name })));\n }, \"name the host event\");\n head.append(eventBtn);\n head.append(rowActions(i));\n row.append(head);\n // Arguments — each its own value editor; \"+ arg\" / remove per slot.\n const args = el(\"div\", \"exed-effect-args\");\n eff.args.forEach((a, ai) => {\n const slot = el(\"div\", \"exed-effect-arg\");\n slot.append(valueDisplay(a, (src) => { effects = setArgAt(effects, i, ai, src); opts.onChange(effects); }));\n slot.append(iconBtn(\"✕\", \"remove argument\", () => commit(removeArgAt(effects, i, ai)), true));\n args.append(slot);\n });\n args.append(button(\"exed-eff-add\", \"+ argument\", (e) =>\n openValueWizard(e.currentTarget as HTMLElement, undefined, (src) => commit(addArg(effects, i, src)))));\n row.append(args);\n return row;\n }\n\n /** Event-name editor: a text field, optionally listing known events as quick picks. */\n const editEvent = (anchor: HTMLElement, current: string, onName: (name: string) => void): void => {\n closePopover();\n popover = openPopover(anchor, (close) => {\n const wrap = el(\"div\", \"exed-picker\");\n const input = el(\"input\", \"exed-input\");\n input.type = \"text\"; input.value = current; input.placeholder = \"event name\";\n const apply = (): void => { const v = input.value.trim(); if (v) onName(v); close(); };\n input.addEventListener(\"keydown\", (e) => { if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); apply(); } });\n wrap.append(input);\n for (const name of opts.events ?? []) {\n if (name === current) continue;\n wrap.append(button(\"exed-opt\", name, () => { onName(name); close(); }));\n }\n wrap.append(button(\"exed-btn primary\", \"Apply\", apply));\n setTimeout(() => input.focus(), 0);\n return wrap;\n }, { container: opts.popoverContainer });\n };\n\n const rowActions = (i: number): HTMLElement => {\n const acts = el(\"div\", \"exed-effect-acts\");\n if (i > 0) acts.append(iconBtn(\"↑\", \"move up\", () => commit(moveAt(effects, i, -1))));\n if (i < effects.length - 1) acts.append(iconBtn(\"↓\", \"move down\", () => commit(moveAt(effects, i, 1))));\n acts.append(iconBtn(\"✕\", \"remove effect\", () => commit(removeAt(effects, i)), true));\n return acts;\n };\n\n function render(): void {\n closePopover();\n for (const h of inner.splice(0)) h.destroy(); // tear down the previous value editors\n host.replaceChildren();\n\n const listEl = el(\"div\", \"exed-effect-list\");\n if (!effects.length) listEl.append(el(\"div\", \"exed-effect-empty\", [\"No effects yet.\"]));\n effects.forEach((eff, i) => listEl.append(eff.kind === \"set\" ? setRow(eff, i) : emitRow(eff, i)));\n host.append(listEl);\n\n const bar = el(\"div\", \"exed-effect-addbar\");\n bar.append(button(\"exed-eff-add\", \"+ set property\", (e) => {\n const anchor = e.currentTarget as HTMLElement;\n // Pick the target property, then build its value with the guided wizard (type-aware).\n pickTarget(anchor, undefined, (entry) => {\n const { src, ask } = initialValueFor(entry, defaultScope);\n if (!ask) { commit(addSet(effects, refOf(entry, defaultScope), src)); return; }\n openValueWizard(anchor, entry, (chosen) => commit(addSet(effects, refOf(entry, defaultScope), chosen)));\n });\n }));\n // Emit needs a name first: open the event-name wizard immediately; only add the effect once named.\n // Hidden when the host opts out of emit (set-only effects, e.g. patter - emission rides on gameData).\n if (opts.allowEmit !== false) {\n bar.append(button(\"exed-eff-add\", \"+ emit event\", (e) =>\n editEvent(e.currentTarget as HTMLElement, \"\", (name) => commit(addEmit(effects, name)))));\n }\n host.append(bar);\n }\n\n render();\n return {\n setValue: (next) => { effects = clone(next ?? []); render(); },\n // Flip every live inline value editor in place — keeps any open target/wizard popover alive.\n setText: (on) => { textMode = on; for (const h of inner) h.setText(on); },\n destroy: () => { closePopover(); for (const h of inner.splice(0)) h.destroy(); host.replaceChildren(); host.classList.remove(\"exed-root\", \"exed-effects-root\"); },\n };\n}\n","// ---------------------------------------------------------------------------\n// Read-only PILL previews of a condition / an effects list, for surfaces that\n// show the value compactly (e.g. an inspector row) but want the same pill\n// rendering as the editor - so non-coders read pills everywhere, not name-form\n// text. The pills are non-interactive (pointer-events suppressed in CSS), so a\n// click falls through to whatever wraps the preview (typically a \"open editor\"\n// button). The host keeps a `</>` text fallback for the raw name-form.\n// ---------------------------------------------------------------------------\n\nimport type { Dialect, ExprNode, ExpressionSchema } from \"@wildwinter/expr\";\nimport { validateSource } from \"./validate.js\";\nimport { renderNode } from \"./flat.js\";\nimport { el, openPopover } from \"./dom.js\";\nimport type { CatalogueEntry } from \"./schema.js\";\nimport type { EditCtx } from \"./types.js\";\nimport type { EditorEffect } from \"./effects.js\";\n\nexport interface PreviewOptions {\n schema: ExpressionSchema;\n dialect: Dialect;\n catalogue: CatalogueEntry[];\n scopeOrder?: string[];\n /** Resolve a node id to a readable label for seen()/visits() node pills. */\n nodeLabel?: (id: string) => string;\n /** Host actions for a property pill (e.g. \"Go to definition\"). When set, the\n * preview becomes right-click interactive on property pills (left-click still\n * falls through to the host); otherwise the preview is fully non-interactive. */\n propertyActions?(ref: { scope: string; name: string }): Array<{ label: string; run: () => void }>;\n /** Where the property menu mounts (default document.body). */\n popoverContainer?: HTMLElement;\n}\n\n/** A frozen edit-context: enough for `renderNode` to draw pills, but every editing hook is a no-op\n * (the preview is non-interactive for left-click). `pickNode` is stubbed so node-ref args still\n * render as labelled node pills. When `propertyActions` is set, `openMenu` opens a real popover so\n * the property right-click menu works while left-click editing stays inert (openPopover no-op). */\nfunction frozenCtx(src: string, o: PreviewOptions): { ctx: EditCtx; ast: ExprNode | null } {\n const v = validateSource(src, o.schema, o.dialect);\n const ctx: EditCtx = {\n schema: o.schema, dialect: o.dialect, defaultScope: o.dialect.defaultScope,\n catalogue: o.catalogue, scopeOrder: o.scopeOrder ?? [], functions: [],\n compact: true,\n byPath: v.byPath,\n getAst: () => v.ast as ExprNode,\n apply: () => {},\n openPopover: () => {},\n pickNode: () => {}, // enables labelled node pills; never fires (preview is read-only)\n ...(o.nodeLabel ? { nodeLabel: o.nodeLabel } : {}),\n ...(o.propertyActions ? {\n propertyActions: o.propertyActions,\n openMenu: (anchor, render) => { openPopover(anchor, render, { container: o.popoverContainer }); },\n } : {}),\n };\n return { ctx, ast: v.ast };\n}\n\n/** Pills for one expression string (a condition, or an effect's value / arg). Unparseable -> raw text. */\nfunction exprPills(src: string, o: PreviewOptions): HTMLElement {\n const { ctx, ast } = frozenCtx(src, o);\n return ast ? renderNode(ast, [], ctx) : el(\"span\", \"exed-preview-raw\", [src]);\n}\n\n/** Read-only pill strip for a condition (name-form). Empty/unparseable is the caller's concern; a\n * non-empty unparseable string falls back to its raw text. */\nexport function renderConditionPreview(src: string, o: PreviewOptions): HTMLElement {\n // With propertyActions the preview is right-click interactive (a class enables\n // pointer events on property pills); without, it stays fully non-interactive.\n const cls = o.propertyActions ? \"exed-preview exed-preview-interactive\" : \"exed-preview\";\n return el(\"div\", cls, [exprPills(src, o)]);\n}\n\n/** Read-only pill strip for an effects list: each `set` as `target = value`, each `emit` as\n * `emit event(args…)`, one per line. */\nexport function renderEffectsPreview(effects: EditorEffect[], o: PreviewOptions): HTMLElement {\n const wrap = el(\"div\", \"exed-preview exed-preview-effects\");\n for (const eff of effects) {\n const row = el(\"div\", \"exed-preview-eff\");\n if (eff.kind === \"set\") {\n row.append(el(\"span\", \"exed-pill exed-pill-prop\", [eff.target || \"(property)\"]));\n row.append(el(\"span\", \"exed-effect-eq\", [\"=\"]));\n row.append(exprPills(eff.value, o));\n } else {\n row.append(el(\"span\", \"exed-effect-kw\", [\"emit\"]));\n row.append(el(\"span\", \"exed-pill exed-pill-event\", [eff.event ? `\"${eff.event}\"` : \"(name)\"]));\n row.append(el(\"span\", \"exed-paren\", [\"(\"]));\n eff.args.forEach((a, i) => {\n if (i > 0) row.append(el(\"span\", \"exed-comma\", [\", \"]));\n row.append(exprPills(a, o));\n });\n row.append(el(\"span\", \"exed-paren\", [\")\"]));\n }\n wrap.append(row);\n }\n return wrap;\n}\n"]}