@toclocoinc/lattice-grid 1.88.2 → 1.88.3

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 (309) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/angular/fesm2022/toclocoinc-lattice-grid-angular.mjs +6 -2
  4. package/angular/package.json +1 -1
  5. package/angular/types/toclocoinc-lattice-grid-angular.d.ts +3 -1
  6. package/docs/API.html +62 -6
  7. package/docs/api/adapters.html +1 -1
  8. package/docs/api/ai.html +1 -1
  9. package/docs/api/alarms.html +1 -1
  10. package/docs/api/calendar.html +1 -1
  11. package/docs/api/charts.html +1 -1
  12. package/docs/api/dashboard.html +1 -1
  13. package/docs/api/data-router.html +1 -1
  14. package/docs/api/deckgl.html +1 -1
  15. package/docs/api/gantt.html +58 -2
  16. package/docs/api/geometry.html +1 -1
  17. package/docs/api/grid.html +2 -2
  18. package/docs/api/index.html +2 -2
  19. package/docs/api/kanban.html +1 -1
  20. package/docs/api/kpi.html +1 -1
  21. package/docs/api/layout.html +1 -1
  22. package/docs/api/leaflet.html +1 -1
  23. package/docs/api/list.html +1 -1
  24. package/docs/api/mapview.html +1 -1
  25. package/docs/api/mock-socket.html +1 -1
  26. package/docs/api/presets.html +1 -1
  27. package/docs/api/tabs.html +1 -1
  28. package/docs/api/types.html +2 -2
  29. package/docs/api-detail.html +4 -4
  30. package/docs/warnings.json +1 -1
  31. package/lattice-grid.d.ts +1 -1
  32. package/lattice-grid.esm.min.js +3 -3
  33. package/lattice-grid.min.cjs +3 -3
  34. package/lattice-grid.min.js +3 -3
  35. package/modules/ai.d.ts +1 -1
  36. package/modules/ai.esm.min.js +2 -2
  37. package/modules/ai.min.cjs +2 -2
  38. package/modules/ai.min.js +2 -2
  39. package/modules/alarms.d.ts +1 -1
  40. package/modules/alarms.esm.min.js +2 -2
  41. package/modules/alarms.min.cjs +2 -2
  42. package/modules/alarms.min.js +2 -2
  43. package/modules/angular.d.ts +1 -1
  44. package/modules/angular.esm.min.js +2 -2
  45. package/modules/angular.min.cjs +2 -2
  46. package/modules/angular.min.js +2 -2
  47. package/modules/calendar.d.ts +1 -1
  48. package/modules/calendar.esm.min.js +2 -2
  49. package/modules/calendar.min.cjs +2 -2
  50. package/modules/calendar.min.js +2 -2
  51. package/modules/chart-alluvial.d.ts +1 -1
  52. package/modules/chart-alluvial.esm.min.js +1 -1
  53. package/modules/chart-alluvial.min.cjs +1 -1
  54. package/modules/chart-alluvial.min.js +1 -1
  55. package/modules/chart-arc.d.ts +1 -1
  56. package/modules/chart-arc.esm.min.js +1 -1
  57. package/modules/chart-arc.min.cjs +1 -1
  58. package/modules/chart-arc.min.js +1 -1
  59. package/modules/chart-barrace.d.ts +1 -1
  60. package/modules/chart-barrace.esm.min.js +1 -1
  61. package/modules/chart-barrace.min.cjs +1 -1
  62. package/modules/chart-barrace.min.js +1 -1
  63. package/modules/chart-bubblemap.d.ts +1 -1
  64. package/modules/chart-bubblemap.esm.min.js +1 -1
  65. package/modules/chart-bubblemap.min.cjs +1 -1
  66. package/modules/chart-bubblemap.min.js +1 -1
  67. package/modules/chart-bump.d.ts +1 -1
  68. package/modules/chart-bump.esm.min.js +1 -1
  69. package/modules/chart-bump.min.cjs +1 -1
  70. package/modules/chart-bump.min.js +1 -1
  71. package/modules/chart-calendar.d.ts +1 -1
  72. package/modules/chart-calendar.esm.min.js +1 -1
  73. package/modules/chart-calendar.min.cjs +1 -1
  74. package/modules/chart-calendar.min.js +1 -1
  75. package/modules/chart-choropleth.d.ts +1 -1
  76. package/modules/chart-choropleth.esm.min.js +1 -1
  77. package/modules/chart-choropleth.min.cjs +1 -1
  78. package/modules/chart-choropleth.min.js +1 -1
  79. package/modules/chart-decomposition.d.ts +1 -1
  80. package/modules/chart-decomposition.esm.min.js +1 -1
  81. package/modules/chart-decomposition.min.cjs +1 -1
  82. package/modules/chart-decomposition.min.js +1 -1
  83. package/modules/chart-diverging.d.ts +1 -1
  84. package/modules/chart-diverging.esm.min.js +1 -1
  85. package/modules/chart-diverging.min.cjs +1 -1
  86. package/modules/chart-diverging.min.js +1 -1
  87. package/modules/chart-dumbbell.d.ts +1 -1
  88. package/modules/chart-dumbbell.esm.min.js +1 -1
  89. package/modules/chart-dumbbell.min.cjs +1 -1
  90. package/modules/chart-dumbbell.min.js +1 -1
  91. package/modules/chart-fan.d.ts +1 -1
  92. package/modules/chart-fan.esm.min.js +1 -1
  93. package/modules/chart-fan.min.cjs +1 -1
  94. package/modules/chart-fan.min.js +1 -1
  95. package/modules/chart-forcetree.d.ts +1 -1
  96. package/modules/chart-forcetree.esm.min.js +1 -1
  97. package/modules/chart-forcetree.min.cjs +1 -1
  98. package/modules/chart-forcetree.min.js +1 -1
  99. package/modules/chart-hexbin.d.ts +1 -1
  100. package/modules/chart-hexbin.esm.min.js +1 -1
  101. package/modules/chart-hexbin.min.cjs +1 -1
  102. package/modules/chart-hexbin.min.js +1 -1
  103. package/modules/chart-hexmap.d.ts +1 -1
  104. package/modules/chart-hexmap.esm.min.js +1 -1
  105. package/modules/chart-hexmap.min.cjs +1 -1
  106. package/modules/chart-hexmap.min.js +1 -1
  107. package/modules/chart-icicle.d.ts +1 -1
  108. package/modules/chart-icicle.esm.min.js +1 -1
  109. package/modules/chart-icicle.min.cjs +1 -1
  110. package/modules/chart-icicle.min.js +1 -1
  111. package/modules/chart-markermap.d.ts +1 -1
  112. package/modules/chart-markermap.esm.min.js +1 -1
  113. package/modules/chart-markermap.min.cjs +1 -1
  114. package/modules/chart-markermap.min.js +1 -1
  115. package/modules/chart-motion.d.ts +1 -1
  116. package/modules/chart-motion.esm.min.js +1 -1
  117. package/modules/chart-motion.min.cjs +1 -1
  118. package/modules/chart-motion.min.js +1 -1
  119. package/modules/chart-pack.d.ts +1 -1
  120. package/modules/chart-pack.esm.min.js +1 -1
  121. package/modules/chart-pack.min.cjs +1 -1
  122. package/modules/chart-pack.min.js +1 -1
  123. package/modules/chart-parallel.d.ts +1 -1
  124. package/modules/chart-parallel.esm.min.js +1 -1
  125. package/modules/chart-parallel.min.cjs +1 -1
  126. package/modules/chart-parallel.min.js +1 -1
  127. package/modules/chart-pictorial.d.ts +1 -1
  128. package/modules/chart-pictorial.esm.min.js +1 -1
  129. package/modules/chart-pictorial.min.cjs +1 -1
  130. package/modules/chart-pictorial.min.js +1 -1
  131. package/modules/chart-polararea.d.ts +1 -1
  132. package/modules/chart-polararea.esm.min.js +1 -1
  133. package/modules/chart-polararea.min.cjs +1 -1
  134. package/modules/chart-polararea.min.js +1 -1
  135. package/modules/chart-polarscatter.d.ts +1 -1
  136. package/modules/chart-polarscatter.esm.min.js +1 -1
  137. package/modules/chart-polarscatter.min.cjs +1 -1
  138. package/modules/chart-polarscatter.min.js +1 -1
  139. package/modules/chart-pyramid.d.ts +1 -1
  140. package/modules/chart-pyramid.esm.min.js +1 -1
  141. package/modules/chart-pyramid.min.cjs +1 -1
  142. package/modules/chart-pyramid.min.js +1 -1
  143. package/modules/chart-radialbar.d.ts +1 -1
  144. package/modules/chart-radialbar.esm.min.js +1 -1
  145. package/modules/chart-radialbar.min.cjs +1 -1
  146. package/modules/chart-radialbar.min.js +1 -1
  147. package/modules/chart-ridgeline.d.ts +1 -1
  148. package/modules/chart-ridgeline.esm.min.js +1 -1
  149. package/modules/chart-ridgeline.min.cjs +1 -1
  150. package/modules/chart-ridgeline.min.js +1 -1
  151. package/modules/chart-roc.d.ts +1 -1
  152. package/modules/chart-roc.esm.min.js +1 -1
  153. package/modules/chart-roc.min.cjs +1 -1
  154. package/modules/chart-roc.min.js +1 -1
  155. package/modules/chart-serpentine.d.ts +1 -1
  156. package/modules/chart-serpentine.esm.min.js +1 -1
  157. package/modules/chart-serpentine.min.cjs +1 -1
  158. package/modules/chart-serpentine.min.js +1 -1
  159. package/modules/chart-slope.d.ts +1 -1
  160. package/modules/chart-slope.esm.min.js +1 -1
  161. package/modules/chart-slope.min.cjs +1 -1
  162. package/modules/chart-slope.min.js +1 -1
  163. package/modules/chart-spiral.d.ts +1 -1
  164. package/modules/chart-spiral.esm.min.js +1 -1
  165. package/modules/chart-spiral.min.cjs +1 -1
  166. package/modules/chart-spiral.min.js +1 -1
  167. package/modules/chart-splom.d.ts +1 -1
  168. package/modules/chart-splom.esm.min.js +1 -1
  169. package/modules/chart-splom.min.cjs +1 -1
  170. package/modules/chart-splom.min.js +1 -1
  171. package/modules/chart-tree.d.ts +1 -1
  172. package/modules/chart-tree.esm.min.js +1 -1
  173. package/modules/chart-tree.min.cjs +1 -1
  174. package/modules/chart-tree.min.js +1 -1
  175. package/modules/chart-venn.d.ts +1 -1
  176. package/modules/chart-venn.esm.min.js +1 -1
  177. package/modules/chart-venn.min.cjs +1 -1
  178. package/modules/chart-venn.min.js +1 -1
  179. package/modules/chart-voronoi.d.ts +1 -1
  180. package/modules/chart-voronoi.esm.min.js +1 -1
  181. package/modules/chart-voronoi.min.cjs +1 -1
  182. package/modules/chart-voronoi.min.js +1 -1
  183. package/modules/chart-waffle.d.ts +1 -1
  184. package/modules/chart-waffle.esm.min.js +1 -1
  185. package/modules/chart-waffle.min.cjs +1 -1
  186. package/modules/chart-waffle.min.js +1 -1
  187. package/modules/chart-wordcloud.d.ts +1 -1
  188. package/modules/chart-wordcloud.esm.min.js +1 -1
  189. package/modules/chart-wordcloud.min.cjs +1 -1
  190. package/modules/chart-wordcloud.min.js +1 -1
  191. package/modules/charts.d.ts +1 -1
  192. package/modules/charts.esm.min.js +2 -2
  193. package/modules/charts.min.cjs +2 -2
  194. package/modules/charts.min.js +2 -2
  195. package/modules/dashboard.d.ts +1 -1
  196. package/modules/dashboard.esm.min.js +2 -2
  197. package/modules/dashboard.min.cjs +2 -2
  198. package/modules/dashboard.min.js +2 -2
  199. package/modules/data-router.d.ts +1 -1
  200. package/modules/data-router.esm.min.js +2 -2
  201. package/modules/data-router.min.cjs +2 -2
  202. package/modules/data-router.min.js +2 -2
  203. package/modules/deckgl.d.ts +1 -1
  204. package/modules/deckgl.esm.min.js +2 -2
  205. package/modules/deckgl.min.cjs +2 -2
  206. package/modules/deckgl.min.js +2 -2
  207. package/modules/devtools.d.ts +1 -1
  208. package/modules/devtools.esm.min.js +1 -1
  209. package/modules/devtools.min.cjs +1 -1
  210. package/modules/devtools.min.js +1 -1
  211. package/modules/dhtmlx-compat.d.ts +1 -1
  212. package/modules/dhtmlx-compat.esm.min.js +2 -2
  213. package/modules/dhtmlx-compat.min.cjs +2 -2
  214. package/modules/dhtmlx-compat.min.js +2 -2
  215. package/modules/gantt.d.ts +58 -3
  216. package/modules/gantt.esm.min.js +223 -217
  217. package/modules/gantt.esm.min.js.map +2 -2
  218. package/modules/gantt.min.cjs +222 -216
  219. package/modules/gantt.min.js +222 -216
  220. package/modules/gantt.min.js.map +2 -2
  221. package/modules/geo-europe-nuts.d.ts +1 -1
  222. package/modules/geo-europe-nuts.esm.min.js +1 -1
  223. package/modules/geo-europe-nuts.min.cjs +1 -1
  224. package/modules/geo-europe-nuts.min.js +1 -1
  225. package/modules/geo-uk.d.ts +1 -1
  226. package/modules/geo-uk.esm.min.js +1 -1
  227. package/modules/geo-uk.min.cjs +1 -1
  228. package/modules/geo-uk.min.js +1 -1
  229. package/modules/geo-us-states.d.ts +1 -1
  230. package/modules/geo-us-states.esm.min.js +1 -1
  231. package/modules/geo-us-states.min.cjs +1 -1
  232. package/modules/geo-us-states.min.js +1 -1
  233. package/modules/geo-world-110m.d.ts +1 -1
  234. package/modules/geo-world-110m.esm.min.js +1 -1
  235. package/modules/geo-world-110m.min.cjs +1 -1
  236. package/modules/geo-world-110m.min.js +1 -1
  237. package/modules/geo-world-50m.d.ts +1 -1
  238. package/modules/geo-world-50m.esm.min.js +1 -1
  239. package/modules/geo-world-50m.min.cjs +1 -1
  240. package/modules/geo-world-50m.min.js +1 -1
  241. package/modules/geometry.d.ts +1 -1
  242. package/modules/geometry.esm.min.js +2 -2
  243. package/modules/geometry.min.cjs +2 -2
  244. package/modules/geometry.min.js +2 -2
  245. package/modules/htmx.d.ts +1 -1
  246. package/modules/htmx.esm.min.js +3 -3
  247. package/modules/htmx.min.cjs +3 -3
  248. package/modules/htmx.min.js +3 -3
  249. package/modules/kanban.d.ts +1 -1
  250. package/modules/kanban.esm.min.js +2 -2
  251. package/modules/kanban.min.cjs +2 -2
  252. package/modules/kanban.min.js +2 -2
  253. package/modules/kpi.d.ts +1 -1
  254. package/modules/kpi.esm.min.js +2 -2
  255. package/modules/kpi.min.cjs +2 -2
  256. package/modules/kpi.min.js +2 -2
  257. package/modules/layout.d.ts +1 -1
  258. package/modules/layout.esm.min.js +2 -2
  259. package/modules/layout.min.cjs +2 -2
  260. package/modules/layout.min.js +2 -2
  261. package/modules/leaflet.d.ts +1 -1
  262. package/modules/leaflet.esm.min.js +2 -2
  263. package/modules/leaflet.min.cjs +2 -2
  264. package/modules/leaflet.min.js +2 -2
  265. package/modules/list.d.ts +1 -1
  266. package/modules/list.esm.min.js +2 -2
  267. package/modules/list.min.cjs +2 -2
  268. package/modules/list.min.js +2 -2
  269. package/modules/mapview.d.ts +1 -1
  270. package/modules/mapview.esm.min.js +2 -2
  271. package/modules/mapview.min.cjs +2 -2
  272. package/modules/mapview.min.js +2 -2
  273. package/modules/mock-socket.d.ts +1 -1
  274. package/modules/mock-socket.esm.min.js +1 -1
  275. package/modules/mock-socket.min.cjs +1 -1
  276. package/modules/mock-socket.min.js +1 -1
  277. package/modules/presets.d.ts +1 -1
  278. package/modules/presets.esm.min.js +2 -2
  279. package/modules/presets.min.cjs +2 -2
  280. package/modules/presets.min.js +2 -2
  281. package/modules/react.d.ts +1 -1
  282. package/modules/react.esm.min.js +2 -2
  283. package/modules/react.esm.min.js.map +1 -1
  284. package/modules/react.min.cjs +2 -2
  285. package/modules/react.min.js +2 -2
  286. package/modules/react.min.js.map +1 -1
  287. package/modules/svelte.d.ts +1 -1
  288. package/modules/svelte.esm.min.js +3 -3
  289. package/modules/svelte.esm.min.js.map +1 -1
  290. package/modules/svelte.min.cjs +2 -2
  291. package/modules/svelte.min.js +2 -2
  292. package/modules/svelte.min.js.map +1 -1
  293. package/modules/tabs.d.ts +1 -1
  294. package/modules/tabs.esm.min.js +2 -2
  295. package/modules/tabs.min.cjs +2 -2
  296. package/modules/tabs.min.js +2 -2
  297. package/modules/vue.d.ts +1 -1
  298. package/modules/vue.esm.min.js +2 -2
  299. package/modules/vue.esm.min.js.map +1 -1
  300. package/modules/vue.min.cjs +2 -2
  301. package/modules/vue.min.js +2 -2
  302. package/modules/vue.min.js.map +1 -1
  303. package/modules/webcomponent.d.ts +1 -1
  304. package/modules/webcomponent.esm.min.js +4 -4
  305. package/modules/webcomponent.esm.min.js.map +1 -1
  306. package/modules/webcomponent.min.cjs +4 -4
  307. package/modules/webcomponent.min.js +4 -4
  308. package/modules/webcomponent.min.js.map +1 -1
  309. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kanban module type declarations
2
+ * Lattice Grid 1.88.3, kanban module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kanban module
2
+ * Lattice Grid 1.88.3, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.2";async function D(){return d}const E="1.88.2",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(P.length?T=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));P=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>H(P.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)T.push(I);return T}if(!M){for(let I=0;I<P;I++)T.push(X-(P-I));return T}if(!m){for(let I=0;I<P;I++)T.push(B+1+I);return T}const A=(X-B)/(P+1);for(let I=0;I<P;I++)T.push(B+A*(I+1));return T}function ge(y,p,P,S,B=3){const X=P>0?P:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
6
+ var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.3";async function D(){return d}const E="1.88.3",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(P.length?T=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));P=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>H(P.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)T.push(I);return T}if(!M){for(let I=0;I<P;I++)T.push(X-(P-I));return T}if(!m){for(let I=0;I<P;I++)T.push(B+1+I);return T}const A=(X-B)/(P+1);for(let I=0;I<P;I++)T.push(B+A*(I+1));return T}function ge(y,p,P,S,B=3){const X=P>0?P:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
7
7
  .${d}{
8
8
  display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
9
9
  box-sizing:border-box; width:100%; height:100%; min-height:0;
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kanban module
2
+ * Lattice Grid 1.88.3, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- (function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.2";async function D(){return d}const E="1.88.2",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
6
+ (function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.3";async function D(){return d}const E="1.88.3",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
7
7
  .${d}{
8
8
  display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
9
9
  box-sizing:border-box; width:100%; height:100%; min-height:0;
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kanban module
2
+ * Lattice Grid 1.88.3, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- (function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.2";async function D(){return d}const E="1.88.2",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
6
+ (function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.88.3";async function D(){return d}const E="1.88.3",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
7
7
  .${d}{
8
8
  display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
9
9
  box-sizing:border-box; width:100%; height:100%; min-height:0;
package/modules/kpi.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kpi module type declarations
2
+ * Lattice Grid 1.88.3, kpi module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kpi module
2
+ * Lattice Grid 1.88.3, kpi module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- var Ut=Object.create(null),Bt=Object.create(null);function Ue(g,fe){Ut[g]=fe}function zt(g){var fe=Bt[g];if(fe)return fe;var X=Object.create(null);Bt[g]=X;var Y=Ut[g];if(!Y)throw new Error("[lattice] missing module: "+g);return Y(X,zt),X}Ue("packages/core/src/internal/util.js",function(g,fe){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return me}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return t}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.88.2";async function Y(){return X}const N="1.88.2",A=new Set,m=2e3;function R(l){if(A.add(l),A.size>m){const o=A.values().next().value;o!==void 0&&A.delete(o)}}const a=[],E=500;function I(l,o,f){a.push({key:l,level:o,message:f.map(w=>typeof w=="string"?w:x(w)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(l){if(l instanceof Error)return l.message;try{return JSON.stringify(l)}catch{return String(l)}}function $(){return a.map(l=>({...l}))}function F(l){if(l.length===0||typeof l[0]!="string")return l;const o=l[0].replace(/^\[lattice\]\s*/,"");return o===l[0]?l:[o,...l.slice(1)]}function D(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"warn",f),console.warn("[lattice]",...f)}function Z(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"info",f),console.info("[lattice]",...f)}function V(){A.clear(),a.length=0}function d(l,o){const f=new Error(`[lattice] ${l}`);throw o!==void 0&&(f.cause=o),f}function y(l,o){l||d(o)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(l){return l!==null&&typeof l=="object"&&!Array.isArray(l)}function b(l){return typeof l=="function"}function P(l){return l==null}function O(l){return l==null||l===""}function M(l){return typeof l!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(l))?!0:!!(l.prototype&&Object.getOwnPropertyNames(l.prototype).length>1)}const H=new Map;function ae(l){let o=H.get(l);if(o)return o;if(!l.includes("."))o=f=>f?.[l];else{const f=l.split("."),w=f.length;o=Q=>{let ne=Q;for(let le=0;le<w;le++){if(ne==null)return;ne=ne[f[le]]}return ne}}return H.set(l,o),o}const G=new Map;function h(l){let o=G.get(l);if(o)return o;if(!l.includes("."))o=(f,w)=>{f!=null&&(f[l]=w)};else{const f=l.split("."),w=f.length-1;o=(Q,ne)=>{let le=Q;for(let se=0;se<w;se++){if(le==null)return;const Ne=f[se];le[Ne]==null&&(le[Ne]={}),le=le[Ne]}le!=null&&(le[f[w]]=ne)}}return G.set(l,o),o}function v(l,o){return ae(o)(l)}function L(l,o,f){h(o)(l,f)}function _(l){return l?(l.includes(".")?l.slice(l.lastIndexOf(".")+1):l).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const z={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function ce(l){const o=l==null?"":String(l);return/[&<>"']/.test(o)?o.replace(/[&<>"']/g,f=>z[f]):o}function ue(l){return String(l).replace(/\w\S*/g,o=>o[0].toUpperCase()+o.slice(1).toLowerCase())}function ve(l,o,f){if(l!==void 0)return l===!0?{enabled:!0,...f}:l===!1?{enabled:!1}:p(l)?l:{[o]:l,enabled:!0}}function T(l){return l==null?[]:Array.isArray(l)?l:[l]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(l,o){if(!p(l))return p(o)?{...o}:o;if(!p(o))return o===void 0?l:o;const f={...l};for(const w of Object.keys(o)){if(C.has(w))continue;const Q=o[w];Q!==void 0&&(f[w]=p(Q)&&p(f[w])?B(f[w],Q):Q)}return f}function ee(l,o){if(!p(l)||!p(o)||l===o)return o;const f=Object.create(Object.getPrototypeOf(l));return Object.assign(f,l,o),f}class me{#e;#t=new Map;#n;constructor(o=256,f=null){this.#e=o,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(o){this.#e=o,this.#r()}has(o){return this.#t.has(o)}get(o){const f=this.#t;if(!f.has(o))return;const w=f.get(o);return f.delete(o),f.set(o,w),w}peek(o){return this.#t.get(o)}set(o,f){const w=this.#t;return w.has(o)&&w.delete(o),w.set(o,f),this.#r(),f}delete(o){const f=this.#t.get(o);return this.#t.delete(o)&&this.#n&&this.#n(f,o),f}clear(){if(this.#n)for(const[o,f]of this.#t)this.#n(f,o);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const o=this.#t;for(;o.size>this.#e;){const f=o.keys().next().value,w=o.get(f);o.delete(f),this.#n&&this.#n(w,f)}}}const j=new Map;function U(l,o){const f=`${l||""}|${o?JSON.stringify(o):""}`;let w=j.get(f);return w||(w=new Intl.Collator(l||void 0,{numeric:!0,sensitivity:"variant",...o}),j.set(f,w)),w}function K(l,o){if(l===o)return 0;if(l==null)return 1;if(o==null)return-1;if(typeof l=="number"&&typeof o=="number")return Number.isNaN(l)?Number.isNaN(o)?0:1:Number.isNaN(o)||l<o?-1:l>o?1:0;const f=String(l),w=String(o);return f<w?-1:f>w?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const n=typeof requestAnimationFrame=="function";function t(l){return n?requestAnimationFrame(l):setTimeout(()=>l(S()),16)}function i(l){l!=null&&(n?cancelAnimationFrame(l):clearTimeout(l))}function e(l){let o=null,f=null;const w=()=>{o=null;const ne=f;f=null,l(...ne||[])},Q=(...ne)=>{f=ne,o===null&&(o=t(w))};return Q.cancel=()=>{i(o),o=null,f=null},Q.flush=()=>{o!==null&&(i(o),w())},Q}function r(l,o){let f=null,w=null;const Q=()=>{if(f=null,w===null)return;const se=w;w=null,l(...se),ne()},ne=()=>{f=setTimeout(Q,o),typeof f?.unref=="function"&&f.unref()},le=(...se)=>{f===null?(l(...se),ne()):(w=se,clearTimeout(f),ne())};return le.flush=()=>{if(f!==null&&clearTimeout(f),f=null,w===null)return;const se=w;w=null,l(...se)},le.cancel=()=>{f!==null&&clearTimeout(f),f=null,w=null},le.pending=()=>f!==null||w!==null,le}function s(l,o=50){return typeof requestIdleCallback=="function"?requestIdleCallback(l,{timeout:o}):setTimeout(()=>l({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(l="l"){return`${l}${(++u).toString(36)}`}}),Ue("packages/modules/kpi/aggregate.js",function(g,fe){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return V}});const X=fe("packages/core/src/internal/util.js"),Y=X.isNil,N=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(Y(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y:0}}}case"avg":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y/k:null}}}case"countDistinct":{const y=new Map;return{add(k){Y(k)||y.set(k,(y.get(k)||0)+1)},remove(k){if(Y(k))return;const p=y.get(k);p&&(p===1?y.delete(k):y.set(k,p-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let k=null,p=!1;const b=(O,M)=>d?O>M:O<M,P=()=>{let O=null;for(const M of y.keys())(O===null||b(M,O))&&(O=M);return O};return{add(O){const M=R(O);M!==null&&(y.set(M,(y.get(M)||0)+1),!p&&(k===null||b(M,k))&&(k=M))},remove(O){const M=R(O);if(M===null)return;const H=y.get(M);H&&(H===1?(y.delete(M),M===k&&(p=!0)):y.set(M,H-1))},value(){return y.size===0?null:(p&&(k=P(),p=!1),k)}}}function I(d){return N(d)?d:typeof d=="string"&&d?A(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const P=Y(b.min)?-1/0:b.min,O=Y(b.max)?1/0:b.max;if(d>=P&&d<O)return b.status??null}return null}const k=y.thresholds;return!k||Y(k.warn)||Y(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const $="unknown";function F(d,y,k){return k?x(d,y):$}function D(d){if(!d)return null;const y=[];let k=!1;const p=O=>{if(Y(O))return!1;const M=Number(O);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!Y(d.thresholds.warn)&&!Y(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&y.push(0),!y.length)return null;const b=Math.min(...y),P=Math.max(...y);return P>b?{lo:b,hi:P}:null}function Z(d,y){if(!y||Y(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=y.hi-y.lo;return p?Math.max(0,Math.min(1,(k-y.lo)/p))*100:null}function V(d,y,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof y=="string"?{type:y}:y||{},b=p.type||"number",P=p.locale||void 0,O={};b==="currency"?(O.style="currency",O.currency=p.currency||"USD"):b==="percent"?O.style="percent":b==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),Y(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const M=typeof p.prefix=="string"?p.prefix:"",H=typeof p.suffix=="string"?p.suffix:"";try{return M+new Intl.NumberFormat(P,O).format(d)+H}catch{return M+String(d)+H}}}),Ue("packages/core/src/source/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return D}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.warnOnce,A="",m="\0tree:";function R(Z,V){return{physical:Z,key:V,level:0,children:[],value:void 0}}function a(Z,V){const d=[],y=new Map;for(let k=0;k<Z.length;k++){const p=Z[k],b=V.pathOf(p),P=Array.isArray(b)?b.map(M=>String(M)):[];if(!P.length){const M=R(p,V.keyOf(p));d.push(M);continue}let O=null;for(let M=0;M<P.length;M++){const H=P.slice(0,M+1).join(A),ae=M===P.length-1;let G=y.get(H);G&&ae&&G.physical===-1&&(G.physical=p,G.key=V.keyOf(p)),G||(G=R(ae?p:-1,ae?V.keyOf(p):m+H),G.level=M,G.value=P[M],y.set(H,G),O?O.children.push(G):d.push(G)),O=G}}return{roots:d,nodes:y}}function E(Z,V){const d=new Map,y=[];for(let P=0;P<Z.length;P++){const O=Z[P],M=V.keyOf(O),H=R(O,M);d.set(M,H);const ae=V.parentOf(O);ae!=null&&ae!==""&&y.push({node:H,parent:String(ae)})}let k=null;const p=new Map;for(const{node:P,parent:O}of y){const M=d.get(O);if(M){p.set(P.key,M);continue}V.orphans&&V.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=V.orphans),p.set(P.key,k))}const b=[];for(const P of d.values()){const O=p.get(P.key);O?O.children.push(P):b.push(P)}return k&&k.children.length&&b.push(k),{roots:I(b,d,V.orphans,k),nodes:d}}function I(Z,V,d,y){const k=new Set,p=[...Z];for(;p.length;){const H=p.pop();if(!k.has(H.key)){k.add(H.key);for(const ae of H.children)p.push(ae)}}const b=[];for(const H of V.values())k.has(H.key)||b.push(H);if(!b.length)return Z;const P=!!d&&d!=="root";N("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+(P?`they are shown under "${d}".`:"they are shown at the root."));for(const H of b)H.children=H.children.filter(ae=>k.has(ae.key));if(!P)return[...Z,...b];let O=y;const M=[...Z];return O||(O=R(-1,`${m}orphans`),O.value=d,M.push(O)),O.children.push(...b),M}function x(Z){let V=0;const d=(y,k)=>{for(const p of y)p.level=k,k>V&&(V=k),p.children.length&&d(p.children,k+1)};return d(Z,0),V}function $(Z,V){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,k=Y(Z.hasChildren)?p=>!!Z.hasChildren(V.dataAt(p)):null;if(Y(d))return{mode:"path",pathOf:p=>d(V.dataAt(p)),keyOf:V.keyOf,declaresChildren:k};if(y!=null){const p=Y(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>p(V.dataAt(b)),keyOf:V.keyOf,orphans:Z.orphans||"root",declaresChildren:k}}return N("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Z,V){const d=V.mode==="path"?a(Z,V):E(Z,V),y=x(d.roots);return{...d,depth:y}}function D(Z,V){const d=new Map,y=k=>{for(let p=0;p<k.length;p++){const b=k[p];if(b.physical>=0){const P=V?V(b.physical):!1,O=P&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:p+1,setsize:k.length,hasChildren:b.children.length>0||P,lazy:O})}b.children.length&&y(b.children)}};return y(Z),d}}),Ue("packages/modules/kpi/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.isObject,A=X.warnOnce,m=fe("packages/core/src/source/tree.js"),R=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function $(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function F(b,P){const O=Math.max(I[b]||0,I[P]||0);return x[O]}function D(b,P){if(!P.length||b===!1)return null;if(b==null)return P.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=N(b)?b:{},M=P.map((h,v)=>v),H=h=>P[h].id;if(Y(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>P[v].spec,keyOf:H});return h?Z({...a(M,h),mode:h.mode},P):null}const ae=typeof O.separator=="string"&&O.separator?O.separator:E;if(!P.some(h=>h.id.includes(ae)))return null;const G=R({path:h=>String(h).split(ae)},{dataAt:h=>P[h].id,keyOf:H});return Z({...a(M,G),mode:"id"},P)}function Z(b,P){const O=new Set,M=new Set(P.map(G=>G.id)),H=(G,h)=>{for(const v of G){const L=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),_=`${h}/${L}`;v.physical>=0?O.add(v.physical):M.has(_)||(v.key=_,M.add(_)),H(v.children,_)}};H(b.roots,"");const ae=P.filter((G,h)=>!O.has(h)).map(G=>G.id);return ae.length&&A("kpi:tree:unplaced",`${ae.length} KPI tile(s) are not on the tree and will not render: ${ae.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function V(b,P){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):P!=null?String(P):b?b.label:""}function d(b,P,O,M){const H=(ae,G,h,v)=>{const L=ae.physical>=0?P[ae.physical]:null,_=L?O.get(L.id):null,z=ae.children.map((C,B)=>H(C,G+1,B,ae.children.length)),ce=_?_.status:null;let ue=I[ce]?ce:null,ve=ce==="unknown"||$(_)?1:0,T=_?1:0;for(const C of z)ue=F(ue,C.rollup),ve+=C.unknown,T+=C.items;return{key:ae.key,id:_?_.id:null,label:V(L,ae.value),level:G,posinset:h+1,setsize:v,hasChildren:z.length>0,expanded:z.length>0&&M.has(ae.key),children:z,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ce??null,rollup:ue,unknown:ve,items:T}};return b.roots.map((ae,G)=>H(ae,0,G,b.roots.length))}function y(b){const P=[],O=M=>{for(const H of M)P.push(H),O(H.children)};return O(b),P}function k(b){const P=[],O=M=>{for(const H of M)P.push(H),H.expanded&&O(H.children)};return O(b),P}function p(b){const P=[],O=M=>{for(const H of M)H.children.length&&(P.push(H.key),O(H.children))};return O(b),P}}),Ue("packages/modules/kpi/messages.js",function(g,fe){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return a}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,$)=>$ in I?String(I[$]):x):E}function R(E){const I=N(E.messages)&&Y(E.messages.t)&&E.messages||N(E.grid)&&N(E.grid.messages)&&Y(E.grid.messages.t)&&E.grid.messages||null;return(x,$)=>{if(I){let F;try{F=I.t(x,$)}catch{F=null}if(typeof F=="string"&&F&&F!==x)return F}return m(A[x]||x,$)}}const a=R({})}),Ue("packages/modules/kpi/view.js",function(g,fe){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return H}});const Y=fe("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=fe("packages/modules/kpi/tree.js").visibleNodes,R=fe("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=R("kpi.status.unknown"),I=R,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function $(e,r){return r?e(`kpi.status.${r}`):""}function F(e){return e&&e.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(r,s){return this.map.has(r)||this.map.set(r,new Set),this.map.get(r).add(s),()=>this.off(r,s)}off(r,s){this.map.get(r)?.delete(s)}emit(r,s){for(const u of this.map.get(r)||[])u(s)}}function Z(e){if(!e||e.getElementById&&e.getElementById(`${a}-styles`))return;const r=e.createElement("style");r.id=`${a}-styles`,r.setAttribute("id",`${a}-styles`),r.textContent=`
6
+ var Ut=Object.create(null),Bt=Object.create(null);function Ue(g,fe){Ut[g]=fe}function zt(g){var fe=Bt[g];if(fe)return fe;var X=Object.create(null);Bt[g]=X;var Y=Ut[g];if(!Y)throw new Error("[lattice] missing module: "+g);return Y(X,zt),X}Ue("packages/core/src/internal/util.js",function(g,fe){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return me}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return t}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.88.3";async function Y(){return X}const N="1.88.3",A=new Set,m=2e3;function R(l){if(A.add(l),A.size>m){const o=A.values().next().value;o!==void 0&&A.delete(o)}}const a=[],E=500;function I(l,o,f){a.push({key:l,level:o,message:f.map(w=>typeof w=="string"?w:x(w)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(l){if(l instanceof Error)return l.message;try{return JSON.stringify(l)}catch{return String(l)}}function $(){return a.map(l=>({...l}))}function F(l){if(l.length===0||typeof l[0]!="string")return l;const o=l[0].replace(/^\[lattice\]\s*/,"");return o===l[0]?l:[o,...l.slice(1)]}function D(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"warn",f),console.warn("[lattice]",...f)}function Z(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"info",f),console.info("[lattice]",...f)}function V(){A.clear(),a.length=0}function d(l,o){const f=new Error(`[lattice] ${l}`);throw o!==void 0&&(f.cause=o),f}function y(l,o){l||d(o)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(l){return l!==null&&typeof l=="object"&&!Array.isArray(l)}function b(l){return typeof l=="function"}function P(l){return l==null}function O(l){return l==null||l===""}function M(l){return typeof l!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(l))?!0:!!(l.prototype&&Object.getOwnPropertyNames(l.prototype).length>1)}const H=new Map;function ae(l){let o=H.get(l);if(o)return o;if(!l.includes("."))o=f=>f?.[l];else{const f=l.split("."),w=f.length;o=Q=>{let ne=Q;for(let le=0;le<w;le++){if(ne==null)return;ne=ne[f[le]]}return ne}}return H.set(l,o),o}const G=new Map;function h(l){let o=G.get(l);if(o)return o;if(!l.includes("."))o=(f,w)=>{f!=null&&(f[l]=w)};else{const f=l.split("."),w=f.length-1;o=(Q,ne)=>{let le=Q;for(let se=0;se<w;se++){if(le==null)return;const Ne=f[se];le[Ne]==null&&(le[Ne]={}),le=le[Ne]}le!=null&&(le[f[w]]=ne)}}return G.set(l,o),o}function v(l,o){return ae(o)(l)}function L(l,o,f){h(o)(l,f)}function _(l){return l?(l.includes(".")?l.slice(l.lastIndexOf(".")+1):l).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const z={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function ce(l){const o=l==null?"":String(l);return/[&<>"']/.test(o)?o.replace(/[&<>"']/g,f=>z[f]):o}function ue(l){return String(l).replace(/\w\S*/g,o=>o[0].toUpperCase()+o.slice(1).toLowerCase())}function ve(l,o,f){if(l!==void 0)return l===!0?{enabled:!0,...f}:l===!1?{enabled:!1}:p(l)?l:{[o]:l,enabled:!0}}function T(l){return l==null?[]:Array.isArray(l)?l:[l]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(l,o){if(!p(l))return p(o)?{...o}:o;if(!p(o))return o===void 0?l:o;const f={...l};for(const w of Object.keys(o)){if(C.has(w))continue;const Q=o[w];Q!==void 0&&(f[w]=p(Q)&&p(f[w])?B(f[w],Q):Q)}return f}function ee(l,o){if(!p(l)||!p(o)||l===o)return o;const f=Object.create(Object.getPrototypeOf(l));return Object.assign(f,l,o),f}class me{#e;#t=new Map;#n;constructor(o=256,f=null){this.#e=o,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(o){this.#e=o,this.#r()}has(o){return this.#t.has(o)}get(o){const f=this.#t;if(!f.has(o))return;const w=f.get(o);return f.delete(o),f.set(o,w),w}peek(o){return this.#t.get(o)}set(o,f){const w=this.#t;return w.has(o)&&w.delete(o),w.set(o,f),this.#r(),f}delete(o){const f=this.#t.get(o);return this.#t.delete(o)&&this.#n&&this.#n(f,o),f}clear(){if(this.#n)for(const[o,f]of this.#t)this.#n(f,o);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const o=this.#t;for(;o.size>this.#e;){const f=o.keys().next().value,w=o.get(f);o.delete(f),this.#n&&this.#n(w,f)}}}const j=new Map;function U(l,o){const f=`${l||""}|${o?JSON.stringify(o):""}`;let w=j.get(f);return w||(w=new Intl.Collator(l||void 0,{numeric:!0,sensitivity:"variant",...o}),j.set(f,w)),w}function K(l,o){if(l===o)return 0;if(l==null)return 1;if(o==null)return-1;if(typeof l=="number"&&typeof o=="number")return Number.isNaN(l)?Number.isNaN(o)?0:1:Number.isNaN(o)||l<o?-1:l>o?1:0;const f=String(l),w=String(o);return f<w?-1:f>w?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const n=typeof requestAnimationFrame=="function";function t(l){return n?requestAnimationFrame(l):setTimeout(()=>l(S()),16)}function i(l){l!=null&&(n?cancelAnimationFrame(l):clearTimeout(l))}function e(l){let o=null,f=null;const w=()=>{o=null;const ne=f;f=null,l(...ne||[])},Q=(...ne)=>{f=ne,o===null&&(o=t(w))};return Q.cancel=()=>{i(o),o=null,f=null},Q.flush=()=>{o!==null&&(i(o),w())},Q}function r(l,o){let f=null,w=null;const Q=()=>{if(f=null,w===null)return;const se=w;w=null,l(...se),ne()},ne=()=>{f=setTimeout(Q,o),typeof f?.unref=="function"&&f.unref()},le=(...se)=>{f===null?(l(...se),ne()):(w=se,clearTimeout(f),ne())};return le.flush=()=>{if(f!==null&&clearTimeout(f),f=null,w===null)return;const se=w;w=null,l(...se)},le.cancel=()=>{f!==null&&clearTimeout(f),f=null,w=null},le.pending=()=>f!==null||w!==null,le}function s(l,o=50){return typeof requestIdleCallback=="function"?requestIdleCallback(l,{timeout:o}):setTimeout(()=>l({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(l="l"){return`${l}${(++u).toString(36)}`}}),Ue("packages/modules/kpi/aggregate.js",function(g,fe){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return V}});const X=fe("packages/core/src/internal/util.js"),Y=X.isNil,N=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(Y(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y:0}}}case"avg":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y/k:null}}}case"countDistinct":{const y=new Map;return{add(k){Y(k)||y.set(k,(y.get(k)||0)+1)},remove(k){if(Y(k))return;const p=y.get(k);p&&(p===1?y.delete(k):y.set(k,p-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let k=null,p=!1;const b=(O,M)=>d?O>M:O<M,P=()=>{let O=null;for(const M of y.keys())(O===null||b(M,O))&&(O=M);return O};return{add(O){const M=R(O);M!==null&&(y.set(M,(y.get(M)||0)+1),!p&&(k===null||b(M,k))&&(k=M))},remove(O){const M=R(O);if(M===null)return;const H=y.get(M);H&&(H===1?(y.delete(M),M===k&&(p=!0)):y.set(M,H-1))},value(){return y.size===0?null:(p&&(k=P(),p=!1),k)}}}function I(d){return N(d)?d:typeof d=="string"&&d?A(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const P=Y(b.min)?-1/0:b.min,O=Y(b.max)?1/0:b.max;if(d>=P&&d<O)return b.status??null}return null}const k=y.thresholds;return!k||Y(k.warn)||Y(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const $="unknown";function F(d,y,k){return k?x(d,y):$}function D(d){if(!d)return null;const y=[];let k=!1;const p=O=>{if(Y(O))return!1;const M=Number(O);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!Y(d.thresholds.warn)&&!Y(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&y.push(0),!y.length)return null;const b=Math.min(...y),P=Math.max(...y);return P>b?{lo:b,hi:P}:null}function Z(d,y){if(!y||Y(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=y.hi-y.lo;return p?Math.max(0,Math.min(1,(k-y.lo)/p))*100:null}function V(d,y,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof y=="string"?{type:y}:y||{},b=p.type||"number",P=p.locale||void 0,O={};b==="currency"?(O.style="currency",O.currency=p.currency||"USD"):b==="percent"?O.style="percent":b==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),Y(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const M=typeof p.prefix=="string"?p.prefix:"",H=typeof p.suffix=="string"?p.suffix:"";try{return M+new Intl.NumberFormat(P,O).format(d)+H}catch{return M+String(d)+H}}}),Ue("packages/core/src/source/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return D}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.warnOnce,A="",m="\0tree:";function R(Z,V){return{physical:Z,key:V,level:0,children:[],value:void 0}}function a(Z,V){const d=[],y=new Map;for(let k=0;k<Z.length;k++){const p=Z[k],b=V.pathOf(p),P=Array.isArray(b)?b.map(M=>String(M)):[];if(!P.length){const M=R(p,V.keyOf(p));d.push(M);continue}let O=null;for(let M=0;M<P.length;M++){const H=P.slice(0,M+1).join(A),ae=M===P.length-1;let G=y.get(H);G&&ae&&G.physical===-1&&(G.physical=p,G.key=V.keyOf(p)),G||(G=R(ae?p:-1,ae?V.keyOf(p):m+H),G.level=M,G.value=P[M],y.set(H,G),O?O.children.push(G):d.push(G)),O=G}}return{roots:d,nodes:y}}function E(Z,V){const d=new Map,y=[];for(let P=0;P<Z.length;P++){const O=Z[P],M=V.keyOf(O),H=R(O,M);d.set(M,H);const ae=V.parentOf(O);ae!=null&&ae!==""&&y.push({node:H,parent:String(ae)})}let k=null;const p=new Map;for(const{node:P,parent:O}of y){const M=d.get(O);if(M){p.set(P.key,M);continue}V.orphans&&V.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=V.orphans),p.set(P.key,k))}const b=[];for(const P of d.values()){const O=p.get(P.key);O?O.children.push(P):b.push(P)}return k&&k.children.length&&b.push(k),{roots:I(b,d,V.orphans,k),nodes:d}}function I(Z,V,d,y){const k=new Set,p=[...Z];for(;p.length;){const H=p.pop();if(!k.has(H.key)){k.add(H.key);for(const ae of H.children)p.push(ae)}}const b=[];for(const H of V.values())k.has(H.key)||b.push(H);if(!b.length)return Z;const P=!!d&&d!=="root";N("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+(P?`they are shown under "${d}".`:"they are shown at the root."));for(const H of b)H.children=H.children.filter(ae=>k.has(ae.key));if(!P)return[...Z,...b];let O=y;const M=[...Z];return O||(O=R(-1,`${m}orphans`),O.value=d,M.push(O)),O.children.push(...b),M}function x(Z){let V=0;const d=(y,k)=>{for(const p of y)p.level=k,k>V&&(V=k),p.children.length&&d(p.children,k+1)};return d(Z,0),V}function $(Z,V){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,k=Y(Z.hasChildren)?p=>!!Z.hasChildren(V.dataAt(p)):null;if(Y(d))return{mode:"path",pathOf:p=>d(V.dataAt(p)),keyOf:V.keyOf,declaresChildren:k};if(y!=null){const p=Y(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>p(V.dataAt(b)),keyOf:V.keyOf,orphans:Z.orphans||"root",declaresChildren:k}}return N("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Z,V){const d=V.mode==="path"?a(Z,V):E(Z,V),y=x(d.roots);return{...d,depth:y}}function D(Z,V){const d=new Map,y=k=>{for(let p=0;p<k.length;p++){const b=k[p];if(b.physical>=0){const P=V?V(b.physical):!1,O=P&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:p+1,setsize:k.length,hasChildren:b.children.length>0||P,lazy:O})}b.children.length&&y(b.children)}};return y(Z),d}}),Ue("packages/modules/kpi/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.isObject,A=X.warnOnce,m=fe("packages/core/src/source/tree.js"),R=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function $(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function F(b,P){const O=Math.max(I[b]||0,I[P]||0);return x[O]}function D(b,P){if(!P.length||b===!1)return null;if(b==null)return P.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=N(b)?b:{},M=P.map((h,v)=>v),H=h=>P[h].id;if(Y(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>P[v].spec,keyOf:H});return h?Z({...a(M,h),mode:h.mode},P):null}const ae=typeof O.separator=="string"&&O.separator?O.separator:E;if(!P.some(h=>h.id.includes(ae)))return null;const G=R({path:h=>String(h).split(ae)},{dataAt:h=>P[h].id,keyOf:H});return Z({...a(M,G),mode:"id"},P)}function Z(b,P){const O=new Set,M=new Set(P.map(G=>G.id)),H=(G,h)=>{for(const v of G){const L=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),_=`${h}/${L}`;v.physical>=0?O.add(v.physical):M.has(_)||(v.key=_,M.add(_)),H(v.children,_)}};H(b.roots,"");const ae=P.filter((G,h)=>!O.has(h)).map(G=>G.id);return ae.length&&A("kpi:tree:unplaced",`${ae.length} KPI tile(s) are not on the tree and will not render: ${ae.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function V(b,P){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):P!=null?String(P):b?b.label:""}function d(b,P,O,M){const H=(ae,G,h,v)=>{const L=ae.physical>=0?P[ae.physical]:null,_=L?O.get(L.id):null,z=ae.children.map((C,B)=>H(C,G+1,B,ae.children.length)),ce=_?_.status:null;let ue=I[ce]?ce:null,ve=ce==="unknown"||$(_)?1:0,T=_?1:0;for(const C of z)ue=F(ue,C.rollup),ve+=C.unknown,T+=C.items;return{key:ae.key,id:_?_.id:null,label:V(L,ae.value),level:G,posinset:h+1,setsize:v,hasChildren:z.length>0,expanded:z.length>0&&M.has(ae.key),children:z,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ce??null,rollup:ue,unknown:ve,items:T}};return b.roots.map((ae,G)=>H(ae,0,G,b.roots.length))}function y(b){const P=[],O=M=>{for(const H of M)P.push(H),O(H.children)};return O(b),P}function k(b){const P=[],O=M=>{for(const H of M)P.push(H),H.expanded&&O(H.children)};return O(b),P}function p(b){const P=[],O=M=>{for(const H of M)H.children.length&&(P.push(H.key),O(H.children))};return O(b),P}}),Ue("packages/modules/kpi/messages.js",function(g,fe){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return a}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,N=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,$)=>$ in I?String(I[$]):x):E}function R(E){const I=N(E.messages)&&Y(E.messages.t)&&E.messages||N(E.grid)&&N(E.grid.messages)&&Y(E.grid.messages.t)&&E.grid.messages||null;return(x,$)=>{if(I){let F;try{F=I.t(x,$)}catch{F=null}if(typeof F=="string"&&F&&F!==x)return F}return m(A[x]||x,$)}}const a=R({})}),Ue("packages/modules/kpi/view.js",function(g,fe){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return H}});const Y=fe("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=fe("packages/modules/kpi/tree.js").visibleNodes,R=fe("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=R("kpi.status.unknown"),I=R,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function $(e,r){return r?e(`kpi.status.${r}`):""}function F(e){return e&&e.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(r,s){return this.map.has(r)||this.map.set(r,new Set),this.map.get(r).add(s),()=>this.off(r,s)}off(r,s){this.map.get(r)?.delete(s)}emit(r,s){for(const u of this.map.get(r)||[])u(s)}}function Z(e){if(!e||e.getElementById&&e.getElementById(`${a}-styles`))return;const r=e.createElement("style");r.id=`${a}-styles`,r.setAttribute("id",`${a}-styles`),r.textContent=`
7
7
  .${a}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${a}-tile-min,160px),1fr));font-family:var(--${a}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${a}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${a}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${a}-fg,var(--lattice-foreground));--${a}-meter-w:var(--${a}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
8
8
  /* The author display:grid above outranks the browser's own [hidden] rule,
9
9
  so a hidden host stays painted without this guard (BACKLOG-0001605). */
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.88.2, kpi module
2
+ * Lattice Grid 1.88.3, kpi module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- (function(Wt){"use strict";var Ft=Object.create(null),Lt=Object.create(null);function _e(g,fe){Ft[g]=fe}function It(g){var fe=Lt[g];if(fe)return fe;var X=Object.create(null);Lt[g]=X;var Y=Ft[g];if(!Y)throw new Error("[lattice] missing module: "+g);return Y(X,It),X}_e("packages/core/src/internal/util.js",function(g,fe){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return me}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return t}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.88.2";async function Y(){return X}const T="1.88.2",A=new Set,m=2e3;function R(l){if(A.add(l),A.size>m){const o=A.values().next().value;o!==void 0&&A.delete(o)}}const a=[],E=500;function I(l,o,f){a.push({key:l,level:o,message:f.map(w=>typeof w=="string"?w:x(w)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(l){if(l instanceof Error)return l.message;try{return JSON.stringify(l)}catch{return String(l)}}function $(){return a.map(l=>({...l}))}function F(l){if(l.length===0||typeof l[0]!="string")return l;const o=l[0].replace(/^\[lattice\]\s*/,"");return o===l[0]?l:[o,...l.slice(1)]}function D(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"warn",f),console.warn("[lattice]",...f)}function Z(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"info",f),console.info("[lattice]",...f)}function V(){A.clear(),a.length=0}function d(l,o){const f=new Error(`[lattice] ${l}`);throw o!==void 0&&(f.cause=o),f}function y(l,o){l||d(o)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(l){return l!==null&&typeof l=="object"&&!Array.isArray(l)}function b(l){return typeof l=="function"}function P(l){return l==null}function O(l){return l==null||l===""}function M(l){return typeof l!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(l))?!0:!!(l.prototype&&Object.getOwnPropertyNames(l.prototype).length>1)}const H=new Map;function ae(l){let o=H.get(l);if(o)return o;if(!l.includes("."))o=f=>f?.[l];else{const f=l.split("."),w=f.length;o=Q=>{let ne=Q;for(let le=0;le<w;le++){if(ne==null)return;ne=ne[f[le]]}return ne}}return H.set(l,o),o}const G=new Map;function h(l){let o=G.get(l);if(o)return o;if(!l.includes("."))o=(f,w)=>{f!=null&&(f[l]=w)};else{const f=l.split("."),w=f.length-1;o=(Q,ne)=>{let le=Q;for(let se=0;se<w;se++){if(le==null)return;const Te=f[se];le[Te]==null&&(le[Te]={}),le=le[Te]}le!=null&&(le[f[w]]=ne)}}return G.set(l,o),o}function v(l,o){return ae(o)(l)}function L(l,o,f){h(o)(l,f)}function _(l){return l?(l.includes(".")?l.slice(l.lastIndexOf(".")+1):l).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const z={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function ce(l){const o=l==null?"":String(l);return/[&<>"']/.test(o)?o.replace(/[&<>"']/g,f=>z[f]):o}function ue(l){return String(l).replace(/\w\S*/g,o=>o[0].toUpperCase()+o.slice(1).toLowerCase())}function ve(l,o,f){if(l!==void 0)return l===!0?{enabled:!0,...f}:l===!1?{enabled:!1}:p(l)?l:{[o]:l,enabled:!0}}function N(l){return l==null?[]:Array.isArray(l)?l:[l]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(l,o){if(!p(l))return p(o)?{...o}:o;if(!p(o))return o===void 0?l:o;const f={...l};for(const w of Object.keys(o)){if(C.has(w))continue;const Q=o[w];Q!==void 0&&(f[w]=p(Q)&&p(f[w])?B(f[w],Q):Q)}return f}function ee(l,o){if(!p(l)||!p(o)||l===o)return o;const f=Object.create(Object.getPrototypeOf(l));return Object.assign(f,l,o),f}class me{#e;#t=new Map;#n;constructor(o=256,f=null){this.#e=o,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(o){this.#e=o,this.#r()}has(o){return this.#t.has(o)}get(o){const f=this.#t;if(!f.has(o))return;const w=f.get(o);return f.delete(o),f.set(o,w),w}peek(o){return this.#t.get(o)}set(o,f){const w=this.#t;return w.has(o)&&w.delete(o),w.set(o,f),this.#r(),f}delete(o){const f=this.#t.get(o);return this.#t.delete(o)&&this.#n&&this.#n(f,o),f}clear(){if(this.#n)for(const[o,f]of this.#t)this.#n(f,o);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const o=this.#t;for(;o.size>this.#e;){const f=o.keys().next().value,w=o.get(f);o.delete(f),this.#n&&this.#n(w,f)}}}const j=new Map;function U(l,o){const f=`${l||""}|${o?JSON.stringify(o):""}`;let w=j.get(f);return w||(w=new Intl.Collator(l||void 0,{numeric:!0,sensitivity:"variant",...o}),j.set(f,w)),w}function K(l,o){if(l===o)return 0;if(l==null)return 1;if(o==null)return-1;if(typeof l=="number"&&typeof o=="number")return Number.isNaN(l)?Number.isNaN(o)?0:1:Number.isNaN(o)||l<o?-1:l>o?1:0;const f=String(l),w=String(o);return f<w?-1:f>w?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const n=typeof requestAnimationFrame=="function";function t(l){return n?requestAnimationFrame(l):setTimeout(()=>l(S()),16)}function i(l){l!=null&&(n?cancelAnimationFrame(l):clearTimeout(l))}function e(l){let o=null,f=null;const w=()=>{o=null;const ne=f;f=null,l(...ne||[])},Q=(...ne)=>{f=ne,o===null&&(o=t(w))};return Q.cancel=()=>{i(o),o=null,f=null},Q.flush=()=>{o!==null&&(i(o),w())},Q}function r(l,o){let f=null,w=null;const Q=()=>{if(f=null,w===null)return;const se=w;w=null,l(...se),ne()},ne=()=>{f=setTimeout(Q,o),typeof f?.unref=="function"&&f.unref()},le=(...se)=>{f===null?(l(...se),ne()):(w=se,clearTimeout(f),ne())};return le.flush=()=>{if(f!==null&&clearTimeout(f),f=null,w===null)return;const se=w;w=null,l(...se)},le.cancel=()=>{f!==null&&clearTimeout(f),f=null,w=null},le.pending=()=>f!==null||w!==null,le}function s(l,o=50){return typeof requestIdleCallback=="function"?requestIdleCallback(l,{timeout:o}):setTimeout(()=>l({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(l="l"){return`${l}${(++u).toString(36)}`}}),_e("packages/modules/kpi/aggregate.js",function(g,fe){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return V}});const X=fe("packages/core/src/internal/util.js"),Y=X.isNil,T=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(Y(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y:0}}}case"avg":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y/k:null}}}case"countDistinct":{const y=new Map;return{add(k){Y(k)||y.set(k,(y.get(k)||0)+1)},remove(k){if(Y(k))return;const p=y.get(k);p&&(p===1?y.delete(k):y.set(k,p-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let k=null,p=!1;const b=(O,M)=>d?O>M:O<M,P=()=>{let O=null;for(const M of y.keys())(O===null||b(M,O))&&(O=M);return O};return{add(O){const M=R(O);M!==null&&(y.set(M,(y.get(M)||0)+1),!p&&(k===null||b(M,k))&&(k=M))},remove(O){const M=R(O);if(M===null)return;const H=y.get(M);H&&(H===1?(y.delete(M),M===k&&(p=!0)):y.set(M,H-1))},value(){return y.size===0?null:(p&&(k=P(),p=!1),k)}}}function I(d){return T(d)?d:typeof d=="string"&&d?A(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const P=Y(b.min)?-1/0:b.min,O=Y(b.max)?1/0:b.max;if(d>=P&&d<O)return b.status??null}return null}const k=y.thresholds;return!k||Y(k.warn)||Y(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const $="unknown";function F(d,y,k){return k?x(d,y):$}function D(d){if(!d)return null;const y=[];let k=!1;const p=O=>{if(Y(O))return!1;const M=Number(O);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!Y(d.thresholds.warn)&&!Y(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&y.push(0),!y.length)return null;const b=Math.min(...y),P=Math.max(...y);return P>b?{lo:b,hi:P}:null}function Z(d,y){if(!y||Y(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=y.hi-y.lo;return p?Math.max(0,Math.min(1,(k-y.lo)/p))*100:null}function V(d,y,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof y=="string"?{type:y}:y||{},b=p.type||"number",P=p.locale||void 0,O={};b==="currency"?(O.style="currency",O.currency=p.currency||"USD"):b==="percent"?O.style="percent":b==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),Y(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const M=typeof p.prefix=="string"?p.prefix:"",H=typeof p.suffix=="string"?p.suffix:"";try{return M+new Intl.NumberFormat(P,O).format(d)+H}catch{return M+String(d)+H}}}),_e("packages/core/src/source/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return D}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.warnOnce,A="",m="\0tree:";function R(Z,V){return{physical:Z,key:V,level:0,children:[],value:void 0}}function a(Z,V){const d=[],y=new Map;for(let k=0;k<Z.length;k++){const p=Z[k],b=V.pathOf(p),P=Array.isArray(b)?b.map(M=>String(M)):[];if(!P.length){const M=R(p,V.keyOf(p));d.push(M);continue}let O=null;for(let M=0;M<P.length;M++){const H=P.slice(0,M+1).join(A),ae=M===P.length-1;let G=y.get(H);G&&ae&&G.physical===-1&&(G.physical=p,G.key=V.keyOf(p)),G||(G=R(ae?p:-1,ae?V.keyOf(p):m+H),G.level=M,G.value=P[M],y.set(H,G),O?O.children.push(G):d.push(G)),O=G}}return{roots:d,nodes:y}}function E(Z,V){const d=new Map,y=[];for(let P=0;P<Z.length;P++){const O=Z[P],M=V.keyOf(O),H=R(O,M);d.set(M,H);const ae=V.parentOf(O);ae!=null&&ae!==""&&y.push({node:H,parent:String(ae)})}let k=null;const p=new Map;for(const{node:P,parent:O}of y){const M=d.get(O);if(M){p.set(P.key,M);continue}V.orphans&&V.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=V.orphans),p.set(P.key,k))}const b=[];for(const P of d.values()){const O=p.get(P.key);O?O.children.push(P):b.push(P)}return k&&k.children.length&&b.push(k),{roots:I(b,d,V.orphans,k),nodes:d}}function I(Z,V,d,y){const k=new Set,p=[...Z];for(;p.length;){const H=p.pop();if(!k.has(H.key)){k.add(H.key);for(const ae of H.children)p.push(ae)}}const b=[];for(const H of V.values())k.has(H.key)||b.push(H);if(!b.length)return Z;const P=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+(P?`they are shown under "${d}".`:"they are shown at the root."));for(const H of b)H.children=H.children.filter(ae=>k.has(ae.key));if(!P)return[...Z,...b];let O=y;const M=[...Z];return O||(O=R(-1,`${m}orphans`),O.value=d,M.push(O)),O.children.push(...b),M}function x(Z){let V=0;const d=(y,k)=>{for(const p of y)p.level=k,k>V&&(V=k),p.children.length&&d(p.children,k+1)};return d(Z,0),V}function $(Z,V){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,k=Y(Z.hasChildren)?p=>!!Z.hasChildren(V.dataAt(p)):null;if(Y(d))return{mode:"path",pathOf:p=>d(V.dataAt(p)),keyOf:V.keyOf,declaresChildren:k};if(y!=null){const p=Y(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>p(V.dataAt(b)),keyOf:V.keyOf,orphans:Z.orphans||"root",declaresChildren:k}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Z,V){const d=V.mode==="path"?a(Z,V):E(Z,V),y=x(d.roots);return{...d,depth:y}}function D(Z,V){const d=new Map,y=k=>{for(let p=0;p<k.length;p++){const b=k[p];if(b.physical>=0){const P=V?V(b.physical):!1,O=P&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:p+1,setsize:k.length,hasChildren:b.children.length>0||P,lazy:O})}b.children.length&&y(b.children)}};return y(Z),d}}),_e("packages/modules/kpi/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.isObject,A=X.warnOnce,m=fe("packages/core/src/source/tree.js"),R=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function $(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function F(b,P){const O=Math.max(I[b]||0,I[P]||0);return x[O]}function D(b,P){if(!P.length||b===!1)return null;if(b==null)return P.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=T(b)?b:{},M=P.map((h,v)=>v),H=h=>P[h].id;if(Y(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>P[v].spec,keyOf:H});return h?Z({...a(M,h),mode:h.mode},P):null}const ae=typeof O.separator=="string"&&O.separator?O.separator:E;if(!P.some(h=>h.id.includes(ae)))return null;const G=R({path:h=>String(h).split(ae)},{dataAt:h=>P[h].id,keyOf:H});return Z({...a(M,G),mode:"id"},P)}function Z(b,P){const O=new Set,M=new Set(P.map(G=>G.id)),H=(G,h)=>{for(const v of G){const L=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),_=`${h}/${L}`;v.physical>=0?O.add(v.physical):M.has(_)||(v.key=_,M.add(_)),H(v.children,_)}};H(b.roots,"");const ae=P.filter((G,h)=>!O.has(h)).map(G=>G.id);return ae.length&&A("kpi:tree:unplaced",`${ae.length} KPI tile(s) are not on the tree and will not render: ${ae.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function V(b,P){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):P!=null?String(P):b?b.label:""}function d(b,P,O,M){const H=(ae,G,h,v)=>{const L=ae.physical>=0?P[ae.physical]:null,_=L?O.get(L.id):null,z=ae.children.map((C,B)=>H(C,G+1,B,ae.children.length)),ce=_?_.status:null;let ue=I[ce]?ce:null,ve=ce==="unknown"||$(_)?1:0,N=_?1:0;for(const C of z)ue=F(ue,C.rollup),ve+=C.unknown,N+=C.items;return{key:ae.key,id:_?_.id:null,label:V(L,ae.value),level:G,posinset:h+1,setsize:v,hasChildren:z.length>0,expanded:z.length>0&&M.has(ae.key),children:z,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ce??null,rollup:ue,unknown:ve,items:N}};return b.roots.map((ae,G)=>H(ae,0,G,b.roots.length))}function y(b){const P=[],O=M=>{for(const H of M)P.push(H),O(H.children)};return O(b),P}function k(b){const P=[],O=M=>{for(const H of M)P.push(H),H.expanded&&O(H.children)};return O(b),P}function p(b){const P=[],O=M=>{for(const H of M)H.children.length&&(P.push(H.key),O(H.children))};return O(b),P}}),_e("packages/modules/kpi/messages.js",function(g,fe){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return a}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,$)=>$ in I?String(I[$]):x):E}function R(E){const I=T(E.messages)&&Y(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Y(E.grid.messages.t)&&E.grid.messages||null;return(x,$)=>{if(I){let F;try{F=I.t(x,$)}catch{F=null}if(typeof F=="string"&&F&&F!==x)return F}return m(A[x]||x,$)}}const a=R({})}),_e("packages/modules/kpi/view.js",function(g,fe){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return H}});const Y=fe("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=fe("packages/modules/kpi/tree.js").visibleNodes,R=fe("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=R("kpi.status.unknown"),I=R,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function $(e,r){return r?e(`kpi.status.${r}`):""}function F(e){return e&&e.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(r,s){return this.map.has(r)||this.map.set(r,new Set),this.map.get(r).add(s),()=>this.off(r,s)}off(r,s){this.map.get(r)?.delete(s)}emit(r,s){for(const u of this.map.get(r)||[])u(s)}}function Z(e){if(!e||e.getElementById&&e.getElementById(`${a}-styles`))return;const r=e.createElement("style");r.id=`${a}-styles`,r.setAttribute("id",`${a}-styles`),r.textContent=`
6
+ (function(Wt){"use strict";var Ft=Object.create(null),Lt=Object.create(null);function _e(g,fe){Ft[g]=fe}function It(g){var fe=Lt[g];if(fe)return fe;var X=Object.create(null);Lt[g]=X;var Y=Ft[g];if(!Y)throw new Error("[lattice] missing module: "+g);return Y(X,It),X}_e("packages/core/src/internal/util.js",function(g,fe){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return me}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return t}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.88.3";async function Y(){return X}const T="1.88.3",A=new Set,m=2e3;function R(l){if(A.add(l),A.size>m){const o=A.values().next().value;o!==void 0&&A.delete(o)}}const a=[],E=500;function I(l,o,f){a.push({key:l,level:o,message:f.map(w=>typeof w=="string"?w:x(w)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(l){if(l instanceof Error)return l.message;try{return JSON.stringify(l)}catch{return String(l)}}function $(){return a.map(l=>({...l}))}function F(l){if(l.length===0||typeof l[0]!="string")return l;const o=l[0].replace(/^\[lattice\]\s*/,"");return o===l[0]?l:[o,...l.slice(1)]}function D(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"warn",f),console.warn("[lattice]",...f)}function Z(l,...o){if(A.has(l))return;R(l);const f=F(o);I(l,"info",f),console.info("[lattice]",...f)}function V(){A.clear(),a.length=0}function d(l,o){const f=new Error(`[lattice] ${l}`);throw o!==void 0&&(f.cause=o),f}function y(l,o){l||d(o)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(l){return l!==null&&typeof l=="object"&&!Array.isArray(l)}function b(l){return typeof l=="function"}function P(l){return l==null}function O(l){return l==null||l===""}function M(l){return typeof l!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(l))?!0:!!(l.prototype&&Object.getOwnPropertyNames(l.prototype).length>1)}const H=new Map;function ae(l){let o=H.get(l);if(o)return o;if(!l.includes("."))o=f=>f?.[l];else{const f=l.split("."),w=f.length;o=Q=>{let ne=Q;for(let le=0;le<w;le++){if(ne==null)return;ne=ne[f[le]]}return ne}}return H.set(l,o),o}const G=new Map;function h(l){let o=G.get(l);if(o)return o;if(!l.includes("."))o=(f,w)=>{f!=null&&(f[l]=w)};else{const f=l.split("."),w=f.length-1;o=(Q,ne)=>{let le=Q;for(let se=0;se<w;se++){if(le==null)return;const Te=f[se];le[Te]==null&&(le[Te]={}),le=le[Te]}le!=null&&(le[f[w]]=ne)}}return G.set(l,o),o}function v(l,o){return ae(o)(l)}function L(l,o,f){h(o)(l,f)}function _(l){return l?(l.includes(".")?l.slice(l.lastIndexOf(".")+1):l).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const z={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function ce(l){const o=l==null?"":String(l);return/[&<>"']/.test(o)?o.replace(/[&<>"']/g,f=>z[f]):o}function ue(l){return String(l).replace(/\w\S*/g,o=>o[0].toUpperCase()+o.slice(1).toLowerCase())}function ve(l,o,f){if(l!==void 0)return l===!0?{enabled:!0,...f}:l===!1?{enabled:!1}:p(l)?l:{[o]:l,enabled:!0}}function N(l){return l==null?[]:Array.isArray(l)?l:[l]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(l,o){if(!p(l))return p(o)?{...o}:o;if(!p(o))return o===void 0?l:o;const f={...l};for(const w of Object.keys(o)){if(C.has(w))continue;const Q=o[w];Q!==void 0&&(f[w]=p(Q)&&p(f[w])?B(f[w],Q):Q)}return f}function ee(l,o){if(!p(l)||!p(o)||l===o)return o;const f=Object.create(Object.getPrototypeOf(l));return Object.assign(f,l,o),f}class me{#e;#t=new Map;#n;constructor(o=256,f=null){this.#e=o,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(o){this.#e=o,this.#r()}has(o){return this.#t.has(o)}get(o){const f=this.#t;if(!f.has(o))return;const w=f.get(o);return f.delete(o),f.set(o,w),w}peek(o){return this.#t.get(o)}set(o,f){const w=this.#t;return w.has(o)&&w.delete(o),w.set(o,f),this.#r(),f}delete(o){const f=this.#t.get(o);return this.#t.delete(o)&&this.#n&&this.#n(f,o),f}clear(){if(this.#n)for(const[o,f]of this.#t)this.#n(f,o);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const o=this.#t;for(;o.size>this.#e;){const f=o.keys().next().value,w=o.get(f);o.delete(f),this.#n&&this.#n(w,f)}}}const j=new Map;function U(l,o){const f=`${l||""}|${o?JSON.stringify(o):""}`;let w=j.get(f);return w||(w=new Intl.Collator(l||void 0,{numeric:!0,sensitivity:"variant",...o}),j.set(f,w)),w}function K(l,o){if(l===o)return 0;if(l==null)return 1;if(o==null)return-1;if(typeof l=="number"&&typeof o=="number")return Number.isNaN(l)?Number.isNaN(o)?0:1:Number.isNaN(o)||l<o?-1:l>o?1:0;const f=String(l),w=String(o);return f<w?-1:f>w?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const n=typeof requestAnimationFrame=="function";function t(l){return n?requestAnimationFrame(l):setTimeout(()=>l(S()),16)}function i(l){l!=null&&(n?cancelAnimationFrame(l):clearTimeout(l))}function e(l){let o=null,f=null;const w=()=>{o=null;const ne=f;f=null,l(...ne||[])},Q=(...ne)=>{f=ne,o===null&&(o=t(w))};return Q.cancel=()=>{i(o),o=null,f=null},Q.flush=()=>{o!==null&&(i(o),w())},Q}function r(l,o){let f=null,w=null;const Q=()=>{if(f=null,w===null)return;const se=w;w=null,l(...se),ne()},ne=()=>{f=setTimeout(Q,o),typeof f?.unref=="function"&&f.unref()},le=(...se)=>{f===null?(l(...se),ne()):(w=se,clearTimeout(f),ne())};return le.flush=()=>{if(f!==null&&clearTimeout(f),f=null,w===null)return;const se=w;w=null,l(...se)},le.cancel=()=>{f!==null&&clearTimeout(f),f=null,w=null},le.pending=()=>f!==null||w!==null,le}function s(l,o=50){return typeof requestIdleCallback=="function"?requestIdleCallback(l,{timeout:o}):setTimeout(()=>l({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(l="l"){return`${l}${(++u).toString(36)}`}}),_e("packages/modules/kpi/aggregate.js",function(g,fe){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return V}});const X=fe("packages/core/src/internal/util.js"),Y=X.isNil,T=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(Y(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y:0}}}case"avg":{let y=0,k=0;return{add(p){const b=R(p);b!==null&&(y+=b,k+=1)},remove(p){const b=R(p);b!==null&&(y-=b,k-=1)},value(){return k>0?y/k:null}}}case"countDistinct":{const y=new Map;return{add(k){Y(k)||y.set(k,(y.get(k)||0)+1)},remove(k){if(Y(k))return;const p=y.get(k);p&&(p===1?y.delete(k):y.set(k,p-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let k=null,p=!1;const b=(O,M)=>d?O>M:O<M,P=()=>{let O=null;for(const M of y.keys())(O===null||b(M,O))&&(O=M);return O};return{add(O){const M=R(O);M!==null&&(y.set(M,(y.get(M)||0)+1),!p&&(k===null||b(M,k))&&(k=M))},remove(O){const M=R(O);if(M===null)return;const H=y.get(M);H&&(H===1?(y.delete(M),M===k&&(p=!0)):y.set(M,H-1))},value(){return y.size===0?null:(p&&(k=P(),p=!1),k)}}}function I(d){return T(d)?d:typeof d=="string"&&d?A(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const P=Y(b.min)?-1/0:b.min,O=Y(b.max)?1/0:b.max;if(d>=P&&d<O)return b.status??null}return null}const k=y.thresholds;return!k||Y(k.warn)||Y(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const $="unknown";function F(d,y,k){return k?x(d,y):$}function D(d){if(!d)return null;const y=[];let k=!1;const p=O=>{if(Y(O))return!1;const M=Number(O);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!Y(d.thresholds.warn)&&!Y(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&y.push(0),!y.length)return null;const b=Math.min(...y),P=Math.max(...y);return P>b?{lo:b,hi:P}:null}function Z(d,y){if(!y||Y(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=y.hi-y.lo;return p?Math.max(0,Math.min(1,(k-y.lo)/p))*100:null}function V(d,y,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof y=="string"?{type:y}:y||{},b=p.type||"number",P=p.locale||void 0,O={};b==="currency"?(O.style="currency",O.currency=p.currency||"USD"):b==="percent"?O.style="percent":b==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),Y(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const M=typeof p.prefix=="string"?p.prefix:"",H=typeof p.suffix=="string"?p.suffix:"";try{return M+new Intl.NumberFormat(P,O).format(d)+H}catch{return M+String(d)+H}}}),_e("packages/core/src/source/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return D}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.warnOnce,A="",m="\0tree:";function R(Z,V){return{physical:Z,key:V,level:0,children:[],value:void 0}}function a(Z,V){const d=[],y=new Map;for(let k=0;k<Z.length;k++){const p=Z[k],b=V.pathOf(p),P=Array.isArray(b)?b.map(M=>String(M)):[];if(!P.length){const M=R(p,V.keyOf(p));d.push(M);continue}let O=null;for(let M=0;M<P.length;M++){const H=P.slice(0,M+1).join(A),ae=M===P.length-1;let G=y.get(H);G&&ae&&G.physical===-1&&(G.physical=p,G.key=V.keyOf(p)),G||(G=R(ae?p:-1,ae?V.keyOf(p):m+H),G.level=M,G.value=P[M],y.set(H,G),O?O.children.push(G):d.push(G)),O=G}}return{roots:d,nodes:y}}function E(Z,V){const d=new Map,y=[];for(let P=0;P<Z.length;P++){const O=Z[P],M=V.keyOf(O),H=R(O,M);d.set(M,H);const ae=V.parentOf(O);ae!=null&&ae!==""&&y.push({node:H,parent:String(ae)})}let k=null;const p=new Map;for(const{node:P,parent:O}of y){const M=d.get(O);if(M){p.set(P.key,M);continue}V.orphans&&V.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=V.orphans),p.set(P.key,k))}const b=[];for(const P of d.values()){const O=p.get(P.key);O?O.children.push(P):b.push(P)}return k&&k.children.length&&b.push(k),{roots:I(b,d,V.orphans,k),nodes:d}}function I(Z,V,d,y){const k=new Set,p=[...Z];for(;p.length;){const H=p.pop();if(!k.has(H.key)){k.add(H.key);for(const ae of H.children)p.push(ae)}}const b=[];for(const H of V.values())k.has(H.key)||b.push(H);if(!b.length)return Z;const P=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+(P?`they are shown under "${d}".`:"they are shown at the root."));for(const H of b)H.children=H.children.filter(ae=>k.has(ae.key));if(!P)return[...Z,...b];let O=y;const M=[...Z];return O||(O=R(-1,`${m}orphans`),O.value=d,M.push(O)),O.children.push(...b),M}function x(Z){let V=0;const d=(y,k)=>{for(const p of y)p.level=k,k>V&&(V=k),p.children.length&&d(p.children,k+1)};return d(Z,0),V}function $(Z,V){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,k=Y(Z.hasChildren)?p=>!!Z.hasChildren(V.dataAt(p)):null;if(Y(d))return{mode:"path",pathOf:p=>d(V.dataAt(p)),keyOf:V.keyOf,declaresChildren:k};if(y!=null){const p=Y(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>p(V.dataAt(b)),keyOf:V.keyOf,orphans:Z.orphans||"root",declaresChildren:k}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Z,V){const d=V.mode==="path"?a(Z,V):E(Z,V),y=x(d.roots);return{...d,depth:y}}function D(Z,V){const d=new Map,y=k=>{for(let p=0;p<k.length;p++){const b=k[p];if(b.physical>=0){const P=V?V(b.physical):!1,O=P&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:p+1,setsize:k.length,hasChildren:b.children.length>0||P,lazy:O})}b.children.length&&y(b.children)}};return y(Z),d}}),_e("packages/modules/kpi/tree.js",function(g,fe){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.isObject,A=X.warnOnce,m=fe("packages/core/src/source/tree.js"),R=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function $(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function F(b,P){const O=Math.max(I[b]||0,I[P]||0);return x[O]}function D(b,P){if(!P.length||b===!1)return null;if(b==null)return P.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=T(b)?b:{},M=P.map((h,v)=>v),H=h=>P[h].id;if(Y(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>P[v].spec,keyOf:H});return h?Z({...a(M,h),mode:h.mode},P):null}const ae=typeof O.separator=="string"&&O.separator?O.separator:E;if(!P.some(h=>h.id.includes(ae)))return null;const G=R({path:h=>String(h).split(ae)},{dataAt:h=>P[h].id,keyOf:H});return Z({...a(M,G),mode:"id"},P)}function Z(b,P){const O=new Set,M=new Set(P.map(G=>G.id)),H=(G,h)=>{for(const v of G){const L=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),_=`${h}/${L}`;v.physical>=0?O.add(v.physical):M.has(_)||(v.key=_,M.add(_)),H(v.children,_)}};H(b.roots,"");const ae=P.filter((G,h)=>!O.has(h)).map(G=>G.id);return ae.length&&A("kpi:tree:unplaced",`${ae.length} KPI tile(s) are not on the tree and will not render: ${ae.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function V(b,P){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):P!=null?String(P):b?b.label:""}function d(b,P,O,M){const H=(ae,G,h,v)=>{const L=ae.physical>=0?P[ae.physical]:null,_=L?O.get(L.id):null,z=ae.children.map((C,B)=>H(C,G+1,B,ae.children.length)),ce=_?_.status:null;let ue=I[ce]?ce:null,ve=ce==="unknown"||$(_)?1:0,N=_?1:0;for(const C of z)ue=F(ue,C.rollup),ve+=C.unknown,N+=C.items;return{key:ae.key,id:_?_.id:null,label:V(L,ae.value),level:G,posinset:h+1,setsize:v,hasChildren:z.length>0,expanded:z.length>0&&M.has(ae.key),children:z,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ce??null,rollup:ue,unknown:ve,items:N}};return b.roots.map((ae,G)=>H(ae,0,G,b.roots.length))}function y(b){const P=[],O=M=>{for(const H of M)P.push(H),O(H.children)};return O(b),P}function k(b){const P=[],O=M=>{for(const H of M)P.push(H),H.expanded&&O(H.children)};return O(b),P}function p(b){const P=[],O=M=>{for(const H of M)H.children.length&&(P.push(H.key),O(H.children))};return O(b),P}}),_e("packages/modules/kpi/messages.js",function(g,fe){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return a}});const X=fe("packages/core/src/internal/util.js"),Y=X.isFunction,T=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,$)=>$ in I?String(I[$]):x):E}function R(E){const I=T(E.messages)&&Y(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Y(E.grid.messages.t)&&E.grid.messages||null;return(x,$)=>{if(I){let F;try{F=I.t(x,$)}catch{F=null}if(typeof F=="string"&&F&&F!==x)return F}return m(A[x]||x,$)}}const a=R({})}),_e("packages/modules/kpi/view.js",function(g,fe){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return H}});const Y=fe("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=fe("packages/modules/kpi/tree.js").visibleNodes,R=fe("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=R("kpi.status.unknown"),I=R,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function $(e,r){return r?e(`kpi.status.${r}`):""}function F(e){return e&&e.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(r,s){return this.map.has(r)||this.map.set(r,new Set),this.map.get(r).add(s),()=>this.off(r,s)}off(r,s){this.map.get(r)?.delete(s)}emit(r,s){for(const u of this.map.get(r)||[])u(s)}}function Z(e){if(!e||e.getElementById&&e.getElementById(`${a}-styles`))return;const r=e.createElement("style");r.id=`${a}-styles`,r.setAttribute("id",`${a}-styles`),r.textContent=`
7
7
  .${a}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${a}-tile-min,160px),1fr));font-family:var(--${a}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${a}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${a}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${a}-fg,var(--lattice-foreground));--${a}-meter-w:var(--${a}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
8
8
  /* The author display:grid above outranks the browser's own [hidden] rule,
9
9
  so a hidden host stays painted without this guard (BACKLOG-0001605). */