@toclocoinc/lattice-grid 1.67.0 → 1.68.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +1 -1
  2. package/angular/package.json +1 -1
  3. package/docs/API.html +5334 -3788
  4. package/docs/api-detail.html +40 -5
  5. package/lattice-grid.d.ts +3368 -2
  6. package/lattice-grid.esm.min.js +32 -10
  7. package/lattice-grid.min.cjs +32 -10
  8. package/lattice-grid.min.js +32 -10
  9. package/modules/ai.d.ts +64 -1
  10. package/modules/ai.esm.min.js +3 -3
  11. package/modules/ai.min.cjs +3 -3
  12. package/modules/ai.min.js +3 -3
  13. package/modules/angular.d.ts +1 -1
  14. package/modules/angular.esm.min.js +3 -3
  15. package/modules/angular.min.cjs +3 -3
  16. package/modules/angular.min.js +3 -3
  17. package/modules/chart-alluvial.d.ts +1 -1
  18. package/modules/chart-alluvial.esm.min.js +1 -1
  19. package/modules/chart-alluvial.min.cjs +1 -1
  20. package/modules/chart-alluvial.min.js +1 -1
  21. package/modules/chart-arc.d.ts +1 -1
  22. package/modules/chart-arc.esm.min.js +1 -1
  23. package/modules/chart-arc.min.cjs +1 -1
  24. package/modules/chart-arc.min.js +1 -1
  25. package/modules/chart-bubblemap.d.ts +1 -1
  26. package/modules/chart-bubblemap.esm.min.js +1 -1
  27. package/modules/chart-bubblemap.min.cjs +1 -1
  28. package/modules/chart-bubblemap.min.js +1 -1
  29. package/modules/chart-bump.d.ts +1 -1
  30. package/modules/chart-bump.esm.min.js +1 -1
  31. package/modules/chart-bump.min.cjs +1 -1
  32. package/modules/chart-bump.min.js +1 -1
  33. package/modules/chart-calendar.d.ts +1 -1
  34. package/modules/chart-calendar.esm.min.js +1 -1
  35. package/modules/chart-calendar.min.cjs +1 -1
  36. package/modules/chart-calendar.min.js +1 -1
  37. package/modules/chart-decomposition.d.ts +1 -1
  38. package/modules/chart-decomposition.esm.min.js +1 -1
  39. package/modules/chart-decomposition.min.cjs +1 -1
  40. package/modules/chart-decomposition.min.js +1 -1
  41. package/modules/chart-diverging.d.ts +1 -1
  42. package/modules/chart-diverging.esm.min.js +1 -1
  43. package/modules/chart-diverging.min.cjs +1 -1
  44. package/modules/chart-diverging.min.js +1 -1
  45. package/modules/chart-dumbbell.d.ts +1 -1
  46. package/modules/chart-dumbbell.esm.min.js +1 -1
  47. package/modules/chart-dumbbell.min.cjs +1 -1
  48. package/modules/chart-dumbbell.min.js +1 -1
  49. package/modules/chart-fan.d.ts +1 -1
  50. package/modules/chart-fan.esm.min.js +1 -1
  51. package/modules/chart-fan.min.cjs +1 -1
  52. package/modules/chart-fan.min.js +1 -1
  53. package/modules/chart-hexbin.d.ts +1 -1
  54. package/modules/chart-hexbin.esm.min.js +1 -1
  55. package/modules/chart-hexbin.min.cjs +1 -1
  56. package/modules/chart-hexbin.min.js +1 -1
  57. package/modules/chart-hexmap.d.ts +1 -1
  58. package/modules/chart-hexmap.esm.min.js +1 -1
  59. package/modules/chart-hexmap.min.cjs +1 -1
  60. package/modules/chart-hexmap.min.js +1 -1
  61. package/modules/chart-icicle.d.ts +1 -1
  62. package/modules/chart-icicle.esm.min.js +1 -1
  63. package/modules/chart-icicle.min.cjs +1 -1
  64. package/modules/chart-icicle.min.js +1 -1
  65. package/modules/chart-markermap.d.ts +1 -1
  66. package/modules/chart-markermap.esm.min.js +1 -1
  67. package/modules/chart-markermap.min.cjs +1 -1
  68. package/modules/chart-markermap.min.js +1 -1
  69. package/modules/chart-parallel.d.ts +1 -1
  70. package/modules/chart-parallel.esm.min.js +1 -1
  71. package/modules/chart-parallel.min.cjs +1 -1
  72. package/modules/chart-parallel.min.js +1 -1
  73. package/modules/chart-ridgeline.d.ts +1 -1
  74. package/modules/chart-ridgeline.esm.min.js +1 -1
  75. package/modules/chart-ridgeline.min.cjs +1 -1
  76. package/modules/chart-ridgeline.min.js +1 -1
  77. package/modules/chart-roc.d.ts +1 -1
  78. package/modules/chart-roc.esm.min.js +1 -1
  79. package/modules/chart-roc.min.cjs +1 -1
  80. package/modules/chart-roc.min.js +1 -1
  81. package/modules/chart-slope.d.ts +1 -1
  82. package/modules/chart-slope.esm.min.js +1 -1
  83. package/modules/chart-slope.min.cjs +1 -1
  84. package/modules/chart-slope.min.js +1 -1
  85. package/modules/chart-splom.d.ts +1 -1
  86. package/modules/chart-splom.esm.min.js +1 -1
  87. package/modules/chart-splom.min.cjs +1 -1
  88. package/modules/chart-splom.min.js +1 -1
  89. package/modules/chart-waffle.d.ts +1 -1
  90. package/modules/chart-waffle.esm.min.js +1 -1
  91. package/modules/chart-waffle.min.cjs +1 -1
  92. package/modules/chart-waffle.min.js +1 -1
  93. package/modules/charts.d.ts +16 -1
  94. package/modules/charts.esm.min.js +1391 -1257
  95. package/modules/charts.min.cjs +1391 -1257
  96. package/modules/charts.min.js +1391 -1257
  97. package/modules/data-router.d.ts +227 -1
  98. package/modules/data-router.esm.min.js +204 -8
  99. package/modules/data-router.min.cjs +204 -8
  100. package/modules/data-router.min.js +204 -8
  101. package/modules/devtools.d.ts +1 -1
  102. package/modules/devtools.esm.min.js +1 -1
  103. package/modules/devtools.min.cjs +1 -1
  104. package/modules/devtools.min.js +1 -1
  105. package/modules/dhtmlx-compat.d.ts +1 -1
  106. package/modules/dhtmlx-compat.esm.min.js +3 -3
  107. package/modules/dhtmlx-compat.min.cjs +3 -3
  108. package/modules/dhtmlx-compat.min.js +3 -3
  109. package/modules/gantt.d.ts +302 -1
  110. package/modules/gantt.esm.min.js +32 -7
  111. package/modules/gantt.min.cjs +32 -7
  112. package/modules/gantt.min.js +32 -7
  113. package/modules/geo-europe-nuts.d.ts +1 -1
  114. package/modules/geo-europe-nuts.esm.min.js +1 -1
  115. package/modules/geo-uk.d.ts +1 -1
  116. package/modules/geo-uk.esm.min.js +1 -1
  117. package/modules/geo-us-states.d.ts +1 -1
  118. package/modules/geo-us-states.esm.min.js +1 -1
  119. package/modules/geo-world-110m.d.ts +1 -1
  120. package/modules/geo-world-110m.esm.min.js +1 -1
  121. package/modules/geo-world-50m.d.ts +1 -1
  122. package/modules/geo-world-50m.esm.min.js +1 -1
  123. package/modules/htmx.d.ts +1 -1
  124. package/modules/htmx.esm.min.js +32 -10
  125. package/modules/htmx.min.cjs +32 -10
  126. package/modules/htmx.min.js +32 -10
  127. package/modules/kanban.d.ts +233 -1
  128. package/modules/kanban.esm.min.js +3 -3
  129. package/modules/kanban.min.cjs +3 -3
  130. package/modules/kanban.min.js +3 -3
  131. package/modules/kpi.d.ts +196 -8
  132. package/modules/kpi.esm.min.js +32 -7
  133. package/modules/kpi.min.cjs +32 -7
  134. package/modules/kpi.min.js +32 -7
  135. package/modules/layout.d.ts +117 -1
  136. package/modules/layout.esm.min.js +3 -3
  137. package/modules/layout.min.cjs +3 -3
  138. package/modules/layout.min.js +3 -3
  139. package/modules/mock-socket.d.ts +6 -1
  140. package/modules/mock-socket.esm.min.js +1 -1
  141. package/modules/mock-socket.min.cjs +1 -1
  142. package/modules/mock-socket.min.js +1 -1
  143. package/modules/react.d.ts +14 -1
  144. package/modules/react.esm.min.js +3 -3
  145. package/modules/react.min.cjs +3 -3
  146. package/modules/react.min.js +3 -3
  147. package/modules/svelte.d.ts +1 -1
  148. package/modules/svelte.esm.min.js +3 -3
  149. package/modules/svelte.min.cjs +3 -3
  150. package/modules/svelte.min.js +3 -3
  151. package/modules/tabs.d.ts +30 -1
  152. package/modules/tabs.esm.min.js +13 -14
  153. package/modules/tabs.min.cjs +13 -14
  154. package/modules/tabs.min.js +13 -14
  155. package/modules/vue.d.ts +8 -1
  156. package/modules/vue.esm.min.js +3 -3
  157. package/modules/vue.min.cjs +3 -3
  158. package/modules/vue.min.js +3 -3
  159. package/modules/webcomponent.d.ts +113 -1
  160. package/modules/webcomponent.esm.min.js +32 -10
  161. package/modules/webcomponent.min.cjs +32 -10
  162. package/modules/webcomponent.min.js +32 -10
  163. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, kanban module type declarations
2
+ * Lattice Grid 1.68.1, kanban module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -14,28 +14,93 @@ type KanbanRow = Record<string, unknown>;
14
14
  * and carried for the later cycles that render them.
15
15
  */
16
16
  interface KanbanCard {
17
+ /** The card's identity, from the board's `rowKey`. */
17
18
  key: unknown;
19
+ /**
20
+ * The row behind the card. On a grid-bound board this is the materialised object the
21
+ * board read off the grid, not the grid's own row.
22
+ */
18
23
  row: KanbanRow;
24
+ /**
25
+ * Which column the card sits in — the stringified group value — or null when the row's
26
+ * group value is null or undefined, which leaves the card unplaced.
27
+ */
19
28
  columnId: string | null;
29
+ /**
30
+ * The card's estimate, from `pointsProperty`. Zero when there is no points property or
31
+ * the value is not a finite number.
32
+ */
20
33
  points: number;
34
+ /**
35
+ * Whether the points value was a finite number. A card without points contributes
36
+ * nothing to a column's sum.
37
+ */
21
38
  hasPoints: boolean;
39
+ /**
40
+ * The raw value of `orderProperty`, which ranks the card inside its column. Undefined
41
+ * when no order property is configured.
42
+ */
22
43
  order?: unknown;
44
+ /**
45
+ * The raw value of `swimlaneProperty`, the lane the card belongs to. Undefined when no
46
+ * swimlane property is configured.
47
+ */
23
48
  swimlane?: unknown;
49
+ /**
50
+ * The raw value of `sprintProperty`, used by the sprint selection. Undefined when no
51
+ * sprint property is configured.
52
+ */
24
53
  sprint?: unknown;
54
+ /**
55
+ * The raw value of `epicProperty`, used by the epic selection. Undefined when no epic
56
+ * property is configured.
57
+ */
25
58
  epic?: unknown;
59
+ /**
60
+ * The card template's text, one entry per `card` mapping. A mapping that names a grid
61
+ * column is read through that column's own formatter, so it reads exactly as the cell
62
+ * does; anything missing is ''.
63
+ */
26
64
  fields: Record<string, string>;
27
65
  }
28
66
 
29
67
  /** A column with its cards and aggregates. `over` is true when `count` exceeds `wipLimit`. */
30
68
  interface KanbanColumn {
69
+ /**
70
+ * The column's identity — a configured column's `id`, or the stringified group value a
71
+ * data-driven column came from.
72
+ */
31
73
  id: string;
74
+ /** The heading shown above the column. Defaults to the id, humanised. */
32
75
  title: string;
76
+ /**
77
+ * The accent colour drawn as a dot in the header, as configured. Null when the column
78
+ * def set none.
79
+ */
33
80
  color: string | null;
81
+ /**
82
+ * The work-in-progress limit for this column, or null when it has none. Advisory unless
83
+ * `enforceWip` is on.
84
+ */
34
85
  wipLimit: number | null;
86
+ /**
87
+ * Whether the column is currently collapsed to a strip — either configured so, or
88
+ * collapsed by the user.
89
+ */
35
90
  collapsed: boolean;
91
+ /**
92
+ * The column's cards that survive the board's filters, in arrival order, re-sorted by
93
+ * `orderProperty` when one is configured.
94
+ */
36
95
  cards: KanbanCard[];
96
+ /** How many cards the column holds — the length of `cards`, after filtering. */
37
97
  count: number;
98
+ /** The sum of the column's card points; cards without a finite points value add nothing. */
38
99
  points: number;
100
+ /**
101
+ * True when the column has a WIP limit and its count exceeds it. The header shows this
102
+ * whether or not `enforceWip` refuses the move.
103
+ */
39
104
  over: boolean;
40
105
  }
41
106
 
@@ -60,8 +125,17 @@ type KanbanColumnDef = string | {
60
125
 
61
126
  /** A card field editor handle returned by a host editor factory. */
62
127
  interface KanbanEditor {
128
+ /** The editor's element. The board appends it to the card being edited. */
63
129
  el: HTMLElement;
130
+ /**
131
+ * Called straight after the editor is appended, to put the caret where it belongs.
132
+ * Without it the board focuses `el` itself.
133
+ */
64
134
  focus?: () => void;
135
+ /**
136
+ * Called when the edit commits or is cancelled, so the editor can release what it
137
+ * holds. Optional.
138
+ */
65
139
  destroy?: () => void;
66
140
  }
67
141
 
@@ -74,14 +148,29 @@ type KanbanFieldMap = string | ((row: KanbanRow) => unknown) | {
74
148
 
75
149
  /** The field-to-property mapping that drives the card template. */
76
150
  interface KanbanCardMap {
151
+ /** The card's headline text. */
77
152
  title?: KanbanFieldMap;
153
+ /** A second line under the title. */
78
154
  subtitle?: KanbanFieldMap;
155
+ /** A comma-separated string rendered as one chip per label; blanks are skipped. */
79
156
  labels?: KanbanFieldMap;
157
+ /** The person shown first in the card's meta row. */
80
158
  assignee?: KanbanFieldMap;
159
+ /** The due date, shown in the meta row as whatever text the mapping produces. */
81
160
  due?: KanbanFieldMap;
161
+ /** An image URL drawn as a cover band across the top of the card. */
82
162
  cover?: KanbanFieldMap;
163
+ /**
164
+ * A progress bar over the card. The value is read as a percentage (0-100); a value that
165
+ * is not a number draws no bar.
166
+ */
83
167
  progress?: KanbanFieldMap;
168
+ /** A single badge chip at the end of the meta row. */
84
169
  badges?: KanbanFieldMap;
170
+ /**
171
+ * A colour for the card's left border. Any CSS colour; an empty value leaves the border
172
+ * plain.
173
+ */
85
174
  accent?: KanbanFieldMap;
86
175
  [field: string]: KanbanFieldMap | undefined;
87
176
  }
@@ -95,9 +184,19 @@ type KanbanReadonly = boolean | {
95
184
 
96
185
  /** The payload every board event carries. */
97
186
  interface KanbanEvent {
187
+ /** The card the event is about. */
98
188
  card: KanbanCard;
189
+ /** The id of the column the card is in, or null when it is unplaced. */
99
190
  column: string | null;
191
+ /**
192
+ * The card's element, for a host that wants to anchor a popover to it. Absent on a
193
+ * headless board.
194
+ */
100
195
  el?: unknown;
196
+ /**
197
+ * The DOM event that caused this one, so a host can read modifier keys or call
198
+ * `preventDefault`.
199
+ */
101
200
  originalEvent?: unknown;
102
201
  }
103
202
 
@@ -161,8 +260,17 @@ interface KanbanSlaConfig {
161
260
 
162
261
  /** The computed SLA state of one card. */
163
262
  interface KanbanSlaState {
263
+ /** The card this ageing state belongs to. */
164
264
  key: unknown;
265
+ /**
266
+ * The column the card was in when it was aged — the thresholds are looked up per
267
+ * column.
268
+ */
165
269
  columnId: string | null;
270
+ /**
271
+ * The card's swimlane value, for a per-lane threshold. Undefined on a board without
272
+ * swimlanes.
273
+ */
166
274
  lane?: unknown;
167
275
  /** The ageing-clock start epoch (ms), or null when no time source could be resolved. */
168
276
  start: number | null;
@@ -213,7 +321,13 @@ interface KanbanSla {
213
321
  * swimlane property) and any customer schema without code change.
214
322
  */
215
323
  interface KanbanConfig {
324
+ /** The source rows, one per card. Use this or `grid`, not both — `rows` wins. */
216
325
  rows?: KanbanRow[];
326
+ /**
327
+ * A Lattice grid to bind to instead of `rows`: the board reads the grid's displayed
328
+ * rows through its own value pipeline and writes moves back through it. On a bound
329
+ * board `rows.apply` and `setRows` are ignored with a warning.
330
+ */
217
331
  grid?: unknown;
218
332
  /**
219
333
  * Card identity (a field or fn, returning a string or number); default
@@ -222,12 +336,40 @@ interface KanbanConfig {
222
336
  * join into here.
223
337
  */
224
338
  rowKey?: string | ((row: KanbanRow) => string | number);
339
+ /**
340
+ * The row property whose value puts a card in a column. Without it (and without `grid`
341
+ * or `columns`) the board warns and shows nothing.
342
+ */
225
343
  columnProperty?: string;
344
+ /**
345
+ * The columns to show, as ids or `{ id, title, color, wipLimit, collapsed, done }`.
346
+ * Configured columns appear even when empty; a group value outside them still gets a
347
+ * column of its own, appended, so no card is dropped.
348
+ */
226
349
  columns?: KanbanColumnDef[];
350
+ /**
351
+ * Pins the leading column order by id; anything not named keeps its natural position
352
+ * after the pinned ones. A user reorder replaces this.
353
+ */
227
354
  columnOrder?: string[];
355
+ /** The row property summed into each column header's points figure. */
228
356
  pointsProperty?: string;
357
+ /**
358
+ * Show the points sum in each column and lane header (default false). It needs
359
+ * `pointsProperty` too.
360
+ */
229
361
  showPoints?: boolean;
362
+ /**
363
+ * The row property that ranks cards within a column. Set it to make dropping a card at
364
+ * a position meaningful: a move then writes a new order value. Without it cards stay in
365
+ * arrival order.
366
+ */
230
367
  orderProperty?: string;
368
+ /**
369
+ * The row property that puts a card in a swimlane. Naming it does not switch on the
370
+ * lane layout — set `swimlanes` for that — but it does let a cross-lane drop write the
371
+ * lane back.
372
+ */
231
373
  swimlaneProperty?: string;
232
374
  /** Render the 2D swimlane layout using `swimlaneProperty` (default false). */
233
375
  swimlanes?: boolean;
@@ -239,7 +381,15 @@ interface KanbanConfig {
239
381
  enforceWip?: boolean;
240
382
  /** A custom card template: return an HTML string or a DOM node to own the whole card body. */
241
383
  cardRenderer?: (card: KanbanCard, ctx: { column: KanbanColumn; readonly: boolean; el: HTMLElement; doc: Document }) => string | Node | void;
384
+ /**
385
+ * The row property holding a card's sprint, which `setSprint` and the sprint selection
386
+ * filter on.
387
+ */
242
388
  sprintProperty?: string;
389
+ /**
390
+ * The row property holding a card's epic, which `setEpic` and the epic selection filter
391
+ * on.
392
+ */
243
393
  epicProperty?: string;
244
394
  /** A configurable sprint dataset: the canonical sprint list (order + titles), shown even when empty. */
245
395
  sprints?: (string | { id: unknown; title?: string })[];
@@ -276,9 +426,23 @@ interface KanbanConfig {
276
426
  filter?: (row: KanbanRow, card: KanbanCard) => boolean;
277
427
  /** Quick-filter text matched case-insensitively across card fields. */
278
428
  quickFilter?: string;
429
+ /**
430
+ * Maps the card template's slots — title, subtitle, labels, assignee, due, cover,
431
+ * progress, badges, accent — to row properties, and opts a slot into inline edit. Any
432
+ * other name is carried as an extra field on `KanbanCard.fields`.
433
+ */
279
434
  card?: KanbanCardMap;
435
+ /**
436
+ * Blocks edits and moves: `true` for the whole board, or a map singling out columns and
437
+ * cards by id and key. Default false.
438
+ */
280
439
  readonly?: KanbanReadonly;
440
+ /** The board's accessible name. Defaults to `Board`. */
281
441
  ariaLabel?: string;
442
+ /**
443
+ * The placeholder shown in a column with no cards. Empty by default, so the module
444
+ * ships no English of its own.
445
+ */
282
446
  emptyText?: string;
283
447
  /** Whether card selection is enabled (default true). */
284
448
  selectable?: boolean;
@@ -297,8 +461,17 @@ interface KanbanConfig {
297
461
  onCardMove?: (event: KanbanMoveEvent) => boolean | void | Promise<boolean | void>;
298
462
  /** A per-card context menu: items, or `fn(card, selectedCards)` returning items. Suppresses `card:contextmenu`. */
299
463
  contextMenu?: KanbanMenuItem[] | ((card: KanbanCard, selected: KanbanCard[]) => KanbanMenuItem[]);
464
+ /**
465
+ * Called when a card is clicked, with the same payload as the `card:click` event. Both
466
+ * fire: this does not replace a registered handler.
467
+ */
300
468
  onCardClick?: (event: KanbanEvent) => void;
469
+ /** Called when a card is double-clicked, alongside the `card:dblclick` event. */
301
470
  onCardDblClick?: (event: KanbanEvent) => void;
471
+ /**
472
+ * Called on a card's context-menu gesture, alongside the `card:contextmenu` event. A
473
+ * configured `contextMenu` suppresses both.
474
+ */
302
475
  onCardContextMenu?: (event: KanbanEvent) => void;
303
476
  }
304
477
 
@@ -332,25 +505,48 @@ interface KanbanChildren {
332
505
 
333
506
  /** One context-menu item. `action` receives the card, the selected cards, and the board. */
334
507
  interface KanbanMenuItem {
508
+ /** The item's text in the menu. */
335
509
  label: string;
510
+ /**
511
+ * Runs when the item is chosen, with the clicked card, the selected cards (the clicked
512
+ * one when nothing is selected) and the board. Not called on a disabled item.
513
+ */
336
514
  action?: (ctx: { card: KanbanCard; cards: KanbanCard[]; board: Kanban }) => void;
515
+ /** Greys the item out and ignores clicks on it. */
337
516
  disabled?: boolean;
338
517
  }
339
518
 
340
519
  /** The payload of a `card:move` (and `card:reverted`) event. */
341
520
  interface KanbanMoveEvent {
521
+ /** The keys of the cards that actually moved — the ones no `beforeMove` veto refused. */
342
522
  keys: unknown[];
523
+ /** The moved cards, in the same order as `keys`. */
343
524
  cards: KanbanCard[];
525
+ /** Where each card came from, one column id (or null for unplaced) per moved card. */
344
526
  from: (string | null)[];
527
+ /** The column the cards landed in. */
345
528
  to: string;
529
+ /** The position asked for within the target column, or null for the end. */
346
530
  index: number | null;
531
+ /**
532
+ * The new order values written to `orderProperty`, one per moved card — computed to sit
533
+ * between the neighbours at the drop point. Null when no order property is configured.
534
+ */
347
535
  orders: number[] | null;
348
536
  }
349
537
 
350
538
  /** The keyed-diff consumer surface a board shares with a grid, so a Data Router routes to it directly. */
351
539
  interface KanbanRows {
540
+ /**
541
+ * Apply a keyed diff: `add` replaces whatever row each key names, `update` merges its
542
+ * fields into the stored row (so a patch need only carry what changed), `remove` drops
543
+ * the keys. The board regroups and repaints, keeping scroll, focus, selection, collapse
544
+ * and any open pop-out. Ignored with a warning on a grid-bound board.
545
+ */
352
546
  apply(change: { add?: KanbanRow[]; update?: KanbanRow[]; remove?: unknown[] }): void;
547
+ /** Visit every row the board holds, with its key. */
353
548
  forEach(fn: (row: KanbanRow, key: unknown) => void): void;
549
+ /** How many rows the board holds, before filtering. */
354
550
  readonly count: number;
355
551
  }
356
552
 
@@ -381,20 +577,43 @@ interface KanbanFilters {
381
577
  * viewer.
382
578
  */
383
579
  interface Kanban {
580
+ /** The element the board renders into, or null for a headless board. */
384
581
  readonly el: unknown | null;
385
582
  /** The resolved card identity; see `KanbanConfig.rowKey`. */
386
583
  readonly rowKey: string | ((row: KanbanRow) => string | number);
584
+ /**
585
+ * The keyed-diff consumer surface, the same shape a grid exposes — this is what makes a
586
+ * board a Data Router target.
587
+ */
387
588
  rows: KanbanRows;
388
589
  /** The card-aging / SLA monitor, present only when a `sla` config was supplied. */
389
590
  sla?: KanbanSla;
591
+ /** The current columns in display order, each with its cards and aggregates. */
390
592
  columns(): KanbanColumn[];
593
+ /** One column by id, or undefined when the board has no such column. */
391
594
  column(id: string): KanbanColumn | undefined;
595
+ /** How many cards a column holds after filtering; 0 for an unknown column. */
392
596
  count(id: string): number;
597
+ /** A column's points sum; 0 for an unknown column. */
393
598
  points(id: string): number;
599
+ /** Every card on the board, unplaced ones included, in no particular column order. */
394
600
  cards(): KanbanCard[];
601
+ /**
602
+ * One card by key, or undefined when no card has that key (it may have been filtered
603
+ * out).
604
+ */
395
605
  card(key: unknown): KanbanCard | undefined;
606
+ /**
607
+ * Register an event handler; returns a function that removes it. An unrecognised event
608
+ * name is warned about once, because it names a binding that could never fire.
609
+ */
396
610
  on(name: string, fn: (event: KanbanEvent) => void): () => void;
611
+ /** Remove a handler registered with `on`. */
397
612
  off(name: string, fn: (event: KanbanEvent) => void): void;
613
+ /**
614
+ * Whether editing is blocked — for the whole board, or for the column or card named in
615
+ * the scope.
616
+ */
398
617
  readonly(scope?: { column?: string; card?: unknown }): boolean;
399
618
  /**
400
619
  * Move one or more cards to a column (and, with an order property, to a
@@ -476,6 +695,10 @@ interface Kanban {
476
695
  setLoading(loading: boolean): Kanban;
477
696
  /** Set (or clear with null) an error state, rendered as a host-supplied message. */
478
697
  setError(message: string | null): Kanban;
698
+ /**
699
+ * Replace the source rows and re-render, and make that array the board's source again
700
+ * so a later `refresh()` re-reads it. Ignored with a warning on a grid-bound board.
701
+ */
479
702
  setRows(rows: KanbanRow[]): Kanban;
480
703
  /**
481
704
  * Replace the board's configured column set. Keeps card
@@ -486,7 +709,16 @@ interface Kanban {
486
709
  * "never silently drop a card" rule an unconfigured value already gets).
487
710
  */
488
711
  setColumns(defs: KanbanColumnDef[]): Kanban;
712
+ /**
713
+ * Re-read the source and re-render: a bound grid's rows, or the configured array. Once
714
+ * rows have arrived through `rows.apply` nothing is re-read — the board regroups what
715
+ * it holds, so a routed feed is never thrown away.
716
+ */
489
717
  refresh(): Kanban;
718
+ /**
719
+ * Empty the element, remove only the class the board added, and stop the flow and SLA
720
+ * monitors. A bound grid is left alone — the host owns it.
721
+ */
490
722
  destroy(): void;
491
723
  }
492
724
 
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, kanban module
2
+ * Lattice Grid 1.68.1, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -52,12 +52,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
52
52
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
53
53
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
54
54
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
55
- const STAMPED_VERSION="1.67.0";
55
+ const STAMPED_VERSION="1.68.1";
56
56
  async function resolveVersion(){
57
57
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
58
58
  return STAMPED_VERSION;
59
59
  }
60
- const VERSION="1.67.0";
60
+ const VERSION="1.68.1";
61
61
  const warned=new Set();
62
62
  const WARNED_LIMIT=2000;
63
63
  function rememberWarned(key){
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, kanban module
2
+ * Lattice Grid 1.68.1, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -54,12 +54,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
54
54
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
55
55
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
56
56
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
57
- const STAMPED_VERSION="1.67.0";
57
+ const STAMPED_VERSION="1.68.1";
58
58
  async function resolveVersion(){
59
59
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
60
60
  return STAMPED_VERSION;
61
61
  }
62
- const VERSION="1.67.0";
62
+ const VERSION="1.68.1";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, kanban module
2
+ * Lattice Grid 1.68.1, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -54,12 +54,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
54
54
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
55
55
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
56
56
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
57
- const STAMPED_VERSION="1.67.0";
57
+ const STAMPED_VERSION="1.68.1";
58
58
  async function resolveVersion(){
59
59
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
60
60
  return STAMPED_VERSION;
61
61
  }
62
- const VERSION="1.67.0";
62
+ const VERSION="1.68.1";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){