@elaraai/east-ui 1.0.72 → 1.0.73

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.
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The ValueTree ROW MODEL — renderer-agnostic row math over the materialized
7
+ * node tree (#719).
8
+ *
9
+ * A `ValueTreeNodeValue` is a tree; every renderer shows it as a flat list of
10
+ * one-line rows: the expanded nodes depth-first, each with an end-user label
11
+ * (`humanize`d struct fields, content-derived array item titles, dict keys
12
+ * verbatim), a muted summary for branches (`Press · 2.5 · Running`,
13
+ * `3 items`, `Not set`), the typed path an edit reports, and the option /
14
+ * variant controls collapsed into the row. `flattenRows` produces that list
15
+ * for an inline value; `flattenPaged` produces it page by page for a
16
+ * collection root whose rows arrive in windows, with one placeholder row per
17
+ * unloaded root so the extent always spans the whole collection.
18
+ *
19
+ * This module has no DOM and no React: the browser renderer
20
+ * (`east-ui-components`) and the terminal (`e3-ui-cli`) both consume it, so a
21
+ * value reads identically in each — same labels, same summaries, same
22
+ * `pathKey` identities, same expand semantics.
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ import { some, variant } from "@elaraai/east";
27
+ /** Rows at depth < this start expanded when the host sets no `openDepth`
28
+ * (per-row toggles and the toolbar override it). */
29
+ export const DEFAULT_OPEN_DEPTH = 1;
30
+ /** Leaf preview parts a struct row's summary surfaces. */
31
+ export const PREVIEW_PARTS = 3;
32
+ /**
33
+ * The stable text identity of a node path — the row id.
34
+ *
35
+ * @param steps - The path steps
36
+ * @returns `.field`, `[index]`, `{key}`, `?` (some) and `!` (tag) joined; `$` for the root
37
+ */
38
+ export function pathKey(steps) {
39
+ let out = "";
40
+ for (const s of steps) {
41
+ if (s.type === "field")
42
+ out += `.${s.value}`;
43
+ else if (s.type === "index")
44
+ out += `[${s.value}]`;
45
+ else if (s.type === "key")
46
+ out += `{${s.value}}`;
47
+ else if (s.type === "some")
48
+ out += "?";
49
+ else
50
+ out += "!";
51
+ }
52
+ return out === "" ? "$" : out;
53
+ }
54
+ /**
55
+ * "flowRate" / "flow_rate" → "Flow rate" — end-user field labels. Dict keys
56
+ * are user data and stay verbatim.
57
+ *
58
+ * @param name - A struct field name
59
+ * @returns The humanized label
60
+ */
61
+ export function humanize(name) {
62
+ const spaced = name
63
+ .replace(/[_-]+/g, " ")
64
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
65
+ .trim();
66
+ if (spaced === "")
67
+ return name;
68
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1).toLowerCase();
69
+ }
70
+ /** The payload of an option node's value, or undefined for `none`. */
71
+ function optionInner(node) {
72
+ const v = node.value.value;
73
+ return v.type === "some" ? v.value : undefined;
74
+ }
75
+ /**
76
+ * Collapses option / variant wrappers into row controls, leaving the content
77
+ * node the row displays (or `emptyOption` for a none).
78
+ *
79
+ * @param raw - The node as materialized
80
+ * @param rawPath - The path to `raw`
81
+ * @returns The resolved node
82
+ */
83
+ export function resolveNode(raw, rawPath) {
84
+ let node = raw;
85
+ let path = rawPath;
86
+ let variantCtl;
87
+ let optionCtl;
88
+ for (;;) {
89
+ if (node.type === "option") {
90
+ const inner = optionInner(node);
91
+ if (optionCtl === undefined)
92
+ optionCtl = { path, isSome: inner !== undefined };
93
+ if (inner === undefined) {
94
+ return { kind: "emptyOption", leaf: undefined, opaque: undefined, node, path, variantCtl, optionCtl };
95
+ }
96
+ path = [...path, some(null)];
97
+ node = inner;
98
+ continue;
99
+ }
100
+ if (node.type === "variant") {
101
+ if (variantCtl === undefined) {
102
+ variantCtl = { path, tag: node.value.tag, tags: [...node.value.tags] };
103
+ }
104
+ path = [...path, variant("tag", null)];
105
+ node = node.value.value;
106
+ continue;
107
+ }
108
+ break;
109
+ }
110
+ const kind = node.type === "leaf" ? "leaf"
111
+ : node.type === "opaque" ? "opaque"
112
+ : node.type === "struct" ? "struct"
113
+ : node.type === "array" ? "array"
114
+ : "dict";
115
+ return {
116
+ kind,
117
+ leaf: node.type === "leaf" ? node.value : undefined,
118
+ opaque: node.type === "opaque" ? node.value : undefined,
119
+ node, path, variantCtl, optionCtl,
120
+ };
121
+ }
122
+ /**
123
+ * Unwraps option / variant wrappers to the content node (display only).
124
+ *
125
+ * @param node - A node
126
+ * @returns The innermost non-wrapper node (a `none` option stays as is)
127
+ */
128
+ export function contentOf(node) {
129
+ for (;;) {
130
+ if (node.type === "option") {
131
+ const inner = optionInner(node);
132
+ if (inner === undefined)
133
+ return node;
134
+ node = inner;
135
+ continue;
136
+ }
137
+ if (node.type === "variant") {
138
+ node = node.value.value;
139
+ continue;
140
+ }
141
+ return node;
142
+ }
143
+ }
144
+ /**
145
+ * Formats a leaf for display.
146
+ *
147
+ * @param leaf - The leaf value
148
+ * @returns Strings verbatim, numbers as printed, booleans as `true` / `false`,
149
+ * datetimes as `YYYY-MM-DD HH:MM:SS`, null as `—`
150
+ */
151
+ export function fmtLeaf(leaf) {
152
+ switch (leaf.type) {
153
+ case "string": return leaf.value;
154
+ case "integer": return String(leaf.value);
155
+ case "float": return String(leaf.value);
156
+ case "boolean": return leaf.value ? "true" : "false";
157
+ case "datetime": return leaf.value.toISOString().replace("T", " ").slice(0, 19);
158
+ default: return "—";
159
+ }
160
+ }
161
+ /**
162
+ * One short preview token for a struct field's value, or undefined.
163
+ *
164
+ * @param node - The field's node
165
+ * @returns The token (a variant's humanized tag, a non-empty leaf's text), or undefined
166
+ */
167
+ export function previewPart(node) {
168
+ for (;;) {
169
+ if (node.type === "option") {
170
+ const inner = optionInner(node);
171
+ if (inner === undefined)
172
+ return undefined;
173
+ node = inner;
174
+ continue;
175
+ }
176
+ break;
177
+ }
178
+ if (node.type === "variant")
179
+ return humanize(node.value.tag);
180
+ if (node.type === "leaf") {
181
+ if (node.value.type === "null")
182
+ return undefined;
183
+ const text = fmtLeaf(node.value);
184
+ return text === "" ? undefined : text;
185
+ }
186
+ return undefined;
187
+ }
188
+ /**
189
+ * The muted value-cell text for a resolved branch node.
190
+ *
191
+ * @param node - A resolved struct / array / dict node
192
+ * @returns A ` · `-joined preview of the first leaf parts for structs (else
193
+ * `N fields`), `N items` for arrays, `N entries` for dicts, `Empty` when empty
194
+ */
195
+ export function summaryOf(node) {
196
+ if (node.type === "struct") {
197
+ const parts = [];
198
+ for (const f of node.value.fields) {
199
+ const part = previewPart(f.node);
200
+ if (part !== undefined)
201
+ parts.push(part);
202
+ if (parts.length >= PREVIEW_PARTS)
203
+ break;
204
+ }
205
+ if (parts.length > 0)
206
+ return parts.join(" · ");
207
+ const n = node.value.fields.length;
208
+ return n === 0 ? "Empty" : n === 1 ? "1 field" : `${n} fields`;
209
+ }
210
+ if (node.type === "array") {
211
+ const n = node.value.items.length;
212
+ return n === 0 ? "Empty" : n === 1 ? "1 item" : `${n} items`;
213
+ }
214
+ if (node.type === "dict") {
215
+ const n = node.value.entries.length;
216
+ return n === 0 ? "Empty" : n === 1 ? "1 entry" : `${n} entries`;
217
+ }
218
+ return "";
219
+ }
220
+ /**
221
+ * A content-derived title for an array element — its first non-empty string
222
+ * leaf (fields searched in order), else "Item N".
223
+ *
224
+ * @param node - The element node
225
+ * @param index - The element's 0-based index
226
+ * @returns The title
227
+ */
228
+ export function itemTitle(node, index) {
229
+ const content = contentOf(node);
230
+ if (content.type === "struct") {
231
+ for (const f of content.value.fields) {
232
+ const c = contentOf(f.node);
233
+ if (c.type === "leaf" && c.value.type === "string" && c.value.value !== "") {
234
+ return c.value.value;
235
+ }
236
+ }
237
+ }
238
+ return `Item ${index + 1}`;
239
+ }
240
+ /**
241
+ * The children of a compound node with their labels and binding steps.
242
+ *
243
+ * @param node - A struct / array / dict node (anything else has no children)
244
+ * @returns The child entries in display order
245
+ */
246
+ export function childrenOf(node) {
247
+ if (node.type === "struct") {
248
+ return node.value.fields.map(f => ({ label: humanize(f.name), node: f.node, step: variant("field", f.name) }));
249
+ }
250
+ if (node.type === "array") {
251
+ return node.value.items.map((n, i) => ({ label: itemTitle(n, i), node: n, step: variant("index", BigInt(i)) }));
252
+ }
253
+ if (node.type === "dict") {
254
+ // `label` is display, `key` the round-trippable step text; the
255
+ // fallback covers host-constructed node shapes that predate `label`.
256
+ return node.value.entries.map(e => ({
257
+ label: e.label ?? e.key,
258
+ node: e.node,
259
+ step: variant("key", e.key),
260
+ }));
261
+ }
262
+ return [];
263
+ }
264
+ /**
265
+ * The "Add item" / "Add entry" ghost row an expanded editable collection
266
+ * ends in.
267
+ *
268
+ * @param parentId - The collection row's id (undefined for a root collection)
269
+ * @param containerPath - The collection's path — the insert target
270
+ * @param kind - Array or dict append
271
+ * @param depth - The ghost row's depth
272
+ * @param posinset - Its 1-based sibling position
273
+ * @param setsize - The sibling count
274
+ * @returns The ghost row
275
+ */
276
+ export function appendRowModel(parentId, containerPath, kind, depth, posinset, setsize) {
277
+ return {
278
+ id: `${parentId ?? "$"}/$append`,
279
+ parentId, depth,
280
+ label: kind === "appendArray" ? "Add item" : "Add entry",
281
+ kind,
282
+ leaf: undefined, opaque: undefined, summary: undefined,
283
+ path: containerPath, ownPath: containerPath,
284
+ variantCtl: undefined, optionCtl: undefined,
285
+ removable: false, expandable: false, expanded: false,
286
+ posinset, setsize,
287
+ };
288
+ }
289
+ /**
290
+ * Flattens one node's visible subtree, depth-first, into `ctx.rows`.
291
+ *
292
+ * @param ctx - The flatten context (expansion state, capabilities, output)
293
+ * @param label - The row's label
294
+ * @param raw - The node as materialized
295
+ * @param rawPath - The path to `raw` (the row's own path)
296
+ * @param parentId - The parent row's id
297
+ * @param depth - The row's depth
298
+ * @param removable - Whether the row may be removed from its container
299
+ * @param posinset - Its 1-based sibling position
300
+ * @param setsize - The sibling count
301
+ */
302
+ export function visitNode(ctx, label, raw, rawPath, parentId, depth, removable, posinset, setsize) {
303
+ const r = resolveNode(raw, rawPath);
304
+ const id = pathKey(rawPath);
305
+ const kids = childrenOf(r.node);
306
+ const insertable = ctx.canInsert && (r.kind === "array" ||
307
+ (r.kind === "dict" && r.node.type === "dict" && r.node.value.editable));
308
+ const expandable = kids.length > 0 || insertable;
309
+ const expanded = expandable && (ctx.open[id] ?? depth < ctx.openDepth);
310
+ let summary = r.kind === "emptyOption" ? "Not set"
311
+ : (r.kind === "struct" || r.kind === "array" || r.kind === "dict") ? summaryOf(r.node)
312
+ : undefined;
313
+ // A content-derived item title already IS the first preview part —
314
+ // don't repeat it beside itself.
315
+ if (summary !== undefined && summary !== label && summary.startsWith(`${label} · `)) {
316
+ summary = summary.slice(label.length + 3);
317
+ }
318
+ else if (summary === label) {
319
+ summary = undefined;
320
+ }
321
+ ctx.rows.push({
322
+ id, parentId, depth, label,
323
+ kind: r.kind, leaf: r.leaf, opaque: r.opaque, summary,
324
+ path: r.path, ownPath: rawPath,
325
+ variantCtl: r.variantCtl, optionCtl: r.optionCtl,
326
+ removable, expandable, expanded,
327
+ posinset, setsize,
328
+ });
329
+ if (expanded) {
330
+ const kidsRemovable = ctx.canRemove && (r.kind === "array" ||
331
+ (r.kind === "dict" && r.node.type === "dict" && r.node.value.editable));
332
+ const total = kids.length + (insertable ? 1 : 0);
333
+ kids.forEach((k, i) => {
334
+ visitNode(ctx, k.label, k.node, [...r.path, k.step], id, depth + 1, kidsRemovable, i + 1, total);
335
+ });
336
+ if (insertable) {
337
+ ctx.rows.push(appendRowModel(id, r.path, r.kind === "array" ? "appendArray" : "appendDict", depth + 1, total, total));
338
+ }
339
+ }
340
+ }
341
+ /**
342
+ * Flattens the visible (expanded) rows of an inline tree, depth-first. A
343
+ * compound root lists its children directly (no synthetic top row); anything
344
+ * else is a single `Value` row. Expanded editable collections end in an
345
+ * append ghost row.
346
+ *
347
+ * @param root - The materialized root node
348
+ * @param open - Per-row expansion overrides keyed by row id
349
+ * @param openDepth - Rows at depth < this start expanded
350
+ * @param canRemove - Whether the host can remove elements / entries
351
+ * @param canInsert - Whether the host can append elements / entries
352
+ * @returns The visible rows in order
353
+ */
354
+ export function flattenRows(root, open, openDepth, canRemove, canInsert) {
355
+ const ctx = { open, openDepth, canRemove, canInsert, rows: [] };
356
+ const rows = ctx.rows;
357
+ if (root.type === "struct" || root.type === "array" || root.type === "dict") {
358
+ const rootInsertable = canInsert && (root.type === "array" || (root.type === "dict" && root.value.editable));
359
+ const kidsRemovable = canRemove && (root.type === "array" || (root.type === "dict" && root.value.editable));
360
+ const kids = childrenOf(root);
361
+ const total = kids.length + (rootInsertable ? 1 : 0);
362
+ kids.forEach((k, i) => {
363
+ visitNode(ctx, k.label, k.node, [k.step], undefined, 0, kidsRemovable, i + 1, total);
364
+ });
365
+ if (rootInsertable) {
366
+ rows.push(appendRowModel(undefined, [], root.type === "array" ? "appendArray" : "appendDict", 0, total, total));
367
+ }
368
+ }
369
+ else {
370
+ visitNode(ctx, "Value", root, [], undefined, 0, false, 1, 1);
371
+ }
372
+ return rows;
373
+ }
374
+ /**
375
+ * Flattens the loaded pages of a paged collection root. Paged roots are
376
+ * read-only at the row level (no append ghost, no row removal) — leaf edits
377
+ * inside a loaded row still work through the ordinary callbacks, with global
378
+ * path steps.
379
+ *
380
+ * @param paging - The paging contract (totals, page size, loaded pages)
381
+ * @param open - Per-row expansion overrides keyed by row id
382
+ * @param openDepth - Rows at depth < this start expanded
383
+ * @returns The paged flat structure
384
+ */
385
+ export function flattenPaged(paging, open, openDepth) {
386
+ const { totalRows, pageSize, pages } = paging;
387
+ const pageCount = Math.max(0, Math.ceil(totalRows / pageSize));
388
+ const rootRowsInPage = (p) => Math.max(0, Math.min(pageSize, totalRows - p * pageSize));
389
+ const pageModels = new Map();
390
+ const loadedRows = [];
391
+ const prefix = new Array(pageCount + 1);
392
+ prefix[0] = 0;
393
+ for (let p = 0; p < pageCount; p++) {
394
+ const loaded = pages.get(p);
395
+ if (loaded === undefined) {
396
+ prefix[p + 1] = prefix[p] + rootRowsInPage(p);
397
+ continue;
398
+ }
399
+ const ctx = { open, openDepth, canRemove: false, canInsert: false, rows: [] };
400
+ loaded.forEach((r, i) => {
401
+ const globalRow = p * pageSize + i;
402
+ const label = r.label ?? itemTitle(r.node, globalRow);
403
+ visitNode(ctx, label, r.node, [r.step], undefined, 0, false, globalRow + 1, totalRows);
404
+ });
405
+ pageModels.set(p, ctx.rows);
406
+ loadedRows.push(...ctx.rows);
407
+ prefix[p + 1] = prefix[p] + ctx.rows.length;
408
+ }
409
+ return { totalFlat: prefix[pageCount] ?? 0, prefix, pageModels, loadedRows, pageCount, rootRowsInPage };
410
+ }
411
+ /**
412
+ * Binary-searches the page whose flat range contains `flatIdx`.
413
+ *
414
+ * @param prefix - The prefix sums from {@link flattenPaged}
415
+ * @param flatIdx - A flat row index
416
+ * @returns The page index
417
+ */
418
+ export function pageOfFlat(prefix, flatIdx) {
419
+ let lo = 0, hi = prefix.length - 2;
420
+ while (lo < hi) {
421
+ const mid = (lo + hi) >> 1;
422
+ if (prefix[mid + 1] <= flatIdx)
423
+ lo = mid + 1;
424
+ else
425
+ hi = mid;
426
+ }
427
+ return lo;
428
+ }
429
+ /**
430
+ * Flat index of global root row `globalRow`: through the loaded page's
431
+ * flattened models when present (expanded children shift later rows), else
432
+ * the one-placeholder-per-root arithmetic.
433
+ *
434
+ * @param flat - The paged flat structure
435
+ * @param paging - The paging contract
436
+ * @param globalRow - A global root row (clamped to the collection)
437
+ * @returns The flat index, or undefined for an empty collection
438
+ */
439
+ export function pagedFlatIndexOfRoot(flat, paging, globalRow) {
440
+ if (paging.totalRows === 0)
441
+ return undefined;
442
+ const clamped = Math.max(0, Math.min(paging.totalRows - 1, globalRow));
443
+ const p = Math.floor(clamped / paging.pageSize);
444
+ const base = flat.prefix[p];
445
+ if (base === undefined)
446
+ return undefined;
447
+ const offsetInPage = clamped - p * paging.pageSize;
448
+ const models = flat.pageModels.get(p);
449
+ if (models === undefined)
450
+ return base + offsetInPage;
451
+ let roots = 0;
452
+ for (let i = 0; i < models.length; i++) {
453
+ if (models[i].depth === 0) {
454
+ if (roots === offsetInPage)
455
+ return base + i;
456
+ roots++;
457
+ }
458
+ }
459
+ return undefined;
460
+ }
461
+ /**
462
+ * Flat index of the `rootRow`-th depth-0 row of an inline tree.
463
+ *
464
+ * @param rows - The flattened rows
465
+ * @param rootRow - A 0-based root row ordinal
466
+ * @returns The flat index, or undefined when there are fewer roots
467
+ */
468
+ export function flatIndexOfRoot(rows, rootRow) {
469
+ let roots = 0;
470
+ for (let i = 0; i < rows.length; i++) {
471
+ if (rows[i].depth === 0) {
472
+ if (roots === rootRow)
473
+ return i;
474
+ roots++;
475
+ }
476
+ }
477
+ return undefined;
478
+ }
479
+ /**
480
+ * Resolves a paged flat row: a loaded model, or the global root index of a
481
+ * placeholder.
482
+ *
483
+ * @param flat - The paged flat structure
484
+ * @param paging - The paging contract
485
+ * @param flatIdx - A flat row index
486
+ * @returns The row model, or the placeholder's global root row
487
+ */
488
+ export function pagedRowAt(flat, paging, flatIdx) {
489
+ const p = pageOfFlat(flat.prefix, flatIdx);
490
+ const offsetInPage = flatIdx - flat.prefix[p];
491
+ const models = flat.pageModels.get(p);
492
+ if (models !== undefined) {
493
+ return { kind: "model", row: models[offsetInPage] };
494
+ }
495
+ return { kind: "placeholder", globalRow: p * paging.pageSize + offsetInPage };
496
+ }
497
+ /**
498
+ * Drops loaded pages far from the window `[firstPage, lastPage]`, keeping
499
+ * the window itself and then the nearest pages up to the retention cap.
500
+ * Returns the SAME map (no re-render) while under the cap.
501
+ *
502
+ * @typeParam T - The page payload
503
+ * @param pages - The loaded pages by index
504
+ * @param firstPage - First page of the visible window
505
+ * @param lastPage - Last page of the visible window
506
+ * @param max - Retention cap
507
+ * @returns The retained pages (the input map when nothing was dropped)
508
+ */
509
+ export function pruneRetainedPages(pages, firstPage, lastPage, max) {
510
+ if (pages.size <= max)
511
+ return pages;
512
+ const distance = (p) => (p < firstPage ? firstPage - p : p > lastPage ? p - lastPage : 0);
513
+ const keep = [...pages.keys()].sort((a, b) => distance(a) - distance(b) || a - b).slice(0, max);
514
+ const kept = new Map();
515
+ for (const p of keep.sort((a, b) => a - b)) {
516
+ kept.set(p, pages.get(p));
517
+ }
518
+ return kept;
519
+ }
520
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../../../src/collections/value-tree/flatten.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,8 @@ import { ValueTreePathType, ValueTreeLeafType } from "./types.js";
36
36
  export { ValueTreeStepType, ValueTreePathType, ValueTreeLeafType, ValueTreeNodeType, ValueTreeStyleType, ValueTreeRootType, } from "./types.js";
37
37
  import { materialize, applyEdit, dictKeyLabel } from "./materialize.js";
38
38
  export { materialize, applyEdit, dictKeyLabel, type ValueTreeNodeValue, type ValueTreeLeafValue, type ValueTreeStepValue, type ValueTreeEditOp, } from "./materialize.js";
39
+ import { flattenRows, flattenPaged, pageOfFlat, pagedRowAt, pagedFlatIndexOfRoot, flatIndexOfRoot, pruneRetainedPages, humanize, pathKey, itemTitle, summaryOf, childrenOf, fmtLeaf, type RowModel as FlattenRowModel, type RowKind as FlattenRowKind, type ChildEntry as FlattenChildEntry, type FlattenCtx as FlattenContext, type ValueTreePagedRow as FlattenPagedRow, type ValueTreePaging as FlattenPaging, type PagedFlat as FlattenPagedFlat, type ResolvedNode as FlattenResolvedNode } from "./flatten.js";
40
+ import { keyRangePredicates, parseKeyInput, findKeyInline, type DatasetKeyQuery as KeySearchQuery, type DatasetKeyMatchRange as KeySearchMatchRange, type ParsedKeyInput as KeySearchParsedInput } from "./key-search.js";
39
41
  /** One recorded step of a scope path (host-side; mirrors the editable
40
42
  * subset of {@link ValueTreeStepType}). */
41
43
  export type ValueTreeScopeStep = {
@@ -236,6 +238,57 @@ export declare const ValueTree: {
236
238
  * round-trippable text).
237
239
  */
238
240
  readonly keyLabel: typeof dictKeyLabel;
241
+ /**
242
+ * The ROW MODEL of an inline tree — the visible (expanded) rows of a
243
+ * materialized node, depth-first, with end-user labels, branch
244
+ * summaries and typed edit paths. Every renderer (browser, terminal)
245
+ * lists a value through this so it reads identically everywhere.
246
+ */
247
+ readonly flatten: typeof flattenRows;
248
+ /**
249
+ * The row model of a PAGED collection root — per-page flattened rows
250
+ * plus the prefix sums that place placeholder rows for unloaded pages,
251
+ * so the extent always spans the whole collection.
252
+ */
253
+ readonly flattenPaged: typeof flattenPaged;
254
+ /** Binary-searches the page whose flat range contains a flat row index. */
255
+ readonly pageOfFlat: typeof pageOfFlat;
256
+ /** Resolves a paged flat row to a loaded model or a placeholder's global root row. */
257
+ readonly pagedRowAt: typeof pagedRowAt;
258
+ /** Flat index of a global root row of a paged tree (through loaded pages when present). */
259
+ readonly pagedFlatIndexOfRoot: typeof pagedFlatIndexOfRoot;
260
+ /** Flat index of the N-th depth-0 row of an inline tree. */
261
+ readonly flatIndexOfRoot: typeof flatIndexOfRoot;
262
+ /**
263
+ * Drops loaded pages far from the visible window, keeping the window
264
+ * and then the nearest pages up to a retention cap (the same map back
265
+ * while under the cap).
266
+ */
267
+ readonly pruneRetainedPages: typeof pruneRetainedPages;
268
+ /** "flowRate" / "flow_rate" → "Flow rate" — the end-user field label. */
269
+ readonly humanize: typeof humanize;
270
+ /** The stable text identity of a node path — the row id. */
271
+ readonly pathKey: typeof pathKey;
272
+ /** A content-derived title for an array element, else "Item N". */
273
+ readonly itemTitle: typeof itemTitle;
274
+ /** The muted value-cell text of a branch node (preview / counts). */
275
+ readonly summaryOf: typeof summaryOf;
276
+ /** The children of a compound node with their labels and binding steps. */
277
+ readonly childrenOf: typeof childrenOf;
278
+ /** Formats a primitive leaf for display. */
279
+ readonly fmtLeaf: typeof fmtLeaf;
280
+ /** Rows at depth < this start expanded when the host sets no `openDepth`. */
281
+ readonly DEFAULT_OPEN_DEPTH: 1;
282
+ /**
283
+ * The monotone lower / upper row predicates of a RANGE key query over
284
+ * decoded keys in canonical order — the client-side mirror of the
285
+ * server's fence search, for inline values.
286
+ */
287
+ readonly keyRangePredicates: typeof keyRangePredicates;
288
+ /** Turns typed key-search text into a wire query, or a hint when it cannot parse. */
289
+ readonly parseKeyInput: typeof parseKeyInput;
290
+ /** Locates a key query over decoded keys — the inline `datasetFindKey`. */
291
+ readonly findKeyInline: typeof findKeyInline;
239
292
  readonly Types: {
240
293
  /** The full ValueTree payload. */
241
294
  readonly Root: StructType<{
@@ -394,4 +447,35 @@ export declare const ValueTree: {
394
447
  }>;
395
448
  };
396
449
  };
450
+ /**
451
+ * Row-model types under the `ValueTree` namespace (declaration-merged onto
452
+ * the factory object; types only — nothing is emitted).
453
+ */
454
+ export declare namespace ValueTree {
455
+ /** The types of the row model ({@link ValueTree.flatten} / {@link ValueTree.flattenPaged}). */
456
+ namespace Rows {
457
+ /** One flattened row. */
458
+ type RowModel = FlattenRowModel;
459
+ /** The kind of a flattened row. */
460
+ type RowKind = FlattenRowKind;
461
+ /** One child of a compound node with its label and binding step. */
462
+ type ChildEntry = FlattenChildEntry;
463
+ /** The shared flatten context. */
464
+ type FlattenCtx = FlattenContext;
465
+ /** A node with its option / variant wrappers collapsed into controls. */
466
+ type ResolvedNode = FlattenResolvedNode;
467
+ /** One pageable root row supplied by a paging host. */
468
+ type PagedRow = FlattenPagedRow;
469
+ /** The remote-paging contract for a collection-rooted tree. */
470
+ type Paging = FlattenPaging;
471
+ /** The paged-mode flat structure. */
472
+ type PagedFlat = FlattenPagedFlat;
473
+ /** A key query in wire form. */
474
+ type KeyQuery = KeySearchQuery;
475
+ /** Where a key query landed in the canonical key order. */
476
+ type KeyMatchRange = KeySearchMatchRange;
477
+ /** A parsed key-search input: a query, or the hint to show instead. */
478
+ type ParsedKeyInput = KeySearchParsedInput;
479
+ }
480
+ }
397
481
  //# sourceMappingURL=index.d.ts.map