@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
package/modules/tabs.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, tabs module type declarations
2
+ * Lattice Grid 1.68.1, tabs module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -41,6 +41,7 @@ interface TabDescriptor {
41
41
  where?: (row: unknown) => boolean;
42
42
  /** Group-by forwarded to the derived source. */
43
43
  group?: unknown;
44
+ /** An alias for `group`, forwarded verbatim to the derived source. */
44
45
  groupBy?: unknown;
45
46
  /** Time-bucketing forwarded to the derived source. */
46
47
  bucket?: unknown;
@@ -72,12 +73,23 @@ interface TabDescriptor {
72
73
 
73
74
  /** The payload every tab-change event carries. */
74
75
  interface TabChangeEvent {
76
+ /** The tab being switched to. */
75
77
  id: string;
78
+ /** The tab being left, or null for the first activation. */
76
79
  previousId: string | null;
80
+ /**
81
+ * Who caused the switch: `user` for a click or keypress, `api` for `activate()`, `init`
82
+ * for the opening tab. Defaults to `user`.
83
+ */
77
84
  origin?: 'api' | 'user' | 'init';
85
+ /**
86
+ * Why the switch was refused — the reason given to `preventDefault`, `prevented` when
87
+ * none was, or `error` when a handler threw.
88
+ */
78
89
  reason?: string | null;
79
90
  /** Cancel the switch (only meaningful on `beforeTabChange`). */
80
91
  preventDefault?: (reason?: string) => void;
92
+ /** True once a handler has cancelled the switch. */
81
93
  defaultPrevented?: boolean;
82
94
  }
83
95
 
@@ -95,8 +107,18 @@ interface TabsConfig {
95
107
  ariaLabel?: string;
96
108
  /** An explicit message-catalogue override; otherwise a mounted tab's own `grid.messages` is used. */
97
109
  messages?: { t(key: string, params?: Record<string, unknown>): string };
110
+ /** Called after the active tab has changed, alongside the `tab:changed` event. */
98
111
  onTabChange?: (event: TabChangeEvent) => void;
112
+ /**
113
+ * Called before the switch. Return `false`, call `preventDefault(reason)`, or throw, to
114
+ * stay where you are; return a promise and the switch waits for it. Alongside the
115
+ * `beforeTabChange` event.
116
+ */
99
117
  onBeforeTabChange?: (event: TabChangeEvent) => boolean | void | Promise<boolean>;
118
+ /**
119
+ * Called when a switch was refused, with the reason on the payload. Alongside
120
+ * `tabChange:cancelled`.
121
+ */
100
122
  onTabChangeCancelled?: (event: TabChangeEvent) => void;
101
123
  }
102
124
 
@@ -106,6 +128,7 @@ interface TabsConfig {
106
128
  * alive, hidden, until `destroy()`.
107
129
  */
108
130
  interface Tabs {
131
+ /** The element the strip was mounted on. */
109
132
  readonly el: HTMLElement;
110
133
  /** The currently active tab id. */
111
134
  readonly activeId: string;
@@ -117,7 +140,13 @@ interface Tabs {
117
140
  isMounted(id: string): boolean;
118
141
  /** Switch the active tab, gated by `beforeTabChange`. */
119
142
  activate(id: string, opts?: { origin?: 'api' | 'user' }): boolean | Promise<boolean>;
143
+ /**
144
+ * Subscribe to `beforeTabChange`, `tab:changed` or `tabChange:cancelled`; returns a
145
+ * function that unsubscribes. Any other name is warned about once, because it names a
146
+ * binding that could never fire.
147
+ */
120
148
  on(name: 'beforeTabChange' | 'tab:changed' | 'tabChange:cancelled' | string, fn: (event: TabChangeEvent) => void): () => void;
149
+ /** Remove a handler registered with `on`. */
121
150
  off(name: string, fn: (event: TabChangeEvent) => void): void;
122
151
  /** Tear the whole strip down; destroys every mounted tab's grid. */
123
152
  destroy(): void;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, tabs module
2
+ * Lattice Grid 1.68.1, tabs 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){
@@ -499,7 +499,7 @@ const style=doc.createElement('style');
499
499
  style.id=`${NS}-styles`;
500
500
  style.setAttribute('id',`${NS}-styles`);
501
501
  style.textContent=`
502
- .${NS}{display:flex;flex-direction:column;height:100%;
502
+ :where(.${NS}){display:flex;flex-direction:column;height:100%;
503
503
  font-family:var(--${NS}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));
504
504
  font-size:var(--${NS}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));
505
505
  line-height:var(--${NS}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)))}
@@ -512,12 +512,12 @@ style.textContent=`
512
512
  padding:var(--${NS}-pad-y,5px) var(--${NS}-pad-x,12px);cursor:pointer;color:var(--${NS}-muted,#586069)}
513
513
  .${NS} .${NS}__tab + .${NS}__tab{border-left:1px solid var(--${NS}-separator,#e7eaee)}
514
514
  .${NS} .${NS}__tab:hover{background:var(--${NS}-hover,#ebeef1)}
515
- .${NS} .${NS}__tab:focus-visible{outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
515
+ :where(.${NS} .${NS}__tab:focus-visible){outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
516
516
  .${NS} .${NS}__tab[aria-selected="true"]{background:var(--${NS}-bg,#fff);color:var(--${NS}-active,#14171a);font-weight:600;
517
517
  margin-bottom:-1px;padding-bottom:calc(var(--${NS}-pad-y,5px) + 1px);
518
518
  box-shadow:inset 0 calc(-1 * var(--${NS}-accent-width,2px)) 0 0 var(--${NS}-accent,#1a6bc7)}
519
- .${NS} .${NS}__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
520
- .${NS} .${NS}__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
519
+ :where(.${NS} .${NS}__icon){flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
520
+ :where(.${NS} .${NS}__label){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
521
521
  .${NS} .${NS}__badge{flex:none;display:inline-flex;align-items:center;justify-content:center;
522
522
  min-width:var(--${NS}-badge-size,1.5em);padding:0 var(--${NS}-badge-pad,0.4em);
523
523
  border-radius:var(--${NS}-badge-radius,999px);font-size:var(--${NS}-badge-font-size,0.85em);
@@ -528,19 +528,18 @@ style.textContent=`
528
528
  .${NS} .${NS}__badge[data-tone="bad"]{background:var(--${NS}-badge-bad-bg,#fbe0e0);color:var(--${NS}-badge-bad-fg,#8a1c1c)}
529
529
  .${NS} .${NS}__badge[data-tone="unknown"]{background:none;color:var(--${NS}-badge-unknown-fg,#586069);
530
530
  box-shadow:inset 0 0 0 1px var(--${NS}-badge-unknown-edge,#c3c9d0)}
531
- .${NS}__unit{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
532
- .${NS}__panels{position:relative;flex:1 1 auto;min-height:0}
533
- .${NS}__panel{position:absolute;inset:0}
534
- .${NS}__panel[hidden]{display:none}
535
- .${NS}__body{position:absolute;inset:0}
536
- .${NS}__live{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
531
+ :where(.${NS}__unit){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
532
+ :where(.${NS}__panels){position:relative;flex:1 1 auto;min-height:0}
533
+ :where(.${NS}__panel){position:absolute;inset:0}
534
+ :where(.${NS}__panel[hidden]){display:none}
535
+ :where(.${NS}__body){position:absolute;inset:0}
536
+ :where(.${NS}__live){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
537
537
  `;
538
538
  (doc.head||doc.documentElement).appendChild(style);
539
539
  }
540
540
  function renderShell(state){
541
541
  const{doc,el,order}=state;
542
542
  injectStyles(doc);
543
- el.classList.add(NS);
544
543
  const root=doc.createElement('div');
545
544
  root.className=NS;
546
545
  const list=doc.createElement('div');
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, tabs module
2
+ * Lattice Grid 1.68.1, tabs 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){
@@ -501,7 +501,7 @@ const style=doc.createElement('style');
501
501
  style.id=`${NS}-styles`;
502
502
  style.setAttribute('id',`${NS}-styles`);
503
503
  style.textContent=`
504
- .${NS}{display:flex;flex-direction:column;height:100%;
504
+ :where(.${NS}){display:flex;flex-direction:column;height:100%;
505
505
  font-family:var(--${NS}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));
506
506
  font-size:var(--${NS}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));
507
507
  line-height:var(--${NS}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)))}
@@ -514,12 +514,12 @@ style.textContent=`
514
514
  padding:var(--${NS}-pad-y,5px) var(--${NS}-pad-x,12px);cursor:pointer;color:var(--${NS}-muted,#586069)}
515
515
  .${NS} .${NS}__tab + .${NS}__tab{border-left:1px solid var(--${NS}-separator,#e7eaee)}
516
516
  .${NS} .${NS}__tab:hover{background:var(--${NS}-hover,#ebeef1)}
517
- .${NS} .${NS}__tab:focus-visible{outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
517
+ :where(.${NS} .${NS}__tab:focus-visible){outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
518
518
  .${NS} .${NS}__tab[aria-selected="true"]{background:var(--${NS}-bg,#fff);color:var(--${NS}-active,#14171a);font-weight:600;
519
519
  margin-bottom:-1px;padding-bottom:calc(var(--${NS}-pad-y,5px) + 1px);
520
520
  box-shadow:inset 0 calc(-1 * var(--${NS}-accent-width,2px)) 0 0 var(--${NS}-accent,#1a6bc7)}
521
- .${NS} .${NS}__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
522
- .${NS} .${NS}__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
521
+ :where(.${NS} .${NS}__icon){flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
522
+ :where(.${NS} .${NS}__label){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
523
523
  .${NS} .${NS}__badge{flex:none;display:inline-flex;align-items:center;justify-content:center;
524
524
  min-width:var(--${NS}-badge-size,1.5em);padding:0 var(--${NS}-badge-pad,0.4em);
525
525
  border-radius:var(--${NS}-badge-radius,999px);font-size:var(--${NS}-badge-font-size,0.85em);
@@ -530,19 +530,18 @@ style.textContent=`
530
530
  .${NS} .${NS}__badge[data-tone="bad"]{background:var(--${NS}-badge-bad-bg,#fbe0e0);color:var(--${NS}-badge-bad-fg,#8a1c1c)}
531
531
  .${NS} .${NS}__badge[data-tone="unknown"]{background:none;color:var(--${NS}-badge-unknown-fg,#586069);
532
532
  box-shadow:inset 0 0 0 1px var(--${NS}-badge-unknown-edge,#c3c9d0)}
533
- .${NS}__unit{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
534
- .${NS}__panels{position:relative;flex:1 1 auto;min-height:0}
535
- .${NS}__panel{position:absolute;inset:0}
536
- .${NS}__panel[hidden]{display:none}
537
- .${NS}__body{position:absolute;inset:0}
538
- .${NS}__live{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
533
+ :where(.${NS}__unit){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
534
+ :where(.${NS}__panels){position:relative;flex:1 1 auto;min-height:0}
535
+ :where(.${NS}__panel){position:absolute;inset:0}
536
+ :where(.${NS}__panel[hidden]){display:none}
537
+ :where(.${NS}__body){position:absolute;inset:0}
538
+ :where(.${NS}__live){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
539
539
  `;
540
540
  (doc.head||doc.documentElement).appendChild(style);
541
541
  }
542
542
  function renderShell(state){
543
543
  const{doc,el,order}=state;
544
544
  injectStyles(doc);
545
- el.classList.add(NS);
546
545
  const root=doc.createElement('div');
547
546
  root.className=NS;
548
547
  const list=doc.createElement('div');
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, tabs module
2
+ * Lattice Grid 1.68.1, tabs 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){
@@ -501,7 +501,7 @@ const style=doc.createElement('style');
501
501
  style.id=`${NS}-styles`;
502
502
  style.setAttribute('id',`${NS}-styles`);
503
503
  style.textContent=`
504
- .${NS}{display:flex;flex-direction:column;height:100%;
504
+ :where(.${NS}){display:flex;flex-direction:column;height:100%;
505
505
  font-family:var(--${NS}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));
506
506
  font-size:var(--${NS}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));
507
507
  line-height:var(--${NS}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)))}
@@ -514,12 +514,12 @@ style.textContent=`
514
514
  padding:var(--${NS}-pad-y,5px) var(--${NS}-pad-x,12px);cursor:pointer;color:var(--${NS}-muted,#586069)}
515
515
  .${NS} .${NS}__tab + .${NS}__tab{border-left:1px solid var(--${NS}-separator,#e7eaee)}
516
516
  .${NS} .${NS}__tab:hover{background:var(--${NS}-hover,#ebeef1)}
517
- .${NS} .${NS}__tab:focus-visible{outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
517
+ :where(.${NS} .${NS}__tab:focus-visible){outline:2px solid var(--${NS}-focus,#2563eb);outline-offset:var(--${NS}-focus-offset,-4px)}
518
518
  .${NS} .${NS}__tab[aria-selected="true"]{background:var(--${NS}-bg,#fff);color:var(--${NS}-active,#14171a);font-weight:600;
519
519
  margin-bottom:-1px;padding-bottom:calc(var(--${NS}-pad-y,5px) + 1px);
520
520
  box-shadow:inset 0 calc(-1 * var(--${NS}-accent-width,2px)) 0 0 var(--${NS}-accent,#1a6bc7)}
521
- .${NS} .${NS}__icon{flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
522
- .${NS} .${NS}__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
521
+ :where(.${NS} .${NS}__icon){flex:none;display:inline-flex;align-items:center;justify-content:center;line-height:1}
522
+ :where(.${NS} .${NS}__label){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
523
523
  .${NS} .${NS}__badge{flex:none;display:inline-flex;align-items:center;justify-content:center;
524
524
  min-width:var(--${NS}-badge-size,1.5em);padding:0 var(--${NS}-badge-pad,0.4em);
525
525
  border-radius:var(--${NS}-badge-radius,999px);font-size:var(--${NS}-badge-font-size,0.85em);
@@ -530,19 +530,18 @@ style.textContent=`
530
530
  .${NS} .${NS}__badge[data-tone="bad"]{background:var(--${NS}-badge-bad-bg,#fbe0e0);color:var(--${NS}-badge-bad-fg,#8a1c1c)}
531
531
  .${NS} .${NS}__badge[data-tone="unknown"]{background:none;color:var(--${NS}-badge-unknown-fg,#586069);
532
532
  box-shadow:inset 0 0 0 1px var(--${NS}-badge-unknown-edge,#c3c9d0)}
533
- .${NS}__unit{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
534
- .${NS}__panels{position:relative;flex:1 1 auto;min-height:0}
535
- .${NS}__panel{position:absolute;inset:0}
536
- .${NS}__panel[hidden]{display:none}
537
- .${NS}__body{position:absolute;inset:0}
538
- .${NS}__live{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
533
+ :where(.${NS}__unit){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
534
+ :where(.${NS}__panels){position:relative;flex:1 1 auto;min-height:0}
535
+ :where(.${NS}__panel){position:absolute;inset:0}
536
+ :where(.${NS}__panel[hidden]){display:none}
537
+ :where(.${NS}__body){position:absolute;inset:0}
538
+ :where(.${NS}__live){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
539
539
  `;
540
540
  (doc.head||doc.documentElement).appendChild(style);
541
541
  }
542
542
  function renderShell(state){
543
543
  const{doc,el,order}=state;
544
544
  injectStyles(doc);
545
- el.classList.add(NS);
546
545
  const root=doc.createElement('div');
547
546
  root.className=NS;
548
547
  const list=doc.createElement('div');
package/modules/vue.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, vue module type declarations
2
+ * Lattice Grid 1.68.1, vue module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -143,6 +143,7 @@ export type LatticeVueGridEmit = {
143
143
 
144
144
  /** What a `<LatticeGrid>` template ref exposes; `grid()` is null before mount. */
145
145
  export interface LatticeVueGridExposed {
146
+ /** The live grid the component built, or null before mount. */
146
147
  grid(): Grid | null;
147
148
  }
148
149
 
@@ -190,6 +191,7 @@ export type LatticeVueViewerCommonProps = LatticeVueHostProps & {
190
191
 
191
192
  /** What a viewer's template ref exposes; `instance()` is null before mount. */
192
193
  export interface LatticeVueViewerExposed<Instance = unknown> {
194
+ /** The live viewer the component built, or null before mount. */
193
195
  instance(): Instance | null;
194
196
  }
195
197
 
@@ -233,7 +235,12 @@ export type LatticeVueLayoutProps = Record<string, unknown> & LatticeVueViewerCo
233
235
 
234
236
  /** One tab of a `<LatticeTabs>`; a slot named for its `id` makes it Vue's. */
235
237
  export interface LatticeVueTabSpec {
238
+ /**
239
+ * The tab's identity, which also names the slot whose content Vue renders into the
240
+ * panel. Required, non-empty and unique.
241
+ */
236
242
  id: string;
243
+ /** The text on the tab button. Defaults to the id. */
237
244
  label?: string;
238
245
  [key: string]: unknown;
239
246
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.67.0, vue module
2
+ * Lattice Grid 1.68.1, vue 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, vue module
2
+ * Lattice Grid 1.68.1, vue 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, vue module
2
+ * Lattice Grid 1.68.1, vue 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, webcomponent module type declarations
2
+ * Lattice Grid 1.68.1, webcomponent module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -70,12 +70,34 @@ export interface LatticeViewerEventDetail<Instance = unknown> { instance: Instan
70
70
  export interface LatticeGridElement<Row = any> extends HTMLElement {
71
71
  /** Every attribute in the table above is also a property of the same name. */
72
72
  theme: string | undefined;
73
+ /**
74
+ * The row height and padding as a named step, rather than pixel by pixel. The `density`
75
+ * attribute.
76
+ */
73
77
  density: string | undefined;
78
+ /** The locale the grid formats and sorts in. The `locale` attribute. */
74
79
  locale: string | undefined;
80
+ /**
81
+ * Which field identifies a row. As an attribute it can only be a field name; the
82
+ * composite and function forms are properties.
83
+ */
75
84
  rowKey: string | undefined;
85
+ /** Row height in pixels. The `row-height` attribute, parsed as a number. */
76
86
  rowHeight: number | undefined;
87
+ /**
88
+ * Header height in pixels. The `header-height` attribute, parsed as a number; unset,
89
+ * the header follows the density token.
90
+ */
77
91
  headerHeight: number | undefined;
92
+ /**
93
+ * Let the grid grow to its rows rather than capping its height. The `auto-height`
94
+ * attribute is a bare boolean — present is true.
95
+ */
78
96
  autoHeight: boolean | undefined;
97
+ /**
98
+ * What the reader may select: `single`, `multiple` or `none`. The `selection`
99
+ * attribute; the full selection config goes through `config`.
100
+ */
79
101
  selection: string | undefined;
80
102
  /** The live grid, or null while the element is disconnected. */
81
103
  readonly grid: Grid | null;
@@ -122,64 +144,150 @@ export interface LatticeViewerElement<Instance = unknown> extends HTMLElement {
122
144
  * empty; give it `rows` for a standalone panel.
123
145
  */
124
146
  export interface LatticeKPIElement<Row = any> extends LatticeViewerElement {
147
+ /** The panel's tiles. A structure, so it is a property rather than an attribute. */
125
148
  tiles: unknown[];
149
+ /** Rows for a standalone panel. Set them and the element stops waiting for a grid. */
126
150
  rows: Row[];
151
+ /** How many tile columns to aim for. */
127
152
  columns: number | undefined;
153
+ /** Which field identifies a row, for the panel's own keyed store. */
128
154
  rowKey: string | undefined;
155
+ /** The default locale a clock tile formats in. */
129
156
  locale: string | undefined;
157
+ /**
158
+ * Passed to the panel as `theme`, which the panel does not read — it mirrors the
159
+ * theme of the grid it is mounted beside, and otherwise follows the page's tokens.
160
+ */
130
161
  theme: string | undefined;
162
+ /**
163
+ * Passed to the panel as `density`, which the panel does not read — density is
164
+ * mirrored from the grid the panel belongs to.
165
+ */
131
166
  density: string | undefined;
167
+ /**
168
+ * Passed to the panel as `format`, which the panel does not read — formatting is
169
+ * per tile (`tiles: [{ format }]`).
170
+ */
132
171
  format: unknown;
133
172
  }
134
173
 
135
174
  /** `<lattice-chart>`. Always drawn from a grid, so it waits for one. */
136
175
  export interface LatticeChartElement extends LatticeViewerElement {
176
+ /**
177
+ * A geomap's geometry: a loaded pack, `{ pack: id }`, GeoJSON, or a map of code to path
178
+ * data. A structure, so it is a property.
179
+ */
137
180
  shapes: unknown;
181
+ /** The column that splits the measure into one series per distinct value. */
138
182
  series: unknown;
183
+ /**
184
+ * Passed to the chart as `data`, which the chart does not read — a chart draws the
185
+ * grid's own filtered rows. Use the grid's rows, or the chart spec's `rows`, through
186
+ * `config`.
187
+ */
139
188
  data: unknown;
189
+ /**
190
+ * Passed to the chart as `formatting`, which the chart does not read — a chart formats
191
+ * through the grid's own formatting and each column's type.
192
+ */
140
193
  formatting: unknown;
194
+ /** Which chart to draw. The `type` attribute. */
141
195
  type: string | undefined;
196
+ /** The category column. */
142
197
  x: string | undefined;
198
+ /** The measure column, or several for a multi-measure chart. */
143
199
  y: string | string[] | undefined;
200
+ /** The measure a markermap writes beside each dot and colours it by. */
144
201
  value: string | undefined;
202
+ /** The row-label column, for the types that name their rows. */
145
203
  label: string | undefined;
204
+ /** The longitude column, in degrees east, for the maps that place a row by where it is. */
146
205
  lon: string | undefined;
206
+ /** The latitude column, in degrees north. */
147
207
  lat: string | undefined;
208
+ /** Print the value beside each mark. The `labels` attribute is a bare boolean. */
148
209
  labels: boolean | undefined;
210
+ /**
211
+ * Passed to the chart as `stacked`, which the chart does not read — its own option is
212
+ * `stack`, reachable through `config`.
213
+ */
149
214
  stacked: boolean | undefined;
215
+ /**
216
+ * Passed to the chart as `horizontal`, which the chart does not read — orientation
217
+ * follows the chart type (`horizontalBar` and the row-named types draw along y).
218
+ */
150
219
  horizontal: boolean | undefined;
220
+ /** The colour scheme by name. */
151
221
  scheme: string | undefined;
152
222
  }
153
223
 
154
224
  /** `<lattice-kanban>`. Grid-bound like the KPI panel; give it `rows` to stand alone. */
155
225
  export interface LatticeKanbanElement<Row = any> extends LatticeViewerElement {
226
+ /** Rows for a standalone board. Set them and the element stops waiting for a grid. */
156
227
  rows: Row[];
228
+ /** The board's column definitions. */
157
229
  columns: unknown[];
230
+ /** The card template's field mapping — title, subtitle, labels, assignee and the rest. */
158
231
  card: unknown;
232
+ /**
233
+ * Passed to the board as `facets`, which the board does not read — filter it with
234
+ * `filter`, `quickFilter`, `setSprint` or `setEpic` instead.
235
+ */
159
236
  facets: unknown;
237
+ /** Which field identifies a card. */
160
238
  rowKey: string | undefined;
239
+ /** The row property that puts a card in a column. */
161
240
  columnProperty: string | undefined;
241
+ /**
242
+ * Passed to the board as `titleProperty`, which the board does not read — map the
243
+ * card's headline through `card` (`card: { title: 'name' }`).
244
+ */
162
245
  titleProperty: string | undefined;
246
+ /**
247
+ * Draw the two-dimensional swimlane layout. The `swimlanes` attribute is a bare
248
+ * boolean; name the lane property through `swimlane-property`.
249
+ */
163
250
  swimlanes: boolean | undefined;
164
251
  }
165
252
 
166
253
  /** `<lattice-gantt>`. */
167
254
  export interface LatticeGanttElement extends LatticeViewerElement {
255
+ /** The plan's tasks. A structure, so it is a property. */
168
256
  tasks: unknown[];
257
+ /** The links between tasks. */
169
258
  dependencies: unknown[];
259
+ /** The resource capacities, for over-allocation and levelling. */
170
260
  resources: unknown;
261
+ /** The working-time calendar: the `weekends` preset, or explicit workdays and holidays. */
171
262
  calendar: unknown;
263
+ /** The table panel's columns, for the split view. */
172
264
  columns: unknown;
265
+ /** Which field identifies a task. */
173
266
  rowKey: string | undefined;
267
+ /**
268
+ * Passed to the plan as `scale`, which it does not read — the timeline's zoom is a
269
+ * render option, set through `config: { render: { zoom } }`.
270
+ */
174
271
  scale: string | undefined;
272
+ /**
273
+ * Cascade an edit down the dependency chain rather than only recomputing. A bare
274
+ * boolean attribute.
275
+ */
175
276
  autoSchedule: boolean | undefined;
176
277
  }
177
278
 
178
279
  /** `<lattice-layout>`. */
179
280
  export interface LatticeLayoutElement extends LatticeViewerElement {
281
+ /**
282
+ * The windows to place, each with its content and its cell. A structure, so it is a
283
+ * property.
284
+ */
180
285
  windows: unknown[];
286
+ /** How many columns the grid of windows has. */
181
287
  columns: number | undefined;
288
+ /** How many rows the grid of windows has. */
182
289
  rows: number | undefined;
290
+ /** Which way windows collapse into the space a closed one left. */
183
291
  compact: string | undefined;
184
292
  }
185
293
 
@@ -189,6 +297,10 @@ export interface LatticeLayoutElement extends LatticeViewerElement {
189
297
  * left to the module.
190
298
  */
191
299
  export interface LatticeTabsElement extends LatticeViewerElement {
300
+ /**
301
+ * The tab descriptors. A tab's content comes from a `<template data-tab="‹id›">` child
302
+ * when there is one.
303
+ */
192
304
  tabs: unknown[];
193
305
  }
194
306