@toclocoinc/lattice-grid 1.65.0 → 1.67.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.
Files changed (177) hide show
  1. package/README.md +6 -4
  2. package/angular/LICENSE +111 -0
  3. package/angular/README.md +78 -0
  4. package/angular/fesm2022/toclocoinc-lattice-grid-angular.mjs +2843 -0
  5. package/angular/package.json +16 -0
  6. package/angular/types/toclocoinc-lattice-grid-angular.d.ts +1366 -0
  7. package/docs/API.html +741 -27
  8. package/docs/api-detail.html +137 -4
  9. package/lattice-grid.d.ts +9 -6
  10. package/lattice-grid.esm.min.js +26 -10
  11. package/lattice-grid.min.cjs +26 -10
  12. package/lattice-grid.min.css +1 -1
  13. package/lattice-grid.min.js +26 -10
  14. package/modules/ai.d.ts +1 -1
  15. package/modules/ai.esm.min.js +3 -3
  16. package/modules/ai.min.cjs +3 -3
  17. package/modules/ai.min.js +3 -3
  18. package/modules/angular.d.ts +1 -1
  19. package/modules/angular.esm.min.js +7 -7
  20. package/modules/angular.min.cjs +7 -7
  21. package/modules/angular.min.js +7 -7
  22. package/modules/chart-alluvial.d.ts +1 -1
  23. package/modules/chart-alluvial.esm.min.js +1 -1
  24. package/modules/chart-alluvial.min.cjs +1 -1
  25. package/modules/chart-alluvial.min.js +1 -1
  26. package/modules/chart-arc.d.ts +1 -1
  27. package/modules/chart-arc.esm.min.js +1 -1
  28. package/modules/chart-arc.min.cjs +1 -1
  29. package/modules/chart-arc.min.js +1 -1
  30. package/modules/chart-bubblemap.d.ts +1 -1
  31. package/modules/chart-bubblemap.esm.min.js +1 -1
  32. package/modules/chart-bubblemap.min.cjs +1 -1
  33. package/modules/chart-bubblemap.min.js +1 -1
  34. package/modules/chart-bump.d.ts +1 -1
  35. package/modules/chart-bump.esm.min.js +1 -1
  36. package/modules/chart-bump.min.cjs +1 -1
  37. package/modules/chart-bump.min.js +1 -1
  38. package/modules/chart-calendar.d.ts +1 -1
  39. package/modules/chart-calendar.esm.min.js +1 -1
  40. package/modules/chart-calendar.min.cjs +1 -1
  41. package/modules/chart-calendar.min.js +1 -1
  42. package/modules/chart-decomposition.d.ts +1 -1
  43. package/modules/chart-decomposition.esm.min.js +1 -1
  44. package/modules/chart-decomposition.min.cjs +1 -1
  45. package/modules/chart-decomposition.min.js +1 -1
  46. package/modules/chart-diverging.d.ts +1 -1
  47. package/modules/chart-diverging.esm.min.js +1 -1
  48. package/modules/chart-diverging.min.cjs +1 -1
  49. package/modules/chart-diverging.min.js +1 -1
  50. package/modules/chart-dumbbell.d.ts +1 -1
  51. package/modules/chart-dumbbell.esm.min.js +1 -1
  52. package/modules/chart-dumbbell.min.cjs +1 -1
  53. package/modules/chart-dumbbell.min.js +1 -1
  54. package/modules/chart-fan.d.ts +1 -1
  55. package/modules/chart-fan.esm.min.js +1 -1
  56. package/modules/chart-fan.min.cjs +1 -1
  57. package/modules/chart-fan.min.js +1 -1
  58. package/modules/chart-hexbin.d.ts +1 -1
  59. package/modules/chart-hexbin.esm.min.js +1 -1
  60. package/modules/chart-hexbin.min.cjs +1 -1
  61. package/modules/chart-hexbin.min.js +1 -1
  62. package/modules/chart-hexmap.d.ts +1 -1
  63. package/modules/chart-hexmap.esm.min.js +1 -1
  64. package/modules/chart-hexmap.min.cjs +1 -1
  65. package/modules/chart-hexmap.min.js +1 -1
  66. package/modules/chart-icicle.d.ts +1 -1
  67. package/modules/chart-icicle.esm.min.js +1 -1
  68. package/modules/chart-icicle.min.cjs +1 -1
  69. package/modules/chart-icicle.min.js +1 -1
  70. package/modules/chart-markermap.d.ts +1 -1
  71. package/modules/chart-markermap.esm.min.js +1 -1
  72. package/modules/chart-markermap.min.cjs +1 -1
  73. package/modules/chart-markermap.min.js +1 -1
  74. package/modules/chart-parallel.d.ts +1 -1
  75. package/modules/chart-parallel.esm.min.js +1 -1
  76. package/modules/chart-parallel.min.cjs +1 -1
  77. package/modules/chart-parallel.min.js +1 -1
  78. package/modules/chart-ridgeline.d.ts +1 -1
  79. package/modules/chart-ridgeline.esm.min.js +1 -1
  80. package/modules/chart-ridgeline.min.cjs +1 -1
  81. package/modules/chart-ridgeline.min.js +1 -1
  82. package/modules/chart-roc.d.ts +1 -1
  83. package/modules/chart-roc.esm.min.js +1 -1
  84. package/modules/chart-roc.min.cjs +1 -1
  85. package/modules/chart-roc.min.js +1 -1
  86. package/modules/chart-slope.d.ts +1 -1
  87. package/modules/chart-slope.esm.min.js +1 -1
  88. package/modules/chart-slope.min.cjs +1 -1
  89. package/modules/chart-slope.min.js +1 -1
  90. package/modules/chart-splom.d.ts +1 -1
  91. package/modules/chart-splom.esm.min.js +1 -1
  92. package/modules/chart-splom.min.cjs +1 -1
  93. package/modules/chart-splom.min.js +1 -1
  94. package/modules/chart-waffle.d.ts +1 -1
  95. package/modules/chart-waffle.esm.min.js +1 -1
  96. package/modules/chart-waffle.min.cjs +1 -1
  97. package/modules/chart-waffle.min.js +1 -1
  98. package/modules/charts.d.ts +1 -1
  99. package/modules/charts.esm.min.js +261 -48
  100. package/modules/charts.min.cjs +261 -48
  101. package/modules/charts.min.js +261 -48
  102. package/modules/data-router.d.ts +8 -3
  103. package/modules/data-router.esm.min.js +28 -6
  104. package/modules/data-router.min.cjs +28 -6
  105. package/modules/data-router.min.js +28 -6
  106. package/modules/devtools.d.ts +1 -1
  107. package/modules/devtools.esm.min.js +1 -1
  108. package/modules/devtools.min.cjs +1 -1
  109. package/modules/devtools.min.js +1 -1
  110. package/modules/dhtmlx-compat.d.ts +1 -1
  111. package/modules/dhtmlx-compat.esm.min.js +3 -3
  112. package/modules/dhtmlx-compat.min.cjs +3 -3
  113. package/modules/dhtmlx-compat.min.js +3 -3
  114. package/modules/gantt.d.ts +8 -3
  115. package/modules/gantt.esm.min.js +27 -4
  116. package/modules/gantt.min.cjs +27 -4
  117. package/modules/gantt.min.js +27 -4
  118. package/modules/geo-europe-nuts.d.ts +1 -1
  119. package/modules/geo-europe-nuts.esm.min.js +1 -1
  120. package/modules/geo-uk.d.ts +1 -1
  121. package/modules/geo-uk.esm.min.js +1 -1
  122. package/modules/geo-us-states.d.ts +1 -1
  123. package/modules/geo-us-states.esm.min.js +1 -1
  124. package/modules/geo-world-110m.d.ts +1 -1
  125. package/modules/geo-world-110m.esm.min.js +1 -1
  126. package/modules/geo-world-50m.d.ts +1 -1
  127. package/modules/geo-world-50m.esm.min.js +1 -1
  128. package/modules/htmx.d.ts +1 -1
  129. package/modules/htmx.esm.min.js +26 -10
  130. package/modules/htmx.min.cjs +26 -10
  131. package/modules/htmx.min.js +26 -10
  132. package/modules/kanban.d.ts +10 -3
  133. package/modules/kanban.esm.min.js +24 -4
  134. package/modules/kanban.min.cjs +24 -4
  135. package/modules/kanban.min.js +24 -4
  136. package/modules/kpi.d.ts +10 -3
  137. package/modules/kpi.esm.min.js +27 -4
  138. package/modules/kpi.min.cjs +27 -4
  139. package/modules/kpi.min.js +27 -4
  140. package/modules/layout.d.ts +1 -1
  141. package/modules/layout.esm.min.js +3 -3
  142. package/modules/layout.min.cjs +3 -3
  143. package/modules/layout.min.js +3 -3
  144. package/modules/mock-socket.d.ts +1 -1
  145. package/modules/mock-socket.esm.min.js +1 -1
  146. package/modules/mock-socket.min.cjs +1 -1
  147. package/modules/mock-socket.min.js +1 -1
  148. package/modules/react.d.ts +1 -1
  149. package/modules/react.esm.min.js +3 -3
  150. package/modules/react.min.cjs +3 -3
  151. package/modules/react.min.js +3 -3
  152. package/modules/svelte.d.ts +251 -2
  153. package/modules/svelte.esm.min.js +960 -6
  154. package/modules/svelte.min.cjs +942 -5
  155. package/modules/svelte.min.js +942 -5
  156. package/modules/tabs.d.ts +1 -1
  157. package/modules/tabs.esm.min.js +3 -3
  158. package/modules/tabs.min.cjs +3 -3
  159. package/modules/tabs.min.js +3 -3
  160. package/modules/vue.d.ts +398 -9
  161. package/modules/vue.esm.min.js +1163 -31
  162. package/modules/vue.min.cjs +1147 -30
  163. package/modules/vue.min.js +1147 -30
  164. package/modules/webcomponent.d.ts +233 -1
  165. package/modules/webcomponent.esm.min.js +1274 -41
  166. package/modules/webcomponent.min.cjs +1256 -41
  167. package/modules/webcomponent.min.js +1256 -41
  168. package/package.json +27 -2
  169. package/svelte/Chart.svelte +34 -0
  170. package/svelte/Gantt.svelte +34 -0
  171. package/svelte/Grid.svelte +30 -0
  172. package/svelte/GridProvider.svelte +13 -0
  173. package/svelte/KPI.svelte +34 -0
  174. package/svelte/Kanban.svelte +34 -0
  175. package/svelte/Layout.svelte +34 -0
  176. package/svelte/Router.svelte +16 -0
  177. package/svelte/Tabs.svelte +53 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kanban module type declarations
2
+ * Lattice Grid 1.67.0, kanban module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -215,7 +215,13 @@ interface KanbanSla {
215
215
  interface KanbanConfig {
216
216
  rows?: KanbanRow[];
217
217
  grid?: unknown;
218
- rowKey?: string | ((row: KanbanRow) => unknown);
218
+ /**
219
+ * Card identity (a field or fn, returning a string or number); default
220
+ * 'id'. Composite (`string[]`) keys are core-grid-only: a board keys its
221
+ * own card identity from one value, so there is nothing for an array to
222
+ * join into here.
223
+ */
224
+ rowKey?: string | ((row: KanbanRow) => string | number);
219
225
  columnProperty?: string;
220
226
  columns?: KanbanColumnDef[];
221
227
  columnOrder?: string[];
@@ -376,7 +382,8 @@ interface KanbanFilters {
376
382
  */
377
383
  interface Kanban {
378
384
  readonly el: unknown | null;
379
- readonly rowKey: string | ((row: KanbanRow) => unknown);
385
+ /** The resolved card identity; see `KanbanConfig.rowKey`. */
386
+ readonly rowKey: string | ((row: KanbanRow) => string | number);
380
387
  rows: KanbanRows;
381
388
  /** The card-aging / SLA monitor, present only when a `sla` config was supplied. */
382
389
  sla?: KanbanSla;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kanban module
2
+ * Lattice Grid 1.67.0, 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.65.0";
55
+ const STAMPED_VERSION="1.67.0";
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.65.0";
60
+ const VERSION="1.67.0";
61
61
  const warned=new Set();
62
62
  const WARNED_LIMIT=2000;
63
63
  function rememberWarned(key){
@@ -444,8 +444,28 @@ if(isFunction(accessor))return accessor;
444
444
  if(typeof accessor==='string')return(row)=>getPath(row,accessor);
445
445
  return()=>undefined;
446
446
  }
447
+ function rowKeyTypeName(v){
448
+ if(Array.isArray(v))return'array';
449
+ if(v===null)return'null';
450
+ return typeof v;
451
+ }
447
452
  function keyFn(rowKey){
448
- if(isFunction(rowKey))return rowKey;
453
+ if(rowKey!==undefined&&typeof rowKey!=='function'
454
+ &&!(typeof rowKey==='string'&&rowKey.length>0)){
455
+ throw new Error(
456
+ 'lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.',
457
+ );
458
+ }
459
+ if(isFunction(rowKey)){
460
+ return(row)=>{
461
+ const key=rowKey(row);
462
+ if(typeof key==='string')return key;
463
+ if(typeof key==='number'&&Number.isFinite(key))return key;
464
+ throw new Error(
465
+ `lattice-kanban: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
466
+ );
467
+ };
468
+ }
449
469
  const path=typeof rowKey==='string'?rowKey:'id';
450
470
  return(row)=>getPath(row,path);
451
471
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kanban module
2
+ * Lattice Grid 1.67.0, 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -446,8 +446,28 @@ if(isFunction(accessor))return accessor;
446
446
  if(typeof accessor==='string')return(row)=>getPath(row,accessor);
447
447
  return()=>undefined;
448
448
  }
449
+ function rowKeyTypeName(v){
450
+ if(Array.isArray(v))return'array';
451
+ if(v===null)return'null';
452
+ return typeof v;
453
+ }
449
454
  function keyFn(rowKey){
450
- if(isFunction(rowKey))return rowKey;
455
+ if(rowKey!==undefined&&typeof rowKey!=='function'
456
+ &&!(typeof rowKey==='string'&&rowKey.length>0)){
457
+ throw new Error(
458
+ 'lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.',
459
+ );
460
+ }
461
+ if(isFunction(rowKey)){
462
+ return(row)=>{
463
+ const key=rowKey(row);
464
+ if(typeof key==='string')return key;
465
+ if(typeof key==='number'&&Number.isFinite(key))return key;
466
+ throw new Error(
467
+ `lattice-kanban: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
468
+ );
469
+ };
470
+ }
451
471
  const path=typeof rowKey==='string'?rowKey:'id';
452
472
  return(row)=>getPath(row,path);
453
473
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kanban module
2
+ * Lattice Grid 1.67.0, 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -446,8 +446,28 @@ if(isFunction(accessor))return accessor;
446
446
  if(typeof accessor==='string')return(row)=>getPath(row,accessor);
447
447
  return()=>undefined;
448
448
  }
449
+ function rowKeyTypeName(v){
450
+ if(Array.isArray(v))return'array';
451
+ if(v===null)return'null';
452
+ return typeof v;
453
+ }
449
454
  function keyFn(rowKey){
450
- if(isFunction(rowKey))return rowKey;
455
+ if(rowKey!==undefined&&typeof rowKey!=='function'
456
+ &&!(typeof rowKey==='string'&&rowKey.length>0)){
457
+ throw new Error(
458
+ 'lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.',
459
+ );
460
+ }
461
+ if(isFunction(rowKey)){
462
+ return(row)=>{
463
+ const key=rowKey(row);
464
+ if(typeof key==='string')return key;
465
+ if(typeof key==='number'&&Number.isFinite(key))return key;
466
+ throw new Error(
467
+ `lattice-kanban: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
468
+ );
469
+ };
470
+ }
451
471
  const path=typeof rowKey==='string'?rowKey:'id';
452
472
  return(row)=>getPath(row,path);
453
473
  }
package/modules/kpi.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kpi module type declarations
2
+ * Lattice Grid 1.67.0, kpi module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -224,7 +224,13 @@ interface KPIEvent {
224
224
  interface KPIConfig {
225
225
  rows?: KPIRow[];
226
226
  grid?: unknown;
227
- rowKey?: string | ((row: KPIRow) => unknown);
227
+ /**
228
+ * Row identity (a field or fn, returning a string or number); default
229
+ * 'id'. Composite (`string[]`) keys are core-grid-only: a panel keys its
230
+ * own tile identity from one value, so there is nothing for an array to
231
+ * join into here.
232
+ */
233
+ rowKey?: string | ((row: KPIRow) => string | number);
228
234
  /**
229
235
  * Extra columns of the bound `grid` to project onto the rows a tile `filter`
230
236
  * sees, beyond the fields the tiles themselves declare. A grid-bound panel
@@ -274,7 +280,8 @@ interface KPIRows {
274
280
  */
275
281
  interface KPI {
276
282
  readonly el: unknown | null;
277
- readonly rowKey: string | ((row: KPIRow) => unknown);
283
+ /** The resolved row identity; see `KPIConfig.rowKey`. */
284
+ readonly rowKey: string | ((row: KPIRow) => string | number);
278
285
  /** Whether the panel renders as a hierarchy rather than a flat tile grid. */
279
286
  readonly tree: boolean;
280
287
  rows: KPIRows;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kpi module
2
+ * Lattice Grid 1.67.0, kpi 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.65.0";
55
+ const STAMPED_VERSION="1.67.0";
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.65.0";
60
+ const VERSION="1.67.0";
61
61
  const warned=new Set();
62
62
  const WARNED_LIMIT=2000;
63
63
  function rememberWarned(key){
@@ -5854,8 +5854,30 @@ onTileContextMenu:'tile:contextmenu',
5854
5854
  onNodeToggle:'node:toggle',
5855
5855
  onChange:'change',
5856
5856
  });
5857
+ function rowKeyTypeName(v){
5858
+ if(Array.isArray(v))return'array';
5859
+ if(v===null)return'null';
5860
+ return typeof v;
5861
+ }
5862
+ function assertRowKeyShape(rowKey){
5863
+ if(rowKey===undefined)return;
5864
+ if(typeof rowKey==='string'&&rowKey.length>0)return;
5865
+ if(typeof rowKey==='function')return;
5866
+ throw new Error(
5867
+ 'lattice-kpi: rowKey must be a property name or a function; composite keys are not supported on tiles.',
5868
+ );
5869
+ }
5857
5870
  function keyFn(rowKey){
5858
- if(isFunction(rowKey))return rowKey;
5871
+ if(isFunction(rowKey)){
5872
+ return(row)=>{
5873
+ const key=rowKey(row);
5874
+ if(typeof key==='string')return key;
5875
+ if(typeof key==='number'&&Number.isFinite(key))return key;
5876
+ throw new Error(
5877
+ `lattice-kpi: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
5878
+ );
5879
+ };
5880
+ }
5859
5881
  const get=pathGetter(typeof rowKey==='string'&&rowKey?rowKey:'id');
5860
5882
  return(row)=>get(row);
5861
5883
  }
@@ -6036,6 +6058,7 @@ return rows;
6036
6058
  }
6037
6059
  function createKPI(el,config={}){
6038
6060
  const cfg=isObject(config)?config:{};
6061
+ assertRowKeyShape(cfg.rowKey);
6039
6062
  const gridBound=!!cfg.grid&&!Array.isArray(cfg.rows);
6040
6063
  const key=gridBound?keyFn('__kpiKey'):keyFn(cfg.rowKey);
6041
6064
  const nullText=typeof cfg.nullText==='string'?cfg.nullText:'—';
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kpi module
2
+ * Lattice Grid 1.67.0, kpi 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -5856,8 +5856,30 @@ onTileContextMenu:'tile:contextmenu',
5856
5856
  onNodeToggle:'node:toggle',
5857
5857
  onChange:'change',
5858
5858
  });
5859
+ function rowKeyTypeName(v){
5860
+ if(Array.isArray(v))return'array';
5861
+ if(v===null)return'null';
5862
+ return typeof v;
5863
+ }
5864
+ function assertRowKeyShape(rowKey){
5865
+ if(rowKey===undefined)return;
5866
+ if(typeof rowKey==='string'&&rowKey.length>0)return;
5867
+ if(typeof rowKey==='function')return;
5868
+ throw new Error(
5869
+ 'lattice-kpi: rowKey must be a property name or a function; composite keys are not supported on tiles.',
5870
+ );
5871
+ }
5859
5872
  function keyFn(rowKey){
5860
- if(isFunction(rowKey))return rowKey;
5873
+ if(isFunction(rowKey)){
5874
+ return(row)=>{
5875
+ const key=rowKey(row);
5876
+ if(typeof key==='string')return key;
5877
+ if(typeof key==='number'&&Number.isFinite(key))return key;
5878
+ throw new Error(
5879
+ `lattice-kpi: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
5880
+ );
5881
+ };
5882
+ }
5861
5883
  const get=pathGetter(typeof rowKey==='string'&&rowKey?rowKey:'id');
5862
5884
  return(row)=>get(row);
5863
5885
  }
@@ -6038,6 +6060,7 @@ return rows;
6038
6060
  }
6039
6061
  function createKPI(el,config={}){
6040
6062
  const cfg=isObject(config)?config:{};
6063
+ assertRowKeyShape(cfg.rowKey);
6041
6064
  const gridBound=!!cfg.grid&&!Array.isArray(cfg.rows);
6042
6065
  const key=gridBound?keyFn('__kpiKey'):keyFn(cfg.rowKey);
6043
6066
  const nullText=typeof cfg.nullText==='string'?cfg.nullText:'—';
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, kpi module
2
+ * Lattice Grid 1.67.0, kpi 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -5856,8 +5856,30 @@ onTileContextMenu:'tile:contextmenu',
5856
5856
  onNodeToggle:'node:toggle',
5857
5857
  onChange:'change',
5858
5858
  });
5859
+ function rowKeyTypeName(v){
5860
+ if(Array.isArray(v))return'array';
5861
+ if(v===null)return'null';
5862
+ return typeof v;
5863
+ }
5864
+ function assertRowKeyShape(rowKey){
5865
+ if(rowKey===undefined)return;
5866
+ if(typeof rowKey==='string'&&rowKey.length>0)return;
5867
+ if(typeof rowKey==='function')return;
5868
+ throw new Error(
5869
+ 'lattice-kpi: rowKey must be a property name or a function; composite keys are not supported on tiles.',
5870
+ );
5871
+ }
5859
5872
  function keyFn(rowKey){
5860
- if(isFunction(rowKey))return rowKey;
5873
+ if(isFunction(rowKey)){
5874
+ return(row)=>{
5875
+ const key=rowKey(row);
5876
+ if(typeof key==='string')return key;
5877
+ if(typeof key==='number'&&Number.isFinite(key))return key;
5878
+ throw new Error(
5879
+ `lattice-kpi: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
5880
+ );
5881
+ };
5882
+ }
5861
5883
  const get=pathGetter(typeof rowKey==='string'&&rowKey?rowKey:'id');
5862
5884
  return(row)=>get(row);
5863
5885
  }
@@ -6038,6 +6060,7 @@ return rows;
6038
6060
  }
6039
6061
  function createKPI(el,config={}){
6040
6062
  const cfg=isObject(config)?config:{};
6063
+ assertRowKeyShape(cfg.rowKey);
6041
6064
  const gridBound=!!cfg.grid&&!Array.isArray(cfg.rows);
6042
6065
  const key=gridBound?keyFn('__kpiKey'):keyFn(cfg.rowKey);
6043
6066
  const nullText=typeof cfg.nullText==='string'?cfg.nullText:'—';
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, layout module type declarations
2
+ * Lattice Grid 1.67.0, layout module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, layout module
2
+ * Lattice Grid 1.67.0, layout 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.65.0";
55
+ const STAMPED_VERSION="1.67.0";
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.65.0";
60
+ const VERSION="1.67.0";
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.65.0, layout module
2
+ * Lattice Grid 1.67.0, layout 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
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.65.0, layout module
2
+ * Lattice Grid 1.67.0, layout 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
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.65.0, mock-socket module type declarations
2
+ * Lattice Grid 1.67.0, mock-socket module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, mock-socket module
2
+ * Lattice Grid 1.67.0, mock-socket module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, mock-socket module
2
+ * Lattice Grid 1.67.0, mock-socket module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, mock-socket module
2
+ * Lattice Grid 1.67.0, mock-socket module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, react module type declarations
2
+ * Lattice Grid 1.67.0, react module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, react module
2
+ * Lattice Grid 1.67.0, react 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.65.0";
55
+ const STAMPED_VERSION="1.67.0";
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.65.0";
60
+ const VERSION="1.67.0";
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.65.0, react module
2
+ * Lattice Grid 1.67.0, react 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
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.65.0, react module
2
+ * Lattice Grid 1.67.0, react 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.65.0";
57
+ const STAMPED_VERSION="1.67.0";
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.65.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){