@toclocoinc/lattice-grid 1.115.0 → 1.115.2

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 (441) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/angular/package.json +1 -1
  4. package/docs/API.html +4 -4
  5. package/docs/api/adapters.html +1 -1
  6. package/docs/api/ai.html +1 -1
  7. package/docs/api/alarms.html +1 -1
  8. package/docs/api/calendar.html +1 -1
  9. package/docs/api/charts.html +1 -1
  10. package/docs/api/dashboard.html +1 -1
  11. package/docs/api/data-router.html +1 -1
  12. package/docs/api/dataview.html +1 -1
  13. package/docs/api/deckgl.html +1 -1
  14. package/docs/api/designer.html +1 -1
  15. package/docs/api/form.html +1 -1
  16. package/docs/api/gantt.html +1 -1
  17. package/docs/api/geometry.html +1 -1
  18. package/docs/api/grid.html +2 -2
  19. package/docs/api/index.html +1 -1
  20. package/docs/api/kanban.html +1 -1
  21. package/docs/api/kpi.html +1 -1
  22. package/docs/api/layout.html +1 -1
  23. package/docs/api/leaflet.html +1 -1
  24. package/docs/api/list.html +1 -1
  25. package/docs/api/listview.html +1 -1
  26. package/docs/api/mapview.html +1 -1
  27. package/docs/api/mock-socket.html +1 -1
  28. package/docs/api/presets.html +1 -1
  29. package/docs/api/scheduler.html +1 -1
  30. package/docs/api/shell.html +1 -1
  31. package/docs/api/tabs.html +1 -1
  32. package/docs/api/tree.html +1 -1
  33. package/docs/api/types.html +1 -1
  34. package/docs/api-detail.html +5 -5
  35. package/docs/warnings.json +1 -1
  36. package/lattice-grid.d.ts +1 -1
  37. package/lattice-grid.esm.min.js +2 -2
  38. package/lattice-grid.min.cjs +2 -2
  39. package/lattice-grid.min.js +2 -2
  40. package/locales/all.d.ts +1 -1
  41. package/locales/all.esm.min.js +1 -1
  42. package/locales/all.min.cjs +1 -1
  43. package/locales/all.min.js +1 -1
  44. package/locales/ar.d.ts +1 -1
  45. package/locales/ar.esm.min.js +1 -1
  46. package/locales/ar.min.cjs +1 -1
  47. package/locales/ar.min.js +1 -1
  48. package/locales/cs-CZ.d.ts +1 -1
  49. package/locales/cs-CZ.esm.min.js +1 -1
  50. package/locales/cs-CZ.min.cjs +1 -1
  51. package/locales/cs-CZ.min.js +1 -1
  52. package/locales/da-DK.d.ts +1 -1
  53. package/locales/da-DK.esm.min.js +1 -1
  54. package/locales/da-DK.min.cjs +1 -1
  55. package/locales/da-DK.min.js +1 -1
  56. package/locales/de-DE.d.ts +1 -1
  57. package/locales/de-DE.esm.min.js +1 -1
  58. package/locales/de-DE.min.cjs +1 -1
  59. package/locales/de-DE.min.js +1 -1
  60. package/locales/el-GR.d.ts +1 -1
  61. package/locales/el-GR.esm.min.js +1 -1
  62. package/locales/el-GR.min.cjs +1 -1
  63. package/locales/el-GR.min.js +1 -1
  64. package/locales/en-US.d.ts +1 -1
  65. package/locales/en-US.esm.min.js +1 -1
  66. package/locales/en-US.min.cjs +1 -1
  67. package/locales/en-US.min.js +1 -1
  68. package/locales/es-ES.d.ts +1 -1
  69. package/locales/es-ES.esm.min.js +1 -1
  70. package/locales/es-ES.min.cjs +1 -1
  71. package/locales/es-ES.min.js +1 -1
  72. package/locales/fi-FI.d.ts +1 -1
  73. package/locales/fi-FI.esm.min.js +1 -1
  74. package/locales/fi-FI.min.cjs +1 -1
  75. package/locales/fi-FI.min.js +1 -1
  76. package/locales/fr-CA.d.ts +1 -1
  77. package/locales/fr-CA.esm.min.js +1 -1
  78. package/locales/fr-CA.min.cjs +1 -1
  79. package/locales/fr-CA.min.js +1 -1
  80. package/locales/fr-FR.d.ts +1 -1
  81. package/locales/fr-FR.esm.min.js +1 -1
  82. package/locales/fr-FR.min.cjs +1 -1
  83. package/locales/fr-FR.min.js +1 -1
  84. package/locales/hu-HU.d.ts +1 -1
  85. package/locales/hu-HU.esm.min.js +1 -1
  86. package/locales/hu-HU.min.cjs +1 -1
  87. package/locales/hu-HU.min.js +1 -1
  88. package/locales/it-IT.d.ts +1 -1
  89. package/locales/it-IT.esm.min.js +1 -1
  90. package/locales/it-IT.min.cjs +1 -1
  91. package/locales/it-IT.min.js +1 -1
  92. package/locales/ja-JP.d.ts +1 -1
  93. package/locales/ja-JP.esm.min.js +1 -1
  94. package/locales/ja-JP.min.cjs +1 -1
  95. package/locales/ja-JP.min.js +1 -1
  96. package/locales/nb-NO.d.ts +1 -1
  97. package/locales/nb-NO.esm.min.js +1 -1
  98. package/locales/nb-NO.min.cjs +1 -1
  99. package/locales/nb-NO.min.js +1 -1
  100. package/locales/nl-NL.d.ts +1 -1
  101. package/locales/nl-NL.esm.min.js +1 -1
  102. package/locales/nl-NL.min.cjs +1 -1
  103. package/locales/nl-NL.min.js +1 -1
  104. package/locales/pl-PL.d.ts +1 -1
  105. package/locales/pl-PL.esm.min.js +1 -1
  106. package/locales/pl-PL.min.cjs +1 -1
  107. package/locales/pl-PL.min.js +1 -1
  108. package/locales/pt-BR.d.ts +1 -1
  109. package/locales/pt-BR.esm.min.js +1 -1
  110. package/locales/pt-BR.min.cjs +1 -1
  111. package/locales/pt-BR.min.js +1 -1
  112. package/locales/ro-RO.d.ts +1 -1
  113. package/locales/ro-RO.esm.min.js +1 -1
  114. package/locales/ro-RO.min.cjs +1 -1
  115. package/locales/ro-RO.min.js +1 -1
  116. package/locales/sv-SE.d.ts +1 -1
  117. package/locales/sv-SE.esm.min.js +1 -1
  118. package/locales/sv-SE.min.cjs +1 -1
  119. package/locales/sv-SE.min.js +1 -1
  120. package/locales/uk-UA.d.ts +1 -1
  121. package/locales/uk-UA.esm.min.js +1 -1
  122. package/locales/uk-UA.min.cjs +1 -1
  123. package/locales/uk-UA.min.js +1 -1
  124. package/modules/ai.d.ts +1 -1
  125. package/modules/ai.esm.min.js +1 -1
  126. package/modules/ai.min.cjs +1 -1
  127. package/modules/ai.min.js +1 -1
  128. package/modules/alarms.d.ts +1 -1
  129. package/modules/alarms.esm.min.js +1 -1
  130. package/modules/alarms.min.cjs +1 -1
  131. package/modules/alarms.min.js +1 -1
  132. package/modules/angular.d.ts +1 -1
  133. package/modules/angular.esm.min.js +1 -1
  134. package/modules/angular.min.cjs +1 -1
  135. package/modules/angular.min.js +1 -1
  136. package/modules/calendar.d.ts +1 -1
  137. package/modules/calendar.esm.min.js +1 -1
  138. package/modules/calendar.min.cjs +1 -1
  139. package/modules/calendar.min.js +1 -1
  140. package/modules/chart-alluvial.d.ts +1 -1
  141. package/modules/chart-alluvial.esm.min.js +1 -1
  142. package/modules/chart-alluvial.min.cjs +1 -1
  143. package/modules/chart-alluvial.min.js +1 -1
  144. package/modules/chart-arc.d.ts +1 -1
  145. package/modules/chart-arc.esm.min.js +1 -1
  146. package/modules/chart-arc.min.cjs +1 -1
  147. package/modules/chart-arc.min.js +1 -1
  148. package/modules/chart-barrace.d.ts +1 -1
  149. package/modules/chart-barrace.esm.min.js +1 -1
  150. package/modules/chart-barrace.min.cjs +1 -1
  151. package/modules/chart-barrace.min.js +1 -1
  152. package/modules/chart-bubblemap.d.ts +1 -1
  153. package/modules/chart-bubblemap.esm.min.js +1 -1
  154. package/modules/chart-bubblemap.min.cjs +1 -1
  155. package/modules/chart-bubblemap.min.js +1 -1
  156. package/modules/chart-bump.d.ts +1 -1
  157. package/modules/chart-bump.esm.min.js +1 -1
  158. package/modules/chart-bump.min.cjs +1 -1
  159. package/modules/chart-bump.min.js +1 -1
  160. package/modules/chart-calendar.d.ts +1 -1
  161. package/modules/chart-calendar.esm.min.js +1 -1
  162. package/modules/chart-calendar.min.cjs +1 -1
  163. package/modules/chart-calendar.min.js +1 -1
  164. package/modules/chart-choropleth.d.ts +1 -1
  165. package/modules/chart-choropleth.esm.min.js +1 -1
  166. package/modules/chart-choropleth.min.cjs +1 -1
  167. package/modules/chart-choropleth.min.js +1 -1
  168. package/modules/chart-decomposition.d.ts +1 -1
  169. package/modules/chart-decomposition.esm.min.js +1 -1
  170. package/modules/chart-decomposition.min.cjs +1 -1
  171. package/modules/chart-decomposition.min.js +1 -1
  172. package/modules/chart-diverging.d.ts +1 -1
  173. package/modules/chart-diverging.esm.min.js +1 -1
  174. package/modules/chart-diverging.min.cjs +1 -1
  175. package/modules/chart-diverging.min.js +1 -1
  176. package/modules/chart-dumbbell.d.ts +1 -1
  177. package/modules/chart-dumbbell.esm.min.js +1 -1
  178. package/modules/chart-dumbbell.min.cjs +1 -1
  179. package/modules/chart-dumbbell.min.js +1 -1
  180. package/modules/chart-fan.d.ts +1 -1
  181. package/modules/chart-fan.esm.min.js +1 -1
  182. package/modules/chart-fan.min.cjs +1 -1
  183. package/modules/chart-fan.min.js +1 -1
  184. package/modules/chart-forcetree.d.ts +1 -1
  185. package/modules/chart-forcetree.esm.min.js +1 -1
  186. package/modules/chart-forcetree.min.cjs +1 -1
  187. package/modules/chart-forcetree.min.js +1 -1
  188. package/modules/chart-hexbin.d.ts +1 -1
  189. package/modules/chart-hexbin.esm.min.js +1 -1
  190. package/modules/chart-hexbin.min.cjs +1 -1
  191. package/modules/chart-hexbin.min.js +1 -1
  192. package/modules/chart-hexmap.d.ts +1 -1
  193. package/modules/chart-hexmap.esm.min.js +1 -1
  194. package/modules/chart-hexmap.min.cjs +1 -1
  195. package/modules/chart-hexmap.min.js +1 -1
  196. package/modules/chart-icicle.d.ts +1 -1
  197. package/modules/chart-icicle.esm.min.js +1 -1
  198. package/modules/chart-icicle.min.cjs +1 -1
  199. package/modules/chart-icicle.min.js +1 -1
  200. package/modules/chart-markermap.d.ts +1 -1
  201. package/modules/chart-markermap.esm.min.js +1 -1
  202. package/modules/chart-markermap.min.cjs +1 -1
  203. package/modules/chart-markermap.min.js +1 -1
  204. package/modules/chart-motion.d.ts +1 -1
  205. package/modules/chart-motion.esm.min.js +1 -1
  206. package/modules/chart-motion.min.cjs +1 -1
  207. package/modules/chart-motion.min.js +1 -1
  208. package/modules/chart-pack.d.ts +1 -1
  209. package/modules/chart-pack.esm.min.js +1 -1
  210. package/modules/chart-pack.min.cjs +1 -1
  211. package/modules/chart-pack.min.js +1 -1
  212. package/modules/chart-parallel.d.ts +1 -1
  213. package/modules/chart-parallel.esm.min.js +1 -1
  214. package/modules/chart-parallel.min.cjs +1 -1
  215. package/modules/chart-parallel.min.js +1 -1
  216. package/modules/chart-pictorial.d.ts +1 -1
  217. package/modules/chart-pictorial.esm.min.js +1 -1
  218. package/modules/chart-pictorial.min.cjs +1 -1
  219. package/modules/chart-pictorial.min.js +1 -1
  220. package/modules/chart-polararea.d.ts +1 -1
  221. package/modules/chart-polararea.esm.min.js +1 -1
  222. package/modules/chart-polararea.min.cjs +1 -1
  223. package/modules/chart-polararea.min.js +1 -1
  224. package/modules/chart-polarscatter.d.ts +1 -1
  225. package/modules/chart-polarscatter.esm.min.js +1 -1
  226. package/modules/chart-polarscatter.min.cjs +1 -1
  227. package/modules/chart-polarscatter.min.js +1 -1
  228. package/modules/chart-pyramid.d.ts +1 -1
  229. package/modules/chart-pyramid.esm.min.js +1 -1
  230. package/modules/chart-pyramid.min.cjs +1 -1
  231. package/modules/chart-pyramid.min.js +1 -1
  232. package/modules/chart-radialbar.d.ts +1 -1
  233. package/modules/chart-radialbar.esm.min.js +1 -1
  234. package/modules/chart-radialbar.min.cjs +1 -1
  235. package/modules/chart-radialbar.min.js +1 -1
  236. package/modules/chart-ridgeline.d.ts +1 -1
  237. package/modules/chart-ridgeline.esm.min.js +1 -1
  238. package/modules/chart-ridgeline.min.cjs +1 -1
  239. package/modules/chart-ridgeline.min.js +1 -1
  240. package/modules/chart-roc.d.ts +1 -1
  241. package/modules/chart-roc.esm.min.js +1 -1
  242. package/modules/chart-roc.min.cjs +1 -1
  243. package/modules/chart-roc.min.js +1 -1
  244. package/modules/chart-scatter3d.d.ts +1 -1
  245. package/modules/chart-scatter3d.esm.min.js +1 -1
  246. package/modules/chart-scatter3d.min.cjs +1 -1
  247. package/modules/chart-scatter3d.min.js +1 -1
  248. package/modules/chart-serpentine.d.ts +1 -1
  249. package/modules/chart-serpentine.esm.min.js +1 -1
  250. package/modules/chart-serpentine.min.cjs +1 -1
  251. package/modules/chart-serpentine.min.js +1 -1
  252. package/modules/chart-slope.d.ts +1 -1
  253. package/modules/chart-slope.esm.min.js +1 -1
  254. package/modules/chart-slope.min.cjs +1 -1
  255. package/modules/chart-slope.min.js +1 -1
  256. package/modules/chart-spiral.d.ts +1 -1
  257. package/modules/chart-spiral.esm.min.js +1 -1
  258. package/modules/chart-spiral.min.cjs +1 -1
  259. package/modules/chart-spiral.min.js +1 -1
  260. package/modules/chart-splom.d.ts +1 -1
  261. package/modules/chart-splom.esm.min.js +1 -1
  262. package/modules/chart-splom.min.cjs +1 -1
  263. package/modules/chart-splom.min.js +1 -1
  264. package/modules/chart-tree.d.ts +1 -1
  265. package/modules/chart-tree.esm.min.js +1 -1
  266. package/modules/chart-tree.min.cjs +1 -1
  267. package/modules/chart-tree.min.js +1 -1
  268. package/modules/chart-venn.d.ts +1 -1
  269. package/modules/chart-venn.esm.min.js +1 -1
  270. package/modules/chart-venn.min.cjs +1 -1
  271. package/modules/chart-venn.min.js +1 -1
  272. package/modules/chart-voronoi.d.ts +1 -1
  273. package/modules/chart-voronoi.esm.min.js +1 -1
  274. package/modules/chart-voronoi.min.cjs +1 -1
  275. package/modules/chart-voronoi.min.js +1 -1
  276. package/modules/chart-waffle.d.ts +1 -1
  277. package/modules/chart-waffle.esm.min.js +1 -1
  278. package/modules/chart-waffle.min.cjs +1 -1
  279. package/modules/chart-waffle.min.js +1 -1
  280. package/modules/chart-wordcloud.d.ts +1 -1
  281. package/modules/chart-wordcloud.esm.min.js +1 -1
  282. package/modules/chart-wordcloud.min.cjs +1 -1
  283. package/modules/chart-wordcloud.min.js +1 -1
  284. package/modules/charts.d.ts +1 -1
  285. package/modules/charts.esm.min.js +1 -1
  286. package/modules/charts.min.cjs +1 -1
  287. package/modules/charts.min.js +1 -1
  288. package/modules/contextmenu.d.ts +1 -1
  289. package/modules/contextmenu.esm.min.js +1 -1
  290. package/modules/contextmenu.min.cjs +1 -1
  291. package/modules/contextmenu.min.js +1 -1
  292. package/modules/dashboard.d.ts +1 -1
  293. package/modules/dashboard.esm.min.js +1 -1
  294. package/modules/dashboard.min.cjs +1 -1
  295. package/modules/dashboard.min.js +1 -1
  296. package/modules/data-router.d.ts +1 -1
  297. package/modules/data-router.esm.min.js +1 -1
  298. package/modules/data-router.min.cjs +1 -1
  299. package/modules/data-router.min.js +1 -1
  300. package/modules/dataview.d.ts +1 -1
  301. package/modules/dataview.esm.min.js +1 -1
  302. package/modules/dataview.min.cjs +1 -1
  303. package/modules/dataview.min.js +1 -1
  304. package/modules/deckgl.d.ts +1 -1
  305. package/modules/deckgl.esm.min.js +1 -1
  306. package/modules/deckgl.min.cjs +1 -1
  307. package/modules/deckgl.min.js +1 -1
  308. package/modules/designer.d.ts +1 -1
  309. package/modules/designer.esm.min.js +1 -1
  310. package/modules/designer.min.cjs +1 -1
  311. package/modules/designer.min.js +1 -1
  312. package/modules/devtools.d.ts +1 -1
  313. package/modules/devtools.esm.min.js +1 -1
  314. package/modules/devtools.min.cjs +1 -1
  315. package/modules/devtools.min.js +1 -1
  316. package/modules/dhtmlx-compat.d.ts +1 -1
  317. package/modules/dhtmlx-compat.esm.min.js +1 -1
  318. package/modules/dhtmlx-compat.min.cjs +1 -1
  319. package/modules/dhtmlx-compat.min.js +1 -1
  320. package/modules/form.d.ts +1 -1
  321. package/modules/form.esm.min.js +1 -1
  322. package/modules/form.min.cjs +1 -1
  323. package/modules/form.min.js +1 -1
  324. package/modules/gantt.d.ts +1 -1
  325. package/modules/gantt.esm.min.js +1 -1
  326. package/modules/gantt.min.cjs +1 -1
  327. package/modules/gantt.min.js +1 -1
  328. package/modules/geo-europe-nuts.d.ts +1 -1
  329. package/modules/geo-europe-nuts.esm.min.js +1 -1
  330. package/modules/geo-europe-nuts.min.cjs +1 -1
  331. package/modules/geo-europe-nuts.min.js +1 -1
  332. package/modules/geo-uk.d.ts +1 -1
  333. package/modules/geo-uk.esm.min.js +1 -1
  334. package/modules/geo-uk.min.cjs +1 -1
  335. package/modules/geo-uk.min.js +1 -1
  336. package/modules/geo-us-states.d.ts +1 -1
  337. package/modules/geo-us-states.esm.min.js +1 -1
  338. package/modules/geo-us-states.min.cjs +1 -1
  339. package/modules/geo-us-states.min.js +1 -1
  340. package/modules/geo-world-110m.d.ts +1 -1
  341. package/modules/geo-world-110m.esm.min.js +1 -1
  342. package/modules/geo-world-110m.min.cjs +1 -1
  343. package/modules/geo-world-110m.min.js +1 -1
  344. package/modules/geo-world-50m.d.ts +1 -1
  345. package/modules/geo-world-50m.esm.min.js +1 -1
  346. package/modules/geo-world-50m.min.cjs +1 -1
  347. package/modules/geo-world-50m.min.js +1 -1
  348. package/modules/geometry.d.ts +1 -1
  349. package/modules/geometry.esm.min.js +1 -1
  350. package/modules/geometry.min.cjs +1 -1
  351. package/modules/geometry.min.js +1 -1
  352. package/modules/htmx.d.ts +1 -1
  353. package/modules/htmx.esm.min.js +2 -2
  354. package/modules/htmx.min.cjs +2 -2
  355. package/modules/htmx.min.js +2 -2
  356. package/modules/htmx.shared.esm.min.js +1 -1
  357. package/modules/htmx.shared.min.cjs +1 -1
  358. package/modules/htmx.shared.min.js +1 -1
  359. package/modules/kanban.d.ts +1 -1
  360. package/modules/kanban.esm.min.js +7 -4
  361. package/modules/kanban.esm.min.js.map +2 -2
  362. package/modules/kanban.min.cjs +7 -4
  363. package/modules/kanban.min.js +7 -4
  364. package/modules/kanban.min.js.map +2 -2
  365. package/modules/kpi.d.ts +1 -1
  366. package/modules/kpi.esm.min.js +1 -1
  367. package/modules/kpi.min.cjs +1 -1
  368. package/modules/kpi.min.js +1 -1
  369. package/modules/layout.d.ts +1 -1
  370. package/modules/layout.esm.min.js +1 -1
  371. package/modules/layout.min.cjs +1 -1
  372. package/modules/layout.min.js +1 -1
  373. package/modules/leaflet.d.ts +1 -1
  374. package/modules/leaflet.esm.min.js +1 -1
  375. package/modules/leaflet.min.cjs +1 -1
  376. package/modules/leaflet.min.js +1 -1
  377. package/modules/list.d.ts +1 -1
  378. package/modules/list.esm.min.js +1 -1
  379. package/modules/list.min.cjs +1 -1
  380. package/modules/list.min.js +1 -1
  381. package/modules/listview.d.ts +1 -1
  382. package/modules/listview.esm.min.js +1 -1
  383. package/modules/listview.min.cjs +1 -1
  384. package/modules/listview.min.js +1 -1
  385. package/modules/mapview.d.ts +1 -1
  386. package/modules/mapview.esm.min.js +1 -1
  387. package/modules/mapview.min.cjs +1 -1
  388. package/modules/mapview.min.js +1 -1
  389. package/modules/mock-socket.d.ts +1 -1
  390. package/modules/mock-socket.esm.min.js +1 -1
  391. package/modules/mock-socket.min.cjs +1 -1
  392. package/modules/mock-socket.min.js +1 -1
  393. package/modules/presets.d.ts +1 -1
  394. package/modules/presets.esm.min.js +1 -1
  395. package/modules/presets.min.cjs +1 -1
  396. package/modules/presets.min.js +1 -1
  397. package/modules/react.d.ts +1 -1
  398. package/modules/react.esm.min.js +1 -1
  399. package/modules/react.min.cjs +1 -1
  400. package/modules/react.min.js +1 -1
  401. package/modules/recordeditor.d.ts +1 -1
  402. package/modules/recordeditor.esm.min.js +1 -1
  403. package/modules/recordeditor.min.cjs +1 -1
  404. package/modules/recordeditor.min.js +1 -1
  405. package/modules/scheduler.d.ts +1 -1
  406. package/modules/scheduler.esm.min.js +1 -1
  407. package/modules/scheduler.min.cjs +1 -1
  408. package/modules/scheduler.min.js +1 -1
  409. package/modules/shell.d.ts +1 -1
  410. package/modules/shell.esm.min.js +1 -1
  411. package/modules/shell.min.cjs +1 -1
  412. package/modules/shell.min.js +1 -1
  413. package/modules/sidebar.d.ts +1 -1
  414. package/modules/sidebar.esm.min.js +1 -1
  415. package/modules/sidebar.min.cjs +1 -1
  416. package/modules/sidebar.min.js +1 -1
  417. package/modules/svelte.d.ts +1 -1
  418. package/modules/svelte.esm.min.js +1 -1
  419. package/modules/svelte.min.cjs +1 -1
  420. package/modules/svelte.min.js +1 -1
  421. package/modules/tabs.d.ts +1 -1
  422. package/modules/tabs.esm.min.js +1 -1
  423. package/modules/tabs.min.cjs +1 -1
  424. package/modules/tabs.min.js +1 -1
  425. package/modules/toolbar.d.ts +1 -1
  426. package/modules/toolbar.esm.min.js +1 -1
  427. package/modules/toolbar.min.cjs +1 -1
  428. package/modules/toolbar.min.js +1 -1
  429. package/modules/tree.d.ts +1 -1
  430. package/modules/tree.esm.min.js +1 -1
  431. package/modules/tree.min.cjs +1 -1
  432. package/modules/tree.min.js +1 -1
  433. package/modules/vue.d.ts +1 -1
  434. package/modules/vue.esm.min.js +1 -1
  435. package/modules/vue.min.cjs +1 -1
  436. package/modules/vue.min.js +1 -1
  437. package/modules/webcomponent.d.ts +1 -1
  438. package/modules/webcomponent.esm.min.js +2 -2
  439. package/modules/webcomponent.min.cjs +2 -2
  440. package/modules/webcomponent.min.js +2 -2
  441. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Lattice Grid 1.115.0, kanban module
2
+ * Lattice Grid 1.115.2, kanban module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
6
- var Ot=Object.create(null),Et=Object.create(null);function Ge(h,J){Ot[h]=J}function xt(h){var J=Et[h];if(J)return J;var a=Object.create(null);Et[h]=a;var v=Ot[h];if(!v)throw new Error("[lattice] missing module: "+h);return v(a,xt),a}Ge("packages/core/src/internal/predicates.js",function(h,J){"use strict";Object.defineProperty(h,"isObject",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"isFunction",{enumerable:!0,get:function(){return v}}),Object.defineProperty(h,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"isBlank",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(h,"isCtor",{enumerable:!0,get:function(){return ee}});function a(j){return j!==null&&typeof j=="object"&&!Array.isArray(j)}function v(j){return typeof j=="function"}function x(j){return j==null}function ne(j){return j==null||j===""}function ee(j){return typeof j!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(j))?!0:!!(j.prototype&&Object.getOwnPropertyNames(j.prototype).length>1)}}),Ge("packages/core/src/internal/warn.js",function(h,J){"use strict";Object.defineProperty(h,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(h,"warnOnce",{enumerable:!0,get:function(){return E}}),Object.defineProperty(h,"infoOnce",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"resetWarnings",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"fail",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"invariant",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"DEV",{enumerable:!0,get:function(){return oe}});const a=new Set,v=2e3;function x(H){if(a.add(H),a.size>v){const O=a.values().next().value;O!==void 0&&a.delete(O)}}const ne=[],ee=500;function j(H,O,I){ne.push({key:H,level:O,message:I.map(F=>typeof F=="string"?F:u(F)).join(" "),at:Date.now()}),ne.length>ee&&ne.shift()}function u(H){if(H instanceof Error)return H.message;try{return JSON.stringify(H)}catch{return String(H)}}function P(){return ne.map(H=>({...H}))}function K(H){if(H.length===0||typeof H[0]!="string")return H;const O=H[0].replace(/^\[lattice\]\s*/,"");return O===H[0]?H:[O,...H.slice(1)]}function E(H,...O){if(a.has(H))return;x(H);const I=K(O);j(H,"warn",I),console.warn("[lattice]",...I)}function R(H,...O){if(a.has(H))return;x(H);const I=K(O);j(H,"info",I),console.info("[lattice]",...I)}function z(){a.clear(),ne.length=0}function V(H,O){const I=new Error(`[lattice] ${H}`);throw O!==void 0&&(I.cause=O),I}function X(H,O){H||V(O)}const oe=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})()}),Ge("packages/core/src/internal/paths.js",function(h,J){"use strict";Object.defineProperty(h,"pathGetter",{enumerable:!0,get:function(){return v}}),Object.defineProperty(h,"pathSetter",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(h,"getPath",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"setPath",{enumerable:!0,get:function(){return j}});const a=new Map;function v(u){let P=a.get(u);if(P)return P;if(!u.includes("."))P=K=>K?.[u];else{const K=u.split("."),E=K.length;P=R=>{let z=R;for(let V=0;V<E;V++){if(z==null)return;z=z[K[V]]}return z}}return a.set(u,P),P}const x=new Map;function ne(u){let P=x.get(u);if(P)return P;if(!u.includes("."))P=(K,E)=>{K!=null&&(K[u]=E)};else{const K=u.split("."),E=K.length-1;P=(R,z)=>{let V=R;for(let X=0;X<E;X++){if(V==null)return;const oe=K[X];V[oe]==null&&(V[oe]={}),V=V[oe]}V!=null&&(V[K[E]]=z)}}return x.set(u,P),P}function ee(u,P){return v(P)(u)}function j(u,P,K){ne(P)(u,K)}}),Ge("packages/core/src/internal/uid.js",function(h,J){"use strict";Object.defineProperty(h,"uid",{enumerable:!0,get:function(){return v}});let a=0;function v(x="l"){return`${x}${(++a).toString(36)}`}}),Ge("packages/core/src/internal/merge.js",function(h,J){"use strict";Object.defineProperty(h,"expand",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"toArray",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(h,"merge",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"mergeRow",{enumerable:!0,get:function(){return u}});const v=J("packages/core/src/internal/predicates.js").isObject;function x(P,K,E){if(P!==void 0)return P===!0?{enabled:!0,...E}:P===!1?{enabled:!1}:v(P)?P:{[K]:P,enabled:!0}}function ne(P){return P==null?[]:Array.isArray(P)?P:[P]}const ee=Object.freeze(new Set(["__proto__","constructor","prototype"]));function j(P,K){if(!v(P))return v(K)?{...K}:K;if(!v(K))return K===void 0?P:K;const E={...P};for(const R of Object.keys(K)){if(ee.has(R))continue;const z=K[R];z!==void 0&&(E[R]=v(z)&&v(E[R])?j(E[R],z):z)}return E}function u(P,K){if(!v(P)||!v(K)||P===K)return K;const E=Object.create(Object.getPrototypeOf(P));return Object.assign(E,P,K),E}}),Ge("packages/core/src/internal/ready.js",function(h,J){"use strict";Object.defineProperty(h,"createReadySignal",{enumerable:!0,get:function(){return a}});function a(){let v=!1,x,ne;const ee=new Promise((j,u)=>{x=j,ne=u});return ee.catch(()=>{}),{promise:ee,settleSoon(){v||queueMicrotask(()=>{v||(v=!0,x())})},settleAfterFrames(){if(v)return;const j=typeof requestAnimationFrame=="function"?requestAnimationFrame:null;if(!j){this.settleSoon();return}let u=!1;const P=()=>{u||(u=!0,this.settleNow())};j(()=>j(P)),setTimeout(P,250)},settleNow(){v||(v=!0,x())},fail(j){v||(v=!0,ne(j))}}}}),Ge("packages/core/src/internal/text.js",function(h,J){"use strict";Object.defineProperty(h,"humanise",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"escapeHtml",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"titleCase",{enumerable:!0,get:function(){return ne}});function a(ee){return ee?(ee.includes(".")?ee.slice(ee.lastIndexOf(".")+1):ee).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(/^./,u=>u.toUpperCase()):""}const v={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function x(ee){const j=ee==null?"":String(ee);return/[&<>"']/.test(j)?j.replace(/[&<>"']/g,u=>v[u]):j}function ne(ee){return String(ee).replace(/\w\S*/g,j=>j[0].toUpperCase()+j.slice(1).toLowerCase())}}),Ge("packages/modules/kanban/card-parts.js",function(h,J){"use strict";Object.defineProperty(h,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"initials",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"avatarColor",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"safeAvatarUrl",{enumerable:!0,get:function(){return u}}),Object.defineProperty(h,"avatarChip",{enumerable:!0,get:function(){return P}}),Object.defineProperty(h,"assignees",{enumerable:!0,get:function(){return E}}),Object.defineProperty(h,"dueTimestamp",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"dueState",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"progressPercent",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"checklist",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"TONES",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(h,"toneOf",{enumerable:!0,get:function(){return H}}),Object.defineProperty(h,"formatDuePattern",{enumerable:!0,get:function(){return I}}),Object.defineProperty(h,"dueText",{enumerable:!0,get:function(){return F}});const a="lat-kanban",v=["#4a90d9","#e2513b","#2c9c6a","#8b5cf6","#d97706","#0891b2","#be185d"],x=/^\s*(https?:|blob:|data:image\/)/i,ne=/^\s*[a-z][a-z0-9+.-]*:/i;function ee(m){const o=String(m).trim().split(/\s+/).filter(Boolean);return o.length?o.length===1?o[0].slice(0,2).toUpperCase():(o[0][0]+o[o.length-1][0]).toUpperCase():"?"}function j(m){let o=0;for(let s=0;s<m.length;s+=1)o=o*31+m.charCodeAt(s)>>>0;return v[o%v.length]}function u(m){if(m==null)return"";const o=String(m).trim();return o?ne.test(o)?x.test(o)?o:"":o:""}function P(m,{name:o,avatar:s,title:c=null}){const l=String(o??""),p=m.createElement("span");p.setAttribute("class",`${a}__avatar`),p.style.background=j(l),c!=null&&p.setAttribute("title",String(c));const k=u(s);if(k){const L=m.createElement("img");L.setAttribute("class",`${a}__avatar-img`),L.setAttribute("alt",l),L.setAttribute("loading","lazy"),L.setAttribute("decoding","async"),L.setAttribute("src",k),L.addEventListener("error",()=>{L.parentNode===p&&p.removeChild(L)}),p.appendChild(L)}const $=m.createElement("span");return $.setAttribute("class",`${a}__avatar-glyph`),$.textContent=ee(l),p.appendChild($),p}function K(m){if(m==null)return null;if(typeof m=="object"){const s=String(m.name??m.label??m.id??"").trim();return s?{name:s,avatar:m.avatar??null}:null}const o=String(m).trim();return o?{name:o,avatar:null}:null}function E(m){if(m==null)return[];const o=Array.isArray(m)?m:String(m).split(",").map(c=>c.trim()).filter(Boolean),s=[];for(const c of o){const l=K(c);l&&s.push(l)}return s}function R(m){if(m==null||m==="")return null;if(m instanceof Date){const s=m.getTime();return Number.isFinite(s)?s:null}if(typeof m=="number")return Number.isFinite(m)?m:null;const o=Date.parse(String(m).trim());return Number.isFinite(o)?o:null}function z(m,o,s=0){if(m===null||!Number.isFinite(m))return null;if(m<o)return"overdue";const c=Number(s)||0;return c>0&&m-o<=c*864e5?"soon":null}function V(m){if(m==null||m==="")return null;const o=Number(String(m).replace("%","").trim());if(!Number.isFinite(o))return null;const s=o<=1&&o>=0?o*100:o;return Math.max(0,Math.min(100,Math.round(s)))}function X(m,o){let s=m,c=o;o===void 0&&m!==null&&m!==void 0&&typeof m=="object"&&(s=m.done,c=m.total);const l=Number(s),p=Number(c);return!Number.isFinite(l)&&!Number.isFinite(p)?null:{done:Number.isFinite(l)?l:0,total:Number.isFinite(p)?p:0}}const oe=Object.freeze(["accent","info","success","warning","danger","neutral"]);function H(m,o,s){if(!m)return null;let c;return typeof m=="function"?c=m(s,o):typeof m=="object"&&Object.prototype.hasOwnProperty.call(m,o)&&(c=m[o]),typeof c=="string"&&oe.includes(c)?c:null}const O=m=>String(m).padStart(2,"0");function I(m,o,s){const c=new Date(o),l=k=>new Intl.DateTimeFormat(s,k).format(c),p={yyyy:()=>String(c.getFullYear()),yy:()=>O(c.getFullYear()%100),MMMM:()=>l({month:"long"}),MMM:()=>l({month:"short"}),MM:()=>O(c.getMonth()+1),M:()=>String(c.getMonth()+1),dd:()=>O(c.getDate()),d:()=>String(c.getDate()),EEEE:()=>l({weekday:"long"}),EEE:()=>l({weekday:"short"})};return String(m).replace(/'([^']*)'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE/g,(k,$)=>$!==void 0?$:p[k]())}function F(m,o,s,c,l){if(o===null||!m)return s;let p;if(typeof m=="function")p=m(new Date(o),c);else if(typeof m=="string")p=I(m,o,l);else return s;return p==null||p===""?s:String(p)}}),Ge("packages/modules/kanban/model.js",function(h,J){"use strict";Object.defineProperty(h,"accessorFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(h,"keyFn",{enumerable:!0,get:function(){return o}}),Object.defineProperty(h,"fieldText",{enumerable:!0,get:function(){return s}}),Object.defineProperty(h,"rawField",{enumerable:!0,get:function(){return c}}),Object.defineProperty(h,"cardSpecs",{enumerable:!0,get:function(){return l}}),Object.defineProperty(h,"deriveColumns",{enumerable:!0,get:function(){return p}}),Object.defineProperty(h,"columnIdOf",{enumerable:!0,get:function(){return $}}),Object.defineProperty(h,"buildCard",{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(h,"groupRows",{enumerable:!0,get:function(){return A}}),Object.defineProperty(h,"passesFilter",{enumerable:!0,get:function(){return ke}}),Object.defineProperty(h,"BACKLOG",{enumerable:!0,get:function(){return Re}}),Object.defineProperty(h,"DEFAULT_FILTER",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(h,"rollup",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(h,"laneIdOf",{enumerable:!0,get:function(){return We}}),Object.defineProperty(h,"computeOrders",{enumerable:!0,get:function(){return Qe}}),Object.defineProperty(h,"windowRange",{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(h,"deriveDoneColumns",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(h,"resolveColumnWidth",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(h,"resolveColumnWidthRange",{enumerable:!0,get:function(){return ut}}),Object.defineProperty(h,"resolveContext",{enumerable:!0,get:function(){return mt}});const v=J("packages/core/src/internal/warn.js").warnOnce,ne=J("packages/core/src/internal/paths.js").getPath,ee=J("packages/core/src/internal/predicates.js"),j=ee.isFunction,u=ee.isNil,P=ee.isObject,E=J("packages/core/src/internal/text.js").humanise,R=J("packages/modules/kanban/card-parts.js"),z=R.assignees,V=R.checklist,X=R.dueState,oe=R.dueText,H=R.dueTimestamp,O=R.progressPercent,I=R.toneOf;function F(b){return j(b)?b:typeof b=="string"?w=>ne(w,b):()=>{}}function m(b){return Array.isArray(b)?"array":b===null?"null":typeof b}function o(b){if(b!==void 0&&typeof b!="function"&&!(typeof b=="string"&&b.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(j(b))return D=>{const Z=b(D);if(typeof Z=="string"||typeof Z=="number"&&Number.isFinite(Z))return Z;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${m(Z)}.`)};const w=typeof b=="string"?b:"id";return D=>ne(D,w)}function s(b,w,D,Z){if(u(Z))return"";if(b.grid&&typeof Z=="string")try{if(b.grid.columns&&b.grid.columns.get&&b.grid.columns.get(Z)){const Ae=b.grid.rows.text(D,Z);if(!u(Ae))return String(Ae)}}catch{}const $e=F(Z)(w);return u($e)?"":String($e)}function c(b,w,D,Z){if(!u(Z)){if(b.grid&&typeof Z=="string")try{if(b.grid.columns&&b.grid.columns.get&&b.grid.columns.get(Z))return b.grid.rows.value(D,Z)}catch{}return F(Z)(w)}}function l(b){const w={};for(const[D,Z]of Object.entries(b))Z&&typeof Z=="object"&&!j(Z)?w[D]={...Z,edit:!!Z.edit,editor:Z.editor}:w[D]={field:Z,edit:!1,editor:void 0};return w}function p(b,w){const D=Array.isArray(b.columns)?b.columns.map(k):[],Z=new Map(D.map(ye=>[ye.id,ye])),$e=[],Ae=F(b.columnProperty);for(const ye of w){const fe=Ae(ye),ge=$(fe);ge!==null&&!Z.has(ge)&&!$e.includes(ge)&&$e.push(ge)}let se;if(D.length?se=[...D.map(ye=>ye.id),...$e.filter(ye=>!Z.has(ye))]:se=$e,Array.isArray(b.columnOrder)&&b.columnOrder.length){const ye=b.columnOrder.filter(fe=>se.includes(fe));se=[...ye,...se.filter(fe=>!ye.includes(fe))]}return se.map(ye=>{const fe=Z.get(ye)||{id:ye,title:E(String(ye))},ge={id:ye,title:u(fe.title)?E(String(ye)):String(fe.title),color:fe.color??null,wipLimit:Number.isFinite(fe.wipLimit)?fe.wipLimit:null,collapsed:!!fe.collapsed};return Array.isArray(fe.controls)&&(ge.controls=fe.controls),Array.isArray(fe.menu)&&(ge.menu=fe.menu),ge})}function k(b){return typeof b=="string"?{id:b}:P(b)&&!u(b.id)?b:{id:String(b)}}function $(b){return u(b)?null:String(b)}function L(b){return u(b)?!1:typeof b=="string"?b.trim()!=="":typeof b=="number"?b!==0:!!b}function U(b){return typeof b=="string"&&b.trim()!==""?b.trim():""}function Y(b){return u(b)?[]:Array.isArray(b)?b.filter(w=>!u(w)):typeof b=="string"?b.split(",").map(w=>w.trim()).filter(Boolean):[b]}function be(b,w,D){const Z=w.blockedBy;if(!Z.length)return;const $e=b.doneColumns||new Set,Ae=Z.every(se=>{const ye=D.get(se);return!!ye&&ye.columnId!==null&&$e.has(String(ye.columnId))});Ae&&!w.explicitBlocked?w.ready=!0:Ae||(w.blocked=!0)}function Oe(b,w){const D=b.key(w),Z=$(F(b.columnProperty)(w)),$e=b.pointsProperty?F(b.pointsProperty)(w):void 0,Ae=Number($e),se={};for(const[ot,et]of Object.entries(b.cardSpecs))se[ot]=s(b,w,D,et.field);const ye=b.blockedProperty?F(b.blockedProperty)(w):void 0,fe=b.blockedByProperty?F(b.blockedByProperty)(w):void 0,ge=L(ye),me=b.cardSpecs.assignee,He=b.cardSpecs.due,Se=b.cardSpecs.progress,Ue=b.cardSpecs.checklist;let dt=null;if(He){const ot=H(c(b,w,D,He.field));dt={text:oe(He.format,ot,se.due||"",w,He.locale),ts:ot,state:X(ot,Date.now(),He.dueSoon)}}let nt=null;if(Ue){const ot=Ue.field!=null?c(b,w,D,Ue.field):c(b,w,D,Ue.done),et=Ue.field!=null?void 0:c(b,w,D,Ue.total);nt=V(ot,et)}const kt={};if(b.cardSpecs.labels&&b.cardSpecs.labels.tone&&se.labels)for(const ot of String(se.labels).split(",").map(et=>et.trim()).filter(Boolean)){const et=I(b.cardSpecs.labels.tone,ot,w);et&&(kt[ot]=et)}const ht=b.cardSpecs.badges;return{key:D,row:w,columnId:Z,labelTones:kt,badgeTone:ht&&se.badges?I(ht.tone,se.badges,w):null,points:Number.isFinite(Ae)?Ae:0,hasPoints:Number.isFinite(Ae),swimlane:b.swimlaneProperty?F(b.swimlaneProperty)(w):void 0,sprint:b.sprintProperty?F(b.sprintProperty)(w):void 0,epic:b.epicProperty?F(b.epicProperty)(w):void 0,order:b.orderProperty?F(b.orderProperty)(w):void 0,explicitBlocked:ge,blocked:ge,blockedReason:U(ye),blockedBy:Y(fe),ready:!1,fields:se,assignees:z(me?c(b,w,D,me.field):void 0),due:dt,progressPct:Se?O(c(b,w,D,Se.field)):null,checklist:nt}}function A(b,w,D={}){const Z=re(p(b,w),D),$e=new Map(Z.map(Se=>[Se.id,{...Se,cards:[],points:0}])),Ae=new Map,se=[];let ye=0;const fe=w.map(Se=>Oe(b,Se)),ge=new Map(fe.map(Se=>[Se.key,Se]));for(const Se of fe)be(b,Se,ge);for(const Se of fe){if(!ke(b,Se,D)){ye+=1;continue}Ae.set(Se.key,Se);const Ue=Se.columnId===null?null:$e.get(Se.columnId);if(!Ue){se.push(Se);continue}Ue.cards.push(Se)}for(const Se of $e.values())ce(b,Se);se.length&&v(`kanban:unplaced:${b.columnProperty}`,`${se.length} card(s) have a "${b.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const me=[...$e.values()],He=b.swimlanes?je(b,me,Ae,D):null;return{columns:me,lanes:He,cardsByKey:Ae,unplaced:se,filtered:ye}}function re(b,w){let D=b;if(Array.isArray(w.columnOrder)&&w.columnOrder.length){const $e=new Map(w.columnOrder.map((Ae,se)=>[Ae,se]));D=[...b].sort((Ae,se)=>{const ye=$e.has(Ae.id)?$e.get(Ae.id):Number.MAX_SAFE_INTEGER,fe=$e.has(se.id)?$e.get(se.id):Number.MAX_SAFE_INTEGER;return ye-fe})}const Z=w.collapsedColumns;return D.map($e=>({...$e,collapsed:$e.collapsed||!!(Z&&Z.has($e.id))}))}function ce(b,w){if(b.orderProperty&&w.cards.sort((D,Z)=>Ze(D.order)-Ze(Z.order)),b.order)try{w.cards=[...w.cards].sort((D,Z)=>b.order(D,Z,w))}catch(D){v("kanban:order:throws",`the "order" comparator threw (${D&&D.message?D.message:D}); the column keeps its pre-comparator order.`)}w.count=w.cards.length,w.points=w.cards.reduce((D,Z)=>D+(Z.hasPoints?Z.points:0),0),w.over=w.wipLimit!==null&&w.count>w.wipLimit}function ke(b,w,D){if(D.filters&&D.filters.size){for(const se of D.filters.values())if(j(se)&&!se(w.row,w))return!1}if(D.blockedFilter&&!w.blocked||!Q(b,w,D)||!te(b,w,D))return!1;const Z=typeof D.quickFilter=="string"?D.quickFilter.trim().toLowerCase():"";if(!Z)return!0;const $e=(w.assignees||[]).map(se=>se.name).join(" ");return`${Object.values(w.fields).join(" ")} ${$e}`.toLowerCase().includes(Z)||String(w.columnId).toLowerCase().includes(Z)}const Re="\0backlog",Ne="\0default";function Q(b,w,D){if(D.sprint===void 0||!b.sprintProperty)return!0;const Z=F(b.sprintProperty)(w.row);return D.sprint===Re?u(Z)||Z==="":String(Z)===String(D.sprint)}function te(b,w,D){return D.epic===void 0||!b.epicProperty?!0:String(F(b.epicProperty)(w.row))===String(D.epic)}function ie(b,w,D,Z){const $e=F(D),Ae=b.pointsProperty?F(b.pointsProperty):()=>0,se=new Map;for(const fe of w){const ge=$e(fe),me=u(ge)?"":String(ge);let He=se.get(me);He||(He={value:ge,count:0,points:0,doneCount:0,donePoints:0,progress:0},se.set(me,He));const Se=Number(Ae(fe)),Ue=Number.isFinite(Se)?Se:0;He.count+=1,He.points+=Ue,j(Z)&&Z(fe)&&(He.doneCount+=1,He.donePoints+=Ue)}const ye=[...se.values()];for(const fe of ye){const ge=fe.points||fe.count||1,me=fe.points?fe.donePoints:fe.doneCount;fe.progress=Math.round(me/ge*1e3)/1e3}return ye.sort((fe,ge)=>ge.points-fe.points||ge.count-fe.count)}function We(b){return u(b)?"":String(b)}function je(b,w,D,Z){const $e=F(b.swimlaneProperty),Ae=Array.isArray(b.lanes)?b.lanes.map(ge=>typeof ge=="string"?{id:ge}:ge):[],se=new Map(Ae.map(ge=>[ge.id,ge]));let ye=Ae.map(ge=>ge.id);for(const ge of D.values()){const me=We($e(ge.row));!se.has(me)&&!ye.includes(me)&&ye.push(me)}if(Array.isArray(Z.laneOrder)&&Z.laneOrder.length){const ge=Z.laneOrder.filter(me=>ye.includes(me));ye=[...ge,...ye.filter(me=>!ge.includes(me))]}const fe=Z.collapsedLanes;return ye.map(ge=>{const me=se.get(ge)||{id:ge},He=w.map(Se=>{const Ue=Se.cards.filter(dt=>We($e(dt.row))===ge);return{id:Se.id,title:Se.title,cards:Ue,count:Ue.length,points:Ue.reduce((dt,nt)=>dt+(nt.hasPoints?nt.points:0),0)}});return{id:ge,title:u(me.title)?ge===""?"":E(ge):String(me.title),collapsed:!!(fe&&fe.has(ge)),columns:He,count:He.reduce((Se,Ue)=>Se+Ue.count,0),points:He.reduce((Se,Ue)=>Se+Ue.points,0)}})}function Ze(b){const w=Number(b);return Number.isFinite(w)?w:Number.POSITIVE_INFINITY}function Qe(b,w,D){const Z=Math.max(0,Math.min(w,b.length)),$e=Z>0?Number(b[Z-1]):null,Ae=Z<b.length?Number(b[Z]):null,se=[],ye=$e!==null&&Number.isFinite($e),fe=Ae!==null&&Number.isFinite(Ae);if(!ye&&!fe){for(let me=0;me<D;me++)se.push(me);return se}if(!ye){for(let me=0;me<D;me++)se.push(Ae-(D-me));return se}if(!fe){for(let me=0;me<D;me++)se.push($e+1+me);return se}const ge=(Ae-$e)/(D+1);for(let me=0;me<D;me++)se.push($e+ge*(me+1));return se}function Ye(b,w,D,Z,$e=3){const Ae=D>0?D:1,se=Math.max(0,Math.floor(b/Ae)-$e),ye=Math.ceil(w/Ae)+$e*2,fe=Math.min(Z,se+ye);return{start:se,end:fe,padTop:se*Ae,padBottom:Math.max(0,(Z-fe)*Ae)}}function Ie(b,w){return new Set([...Array.isArray(b)?b.map(String):[],...Array.isArray(w)?w.filter(D=>P(D)&&D.done).map(D=>String(D.id)):[]])}function Me(b){return typeof b=="number"&&Number.isFinite(b)&&b>0?b:b==="auto"?"auto":"fill"}function ut(b){const w=P(b)?b:{},D=Number.isFinite(w.minColumnWidth)&&w.minColumnWidth>0?w.minColumnWidth:240;let Z=Number.isFinite(w.maxColumnWidth)&&w.maxColumnWidth>0?w.maxColumnWidth:0;return Z&&Z<D&&(v("kanban:min-max-column-width",`"minColumnWidth" (${D}) is greater than "maxColumnWidth" (${Z}); the minimum wins, and both resolve to ${D}.`),Z=D),{minColumnWidth:D,maxColumnWidth:Z}}function mt(b){const w=P(b)?b:{};return u(w.columnProperty)&&!w.grid&&!Array.isArray(w.columns)&&v("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:w.grid||null,source:w.source||null,pageSize:Number.isFinite(w.pageSize)&&w.pageSize>0?w.pageSize:50,key:o(w.rowKey??"id"),rowKey:w.rowKey??"id",columnProperty:w.columnProperty??null,columns:w.columns??null,columnOrder:w.columnOrder??null,pointsProperty:w.pointsProperty??null,orderProperty:w.orderProperty??null,order:j(w.order)?w.order:null,swimlaneProperty:w.swimlaneProperty??null,sprintProperty:w.sprintProperty??null,epicProperty:w.epicProperty??null,blockedProperty:w.blockedProperty??null,blockedByProperty:w.blockedByProperty??null,enforceWip:!!w.enforceWip,sprintList:Array.isArray(w.sprints)?w.sprints.map(D=>P(D)?{id:D.id,title:D.title}:{id:D}):null,swimlanes:!!w.swimlanes,lanes:Array.isArray(w.lanes)?w.lanes:null,doneColumns:Ie(w.doneColumns,w.columns),transitions:P(w.transitions)?w.transitions:null,require:P(w.require)?w.require:null,laneRules:new Map((Array.isArray(w.lanes)?w.lanes:[]).filter(D=>P(D)&&(P(D.transitions)||P(D.require))).map(D=>[String(D.id),{transitions:D.transitions,require:D.require}])),showPoints:!!w.showPoints,density:w.density==="compact"?"compact":"comfortable",columnWidth:Me(w.columnWidth),...ut(w),card:P(w.card)?w.card:{},cardSpecs:l(P(w.card)?w.card:{}),emptyText:typeof w.emptyText=="string"?w.emptyText:"",virtualize:w.virtualize?{rowHeight:P(w.virtualize)&&w.virtualize.rowHeight||96,overscan:P(w.virtualize)&&w.virtualize.overscan||3,threshold:P(w.virtualize)&&w.virtualize.threshold||50,viewport:P(w.virtualize)&&w.virtualize.viewport||600}:null}}}),Ge("packages/modules/kanban/styles.js",function(h,J){"use strict";Object.defineProperty(h,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"css",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"injectStyles",{enumerable:!0,get:function(){return ne}});const a="lat-kanban",v="data-lattice-kanban-styles";function x(){return`
6
+ var Et=Object.create(null),xt=Object.create(null);function Ue(g,J){Et[g]=J}function jt(g){var J=xt[g];if(J)return J;var a=Object.create(null);xt[g]=a;var v=Et[g];if(!v)throw new Error("[lattice] missing module: "+g);return v(a,jt),a}Ue("packages/core/src/internal/predicates.js",function(g,J){"use strict";Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return ee}});function a(j){return j!==null&&typeof j=="object"&&!Array.isArray(j)}function v(j){return typeof j=="function"}function x(j){return j==null}function ne(j){return j==null||j===""}function ee(j){return typeof j!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(j))?!0:!!(j.prototype&&Object.getOwnPropertyNames(j.prototype).length>1)}}),Ue("packages/core/src/internal/warn.js",function(g,J){"use strict";Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return oe}});const a=new Set,v=2e3;function x(H){if(a.add(H),a.size>v){const P=a.values().next().value;P!==void 0&&a.delete(P)}}const ne=[],ee=500;function j(H,P,I){ne.push({key:H,level:P,message:I.map(M=>typeof M=="string"?M:u(M)).join(" "),at:Date.now()}),ne.length>ee&&ne.shift()}function u(H){if(H instanceof Error)return H.message;try{return JSON.stringify(H)}catch{return String(H)}}function O(){return ne.map(H=>({...H}))}function K(H){if(H.length===0||typeof H[0]!="string")return H;const P=H[0].replace(/^\[lattice\]\s*/,"");return P===H[0]?H:[P,...H.slice(1)]}function E(H,...P){if(a.has(H))return;x(H);const I=K(P);j(H,"warn",I),console.warn("[lattice]",...I)}function R(H,...P){if(a.has(H))return;x(H);const I=K(P);j(H,"info",I),console.info("[lattice]",...I)}function z(){a.clear(),ne.length=0}function V(H,P){const I=new Error(`[lattice] ${H}`);throw P!==void 0&&(I.cause=P),I}function X(H,P){H||V(P)}const oe=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})()}),Ue("packages/core/src/internal/paths.js",function(g,J){"use strict";Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return j}});const a=new Map;function v(u){let O=a.get(u);if(O)return O;if(!u.includes("."))O=K=>K?.[u];else{const K=u.split("."),E=K.length;O=R=>{let z=R;for(let V=0;V<E;V++){if(z==null)return;z=z[K[V]]}return z}}return a.set(u,O),O}const x=new Map;function ne(u){let O=x.get(u);if(O)return O;if(!u.includes("."))O=(K,E)=>{K!=null&&(K[u]=E)};else{const K=u.split("."),E=K.length-1;O=(R,z)=>{let V=R;for(let X=0;X<E;X++){if(V==null)return;const oe=K[X];V[oe]==null&&(V[oe]={}),V=V[oe]}V!=null&&(V[K[E]]=z)}}return x.set(u,O),O}function ee(u,O){return v(O)(u)}function j(u,O,K){ne(O)(u,K)}}),Ue("packages/core/src/internal/uid.js",function(g,J){"use strict";Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return v}});let a=0;function v(x="l"){return`${x}${(++a).toString(36)}`}}),Ue("packages/core/src/internal/merge.js",function(g,J){"use strict";Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return u}});const v=J("packages/core/src/internal/predicates.js").isObject;function x(O,K,E){if(O!==void 0)return O===!0?{enabled:!0,...E}:O===!1?{enabled:!1}:v(O)?O:{[K]:O,enabled:!0}}function ne(O){return O==null?[]:Array.isArray(O)?O:[O]}const ee=Object.freeze(new Set(["__proto__","constructor","prototype"]));function j(O,K){if(!v(O))return v(K)?{...K}:K;if(!v(K))return K===void 0?O:K;const E={...O};for(const R of Object.keys(K)){if(ee.has(R))continue;const z=K[R];z!==void 0&&(E[R]=v(z)&&v(E[R])?j(E[R],z):z)}return E}function u(O,K){if(!v(O)||!v(K)||O===K)return K;const E=Object.create(Object.getPrototypeOf(O));return Object.assign(E,O,K),E}}),Ue("packages/core/src/internal/ready.js",function(g,J){"use strict";Object.defineProperty(g,"createReadySignal",{enumerable:!0,get:function(){return a}});function a(){let v=!1,x,ne;const ee=new Promise((j,u)=>{x=j,ne=u});return ee.catch(()=>{}),{promise:ee,settleSoon(){v||queueMicrotask(()=>{v||(v=!0,x())})},settleAfterFrames(){if(v)return;const j=typeof requestAnimationFrame=="function"?requestAnimationFrame:null;if(!j){this.settleSoon();return}let u=!1;const O=()=>{u||(u=!0,this.settleNow())};j(()=>j(O)),setTimeout(O,250)},settleNow(){v||(v=!0,x())},fail(j){v||(v=!0,ne(j))}}}}),Ue("packages/core/src/internal/text.js",function(g,J){"use strict";Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ne}});function a(ee){return ee?(ee.includes(".")?ee.slice(ee.lastIndexOf(".")+1):ee).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(/^./,u=>u.toUpperCase()):""}const v={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function x(ee){const j=ee==null?"":String(ee);return/[&<>"']/.test(j)?j.replace(/[&<>"']/g,u=>v[u]):j}function ne(ee){return String(ee).replace(/\w\S*/g,j=>j[0].toUpperCase()+j.slice(1).toLowerCase())}}),Ue("packages/modules/kanban/card-parts.js",function(g,J){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"initials",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"avatarColor",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"safeAvatarUrl",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"avatarChip",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"assignees",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"dueTimestamp",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"dueState",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"progressPercent",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"checklist",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"TONES",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(g,"toneOf",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"formatDuePattern",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"dueText",{enumerable:!0,get:function(){return M}});const a="lat-kanban",v=["#4a90d9","#e2513b","#2c9c6a","#8b5cf6","#d97706","#0891b2","#be185d"],x=/^\s*(https?:|blob:|data:image\/)/i,ne=/^\s*[a-z][a-z0-9+.-]*:/i;function ee(p){const o=String(p).trim().split(/\s+/).filter(Boolean);return o.length?o.length===1?o[0].slice(0,2).toUpperCase():(o[0][0]+o[o.length-1][0]).toUpperCase():"?"}function j(p){let o=0;for(let s=0;s<p.length;s+=1)o=o*31+p.charCodeAt(s)>>>0;return v[o%v.length]}function u(p){if(p==null)return"";const o=String(p).trim();return o?ne.test(o)?x.test(o)?o:"":o:""}function O(p,{name:o,avatar:s,title:c=null}){const l=String(o??""),f=p.createElement("span");f.setAttribute("class",`${a}__avatar`),f.style.background=j(l),c!=null&&f.setAttribute("title",String(c));const k=u(s);if(k){const F=p.createElement("img");F.setAttribute("class",`${a}__avatar-img`),F.setAttribute("alt",l),F.setAttribute("loading","lazy"),F.setAttribute("decoding","async"),F.setAttribute("src",k),F.addEventListener("error",()=>{F.parentNode===f&&f.removeChild(F)}),f.appendChild(F)}const _=p.createElement("span");return _.setAttribute("class",`${a}__avatar-glyph`),_.textContent=ee(l),f.appendChild(_),f}function K(p){if(p==null)return null;if(typeof p=="object"){const s=String(p.name??p.label??p.id??"").trim();return s?{name:s,avatar:p.avatar??null}:null}const o=String(p).trim();return o?{name:o,avatar:null}:null}function E(p){if(p==null)return[];const o=Array.isArray(p)?p:String(p).split(",").map(c=>c.trim()).filter(Boolean),s=[];for(const c of o){const l=K(c);l&&s.push(l)}return s}function R(p){if(p==null||p==="")return null;if(p instanceof Date){const s=p.getTime();return Number.isFinite(s)?s:null}if(typeof p=="number")return Number.isFinite(p)?p:null;const o=Date.parse(String(p).trim());return Number.isFinite(o)?o:null}function z(p,o,s=0){if(p===null||!Number.isFinite(p))return null;if(p<o)return"overdue";const c=Number(s)||0;return c>0&&p-o<=c*864e5?"soon":null}function V(p){if(p==null||p==="")return null;const o=Number(String(p).replace("%","").trim());if(!Number.isFinite(o))return null;const s=o<=1&&o>=0?o*100:o;return Math.max(0,Math.min(100,Math.round(s)))}function X(p,o){let s=p,c=o;o===void 0&&p!==null&&p!==void 0&&typeof p=="object"&&(s=p.done,c=p.total);const l=Number(s),f=Number(c);return!Number.isFinite(l)&&!Number.isFinite(f)?null:{done:Number.isFinite(l)?l:0,total:Number.isFinite(f)?f:0}}const oe=Object.freeze(["accent","info","success","warning","danger","neutral"]);function H(p,o,s){if(!p)return null;let c;return typeof p=="function"?c=p(s,o):typeof p=="object"&&Object.prototype.hasOwnProperty.call(p,o)&&(c=p[o]),typeof c=="string"&&oe.includes(c)?c:null}const P=p=>String(p).padStart(2,"0");function I(p,o,s){const c=new Date(o),l=k=>new Intl.DateTimeFormat(s,k).format(c),f={yyyy:()=>String(c.getFullYear()),yy:()=>P(c.getFullYear()%100),MMMM:()=>l({month:"long"}),MMM:()=>l({month:"short"}),MM:()=>P(c.getMonth()+1),M:()=>String(c.getMonth()+1),dd:()=>P(c.getDate()),d:()=>String(c.getDate()),EEEE:()=>l({weekday:"long"}),EEE:()=>l({weekday:"short"})};return String(p).replace(/'([^']*)'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE/g,(k,_)=>_!==void 0?_:f[k]())}function M(p,o,s,c,l){if(o===null||!p)return s;let f;if(typeof p=="function")f=p(new Date(o),c);else if(typeof p=="string")f=I(p,o,l);else return s;return f==null||f===""?s:String(f)}}),Ue("packages/modules/kanban/model.js",function(g,J){"use strict";Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"keyFn",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"fieldText",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"rawField",{enumerable:!0,get:function(){return c}}),Object.defineProperty(g,"cardSpecs",{enumerable:!0,get:function(){return l}}),Object.defineProperty(g,"deriveColumns",{enumerable:!0,get:function(){return f}}),Object.defineProperty(g,"columnIdOf",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"buildCard",{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(g,"groupRows",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"passesFilter",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"BACKLOG",{enumerable:!0,get:function(){return Re}}),Object.defineProperty(g,"DEFAULT_FILTER",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(g,"rollup",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(g,"laneIdOf",{enumerable:!0,get:function(){return qe}}),Object.defineProperty(g,"computeOrders",{enumerable:!0,get:function(){return tt}}),Object.defineProperty(g,"windowRange",{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(g,"deriveDoneColumns",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(g,"resolveColumnWidth",{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(g,"resolveColumnWidthRange",{enumerable:!0,get:function(){return ft}}),Object.defineProperty(g,"resolveContext",{enumerable:!0,get:function(){return gt}});const v=J("packages/core/src/internal/warn.js").warnOnce,ne=J("packages/core/src/internal/paths.js").getPath,ee=J("packages/core/src/internal/predicates.js"),j=ee.isFunction,u=ee.isNil,O=ee.isObject,E=J("packages/core/src/internal/text.js").humanise,R=J("packages/modules/kanban/card-parts.js"),z=R.assignees,V=R.checklist,X=R.dueState,oe=R.dueText,H=R.dueTimestamp,P=R.progressPercent,I=R.toneOf;function M(b){return j(b)?b:typeof b=="string"?w=>ne(w,b):()=>{}}function p(b){return Array.isArray(b)?"array":b===null?"null":typeof b}function o(b){if(b!==void 0&&typeof b!="function"&&!(typeof b=="string"&&b.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(j(b))return D=>{const Z=b(D);if(typeof Z=="string"||typeof Z=="number"&&Number.isFinite(Z))return Z;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${p(Z)}.`)};const w=typeof b=="string"?b:"id";return D=>ne(D,w)}function s(b,w,D,Z){if(u(Z))return"";if(b.grid&&typeof Z=="string")try{if(b.grid.columns&&b.grid.columns.get&&b.grid.columns.get(Z)){const $e=b.grid.rows.text(D,Z);if(!u($e))return String($e)}}catch{}const _e=M(Z)(w);return u(_e)?"":String(_e)}function c(b,w,D,Z){if(!u(Z)){if(b.grid&&typeof Z=="string")try{if(b.grid.columns&&b.grid.columns.get&&b.grid.columns.get(Z))return b.grid.rows.value(D,Z)}catch{}return M(Z)(w)}}function l(b){const w={};for(const[D,Z]of Object.entries(b))Z&&typeof Z=="object"&&!j(Z)?w[D]={...Z,edit:!!Z.edit,editor:Z.editor}:w[D]={field:Z,edit:!1,editor:void 0};return w}function f(b,w){const D=Array.isArray(b.columns)?b.columns.map(k):[],Z=new Map(D.map(ge=>[ge.id,ge])),_e=[],$e=M(b.columnProperty);for(const ge of w){const fe=$e(ge),me=_(fe);me!==null&&!Z.has(me)&&!_e.includes(me)&&_e.push(me)}let le;if(D.length?le=[...D.map(ge=>ge.id),..._e.filter(ge=>!Z.has(ge))]:le=_e,Array.isArray(b.columnOrder)&&b.columnOrder.length){const ge=b.columnOrder.filter(fe=>le.includes(fe));le=[...ge,...le.filter(fe=>!ge.includes(fe))]}return le.map(ge=>{const fe=Z.get(ge)||{id:ge,title:E(String(ge))},me={id:ge,title:u(fe.title)?E(String(ge)):String(fe.title),color:fe.color??null,wipLimit:Number.isFinite(fe.wipLimit)?fe.wipLimit:null,collapsed:!!fe.collapsed};return Array.isArray(fe.controls)&&(me.controls=fe.controls),Array.isArray(fe.menu)&&(me.menu=fe.menu),me})}function k(b){return typeof b=="string"?{id:b}:O(b)&&!u(b.id)?b:{id:String(b)}}function _(b){return u(b)?null:String(b)}function F(b){return u(b)?!1:typeof b=="string"?b.trim()!=="":typeof b=="number"?b!==0:!!b}function G(b){return typeof b=="string"&&b.trim()!==""?b.trim():""}function Y(b){return u(b)?[]:Array.isArray(b)?b.filter(w=>!u(w)):typeof b=="string"?b.split(",").map(w=>w.trim()).filter(Boolean):[b]}function ye(b,w,D){const Z=w.blockedBy;if(!Z.length)return;const _e=b.doneColumns||new Set,$e=Z.every(le=>{const ge=D.get(le);return!!ge&&ge.columnId!==null&&_e.has(String(ge.columnId))});$e&&!w.explicitBlocked?w.ready=!0:$e||(w.blocked=!0)}function Pe(b,w){const D=b.key(w),Z=_(M(b.columnProperty)(w)),_e=b.pointsProperty?M(b.pointsProperty)(w):void 0,$e=Number(_e),le={};for(const[lt,nt]of Object.entries(b.cardSpecs))le[lt]=s(b,w,D,nt.field);const ge=b.blockedProperty?M(b.blockedProperty)(w):void 0,fe=b.blockedByProperty?M(b.blockedByProperty)(w):void 0,me=F(ge),pe=b.cardSpecs.assignee,ze=b.cardSpecs.due,Se=b.cardSpecs.progress,He=b.cardSpecs.checklist;let pt=null;if(ze){const lt=H(c(b,w,D,ze.field));pt={text:oe(ze.format,lt,le.due||"",w,ze.locale),ts:lt,state:X(lt,Date.now(),ze.dueSoon)}}let at=null;if(He){const lt=He.field!=null?c(b,w,D,He.field):c(b,w,D,He.done),nt=He.field!=null?void 0:c(b,w,D,He.total);at=V(lt,nt)}const wt={};if(b.cardSpecs.labels&&b.cardSpecs.labels.tone&&le.labels)for(const lt of String(le.labels).split(",").map(nt=>nt.trim()).filter(Boolean)){const nt=I(b.cardSpecs.labels.tone,lt,w);nt&&(wt[lt]=nt)}const yt=b.cardSpecs.badges;return{key:D,row:w,columnId:Z,labelTones:wt,badgeTone:yt&&le.badges?I(yt.tone,le.badges,w):null,points:Number.isFinite($e)?$e:0,hasPoints:Number.isFinite($e),swimlane:b.swimlaneProperty?M(b.swimlaneProperty)(w):void 0,sprint:b.sprintProperty?M(b.sprintProperty)(w):void 0,epic:b.epicProperty?M(b.epicProperty)(w):void 0,order:b.orderProperty?M(b.orderProperty)(w):void 0,explicitBlocked:me,blocked:me,blockedReason:G(ge),blockedBy:Y(fe),ready:!1,fields:le,assignees:z(pe?c(b,w,D,pe.field):void 0),due:pt,progressPct:Se?P(c(b,w,D,Se.field)):null,checklist:at}}function A(b,w,D={}){const Z=re(f(b,w),D),_e=new Map(Z.map(Se=>[Se.id,{...Se,cards:[],points:0}])),$e=new Map,le=[];let ge=0;const fe=w.map(Se=>Pe(b,Se)),me=new Map(fe.map(Se=>[Se.key,Se]));for(const Se of fe)ye(b,Se,me);for(const Se of fe){if(!ve(b,Se,D)){ge+=1;continue}$e.set(Se.key,Se);const He=Se.columnId===null?null:_e.get(Se.columnId);if(!He){le.push(Se);continue}He.cards.push(Se)}for(const Se of _e.values())ce(b,Se);le.length&&v(`kanban:unplaced:${b.columnProperty}`,`${le.length} card(s) have a "${b.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const pe=[..._e.values()],ze=b.swimlanes?xe(b,pe,$e,D):null;return{columns:pe,lanes:ze,cardsByKey:$e,unplaced:le,filtered:ge}}function re(b,w){let D=b;if(Array.isArray(w.columnOrder)&&w.columnOrder.length){const _e=new Map(w.columnOrder.map(($e,le)=>[$e,le]));D=[...b].sort(($e,le)=>{const ge=_e.has($e.id)?_e.get($e.id):Number.MAX_SAFE_INTEGER,fe=_e.has(le.id)?_e.get(le.id):Number.MAX_SAFE_INTEGER;return ge-fe})}const Z=w.collapsedColumns;return D.map(_e=>({..._e,collapsed:_e.collapsed||!!(Z&&Z.has(_e.id))}))}function ce(b,w){if(b.orderProperty&&w.cards.sort((D,Z)=>Ze(D.order)-Ze(Z.order)),b.order)try{w.cards=[...w.cards].sort((D,Z)=>b.order(D,Z,w))}catch(D){v("kanban:order:throws",`the "order" comparator threw (${D&&D.message?D.message:D}); the column keeps its pre-comparator order.`)}w.count=w.cards.length,w.points=w.cards.reduce((D,Z)=>D+(Z.hasPoints?Z.points:0),0),w.over=w.wipLimit!==null&&w.count>w.wipLimit}function ve(b,w,D){if(D.filters&&D.filters.size){for(const le of D.filters.values())if(j(le)&&!le(w.row,w))return!1}if(D.blockedFilter&&!w.blocked||!Q(b,w,D)||!te(b,w,D))return!1;const Z=typeof D.quickFilter=="string"?D.quickFilter.trim().toLowerCase():"";if(!Z)return!0;const _e=(w.assignees||[]).map(le=>le.name).join(" ");return`${Object.values(w.fields).join(" ")} ${_e}`.toLowerCase().includes(Z)||String(w.columnId).toLowerCase().includes(Z)}const Re="\0backlog",Ne="\0default";function Q(b,w,D){if(D.sprint===void 0||!b.sprintProperty)return!0;const Z=M(b.sprintProperty)(w.row);return D.sprint===Re?u(Z)||Z==="":String(Z)===String(D.sprint)}function te(b,w,D){return D.epic===void 0||!b.epicProperty?!0:String(M(b.epicProperty)(w.row))===String(D.epic)}function ie(b,w,D,Z){const _e=M(D),$e=b.pointsProperty?M(b.pointsProperty):()=>0,le=new Map;for(const fe of w){const me=_e(fe),pe=u(me)?"":String(me);let ze=le.get(pe);ze||(ze={value:me,count:0,points:0,doneCount:0,donePoints:0,progress:0},le.set(pe,ze));const Se=Number($e(fe)),He=Number.isFinite(Se)?Se:0;ze.count+=1,ze.points+=He,j(Z)&&Z(fe)&&(ze.doneCount+=1,ze.donePoints+=He)}const ge=[...le.values()];for(const fe of ge){const me=fe.points||fe.count||1,pe=fe.points?fe.donePoints:fe.doneCount;fe.progress=Math.round(pe/me*1e3)/1e3}return ge.sort((fe,me)=>me.points-fe.points||me.count-fe.count)}function qe(b){return u(b)?"":String(b)}function xe(b,w,D,Z){const _e=M(b.swimlaneProperty),$e=Array.isArray(b.lanes)?b.lanes.map(me=>typeof me=="string"?{id:me}:me):[],le=new Map($e.map(me=>[me.id,me]));let ge=$e.map(me=>me.id);for(const me of D.values()){const pe=qe(_e(me.row));!le.has(pe)&&!ge.includes(pe)&&ge.push(pe)}if(Array.isArray(Z.laneOrder)&&Z.laneOrder.length){const me=Z.laneOrder.filter(pe=>ge.includes(pe));ge=[...me,...ge.filter(pe=>!me.includes(pe))]}const fe=Z.collapsedLanes;return ge.map(me=>{const pe=le.get(me)||{id:me},ze=w.map(Se=>{const He=Se.cards.filter(pt=>qe(_e(pt.row))===me);return{id:Se.id,title:Se.title,cards:He,count:He.length,points:He.reduce((pt,at)=>pt+(at.hasPoints?at.points:0),0)}});return{id:me,title:u(pe.title)?me===""?"":E(me):String(pe.title),collapsed:!!(fe&&fe.has(me)),columns:ze,count:ze.reduce((Se,He)=>Se+He.count,0),points:ze.reduce((Se,He)=>Se+He.points,0)}})}function Ze(b){const w=Number(b);return Number.isFinite(w)?w:Number.POSITIVE_INFINITY}function tt(b,w,D){const Z=Math.max(0,Math.min(w,b.length)),_e=Z>0?Number(b[Z-1]):null,$e=Z<b.length?Number(b[Z]):null,le=[],ge=_e!==null&&Number.isFinite(_e),fe=$e!==null&&Number.isFinite($e);if(!ge&&!fe){for(let pe=0;pe<D;pe++)le.push(pe);return le}if(!ge){for(let pe=0;pe<D;pe++)le.push($e-(D-pe));return le}if(!fe){for(let pe=0;pe<D;pe++)le.push(_e+1+pe);return le}const me=($e-_e)/(D+1);for(let pe=0;pe<D;pe++)le.push(_e+me*(pe+1));return le}function Ve(b,w,D,Z,_e=3){const $e=D>0?D:1,le=Math.max(0,Math.floor(b/$e)-_e),ge=Math.ceil(w/$e)+_e*2,fe=Math.min(Z,le+ge);return{start:le,end:fe,padTop:le*$e,padBottom:Math.max(0,(Z-fe)*$e)}}function Ie(b,w){return new Set([...Array.isArray(b)?b.map(String):[],...Array.isArray(w)?w.filter(D=>O(D)&&D.done).map(D=>String(D.id)):[]])}function Fe(b){return typeof b=="number"&&Number.isFinite(b)&&b>0?b:b==="auto"?"auto":"fill"}function ft(b){const w=O(b)?b:{},D=Number.isFinite(w.minColumnWidth)&&w.minColumnWidth>0?w.minColumnWidth:240;let Z=Number.isFinite(w.maxColumnWidth)&&w.maxColumnWidth>0?w.maxColumnWidth:0;return Z&&Z<D&&(v("kanban:min-max-column-width",`"minColumnWidth" (${D}) is greater than "maxColumnWidth" (${Z}); the minimum wins, and both resolve to ${D}.`),Z=D),{minColumnWidth:D,maxColumnWidth:Z}}function gt(b){const w=O(b)?b:{};return u(w.columnProperty)&&!w.grid&&!Array.isArray(w.columns)&&v("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:w.grid||null,source:w.source||null,pageSize:Number.isFinite(w.pageSize)&&w.pageSize>0?w.pageSize:50,key:o(w.rowKey??"id"),rowKey:w.rowKey??"id",columnProperty:w.columnProperty??null,columns:w.columns??null,columnOrder:w.columnOrder??null,pointsProperty:w.pointsProperty??null,orderProperty:w.orderProperty??null,order:j(w.order)?w.order:null,swimlaneProperty:w.swimlaneProperty??null,sprintProperty:w.sprintProperty??null,epicProperty:w.epicProperty??null,blockedProperty:w.blockedProperty??null,blockedByProperty:w.blockedByProperty??null,enforceWip:!!w.enforceWip,sprintList:Array.isArray(w.sprints)?w.sprints.map(D=>O(D)?{id:D.id,title:D.title}:{id:D}):null,swimlanes:!!w.swimlanes,lanes:Array.isArray(w.lanes)?w.lanes:null,doneColumns:Ie(w.doneColumns,w.columns),transitions:O(w.transitions)?w.transitions:null,require:O(w.require)?w.require:null,laneRules:new Map((Array.isArray(w.lanes)?w.lanes:[]).filter(D=>O(D)&&(O(D.transitions)||O(D.require))).map(D=>[String(D.id),{transitions:D.transitions,require:D.require}])),showPoints:!!w.showPoints,density:w.density==="compact"?"compact":"comfortable",columnWidth:Fe(w.columnWidth),...ft(w),card:O(w.card)?w.card:{},cardSpecs:l(O(w.card)?w.card:{}),emptyText:typeof w.emptyText=="string"?w.emptyText:"",virtualize:w.virtualize?{rowHeight:O(w.virtualize)&&w.virtualize.rowHeight||96,overscan:O(w.virtualize)&&w.virtualize.overscan||3,threshold:O(w.virtualize)&&w.virtualize.threshold||50,viewport:O(w.virtualize)&&w.virtualize.viewport||600}:null}}}),Ue("packages/modules/kanban/styles.js",function(g,J){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"css",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return ne}});const a="lat-kanban",v="data-lattice-kanban-styles";function x(){return`
7
7
  @layer lattice {
8
8
  .${a}{
9
9
  --lattice-kanban-column-bg:var(--lattice-surface);
@@ -90,7 +90,10 @@ var Ot=Object.create(null),Et=Object.create(null);function Ge(h,J){Ot[h]=J}funct
90
90
  color:var(--lattice-kanban-column-header-fg);
91
91
  font-weight:var(--lattice-header-font-weight);
92
92
  }
93
+ /* An inline span ignores width/height, so the dot needs its own box to paint
94
+ the 8px round accent (BACKLOG-0005656); the 6px gap matches the header's. */
93
95
  .${a}__accent{
96
+ display:inline-block; margin-right:6px;
94
97
  width:8px; height:8px; border-radius:50%; flex:0 0 auto;
95
98
  background:var(--lattice-accent);
96
99
  }
@@ -509,7 +512,7 @@ select.${a}__select:focus-visible{
509
512
  @media (prefers-color-scheme:dark){@scope ([data-theme="auto"]){:scope.${a},.${a}{
510
513
  --lattice-kanban-card-shadow:0 1px 2px rgba(0,0,0,.45),0 1px 1px rgba(0,0,0,.3);
511
514
  }}}
512
- `.trim()}function ne(ee){const j=ee&&ee.documentElement;if(!j||j.getAttribute(v))return;j.setAttribute(v,"1");const u=ee.createElement("style");u.textContent=x(),(ee.head||ee.body||j).appendChild(u)}}),Ge("packages/modules/kanban/controls.js",function(h,J){"use strict";Object.defineProperty(h,"resolveControls",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"resolveColumnMenu",{enumerable:!0,get:function(){return u}}),Object.defineProperty(h,"activateControl",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"buildControl",{enumerable:!0,get:function(){return H}}),Object.defineProperty(h,"buildControlStrip",{enumerable:!0,get:function(){return O}}),Object.defineProperty(h,"destroyControls",{enumerable:!0,get:function(){return I}}),Object.defineProperty(h,"controlValue",{enumerable:!0,get:function(){return F}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ee=J("packages/modules/kanban/styles.js").NS;function j(m,o){if(Array.isArray(o.controls))return o.controls;const s=m.config.columnControls;if(!v(s))return[];const c=s(o);return Array.isArray(c)?c:[]}function u(m,o){if(Array.isArray(o.menu))return o.menu;const s=m.config.columnMenu;if(Array.isArray(s))return s;if(!v(s))return[];const c=s(o);return Array.isArray(c)?c:[]}const P=(m,o)=>`${m}\0${o}`;function K(m){return m._controlValues||(m._controlValues=new Map),m._controlValues}function E(m,o,s){const c=K(m),l=P(o,s.id);return c.has(l)?c.get(l):s.value}function R(m){return m&&typeof m=="object"?x(m.value)?m.label:m.value:m}function z(m){return String(m&&typeof m=="object"?x(m.label)?R(m):m.label:m)}function V(m,o,s){v(o.action)&&o.action(s),m.fire("column:control",{...s,controlType:s.type})}function X(m,o,s){const c=m.doc.createElement("button");return c.className=`${ee}__ctl-btn`,c.setAttribute("type","button"),c.textContent=s.label==null?"":String(s.label),s.disabled&&(c.disabled=!0),c.addEventListener("click",l=>{s.disabled||V(m,s,{column:o.id,control:s.id,type:"button",value:void 0,el:c,originalEvent:l})}),c}function oe(m,o,s,c,l){const{doc:p}=m,k=Array.isArray(s.options)?s.options:[],$=E(m,o.id,s),L=K(m),U=(A,re,ce)=>{L.set(P(o.id,s.id),A),V(m,s,{column:o.id,control:s.id,type:"select",value:A,el:ce,originalEvent:re})},Y=m.config.form;if(Y&&v(Y.createSelect)){const A=p.createElement("div");A.className=`${ee}__select`,c.appendChild(A);const re=Y.createSelect(A,{options:k,value:$,placeholder:s.placeholder,ariaLabel:s.ariaLabel,disabled:!!s.disabled,t:l,doc:p});c.__handle=re,(m._controlHandles||(m._controlHandles=[])).push(re),A.addEventListener("change",ce=>{U(re.getValue(),ce,A)});return}const be=p.createElement("select");if(be.className=`${ee}__select`,s.ariaLabel&&be.setAttribute("aria-label",s.ariaLabel),s.disabled&&(be.disabled=!0),s.placeholder!=null){const A=p.createElement("option");A.value="",A.textContent=String(s.placeholder),A.disabled=!0,be.appendChild(A)}k.forEach((A,re)=>{const ce=p.createElement("option");ce.value=String(re),ce.textContent=z(A),be.appendChild(ce)});const Oe=k.findIndex(A=>!x($)&&String(R(A))===String($));be.value=Oe>=0?String(Oe):"",be.addEventListener("change",A=>{const re=be.value===""?void 0:R(k[Number(be.value)]);U(re,A,be)}),c.appendChild(be)}function H(m,o,s,c){const l=m.doc.createElement("div");if(l.className=`${ee}__control`,l.dataset.control=String(s.id),l.dataset.type=String(s.type),s.type==="button")l.appendChild(X(m,o,s));else if(s.type==="select")oe(m,o,s,l,c);else if(s.type==="custom"&&v(s.render)){const p=s.render(o,l);p&&p.nodeType===1&&p.parentNode!==l&&l.appendChild(p)}return l}function O(m,o,s){if(o.collapsed)return null;const c=j(m,o).filter(p=>p&&!x(p.id));if(!c.length)return null;const l=m.doc.createElement("div");l.className=`${ee}__controls`,l.setAttribute("role","group"),l.dataset.column=o.id;for(const p of c)l.appendChild(H(m,o,p,s));return l}function I(m){const o=m._controlHandles;if(m._controlHandles=[],!!o)for(const s of o)s&&v(s.destroy)&&s.destroy()}function F(m,o,s,c,l){const p=(m.model.columns||[]).find(L=>L.id===o),k=p?j(m,p).find(L=>L&&L.id===s):null;if(!c.length)return k?E(m,o,k):void 0;if(K(m).set(P(o,s),c[0]),!m.el||!p||!k)return m;const $=`.${ee}__controls[data-column="${String(o).replace(/["\\]/g,"\\$&")}"] > .${ee}__control`;for(const L of m.el.querySelectorAll($)){if(L.dataset.control!==String(s))continue;const U=L.__handle;U&&(m._controlHandles=(m._controlHandles||[]).filter(Y=>Y!==U),v(U.destroy)&&U.destroy()),L.parentNode.replaceChild(H(m,p,k,l),L)}return m}}),Ge("packages/modules/kanban/workflow.js",function(h,J){"use strict";Object.defineProperty(h,"TRANSITIONS_WILDCARD",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"allowedTargets",{enumerable:!0,get:function(){return P}}),Object.defineProperty(h,"laneRulesFor",{enumerable:!0,get:function(){return K}}),Object.defineProperty(h,"transitionRuleFor",{enumerable:!0,get:function(){return E}}),Object.defineProperty(h,"canMove",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"transitionError",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"requiredFor",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"missingRequired",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(h,"requiredError",{enumerable:!0,get:function(){return H}});const a=J("packages/core/src/internal/predicates.js"),v=a.isObject,x=a.isNil,ee=J("packages/core/src/internal/paths.js").getPath,j="*";function u(O,I){return Object.prototype.hasOwnProperty.call(O,I)}function P(O){return O===j||x(O)?null:Array.isArray(O)?new Set(O.map(String)):null}function K(O,I){const F=O.laneRules&&O.laneRules.get(String(I??""))||{};return{transitions:v(F.transitions)?F.transitions:null,require:v(F.require)?F.require:null}}function E(O,I,F){if(F==null)return null;const m=K(O,I);return m.transitions&&u(m.transitions,F)?m.transitions[F]:O.transitions&&u(O.transitions,F)?O.transitions[F]:null}function R(O,I,F,m){if(F==null||String(F)===String(m))return!0;const o=P(E(O,I,F));return o===null?!0:o.has(String(m))}function z(O,I,F,m){const o=P(E(O,I,F)),s=o?[...o]:[];return`kanban.transition: a card in "${F}" cannot move to "${m}"`+(s.length?` — "${F}" allows ${s.map(c=>`"${c}"`).join(", ")}`:" — no column is allowed")}function V(O){return!v(O)||typeof O.field!="string"||O.field===""?null:{field:O.field,label:typeof O.label=="string"?O.label:void 0,editor:typeof O.editor=="function"?O.editor:void 0}}function X(O,I,F){const m=K(O,I),o=m.require&&u(m.require,F)?m.require[F]:O.require&&u(O.require,F)?O.require[F]:null;return Array.isArray(o)?o.map(V).filter(Boolean):[]}function oe(O,I,F,m){return X(O,I,F).filter(o=>{const s=ee(m,o.field);return x(s)||s===""})}function H(O,I,F,m){const o=m.map(s=>s.field).join(", ");return`kanban.require: moving into "${F}" requires ${o}.`}}),Ge("packages/modules/shared/drag-gesture.js",function(h,J){"use strict";Object.defineProperty(h,"attachDragGesture",{enumerable:!0,get:function(){return ee}});const a=300,v=3,x=24,ne=12;function ee(j,u={}){const P=u.holdMs==null?a:u.holdMs,K=typeof u.canStart=="function"?u.canStart:null,E=typeof u.onStart=="function"?u.onStart:null,R=typeof u.onMove=="function"?u.onMove:null,z=typeof u.onEnd=="function"?u.onEnd:null,V=typeof u.onCancel=="function"?u.onCancel:null,X=typeof u.autoScroll=="function"?u.autoScroll:null,oe=Array.isArray(u.autoScroll)?u.autoScroll:[],H=j&&j.ownerDocument?j.ownerDocument:j;if(!j||!H||typeof j.addEventListener!="function")return()=>{};let O=null;function I(A,re,ce,ke,Re){if(ce>=A&&ce<A+x&&ke>0){const Ne=x-(ce-A);return-Math.max(1,Math.round(ne*Ne/x))}if(ce>re-x&&ce<=re&&ke<Re){const Ne=x-(re-ce);return Math.max(1,Math.round(ne*Ne/x))}return 0}function F(){const A=O;if(A){if(O=null,A.holdTimer&&clearTimeout(A.holdTimer),Oe(A),A.started&&A.pressed&&A.pressed.style&&(A.pressed.style.touchAction=A.prevTouchAction),A.pressed&&typeof A.pressed.releasePointerCapture=="function"&&A.pointerId!==void 0)try{A.pressed.releasePointerCapture(A.pointerId)}catch{}H.removeEventListener("pointermove",l),H.removeEventListener("pointerup",k),H.removeEventListener("pointercancel",$),H.removeEventListener("keydown",L),H.removeEventListener("pointerdown",U),H.removeEventListener("touchmove",p)}}function m(A){if(!A.started){if(A.started=!0,A.pressed&&A.pressed.style&&(A.prevTouchAction=A.pressed.style.touchAction||"",A.pressed.style.touchAction="none"),A.pressed&&typeof A.pressed.setPointerCapture=="function"&&A.pointerId!==void 0)try{A.pressed.setPointerCapture(A.pointerId)}catch{}E&&E(A.drag,A.downEvent),be(A)}}function o(A,re){const ce=A.started;F(),ce&&z&&z(A.drag,re)}function s(A,re){const ce=A.started;F(),ce&&V&&V(A.drag,re)}function c(){const A=O;A&&!A.started&&m(A)}function l(A){const re=O;if(!re||A.pointerId!==void 0&&A.pointerId!==re.pointerId)return;const ce=typeof A.clientX=="number"?A.clientX:re.lastX,ke=typeof A.clientY=="number"?A.clientY:re.lastY;if(re.lastX=ce,re.lastY=ke,re.lastEvent=A,!re.started){if(Math.hypot(ce-re.startX,ke-re.startY)<=v)return;if(re.pointerType==="mouse")m(re);else{F();return}}R&&R(re.drag,A)}function p(A){O&&O.started&&typeof A.preventDefault=="function"&&A.preventDefault()}function k(A){const re=O;re&&(A.pointerId!==void 0&&A.pointerId!==re.pointerId||o(re,A))}function $(A){const re=O;re&&(A.pointerId!==void 0&&A.pointerId!==re.pointerId||s(re,A))}function L(A){O&&A.key==="Escape"&&s(O,A)}function U(A){const re=O;re&&A.pointerId!==void 0&&A.pointerId!==re.pointerId&&s(re,A)}function Y(A){if(A.button!=null&&A.button!==0||O)return;const re=K?K(A):A.target||null;if(!re)return;const ce=typeof A.clientX=="number"?A.clientX:0,ke=typeof A.clientY=="number"?A.clientY:0,Re=A.pointerId,Ne=A.pointerType||"mouse";O={drag:{el:re,pointerId:Re,pointerType:Ne,startX:ce,startY:ke,lastX:ce,lastY:ke},pressed:re,pointerId:Re,pointerType:Ne,startX:ce,startY:ke,lastX:ce,lastY:ke,started:!1,downEvent:A,lastEvent:A,holdTimer:null,prevTouchAction:"",frameId:null},Ne!=="mouse"&&(O.holdTimer=setTimeout(c,P)),H.addEventListener("pointermove",l),H.addEventListener("pointerup",k),H.addEventListener("pointercancel",$),H.addEventListener("keydown",L),H.addEventListener("pointerdown",U),Ne==="touch"&&H.addEventListener("touchmove",p,{passive:!1})}function be(A){if(typeof requestAnimationFrame!="function"||!X&&!oe.length)return;function re(){const ce=O;if(!ce||ce!==A||!ce.started){A.frameId=null;return}const ke=X?X():oe;let Re=!1;if(Array.isArray(ke))for(const Ne of ke){if(!Ne||typeof Ne.getBoundingClientRect!="function")continue;const Q=Ne.getBoundingClientRect(),te=I(Q.left,Q.right,ce.lastX,Ne.scrollLeft,Ne.scrollWidth-Ne.clientWidth),ie=I(Q.top,Q.bottom,ce.lastY,Ne.scrollTop,Ne.scrollHeight-Ne.clientHeight);te&&(Ne.scrollLeft+=te,Re=!0),ie&&(Ne.scrollTop+=ie,Re=!0)}Re&&R&&ce.lastEvent&&R(ce.drag,ce.lastEvent),A.frameId=requestAnimationFrame(re)}A.frameId=requestAnimationFrame(re)}function Oe(A){A.frameId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(A.frameId),A.frameId=null}return j.addEventListener("pointerdown",Y),()=>{F(),j.removeEventListener("pointerdown",Y)}}}),Ge("packages/modules/shared/token-scope.js",function(h,J){"use strict";Object.defineProperty(h,"claimTokenScope",{enumerable:!0,get:function(){return v}});const a="lattice-tokens";function v(x,ne){const ee=ne||x.parentElement,j=x.classList.contains(a)||!!(ee&&ee.closest&&ee.closest(".lattice, .lattice-tokens"));return j||x.classList.add(a),()=>{j||x.classList.remove(a)}}}),Ge("packages/modules/shared/emitter.js",function(h,J){"use strict";Object.defineProperty(h,"WILDCARD",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"Emitter",{enumerable:!0,get:function(){return P}}),Object.defineProperty(h,"gate",{enumerable:!0,get:function(){return K}});const v=J("packages/core/src/internal/predicates.js").isFunction,ne=J("packages/core/src/internal/warn.js").warnOnce,ee="*",j=new Set(["api","user","init","ai"]);function u(E,R){return E&&E.name?E.name:`#${R}`}class P{#t=new Map;#e;constructor(R="module"){this.#e=String(R)}on(R,z){if(!v(z))return()=>{};let V=this.#t.get(R);return V||(V=new Set,this.#t.set(R,V)),V.add(z),()=>this.off(R,z)}off(R,z){const V=this.#t.get(R);V&&V.delete(z)}count(R){const z=this.#t.get(R);return z?z.size:0}emit(R,z){const V=this.#t.get(R),X=this.#t.get(ee);if((!V||V.size===0)&&(!X||X.size===0))return;const oe={...z||null,type:R};V&&V.size&&this.#n([...V],oe,R),X&&X.size&&this.#n([...X],oe,ee)}#n(R,z,V){for(let X=0;X<R.length;X++)try{R[X](z)}catch(oe){ne(`${this.#e}.emit.throw:${V}:${u(R[X],X)}`,`${this.#e}: a '${V}' handler threw; other handlers were unaffected.`,oe)}}emitBefore(R,z,V){const X=V??(z&&z.origin),oe=j.has(X)?X:"user";let H=!1,O=null;const I=l=>{H=!0,l!=null&&O===null&&(O=String(l))},F={...z||null,type:R,origin:oe,get defaultPrevented(){return H},get reason(){return O},preventDefault(l){I(l)}},m=this.#t.get(R);if(!m||m.size===0)return!0;const o=[...m],s=()=>(H&&O===null&&(O="prevented"),H&&z&&typeof z=="object"&&(z.reason=O),!H),c=[];for(let l=0;l<o.length;l++){const p=o[l];try{const k=p(F);k&&v(k.then)?c.push(k):k===!1&&I("prevented")}catch(k){I("error"),ne(`${this.#e}.beforeThrow:${R}:${u(p,l)}`,`${this.#e}: a '${R}' before-handler threw; the action was cancelled.`,k)}}return c.length===0?s():Promise.allSettled(c).then(l=>{for(const p of l)p.status==="rejected"?(I("error"),ne(`${this.#e}.beforeReject:${R}`,`${this.#e}: a '${R}' before-handler rejected; the action was cancelled.`,p.reason)):p.value===!1&&I("prevented");return s()})}clear(){this.#t.clear()}}function K(E,R,z,V,X){const oe=E.emitBefore(R,V,V.origin),H=()=>(E.emit(z,{...V,reason:V.reason||"prevented"}),!1);return oe===!1?H():oe&&v(oe.then)?oe.then(O=>O?X():H()):X()}}),Ge("packages/modules/kanban/view.js",function(h,J){"use strict";Object.defineProperty(h,"FALLBACK_EN",{enumerable:!0,get:function(){return k}}),Object.defineProperty(h,"resolveReadonly",{enumerable:!0,get:function(){return U}}),Object.defineProperty(h,"boardT",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(h,"renderPreserving",{enumerable:!0,get:function(){return Qe}}),Object.defineProperty(h,"applyColumnWidths",{enumerable:!0,get:function(){return mt}}),Object.defineProperty(h,"renderBoard",{enumerable:!0,get:function(){return b}}),Object.defineProperty(h,"openDetail",{enumerable:!0,get:function(){return D}}),Object.defineProperty(h,"closeDetail",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(h,"startEdit",{enumerable:!0,get:function(){return $e}}),Object.defineProperty(h,"installSelectionPainter",{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(h,"openRequiredForm",{enumerable:!0,get:function(){return Be}}),Object.defineProperty(h,"closeRequiredForm",{enumerable:!0,get:function(){return _e}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ee=J("packages/core/src/internal/text.js").escapeHtml,j=J("packages/modules/kanban/styles.js"),u=j.NS,P=j.injectStyles,E=J("packages/modules/kanban/card-parts.js").avatarChip,R=J("packages/modules/kanban/controls.js"),z=R.buildControlStrip,V=R.resolveControls,X=R.resolveColumnMenu,oe=R.destroyControls,H=J("packages/modules/kanban/model.js"),O=H.windowRange,I=H.laneIdOf,m=J("packages/modules/kanban/workflow.js").canMove,s=J("packages/modules/shared/drag-gesture.js").attachDragGesture,l=J("packages/modules/shared/token-scope.js").claimTokenScope,p=J("packages/modules/shared/emitter.js");Object.defineProperty(h,"Emitter",{enumerable:!0,get:function(){return p.Emitter}});const k=Object.freeze({"kanban.board":"Board","kanban.columnMenu":"Column menu","kanban.columnCards":{one:"{title}, {count} card",other:"{title}, {count} cards"},"kanban.laneCards":{one:"{lane}, {title}, {count} card",other:"{lane}, {title}, {count} cards"},"kanban.blocked":"Blocked","kanban.ready":"Ready","kanban.blockedBy":{one:"blocked by {count} card",other:"blocked by {count} cards"},"kanban.card.assignedTo":"Assigned to {names}","kanban.card.overdue":"Overdue","kanban.card.dueSoon":"Due soon","kanban.card.progress":"{percent}% complete","kanban.card.checklist":"{done} of {total} done","kanban.requiredTitle":"Required fields","kanban.requiredSave":"Save","kanban.requiredCancel":"Cancel","kanban.moveRefused":'Move refused: a card in "{from}" cannot move to "{to}".'});function $(e,t){const i=k[e];if(!i)return e;const g=t&&typeof t.count=="number"?t.count:NaN;return(typeof i=="string"?i:(g===1?i.one:i.other)||i.other).replace(/\{(\w+)\}/g,(y,M)=>t&&M in t?String(t[M]):y)}function L(e,t,i){const g=e&&e.config?e.config:{},f=g.messages&&v(g.messages.t)&&g.messages||g.grid&&g.grid.messages&&v(g.grid.messages.t)&&g.grid.messages||null;if(f){let y;try{y=f.t(t,i)}catch{y=null}if(typeof y=="string"&&y&&y!==t)return y}return $(t,i)}function U(e){if(e===!0)return()=>!0;if(!e||typeof e!="object")return()=>!1;const t=e.columns||{},i=e.cards||{};return({column:g,card:f}={})=>e.board===!0||!x(g)&&t[g]===!0||!x(f)&&i[f]===!0}function Y(e,t,i,g,f,y=null){let C=`${t.fields.title||String(t.key)}, ${i.title}, ${g+1} of ${f}`;return t.assignees&&t.assignees.length&&(C+=`, ${L(e,"kanban.card.assignedTo",{names:t.assignees.map(S=>S.name).join(", ")})}`),t.due&&t.due.state&&(C+=`, ${L(e,t.due.state==="overdue"?"kanban.card.overdue":"kanban.card.dueSoon")}`),t.progressPct!==null&&t.progressPct!==void 0&&(C+=`, ${L(e,"kanban.card.progress",{percent:t.progressPct})}`),t.checklist&&t.checklist.total>0&&(C+=`, ${L(e,"kanban.card.checklist",{done:t.checklist.done,total:t.checklist.total})}`),y&&(y.level==="warn"||y.level==="breach")?`${C}, ${y.level==="breach"?"SLA breached":"ageing"}, age ${y.ageText}`:C}function be(e){return e.level==="breach"?`SLA breached — age ${e.ageText} (limit passed)`:e.level==="warn"?`Ageing — age ${e.ageText}`:`Age ${e.ageText}`}function Oe(e,t,i,g){const{ctx:f,doc:y,isReadonly:M}=e,C=y.createElement("li");C.className=`${u}__card`,C.setAttribute("role","listitem"),C.setAttribute("tabindex","-1"),C.setAttribute("data-key",String(t.key)),C.dataset.column=i.id;const S=e.sla&&v(e.sla.stateFor)?e.sla.stateFor(t):null;S&&S.level&&S.level!=="ok"&&(C.dataset.sla=S.level),t.blocked&&(C.dataset.blocked="true"),t.ready&&(C.dataset.ready="true"),C.setAttribute("aria-label",Y(e,t,i,g,i.count,S)),C.setAttribute("aria-selected","false");const B=M({column:i.id,card:t.key});B&&C.setAttribute("aria-readonly","true");const ue=t.fields.accent;!x(ue)&&ue!==""&&(C.dataset.accent="",C.style.borderLeftColor=String(ue));const de=e.config.cardRenderer;if(v(de)){C.dataset.custom="true";const q=de(t,{column:i,readonly:B,el:C,doc:y});return typeof q=="string"?C.innerHTML=q:q&&q.nodeType&&C.appendChild(q),C}const pe=[];!x(t.fields.cover)&&t.fields.cover!==""&&pe.push(`<div class="${u}__cover" style="background-image:url(${ee(String(t.fields.cover))})" role="presentation"></div>`),t.fields.title&&pe.push(`<div class="${u}__card-title">${ee(t.fields.title)}</div>`),t.fields.subtitle&&pe.push(`<div class="${u}__card-subtitle">${ee(t.fields.subtitle)}</div>`),t.progressPct!==null&&t.progressPct!==void 0&&pe.push(`<div class="${u}__progress" role="progressbar" aria-valuenow="${t.progressPct}" aria-valuemin="0" aria-valuemax="100"><span class="${u}__progress-bar" style="width:${t.progressPct}%"></span></div>`),t.checklist&&pe.push(`<div class="${u}__checklist"><span class="${u}__checklist-done">${t.checklist.done}</span><span class="${u}__checklist-sep">/</span><span class="${u}__checklist-total">${t.checklist.total}</span></div>`),C.innerHTML=pe.join("");const le=[],Ee=t.assignees||[];if(Ee.length){const q=f.cardSpecs.assignee||{},he=Number.isFinite(q.max)&&q.max>0?q.max:2,Le=Ee.slice(0,he),Xe=y.createElement("span");Xe.className=`${u}__avatars`;for(const d of Le)Xe.appendChild(E(y,d));const n=Ee.length-Le.length;if(n>0){const d=y.createElement("span");d.className=`${u}__avatar ${u}__avatar--overflow`,d.textContent=`+${n}`,d.setAttribute("title",Ee.slice(he).map(_=>_.name).join(", ")),Xe.appendChild(d)}le.push(Xe)}if(t.fields.labels)for(const q of String(t.fields.labels).split(",").map(he=>he.trim()).filter(Boolean)){const he=y.createElement("span");he.className=`${u}__label`,he.textContent=q,t.labelTones&&t.labelTones[q]&&(he.dataset.tone=t.labelTones[q]),le.push(he)}if(t.due&&t.due.text){const q=y.createElement("span");if(q.className=`${u}__due`,t.due.state){q.dataset.state=t.due.state;const he=y.createElement("span");he.className=`${u}__due-icon`,he.setAttribute("aria-hidden","true"),he.textContent=t.due.state==="overdue"?"⚠":"◷",q.appendChild(he)}q.appendChild(y.createTextNode(t.due.text)),le.push(q)}if(t.fields.badges){const q=y.createElement("span");q.className=`${u}__badge`,q.textContent=t.fields.badges,t.badgeTone&&(q.dataset.tone=t.badgeTone),le.push(q)}if(f.pointsProperty&&t.hasPoints){const q=y.createElement("span");q.className=`${u}__badge`,q.setAttribute("data-role","points"),q.textContent=String(t.points),le.push(q)}if(S&&S.ageText&&(S.level==="warn"||S.level==="breach"||e.sla.config.showAge==="always"&&S.ageMs!==null)){const q=y.createElement("span");q.className=`${u}__age`,q.setAttribute("data-sla",S.level||""),q.setAttribute("title",be(S)),q.textContent=S.ageText,le.push(q)}if(t.explicitBlocked){const q=t.blockedReason,he=q?`${He(e,"blocked")}: ${q}`:He(e,"blocked"),Le=y.createElement("span");Le.className=`${u}__blocked`,Le.setAttribute("role","img"),Le.setAttribute("aria-label",he);const Xe=y.createElement("span");if(Xe.className=`${u}__blocked-icon`,Xe.setAttribute("aria-hidden","true"),Xe.textContent="⛔",Le.appendChild(Xe),q){const n=y.createElement("span");n.className=`${u}__blocked-reason`,n.textContent=q,Le.appendChild(n)}le.push(Le)}if(t.ready){const q=y.createElement("span");q.className=`${u}__ready`,q.setAttribute("role","img"),q.setAttribute("aria-label",He(e,"ready")),q.textContent=`✓ ${He(e,"ready")}`,le.push(q)}if(le.length){const q=y.createElement("div");q.className=`${u}__card-meta`;for(const he of le)q.appendChild(he);C.appendChild(q)}if(t.blockedBy&&t.blockedBy.length){const q=y.createElement("div");q.className=`${u}__blockedby`,q.setAttribute("role","group"),q.setAttribute("aria-label",L(e,"kanban.blockedBy",{count:t.blockedBy.length}));for(const he of t.blockedBy){const Le=e.model.cardsByKey.get(he),Xe=Le&&Le.fields.title||String(he),n=y.createElement("button");n.type="button",n.className=`${u}__blockedby-chip`,n.dataset.blocker=String(he),n.textContent=Xe,q.appendChild(n)}C.appendChild(q)}return C}function A(e,t){const{ctx:i,doc:g}=e,f=g.createElement("section");f.className=`${u}__column`,f.setAttribute("role","group"),f.dataset.column=t.id,t.collapsed&&(f.dataset.collapsed="true"),t.over&&(f.dataset.over="true");const y=`${u}-h-${Ie(t.id)}`,M=Ne(e,t,y);f.setAttribute("aria-labelledby",y),f.appendChild(M);const C=z(e,t,Q(e));C&&f.appendChild(C);const S=g.createElement("ul");if(S.className=`${u}__cards`,S.dataset.column=t.id,S.setAttribute("role","list"),S.setAttribute("aria-label",L(e,"kanban.columnCards",{title:t.title,count:t.count})),ce(e,S,t.cards,t),f.appendChild(S),e.config.addCard&&!e.isReadonly({column:t.id})){const B=g.createElement("button");B.className=`${u}__add`,B.setAttribute("type","button"),B.dataset.column=t.id;const ue=e.config.labels&&e.config.labels.addCard;B.setAttribute("aria-label",[ue,t.title].filter(Boolean).join(" ")),B.textContent=ue||"+",f.appendChild(B)}return f}function re(e,t,i,g){if(!e.sourceBound||!v(e.loadMore)||t.__loadWired)return;t.__loadWired=!0;const f=()=>{if(t.__loadRaf)return;const y=e.doc.defaultView,M=y&&v(y.requestAnimationFrame)?y.requestAnimationFrame.bind(y):(C=>setTimeout(C,16));t.__loadRaf=M(()=>{t.__loadRaf=0,t.scrollHeight-t.scrollTop-t.clientHeight<Math.max(t.clientHeight,200)*2&&e.loadMore(i.id,g)})};t.addEventListener("scroll",f)}function ce(e,t,i,g,f){const{ctx:y,doc:M}=e;for(;t.firstChild;)t.removeChild(t.firstChild);const C=(B,ue)=>{const de=Oe(e,B,g,ue);f!==void 0&&(de.dataset.lane=f),t.appendChild(de)};if(!i.length){const B=M.createElement("li");B.className=`${u}__empty`,B.setAttribute("role","presentation"),y.emptyText&&(B.textContent=y.emptyText),t.appendChild(B);return}const S=y.virtualize;if(S&&i.length>S.threshold){t.dataset.virtual="true";const B=()=>{const ue=t.clientHeight||S.viewport,de=O(t.scrollTop||0,ue,S.rowHeight,i.length,S.overscan),pe=t.__win;if(!(pe&&pe.start===de.start&&pe.end===de.end&&pe.count===i.length)){for(t.__win={start:de.start,end:de.end,count:i.length};t.firstChild;)t.removeChild(t.firstChild);t.appendChild(Re(M,de.padTop));for(let le=de.start;le<de.end;le++)C(i[le],le);t.appendChild(Re(M,de.padBottom)),v(e.paintSelection)&&e.paintSelection()}};if(t.__win=null,B(),!t.__virtualWired){const ue=()=>{if(t.__raf)return;const de=M.defaultView,pe=de&&v(de.requestAnimationFrame)?de.requestAnimationFrame.bind(de):(le=>setTimeout(le,16));t.__raf=pe(()=>{t.__raf=0,B()})};t.addEventListener("scroll",ue),t.__virtualWired=!0}re(e,t,g,f);return}i.forEach(C),re(e,t,g,f)}function ke(e){const{el:t,doc:i}=e,g=e.status||{};if(!g.loading&&!g.error)return;const f=i.createElement("div");if(f.className=`${u}__status`,g.error)f.dataset.kind="error",f.setAttribute("role","alert"),f.textContent=g.error;else{f.dataset.kind="loading",f.setAttribute("role","status"),f.setAttribute("aria-busy","true");const y=e.config.labels&&e.config.labels.loading;y&&(f.textContent=y)}t.appendChild(f)}function Re(e,t){const i=e.createElement("li");return i.className=`${u}__spacer`,i.setAttribute("role","presentation"),i.style.height=`${t}px`,i}function Ne(e,t,i){const{ctx:g,doc:f}=e,y=f.createElement("div");y.className=`${u}__header`,y.id=i,y.dataset.column=t.id,y.appendChild(ie(t.collapsed,f));const M=f.createElement("span");M.className=`${u}__headcontent`;const C=[];t.color&&C.push(`<span class="${u}__accent" style="background:${ee(String(t.color))}"></span>`),C.push(`<span class="${u}__title">${ee(t.title)}</span>`);const S=t.over?' data-over="true"':"";return C.push(`<span class="${u}__count"${S}>${t.count}${t.wipLimit!==null?`/${t.wipLimit}`:""}</span>`),g.showPoints&&g.pointsProperty&&C.push(`<span class="${u}__points" title="points">${Ye(t.points)}</span>`),M.innerHTML=C.join(""),y.appendChild(M),X(e,t).length&&y.appendChild(te(e,f)),y}function Q(e){return(t,i)=>L(e,t,i)}function te(e,t){const i=t.createElement("button");return i.className=`${u}__menubtn`,i.setAttribute("type","button"),i.setAttribute("aria-haspopup","menu"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",L(e,"kanban.columnMenu")),i.textContent="⋯",i}function ie(e,t){const i=t.createElement("button");return i.className=`${u}__toggle`,i.setAttribute("type","button"),i.setAttribute("tabindex","-1"),i.setAttribute("aria-expanded",e?"false":"true"),i.textContent=e?"▸":"▾",i}function We(e){const{el:t,ctx:i,doc:g}=e;t.dataset.swimlanes="true";const f=e.model.columns,y=g.createElement("div");y.className=`${u}__colheads`,y.style.setProperty("--cols",String(f.length));const M=g.createElement("div");M.className=`${u}__corner`,y.appendChild(M);for(const S of f)y.appendChild(Ne(e,S,`${u}-h-${Ie(S.id)}`));const C=f.map(S=>z(e,S,Q(e)));if(C.some(Boolean)){const S=g.createElement("div");S.className=`${u}__corner`,y.appendChild(S),C.forEach(B=>y.appendChild(B||g.createElement("div")))}t.appendChild(y);for(const S of e.model.lanes){const B=g.createElement("section");B.className=`${u}__lane`,B.dataset.lane=S.id,S.collapsed&&(B.dataset.collapsed="true"),B.setAttribute("role","group");const ue=g.createElement("div");ue.className=`${u}__lanehead`,ue.dataset.lane=S.id,ue.appendChild(ie(S.collapsed,g));const de=g.createElement("span");de.className=`${u}__headcontent`;const pe=i.showPoints&&i.pointsProperty?`<span class="${u}__points">${Ye(S.points)}</span>`:"";if(de.innerHTML=`<span class="${u}__lane-title">${ee(S.title)}</span><span class="${u}__count">${S.count}</span>${pe}`,ue.appendChild(de),B.appendChild(ue),!S.collapsed){const le=g.createElement("div");le.className=`${u}__lanerow`,le.style.setProperty("--cols",String(f.length));const Ee=g.createElement("div");Ee.className=`${u}__corner`,le.appendChild(Ee);for(const q of S.columns){const he=g.createElement("ul");he.className=`${u}__cards`,he.dataset.column=q.id,he.dataset.lane=S.id,he.setAttribute("role","list"),he.setAttribute("aria-label",L(e,"kanban.laneCards",{lane:S.title,title:q.title,count:q.count}));const Le=f.find(Xe=>Xe.id===q.id)||q;ce(e,he,q.cards,Le,S.id),le.appendChild(he)}B.appendChild(le)}t.appendChild(B)}}function je(e){const{el:t,doc:i}=e;if(!t)return null;const g={};for(const y of t.querySelectorAll(`.${u}__cards`))g[`${y.dataset.lane||""}|${y.dataset.column}`]=y.scrollTop;const f=i&&i.activeElement&&i.activeElement.closest?i.activeElement.closest(`.${u}__card`):null;return{boardTop:t.scrollTop,boardLeft:t.scrollLeft,lists:g,focusKey:f?f.dataset.key:null}}function Ze(e,t){const{el:i}=e;if(!(!i||!t)){i.scrollTop=t.boardTop,i.scrollLeft=t.boardLeft;for(const g of i.querySelectorAll(`.${u}__cards`)){const f=`${g.dataset.lane||""}|${g.dataset.column}`;t.lists[f]!==void 0&&(g.scrollTop=t.lists[f])}if(t.focusKey!=null){const g=i.querySelector(`.${u}__card[data-key="${ft(String(t.focusKey))}"]`);g&&(g.setAttribute("tabindex","0"),g.focus&&g.focus())}}}function Qe(e){if(!e.el)return;const t=je(e),i=e.detail,g=e.detailOverlay,f=g||i&&i.el;f&&f.parentNode&&f.parentNode.removeChild(f),e.detail=null,e.detailOverlay=null,b(e),i&&(e.el.appendChild(f),e.detail=i,e.detailOverlay=g),Ze(e,t)}function Ye(e){return Number.isInteger(e)?String(e):String(Math.round(e*100)/100)}function Ie(e){return String(e).replace(/[^\w-]/g,"_")}const Me="data-lattice-row";function ut(e){const t=[];for(const i of e.children)i.hasAttribute&&i.hasAttribute(Me)&&t.push(i);return t}function mt(e){const{el:t,ctx:i,doc:g}=e;if(!t)return;const f=g&&g.defaultView,y=f&&v(f.getComputedStyle)?f.getComputedStyle(t):null,M=y&&v(y.getPropertyValue)?String(y.getPropertyValue("--lattice-board-column-width")||"").trim():"";if(delete t.dataset.columnwidth,t.style.removeProperty("--lattice-kanban-column-min"),t.style.removeProperty("--lattice-kanban-column-width"),t.style.removeProperty("--lattice-kanban-column-max"),M)return;const C=i.columnWidth;if(typeof C=="number"){t.dataset.columnwidth="fixed",t.style.setProperty("--lattice-kanban-column-width",`${C}px`);return}C!=="auto"&&(t.dataset.columnwidth="fill",t.style.setProperty("--lattice-kanban-column-min",`${i.minColumnWidth}px`),i.maxColumnWidth&&t.style.setProperty("--lattice-kanban-column-max",`${i.maxColumnWidth}px`))}function b(e){const{el:t,ctx:i,doc:g}=e;if(!t)return;e.sla&&v(e.sla.sync)&&e.sla.sync(),P(g),r(e),oe(e),se(e),Z(e),t.classList.add(u),e._tokenScopeOff||(e._tokenScopeOff=l(t)),t.setAttribute("role","group"),t.setAttribute("aria-label",e.config.ariaLabel||L(e,"kanban.board")),e.isReadonly({})?t.dataset.readonly="true":delete t.dataset.readonly,t.dataset.density=i.density||"comfortable";const f=ut(t);for(;t.firstChild;)t.removeChild(t.firstChild);if(e.model.lanes)We(e);else{delete t.dataset.swimlanes;for(const M of e.model.columns)t.appendChild(A(e,M))}mt(e),ke(e);const y=g.createElement("div");y.className=`${u}__live`,y.setAttribute("aria-live","polite"),y.setAttribute("role","status"),y.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;",t.appendChild(y),e.live=y;for(const M of f)t.appendChild(M);ye(t),e.paintSelection(),w(e),e.wired||(dt(e),e.wired=!0)}function w(e){if(!e.el||!v(e.canExpand))return;const t=e.config.labels&&e.config.labels.expand;for(const i of e.el.querySelectorAll(`.${u}__card`)){const g=e.model.cardsByKey.get(et(e,i.dataset.key));if(!g||!e.canExpand(g))continue;const f=e.doc.createElement("button");f.className=`${u}__drill`,f.setAttribute("type","button"),f.setAttribute("tabindex","-1"),f.setAttribute("aria-label",[t,g.fields.title||String(g.key)].filter(Boolean).join(" ")),f.textContent="⤢",i.appendChild(f)}}function D(e,t,i,g){if(!e.el)return null;Z(e);const{doc:f}=e,y=e.config.children&&e.config.children.present||"drawer",M=f.createElement("section");M.className=`${u}__detail`,M.dataset.present=y,M.dataset.depth=String(g),M.setAttribute("role",y==="modal"?"dialog":"group"),M.setAttribute("aria-modal",y==="modal"?"true":"false");const C=f.createElement("div");C.className=`${u}__detail-head`;const S=f.createElement("span");S.className=`${u}__detail-title`;const B=e.config.children&&e.config.children.title;S.textContent=v(B)?String(B(t)):t.fields.title||String(t.key);const ue=f.createElement("button");ue.className=`${u}__detail-close`,ue.setAttribute("type","button");const de=e.config.labels&&e.config.labels.close;de&&ue.setAttribute("aria-label",de),ue.textContent="✕",C.appendChild(S),C.appendChild(ue);const pe=f.createElement("div");pe.className=`${u}__detail-body`,M.appendChild(C),M.appendChild(pe);let le=e.el;if(y==="modal"){const q=f.createElement("div");q.className=`${u}__overlay`,q.appendChild(M),e.el.appendChild(q),e.detailOverlay=q}else if(y==="inline"){const q=e.el.querySelector(`.${u}__card[data-key="${ft(String(t.key))}"]`);le=q&&q.parentNode?q.parentNode:e.el,q&&q.nextSibling?le.insertBefore(M,q.nextSibling):le.appendChild(M)}else e.el.appendChild(M);const Ee=e.buildChild(pe,t,i,g);return e.detail={el:M,handle:Ee,card:t},ue.focus&&ue.focus(),e.detail}function Z(e){if(!e.detail)return;const{handle:t,el:i}=e.detail;t&&v(t.destroy)&&t.destroy();const g=e.detailOverlay||i;g&&g.parentNode&&g.parentNode.removeChild(g),e.detail=null,e.detailOverlay=null}function $e(e,t,i){if(!e.el)return null;se(e);const g=e.el.querySelector(`.${u}__card[data-key="${ft(String(t))}"]`);if(!g)return null;const f=e.model.cardsByKey.get(t),y=e.ctx.cardSpecs[i]||{},M=f&&f.fields[i]||"";if(v(y.editor)){const S=y.editor({card:f,field:i,value:M,commit:B=>Ae(e,B),cancel:()=>se(e)});return e.editing={key:t,field:i,custom:S},S&&S.el&&g.appendChild(S.el),S&&v(S.focus)?S.focus():S&&S.el&&S.el.focus&&S.el.focus(),e.editing}const C=e.doc.createElement("input");return C.className=`${u}__editor`,C.dataset.field=i,C.value=M,C.addEventListener("keydown",S=>{S.stopPropagation&&S.stopPropagation(),S.key==="Enter"?(S.preventDefault&&S.preventDefault(),Ae(e,C.value)):S.key==="Escape"&&(S.preventDefault&&S.preventDefault(),se(e))}),C.addEventListener("blur",()=>{e.editing&&e.editing.input===C&&Ae(e,C.value)}),e.editing={key:t,field:i,input:C},g.appendChild(C),C.focus&&C.focus(),C.select&&C.select(),e.editing}function Ae(e,t){const i=e.editing;i&&(e.editing=null,i.custom&&v(i.custom.destroy)?i.custom.destroy():i.input&&i.input.parentNode&&i.input.parentNode.removeChild(i.input),e.applyEdit(i.key,i.field,t))}function se(e){const t=e.editing;t&&(e.editing=null,t.custom&&v(t.custom.destroy)?t.custom.destroy():t.input&&t.input.parentNode&&t.input.parentNode.removeChild(t.input))}function ye(e){const t=e.querySelector(`.${u}__card`);t&&t.setAttribute("tabindex","0")}function fe(e,t){e.live&&(e.live.textContent=t)}function ge(e,t,i){const g=t.length?e.model.cardsByKey.get(t[0]):null,f=g?g.columnId:"";fe(e,L(e,"kanban.moveRefused",{from:f,to:i}))}function me(e,t){const i=e.config.labels;return i&&typeof i[t]=="string"?i[t]:""}function He(e,t){return me(e,t)||L(e,`kanban.${t}`)}function Se(e,t,i,g,f=""){const y=e.model.columns.find(B=>B.id===i),M=y?Math.max(y.count,g+1):g+1,C=t.fields.title||String(t.key),S=y?y.title:i;return[f,C,S,`${g+1}/${M}`].filter(Boolean).join(", ")}function Ue(e){e.paintSelection=()=>{if(e.el)for(const t of e.el.querySelectorAll(`.${u}__card`)){const i=et(e,t.dataset.key),g=e.selectionSet&&e.selectionSet.has(i);g?t.dataset.selected="true":delete t.dataset.selected,t.setAttribute("aria-selected",g?"true":"false")}}}function dt(e){const{el:t}=e;t.addEventListener("click",i=>{const g=i.target&&i.target.closest?i.target.closest(`.${u}__menubtn`):null;if(g){i.preventDefault&&i.preventDefault(),e.menu&&e.menuAnchor===g?r(e,!0):bt(e,g.closest(`.${u}__header`),g);return}if(i.target&&i.target.closest){if(i.target.closest(`.${u}__detail-close`)){i.preventDefault&&i.preventDefault(),e.closeDetail();return}const C=i.target.closest(`.${u}__add`);if(C){i.preventDefault&&i.preventDefault(),e.addCard(C.dataset.column);return}const S=i.target.closest(`.${u}__drill`);if(S){i.preventDefault&&i.preventDefault();const B=nt(e,S);B&&e.expand(B.card.key);return}}const f=i.target&&i.target.closest?i.target.closest(`.${u}__blockedby-chip`):null;if(f){i.preventDefault&&i.preventDefault(),kt(e,f.dataset.blocker);return}const y=i.target&&i.target.closest?i.target.closest(`.${u}__toggle`):null;if(y){const C=y.closest(`.${u}__header, .${u}__lanehead`);i.preventDefault&&i.preventDefault(),C&&C.classList.contains(`${u}__lanehead`)?e.collapseLane(C.dataset.lane):C&&e.collapseColumn(C.dataset.column);return}const M=nt(e,i.target);M&&(ot(e,M.card,i),e.fire("card:click",{card:M.card,column:M.card.columnId,el:M.el,originalEvent:i}))}),t.addEventListener("dblclick",i=>{const g=nt(e,i.target);if(g&&(e.fire("card:dblclick",{card:g.card,column:g.card.columnId,el:g.el,originalEvent:i}),v(e.editCard))){const f=Object.keys(e.ctx.cardSpecs).find(y=>e.isFieldEditable(y));f&&e.editCard(g.card.key,f)}}),t.addEventListener("contextmenu",i=>{const g=nt(e,i.target);if(!g){const f=i.target&&i.target.closest?i.target.closest(`.${u}__header`):null;f&&bt(e,f,null,i);return}if(lt(e)){ae(e,g,i);return}e.fire("card:contextmenu",{card:g.card,column:g.card.columnId,el:g.el,originalEvent:i})}),t.addEventListener("keydown",i=>rt(e,i)),s(t,{canStart:i=>{const g=i.target;if(!g||!g.closest||g.closest(`.${u}__menubtn`))return null;const f=g.closest(`.${u}__lanehead`);if(f&&!nt(e,g))return f;const y=g.closest(`.${u}__header`);if(y&&!nt(e,g))return y;const M=nt(e,g);return!M||e.isReadonly({column:M.card.columnId,card:M.card.key})?null:M.el},onStart:(i,g)=>{const f=i.el;if(f.classList.contains(`${u}__lanehead`)){e.laneDrag=f.dataset.lane;return}if(f.classList.contains(`${u}__header`)){e.colDrag=f.dataset.column;return}const y=nt(e,f);if(!y||e.isReadonly({column:y.card.columnId,card:y.card.key}))return;const M=ht(e,y.card.key);e.drag={keys:M},y.el.dataset.dragging="true",e.fire("drag:start",{keys:M,card:y.card,originalEvent:g})},onMove:(i,g)=>{if(e.colDrag||e.laneDrag||!e.drag)return;const f=Ct(e,gt(e,g));if(!f)return;const y=tt(e,f.columnId);_t(e,f.columnId,f.lane,y),y?st(e,f.columnId,f.index,e.drag.keys,f.lane):T(e)},onEnd:(i,g)=>{if(e.laneDrag){const C=gt(e,g),S=C&&C.closest?C.closest(`.${u}__lanehead`):null,B=S?S.dataset.lane:null,ue=e.laneDrag;e.laneDrag=null,B!==ue&&e.moveLane(ue,B);return}if(e.colDrag){const C=gt(e,g),S=C&&C.closest?C.closest(`.${u}__header`):null,B=S?S.dataset.column:null,ue=e.colDrag;e.colDrag=null,B!==ue&&e.moveColumn(ue,B);return}if(!e.drag)return;const f=Ct(e,gt(e,g)),y=f&&tt(e,f.columnId),M=e.drag.keys;G(e),yt(e),y?e.requestMove(M,f.columnId,f.index,f.lane):f&&ge(e,M,f.columnId),e.fire("drag:end",{keys:M,originalEvent:g})},onCancel:(i,g)=>{if(e.colDrag=null,e.laneDrag=null,yt(e),e.drag){const f=e.drag.keys;G(e),e.fire("drag:end",{keys:f,originalEvent:g})}},autoScroll:[t]})}function nt(e,t){const i=t&&t.closest?t.closest(`.${u}__card`):null;if(!i)return null;const g=e.model.cardsByKey.get(et(e,i.dataset.key));return g?{el:i,card:g}:null}function kt(e,t){if(!e.el)return;const i=e.el.querySelector(`.${u}__card[data-key="${ft(String(t))}"]`);if(i){for(const g of e.el.querySelectorAll(`.${u}__card`))g.setAttribute("tabindex","-1");i.setAttribute("tabindex","0"),i.focus&&i.focus(),i.scrollIntoView&&i.scrollIntoView({block:"nearest"})}}function ht(e,t){return e.selectionSet&&e.selectionSet.size>1&&e.selectionSet.has(t)?[...e.selectionSet]:(e.select(t,"set"),[t])}function ot(e,t,i){if(e.config.selectable!==!1){if(i.ctrlKey||i.metaKey){e.select(t.key,"toggle");return}if(i.shiftKey){const g=e.model.columns.find(S=>S.id===t.columnId),f=g?g.cards.map(S=>S.key):[t.key],y=e.selectionAnchor,M=y!=null?f.indexOf(y):-1,C=f.indexOf(t.key);if(M>=0&&C>=0){const[S,B]=M<C?[M,C]:[C,M];e.select(f.slice(S,B+1),"set");return}}e.select(t.key,"set"),e.selectionAnchor=t.key}}function et(e,t){if(e.model.cardsByKey.has(t))return t;const i=Number(t);return!Number.isNaN(i)&&e.model.cardsByKey.has(i)?i:t}function St(e,t,i,g){const f=e.model.columns.find(C=>C.id===t),y=f?f.cards.filter(C=>!g.includes(C.key)):[];if(x(i))return y.length;const M=y.findIndex(C=>C.key===i);return M<0?y.length:M}function gt(e,t){const i=e.doc;if(i&&v(i.elementFromPoint)&&typeof t.clientX=="number"&&typeof t.clientY=="number"){const g=i.elementFromPoint(t.clientX,t.clientY);if(g)return g}return t.target}function Ct(e,t){const i=t&&t.closest?t.closest(`.${u}__cards`):null,g=i||(t&&t.closest?t.closest(`.${u}__column`):null);if(!g)return null;const f=g.dataset.column,y=i&&i.dataset.lane!==void 0?i.dataset.lane:void 0,M=t.closest?t.closest(`.${u}__card`):null,C=M?et(e,M.dataset.key):null,S=(e.drag||e.grab||{}).keys||[];return{columnId:f,lane:y,index:ct(e,f,y,C,S)}}function ct(e,t,i,g,f){if(i===void 0)return St(e,t,g,f);const y=(e.model.lanes||[]).find(B=>B.id===i),M=y&&y.columns.find(B=>B.id===t),C=M?M.cards.filter(B=>!f.includes(B.key)):[];if(x(g))return C.length;const S=C.findIndex(B=>B.key===g);return S<0?C.length:S}function st(e,t,i,g,f){T(e);const y=[...e.el.querySelectorAll(`.${u}__cards`)].find(B=>B.dataset.column===t&&(f===void 0||(B.dataset.lane||"")===f));if(!y)return;const M=[...y.querySelectorAll(`.${u}__card`)].filter(B=>!g.includes(et(e,B.dataset.key))),C=e.doc.createElement("li");C.className=`${u}__drop`,C.setAttribute("role","presentation");const S=M[i]||null;S?y.insertBefore(C,S):y.appendChild(C),e.dropMarker=C}function T(e){e.dropMarker&&e.dropMarker.parentNode&&e.dropMarker.parentNode.removeChild(e.dropMarker),e.dropMarker=null}function G(e){if(T(e),e.el)for(const t of e.el.querySelectorAll(`.${u}__card`))delete t.dataset.dragging;e.drag=null}function tt(e,t){const i=(e.drag||e.grab||{}).keys||[];for(const g of i){const f=e.model.cardsByKey.get(g);if(f&&!m(e.ctx,I(f.swimlane),f.columnId,t))return!1}return!0}function _t(e,t,i,g){yt(e);const f=[...e.el.querySelectorAll(`.${u}__cards`)].filter(y=>y.dataset.column===t&&(i===void 0||(y.dataset.lane||"")===i));for(const y of f){y.setAttribute("aria-dropeffect",g?"move":"none"),g||(y.dataset.nodrop="true");const M=y.closest(`.${u}__column`);M&&(M.setAttribute("aria-dropeffect",g?"move":"none"),g||(M.dataset.nodrop="true"))}}function yt(e){if(e.el)for(const t of e.el.querySelectorAll(`.${u}__column, .${u}__cards`))t.dataset.nodrop&&delete t.dataset.nodrop,t.hasAttribute&&t.hasAttribute("aria-dropeffect")&&t.removeAttribute("aria-dropeffect")}function Ve(){return""}function Be(e,t){if(!e.el)return;_e(e);const{doc:i}=e,g=[],f=i.createElement("div");f.className=`${u}__reqform`,f.setAttribute("role","dialog");const y=i.createElement("div");y.className=`${u}__reqform-panel`;const M=i.createElement("div");M.className=`${u}__reqform-title`,M.textContent=L(e,"kanban.requiredTitle"),y.appendChild(M);for(const pe of t.entries){const le=i.createElement("div");le.className=`${u}__reqform-field`;const Ee=i.createElement("label");Ee.className=`${u}__reqform-label`,Ee.textContent=pe.label||String(pe.field),le.appendChild(Ee);const q={value:Ve()};if(v(pe.editor)){const he=pe.editor({card:pe.card,field:pe.field,value:q.value,commit:Le=>{q.value=Le},cancel:()=>_e(e)});he&&he.el&&le.appendChild(he.el),q.editor=he}else{const he=i.createElement("input");he.className=`${u}__reqform-input`,he.value=q.value,he.addEventListener("input",()=>{q.value=he.value}),he.addEventListener("keydown",Le=>{Le.stopPropagation&&Le.stopPropagation(),Le.key==="Enter"?(Le.preventDefault&&Le.preventDefault(),C()):Le.key==="Escape"&&(Le.preventDefault&&Le.preventDefault(),_e(e))}),le.appendChild(he),q.input=he}y.appendChild(le),g.push({entry:pe,slot:q})}const C=async()=>{_e(e);let pe=!0;for(const le of g)if(!await e.applyRequired(le.entry.key,le.entry.field,le.slot.value)){pe=!1;break}pe&&await e.move(t.keys,t.toColumn,t.toIndex,t.toLane,{origin:t.origin})},S=i.createElement("div");S.className=`${u}__reqform-actions`;const B=i.createElement("button");B.setAttribute("type","button"),B.className=`${u}__reqform-save`,B.textContent=L(e,"kanban.requiredSave");const ue=i.createElement("button");ue.setAttribute("type","button"),ue.className=`${u}__reqform-cancel`,ue.textContent=L(e,"kanban.requiredCancel"),B.addEventListener("click",C),ue.addEventListener("click",()=>_e(e)),S.appendChild(B),S.appendChild(ue),y.appendChild(S),f.appendChild(y),e.el.appendChild(f),e.reqform={overlay:f,controls:g,submit:C};const de=g[0]&&g[0].slot;de&&de.editor&&v(de.editor.focus)?de.editor.focus():de&&de.input&&de.input.focus&&de.input.focus()}function _e(e){const t=e.reqform;if(t){e.reqform=null;for(const i of t.controls)i.slot.editor&&v(i.slot.editor.destroy)&&i.slot.editor.destroy();t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay)}}function lt(e){const t=e.config.contextMenu;return v(t)||Array.isArray(t)&&t.length>0}function at(e,t){const i=e.config.contextMenu;if(v(i)){const g=e.selection().map(f=>e.model.cardsByKey.get(f)).filter(Boolean);return i(t,g)||[]}return Array.isArray(i)?i:[]}function ae(e,t,i){i.preventDefault&&i.preventDefault(),r(e);const g=at(e,t.card);if(!g.length)return;const f=e.doc.createElement("ul");f.className=`${u}__menu`,f.setAttribute("role","menu"),f.style.cssText=`position:absolute;left:${i.clientX||0}px;top:${i.clientY||0}px;`;for(const M of g){const C=e.doc.createElement("li");C.className=`${u}__menuitem`,C.setAttribute("role","menuitem"),C.setAttribute("tabindex","-1"),M.disabled&&C.setAttribute("aria-disabled","true"),C.textContent=M.label==null?"":String(M.label),C.addEventListener("click",S=>{if(S.preventDefault&&S.preventDefault(),M.disabled)return;const B=e.selection().map(ue=>e.model.cardsByKey.get(ue)).filter(Boolean);v(M.action)&&M.action({card:t.card,cards:B.length?B:[t.card],board:e}),r(e)}),f.appendChild(C)}e.el.appendChild(f),e.menu=f;const y=f.querySelector(`.${u}__menuitem`);y&&(y.setAttribute("tabindex","0"),y.focus&&y.focus())}function bt(e,t,i,g){const f=t?e.model.columns.find(le=>le.id===t.dataset.column):null;if(!f)return;const y=X(e,f);if(!y.length)return;g&&g.preventDefault&&g.preventDefault(),r(e);const M=i?i.getBoundingClientRect():null,C=M?M.left:g.clientX||0,S=M?M.bottom:g.clientY||0,B=e.doc.createElement("ul");B.className=`${u}__menu`,B.setAttribute("role","menu"),B.dataset.column=f.id,B.style.cssText=`position:fixed;left:${C}px;top:${S}px;`;const ue=[];for(const le of y){const Ee=e.doc.createElement("li");Ee.className=`${u}__menuitem`,Ee.setAttribute("role","menuitem"),Ee.setAttribute("tabindex","-1"),le.disabled&&Ee.setAttribute("aria-disabled","true"),Ee.textContent=le.label==null?"":String(le.label),Ee.addEventListener("click",q=>{q.preventDefault&&q.preventDefault(),!le.disabled&&(r(e,!0),v(le.action)&&le.action({column:f.id,item:le,board:e}),e.fire("column:menu",{column:f.id,item:le,el:Ee}))}),Ee.addEventListener("keydown",q=>{const he=ue.indexOf(Ee);if(q.key==="Enter"||q.key===" "){q.preventDefault(),Ee.click();return}const Le=q.key==="ArrowDown"?he+1:q.key==="ArrowUp"?he-1:null;if(Le===null)return;q.preventDefault();const Xe=ue[(Le+ue.length)%ue.length];Ee.setAttribute("tabindex","-1"),Xe.setAttribute("tabindex","0"),Xe.focus()}),ue.push(Ee),B.appendChild(Ee)}e.el.appendChild(B),e.menu=B,e.menuAnchor=i||null,i&&i.setAttribute("aria-expanded","true");const de=le=>{const Ee=le.target;B.contains(Ee)||i&&i.contains(Ee)||(r(e),i&&setTimeout(()=>{i.isConnected&&i.focus()},0))};e.doc.addEventListener("mousedown",de,!0),e.menuOff=()=>e.doc.removeEventListener("mousedown",de,!0);const pe=ue[0];pe&&(pe.setAttribute("tabindex","0"),pe.focus&&pe.focus())}function r(e,t=!1){e.menu&&e.menu.parentNode&&e.menu.parentNode.removeChild(e.menu),e.menu=null,e.menuOff&&(e.menuOff(),e.menuOff=null);const i=e.menuAnchor;e.menuAnchor=null,i&&i.setAttribute("aria-expanded","false"),t&&i&&i.isConnected&&i.focus&&i.focus()}function rt(e,t){if(e.editing)return;if(e.menu){t.key==="Escape"&&(t.preventDefault&&t.preventDefault(),r(e,!0));return}if(e.detail&&t.key==="Escape"){t.preventDefault&&t.preventDefault(),e.closeDetail();return}const{el:i}=e,g=t.target&&t.target.closest?t.target.closest(`.${u}__card`):null;if(!g)return;const f=e.model.cardsByKey.get(et(e,g.dataset.key));if(!f)return;if(e.grab){$t(e,t);return}if(t.key==="b"||t.key==="B"){if(e.isReadonly({column:f.columnId,card:f.key}))return;t.preventDefault&&t.preventDefault(),v(e.toggleBlocked)&&e.toggleBlocked(f.key);return}if(t.key==="Enter"){t.preventDefault&&t.preventDefault(),e.fire("card:click",{card:f,column:f.columnId,el:g,originalEvent:t});return}if(t.key===" "){if(e.isReadonly({column:f.columnId,card:f.key}))return;t.preventDefault&&t.preventDefault();const M=ht(e,f.key),C=(e.model.columns.find(B=>B.id===f.columnId)?.cards||[]).filter(B=>!M.includes(B.key)),S=e.model.lanes?g.dataset.lane||"":void 0;e.grab={keys:M,columnId:f.columnId,index:Math.min(wt(e,f),C.length),cardKey:f.key,laneId:S},fe(e,Se(e,f,f.columnId,e.grab.index,me(e,"grabbed"))),st(e,e.grab.columnId,e.grab.index,M,S);return}const y=Te(i,g,t.key);y&&(t.preventDefault&&t.preventDefault(),g.setAttribute("tabindex","-1"),y.setAttribute("tabindex","0"),y.focus&&y.focus())}function wt(e,t){const i=e.model.columns.find(g=>g.id===t.columnId);return i?i.cards.findIndex(g=>g.key===t.key):0}function $t(e,t){const i=e.grab,g=e.model.cardsByKey.get(i.cardKey),f=e.model.columns,y=f.findIndex(C=>C.id===i.columnId);if(t.key==="Escape"){t.preventDefault&&t.preventDefault(),T(e),e.grab=null,fe(e,[me(e,"cancelled"),g.fields.title||String(g.key)].filter(Boolean).join(", "));return}if(t.key==="Enter"||t.key===" "){t.preventDefault&&t.preventDefault();const{keys:C,columnId:S,index:B,laneId:ue}=i;T(e),e.grab=null,Promise.resolve(e.requestMove(C,S,B,e.model.lanes?ue:void 0)).then(de=>{if(!de)return;const pe=e.model.cardsByKey.get(g.key);if(pe){fe(e,Se(e,pe,pe.columnId,wt(e,pe),me(e,"dropped")));const le=e.el.querySelector(`.${u}__card[data-key="${ft(String(g.key))}"]`);le&&le.focus&&(le.setAttribute("tabindex","0"),le.focus())}});return}const M=e.model.lanes;if(M&&t.altKey&&(t.key==="ArrowUp"||t.key==="ArrowDown")){const C=M.findIndex(de=>de.id===(i.laneId||"")),S=M[C+(t.key==="ArrowDown"?1:-1)];if(!S)return;i.laneId=S.id;const B=S.columns.find(de=>de.id===i.columnId),ue=(B?B.cards:[]).filter(de=>!i.keys.includes(de.key));i.index=Math.min(i.index,ue.length)}else{const C=(f[y]?.cards||[]).filter(S=>!i.keys.includes(S.key));if(t.key==="ArrowUp")i.index=Math.max(0,i.index-1);else if(t.key==="ArrowDown")i.index=Math.min(C.length,i.index+1);else if(t.key==="ArrowLeft"||t.key==="ArrowRight"){const S=t.key==="ArrowRight"?1:-1;let B=null;for(let de=y+S;de>=0&&de<f.length;de+=S){const pe=f[de];if(tt(e,pe.id)){B=pe;break}}if(!B)return;i.columnId=B.id;const ue=B.cards.filter(de=>!i.keys.includes(de.key));i.index=Math.min(i.index,ue.length)}else return}t.preventDefault&&t.preventDefault(),st(e,i.columnId,i.index,i.keys,e.model.lanes?i.laneId:void 0),fe(e,Se(e,g,i.columnId,i.index,me(e,"moved")))}function ft(e){return e.replace(/["\\]/g,"\\$&")}function Te(e,t,i){const g=t.closest(`.${u}__column`),f=[...g.querySelectorAll(`.${u}__card`)],y=f.indexOf(t);if(i==="ArrowUp")return f[y-1]||null;if(i==="ArrowDown")return f[y+1]||null;if(i==="Home")return f[0]||null;if(i==="End")return f[f.length-1]||null;if(i==="ArrowLeft"||i==="ArrowRight"){const M=[...e.querySelectorAll(`.${u}__column`)],C=M.indexOf(g),S=M[C+(i==="ArrowRight"?1:-1)];if(!S)return null;const B=[...S.querySelectorAll(`.${u}__card`)];return B.length?B[Math.min(y,B.length-1)]:null}return null}}),Ge("packages/core/src/internal/schedule.js",function(h,J){"use strict";Object.defineProperty(h,"now",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"nextFrame",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"cancelFrame",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(h,"frameBatched",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"settleDebounce",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"whenIdle",{enumerable:!0,get:function(){return u}});function a(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const v=typeof requestAnimationFrame=="function";function x(P){return v?requestAnimationFrame(P):setTimeout(()=>P(a()),16)}function ne(P){P!=null&&(v?cancelAnimationFrame(P):clearTimeout(P))}function ee(P){let K=null,E=null;const R=()=>{K=null;const V=E;E=null,P(...V||[])},z=(...V)=>{E=V,K===null&&(K=x(R))};return z.cancel=()=>{ne(K),K=null,E=null},z.flush=()=>{K!==null&&(ne(K),R())},z}function j(P,K){let E=null,R=null;const z=()=>{if(E=null,R===null)return;const oe=R;R=null,P(...oe),V()},V=()=>{E=setTimeout(z,K),typeof E?.unref=="function"&&E.unref()},X=(...oe)=>{E===null?(P(...oe),V()):(R=oe,clearTimeout(E),V())};return X.flush=()=>{if(E!==null&&clearTimeout(E),E=null,R===null)return;const oe=R;R=null,P(...oe)},X.cancel=()=>{E!==null&&clearTimeout(E),E=null,R=null},X.pending=()=>E!==null||R!==null,X}function u(P,K=50){return typeof requestIdleCallback=="function"?requestIdleCallback(P,{timeout:K}):setTimeout(()=>P({timeRemaining:()=>0,didTimeout:!0}),1)}}),Ge("packages/modules/kanban/flow.js",function(h,J){"use strict";Object.defineProperty(h,"moments",{enumerable:!0,get:function(){return K}}),Object.defineProperty(h,"quantileSorted",{enumerable:!0,get:function(){return E}}),Object.defineProperty(h,"quantile",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"bucketMs",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"summariseDurations",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(h,"TransitionLog",{enumerable:!0,get:function(){return H}}),Object.defineProperty(h,"createFlowAnalytics",{enumerable:!0,get:function(){return O}}),Object.defineProperty(h,"FlowAnalytics",{enumerable:!0,get:function(){return I}}),Object.defineProperty(h,"default",{enumerable:!0,get:function(){return F}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,P=J("packages/core/src/internal/schedule.js").now;function K(m){let o=0,s=0,c=0;for(let l=0;l<m.length;l++){const p=m[l];o++;const k=p-s;s+=k/o,c+=k*(p-s)}return{n:o,mean:s,m2:c}}function E(m,o){const s=m.length;if(!s)return NaN;if(s===1)return m[0];const c=(s-1)*Math.min(1,Math.max(0,o)),l=Math.floor(c),p=Math.ceil(c);return l===p?m[l]:m[l]+(c-l)*(m[p]-m[l])}function R(m,o){if(!m.length)return NaN;const s=m.slice().sort();return E(s,o)}const z=3600*1e3,V=Object.freeze({hour:z,day:24*z,week:168*z});function X(m){return typeof m=="number"&&Number.isFinite(m)&&m>0?m:V[m]||V.day}function oe(m){const o=[];for(const U of m||[])Number.isFinite(U)&&o.push(U);const s=Float64Array.from(o),c=s.length;if(!c)return{count:0,mean:null,median:null,p50:null,p85:null,p95:null,min:null,max:null,stdev:null,total:0};const l=K(s);let p=s[0],k=s[0],$=0;for(let U=0;U<c;U++){const Y=s[U];Y<p&&(p=Y),Y>k&&(k=Y),$+=Y}const L=R(s,.5);return{count:c,mean:l.mean,median:L,p50:L,p85:R(s,.85),p95:R(s,.95),min:p,max:k,stdev:c>1?Math.sqrt(l.m2/(c-1)):0,total:$}}class H{entries=[];#t=new Map;#e;constructor(o={}){this.#e=v(o.now)?o.now:P}record(o){if(!ne(o)||x(o.key))return null;const s=o.key,c=x(o.to)?null:String(o.to),l=o.from===void 0?this.#t.has(s)?this.#t.get(s):null:x(o.from)?null:String(o.from),p=Number.isFinite(o.at)?Number(o.at):this.#e(),k={key:s,from:l,to:c,at:p};return this.entries.push(k),this.#t.set(s,c),k}remove(o){if(!ne(o))return!1;const s=this.entries.lastIndexOf(o);if(s<0)return!1;this.entries.splice(s,1);let c;for(const l of this.entries)l.key===o.key&&(c=l);return c?this.#t.set(o.key,c.to):this.#t.delete(o.key),!0}hydrate(o){if(Array.isArray(o))for(const s of o)this.record(s);return this}all(){return this.entries.map(o=>({...o}))}byKey(){const o=new Map;for(const s of this.entries)o.has(s.key)||o.set(s.key,[]),o.get(s.key).push(s);for(const s of o.values())s.sort((c,l)=>c.at-l.at);return o}}function O(m,o={}){return new I(m,o)}class I{#t;#e;log;#n=[];#r;#o=new Map;#i=new Map;#s=new Map;constructor(o,s={}){this.#t=o,this.#e=ne(s)?s:{},this.#r=v(this.#e.now)?this.#e.now:P,this.log=new H({now:this.#r}),o&&v(o.on)&&(this.#n.push(o.on("card:move",c=>{const l=Array.isArray(c.keys)?c.keys:[],p=Array.isArray(c.from)?c.from:[],k=this.#r();l.forEach(($,L)=>{const U=this.log.record({key:$,from:p[L],to:c.to,at:k});U&&this.#o.set($,U)})})),this.#n.push(o.on("card:reverted",c=>{const l=Array.isArray(c.keys)?c.keys:[];for(const p of l){const k=this.#o.get(p);k&&(this.log.remove(k),this.#o.delete(p))}})),this.#n.push(o.on("card:confirmed",c=>{const l=Array.isArray(c.keys)?c.keys:[];for(const p of l)this.#o.delete(p)})),this.#n.push(o.on("card:add",c=>{this.log.record({key:c.key,from:null,to:c.column})})),this.#n.push(o.on("card:edit",c=>{if(!c||c.field!=="blocked")return;const l=c.value,p=typeof l=="string"?l.trim()!=="":!!l,k=this.#r();p?this.#i.has(c.key)||this.#i.set(c.key,{since:k}):this.#c(c.key,k)})))}seed(){if(Array.isArray(this.#e.history))return this.log.hydrate(this.#e.history),this;const o=this.#r(),s=v(this.#t.cards)?this.#t.cards():[];for(const c of s)this.log.record({key:c.key,from:null,to:c.columnId,at:o}),c.explicitBlocked&&this.#i.set(c.key,{since:o});return this}record(o){return this.log.record(o),this}transitions(){return this.log.all()}#l(){return(this.#t.model&&this.#t.model.columns||[]).map(s=>String(s.id))}#a(){const o=this.#l(),s=new Set(Array.isArray(this.#e.doneColumns)?this.#e.doneColumns.map(String):[...this.#t.ctx&&this.#t.ctx.doneColumns?this.#t.ctx.doneColumns:[]].map(String)),c=new Set(Array.isArray(this.#e.startColumns)?this.#e.startColumns.map(String):o.slice(1).filter(p=>!s.has(p))),l=new Set(Array.isArray(this.#e.wipColumns)?this.#e.wipColumns.map(String):[...c]);return{order:o,done:s,start:c,wip:l}}perCard(){const{done:o,start:s}=this.#a(),c=this.log.byKey(),l=this.#r(),p=[];for(const[k,$]of c){const L=$[0].at;let U=null,Y=null;for(const ke of $)U===null&&s.has(ke.to)&&(U=ke.at),Y===null&&o.has(ke.to)&&(Y=ke.at);const be=$[$.length-1].to,Oe=Y===null?null:Y-L,A=Y===null||U===null||U>Y?null:Y-U,re=this.#u(k,l),ce=A===null||A<=0?null:Math.max(0,Math.min(1,(A-re)/A));p.push({key:k,arrivedAt:L,startedAt:U,doneAt:Y,leadTime:Oe,cycleTime:A,blockedTime:re,flowEfficiency:ce,column:be})}return p}cycleTime(){return oe(this.perCard().map(o=>o.cycleTime).filter(o=>o!==null))}leadTime(){return oe(this.perCard().map(o=>o.leadTime).filter(o=>o!==null))}#c(o,s){const c=this.#i.get(o);c&&(Number.isFinite(s)&&s>c.since&&this.#s.set(o,(this.#s.get(o)||0)+(s-c.since)),this.#i.delete(o))}#u(o,s){let c=this.#s.get(o)||0;const l=this.#i.get(o);return l&&Number.isFinite(s)&&s>l.since&&(c+=s-l.since),c}blockedTime(){return oe(this.perCard().map(o=>o.blockedTime))}flowEfficiency(){return oe(this.perCard().map(o=>o.flowEfficiency).filter(o=>o!==null))}blockedTimeByColumn(){const o=new Map;for(const s of this.perCard()){const c=String(s.column);o.has(c)||o.set(c,{column:c,blockedMs:0,efficiencySum:0,efficiencyCount:0});const l=o.get(c);l.blockedMs+=s.blockedTime,s.flowEfficiency!==null&&(l.efficiencySum+=s.flowEfficiency,l.efficiencyCount+=1)}return[...o.values()].map(s=>({column:s.column,blockedMs:s.blockedMs,flowEfficiency:s.efficiencyCount?s.efficiencySum/s.efficiencyCount:null}))}#m(o,s,c){const l=[];for(let p=o;p<=s;p+=c)l.push(p);return(!l.length||l[l.length-1]<s)&&l.push(s),l}#d(o={}){const s=this.log.entries,c=s.length?s[0].at:0;let l=c;for(const p of s)p.at>l&&(l=p.at);return{from:Number.isFinite(o.from)?Number(o.from):c,to:Number.isFinite(o.to)?Number(o.to):l}}#f(o,s){const c=new Map;for(const[l,p]of o){let k;for(const $ of p)if($.at<=s)k=$.to;else break;k!==void 0&&c.set(l,k)}return c}cfd(o={}){const s=X(o.bucket),{order:c,done:l,wip:p}=this.#a(),k=this.log.byKey(),{from:$,to:L}=this.#d(o),U=[];if(this.log.entries.length)for(const Y of this.#m($,L,s)){const be=this.#f(k,Y),Oe={};for(const ke of c)Oe[ke]=0;let A=0,re=0,ce=0;for(const ke of be.values())ke in Oe||(Oe[ke]=0),Oe[ke]+=1,ce+=1,p.has(ke)&&(A+=1),l.has(ke)&&(re+=1);U.push({at:Y,counts:Oe,wip:A,done:re,total:ce})}return{bucket:s,columns:c,points:U}}wipOverTime(o={}){return this.cfd(o).points.map(s=>({at:s.at,wip:s.wip}))}throughput(o={}){const s=X(o.bucket),c=this.perCard().map($=>$.doneAt).filter($=>$!==null),{from:l,to:p}=this.#d(o),k=[];for(let $=l;$<=p;$+=s)k.push({at:$,count:0});k.length||k.push({at:l,count:0});for(const $ of c){let L=Math.floor(($-l)/s);L<0&&(L=0),L>=k.length&&(L=k.length-1),k[L].count+=1}return k}#p(o,s){const c=new Date(o).toISOString();return s>=V.day?c.slice(0,10):c.slice(0,16).replace("T"," ")}chartData(o,s={}){const c=X(s.bucket);if(o==="cfd"){const{columns:l,points:p}=this.cfd(s),k=p.map($=>{const L={t:this.#p($.at,c)};for(const U of l)L[U]=$.counts[U]||0;return L});return{columns:[{id:"t",field:"t",title:"Date"},...l.map($=>({id:$,field:$,title:$}))],rows:k,spec:{type:"area",x:"t",measures:l.map($=>({col:$})),stack:!0,title:"Cumulative flow"}}}if(o==="wip"){const l=this.wipOverTime(s).map(p=>({t:this.#p(p.at,c),wip:p.wip}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"wip",field:"wip",title:"WIP"}],rows:l,spec:{type:"line",x:"t",y:{col:"wip"},title:"Work in progress"}}}if(o==="throughput"){const l=this.throughput(s).map(p=>({t:this.#p(p.at,c),count:p.count}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"count",field:"count",title:"Completed"}],rows:l,spec:{type:"bar",x:"t",y:{col:"count"},title:"Throughput"}}}if(o==="cycleTime"||o==="leadTime"){const l=this.perCard().map(p=>o==="cycleTime"?p.cycleTime:p.leadTime).filter(p=>p!==null);return{columns:[{id:"v",field:"v",title:o==="cycleTime"?"Cycle time":"Lead time"}],rows:l.map(p=>({v:p})),spec:{type:"histogram",x:"v",title:o==="cycleTime"?"Cycle-time distribution":"Lead-time distribution"}}}return null}renderChart(o,s,c={}){const{createChart:l,createGrid:p,spec:k}=c;if(!v(l)||!v(p))return j("kanban:flow-chart-deps","flow.renderChart needs createChart and createGrid handed in (e.g. from 'lattice-grid/modules/charts' and 'lattice-grid')."),null;const $=this.chartData(o,c);if(!$)return j(`kanban:flow-chart-kind:${o}`,`"${o}" is not a flow chart; expected cfd, wip, throughput, cycleTime or leadTime.`),null;const L=p({columns:$.columns,rows:$.rows});return l({grid:L,container:s,...$.spec,...ne(k)?k:{}})}destroy(){for(const o of this.#n)v(o)&&o();this.#n=[]}}const F=O}),Ge("packages/modules/kanban/sla.js",function(h,J){"use strict";Object.defineProperty(h,"MIN_EPOCH",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"toMs",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"parseEpoch",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"resolveSlaConfig",{enumerable:!0,get:function(){return O}}),Object.defineProperty(h,"formatAge",{enumerable:!0,get:function(){return I}}),Object.defineProperty(h,"createSlaMonitor",{enumerable:!0,get:function(){return m}}),Object.defineProperty(h,"SlaMonitor",{enumerable:!0,get:function(){return o}}),Object.defineProperty(h,"default",{enumerable:!0,get:function(){return s}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,u=60*1e3,P=60*u,K=24*P,E=7*K,R=1e12,z=Object.freeze({weeks:E,week:E,w:E,days:K,day:K,d:K,hours:P,hour:P,h:P,minutes:u,minute:u,m:u,min:u,seconds:1e3,second:1e3,s:1e3,sec:1e3,ms:1,milliseconds:1});function V(c){if(typeof c=="number")return Number.isFinite(c)&&c>=0?c:null;if(ne(c)){let l=0,p=!1;for(const[k,$]of Object.entries(z)){const L=c[k];typeof L=="number"&&Number.isFinite(L)&&(l+=L*$,p=!0)}return p&&l>=0?l:null}return null}function X(c){if(x(c))return null;let l;if(c instanceof Date)l=c.getTime();else if(typeof c=="number")l=c;else if(typeof c=="string"){const p=c.trim();if(p==="")return null;l=/^-?\d+$/.test(p)?Number(p):Date.parse(p)}else return null;return!Number.isFinite(l)||l<R?null:l}function oe(c){return ne(c)&&("warn"in c||"breach"in c)?{warn:V(c.warn),breach:V(c.breach)}:{warn:null,breach:V(c)}}function H(c,l){return{warn:l.warn!==null?l.warn:c.warn,breach:l.breach!==null?l.breach:c.breach}}function O(c,l={}){const p=ne(c)?c:{},k={warn:V(p.warn),breach:V(p.breach)},$=new Map;if(Array.isArray(l.columns))for(const U of l.columns){if(!ne(U)||x(U.id)||U.sla===void 0&&U.slaWarn===void 0&&U.slaBreach===void 0)continue;const Y=ne(U.sla)||typeof U.sla=="number"?oe(U.sla):{warn:V(U.slaWarn),breach:V(U.slaBreach)};$.set(String(U.id),Y)}if(ne(p.columns))for(const[U,Y]of Object.entries(p.columns))$.set(String(U),H($.get(String(U))||{warn:null,breach:null},oe(Y)));const L=new Map;if(ne(p.lanes))for(const[U,Y]of Object.entries(p.lanes))L.set(String(U),oe(Y));return{global:k,columns:$,lanes:L,basis:p.basis==="board"?"board":"column",enteredProperty:typeof p.enteredProperty=="string"?p.enteredProperty:null,createdProperty:typeof p.createdProperty=="string"?p.createdProperty:null,ignoreDone:p.ignoreDone!==!1,useTransitionLog:p.useTransitionLog!==!1,showAge:p.showAge==="always"?"always":"threshold",now:v(p.now)?p.now:(()=>Date.now()),tick:Number.isFinite(p.tick)&&p.tick>0?Number(p.tick):0,onWarn:v(p.onWarn)?p.onWarn:null,onBreach:v(p.onBreach)?p.onBreach:null}}function I(c){return!Number.isFinite(c)||c<0?"":c>=E?`${Math.floor(c/E)}w`:c>=K?`${Math.floor(c/K)}d`:c>=P?`${Math.floor(c/P)}h`:c>=u?`${Math.floor(c/u)}m`:"<1m"}const F=Object.freeze({ok:0,warn:1,breach:2});function m(c,l={}){return new o(c,l)}class o{#t;#e;#n=new Map;#r=new Map;#o=[];#i=null;#s=!1;constructor(l,p={}){if(this.#t=l,this.#e=O(p,l&&l.config),this.#e.global.warn===null&&this.#e.global.breach===null&&!this.#e.columns.size&&!this.#e.lanes.size&&j("kanban:sla:no-threshold","sla is enabled but no warn/breach threshold is set (globally, per column or per lane); no card will ever age."),l&&v(l.on))for(const k of["card:move","card:add","card:reverted"])this.#o.push(l.on(k,()=>this.evaluate()))}get config(){return this.#e}#l(){if(!this.#e.useTransitionLog)return null;const l=this.#t.flow;return l&&l.log?l.log:null}#a(l,p){const k=l.row||{},{enteredProperty:$,createdProperty:L,basis:U}=this.#e,Y=p?p.get(l.key):null,be=()=>{if(!Array.isArray(Y))return null;const ke=String(l.columnId);for(let Re=Y.length-1;Re>=0;Re--)if(String(Y[Re].to)===ke){const Ne=Y[Re].at;return Number.isFinite(Ne)&&Ne>=R?Ne:null}return null},Oe=()=>{if(!Array.isArray(Y)||!Y.length)return null;const ke=Y[0].at;return Number.isFinite(ke)&&ke>=R?ke:null},A=()=>$?X(k[$]):null,re=()=>L?X(k[L]):null,ce=U==="board"?[re,Oe,A]:[be,A,Oe,re];for(const ke of ce){const Re=ke();if(Re!==null)return Re}return null}#c(l){let p=this.#e.global;const k=this.#e.columns.get(String(l.columnId));k&&(p=H(p,k));const $=l.swimlane;if(!x($)){const L=this.#e.lanes.get(String($));L&&(p=H(p,L))}return p}#u(l){const p=this.#t.ctx&&this.#t.ctx.doneColumns;return!!(p&&p.has(String(l.columnId)))}#m(l,p,k){const{warn:$,breach:L}=this.#c(l),Y=this.#e.ignoreDone&&this.#u(l)?null:this.#a(l,k),be=Y===null?null:Math.max(0,p-Y);let Oe=null;return be!==null&&(L!==null&&be>=L?Oe="breach":$!==null&&be>=$?Oe="warn":Oe="ok"),{key:l.key,columnId:l.columnId,lane:l.swimlane,start:Y,ageMs:be,ageText:be===null?"":I(be),warnMs:$,breachMs:L,level:Oe,breached:Oe==="breach"}}sync(){const l=this.#e.now(),p=this.#l()?this.#l().byKey():null,k=v(this.#t.cards)?this.#t.cards():[],$=new Map;for(const L of k)$.set(L.key,this.#m(L,l,p));return this.#n=$,this}evaluate(l={}){const p=l.emit!==!1;this.sync();const k=this.#e.now();for(const[$,L]of this.#n){const U=this.#r.has($)?this.#r.get($):null,Y=L.level;p&&Y&&(Y==="warn"||Y==="breach")&&F[Y]>(U==null?-1:F[U])&&this.#d(L,U,k),this.#r.set($,Y)}for(const $ of[...this.#r.keys()])this.#n.has($)||this.#r.delete($);return[...this.#n.values()]}#d(l,p,k){const $=this.#t.card?this.#t.card(l.key):null,L=$?$.row:void 0;this.#t.fire("card:sla",{key:l.key,card:$,level:l.level,previous:p,ageMs:l.ageMs,ageText:l.ageText,columnId:l.columnId,lane:l.lane,warnMs:l.warnMs,breachMs:l.breachMs,at:k});const U=l.level==="breach"?this.#e.onBreach:this.#e.onWarn;U&&U(l.level,L===void 0?[]:[L])}start(){if(this.#s)return this;this.#s=!0,this.sync();for(const l of this.#n.values())this.#r.set(l.key,l.level?"ok":null);return this.evaluate(),this.#e.tick>0&&(this.#i=setInterval(()=>{this.evaluate(),this.#t.el&&v(this.#t.repaint)&&this.#t.repaint()},this.#e.tick),this.#i&&v(this.#i.unref)&&this.#i.unref()),this}stateFor(l){const p=ne(l)&&"key"in l?l.key:l;return this.#n.get(p)||null}states(){return[...this.#n.values()]}breaches(){return this.states().filter(l=>l.level==="breach")}warnings(){return this.states().filter(l=>l.level==="warn")}destroy(){this.#i&&(clearInterval(this.#i),this.#i=null);for(const l of this.#o)v(l)&&l();this.#o=[]}}const s=m}),Ge("packages/modules/kanban/history.js",function(h,J){"use strict";Object.defineProperty(h,"DEFAULT_DEPTH",{enumerable:!0,get:function(){return x}}),Object.defineProperty(h,"createHistory",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"installUndoShortcuts",{enumerable:!0,get:function(){return u}});const v=J("packages/core/src/internal/predicates.js").isFunction,x=100;function ne(P){return P&&Number.isInteger(P.historyDepth)&&P.historyDepth>=0?P.historyDepth:x}function ee(P={}){const K=ne(P);let E=[],R=[],z=!1;return Object.freeze({record(X){!v(X.undo)&&!v(X.redo)||(E.push(X),E.length>K&&E.shift(),R.length=0)},async undo(){return z?null:V("undo")},async redo(){return z?null:V("redo")},canUndo(){return E.length>0},canRedo(){return R.length>0},peek(X="undo"){const oe=X==="redo"?R:E,H=oe[oe.length-1];return H?H.label:null},clear(){E=[],R=[]},get replaying(){return z},get depth(){return E.length},get max(){return K}});async function V(X){const oe=X==="undo"?E:R,H=X==="undo"?R:E,O=oe[oe.length-1];if(!O)return null;const I=X==="undo"?O.undo:O.redo;z=!0;let F=!0;try{v(I)&&(F=await I())}catch{F=!1}finally{z=!1}return F===!1?{applied:!1,label:O.label}:(oe.pop(),H.push(O),{applied:!0,label:O.label})}}function j(P,K){for(let E=P;E&&E!==K;E=E.parentNode){const R=E.tagName?String(E.tagName).toLowerCase():"";if(R==="input"||R==="textarea"||R==="select"||E.isContentEditable||E.classList&&E.classList.contains("lattice"))return!0}return!1}function u(P){const{root:K,undo:E,redo:R}=P;if(!K||!v(K.addEventListener))return()=>{};const z=X=>{if(!X||!(X.ctrlKey||X.metaKey))return;const oe=typeof X.key=="string"?X.key.toLowerCase():"";let H;if(oe==="z"&&!X.shiftKey)H=E;else if(oe==="z"&&X.shiftKey||oe==="y")H=R;else return;if(j(X.target,K))return;const O=H();(O instanceof Promise||O!==!1)&&X.preventDefault()};return K.addEventListener("keydown",z),()=>K.removeEventListener("keydown",z)}}),Ge("packages/core/src/registry/free-tier-notice.js",function(h,J){"use strict";Object.defineProperty(h,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return a}}),Object.defineProperty(h,"WATERMARK_TEXT",{enumerable:!0,get:function(){return v}});const a="Free for non-commercial use: latticegrid.dev/free",v="Unlicensed: Lattice Grid trial"}),Ge("packages/core/src/registry/licence.js",function(h,J){"use strict";Object.defineProperty(h,"PRODUCT",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(h,"LICENCE_VERSION",{enumerable:!0,get:function(){return j}}),Object.defineProperty(h,"PUBLIC_KEY",{enumerable:!0,get:function(){return K}}),Object.defineProperty(h,"fromBase64Url",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"toBase64Url",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"asciiBytes",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"parseLicence",{enumerable:!0,get:function(){return H}}),Object.defineProperty(h,"hasEd25519",{enumerable:!0,get:function(){return l}}),Object.defineProperty(h,"verifyLicence",{enumerable:!0,get:function(){return p}}),Object.defineProperty(h,"isLocalHost",{enumerable:!0,get:function(){return k}}),Object.defineProperty(h,"currentHost",{enumerable:!0,get:function(){return $}}),Object.defineProperty(h,"matchesDomain",{enumerable:!0,get:function(){return L}}),Object.defineProperty(h,"LicenceHolder",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(h,"setLicence",{enumerable:!0,get:function(){return re}}),Object.defineProperty(h,"licenceInfo",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(h,"watermark",{enumerable:!0,get:function(){return ke}}),Object.defineProperty(h,"licenceState",{enumerable:!0,get:function(){return Re}}),Object.defineProperty(h,"sharedLicence",{enumerable:!0,get:function(){return Ne}});const v=J("packages/core/src/internal/warn.js").warnOnce,x=J("packages/core/src/registry/free-tier-notice.js"),ne=x.FREE_TIER_NOTICE;Object.defineProperty(h,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return x.FREE_TIER_NOTICE}});const ee="lattice-grid",j=1,u="LG1",P=64,K="GwmaCOkGedHulqsa-DOV1TU8On1rsalWv519c_dW4j4",E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",R=(()=>{const Q=new Int16Array(128).fill(-1);for(let te=0;te<E.length;te++)Q[E.charCodeAt(te)]=te;return Q[43]=62,Q[47]=63,Q})();function z(Q){if(typeof Q!="string")return null;let te="";for(let Ye=0;Ye<Q.length;Ye++){const Ie=Q.charCodeAt(Ye);if(Ie!==61){if(Ie>127||R[Ie]<0)return null;te+=Q[Ye]}}const ie=te.length;if(ie%4===1)return null;const We=new Uint8Array(Math.floor(ie*3/4));let je=0,Ze=0,Qe=0;for(let Ye=0;Ye<ie;Ye++)je=je<<6|R[te.charCodeAt(Ye)],Ze+=6,Ze>=8&&(Ze-=8,We[Qe++]=je>>Ze&255);return Qe===We.length?We:We.subarray(0,Qe)}function V(Q){let te="",ie=0;for(;ie+2<Q.length;ie+=3){const je=Q[ie]<<16|Q[ie+1]<<8|Q[ie+2];te+=E[je>>18&63]+E[je>>12&63]+E[je>>6&63]+E[je&63]}const We=Q.length-ie;if(We===1){const je=Q[ie]<<16;te+=E[je>>18&63]+E[je>>12&63]}else if(We===2){const je=Q[ie]<<16|Q[ie+1]<<8;te+=E[je>>18&63]+E[je>>12&63]+E[je>>6&63]}return te}function X(Q){const te=new Uint8Array(Q.length);for(let ie=0;ie<Q.length;ie++)te[ie]=Q.charCodeAt(ie)&127;return te}function oe(Q){if(typeof TextDecoder=="function")return new TextDecoder().decode(Q);let te="";for(let ie=0;ie<Q.length;ie++)te+=String.fromCharCode(Q[ie]);return te}function H(Q){const te={ok:!1,reason:"malformed",product:null,issuedTo:null,expires:null,terms:null,features:[],deployments:[],version:0,message:null,signature:null,raw:typeof Q=="string"?Q:""};if(typeof Q!="string"||Q.length===0)return{...te,reason:"missing"};const ie=Q.trim(),We=ie.split(".");if(We.length!==3)return te;const[je,Ze,Qe]=We;if(je!==u)return{...te,reason:"prefix"};const Ye=z(Ze),Ie=z(Qe);if(!Ye||!Ie)return te;let Me;try{Me=JSON.parse(oe(Ye))}catch{return te}return Me===null||typeof Me!="object"?te:{ok:!0,reason:null,product:typeof Me.p=="string"?Me.p:null,issuedTo:typeof Me.t=="string"?Me.t:null,expires:typeof Me.e=="string"?Me.e:null,terms:typeof Me.terms=="string"?Me.terms:null,features:Array.isArray(Me.f)?Me.f.slice():[],deployments:Array.isArray(Me.d)?Me.d.slice():[],version:typeof Me.v=="number"?Me.v:0,message:X(Ze),signature:Ie,raw:ie}}function O(Q,te){if(!Q)return!1;const ie=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(Q)?`${Q}T23:59:59.999Z`:Q);return Number.isNaN(ie)?!0:te>ie}function I(Q){return Q==="non-commercial"?"non-commercial":"commercial"}let F=null,m=null,o=null;function s(){const Q=globalThis.crypto;return Q&&Q.subtle?Q.subtle:null}async function c(Q){if(F&&m===Q)return F;const te=s();if(!te)return null;const ie=z(Q);if(!ie)return null;try{const We=await te.importKey("raw",ie,{name:"Ed25519"},!1,["verify"]);return F=We,m=Q,We}catch{return null}}async function l(){return o!==null||(o=await c(K)!==null),o}async function p(Q,te={}){const ie=te.warn!==!1,We=te.product||ee,je=te.publicKey||K,Ze=te.now??Date.now(),Qe=te.host??$(),Ye=k(Qe)?"":` ${ne}`,Ie=H(Q);if(!Ie.ok){const w=Ie.reason==="missing"?"missing":"malformed";return ie&&v(`licence.${w}`,w==="missing"?`no licence key supplied. The grid renders in full and carries a trial watermark on any host other than localhost. Get a key at latticegrid.dev.${Ye}`:`licence key could not be read. The grid will render with a watermark.${Ye}`),{valid:!1,reason:w,terms:"commercial"}}const Me={product:Ie.product||void 0,issuedTo:Ie.issuedTo||void 0,expires:Ie.expires||void 0,terms:I(Ie.terms)};if(Ie.product!==We)return ie&&v("licence.product",`licence key is for '${Ie.product}', not '${We}'. The grid will render with a watermark.`),{valid:!1,...Me,reason:"product"};if(O(Ie.expires,Ze))return ie&&v("licence.expired",`licence expired on ${Ie.expires}. The grid will render with a watermark. Renew at latticegrid.dev.`),{valid:!1,...Me,reason:"expired"};const ut=Ie.deployments||[];if(ut.length&&Qe&&!k(Qe)&&!L(Qe,ut))return ie&&v("licence.domain",`licence key is not valid for ${Qe}; it covers ${ut.join(", ")}. The grid will render with a watermark.`),{valid:!1,...Me,reason:"domain"};const mt=await c(je);if(!mt){const w=!!Ie.signature&&Ie.signature.length===P;return ie&&v("licence.algorithm","this host does not provide crypto.subtle Ed25519, so the licence signature could not be verified. A structural check was used instead."),w?{valid:!0,...Me,reason:"unverified"}:{valid:!1,...Me,reason:"signature"}}let b=!1;try{b=await s().verify({name:"Ed25519"},mt,Ie.signature,Ie.message)}catch{b=!1}return b?{valid:!0,...Me}:(ie&&v("licence.signature","licence signature is not valid. The grid will render with a watermark."),{valid:!1,...Me,reason:"signature"})}function k(Q){const te=String(Q??$()??"").trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");return!te||te==="localhost"||te.endsWith(".localhost")||te==="::1"||te==="0:0:0:0:0:0:0:1"?!0:/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(te)}function $(){const Q=globalThis.location;return Q&&typeof Q.hostname=="string"?Q.hostname:null}function L(Q,te){const ie=U(Q);return!ie||!Array.isArray(te)?!1:te.some(We=>{const je=U(We);if(!je)return!1;if(je==="*")return!0;if(je.startsWith("*.")){const Ze=je.slice(2);return ie===Ze||ie.endsWith(`.${Ze}`)}return ie===je})}function U(Q){return String(Q??"").trim().toLowerCase().replace(/\.$/,"")}class Y{#t="";#e={valid:!1,reason:"missing",terms:"commercial"};#n=null;#r=null;#o;#i=new Set;constructor(te={}){this.#o=te}set(te){this.#t=typeof te=="string"?te.trim():"";const ie=H(this.#t);return this.#e=ie.ok?{valid:!O(ie.expires,Date.now())&&ie.product===(this.#o.product||ee),product:ie.product||void 0,issuedTo:ie.issuedTo||void 0,expires:ie.expires||void 0,terms:I(ie.terms),reason:"pending"}:{valid:!1,reason:ie.reason||"malformed",terms:"commercial"},this.#n=null,this.#t&&this.verify(),this.#e}verify(){if(this.#n)return this.#n;const te=this.#t;return this.#n=p(te,this.#o).then(ie=>{if(this.#t===te){this.#e=ie;for(const We of this.#i)We(ie)}return ie}),this.#n}onSettled(te){return this.#i.add(te),()=>this.#i.delete(te)}info(){return{...this.#e}}watermark(){return this.#e.valid?!1:!k(this.#r)}setHost(te){this.#r=te}state(){return this.#e.valid?"licensed":k(this.#r)?"localhost":"trial"}reset(){this.#t="",this.#e={valid:!1,reason:"missing",terms:"commercial"},this.#n=null,this.#i.clear()}}const be=Symbol.for("lattice-grid/licence/holder");function Oe(){const Q=globalThis,te=Q&&Q[be];if(te&&typeof te.set=="function"&&typeof te.watermark=="function")return te;const ie=new Y;if(Q)try{Q[be]=ie}catch{}return ie}const A=Oe();function re(Q){return A.set(Q)}function ce(){return A.info()}function ke(){return A.watermark()}function Re(){return A.state()}function Ne(){return A}}),Ge("packages/dom/src/watermark.js",function(h,J){"use strict";Object.defineProperty(h,"WATERMARK_CLASS",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"WATERMARK_LAYER_CLASS",{enumerable:!0,get:function(){return I}}),Object.defineProperty(h,"Watermark",{enumerable:!0,get:function(){return o}}),Object.defineProperty(h,"viewLicenceHost",{enumerable:!0,get:function(){return s}}),Object.defineProperty(h,"mountViewWatermark",{enumerable:!0,get:function(){return c}}),Object.defineProperty(h,"default",{enumerable:!0,get:function(){return l}});const v=J("packages/core/src/internal/predicates.js").isFunction,x=J("packages/core/src/registry/free-tier-notice.js"),ne=x.FREE_TIER_NOTICE,ee=x.WATERMARK_TEXT,j=J("packages/core/src/registry/licence.js"),u=j.watermark,P=j.setLicence,K=Object.freeze({t:p=>p==="licence.watermark.free"?ne:ee});function E(p,k,$={}){const L=p.createElement(k);if($.class)for(const U of $.class.split(/\s+/))U&&L.classList.add(U);if($.text!==void 0&&(L.textContent=$.text),$.attrs)for(const[U,Y]of Object.entries($.attrs))L.setAttribute(U,Y);if($.children)for(const U of $.children)L.appendChild(U);return L}function R(p,k,$){return p.addEventListener(k,$),()=>p.removeEventListener(k,$)}const z="lat-watermark",V="https://www.latticegrid.dev",X=["br","bl","tl","tr"],oe=4e3,H=Symbol.for("lattice-grid/licence/holder"),O="data-lat-watermark-owner",I="lat-watermark-layer",F="lat-watermark-style",m=`
515
+ `.trim()}function ne(ee){const j=ee&&ee.documentElement;if(!j||j.getAttribute(v))return;j.setAttribute(v,"1");const u=ee.createElement("style");u.textContent=x(),(ee.head||ee.body||j).appendChild(u)}}),Ue("packages/modules/kanban/controls.js",function(g,J){"use strict";Object.defineProperty(g,"resolveControls",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"resolveColumnMenu",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"activateControl",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"buildControl",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"buildControlStrip",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"destroyControls",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"controlValue",{enumerable:!0,get:function(){return M}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ee=J("packages/modules/kanban/styles.js").NS;function j(p,o){if(Array.isArray(o.controls))return o.controls;const s=p.config.columnControls;if(!v(s))return[];const c=s(o);return Array.isArray(c)?c:[]}function u(p,o){if(Array.isArray(o.menu))return o.menu;const s=p.config.columnMenu;if(Array.isArray(s))return s;if(!v(s))return[];const c=s(o);return Array.isArray(c)?c:[]}const O=(p,o)=>`${p}\0${o}`;function K(p){return p._controlValues||(p._controlValues=new Map),p._controlValues}function E(p,o,s){const c=K(p),l=O(o,s.id);return c.has(l)?c.get(l):s.value}function R(p){return p&&typeof p=="object"?x(p.value)?p.label:p.value:p}function z(p){return String(p&&typeof p=="object"?x(p.label)?R(p):p.label:p)}function V(p,o,s){v(o.action)&&o.action(s),p.fire("column:control",{...s,controlType:s.type})}function X(p,o,s){const c=p.doc.createElement("button");return c.className=`${ee}__ctl-btn`,c.setAttribute("type","button"),c.textContent=s.label==null?"":String(s.label),s.disabled&&(c.disabled=!0),c.addEventListener("click",l=>{s.disabled||V(p,s,{column:o.id,control:s.id,type:"button",value:void 0,el:c,originalEvent:l})}),c}function oe(p,o,s,c,l){const{doc:f}=p,k=Array.isArray(s.options)?s.options:[],_=E(p,o.id,s),F=K(p),G=(A,re,ce)=>{F.set(O(o.id,s.id),A),V(p,s,{column:o.id,control:s.id,type:"select",value:A,el:ce,originalEvent:re})},Y=p.config.form;if(Y&&v(Y.createSelect)){const A=f.createElement("div");A.className=`${ee}__select`,c.appendChild(A);const re=Y.createSelect(A,{options:k,value:_,placeholder:s.placeholder,ariaLabel:s.ariaLabel,disabled:!!s.disabled,t:l,doc:f});c.__handle=re,(p._controlHandles||(p._controlHandles=[])).push(re),A.addEventListener("change",ce=>{G(re.getValue(),ce,A)});return}const ye=f.createElement("select");if(ye.className=`${ee}__select`,s.ariaLabel&&ye.setAttribute("aria-label",s.ariaLabel),s.disabled&&(ye.disabled=!0),s.placeholder!=null){const A=f.createElement("option");A.value="",A.textContent=String(s.placeholder),A.disabled=!0,ye.appendChild(A)}k.forEach((A,re)=>{const ce=f.createElement("option");ce.value=String(re),ce.textContent=z(A),ye.appendChild(ce)});const Pe=k.findIndex(A=>!x(_)&&String(R(A))===String(_));ye.value=Pe>=0?String(Pe):"",ye.addEventListener("change",A=>{const re=ye.value===""?void 0:R(k[Number(ye.value)]);G(re,A,ye)}),c.appendChild(ye)}function H(p,o,s,c){const l=p.doc.createElement("div");if(l.className=`${ee}__control`,l.dataset.control=String(s.id),l.dataset.type=String(s.type),s.type==="button")l.appendChild(X(p,o,s));else if(s.type==="select")oe(p,o,s,l,c);else if(s.type==="custom"&&v(s.render)){const f=s.render(o,l);f&&f.nodeType===1&&f.parentNode!==l&&l.appendChild(f)}return l}function P(p,o,s){if(o.collapsed)return null;const c=j(p,o).filter(f=>f&&!x(f.id));if(!c.length)return null;const l=p.doc.createElement("div");l.className=`${ee}__controls`,l.setAttribute("role","group"),l.dataset.column=o.id;for(const f of c)l.appendChild(H(p,o,f,s));return l}function I(p){const o=p._controlHandles;if(p._controlHandles=[],!!o)for(const s of o)s&&v(s.destroy)&&s.destroy()}function M(p,o,s,c,l){const f=(p.model.columns||[]).find(F=>F.id===o),k=f?j(p,f).find(F=>F&&F.id===s):null;if(!c.length)return k?E(p,o,k):void 0;if(K(p).set(O(o,s),c[0]),!p.el||!f||!k)return p;const _=`.${ee}__controls[data-column="${String(o).replace(/["\\]/g,"\\$&")}"] > .${ee}__control`;for(const F of p.el.querySelectorAll(_)){if(F.dataset.control!==String(s))continue;const G=F.__handle;G&&(p._controlHandles=(p._controlHandles||[]).filter(Y=>Y!==G),v(G.destroy)&&G.destroy()),F.parentNode.replaceChild(H(p,f,k,l),F)}return p}}),Ue("packages/modules/kanban/workflow.js",function(g,J){"use strict";Object.defineProperty(g,"TRANSITIONS_WILDCARD",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"allowedTargets",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"laneRulesFor",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"transitionRuleFor",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"canMove",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"transitionError",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"requiredFor",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"missingRequired",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(g,"requiredError",{enumerable:!0,get:function(){return H}});const a=J("packages/core/src/internal/predicates.js"),v=a.isObject,x=a.isNil,ee=J("packages/core/src/internal/paths.js").getPath,j="*";function u(P,I){return Object.prototype.hasOwnProperty.call(P,I)}function O(P){return P===j||x(P)?null:Array.isArray(P)?new Set(P.map(String)):null}function K(P,I){const M=P.laneRules&&P.laneRules.get(String(I??""))||{};return{transitions:v(M.transitions)?M.transitions:null,require:v(M.require)?M.require:null}}function E(P,I,M){if(M==null)return null;const p=K(P,I);return p.transitions&&u(p.transitions,M)?p.transitions[M]:P.transitions&&u(P.transitions,M)?P.transitions[M]:null}function R(P,I,M,p){if(M==null||String(M)===String(p))return!0;const o=O(E(P,I,M));return o===null?!0:o.has(String(p))}function z(P,I,M,p){const o=O(E(P,I,M)),s=o?[...o]:[];return`kanban.transition: a card in "${M}" cannot move to "${p}"`+(s.length?` — "${M}" allows ${s.map(c=>`"${c}"`).join(", ")}`:" — no column is allowed")}function V(P){return!v(P)||typeof P.field!="string"||P.field===""?null:{field:P.field,label:typeof P.label=="string"?P.label:void 0,editor:typeof P.editor=="function"?P.editor:void 0}}function X(P,I,M){const p=K(P,I),o=p.require&&u(p.require,M)?p.require[M]:P.require&&u(P.require,M)?P.require[M]:null;return Array.isArray(o)?o.map(V).filter(Boolean):[]}function oe(P,I,M,p){return X(P,I,M).filter(o=>{const s=ee(p,o.field);return x(s)||s===""})}function H(P,I,M,p){const o=p.map(s=>s.field).join(", ");return`kanban.require: moving into "${M}" requires ${o}.`}}),Ue("packages/modules/shared/drag-gesture.js",function(g,J){"use strict";Object.defineProperty(g,"attachDragGesture",{enumerable:!0,get:function(){return ee}});const a=300,v=3,x=24,ne=12;function ee(j,u={}){const O=u.holdMs==null?a:u.holdMs,K=typeof u.canStart=="function"?u.canStart:null,E=typeof u.onStart=="function"?u.onStart:null,R=typeof u.onMove=="function"?u.onMove:null,z=typeof u.onEnd=="function"?u.onEnd:null,V=typeof u.onCancel=="function"?u.onCancel:null,X=typeof u.autoScroll=="function"?u.autoScroll:null,oe=Array.isArray(u.autoScroll)?u.autoScroll:[],H=j&&j.ownerDocument?j.ownerDocument:j;if(!j||!H||typeof j.addEventListener!="function")return()=>{};let P=null;function I(A,re,ce,ve,Re){if(ce>=A&&ce<A+x&&ve>0){const Ne=x-(ce-A);return-Math.max(1,Math.round(ne*Ne/x))}if(ce>re-x&&ce<=re&&ve<Re){const Ne=x-(re-ce);return Math.max(1,Math.round(ne*Ne/x))}return 0}function M(){const A=P;if(A){if(P=null,A.holdTimer&&clearTimeout(A.holdTimer),Pe(A),A.started&&A.pressed&&A.pressed.style&&(A.pressed.style.touchAction=A.prevTouchAction),A.pressed&&typeof A.pressed.releasePointerCapture=="function"&&A.pointerId!==void 0)try{A.pressed.releasePointerCapture(A.pointerId)}catch{}H.removeEventListener("pointermove",l),H.removeEventListener("pointerup",k),H.removeEventListener("pointercancel",_),H.removeEventListener("keydown",F),H.removeEventListener("pointerdown",G),H.removeEventListener("touchmove",f)}}function p(A){if(!A.started){if(A.started=!0,A.pressed&&A.pressed.style&&(A.prevTouchAction=A.pressed.style.touchAction||"",A.pressed.style.touchAction="none"),A.pressed&&typeof A.pressed.setPointerCapture=="function"&&A.pointerId!==void 0)try{A.pressed.setPointerCapture(A.pointerId)}catch{}E&&E(A.drag,A.downEvent),ye(A)}}function o(A,re){const ce=A.started;M(),ce&&z&&z(A.drag,re)}function s(A,re){const ce=A.started;M(),ce&&V&&V(A.drag,re)}function c(){const A=P;A&&!A.started&&p(A)}function l(A){const re=P;if(!re||A.pointerId!==void 0&&A.pointerId!==re.pointerId)return;const ce=typeof A.clientX=="number"?A.clientX:re.lastX,ve=typeof A.clientY=="number"?A.clientY:re.lastY;if(re.lastX=ce,re.lastY=ve,re.lastEvent=A,!re.started){if(Math.hypot(ce-re.startX,ve-re.startY)<=v)return;if(re.pointerType==="mouse")p(re);else{M();return}}R&&R(re.drag,A)}function f(A){P&&P.started&&typeof A.preventDefault=="function"&&A.preventDefault()}function k(A){const re=P;re&&(A.pointerId!==void 0&&A.pointerId!==re.pointerId||o(re,A))}function _(A){const re=P;re&&(A.pointerId!==void 0&&A.pointerId!==re.pointerId||s(re,A))}function F(A){P&&A.key==="Escape"&&s(P,A)}function G(A){const re=P;re&&A.pointerId!==void 0&&A.pointerId!==re.pointerId&&s(re,A)}function Y(A){if(A.button!=null&&A.button!==0||P)return;const re=K?K(A):A.target||null;if(!re)return;const ce=typeof A.clientX=="number"?A.clientX:0,ve=typeof A.clientY=="number"?A.clientY:0,Re=A.pointerId,Ne=A.pointerType||"mouse";P={drag:{el:re,pointerId:Re,pointerType:Ne,startX:ce,startY:ve,lastX:ce,lastY:ve},pressed:re,pointerId:Re,pointerType:Ne,startX:ce,startY:ve,lastX:ce,lastY:ve,started:!1,downEvent:A,lastEvent:A,holdTimer:null,prevTouchAction:"",frameId:null},Ne!=="mouse"&&(P.holdTimer=setTimeout(c,O)),H.addEventListener("pointermove",l),H.addEventListener("pointerup",k),H.addEventListener("pointercancel",_),H.addEventListener("keydown",F),H.addEventListener("pointerdown",G),Ne==="touch"&&H.addEventListener("touchmove",f,{passive:!1})}function ye(A){if(typeof requestAnimationFrame!="function"||!X&&!oe.length)return;function re(){const ce=P;if(!ce||ce!==A||!ce.started){A.frameId=null;return}const ve=X?X():oe;let Re=!1;if(Array.isArray(ve))for(const Ne of ve){if(!Ne||typeof Ne.getBoundingClientRect!="function")continue;const Q=Ne.getBoundingClientRect(),te=I(Q.left,Q.right,ce.lastX,Ne.scrollLeft,Ne.scrollWidth-Ne.clientWidth),ie=I(Q.top,Q.bottom,ce.lastY,Ne.scrollTop,Ne.scrollHeight-Ne.clientHeight);te&&(Ne.scrollLeft+=te,Re=!0),ie&&(Ne.scrollTop+=ie,Re=!0)}Re&&R&&ce.lastEvent&&R(ce.drag,ce.lastEvent),A.frameId=requestAnimationFrame(re)}A.frameId=requestAnimationFrame(re)}function Pe(A){A.frameId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(A.frameId),A.frameId=null}return j.addEventListener("pointerdown",Y),()=>{M(),j.removeEventListener("pointerdown",Y)}}}),Ue("packages/modules/shared/token-scope.js",function(g,J){"use strict";Object.defineProperty(g,"claimTokenScope",{enumerable:!0,get:function(){return v}});const a="lattice-tokens";function v(x,ne){const ee=ne||x.parentElement,j=x.classList.contains(a)||!!(ee&&ee.closest&&ee.closest(".lattice, .lattice-tokens"));return j||x.classList.add(a),()=>{j||x.classList.remove(a)}}}),Ue("packages/modules/shared/emitter.js",function(g,J){"use strict";Object.defineProperty(g,"WILDCARD",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"gate",{enumerable:!0,get:function(){return K}});const v=J("packages/core/src/internal/predicates.js").isFunction,ne=J("packages/core/src/internal/warn.js").warnOnce,ee="*",j=new Set(["api","user","init","ai"]);function u(E,R){return E&&E.name?E.name:`#${R}`}class O{#t=new Map;#e;constructor(R="module"){this.#e=String(R)}on(R,z){if(!v(z))return()=>{};let V=this.#t.get(R);return V||(V=new Set,this.#t.set(R,V)),V.add(z),()=>this.off(R,z)}off(R,z){const V=this.#t.get(R);V&&V.delete(z)}count(R){const z=this.#t.get(R);return z?z.size:0}emit(R,z){const V=this.#t.get(R),X=this.#t.get(ee);if((!V||V.size===0)&&(!X||X.size===0))return;const oe={...z||null,type:R};V&&V.size&&this.#n([...V],oe,R),X&&X.size&&this.#n([...X],oe,ee)}#n(R,z,V){for(let X=0;X<R.length;X++)try{R[X](z)}catch(oe){ne(`${this.#e}.emit.throw:${V}:${u(R[X],X)}`,`${this.#e}: a '${V}' handler threw; other handlers were unaffected.`,oe)}}emitBefore(R,z,V){const X=V??(z&&z.origin),oe=j.has(X)?X:"user";let H=!1,P=null;const I=l=>{H=!0,l!=null&&P===null&&(P=String(l))},M={...z||null,type:R,origin:oe,get defaultPrevented(){return H},get reason(){return P},preventDefault(l){I(l)}},p=this.#t.get(R);if(!p||p.size===0)return!0;const o=[...p],s=()=>(H&&P===null&&(P="prevented"),H&&z&&typeof z=="object"&&(z.reason=P),!H),c=[];for(let l=0;l<o.length;l++){const f=o[l];try{const k=f(M);k&&v(k.then)?c.push(k):k===!1&&I("prevented")}catch(k){I("error"),ne(`${this.#e}.beforeThrow:${R}:${u(f,l)}`,`${this.#e}: a '${R}' before-handler threw; the action was cancelled.`,k)}}return c.length===0?s():Promise.allSettled(c).then(l=>{for(const f of l)f.status==="rejected"?(I("error"),ne(`${this.#e}.beforeReject:${R}`,`${this.#e}: a '${R}' before-handler rejected; the action was cancelled.`,f.reason)):f.value===!1&&I("prevented");return s()})}clear(){this.#t.clear()}}function K(E,R,z,V,X){const oe=E.emitBefore(R,V,V.origin),H=()=>(E.emit(z,{...V,reason:V.reason||"prevented"}),!1);return oe===!1?H():oe&&v(oe.then)?oe.then(P=>P?X():H()):X()}}),Ue("packages/modules/kanban/view.js",function(g,J){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"resolveReadonly",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"boardT",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(g,"renderPreserving",{enumerable:!0,get:function(){return tt}}),Object.defineProperty(g,"applyColumnWidths",{enumerable:!0,get:function(){return gt}}),Object.defineProperty(g,"renderBoard",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"openDetail",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"closeDetail",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(g,"startEdit",{enumerable:!0,get:function(){return _e}}),Object.defineProperty(g,"installSelectionPainter",{enumerable:!0,get:function(){return He}}),Object.defineProperty(g,"openRequiredForm",{enumerable:!0,get:function(){return Ge}}),Object.defineProperty(g,"closeRequiredForm",{enumerable:!0,get:function(){return je}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ee=J("packages/core/src/internal/text.js").escapeHtml,j=J("packages/modules/kanban/styles.js"),u=j.NS,O=j.injectStyles,E=J("packages/modules/kanban/card-parts.js").avatarChip,R=J("packages/modules/kanban/controls.js"),z=R.buildControlStrip,V=R.resolveControls,X=R.resolveColumnMenu,oe=R.destroyControls,H=J("packages/modules/kanban/model.js"),P=H.windowRange,I=H.laneIdOf,p=J("packages/modules/kanban/workflow.js").canMove,s=J("packages/modules/shared/drag-gesture.js").attachDragGesture,l=J("packages/modules/shared/token-scope.js").claimTokenScope,f=J("packages/modules/shared/emitter.js");Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return f.Emitter}});const k=Object.freeze({"kanban.board":"Board","kanban.columnMenu":"Column menu","kanban.columnCards":{one:"{title}, {count} card",other:"{title}, {count} cards"},"kanban.laneCards":{one:"{lane}, {title}, {count} card",other:"{lane}, {title}, {count} cards"},"kanban.blocked":"Blocked","kanban.ready":"Ready","kanban.blockedBy":{one:"blocked by {count} card",other:"blocked by {count} cards"},"kanban.card.assignedTo":"Assigned to {names}","kanban.card.overdue":"Overdue","kanban.card.dueSoon":"Due soon","kanban.card.progress":"{percent}% complete","kanban.card.checklist":"{done} of {total} done","kanban.requiredTitle":"Required fields","kanban.requiredSave":"Save","kanban.requiredCancel":"Cancel","kanban.moveRefused":'Move refused: a card in "{from}" cannot move to "{to}".'});function _(e,t){const i=k[e];if(!i)return e;const h=t&&typeof t.count=="number"?t.count:NaN;return(typeof i=="string"?i:(h===1?i.one:i.other)||i.other).replace(/\{(\w+)\}/g,(y,T)=>t&&T in t?String(t[T]):y)}function F(e,t,i){const h=e&&e.config?e.config:{},m=h.messages&&v(h.messages.t)&&h.messages||h.grid&&h.grid.messages&&v(h.grid.messages.t)&&h.grid.messages||null;if(m){let y;try{y=m.t(t,i)}catch{y=null}if(typeof y=="string"&&y&&y!==t)return y}return _(t,i)}function G(e){if(e===!0)return()=>!0;if(!e||typeof e!="object")return()=>!1;const t=e.columns||{},i=e.cards||{};return({column:h,card:m}={})=>e.board===!0||!x(h)&&t[h]===!0||!x(m)&&i[m]===!0}function Y(e,t,i,h,m,y=null){let C=`${t.fields.title||String(t.key)}, ${i.title}, ${h+1} of ${m}`;return t.assignees&&t.assignees.length&&(C+=`, ${F(e,"kanban.card.assignedTo",{names:t.assignees.map(S=>S.name).join(", ")})}`),t.due&&t.due.state&&(C+=`, ${F(e,t.due.state==="overdue"?"kanban.card.overdue":"kanban.card.dueSoon")}`),t.progressPct!==null&&t.progressPct!==void 0&&(C+=`, ${F(e,"kanban.card.progress",{percent:t.progressPct})}`),t.checklist&&t.checklist.total>0&&(C+=`, ${F(e,"kanban.card.checklist",{done:t.checklist.done,total:t.checklist.total})}`),y&&(y.level==="warn"||y.level==="breach")?`${C}, ${y.level==="breach"?"SLA breached":"ageing"}, age ${y.ageText}`:C}function ye(e){return e.level==="breach"?`SLA breached — age ${e.ageText} (limit passed)`:e.level==="warn"?`Ageing — age ${e.ageText}`:`Age ${e.ageText}`}function Pe(e,t,i,h){const{ctx:m,doc:y,isReadonly:T}=e,C=y.createElement("li");C.className=`${u}__card`,C.setAttribute("role","listitem"),C.setAttribute("tabindex","-1"),C.setAttribute("data-key",String(t.key)),C.dataset.column=i.id;const S=e.sla&&v(e.sla.stateFor)?e.sla.stateFor(t):null;S&&S.level&&S.level!=="ok"&&(C.dataset.sla=S.level),t.blocked&&(C.dataset.blocked="true"),t.ready&&(C.dataset.ready="true"),C.setAttribute("aria-label",Y(e,t,i,h,i.count,S)),C.setAttribute("aria-selected","false");const B=T({column:i.id,card:t.key});B&&C.setAttribute("aria-readonly","true");const ue=t.fields.accent;!x(ue)&&ue!==""&&(C.dataset.accent="",C.style.borderLeftColor=String(ue));const de=e.config.cardRenderer;if(v(de)){C.dataset.custom="true";const q=de(t,{column:i,readonly:B,el:C,doc:y});return typeof q=="string"?C.innerHTML=q:q&&q.nodeType&&C.appendChild(q),C}const ke=[];!x(t.fields.cover)&&t.fields.cover!==""&&ke.push(`<div class="${u}__cover" style="background-image:url(${ee(String(t.fields.cover))})" role="presentation"></div>`),t.fields.title&&ke.push(`<div class="${u}__card-title">${ee(t.fields.title)}</div>`),t.fields.subtitle&&ke.push(`<div class="${u}__card-subtitle">${ee(t.fields.subtitle)}</div>`),t.progressPct!==null&&t.progressPct!==void 0&&ke.push(`<div class="${u}__progress" role="progressbar" aria-valuenow="${t.progressPct}" aria-valuemin="0" aria-valuemax="100"><span class="${u}__progress-bar" style="width:${t.progressPct}%"></span></div>`),t.checklist&&ke.push(`<div class="${u}__checklist"><span class="${u}__checklist-done">${t.checklist.done}</span><span class="${u}__checklist-sep">/</span><span class="${u}__checklist-total">${t.checklist.total}</span></div>`),C.innerHTML=ke.join("");const ae=[],Te=t.assignees||[];if(Te.length){const q=m.cardSpecs.assignee||{},he=Number.isFinite(q.max)&&q.max>0?q.max:2,Me=Te.slice(0,he),Xe=y.createElement("span");Xe.className=`${u}__avatars`;for(const n of Me)Xe.appendChild(E(y,n));const ot=Te.length-Me.length;if(ot>0){const n=y.createElement("span");n.className=`${u}__avatar ${u}__avatar--overflow`,n.textContent=`+${ot}`,n.setAttribute("title",Te.slice(he).map(d=>d.name).join(", ")),Xe.appendChild(n)}ae.push(Xe)}if(t.fields.labels)for(const q of String(t.fields.labels).split(",").map(he=>he.trim()).filter(Boolean)){const he=y.createElement("span");he.className=`${u}__label`,he.textContent=q,t.labelTones&&t.labelTones[q]&&(he.dataset.tone=t.labelTones[q]),ae.push(he)}if(t.due&&t.due.text){const q=y.createElement("span");if(q.className=`${u}__due`,t.due.state){q.dataset.state=t.due.state;const he=y.createElement("span");he.className=`${u}__due-icon`,he.setAttribute("aria-hidden","true"),he.textContent=t.due.state==="overdue"?"⚠":"◷",q.appendChild(he)}q.appendChild(y.createTextNode(t.due.text)),ae.push(q)}if(t.fields.badges){const q=y.createElement("span");q.className=`${u}__badge`,q.textContent=t.fields.badges,t.badgeTone&&(q.dataset.tone=t.badgeTone),ae.push(q)}if(m.pointsProperty&&t.hasPoints){const q=y.createElement("span");q.className=`${u}__badge`,q.setAttribute("data-role","points"),q.textContent=String(t.points),ae.push(q)}if(S&&S.ageText&&(S.level==="warn"||S.level==="breach"||e.sla.config.showAge==="always"&&S.ageMs!==null)){const q=y.createElement("span");q.className=`${u}__age`,q.setAttribute("data-sla",S.level||""),q.setAttribute("title",ye(S)),q.textContent=S.ageText,ae.push(q)}if(t.explicitBlocked){const q=t.blockedReason,he=q?`${ze(e,"blocked")}: ${q}`:ze(e,"blocked"),Me=y.createElement("span");Me.className=`${u}__blocked`,Me.setAttribute("role","img"),Me.setAttribute("aria-label",he);const Xe=y.createElement("span");if(Xe.className=`${u}__blocked-icon`,Xe.setAttribute("aria-hidden","true"),Xe.textContent="⛔",Me.appendChild(Xe),q){const ot=y.createElement("span");ot.className=`${u}__blocked-reason`,ot.textContent=q,Me.appendChild(ot)}ae.push(Me)}if(t.ready){const q=y.createElement("span");q.className=`${u}__ready`,q.setAttribute("role","img"),q.setAttribute("aria-label",ze(e,"ready")),q.textContent=`✓ ${ze(e,"ready")}`,ae.push(q)}if(ae.length){const q=y.createElement("div");q.className=`${u}__card-meta`;for(const he of ae)q.appendChild(he);C.appendChild(q)}if(t.blockedBy&&t.blockedBy.length){const q=y.createElement("div");q.className=`${u}__blockedby`,q.setAttribute("role","group"),q.setAttribute("aria-label",F(e,"kanban.blockedBy",{count:t.blockedBy.length}));for(const he of t.blockedBy){const Me=e.model.cardsByKey.get(he),Xe=Me&&Me.fields.title||String(he),ot=y.createElement("button");ot.type="button",ot.className=`${u}__blockedby-chip`,ot.dataset.blocker=String(he),ot.textContent=Xe,q.appendChild(ot)}C.appendChild(q)}return C}function A(e,t){const{ctx:i,doc:h}=e,m=h.createElement("section");m.className=`${u}__column`,m.setAttribute("role","group"),m.dataset.column=t.id,t.collapsed&&(m.dataset.collapsed="true"),t.over&&(m.dataset.over="true");const y=`${u}-h-${Ie(t.id)}`,T=Ne(e,t,y);m.setAttribute("aria-labelledby",y),m.appendChild(T);const C=z(e,t,Q(e));C&&m.appendChild(C);const S=h.createElement("ul");if(S.className=`${u}__cards`,S.dataset.column=t.id,S.setAttribute("role","list"),S.setAttribute("aria-label",F(e,"kanban.columnCards",{title:t.title,count:t.count})),ce(e,S,t.cards,t),m.appendChild(S),e.config.addCard&&!e.isReadonly({column:t.id})){const B=h.createElement("button");B.className=`${u}__add`,B.setAttribute("type","button"),B.dataset.column=t.id;const ue=e.config.labels&&e.config.labels.addCard;B.setAttribute("aria-label",[ue,t.title].filter(Boolean).join(" ")),B.textContent=ue||"+",m.appendChild(B)}return m}function re(e,t,i,h){if(!e.sourceBound||!v(e.loadMore)||t.__loadWired)return;t.__loadWired=!0;const m=()=>{if(t.__loadRaf)return;const y=e.doc.defaultView,T=y&&v(y.requestAnimationFrame)?y.requestAnimationFrame.bind(y):(C=>setTimeout(C,16));t.__loadRaf=T(()=>{t.__loadRaf=0,t.scrollHeight-t.scrollTop-t.clientHeight<Math.max(t.clientHeight,200)*2&&e.loadMore(i.id,h)})};t.addEventListener("scroll",m)}function ce(e,t,i,h,m){const{ctx:y,doc:T}=e;for(;t.firstChild;)t.removeChild(t.firstChild);const C=(B,ue)=>{const de=Pe(e,B,h,ue);m!==void 0&&(de.dataset.lane=m),t.appendChild(de)};if(!i.length){const B=T.createElement("li");B.className=`${u}__empty`,B.setAttribute("role","presentation"),y.emptyText&&(B.textContent=y.emptyText),t.appendChild(B);return}const S=y.virtualize;if(S&&i.length>S.threshold){t.dataset.virtual="true";const B=()=>{const ue=t.clientHeight||S.viewport,de=P(t.scrollTop||0,ue,S.rowHeight,i.length,S.overscan),ke=t.__win;if(!(ke&&ke.start===de.start&&ke.end===de.end&&ke.count===i.length)){for(t.__win={start:de.start,end:de.end,count:i.length};t.firstChild;)t.removeChild(t.firstChild);t.appendChild(Re(T,de.padTop));for(let ae=de.start;ae<de.end;ae++)C(i[ae],ae);t.appendChild(Re(T,de.padBottom)),v(e.paintSelection)&&e.paintSelection()}};if(t.__win=null,B(),!t.__virtualWired){const ue=()=>{if(t.__raf)return;const de=T.defaultView,ke=de&&v(de.requestAnimationFrame)?de.requestAnimationFrame.bind(de):(ae=>setTimeout(ae,16));t.__raf=ke(()=>{t.__raf=0,B()})};t.addEventListener("scroll",ue),t.__virtualWired=!0}re(e,t,h,m);return}i.forEach(C),re(e,t,h,m)}function ve(e){const{el:t,doc:i}=e,h=e.status||{};if(!h.loading&&!h.error)return;const m=i.createElement("div");if(m.className=`${u}__status`,h.error)m.dataset.kind="error",m.setAttribute("role","alert"),m.textContent=h.error;else{m.dataset.kind="loading",m.setAttribute("role","status"),m.setAttribute("aria-busy","true");const y=e.config.labels&&e.config.labels.loading;y&&(m.textContent=y)}t.appendChild(m)}function Re(e,t){const i=e.createElement("li");return i.className=`${u}__spacer`,i.setAttribute("role","presentation"),i.style.height=`${t}px`,i}function Ne(e,t,i){const{ctx:h,doc:m}=e,y=m.createElement("div");y.className=`${u}__header`,y.id=i,y.dataset.column=t.id,y.appendChild(ie(t.collapsed,m));const T=m.createElement("span");T.className=`${u}__headcontent`;const C=[];t.color&&C.push(`<span class="${u}__accent" style="background:${ee(String(t.color))}"></span>`),C.push(`<span class="${u}__title">${ee(t.title)}</span>`);const S=t.over?' data-over="true"':"";return C.push(`<span class="${u}__count"${S}>${t.count}${t.wipLimit!==null?`/${t.wipLimit}`:""}</span>`),h.showPoints&&h.pointsProperty&&C.push(`<span class="${u}__points" title="points">${Ve(t.points)}</span>`),T.innerHTML=C.join(""),y.appendChild(T),X(e,t).length&&y.appendChild(te(e,m)),y}function Q(e){return(t,i)=>F(e,t,i)}function te(e,t){const i=t.createElement("button");return i.className=`${u}__menubtn`,i.setAttribute("type","button"),i.setAttribute("aria-haspopup","menu"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",F(e,"kanban.columnMenu")),i.textContent="⋯",i}function ie(e,t){const i=t.createElement("button");return i.className=`${u}__toggle`,i.setAttribute("type","button"),i.setAttribute("tabindex","-1"),i.setAttribute("aria-expanded",e?"false":"true"),i.textContent=e?"▸":"▾",i}function qe(e){const{el:t,ctx:i,doc:h}=e;t.dataset.swimlanes="true";const m=e.model.columns,y=h.createElement("div");y.className=`${u}__colheads`,y.style.setProperty("--cols",String(m.length));const T=h.createElement("div");T.className=`${u}__corner`,y.appendChild(T);for(const S of m)y.appendChild(Ne(e,S,`${u}-h-${Ie(S.id)}`));const C=m.map(S=>z(e,S,Q(e)));if(C.some(Boolean)){const S=h.createElement("div");S.className=`${u}__corner`,y.appendChild(S),C.forEach(B=>y.appendChild(B||h.createElement("div")))}t.appendChild(y);for(const S of e.model.lanes){const B=h.createElement("section");B.className=`${u}__lane`,B.dataset.lane=S.id,S.collapsed&&(B.dataset.collapsed="true"),B.setAttribute("role","group");const ue=h.createElement("div");ue.className=`${u}__lanehead`,ue.dataset.lane=S.id,ue.appendChild(ie(S.collapsed,h));const de=h.createElement("span");de.className=`${u}__headcontent`;const ke=i.showPoints&&i.pointsProperty?`<span class="${u}__points">${Ve(S.points)}</span>`:"";if(de.innerHTML=`<span class="${u}__lane-title">${ee(S.title)}</span><span class="${u}__count">${S.count}</span>${ke}`,ue.appendChild(de),B.appendChild(ue),!S.collapsed){const ae=h.createElement("div");ae.className=`${u}__lanerow`,ae.style.setProperty("--cols",String(m.length));const Te=h.createElement("div");Te.className=`${u}__corner`,ae.appendChild(Te);for(const q of S.columns){const he=h.createElement("ul");he.className=`${u}__cards`,he.dataset.column=q.id,he.dataset.lane=S.id,he.setAttribute("role","list"),he.setAttribute("aria-label",F(e,"kanban.laneCards",{lane:S.title,title:q.title,count:q.count}));const Me=m.find(Xe=>Xe.id===q.id)||q;ce(e,he,q.cards,Me,S.id),ae.appendChild(he)}B.appendChild(ae)}t.appendChild(B)}}function xe(e){const{el:t,doc:i}=e;if(!t)return null;const h={};for(const y of t.querySelectorAll(`.${u}__cards`))h[`${y.dataset.lane||""}|${y.dataset.column}`]=y.scrollTop;const m=i&&i.activeElement&&i.activeElement.closest?i.activeElement.closest(`.${u}__card`):null;return{boardTop:t.scrollTop,boardLeft:t.scrollLeft,lists:h,focusKey:m?m.dataset.key:null}}function Ze(e,t){const{el:i}=e;if(!(!i||!t)){i.scrollTop=t.boardTop,i.scrollLeft=t.boardLeft;for(const h of i.querySelectorAll(`.${u}__cards`)){const m=`${h.dataset.lane||""}|${h.dataset.column}`;t.lists[m]!==void 0&&(h.scrollTop=t.lists[m])}if(t.focusKey!=null){const h=i.querySelector(`.${u}__card[data-key="${mt(String(t.focusKey))}"]`);h&&(h.setAttribute("tabindex","0"),h.focus&&h.focus())}}}function tt(e){if(!e.el)return;const t=xe(e),i=e.detail,h=e.detailOverlay,m=h||i&&i.el;m&&m.parentNode&&m.parentNode.removeChild(m),e.detail=null,e.detailOverlay=null,b(e),i&&(e.el.appendChild(m),e.detail=i,e.detailOverlay=h),Ze(e,t)}function Ve(e){return Number.isInteger(e)?String(e):String(Math.round(e*100)/100)}function Ie(e){return String(e).replace(/[^\w-]/g,"_")}const Fe="data-lattice-row";function ft(e){const t=[];for(const i of e.children)i.hasAttribute&&i.hasAttribute(Fe)&&t.push(i);return t}function gt(e){const{el:t,ctx:i,doc:h}=e;if(!t)return;const m=h&&h.defaultView,y=m&&v(m.getComputedStyle)?m.getComputedStyle(t):null,T=y&&v(y.getPropertyValue)?String(y.getPropertyValue("--lattice-board-column-width")||"").trim():"";if(delete t.dataset.columnwidth,t.style.removeProperty("--lattice-kanban-column-min"),t.style.removeProperty("--lattice-kanban-column-width"),t.style.removeProperty("--lattice-kanban-column-max"),T)return;const C=i.columnWidth;if(typeof C=="number"){t.dataset.columnwidth="fixed",t.style.setProperty("--lattice-kanban-column-width",`${C}px`);return}C!=="auto"&&(t.dataset.columnwidth="fill",t.style.setProperty("--lattice-kanban-column-min",`${i.minColumnWidth}px`),i.maxColumnWidth&&t.style.setProperty("--lattice-kanban-column-max",`${i.maxColumnWidth}px`))}function b(e){const{el:t,ctx:i,doc:h}=e;if(!t)return;e.sla&&v(e.sla.sync)&&e.sla.sync(),O(h),dt(e),oe(e),le(e),Z(e),t.classList.add(u),e._tokenScopeOff||(e._tokenScopeOff=l(t)),t.setAttribute("role","group"),t.setAttribute("aria-label",e.config.ariaLabel||F(e,"kanban.board")),e.isReadonly({})?t.dataset.readonly="true":delete t.dataset.readonly,t.dataset.density=i.density||"comfortable";const m=ft(t);for(;t.firstChild;)t.removeChild(t.firstChild);if(e.model.lanes)qe(e);else{delete t.dataset.swimlanes;for(const T of e.model.columns)t.appendChild(A(e,T))}gt(e),ve(e);const y=h.createElement("div");y.className=`${u}__live`,y.setAttribute("aria-live","polite"),y.setAttribute("role","status"),y.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;",t.appendChild(y),e.live=y;for(const T of m)t.appendChild(T);ge(t),e.paintSelection(),w(e),e.wired||(pt(e),e.wired=!0)}function w(e){if(!e.el||!v(e.canExpand))return;const t=e.config.labels&&e.config.labels.expand;for(const i of e.el.querySelectorAll(`.${u}__card`)){const h=e.model.cardsByKey.get(nt(e,i.dataset.key));if(!h||!e.canExpand(h))continue;const m=e.doc.createElement("button");m.className=`${u}__drill`,m.setAttribute("type","button"),m.setAttribute("tabindex","-1"),m.setAttribute("aria-label",[t,h.fields.title||String(h.key)].filter(Boolean).join(" ")),m.textContent="⤢",i.appendChild(m)}}function D(e,t,i,h){if(!e.el)return null;Z(e);const{doc:m}=e,y=e.config.children&&e.config.children.present||"drawer",T=m.createElement("section");T.className=`${u}__detail`,T.dataset.present=y,T.dataset.depth=String(h),T.setAttribute("role",y==="modal"?"dialog":"group"),T.setAttribute("aria-modal",y==="modal"?"true":"false");const C=m.createElement("div");C.className=`${u}__detail-head`;const S=m.createElement("span");S.className=`${u}__detail-title`;const B=e.config.children&&e.config.children.title;S.textContent=v(B)?String(B(t)):t.fields.title||String(t.key);const ue=m.createElement("button");ue.className=`${u}__detail-close`,ue.setAttribute("type","button");const de=e.config.labels&&e.config.labels.close;de&&ue.setAttribute("aria-label",de),ue.textContent="✕",C.appendChild(S),C.appendChild(ue);const ke=m.createElement("div");ke.className=`${u}__detail-body`,T.appendChild(C),T.appendChild(ke);let ae=e.el;if(y==="modal"){const q=m.createElement("div");q.className=`${u}__overlay`,q.appendChild(T),e.el.appendChild(q),e.detailOverlay=q}else if(y==="inline"){const q=e.el.querySelector(`.${u}__card[data-key="${mt(String(t.key))}"]`);ae=q&&q.parentNode?q.parentNode:e.el,q&&q.nextSibling?ae.insertBefore(T,q.nextSibling):ae.appendChild(T)}else e.el.appendChild(T);const Te=e.buildChild(ke,t,i,h);return e.detail={el:T,handle:Te,card:t},ue.focus&&ue.focus(),e.detail}function Z(e){if(!e.detail)return;const{handle:t,el:i}=e.detail;t&&v(t.destroy)&&t.destroy();const h=e.detailOverlay||i;h&&h.parentNode&&h.parentNode.removeChild(h),e.detail=null,e.detailOverlay=null}function _e(e,t,i){if(!e.el)return null;le(e);const h=e.el.querySelector(`.${u}__card[data-key="${mt(String(t))}"]`);if(!h)return null;const m=e.model.cardsByKey.get(t),y=e.ctx.cardSpecs[i]||{},T=m&&m.fields[i]||"";if(v(y.editor)){const S=y.editor({card:m,field:i,value:T,commit:B=>$e(e,B),cancel:()=>le(e)});return e.editing={key:t,field:i,custom:S},S&&S.el&&h.appendChild(S.el),S&&v(S.focus)?S.focus():S&&S.el&&S.el.focus&&S.el.focus(),e.editing}const C=e.doc.createElement("input");return C.className=`${u}__editor`,C.dataset.field=i,C.value=T,C.addEventListener("keydown",S=>{S.stopPropagation&&S.stopPropagation(),S.key==="Enter"?(S.preventDefault&&S.preventDefault(),$e(e,C.value)):S.key==="Escape"&&(S.preventDefault&&S.preventDefault(),le(e))}),C.addEventListener("blur",()=>{e.editing&&e.editing.input===C&&$e(e,C.value)}),e.editing={key:t,field:i,input:C},h.appendChild(C),C.focus&&C.focus(),C.select&&C.select(),e.editing}function $e(e,t){const i=e.editing;i&&(e.editing=null,i.custom&&v(i.custom.destroy)?i.custom.destroy():i.input&&i.input.parentNode&&i.input.parentNode.removeChild(i.input),e.applyEdit(i.key,i.field,t))}function le(e){const t=e.editing;t&&(e.editing=null,t.custom&&v(t.custom.destroy)?t.custom.destroy():t.input&&t.input.parentNode&&t.input.parentNode.removeChild(t.input))}function ge(e){const t=e.querySelector(`.${u}__card`);t&&t.setAttribute("tabindex","0")}function fe(e,t){e.live&&(e.live.textContent=t)}function me(e,t,i){const h=t.length?e.model.cardsByKey.get(t[0]):null,m=h?h.columnId:"";fe(e,F(e,"kanban.moveRefused",{from:m,to:i}))}function pe(e,t){const i=e.config.labels;return i&&typeof i[t]=="string"?i[t]:""}function ze(e,t){return pe(e,t)||F(e,`kanban.${t}`)}function Se(e,t,i,h,m=""){const y=e.model.columns.find(B=>B.id===i),T=y?Math.max(y.count,h+1):h+1,C=t.fields.title||String(t.key),S=y?y.title:i;return[m,C,S,`${h+1}/${T}`].filter(Boolean).join(", ")}function He(e){e.paintSelection=()=>{if(e.el)for(const t of e.el.querySelectorAll(`.${u}__card`)){const i=nt(e,t.dataset.key),h=e.selectionSet&&e.selectionSet.has(i);h?t.dataset.selected="true":delete t.dataset.selected,t.setAttribute("aria-selected",h?"true":"false")}}}function pt(e){const{el:t}=e;t.addEventListener("click",i=>{const h=i.target&&i.target.closest?i.target.closest(`.${u}__menubtn`):null;if(h){i.preventDefault&&i.preventDefault(),e.menu&&e.menuAnchor===h?dt(e,!0):se(e,h.closest(`.${u}__header`),h);return}if(i.target&&i.target.closest){if(i.target.closest(`.${u}__detail-close`)){i.preventDefault&&i.preventDefault(),e.closeDetail();return}const C=i.target.closest(`.${u}__add`);if(C){i.preventDefault&&i.preventDefault(),e.addCard(C.dataset.column);return}const S=i.target.closest(`.${u}__drill`);if(S){i.preventDefault&&i.preventDefault();const B=at(e,S);B&&e.expand(B.card.key);return}}const m=i.target&&i.target.closest?i.target.closest(`.${u}__blockedby-chip`):null;if(m){i.preventDefault&&i.preventDefault(),wt(e,m.dataset.blocker);return}const y=i.target&&i.target.closest?i.target.closest(`.${u}__toggle`):null;if(y){const C=y.closest(`.${u}__header, .${u}__lanehead`);i.preventDefault&&i.preventDefault(),C&&C.classList.contains(`${u}__lanehead`)?e.collapseLane(C.dataset.lane):C&&e.collapseColumn(C.dataset.column);return}const T=at(e,i.target);T&&(lt(e,T.card,i),e.fire("card:click",{card:T.card,column:T.card.columnId,el:T.el,originalEvent:i}))}),t.addEventListener("dblclick",i=>{const h=at(e,i.target);if(h&&(e.fire("card:dblclick",{card:h.card,column:h.card.columnId,el:h.el,originalEvent:i}),v(e.editCard))){const m=Object.keys(e.ctx.cardSpecs).find(y=>e.isFieldEditable(y));m&&e.editCard(h.card.key,m)}}),t.addEventListener("contextmenu",i=>{const h=at(e,i.target);if(!h){const m=i.target&&i.target.closest?i.target.closest(`.${u}__header`):null;m&&se(e,m,null,i);return}if(Ce(e)){Ye(e,h,i);return}e.fire("card:contextmenu",{card:h.card,column:h.card.columnId,el:h.el,originalEvent:i})}),t.addEventListener("keydown",i=>r(e,i)),s(t,{canStart:i=>{const h=i.target;if(!h||!h.closest||h.closest(`.${u}__menubtn`))return null;const m=h.closest(`.${u}__lanehead`);if(m&&!at(e,h))return m;const y=h.closest(`.${u}__header`);if(y&&!at(e,h))return y;const T=at(e,h);return!T||e.isReadonly({column:T.card.columnId,card:T.card.key})?null:T.el},onStart:(i,h)=>{const m=i.el;if(m.classList.contains(`${u}__lanehead`)){e.laneDrag=m.dataset.lane;return}if(m.classList.contains(`${u}__header`)){e.colDrag=m.dataset.column;return}const y=at(e,m);if(!y||e.isReadonly({column:y.card.columnId,card:y.card.key}))return;const T=yt(e,y.card.key);e.drag={keys:T},y.el.dataset.dragging="true",e.fire("drag:start",{keys:T,card:y.card,originalEvent:h})},onMove:(i,h)=>{if(e.colDrag||e.laneDrag||!e.drag)return;const m=kt(e,vt(e,h));if(!m)return;const y=U(e,m.columnId);et(e,m.columnId,m.lane,y),y?rt(e,m.columnId,m.index,e.drag.keys,m.lane):Qe(e)},onEnd:(i,h)=>{if(e.laneDrag){const C=vt(e,h),S=C&&C.closest?C.closest(`.${u}__lanehead`):null,B=S?S.dataset.lane:null,ue=e.laneDrag;e.laneDrag=null,B!==ue&&e.moveLane(ue,B);return}if(e.colDrag){const C=vt(e,h),S=C&&C.closest?C.closest(`.${u}__header`):null,B=S?S.dataset.column:null,ue=e.colDrag;e.colDrag=null,B!==ue&&e.moveColumn(ue,B);return}if(!e.drag)return;const m=kt(e,vt(e,h)),y=m&&U(e,m.columnId),T=e.drag.keys;N(e),ct(e),y?e.requestMove(T,m.columnId,m.index,m.lane):m&&me(e,T,m.columnId),e.fire("drag:end",{keys:T,originalEvent:h})},onCancel:(i,h)=>{if(e.colDrag=null,e.laneDrag=null,ct(e),e.drag){const m=e.drag.keys;N(e),e.fire("drag:end",{keys:m,originalEvent:h})}},autoScroll:[t]})}function at(e,t){const i=t&&t.closest?t.closest(`.${u}__card`):null;if(!i)return null;const h=e.model.cardsByKey.get(nt(e,i.dataset.key));return h?{el:i,card:h}:null}function wt(e,t){if(!e.el)return;const i=e.el.querySelector(`.${u}__card[data-key="${mt(String(t))}"]`);if(i){for(const h of e.el.querySelectorAll(`.${u}__card`))h.setAttribute("tabindex","-1");i.setAttribute("tabindex","0"),i.focus&&i.focus(),i.scrollIntoView&&i.scrollIntoView({block:"nearest"})}}function yt(e,t){return e.selectionSet&&e.selectionSet.size>1&&e.selectionSet.has(t)?[...e.selectionSet]:(e.select(t,"set"),[t])}function lt(e,t,i){if(e.config.selectable!==!1){if(i.ctrlKey||i.metaKey){e.select(t.key,"toggle");return}if(i.shiftKey){const h=e.model.columns.find(S=>S.id===t.columnId),m=h?h.cards.map(S=>S.key):[t.key],y=e.selectionAnchor,T=y!=null?m.indexOf(y):-1,C=m.indexOf(t.key);if(T>=0&&C>=0){const[S,B]=T<C?[T,C]:[C,T];e.select(m.slice(S,B+1),"set");return}}e.select(t.key,"set"),e.selectionAnchor=t.key}}function nt(e,t){if(e.model.cardsByKey.has(t))return t;const i=Number(t);return!Number.isNaN(i)&&e.model.cardsByKey.has(i)?i:t}function St(e,t,i,h){const m=e.model.columns.find(C=>C.id===t),y=m?m.cards.filter(C=>!h.includes(C.key)):[];if(x(i))return y.length;const T=y.findIndex(C=>C.key===i);return T<0?y.length:T}function vt(e,t){const i=e.doc;if(i&&v(i.elementFromPoint)&&typeof t.clientX=="number"&&typeof t.clientY=="number"){const h=i.elementFromPoint(t.clientX,t.clientY);if(h)return h}return t.target}function kt(e,t){const i=t&&t.closest?t.closest(`.${u}__cards`):null,h=i||(t&&t.closest?t.closest(`.${u}__column`):null);if(!h)return null;const m=h.dataset.column,y=i&&i.dataset.lane!==void 0?i.dataset.lane:void 0,T=t.closest?t.closest(`.${u}__card`):null,C=T?nt(e,T.dataset.key):null,S=(e.drag||e.grab||{}).keys||[];return{columnId:m,lane:y,index:Ot(e,m,y,C,S)}}function Ot(e,t,i,h,m){if(i===void 0)return St(e,t,h,m);const y=(e.model.lanes||[]).find(B=>B.id===i),T=y&&y.columns.find(B=>B.id===t),C=T?T.cards.filter(B=>!m.includes(B.key)):[];if(x(h))return C.length;const S=C.findIndex(B=>B.key===h);return S<0?C.length:S}function rt(e,t,i,h,m){Qe(e);const y=[...e.el.querySelectorAll(`.${u}__cards`)].find(B=>B.dataset.column===t&&(m===void 0||(B.dataset.lane||"")===m));if(!y)return;const T=[...y.querySelectorAll(`.${u}__card`)].filter(B=>!h.includes(nt(e,B.dataset.key))),C=e.doc.createElement("li");C.className=`${u}__drop`,C.setAttribute("role","presentation");const S=T[i]||null;S?y.insertBefore(C,S):y.appendChild(C),e.dropMarker=C}function Qe(e){e.dropMarker&&e.dropMarker.parentNode&&e.dropMarker.parentNode.removeChild(e.dropMarker),e.dropMarker=null}function N(e){if(Qe(e),e.el)for(const t of e.el.querySelectorAll(`.${u}__card`))delete t.dataset.dragging;e.drag=null}function U(e,t){const i=(e.drag||e.grab||{}).keys||[];for(const h of i){const m=e.model.cardsByKey.get(h);if(m&&!p(e.ctx,I(m.swimlane),m.columnId,t))return!1}return!0}function et(e,t,i,h){ct(e);const m=[...e.el.querySelectorAll(`.${u}__cards`)].filter(y=>y.dataset.column===t&&(i===void 0||(y.dataset.lane||"")===i));for(const y of m){y.setAttribute("aria-dropeffect",h?"move":"none"),h||(y.dataset.nodrop="true");const T=y.closest(`.${u}__column`);T&&(T.setAttribute("aria-dropeffect",h?"move":"none"),h||(T.dataset.nodrop="true"))}}function ct(e){if(e.el)for(const t of e.el.querySelectorAll(`.${u}__column, .${u}__cards`))t.dataset.nodrop&&delete t.dataset.nodrop,t.hasAttribute&&t.hasAttribute("aria-dropeffect")&&t.removeAttribute("aria-dropeffect")}function $t(){return""}function Ge(e,t){if(!e.el)return;je(e);const{doc:i}=e,h=[],m=i.createElement("div");m.className=`${u}__reqform`,m.setAttribute("role","dialog");const y=i.createElement("div");y.className=`${u}__reqform-panel`;const T=i.createElement("div");T.className=`${u}__reqform-title`,T.textContent=F(e,"kanban.requiredTitle"),y.appendChild(T);for(const ke of t.entries){const ae=i.createElement("div");ae.className=`${u}__reqform-field`;const Te=i.createElement("label");Te.className=`${u}__reqform-label`,Te.textContent=ke.label||String(ke.field),ae.appendChild(Te);const q={value:$t()};if(v(ke.editor)){const he=ke.editor({card:ke.card,field:ke.field,value:q.value,commit:Me=>{q.value=Me},cancel:()=>je(e)});he&&he.el&&ae.appendChild(he.el),q.editor=he}else{const he=i.createElement("input");he.className=`${u}__reqform-input`,he.value=q.value,he.addEventListener("input",()=>{q.value=he.value}),he.addEventListener("keydown",Me=>{Me.stopPropagation&&Me.stopPropagation(),Me.key==="Enter"?(Me.preventDefault&&Me.preventDefault(),C()):Me.key==="Escape"&&(Me.preventDefault&&Me.preventDefault(),je(e))}),ae.appendChild(he),q.input=he}y.appendChild(ae),h.push({entry:ke,slot:q})}const C=async()=>{je(e);let ke=!0;for(const ae of h)if(!await e.applyRequired(ae.entry.key,ae.entry.field,ae.slot.value)){ke=!1;break}ke&&await e.move(t.keys,t.toColumn,t.toIndex,t.toLane,{origin:t.origin})},S=i.createElement("div");S.className=`${u}__reqform-actions`;const B=i.createElement("button");B.setAttribute("type","button"),B.className=`${u}__reqform-save`,B.textContent=F(e,"kanban.requiredSave");const ue=i.createElement("button");ue.setAttribute("type","button"),ue.className=`${u}__reqform-cancel`,ue.textContent=F(e,"kanban.requiredCancel"),B.addEventListener("click",C),ue.addEventListener("click",()=>je(e)),S.appendChild(B),S.appendChild(ue),y.appendChild(S),m.appendChild(y),e.el.appendChild(m),e.reqform={overlay:m,controls:h,submit:C};const de=h[0]&&h[0].slot;de&&de.editor&&v(de.editor.focus)?de.editor.focus():de&&de.input&&de.input.focus&&de.input.focus()}function je(e){const t=e.reqform;if(t){e.reqform=null;for(const i of t.controls)i.slot.editor&&v(i.slot.editor.destroy)&&i.slot.editor.destroy();t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay)}}function Ce(e){const t=e.config.contextMenu;return v(t)||Array.isArray(t)&&t.length>0}function ut(e,t){const i=e.config.contextMenu;if(v(i)){const h=e.selection().map(m=>e.model.cardsByKey.get(m)).filter(Boolean);return i(t,h)||[]}return Array.isArray(i)?i:[]}function Ye(e,t,i){i.preventDefault&&i.preventDefault(),dt(e);const h=ut(e,t.card);if(!h.length)return;const m=e.doc.createElement("ul");m.className=`${u}__menu`,m.setAttribute("role","menu"),m.style.cssText=`position:absolute;left:${i.clientX||0}px;top:${i.clientY||0}px;`;for(const T of h){const C=e.doc.createElement("li");C.className=`${u}__menuitem`,C.setAttribute("role","menuitem"),C.setAttribute("tabindex","-1"),T.disabled&&C.setAttribute("aria-disabled","true"),C.textContent=T.label==null?"":String(T.label),C.addEventListener("click",S=>{if(S.preventDefault&&S.preventDefault(),T.disabled)return;const B=e.selection().map(ue=>e.model.cardsByKey.get(ue)).filter(Boolean);v(T.action)&&T.action({card:t.card,cards:B.length?B:[t.card],board:e}),dt(e)}),m.appendChild(C)}e.el.appendChild(m),e.menu=m;const y=m.querySelector(`.${u}__menuitem`);y&&(y.setAttribute("tabindex","0"),y.focus&&y.focus())}function se(e,t,i,h){const m=t?e.model.columns.find(ae=>ae.id===t.dataset.column):null;if(!m)return;const y=X(e,m);if(!y.length)return;h&&h.preventDefault&&h.preventDefault(),dt(e);const T=i?i.getBoundingClientRect():null,C=T?T.left:h.clientX||0,S=T?T.bottom:h.clientY||0,B=e.doc.createElement("ul");B.className=`${u}__menu`,B.setAttribute("role","menu"),B.dataset.column=m.id,B.style.cssText=`position:fixed;left:${C}px;top:${S}px;`;const ue=[];for(const ae of y){const Te=e.doc.createElement("li");Te.className=`${u}__menuitem`,Te.setAttribute("role","menuitem"),Te.setAttribute("tabindex","-1"),ae.disabled&&Te.setAttribute("aria-disabled","true"),Te.textContent=ae.label==null?"":String(ae.label),Te.addEventListener("click",q=>{q.preventDefault&&q.preventDefault(),!ae.disabled&&(dt(e,!0),v(ae.action)&&ae.action({column:m.id,item:ae,board:e}),e.fire("column:menu",{column:m.id,item:ae,el:Te}))}),Te.addEventListener("keydown",q=>{const he=ue.indexOf(Te);if(q.key==="Enter"||q.key===" "){q.preventDefault(),Te.click();return}const Me=q.key==="ArrowDown"?he+1:q.key==="ArrowUp"?he-1:null;if(Me===null)return;q.preventDefault();const Xe=ue[(Me+ue.length)%ue.length];Te.setAttribute("tabindex","-1"),Xe.setAttribute("tabindex","0"),Xe.focus()}),ue.push(Te),B.appendChild(Te)}e.el.appendChild(B),e.menu=B,e.menuAnchor=i||null,i&&i.setAttribute("aria-expanded","true");const de=ae=>{const Te=ae.target;B.contains(Te)||i&&i.contains(Te)||(dt(e),i&&setTimeout(()=>{i.isConnected&&i.focus()},0))};e.doc.addEventListener("mousedown",de,!0),e.menuOff=()=>e.doc.removeEventListener("mousedown",de,!0);const ke=ue[0];ke&&(ke.setAttribute("tabindex","0"),ke.focus&&ke.focus())}function dt(e,t=!1){e.menu&&e.menu.parentNode&&e.menu.parentNode.removeChild(e.menu),e.menu=null,e.menuOff&&(e.menuOff(),e.menuOff=null);const i=e.menuAnchor;e.menuAnchor=null,i&&i.setAttribute("aria-expanded","false"),t&&i&&i.isConnected&&i.focus&&i.focus()}function r(e,t){if(e.editing)return;if(e.menu){t.key==="Escape"&&(t.preventDefault&&t.preventDefault(),dt(e,!0));return}if(e.detail&&t.key==="Escape"){t.preventDefault&&t.preventDefault(),e.closeDetail();return}const{el:i}=e,h=t.target&&t.target.closest?t.target.closest(`.${u}__card`):null;if(!h)return;const m=e.model.cardsByKey.get(nt(e,h.dataset.key));if(!m)return;if(e.grab){_t(e,t);return}if(t.key==="b"||t.key==="B"){if(e.isReadonly({column:m.columnId,card:m.key}))return;t.preventDefault&&t.preventDefault(),v(e.toggleBlocked)&&e.toggleBlocked(m.key);return}if(t.key==="Enter"){t.preventDefault&&t.preventDefault(),e.fire("card:click",{card:m,column:m.columnId,el:h,originalEvent:t});return}if(t.key===" "){if(e.isReadonly({column:m.columnId,card:m.key}))return;t.preventDefault&&t.preventDefault();const T=yt(e,m.key),C=(e.model.columns.find(B=>B.id===m.columnId)?.cards||[]).filter(B=>!T.includes(B.key)),S=e.model.lanes?h.dataset.lane||"":void 0;e.grab={keys:T,columnId:m.columnId,index:Math.min(it(e,m),C.length),cardKey:m.key,laneId:S},fe(e,Se(e,m,m.columnId,e.grab.index,pe(e,"grabbed"))),rt(e,e.grab.columnId,e.grab.index,T,S);return}const y=At(i,h,t.key);y&&(t.preventDefault&&t.preventDefault(),h.setAttribute("tabindex","-1"),y.setAttribute("tabindex","0"),y.focus&&y.focus())}function it(e,t){const i=e.model.columns.find(h=>h.id===t.columnId);return i?i.cards.findIndex(h=>h.key===t.key):0}function _t(e,t){const i=e.grab,h=e.model.cardsByKey.get(i.cardKey),m=e.model.columns,y=m.findIndex(C=>C.id===i.columnId);if(t.key==="Escape"){t.preventDefault&&t.preventDefault(),Qe(e),e.grab=null,fe(e,[pe(e,"cancelled"),h.fields.title||String(h.key)].filter(Boolean).join(", "));return}if(t.key==="Enter"||t.key===" "){t.preventDefault&&t.preventDefault();const{keys:C,columnId:S,index:B,laneId:ue}=i;Qe(e),e.grab=null,Promise.resolve(e.requestMove(C,S,B,e.model.lanes?ue:void 0)).then(de=>{if(!de)return;const ke=e.model.cardsByKey.get(h.key);if(ke){fe(e,Se(e,ke,ke.columnId,it(e,ke),pe(e,"dropped")));const ae=e.el.querySelector(`.${u}__card[data-key="${mt(String(h.key))}"]`);ae&&ae.focus&&(ae.setAttribute("tabindex","0"),ae.focus())}});return}const T=e.model.lanes;if(T&&t.altKey&&(t.key==="ArrowUp"||t.key==="ArrowDown")){const C=T.findIndex(de=>de.id===(i.laneId||"")),S=T[C+(t.key==="ArrowDown"?1:-1)];if(!S)return;i.laneId=S.id;const B=S.columns.find(de=>de.id===i.columnId),ue=(B?B.cards:[]).filter(de=>!i.keys.includes(de.key));i.index=Math.min(i.index,ue.length)}else{const C=(m[y]?.cards||[]).filter(S=>!i.keys.includes(S.key));if(t.key==="ArrowUp")i.index=Math.max(0,i.index-1);else if(t.key==="ArrowDown")i.index=Math.min(C.length,i.index+1);else if(t.key==="ArrowLeft"||t.key==="ArrowRight"){const S=t.key==="ArrowRight"?1:-1;let B=null;for(let de=y+S;de>=0&&de<m.length;de+=S){const ke=m[de];if(U(e,ke.id)){B=ke;break}}if(!B)return;i.columnId=B.id;const ue=B.cards.filter(de=>!i.keys.includes(de.key));i.index=Math.min(i.index,ue.length)}else return}t.preventDefault&&t.preventDefault(),rt(e,i.columnId,i.index,i.keys,e.model.lanes?i.laneId:void 0),fe(e,Se(e,h,i.columnId,i.index,pe(e,"moved")))}function mt(e){return e.replace(/["\\]/g,"\\$&")}function At(e,t,i){const h=t.closest(`.${u}__column`),m=[...h.querySelectorAll(`.${u}__card`)],y=m.indexOf(t);if(i==="ArrowUp")return m[y-1]||null;if(i==="ArrowDown")return m[y+1]||null;if(i==="Home")return m[0]||null;if(i==="End")return m[m.length-1]||null;if(i==="ArrowLeft"||i==="ArrowRight"){const T=[...e.querySelectorAll(`.${u}__column`)],C=T.indexOf(h),S=T[C+(i==="ArrowRight"?1:-1)];if(!S)return null;const B=[...S.querySelectorAll(`.${u}__card`)];return B.length?B[Math.min(y,B.length-1)]:null}return null}}),Ue("packages/core/src/internal/schedule.js",function(g,J){"use strict";Object.defineProperty(g,"now",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return u}});function a(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const v=typeof requestAnimationFrame=="function";function x(O){return v?requestAnimationFrame(O):setTimeout(()=>O(a()),16)}function ne(O){O!=null&&(v?cancelAnimationFrame(O):clearTimeout(O))}function ee(O){let K=null,E=null;const R=()=>{K=null;const V=E;E=null,O(...V||[])},z=(...V)=>{E=V,K===null&&(K=x(R))};return z.cancel=()=>{ne(K),K=null,E=null},z.flush=()=>{K!==null&&(ne(K),R())},z}function j(O,K){let E=null,R=null;const z=()=>{if(E=null,R===null)return;const oe=R;R=null,O(...oe),V()},V=()=>{E=setTimeout(z,K),typeof E?.unref=="function"&&E.unref()},X=(...oe)=>{E===null?(O(...oe),V()):(R=oe,clearTimeout(E),V())};return X.flush=()=>{if(E!==null&&clearTimeout(E),E=null,R===null)return;const oe=R;R=null,O(...oe)},X.cancel=()=>{E!==null&&clearTimeout(E),E=null,R=null},X.pending=()=>E!==null||R!==null,X}function u(O,K=50){return typeof requestIdleCallback=="function"?requestIdleCallback(O,{timeout:K}):setTimeout(()=>O({timeRemaining:()=>0,didTimeout:!0}),1)}}),Ue("packages/modules/kanban/flow.js",function(g,J){"use strict";Object.defineProperty(g,"moments",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"quantileSorted",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"quantile",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"bucketMs",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"summariseDurations",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(g,"TransitionLog",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"createFlowAnalytics",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"FlowAnalytics",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return M}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,O=J("packages/core/src/internal/schedule.js").now;function K(p){let o=0,s=0,c=0;for(let l=0;l<p.length;l++){const f=p[l];o++;const k=f-s;s+=k/o,c+=k*(f-s)}return{n:o,mean:s,m2:c}}function E(p,o){const s=p.length;if(!s)return NaN;if(s===1)return p[0];const c=(s-1)*Math.min(1,Math.max(0,o)),l=Math.floor(c),f=Math.ceil(c);return l===f?p[l]:p[l]+(c-l)*(p[f]-p[l])}function R(p,o){if(!p.length)return NaN;const s=p.slice().sort();return E(s,o)}const z=3600*1e3,V=Object.freeze({hour:z,day:24*z,week:168*z});function X(p){return typeof p=="number"&&Number.isFinite(p)&&p>0?p:V[p]||V.day}function oe(p){const o=[];for(const G of p||[])Number.isFinite(G)&&o.push(G);const s=Float64Array.from(o),c=s.length;if(!c)return{count:0,mean:null,median:null,p50:null,p85:null,p95:null,min:null,max:null,stdev:null,total:0};const l=K(s);let f=s[0],k=s[0],_=0;for(let G=0;G<c;G++){const Y=s[G];Y<f&&(f=Y),Y>k&&(k=Y),_+=Y}const F=R(s,.5);return{count:c,mean:l.mean,median:F,p50:F,p85:R(s,.85),p95:R(s,.95),min:f,max:k,stdev:c>1?Math.sqrt(l.m2/(c-1)):0,total:_}}class H{entries=[];#t=new Map;#e;constructor(o={}){this.#e=v(o.now)?o.now:O}record(o){if(!ne(o)||x(o.key))return null;const s=o.key,c=x(o.to)?null:String(o.to),l=o.from===void 0?this.#t.has(s)?this.#t.get(s):null:x(o.from)?null:String(o.from),f=Number.isFinite(o.at)?Number(o.at):this.#e(),k={key:s,from:l,to:c,at:f};return this.entries.push(k),this.#t.set(s,c),k}remove(o){if(!ne(o))return!1;const s=this.entries.lastIndexOf(o);if(s<0)return!1;this.entries.splice(s,1);let c;for(const l of this.entries)l.key===o.key&&(c=l);return c?this.#t.set(o.key,c.to):this.#t.delete(o.key),!0}hydrate(o){if(Array.isArray(o))for(const s of o)this.record(s);return this}all(){return this.entries.map(o=>({...o}))}byKey(){const o=new Map;for(const s of this.entries)o.has(s.key)||o.set(s.key,[]),o.get(s.key).push(s);for(const s of o.values())s.sort((c,l)=>c.at-l.at);return o}}function P(p,o={}){return new I(p,o)}class I{#t;#e;log;#n=[];#r;#o=new Map;#i=new Map;#s=new Map;constructor(o,s={}){this.#t=o,this.#e=ne(s)?s:{},this.#r=v(this.#e.now)?this.#e.now:O,this.log=new H({now:this.#r}),o&&v(o.on)&&(this.#n.push(o.on("card:move",c=>{const l=Array.isArray(c.keys)?c.keys:[],f=Array.isArray(c.from)?c.from:[],k=this.#r();l.forEach((_,F)=>{const G=this.log.record({key:_,from:f[F],to:c.to,at:k});G&&this.#o.set(_,G)})})),this.#n.push(o.on("card:reverted",c=>{const l=Array.isArray(c.keys)?c.keys:[];for(const f of l){const k=this.#o.get(f);k&&(this.log.remove(k),this.#o.delete(f))}})),this.#n.push(o.on("card:confirmed",c=>{const l=Array.isArray(c.keys)?c.keys:[];for(const f of l)this.#o.delete(f)})),this.#n.push(o.on("card:add",c=>{this.log.record({key:c.key,from:null,to:c.column})})),this.#n.push(o.on("card:edit",c=>{if(!c||c.field!=="blocked")return;const l=c.value,f=typeof l=="string"?l.trim()!=="":!!l,k=this.#r();f?this.#i.has(c.key)||this.#i.set(c.key,{since:k}):this.#c(c.key,k)})))}seed(){if(Array.isArray(this.#e.history))return this.log.hydrate(this.#e.history),this;const o=this.#r(),s=v(this.#t.cards)?this.#t.cards():[];for(const c of s)this.log.record({key:c.key,from:null,to:c.columnId,at:o}),c.explicitBlocked&&this.#i.set(c.key,{since:o});return this}record(o){return this.log.record(o),this}transitions(){return this.log.all()}#l(){return(this.#t.model&&this.#t.model.columns||[]).map(s=>String(s.id))}#a(){const o=this.#l(),s=new Set(Array.isArray(this.#e.doneColumns)?this.#e.doneColumns.map(String):[...this.#t.ctx&&this.#t.ctx.doneColumns?this.#t.ctx.doneColumns:[]].map(String)),c=new Set(Array.isArray(this.#e.startColumns)?this.#e.startColumns.map(String):o.slice(1).filter(f=>!s.has(f))),l=new Set(Array.isArray(this.#e.wipColumns)?this.#e.wipColumns.map(String):[...c]);return{order:o,done:s,start:c,wip:l}}perCard(){const{done:o,start:s}=this.#a(),c=this.log.byKey(),l=this.#r(),f=[];for(const[k,_]of c){const F=_[0].at;let G=null,Y=null;for(const ve of _)G===null&&s.has(ve.to)&&(G=ve.at),Y===null&&o.has(ve.to)&&(Y=ve.at);const ye=_[_.length-1].to,Pe=Y===null?null:Y-F,A=Y===null||G===null||G>Y?null:Y-G,re=this.#u(k,l),ce=A===null||A<=0?null:Math.max(0,Math.min(1,(A-re)/A));f.push({key:k,arrivedAt:F,startedAt:G,doneAt:Y,leadTime:Pe,cycleTime:A,blockedTime:re,flowEfficiency:ce,column:ye})}return f}cycleTime(){return oe(this.perCard().map(o=>o.cycleTime).filter(o=>o!==null))}leadTime(){return oe(this.perCard().map(o=>o.leadTime).filter(o=>o!==null))}#c(o,s){const c=this.#i.get(o);c&&(Number.isFinite(s)&&s>c.since&&this.#s.set(o,(this.#s.get(o)||0)+(s-c.since)),this.#i.delete(o))}#u(o,s){let c=this.#s.get(o)||0;const l=this.#i.get(o);return l&&Number.isFinite(s)&&s>l.since&&(c+=s-l.since),c}blockedTime(){return oe(this.perCard().map(o=>o.blockedTime))}flowEfficiency(){return oe(this.perCard().map(o=>o.flowEfficiency).filter(o=>o!==null))}blockedTimeByColumn(){const o=new Map;for(const s of this.perCard()){const c=String(s.column);o.has(c)||o.set(c,{column:c,blockedMs:0,efficiencySum:0,efficiencyCount:0});const l=o.get(c);l.blockedMs+=s.blockedTime,s.flowEfficiency!==null&&(l.efficiencySum+=s.flowEfficiency,l.efficiencyCount+=1)}return[...o.values()].map(s=>({column:s.column,blockedMs:s.blockedMs,flowEfficiency:s.efficiencyCount?s.efficiencySum/s.efficiencyCount:null}))}#m(o,s,c){const l=[];for(let f=o;f<=s;f+=c)l.push(f);return(!l.length||l[l.length-1]<s)&&l.push(s),l}#d(o={}){const s=this.log.entries,c=s.length?s[0].at:0;let l=c;for(const f of s)f.at>l&&(l=f.at);return{from:Number.isFinite(o.from)?Number(o.from):c,to:Number.isFinite(o.to)?Number(o.to):l}}#f(o,s){const c=new Map;for(const[l,f]of o){let k;for(const _ of f)if(_.at<=s)k=_.to;else break;k!==void 0&&c.set(l,k)}return c}cfd(o={}){const s=X(o.bucket),{order:c,done:l,wip:f}=this.#a(),k=this.log.byKey(),{from:_,to:F}=this.#d(o),G=[];if(this.log.entries.length)for(const Y of this.#m(_,F,s)){const ye=this.#f(k,Y),Pe={};for(const ve of c)Pe[ve]=0;let A=0,re=0,ce=0;for(const ve of ye.values())ve in Pe||(Pe[ve]=0),Pe[ve]+=1,ce+=1,f.has(ve)&&(A+=1),l.has(ve)&&(re+=1);G.push({at:Y,counts:Pe,wip:A,done:re,total:ce})}return{bucket:s,columns:c,points:G}}wipOverTime(o={}){return this.cfd(o).points.map(s=>({at:s.at,wip:s.wip}))}throughput(o={}){const s=X(o.bucket),c=this.perCard().map(_=>_.doneAt).filter(_=>_!==null),{from:l,to:f}=this.#d(o),k=[];for(let _=l;_<=f;_+=s)k.push({at:_,count:0});k.length||k.push({at:l,count:0});for(const _ of c){let F=Math.floor((_-l)/s);F<0&&(F=0),F>=k.length&&(F=k.length-1),k[F].count+=1}return k}#p(o,s){const c=new Date(o).toISOString();return s>=V.day?c.slice(0,10):c.slice(0,16).replace("T"," ")}chartData(o,s={}){const c=X(s.bucket);if(o==="cfd"){const{columns:l,points:f}=this.cfd(s),k=f.map(_=>{const F={t:this.#p(_.at,c)};for(const G of l)F[G]=_.counts[G]||0;return F});return{columns:[{id:"t",field:"t",title:"Date"},...l.map(_=>({id:_,field:_,title:_}))],rows:k,spec:{type:"area",x:"t",measures:l.map(_=>({col:_})),stack:!0,title:"Cumulative flow"}}}if(o==="wip"){const l=this.wipOverTime(s).map(f=>({t:this.#p(f.at,c),wip:f.wip}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"wip",field:"wip",title:"WIP"}],rows:l,spec:{type:"line",x:"t",y:{col:"wip"},title:"Work in progress"}}}if(o==="throughput"){const l=this.throughput(s).map(f=>({t:this.#p(f.at,c),count:f.count}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"count",field:"count",title:"Completed"}],rows:l,spec:{type:"bar",x:"t",y:{col:"count"},title:"Throughput"}}}if(o==="cycleTime"||o==="leadTime"){const l=this.perCard().map(f=>o==="cycleTime"?f.cycleTime:f.leadTime).filter(f=>f!==null);return{columns:[{id:"v",field:"v",title:o==="cycleTime"?"Cycle time":"Lead time"}],rows:l.map(f=>({v:f})),spec:{type:"histogram",x:"v",title:o==="cycleTime"?"Cycle-time distribution":"Lead-time distribution"}}}return null}renderChart(o,s,c={}){const{createChart:l,createGrid:f,spec:k}=c;if(!v(l)||!v(f))return j("kanban:flow-chart-deps","flow.renderChart needs createChart and createGrid handed in (e.g. from 'lattice-grid/modules/charts' and 'lattice-grid')."),null;const _=this.chartData(o,c);if(!_)return j(`kanban:flow-chart-kind:${o}`,`"${o}" is not a flow chart; expected cfd, wip, throughput, cycleTime or leadTime.`),null;const F=f({columns:_.columns,rows:_.rows});return l({grid:F,container:s,..._.spec,...ne(k)?k:{}})}destroy(){for(const o of this.#n)v(o)&&o();this.#n=[]}}const M=P}),Ue("packages/modules/kanban/sla.js",function(g,J){"use strict";Object.defineProperty(g,"MIN_EPOCH",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"toMs",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"parseEpoch",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"resolveSlaConfig",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"formatAge",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"createSlaMonitor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"SlaMonitor",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return s}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,u=60*1e3,O=60*u,K=24*O,E=7*K,R=1e12,z=Object.freeze({weeks:E,week:E,w:E,days:K,day:K,d:K,hours:O,hour:O,h:O,minutes:u,minute:u,m:u,min:u,seconds:1e3,second:1e3,s:1e3,sec:1e3,ms:1,milliseconds:1});function V(c){if(typeof c=="number")return Number.isFinite(c)&&c>=0?c:null;if(ne(c)){let l=0,f=!1;for(const[k,_]of Object.entries(z)){const F=c[k];typeof F=="number"&&Number.isFinite(F)&&(l+=F*_,f=!0)}return f&&l>=0?l:null}return null}function X(c){if(x(c))return null;let l;if(c instanceof Date)l=c.getTime();else if(typeof c=="number")l=c;else if(typeof c=="string"){const f=c.trim();if(f==="")return null;l=/^-?\d+$/.test(f)?Number(f):Date.parse(f)}else return null;return!Number.isFinite(l)||l<R?null:l}function oe(c){return ne(c)&&("warn"in c||"breach"in c)?{warn:V(c.warn),breach:V(c.breach)}:{warn:null,breach:V(c)}}function H(c,l){return{warn:l.warn!==null?l.warn:c.warn,breach:l.breach!==null?l.breach:c.breach}}function P(c,l={}){const f=ne(c)?c:{},k={warn:V(f.warn),breach:V(f.breach)},_=new Map;if(Array.isArray(l.columns))for(const G of l.columns){if(!ne(G)||x(G.id)||G.sla===void 0&&G.slaWarn===void 0&&G.slaBreach===void 0)continue;const Y=ne(G.sla)||typeof G.sla=="number"?oe(G.sla):{warn:V(G.slaWarn),breach:V(G.slaBreach)};_.set(String(G.id),Y)}if(ne(f.columns))for(const[G,Y]of Object.entries(f.columns))_.set(String(G),H(_.get(String(G))||{warn:null,breach:null},oe(Y)));const F=new Map;if(ne(f.lanes))for(const[G,Y]of Object.entries(f.lanes))F.set(String(G),oe(Y));return{global:k,columns:_,lanes:F,basis:f.basis==="board"?"board":"column",enteredProperty:typeof f.enteredProperty=="string"?f.enteredProperty:null,createdProperty:typeof f.createdProperty=="string"?f.createdProperty:null,ignoreDone:f.ignoreDone!==!1,useTransitionLog:f.useTransitionLog!==!1,showAge:f.showAge==="always"?"always":"threshold",now:v(f.now)?f.now:(()=>Date.now()),tick:Number.isFinite(f.tick)&&f.tick>0?Number(f.tick):0,onWarn:v(f.onWarn)?f.onWarn:null,onBreach:v(f.onBreach)?f.onBreach:null}}function I(c){return!Number.isFinite(c)||c<0?"":c>=E?`${Math.floor(c/E)}w`:c>=K?`${Math.floor(c/K)}d`:c>=O?`${Math.floor(c/O)}h`:c>=u?`${Math.floor(c/u)}m`:"<1m"}const M=Object.freeze({ok:0,warn:1,breach:2});function p(c,l={}){return new o(c,l)}class o{#t;#e;#n=new Map;#r=new Map;#o=[];#i=null;#s=!1;constructor(l,f={}){if(this.#t=l,this.#e=P(f,l&&l.config),this.#e.global.warn===null&&this.#e.global.breach===null&&!this.#e.columns.size&&!this.#e.lanes.size&&j("kanban:sla:no-threshold","sla is enabled but no warn/breach threshold is set (globally, per column or per lane); no card will ever age."),l&&v(l.on))for(const k of["card:move","card:add","card:reverted"])this.#o.push(l.on(k,()=>this.evaluate()))}get config(){return this.#e}#l(){if(!this.#e.useTransitionLog)return null;const l=this.#t.flow;return l&&l.log?l.log:null}#a(l,f){const k=l.row||{},{enteredProperty:_,createdProperty:F,basis:G}=this.#e,Y=f?f.get(l.key):null,ye=()=>{if(!Array.isArray(Y))return null;const ve=String(l.columnId);for(let Re=Y.length-1;Re>=0;Re--)if(String(Y[Re].to)===ve){const Ne=Y[Re].at;return Number.isFinite(Ne)&&Ne>=R?Ne:null}return null},Pe=()=>{if(!Array.isArray(Y)||!Y.length)return null;const ve=Y[0].at;return Number.isFinite(ve)&&ve>=R?ve:null},A=()=>_?X(k[_]):null,re=()=>F?X(k[F]):null,ce=G==="board"?[re,Pe,A]:[ye,A,Pe,re];for(const ve of ce){const Re=ve();if(Re!==null)return Re}return null}#c(l){let f=this.#e.global;const k=this.#e.columns.get(String(l.columnId));k&&(f=H(f,k));const _=l.swimlane;if(!x(_)){const F=this.#e.lanes.get(String(_));F&&(f=H(f,F))}return f}#u(l){const f=this.#t.ctx&&this.#t.ctx.doneColumns;return!!(f&&f.has(String(l.columnId)))}#m(l,f,k){const{warn:_,breach:F}=this.#c(l),Y=this.#e.ignoreDone&&this.#u(l)?null:this.#a(l,k),ye=Y===null?null:Math.max(0,f-Y);let Pe=null;return ye!==null&&(F!==null&&ye>=F?Pe="breach":_!==null&&ye>=_?Pe="warn":Pe="ok"),{key:l.key,columnId:l.columnId,lane:l.swimlane,start:Y,ageMs:ye,ageText:ye===null?"":I(ye),warnMs:_,breachMs:F,level:Pe,breached:Pe==="breach"}}sync(){const l=this.#e.now(),f=this.#l()?this.#l().byKey():null,k=v(this.#t.cards)?this.#t.cards():[],_=new Map;for(const F of k)_.set(F.key,this.#m(F,l,f));return this.#n=_,this}evaluate(l={}){const f=l.emit!==!1;this.sync();const k=this.#e.now();for(const[_,F]of this.#n){const G=this.#r.has(_)?this.#r.get(_):null,Y=F.level;f&&Y&&(Y==="warn"||Y==="breach")&&M[Y]>(G==null?-1:M[G])&&this.#d(F,G,k),this.#r.set(_,Y)}for(const _ of[...this.#r.keys()])this.#n.has(_)||this.#r.delete(_);return[...this.#n.values()]}#d(l,f,k){const _=this.#t.card?this.#t.card(l.key):null,F=_?_.row:void 0;this.#t.fire("card:sla",{key:l.key,card:_,level:l.level,previous:f,ageMs:l.ageMs,ageText:l.ageText,columnId:l.columnId,lane:l.lane,warnMs:l.warnMs,breachMs:l.breachMs,at:k});const G=l.level==="breach"?this.#e.onBreach:this.#e.onWarn;G&&G(l.level,F===void 0?[]:[F])}start(){if(this.#s)return this;this.#s=!0,this.sync();for(const l of this.#n.values())this.#r.set(l.key,l.level?"ok":null);return this.evaluate(),this.#e.tick>0&&(this.#i=setInterval(()=>{this.evaluate(),this.#t.el&&v(this.#t.repaint)&&this.#t.repaint()},this.#e.tick),this.#i&&v(this.#i.unref)&&this.#i.unref()),this}stateFor(l){const f=ne(l)&&"key"in l?l.key:l;return this.#n.get(f)||null}states(){return[...this.#n.values()]}breaches(){return this.states().filter(l=>l.level==="breach")}warnings(){return this.states().filter(l=>l.level==="warn")}destroy(){this.#i&&(clearInterval(this.#i),this.#i=null);for(const l of this.#o)v(l)&&l();this.#o=[]}}const s=p}),Ue("packages/modules/kanban/history.js",function(g,J){"use strict";Object.defineProperty(g,"DEFAULT_DEPTH",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"createHistory",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"installUndoShortcuts",{enumerable:!0,get:function(){return u}});const v=J("packages/core/src/internal/predicates.js").isFunction,x=100;function ne(O){return O&&Number.isInteger(O.historyDepth)&&O.historyDepth>=0?O.historyDepth:x}function ee(O={}){const K=ne(O);let E=[],R=[],z=!1;return Object.freeze({record(X){!v(X.undo)&&!v(X.redo)||(E.push(X),E.length>K&&E.shift(),R.length=0)},async undo(){return z?null:V("undo")},async redo(){return z?null:V("redo")},canUndo(){return E.length>0},canRedo(){return R.length>0},peek(X="undo"){const oe=X==="redo"?R:E,H=oe[oe.length-1];return H?H.label:null},clear(){E=[],R=[]},get replaying(){return z},get depth(){return E.length},get max(){return K}});async function V(X){const oe=X==="undo"?E:R,H=X==="undo"?R:E,P=oe[oe.length-1];if(!P)return null;const I=X==="undo"?P.undo:P.redo;z=!0;let M=!0;try{v(I)&&(M=await I())}catch{M=!1}finally{z=!1}return M===!1?{applied:!1,label:P.label}:(oe.pop(),H.push(P),{applied:!0,label:P.label})}}function j(O,K){for(let E=O;E&&E!==K;E=E.parentNode){const R=E.tagName?String(E.tagName).toLowerCase():"";if(R==="input"||R==="textarea"||R==="select"||E.isContentEditable||E.classList&&E.classList.contains("lattice"))return!0}return!1}function u(O){const{root:K,undo:E,redo:R}=O;if(!K||!v(K.addEventListener))return()=>{};const z=X=>{if(!X||!(X.ctrlKey||X.metaKey))return;const oe=typeof X.key=="string"?X.key.toLowerCase():"";let H;if(oe==="z"&&!X.shiftKey)H=E;else if(oe==="z"&&X.shiftKey||oe==="y")H=R;else return;if(j(X.target,K))return;const P=H();(P instanceof Promise||P!==!1)&&X.preventDefault()};return K.addEventListener("keydown",z),()=>K.removeEventListener("keydown",z)}}),Ue("packages/core/src/registry/free-tier-notice.js",function(g,J){"use strict";Object.defineProperty(g,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"WATERMARK_TEXT",{enumerable:!0,get:function(){return v}});const a="Free for non-commercial use: latticegrid.dev/free",v="Unlicensed: Lattice Grid trial"}),Ue("packages/core/src/registry/licence.js",function(g,J){"use strict";Object.defineProperty(g,"PRODUCT",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"LICENCE_VERSION",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"PUBLIC_KEY",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"fromBase64Url",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"toBase64Url",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"asciiBytes",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"parseLicence",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"hasEd25519",{enumerable:!0,get:function(){return l}}),Object.defineProperty(g,"verifyLicence",{enumerable:!0,get:function(){return f}}),Object.defineProperty(g,"isLocalHost",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"currentHost",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"matchesDomain",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"LicenceHolder",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"setLicence",{enumerable:!0,get:function(){return re}}),Object.defineProperty(g,"licenceInfo",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(g,"watermark",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"licenceState",{enumerable:!0,get:function(){return Re}}),Object.defineProperty(g,"sharedLicence",{enumerable:!0,get:function(){return Ne}});const v=J("packages/core/src/internal/warn.js").warnOnce,x=J("packages/core/src/registry/free-tier-notice.js"),ne=x.FREE_TIER_NOTICE;Object.defineProperty(g,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return x.FREE_TIER_NOTICE}});const ee="lattice-grid",j=1,u="LG1",O=64,K="GwmaCOkGedHulqsa-DOV1TU8On1rsalWv519c_dW4j4",E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",R=(()=>{const Q=new Int16Array(128).fill(-1);for(let te=0;te<E.length;te++)Q[E.charCodeAt(te)]=te;return Q[43]=62,Q[47]=63,Q})();function z(Q){if(typeof Q!="string")return null;let te="";for(let Ve=0;Ve<Q.length;Ve++){const Ie=Q.charCodeAt(Ve);if(Ie!==61){if(Ie>127||R[Ie]<0)return null;te+=Q[Ve]}}const ie=te.length;if(ie%4===1)return null;const qe=new Uint8Array(Math.floor(ie*3/4));let xe=0,Ze=0,tt=0;for(let Ve=0;Ve<ie;Ve++)xe=xe<<6|R[te.charCodeAt(Ve)],Ze+=6,Ze>=8&&(Ze-=8,qe[tt++]=xe>>Ze&255);return tt===qe.length?qe:qe.subarray(0,tt)}function V(Q){let te="",ie=0;for(;ie+2<Q.length;ie+=3){const xe=Q[ie]<<16|Q[ie+1]<<8|Q[ie+2];te+=E[xe>>18&63]+E[xe>>12&63]+E[xe>>6&63]+E[xe&63]}const qe=Q.length-ie;if(qe===1){const xe=Q[ie]<<16;te+=E[xe>>18&63]+E[xe>>12&63]}else if(qe===2){const xe=Q[ie]<<16|Q[ie+1]<<8;te+=E[xe>>18&63]+E[xe>>12&63]+E[xe>>6&63]}return te}function X(Q){const te=new Uint8Array(Q.length);for(let ie=0;ie<Q.length;ie++)te[ie]=Q.charCodeAt(ie)&127;return te}function oe(Q){if(typeof TextDecoder=="function")return new TextDecoder().decode(Q);let te="";for(let ie=0;ie<Q.length;ie++)te+=String.fromCharCode(Q[ie]);return te}function H(Q){const te={ok:!1,reason:"malformed",product:null,issuedTo:null,expires:null,terms:null,features:[],deployments:[],version:0,message:null,signature:null,raw:typeof Q=="string"?Q:""};if(typeof Q!="string"||Q.length===0)return{...te,reason:"missing"};const ie=Q.trim(),qe=ie.split(".");if(qe.length!==3)return te;const[xe,Ze,tt]=qe;if(xe!==u)return{...te,reason:"prefix"};const Ve=z(Ze),Ie=z(tt);if(!Ve||!Ie)return te;let Fe;try{Fe=JSON.parse(oe(Ve))}catch{return te}return Fe===null||typeof Fe!="object"?te:{ok:!0,reason:null,product:typeof Fe.p=="string"?Fe.p:null,issuedTo:typeof Fe.t=="string"?Fe.t:null,expires:typeof Fe.e=="string"?Fe.e:null,terms:typeof Fe.terms=="string"?Fe.terms:null,features:Array.isArray(Fe.f)?Fe.f.slice():[],deployments:Array.isArray(Fe.d)?Fe.d.slice():[],version:typeof Fe.v=="number"?Fe.v:0,message:X(Ze),signature:Ie,raw:ie}}function P(Q,te){if(!Q)return!1;const ie=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(Q)?`${Q}T23:59:59.999Z`:Q);return Number.isNaN(ie)?!0:te>ie}function I(Q){return Q==="non-commercial"?"non-commercial":"commercial"}let M=null,p=null,o=null;function s(){const Q=globalThis.crypto;return Q&&Q.subtle?Q.subtle:null}async function c(Q){if(M&&p===Q)return M;const te=s();if(!te)return null;const ie=z(Q);if(!ie)return null;try{const qe=await te.importKey("raw",ie,{name:"Ed25519"},!1,["verify"]);return M=qe,p=Q,qe}catch{return null}}async function l(){return o!==null||(o=await c(K)!==null),o}async function f(Q,te={}){const ie=te.warn!==!1,qe=te.product||ee,xe=te.publicKey||K,Ze=te.now??Date.now(),tt=te.host??_(),Ve=k(tt)?"":` ${ne}`,Ie=H(Q);if(!Ie.ok){const w=Ie.reason==="missing"?"missing":"malformed";return ie&&v(`licence.${w}`,w==="missing"?`no licence key supplied. The grid renders in full and carries a trial watermark on any host other than localhost. Get a key at latticegrid.dev.${Ve}`:`licence key could not be read. The grid will render with a watermark.${Ve}`),{valid:!1,reason:w,terms:"commercial"}}const Fe={product:Ie.product||void 0,issuedTo:Ie.issuedTo||void 0,expires:Ie.expires||void 0,terms:I(Ie.terms)};if(Ie.product!==qe)return ie&&v("licence.product",`licence key is for '${Ie.product}', not '${qe}'. The grid will render with a watermark.`),{valid:!1,...Fe,reason:"product"};if(P(Ie.expires,Ze))return ie&&v("licence.expired",`licence expired on ${Ie.expires}. The grid will render with a watermark. Renew at latticegrid.dev.`),{valid:!1,...Fe,reason:"expired"};const ft=Ie.deployments||[];if(ft.length&&tt&&!k(tt)&&!F(tt,ft))return ie&&v("licence.domain",`licence key is not valid for ${tt}; it covers ${ft.join(", ")}. The grid will render with a watermark.`),{valid:!1,...Fe,reason:"domain"};const gt=await c(xe);if(!gt){const w=!!Ie.signature&&Ie.signature.length===O;return ie&&v("licence.algorithm","this host does not provide crypto.subtle Ed25519, so the licence signature could not be verified. A structural check was used instead."),w?{valid:!0,...Fe,reason:"unverified"}:{valid:!1,...Fe,reason:"signature"}}let b=!1;try{b=await s().verify({name:"Ed25519"},gt,Ie.signature,Ie.message)}catch{b=!1}return b?{valid:!0,...Fe}:(ie&&v("licence.signature","licence signature is not valid. The grid will render with a watermark."),{valid:!1,...Fe,reason:"signature"})}function k(Q){const te=String(Q??_()??"").trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");return!te||te==="localhost"||te.endsWith(".localhost")||te==="::1"||te==="0:0:0:0:0:0:0:1"?!0:/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(te)}function _(){const Q=globalThis.location;return Q&&typeof Q.hostname=="string"?Q.hostname:null}function F(Q,te){const ie=G(Q);return!ie||!Array.isArray(te)?!1:te.some(qe=>{const xe=G(qe);if(!xe)return!1;if(xe==="*")return!0;if(xe.startsWith("*.")){const Ze=xe.slice(2);return ie===Ze||ie.endsWith(`.${Ze}`)}return ie===xe})}function G(Q){return String(Q??"").trim().toLowerCase().replace(/\.$/,"")}class Y{#t="";#e={valid:!1,reason:"missing",terms:"commercial"};#n=null;#r=null;#o;#i=new Set;constructor(te={}){this.#o=te}set(te){this.#t=typeof te=="string"?te.trim():"";const ie=H(this.#t);return this.#e=ie.ok?{valid:!P(ie.expires,Date.now())&&ie.product===(this.#o.product||ee),product:ie.product||void 0,issuedTo:ie.issuedTo||void 0,expires:ie.expires||void 0,terms:I(ie.terms),reason:"pending"}:{valid:!1,reason:ie.reason||"malformed",terms:"commercial"},this.#n=null,this.#t&&this.verify(),this.#e}verify(){if(this.#n)return this.#n;const te=this.#t;return this.#n=f(te,this.#o).then(ie=>{if(this.#t===te){this.#e=ie;for(const qe of this.#i)qe(ie)}return ie}),this.#n}onSettled(te){return this.#i.add(te),()=>this.#i.delete(te)}info(){return{...this.#e}}watermark(){return this.#e.valid?!1:!k(this.#r)}setHost(te){this.#r=te}state(){return this.#e.valid?"licensed":k(this.#r)?"localhost":"trial"}reset(){this.#t="",this.#e={valid:!1,reason:"missing",terms:"commercial"},this.#n=null,this.#i.clear()}}const ye=Symbol.for("lattice-grid/licence/holder");function Pe(){const Q=globalThis,te=Q&&Q[ye];if(te&&typeof te.set=="function"&&typeof te.watermark=="function")return te;const ie=new Y;if(Q)try{Q[ye]=ie}catch{}return ie}const A=Pe();function re(Q){return A.set(Q)}function ce(){return A.info()}function ve(){return A.watermark()}function Re(){return A.state()}function Ne(){return A}}),Ue("packages/dom/src/watermark.js",function(g,J){"use strict";Object.defineProperty(g,"WATERMARK_CLASS",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"WATERMARK_LAYER_CLASS",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"Watermark",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"viewLicenceHost",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"mountViewWatermark",{enumerable:!0,get:function(){return c}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return l}});const v=J("packages/core/src/internal/predicates.js").isFunction,x=J("packages/core/src/registry/free-tier-notice.js"),ne=x.FREE_TIER_NOTICE,ee=x.WATERMARK_TEXT,j=J("packages/core/src/registry/licence.js"),u=j.watermark,O=j.setLicence,K=Object.freeze({t:f=>f==="licence.watermark.free"?ne:ee});function E(f,k,_={}){const F=f.createElement(k);if(_.class)for(const G of _.class.split(/\s+/))G&&F.classList.add(G);if(_.text!==void 0&&(F.textContent=_.text),_.attrs)for(const[G,Y]of Object.entries(_.attrs))F.setAttribute(G,Y);if(_.children)for(const G of _.children)F.appendChild(G);return F}function R(f,k,_){return f.addEventListener(k,_),()=>f.removeEventListener(k,_)}const z="lat-watermark",V="https://www.latticegrid.dev",X=["br","bl","tl","tr"],oe=4e3,H=Symbol.for("lattice-grid/licence/holder"),P="data-lat-watermark-owner",I="lat-watermark-layer",M="lat-watermark-style",p=`
513
516
  .${I}{position:absolute;inset:0;pointer-events:none;z-index:2147483000;overflow:hidden}
514
517
  .${I} .${z}{position:absolute;z-index:6;padding:10px 18px;border-radius:var(--lattice-radius-sm,4px);background:var(--lattice-accent,#2563eb);box-shadow:0 2px 10px rgb(0 0 0 / 25%);color:var(--lattice-accent-contrast,#fff);font:700 15px/1.3 system-ui,sans-serif;letter-spacing:.02em;white-space:nowrap;pointer-events:none;opacity:.94}
515
518
  .${I} .${z}--br{inset-inline-end:0;bottom:0}
@@ -519,6 +522,6 @@ select.${a}__select:focus-visible{
519
522
  .${I} .${z}__link{color:inherit;pointer-events:auto;text-decoration:underline;text-underline-offset:2px}
520
523
  .${I} .${z}__free{display:block;margin-top:2px;font-size:12px;font-weight:500;letter-spacing:0;opacity:.92}
521
524
  @media print{.${I} .${z}{opacity:1}}
522
- `;class o{#t;#e;#n;#r=null;#o=[];#i;#s=0;#l=null;#a=null;#c=!1;constructor(k){this.#a=k.owner||null,this.#a&&v(this.#a.setAttribute)&&this.#a.setAttribute(O,""),this.#t=k.grid,this.#e=k.document,this.#n=k.element,this.#i=k.window||(typeof globalThis>"u"?{}:globalThis)}mount(){this.refresh(),v(this.#t.on)&&this.#o.push(this.#t.on("licence:changed",()=>this.refresh()));const k=this.#t.licence&&this.#t.licence.ready;k&&v(k.then)&&k.then(()=>this.refresh(),()=>this.refresh())}refresh(){const k=this.#p()&&!this.#u();k&&!this.#r?(this.#h(),this.#d()):!k&&this.#r&&(this.#g(),this.#f())}#u(){const k=this.#n;let $=k&&k.parentNode;for(this.#a&&$===this.#a&&($=$.parentNode);$&&$.nodeType===1;){if(v($.hasAttribute)&&$.hasAttribute(O))return!0;$=$.parentNode}return!1}#m(){const k=this.#i;if(!k||!v(k.matchMedia))return!1;try{return!!k.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}#d(){this.#f(),v(this.#i.setTimeout)&&(this.#m()||(this.#l=this.#i.setTimeout(()=>{if(this.#l=null,!this.#p()||this.#u()){this.#g();return}this.#s=(this.#s+1)%X.length,this.#g(),this.#h(),this.#d()},oe)))}#f(){this.#l!==null&&v(this.#i.clearTimeout)&&this.#i.clearTimeout(this.#l),this.#l=null}#p(){const k=this.#t.licence;return!!(k&&v(k.watermark)&&k.watermark())}#h(){const k=this.#t.messages&&v(this.#t.messages.t)?this.#t.messages:K,$=E(this.#e,"a",{class:`${z}__link`,text:k.t("licence.watermark"),attrs:{href:V,target:"_blank",rel:"noopener noreferrer"}}),L=E(this.#e,"span",{class:`${z}__free`,text:k.t("licence.watermark.free")});this.#r=E(this.#e,"div",{class:`${z} ${z}--${X[this.#s]}`,attrs:{role:"note",title:"This grid is unlicensed for this domain. Visit latticegrid.dev for a licence."},children:[$,L]}),this.#o.push(R(this.#r,"pointerdown",U=>{v(U.stopPropagation)&&U.stopPropagation()})),this.#n&&v(this.#n.appendChild)&&this.#n.appendChild(this.#r),typeof queueMicrotask=="function"&&!this.#c&&(this.#c=!0,queueMicrotask(()=>{this.#c=!1,this.#r&&this.#u()&&(this.#g(),this.#f())}))}#g(){this.#r&&v(this.#r.remove)&&this.#r.remove(),this.#r=null}destroy(){this.#f(),this.#a&&v(this.#a.removeAttribute)&&this.#a.removeAttribute(O);for(const k of this.#o)k();this.#o=[],this.#g()}}function s(p={},k=void 0){const $=globalThis[H],L=!p.licence&&k&&v(k.querySelector)?k.querySelector('meta[name="lattice-license"]')?.getAttribute("content"):null,U=p.licence||L;return U&&P(U),{licence:{watermark:()=>u(),get ready(){return $?$.verify():Promise.resolve()}},on:(Y,be)=>Y==="licence:changed"&&$?$.onSettled(()=>be()):()=>{}}}function c(p,k={}){const $=p&&p.ownerDocument;if(!$||!v($.createElement))return{destroy(){},refresh(){}};const L=$.defaultView||void 0,U=s(k,$);let Y=null,be=null,Oe=null,A=!1;const re=()=>{if(!$.getElementById(F)&&$.head){const Re=$.createElement("style");Re.id=F,Re.textContent=m,$.head.appendChild(Re)}L&&v(L.getComputedStyle)&&L.getComputedStyle(p).position==="static"&&(p.style.position="relative"),Y=$.createElement("div"),Y.className=I,p.appendChild(Y),be=new o({grid:U,document:$,element:Y,window:L,owner:p}),be.mount(),L&&v(L.MutationObserver)&&(Oe=new L.MutationObserver(()=>{!A&&Y&&Y.parentNode!==p&&p.appendChild(Y)}),Oe.observe(p,{childList:!0}))},ce=()=>{A||(be?be.refresh():U.licence.watermark()&&re())};ce();const ke=U.on("licence:changed",ce);return U.licence.ready,{refresh:ce,destroy(){A||(A=!0,ke(),Oe&&Oe.disconnect(),be&&be.destroy(),Y&&Y.parentNode&&Y.parentNode.removeChild(Y))}}}const l=o}),Ge("packages/modules/kanban/source.js",function(h,J){"use strict";Object.defineProperty(h,"COUNT_ID",{enumerable:!0,get:function(){return u}}),Object.defineProperty(h,"POINTS_ID",{enumerable:!0,get:function(){return P}}),Object.defineProperty(h,"isPushdownSource",{enumerable:!0,get:function(){return K}}),Object.defineProperty(h,"engineFilterTree",{enumerable:!0,get:function(){return E}}),Object.defineProperty(h,"totalsRequest",{enumerable:!0,get:function(){return R}}),Object.defineProperty(h,"totalsAggregates",{enumerable:!0,get:function(){return z}}),Object.defineProperty(h,"totalsKey",{enumerable:!0,get:function(){return V}}),Object.defineProperty(h,"parseTotals",{enumerable:!0,get:function(){return X}}),Object.defineProperty(h,"applyTotals",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(h,"columnPageRequest",{enumerable:!0,get:function(){return H}}),Object.defineProperty(h,"appendRows",{enumerable:!0,get:function(){return O}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,u="\0kanban-count",P="\0kanban-points";function K(I){return ne(I)&&v(I.fetch)&&v(I.aggregate)}function E(I){const F=[];if(I.filters&&I.filters.size)for(const m of I.filters.values())v(m)||ne(m)&&F.push(m);return F.length?F.length===1?F[0]:{op:"and",conditions:F}:null}function R(I,F){const m=[I.columnProperty];I.swimlanes&&I.swimlaneProperty&&m.push(I.swimlaneProperty);const o=typeof F.quickFilter=="string"?F.quickFilter.trim():"";return{filters:E(F),quick:o||"",groupBy:m}}function z(I){const F=[{id:u,col:I.columnProperty,fn:"count"}];return I.pointsProperty&&F.push({id:P,col:I.pointsProperty,fn:"sum"}),F}function V(I,F){return F===void 0?String(I):`${F}|${I}`}function X(I,F){const m=Array.isArray(F&&F.engine)?F.engine:[],o=Array.isArray(F&&F.client)?F.client:[],s=Array.isArray(F&&F.groups)?F.groups:null,c=new Map;if(!s)return{byKey:c,engine:m,client:o,groups:s};const l=I.swimlanes&&I.swimlaneProperty;for(const p of s){if(!p||!Array.isArray(p.keys))continue;const k=p.keys;if(x(k[0])||l&&x(k[1]))continue;const $=String(k[0]),L=l?String(k[1]):void 0,U=p.values||{},Y=Number(U[u]),be=Number(U[P]);c.set(V($,L),{count:Number.isFinite(Y)?Y:0,points:Number.isFinite(be)?be:0})}return{byKey:c,engine:m,client:o,groups:s}}function oe(I,F,m){const o=F.swimlanes&&F.swimlaneProperty;for(const s of I.columns){let c=0,l=0;if(o&&Array.isArray(I.lanes))for(const p of I.lanes){const k=Array.isArray(p.columns)?p.columns.find(L=>L.id===s.id):null,$=m.get(V(s.id,p.id))||{count:0,points:0};k&&(k.count=$.count,k.points=$.points),c+=$.count,l+=$.points}else{const p=m.get(V(s.id,void 0))||{count:0,points:0};c=p.count,l=p.points}s.count=c,s.points=l,s.over=s.wipLimit!==null&&c>s.wipLimit}if(o&&Array.isArray(I.lanes))for(const s of I.lanes){let c=0,l=0;for(const p of I.columns){const k=m.get(V(p.id,s.id))||{count:0,points:0};c+=k.count,l+=k.points}s.count=c,s.points=l}}function H(I,F,m,o,s,c){const l=[],p=E(F);p&&l.push(p),l.push({col:I.columnProperty,op:"eq",value:m,caseSensitive:!0}),o!==void 0&&I.swimlaneProperty&&l.push({col:I.swimlaneProperty,op:"eq",value:o,caseSensitive:!0});const k=typeof F.quickFilter=="string"?F.quickFilter.trim():"";return{filters:l.length===1?l[0]:{op:"and",conditions:l},quick:k||"",sort:I.orderProperty?[{col:I.orderProperty,dir:"asc"}]:null,range:{start:s,end:s+c}}}function O(I,F,m){const o=[];for(const s of m||[]){let c;try{c=F.key(s)}catch{continue}if(x(c)){j("kanban:source:rowkey","a row loaded from the pushdown source has no row key and was left out; check the board `rowKey` against the engine schema.");continue}I.set(c,s),o.push(c)}return o}}),Ge("packages/modules/kanban/index.js",function(h,J){"use strict";Object.defineProperty(h,"createKanban",{enumerable:!0,get:function(){return gt}}),Object.defineProperty(h,"default",{enumerable:!0,get:function(){return Ct}});const a=J("packages/core/src/internal/predicates.js"),v=a.isObject,x=a.isFunction,ne=a.isNil,ee=J("packages/core/src/internal/warn.js"),j=ee.warnOnce,u=ee.fail,P=J("packages/core/src/internal/paths.js"),K=P.getPath,E=P.setPath,z=J("packages/core/src/internal/uid.js").uid,X=J("packages/core/src/internal/merge.js").mergeRow,H=J("packages/core/src/internal/ready.js").createReadySignal,O=J("packages/modules/kanban/model.js"),I=O.resolveContext,F=O.groupRows,m=O.keyFn,o=O.computeOrders,s=O.accessorFor,c=O.rollup,l=O.BACKLOG,p=O.DEFAULT_FILTER,k=O.deriveDoneColumns,$=O.laneIdOf,L=O.resolveColumnWidth,U=O.resolveColumnWidthRange,Y=J("packages/modules/kanban/view.js"),be=Y.resolveReadonly,Oe=Y.renderPreserving,A=Y.applyColumnWidths,re=Y.installSelectionPainter,ce=Y.openDetail,ke=Y.closeDetail,Re=Y.startEdit,Ne=Y.openRequiredForm,Q=Y.closeRequiredForm,te=Y.boardT,We=J("packages/modules/kanban/controls.js").controlValue,je=J("packages/modules/kanban/workflow.js"),Ze=je.canMove,Qe=je.transitionError,Ye=je.missingRequired,Ie=je.requiredError,ut=J("packages/modules/shared/emitter.js").Emitter,b=J("packages/modules/kanban/flow.js").createFlowAnalytics,D=J("packages/modules/kanban/sla.js").createSlaMonitor,$e=J("packages/modules/kanban/styles.js").NS,Ae=J("packages/modules/kanban/history.js"),se=Ae.createHistory,ye=Ae.installUndoShortcuts,ge=J("packages/dom/src/watermark.js").mountViewWatermark,me=J("packages/modules/kanban/source.js"),He=me.isPushdownSource,Se=me.totalsRequest,Ue=me.totalsAggregates,dt=me.parseTotals,nt=me.applyTotals,kt=me.columnPageRequest,ht=me.appendRows,ot=Object.freeze(["card:click","card:dblclick","card:contextmenu","card:move","card:reverted","card:confirmed","selection:changed","column:collapse","card:add","column:control","column:menu","drag:start","drag:end","swimlane:collapse","swimlane:reorder","column:reorder","filter:changed","sprint:changed","epic:changed","card:expand","card:drill","card:edit","cards:loaded","card:sla","beforeMove","beforeAdd","beforeEdit","beforeLaneReorder","beforeColumnReorder","beforeColumnChange","move:cancelled","add:cancelled","edit:cancelled","laneReorder:cancelled","columnReorder:cancelled","columnChange:cancelled","history"]),et=Object.freeze({onCardClick:"card:click",onCardDblClick:"card:dblclick",onCardContextMenu:"card:contextmenu"});function St(ct,st){if(Array.isArray(ct.rows))return ct.rows;const T=ct.grid;if(!T||!T.rows||!x(T.rows.forEach))return[];const G=[st.columnProperty,st.pointsProperty,st.orderProperty,st.swimlaneProperty,st.sprintProperty,st.epicProperty].filter(Be=>typeof Be=="string"),tt=T.columns&&x(T.columns.all)?T.columns.all():[],_t=Be=>{if(T.columns&&x(T.columns.get)&&T.columns.get(Be))return Be;const _e=tt.find(lt=>lt&&lt.field===Be);return _e?_e.id:Be},yt=new Map(G.map(Be=>[Be,_t(Be)])),Ve=[];return T.rows.forEach(Be=>{if(Be&&Be.group||Be&&Be.pending===!0)return;const _e=Be.key,lt={__boardKey:_e};for(const at of G)try{lt[at]=T.rows.value(_e,yt.get(at))}catch{lt[at]=void 0}Ve.push(lt)}),Ve}function gt(ct,st={}){const T=v(st)?st:{},G=I(T);T.grid&&!Array.isArray(T.rows)&&(G.key=m("__boardKey"));const tt=new ut("kanban"),_t=be(T.readonly),yt=ct&&ct.ownerDocument||typeof globalThis<"u"&&globalThis.document||null,Ve=!!T.grid&&!Array.isArray(T.rows),Be=He(T.source)&&!Array.isArray(T.rows)&&!Ve,_e=new Map;let lt=!1;const at=n=>{if(!Ve||typeof n!="string")return n;const d=T.grid.columns;if(!d)return n;try{if(x(d.get)&&d.get(n))return n;const N=(x(d.all)?d.all():[]).find(W=>W&&W.field===n);return N?N.id:n}catch{return n}},ae={collapsedColumns:new Set,collapsedLanes:new Set,columnOrder:Array.isArray(T.columnOrder)?[...T.columnOrder]:null,laneOrder:Array.isArray(T.laneOrder)?[...T.laneOrder]:null,filters:new Map(x(T.filter)?[[p,T.filter]]:[]),quickFilter:typeof T.quickFilter=="string"?T.quickFilter:"",sprint:T.sprint===void 0?void 0:T.sprint,epic:T.epic===void 0?void 0:T.epic,blockedFilter:!!T.blockedFilter},bt=H(),r={el:ct||null,doc:yt,ctx:G,config:T,emitter:tt,isReadonly:_t,wired:!1,ready:bt.promise,rowKey:T.rowKey??(Ve?"__boardKey":"id"),model:{columns:[],cardsByKey:new Map,unplaced:[]},live:null,flowAvailable:!0,sourceBound:Be,columnWidth:G.columnWidth,minColumnWidth:G.minColumnWidth,maxColumnWidth:G.maxColumnWidth,fire(n,d){tt.emit(n,d);for(const[_,N]of Object.entries(et))N===n&&x(T[_])&&T[_](d)}},rt=se({historyDepth:T.historyDepth});if(r._totals=new Map,r._pages=new Map,Be&&x(T.source.resolveAggregatePlan)){const n=T.source.resolveAggregatePlan(Ue(G));(!n||!n.engine||!n.engine.length)&&j("kanban:source:aggregates","the pushdown source routes the board's column count/sum aggregates client-side (its `aggregates` config defaults to client), so column totals cannot come from the engine. Create the source with `aggregates: { default: 'engine' }` for engine totals.")}const wt=(n,d,_,N,W)=>{const ve=_.origin||"user",Ce=()=>(r.fire(d,{..._,reason:_.reason||"prevented"}),W()),we=tt.emitBefore(n,_,ve);return we===!0?N():we===!1?Ce():we.then(xe=>xe?N():Ce())};x(T.onBeforeMove)&&tt.on("beforeMove",n=>T.onBeforeMove(n.card,n.from,n.to,n.index));const $t=()=>{_e.clear();for(const n of St(T,G))_e.set(G.key(n),n)},ft=()=>{r.el&&(r.el.setAttribute("aria-busy","true"),Oe(r),r.el.setAttribute("aria-busy","false"))},Te=()=>(r.model=F(G,[..._e.values()],ae),Be&&nt(r.model,G,r._totals),ft(),r),e=(n,d)=>d===void 0?String(n):`${d}|${n}`,t=async()=>{try{const n=await T.source.aggregate(Se(G,ae),Ue(G)),d=dt(G,n);r._totals=d.byKey,d.groups||j("kanban:source:totals","the pushdown source could not compute column totals in the engine (the no-mixed-provenance guard fell every aggregate client-side), so column counts and sums are unavailable rather than computed over the loaded page.")}catch(n){r._totals=new Map,j("kanban:source:totals:error",`the pushdown source failed to answer column totals: ${n&&n.message?n.message:n}`)}Te()},i=async(n,d)=>{const _=e(n,d);let N=r._pages.get(_);if(N||(N={loaded:0,loading:!1,exhausted:!1},r._pages.set(_,N)),N.loading||N.exhausted)return!1;N.loading=!0;try{const W=kt(G,ae,n,d,N.loaded,G.pageSize),ve=await T.source.fetch(W),Ce=ve&&ve.rows||[],we=ht(_e,G,Ce);N.loaded+=Ce.length;const xe=ve&&typeof ve.total=="number"?ve.total:null;return(!Ce.length||Ce.length<G.pageSize||xe!==null&&N.loaded>=xe)&&(N.exhausted=!0),Te(),r.fire("cards:loaded",{column:n,lane:d,keys:we,more:!N.exhausted}),!N.exhausted}catch(W){return N.exhausted=!0,j("kanban:source:page",`the pushdown source failed to answer a column page: ${W&&W.message?W.message:W}`),!1}finally{N.loading=!1}};r.reload=async()=>{r._pages.clear(),_e.clear(),await t();const n=r.model.columns.map(_=>_.id),d=r.model.lanes?r.model.lanes.map(_=>_.id):void 0;if(d&&d.length)for(const _ of d)for(const N of n)await i(N,_);else for(const _ of n)await i(_,void 0);return r},r.loadMore=(n,d)=>Be?i(n,d):Promise.resolve(!1),r.refresh=()=>(Be||lt||$t(),Te()),r.repaint=()=>(ft(),r);const g={loading:!1,error:null};r.status=g,r.getState=()=>({collapsedColumns:[...ae.collapsedColumns],collapsedLanes:[...ae.collapsedLanes],columnOrder:ae.columnOrder?[...ae.columnOrder]:null,laneOrder:ae.laneOrder?[...ae.laneOrder]:null,quickFilter:ae.quickFilter,sprint:ae.sprint,epic:ae.epic,blockedFilter:ae.blockedFilter,selection:[...f]}),r.setState=n=>{const d=v(n)?n:{};if(Array.isArray(d.collapsedColumns)&&(ae.collapsedColumns=new Set(d.collapsedColumns)),Array.isArray(d.collapsedLanes)&&(ae.collapsedLanes=new Set(d.collapsedLanes)),"columnOrder"in d&&(ae.columnOrder=Array.isArray(d.columnOrder)?[...d.columnOrder]:null),"laneOrder"in d&&(ae.laneOrder=Array.isArray(d.laneOrder)?[...d.laneOrder]:null),typeof d.quickFilter=="string"&&(ae.quickFilter=d.quickFilter),"sprint"in d&&(ae.sprint=d.sprint),"epic"in d&&(ae.epic=d.epic),typeof d.blockedFilter=="boolean"&&(ae.blockedFilter=d.blockedFilter),Array.isArray(d.selection)){f.clear();for(const _ of d.selection)f.add(_)}return Te()},r.setLoading=n=>(g.loading=!!n,Te()),r.setError=n=>(g.error=ne(n)?null:String(n),Te());const f=new Set;r.selection=()=>[...f],r.isSelected=n=>f.has(n),r.select=(n,d="set")=>{const _=(Array.isArray(n)?n:[n]).filter(N=>!ne(N));if(d==="set"){f.clear();for(const N of _)f.add(N)}else if(d==="add")for(const N of _)f.add(N);else if(d==="remove")for(const N of _)f.delete(N);else if(d==="toggle")for(const N of _)f.has(N)?f.delete(N):f.add(N);return r.selectionSet=f,r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("selection:changed",{keys:[...f]}),r},r.clearSelection=()=>r.select([],"set"),r.selectionSet=f,re(r),r.collapseColumn=(n,d)=>{const _=d===void 0?!ae.collapsedColumns.has(n):!!d;return wt("beforeColumnChange","columnChange:cancelled",{column:n,collapsed:_,origin:"user"},()=>(_?ae.collapsedColumns.add(n):ae.collapsedColumns.delete(n),Te(),r.fire("column:collapse",{column:n,collapsed:_}),r),()=>r)},r.controlValue=(n,d,..._)=>We(r,n,d,_,te(r)),r.collapseLane=(n,d)=>{const _=d===void 0?!ae.collapsedLanes.has(n):!!d;return _?ae.collapsedLanes.add(n):ae.collapsedLanes.delete(n),Te(),r.fire("swimlane:collapse",{swimlane:n,collapsed:_}),r},r.reorderColumns=n=>Array.isArray(n)?wt("beforeColumnReorder","columnReorder:cancelled",{order:[...n],origin:"user"},()=>(ae.columnOrder=[...n],Te(),r.fire("column:reorder",{order:r.model.columns.map(d=>d.id)}),r),()=>(r.el&&Te(),r)):r,r.moveColumn=(n,d)=>{const _=r.model.columns.map(W=>W.id).filter(W=>W!==n),N=ne(d)?_.length:_.indexOf(d);return _.splice(N<0?_.length:N,0,n),r.reorderColumns(_)},r.reorderLanes=n=>Array.isArray(n)?wt("beforeLaneReorder","laneReorder:cancelled",{order:[...n],origin:"user"},()=>(ae.laneOrder=[...n],Te(),r.fire("swimlane:reorder",{order:(r.model.lanes||[]).map(d=>d.id)}),r),()=>(r.el&&Te(),r)):r,r.moveLane=(n,d)=>{const _=(r.model.lanes||[]).map(W=>W.id).filter(W=>W!==n),N=ne(d)?_.length:_.indexOf(d);return _.splice(N<0?_.length:N,0,n),r.reorderLanes(_)};const y=()=>{r.fire("filter:changed",{quickFilter:ae.quickFilter,hasFilter:ae.filters.size>0,filters:[...ae.filters.keys()]}),Te(),Be&&Promise.resolve(r.reload())};r.filters={DEFAULT:p,where(n,d){return n===void 0?[...ae.filters.keys()]:typeof n!="string"||!n.trim()?(j("kanban.filters.where.name","board.filters.where(name, fn) needs a non-empty string name; the predicate was not registered."),r):d===null?(ae.filters.delete(n)&&y(),r):x(d)?(ae.filters.set(n,d),y(),r):(j(`kanban.filters.where.fn:${n}`,`board.filters.where("${n}", fn) needs a function; the predicate was not registered.`,"Pass null to remove a registered predicate."),r)},engine(n,d){return n===void 0?[...ae.filters.keys()]:typeof n!="string"||!n.trim()?(j("kanban.filters.engine.name","board.filters.engine(name, condition) needs a non-empty string name; the filter was not registered."),r):d===null?(ae.filters.delete(n)&&y(),r):v(d)?(Be||j("kanban.filters.engine.unsourced","an engine filter was registered on a board with no pushdown source: the condition tree is stored but does not narrow cards — bind a `source` (and use `board.filters.where` for client-side predicates)."),ae.filters.set(n,d),y(),r):(j(`kanban.filters.engine.fn:${n}`,`board.filters.engine("${n}", condition) needs a condition tree; the filter was not registered.`,"Pass null to remove a registered filter."),r)},reapply(n){return n===void 0?ae.filters.size?(y(),!0):!1:ae.filters.has(n)?(y(),!0):(j(`kanban.filters.reapply:${n}`,`board.filters.reapply(${JSON.stringify(n)}) names no registered predicate;`,"nothing was re-run."),!1)}},r.setFilter=n=>r.filters.where(p,x(n)?n:null),r.setQuickFilter=n=>(ae.quickFilter=typeof n=="string"?n:"",y(),r),r.facets=n=>{const d=s(n),_=new Map;for(const N of _e.values()){const W=d(N);_.set(W,(_.get(W)||0)+1)}return[..._.entries()].map(([N,W])=>({value:N,count:W})).sort((N,W)=>W.count-N.count)},r.BACKLOG=l,r.setSprint=n=>(ae.sprint=n,r.fire("sprint:changed",{sprint:n}),Te()),r.showBacklog=()=>r.setSprint(l),r.setEpic=n=>(ae.epic=n,r.fire("epic:changed",{epic:n}),Te()),r.sprints=()=>{const n=G.sprintProperty?r.facets(G.sprintProperty).map(N=>N.value):[];if(!G.sprintList)return n;const d=G.sprintList.map(N=>N.id),_=n.filter(N=>!ne(N)&&N!==""&&!d.some(W=>String(W)===String(N)));return[...d,..._]},r.sprintDefs=()=>{const n=G.sprintList||[],d=new Map(n.map(W=>[String(W.id),W])),_=n.map(W=>({id:W.id,title:ne(W.title)?String(W.id):String(W.title)})),N=G.sprintProperty?r.facets(G.sprintProperty).map(W=>W.value):[];for(const W of N)!ne(W)&&W!==""&&!d.has(String(W))&&_.push({id:W,title:String(W)});return _},r.epics=()=>G.epicProperty?r.facets(G.epicProperty).map(n=>n.value):[];const M=n=>G.doneColumns.has(String(s(G.columnProperty)(n)));r.rollup=n=>c(G,[..._e.values()],n,M),r.epicRollup=()=>G.epicProperty?r.rollup(G.epicProperty):[];const C=n=>{const d=T.children||{};if(x(d.load))return Promise.resolve(d.load(n));if(typeof d.property=="string"){const _=s(d.property);return Promise.resolve([..._e.values()].filter(N=>String(_(N))===String(n.key)))}return Promise.resolve([])};r.canExpand=n=>{const d=T.children;if(!d)return!1;if(x(d.hasChildren))return!!d.hasChildren(n);if(x(d.load))return!0;if(typeof d.property=="string"){const _=s(d.property);for(const N of _e.values())if(String(_(N))===String(n.key))return!0}return!1},r.expand=async(n,d={})=>{const _=r.model.cardsByKey.get(n);if(!_||!T.children)return null;const N=await C(_),W=d.depth!==void 0?d.depth:T.__depth||0,ve=ce(r,_,N,W);return r.fire("card:expand",{card:_,rows:N,present:T.children.present||"drawer"}),W>0&&r.fire("card:drill",{card:_,rows:N,depth:W}),ve},r.buildChild=(n,d,_,N)=>{const W=T.children||{};if(x(W.render)){const we=W.render(n,{card:d,rows:_,board:r,depth:N});return{destroy:()=>{x(we)&&we()}}}if(W.asBoard){const we=gt(n,{...S(W,d),rows:_,children:T.children,__depth:N+1});return{destroy:()=>we.destroy()}}const ve=W.factory||typeof globalThis<"u"&&globalThis.LatticeGrid&&globalThis.LatticeGrid.createGrid;if(!x(ve))return j("kanban:children-factory","a card pop-out needs children.factory (a createGrid), children.render, or children.asBoard."),{destroy:()=>{}};const Ce=ve(n,{rows:_,...S(W,d)});return{destroy:()=>{Ce&&x(Ce.destroy)&&Ce.destroy()}}};const S=(n,d)=>{const _=n.gridOptions;return{...x(_)?_(d)||{}:v(_)?_:{}}};r.closeDetail=()=>(ke(r),r),r.isFieldEditable=n=>{const d=G.cardSpecs[n];return!!(d&&d.edit&&typeof d.field=="string")},r.editCard=(n,d)=>{const _=r.model.cardsByKey.get(n);if(!_)return null;const N=d||Object.keys(G.cardSpecs).find(W=>r.isFieldEditable(W));return!N||!r.isFieldEditable(N)||r.isReadonly({column:_.columnId,card:n})?null:Re(r,n,N)},r.applyEdit=async(n,d,_,N={})=>{const W=N.origin||"user",ve=r.model.cardsByKey.get(n),Ce=G.cardSpecs[d];if(!ve||!Ce||typeof Ce.field!="string")return!1;const we=Ce.field,xe={card:ve,key:n,field:d,fieldPath:we,value:_,origin:W};if(!await Promise.resolve(tt.emitBefore("beforeEdit",xe,W)))return r.fire("edit:cancelled",{...xe,reason:xe.reason||"prevented"}),!1;if(Ve){const Je=T.grid.edit.setCells([{key:n,colId:at(we),value:_}],"cell");return r.refresh(),Je===0?(j("kanban:writeback-noop",`an inline edit to "${we}" did not persist through the bound grid (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",xe),!0)}const Pe={..._e.get(n)},Ke=K(Pe,we);if(E(_e.get(n),we,_),Te(),r.fire("card:edit",xe),x(T.onCardEdit)){let Je=T.onCardEdit(xe);if(Je=Je instanceof Promise?await Je.then(At=>At,()=>!1):Je,Je===!1)return _e.set(n,Pe),Te(),!1}return rt.replaying||(rt.record({label:"edit",undo:()=>r.applyEdit(n,d,Ke),redo:()=>r.applyEdit(n,d,_)}),pe()),!0},r.setBlocked=async(n,d,_,N={})=>{const W=N.origin||"user",ve=r.model.cardsByKey.get(n);if(!ve||!G.blockedProperty||r.isReadonly({column:ve.columnId,card:n}))return!1;const Ce=G.blockedProperty,we=d?typeof _=="string"&&_.trim()!==""?_.trim():!0:!1,xe={card:ve,key:n,field:"blocked",fieldPath:Ce,value:we,origin:W};if(!await Promise.resolve(tt.emitBefore("beforeEdit",xe,W)))return r.fire("edit:cancelled",{...xe,reason:xe.reason||"prevented"}),!1;if(Ve){const Ke=T.grid.edit.setCells([{key:n,colId:at(Ce),value:we}],"cell");return r.refresh(),Ke===0?(j("kanban:blocked-writeback-noop",`blocking/unblocking did not persist through the bound grid: writing "${Ce}" was refused (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",xe),!0)}const Pe={..._e.get(n)};if(E(_e.get(n),Ce,we),Te(),r.fire("card:edit",xe),x(T.onCardEdit)){let Ke=T.onCardEdit(xe);if(Ke=Ke instanceof Promise?await Ke.then(Je=>Je,()=>!1):Ke,Ke===!1)return _e.set(n,Pe),Te(),!1}return!0},r.applyRequired=async(n,d,_,N={})=>{const W=N.origin||"user",ve=r.model.cardsByKey.get(n);if(!ve||typeof d!="string")return!1;const Ce={card:ve,key:n,field:d,fieldPath:d,value:_,origin:W};if(!await Promise.resolve(tt.emitBefore("beforeEdit",Ce,W)))return r.fire("edit:cancelled",{...Ce,reason:Ce.reason||"prevented"}),!1;if(Ve){const Pe=T.grid.edit.setCells([{key:n,colId:at(d),value:_}],"cell");return r.refresh(),Pe===0?(j("kanban:writeback-noop",`a required-field edit to "${d}" did not persist through the bound grid (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ce),!0)}const xe={..._e.get(n)},ze=K(xe,d);if(E(_e.get(n),d,_),Te(),r.fire("card:edit",Ce),x(T.onCardEdit)){let Pe=T.onCardEdit(Ce);if(Pe=Pe instanceof Promise?await Pe.then(Ke=>Ke,()=>!1):Pe,Pe===!1)return _e.set(n,xe),Te(),!1}return rt.replaying||(rt.record({label:"edit",undo:()=>r.applyRequired(n,d,ze),redo:()=>r.applyRequired(n,d,_)}),pe()),!0},r.toggleBlocked=(n,d)=>{const _=r.model.cardsByKey.get(n),N=!!(_&&_.explicitBlocked);return r.setBlocked(n,!N,d)},r.setBlockedFilter=n=>(ae.blockedFilter=!!n,r.fire("filter:changed",{quickFilter:ae.quickFilter,hasFilter:ae.filters.size>0,filters:[...ae.filters.keys()],blockedFilter:ae.blockedFilter}),Te()),r.requestMove=(n,d,_=null,N=void 0,W={})=>{const ve=W.origin||"user",Ce=(Array.isArray(n)?n:[n]).filter(we=>r.model.cardsByKey.has(we));if(!Ce.length)return r.move(n,d,_,N,W);if(r.el){const we=[];for(const xe of Ce){const ze=r.model.cardsByKey.get(xe),Pe=$(ze.swimlane);for(const Ke of Ye(G,Pe,d,ze.row))we.push({key:xe,card:ze,field:Ke.field,label:Ke.label,editor:Ke.editor})}if(we.length)return Ne(r,{keys:Ce,toColumn:d,toIndex:_,toLane:N,origin:ve,entries:we}),null}return r.move(n,d,_,N,W)},r.addCard=(n,d={})=>r.isReadonly({column:n})?null:wt("beforeAdd","add:cancelled",{column:n,seed:d,origin:"user"},()=>{let _={...d};if(E(_,G.columnProperty,n),Ve){const W=T.grid.edit.addRow?T.grid.edit.addRow(_):null;return W==null?(j("kanban:addRow","the bound grid cannot append a row (no mutate.append)."),null):(r.refresh(),r.fire("card:add",{column:n,key:W}),r.el&&r.editCard(W),W)}const N=W=>{let ve=G.key(W);return ne(ve)&&(ve=z("card"),typeof r.rowKey=="string"&&E(W,r.rowKey,ve)),_e.set(ve,W),Te(),r.fire("card:add",{column:n,key:ve}),r.el&&r.editCard(ve),rt.replaying||(rt.record({label:"add",undo:()=>(_e.delete(ve),Te(),!0),redo:()=>(_e.set(ve,W),Te(),!0)}),pe()),ve};if(x(T.onAddCard)){const W=T.onAddCard(n);if(W instanceof Promise)return W.then(ve=>N(v(ve)?ve:_),()=>null);v(W)&&(_=W)}return N(_)},()=>null);const B=(n,d,_)=>{if(!G.orderProperty)return null;const N=r.model.columns.find(we=>we.id===d),W=(N?N.cards:[]).filter(we=>!n.includes(we.key)),ve=W.map(we=>Number(s(G.orderProperty)(we.row))),Ce=ne(_)?W.length:_;return o(ve,Ce,n.length)},ue=async(n,d,_,N="user")=>{const W=[],ve=[],Ce=r.model.columns.find(ze=>ze.id===d),we=G.enforceWip&&Ce&&Number.isFinite(Ce.wipLimit)?Ce.wipLimit:null;let xe=Ce?Be?Ce.count:Ce.cards.filter(ze=>!n.includes(ze.key)).length:0;for(const ze of n){const Pe=r.model.cardsByKey.get(ze);if(!Pe)continue;const Ke=Pe.columnId;if(r.isReadonly({column:Ke,card:ze})||r.isReadonly({column:d}))continue;const Je=r.model.columns.findIndex(pt=>pt.id===d),At=Pe.columnId===null?-1:r.model.columns.findIndex(pt=>pt.id===Pe.columnId),Fe=$(Pe.swimlane);if(Pe.blocked&&Je>At&&Ze(G,Fe,Pe.columnId,d)){j(`kanban:blocked-move:${String(Pe.key)}`,`a move of blocked card "${String(Pe.key)}" into "${d}" was refused: a blocked card cannot move forward.`),ve.push({key:ze,card:Pe,from:Ke,reason:"blocked"});continue}if(we!==null&&Ke!==d&&xe+1>we){j(`kanban:wip:${d}`,`a move into "${d}" was refused: it is at its WIP limit of ${we}.`);continue}const De={card:Pe,key:ze,from:Ke,to:d,index:_,origin:N},qe=tt.emitBefore("beforeMove",De,N);(qe===!0?!0:qe===!1?!1:await qe)!==!1?(W.push({key:ze,card:Pe,from:Ke}),Ke!==d&&(xe+=1)):ve.push({key:ze,card:Pe,from:Ke,reason:De.reason||"prevented"})}for(const ze of ve)r.fire("move:cancelled",{keys:[ze.key],cards:[ze.card],from:[ze.from],to:d,index:_,reason:ze.reason});return W};r.move=async(n,d,_=null,N=void 0,W={})=>{const ve=W.origin||"user",Ce=(Array.isArray(n)?n:[n]).filter(Fe=>r.model.cardsByKey.has(Fe));for(const Fe of Ce){const De=r.model.cardsByKey.get(Fe),qe=$(De.swimlane);if(!Ze(G,qe,De.columnId,d))throw u(Qe(G,qe,De.columnId,d));const it=Ye(G,qe,d,De.row);if(it.length)throw u(Ie(G,qe,d,it))}const we=await ue(Ce,d,_,ve);if(!we.length)return{moved:[],reverted:!1};const xe=we.map(Fe=>Fe.key),ze=Ve?null:we.map(({key:Fe,from:De})=>{const qe=r.model.columns.find(vt=>vt.id===De),it=qe?qe.cards.findIndex(vt=>vt.key===Fe):0,pt=_e.get(Fe),Pt=G.swimlaneProperty&&pt?s(G.swimlaneProperty)(pt):void 0;return{key:Fe,from:De,index:it,lane:Pt}}),Pe=B(xe,d,_),Ke=N!==void 0&&!!G.swimlaneProperty,Je={keys:xe,cards:we.map(Fe=>Fe.card),from:we.map(Fe=>Fe.from),to:d,index:_,origin:ve,lane:Ke?N:void 0,orders:Pe};if(Ve){const Fe=T.grid,De=[],qe=at(G.columnProperty),it=G.orderProperty?at(G.orderProperty):null,pt=Ke?at(G.swimlaneProperty):null;we.forEach(({key:vt},Tt)=>{De.push({key:vt,colId:qe,value:d}),Pe&&it&&De.push({key:vt,colId:it,value:Pe[Tt]}),pt&&De.push({key:vt,colId:pt,value:N})});const Pt=Fe.edit.setCells(De,"cell");return r.refresh(),Pt===0&&De.length?(j("kanban:writeback-noop",`a card move did not persist through the bound grid: writing "${G.columnProperty}" was refused (a read-only, non-editable, permission-blocked or unresolvable column), so the card stayed where it was.`),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0}):(r.fire("card:move",Je),{moved:xe,reverted:!1})}if(Be){const Fe=T.source.edit&&x(T.source.edit.commit)?T.source.edit:null;if(!Fe)return j("kanban:writeback-source","a card move did not persist: the bound pushdown source has no `edit.commit` (build it with `createPushdownSource({ edit: true })` over an adapter that declares `mutate.update`), so the card stayed where it was."),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0};const De=[];we.forEach(({key:qe},it)=>{De.push({key:qe,colId:G.columnProperty,value:d}),Pe&&G.orderProperty&&De.push({key:qe,colId:G.orderProperty,value:Pe[it]}),Ke&&De.push({key:qe,colId:G.swimlaneProperty,value:N})});try{await Promise.all(De.map(qe=>Fe.commit(qe)))}catch(qe){return r.fire("card:reverted",{...Je,reason:qe&&qe.message?qe.message:"write failed"}),{moved:[],reverted:!0}}return r.fire("card:move",Je),await r.reload(),{moved:xe,reverted:!1}}const At=we.map(({key:Fe})=>({key:Fe,row:{..._e.get(Fe)}}));if(we.forEach(({key:Fe},De)=>{const qe=_e.get(Fe);E(qe,G.columnProperty,d),Pe&&G.orderProperty&&E(qe,G.orderProperty,Pe[De]),Ke&&E(qe,G.swimlaneProperty,N)}),Te(),r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("card:move",Je),x(T.onCardMove)){let Fe=T.onCardMove(Je);if(Fe=Fe instanceof Promise?await Fe.then(De=>De,()=>!1):Fe,Fe===!1){for(const De of At)_e.set(De.key,De.row);return Te(),r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0}}}if(!rt.replaying){const Fe=ze[0].from,De=Math.min(...ze.map(it=>it.index)),qe=G.swimlaneProperty?ze[0].lane:void 0;rt.record({label:"move",undo:()=>r.move(xe,Fe,De,qe).then(it=>it.moved.length>0),redo:()=>r.move(xe,d,_,N).then(it=>it.moved.length>0)}),pe()}return{moved:xe,reverted:!1}};const de=(n="undo")=>{if(Ve){const d=T.grid&&T.grid.history;if(!d||!x(d.peek))return null;const _=d.peek(n);return _?_.label:null}return rt.peek(n)},pe=()=>{r.fire("history",{canUndo:r.canUndo(),canRedo:r.canRedo(),label:de("undo")})};r.canUndo=()=>Ve?!!(T.grid&&T.grid.history&&x(T.grid.history.canUndo)&&T.grid.history.canUndo()):rt.canUndo(),r.canRedo=()=>Ve?!!(T.grid&&T.grid.history&&x(T.grid.history.canRedo)&&T.grid.history.canRedo()):rt.canRedo(),r.undo=async()=>{if(Ve){const d=T.grid&&T.grid.history,_=d&&x(d.undo)?d.undo():null;return pe(),_}const n=await rt.undo();return n&&n.applied===!1&&j("kanban:undo:vetoed","an undo was refused by a before-event handler or the write-back path; the card and history are unchanged."),pe(),n},r.redo=async()=>{if(Ve){const d=T.grid&&T.grid.history,_=d&&x(d.redo)?d.redo():null;return pe(),_}const n=await rt.redo();return n&&n.applied===!1&&j("kanban:redo:vetoed","a redo was refused by a before-event handler or the write-back path; the card and history are unchanged."),pe(),n};let le=()=>{};const Ee=[],q=()=>{for(;Ee.length;)Ee.pop()()},he=()=>{q();const n=T.grid;if(!n||!x(n.on))return;const d=(_,N)=>{const W=n.on(_,N);Ee.push(()=>{x(W)?W():x(n.off)&&n.off(_,N)})};for(const _ of["cell:confirmed","cell:reverted","cell:conflict"])d(_,()=>r.refresh());d("rows:changed",()=>r.refresh()),d("filter:changed",()=>{typeof queueMicrotask=="function"?queueMicrotask(()=>r.refresh()):r.refresh()}),d("history:changed",()=>pe()),d("history:applied",()=>r.refresh()),d("cell:reverted",_=>{if(!_||_.colId!==at(G.columnProperty))return;const N=r.card(_.key);r.fire("card:reverted",{keys:[_.key],cards:N?[N]:[],from:N?[N.columnId]:[],to:N?N.columnId:null,index:null,orders:null,reverted:!0,reason:_.reason})}),d("cell:confirmed",_=>{if(!_||_.colId!==at(G.columnProperty))return;const N=r.card(_.key);r.fire("card:confirmed",{keys:[_.key],cards:N?[N]:[],to:N?N.columnId:null})})};Ve&&he(),r.rebind=n=>!Ve||!n||n===T.grid?r:(T.grid=n,G.grid=n,he(),$t(),Te()),r.rows={apply(n={}){if(Ve){j("kanban:apply-gridbound","rows.apply on a grid-bound board is ignored; route to the bound grid instead.");return}lt=!0;for(const d of n.add||[])_e.set(G.key(d),d);for(const d of n.update||[]){const _=G.key(d);_e.set(_,X(_e.get(_),d))}for(const d of n.remove||[])_e.delete(d);r.model=F(G,[..._e.values()],ae),r.el?ft():x(r.paintSelection)&&r.paintSelection(),r.sla&&x(r.sla.evaluate)&&r.sla.evaluate()},forEach(n){for(const[d,_]of _e)n(_,d)},get count(){return _e.size}},r.setRows=n=>Ve?(j("kanban:setRows-gridbound","setRows on a grid-bound board is ignored; the rows come from the bound grid."),r):(Array.isArray(n)&&(T.rows=n),lt=!1,$t(),Te()),r.setColumns=n=>Array.isArray(n)?(G.columns=n,T.columns=n,G.doneColumns=k(T.doneColumns,n),Te()):r,r.setColumnWidth=(n={})=>{if(!v(n))return r;"columnWidth"in n&&(G.columnWidth=L(n.columnWidth),T.columnWidth=G.columnWidth);const d=U({minColumnWidth:"minColumnWidth"in n?n.minColumnWidth:G.minColumnWidth,maxColumnWidth:"maxColumnWidth"in n?n.maxColumnWidth:G.maxColumnWidth});return G.minColumnWidth=d.minColumnWidth,G.maxColumnWidth=d.maxColumnWidth,T.minColumnWidth=d.minColumnWidth,T.maxColumnWidth=d.maxColumnWidth,r.columnWidth=G.columnWidth,r.minColumnWidth=G.minColumnWidth,r.maxColumnWidth=G.maxColumnWidth,A(r),r},r.setOrder=n=>(G.order=x(n)?n:null,T.order=G.order,Te()),r.columns=()=>r.model.columns,r.column=n=>r.model.columns.find(d=>d.id===n),r.count=n=>r.column(n)?.count??0,r.points=n=>r.column(n)?.points??0,r.cards=()=>[...r.model.cardsByKey.values()],r.card=n=>r.model.cardsByKey.get(n);const Le=new WeakMap;r.on=(n,d)=>(ot.includes(n)||j(`kanban:event:${n}`,`"${n}" is not a board event; expected one of ${ot.join(", ")}.`),n!=="column:control"||!x(d)?tt.on(n,d):(Le.has(d)||Le.set(d,_=>d({..._,type:_.controlType})),tt.on(n,Le.get(d)))),r.off=(n,d)=>tt.off(n,n==="column:control"&&Le.get(d)||d),r.readonly=(n={})=>_t(n);let Xe=null;if(r.destroy=()=>{bt.fail(new Error("lattice-grid: the board was destroyed before it became ready.")),Xe&&(Xe(),Xe=null);const n=r.el;if(n){for(;n.firstChild;)n.removeChild(n.firstChild);n.classList.remove($e),delete n.__latticeKanban}r._tokenScopeOff&&(r._tokenScopeOff(),r._tokenScopeOff=null),q(),le(),rt.clear(),r.flow&&x(r.flow.destroy)&&r.flow.destroy(),r.sla&&x(r.sla.destroy)&&r.sla.destroy(),r.model={columns:[],cardsByKey:new Map,unplaced:[]}},Be){const n=T.transitionLog||(v(T.source)?T.source.transitionLog:null);r.flowAvailable=T.flow!==!1&&!!n,r.flowAvailable?r.flow=b(r,{...v(T.flow)?T.flow:{},history:n}):r.flow=null}else T.flow!==!1&&(r.flow=b(r,v(T.flow)?T.flow:{}));if(T.sla&&(r.sla=D(r,v(T.sla)?T.sla:{})),v(T.state)){const n=T.state;if(Array.isArray(n.collapsedColumns)&&(ae.collapsedColumns=new Set(n.collapsedColumns)),Array.isArray(n.collapsedLanes)&&(ae.collapsedLanes=new Set(n.collapsedLanes)),"columnOrder"in n&&(Array.isArray(n.columnOrder)||n.columnOrder===null)&&(ae.columnOrder=n.columnOrder?[...n.columnOrder]:null),"laneOrder"in n&&(Array.isArray(n.laneOrder)||n.laneOrder===null)&&(ae.laneOrder=n.laneOrder?[...n.laneOrder]:null),typeof n.quickFilter=="string"&&(ae.quickFilter=n.quickFilter),"sprint"in n&&(ae.sprint=n.sprint),"epic"in n&&(ae.epic=n.epic),typeof n.blockedFilter=="boolean"&&(ae.blockedFilter=n.blockedFilter),Array.isArray(n.selection))for(const d of n.selection)f.add(d)}return Be?Promise.resolve(r.reload()).then(()=>{r.flow&&x(r.flow.seed)&&r.flow.seed(),r.sla&&x(r.sla.start)&&r.sla.start(),bt.settleNow()}):(r.refresh(),r.flow&&x(r.flow.seed)&&r.flow.seed(),r.sla&&x(r.sla.start)&&r.sla.start(),bt.settleSoon()),r.el&&(le=ye({root:r.el,undo:()=>r.undo(),redo:()=>r.redo()})),ct&&(ct.__latticeKanban=r),r.el&&(Xe=ge(r.el,T).destroy),r}const Ct=gt});const jt=xt("packages/modules/kanban/index.js"),Nt=jt.createKanban;var Lt=jt.default;export{Nt as createKanban,Lt as default};
525
+ `;class o{#t;#e;#n;#r=null;#o=[];#i;#s=0;#l=null;#a=null;#c=!1;constructor(k){this.#a=k.owner||null,this.#a&&v(this.#a.setAttribute)&&this.#a.setAttribute(P,""),this.#t=k.grid,this.#e=k.document,this.#n=k.element,this.#i=k.window||(typeof globalThis>"u"?{}:globalThis)}mount(){this.refresh(),v(this.#t.on)&&this.#o.push(this.#t.on("licence:changed",()=>this.refresh()));const k=this.#t.licence&&this.#t.licence.ready;k&&v(k.then)&&k.then(()=>this.refresh(),()=>this.refresh())}refresh(){const k=this.#p()&&!this.#u();k&&!this.#r?(this.#g(),this.#d()):!k&&this.#r&&(this.#h(),this.#f())}#u(){const k=this.#n;let _=k&&k.parentNode;for(this.#a&&_===this.#a&&(_=_.parentNode);_&&_.nodeType===1;){if(v(_.hasAttribute)&&_.hasAttribute(P))return!0;_=_.parentNode}return!1}#m(){const k=this.#i;if(!k||!v(k.matchMedia))return!1;try{return!!k.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}#d(){this.#f(),v(this.#i.setTimeout)&&(this.#m()||(this.#l=this.#i.setTimeout(()=>{if(this.#l=null,!this.#p()||this.#u()){this.#h();return}this.#s=(this.#s+1)%X.length,this.#h(),this.#g(),this.#d()},oe)))}#f(){this.#l!==null&&v(this.#i.clearTimeout)&&this.#i.clearTimeout(this.#l),this.#l=null}#p(){const k=this.#t.licence;return!!(k&&v(k.watermark)&&k.watermark())}#g(){const k=this.#t.messages&&v(this.#t.messages.t)?this.#t.messages:K,_=E(this.#e,"a",{class:`${z}__link`,text:k.t("licence.watermark"),attrs:{href:V,target:"_blank",rel:"noopener noreferrer"}}),F=E(this.#e,"span",{class:`${z}__free`,text:k.t("licence.watermark.free")});this.#r=E(this.#e,"div",{class:`${z} ${z}--${X[this.#s]}`,attrs:{role:"note",title:"This grid is unlicensed for this domain. Visit latticegrid.dev for a licence."},children:[_,F]}),this.#o.push(R(this.#r,"pointerdown",G=>{v(G.stopPropagation)&&G.stopPropagation()})),this.#n&&v(this.#n.appendChild)&&this.#n.appendChild(this.#r),typeof queueMicrotask=="function"&&!this.#c&&(this.#c=!0,queueMicrotask(()=>{this.#c=!1,this.#r&&this.#u()&&(this.#h(),this.#f())}))}#h(){this.#r&&v(this.#r.remove)&&this.#r.remove(),this.#r=null}destroy(){this.#f(),this.#a&&v(this.#a.removeAttribute)&&this.#a.removeAttribute(P);for(const k of this.#o)k();this.#o=[],this.#h()}}function s(f={},k=void 0){const _=globalThis[H],F=!f.licence&&k&&v(k.querySelector)?k.querySelector('meta[name="lattice-license"]')?.getAttribute("content"):null,G=f.licence||F;return G&&O(G),{licence:{watermark:()=>u(),get ready(){return _?_.verify():Promise.resolve()}},on:(Y,ye)=>Y==="licence:changed"&&_?_.onSettled(()=>ye()):()=>{}}}function c(f,k={}){const _=f&&f.ownerDocument;if(!_||!v(_.createElement))return{destroy(){},refresh(){}};const F=_.defaultView||void 0,G=s(k,_);let Y=null,ye=null,Pe=null,A=!1;const re=()=>{if(!_.getElementById(M)&&_.head){const Re=_.createElement("style");Re.id=M,Re.textContent=p,_.head.appendChild(Re)}F&&v(F.getComputedStyle)&&F.getComputedStyle(f).position==="static"&&(f.style.position="relative"),Y=_.createElement("div"),Y.className=I,f.appendChild(Y),ye=new o({grid:G,document:_,element:Y,window:F,owner:f}),ye.mount(),F&&v(F.MutationObserver)&&(Pe=new F.MutationObserver(()=>{!A&&Y&&Y.parentNode!==f&&f.appendChild(Y)}),Pe.observe(f,{childList:!0}))},ce=()=>{A||(ye?ye.refresh():G.licence.watermark()&&re())};ce();const ve=G.on("licence:changed",ce);return G.licence.ready,{refresh:ce,destroy(){A||(A=!0,ve(),Pe&&Pe.disconnect(),ye&&ye.destroy(),Y&&Y.parentNode&&Y.parentNode.removeChild(Y))}}}const l=o}),Ue("packages/modules/kanban/source.js",function(g,J){"use strict";Object.defineProperty(g,"COUNT_ID",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"POINTS_ID",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isPushdownSource",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"engineFilterTree",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"totalsRequest",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"totalsAggregates",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"totalsKey",{enumerable:!0,get:function(){return V}}),Object.defineProperty(g,"parseTotals",{enumerable:!0,get:function(){return X}}),Object.defineProperty(g,"applyTotals",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(g,"columnPageRequest",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"appendRows",{enumerable:!0,get:function(){return P}});const a=J("packages/core/src/internal/predicates.js"),v=a.isFunction,x=a.isNil,ne=a.isObject,j=J("packages/core/src/internal/warn.js").warnOnce,u="\0kanban-count",O="\0kanban-points";function K(I){return ne(I)&&v(I.fetch)&&v(I.aggregate)}function E(I){const M=[];if(I.filters&&I.filters.size)for(const p of I.filters.values())v(p)||ne(p)&&M.push(p);return M.length?M.length===1?M[0]:{op:"and",conditions:M}:null}function R(I,M){const p=[I.columnProperty];I.swimlanes&&I.swimlaneProperty&&p.push(I.swimlaneProperty);const o=typeof M.quickFilter=="string"?M.quickFilter.trim():"";return{filters:E(M),quick:o||"",groupBy:p}}function z(I){const M=[{id:u,col:I.columnProperty,fn:"count"}];return I.pointsProperty&&M.push({id:O,col:I.pointsProperty,fn:"sum"}),M}function V(I,M){return M===void 0?String(I):`${M}|${I}`}function X(I,M){const p=Array.isArray(M&&M.engine)?M.engine:[],o=Array.isArray(M&&M.client)?M.client:[],s=Array.isArray(M&&M.groups)?M.groups:null,c=new Map;if(!s)return{byKey:c,engine:p,client:o,groups:s};const l=I.swimlanes&&I.swimlaneProperty;for(const f of s){if(!f||!Array.isArray(f.keys))continue;const k=f.keys;if(x(k[0])||l&&x(k[1]))continue;const _=String(k[0]),F=l?String(k[1]):void 0,G=f.values||{},Y=Number(G[u]),ye=Number(G[O]);c.set(V(_,F),{count:Number.isFinite(Y)?Y:0,points:Number.isFinite(ye)?ye:0})}return{byKey:c,engine:p,client:o,groups:s}}function oe(I,M,p){const o=M.swimlanes&&M.swimlaneProperty;for(const s of I.columns){let c=0,l=0;if(o&&Array.isArray(I.lanes))for(const f of I.lanes){const k=Array.isArray(f.columns)?f.columns.find(F=>F.id===s.id):null,_=p.get(V(s.id,f.id))||{count:0,points:0};k&&(k.count=_.count,k.points=_.points),c+=_.count,l+=_.points}else{const f=p.get(V(s.id,void 0))||{count:0,points:0};c=f.count,l=f.points}s.count=c,s.points=l,s.over=s.wipLimit!==null&&c>s.wipLimit}if(o&&Array.isArray(I.lanes))for(const s of I.lanes){let c=0,l=0;for(const f of I.columns){const k=p.get(V(f.id,s.id))||{count:0,points:0};c+=k.count,l+=k.points}s.count=c,s.points=l}}function H(I,M,p,o,s,c){const l=[],f=E(M);f&&l.push(f),l.push({col:I.columnProperty,op:"eq",value:p,caseSensitive:!0}),o!==void 0&&I.swimlaneProperty&&l.push({col:I.swimlaneProperty,op:"eq",value:o,caseSensitive:!0});const k=typeof M.quickFilter=="string"?M.quickFilter.trim():"";return{filters:l.length===1?l[0]:{op:"and",conditions:l},quick:k||"",sort:I.orderProperty?[{col:I.orderProperty,dir:"asc"}]:null,range:{start:s,end:s+c}}}function P(I,M,p){const o=[];for(const s of p||[]){let c;try{c=M.key(s)}catch{continue}if(x(c)){j("kanban:source:rowkey","a row loaded from the pushdown source has no row key and was left out; check the board `rowKey` against the engine schema.");continue}I.set(c,s),o.push(c)}return o}}),Ue("packages/modules/kanban/index.js",function(g,J){"use strict";Object.defineProperty(g,"createKanban",{enumerable:!0,get:function(){return kt}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return Ot}});const a=J("packages/core/src/internal/predicates.js"),v=a.isObject,x=a.isFunction,ne=a.isNil,ee=J("packages/core/src/internal/warn.js"),j=ee.warnOnce,u=ee.fail,O=J("packages/core/src/internal/paths.js"),K=O.getPath,E=O.setPath,z=J("packages/core/src/internal/uid.js").uid,X=J("packages/core/src/internal/merge.js").mergeRow,H=J("packages/core/src/internal/ready.js").createReadySignal,P=J("packages/modules/kanban/model.js"),I=P.resolveContext,M=P.groupRows,p=P.keyFn,o=P.computeOrders,s=P.accessorFor,c=P.rollup,l=P.BACKLOG,f=P.DEFAULT_FILTER,k=P.deriveDoneColumns,_=P.laneIdOf,F=P.resolveColumnWidth,G=P.resolveColumnWidthRange,Y=J("packages/modules/kanban/view.js"),ye=Y.resolveReadonly,Pe=Y.renderPreserving,A=Y.applyColumnWidths,re=Y.installSelectionPainter,ce=Y.openDetail,ve=Y.closeDetail,Re=Y.startEdit,Ne=Y.openRequiredForm,Q=Y.closeRequiredForm,te=Y.boardT,qe=J("packages/modules/kanban/controls.js").controlValue,xe=J("packages/modules/kanban/workflow.js"),Ze=xe.canMove,tt=xe.transitionError,Ve=xe.missingRequired,Ie=xe.requiredError,ft=J("packages/modules/shared/emitter.js").Emitter,b=J("packages/modules/kanban/flow.js").createFlowAnalytics,D=J("packages/modules/kanban/sla.js").createSlaMonitor,_e=J("packages/modules/kanban/styles.js").NS,$e=J("packages/modules/kanban/history.js"),le=$e.createHistory,ge=$e.installUndoShortcuts,me=J("packages/dom/src/watermark.js").mountViewWatermark,pe=J("packages/modules/kanban/source.js"),ze=pe.isPushdownSource,Se=pe.totalsRequest,He=pe.totalsAggregates,pt=pe.parseTotals,at=pe.applyTotals,wt=pe.columnPageRequest,yt=pe.appendRows,lt=Object.freeze(["card:click","card:dblclick","card:contextmenu","card:move","card:reverted","card:confirmed","selection:changed","column:collapse","card:add","column:control","column:menu","drag:start","drag:end","swimlane:collapse","swimlane:reorder","column:reorder","filter:changed","sprint:changed","epic:changed","card:expand","card:drill","card:edit","cards:loaded","card:sla","beforeMove","beforeAdd","beforeEdit","beforeLaneReorder","beforeColumnReorder","beforeColumnChange","move:cancelled","add:cancelled","edit:cancelled","laneReorder:cancelled","columnReorder:cancelled","columnChange:cancelled","history"]),nt=Object.freeze({onCardClick:"card:click",onCardDblClick:"card:dblclick",onCardContextMenu:"card:contextmenu"});function St(rt,Qe,N,U,et){Object.defineProperty(rt,Qe,{enumerable:!0,configurable:!0,get(){let ct;try{ct=N.rows.value(U,et)}catch{ct=void 0}return Object.defineProperty(rt,Qe,{value:ct,writable:!0,enumerable:!0,configurable:!0}),ct},set(ct){Object.defineProperty(rt,Qe,{value:ct,writable:!0,enumerable:!0,configurable:!0})}})}function vt(rt,Qe){if(Array.isArray(rt.rows))return rt.rows;const N=rt.grid;if(!N||!N.rows||!x(N.rows.forEach))return[];const U=[Qe.columnProperty,Qe.pointsProperty,Qe.orderProperty,Qe.swimlaneProperty,Qe.sprintProperty,Qe.epicProperty].filter(je=>typeof je=="string"),et=N.columns&&x(N.columns.all)?N.columns.all():[],ct=je=>{if(N.columns&&x(N.columns.get)&&N.columns.get(je))return je;const Ce=et.find(ut=>ut&&ut.field===je);return Ce?Ce.id:je},$t=new Map(U.map(je=>[je,ct(je)])),Ge=[];return N.rows.forEach(je=>{if(je&&je.group||je&&je.pending===!0)return;const Ce=je.key,ut={__boardKey:Ce};for(const Ye of U)try{ut[Ye]=N.rows.value(Ce,$t.get(Ye))}catch{ut[Ye]=void 0}for(const Ye of et){if(!Ye||Ye.id==null)continue;const se=typeof Ye.field=="string"&&Ye.field?Ye.field:Ye.id;Object.prototype.hasOwnProperty.call(ut,se)||St(ut,se,N,Ce,Ye.id)}Ge.push(ut)}),Ge}function kt(rt,Qe={}){const N=v(Qe)?Qe:{},U=I(N);N.grid&&!Array.isArray(N.rows)&&(U.key=p("__boardKey"));const et=new ft("kanban"),ct=ye(N.readonly),$t=rt&&rt.ownerDocument||typeof globalThis<"u"&&globalThis.document||null,Ge=!!N.grid&&!Array.isArray(N.rows),je=ze(N.source)&&!Array.isArray(N.rows)&&!Ge,Ce=new Map;let ut=!1;const Ye=n=>{if(!Ge||typeof n!="string")return n;const d=N.grid.columns;if(!d)return n;try{if(x(d.get)&&d.get(n))return n;const L=(x(d.all)?d.all():[]).find(W=>W&&W.field===n);return L?L.id:n}catch{return n}},se={collapsedColumns:new Set,collapsedLanes:new Set,columnOrder:Array.isArray(N.columnOrder)?[...N.columnOrder]:null,laneOrder:Array.isArray(N.laneOrder)?[...N.laneOrder]:null,filters:new Map(x(N.filter)?[[f,N.filter]]:[]),quickFilter:typeof N.quickFilter=="string"?N.quickFilter:"",sprint:N.sprint===void 0?void 0:N.sprint,epic:N.epic===void 0?void 0:N.epic,blockedFilter:!!N.blockedFilter},dt=H(),r={el:rt||null,doc:$t,ctx:U,config:N,emitter:et,isReadonly:ct,wired:!1,ready:dt.promise,rowKey:N.rowKey??(Ge?"__boardKey":"id"),model:{columns:[],cardsByKey:new Map,unplaced:[]},live:null,flowAvailable:!0,sourceBound:je,columnWidth:U.columnWidth,minColumnWidth:U.minColumnWidth,maxColumnWidth:U.maxColumnWidth,fire(n,d){et.emit(n,d);for(const[$,L]of Object.entries(nt))L===n&&x(N[$])&&N[$](d)}},it=le({historyDepth:N.historyDepth});if(r._totals=new Map,r._pages=new Map,je&&x(N.source.resolveAggregatePlan)){const n=N.source.resolveAggregatePlan(He(U));(!n||!n.engine||!n.engine.length)&&j("kanban:source:aggregates","the pushdown source routes the board's column count/sum aggregates client-side (its `aggregates` config defaults to client), so column totals cannot come from the engine. Create the source with `aggregates: { default: 'engine' }` for engine totals.")}const _t=(n,d,$,L,W)=>{const we=$.origin||"user",Ae=()=>(r.fire(d,{...$,reason:$.reason||"prevented"}),W()),be=et.emitBefore(n,$,we);return be===!0?L():be===!1?Ae():be.then(Ee=>Ee?L():Ae())};x(N.onBeforeMove)&&et.on("beforeMove",n=>N.onBeforeMove(n.card,n.from,n.to,n.index));const mt=()=>{Ce.clear();for(const n of vt(N,U))Ce.set(U.key(n),n)},At=()=>{r.el&&(r.el.setAttribute("aria-busy","true"),Pe(r),r.el.setAttribute("aria-busy","false"))},e=()=>(r.model=M(U,[...Ce.values()],se),je&&at(r.model,U,r._totals),At(),r),t=(n,d)=>d===void 0?String(n):`${d}|${n}`,i=async()=>{try{const n=await N.source.aggregate(Se(U,se),He(U)),d=pt(U,n);r._totals=d.byKey,d.groups||j("kanban:source:totals","the pushdown source could not compute column totals in the engine (the no-mixed-provenance guard fell every aggregate client-side), so column counts and sums are unavailable rather than computed over the loaded page.")}catch(n){r._totals=new Map,j("kanban:source:totals:error",`the pushdown source failed to answer column totals: ${n&&n.message?n.message:n}`)}e()},h=async(n,d)=>{const $=t(n,d);let L=r._pages.get($);if(L||(L={loaded:0,loading:!1,exhausted:!1},r._pages.set($,L)),L.loading||L.exhausted)return!1;L.loading=!0;try{const W=wt(U,se,n,d,L.loaded,U.pageSize),we=await N.source.fetch(W),Ae=we&&we.rows||[],be=yt(Ce,U,Ae);L.loaded+=Ae.length;const Ee=we&&typeof we.total=="number"?we.total:null;return(!Ae.length||Ae.length<U.pageSize||Ee!==null&&L.loaded>=Ee)&&(L.exhausted=!0),e(),r.fire("cards:loaded",{column:n,lane:d,keys:be,more:!L.exhausted}),!L.exhausted}catch(W){return L.exhausted=!0,j("kanban:source:page",`the pushdown source failed to answer a column page: ${W&&W.message?W.message:W}`),!1}finally{L.loading=!1}};r.reload=async()=>{r._pages.clear(),Ce.clear(),await i();const n=r.model.columns.map($=>$.id),d=r.model.lanes?r.model.lanes.map($=>$.id):void 0;if(d&&d.length)for(const $ of d)for(const L of n)await h(L,$);else for(const $ of n)await h($,void 0);return r},r.loadMore=(n,d)=>je?h(n,d):Promise.resolve(!1),r.refresh=()=>(je||ut||mt(),e()),r.repaint=()=>(At(),r);const m={loading:!1,error:null};r.status=m,r.getState=()=>({collapsedColumns:[...se.collapsedColumns],collapsedLanes:[...se.collapsedLanes],columnOrder:se.columnOrder?[...se.columnOrder]:null,laneOrder:se.laneOrder?[...se.laneOrder]:null,quickFilter:se.quickFilter,sprint:se.sprint,epic:se.epic,blockedFilter:se.blockedFilter,selection:[...y]}),r.setState=n=>{const d=v(n)?n:{};if(Array.isArray(d.collapsedColumns)&&(se.collapsedColumns=new Set(d.collapsedColumns)),Array.isArray(d.collapsedLanes)&&(se.collapsedLanes=new Set(d.collapsedLanes)),"columnOrder"in d&&(se.columnOrder=Array.isArray(d.columnOrder)?[...d.columnOrder]:null),"laneOrder"in d&&(se.laneOrder=Array.isArray(d.laneOrder)?[...d.laneOrder]:null),typeof d.quickFilter=="string"&&(se.quickFilter=d.quickFilter),"sprint"in d&&(se.sprint=d.sprint),"epic"in d&&(se.epic=d.epic),typeof d.blockedFilter=="boolean"&&(se.blockedFilter=d.blockedFilter),Array.isArray(d.selection)){y.clear();for(const $ of d.selection)y.add($)}return e()},r.setLoading=n=>(m.loading=!!n,e()),r.setError=n=>(m.error=ne(n)?null:String(n),e());const y=new Set;r.selection=()=>[...y],r.isSelected=n=>y.has(n),r.select=(n,d="set")=>{const $=(Array.isArray(n)?n:[n]).filter(L=>!ne(L));if(d==="set"){y.clear();for(const L of $)y.add(L)}else if(d==="add")for(const L of $)y.add(L);else if(d==="remove")for(const L of $)y.delete(L);else if(d==="toggle")for(const L of $)y.has(L)?y.delete(L):y.add(L);return r.selectionSet=y,r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("selection:changed",{keys:[...y]}),r},r.clearSelection=()=>r.select([],"set"),r.selectionSet=y,re(r),r.collapseColumn=(n,d)=>{const $=d===void 0?!se.collapsedColumns.has(n):!!d;return _t("beforeColumnChange","columnChange:cancelled",{column:n,collapsed:$,origin:"user"},()=>($?se.collapsedColumns.add(n):se.collapsedColumns.delete(n),e(),r.fire("column:collapse",{column:n,collapsed:$}),r),()=>r)},r.controlValue=(n,d,...$)=>qe(r,n,d,$,te(r)),r.collapseLane=(n,d)=>{const $=d===void 0?!se.collapsedLanes.has(n):!!d;return $?se.collapsedLanes.add(n):se.collapsedLanes.delete(n),e(),r.fire("swimlane:collapse",{swimlane:n,collapsed:$}),r},r.reorderColumns=n=>Array.isArray(n)?_t("beforeColumnReorder","columnReorder:cancelled",{order:[...n],origin:"user"},()=>(se.columnOrder=[...n],e(),r.fire("column:reorder",{order:r.model.columns.map(d=>d.id)}),r),()=>(r.el&&e(),r)):r,r.moveColumn=(n,d)=>{const $=r.model.columns.map(W=>W.id).filter(W=>W!==n),L=ne(d)?$.length:$.indexOf(d);return $.splice(L<0?$.length:L,0,n),r.reorderColumns($)},r.reorderLanes=n=>Array.isArray(n)?_t("beforeLaneReorder","laneReorder:cancelled",{order:[...n],origin:"user"},()=>(se.laneOrder=[...n],e(),r.fire("swimlane:reorder",{order:(r.model.lanes||[]).map(d=>d.id)}),r),()=>(r.el&&e(),r)):r,r.moveLane=(n,d)=>{const $=(r.model.lanes||[]).map(W=>W.id).filter(W=>W!==n),L=ne(d)?$.length:$.indexOf(d);return $.splice(L<0?$.length:L,0,n),r.reorderLanes($)};const T=()=>{r.fire("filter:changed",{quickFilter:se.quickFilter,hasFilter:se.filters.size>0,filters:[...se.filters.keys()]}),e(),je&&Promise.resolve(r.reload())};r.filters={DEFAULT:f,where(n,d){return n===void 0?[...se.filters.keys()]:typeof n!="string"||!n.trim()?(j("kanban.filters.where.name","board.filters.where(name, fn) needs a non-empty string name; the predicate was not registered."),r):d===null?(se.filters.delete(n)&&T(),r):x(d)?(se.filters.set(n,d),T(),r):(j(`kanban.filters.where.fn:${n}`,`board.filters.where("${n}", fn) needs a function; the predicate was not registered.`,"Pass null to remove a registered predicate."),r)},engine(n,d){return n===void 0?[...se.filters.keys()]:typeof n!="string"||!n.trim()?(j("kanban.filters.engine.name","board.filters.engine(name, condition) needs a non-empty string name; the filter was not registered."),r):d===null?(se.filters.delete(n)&&T(),r):v(d)?(je||j("kanban.filters.engine.unsourced","an engine filter was registered on a board with no pushdown source: the condition tree is stored but does not narrow cards — bind a `source` (and use `board.filters.where` for client-side predicates)."),se.filters.set(n,d),T(),r):(j(`kanban.filters.engine.fn:${n}`,`board.filters.engine("${n}", condition) needs a condition tree; the filter was not registered.`,"Pass null to remove a registered filter."),r)},reapply(n){return n===void 0?se.filters.size?(T(),!0):!1:se.filters.has(n)?(T(),!0):(j(`kanban.filters.reapply:${n}`,`board.filters.reapply(${JSON.stringify(n)}) names no registered predicate;`,"nothing was re-run."),!1)}},r.setFilter=n=>r.filters.where(f,x(n)?n:null),r.setQuickFilter=n=>(se.quickFilter=typeof n=="string"?n:"",T(),r),r.facets=n=>{const d=s(n),$=new Map;for(const L of Ce.values()){const W=d(L);$.set(W,($.get(W)||0)+1)}return[...$.entries()].map(([L,W])=>({value:L,count:W})).sort((L,W)=>W.count-L.count)},r.BACKLOG=l,r.setSprint=n=>(se.sprint=n,r.fire("sprint:changed",{sprint:n}),e()),r.showBacklog=()=>r.setSprint(l),r.setEpic=n=>(se.epic=n,r.fire("epic:changed",{epic:n}),e()),r.sprints=()=>{const n=U.sprintProperty?r.facets(U.sprintProperty).map(L=>L.value):[];if(!U.sprintList)return n;const d=U.sprintList.map(L=>L.id),$=n.filter(L=>!ne(L)&&L!==""&&!d.some(W=>String(W)===String(L)));return[...d,...$]},r.sprintDefs=()=>{const n=U.sprintList||[],d=new Map(n.map(W=>[String(W.id),W])),$=n.map(W=>({id:W.id,title:ne(W.title)?String(W.id):String(W.title)})),L=U.sprintProperty?r.facets(U.sprintProperty).map(W=>W.value):[];for(const W of L)!ne(W)&&W!==""&&!d.has(String(W))&&$.push({id:W,title:String(W)});return $},r.epics=()=>U.epicProperty?r.facets(U.epicProperty).map(n=>n.value):[];const C=n=>U.doneColumns.has(String(s(U.columnProperty)(n)));r.rollup=n=>c(U,[...Ce.values()],n,C),r.epicRollup=()=>U.epicProperty?r.rollup(U.epicProperty):[];const S=n=>{const d=N.children||{};if(x(d.load))return Promise.resolve(d.load(n));if(typeof d.property=="string"){const $=s(d.property);return Promise.resolve([...Ce.values()].filter(L=>String($(L))===String(n.key)))}return Promise.resolve([])};r.canExpand=n=>{const d=N.children;if(!d)return!1;if(x(d.hasChildren))return!!d.hasChildren(n);if(x(d.load))return!0;if(typeof d.property=="string"){const $=s(d.property);for(const L of Ce.values())if(String($(L))===String(n.key))return!0}return!1},r.expand=async(n,d={})=>{const $=r.model.cardsByKey.get(n);if(!$||!N.children)return null;const L=await S($),W=d.depth!==void 0?d.depth:N.__depth||0,we=ce(r,$,L,W);return r.fire("card:expand",{card:$,rows:L,present:N.children.present||"drawer"}),W>0&&r.fire("card:drill",{card:$,rows:L,depth:W}),we},r.buildChild=(n,d,$,L)=>{const W=N.children||{};if(x(W.render)){const be=W.render(n,{card:d,rows:$,board:r,depth:L});return{destroy:()=>{x(be)&&be()}}}if(W.asBoard){const be=kt(n,{...B(W,d),rows:$,children:N.children,__depth:L+1});return{destroy:()=>be.destroy()}}const we=W.factory||typeof globalThis<"u"&&globalThis.LatticeGrid&&globalThis.LatticeGrid.createGrid;if(!x(we))return j("kanban:children-factory","a card pop-out needs children.factory (a createGrid), children.render, or children.asBoard."),{destroy:()=>{}};const Ae=we(n,{rows:$,...B(W,d)});return{destroy:()=>{Ae&&x(Ae.destroy)&&Ae.destroy()}}};const B=(n,d)=>{const $=n.gridOptions;return{...x($)?$(d)||{}:v($)?$:{}}};r.closeDetail=()=>(ve(r),r),r.isFieldEditable=n=>{const d=U.cardSpecs[n];return!!(d&&d.edit&&typeof d.field=="string")},r.editCard=(n,d)=>{const $=r.model.cardsByKey.get(n);if(!$)return null;const L=d||Object.keys(U.cardSpecs).find(W=>r.isFieldEditable(W));return!L||!r.isFieldEditable(L)||r.isReadonly({column:$.columnId,card:n})?null:Re(r,n,L)},r.applyEdit=async(n,d,$,L={})=>{const W=L.origin||"user",we=r.model.cardsByKey.get(n),Ae=U.cardSpecs[d];if(!we||!Ae||typeof Ae.field!="string")return!1;const be=Ae.field,Ee={card:we,key:n,field:d,fieldPath:be,value:$,origin:W};if(!await Promise.resolve(et.emitBefore("beforeEdit",Ee,W)))return r.fire("edit:cancelled",{...Ee,reason:Ee.reason||"prevented"}),!1;if(Ge){const Je=N.grid.edit.setCells([{key:n,colId:Ye(be),value:$}],"cell");return r.refresh(),Je===0?(j("kanban:writeback-noop",`an inline edit to "${be}" did not persist through the bound grid (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ee),!0)}const Oe={...Ce.get(n)},We=K(Oe,be);if(E(Ce.get(n),be,$),e(),r.fire("card:edit",Ee),x(N.onCardEdit)){let Je=N.onCardEdit(Ee);if(Je=Je instanceof Promise?await Je.then(Ct=>Ct,()=>!1):Je,Je===!1)return Ce.set(n,Oe),e(),!1}return it.replaying||(it.record({label:"edit",undo:()=>r.applyEdit(n,d,We),redo:()=>r.applyEdit(n,d,$)}),ae()),!0},r.setBlocked=async(n,d,$,L={})=>{const W=L.origin||"user",we=r.model.cardsByKey.get(n);if(!we||!U.blockedProperty||r.isReadonly({column:we.columnId,card:n}))return!1;const Ae=U.blockedProperty,be=d?typeof $=="string"&&$.trim()!==""?$.trim():!0:!1,Ee={card:we,key:n,field:"blocked",fieldPath:Ae,value:be,origin:W};if(!await Promise.resolve(et.emitBefore("beforeEdit",Ee,W)))return r.fire("edit:cancelled",{...Ee,reason:Ee.reason||"prevented"}),!1;if(Ge){const We=N.grid.edit.setCells([{key:n,colId:Ye(Ae),value:be}],"cell");return r.refresh(),We===0?(j("kanban:blocked-writeback-noop",`blocking/unblocking did not persist through the bound grid: writing "${Ae}" was refused (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ee),!0)}const Oe={...Ce.get(n)};if(E(Ce.get(n),Ae,be),e(),r.fire("card:edit",Ee),x(N.onCardEdit)){let We=N.onCardEdit(Ee);if(We=We instanceof Promise?await We.then(Je=>Je,()=>!1):We,We===!1)return Ce.set(n,Oe),e(),!1}return!0},r.applyRequired=async(n,d,$,L={})=>{const W=L.origin||"user",we=r.model.cardsByKey.get(n);if(!we||typeof d!="string")return!1;const Ae={card:we,key:n,field:d,fieldPath:d,value:$,origin:W};if(!await Promise.resolve(et.emitBefore("beforeEdit",Ae,W)))return r.fire("edit:cancelled",{...Ae,reason:Ae.reason||"prevented"}),!1;if(Ge){const Oe=N.grid.edit.setCells([{key:n,colId:Ye(d),value:$}],"cell");return r.refresh(),Oe===0?(j("kanban:writeback-noop",`a required-field edit to "${d}" did not persist through the bound grid (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ae),!0)}const Ee={...Ce.get(n)},Ke=K(Ee,d);if(E(Ce.get(n),d,$),e(),r.fire("card:edit",Ae),x(N.onCardEdit)){let Oe=N.onCardEdit(Ae);if(Oe=Oe instanceof Promise?await Oe.then(We=>We,()=>!1):Oe,Oe===!1)return Ce.set(n,Ee),e(),!1}return it.replaying||(it.record({label:"edit",undo:()=>r.applyRequired(n,d,Ke),redo:()=>r.applyRequired(n,d,$)}),ae()),!0},r.toggleBlocked=(n,d)=>{const $=r.model.cardsByKey.get(n),L=!!($&&$.explicitBlocked);return r.setBlocked(n,!L,d)},r.setBlockedFilter=n=>(se.blockedFilter=!!n,r.fire("filter:changed",{quickFilter:se.quickFilter,hasFilter:se.filters.size>0,filters:[...se.filters.keys()],blockedFilter:se.blockedFilter}),e()),r.requestMove=(n,d,$=null,L=void 0,W={})=>{const we=W.origin||"user",Ae=(Array.isArray(n)?n:[n]).filter(be=>r.model.cardsByKey.has(be));if(!Ae.length)return r.move(n,d,$,L,W);if(r.el){const be=[];for(const Ee of Ae){const Ke=r.model.cardsByKey.get(Ee),Oe=_(Ke.swimlane);for(const We of Ve(U,Oe,d,Ke.row))be.push({key:Ee,card:Ke,field:We.field,label:We.label,editor:We.editor})}if(be.length)return Ne(r,{keys:Ae,toColumn:d,toIndex:$,toLane:L,origin:we,entries:be}),null}return r.move(n,d,$,L,W)},r.addCard=(n,d={})=>r.isReadonly({column:n})?null:_t("beforeAdd","add:cancelled",{column:n,seed:d,origin:"user"},()=>{let $={...d};if(E($,U.columnProperty,n),Ge){const W=N.grid.edit.addRow?N.grid.edit.addRow($):null;return W==null?(j("kanban:addRow","the bound grid cannot append a row (no mutate.append)."),null):(r.refresh(),r.fire("card:add",{column:n,key:W}),r.el&&r.editCard(W),W)}const L=W=>{let we=U.key(W);return ne(we)&&(we=z("card"),typeof r.rowKey=="string"&&E(W,r.rowKey,we)),Ce.set(we,W),e(),r.fire("card:add",{column:n,key:we}),r.el&&r.editCard(we),it.replaying||(it.record({label:"add",undo:()=>(Ce.delete(we),e(),!0),redo:()=>(Ce.set(we,W),e(),!0)}),ae()),we};if(x(N.onAddCard)){const W=N.onAddCard(n);if(W instanceof Promise)return W.then(we=>L(v(we)?we:$),()=>null);v(W)&&($=W)}return L($)},()=>null);const ue=(n,d,$)=>{if(!U.orderProperty)return null;const L=r.model.columns.find(be=>be.id===d),W=(L?L.cards:[]).filter(be=>!n.includes(be.key)),we=W.map(be=>Number(s(U.orderProperty)(be.row))),Ae=ne($)?W.length:$;return o(we,Ae,n.length)},de=async(n,d,$,L="user")=>{const W=[],we=[],Ae=r.model.columns.find(Ke=>Ke.id===d),be=U.enforceWip&&Ae&&Number.isFinite(Ae.wipLimit)?Ae.wipLimit:null;let Ee=Ae?je?Ae.count:Ae.cards.filter(Ke=>!n.includes(Ke.key)).length:0;for(const Ke of n){const Oe=r.model.cardsByKey.get(Ke);if(!Oe)continue;const We=Oe.columnId;if(r.isReadonly({column:We,card:Ke})||r.isReadonly({column:d}))continue;const Je=r.model.columns.findIndex(ht=>ht.id===d),Ct=Oe.columnId===null?-1:r.model.columns.findIndex(ht=>ht.id===Oe.columnId),Le=_(Oe.swimlane);if(Oe.blocked&&Je>Ct&&Ze(U,Le,Oe.columnId,d)){j(`kanban:blocked-move:${String(Oe.key)}`,`a move of blocked card "${String(Oe.key)}" into "${d}" was refused: a blocked card cannot move forward.`),we.push({key:Ke,card:Oe,from:We,reason:"blocked"});continue}if(be!==null&&We!==d&&Ee+1>be){j(`kanban:wip:${d}`,`a move into "${d}" was refused: it is at its WIP limit of ${be}.`);continue}const De={card:Oe,key:Ke,from:We,to:d,index:$,origin:L},Be=et.emitBefore("beforeMove",De,L);(Be===!0?!0:Be===!1?!1:await Be)!==!1?(W.push({key:Ke,card:Oe,from:We}),We!==d&&(Ee+=1)):we.push({key:Ke,card:Oe,from:We,reason:De.reason||"prevented"})}for(const Ke of we)r.fire("move:cancelled",{keys:[Ke.key],cards:[Ke.card],from:[Ke.from],to:d,index:$,reason:Ke.reason});return W};r.move=async(n,d,$=null,L=void 0,W={})=>{const we=W.origin||"user",Ae=(Array.isArray(n)?n:[n]).filter(Le=>r.model.cardsByKey.has(Le));for(const Le of Ae){const De=r.model.cardsByKey.get(Le),Be=_(De.swimlane);if(!Ze(U,Be,De.columnId,d))throw u(tt(U,Be,De.columnId,d));const st=Ve(U,Be,d,De.row);if(st.length)throw u(Ie(U,Be,d,st))}const be=await de(Ae,d,$,we);if(!be.length)return{moved:[],reverted:!1};const Ee=be.map(Le=>Le.key),Ke=Ge?null:be.map(({key:Le,from:De})=>{const Be=r.model.columns.find(bt=>bt.id===De),st=Be?Be.cards.findIndex(bt=>bt.key===Le):0,ht=Ce.get(Le),Pt=U.swimlaneProperty&&ht?s(U.swimlaneProperty)(ht):void 0;return{key:Le,from:De,index:st,lane:Pt}}),Oe=ue(Ee,d,$),We=L!==void 0&&!!U.swimlaneProperty,Je={keys:Ee,cards:be.map(Le=>Le.card),from:be.map(Le=>Le.from),to:d,index:$,origin:we,lane:We?L:void 0,orders:Oe};if(Ge){const Le=N.grid,De=[],Be=Ye(U.columnProperty),st=U.orderProperty?Ye(U.orderProperty):null,ht=We?Ye(U.swimlaneProperty):null;be.forEach(({key:bt},Nt)=>{De.push({key:bt,colId:Be,value:d}),Oe&&st&&De.push({key:bt,colId:st,value:Oe[Nt]}),ht&&De.push({key:bt,colId:ht,value:L})});const Pt=Le.edit.setCells(De,"cell");return r.refresh(),Pt===0&&De.length?(j("kanban:writeback-noop",`a card move did not persist through the bound grid: writing "${U.columnProperty}" was refused (a read-only, non-editable, permission-blocked or unresolvable column), so the card stayed where it was.`),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0}):(r.fire("card:move",Je),{moved:Ee,reverted:!1})}if(je){const Le=N.source.edit&&x(N.source.edit.commit)?N.source.edit:null;if(!Le)return j("kanban:writeback-source","a card move did not persist: the bound pushdown source has no `edit.commit` (build it with `createPushdownSource({ edit: true })` over an adapter that declares `mutate.update`), so the card stayed where it was."),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0};const De=[];be.forEach(({key:Be},st)=>{De.push({key:Be,colId:U.columnProperty,value:d}),Oe&&U.orderProperty&&De.push({key:Be,colId:U.orderProperty,value:Oe[st]}),We&&De.push({key:Be,colId:U.swimlaneProperty,value:L})});try{await Promise.all(De.map(Be=>Le.commit(Be)))}catch(Be){return r.fire("card:reverted",{...Je,reason:Be&&Be.message?Be.message:"write failed"}),{moved:[],reverted:!0}}return r.fire("card:move",Je),await r.reload(),{moved:Ee,reverted:!1}}const Ct=be.map(({key:Le})=>({key:Le,row:{...Ce.get(Le)}}));if(be.forEach(({key:Le},De)=>{const Be=Ce.get(Le);E(Be,U.columnProperty,d),Oe&&U.orderProperty&&E(Be,U.orderProperty,Oe[De]),We&&E(Be,U.swimlaneProperty,L)}),e(),r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("card:move",Je),x(N.onCardMove)){let Le=N.onCardMove(Je);if(Le=Le instanceof Promise?await Le.then(De=>De,()=>!1):Le,Le===!1){for(const De of Ct)Ce.set(De.key,De.row);return e(),r.el&&x(r.paintSelection)&&r.paintSelection(),r.fire("card:reverted",{...Je}),{moved:[],reverted:!0}}}if(!it.replaying){const Le=Ke[0].from,De=Math.min(...Ke.map(st=>st.index)),Be=U.swimlaneProperty?Ke[0].lane:void 0;it.record({label:"move",undo:()=>r.move(Ee,Le,De,Be).then(st=>st.moved.length>0),redo:()=>r.move(Ee,d,$,L).then(st=>st.moved.length>0)}),ae()}return{moved:Ee,reverted:!1}};const ke=(n="undo")=>{if(Ge){const d=N.grid&&N.grid.history;if(!d||!x(d.peek))return null;const $=d.peek(n);return $?$.label:null}return it.peek(n)},ae=()=>{r.fire("history",{canUndo:r.canUndo(),canRedo:r.canRedo(),label:ke("undo")})};r.canUndo=()=>Ge?!!(N.grid&&N.grid.history&&x(N.grid.history.canUndo)&&N.grid.history.canUndo()):it.canUndo(),r.canRedo=()=>Ge?!!(N.grid&&N.grid.history&&x(N.grid.history.canRedo)&&N.grid.history.canRedo()):it.canRedo(),r.undo=async()=>{if(Ge){const d=N.grid&&N.grid.history,$=d&&x(d.undo)?d.undo():null;return ae(),$}const n=await it.undo();return n&&n.applied===!1&&j("kanban:undo:vetoed","an undo was refused by a before-event handler or the write-back path; the card and history are unchanged."),ae(),n},r.redo=async()=>{if(Ge){const d=N.grid&&N.grid.history,$=d&&x(d.redo)?d.redo():null;return ae(),$}const n=await it.redo();return n&&n.applied===!1&&j("kanban:redo:vetoed","a redo was refused by a before-event handler or the write-back path; the card and history are unchanged."),ae(),n};let Te=()=>{};const q=[],he=()=>{for(;q.length;)q.pop()()},Me=()=>{he();const n=N.grid;if(!n||!x(n.on))return;const d=($,L)=>{const W=n.on($,L);q.push(()=>{x(W)?W():x(n.off)&&n.off($,L)})};for(const $ of["cell:confirmed","cell:reverted","cell:conflict"])d($,()=>r.refresh());d("rows:changed",()=>r.refresh()),d("filter:changed",()=>{typeof queueMicrotask=="function"?queueMicrotask(()=>r.refresh()):r.refresh()}),d("history:changed",()=>ae()),d("history:applied",()=>r.refresh()),d("cell:reverted",$=>{if(!$||$.colId!==Ye(U.columnProperty))return;const L=r.card($.key);r.fire("card:reverted",{keys:[$.key],cards:L?[L]:[],from:L?[L.columnId]:[],to:L?L.columnId:null,index:null,orders:null,reverted:!0,reason:$.reason})}),d("cell:confirmed",$=>{if(!$||$.colId!==Ye(U.columnProperty))return;const L=r.card($.key);r.fire("card:confirmed",{keys:[$.key],cards:L?[L]:[],to:L?L.columnId:null})})};Ge&&Me(),r.rebind=n=>!Ge||!n||n===N.grid?r:(N.grid=n,U.grid=n,Me(),mt(),e()),r.rows={apply(n={}){if(Ge){j("kanban:apply-gridbound","rows.apply on a grid-bound board is ignored; route to the bound grid instead.");return}ut=!0;for(const d of n.add||[])Ce.set(U.key(d),d);for(const d of n.update||[]){const $=U.key(d);Ce.set($,X(Ce.get($),d))}for(const d of n.remove||[])Ce.delete(d);r.model=M(U,[...Ce.values()],se),r.el?At():x(r.paintSelection)&&r.paintSelection(),r.sla&&x(r.sla.evaluate)&&r.sla.evaluate()},forEach(n){for(const[d,$]of Ce)n($,d)},get count(){return Ce.size}},r.setRows=n=>Ge?(j("kanban:setRows-gridbound","setRows on a grid-bound board is ignored; the rows come from the bound grid."),r):(Array.isArray(n)&&(N.rows=n),ut=!1,mt(),e()),r.setColumns=n=>Array.isArray(n)?(U.columns=n,N.columns=n,U.doneColumns=k(N.doneColumns,n),e()):r,r.setColumnWidth=(n={})=>{if(!v(n))return r;"columnWidth"in n&&(U.columnWidth=F(n.columnWidth),N.columnWidth=U.columnWidth);const d=G({minColumnWidth:"minColumnWidth"in n?n.minColumnWidth:U.minColumnWidth,maxColumnWidth:"maxColumnWidth"in n?n.maxColumnWidth:U.maxColumnWidth});return U.minColumnWidth=d.minColumnWidth,U.maxColumnWidth=d.maxColumnWidth,N.minColumnWidth=d.minColumnWidth,N.maxColumnWidth=d.maxColumnWidth,r.columnWidth=U.columnWidth,r.minColumnWidth=U.minColumnWidth,r.maxColumnWidth=U.maxColumnWidth,A(r),r},r.setOrder=n=>(U.order=x(n)?n:null,N.order=U.order,e()),r.columns=()=>r.model.columns,r.column=n=>r.model.columns.find(d=>d.id===n),r.count=n=>r.column(n)?.count??0,r.points=n=>r.column(n)?.points??0,r.cards=()=>[...r.model.cardsByKey.values()],r.card=n=>r.model.cardsByKey.get(n);const Xe=new WeakMap;r.on=(n,d)=>(lt.includes(n)||j(`kanban:event:${n}`,`"${n}" is not a board event; expected one of ${lt.join(", ")}.`),n!=="column:control"||!x(d)?et.on(n,d):(Xe.has(d)||Xe.set(d,$=>d({...$,type:$.controlType})),et.on(n,Xe.get(d)))),r.off=(n,d)=>et.off(n,n==="column:control"&&Xe.get(d)||d),r.readonly=(n={})=>ct(n);let ot=null;if(r.destroy=()=>{dt.fail(new Error("lattice-grid: the board was destroyed before it became ready.")),ot&&(ot(),ot=null);const n=r.el;if(n){for(;n.firstChild;)n.removeChild(n.firstChild);n.classList.remove(_e),delete n.__latticeKanban}r._tokenScopeOff&&(r._tokenScopeOff(),r._tokenScopeOff=null),he(),Te(),it.clear(),r.flow&&x(r.flow.destroy)&&r.flow.destroy(),r.sla&&x(r.sla.destroy)&&r.sla.destroy(),r.model={columns:[],cardsByKey:new Map,unplaced:[]}},je){const n=N.transitionLog||(v(N.source)?N.source.transitionLog:null);r.flowAvailable=N.flow!==!1&&!!n,r.flowAvailable?r.flow=b(r,{...v(N.flow)?N.flow:{},history:n}):r.flow=null}else N.flow!==!1&&(r.flow=b(r,v(N.flow)?N.flow:{}));if(N.sla&&(r.sla=D(r,v(N.sla)?N.sla:{})),v(N.state)){const n=N.state;if(Array.isArray(n.collapsedColumns)&&(se.collapsedColumns=new Set(n.collapsedColumns)),Array.isArray(n.collapsedLanes)&&(se.collapsedLanes=new Set(n.collapsedLanes)),"columnOrder"in n&&(Array.isArray(n.columnOrder)||n.columnOrder===null)&&(se.columnOrder=n.columnOrder?[...n.columnOrder]:null),"laneOrder"in n&&(Array.isArray(n.laneOrder)||n.laneOrder===null)&&(se.laneOrder=n.laneOrder?[...n.laneOrder]:null),typeof n.quickFilter=="string"&&(se.quickFilter=n.quickFilter),"sprint"in n&&(se.sprint=n.sprint),"epic"in n&&(se.epic=n.epic),typeof n.blockedFilter=="boolean"&&(se.blockedFilter=n.blockedFilter),Array.isArray(n.selection))for(const d of n.selection)y.add(d)}return je?Promise.resolve(r.reload()).then(()=>{r.flow&&x(r.flow.seed)&&r.flow.seed(),r.sla&&x(r.sla.start)&&r.sla.start(),dt.settleNow()}):(r.refresh(),r.flow&&x(r.flow.seed)&&r.flow.seed(),r.sla&&x(r.sla.start)&&r.sla.start(),dt.settleSoon()),r.el&&(Te=ge({root:r.el,undo:()=>r.undo(),redo:()=>r.redo()})),rt&&(rt.__latticeKanban=r),r.el&&(ot=me(r.el,N).destroy),r}const Ot=kt});const Tt=jt("packages/modules/kanban/index.js"),Lt=Tt.createKanban;var Ft=Tt.default;export{Lt as createKanban,Ft as default};
523
526
 
524
527
  //# sourceMappingURL=kanban.esm.min.js.map