@toclocoinc/lattice-grid 1.111.4 → 1.111.5
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.
- package/CHANGELOG.md +8 -0
- package/README.md +1 -1
- package/angular/package.json +1 -1
- package/docs/API.html +27 -5
- package/docs/api/adapters.html +1 -1
- package/docs/api/ai.html +1 -1
- package/docs/api/alarms.html +1 -1
- package/docs/api/calendar.html +1 -1
- package/docs/api/charts.html +1 -1
- package/docs/api/dashboard.html +1 -1
- package/docs/api/data-router.html +1 -1
- package/docs/api/dataview.html +1 -1
- package/docs/api/deckgl.html +1 -1
- package/docs/api/designer.html +1 -1
- package/docs/api/form.html +1 -1
- package/docs/api/gantt.html +1 -1
- package/docs/api/geometry.html +1 -1
- package/docs/api/grid.html +2 -2
- package/docs/api/index.html +2 -2
- package/docs/api/kanban.html +25 -2
- package/docs/api/kpi.html +1 -1
- package/docs/api/layout.html +1 -1
- package/docs/api/leaflet.html +1 -1
- package/docs/api/list.html +1 -1
- package/docs/api/listview.html +1 -1
- package/docs/api/mapview.html +1 -1
- package/docs/api/mock-socket.html +1 -1
- package/docs/api/presets.html +1 -1
- package/docs/api/scheduler.html +1 -1
- package/docs/api/shell.html +1 -1
- package/docs/api/tabs.html +1 -1
- package/docs/api/tree.html +1 -1
- package/docs/api/types.html +1 -1
- package/docs/api-detail.html +31 -5
- package/docs/warnings.json +12 -2
- package/lattice-grid.d.ts +1 -1
- package/lattice-grid.esm.min.js +2 -2
- package/lattice-grid.min.cjs +2 -2
- package/lattice-grid.min.js +2 -2
- package/locales/all.d.ts +1 -1
- package/locales/all.esm.min.js +1 -1
- package/locales/all.min.cjs +1 -1
- package/locales/all.min.js +1 -1
- package/locales/ar.d.ts +1 -1
- package/locales/ar.esm.min.js +1 -1
- package/locales/ar.min.cjs +1 -1
- package/locales/ar.min.js +1 -1
- package/locales/cs-CZ.d.ts +1 -1
- package/locales/cs-CZ.esm.min.js +1 -1
- package/locales/cs-CZ.min.cjs +1 -1
- package/locales/cs-CZ.min.js +1 -1
- package/locales/da-DK.d.ts +1 -1
- package/locales/da-DK.esm.min.js +1 -1
- package/locales/da-DK.min.cjs +1 -1
- package/locales/da-DK.min.js +1 -1
- package/locales/de-DE.d.ts +1 -1
- package/locales/de-DE.esm.min.js +1 -1
- package/locales/de-DE.min.cjs +1 -1
- package/locales/de-DE.min.js +1 -1
- package/locales/el-GR.d.ts +1 -1
- package/locales/el-GR.esm.min.js +1 -1
- package/locales/el-GR.min.cjs +1 -1
- package/locales/el-GR.min.js +1 -1
- package/locales/en-US.d.ts +1 -1
- package/locales/en-US.esm.min.js +1 -1
- package/locales/en-US.min.cjs +1 -1
- package/locales/en-US.min.js +1 -1
- package/locales/es-ES.d.ts +1 -1
- package/locales/es-ES.esm.min.js +1 -1
- package/locales/es-ES.min.cjs +1 -1
- package/locales/es-ES.min.js +1 -1
- package/locales/fi-FI.d.ts +1 -1
- package/locales/fi-FI.esm.min.js +1 -1
- package/locales/fi-FI.min.cjs +1 -1
- package/locales/fi-FI.min.js +1 -1
- package/locales/fr-CA.d.ts +1 -1
- package/locales/fr-CA.esm.min.js +1 -1
- package/locales/fr-CA.min.cjs +1 -1
- package/locales/fr-CA.min.js +1 -1
- package/locales/fr-FR.d.ts +1 -1
- package/locales/fr-FR.esm.min.js +1 -1
- package/locales/fr-FR.min.cjs +1 -1
- package/locales/fr-FR.min.js +1 -1
- package/locales/hu-HU.d.ts +1 -1
- package/locales/hu-HU.esm.min.js +1 -1
- package/locales/hu-HU.min.cjs +1 -1
- package/locales/hu-HU.min.js +1 -1
- package/locales/it-IT.d.ts +1 -1
- package/locales/it-IT.esm.min.js +1 -1
- package/locales/it-IT.min.cjs +1 -1
- package/locales/it-IT.min.js +1 -1
- package/locales/ja-JP.d.ts +1 -1
- package/locales/ja-JP.esm.min.js +1 -1
- package/locales/ja-JP.min.cjs +1 -1
- package/locales/ja-JP.min.js +1 -1
- package/locales/nb-NO.d.ts +1 -1
- package/locales/nb-NO.esm.min.js +1 -1
- package/locales/nb-NO.min.cjs +1 -1
- package/locales/nb-NO.min.js +1 -1
- package/locales/nl-NL.d.ts +1 -1
- package/locales/nl-NL.esm.min.js +1 -1
- package/locales/nl-NL.min.cjs +1 -1
- package/locales/nl-NL.min.js +1 -1
- package/locales/pl-PL.d.ts +1 -1
- package/locales/pl-PL.esm.min.js +1 -1
- package/locales/pl-PL.min.cjs +1 -1
- package/locales/pl-PL.min.js +1 -1
- package/locales/pt-BR.d.ts +1 -1
- package/locales/pt-BR.esm.min.js +1 -1
- package/locales/pt-BR.min.cjs +1 -1
- package/locales/pt-BR.min.js +1 -1
- package/locales/ro-RO.d.ts +1 -1
- package/locales/ro-RO.esm.min.js +1 -1
- package/locales/ro-RO.min.cjs +1 -1
- package/locales/ro-RO.min.js +1 -1
- package/locales/sv-SE.d.ts +1 -1
- package/locales/sv-SE.esm.min.js +1 -1
- package/locales/sv-SE.min.cjs +1 -1
- package/locales/sv-SE.min.js +1 -1
- package/locales/uk-UA.d.ts +1 -1
- package/locales/uk-UA.esm.min.js +1 -1
- package/locales/uk-UA.min.cjs +1 -1
- package/locales/uk-UA.min.js +1 -1
- package/modules/ai.d.ts +1 -1
- package/modules/ai.esm.min.js +1 -1
- package/modules/ai.min.cjs +1 -1
- package/modules/ai.min.js +1 -1
- package/modules/alarms.d.ts +1 -1
- package/modules/alarms.esm.min.js +1 -1
- package/modules/alarms.min.cjs +1 -1
- package/modules/alarms.min.js +1 -1
- package/modules/angular.d.ts +1 -1
- package/modules/angular.esm.min.js +1 -1
- package/modules/angular.min.cjs +1 -1
- package/modules/angular.min.js +1 -1
- package/modules/calendar.d.ts +1 -1
- package/modules/calendar.esm.min.js +1 -1
- package/modules/calendar.min.cjs +1 -1
- package/modules/calendar.min.js +1 -1
- package/modules/chart-alluvial.d.ts +1 -1
- package/modules/chart-alluvial.esm.min.js +1 -1
- package/modules/chart-alluvial.min.cjs +1 -1
- package/modules/chart-alluvial.min.js +1 -1
- package/modules/chart-arc.d.ts +1 -1
- package/modules/chart-arc.esm.min.js +1 -1
- package/modules/chart-arc.min.cjs +1 -1
- package/modules/chart-arc.min.js +1 -1
- package/modules/chart-barrace.d.ts +1 -1
- package/modules/chart-barrace.esm.min.js +1 -1
- package/modules/chart-barrace.min.cjs +1 -1
- package/modules/chart-barrace.min.js +1 -1
- package/modules/chart-bubblemap.d.ts +1 -1
- package/modules/chart-bubblemap.esm.min.js +1 -1
- package/modules/chart-bubblemap.min.cjs +1 -1
- package/modules/chart-bubblemap.min.js +1 -1
- package/modules/chart-bump.d.ts +1 -1
- package/modules/chart-bump.esm.min.js +1 -1
- package/modules/chart-bump.min.cjs +1 -1
- package/modules/chart-bump.min.js +1 -1
- package/modules/chart-calendar.d.ts +1 -1
- package/modules/chart-calendar.esm.min.js +1 -1
- package/modules/chart-calendar.min.cjs +1 -1
- package/modules/chart-calendar.min.js +1 -1
- package/modules/chart-choropleth.d.ts +1 -1
- package/modules/chart-choropleth.esm.min.js +1 -1
- package/modules/chart-choropleth.min.cjs +1 -1
- package/modules/chart-choropleth.min.js +1 -1
- package/modules/chart-decomposition.d.ts +1 -1
- package/modules/chart-decomposition.esm.min.js +1 -1
- package/modules/chart-decomposition.min.cjs +1 -1
- package/modules/chart-decomposition.min.js +1 -1
- package/modules/chart-diverging.d.ts +1 -1
- package/modules/chart-diverging.esm.min.js +1 -1
- package/modules/chart-diverging.min.cjs +1 -1
- package/modules/chart-diverging.min.js +1 -1
- package/modules/chart-dumbbell.d.ts +1 -1
- package/modules/chart-dumbbell.esm.min.js +1 -1
- package/modules/chart-dumbbell.min.cjs +1 -1
- package/modules/chart-dumbbell.min.js +1 -1
- package/modules/chart-fan.d.ts +1 -1
- package/modules/chart-fan.esm.min.js +1 -1
- package/modules/chart-fan.min.cjs +1 -1
- package/modules/chart-fan.min.js +1 -1
- package/modules/chart-forcetree.d.ts +1 -1
- package/modules/chart-forcetree.esm.min.js +1 -1
- package/modules/chart-forcetree.min.cjs +1 -1
- package/modules/chart-forcetree.min.js +1 -1
- package/modules/chart-hexbin.d.ts +1 -1
- package/modules/chart-hexbin.esm.min.js +1 -1
- package/modules/chart-hexbin.min.cjs +1 -1
- package/modules/chart-hexbin.min.js +1 -1
- package/modules/chart-hexmap.d.ts +1 -1
- package/modules/chart-hexmap.esm.min.js +1 -1
- package/modules/chart-hexmap.min.cjs +1 -1
- package/modules/chart-hexmap.min.js +1 -1
- package/modules/chart-icicle.d.ts +1 -1
- package/modules/chart-icicle.esm.min.js +1 -1
- package/modules/chart-icicle.min.cjs +1 -1
- package/modules/chart-icicle.min.js +1 -1
- package/modules/chart-markermap.d.ts +1 -1
- package/modules/chart-markermap.esm.min.js +1 -1
- package/modules/chart-markermap.min.cjs +1 -1
- package/modules/chart-markermap.min.js +1 -1
- package/modules/chart-motion.d.ts +1 -1
- package/modules/chart-motion.esm.min.js +1 -1
- package/modules/chart-motion.min.cjs +1 -1
- package/modules/chart-motion.min.js +1 -1
- package/modules/chart-pack.d.ts +1 -1
- package/modules/chart-pack.esm.min.js +1 -1
- package/modules/chart-pack.min.cjs +1 -1
- package/modules/chart-pack.min.js +1 -1
- package/modules/chart-parallel.d.ts +1 -1
- package/modules/chart-parallel.esm.min.js +1 -1
- package/modules/chart-parallel.min.cjs +1 -1
- package/modules/chart-parallel.min.js +1 -1
- package/modules/chart-pictorial.d.ts +1 -1
- package/modules/chart-pictorial.esm.min.js +1 -1
- package/modules/chart-pictorial.min.cjs +1 -1
- package/modules/chart-pictorial.min.js +1 -1
- package/modules/chart-polararea.d.ts +1 -1
- package/modules/chart-polararea.esm.min.js +1 -1
- package/modules/chart-polararea.min.cjs +1 -1
- package/modules/chart-polararea.min.js +1 -1
- package/modules/chart-polarscatter.d.ts +1 -1
- package/modules/chart-polarscatter.esm.min.js +1 -1
- package/modules/chart-polarscatter.min.cjs +1 -1
- package/modules/chart-polarscatter.min.js +1 -1
- package/modules/chart-pyramid.d.ts +1 -1
- package/modules/chart-pyramid.esm.min.js +1 -1
- package/modules/chart-pyramid.min.cjs +1 -1
- package/modules/chart-pyramid.min.js +1 -1
- package/modules/chart-radialbar.d.ts +1 -1
- package/modules/chart-radialbar.esm.min.js +1 -1
- package/modules/chart-radialbar.min.cjs +1 -1
- package/modules/chart-radialbar.min.js +1 -1
- package/modules/chart-ridgeline.d.ts +1 -1
- package/modules/chart-ridgeline.esm.min.js +1 -1
- package/modules/chart-ridgeline.min.cjs +1 -1
- package/modules/chart-ridgeline.min.js +1 -1
- package/modules/chart-roc.d.ts +1 -1
- package/modules/chart-roc.esm.min.js +1 -1
- package/modules/chart-roc.min.cjs +1 -1
- package/modules/chart-roc.min.js +1 -1
- package/modules/chart-scatter3d.d.ts +1 -1
- package/modules/chart-scatter3d.esm.min.js +1 -1
- package/modules/chart-scatter3d.min.cjs +1 -1
- package/modules/chart-scatter3d.min.js +1 -1
- package/modules/chart-serpentine.d.ts +1 -1
- package/modules/chart-serpentine.esm.min.js +1 -1
- package/modules/chart-serpentine.min.cjs +1 -1
- package/modules/chart-serpentine.min.js +1 -1
- package/modules/chart-slope.d.ts +1 -1
- package/modules/chart-slope.esm.min.js +1 -1
- package/modules/chart-slope.min.cjs +1 -1
- package/modules/chart-slope.min.js +1 -1
- package/modules/chart-spiral.d.ts +1 -1
- package/modules/chart-spiral.esm.min.js +1 -1
- package/modules/chart-spiral.min.cjs +1 -1
- package/modules/chart-spiral.min.js +1 -1
- package/modules/chart-splom.d.ts +1 -1
- package/modules/chart-splom.esm.min.js +1 -1
- package/modules/chart-splom.min.cjs +1 -1
- package/modules/chart-splom.min.js +1 -1
- package/modules/chart-tree.d.ts +1 -1
- package/modules/chart-tree.esm.min.js +1 -1
- package/modules/chart-tree.min.cjs +1 -1
- package/modules/chart-tree.min.js +1 -1
- package/modules/chart-venn.d.ts +1 -1
- package/modules/chart-venn.esm.min.js +1 -1
- package/modules/chart-venn.min.cjs +1 -1
- package/modules/chart-venn.min.js +1 -1
- package/modules/chart-voronoi.d.ts +1 -1
- package/modules/chart-voronoi.esm.min.js +1 -1
- package/modules/chart-voronoi.min.cjs +1 -1
- package/modules/chart-voronoi.min.js +1 -1
- package/modules/chart-waffle.d.ts +1 -1
- package/modules/chart-waffle.esm.min.js +1 -1
- package/modules/chart-waffle.min.cjs +1 -1
- package/modules/chart-waffle.min.js +1 -1
- package/modules/chart-wordcloud.d.ts +1 -1
- package/modules/chart-wordcloud.esm.min.js +1 -1
- package/modules/chart-wordcloud.min.cjs +1 -1
- package/modules/chart-wordcloud.min.js +1 -1
- package/modules/charts.d.ts +1 -1
- package/modules/charts.esm.min.js +1 -1
- package/modules/charts.min.cjs +1 -1
- package/modules/charts.min.js +1 -1
- package/modules/contextmenu.d.ts +1 -1
- package/modules/contextmenu.esm.min.js +1 -1
- package/modules/contextmenu.min.cjs +1 -1
- package/modules/contextmenu.min.js +1 -1
- package/modules/dashboard.d.ts +1 -1
- package/modules/dashboard.esm.min.js +1 -1
- package/modules/dashboard.min.cjs +1 -1
- package/modules/dashboard.min.js +1 -1
- package/modules/data-router.d.ts +1 -1
- package/modules/data-router.esm.min.js +1 -1
- package/modules/data-router.min.cjs +1 -1
- package/modules/data-router.min.js +1 -1
- package/modules/dataview.d.ts +1 -1
- package/modules/dataview.esm.min.js +1 -1
- package/modules/dataview.min.cjs +1 -1
- package/modules/dataview.min.js +1 -1
- package/modules/deckgl.d.ts +1 -1
- package/modules/deckgl.esm.min.js +1 -1
- package/modules/deckgl.min.cjs +1 -1
- package/modules/deckgl.min.js +1 -1
- package/modules/designer.d.ts +1 -1
- package/modules/designer.esm.min.js +1 -1
- package/modules/designer.min.cjs +1 -1
- package/modules/designer.min.js +1 -1
- package/modules/devtools.d.ts +1 -1
- package/modules/devtools.esm.min.js +1 -1
- package/modules/devtools.min.cjs +1 -1
- package/modules/devtools.min.js +1 -1
- package/modules/dhtmlx-compat.d.ts +1 -1
- package/modules/dhtmlx-compat.esm.min.js +1 -1
- package/modules/dhtmlx-compat.min.cjs +1 -1
- package/modules/dhtmlx-compat.min.js +1 -1
- package/modules/form.d.ts +1 -1
- package/modules/form.esm.min.js +1 -1
- package/modules/form.min.cjs +1 -1
- package/modules/form.min.js +1 -1
- package/modules/gantt.d.ts +1 -1
- package/modules/gantt.esm.min.js +1 -1
- package/modules/gantt.min.cjs +1 -1
- package/modules/gantt.min.js +1 -1
- package/modules/geo-europe-nuts.d.ts +1 -1
- package/modules/geo-europe-nuts.esm.min.js +1 -1
- package/modules/geo-europe-nuts.min.cjs +1 -1
- package/modules/geo-europe-nuts.min.js +1 -1
- package/modules/geo-uk.d.ts +1 -1
- package/modules/geo-uk.esm.min.js +1 -1
- package/modules/geo-uk.min.cjs +1 -1
- package/modules/geo-uk.min.js +1 -1
- package/modules/geo-us-states.d.ts +1 -1
- package/modules/geo-us-states.esm.min.js +1 -1
- package/modules/geo-us-states.min.cjs +1 -1
- package/modules/geo-us-states.min.js +1 -1
- package/modules/geo-world-110m.d.ts +1 -1
- package/modules/geo-world-110m.esm.min.js +1 -1
- package/modules/geo-world-110m.min.cjs +1 -1
- package/modules/geo-world-110m.min.js +1 -1
- package/modules/geo-world-50m.d.ts +1 -1
- package/modules/geo-world-50m.esm.min.js +1 -1
- package/modules/geo-world-50m.min.cjs +1 -1
- package/modules/geo-world-50m.min.js +1 -1
- package/modules/geometry.d.ts +1 -1
- package/modules/geometry.esm.min.js +1 -1
- package/modules/geometry.min.cjs +1 -1
- package/modules/geometry.min.js +1 -1
- package/modules/htmx.d.ts +1 -1
- package/modules/htmx.esm.min.js +2 -2
- package/modules/htmx.min.cjs +2 -2
- package/modules/htmx.min.js +2 -2
- package/modules/htmx.shared.esm.min.js +1 -1
- package/modules/htmx.shared.min.cjs +1 -1
- package/modules/htmx.shared.min.js +1 -1
- package/modules/kanban.d.ts +29 -2
- package/modules/kanban.esm.min.js +16 -14
- package/modules/kanban.esm.min.js.map +2 -2
- package/modules/kanban.min.cjs +15 -13
- package/modules/kanban.min.js +15 -13
- package/modules/kanban.min.js.map +2 -2
- package/modules/kpi.d.ts +1 -1
- package/modules/kpi.esm.min.js +1 -1
- package/modules/kpi.min.cjs +1 -1
- package/modules/kpi.min.js +1 -1
- package/modules/layout.d.ts +1 -1
- package/modules/layout.esm.min.js +1 -1
- package/modules/layout.min.cjs +1 -1
- package/modules/layout.min.js +1 -1
- package/modules/leaflet.d.ts +1 -1
- package/modules/leaflet.esm.min.js +1 -1
- package/modules/leaflet.min.cjs +1 -1
- package/modules/leaflet.min.js +1 -1
- package/modules/list.d.ts +1 -1
- package/modules/list.esm.min.js +1 -1
- package/modules/list.min.cjs +1 -1
- package/modules/list.min.js +1 -1
- package/modules/listview.d.ts +1 -1
- package/modules/listview.esm.min.js +1 -1
- package/modules/listview.min.cjs +1 -1
- package/modules/listview.min.js +1 -1
- package/modules/mapview.d.ts +1 -1
- package/modules/mapview.esm.min.js +1 -1
- package/modules/mapview.min.cjs +1 -1
- package/modules/mapview.min.js +1 -1
- package/modules/mock-socket.d.ts +1 -1
- package/modules/mock-socket.esm.min.js +1 -1
- package/modules/mock-socket.min.cjs +1 -1
- package/modules/mock-socket.min.js +1 -1
- package/modules/presets.d.ts +1 -1
- package/modules/presets.esm.min.js +1 -1
- package/modules/presets.min.cjs +1 -1
- package/modules/presets.min.js +1 -1
- package/modules/react.d.ts +1 -1
- package/modules/react.esm.min.js +1 -1
- package/modules/react.min.cjs +1 -1
- package/modules/react.min.js +1 -1
- package/modules/recordeditor.d.ts +1 -1
- package/modules/recordeditor.esm.min.js +1 -1
- package/modules/recordeditor.min.cjs +1 -1
- package/modules/recordeditor.min.js +1 -1
- package/modules/scheduler.d.ts +1 -1
- package/modules/scheduler.esm.min.js +1 -1
- package/modules/scheduler.min.cjs +1 -1
- package/modules/scheduler.min.js +1 -1
- package/modules/shell.d.ts +1 -1
- package/modules/shell.esm.min.js +1 -1
- package/modules/shell.min.cjs +1 -1
- package/modules/shell.min.js +1 -1
- package/modules/sidebar.d.ts +1 -1
- package/modules/sidebar.esm.min.js +1 -1
- package/modules/sidebar.min.cjs +1 -1
- package/modules/sidebar.min.js +1 -1
- package/modules/svelte.d.ts +1 -1
- package/modules/svelte.esm.min.js +1 -1
- package/modules/svelte.min.cjs +1 -1
- package/modules/svelte.min.js +1 -1
- package/modules/tabs.d.ts +1 -1
- package/modules/tabs.esm.min.js +1 -1
- package/modules/tabs.min.cjs +1 -1
- package/modules/tabs.min.js +1 -1
- package/modules/toolbar.d.ts +1 -1
- package/modules/toolbar.esm.min.js +1 -1
- package/modules/toolbar.min.cjs +1 -1
- package/modules/toolbar.min.js +1 -1
- package/modules/tree.d.ts +1 -1
- package/modules/tree.esm.min.js +1 -1
- package/modules/tree.min.cjs +1 -1
- package/modules/tree.min.js +1 -1
- package/modules/vue.d.ts +1 -1
- package/modules/vue.esm.min.js +1 -1
- package/modules/vue.min.cjs +1 -1
- package/modules/vue.min.js +1 -1
- package/modules/webcomponent.d.ts +1 -1
- package/modules/webcomponent.esm.min.js +2 -2
- package/modules/webcomponent.min.cjs +2 -2
- package/modules/webcomponent.min.js +2 -2
- package/package.json +1 -1
package/modules/kanban.min.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.111.
|
|
2
|
+
* Lattice Grid 1.111.5, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(At){"use strict";var Ot=!0,vt=Object.create(null),_t=Object.create(null);function We(g,Z){vt[g]=Z}function $t(g){var Z=_t[g];if(Z)return Z;var o=Object.create(null);_t[g]=o;var k=vt[g];if(!k)throw new Error("[lattice] missing module: "+g);return k(o,$t),o}We("packages/core/src/internal/predicates.js",function(g,Z){"use strict";Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return ne}});function o(x){return x!==null&&typeof x=="object"&&!Array.isArray(x)}function k(x){return typeof x=="function"}function T(x){return x==null}function ee(x){return x==null||x===""}function ne(x){return typeof x!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(x))?!0:!!(x.prototype&&Object.getOwnPropertyNames(x.prototype).length>1)}}),We("packages/core/src/internal/warn.js",function(g,Z){"use strict";Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return C}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return ie}});const o=new Set,k=2e3;function T(W){if(o.add(W),o.size>k){const O=o.values().next().value;O!==void 0&&o.delete(O)}}const ee=[],ne=500;function x(W,O,I){ee.push({key:W,level:O,message:I.map(N=>typeof N=="string"?N:s(N)).join(" "),at:Date.now()}),ee.length>ne&&ee.shift()}function s(W){if(W instanceof Error)return W.message;try{return JSON.stringify(W)}catch{return String(W)}}function S(){return ee.map(W=>({...W}))}function q(W){if(W.length===0||typeof W[0]!="string")return W;const O=W[0].replace(/^\[lattice\]\s*/,"");return O===W[0]?W:[O,...W.slice(1)]}function C(W,...O){if(o.has(W))return;T(W);const I=q(O);x(W,"warn",I),console.warn("[lattice]",...I)}function M(W,...O){if(o.has(W))return;T(W);const I=q(O);x(W,"info",I),console.info("[lattice]",...I)}function K(){o.clear(),ee.length=0}function H(W,O){const I=new Error(`[lattice] ${W}`);throw O!==void 0&&(I.cause=O),I}function G(W,O){W||H(O)}const ie=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})()}),We("packages/core/src/internal/paths.js",function(g,Z){"use strict";Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return x}});const o=new Map;function k(s){let S=o.get(s);if(S)return S;if(!s.includes("."))S=q=>q?.[s];else{const q=s.split("."),C=q.length;S=M=>{let K=M;for(let H=0;H<C;H++){if(K==null)return;K=K[q[H]]}return K}}return o.set(s,S),S}const T=new Map;function ee(s){let S=T.get(s);if(S)return S;if(!s.includes("."))S=(q,C)=>{q!=null&&(q[s]=C)};else{const q=s.split("."),C=q.length-1;S=(M,K)=>{let H=M;for(let G=0;G<C;G++){if(H==null)return;const ie=q[G];H[ie]==null&&(H[ie]={}),H=H[ie]}H!=null&&(H[q[C]]=K)}}return T.set(s,S),S}function ne(s,S){return k(S)(s)}function x(s,S,q){ee(S)(s,q)}}),We("packages/core/src/internal/uid.js",function(g,Z){"use strict";Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return k}});let o=0;function k(T="l"){return`${T}${(++o).toString(36)}`}}),We("packages/core/src/internal/merge.js",function(g,Z){"use strict";Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return s}});const k=Z("packages/core/src/internal/predicates.js").isObject;function T(S,q,C){if(S!==void 0)return S===!0?{enabled:!0,...C}:S===!1?{enabled:!1}:k(S)?S:{[q]:S,enabled:!0}}function ee(S){return S==null?[]:Array.isArray(S)?S:[S]}const ne=Object.freeze(new Set(["__proto__","constructor","prototype"]));function x(S,q){if(!k(S))return k(q)?{...q}:q;if(!k(q))return q===void 0?S:q;const C={...S};for(const M of Object.keys(q)){if(ne.has(M))continue;const K=q[M];K!==void 0&&(C[M]=k(K)&&k(C[M])?x(C[M],K):K)}return C}function s(S,q){if(!k(S)||!k(q)||S===q)return q;const C=Object.create(Object.getPrototypeOf(S));return Object.assign(C,S,q),C}}),We("packages/core/src/internal/ready.js",function(g,Z){"use strict";Object.defineProperty(g,"createReadySignal",{enumerable:!0,get:function(){return o}});function o(){let k=!1,T,ee;const ne=new Promise((x,s)=>{T=x,ee=s});return ne.catch(()=>{}),{promise:ne,settleSoon(){k||queueMicrotask(()=>{k||(k=!0,T())})},settleAfterFrames(){if(k)return;const x=typeof requestAnimationFrame=="function"?requestAnimationFrame:null;if(!x){this.settleSoon();return}let s=!1;const S=()=>{s||(s=!0,this.settleNow())};x(()=>x(S)),setTimeout(S,250)},settleNow(){k||(k=!0,T())},fail(x){k||(k=!0,ee(x))}}}}),We("packages/core/src/internal/text.js",function(g,Z){"use strict";Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ee}});function o(ne){return ne?(ne.includes(".")?ne.slice(ne.lastIndexOf(".")+1):ne).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(/^./,s=>s.toUpperCase()):""}const k={"&":"&","<":"<",">":">",'"':""","'":"'"};function T(ne){const x=ne==null?"":String(ne);return/[&<>"']/.test(x)?x.replace(/[&<>"']/g,s=>k[s]):x}function ee(ne){return String(ne).replace(/\w\S*/g,x=>x[0].toUpperCase()+x.slice(1).toLowerCase())}}),We("packages/modules/kanban/card-parts.js",function(g,Z){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"initials",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"avatarColor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"safeAvatarUrl",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"avatarChip",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"assignees",{enumerable:!0,get:function(){return C}}),Object.defineProperty(g,"dueTimestamp",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"dueState",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"progressPercent",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"checklist",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"TONES",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(g,"toneOf",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"formatDuePattern",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"dueText",{enumerable:!0,get:function(){return N}});const o="lat-kanban",k=["#4a90d9","#e2513b","#2c9c6a","#8b5cf6","#d97706","#0891b2","#be185d"],T=/^\s*(https?:|blob:|data:image\/)/i,ee=/^\s*[a-z][a-z0-9+.-]*:/i;function ne(b){const a=String(b).trim().split(/\s+/).filter(Boolean);return a.length?a.length===1?a[0].slice(0,2).toUpperCase():(a[0][0]+a[a.length-1][0]).toUpperCase():"?"}function x(b){let a=0;for(let m=0;m<b.length;m+=1)a=a*31+b.charCodeAt(m)>>>0;return k[a%k.length]}function s(b){if(b==null)return"";const a=String(b).trim();return a?ee.test(a)?T.test(a)?a:"":a:""}function S(b,{name:a,avatar:m,title:l=null}){const c=String(a??""),d=b.createElement("span");d.setAttribute("class",`${o}__avatar`),d.style.background=x(c),l!=null&&d.setAttribute("title",String(l));const $=s(m);if($){const D=b.createElement("img");D.setAttribute("class",`${o}__avatar-img`),D.setAttribute("alt",c),D.setAttribute("loading","lazy"),D.setAttribute("decoding","async"),D.setAttribute("src",$),D.addEventListener("error",()=>{D.parentNode===d&&d.removeChild(D)}),d.appendChild(D)}const A=b.createElement("span");return A.setAttribute("class",`${o}__avatar-glyph`),A.textContent=ne(c),d.appendChild(A),d}function q(b){if(b==null)return null;if(typeof b=="object"){const m=String(b.name??b.label??b.id??"").trim();return m?{name:m,avatar:b.avatar??null}:null}const a=String(b).trim();return a?{name:a,avatar:null}:null}function C(b){if(b==null)return[];const a=Array.isArray(b)?b:String(b).split(",").map(l=>l.trim()).filter(Boolean),m=[];for(const l of a){const c=q(l);c&&m.push(c)}return m}function M(b){if(b==null||b==="")return null;if(b instanceof Date){const m=b.getTime();return Number.isFinite(m)?m:null}if(typeof b=="number")return Number.isFinite(b)?b:null;const a=Date.parse(String(b).trim());return Number.isFinite(a)?a:null}function K(b,a,m=0){if(b===null||!Number.isFinite(b))return null;if(b<a)return"overdue";const l=Number(m)||0;return l>0&&b-a<=l*864e5?"soon":null}function H(b){if(b==null||b==="")return null;const a=Number(String(b).replace("%","").trim());if(!Number.isFinite(a))return null;const m=a<=1&&a>=0?a*100:a;return Math.max(0,Math.min(100,Math.round(m)))}function G(b,a){let m=b,l=a;a===void 0&&b!==null&&b!==void 0&&typeof b=="object"&&(m=b.done,l=b.total);const c=Number(m),d=Number(l);return!Number.isFinite(c)&&!Number.isFinite(d)?null:{done:Number.isFinite(c)?c:0,total:Number.isFinite(d)?d:0}}const ie=Object.freeze(["accent","info","success","warning","danger","neutral"]);function W(b,a,m){if(!b)return null;let l;return typeof b=="function"?l=b(m,a):typeof b=="object"&&Object.prototype.hasOwnProperty.call(b,a)&&(l=b[a]),typeof l=="string"&&ie.includes(l)?l:null}const O=b=>String(b).padStart(2,"0");function I(b,a,m){const l=new Date(a),c=$=>new Intl.DateTimeFormat(m,$).format(l),d={yyyy:()=>String(l.getFullYear()),yy:()=>O(l.getFullYear()%100),MMMM:()=>c({month:"long"}),MMM:()=>c({month:"short"}),MM:()=>O(l.getMonth()+1),M:()=>String(l.getMonth()+1),dd:()=>O(l.getDate()),d:()=>String(l.getDate()),EEEE:()=>c({weekday:"long"}),EEE:()=>c({weekday:"short"})};return String(b).replace(/'([^']*)'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE/g,($,A)=>A!==void 0?A:d[$]())}function N(b,a,m,l,c){if(a===null||!b)return m;let d;if(typeof b=="function")d=b(new Date(a),l);else if(typeof b=="string")d=I(b,a,c);else return m;return d==null||d===""?m:String(d)}}),We("packages/modules/kanban/model.js",function(g,Z){"use strict";Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"keyFn",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"fieldText",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"rawField",{enumerable:!0,get:function(){return l}}),Object.defineProperty(g,"cardSpecs",{enumerable:!0,get:function(){return c}}),Object.defineProperty(g,"deriveColumns",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"columnIdOf",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"buildCard",{enumerable:!0,get:function(){return je}}),Object.defineProperty(g,"groupRows",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"passesFilter",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"BACKLOG",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(g,"DEFAULT_FILTER",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(g,"rollup",{enumerable:!0,get:function(){return re}}),Object.defineProperty(g,"laneIdOf",{enumerable:!0,get:function(){return Ke}}),Object.defineProperty(g,"computeOrders",{enumerable:!0,get:function(){return Qe}}),Object.defineProperty(g,"windowRange",{enumerable:!0,get:function(){return Je}}),Object.defineProperty(g,"deriveDoneColumns",{enumerable:!0,get:function(){return Le}}),Object.defineProperty(g,"resolveColumnWidth",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(g,"resolveContext",{enumerable:!0,get:function(){return st}});const k=Z("packages/core/src/internal/warn.js").warnOnce,ee=Z("packages/core/src/internal/paths.js").getPath,ne=Z("packages/core/src/internal/predicates.js"),x=ne.isFunction,s=ne.isNil,S=ne.isObject,C=Z("packages/core/src/internal/text.js").humanise,M=Z("packages/modules/kanban/card-parts.js"),K=M.assignees,H=M.checklist,G=M.dueState,ie=M.dueText,W=M.dueTimestamp,O=M.progressPercent,I=M.toneOf;function N(y){return x(y)?y:typeof y=="string"?w=>ee(w,y):()=>{}}function b(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function a(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(x(y))return R=>{const te=y(R);if(typeof te=="string"||typeof te=="number"&&Number.isFinite(te))return te;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${b(te)}.`)};const w=typeof y=="string"?y:"id";return R=>ee(R,w)}function m(y,w,R,te){if(s(te))return"";if(y.grid&&typeof te=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(te)){const ue=y.grid.rows.text(R,te);if(!s(ue))return String(ue)}}catch{}const fe=N(te)(w);return s(fe)?"":String(fe)}function l(y,w,R,te){if(!s(te)){if(y.grid&&typeof te=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(te))return y.grid.rows.value(R,te)}catch{}return N(te)(w)}}function c(y){const w={};for(const[R,te]of Object.entries(y))te&&typeof te=="object"&&!x(te)?w[R]={...te,edit:!!te.edit,editor:te.editor}:w[R]={field:te,edit:!1,editor:void 0};return w}function d(y,w){const R=Array.isArray(y.columns)?y.columns.map($):[],te=new Map(R.map(pe=>[pe.id,pe])),fe=[],ue=N(y.columnProperty);for(const pe of w){const me=ue(pe),le=A(me);le!==null&&!te.has(le)&&!fe.includes(le)&&fe.push(le)}let se;if(R.length?se=[...R.map(pe=>pe.id),...fe.filter(pe=>!te.has(pe))]:se=fe,Array.isArray(y.columnOrder)&&y.columnOrder.length){const pe=y.columnOrder.filter(me=>se.includes(me));se=[...pe,...se.filter(me=>!pe.includes(me))]}return se.map(pe=>{const me=te.get(pe)||{id:pe,title:C(String(pe))};return{id:pe,title:s(me.title)?C(String(pe)):String(me.title),color:me.color??null,wipLimit:Number.isFinite(me.wipLimit)?me.wipLimit:null,collapsed:!!me.collapsed}})}function $(y){return typeof y=="string"?{id:y}:S(y)&&!s(y.id)?y:{id:String(y)}}function A(y){return s(y)?null:String(y)}function D(y){return s(y)?!1:typeof y=="string"?y.trim()!=="":typeof y=="number"?y!==0:!!y}function U(y){return typeof y=="string"&&y.trim()!==""?y.trim():""}function Q(y){return s(y)?[]:Array.isArray(y)?y.filter(w=>!s(w)):typeof y=="string"?y.split(",").map(w=>w.trim()).filter(Boolean):[y]}function Se(y,w,R){const te=w.blockedBy;if(!te.length)return;const fe=y.doneColumns||new Set,ue=te.every(se=>{const pe=R.get(se);return!!pe&&pe.columnId!==null&&fe.has(String(pe.columnId))});ue&&!w.explicitBlocked?w.ready=!0:ue||(w.blocked=!0)}function je(y,w){const R=y.key(w),te=A(N(y.columnProperty)(w)),fe=y.pointsProperty?N(y.pointsProperty)(w):void 0,ue=Number(fe),se={};for(const[Ue,Ge]of Object.entries(y.cardSpecs))se[Ue]=m(y,w,R,Ge.field);const pe=y.blockedProperty?N(y.blockedProperty)(w):void 0,me=y.blockedByProperty?N(y.blockedByProperty)(w):void 0,le=D(pe),_e=y.cardSpecs.assignee,He=y.cardSpecs.due,Pe=y.cardSpecs.progress,Me=y.cardSpecs.checklist;let lt=null;if(He){const Ue=W(l(y,w,R,He.field));lt={text:ie(He.format,Ue,se.due||"",w,He.locale),ts:Ue,state:G(Ue,Date.now(),He.dueSoon)}}let ot=null;if(Me){const Ue=Me.field!=null?l(y,w,R,Me.field):l(y,w,R,Me.done),Ge=Me.field!=null?void 0:l(y,w,R,Me.total);ot=H(Ue,Ge)}const ut={};if(y.cardSpecs.labels&&y.cardSpecs.labels.tone&&se.labels)for(const Ue of String(se.labels).split(",").map(Ge=>Ge.trim()).filter(Boolean)){const Ge=I(y.cardSpecs.labels.tone,Ue,w);Ge&&(ut[Ue]=Ge)}const mt=y.cardSpecs.badges;return{key:R,row:w,columnId:te,labelTones:ut,badgeTone:mt&&se.badges?I(mt.tone,se.badges,w):null,points:Number.isFinite(ue)?ue:0,hasPoints:Number.isFinite(ue),swimlane:y.swimlaneProperty?N(y.swimlaneProperty)(w):void 0,sprint:y.sprintProperty?N(y.sprintProperty)(w):void 0,epic:y.epicProperty?N(y.epicProperty)(w):void 0,order:y.orderProperty?N(y.orderProperty)(w):void 0,explicitBlocked:le,blocked:le,blockedReason:U(pe),blockedBy:Q(me),ready:!1,fields:se,assignees:K(_e?l(y,w,R,_e.field):void 0),due:lt,progressPct:Pe?O(l(y,w,R,Pe.field)):null,checklist:ot}}function P(y,w,R={}){const te=ae(d(y,w),R),fe=new Map(te.map(Pe=>[Pe.id,{...Pe,cards:[],points:0}])),ue=new Map,se=[];let pe=0;const me=w.map(Pe=>je(y,Pe)),le=new Map(me.map(Pe=>[Pe.key,Pe]));for(const Pe of me)Se(y,Pe,le);for(const Pe of me){if(!be(y,Pe,R)){pe+=1;continue}ue.set(Pe.key,Pe);const Me=Pe.columnId===null?null:fe.get(Pe.columnId);if(!Me){se.push(Pe);continue}Me.cards.push(Pe)}for(const Pe of fe.values())he(y,Pe);se.length&&k(`kanban:unplaced:${y.columnProperty}`,`${se.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const _e=[...fe.values()],He=y.swimlanes?Fe(y,_e,ue,R):null;return{columns:_e,lanes:He,cardsByKey:ue,unplaced:se,filtered:pe}}function ae(y,w){let R=y;if(Array.isArray(w.columnOrder)&&w.columnOrder.length){const fe=new Map(w.columnOrder.map((ue,se)=>[ue,se]));R=[...y].sort((ue,se)=>{const pe=fe.has(ue.id)?fe.get(ue.id):Number.MAX_SAFE_INTEGER,me=fe.has(se.id)?fe.get(se.id):Number.MAX_SAFE_INTEGER;return pe-me})}const te=w.collapsedColumns;return R.map(fe=>({...fe,collapsed:fe.collapsed||!!(te&&te.has(fe.id))}))}function he(y,w){y.orderProperty&&w.cards.sort((R,te)=>Ze(R.order)-Ze(te.order)),w.count=w.cards.length,w.points=w.cards.reduce((R,te)=>R+(te.hasPoints?te.points:0),0),w.over=w.wipLimit!==null&&w.count>w.wipLimit}function be(y,w,R){if(R.filters&&R.filters.size){for(const se of R.filters.values())if(x(se)&&!se(w.row,w))return!1}if(R.blockedFilter&&!w.blocked||!V(y,w,R)||!J(y,w,R))return!1;const te=typeof R.quickFilter=="string"?R.quickFilter.trim().toLowerCase():"";if(!te)return!0;const fe=(w.assignees||[]).map(se=>se.name).join(" ");return`${Object.values(w.fields).join(" ")} ${fe}`.toLowerCase().includes(te)||String(w.columnId).toLowerCase().includes(te)}const Ne="\0backlog",xe="\0default";function V(y,w,R){if(R.sprint===void 0||!y.sprintProperty)return!0;const te=N(y.sprintProperty)(w.row);return R.sprint===Ne?s(te)||te==="":String(te)===String(R.sprint)}function J(y,w,R){return R.epic===void 0||!y.epicProperty?!0:String(N(y.epicProperty)(w.row))===String(R.epic)}function re(y,w,R,te){const fe=N(R),ue=y.pointsProperty?N(y.pointsProperty):()=>0,se=new Map;for(const me of w){const le=fe(me),_e=s(le)?"":String(le);let He=se.get(_e);He||(He={value:le,count:0,points:0,doneCount:0,donePoints:0,progress:0},se.set(_e,He));const Pe=Number(ue(me)),Me=Number.isFinite(Pe)?Pe:0;He.count+=1,He.points+=Me,x(te)&&te(me)&&(He.doneCount+=1,He.donePoints+=Me)}const pe=[...se.values()];for(const me of pe){const le=me.points||me.count||1,_e=me.points?me.donePoints:me.doneCount;me.progress=Math.round(_e/le*1e3)/1e3}return pe.sort((me,le)=>le.points-me.points||le.count-me.count)}function Ke(y){return s(y)?"":String(y)}function Fe(y,w,R,te){const fe=N(y.swimlaneProperty),ue=Array.isArray(y.lanes)?y.lanes.map(le=>typeof le=="string"?{id:le}:le):[],se=new Map(ue.map(le=>[le.id,le]));let pe=ue.map(le=>le.id);for(const le of R.values()){const _e=Ke(fe(le.row));!se.has(_e)&&!pe.includes(_e)&&pe.push(_e)}if(Array.isArray(te.laneOrder)&&te.laneOrder.length){const le=te.laneOrder.filter(_e=>pe.includes(_e));pe=[...le,...pe.filter(_e=>!le.includes(_e))]}const me=te.collapsedLanes;return pe.map(le=>{const _e=se.get(le)||{id:le},He=w.map(Pe=>{const Me=Pe.cards.filter(lt=>Ke(fe(lt.row))===le);return{id:Pe.id,title:Pe.title,cards:Me,count:Me.length,points:Me.reduce((lt,ot)=>lt+(ot.hasPoints?ot.points:0),0)}});return{id:le,title:s(_e.title)?le===""?"":C(le):String(_e.title),collapsed:!!(me&&me.has(le)),columns:He,count:He.reduce((Pe,Me)=>Pe+Me.count,0),points:He.reduce((Pe,Me)=>Pe+Me.points,0)}})}function Ze(y){const w=Number(y);return Number.isFinite(w)?w:Number.POSITIVE_INFINITY}function Qe(y,w,R){const te=Math.max(0,Math.min(w,y.length)),fe=te>0?Number(y[te-1]):null,ue=te<y.length?Number(y[te]):null,se=[],pe=fe!==null&&Number.isFinite(fe),me=ue!==null&&Number.isFinite(ue);if(!pe&&!me){for(let _e=0;_e<R;_e++)se.push(_e);return se}if(!pe){for(let _e=0;_e<R;_e++)se.push(ue-(R-_e));return se}if(!me){for(let _e=0;_e<R;_e++)se.push(fe+1+_e);return se}const le=(ue-fe)/(R+1);for(let _e=0;_e<R;_e++)se.push(fe+le*(_e+1));return se}function Je(y,w,R,te,fe=3){const ue=R>0?R:1,se=Math.max(0,Math.floor(y/ue)-fe),pe=Math.ceil(w/ue)+fe*2,me=Math.min(te,se+pe);return{start:se,end:me,padTop:se*ue,padBottom:Math.max(0,(te-me)*ue)}}function Le(y,w){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(w)?w.filter(R=>S(R)&&R.done).map(R=>String(R.id)):[]])}function Ie(y){return typeof y=="number"&&Number.isFinite(y)&&y>0?y:y==="auto"?"auto":"fill"}function st(y){const w=S(y)?y:{};return s(w.columnProperty)&&!w.grid&&!Array.isArray(w.columns)&&k("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:a(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,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(R=>S(R)?{id:R.id,title:R.title}:{id:R}):null,swimlanes:!!w.swimlanes,lanes:Array.isArray(w.lanes)?w.lanes:null,doneColumns:Le(w.doneColumns,w.columns),transitions:S(w.transitions)?w.transitions:null,require:S(w.require)?w.require:null,laneRules:new Map((Array.isArray(w.lanes)?w.lanes:[]).filter(R=>S(R)&&(S(R.transitions)||S(R.require))).map(R=>[String(R.id),{transitions:R.transitions,require:R.require}])),showPoints:!!w.showPoints,density:w.density==="compact"?"compact":"comfortable",columnWidth:Ie(w.columnWidth),minColumnWidth:Number.isFinite(w.minColumnWidth)&&w.minColumnWidth>0?w.minColumnWidth:240,card:S(w.card)?w.card:{},cardSpecs:c(S(w.card)?w.card:{}),emptyText:typeof w.emptyText=="string"?w.emptyText:"",virtualize:w.virtualize?{rowHeight:S(w.virtualize)&&w.virtualize.rowHeight||96,overscan:S(w.virtualize)&&w.virtualize.overscan||3,threshold:S(w.virtualize)&&w.virtualize.threshold||50,viewport:S(w.virtualize)&&w.virtualize.viewport||600}:null}}}),We("packages/modules/kanban/styles.js",function(g,Z){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"css",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return ee}});const o="lat-kanban",k="data-lattice-kanban-styles";function T(){return`
|
|
6
|
+
(function(Ot){"use strict";var Et=!0,At=Object.create(null),Ct=Object.create(null);function Ke(m,ee){At[m]=ee}function Pt(m){var ee=Ct[m];if(ee)return ee;var o=Object.create(null);Ct[m]=o;var k=At[m];if(!k)throw new Error("[lattice] missing module: "+m);return k(o,Pt),o}Ke("packages/core/src/internal/predicates.js",function(m,ee){"use strict";Object.defineProperty(m,"isObject",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"isFunction",{enumerable:!0,get:function(){return k}}),Object.defineProperty(m,"isNil",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"isBlank",{enumerable:!0,get:function(){return te}}),Object.defineProperty(m,"isCtor",{enumerable:!0,get:function(){return ne}});function o(j){return j!==null&&typeof j=="object"&&!Array.isArray(j)}function k(j){return typeof j=="function"}function T(j){return j==null}function te(j){return j==null||j===""}function ne(j){return typeof j!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(j))?!0:!!(j.prototype&&Object.getOwnPropertyNames(j.prototype).length>1)}}),Ke("packages/core/src/internal/warn.js",function(m,ee){"use strict";Object.defineProperty(m,"reportedWarnings",{enumerable:!0,get:function(){return S}}),Object.defineProperty(m,"warnOnce",{enumerable:!0,get:function(){return E}}),Object.defineProperty(m,"infoOnce",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"resetWarnings",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"fail",{enumerable:!0,get:function(){return U}}),Object.defineProperty(m,"invariant",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"DEV",{enumerable:!0,get:function(){return ie}});const o=new Set,k=2e3;function T(K){if(o.add(K),o.size>k){const P=o.values().next().value;P!==void 0&&o.delete(P)}}const te=[],ne=500;function j(K,P,I){te.push({key:K,level:P,message:I.map(N=>typeof N=="string"?N:l(N)).join(" "),at:Date.now()}),te.length>ne&&te.shift()}function l(K){if(K instanceof Error)return K.message;try{return JSON.stringify(K)}catch{return String(K)}}function S(){return te.map(K=>({...K}))}function B(K){if(K.length===0||typeof K[0]!="string")return K;const P=K[0].replace(/^\[lattice\]\s*/,"");return P===K[0]?K:[P,...K.slice(1)]}function E(K,...P){if(o.has(K))return;T(K);const I=B(P);j(K,"warn",I),console.warn("[lattice]",...I)}function R(K,...P){if(o.has(K))return;T(K);const I=B(P);j(K,"info",I),console.info("[lattice]",...I)}function q(){o.clear(),te.length=0}function U(K,P){const I=new Error(`[lattice] ${K}`);throw P!==void 0&&(I.cause=P),I}function Z(K,P){K||U(P)}const ie=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})()}),Ke("packages/core/src/internal/paths.js",function(m,ee){"use strict";Object.defineProperty(m,"pathGetter",{enumerable:!0,get:function(){return k}}),Object.defineProperty(m,"pathSetter",{enumerable:!0,get:function(){return te}}),Object.defineProperty(m,"getPath",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"setPath",{enumerable:!0,get:function(){return j}});const o=new Map;function k(l){let S=o.get(l);if(S)return S;if(!l.includes("."))S=B=>B?.[l];else{const B=l.split("."),E=B.length;S=R=>{let q=R;for(let U=0;U<E;U++){if(q==null)return;q=q[B[U]]}return q}}return o.set(l,S),S}const T=new Map;function te(l){let S=T.get(l);if(S)return S;if(!l.includes("."))S=(B,E)=>{B!=null&&(B[l]=E)};else{const B=l.split("."),E=B.length-1;S=(R,q)=>{let U=R;for(let Z=0;Z<E;Z++){if(U==null)return;const ie=B[Z];U[ie]==null&&(U[ie]={}),U=U[ie]}U!=null&&(U[B[E]]=q)}}return T.set(l,S),S}function ne(l,S){return k(S)(l)}function j(l,S,B){te(S)(l,B)}}),Ke("packages/core/src/internal/uid.js",function(m,ee){"use strict";Object.defineProperty(m,"uid",{enumerable:!0,get:function(){return k}});let o=0;function k(T="l"){return`${T}${(++o).toString(36)}`}}),Ke("packages/core/src/internal/merge.js",function(m,ee){"use strict";Object.defineProperty(m,"expand",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"toArray",{enumerable:!0,get:function(){return te}}),Object.defineProperty(m,"merge",{enumerable:!0,get:function(){return j}}),Object.defineProperty(m,"mergeRow",{enumerable:!0,get:function(){return l}});const k=ee("packages/core/src/internal/predicates.js").isObject;function T(S,B,E){if(S!==void 0)return S===!0?{enabled:!0,...E}:S===!1?{enabled:!1}:k(S)?S:{[B]:S,enabled:!0}}function te(S){return S==null?[]:Array.isArray(S)?S:[S]}const ne=Object.freeze(new Set(["__proto__","constructor","prototype"]));function j(S,B){if(!k(S))return k(B)?{...B}:B;if(!k(B))return B===void 0?S:B;const E={...S};for(const R of Object.keys(B)){if(ne.has(R))continue;const q=B[R];q!==void 0&&(E[R]=k(q)&&k(E[R])?j(E[R],q):q)}return E}function l(S,B){if(!k(S)||!k(B)||S===B)return B;const E=Object.create(Object.getPrototypeOf(S));return Object.assign(E,S,B),E}}),Ke("packages/core/src/internal/ready.js",function(m,ee){"use strict";Object.defineProperty(m,"createReadySignal",{enumerable:!0,get:function(){return o}});function o(){let k=!1,T,te;const ne=new Promise((j,l)=>{T=j,te=l});return ne.catch(()=>{}),{promise:ne,settleSoon(){k||queueMicrotask(()=>{k||(k=!0,T())})},settleAfterFrames(){if(k)return;const j=typeof requestAnimationFrame=="function"?requestAnimationFrame:null;if(!j){this.settleSoon();return}let l=!1;const S=()=>{l||(l=!0,this.settleNow())};j(()=>j(S)),setTimeout(S,250)},settleNow(){k||(k=!0,T())},fail(j){k||(k=!0,te(j))}}}}),Ke("packages/core/src/internal/text.js",function(m,ee){"use strict";Object.defineProperty(m,"humanise",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"escapeHtml",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"titleCase",{enumerable:!0,get:function(){return te}});function o(ne){return ne?(ne.includes(".")?ne.slice(ne.lastIndexOf(".")+1):ne).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(/^./,l=>l.toUpperCase()):""}const k={"&":"&","<":"<",">":">",'"':""","'":"'"};function T(ne){const j=ne==null?"":String(ne);return/[&<>"']/.test(j)?j.replace(/[&<>"']/g,l=>k[l]):j}function te(ne){return String(ne).replace(/\w\S*/g,j=>j[0].toUpperCase()+j.slice(1).toLowerCase())}}),Ke("packages/modules/kanban/card-parts.js",function(m,ee){"use strict";Object.defineProperty(m,"NS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"initials",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"avatarColor",{enumerable:!0,get:function(){return j}}),Object.defineProperty(m,"safeAvatarUrl",{enumerable:!0,get:function(){return l}}),Object.defineProperty(m,"avatarChip",{enumerable:!0,get:function(){return S}}),Object.defineProperty(m,"assignees",{enumerable:!0,get:function(){return E}}),Object.defineProperty(m,"dueTimestamp",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"dueState",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"progressPercent",{enumerable:!0,get:function(){return U}}),Object.defineProperty(m,"checklist",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"TONES",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(m,"toneOf",{enumerable:!0,get:function(){return K}}),Object.defineProperty(m,"formatDuePattern",{enumerable:!0,get:function(){return I}}),Object.defineProperty(m,"dueText",{enumerable:!0,get:function(){return N}});const o="lat-kanban",k=["#4a90d9","#e2513b","#2c9c6a","#8b5cf6","#d97706","#0891b2","#be185d"],T=/^\s*(https?:|blob:|data:image\/)/i,te=/^\s*[a-z][a-z0-9+.-]*:/i;function ne(w){const a=String(w).trim().split(/\s+/).filter(Boolean);return a.length?a.length===1?a[0].slice(0,2).toUpperCase():(a[0][0]+a[a.length-1][0]).toUpperCase():"?"}function j(w){let a=0;for(let h=0;h<w.length;h+=1)a=a*31+w.charCodeAt(h)>>>0;return k[a%k.length]}function l(w){if(w==null)return"";const a=String(w).trim();return a?te.test(a)?T.test(a)?a:"":a:""}function S(w,{name:a,avatar:h,title:c=null}){const u=String(a??""),f=w.createElement("span");f.setAttribute("class",`${o}__avatar`),f.style.background=j(u),c!=null&&f.setAttribute("title",String(c));const _=l(h);if(_){const W=w.createElement("img");W.setAttribute("class",`${o}__avatar-img`),W.setAttribute("alt",u),W.setAttribute("loading","lazy"),W.setAttribute("decoding","async"),W.setAttribute("src",_),W.addEventListener("error",()=>{W.parentNode===f&&f.removeChild(W)}),f.appendChild(W)}const A=w.createElement("span");return A.setAttribute("class",`${o}__avatar-glyph`),A.textContent=ne(u),f.appendChild(A),f}function B(w){if(w==null)return null;if(typeof w=="object"){const h=String(w.name??w.label??w.id??"").trim();return h?{name:h,avatar:w.avatar??null}:null}const a=String(w).trim();return a?{name:a,avatar:null}:null}function E(w){if(w==null)return[];const a=Array.isArray(w)?w:String(w).split(",").map(c=>c.trim()).filter(Boolean),h=[];for(const c of a){const u=B(c);u&&h.push(u)}return h}function R(w){if(w==null||w==="")return null;if(w instanceof Date){const h=w.getTime();return Number.isFinite(h)?h:null}if(typeof w=="number")return Number.isFinite(w)?w:null;const a=Date.parse(String(w).trim());return Number.isFinite(a)?a:null}function q(w,a,h=0){if(w===null||!Number.isFinite(w))return null;if(w<a)return"overdue";const c=Number(h)||0;return c>0&&w-a<=c*864e5?"soon":null}function U(w){if(w==null||w==="")return null;const a=Number(String(w).replace("%","").trim());if(!Number.isFinite(a))return null;const h=a<=1&&a>=0?a*100:a;return Math.max(0,Math.min(100,Math.round(h)))}function Z(w,a){let h=w,c=a;a===void 0&&w!==null&&w!==void 0&&typeof w=="object"&&(h=w.done,c=w.total);const u=Number(h),f=Number(c);return!Number.isFinite(u)&&!Number.isFinite(f)?null:{done:Number.isFinite(u)?u:0,total:Number.isFinite(f)?f:0}}const ie=Object.freeze(["accent","info","success","warning","danger","neutral"]);function K(w,a,h){if(!w)return null;let c;return typeof w=="function"?c=w(h,a):typeof w=="object"&&Object.prototype.hasOwnProperty.call(w,a)&&(c=w[a]),typeof c=="string"&&ie.includes(c)?c:null}const P=w=>String(w).padStart(2,"0");function I(w,a,h){const c=new Date(a),u=_=>new Intl.DateTimeFormat(h,_).format(c),f={yyyy:()=>String(c.getFullYear()),yy:()=>P(c.getFullYear()%100),MMMM:()=>u({month:"long"}),MMM:()=>u({month:"short"}),MM:()=>P(c.getMonth()+1),M:()=>String(c.getMonth()+1),dd:()=>P(c.getDate()),d:()=>String(c.getDate()),EEEE:()=>u({weekday:"long"}),EEE:()=>u({weekday:"short"})};return String(w).replace(/'([^']*)'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE/g,(_,A)=>A!==void 0?A:f[_]())}function N(w,a,h,c,u){if(a===null||!w)return h;let f;if(typeof w=="function")f=w(new Date(a),c);else if(typeof w=="string")f=I(w,a,u);else return h;return f==null||f===""?h:String(f)}}),Ke("packages/modules/kanban/model.js",function(m,ee){"use strict";Object.defineProperty(m,"accessorFor",{enumerable:!0,get:function(){return N}}),Object.defineProperty(m,"keyFn",{enumerable:!0,get:function(){return a}}),Object.defineProperty(m,"fieldText",{enumerable:!0,get:function(){return h}}),Object.defineProperty(m,"rawField",{enumerable:!0,get:function(){return c}}),Object.defineProperty(m,"cardSpecs",{enumerable:!0,get:function(){return u}}),Object.defineProperty(m,"deriveColumns",{enumerable:!0,get:function(){return f}}),Object.defineProperty(m,"columnIdOf",{enumerable:!0,get:function(){return A}}),Object.defineProperty(m,"buildCard",{enumerable:!0,get:function(){return Se}}),Object.defineProperty(m,"groupRows",{enumerable:!0,get:function(){return O}}),Object.defineProperty(m,"passesFilter",{enumerable:!0,get:function(){return ye}}),Object.defineProperty(m,"BACKLOG",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(m,"DEFAULT_FILTER",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(m,"rollup",{enumerable:!0,get:function(){return re}}),Object.defineProperty(m,"laneIdOf",{enumerable:!0,get:function(){return De}}),Object.defineProperty(m,"computeOrders",{enumerable:!0,get:function(){return Je}}),Object.defineProperty(m,"windowRange",{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(m,"deriveDoneColumns",{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(m,"resolveColumnWidth",{enumerable:!0,get:function(){return je}}),Object.defineProperty(m,"resolveColumnWidthRange",{enumerable:!0,get:function(){return lt}}),Object.defineProperty(m,"resolveContext",{enumerable:!0,get:function(){return ct}});const k=ee("packages/core/src/internal/warn.js").warnOnce,te=ee("packages/core/src/internal/paths.js").getPath,ne=ee("packages/core/src/internal/predicates.js"),j=ne.isFunction,l=ne.isNil,S=ne.isObject,E=ee("packages/core/src/internal/text.js").humanise,R=ee("packages/modules/kanban/card-parts.js"),q=R.assignees,U=R.checklist,Z=R.dueState,ie=R.dueText,K=R.dueTimestamp,P=R.progressPercent,I=R.toneOf;function N(g){return j(g)?g:typeof g=="string"?y=>te(y,g):()=>{}}function w(g){return Array.isArray(g)?"array":g===null?"null":typeof g}function a(g){if(g!==void 0&&typeof g!="function"&&!(typeof g=="string"&&g.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(g))return D=>{const Y=g(D);if(typeof Y=="string"||typeof Y=="number"&&Number.isFinite(Y))return Y;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${w(Y)}.`)};const y=typeof g=="string"?g:"id";return D=>te(D,y)}function h(g,y,D,Y){if(l(Y))return"";if(g.grid&&typeof Y=="string")try{if(g.grid.columns&&g.grid.columns.get&&g.grid.columns.get(Y)){const Ae=g.grid.rows.text(D,Y);if(!l(Ae))return String(Ae)}}catch{}const de=N(Y)(y);return l(de)?"":String(de)}function c(g,y,D,Y){if(!l(Y)){if(g.grid&&typeof Y=="string")try{if(g.grid.columns&&g.grid.columns.get&&g.grid.columns.get(Y))return g.grid.rows.value(D,Y)}catch{}return N(Y)(y)}}function u(g){const y={};for(const[D,Y]of Object.entries(g))Y&&typeof Y=="object"&&!j(Y)?y[D]={...Y,edit:!!Y.edit,editor:Y.editor}:y[D]={field:Y,edit:!1,editor:void 0};return y}function f(g,y){const D=Array.isArray(g.columns)?g.columns.map(_):[],Y=new Map(D.map(le=>[le.id,le])),de=[],Ae=N(g.columnProperty);for(const le of y){const ce=Ae(le),he=A(ce);he!==null&&!Y.has(he)&&!de.includes(he)&&de.push(he)}let se;if(D.length?se=[...D.map(le=>le.id),...de.filter(le=>!Y.has(le))]:se=de,Array.isArray(g.columnOrder)&&g.columnOrder.length){const le=g.columnOrder.filter(ce=>se.includes(ce));se=[...le,...se.filter(ce=>!le.includes(ce))]}return se.map(le=>{const ce=Y.get(le)||{id:le,title:E(String(le))};return{id:le,title:l(ce.title)?E(String(le)):String(ce.title),color:ce.color??null,wipLimit:Number.isFinite(ce.wipLimit)?ce.wipLimit:null,collapsed:!!ce.collapsed}})}function _(g){return typeof g=="string"?{id:g}:S(g)&&!l(g.id)?g:{id:String(g)}}function A(g){return l(g)?null:String(g)}function W(g){return l(g)?!1:typeof g=="string"?g.trim()!=="":typeof g=="number"?g!==0:!!g}function G(g){return typeof g=="string"&&g.trim()!==""?g.trim():""}function X(g){return l(g)?[]:Array.isArray(g)?g.filter(y=>!l(y)):typeof g=="string"?g.split(",").map(y=>y.trim()).filter(Boolean):[g]}function Oe(g,y,D){const Y=y.blockedBy;if(!Y.length)return;const de=g.doneColumns||new Set,Ae=Y.every(se=>{const le=D.get(se);return!!le&&le.columnId!==null&&de.has(String(le.columnId))});Ae&&!y.explicitBlocked?y.ready=!0:Ae||(y.blocked=!0)}function Se(g,y){const D=g.key(y),Y=A(N(g.columnProperty)(y)),de=g.pointsProperty?N(g.pointsProperty)(y):void 0,Ae=Number(de),se={};for(const[Ye,ot]of Object.entries(g.cardSpecs))se[Ye]=h(g,y,D,ot.field);const le=g.blockedProperty?N(g.blockedProperty)(y):void 0,ce=g.blockedByProperty?N(g.blockedByProperty)(y):void 0,he=W(le),we=g.cardSpecs.assignee,He=g.cardSpecs.due,$e=g.cardSpecs.progress,ze=g.cardSpecs.checklist;let it=null;if(He){const Ye=K(c(g,y,D,He.field));it={text:ie(He.format,Ye,se.due||"",y,He.locale),ts:Ye,state:Z(Ye,Date.now(),He.dueSoon)}}let ut=null;if(ze){const Ye=ze.field!=null?c(g,y,D,ze.field):c(g,y,D,ze.done),ot=ze.field!=null?void 0:c(g,y,D,ze.total);ut=U(Ye,ot)}const bt={};if(g.cardSpecs.labels&&g.cardSpecs.labels.tone&&se.labels)for(const Ye of String(se.labels).split(",").map(ot=>ot.trim()).filter(Boolean)){const ot=I(g.cardSpecs.labels.tone,Ye,y);ot&&(bt[Ye]=ot)}const gt=g.cardSpecs.badges;return{key:D,row:y,columnId:Y,labelTones:bt,badgeTone:gt&&se.badges?I(gt.tone,se.badges,y):null,points:Number.isFinite(Ae)?Ae:0,hasPoints:Number.isFinite(Ae),swimlane:g.swimlaneProperty?N(g.swimlaneProperty)(y):void 0,sprint:g.sprintProperty?N(g.sprintProperty)(y):void 0,epic:g.epicProperty?N(g.epicProperty)(y):void 0,order:g.orderProperty?N(g.orderProperty)(y):void 0,explicitBlocked:he,blocked:he,blockedReason:G(le),blockedBy:X(ce),ready:!1,fields:se,assignees:q(we?c(g,y,D,we.field):void 0),due:it,progressPct:$e?P(c(g,y,D,$e.field)):null,checklist:ut}}function O(g,y,D={}){const Y=oe(f(g,y),D),de=new Map(Y.map($e=>[$e.id,{...$e,cards:[],points:0}])),Ae=new Map,se=[];let le=0;const ce=y.map($e=>Se(g,$e)),he=new Map(ce.map($e=>[$e.key,$e]));for(const $e of ce)Oe(g,$e,he);for(const $e of ce){if(!ye(g,$e,D)){le+=1;continue}Ae.set($e.key,$e);const ze=$e.columnId===null?null:de.get($e.columnId);if(!ze){se.push($e);continue}ze.cards.push($e)}for(const $e of de.values())me(g,$e);se.length&&k(`kanban:unplaced:${g.columnProperty}`,`${se.length} card(s) have a "${g.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const we=[...de.values()],He=g.swimlanes?xe(g,we,Ae,D):null;return{columns:we,lanes:He,cardsByKey:Ae,unplaced:se,filtered:le}}function oe(g,y){let D=g;if(Array.isArray(y.columnOrder)&&y.columnOrder.length){const de=new Map(y.columnOrder.map((Ae,se)=>[Ae,se]));D=[...g].sort((Ae,se)=>{const le=de.has(Ae.id)?de.get(Ae.id):Number.MAX_SAFE_INTEGER,ce=de.has(se.id)?de.get(se.id):Number.MAX_SAFE_INTEGER;return le-ce})}const Y=y.collapsedColumns;return D.map(de=>({...de,collapsed:de.collapsed||!!(Y&&Y.has(de.id))}))}function me(g,y){g.orderProperty&&y.cards.sort((D,Y)=>Ge(D.order)-Ge(Y.order)),y.count=y.cards.length,y.points=y.cards.reduce((D,Y)=>D+(Y.hasPoints?Y.points:0),0),y.over=y.wipLimit!==null&&y.count>y.wipLimit}function ye(g,y,D){if(D.filters&&D.filters.size){for(const se of D.filters.values())if(j(se)&&!se(y.row,y))return!1}if(D.blockedFilter&&!y.blocked||!J(g,y,D)||!Q(g,y,D))return!1;const Y=typeof D.quickFilter=="string"?D.quickFilter.trim().toLowerCase():"";if(!Y)return!0;const de=(y.assignees||[]).map(se=>se.name).join(" ");return`${Object.values(y.fields).join(" ")} ${de}`.toLowerCase().includes(Y)||String(y.columnId).toLowerCase().includes(Y)}const Ie="\0backlog",Ne="\0default";function J(g,y,D){if(D.sprint===void 0||!g.sprintProperty)return!0;const Y=N(g.sprintProperty)(y.row);return D.sprint===Ie?l(Y)||Y==="":String(Y)===String(D.sprint)}function Q(g,y,D){return D.epic===void 0||!g.epicProperty?!0:String(N(g.epicProperty)(y.row))===String(D.epic)}function re(g,y,D,Y){const de=N(D),Ae=g.pointsProperty?N(g.pointsProperty):()=>0,se=new Map;for(const ce of y){const he=de(ce),we=l(he)?"":String(he);let He=se.get(we);He||(He={value:he,count:0,points:0,doneCount:0,donePoints:0,progress:0},se.set(we,He));const $e=Number(Ae(ce)),ze=Number.isFinite($e)?$e:0;He.count+=1,He.points+=ze,j(Y)&&Y(ce)&&(He.doneCount+=1,He.donePoints+=ze)}const le=[...se.values()];for(const ce of le){const he=ce.points||ce.count||1,we=ce.points?ce.donePoints:ce.doneCount;ce.progress=Math.round(we/he*1e3)/1e3}return le.sort((ce,he)=>he.points-ce.points||he.count-ce.count)}function De(g){return l(g)?"":String(g)}function xe(g,y,D,Y){const de=N(g.swimlaneProperty),Ae=Array.isArray(g.lanes)?g.lanes.map(he=>typeof he=="string"?{id:he}:he):[],se=new Map(Ae.map(he=>[he.id,he]));let le=Ae.map(he=>he.id);for(const he of D.values()){const we=De(de(he.row));!se.has(we)&&!le.includes(we)&&le.push(we)}if(Array.isArray(Y.laneOrder)&&Y.laneOrder.length){const he=Y.laneOrder.filter(we=>le.includes(we));le=[...he,...le.filter(we=>!he.includes(we))]}const ce=Y.collapsedLanes;return le.map(he=>{const we=se.get(he)||{id:he},He=y.map($e=>{const ze=$e.cards.filter(it=>De(de(it.row))===he);return{id:$e.id,title:$e.title,cards:ze,count:ze.length,points:ze.reduce((it,ut)=>it+(ut.hasPoints?ut.points:0),0)}});return{id:he,title:l(we.title)?he===""?"":E(he):String(we.title),collapsed:!!(ce&&ce.has(he)),columns:He,count:He.reduce(($e,ze)=>$e+ze.count,0),points:He.reduce(($e,ze)=>$e+ze.points,0)}})}function Ge(g){const y=Number(g);return Number.isFinite(y)?y:Number.POSITIVE_INFINITY}function Je(g,y,D){const Y=Math.max(0,Math.min(y,g.length)),de=Y>0?Number(g[Y-1]):null,Ae=Y<g.length?Number(g[Y]):null,se=[],le=de!==null&&Number.isFinite(de),ce=Ae!==null&&Number.isFinite(Ae);if(!le&&!ce){for(let we=0;we<D;we++)se.push(we);return se}if(!le){for(let we=0;we<D;we++)se.push(Ae-(D-we));return se}if(!ce){for(let we=0;we<D;we++)se.push(de+1+we);return se}const he=(Ae-de)/(D+1);for(let we=0;we<D;we++)se.push(de+he*(we+1));return se}function Ve(g,y,D,Y,de=3){const Ae=D>0?D:1,se=Math.max(0,Math.floor(g/Ae)-de),le=Math.ceil(y/Ae)+de*2,ce=Math.min(Y,se+le);return{start:se,end:ce,padTop:se*Ae,padBottom:Math.max(0,(Y-ce)*Ae)}}function Fe(g,y){return new Set([...Array.isArray(g)?g.map(String):[],...Array.isArray(y)?y.filter(D=>S(D)&&D.done).map(D=>String(D.id)):[]])}function je(g){return typeof g=="number"&&Number.isFinite(g)&&g>0?g:g==="auto"?"auto":"fill"}function lt(g){const y=S(g)?g:{},D=Number.isFinite(y.minColumnWidth)&&y.minColumnWidth>0?y.minColumnWidth:240;let Y=Number.isFinite(y.maxColumnWidth)&&y.maxColumnWidth>0?y.maxColumnWidth:0;return Y&&Y<D&&(k("kanban:min-max-column-width",`"minColumnWidth" (${D}) is greater than "maxColumnWidth" (${Y}); the minimum wins, and both resolve to ${D}.`),Y=D),{minColumnWidth:D,maxColumnWidth:Y}}function ct(g){const y=S(g)?g:{};return l(y.columnProperty)&&!y.grid&&!Array.isArray(y.columns)&&k("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:y.grid||null,source:y.source||null,pageSize:Number.isFinite(y.pageSize)&&y.pageSize>0?y.pageSize:50,key:a(y.rowKey??"id"),rowKey:y.rowKey??"id",columnProperty:y.columnProperty??null,columns:y.columns??null,columnOrder:y.columnOrder??null,pointsProperty:y.pointsProperty??null,orderProperty:y.orderProperty??null,swimlaneProperty:y.swimlaneProperty??null,sprintProperty:y.sprintProperty??null,epicProperty:y.epicProperty??null,blockedProperty:y.blockedProperty??null,blockedByProperty:y.blockedByProperty??null,enforceWip:!!y.enforceWip,sprintList:Array.isArray(y.sprints)?y.sprints.map(D=>S(D)?{id:D.id,title:D.title}:{id:D}):null,swimlanes:!!y.swimlanes,lanes:Array.isArray(y.lanes)?y.lanes:null,doneColumns:Fe(y.doneColumns,y.columns),transitions:S(y.transitions)?y.transitions:null,require:S(y.require)?y.require:null,laneRules:new Map((Array.isArray(y.lanes)?y.lanes:[]).filter(D=>S(D)&&(S(D.transitions)||S(D.require))).map(D=>[String(D.id),{transitions:D.transitions,require:D.require}])),showPoints:!!y.showPoints,density:y.density==="compact"?"compact":"comfortable",columnWidth:je(y.columnWidth),...lt(y),card:S(y.card)?y.card:{},cardSpecs:u(S(y.card)?y.card:{}),emptyText:typeof y.emptyText=="string"?y.emptyText:"",virtualize:y.virtualize?{rowHeight:S(y.virtualize)&&y.virtualize.rowHeight||96,overscan:S(y.virtualize)&&y.virtualize.overscan||3,threshold:S(y.virtualize)&&y.virtualize.threshold||50,viewport:S(y.virtualize)&&y.virtualize.viewport||600}:null}}}),Ke("packages/modules/kanban/styles.js",function(m,ee){"use strict";Object.defineProperty(m,"NS",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"css",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"injectStyles",{enumerable:!0,get:function(){return te}});const o="lat-kanban",k="data-lattice-kanban-styles";function T(){return`
|
|
7
7
|
@layer lattice {
|
|
8
8
|
.${o}{
|
|
9
9
|
--lattice-kanban-column-bg:var(--lattice-surface);
|
|
@@ -63,10 +63,12 @@
|
|
|
63
63
|
.${o}[data-columnwidth="fill"] .${o}__column{
|
|
64
64
|
flex:1 1 0;
|
|
65
65
|
min-width:var(--lattice-kanban-column-min,240px);
|
|
66
|
+
max-width:var(--lattice-kanban-column-max,none);
|
|
66
67
|
}
|
|
67
68
|
.${o}[data-columnwidth="fill"] .${o}__column[data-collapsed="true"]{
|
|
68
69
|
flex:0 0 auto;
|
|
69
70
|
min-width:0;
|
|
71
|
+
max-width:none;
|
|
70
72
|
}
|
|
71
73
|
.${o}[data-columnwidth="fixed"] .${o}__column{
|
|
72
74
|
flex:0 0 var(--lattice-kanban-column-width,280px);
|
|
@@ -348,7 +350,7 @@
|
|
|
348
350
|
flat board, applied to the lane × column grid template. */
|
|
349
351
|
.${o}[data-swimlanes="true"][data-columnwidth="fill"] .${o}__colheads,
|
|
350
352
|
.${o}[data-swimlanes="true"][data-columnwidth="fill"] .${o}__lanerow{
|
|
351
|
-
grid-template-columns:var(--lattice-kanban-lane-label,160px) repeat(var(--cols,1), minmax(var(--lattice-kanban-column-min,240px), 1fr));
|
|
353
|
+
grid-template-columns:var(--lattice-kanban-lane-label,160px) repeat(var(--cols,1), minmax(var(--lattice-kanban-column-min,240px), var(--lattice-kanban-column-max,1fr)));
|
|
352
354
|
}
|
|
353
355
|
.${o}[data-swimlanes="true"][data-columnwidth="fixed"] .${o}__colheads,
|
|
354
356
|
.${o}[data-swimlanes="true"][data-columnwidth="fixed"] .${o}__lanerow{
|
|
@@ -484,16 +486,16 @@
|
|
|
484
486
|
@media (prefers-color-scheme:dark){@scope ([data-theme="auto"]){:scope.${o},.${o}{
|
|
485
487
|
--lattice-kanban-card-shadow:0 1px 2px rgba(0,0,0,.45),0 1px 1px rgba(0,0,0,.3);
|
|
486
488
|
}}}
|
|
487
|
-
`.trim()}function ee(ne){const x=ne&&ne.documentElement;if(!x||x.getAttribute(k))return;x.setAttribute(k,"1");const s=ne.createElement("style");s.textContent=T(),(ne.head||ne.body||x).appendChild(s)}}),We("packages/modules/kanban/workflow.js",function(g,Z){"use strict";Object.defineProperty(g,"TRANSITIONS_WILDCARD",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"allowedTargets",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"laneRulesFor",{enumerable:!0,get:function(){return q}}),Object.defineProperty(g,"transitionRuleFor",{enumerable:!0,get:function(){return C}}),Object.defineProperty(g,"canMove",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"transitionError",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"requiredFor",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"missingRequired",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(g,"requiredError",{enumerable:!0,get:function(){return W}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isObject,T=o.isNil,ne=Z("packages/core/src/internal/paths.js").getPath,x="*";function s(O,I){return Object.prototype.hasOwnProperty.call(O,I)}function S(O){return O===x||T(O)?null:Array.isArray(O)?new Set(O.map(String)):null}function q(O,I){const N=O.laneRules&&O.laneRules.get(String(I??""))||{};return{transitions:k(N.transitions)?N.transitions:null,require:k(N.require)?N.require:null}}function C(O,I,N){if(N==null)return null;const b=q(O,I);return b.transitions&&s(b.transitions,N)?b.transitions[N]:O.transitions&&s(O.transitions,N)?O.transitions[N]:null}function M(O,I,N,b){if(N==null||String(N)===String(b))return!0;const a=S(C(O,I,N));return a===null?!0:a.has(String(b))}function K(O,I,N,b){const a=S(C(O,I,N)),m=a?[...a]:[];return`kanban.transition: a card in "${N}" cannot move to "${b}"`+(m.length?` — "${N}" allows ${m.map(l=>`"${l}"`).join(", ")}`:" — no column is allowed")}function H(O){return!k(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 G(O,I,N){const b=q(O,I),a=b.require&&s(b.require,N)?b.require[N]:O.require&&s(O.require,N)?O.require[N]:null;return Array.isArray(a)?a.map(H).filter(Boolean):[]}function ie(O,I,N,b){return G(O,I,N).filter(a=>{const m=ne(b,a.field);return T(m)||m===""})}function W(O,I,N,b){const a=b.map(m=>m.field).join(", ");return`kanban.require: moving into "${N}" requires ${a}.`}}),We("packages/modules/shared/drag-gesture.js",function(g,Z){"use strict";Object.defineProperty(g,"attachDragGesture",{enumerable:!0,get:function(){return ne}});const o=300,k=3,T=24,ee=12;function ne(x,s={}){const S=s.holdMs==null?o:s.holdMs,q=typeof s.canStart=="function"?s.canStart:null,C=typeof s.onStart=="function"?s.onStart:null,M=typeof s.onMove=="function"?s.onMove:null,K=typeof s.onEnd=="function"?s.onEnd:null,H=typeof s.onCancel=="function"?s.onCancel:null,G=typeof s.autoScroll=="function"?s.autoScroll:null,ie=Array.isArray(s.autoScroll)?s.autoScroll:[],W=x&&x.ownerDocument?x.ownerDocument:x;if(!x||!W||typeof x.addEventListener!="function")return()=>{};let O=null;function I(P,ae,he,be,Ne){if(he>=P&&he<P+T&&be>0){const xe=T-(he-P);return-Math.max(1,Math.round(ee*xe/T))}if(he>ae-T&&he<=ae&&be<Ne){const xe=T-(ae-he);return Math.max(1,Math.round(ee*xe/T))}return 0}function N(){const P=O;if(P){if(O=null,P.holdTimer&&clearTimeout(P.holdTimer),je(P),P.started&&P.pressed&&P.pressed.style&&(P.pressed.style.touchAction=P.prevTouchAction),P.pressed&&typeof P.pressed.releasePointerCapture=="function"&&P.pointerId!==void 0)try{P.pressed.releasePointerCapture(P.pointerId)}catch{}W.removeEventListener("pointermove",c),W.removeEventListener("pointerup",$),W.removeEventListener("pointercancel",A),W.removeEventListener("keydown",D),W.removeEventListener("pointerdown",U),W.removeEventListener("touchmove",d)}}function b(P){if(!P.started){if(P.started=!0,P.pressed&&P.pressed.style&&(P.prevTouchAction=P.pressed.style.touchAction||"",P.pressed.style.touchAction="none"),P.pressed&&typeof P.pressed.setPointerCapture=="function"&&P.pointerId!==void 0)try{P.pressed.setPointerCapture(P.pointerId)}catch{}C&&C(P.drag,P.downEvent),Se(P)}}function a(P,ae){const he=P.started;N(),he&&K&&K(P.drag,ae)}function m(P,ae){const he=P.started;N(),he&&H&&H(P.drag,ae)}function l(){const P=O;P&&!P.started&&b(P)}function c(P){const ae=O;if(!ae||P.pointerId!==void 0&&P.pointerId!==ae.pointerId)return;const he=typeof P.clientX=="number"?P.clientX:ae.lastX,be=typeof P.clientY=="number"?P.clientY:ae.lastY;if(ae.lastX=he,ae.lastY=be,ae.lastEvent=P,!ae.started){if(Math.hypot(he-ae.startX,be-ae.startY)<=k)return;if(ae.pointerType==="mouse")b(ae);else{N();return}}M&&M(ae.drag,P)}function d(P){O&&O.started&&typeof P.preventDefault=="function"&&P.preventDefault()}function $(P){const ae=O;ae&&(P.pointerId!==void 0&&P.pointerId!==ae.pointerId||a(ae,P))}function A(P){const ae=O;ae&&(P.pointerId!==void 0&&P.pointerId!==ae.pointerId||m(ae,P))}function D(P){O&&P.key==="Escape"&&m(O,P)}function U(P){const ae=O;ae&&P.pointerId!==void 0&&P.pointerId!==ae.pointerId&&m(ae,P)}function Q(P){if(P.button!=null&&P.button!==0||O)return;const ae=q?q(P):P.target||null;if(!ae)return;const he=typeof P.clientX=="number"?P.clientX:0,be=typeof P.clientY=="number"?P.clientY:0,Ne=P.pointerId,xe=P.pointerType||"mouse";O={drag:{el:ae,pointerId:Ne,pointerType:xe,startX:he,startY:be,lastX:he,lastY:be},pressed:ae,pointerId:Ne,pointerType:xe,startX:he,startY:be,lastX:he,lastY:be,started:!1,downEvent:P,lastEvent:P,holdTimer:null,prevTouchAction:"",frameId:null},xe!=="mouse"&&(O.holdTimer=setTimeout(l,S)),W.addEventListener("pointermove",c),W.addEventListener("pointerup",$),W.addEventListener("pointercancel",A),W.addEventListener("keydown",D),W.addEventListener("pointerdown",U),xe==="touch"&&W.addEventListener("touchmove",d,{passive:!1})}function Se(P){if(typeof requestAnimationFrame!="function"||!G&&!ie.length)return;function ae(){const he=O;if(!he||he!==P||!he.started){P.frameId=null;return}const be=G?G():ie;let Ne=!1;if(Array.isArray(be))for(const xe of be){if(!xe||typeof xe.getBoundingClientRect!="function")continue;const V=xe.getBoundingClientRect(),J=I(V.left,V.right,he.lastX,xe.scrollLeft,xe.scrollWidth-xe.clientWidth),re=I(V.top,V.bottom,he.lastY,xe.scrollTop,xe.scrollHeight-xe.clientHeight);J&&(xe.scrollLeft+=J,Ne=!0),re&&(xe.scrollTop+=re,Ne=!0)}Ne&&M&&he.lastEvent&&M(he.drag,he.lastEvent),P.frameId=requestAnimationFrame(ae)}P.frameId=requestAnimationFrame(ae)}function je(P){P.frameId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(P.frameId),P.frameId=null}return x.addEventListener("pointerdown",Q),()=>{N(),x.removeEventListener("pointerdown",Q)}}}),We("packages/modules/shared/token-scope.js",function(g,Z){"use strict";Object.defineProperty(g,"claimTokenScope",{enumerable:!0,get:function(){return k}});const o="lattice-tokens";function k(T,ee){const ne=ee||T.parentElement,x=T.classList.contains(o)||!!(ne&&ne.closest&&ne.closest(".lattice, .lattice-tokens"));return x||T.classList.add(o),()=>{x||T.classList.remove(o)}}}),We("packages/modules/shared/emitter.js",function(g,Z){"use strict";Object.defineProperty(g,"WILDCARD",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"gate",{enumerable:!0,get:function(){return q}});const k=Z("packages/core/src/internal/predicates.js").isFunction,ee=Z("packages/core/src/internal/warn.js").warnOnce,ne="*",x=new Set(["api","user","init","ai"]);function s(C,M){return C&&C.name?C.name:`#${M}`}class S{#t=new Map;#e;constructor(M="module"){this.#e=String(M)}on(M,K){if(!k(K))return()=>{};let H=this.#t.get(M);return H||(H=new Set,this.#t.set(M,H)),H.add(K),()=>this.off(M,K)}off(M,K){const H=this.#t.get(M);H&&H.delete(K)}count(M){const K=this.#t.get(M);return K?K.size:0}emit(M,K){const H=this.#t.get(M),G=this.#t.get(ne);if((!H||H.size===0)&&(!G||G.size===0))return;const ie={...K||null,type:M};H&&H.size&&this.#n([...H],ie,M),G&&G.size&&this.#n([...G],ie,ne)}#n(M,K,H){for(let G=0;G<M.length;G++)try{M[G](K)}catch(ie){ee(`${this.#e}.emit.throw:${H}:${s(M[G],G)}`,`${this.#e}: a '${H}' handler threw; other handlers were unaffected.`,ie)}}emitBefore(M,K,H){const G=H??(K&&K.origin),ie=x.has(G)?G:"user";let W=!1,O=null;const I=c=>{W=!0,c!=null&&O===null&&(O=String(c))},N={...K||null,type:M,origin:ie,get defaultPrevented(){return W},get reason(){return O},preventDefault(c){I(c)}},b=this.#t.get(M);if(!b||b.size===0)return!0;const a=[...b],m=()=>(W&&O===null&&(O="prevented"),W&&K&&typeof K=="object"&&(K.reason=O),!W),l=[];for(let c=0;c<a.length;c++){const d=a[c];try{const $=d(N);$&&k($.then)?l.push($):$===!1&&I("prevented")}catch($){I("error"),ee(`${this.#e}.beforeThrow:${M}:${s(d,c)}`,`${this.#e}: a '${M}' before-handler threw; the action was cancelled.`,$)}}return l.length===0?m():Promise.allSettled(l).then(c=>{for(const d of c)d.status==="rejected"?(I("error"),ee(`${this.#e}.beforeReject:${M}`,`${this.#e}: a '${M}' before-handler rejected; the action was cancelled.`,d.reason)):d.value===!1&&I("prevented");return m()})}clear(){this.#t.clear()}}function q(C,M,K,H,G){const ie=C.emitBefore(M,H,H.origin),W=()=>(C.emit(K,{...H,reason:H.reason||"prevented"}),!1);return ie===!1?W():ie&&k(ie.then)?ie.then(O=>O?G():W()):G()}}),We("packages/modules/kanban/view.js",function(g,Z){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"resolveReadonly",{enumerable:!0,get:function(){return c}}),Object.defineProperty(g,"renderPreserving",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(g,"renderBoard",{enumerable:!0,get:function(){return Ze}}),Object.defineProperty(g,"openDetail",{enumerable:!0,get:function(){return Je}}),Object.defineProperty(g,"closeDetail",{enumerable:!0,get:function(){return Le}}),Object.defineProperty(g,"startEdit",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(g,"installSelectionPainter",{enumerable:!0,get:function(){return pe}}),Object.defineProperty(g,"openRequiredForm",{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(g,"closeRequiredForm",{enumerable:!0,get:function(){return Ee}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,ne=Z("packages/core/src/internal/text.js").escapeHtml,x=Z("packages/modules/kanban/styles.js"),s=x.NS,S=x.injectStyles,C=Z("packages/modules/kanban/card-parts.js").avatarChip,M=Z("packages/modules/kanban/model.js"),K=M.windowRange,H=M.laneIdOf,ie=Z("packages/modules/kanban/workflow.js").canMove,O=Z("packages/modules/shared/drag-gesture.js").attachDragGesture,N=Z("packages/modules/shared/token-scope.js").claimTokenScope,b=Z("packages/modules/shared/emitter.js");Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return b.Emitter}});const a=Object.freeze({"kanban.board":"Board","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 m(e,t){const i=a[e];if(!i)return e;const p=t&&typeof t.count=="number"?t.count:NaN;return(typeof i=="string"?i:(p===1?i.one:i.other)||i.other).replace(/\{(\w+)\}/g,(h,E)=>t&&E in t?String(t[E]):h)}function l(e,t,i){const p=e&&e.config?e.config:{},f=p.messages&&k(p.messages.t)&&p.messages||p.grid&&p.grid.messages&&k(p.grid.messages.t)&&p.grid.messages||null;if(f){let h;try{h=f.t(t,i)}catch{h=null}if(typeof h=="string"&&h&&h!==t)return h}return m(t,i)}function c(e){if(e===!0)return()=>!0;if(!e||typeof e!="object")return()=>!1;const t=e.columns||{},i=e.cards||{};return({column:p,card:f}={})=>e.board===!0||!T(p)&&t[p]===!0||!T(f)&&i[f]===!0}function d(e,t,i,p,f,h=null){let v=`${t.fields.title||String(t.key)}, ${i.title}, ${p+1} of ${f}`;return t.assignees&&t.assignees.length&&(v+=`, ${l(e,"kanban.card.assignedTo",{names:t.assignees.map(F=>F.name).join(", ")})}`),t.due&&t.due.state&&(v+=`, ${l(e,t.due.state==="overdue"?"kanban.card.overdue":"kanban.card.dueSoon")}`),t.progressPct!==null&&t.progressPct!==void 0&&(v+=`, ${l(e,"kanban.card.progress",{percent:t.progressPct})}`),t.checklist&&t.checklist.total>0&&(v+=`, ${l(e,"kanban.card.checklist",{done:t.checklist.done,total:t.checklist.total})}`),h&&(h.level==="warn"||h.level==="breach")?`${v}, ${h.level==="breach"?"SLA breached":"ageing"}, age ${h.ageText}`:v}function $(e){return e.level==="breach"?`SLA breached — age ${e.ageText} (limit passed)`:e.level==="warn"?`Ageing — age ${e.ageText}`:`Age ${e.ageText}`}function A(e,t,i,p){const{ctx:f,doc:h,isReadonly:E}=e,v=h.createElement("li");v.className=`${s}__card`,v.setAttribute("role","listitem"),v.setAttribute("tabindex","-1"),v.setAttribute("data-key",String(t.key)),v.dataset.column=i.id;const F=e.sla&&k(e.sla.stateFor)?e.sla.stateFor(t):null;F&&F.level&&F.level!=="ok"&&(v.dataset.sla=F.level),t.blocked&&(v.dataset.blocked="true"),t.ready&&(v.dataset.ready="true"),v.setAttribute("aria-label",d(e,t,i,p,i.count,F)),v.setAttribute("aria-selected","false");const Y=E({column:i.id,card:t.key});Y&&v.setAttribute("aria-readonly","true");const ke=t.fields.accent;!T(ke)&&ke!==""&&(v.dataset.accent="",v.style.borderLeftColor=String(ke));const ce=e.config.cardRenderer;if(k(ce)){v.dataset.custom="true";const z=ce(t,{column:i,readonly:Y,el:v,doc:h});return typeof z=="string"?v.innerHTML=z:z&&z.nodeType&&v.appendChild(z),v}const we=[];!T(t.fields.cover)&&t.fields.cover!==""&&we.push(`<div class="${s}__cover" style="background-image:url(${ne(String(t.fields.cover))})" role="presentation"></div>`),t.fields.title&&we.push(`<div class="${s}__card-title">${ne(t.fields.title)}</div>`),t.fields.subtitle&&we.push(`<div class="${s}__card-subtitle">${ne(t.fields.subtitle)}</div>`),t.progressPct!==null&&t.progressPct!==void 0&&we.push(`<div class="${s}__progress" role="progressbar" aria-valuenow="${t.progressPct}" aria-valuemin="0" aria-valuemax="100"><span class="${s}__progress-bar" style="width:${t.progressPct}%"></span></div>`),t.checklist&&we.push(`<div class="${s}__checklist"><span class="${s}__checklist-done">${t.checklist.done}</span><span class="${s}__checklist-sep">/</span><span class="${s}__checklist-total">${t.checklist.total}</span></div>`),v.innerHTML=we.join("");const de=[],Ye=t.assignees||[];if(Ye.length){const z=f.cardSpecs.assignee||{},Ae=Number.isFinite(z.max)&&z.max>0?z.max:2,Be=Ye.slice(0,Ae),tt=h.createElement("span");tt.className=`${s}__avatars`;for(const u of Be)tt.appendChild(C(h,u));const n=Ye.length-Be.length;if(n>0){const u=h.createElement("span");u.className=`${s}__avatar ${s}__avatar--overflow`,u.textContent=`+${n}`,u.setAttribute("title",Ye.slice(Ae).map(_=>_.name).join(", ")),tt.appendChild(u)}de.push(tt)}if(t.fields.labels)for(const z of String(t.fields.labels).split(",").map(Ae=>Ae.trim()).filter(Boolean)){const Ae=h.createElement("span");Ae.className=`${s}__label`,Ae.textContent=z,t.labelTones&&t.labelTones[z]&&(Ae.dataset.tone=t.labelTones[z]),de.push(Ae)}if(t.due&&t.due.text){const z=h.createElement("span");if(z.className=`${s}__due`,t.due.state){z.dataset.state=t.due.state;const Ae=h.createElement("span");Ae.className=`${s}__due-icon`,Ae.setAttribute("aria-hidden","true"),Ae.textContent=t.due.state==="overdue"?"⚠":"◷",z.appendChild(Ae)}z.appendChild(h.createTextNode(t.due.text)),de.push(z)}if(t.fields.badges){const z=h.createElement("span");z.className=`${s}__badge`,z.textContent=t.fields.badges,t.badgeTone&&(z.dataset.tone=t.badgeTone),de.push(z)}if(f.pointsProperty&&t.hasPoints){const z=h.createElement("span");z.className=`${s}__badge`,z.setAttribute("data-role","points"),z.textContent=String(t.points),de.push(z)}if(F&&F.ageText&&(F.level==="warn"||F.level==="breach"||e.sla.config.showAge==="always"&&F.ageMs!==null)){const z=h.createElement("span");z.className=`${s}__age`,z.setAttribute("data-sla",F.level||""),z.setAttribute("title",$(F)),z.textContent=F.ageText,de.push(z)}if(t.explicitBlocked){const z=t.blockedReason,Ae=z?`${ue(e,"blocked")}: ${z}`:ue(e,"blocked"),Be=h.createElement("span");Be.className=`${s}__blocked`,Be.setAttribute("role","img"),Be.setAttribute("aria-label",Ae);const tt=h.createElement("span");if(tt.className=`${s}__blocked-icon`,tt.setAttribute("aria-hidden","true"),tt.textContent="⛔",Be.appendChild(tt),z){const n=h.createElement("span");n.className=`${s}__blocked-reason`,n.textContent=z,Be.appendChild(n)}de.push(Be)}if(t.ready){const z=h.createElement("span");z.className=`${s}__ready`,z.setAttribute("role","img"),z.setAttribute("aria-label",ue(e,"ready")),z.textContent=`✓ ${ue(e,"ready")}`,de.push(z)}if(de.length){const z=h.createElement("div");z.className=`${s}__card-meta`;for(const Ae of de)z.appendChild(Ae);v.appendChild(z)}if(t.blockedBy&&t.blockedBy.length){const z=h.createElement("div");z.className=`${s}__blockedby`,z.setAttribute("role","group"),z.setAttribute("aria-label",l(e,"kanban.blockedBy",{count:t.blockedBy.length}));for(const Ae of t.blockedBy){const Be=e.model.cardsByKey.get(Ae),tt=Be&&Be.fields.title||String(Ae),n=h.createElement("button");n.type="button",n.className=`${s}__blockedby-chip`,n.dataset.blocker=String(Ae),n.textContent=tt,z.appendChild(n)}v.appendChild(z)}return v}function D(e,t){const{ctx:i,doc:p}=e,f=p.createElement("section");f.className=`${s}__column`,f.setAttribute("role","group"),f.dataset.column=t.id,t.collapsed&&(f.dataset.collapsed="true"),t.over&&(f.dataset.over="true");const h=`${s}-h-${J(t.id)}`,E=P(i,t,h,p);f.setAttribute("aria-labelledby",h),f.appendChild(E);const v=p.createElement("ul");if(v.className=`${s}__cards`,v.dataset.column=t.id,v.setAttribute("role","list"),v.setAttribute("aria-label",l(e,"kanban.columnCards",{title:t.title,count:t.count})),Q(e,v,t.cards,t),f.appendChild(v),e.config.addCard&&!e.isReadonly({column:t.id})){const F=p.createElement("button");F.className=`${s}__add`,F.setAttribute("type","button"),F.dataset.column=t.id;const Y=e.config.labels&&e.config.labels.addCard;F.setAttribute("aria-label",[Y,t.title].filter(Boolean).join(" ")),F.textContent=Y||"+",f.appendChild(F)}return f}function U(e,t,i,p){if(!e.sourceBound||!k(e.loadMore)||t.__loadWired)return;t.__loadWired=!0;const f=()=>{if(t.__loadRaf)return;const h=e.doc.defaultView,E=h&&k(h.requestAnimationFrame)?h.requestAnimationFrame.bind(h):(v=>setTimeout(v,16));t.__loadRaf=E(()=>{t.__loadRaf=0,t.scrollHeight-t.scrollTop-t.clientHeight<Math.max(t.clientHeight,200)*2&&e.loadMore(i.id,p)})};t.addEventListener("scroll",f)}function Q(e,t,i,p,f){const{ctx:h,doc:E}=e;for(;t.firstChild;)t.removeChild(t.firstChild);const v=(Y,ke)=>{const ce=A(e,Y,p,ke);f!==void 0&&(ce.dataset.lane=f),t.appendChild(ce)};if(!i.length){const Y=E.createElement("li");Y.className=`${s}__empty`,Y.setAttribute("role","presentation"),h.emptyText&&(Y.textContent=h.emptyText),t.appendChild(Y);return}const F=h.virtualize;if(F&&i.length>F.threshold){t.dataset.virtual="true";const Y=()=>{const ke=t.clientHeight||F.viewport,ce=K(t.scrollTop||0,ke,F.rowHeight,i.length,F.overscan),we=t.__win;if(!(we&&we.start===ce.start&&we.end===ce.end&&we.count===i.length)){for(t.__win={start:ce.start,end:ce.end,count:i.length};t.firstChild;)t.removeChild(t.firstChild);t.appendChild(je(E,ce.padTop));for(let de=ce.start;de<ce.end;de++)v(i[de],de);t.appendChild(je(E,ce.padBottom)),k(e.paintSelection)&&e.paintSelection()}};if(t.__win=null,Y(),!t.__virtualWired){const ke=()=>{if(t.__raf)return;const ce=E.defaultView,we=ce&&k(ce.requestAnimationFrame)?ce.requestAnimationFrame.bind(ce):(de=>setTimeout(de,16));t.__raf=we(()=>{t.__raf=0,Y()})};t.addEventListener("scroll",ke),t.__virtualWired=!0}U(e,t,p,f);return}i.forEach(v),U(e,t,p,f)}function Se(e){const{el:t,doc:i}=e,p=e.status||{};if(!p.loading&&!p.error)return;const f=i.createElement("div");if(f.className=`${s}__status`,p.error)f.dataset.kind="error",f.setAttribute("role","alert"),f.textContent=p.error;else{f.dataset.kind="loading",f.setAttribute("role","status"),f.setAttribute("aria-busy","true");const h=e.config.labels&&e.config.labels.loading;h&&(f.textContent=h)}t.appendChild(f)}function je(e,t){const i=e.createElement("li");return i.className=`${s}__spacer`,i.setAttribute("role","presentation"),i.style.height=`${t}px`,i}function P(e,t,i,p){const f=p.createElement("div");f.className=`${s}__header`,f.id=i,f.dataset.column=t.id,f.appendChild(ae(t.collapsed,p));const h=p.createElement("span");h.className=`${s}__headcontent`;const E=[];t.color&&E.push(`<span class="${s}__accent" style="background:${ne(String(t.color))}"></span>`),E.push(`<span class="${s}__title">${ne(t.title)}</span>`);const v=t.over?' data-over="true"':"";return E.push(`<span class="${s}__count"${v}>${t.count}${t.wipLimit!==null?`/${t.wipLimit}`:""}</span>`),e.showPoints&&e.pointsProperty&&E.push(`<span class="${s}__points" title="points">${V(t.points)}</span>`),h.innerHTML=E.join(""),f.appendChild(h),f}function ae(e,t){const i=t.createElement("button");return i.className=`${s}__toggle`,i.setAttribute("type","button"),i.setAttribute("tabindex","-1"),i.setAttribute("aria-expanded",e?"false":"true"),i.textContent=e?"▸":"▾",i}function he(e){const{el:t,ctx:i,doc:p}=e;t.dataset.swimlanes="true";const f=e.model.columns,h=p.createElement("div");h.className=`${s}__colheads`,h.style.setProperty("--cols",String(f.length));const E=p.createElement("div");E.className=`${s}__corner`,h.appendChild(E);for(const v of f)h.appendChild(P(i,v,`${s}-h-${J(v.id)}`,p));t.appendChild(h);for(const v of e.model.lanes){const F=p.createElement("section");F.className=`${s}__lane`,F.dataset.lane=v.id,v.collapsed&&(F.dataset.collapsed="true"),F.setAttribute("role","group");const Y=p.createElement("div");Y.className=`${s}__lanehead`,Y.dataset.lane=v.id,Y.appendChild(ae(v.collapsed,p));const ke=p.createElement("span");ke.className=`${s}__headcontent`;const ce=i.showPoints&&i.pointsProperty?`<span class="${s}__points">${V(v.points)}</span>`:"";if(ke.innerHTML=`<span class="${s}__lane-title">${ne(v.title)}</span><span class="${s}__count">${v.count}</span>${ce}`,Y.appendChild(ke),F.appendChild(Y),!v.collapsed){const we=p.createElement("div");we.className=`${s}__lanerow`,we.style.setProperty("--cols",String(f.length));const de=p.createElement("div");de.className=`${s}__corner`,we.appendChild(de);for(const Ye of v.columns){const z=p.createElement("ul");z.className=`${s}__cards`,z.dataset.column=Ye.id,z.dataset.lane=v.id,z.setAttribute("role","list"),z.setAttribute("aria-label",l(e,"kanban.laneCards",{lane:v.title,title:Ye.title,count:Ye.count}));const Ae=f.find(Be=>Be.id===Ye.id)||Ye;Q(e,z,Ye.cards,Ae,v.id),we.appendChild(z)}F.appendChild(we)}t.appendChild(F)}}function be(e){const{el:t,doc:i}=e;if(!t)return null;const p={};for(const h of t.querySelectorAll(`.${s}__cards`))p[`${h.dataset.lane||""}|${h.dataset.column}`]=h.scrollTop;const f=i&&i.activeElement&&i.activeElement.closest?i.activeElement.closest(`.${s}__card`):null;return{boardTop:t.scrollTop,boardLeft:t.scrollLeft,lists:p,focusKey:f?f.dataset.key:null}}function Ne(e,t){const{el:i}=e;if(!(!i||!t)){i.scrollTop=t.boardTop,i.scrollLeft=t.boardLeft;for(const p of i.querySelectorAll(`.${s}__cards`)){const f=`${p.dataset.lane||""}|${p.dataset.column}`;t.lists[f]!==void 0&&(p.scrollTop=t.lists[f])}if(t.focusKey!=null){const p=i.querySelector(`.${s}__card[data-key="${ct(String(t.focusKey))}"]`);p&&(p.setAttribute("tabindex","0"),p.focus&&p.focus())}}}function xe(e){if(!e.el)return;const t=be(e),i=e.detail,p=e.detailOverlay,f=p||i&&i.el;f&&f.parentNode&&f.parentNode.removeChild(f),e.detail=null,e.detailOverlay=null,Ze(e),i&&(e.el.appendChild(f),e.detail=i,e.detailOverlay=p),Ne(e,t)}function V(e){return Number.isInteger(e)?String(e):String(Math.round(e*100)/100)}function J(e){return String(e).replace(/[^\w-]/g,"_")}const re="data-lattice-row";function Ke(e){const t=[];for(const i of e.children)i.hasAttribute&&i.hasAttribute(re)&&t.push(i);return t}function Fe(e){const{el:t,ctx:i,doc:p}=e;if(!t)return;const f=p&&p.defaultView,h=f&&k(f.getComputedStyle)?f.getComputedStyle(t):null,E=h&&k(h.getPropertyValue)?String(h.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"),E)return;const v=i.columnWidth;if(typeof v=="number"){t.dataset.columnwidth="fixed",t.style.setProperty("--lattice-kanban-column-width",`${v}px`);return}v!=="auto"&&(t.dataset.columnwidth="fill",t.style.setProperty("--lattice-kanban-column-min",`${i.minColumnWidth}px`))}function Ze(e){const{el:t,ctx:i,doc:p}=e;if(!t)return;e.sla&&k(e.sla.sync)&&e.sla.sync(),S(p),oe(e),y(e),Le(e),t.classList.add(s),e._tokenScopeOff||(e._tokenScopeOff=N(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=Ke(t);for(;t.firstChild;)t.removeChild(t.firstChild);if(e.model.lanes)he(e);else{delete t.dataset.swimlanes;for(const E of e.model.columns)t.appendChild(D(e,E))}Fe(e),Se(e);const h=p.createElement("div");h.className=`${s}__live`,h.setAttribute("aria-live","polite"),h.setAttribute("role","status"),h.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;",t.appendChild(h),e.live=h;for(const E of f)t.appendChild(E);w(t),e.paintSelection(),Qe(e),e.wired||(me(e),e.wired=!0)}function Qe(e){if(!e.el||!k(e.canExpand))return;const t=e.config.labels&&e.config.labels.expand;for(const i of e.el.querySelectorAll(`.${s}__card`)){const p=e.model.cardsByKey.get(Me(e,i.dataset.key));if(!p||!e.canExpand(p))continue;const f=e.doc.createElement("button");f.className=`${s}__drill`,f.setAttribute("type","button"),f.setAttribute("tabindex","-1"),f.setAttribute("aria-label",[t,p.fields.title||String(p.key)].filter(Boolean).join(" ")),f.textContent="⤢",i.appendChild(f)}}function Je(e,t,i,p){if(!e.el)return null;Le(e);const{doc:f}=e,h=e.config.children&&e.config.children.present||"drawer",E=f.createElement("section");E.className=`${s}__detail`,E.dataset.present=h,E.dataset.depth=String(p),E.setAttribute("role",h==="modal"?"dialog":"group"),E.setAttribute("aria-modal",h==="modal"?"true":"false");const v=f.createElement("div");v.className=`${s}__detail-head`;const F=f.createElement("span");F.className=`${s}__detail-title`;const Y=e.config.children&&e.config.children.title;F.textContent=k(Y)?String(Y(t)):t.fields.title||String(t.key);const ke=f.createElement("button");ke.className=`${s}__detail-close`,ke.setAttribute("type","button");const ce=e.config.labels&&e.config.labels.close;ce&&ke.setAttribute("aria-label",ce),ke.textContent="✕",v.appendChild(F),v.appendChild(ke);const we=f.createElement("div");we.className=`${s}__detail-body`,E.appendChild(v),E.appendChild(we);let de=e.el;if(h==="modal"){const z=f.createElement("div");z.className=`${s}__overlay`,z.appendChild(E),e.el.appendChild(z),e.detailOverlay=z}else if(h==="inline"){const z=e.el.querySelector(`.${s}__card[data-key="${ct(String(t.key))}"]`);de=z&&z.parentNode?z.parentNode:e.el,z&&z.nextSibling?de.insertBefore(E,z.nextSibling):de.appendChild(E)}else e.el.appendChild(E);const Ye=e.buildChild(we,t,i,p);return e.detail={el:E,handle:Ye,card:t},ke.focus&&ke.focus(),e.detail}function Le(e){if(!e.detail)return;const{handle:t,el:i}=e.detail;t&&k(t.destroy)&&t.destroy();const p=e.detailOverlay||i;p&&p.parentNode&&p.parentNode.removeChild(p),e.detail=null,e.detailOverlay=null}function Ie(e,t,i){if(!e.el)return null;y(e);const p=e.el.querySelector(`.${s}__card[data-key="${ct(String(t))}"]`);if(!p)return null;const f=e.model.cardsByKey.get(t),h=e.ctx.cardSpecs[i]||{},E=f&&f.fields[i]||"";if(k(h.editor)){const F=h.editor({card:f,field:i,value:E,commit:Y=>st(e,Y),cancel:()=>y(e)});return e.editing={key:t,field:i,custom:F},F&&F.el&&p.appendChild(F.el),F&&k(F.focus)?F.focus():F&&F.el&&F.el.focus&&F.el.focus(),e.editing}const v=e.doc.createElement("input");return v.className=`${s}__editor`,v.dataset.field=i,v.value=E,v.addEventListener("keydown",F=>{F.stopPropagation&&F.stopPropagation(),F.key==="Enter"?(F.preventDefault&&F.preventDefault(),st(e,v.value)):F.key==="Escape"&&(F.preventDefault&&F.preventDefault(),y(e))}),v.addEventListener("blur",()=>{e.editing&&e.editing.input===v&&st(e,v.value)}),e.editing={key:t,field:i,input:v},p.appendChild(v),v.focus&&v.focus(),v.select&&v.select(),e.editing}function st(e,t){const i=e.editing;i&&(e.editing=null,i.custom&&k(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 y(e){const t=e.editing;t&&(e.editing=null,t.custom&&k(t.custom.destroy)?t.custom.destroy():t.input&&t.input.parentNode&&t.input.parentNode.removeChild(t.input))}function w(e){const t=e.querySelector(`.${s}__card`);t&&t.setAttribute("tabindex","0")}function R(e,t){e.live&&(e.live.textContent=t)}function te(e,t,i){const p=t.length?e.model.cardsByKey.get(t[0]):null,f=p?p.columnId:"";R(e,l(e,"kanban.moveRefused",{from:f,to:i}))}function fe(e,t){const i=e.config.labels;return i&&typeof i[t]=="string"?i[t]:""}function ue(e,t){return fe(e,t)||l(e,`kanban.${t}`)}function se(e,t,i,p,f=""){const h=e.model.columns.find(Y=>Y.id===i),E=h?Math.max(h.count,p+1):p+1,v=t.fields.title||String(t.key),F=h?h.title:i;return[f,v,F,`${p+1}/${E}`].filter(Boolean).join(", ")}function pe(e){e.paintSelection=()=>{if(e.el)for(const t of e.el.querySelectorAll(`.${s}__card`)){const i=Me(e,t.dataset.key),p=e.selectionSet&&e.selectionSet.has(i);p?t.dataset.selected="true":delete t.dataset.selected,t.setAttribute("aria-selected",p?"true":"false")}}}function me(e){const{el:t}=e;t.addEventListener("click",i=>{if(i.target&&i.target.closest){if(i.target.closest(`.${s}__detail-close`)){i.preventDefault&&i.preventDefault(),e.closeDetail();return}const E=i.target.closest(`.${s}__add`);if(E){i.preventDefault&&i.preventDefault(),e.addCard(E.dataset.column);return}const v=i.target.closest(`.${s}__drill`);if(v){i.preventDefault&&i.preventDefault();const F=le(e,v);F&&e.expand(F.card.key);return}}const p=i.target&&i.target.closest?i.target.closest(`.${s}__blockedby-chip`):null;if(p){i.preventDefault&&i.preventDefault(),_e(e,p.dataset.blocker);return}const f=i.target&&i.target.closest?i.target.closest(`.${s}__toggle`):null;if(f){const E=f.closest(`.${s}__header, .${s}__lanehead`);i.preventDefault&&i.preventDefault(),E&&E.classList.contains(`${s}__lanehead`)?e.collapseLane(E.dataset.lane):E&&e.collapseColumn(E.dataset.column);return}const h=le(e,i.target);h&&(Pe(e,h.card,i),e.fire("card:click",{card:h.card,column:h.card.columnId,el:h.el,originalEvent:i}))}),t.addEventListener("dblclick",i=>{const p=le(e,i.target);if(p&&(e.fire("card:dblclick",{card:p.card,column:p.card.columnId,el:p.el,originalEvent:i}),k(e.editCard))){const f=Object.keys(e.ctx.cardSpecs).find(h=>e.isFieldEditable(h));f&&e.editCard(p.card.key,f)}}),t.addEventListener("contextmenu",i=>{const p=le(e,i.target);if(p){if($e(e)){it(e,p,i);return}e.fire("card:contextmenu",{card:p.card,column:p.card.columnId,el:p.el,originalEvent:i})}}),t.addEventListener("keydown",i=>gt(e,i)),O(t,{canStart:i=>{const p=i.target;if(!p||!p.closest)return null;const f=p.closest(`.${s}__lanehead`);if(f&&!le(e,p))return f;const h=p.closest(`.${s}__header`);if(h&&!le(e,p))return h;const E=le(e,p);return!E||e.isReadonly({column:E.card.columnId,card:E.card.key})?null:E.el},onStart:(i,p)=>{const f=i.el;if(f.classList.contains(`${s}__lanehead`)){e.laneDrag=f.dataset.lane;return}if(f.classList.contains(`${s}__header`)){e.colDrag=f.dataset.column;return}const h=le(e,f);if(!h||e.isReadonly({column:h.card.columnId,card:h.card.key}))return;const E=He(e,h.card.key);e.drag={keys:E},h.el.dataset.dragging="true",e.fire("drag:start",{keys:E,card:h.card,originalEvent:p})},onMove:(i,p)=>{if(e.colDrag||e.laneDrag||!e.drag)return;const f=ut(e,ot(e,p));if(!f)return;const h=X(e,f.columnId);rt(e,f.columnId,f.lane,h),h?Ue(e,f.columnId,f.index,e.drag.keys,f.lane):Ge(e)},onEnd:(i,p)=>{if(e.laneDrag){const v=ot(e,p),F=v&&v.closest?v.closest(`.${s}__lanehead`):null,Y=F?F.dataset.lane:null,ke=e.laneDrag;e.laneDrag=null,Y!==ke&&e.moveLane(ke,Y);return}if(e.colDrag){const v=ot(e,p),F=v&&v.closest?v.closest(`.${s}__header`):null,Y=F?F.dataset.column:null,ke=e.colDrag;e.colDrag=null,Y!==ke&&e.moveColumn(ke,Y);return}if(!e.drag)return;const f=ut(e,ot(e,p)),h=f&&X(e,f.columnId),E=e.drag.keys;L(e),ft(e),h?e.requestMove(E,f.columnId,f.index,f.lane):f&&te(e,E,f.columnId),e.fire("drag:end",{keys:E,originalEvent:p})},onCancel:(i,p)=>{if(e.colDrag=null,e.laneDrag=null,ft(e),e.drag){const f=e.drag.keys;L(e),e.fire("drag:end",{keys:f,originalEvent:p})}},autoScroll:[t]})}function le(e,t){const i=t&&t.closest?t.closest(`.${s}__card`):null;if(!i)return null;const p=e.model.cardsByKey.get(Me(e,i.dataset.key));return p?{el:i,card:p}:null}function _e(e,t){if(!e.el)return;const i=e.el.querySelector(`.${s}__card[data-key="${ct(String(t))}"]`);if(i){for(const p of e.el.querySelectorAll(`.${s}__card`))p.setAttribute("tabindex","-1");i.setAttribute("tabindex","0"),i.focus&&i.focus(),i.scrollIntoView&&i.scrollIntoView({block:"nearest"})}}function He(e,t){return e.selectionSet&&e.selectionSet.size>1&&e.selectionSet.has(t)?[...e.selectionSet]:(e.select(t,"set"),[t])}function Pe(e,t,i){if(e.config.selectable!==!1){if(i.ctrlKey||i.metaKey){e.select(t.key,"toggle");return}if(i.shiftKey){const p=e.model.columns.find(F=>F.id===t.columnId),f=p?p.cards.map(F=>F.key):[t.key],h=e.selectionAnchor,E=h!=null?f.indexOf(h):-1,v=f.indexOf(t.key);if(E>=0&&v>=0){const[F,Y]=E<v?[E,v]:[v,E];e.select(f.slice(F,Y+1),"set");return}}e.select(t.key,"set"),e.selectionAnchor=t.key}}function Me(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 lt(e,t,i,p){const f=e.model.columns.find(v=>v.id===t),h=f?f.cards.filter(v=>!p.includes(v.key)):[];if(T(i))return h.length;const E=h.findIndex(v=>v.key===i);return E<0?h.length:E}function ot(e,t){const i=e.doc;if(i&&k(i.elementFromPoint)&&typeof t.clientX=="number"&&typeof t.clientY=="number"){const p=i.elementFromPoint(t.clientX,t.clientY);if(p)return p}return t.target}function ut(e,t){const i=t&&t.closest?t.closest(`.${s}__cards`):null,p=i||(t&&t.closest?t.closest(`.${s}__column`):null);if(!p)return null;const f=p.dataset.column,h=i&&i.dataset.lane!==void 0?i.dataset.lane:void 0,E=t.closest?t.closest(`.${s}__card`):null,v=E?Me(e,E.dataset.key):null,F=(e.drag||e.grab||{}).keys||[];return{columnId:f,lane:h,index:mt(e,f,h,v,F)}}function mt(e,t,i,p,f){if(i===void 0)return lt(e,t,p,f);const h=(e.model.lanes||[]).find(Y=>Y.id===i),E=h&&h.columns.find(Y=>Y.id===t),v=E?E.cards.filter(Y=>!f.includes(Y.key)):[];if(T(p))return v.length;const F=v.findIndex(Y=>Y.key===p);return F<0?v.length:F}function Ue(e,t,i,p,f){Ge(e);const h=[...e.el.querySelectorAll(`.${s}__cards`)].find(Y=>Y.dataset.column===t&&(f===void 0||(Y.dataset.lane||"")===f));if(!h)return;const E=[...h.querySelectorAll(`.${s}__card`)].filter(Y=>!p.includes(Me(e,Y.dataset.key))),v=e.doc.createElement("li");v.className=`${s}__drop`,v.setAttribute("role","presentation");const F=E[i]||null;F?h.insertBefore(v,F):h.appendChild(v),e.dropMarker=v}function Ge(e){e.dropMarker&&e.dropMarker.parentNode&&e.dropMarker.parentNode.removeChild(e.dropMarker),e.dropMarker=null}function L(e){if(Ge(e),e.el)for(const t of e.el.querySelectorAll(`.${s}__card`))delete t.dataset.dragging;e.drag=null}function X(e,t){const i=(e.drag||e.grab||{}).keys||[];for(const p of i){const f=e.model.cardsByKey.get(p);if(f&&!ie(e.ctx,H(f.swimlane),f.columnId,t))return!1}return!0}function rt(e,t,i,p){ft(e);const f=[...e.el.querySelectorAll(`.${s}__cards`)].filter(h=>h.dataset.column===t&&(i===void 0||(h.dataset.lane||"")===i));for(const h of f){h.setAttribute("aria-dropeffect",p?"move":"none"),p||(h.dataset.nodrop="true");const E=h.closest(`.${s}__column`);E&&(E.setAttribute("aria-dropeffect",p?"move":"none"),p||(E.dataset.nodrop="true"))}}function ft(e){if(e.el)for(const t of e.el.querySelectorAll(`.${s}__column, .${s}__cards`))t.dataset.nodrop&&delete t.dataset.nodrop,t.hasAttribute&&t.hasAttribute("aria-dropeffect")&&t.removeAttribute("aria-dropeffect")}function ht(){return""}function Ve(e,t){if(!e.el)return;Ee(e);const{doc:i}=e,p=[],f=i.createElement("div");f.className=`${s}__reqform`,f.setAttribute("role","dialog");const h=i.createElement("div");h.className=`${s}__reqform-panel`;const E=i.createElement("div");E.className=`${s}__reqform-title`,E.textContent=l(e,"kanban.requiredTitle"),h.appendChild(E);for(const we of t.entries){const de=i.createElement("div");de.className=`${s}__reqform-field`;const Ye=i.createElement("label");Ye.className=`${s}__reqform-label`,Ye.textContent=we.label||String(we.field),de.appendChild(Ye);const z={value:ht()};if(k(we.editor)){const Ae=we.editor({card:we.card,field:we.field,value:z.value,commit:Be=>{z.value=Be},cancel:()=>Ee(e)});Ae&&Ae.el&&de.appendChild(Ae.el),z.editor=Ae}else{const Ae=i.createElement("input");Ae.className=`${s}__reqform-input`,Ae.value=z.value,Ae.addEventListener("input",()=>{z.value=Ae.value}),Ae.addEventListener("keydown",Be=>{Be.stopPropagation&&Be.stopPropagation(),Be.key==="Enter"?(Be.preventDefault&&Be.preventDefault(),v()):Be.key==="Escape"&&(Be.preventDefault&&Be.preventDefault(),Ee(e))}),de.appendChild(Ae),z.input=Ae}h.appendChild(de),p.push({entry:we,slot:z})}const v=async()=>{Ee(e);let we=!0;for(const de of p)if(!await e.applyRequired(de.entry.key,de.entry.field,de.slot.value)){we=!1;break}we&&await e.move(t.keys,t.toColumn,t.toIndex,t.toLane,{origin:t.origin})},F=i.createElement("div");F.className=`${s}__reqform-actions`;const Y=i.createElement("button");Y.setAttribute("type","button"),Y.className=`${s}__reqform-save`,Y.textContent=l(e,"kanban.requiredSave");const ke=i.createElement("button");ke.setAttribute("type","button"),ke.className=`${s}__reqform-cancel`,ke.textContent=l(e,"kanban.requiredCancel"),Y.addEventListener("click",v),ke.addEventListener("click",()=>Ee(e)),F.appendChild(Y),F.appendChild(ke),h.appendChild(F),f.appendChild(h),e.el.appendChild(f),e.reqform={overlay:f,controls:p,submit:v};const ce=p[0]&&p[0].slot;ce&&ce.editor&&k(ce.editor.focus)?ce.editor.focus():ce&&ce.input&&ce.input.focus&&ce.input.focus()}function Ee(e){const t=e.reqform;if(t){e.reqform=null;for(const i of t.controls)i.slot.editor&&k(i.slot.editor.destroy)&&i.slot.editor.destroy();t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay)}}function $e(e){const t=e.config.contextMenu;return k(t)||Array.isArray(t)&&t.length>0}function at(e,t){const i=e.config.contextMenu;if(k(i)){const p=e.selection().map(f=>e.model.cardsByKey.get(f)).filter(Boolean);return i(t,p)||[]}return Array.isArray(i)?i:[]}function it(e,t,i){i.preventDefault&&i.preventDefault(),oe(e);const p=at(e,t.card);if(!p.length)return;const f=e.doc.createElement("ul");f.className=`${s}__menu`,f.setAttribute("role","menu"),f.style.cssText=`position:absolute;left:${i.clientX||0}px;top:${i.clientY||0}px;`;for(const E of p){const v=e.doc.createElement("li");v.className=`${s}__menuitem`,v.setAttribute("role","menuitem"),v.setAttribute("tabindex","-1"),E.disabled&&v.setAttribute("aria-disabled","true"),v.textContent=E.label==null?"":String(E.label),v.addEventListener("click",F=>{if(F.preventDefault&&F.preventDefault(),E.disabled)return;const Y=e.selection().map(ke=>e.model.cardsByKey.get(ke)).filter(Boolean);k(E.action)&&E.action({card:t.card,cards:Y.length?Y:[t.card],board:e}),oe(e)}),f.appendChild(v)}e.el.appendChild(f),e.menu=f;const h=f.querySelector(`.${s}__menuitem`);h&&(h.setAttribute("tabindex","0"),h.focus&&h.focus())}function oe(e){e.menu&&e.menu.parentNode&&e.menu.parentNode.removeChild(e.menu),e.menu=null}function gt(e,t){if(e.editing)return;if(e.menu){t.key==="Escape"&&(t.preventDefault&&t.preventDefault(),oe(e));return}if(e.detail&&t.key==="Escape"){t.preventDefault&&t.preventDefault(),e.closeDetail();return}const{el:i}=e,p=t.target&&t.target.closest?t.target.closest(`.${s}__card`):null;if(!p)return;const f=e.model.cardsByKey.get(Me(e,p.dataset.key));if(!f)return;if(e.grab){et(e,t);return}if(t.key==="b"||t.key==="B"){if(e.isReadonly({column:f.columnId,card:f.key}))return;t.preventDefault&&t.preventDefault(),k(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:p,originalEvent:t});return}if(t.key===" "){if(e.isReadonly({column:f.columnId,card:f.key}))return;t.preventDefault&&t.preventDefault();const E=He(e,f.key),v=(e.model.columns.find(Y=>Y.id===f.columnId)?.cards||[]).filter(Y=>!E.includes(Y.key)),F=e.model.lanes?p.dataset.lane||"":void 0;e.grab={keys:E,columnId:f.columnId,index:Math.min(r(e,f),v.length),cardKey:f.key,laneId:F},R(e,se(e,f,f.columnId,e.grab.index,fe(e,"grabbed"))),Ue(e,e.grab.columnId,e.grab.index,E,F);return}const h=yt(i,p,t.key);h&&(t.preventDefault&&t.preventDefault(),p.setAttribute("tabindex","-1"),h.setAttribute("tabindex","0"),h.focus&&h.focus())}function r(e,t){const i=e.model.columns.find(p=>p.id===t.columnId);return i?i.cards.findIndex(p=>p.key===t.key):0}function et(e,t){const i=e.grab,p=e.model.cardsByKey.get(i.cardKey),f=e.model.columns,h=f.findIndex(v=>v.id===i.columnId);if(t.key==="Escape"){t.preventDefault&&t.preventDefault(),Ge(e),e.grab=null,R(e,[fe(e,"cancelled"),p.fields.title||String(p.key)].filter(Boolean).join(", "));return}if(t.key==="Enter"||t.key===" "){t.preventDefault&&t.preventDefault();const{keys:v,columnId:F,index:Y,laneId:ke}=i;Ge(e),e.grab=null,Promise.resolve(e.requestMove(v,F,Y,e.model.lanes?ke:void 0)).then(ce=>{if(!ce)return;const we=e.model.cardsByKey.get(p.key);if(we){R(e,se(e,we,we.columnId,r(e,we),fe(e,"dropped")));const de=e.el.querySelector(`.${s}__card[data-key="${ct(String(p.key))}"]`);de&&de.focus&&(de.setAttribute("tabindex","0"),de.focus())}});return}const E=e.model.lanes;if(E&&t.altKey&&(t.key==="ArrowUp"||t.key==="ArrowDown")){const v=E.findIndex(ce=>ce.id===(i.laneId||"")),F=E[v+(t.key==="ArrowDown"?1:-1)];if(!F)return;i.laneId=F.id;const Y=F.columns.find(ce=>ce.id===i.columnId),ke=(Y?Y.cards:[]).filter(ce=>!i.keys.includes(ce.key));i.index=Math.min(i.index,ke.length)}else{const v=(f[h]?.cards||[]).filter(F=>!i.keys.includes(F.key));if(t.key==="ArrowUp")i.index=Math.max(0,i.index-1);else if(t.key==="ArrowDown")i.index=Math.min(v.length,i.index+1);else if(t.key==="ArrowLeft"||t.key==="ArrowRight"){const F=t.key==="ArrowRight"?1:-1;let Y=null;for(let ce=h+F;ce>=0&&ce<f.length;ce+=F){const we=f[ce];if(X(e,we.id)){Y=we;break}}if(!Y)return;i.columnId=Y.id;const ke=Y.cards.filter(ce=>!i.keys.includes(ce.key));i.index=Math.min(i.index,ke.length)}else return}t.preventDefault&&t.preventDefault(),Ue(e,i.columnId,i.index,i.keys,e.model.lanes?i.laneId:void 0),R(e,se(e,p,i.columnId,i.index,fe(e,"moved")))}function ct(e){return e.replace(/["\\]/g,"\\$&")}function yt(e,t,i){const p=t.closest(`.${s}__column`),f=[...p.querySelectorAll(`.${s}__card`)],h=f.indexOf(t);if(i==="ArrowUp")return f[h-1]||null;if(i==="ArrowDown")return f[h+1]||null;if(i==="Home")return f[0]||null;if(i==="End")return f[f.length-1]||null;if(i==="ArrowLeft"||i==="ArrowRight"){const E=[...e.querySelectorAll(`.${s}__column`)],v=E.indexOf(p),F=E[v+(i==="ArrowRight"?1:-1)];if(!F)return null;const Y=[...F.querySelectorAll(`.${s}__card`)];return Y.length?Y[Math.min(h,Y.length-1)]:null}return null}}),We("packages/core/src/internal/schedule.js",function(g,Z){"use strict";Object.defineProperty(g,"now",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return s}});function o(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const k=typeof requestAnimationFrame=="function";function T(S){return k?requestAnimationFrame(S):setTimeout(()=>S(o()),16)}function ee(S){S!=null&&(k?cancelAnimationFrame(S):clearTimeout(S))}function ne(S){let q=null,C=null;const M=()=>{q=null;const H=C;C=null,S(...H||[])},K=(...H)=>{C=H,q===null&&(q=T(M))};return K.cancel=()=>{ee(q),q=null,C=null},K.flush=()=>{q!==null&&(ee(q),M())},K}function x(S,q){let C=null,M=null;const K=()=>{if(C=null,M===null)return;const ie=M;M=null,S(...ie),H()},H=()=>{C=setTimeout(K,q),typeof C?.unref=="function"&&C.unref()},G=(...ie)=>{C===null?(S(...ie),H()):(M=ie,clearTimeout(C),H())};return G.flush=()=>{if(C!==null&&clearTimeout(C),C=null,M===null)return;const ie=M;M=null,S(...ie)},G.cancel=()=>{C!==null&&clearTimeout(C),C=null,M=null},G.pending=()=>C!==null||M!==null,G}function s(S,q=50){return typeof requestIdleCallback=="function"?requestIdleCallback(S,{timeout:q}):setTimeout(()=>S({timeRemaining:()=>0,didTimeout:!0}),1)}}),We("packages/modules/kanban/flow.js",function(g,Z){"use strict";Object.defineProperty(g,"moments",{enumerable:!0,get:function(){return q}}),Object.defineProperty(g,"quantileSorted",{enumerable:!0,get:function(){return C}}),Object.defineProperty(g,"quantile",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"bucketMs",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"summariseDurations",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(g,"TransitionLog",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"createFlowAnalytics",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"FlowAnalytics",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return N}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,ee=o.isObject,x=Z("packages/core/src/internal/warn.js").warnOnce,S=Z("packages/core/src/internal/schedule.js").now;function q(b){let a=0,m=0,l=0;for(let c=0;c<b.length;c++){const d=b[c];a++;const $=d-m;m+=$/a,l+=$*(d-m)}return{n:a,mean:m,m2:l}}function C(b,a){const m=b.length;if(!m)return NaN;if(m===1)return b[0];const l=(m-1)*Math.min(1,Math.max(0,a)),c=Math.floor(l),d=Math.ceil(l);return c===d?b[c]:b[c]+(l-c)*(b[d]-b[c])}function M(b,a){if(!b.length)return NaN;const m=b.slice().sort();return C(m,a)}const K=3600*1e3,H=Object.freeze({hour:K,day:24*K,week:168*K});function G(b){return typeof b=="number"&&Number.isFinite(b)&&b>0?b:H[b]||H.day}function ie(b){const a=[];for(const U of b||[])Number.isFinite(U)&&a.push(U);const m=Float64Array.from(a),l=m.length;if(!l)return{count:0,mean:null,median:null,p50:null,p85:null,p95:null,min:null,max:null,stdev:null,total:0};const c=q(m);let d=m[0],$=m[0],A=0;for(let U=0;U<l;U++){const Q=m[U];Q<d&&(d=Q),Q>$&&($=Q),A+=Q}const D=M(m,.5);return{count:l,mean:c.mean,median:D,p50:D,p85:M(m,.85),p95:M(m,.95),min:d,max:$,stdev:l>1?Math.sqrt(c.m2/(l-1)):0,total:A}}class W{entries=[];#t=new Map;#e;constructor(a={}){this.#e=k(a.now)?a.now:S}record(a){if(!ee(a)||T(a.key))return null;const m=a.key,l=T(a.to)?null:String(a.to),c=a.from===void 0?this.#t.has(m)?this.#t.get(m):null:T(a.from)?null:String(a.from),d=Number.isFinite(a.at)?Number(a.at):this.#e(),$={key:m,from:c,to:l,at:d};return this.entries.push($),this.#t.set(m,l),$}remove(a){if(!ee(a))return!1;const m=this.entries.lastIndexOf(a);if(m<0)return!1;this.entries.splice(m,1);let l;for(const c of this.entries)c.key===a.key&&(l=c);return l?this.#t.set(a.key,l.to):this.#t.delete(a.key),!0}hydrate(a){if(Array.isArray(a))for(const m of a)this.record(m);return this}all(){return this.entries.map(a=>({...a}))}byKey(){const a=new Map;for(const m of this.entries)a.has(m.key)||a.set(m.key,[]),a.get(m.key).push(m);for(const m of a.values())m.sort((l,c)=>l.at-c.at);return a}}function O(b,a={}){return new I(b,a)}class I{#t;#e;log;#n=[];#r;#o=new Map;#i=new Map;#s=new Map;constructor(a,m={}){this.#t=a,this.#e=ee(m)?m:{},this.#r=k(this.#e.now)?this.#e.now:S,this.log=new W({now:this.#r}),a&&k(a.on)&&(this.#n.push(a.on("card:move",l=>{const c=Array.isArray(l.keys)?l.keys:[],d=Array.isArray(l.from)?l.from:[],$=this.#r();c.forEach((A,D)=>{const U=this.log.record({key:A,from:d[D],to:l.to,at:$});U&&this.#o.set(A,U)})})),this.#n.push(a.on("card:reverted",l=>{const c=Array.isArray(l.keys)?l.keys:[];for(const d of c){const $=this.#o.get(d);$&&(this.log.remove($),this.#o.delete(d))}})),this.#n.push(a.on("card:confirmed",l=>{const c=Array.isArray(l.keys)?l.keys:[];for(const d of c)this.#o.delete(d)})),this.#n.push(a.on("card:add",l=>{this.log.record({key:l.key,from:null,to:l.column})})),this.#n.push(a.on("card:edit",l=>{if(!l||l.field!=="blocked")return;const c=l.value,d=typeof c=="string"?c.trim()!=="":!!c,$=this.#r();d?this.#i.has(l.key)||this.#i.set(l.key,{since:$}):this.#c(l.key,$)})))}seed(){if(Array.isArray(this.#e.history))return this.log.hydrate(this.#e.history),this;const a=this.#r(),m=k(this.#t.cards)?this.#t.cards():[];for(const l of m)this.log.record({key:l.key,from:null,to:l.columnId,at:a}),l.explicitBlocked&&this.#i.set(l.key,{since:a});return this}record(a){return this.log.record(a),this}transitions(){return this.log.all()}#l(){return(this.#t.model&&this.#t.model.columns||[]).map(m=>String(m.id))}#a(){const a=this.#l(),m=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)),l=new Set(Array.isArray(this.#e.startColumns)?this.#e.startColumns.map(String):a.slice(1).filter(d=>!m.has(d))),c=new Set(Array.isArray(this.#e.wipColumns)?this.#e.wipColumns.map(String):[...l]);return{order:a,done:m,start:l,wip:c}}perCard(){const{done:a,start:m}=this.#a(),l=this.log.byKey(),c=this.#r(),d=[];for(const[$,A]of l){const D=A[0].at;let U=null,Q=null;for(const be of A)U===null&&m.has(be.to)&&(U=be.at),Q===null&&a.has(be.to)&&(Q=be.at);const Se=A[A.length-1].to,je=Q===null?null:Q-D,P=Q===null||U===null||U>Q?null:Q-U,ae=this.#u($,c),he=P===null||P<=0?null:Math.max(0,Math.min(1,(P-ae)/P));d.push({key:$,arrivedAt:D,startedAt:U,doneAt:Q,leadTime:je,cycleTime:P,blockedTime:ae,flowEfficiency:he,column:Se})}return d}cycleTime(){return ie(this.perCard().map(a=>a.cycleTime).filter(a=>a!==null))}leadTime(){return ie(this.perCard().map(a=>a.leadTime).filter(a=>a!==null))}#c(a,m){const l=this.#i.get(a);l&&(Number.isFinite(m)&&m>l.since&&this.#s.set(a,(this.#s.get(a)||0)+(m-l.since)),this.#i.delete(a))}#u(a,m){let l=this.#s.get(a)||0;const c=this.#i.get(a);return c&&Number.isFinite(m)&&m>c.since&&(l+=m-c.since),l}blockedTime(){return ie(this.perCard().map(a=>a.blockedTime))}flowEfficiency(){return ie(this.perCard().map(a=>a.flowEfficiency).filter(a=>a!==null))}blockedTimeByColumn(){const a=new Map;for(const m of this.perCard()){const l=String(m.column);a.has(l)||a.set(l,{column:l,blockedMs:0,efficiencySum:0,efficiencyCount:0});const c=a.get(l);c.blockedMs+=m.blockedTime,m.flowEfficiency!==null&&(c.efficiencySum+=m.flowEfficiency,c.efficiencyCount+=1)}return[...a.values()].map(m=>({column:m.column,blockedMs:m.blockedMs,flowEfficiency:m.efficiencyCount?m.efficiencySum/m.efficiencyCount:null}))}#m(a,m,l){const c=[];for(let d=a;d<=m;d+=l)c.push(d);return(!c.length||c[c.length-1]<m)&&c.push(m),c}#d(a={}){const m=this.log.entries,l=m.length?m[0].at:0;let c=l;for(const d of m)d.at>c&&(c=d.at);return{from:Number.isFinite(a.from)?Number(a.from):l,to:Number.isFinite(a.to)?Number(a.to):c}}#f(a,m){const l=new Map;for(const[c,d]of a){let $;for(const A of d)if(A.at<=m)$=A.to;else break;$!==void 0&&l.set(c,$)}return l}cfd(a={}){const m=G(a.bucket),{order:l,done:c,wip:d}=this.#a(),$=this.log.byKey(),{from:A,to:D}=this.#d(a),U=[];if(this.log.entries.length)for(const Q of this.#m(A,D,m)){const Se=this.#f($,Q),je={};for(const be of l)je[be]=0;let P=0,ae=0,he=0;for(const be of Se.values())be in je||(je[be]=0),je[be]+=1,he+=1,d.has(be)&&(P+=1),c.has(be)&&(ae+=1);U.push({at:Q,counts:je,wip:P,done:ae,total:he})}return{bucket:m,columns:l,points:U}}wipOverTime(a={}){return this.cfd(a).points.map(m=>({at:m.at,wip:m.wip}))}throughput(a={}){const m=G(a.bucket),l=this.perCard().map(A=>A.doneAt).filter(A=>A!==null),{from:c,to:d}=this.#d(a),$=[];for(let A=c;A<=d;A+=m)$.push({at:A,count:0});$.length||$.push({at:c,count:0});for(const A of l){let D=Math.floor((A-c)/m);D<0&&(D=0),D>=$.length&&(D=$.length-1),$[D].count+=1}return $}#p(a,m){const l=new Date(a).toISOString();return m>=H.day?l.slice(0,10):l.slice(0,16).replace("T"," ")}chartData(a,m={}){const l=G(m.bucket);if(a==="cfd"){const{columns:c,points:d}=this.cfd(m),$=d.map(A=>{const D={t:this.#p(A.at,l)};for(const U of c)D[U]=A.counts[U]||0;return D});return{columns:[{id:"t",field:"t",title:"Date"},...c.map(A=>({id:A,field:A,title:A}))],rows:$,spec:{type:"area",x:"t",measures:c.map(A=>({col:A})),stack:!0,title:"Cumulative flow"}}}if(a==="wip"){const c=this.wipOverTime(m).map(d=>({t:this.#p(d.at,l),wip:d.wip}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"wip",field:"wip",title:"WIP"}],rows:c,spec:{type:"line",x:"t",y:{col:"wip"},title:"Work in progress"}}}if(a==="throughput"){const c=this.throughput(m).map(d=>({t:this.#p(d.at,l),count:d.count}));return{columns:[{id:"t",field:"t",title:"Date"},{id:"count",field:"count",title:"Completed"}],rows:c,spec:{type:"bar",x:"t",y:{col:"count"},title:"Throughput"}}}if(a==="cycleTime"||a==="leadTime"){const c=this.perCard().map(d=>a==="cycleTime"?d.cycleTime:d.leadTime).filter(d=>d!==null);return{columns:[{id:"v",field:"v",title:a==="cycleTime"?"Cycle time":"Lead time"}],rows:c.map(d=>({v:d})),spec:{type:"histogram",x:"v",title:a==="cycleTime"?"Cycle-time distribution":"Lead-time distribution"}}}return null}renderChart(a,m,l={}){const{createChart:c,createGrid:d,spec:$}=l;if(!k(c)||!k(d))return x("kanban:flow-chart-deps","flow.renderChart needs createChart and createGrid handed in (e.g. from 'lattice-grid/modules/charts' and 'lattice-grid')."),null;const A=this.chartData(a,l);if(!A)return x(`kanban:flow-chart-kind:${a}`,`"${a}" is not a flow chart; expected cfd, wip, throughput, cycleTime or leadTime.`),null;const D=d({columns:A.columns,rows:A.rows});return c({grid:D,container:m,...A.spec,...ee($)?$:{}})}destroy(){for(const a of this.#n)k(a)&&a();this.#n=[]}}const N=O}),We("packages/modules/kanban/sla.js",function(g,Z){"use strict";Object.defineProperty(g,"MIN_EPOCH",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"toMs",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"parseEpoch",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"resolveSlaConfig",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"formatAge",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"createSlaMonitor",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"SlaMonitor",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return m}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,ee=o.isObject,x=Z("packages/core/src/internal/warn.js").warnOnce,s=60*1e3,S=60*s,q=24*S,C=7*q,M=1e12,K=Object.freeze({weeks:C,week:C,w:C,days:q,day:q,d:q,hours:S,hour:S,h:S,minutes:s,minute:s,m:s,min:s,seconds:1e3,second:1e3,s:1e3,sec:1e3,ms:1,milliseconds:1});function H(l){if(typeof l=="number")return Number.isFinite(l)&&l>=0?l:null;if(ee(l)){let c=0,d=!1;for(const[$,A]of Object.entries(K)){const D=l[$];typeof D=="number"&&Number.isFinite(D)&&(c+=D*A,d=!0)}return d&&c>=0?c:null}return null}function G(l){if(T(l))return null;let c;if(l instanceof Date)c=l.getTime();else if(typeof l=="number")c=l;else if(typeof l=="string"){const d=l.trim();if(d==="")return null;c=/^-?\d+$/.test(d)?Number(d):Date.parse(d)}else return null;return!Number.isFinite(c)||c<M?null:c}function ie(l){return ee(l)&&("warn"in l||"breach"in l)?{warn:H(l.warn),breach:H(l.breach)}:{warn:null,breach:H(l)}}function W(l,c){return{warn:c.warn!==null?c.warn:l.warn,breach:c.breach!==null?c.breach:l.breach}}function O(l,c={}){const d=ee(l)?l:{},$={warn:H(d.warn),breach:H(d.breach)},A=new Map;if(Array.isArray(c.columns))for(const U of c.columns){if(!ee(U)||T(U.id)||U.sla===void 0&&U.slaWarn===void 0&&U.slaBreach===void 0)continue;const Q=ee(U.sla)||typeof U.sla=="number"?ie(U.sla):{warn:H(U.slaWarn),breach:H(U.slaBreach)};A.set(String(U.id),Q)}if(ee(d.columns))for(const[U,Q]of Object.entries(d.columns))A.set(String(U),W(A.get(String(U))||{warn:null,breach:null},ie(Q)));const D=new Map;if(ee(d.lanes))for(const[U,Q]of Object.entries(d.lanes))D.set(String(U),ie(Q));return{global:$,columns:A,lanes:D,basis:d.basis==="board"?"board":"column",enteredProperty:typeof d.enteredProperty=="string"?d.enteredProperty:null,createdProperty:typeof d.createdProperty=="string"?d.createdProperty:null,ignoreDone:d.ignoreDone!==!1,useTransitionLog:d.useTransitionLog!==!1,showAge:d.showAge==="always"?"always":"threshold",now:k(d.now)?d.now:(()=>Date.now()),tick:Number.isFinite(d.tick)&&d.tick>0?Number(d.tick):0,onWarn:k(d.onWarn)?d.onWarn:null,onBreach:k(d.onBreach)?d.onBreach:null}}function I(l){return!Number.isFinite(l)||l<0?"":l>=C?`${Math.floor(l/C)}w`:l>=q?`${Math.floor(l/q)}d`:l>=S?`${Math.floor(l/S)}h`:l>=s?`${Math.floor(l/s)}m`:"<1m"}const N=Object.freeze({ok:0,warn:1,breach:2});function b(l,c={}){return new a(l,c)}class a{#t;#e;#n=new Map;#r=new Map;#o=[];#i=null;#s=!1;constructor(c,d={}){if(this.#t=c,this.#e=O(d,c&&c.config),this.#e.global.warn===null&&this.#e.global.breach===null&&!this.#e.columns.size&&!this.#e.lanes.size&&x("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."),c&&k(c.on))for(const $ of["card:move","card:add","card:reverted"])this.#o.push(c.on($,()=>this.evaluate()))}get config(){return this.#e}#l(){if(!this.#e.useTransitionLog)return null;const c=this.#t.flow;return c&&c.log?c.log:null}#a(c,d){const $=c.row||{},{enteredProperty:A,createdProperty:D,basis:U}=this.#e,Q=d?d.get(c.key):null,Se=()=>{if(!Array.isArray(Q))return null;const be=String(c.columnId);for(let Ne=Q.length-1;Ne>=0;Ne--)if(String(Q[Ne].to)===be){const xe=Q[Ne].at;return Number.isFinite(xe)&&xe>=M?xe:null}return null},je=()=>{if(!Array.isArray(Q)||!Q.length)return null;const be=Q[0].at;return Number.isFinite(be)&&be>=M?be:null},P=()=>A?G($[A]):null,ae=()=>D?G($[D]):null,he=U==="board"?[ae,je,P]:[Se,P,je,ae];for(const be of he){const Ne=be();if(Ne!==null)return Ne}return null}#c(c){let d=this.#e.global;const $=this.#e.columns.get(String(c.columnId));$&&(d=W(d,$));const A=c.swimlane;if(!T(A)){const D=this.#e.lanes.get(String(A));D&&(d=W(d,D))}return d}#u(c){const d=this.#t.ctx&&this.#t.ctx.doneColumns;return!!(d&&d.has(String(c.columnId)))}#m(c,d,$){const{warn:A,breach:D}=this.#c(c),Q=this.#e.ignoreDone&&this.#u(c)?null:this.#a(c,$),Se=Q===null?null:Math.max(0,d-Q);let je=null;return Se!==null&&(D!==null&&Se>=D?je="breach":A!==null&&Se>=A?je="warn":je="ok"),{key:c.key,columnId:c.columnId,lane:c.swimlane,start:Q,ageMs:Se,ageText:Se===null?"":I(Se),warnMs:A,breachMs:D,level:je,breached:je==="breach"}}sync(){const c=this.#e.now(),d=this.#l()?this.#l().byKey():null,$=k(this.#t.cards)?this.#t.cards():[],A=new Map;for(const D of $)A.set(D.key,this.#m(D,c,d));return this.#n=A,this}evaluate(c={}){const d=c.emit!==!1;this.sync();const $=this.#e.now();for(const[A,D]of this.#n){const U=this.#r.has(A)?this.#r.get(A):null,Q=D.level;d&&Q&&(Q==="warn"||Q==="breach")&&N[Q]>(U==null?-1:N[U])&&this.#d(D,U,$),this.#r.set(A,Q)}for(const A of[...this.#r.keys()])this.#n.has(A)||this.#r.delete(A);return[...this.#n.values()]}#d(c,d,$){const A=this.#t.card?this.#t.card(c.key):null,D=A?A.row:void 0;this.#t.fire("card:sla",{key:c.key,card:A,level:c.level,previous:d,ageMs:c.ageMs,ageText:c.ageText,columnId:c.columnId,lane:c.lane,warnMs:c.warnMs,breachMs:c.breachMs,at:$});const U=c.level==="breach"?this.#e.onBreach:this.#e.onWarn;U&&U(c.level,D===void 0?[]:[D])}start(){if(this.#s)return this;this.#s=!0,this.sync();for(const c of this.#n.values())this.#r.set(c.key,c.level?"ok":null);return this.evaluate(),this.#e.tick>0&&(this.#i=setInterval(()=>{this.evaluate(),this.#t.el&&k(this.#t.repaint)&&this.#t.repaint()},this.#e.tick),this.#i&&k(this.#i.unref)&&this.#i.unref()),this}stateFor(c){const d=ee(c)&&"key"in c?c.key:c;return this.#n.get(d)||null}states(){return[...this.#n.values()]}breaches(){return this.states().filter(c=>c.level==="breach")}warnings(){return this.states().filter(c=>c.level==="warn")}destroy(){this.#i&&(clearInterval(this.#i),this.#i=null);for(const c of this.#o)k(c)&&c();this.#o=[]}}const m=b}),We("packages/modules/kanban/history.js",function(g,Z){"use strict";Object.defineProperty(g,"DEFAULT_DEPTH",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"createHistory",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"installUndoShortcuts",{enumerable:!0,get:function(){return s}});const k=Z("packages/core/src/internal/predicates.js").isFunction,T=100;function ee(S){return S&&Number.isInteger(S.historyDepth)&&S.historyDepth>=0?S.historyDepth:T}function ne(S={}){const q=ee(S);let C=[],M=[],K=!1;return Object.freeze({record(G){!k(G.undo)&&!k(G.redo)||(C.push(G),C.length>q&&C.shift(),M.length=0)},async undo(){return K?null:H("undo")},async redo(){return K?null:H("redo")},canUndo(){return C.length>0},canRedo(){return M.length>0},peek(G="undo"){const ie=G==="redo"?M:C,W=ie[ie.length-1];return W?W.label:null},clear(){C=[],M=[]},get replaying(){return K},get depth(){return C.length},get max(){return q}});async function H(G){const ie=G==="undo"?C:M,W=G==="undo"?M:C,O=ie[ie.length-1];if(!O)return null;const I=G==="undo"?O.undo:O.redo;K=!0;let N=!0;try{k(I)&&(N=await I())}catch{N=!1}finally{K=!1}return N===!1?{applied:!1,label:O.label}:(ie.pop(),W.push(O),{applied:!0,label:O.label})}}function x(S,q){for(let C=S;C&&C!==q;C=C.parentNode){const M=C.tagName?String(C.tagName).toLowerCase():"";if(M==="input"||M==="textarea"||M==="select"||C.isContentEditable||C.classList&&C.classList.contains("lattice"))return!0}return!1}function s(S){const{root:q,undo:C,redo:M}=S;if(!q||!k(q.addEventListener))return()=>{};const K=G=>{if(!G||!(G.ctrlKey||G.metaKey))return;const ie=typeof G.key=="string"?G.key.toLowerCase():"";let W;if(ie==="z"&&!G.shiftKey)W=C;else if(ie==="z"&&G.shiftKey||ie==="y")W=M;else return;if(x(G.target,q))return;const O=W();(O instanceof Promise||O!==!1)&&G.preventDefault()};return q.addEventListener("keydown",K),()=>q.removeEventListener("keydown",K)}}),We("packages/core/src/registry/free-tier-notice.js",function(g,Z){"use strict";Object.defineProperty(g,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"WATERMARK_TEXT",{enumerable:!0,get:function(){return k}});const o="Free for non-commercial use: latticegrid.dev/free",k="Unlicensed: Lattice Grid trial"}),We("packages/core/src/registry/licence.js",function(g,Z){"use strict";Object.defineProperty(g,"PRODUCT",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(g,"LICENCE_VERSION",{enumerable:!0,get:function(){return x}}),Object.defineProperty(g,"PUBLIC_KEY",{enumerable:!0,get:function(){return q}}),Object.defineProperty(g,"fromBase64Url",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"toBase64Url",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"asciiBytes",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"parseLicence",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"hasEd25519",{enumerable:!0,get:function(){return c}}),Object.defineProperty(g,"verifyLicence",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"isLocalHost",{enumerable:!0,get:function(){return $}}),Object.defineProperty(g,"currentHost",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"matchesDomain",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"LicenceHolder",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(g,"setLicence",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"licenceInfo",{enumerable:!0,get:function(){return he}}),Object.defineProperty(g,"watermark",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"licenceState",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(g,"sharedLicence",{enumerable:!0,get:function(){return xe}});const k=Z("packages/core/src/internal/warn.js").warnOnce,T=Z("packages/core/src/registry/free-tier-notice.js"),ee=T.FREE_TIER_NOTICE;Object.defineProperty(g,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return T.FREE_TIER_NOTICE}});const ne="lattice-grid",x=1,s="LG1",S=64,q="GwmaCOkGedHulqsa-DOV1TU8On1rsalWv519c_dW4j4",C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",M=(()=>{const V=new Int16Array(128).fill(-1);for(let J=0;J<C.length;J++)V[C.charCodeAt(J)]=J;return V[43]=62,V[47]=63,V})();function K(V){if(typeof V!="string")return null;let J="";for(let Je=0;Je<V.length;Je++){const Le=V.charCodeAt(Je);if(Le!==61){if(Le>127||M[Le]<0)return null;J+=V[Je]}}const re=J.length;if(re%4===1)return null;const Ke=new Uint8Array(Math.floor(re*3/4));let Fe=0,Ze=0,Qe=0;for(let Je=0;Je<re;Je++)Fe=Fe<<6|M[J.charCodeAt(Je)],Ze+=6,Ze>=8&&(Ze-=8,Ke[Qe++]=Fe>>Ze&255);return Qe===Ke.length?Ke:Ke.subarray(0,Qe)}function H(V){let J="",re=0;for(;re+2<V.length;re+=3){const Fe=V[re]<<16|V[re+1]<<8|V[re+2];J+=C[Fe>>18&63]+C[Fe>>12&63]+C[Fe>>6&63]+C[Fe&63]}const Ke=V.length-re;if(Ke===1){const Fe=V[re]<<16;J+=C[Fe>>18&63]+C[Fe>>12&63]}else if(Ke===2){const Fe=V[re]<<16|V[re+1]<<8;J+=C[Fe>>18&63]+C[Fe>>12&63]+C[Fe>>6&63]}return J}function G(V){const J=new Uint8Array(V.length);for(let re=0;re<V.length;re++)J[re]=V.charCodeAt(re)&127;return J}function ie(V){if(typeof TextDecoder=="function")return new TextDecoder().decode(V);let J="";for(let re=0;re<V.length;re++)J+=String.fromCharCode(V[re]);return J}function W(V){const J={ok:!1,reason:"malformed",product:null,issuedTo:null,expires:null,terms:null,features:[],deployments:[],version:0,message:null,signature:null,raw:typeof V=="string"?V:""};if(typeof V!="string"||V.length===0)return{...J,reason:"missing"};const re=V.trim(),Ke=re.split(".");if(Ke.length!==3)return J;const[Fe,Ze,Qe]=Ke;if(Fe!==s)return{...J,reason:"prefix"};const Je=K(Ze),Le=K(Qe);if(!Je||!Le)return J;let Ie;try{Ie=JSON.parse(ie(Je))}catch{return J}return Ie===null||typeof Ie!="object"?J:{ok:!0,reason:null,product:typeof Ie.p=="string"?Ie.p:null,issuedTo:typeof Ie.t=="string"?Ie.t:null,expires:typeof Ie.e=="string"?Ie.e:null,terms:typeof Ie.terms=="string"?Ie.terms:null,features:Array.isArray(Ie.f)?Ie.f.slice():[],deployments:Array.isArray(Ie.d)?Ie.d.slice():[],version:typeof Ie.v=="number"?Ie.v:0,message:G(Ze),signature:Le,raw:re}}function O(V,J){if(!V)return!1;const re=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(V)?`${V}T23:59:59.999Z`:V);return Number.isNaN(re)?!0:J>re}function I(V){return V==="non-commercial"?"non-commercial":"commercial"}let N=null,b=null,a=null;function m(){const V=globalThis.crypto;return V&&V.subtle?V.subtle:null}async function l(V){if(N&&b===V)return N;const J=m();if(!J)return null;const re=K(V);if(!re)return null;try{const Ke=await J.importKey("raw",re,{name:"Ed25519"},!1,["verify"]);return N=Ke,b=V,Ke}catch{return null}}async function c(){return a!==null||(a=await l(q)!==null),a}async function d(V,J={}){const re=J.warn!==!1,Ke=J.product||ne,Fe=J.publicKey||q,Ze=J.now??Date.now(),Qe=J.host??A(),Je=$(Qe)?"":` ${ee}`,Le=W(V);if(!Le.ok){const R=Le.reason==="missing"?"missing":"malformed";return re&&k(`licence.${R}`,R==="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.${Je}`:`licence key could not be read. The grid will render with a watermark.${Je}`),{valid:!1,reason:R,terms:"commercial"}}const Ie={product:Le.product||void 0,issuedTo:Le.issuedTo||void 0,expires:Le.expires||void 0,terms:I(Le.terms)};if(Le.product!==Ke)return re&&k("licence.product",`licence key is for '${Le.product}', not '${Ke}'. The grid will render with a watermark.`),{valid:!1,...Ie,reason:"product"};if(O(Le.expires,Ze))return re&&k("licence.expired",`licence expired on ${Le.expires}. The grid will render with a watermark. Renew at latticegrid.dev.`),{valid:!1,...Ie,reason:"expired"};const st=Le.deployments||[];if(st.length&&Qe&&!$(Qe)&&!D(Qe,st))return re&&k("licence.domain",`licence key is not valid for ${Qe}; it covers ${st.join(", ")}. The grid will render with a watermark.`),{valid:!1,...Ie,reason:"domain"};const y=await l(Fe);if(!y){const R=!!Le.signature&&Le.signature.length===S;return re&&k("licence.algorithm","this host does not provide crypto.subtle Ed25519, so the licence signature could not be verified. A structural check was used instead."),R?{valid:!0,...Ie,reason:"unverified"}:{valid:!1,...Ie,reason:"signature"}}let w=!1;try{w=await m().verify({name:"Ed25519"},y,Le.signature,Le.message)}catch{w=!1}return w?{valid:!0,...Ie}:(re&&k("licence.signature","licence signature is not valid. The grid will render with a watermark."),{valid:!1,...Ie,reason:"signature"})}function $(V){const J=String(V??A()??"").trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");return!J||J==="localhost"||J.endsWith(".localhost")||J==="::1"||J==="0:0:0:0:0:0:0:1"?!0:/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(J)}function A(){const V=globalThis.location;return V&&typeof V.hostname=="string"?V.hostname:null}function D(V,J){const re=U(V);return!re||!Array.isArray(J)?!1:J.some(Ke=>{const Fe=U(Ke);if(!Fe)return!1;if(Fe==="*")return!0;if(Fe.startsWith("*.")){const Ze=Fe.slice(2);return re===Ze||re.endsWith(`.${Ze}`)}return re===Fe})}function U(V){return String(V??"").trim().toLowerCase().replace(/\.$/,"")}class Q{#t="";#e={valid:!1,reason:"missing",terms:"commercial"};#n=null;#r=null;#o;#i=new Set;constructor(J={}){this.#o=J}set(J){this.#t=typeof J=="string"?J.trim():"";const re=W(this.#t);return this.#e=re.ok?{valid:!O(re.expires,Date.now())&&re.product===(this.#o.product||ne),product:re.product||void 0,issuedTo:re.issuedTo||void 0,expires:re.expires||void 0,terms:I(re.terms),reason:"pending"}:{valid:!1,reason:re.reason||"malformed",terms:"commercial"},this.#n=null,this.#t&&this.verify(),this.#e}verify(){if(this.#n)return this.#n;const J=this.#t;return this.#n=d(J,this.#o).then(re=>{if(this.#t===J){this.#e=re;for(const Ke of this.#i)Ke(re)}return re}),this.#n}onSettled(J){return this.#i.add(J),()=>this.#i.delete(J)}info(){return{...this.#e}}watermark(){return this.#e.valid?!1:!$(this.#r)}setHost(J){this.#r=J}state(){return this.#e.valid?"licensed":$(this.#r)?"localhost":"trial"}reset(){this.#t="",this.#e={valid:!1,reason:"missing",terms:"commercial"},this.#n=null,this.#i.clear()}}const Se=Symbol.for("lattice-grid/licence/holder");function je(){const V=globalThis,J=V&&V[Se];if(J&&typeof J.set=="function"&&typeof J.watermark=="function")return J;const re=new Q;if(V)try{V[Se]=re}catch{}return re}const P=je();function ae(V){return P.set(V)}function he(){return P.info()}function be(){return P.watermark()}function Ne(){return P.state()}function xe(){return P}}),We("packages/dom/src/watermark.js",function(g,Z){"use strict";Object.defineProperty(g,"WATERMARK_CLASS",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"WATERMARK_LAYER_CLASS",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"Watermark",{enumerable:!0,get:function(){return a}}),Object.defineProperty(g,"viewLicenceHost",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"mountViewWatermark",{enumerable:!0,get:function(){return l}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return c}});const k=Z("packages/core/src/internal/predicates.js").isFunction,T=Z("packages/core/src/registry/free-tier-notice.js"),ee=T.FREE_TIER_NOTICE,ne=T.WATERMARK_TEXT,x=Z("packages/core/src/registry/licence.js"),s=x.watermark,S=x.setLicence,q=Object.freeze({t:d=>d==="licence.watermark.free"?ee:ne});function C(d,$,A={}){const D=d.createElement($);if(A.class)for(const U of A.class.split(/\s+/))U&&D.classList.add(U);if(A.text!==void 0&&(D.textContent=A.text),A.attrs)for(const[U,Q]of Object.entries(A.attrs))D.setAttribute(U,Q);if(A.children)for(const U of A.children)D.appendChild(U);return D}function M(d,$,A){return d.addEventListener($,A),()=>d.removeEventListener($,A)}const K="lat-watermark",H="https://www.latticegrid.dev",G=["br","bl","tl","tr"],ie=4e3,W=Symbol.for("lattice-grid/licence/holder"),O="data-lat-watermark-owner",I="lat-watermark-layer",N="lat-watermark-style",b=`
|
|
489
|
+
`.trim()}function te(ne){const j=ne&&ne.documentElement;if(!j||j.getAttribute(k))return;j.setAttribute(k,"1");const l=ne.createElement("style");l.textContent=T(),(ne.head||ne.body||j).appendChild(l)}}),Ke("packages/modules/kanban/workflow.js",function(m,ee){"use strict";Object.defineProperty(m,"TRANSITIONS_WILDCARD",{enumerable:!0,get:function(){return j}}),Object.defineProperty(m,"allowedTargets",{enumerable:!0,get:function(){return S}}),Object.defineProperty(m,"laneRulesFor",{enumerable:!0,get:function(){return B}}),Object.defineProperty(m,"transitionRuleFor",{enumerable:!0,get:function(){return E}}),Object.defineProperty(m,"canMove",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"transitionError",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"requiredFor",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"missingRequired",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(m,"requiredError",{enumerable:!0,get:function(){return K}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isObject,T=o.isNil,ne=ee("packages/core/src/internal/paths.js").getPath,j="*";function l(P,I){return Object.prototype.hasOwnProperty.call(P,I)}function S(P){return P===j||T(P)?null:Array.isArray(P)?new Set(P.map(String)):null}function B(P,I){const N=P.laneRules&&P.laneRules.get(String(I??""))||{};return{transitions:k(N.transitions)?N.transitions:null,require:k(N.require)?N.require:null}}function E(P,I,N){if(N==null)return null;const w=B(P,I);return w.transitions&&l(w.transitions,N)?w.transitions[N]:P.transitions&&l(P.transitions,N)?P.transitions[N]:null}function R(P,I,N,w){if(N==null||String(N)===String(w))return!0;const a=S(E(P,I,N));return a===null?!0:a.has(String(w))}function q(P,I,N,w){const a=S(E(P,I,N)),h=a?[...a]:[];return`kanban.transition: a card in "${N}" cannot move to "${w}"`+(h.length?` — "${N}" allows ${h.map(c=>`"${c}"`).join(", ")}`:" — no column is allowed")}function U(P){return!k(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 Z(P,I,N){const w=B(P,I),a=w.require&&l(w.require,N)?w.require[N]:P.require&&l(P.require,N)?P.require[N]:null;return Array.isArray(a)?a.map(U).filter(Boolean):[]}function ie(P,I,N,w){return Z(P,I,N).filter(a=>{const h=ne(w,a.field);return T(h)||h===""})}function K(P,I,N,w){const a=w.map(h=>h.field).join(", ");return`kanban.require: moving into "${N}" requires ${a}.`}}),Ke("packages/modules/shared/drag-gesture.js",function(m,ee){"use strict";Object.defineProperty(m,"attachDragGesture",{enumerable:!0,get:function(){return ne}});const o=300,k=3,T=24,te=12;function ne(j,l={}){const S=l.holdMs==null?o:l.holdMs,B=typeof l.canStart=="function"?l.canStart:null,E=typeof l.onStart=="function"?l.onStart:null,R=typeof l.onMove=="function"?l.onMove:null,q=typeof l.onEnd=="function"?l.onEnd:null,U=typeof l.onCancel=="function"?l.onCancel:null,Z=typeof l.autoScroll=="function"?l.autoScroll:null,ie=Array.isArray(l.autoScroll)?l.autoScroll:[],K=j&&j.ownerDocument?j.ownerDocument:j;if(!j||!K||typeof j.addEventListener!="function")return()=>{};let P=null;function I(O,oe,me,ye,Ie){if(me>=O&&me<O+T&&ye>0){const Ne=T-(me-O);return-Math.max(1,Math.round(te*Ne/T))}if(me>oe-T&&me<=oe&&ye<Ie){const Ne=T-(oe-me);return Math.max(1,Math.round(te*Ne/T))}return 0}function N(){const O=P;if(O){if(P=null,O.holdTimer&&clearTimeout(O.holdTimer),Se(O),O.started&&O.pressed&&O.pressed.style&&(O.pressed.style.touchAction=O.prevTouchAction),O.pressed&&typeof O.pressed.releasePointerCapture=="function"&&O.pointerId!==void 0)try{O.pressed.releasePointerCapture(O.pointerId)}catch{}K.removeEventListener("pointermove",u),K.removeEventListener("pointerup",_),K.removeEventListener("pointercancel",A),K.removeEventListener("keydown",W),K.removeEventListener("pointerdown",G),K.removeEventListener("touchmove",f)}}function w(O){if(!O.started){if(O.started=!0,O.pressed&&O.pressed.style&&(O.prevTouchAction=O.pressed.style.touchAction||"",O.pressed.style.touchAction="none"),O.pressed&&typeof O.pressed.setPointerCapture=="function"&&O.pointerId!==void 0)try{O.pressed.setPointerCapture(O.pointerId)}catch{}E&&E(O.drag,O.downEvent),Oe(O)}}function a(O,oe){const me=O.started;N(),me&&q&&q(O.drag,oe)}function h(O,oe){const me=O.started;N(),me&&U&&U(O.drag,oe)}function c(){const O=P;O&&!O.started&&w(O)}function u(O){const oe=P;if(!oe||O.pointerId!==void 0&&O.pointerId!==oe.pointerId)return;const me=typeof O.clientX=="number"?O.clientX:oe.lastX,ye=typeof O.clientY=="number"?O.clientY:oe.lastY;if(oe.lastX=me,oe.lastY=ye,oe.lastEvent=O,!oe.started){if(Math.hypot(me-oe.startX,ye-oe.startY)<=k)return;if(oe.pointerType==="mouse")w(oe);else{N();return}}R&&R(oe.drag,O)}function f(O){P&&P.started&&typeof O.preventDefault=="function"&&O.preventDefault()}function _(O){const oe=P;oe&&(O.pointerId!==void 0&&O.pointerId!==oe.pointerId||a(oe,O))}function A(O){const oe=P;oe&&(O.pointerId!==void 0&&O.pointerId!==oe.pointerId||h(oe,O))}function W(O){P&&O.key==="Escape"&&h(P,O)}function G(O){const oe=P;oe&&O.pointerId!==void 0&&O.pointerId!==oe.pointerId&&h(oe,O)}function X(O){if(O.button!=null&&O.button!==0||P)return;const oe=B?B(O):O.target||null;if(!oe)return;const me=typeof O.clientX=="number"?O.clientX:0,ye=typeof O.clientY=="number"?O.clientY:0,Ie=O.pointerId,Ne=O.pointerType||"mouse";P={drag:{el:oe,pointerId:Ie,pointerType:Ne,startX:me,startY:ye,lastX:me,lastY:ye},pressed:oe,pointerId:Ie,pointerType:Ne,startX:me,startY:ye,lastX:me,lastY:ye,started:!1,downEvent:O,lastEvent:O,holdTimer:null,prevTouchAction:"",frameId:null},Ne!=="mouse"&&(P.holdTimer=setTimeout(c,S)),K.addEventListener("pointermove",u),K.addEventListener("pointerup",_),K.addEventListener("pointercancel",A),K.addEventListener("keydown",W),K.addEventListener("pointerdown",G),Ne==="touch"&&K.addEventListener("touchmove",f,{passive:!1})}function Oe(O){if(typeof requestAnimationFrame!="function"||!Z&&!ie.length)return;function oe(){const me=P;if(!me||me!==O||!me.started){O.frameId=null;return}const ye=Z?Z():ie;let Ie=!1;if(Array.isArray(ye))for(const Ne of ye){if(!Ne||typeof Ne.getBoundingClientRect!="function")continue;const J=Ne.getBoundingClientRect(),Q=I(J.left,J.right,me.lastX,Ne.scrollLeft,Ne.scrollWidth-Ne.clientWidth),re=I(J.top,J.bottom,me.lastY,Ne.scrollTop,Ne.scrollHeight-Ne.clientHeight);Q&&(Ne.scrollLeft+=Q,Ie=!0),re&&(Ne.scrollTop+=re,Ie=!0)}Ie&&R&&me.lastEvent&&R(me.drag,me.lastEvent),O.frameId=requestAnimationFrame(oe)}O.frameId=requestAnimationFrame(oe)}function Se(O){O.frameId!=null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(O.frameId),O.frameId=null}return j.addEventListener("pointerdown",X),()=>{N(),j.removeEventListener("pointerdown",X)}}}),Ke("packages/modules/shared/token-scope.js",function(m,ee){"use strict";Object.defineProperty(m,"claimTokenScope",{enumerable:!0,get:function(){return k}});const o="lattice-tokens";function k(T,te){const ne=te||T.parentElement,j=T.classList.contains(o)||!!(ne&&ne.closest&&ne.closest(".lattice, .lattice-tokens"));return j||T.classList.add(o),()=>{j||T.classList.remove(o)}}}),Ke("packages/modules/shared/emitter.js",function(m,ee){"use strict";Object.defineProperty(m,"WILDCARD",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"Emitter",{enumerable:!0,get:function(){return S}}),Object.defineProperty(m,"gate",{enumerable:!0,get:function(){return B}});const k=ee("packages/core/src/internal/predicates.js").isFunction,te=ee("packages/core/src/internal/warn.js").warnOnce,ne="*",j=new Set(["api","user","init","ai"]);function l(E,R){return E&&E.name?E.name:`#${R}`}class S{#t=new Map;#e;constructor(R="module"){this.#e=String(R)}on(R,q){if(!k(q))return()=>{};let U=this.#t.get(R);return U||(U=new Set,this.#t.set(R,U)),U.add(q),()=>this.off(R,q)}off(R,q){const U=this.#t.get(R);U&&U.delete(q)}count(R){const q=this.#t.get(R);return q?q.size:0}emit(R,q){const U=this.#t.get(R),Z=this.#t.get(ne);if((!U||U.size===0)&&(!Z||Z.size===0))return;const ie={...q||null,type:R};U&&U.size&&this.#n([...U],ie,R),Z&&Z.size&&this.#n([...Z],ie,ne)}#n(R,q,U){for(let Z=0;Z<R.length;Z++)try{R[Z](q)}catch(ie){te(`${this.#e}.emit.throw:${U}:${l(R[Z],Z)}`,`${this.#e}: a '${U}' handler threw; other handlers were unaffected.`,ie)}}emitBefore(R,q,U){const Z=U??(q&&q.origin),ie=j.has(Z)?Z:"user";let K=!1,P=null;const I=u=>{K=!0,u!=null&&P===null&&(P=String(u))},N={...q||null,type:R,origin:ie,get defaultPrevented(){return K},get reason(){return P},preventDefault(u){I(u)}},w=this.#t.get(R);if(!w||w.size===0)return!0;const a=[...w],h=()=>(K&&P===null&&(P="prevented"),K&&q&&typeof q=="object"&&(q.reason=P),!K),c=[];for(let u=0;u<a.length;u++){const f=a[u];try{const _=f(N);_&&k(_.then)?c.push(_):_===!1&&I("prevented")}catch(_){I("error"),te(`${this.#e}.beforeThrow:${R}:${l(f,u)}`,`${this.#e}: a '${R}' before-handler threw; the action was cancelled.`,_)}}return c.length===0?h():Promise.allSettled(c).then(u=>{for(const f of u)f.status==="rejected"?(I("error"),te(`${this.#e}.beforeReject:${R}`,`${this.#e}: a '${R}' before-handler rejected; the action was cancelled.`,f.reason)):f.value===!1&&I("prevented");return h()})}clear(){this.#t.clear()}}function B(E,R,q,U,Z){const ie=E.emitBefore(R,U,U.origin),K=()=>(E.emit(q,{...U,reason:U.reason||"prevented"}),!1);return ie===!1?K():ie&&k(ie.then)?ie.then(P=>P?Z():K()):Z()}}),Ke("packages/modules/kanban/view.js",function(m,ee){"use strict";Object.defineProperty(m,"FALLBACK_EN",{enumerable:!0,get:function(){return a}}),Object.defineProperty(m,"resolveReadonly",{enumerable:!0,get:function(){return u}}),Object.defineProperty(m,"renderPreserving",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(m,"applyColumnWidths",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(m,"renderBoard",{enumerable:!0,get:function(){return Ge}}),Object.defineProperty(m,"openDetail",{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(m,"closeDetail",{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(m,"startEdit",{enumerable:!0,get:function(){return je}}),Object.defineProperty(m,"installSelectionPainter",{enumerable:!0,get:function(){return se}}),Object.defineProperty(m,"openRequiredForm",{enumerable:!0,get:function(){return rt}}),Object.defineProperty(m,"closeRequiredForm",{enumerable:!0,get:function(){return ft}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,ne=ee("packages/core/src/internal/text.js").escapeHtml,j=ee("packages/modules/kanban/styles.js"),l=j.NS,S=j.injectStyles,E=ee("packages/modules/kanban/card-parts.js").avatarChip,R=ee("packages/modules/kanban/model.js"),q=R.windowRange,U=R.laneIdOf,ie=ee("packages/modules/kanban/workflow.js").canMove,P=ee("packages/modules/shared/drag-gesture.js").attachDragGesture,N=ee("packages/modules/shared/token-scope.js").claimTokenScope,w=ee("packages/modules/shared/emitter.js");Object.defineProperty(m,"Emitter",{enumerable:!0,get:function(){return w.Emitter}});const a=Object.freeze({"kanban.board":"Board","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 h(e,t){const i=a[e];if(!i)return e;const s=t&&typeof t.count=="number"?t.count:NaN;return(typeof i=="string"?i:(s===1?i.one:i.other)||i.other).replace(/\{(\w+)\}/g,(b,L)=>t&&L in t?String(t[L]):b)}function c(e,t,i){const s=e&&e.config?e.config:{},p=s.messages&&k(s.messages.t)&&s.messages||s.grid&&s.grid.messages&&k(s.grid.messages.t)&&s.grid.messages||null;if(p){let b;try{b=p.t(t,i)}catch{b=null}if(typeof b=="string"&&b&&b!==t)return b}return h(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:s,card:p}={})=>e.board===!0||!T(s)&&t[s]===!0||!T(p)&&i[p]===!0}function f(e,t,i,s,p,b=null){let v=`${t.fields.title||String(t.key)}, ${i.title}, ${s+1} of ${p}`;return t.assignees&&t.assignees.length&&(v+=`, ${c(e,"kanban.card.assignedTo",{names:t.assignees.map(C=>C.name).join(", ")})}`),t.due&&t.due.state&&(v+=`, ${c(e,t.due.state==="overdue"?"kanban.card.overdue":"kanban.card.dueSoon")}`),t.progressPct!==null&&t.progressPct!==void 0&&(v+=`, ${c(e,"kanban.card.progress",{percent:t.progressPct})}`),t.checklist&&t.checklist.total>0&&(v+=`, ${c(e,"kanban.card.checklist",{done:t.checklist.done,total:t.checklist.total})}`),b&&(b.level==="warn"||b.level==="breach")?`${v}, ${b.level==="breach"?"SLA breached":"ageing"}, age ${b.ageText}`:v}function _(e){return e.level==="breach"?`SLA breached — age ${e.ageText} (limit passed)`:e.level==="warn"?`Ageing — age ${e.ageText}`:`Age ${e.ageText}`}function A(e,t,i,s){const{ctx:p,doc:b,isReadonly:L}=e,v=b.createElement("li");v.className=`${l}__card`,v.setAttribute("role","listitem"),v.setAttribute("tabindex","-1"),v.setAttribute("data-key",String(t.key)),v.dataset.column=i.id;const C=e.sla&&k(e.sla.stateFor)?e.sla.stateFor(t):null;C&&C.level&&C.level!=="ok"&&(v.dataset.sla=C.level),t.blocked&&(v.dataset.blocked="true"),t.ready&&(v.dataset.ready="true"),v.setAttribute("aria-label",f(e,t,i,s,i.count,C)),v.setAttribute("aria-selected","false");const V=L({column:i.id,card:t.key});V&&v.setAttribute("aria-readonly","true");const ve=t.fields.accent;!T(ve)&&ve!==""&&(v.dataset.accent="",v.style.borderLeftColor=String(ve));const ue=e.config.cardRenderer;if(k(ue)){v.dataset.custom="true";const H=ue(t,{column:i,readonly:V,el:v,doc:b});return typeof H=="string"?v.innerHTML=H:H&&H.nodeType&&v.appendChild(H),v}const be=[];!T(t.fields.cover)&&t.fields.cover!==""&&be.push(`<div class="${l}__cover" style="background-image:url(${ne(String(t.fields.cover))})" role="presentation"></div>`),t.fields.title&&be.push(`<div class="${l}__card-title">${ne(t.fields.title)}</div>`),t.fields.subtitle&&be.push(`<div class="${l}__card-subtitle">${ne(t.fields.subtitle)}</div>`),t.progressPct!==null&&t.progressPct!==void 0&&be.push(`<div class="${l}__progress" role="progressbar" aria-valuenow="${t.progressPct}" aria-valuemin="0" aria-valuemax="100"><span class="${l}__progress-bar" style="width:${t.progressPct}%"></span></div>`),t.checklist&&be.push(`<div class="${l}__checklist"><span class="${l}__checklist-done">${t.checklist.done}</span><span class="${l}__checklist-sep">/</span><span class="${l}__checklist-total">${t.checklist.total}</span></div>`),v.innerHTML=be.join("");const Ce=[],Xe=t.assignees||[];if(Xe.length){const H=p.cardSpecs.assignee||{},fe=Number.isFinite(H.max)&&H.max>0?H.max:2,Be=Xe.slice(0,fe),tt=b.createElement("span");tt.className=`${l}__avatars`;for(const mt of Be)tt.appendChild(E(b,mt));const nt=Xe.length-Be.length;if(nt>0){const mt=b.createElement("span");mt.className=`${l}__avatar ${l}__avatar--overflow`,mt.textContent=`+${nt}`,mt.setAttribute("title",Xe.slice(fe).map(wt=>wt.name).join(", ")),tt.appendChild(mt)}Ce.push(tt)}if(t.fields.labels)for(const H of String(t.fields.labels).split(",").map(fe=>fe.trim()).filter(Boolean)){const fe=b.createElement("span");fe.className=`${l}__label`,fe.textContent=H,t.labelTones&&t.labelTones[H]&&(fe.dataset.tone=t.labelTones[H]),Ce.push(fe)}if(t.due&&t.due.text){const H=b.createElement("span");if(H.className=`${l}__due`,t.due.state){H.dataset.state=t.due.state;const fe=b.createElement("span");fe.className=`${l}__due-icon`,fe.setAttribute("aria-hidden","true"),fe.textContent=t.due.state==="overdue"?"⚠":"◷",H.appendChild(fe)}H.appendChild(b.createTextNode(t.due.text)),Ce.push(H)}if(t.fields.badges){const H=b.createElement("span");H.className=`${l}__badge`,H.textContent=t.fields.badges,t.badgeTone&&(H.dataset.tone=t.badgeTone),Ce.push(H)}if(p.pointsProperty&&t.hasPoints){const H=b.createElement("span");H.className=`${l}__badge`,H.setAttribute("data-role","points"),H.textContent=String(t.points),Ce.push(H)}if(C&&C.ageText&&(C.level==="warn"||C.level==="breach"||e.sla.config.showAge==="always"&&C.ageMs!==null)){const H=b.createElement("span");H.className=`${l}__age`,H.setAttribute("data-sla",C.level||""),H.setAttribute("title",_(C)),H.textContent=C.ageText,Ce.push(H)}if(t.explicitBlocked){const H=t.blockedReason,fe=H?`${de(e,"blocked")}: ${H}`:de(e,"blocked"),Be=b.createElement("span");Be.className=`${l}__blocked`,Be.setAttribute("role","img"),Be.setAttribute("aria-label",fe);const tt=b.createElement("span");if(tt.className=`${l}__blocked-icon`,tt.setAttribute("aria-hidden","true"),tt.textContent="⛔",Be.appendChild(tt),H){const nt=b.createElement("span");nt.className=`${l}__blocked-reason`,nt.textContent=H,Be.appendChild(nt)}Ce.push(Be)}if(t.ready){const H=b.createElement("span");H.className=`${l}__ready`,H.setAttribute("role","img"),H.setAttribute("aria-label",de(e,"ready")),H.textContent=`✓ ${de(e,"ready")}`,Ce.push(H)}if(Ce.length){const H=b.createElement("div");H.className=`${l}__card-meta`;for(const fe of Ce)H.appendChild(fe);v.appendChild(H)}if(t.blockedBy&&t.blockedBy.length){const H=b.createElement("div");H.className=`${l}__blockedby`,H.setAttribute("role","group"),H.setAttribute("aria-label",c(e,"kanban.blockedBy",{count:t.blockedBy.length}));for(const fe of t.blockedBy){const Be=e.model.cardsByKey.get(fe),tt=Be&&Be.fields.title||String(fe),nt=b.createElement("button");nt.type="button",nt.className=`${l}__blockedby-chip`,nt.dataset.blocker=String(fe),nt.textContent=tt,H.appendChild(nt)}v.appendChild(H)}return v}function W(e,t){const{ctx:i,doc:s}=e,p=s.createElement("section");p.className=`${l}__column`,p.setAttribute("role","group"),p.dataset.column=t.id,t.collapsed&&(p.dataset.collapsed="true"),t.over&&(p.dataset.over="true");const b=`${l}-h-${Q(t.id)}`,L=O(i,t,b,s);p.setAttribute("aria-labelledby",b),p.appendChild(L);const v=s.createElement("ul");if(v.className=`${l}__cards`,v.dataset.column=t.id,v.setAttribute("role","list"),v.setAttribute("aria-label",c(e,"kanban.columnCards",{title:t.title,count:t.count})),X(e,v,t.cards,t),p.appendChild(v),e.config.addCard&&!e.isReadonly({column:t.id})){const C=s.createElement("button");C.className=`${l}__add`,C.setAttribute("type","button"),C.dataset.column=t.id;const V=e.config.labels&&e.config.labels.addCard;C.setAttribute("aria-label",[V,t.title].filter(Boolean).join(" ")),C.textContent=V||"+",p.appendChild(C)}return p}function G(e,t,i,s){if(!e.sourceBound||!k(e.loadMore)||t.__loadWired)return;t.__loadWired=!0;const p=()=>{if(t.__loadRaf)return;const b=e.doc.defaultView,L=b&&k(b.requestAnimationFrame)?b.requestAnimationFrame.bind(b):(v=>setTimeout(v,16));t.__loadRaf=L(()=>{t.__loadRaf=0,t.scrollHeight-t.scrollTop-t.clientHeight<Math.max(t.clientHeight,200)*2&&e.loadMore(i.id,s)})};t.addEventListener("scroll",p)}function X(e,t,i,s,p){const{ctx:b,doc:L}=e;for(;t.firstChild;)t.removeChild(t.firstChild);const v=(V,ve)=>{const ue=A(e,V,s,ve);p!==void 0&&(ue.dataset.lane=p),t.appendChild(ue)};if(!i.length){const V=L.createElement("li");V.className=`${l}__empty`,V.setAttribute("role","presentation"),b.emptyText&&(V.textContent=b.emptyText),t.appendChild(V);return}const C=b.virtualize;if(C&&i.length>C.threshold){t.dataset.virtual="true";const V=()=>{const ve=t.clientHeight||C.viewport,ue=q(t.scrollTop||0,ve,C.rowHeight,i.length,C.overscan),be=t.__win;if(!(be&&be.start===ue.start&&be.end===ue.end&&be.count===i.length)){for(t.__win={start:ue.start,end:ue.end,count:i.length};t.firstChild;)t.removeChild(t.firstChild);t.appendChild(Se(L,ue.padTop));for(let Ce=ue.start;Ce<ue.end;Ce++)v(i[Ce],Ce);t.appendChild(Se(L,ue.padBottom)),k(e.paintSelection)&&e.paintSelection()}};if(t.__win=null,V(),!t.__virtualWired){const ve=()=>{if(t.__raf)return;const ue=L.defaultView,be=ue&&k(ue.requestAnimationFrame)?ue.requestAnimationFrame.bind(ue):(Ce=>setTimeout(Ce,16));t.__raf=be(()=>{t.__raf=0,V()})};t.addEventListener("scroll",ve),t.__virtualWired=!0}G(e,t,s,p);return}i.forEach(v),G(e,t,s,p)}function Oe(e){const{el:t,doc:i}=e,s=e.status||{};if(!s.loading&&!s.error)return;const p=i.createElement("div");if(p.className=`${l}__status`,s.error)p.dataset.kind="error",p.setAttribute("role","alert"),p.textContent=s.error;else{p.dataset.kind="loading",p.setAttribute("role","status"),p.setAttribute("aria-busy","true");const b=e.config.labels&&e.config.labels.loading;b&&(p.textContent=b)}t.appendChild(p)}function Se(e,t){const i=e.createElement("li");return i.className=`${l}__spacer`,i.setAttribute("role","presentation"),i.style.height=`${t}px`,i}function O(e,t,i,s){const p=s.createElement("div");p.className=`${l}__header`,p.id=i,p.dataset.column=t.id,p.appendChild(oe(t.collapsed,s));const b=s.createElement("span");b.className=`${l}__headcontent`;const L=[];t.color&&L.push(`<span class="${l}__accent" style="background:${ne(String(t.color))}"></span>`),L.push(`<span class="${l}__title">${ne(t.title)}</span>`);const v=t.over?' data-over="true"':"";return L.push(`<span class="${l}__count"${v}>${t.count}${t.wipLimit!==null?`/${t.wipLimit}`:""}</span>`),e.showPoints&&e.pointsProperty&&L.push(`<span class="${l}__points" title="points">${J(t.points)}</span>`),b.innerHTML=L.join(""),p.appendChild(b),p}function oe(e,t){const i=t.createElement("button");return i.className=`${l}__toggle`,i.setAttribute("type","button"),i.setAttribute("tabindex","-1"),i.setAttribute("aria-expanded",e?"false":"true"),i.textContent=e?"▸":"▾",i}function me(e){const{el:t,ctx:i,doc:s}=e;t.dataset.swimlanes="true";const p=e.model.columns,b=s.createElement("div");b.className=`${l}__colheads`,b.style.setProperty("--cols",String(p.length));const L=s.createElement("div");L.className=`${l}__corner`,b.appendChild(L);for(const v of p)b.appendChild(O(i,v,`${l}-h-${Q(v.id)}`,s));t.appendChild(b);for(const v of e.model.lanes){const C=s.createElement("section");C.className=`${l}__lane`,C.dataset.lane=v.id,v.collapsed&&(C.dataset.collapsed="true"),C.setAttribute("role","group");const V=s.createElement("div");V.className=`${l}__lanehead`,V.dataset.lane=v.id,V.appendChild(oe(v.collapsed,s));const ve=s.createElement("span");ve.className=`${l}__headcontent`;const ue=i.showPoints&&i.pointsProperty?`<span class="${l}__points">${J(v.points)}</span>`:"";if(ve.innerHTML=`<span class="${l}__lane-title">${ne(v.title)}</span><span class="${l}__count">${v.count}</span>${ue}`,V.appendChild(ve),C.appendChild(V),!v.collapsed){const be=s.createElement("div");be.className=`${l}__lanerow`,be.style.setProperty("--cols",String(p.length));const Ce=s.createElement("div");Ce.className=`${l}__corner`,be.appendChild(Ce);for(const Xe of v.columns){const H=s.createElement("ul");H.className=`${l}__cards`,H.dataset.column=Xe.id,H.dataset.lane=v.id,H.setAttribute("role","list"),H.setAttribute("aria-label",c(e,"kanban.laneCards",{lane:v.title,title:Xe.title,count:Xe.count}));const fe=p.find(Be=>Be.id===Xe.id)||Xe;X(e,H,Xe.cards,fe,v.id),be.appendChild(H)}C.appendChild(be)}t.appendChild(C)}}function ye(e){const{el:t,doc:i}=e;if(!t)return null;const s={};for(const b of t.querySelectorAll(`.${l}__cards`))s[`${b.dataset.lane||""}|${b.dataset.column}`]=b.scrollTop;const p=i&&i.activeElement&&i.activeElement.closest?i.activeElement.closest(`.${l}__card`):null;return{boardTop:t.scrollTop,boardLeft:t.scrollLeft,lists:s,focusKey:p?p.dataset.key:null}}function Ie(e,t){const{el:i}=e;if(!(!i||!t)){i.scrollTop=t.boardTop,i.scrollLeft=t.boardLeft;for(const s of i.querySelectorAll(`.${l}__cards`)){const p=`${s.dataset.lane||""}|${s.dataset.column}`;t.lists[p]!==void 0&&(s.scrollTop=t.lists[p])}if(t.focusKey!=null){const s=i.querySelector(`.${l}__card[data-key="${pt(String(t.focusKey))}"]`);s&&(s.setAttribute("tabindex","0"),s.focus&&s.focus())}}}function Ne(e){if(!e.el)return;const t=ye(e),i=e.detail,s=e.detailOverlay,p=s||i&&i.el;p&&p.parentNode&&p.parentNode.removeChild(p),e.detail=null,e.detailOverlay=null,Ge(e),i&&(e.el.appendChild(p),e.detail=i,e.detailOverlay=s),Ie(e,t)}function J(e){return Number.isInteger(e)?String(e):String(Math.round(e*100)/100)}function Q(e){return String(e).replace(/[^\w-]/g,"_")}const re="data-lattice-row";function De(e){const t=[];for(const i of e.children)i.hasAttribute&&i.hasAttribute(re)&&t.push(i);return t}function xe(e){const{el:t,ctx:i,doc:s}=e;if(!t)return;const p=s&&s.defaultView,b=p&&k(p.getComputedStyle)?p.getComputedStyle(t):null,L=b&&k(b.getPropertyValue)?String(b.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"),L)return;const v=i.columnWidth;if(typeof v=="number"){t.dataset.columnwidth="fixed",t.style.setProperty("--lattice-kanban-column-width",`${v}px`);return}v!=="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 Ge(e){const{el:t,ctx:i,doc:s}=e;if(!t)return;e.sla&&k(e.sla.sync)&&e.sla.sync(),S(s),ke(e),ct(e),Fe(e),t.classList.add(l),e._tokenScopeOff||(e._tokenScopeOff=N(t)),t.setAttribute("role","group"),t.setAttribute("aria-label",e.config.ariaLabel||c(e,"kanban.board")),e.isReadonly({})?t.dataset.readonly="true":delete t.dataset.readonly,t.dataset.density=i.density||"comfortable";const p=De(t);for(;t.firstChild;)t.removeChild(t.firstChild);if(e.model.lanes)me(e);else{delete t.dataset.swimlanes;for(const L of e.model.columns)t.appendChild(W(e,L))}xe(e),Oe(e);const b=s.createElement("div");b.className=`${l}__live`,b.setAttribute("aria-live","polite"),b.setAttribute("role","status"),b.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;",t.appendChild(b),e.live=b;for(const L of p)t.appendChild(L);g(t),e.paintSelection(),Je(e),e.wired||(le(e),e.wired=!0)}function Je(e){if(!e.el||!k(e.canExpand))return;const t=e.config.labels&&e.config.labels.expand;for(const i of e.el.querySelectorAll(`.${l}__card`)){const s=e.model.cardsByKey.get($e(e,i.dataset.key));if(!s||!e.canExpand(s))continue;const p=e.doc.createElement("button");p.className=`${l}__drill`,p.setAttribute("type","button"),p.setAttribute("tabindex","-1"),p.setAttribute("aria-label",[t,s.fields.title||String(s.key)].filter(Boolean).join(" ")),p.textContent="⤢",i.appendChild(p)}}function Ve(e,t,i,s){if(!e.el)return null;Fe(e);const{doc:p}=e,b=e.config.children&&e.config.children.present||"drawer",L=p.createElement("section");L.className=`${l}__detail`,L.dataset.present=b,L.dataset.depth=String(s),L.setAttribute("role",b==="modal"?"dialog":"group"),L.setAttribute("aria-modal",b==="modal"?"true":"false");const v=p.createElement("div");v.className=`${l}__detail-head`;const C=p.createElement("span");C.className=`${l}__detail-title`;const V=e.config.children&&e.config.children.title;C.textContent=k(V)?String(V(t)):t.fields.title||String(t.key);const ve=p.createElement("button");ve.className=`${l}__detail-close`,ve.setAttribute("type","button");const ue=e.config.labels&&e.config.labels.close;ue&&ve.setAttribute("aria-label",ue),ve.textContent="✕",v.appendChild(C),v.appendChild(ve);const be=p.createElement("div");be.className=`${l}__detail-body`,L.appendChild(v),L.appendChild(be);let Ce=e.el;if(b==="modal"){const H=p.createElement("div");H.className=`${l}__overlay`,H.appendChild(L),e.el.appendChild(H),e.detailOverlay=H}else if(b==="inline"){const H=e.el.querySelector(`.${l}__card[data-key="${pt(String(t.key))}"]`);Ce=H&&H.parentNode?H.parentNode:e.el,H&&H.nextSibling?Ce.insertBefore(L,H.nextSibling):Ce.appendChild(L)}else e.el.appendChild(L);const Xe=e.buildChild(be,t,i,s);return e.detail={el:L,handle:Xe,card:t},ve.focus&&ve.focus(),e.detail}function Fe(e){if(!e.detail)return;const{handle:t,el:i}=e.detail;t&&k(t.destroy)&&t.destroy();const s=e.detailOverlay||i;s&&s.parentNode&&s.parentNode.removeChild(s),e.detail=null,e.detailOverlay=null}function je(e,t,i){if(!e.el)return null;ct(e);const s=e.el.querySelector(`.${l}__card[data-key="${pt(String(t))}"]`);if(!s)return null;const p=e.model.cardsByKey.get(t),b=e.ctx.cardSpecs[i]||{},L=p&&p.fields[i]||"";if(k(b.editor)){const C=b.editor({card:p,field:i,value:L,commit:V=>lt(e,V),cancel:()=>ct(e)});return e.editing={key:t,field:i,custom:C},C&&C.el&&s.appendChild(C.el),C&&k(C.focus)?C.focus():C&&C.el&&C.el.focus&&C.el.focus(),e.editing}const v=e.doc.createElement("input");return v.className=`${l}__editor`,v.dataset.field=i,v.value=L,v.addEventListener("keydown",C=>{C.stopPropagation&&C.stopPropagation(),C.key==="Enter"?(C.preventDefault&&C.preventDefault(),lt(e,v.value)):C.key==="Escape"&&(C.preventDefault&&C.preventDefault(),ct(e))}),v.addEventListener("blur",()=>{e.editing&&e.editing.input===v&<(e,v.value)}),e.editing={key:t,field:i,input:v},s.appendChild(v),v.focus&&v.focus(),v.select&&v.select(),e.editing}function lt(e,t){const i=e.editing;i&&(e.editing=null,i.custom&&k(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 ct(e){const t=e.editing;t&&(e.editing=null,t.custom&&k(t.custom.destroy)?t.custom.destroy():t.input&&t.input.parentNode&&t.input.parentNode.removeChild(t.input))}function g(e){const t=e.querySelector(`.${l}__card`);t&&t.setAttribute("tabindex","0")}function y(e,t){e.live&&(e.live.textContent=t)}function D(e,t,i){const s=t.length?e.model.cardsByKey.get(t[0]):null,p=s?s.columnId:"";y(e,c(e,"kanban.moveRefused",{from:p,to:i}))}function Y(e,t){const i=e.config.labels;return i&&typeof i[t]=="string"?i[t]:""}function de(e,t){return Y(e,t)||c(e,`kanban.${t}`)}function Ae(e,t,i,s,p=""){const b=e.model.columns.find(V=>V.id===i),L=b?Math.max(b.count,s+1):s+1,v=t.fields.title||String(t.key),C=b?b.title:i;return[p,v,C,`${s+1}/${L}`].filter(Boolean).join(", ")}function se(e){e.paintSelection=()=>{if(e.el)for(const t of e.el.querySelectorAll(`.${l}__card`)){const i=$e(e,t.dataset.key),s=e.selectionSet&&e.selectionSet.has(i);s?t.dataset.selected="true":delete t.dataset.selected,t.setAttribute("aria-selected",s?"true":"false")}}}function le(e){const{el:t}=e;t.addEventListener("click",i=>{if(i.target&&i.target.closest){if(i.target.closest(`.${l}__detail-close`)){i.preventDefault&&i.preventDefault(),e.closeDetail();return}const L=i.target.closest(`.${l}__add`);if(L){i.preventDefault&&i.preventDefault(),e.addCard(L.dataset.column);return}const v=i.target.closest(`.${l}__drill`);if(v){i.preventDefault&&i.preventDefault();const C=ce(e,v);C&&e.expand(C.card.key);return}}const s=i.target&&i.target.closest?i.target.closest(`.${l}__blockedby-chip`):null;if(s){i.preventDefault&&i.preventDefault(),he(e,s.dataset.blocker);return}const p=i.target&&i.target.closest?i.target.closest(`.${l}__toggle`):null;if(p){const L=p.closest(`.${l}__header, .${l}__lanehead`);i.preventDefault&&i.preventDefault(),L&&L.classList.contains(`${l}__lanehead`)?e.collapseLane(L.dataset.lane):L&&e.collapseColumn(L.dataset.column);return}const b=ce(e,i.target);b&&(He(e,b.card,i),e.fire("card:click",{card:b.card,column:b.card.columnId,el:b.el,originalEvent:i}))}),t.addEventListener("dblclick",i=>{const s=ce(e,i.target);if(s&&(e.fire("card:dblclick",{card:s.card,column:s.card.columnId,el:s.el,originalEvent:i}),k(e.editCard))){const p=Object.keys(e.ctx.cardSpecs).find(b=>e.isFieldEditable(b));p&&e.editCard(s.card.key,p)}}),t.addEventListener("contextmenu",i=>{const s=ce(e,i.target);if(s){if(kt(e)){Re(e,s,i);return}e.fire("card:contextmenu",{card:s.card,column:s.card.columnId,el:s.el,originalEvent:i})}}),t.addEventListener("keydown",i=>st(e,i)),P(t,{canStart:i=>{const s=i.target;if(!s||!s.closest)return null;const p=s.closest(`.${l}__lanehead`);if(p&&!ce(e,s))return p;const b=s.closest(`.${l}__header`);if(b&&!ce(e,s))return b;const L=ce(e,s);return!L||e.isReadonly({column:L.card.columnId,card:L.card.key})?null:L.el},onStart:(i,s)=>{const p=i.el;if(p.classList.contains(`${l}__lanehead`)){e.laneDrag=p.dataset.lane;return}if(p.classList.contains(`${l}__header`)){e.colDrag=p.dataset.column;return}const b=ce(e,p);if(!b||e.isReadonly({column:b.card.columnId,card:b.card.key}))return;const L=we(e,b.card.key);e.drag={keys:L},b.el.dataset.dragging="true",e.fire("drag:start",{keys:L,card:b.card,originalEvent:s})},onMove:(i,s)=>{if(e.colDrag||e.laneDrag||!e.drag)return;const p=ut(e,it(e,s));if(!p)return;const b=at(e,p.columnId);dt(e,p.columnId,p.lane,b),b?gt(e,p.columnId,p.index,e.drag.keys,p.lane):Ye(e)},onEnd:(i,s)=>{if(e.laneDrag){const v=it(e,s),C=v&&v.closest?v.closest(`.${l}__lanehead`):null,V=C?C.dataset.lane:null,ve=e.laneDrag;e.laneDrag=null,V!==ve&&e.moveLane(ve,V);return}if(e.colDrag){const v=it(e,s),C=v&&v.closest?v.closest(`.${l}__header`):null,V=C?C.dataset.column:null,ve=e.colDrag;e.colDrag=null,V!==ve&&e.moveColumn(ve,V);return}if(!e.drag)return;const p=ut(e,it(e,s)),b=p&&at(e,p.columnId),L=e.drag.keys;ot(e),F(e),b?e.requestMove(L,p.columnId,p.index,p.lane):p&&D(e,L,p.columnId),e.fire("drag:end",{keys:L,originalEvent:s})},onCancel:(i,s)=>{if(e.colDrag=null,e.laneDrag=null,F(e),e.drag){const p=e.drag.keys;ot(e),e.fire("drag:end",{keys:p,originalEvent:s})}},autoScroll:[t]})}function ce(e,t){const i=t&&t.closest?t.closest(`.${l}__card`):null;if(!i)return null;const s=e.model.cardsByKey.get($e(e,i.dataset.key));return s?{el:i,card:s}:null}function he(e,t){if(!e.el)return;const i=e.el.querySelector(`.${l}__card[data-key="${pt(String(t))}"]`);if(i){for(const s of e.el.querySelectorAll(`.${l}__card`))s.setAttribute("tabindex","-1");i.setAttribute("tabindex","0"),i.focus&&i.focus(),i.scrollIntoView&&i.scrollIntoView({block:"nearest"})}}function we(e,t){return e.selectionSet&&e.selectionSet.size>1&&e.selectionSet.has(t)?[...e.selectionSet]:(e.select(t,"set"),[t])}function He(e,t,i){if(e.config.selectable!==!1){if(i.ctrlKey||i.metaKey){e.select(t.key,"toggle");return}if(i.shiftKey){const s=e.model.columns.find(C=>C.id===t.columnId),p=s?s.cards.map(C=>C.key):[t.key],b=e.selectionAnchor,L=b!=null?p.indexOf(b):-1,v=p.indexOf(t.key);if(L>=0&&v>=0){const[C,V]=L<v?[L,v]:[v,L];e.select(p.slice(C,V+1),"set");return}}e.select(t.key,"set"),e.selectionAnchor=t.key}}function $e(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 ze(e,t,i,s){const p=e.model.columns.find(v=>v.id===t),b=p?p.cards.filter(v=>!s.includes(v.key)):[];if(T(i))return b.length;const L=b.findIndex(v=>v.key===i);return L<0?b.length:L}function it(e,t){const i=e.doc;if(i&&k(i.elementFromPoint)&&typeof t.clientX=="number"&&typeof t.clientY=="number"){const s=i.elementFromPoint(t.clientX,t.clientY);if(s)return s}return t.target}function ut(e,t){const i=t&&t.closest?t.closest(`.${l}__cards`):null,s=i||(t&&t.closest?t.closest(`.${l}__column`):null);if(!s)return null;const p=s.dataset.column,b=i&&i.dataset.lane!==void 0?i.dataset.lane:void 0,L=t.closest?t.closest(`.${l}__card`):null,v=L?$e(e,L.dataset.key):null,C=(e.drag||e.grab||{}).keys||[];return{columnId:p,lane:b,index:bt(e,p,b,v,C)}}function bt(e,t,i,s,p){if(i===void 0)return ze(e,t,s,p);const b=(e.model.lanes||[]).find(V=>V.id===i),L=b&&b.columns.find(V=>V.id===t),v=L?L.cards.filter(V=>!p.includes(V.key)):[];if(T(s))return v.length;const C=v.findIndex(V=>V.key===s);return C<0?v.length:C}function gt(e,t,i,s,p){Ye(e);const b=[...e.el.querySelectorAll(`.${l}__cards`)].find(V=>V.dataset.column===t&&(p===void 0||(V.dataset.lane||"")===p));if(!b)return;const L=[...b.querySelectorAll(`.${l}__card`)].filter(V=>!s.includes($e(e,V.dataset.key))),v=e.doc.createElement("li");v.className=`${l}__drop`,v.setAttribute("role","presentation");const C=L[i]||null;C?b.insertBefore(v,C):b.appendChild(v),e.dropMarker=v}function Ye(e){e.dropMarker&&e.dropMarker.parentNode&&e.dropMarker.parentNode.removeChild(e.dropMarker),e.dropMarker=null}function ot(e){if(Ye(e),e.el)for(const t of e.el.querySelectorAll(`.${l}__card`))delete t.dataset.dragging;e.drag=null}function at(e,t){const i=(e.drag||e.grab||{}).keys||[];for(const s of i){const p=e.model.cardsByKey.get(s);if(p&&!ie(e.ctx,U(p.swimlane),p.columnId,t))return!1}return!0}function dt(e,t,i,s){F(e);const p=[...e.el.querySelectorAll(`.${l}__cards`)].filter(b=>b.dataset.column===t&&(i===void 0||(b.dataset.lane||"")===i));for(const b of p){b.setAttribute("aria-dropeffect",s?"move":"none"),s||(b.dataset.nodrop="true");const L=b.closest(`.${l}__column`);L&&(L.setAttribute("aria-dropeffect",s?"move":"none"),s||(L.dataset.nodrop="true"))}}function F(e){if(e.el)for(const t of e.el.querySelectorAll(`.${l}__column, .${l}__cards`))t.dataset.nodrop&&delete t.dataset.nodrop,t.hasAttribute&&t.hasAttribute("aria-dropeffect")&&t.removeAttribute("aria-dropeffect")}function z(){return""}function rt(e,t){if(!e.el)return;ft(e);const{doc:i}=e,s=[],p=i.createElement("div");p.className=`${l}__reqform`,p.setAttribute("role","dialog");const b=i.createElement("div");b.className=`${l}__reqform-panel`;const L=i.createElement("div");L.className=`${l}__reqform-title`,L.textContent=c(e,"kanban.requiredTitle"),b.appendChild(L);for(const be of t.entries){const Ce=i.createElement("div");Ce.className=`${l}__reqform-field`;const Xe=i.createElement("label");Xe.className=`${l}__reqform-label`,Xe.textContent=be.label||String(be.field),Ce.appendChild(Xe);const H={value:z()};if(k(be.editor)){const fe=be.editor({card:be.card,field:be.field,value:H.value,commit:Be=>{H.value=Be},cancel:()=>ft(e)});fe&&fe.el&&Ce.appendChild(fe.el),H.editor=fe}else{const fe=i.createElement("input");fe.className=`${l}__reqform-input`,fe.value=H.value,fe.addEventListener("input",()=>{H.value=fe.value}),fe.addEventListener("keydown",Be=>{Be.stopPropagation&&Be.stopPropagation(),Be.key==="Enter"?(Be.preventDefault&&Be.preventDefault(),v()):Be.key==="Escape"&&(Be.preventDefault&&Be.preventDefault(),ft(e))}),Ce.appendChild(fe),H.input=fe}b.appendChild(Ce),s.push({entry:be,slot:H})}const v=async()=>{ft(e);let be=!0;for(const Ce of s)if(!await e.applyRequired(Ce.entry.key,Ce.entry.field,Ce.slot.value)){be=!1;break}be&&await e.move(t.keys,t.toColumn,t.toIndex,t.toLane,{origin:t.origin})},C=i.createElement("div");C.className=`${l}__reqform-actions`;const V=i.createElement("button");V.setAttribute("type","button"),V.className=`${l}__reqform-save`,V.textContent=c(e,"kanban.requiredSave");const ve=i.createElement("button");ve.setAttribute("type","button"),ve.className=`${l}__reqform-cancel`,ve.textContent=c(e,"kanban.requiredCancel"),V.addEventListener("click",v),ve.addEventListener("click",()=>ft(e)),C.appendChild(V),C.appendChild(ve),b.appendChild(C),p.appendChild(b),e.el.appendChild(p),e.reqform={overlay:p,controls:s,submit:v};const ue=s[0]&&s[0].slot;ue&&ue.editor&&k(ue.editor.focus)?ue.editor.focus():ue&&ue.input&&ue.input.focus&&ue.input.focus()}function ft(e){const t=e.reqform;if(t){e.reqform=null;for(const i of t.controls)i.slot.editor&&k(i.slot.editor.destroy)&&i.slot.editor.destroy();t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay)}}function kt(e){const t=e.config.contextMenu;return k(t)||Array.isArray(t)&&t.length>0}function Ue(e,t){const i=e.config.contextMenu;if(k(i)){const s=e.selection().map(p=>e.model.cardsByKey.get(p)).filter(Boolean);return i(t,s)||[]}return Array.isArray(i)?i:[]}function Re(e,t,i){i.preventDefault&&i.preventDefault(),ke(e);const s=Ue(e,t.card);if(!s.length)return;const p=e.doc.createElement("ul");p.className=`${l}__menu`,p.setAttribute("role","menu"),p.style.cssText=`position:absolute;left:${i.clientX||0}px;top:${i.clientY||0}px;`;for(const L of s){const v=e.doc.createElement("li");v.className=`${l}__menuitem`,v.setAttribute("role","menuitem"),v.setAttribute("tabindex","-1"),L.disabled&&v.setAttribute("aria-disabled","true"),v.textContent=L.label==null?"":String(L.label),v.addEventListener("click",C=>{if(C.preventDefault&&C.preventDefault(),L.disabled)return;const V=e.selection().map(ve=>e.model.cardsByKey.get(ve)).filter(Boolean);k(L.action)&&L.action({card:t.card,cards:V.length?V:[t.card],board:e}),ke(e)}),p.appendChild(v)}e.el.appendChild(p),e.menu=p;const b=p.querySelector(`.${l}__menuitem`);b&&(b.setAttribute("tabindex","0"),b.focus&&b.focus())}function ke(e){e.menu&&e.menu.parentNode&&e.menu.parentNode.removeChild(e.menu),e.menu=null}function st(e,t){if(e.editing)return;if(e.menu){t.key==="Escape"&&(t.preventDefault&&t.preventDefault(),ke(e));return}if(e.detail&&t.key==="Escape"){t.preventDefault&&t.preventDefault(),e.closeDetail();return}const{el:i}=e,s=t.target&&t.target.closest?t.target.closest(`.${l}__card`):null;if(!s)return;const p=e.model.cardsByKey.get($e(e,s.dataset.key));if(!p)return;if(e.grab){ae(e,t);return}if(t.key==="b"||t.key==="B"){if(e.isReadonly({column:p.columnId,card:p.key}))return;t.preventDefault&&t.preventDefault(),k(e.toggleBlocked)&&e.toggleBlocked(p.key);return}if(t.key==="Enter"){t.preventDefault&&t.preventDefault(),e.fire("card:click",{card:p,column:p.columnId,el:s,originalEvent:t});return}if(t.key===" "){if(e.isReadonly({column:p.columnId,card:p.key}))return;t.preventDefault&&t.preventDefault();const L=we(e,p.key),v=(e.model.columns.find(V=>V.id===p.columnId)?.cards||[]).filter(V=>!L.includes(V.key)),C=e.model.lanes?s.dataset.lane||"":void 0;e.grab={keys:L,columnId:p.columnId,index:Math.min(et(e,p),v.length),cardKey:p.key,laneId:C},y(e,Ae(e,p,p.columnId,e.grab.index,Y(e,"grabbed"))),gt(e,e.grab.columnId,e.grab.index,L,C);return}const b=r(i,s,t.key);b&&(t.preventDefault&&t.preventDefault(),s.setAttribute("tabindex","-1"),b.setAttribute("tabindex","0"),b.focus&&b.focus())}function et(e,t){const i=e.model.columns.find(s=>s.id===t.columnId);return i?i.cards.findIndex(s=>s.key===t.key):0}function ae(e,t){const i=e.grab,s=e.model.cardsByKey.get(i.cardKey),p=e.model.columns,b=p.findIndex(v=>v.id===i.columnId);if(t.key==="Escape"){t.preventDefault&&t.preventDefault(),Ye(e),e.grab=null,y(e,[Y(e,"cancelled"),s.fields.title||String(s.key)].filter(Boolean).join(", "));return}if(t.key==="Enter"||t.key===" "){t.preventDefault&&t.preventDefault();const{keys:v,columnId:C,index:V,laneId:ve}=i;Ye(e),e.grab=null,Promise.resolve(e.requestMove(v,C,V,e.model.lanes?ve:void 0)).then(ue=>{if(!ue)return;const be=e.model.cardsByKey.get(s.key);if(be){y(e,Ae(e,be,be.columnId,et(e,be),Y(e,"dropped")));const Ce=e.el.querySelector(`.${l}__card[data-key="${pt(String(s.key))}"]`);Ce&&Ce.focus&&(Ce.setAttribute("tabindex","0"),Ce.focus())}});return}const L=e.model.lanes;if(L&&t.altKey&&(t.key==="ArrowUp"||t.key==="ArrowDown")){const v=L.findIndex(ue=>ue.id===(i.laneId||"")),C=L[v+(t.key==="ArrowDown"?1:-1)];if(!C)return;i.laneId=C.id;const V=C.columns.find(ue=>ue.id===i.columnId),ve=(V?V.cards:[]).filter(ue=>!i.keys.includes(ue.key));i.index=Math.min(i.index,ve.length)}else{const v=(p[b]?.cards||[]).filter(C=>!i.keys.includes(C.key));if(t.key==="ArrowUp")i.index=Math.max(0,i.index-1);else if(t.key==="ArrowDown")i.index=Math.min(v.length,i.index+1);else if(t.key==="ArrowLeft"||t.key==="ArrowRight"){const C=t.key==="ArrowRight"?1:-1;let V=null;for(let ue=b+C;ue>=0&&ue<p.length;ue+=C){const be=p[ue];if(at(e,be.id)){V=be;break}}if(!V)return;i.columnId=V.id;const ve=V.cards.filter(ue=>!i.keys.includes(ue.key));i.index=Math.min(i.index,ve.length)}else return}t.preventDefault&&t.preventDefault(),gt(e,i.columnId,i.index,i.keys,e.model.lanes?i.laneId:void 0),y(e,Ae(e,s,i.columnId,i.index,Y(e,"moved")))}function pt(e){return e.replace(/["\\]/g,"\\$&")}function r(e,t,i){const s=t.closest(`.${l}__column`),p=[...s.querySelectorAll(`.${l}__card`)],b=p.indexOf(t);if(i==="ArrowUp")return p[b-1]||null;if(i==="ArrowDown")return p[b+1]||null;if(i==="Home")return p[0]||null;if(i==="End")return p[p.length-1]||null;if(i==="ArrowLeft"||i==="ArrowRight"){const L=[...e.querySelectorAll(`.${l}__column`)],v=L.indexOf(s),C=L[v+(i==="ArrowRight"?1:-1)];if(!C)return null;const V=[...C.querySelectorAll(`.${l}__card`)];return V.length?V[Math.min(b,V.length-1)]:null}return null}}),Ke("packages/core/src/internal/schedule.js",function(m,ee){"use strict";Object.defineProperty(m,"now",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"nextFrame",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"cancelFrame",{enumerable:!0,get:function(){return te}}),Object.defineProperty(m,"frameBatched",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"settleDebounce",{enumerable:!0,get:function(){return j}}),Object.defineProperty(m,"whenIdle",{enumerable:!0,get:function(){return l}});function o(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const k=typeof requestAnimationFrame=="function";function T(S){return k?requestAnimationFrame(S):setTimeout(()=>S(o()),16)}function te(S){S!=null&&(k?cancelAnimationFrame(S):clearTimeout(S))}function ne(S){let B=null,E=null;const R=()=>{B=null;const U=E;E=null,S(...U||[])},q=(...U)=>{E=U,B===null&&(B=T(R))};return q.cancel=()=>{te(B),B=null,E=null},q.flush=()=>{B!==null&&(te(B),R())},q}function j(S,B){let E=null,R=null;const q=()=>{if(E=null,R===null)return;const ie=R;R=null,S(...ie),U()},U=()=>{E=setTimeout(q,B),typeof E?.unref=="function"&&E.unref()},Z=(...ie)=>{E===null?(S(...ie),U()):(R=ie,clearTimeout(E),U())};return Z.flush=()=>{if(E!==null&&clearTimeout(E),E=null,R===null)return;const ie=R;R=null,S(...ie)},Z.cancel=()=>{E!==null&&clearTimeout(E),E=null,R=null},Z.pending=()=>E!==null||R!==null,Z}function l(S,B=50){return typeof requestIdleCallback=="function"?requestIdleCallback(S,{timeout:B}):setTimeout(()=>S({timeRemaining:()=>0,didTimeout:!0}),1)}}),Ke("packages/modules/kanban/flow.js",function(m,ee){"use strict";Object.defineProperty(m,"moments",{enumerable:!0,get:function(){return B}}),Object.defineProperty(m,"quantileSorted",{enumerable:!0,get:function(){return E}}),Object.defineProperty(m,"quantile",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"bucketMs",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"summariseDurations",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(m,"TransitionLog",{enumerable:!0,get:function(){return K}}),Object.defineProperty(m,"createFlowAnalytics",{enumerable:!0,get:function(){return P}}),Object.defineProperty(m,"FlowAnalytics",{enumerable:!0,get:function(){return I}}),Object.defineProperty(m,"default",{enumerable:!0,get:function(){return N}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,te=o.isObject,j=ee("packages/core/src/internal/warn.js").warnOnce,S=ee("packages/core/src/internal/schedule.js").now;function B(w){let a=0,h=0,c=0;for(let u=0;u<w.length;u++){const f=w[u];a++;const _=f-h;h+=_/a,c+=_*(f-h)}return{n:a,mean:h,m2:c}}function E(w,a){const h=w.length;if(!h)return NaN;if(h===1)return w[0];const c=(h-1)*Math.min(1,Math.max(0,a)),u=Math.floor(c),f=Math.ceil(c);return u===f?w[u]:w[u]+(c-u)*(w[f]-w[u])}function R(w,a){if(!w.length)return NaN;const h=w.slice().sort();return E(h,a)}const q=3600*1e3,U=Object.freeze({hour:q,day:24*q,week:168*q});function Z(w){return typeof w=="number"&&Number.isFinite(w)&&w>0?w:U[w]||U.day}function ie(w){const a=[];for(const G of w||[])Number.isFinite(G)&&a.push(G);const h=Float64Array.from(a),c=h.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 u=B(h);let f=h[0],_=h[0],A=0;for(let G=0;G<c;G++){const X=h[G];X<f&&(f=X),X>_&&(_=X),A+=X}const W=R(h,.5);return{count:c,mean:u.mean,median:W,p50:W,p85:R(h,.85),p95:R(h,.95),min:f,max:_,stdev:c>1?Math.sqrt(u.m2/(c-1)):0,total:A}}class K{entries=[];#t=new Map;#e;constructor(a={}){this.#e=k(a.now)?a.now:S}record(a){if(!te(a)||T(a.key))return null;const h=a.key,c=T(a.to)?null:String(a.to),u=a.from===void 0?this.#t.has(h)?this.#t.get(h):null:T(a.from)?null:String(a.from),f=Number.isFinite(a.at)?Number(a.at):this.#e(),_={key:h,from:u,to:c,at:f};return this.entries.push(_),this.#t.set(h,c),_}remove(a){if(!te(a))return!1;const h=this.entries.lastIndexOf(a);if(h<0)return!1;this.entries.splice(h,1);let c;for(const u of this.entries)u.key===a.key&&(c=u);return c?this.#t.set(a.key,c.to):this.#t.delete(a.key),!0}hydrate(a){if(Array.isArray(a))for(const h of a)this.record(h);return this}all(){return this.entries.map(a=>({...a}))}byKey(){const a=new Map;for(const h of this.entries)a.has(h.key)||a.set(h.key,[]),a.get(h.key).push(h);for(const h of a.values())h.sort((c,u)=>c.at-u.at);return a}}function P(w,a={}){return new I(w,a)}class I{#t;#e;log;#n=[];#r;#o=new Map;#i=new Map;#s=new Map;constructor(a,h={}){this.#t=a,this.#e=te(h)?h:{},this.#r=k(this.#e.now)?this.#e.now:S,this.log=new K({now:this.#r}),a&&k(a.on)&&(this.#n.push(a.on("card:move",c=>{const u=Array.isArray(c.keys)?c.keys:[],f=Array.isArray(c.from)?c.from:[],_=this.#r();u.forEach((A,W)=>{const G=this.log.record({key:A,from:f[W],to:c.to,at:_});G&&this.#o.set(A,G)})})),this.#n.push(a.on("card:reverted",c=>{const u=Array.isArray(c.keys)?c.keys:[];for(const f of u){const _=this.#o.get(f);_&&(this.log.remove(_),this.#o.delete(f))}})),this.#n.push(a.on("card:confirmed",c=>{const u=Array.isArray(c.keys)?c.keys:[];for(const f of u)this.#o.delete(f)})),this.#n.push(a.on("card:add",c=>{this.log.record({key:c.key,from:null,to:c.column})})),this.#n.push(a.on("card:edit",c=>{if(!c||c.field!=="blocked")return;const u=c.value,f=typeof u=="string"?u.trim()!=="":!!u,_=this.#r();f?this.#i.has(c.key)||this.#i.set(c.key,{since:_}):this.#c(c.key,_)})))}seed(){if(Array.isArray(this.#e.history))return this.log.hydrate(this.#e.history),this;const a=this.#r(),h=k(this.#t.cards)?this.#t.cards():[];for(const c of h)this.log.record({key:c.key,from:null,to:c.columnId,at:a}),c.explicitBlocked&&this.#i.set(c.key,{since:a});return this}record(a){return this.log.record(a),this}transitions(){return this.log.all()}#l(){return(this.#t.model&&this.#t.model.columns||[]).map(h=>String(h.id))}#a(){const a=this.#l(),h=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):a.slice(1).filter(f=>!h.has(f))),u=new Set(Array.isArray(this.#e.wipColumns)?this.#e.wipColumns.map(String):[...c]);return{order:a,done:h,start:c,wip:u}}perCard(){const{done:a,start:h}=this.#a(),c=this.log.byKey(),u=this.#r(),f=[];for(const[_,A]of c){const W=A[0].at;let G=null,X=null;for(const ye of A)G===null&&h.has(ye.to)&&(G=ye.at),X===null&&a.has(ye.to)&&(X=ye.at);const Oe=A[A.length-1].to,Se=X===null?null:X-W,O=X===null||G===null||G>X?null:X-G,oe=this.#u(_,u),me=O===null||O<=0?null:Math.max(0,Math.min(1,(O-oe)/O));f.push({key:_,arrivedAt:W,startedAt:G,doneAt:X,leadTime:Se,cycleTime:O,blockedTime:oe,flowEfficiency:me,column:Oe})}return f}cycleTime(){return ie(this.perCard().map(a=>a.cycleTime).filter(a=>a!==null))}leadTime(){return ie(this.perCard().map(a=>a.leadTime).filter(a=>a!==null))}#c(a,h){const c=this.#i.get(a);c&&(Number.isFinite(h)&&h>c.since&&this.#s.set(a,(this.#s.get(a)||0)+(h-c.since)),this.#i.delete(a))}#u(a,h){let c=this.#s.get(a)||0;const u=this.#i.get(a);return u&&Number.isFinite(h)&&h>u.since&&(c+=h-u.since),c}blockedTime(){return ie(this.perCard().map(a=>a.blockedTime))}flowEfficiency(){return ie(this.perCard().map(a=>a.flowEfficiency).filter(a=>a!==null))}blockedTimeByColumn(){const a=new Map;for(const h of this.perCard()){const c=String(h.column);a.has(c)||a.set(c,{column:c,blockedMs:0,efficiencySum:0,efficiencyCount:0});const u=a.get(c);u.blockedMs+=h.blockedTime,h.flowEfficiency!==null&&(u.efficiencySum+=h.flowEfficiency,u.efficiencyCount+=1)}return[...a.values()].map(h=>({column:h.column,blockedMs:h.blockedMs,flowEfficiency:h.efficiencyCount?h.efficiencySum/h.efficiencyCount:null}))}#m(a,h,c){const u=[];for(let f=a;f<=h;f+=c)u.push(f);return(!u.length||u[u.length-1]<h)&&u.push(h),u}#d(a={}){const h=this.log.entries,c=h.length?h[0].at:0;let u=c;for(const f of h)f.at>u&&(u=f.at);return{from:Number.isFinite(a.from)?Number(a.from):c,to:Number.isFinite(a.to)?Number(a.to):u}}#f(a,h){const c=new Map;for(const[u,f]of a){let _;for(const A of f)if(A.at<=h)_=A.to;else break;_!==void 0&&c.set(u,_)}return c}cfd(a={}){const h=Z(a.bucket),{order:c,done:u,wip:f}=this.#a(),_=this.log.byKey(),{from:A,to:W}=this.#d(a),G=[];if(this.log.entries.length)for(const X of this.#m(A,W,h)){const Oe=this.#f(_,X),Se={};for(const ye of c)Se[ye]=0;let O=0,oe=0,me=0;for(const ye of Oe.values())ye in Se||(Se[ye]=0),Se[ye]+=1,me+=1,f.has(ye)&&(O+=1),u.has(ye)&&(oe+=1);G.push({at:X,counts:Se,wip:O,done:oe,total:me})}return{bucket:h,columns:c,points:G}}wipOverTime(a={}){return this.cfd(a).points.map(h=>({at:h.at,wip:h.wip}))}throughput(a={}){const h=Z(a.bucket),c=this.perCard().map(A=>A.doneAt).filter(A=>A!==null),{from:u,to:f}=this.#d(a),_=[];for(let A=u;A<=f;A+=h)_.push({at:A,count:0});_.length||_.push({at:u,count:0});for(const A of c){let W=Math.floor((A-u)/h);W<0&&(W=0),W>=_.length&&(W=_.length-1),_[W].count+=1}return _}#p(a,h){const c=new Date(a).toISOString();return h>=U.day?c.slice(0,10):c.slice(0,16).replace("T"," ")}chartData(a,h={}){const c=Z(h.bucket);if(a==="cfd"){const{columns:u,points:f}=this.cfd(h),_=f.map(A=>{const W={t:this.#p(A.at,c)};for(const G of u)W[G]=A.counts[G]||0;return W});return{columns:[{id:"t",field:"t",title:"Date"},...u.map(A=>({id:A,field:A,title:A}))],rows:_,spec:{type:"area",x:"t",measures:u.map(A=>({col:A})),stack:!0,title:"Cumulative flow"}}}if(a==="wip"){const u=this.wipOverTime(h).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:u,spec:{type:"line",x:"t",y:{col:"wip"},title:"Work in progress"}}}if(a==="throughput"){const u=this.throughput(h).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:u,spec:{type:"bar",x:"t",y:{col:"count"},title:"Throughput"}}}if(a==="cycleTime"||a==="leadTime"){const u=this.perCard().map(f=>a==="cycleTime"?f.cycleTime:f.leadTime).filter(f=>f!==null);return{columns:[{id:"v",field:"v",title:a==="cycleTime"?"Cycle time":"Lead time"}],rows:u.map(f=>({v:f})),spec:{type:"histogram",x:"v",title:a==="cycleTime"?"Cycle-time distribution":"Lead-time distribution"}}}return null}renderChart(a,h,c={}){const{createChart:u,createGrid:f,spec:_}=c;if(!k(u)||!k(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 A=this.chartData(a,c);if(!A)return j(`kanban:flow-chart-kind:${a}`,`"${a}" is not a flow chart; expected cfd, wip, throughput, cycleTime or leadTime.`),null;const W=f({columns:A.columns,rows:A.rows});return u({grid:W,container:h,...A.spec,...te(_)?_:{}})}destroy(){for(const a of this.#n)k(a)&&a();this.#n=[]}}const N=P}),Ke("packages/modules/kanban/sla.js",function(m,ee){"use strict";Object.defineProperty(m,"MIN_EPOCH",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"toMs",{enumerable:!0,get:function(){return U}}),Object.defineProperty(m,"parseEpoch",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"resolveSlaConfig",{enumerable:!0,get:function(){return P}}),Object.defineProperty(m,"formatAge",{enumerable:!0,get:function(){return I}}),Object.defineProperty(m,"createSlaMonitor",{enumerable:!0,get:function(){return w}}),Object.defineProperty(m,"SlaMonitor",{enumerable:!0,get:function(){return a}}),Object.defineProperty(m,"default",{enumerable:!0,get:function(){return h}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,te=o.isObject,j=ee("packages/core/src/internal/warn.js").warnOnce,l=60*1e3,S=60*l,B=24*S,E=7*B,R=1e12,q=Object.freeze({weeks:E,week:E,w:E,days:B,day:B,d:B,hours:S,hour:S,h:S,minutes:l,minute:l,m:l,min:l,seconds:1e3,second:1e3,s:1e3,sec:1e3,ms:1,milliseconds:1});function U(c){if(typeof c=="number")return Number.isFinite(c)&&c>=0?c:null;if(te(c)){let u=0,f=!1;for(const[_,A]of Object.entries(q)){const W=c[_];typeof W=="number"&&Number.isFinite(W)&&(u+=W*A,f=!0)}return f&&u>=0?u:null}return null}function Z(c){if(T(c))return null;let u;if(c instanceof Date)u=c.getTime();else if(typeof c=="number")u=c;else if(typeof c=="string"){const f=c.trim();if(f==="")return null;u=/^-?\d+$/.test(f)?Number(f):Date.parse(f)}else return null;return!Number.isFinite(u)||u<R?null:u}function ie(c){return te(c)&&("warn"in c||"breach"in c)?{warn:U(c.warn),breach:U(c.breach)}:{warn:null,breach:U(c)}}function K(c,u){return{warn:u.warn!==null?u.warn:c.warn,breach:u.breach!==null?u.breach:c.breach}}function P(c,u={}){const f=te(c)?c:{},_={warn:U(f.warn),breach:U(f.breach)},A=new Map;if(Array.isArray(u.columns))for(const G of u.columns){if(!te(G)||T(G.id)||G.sla===void 0&&G.slaWarn===void 0&&G.slaBreach===void 0)continue;const X=te(G.sla)||typeof G.sla=="number"?ie(G.sla):{warn:U(G.slaWarn),breach:U(G.slaBreach)};A.set(String(G.id),X)}if(te(f.columns))for(const[G,X]of Object.entries(f.columns))A.set(String(G),K(A.get(String(G))||{warn:null,breach:null},ie(X)));const W=new Map;if(te(f.lanes))for(const[G,X]of Object.entries(f.lanes))W.set(String(G),ie(X));return{global:_,columns:A,lanes:W,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:k(f.now)?f.now:(()=>Date.now()),tick:Number.isFinite(f.tick)&&f.tick>0?Number(f.tick):0,onWarn:k(f.onWarn)?f.onWarn:null,onBreach:k(f.onBreach)?f.onBreach:null}}function I(c){return!Number.isFinite(c)||c<0?"":c>=E?`${Math.floor(c/E)}w`:c>=B?`${Math.floor(c/B)}d`:c>=S?`${Math.floor(c/S)}h`:c>=l?`${Math.floor(c/l)}m`:"<1m"}const N=Object.freeze({ok:0,warn:1,breach:2});function w(c,u={}){return new a(c,u)}class a{#t;#e;#n=new Map;#r=new Map;#o=[];#i=null;#s=!1;constructor(u,f={}){if(this.#t=u,this.#e=P(f,u&&u.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."),u&&k(u.on))for(const _ of["card:move","card:add","card:reverted"])this.#o.push(u.on(_,()=>this.evaluate()))}get config(){return this.#e}#l(){if(!this.#e.useTransitionLog)return null;const u=this.#t.flow;return u&&u.log?u.log:null}#a(u,f){const _=u.row||{},{enteredProperty:A,createdProperty:W,basis:G}=this.#e,X=f?f.get(u.key):null,Oe=()=>{if(!Array.isArray(X))return null;const ye=String(u.columnId);for(let Ie=X.length-1;Ie>=0;Ie--)if(String(X[Ie].to)===ye){const Ne=X[Ie].at;return Number.isFinite(Ne)&&Ne>=R?Ne:null}return null},Se=()=>{if(!Array.isArray(X)||!X.length)return null;const ye=X[0].at;return Number.isFinite(ye)&&ye>=R?ye:null},O=()=>A?Z(_[A]):null,oe=()=>W?Z(_[W]):null,me=G==="board"?[oe,Se,O]:[Oe,O,Se,oe];for(const ye of me){const Ie=ye();if(Ie!==null)return Ie}return null}#c(u){let f=this.#e.global;const _=this.#e.columns.get(String(u.columnId));_&&(f=K(f,_));const A=u.swimlane;if(!T(A)){const W=this.#e.lanes.get(String(A));W&&(f=K(f,W))}return f}#u(u){const f=this.#t.ctx&&this.#t.ctx.doneColumns;return!!(f&&f.has(String(u.columnId)))}#m(u,f,_){const{warn:A,breach:W}=this.#c(u),X=this.#e.ignoreDone&&this.#u(u)?null:this.#a(u,_),Oe=X===null?null:Math.max(0,f-X);let Se=null;return Oe!==null&&(W!==null&&Oe>=W?Se="breach":A!==null&&Oe>=A?Se="warn":Se="ok"),{key:u.key,columnId:u.columnId,lane:u.swimlane,start:X,ageMs:Oe,ageText:Oe===null?"":I(Oe),warnMs:A,breachMs:W,level:Se,breached:Se==="breach"}}sync(){const u=this.#e.now(),f=this.#l()?this.#l().byKey():null,_=k(this.#t.cards)?this.#t.cards():[],A=new Map;for(const W of _)A.set(W.key,this.#m(W,u,f));return this.#n=A,this}evaluate(u={}){const f=u.emit!==!1;this.sync();const _=this.#e.now();for(const[A,W]of this.#n){const G=this.#r.has(A)?this.#r.get(A):null,X=W.level;f&&X&&(X==="warn"||X==="breach")&&N[X]>(G==null?-1:N[G])&&this.#d(W,G,_),this.#r.set(A,X)}for(const A of[...this.#r.keys()])this.#n.has(A)||this.#r.delete(A);return[...this.#n.values()]}#d(u,f,_){const A=this.#t.card?this.#t.card(u.key):null,W=A?A.row:void 0;this.#t.fire("card:sla",{key:u.key,card:A,level:u.level,previous:f,ageMs:u.ageMs,ageText:u.ageText,columnId:u.columnId,lane:u.lane,warnMs:u.warnMs,breachMs:u.breachMs,at:_});const G=u.level==="breach"?this.#e.onBreach:this.#e.onWarn;G&&G(u.level,W===void 0?[]:[W])}start(){if(this.#s)return this;this.#s=!0,this.sync();for(const u of this.#n.values())this.#r.set(u.key,u.level?"ok":null);return this.evaluate(),this.#e.tick>0&&(this.#i=setInterval(()=>{this.evaluate(),this.#t.el&&k(this.#t.repaint)&&this.#t.repaint()},this.#e.tick),this.#i&&k(this.#i.unref)&&this.#i.unref()),this}stateFor(u){const f=te(u)&&"key"in u?u.key:u;return this.#n.get(f)||null}states(){return[...this.#n.values()]}breaches(){return this.states().filter(u=>u.level==="breach")}warnings(){return this.states().filter(u=>u.level==="warn")}destroy(){this.#i&&(clearInterval(this.#i),this.#i=null);for(const u of this.#o)k(u)&&u();this.#o=[]}}const h=w}),Ke("packages/modules/kanban/history.js",function(m,ee){"use strict";Object.defineProperty(m,"DEFAULT_DEPTH",{enumerable:!0,get:function(){return T}}),Object.defineProperty(m,"createHistory",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"installUndoShortcuts",{enumerable:!0,get:function(){return l}});const k=ee("packages/core/src/internal/predicates.js").isFunction,T=100;function te(S){return S&&Number.isInteger(S.historyDepth)&&S.historyDepth>=0?S.historyDepth:T}function ne(S={}){const B=te(S);let E=[],R=[],q=!1;return Object.freeze({record(Z){!k(Z.undo)&&!k(Z.redo)||(E.push(Z),E.length>B&&E.shift(),R.length=0)},async undo(){return q?null:U("undo")},async redo(){return q?null:U("redo")},canUndo(){return E.length>0},canRedo(){return R.length>0},peek(Z="undo"){const ie=Z==="redo"?R:E,K=ie[ie.length-1];return K?K.label:null},clear(){E=[],R=[]},get replaying(){return q},get depth(){return E.length},get max(){return B}});async function U(Z){const ie=Z==="undo"?E:R,K=Z==="undo"?R:E,P=ie[ie.length-1];if(!P)return null;const I=Z==="undo"?P.undo:P.redo;q=!0;let N=!0;try{k(I)&&(N=await I())}catch{N=!1}finally{q=!1}return N===!1?{applied:!1,label:P.label}:(ie.pop(),K.push(P),{applied:!0,label:P.label})}}function j(S,B){for(let E=S;E&&E!==B;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 l(S){const{root:B,undo:E,redo:R}=S;if(!B||!k(B.addEventListener))return()=>{};const q=Z=>{if(!Z||!(Z.ctrlKey||Z.metaKey))return;const ie=typeof Z.key=="string"?Z.key.toLowerCase():"";let K;if(ie==="z"&&!Z.shiftKey)K=E;else if(ie==="z"&&Z.shiftKey||ie==="y")K=R;else return;if(j(Z.target,B))return;const P=K();(P instanceof Promise||P!==!1)&&Z.preventDefault()};return B.addEventListener("keydown",q),()=>B.removeEventListener("keydown",q)}}),Ke("packages/core/src/registry/free-tier-notice.js",function(m,ee){"use strict";Object.defineProperty(m,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return o}}),Object.defineProperty(m,"WATERMARK_TEXT",{enumerable:!0,get:function(){return k}});const o="Free for non-commercial use: latticegrid.dev/free",k="Unlicensed: Lattice Grid trial"}),Ke("packages/core/src/registry/licence.js",function(m,ee){"use strict";Object.defineProperty(m,"PRODUCT",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(m,"LICENCE_VERSION",{enumerable:!0,get:function(){return j}}),Object.defineProperty(m,"PUBLIC_KEY",{enumerable:!0,get:function(){return B}}),Object.defineProperty(m,"fromBase64Url",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"toBase64Url",{enumerable:!0,get:function(){return U}}),Object.defineProperty(m,"asciiBytes",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"parseLicence",{enumerable:!0,get:function(){return K}}),Object.defineProperty(m,"hasEd25519",{enumerable:!0,get:function(){return u}}),Object.defineProperty(m,"verifyLicence",{enumerable:!0,get:function(){return f}}),Object.defineProperty(m,"isLocalHost",{enumerable:!0,get:function(){return _}}),Object.defineProperty(m,"currentHost",{enumerable:!0,get:function(){return A}}),Object.defineProperty(m,"matchesDomain",{enumerable:!0,get:function(){return W}}),Object.defineProperty(m,"LicenceHolder",{enumerable:!0,get:function(){return X}}),Object.defineProperty(m,"setLicence",{enumerable:!0,get:function(){return oe}}),Object.defineProperty(m,"licenceInfo",{enumerable:!0,get:function(){return me}}),Object.defineProperty(m,"watermark",{enumerable:!0,get:function(){return ye}}),Object.defineProperty(m,"licenceState",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(m,"sharedLicence",{enumerable:!0,get:function(){return Ne}});const k=ee("packages/core/src/internal/warn.js").warnOnce,T=ee("packages/core/src/registry/free-tier-notice.js"),te=T.FREE_TIER_NOTICE;Object.defineProperty(m,"FREE_TIER_NOTICE",{enumerable:!0,get:function(){return T.FREE_TIER_NOTICE}});const ne="lattice-grid",j=1,l="LG1",S=64,B="GwmaCOkGedHulqsa-DOV1TU8On1rsalWv519c_dW4j4",E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",R=(()=>{const J=new Int16Array(128).fill(-1);for(let Q=0;Q<E.length;Q++)J[E.charCodeAt(Q)]=Q;return J[43]=62,J[47]=63,J})();function q(J){if(typeof J!="string")return null;let Q="";for(let Ve=0;Ve<J.length;Ve++){const Fe=J.charCodeAt(Ve);if(Fe!==61){if(Fe>127||R[Fe]<0)return null;Q+=J[Ve]}}const re=Q.length;if(re%4===1)return null;const De=new Uint8Array(Math.floor(re*3/4));let xe=0,Ge=0,Je=0;for(let Ve=0;Ve<re;Ve++)xe=xe<<6|R[Q.charCodeAt(Ve)],Ge+=6,Ge>=8&&(Ge-=8,De[Je++]=xe>>Ge&255);return Je===De.length?De:De.subarray(0,Je)}function U(J){let Q="",re=0;for(;re+2<J.length;re+=3){const xe=J[re]<<16|J[re+1]<<8|J[re+2];Q+=E[xe>>18&63]+E[xe>>12&63]+E[xe>>6&63]+E[xe&63]}const De=J.length-re;if(De===1){const xe=J[re]<<16;Q+=E[xe>>18&63]+E[xe>>12&63]}else if(De===2){const xe=J[re]<<16|J[re+1]<<8;Q+=E[xe>>18&63]+E[xe>>12&63]+E[xe>>6&63]}return Q}function Z(J){const Q=new Uint8Array(J.length);for(let re=0;re<J.length;re++)Q[re]=J.charCodeAt(re)&127;return Q}function ie(J){if(typeof TextDecoder=="function")return new TextDecoder().decode(J);let Q="";for(let re=0;re<J.length;re++)Q+=String.fromCharCode(J[re]);return Q}function K(J){const Q={ok:!1,reason:"malformed",product:null,issuedTo:null,expires:null,terms:null,features:[],deployments:[],version:0,message:null,signature:null,raw:typeof J=="string"?J:""};if(typeof J!="string"||J.length===0)return{...Q,reason:"missing"};const re=J.trim(),De=re.split(".");if(De.length!==3)return Q;const[xe,Ge,Je]=De;if(xe!==l)return{...Q,reason:"prefix"};const Ve=q(Ge),Fe=q(Je);if(!Ve||!Fe)return Q;let je;try{je=JSON.parse(ie(Ve))}catch{return Q}return je===null||typeof je!="object"?Q:{ok:!0,reason:null,product:typeof je.p=="string"?je.p:null,issuedTo:typeof je.t=="string"?je.t:null,expires:typeof je.e=="string"?je.e:null,terms:typeof je.terms=="string"?je.terms:null,features:Array.isArray(je.f)?je.f.slice():[],deployments:Array.isArray(je.d)?je.d.slice():[],version:typeof je.v=="number"?je.v:0,message:Z(Ge),signature:Fe,raw:re}}function P(J,Q){if(!J)return!1;const re=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(J)?`${J}T23:59:59.999Z`:J);return Number.isNaN(re)?!0:Q>re}function I(J){return J==="non-commercial"?"non-commercial":"commercial"}let N=null,w=null,a=null;function h(){const J=globalThis.crypto;return J&&J.subtle?J.subtle:null}async function c(J){if(N&&w===J)return N;const Q=h();if(!Q)return null;const re=q(J);if(!re)return null;try{const De=await Q.importKey("raw",re,{name:"Ed25519"},!1,["verify"]);return N=De,w=J,De}catch{return null}}async function u(){return a!==null||(a=await c(B)!==null),a}async function f(J,Q={}){const re=Q.warn!==!1,De=Q.product||ne,xe=Q.publicKey||B,Ge=Q.now??Date.now(),Je=Q.host??A(),Ve=_(Je)?"":` ${te}`,Fe=K(J);if(!Fe.ok){const y=Fe.reason==="missing"?"missing":"malformed";return re&&k(`licence.${y}`,y==="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:y,terms:"commercial"}}const je={product:Fe.product||void 0,issuedTo:Fe.issuedTo||void 0,expires:Fe.expires||void 0,terms:I(Fe.terms)};if(Fe.product!==De)return re&&k("licence.product",`licence key is for '${Fe.product}', not '${De}'. The grid will render with a watermark.`),{valid:!1,...je,reason:"product"};if(P(Fe.expires,Ge))return re&&k("licence.expired",`licence expired on ${Fe.expires}. The grid will render with a watermark. Renew at latticegrid.dev.`),{valid:!1,...je,reason:"expired"};const lt=Fe.deployments||[];if(lt.length&&Je&&!_(Je)&&!W(Je,lt))return re&&k("licence.domain",`licence key is not valid for ${Je}; it covers ${lt.join(", ")}. The grid will render with a watermark.`),{valid:!1,...je,reason:"domain"};const ct=await c(xe);if(!ct){const y=!!Fe.signature&&Fe.signature.length===S;return re&&k("licence.algorithm","this host does not provide crypto.subtle Ed25519, so the licence signature could not be verified. A structural check was used instead."),y?{valid:!0,...je,reason:"unverified"}:{valid:!1,...je,reason:"signature"}}let g=!1;try{g=await h().verify({name:"Ed25519"},ct,Fe.signature,Fe.message)}catch{g=!1}return g?{valid:!0,...je}:(re&&k("licence.signature","licence signature is not valid. The grid will render with a watermark."),{valid:!1,...je,reason:"signature"})}function _(J){const Q=String(J??A()??"").trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");return!Q||Q==="localhost"||Q.endsWith(".localhost")||Q==="::1"||Q==="0:0:0:0:0:0:0:1"?!0:/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(Q)}function A(){const J=globalThis.location;return J&&typeof J.hostname=="string"?J.hostname:null}function W(J,Q){const re=G(J);return!re||!Array.isArray(Q)?!1:Q.some(De=>{const xe=G(De);if(!xe)return!1;if(xe==="*")return!0;if(xe.startsWith("*.")){const Ge=xe.slice(2);return re===Ge||re.endsWith(`.${Ge}`)}return re===xe})}function G(J){return String(J??"").trim().toLowerCase().replace(/\.$/,"")}class X{#t="";#e={valid:!1,reason:"missing",terms:"commercial"};#n=null;#r=null;#o;#i=new Set;constructor(Q={}){this.#o=Q}set(Q){this.#t=typeof Q=="string"?Q.trim():"";const re=K(this.#t);return this.#e=re.ok?{valid:!P(re.expires,Date.now())&&re.product===(this.#o.product||ne),product:re.product||void 0,issuedTo:re.issuedTo||void 0,expires:re.expires||void 0,terms:I(re.terms),reason:"pending"}:{valid:!1,reason:re.reason||"malformed",terms:"commercial"},this.#n=null,this.#t&&this.verify(),this.#e}verify(){if(this.#n)return this.#n;const Q=this.#t;return this.#n=f(Q,this.#o).then(re=>{if(this.#t===Q){this.#e=re;for(const De of this.#i)De(re)}return re}),this.#n}onSettled(Q){return this.#i.add(Q),()=>this.#i.delete(Q)}info(){return{...this.#e}}watermark(){return this.#e.valid?!1:!_(this.#r)}setHost(Q){this.#r=Q}state(){return this.#e.valid?"licensed":_(this.#r)?"localhost":"trial"}reset(){this.#t="",this.#e={valid:!1,reason:"missing",terms:"commercial"},this.#n=null,this.#i.clear()}}const Oe=Symbol.for("lattice-grid/licence/holder");function Se(){const J=globalThis,Q=J&&J[Oe];if(Q&&typeof Q.set=="function"&&typeof Q.watermark=="function")return Q;const re=new X;if(J)try{J[Oe]=re}catch{}return re}const O=Se();function oe(J){return O.set(J)}function me(){return O.info()}function ye(){return O.watermark()}function Ie(){return O.state()}function Ne(){return O}}),Ke("packages/dom/src/watermark.js",function(m,ee){"use strict";Object.defineProperty(m,"WATERMARK_CLASS",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"WATERMARK_LAYER_CLASS",{enumerable:!0,get:function(){return I}}),Object.defineProperty(m,"Watermark",{enumerable:!0,get:function(){return a}}),Object.defineProperty(m,"viewLicenceHost",{enumerable:!0,get:function(){return h}}),Object.defineProperty(m,"mountViewWatermark",{enumerable:!0,get:function(){return c}}),Object.defineProperty(m,"default",{enumerable:!0,get:function(){return u}});const k=ee("packages/core/src/internal/predicates.js").isFunction,T=ee("packages/core/src/registry/free-tier-notice.js"),te=T.FREE_TIER_NOTICE,ne=T.WATERMARK_TEXT,j=ee("packages/core/src/registry/licence.js"),l=j.watermark,S=j.setLicence,B=Object.freeze({t:f=>f==="licence.watermark.free"?te:ne});function E(f,_,A={}){const W=f.createElement(_);if(A.class)for(const G of A.class.split(/\s+/))G&&W.classList.add(G);if(A.text!==void 0&&(W.textContent=A.text),A.attrs)for(const[G,X]of Object.entries(A.attrs))W.setAttribute(G,X);if(A.children)for(const G of A.children)W.appendChild(G);return W}function R(f,_,A){return f.addEventListener(_,A),()=>f.removeEventListener(_,A)}const q="lat-watermark",U="https://www.latticegrid.dev",Z=["br","bl","tl","tr"],ie=4e3,K=Symbol.for("lattice-grid/licence/holder"),P="data-lat-watermark-owner",I="lat-watermark-layer",N="lat-watermark-style",w=`
|
|
488
490
|
.${I}{position:absolute;inset:0;pointer-events:none;z-index:2147483000;overflow:hidden}
|
|
489
|
-
.${I} .${
|
|
490
|
-
.${I} .${
|
|
491
|
-
.${I} .${
|
|
492
|
-
.${I} .${
|
|
493
|
-
.${I} .${
|
|
494
|
-
.${I} .${
|
|
495
|
-
.${I} .${
|
|
496
|
-
@media print{.${I} .${
|
|
497
|
-
`;class a{#t;#e;#n;#r=null;#o=[];#i;#s=0;#l=null;#a=null;#c=!1;constructor($){this.#a=$.owner||null,this.#a&&k(this.#a.setAttribute)&&this.#a.setAttribute(O,""),this.#t=$.grid,this.#e=$.document,this.#n=$.element,this.#i=$.window||(typeof globalThis>"u"?{}:globalThis)}mount(){this.refresh(),k(this.#t.on)&&this.#o.push(this.#t.on("licence:changed",()=>this.refresh()));const $=this.#t.licence&&this.#t.licence.ready;$&&k($.then)&&$.then(()=>this.refresh(),()=>this.refresh())}refresh(){const $=this.#p()&&!this.#u();$&&!this.#r?(this.#h(),this.#d()):!$&&this.#r&&(this.#g(),this.#f())}#u(){const $=this.#n;let A=$&&$.parentNode;for(this.#a&&A===this.#a&&(A=A.parentNode);A&&A.nodeType===1;){if(k(A.hasAttribute)&&A.hasAttribute(O))return!0;A=A.parentNode}return!1}#m(){const $=this.#i;if(!$||!k($.matchMedia))return!1;try{return!!$.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}#d(){this.#f(),k(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)%G.length,this.#g(),this.#h(),this.#d()},ie)))}#f(){this.#l!==null&&k(this.#i.clearTimeout)&&this.#i.clearTimeout(this.#l),this.#l=null}#p(){const $=this.#t.licence;return!!($&&k($.watermark)&&$.watermark())}#h(){const $=this.#t.messages&&k(this.#t.messages.t)?this.#t.messages:q,A=C(this.#e,"a",{class:`${K}__link`,text:$.t("licence.watermark"),attrs:{href:H,target:"_blank",rel:"noopener noreferrer"}}),D=C(this.#e,"span",{class:`${K}__free`,text:$.t("licence.watermark.free")});this.#r=C(this.#e,"div",{class:`${K} ${K}--${G[this.#s]}`,attrs:{role:"note",title:"This grid is unlicensed for this domain. Visit latticegrid.dev for a licence."},children:[A,D]}),this.#o.push(M(this.#r,"pointerdown",U=>{k(U.stopPropagation)&&U.stopPropagation()})),this.#n&&k(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&&k(this.#r.remove)&&this.#r.remove(),this.#r=null}destroy(){this.#f(),this.#a&&k(this.#a.removeAttribute)&&this.#a.removeAttribute(O);for(const $ of this.#o)$();this.#o=[],this.#g()}}function m(d={},$=void 0){const A=globalThis[W],D=!d.licence&&$&&k($.querySelector)?$.querySelector('meta[name="lattice-license"]')?.getAttribute("content"):null,U=d.licence||D;return U&&S(U),{licence:{watermark:()=>s(),get ready(){return A?A.verify():Promise.resolve()}},on:(Q,Se)=>Q==="licence:changed"&&A?A.onSettled(()=>Se()):()=>{}}}function l(d,$={}){const A=d&&d.ownerDocument;if(!A||!k(A.createElement))return{destroy(){},refresh(){}};const D=A.defaultView||void 0,U=m($,A);let Q=null,Se=null,je=null,P=!1;const ae=()=>{if(!A.getElementById(N)&&A.head){const Ne=A.createElement("style");Ne.id=N,Ne.textContent=b,A.head.appendChild(Ne)}D&&k(D.getComputedStyle)&&D.getComputedStyle(d).position==="static"&&(d.style.position="relative"),Q=A.createElement("div"),Q.className=I,d.appendChild(Q),Se=new a({grid:U,document:A,element:Q,window:D,owner:d}),Se.mount(),D&&k(D.MutationObserver)&&(je=new D.MutationObserver(()=>{!P&&Q&&Q.parentNode!==d&&d.appendChild(Q)}),je.observe(d,{childList:!0}))},he=()=>{P||(Se?Se.refresh():U.licence.watermark()&&ae())};he();const be=U.on("licence:changed",he);return U.licence.ready,{refresh:he,destroy(){P||(P=!0,be(),je&&je.disconnect(),Se&&Se.destroy(),Q&&Q.parentNode&&Q.parentNode.removeChild(Q))}}}const c=a}),We("packages/modules/kanban/source.js",function(g,Z){"use strict";Object.defineProperty(g,"COUNT_ID",{enumerable:!0,get:function(){return s}}),Object.defineProperty(g,"POINTS_ID",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"isPushdownSource",{enumerable:!0,get:function(){return q}}),Object.defineProperty(g,"engineFilterTree",{enumerable:!0,get:function(){return C}}),Object.defineProperty(g,"totalsRequest",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"totalsAggregates",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"totalsKey",{enumerable:!0,get:function(){return H}}),Object.defineProperty(g,"parseTotals",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"applyTotals",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(g,"columnPageRequest",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"appendRows",{enumerable:!0,get:function(){return O}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,ee=o.isObject,x=Z("packages/core/src/internal/warn.js").warnOnce,s="\0kanban-count",S="\0kanban-points";function q(I){return ee(I)&&k(I.fetch)&&k(I.aggregate)}function C(I){const N=[];if(I.filters&&I.filters.size)for(const b of I.filters.values())k(b)||ee(b)&&N.push(b);return N.length?N.length===1?N[0]:{op:"and",conditions:N}:null}function M(I,N){const b=[I.columnProperty];I.swimlanes&&I.swimlaneProperty&&b.push(I.swimlaneProperty);const a=typeof N.quickFilter=="string"?N.quickFilter.trim():"";return{filters:C(N),quick:a||"",groupBy:b}}function K(I){const N=[{id:s,col:I.columnProperty,fn:"count"}];return I.pointsProperty&&N.push({id:S,col:I.pointsProperty,fn:"sum"}),N}function H(I,N){return N===void 0?String(I):`${N}|${I}`}function G(I,N){const b=Array.isArray(N&&N.engine)?N.engine:[],a=Array.isArray(N&&N.client)?N.client:[],m=Array.isArray(N&&N.groups)?N.groups:null,l=new Map;if(!m)return{byKey:l,engine:b,client:a,groups:m};const c=I.swimlanes&&I.swimlaneProperty;for(const d of m){if(!d||!Array.isArray(d.keys))continue;const $=d.keys;if(T($[0])||c&&T($[1]))continue;const A=String($[0]),D=c?String($[1]):void 0,U=d.values||{},Q=Number(U[s]),Se=Number(U[S]);l.set(H(A,D),{count:Number.isFinite(Q)?Q:0,points:Number.isFinite(Se)?Se:0})}return{byKey:l,engine:b,client:a,groups:m}}function ie(I,N,b){const a=N.swimlanes&&N.swimlaneProperty;for(const m of I.columns){let l=0,c=0;if(a&&Array.isArray(I.lanes))for(const d of I.lanes){const $=Array.isArray(d.columns)?d.columns.find(D=>D.id===m.id):null,A=b.get(H(m.id,d.id))||{count:0,points:0};$&&($.count=A.count,$.points=A.points),l+=A.count,c+=A.points}else{const d=b.get(H(m.id,void 0))||{count:0,points:0};l=d.count,c=d.points}m.count=l,m.points=c,m.over=m.wipLimit!==null&&l>m.wipLimit}if(a&&Array.isArray(I.lanes))for(const m of I.lanes){let l=0,c=0;for(const d of I.columns){const $=b.get(H(d.id,m.id))||{count:0,points:0};l+=$.count,c+=$.points}m.count=l,m.points=c}}function W(I,N,b,a,m,l){const c=[],d=C(N);d&&c.push(d),c.push({col:I.columnProperty,op:"eq",value:b,caseSensitive:!0}),a!==void 0&&I.swimlaneProperty&&c.push({col:I.swimlaneProperty,op:"eq",value:a,caseSensitive:!0});const $=typeof N.quickFilter=="string"?N.quickFilter.trim():"";return{filters:c.length===1?c[0]:{op:"and",conditions:c},quick:$||"",sort:I.orderProperty?[{col:I.orderProperty,dir:"asc"}]:null,range:{start:m,end:m+l}}}function O(I,N,b){const a=[];for(const m of b||[]){let l;try{l=N.key(m)}catch{continue}if(T(l)){x("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(l,m),a.push(l)}return a}}),We("packages/modules/kanban/index.js",function(g,Z){"use strict";Object.defineProperty(g,"createKanban",{enumerable:!0,get:function(){return ut}}),Object.defineProperty(g,"default",{enumerable:!0,get:function(){return mt}});const o=Z("packages/core/src/internal/predicates.js"),k=o.isObject,T=o.isFunction,ee=o.isNil,ne=Z("packages/core/src/internal/warn.js"),x=ne.warnOnce,s=ne.fail,S=Z("packages/core/src/internal/paths.js"),q=S.getPath,C=S.setPath,K=Z("packages/core/src/internal/uid.js").uid,G=Z("packages/core/src/internal/merge.js").mergeRow,W=Z("packages/core/src/internal/ready.js").createReadySignal,O=Z("packages/modules/kanban/model.js"),I=O.resolveContext,N=O.groupRows,b=O.keyFn,a=O.computeOrders,m=O.accessorFor,l=O.rollup,c=O.BACKLOG,d=O.DEFAULT_FILTER,$=O.deriveDoneColumns,A=O.laneIdOf,D=Z("packages/modules/kanban/view.js"),U=D.resolveReadonly,Q=D.renderPreserving,Se=D.installSelectionPainter,je=D.openDetail,P=D.closeDetail,ae=D.startEdit,he=D.openRequiredForm,be=D.closeRequiredForm,Ne=Z("packages/modules/kanban/workflow.js"),xe=Ne.canMove,V=Ne.transitionError,J=Ne.missingRequired,re=Ne.requiredError,Fe=Z("packages/modules/shared/emitter.js").Emitter,Qe=Z("packages/modules/kanban/flow.js").createFlowAnalytics,Le=Z("packages/modules/kanban/sla.js").createSlaMonitor,st=Z("packages/modules/kanban/styles.js").NS,y=Z("packages/modules/kanban/history.js"),w=y.createHistory,R=y.installUndoShortcuts,fe=Z("packages/dom/src/watermark.js").mountViewWatermark,ue=Z("packages/modules/kanban/source.js"),se=ue.isPushdownSource,pe=ue.totalsRequest,me=ue.totalsAggregates,le=ue.parseTotals,_e=ue.applyTotals,He=ue.columnPageRequest,Pe=ue.appendRows,Me=Object.freeze(["card:click","card:dblclick","card:contextmenu","card:move","card:reverted","card:confirmed","selection:changed","column:collapse","card:add","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"]),lt=Object.freeze({onCardClick:"card:click",onCardDblClick:"card:dblclick",onCardContextMenu:"card:contextmenu"});function ot(Ue,Ge){if(Array.isArray(Ue.rows))return Ue.rows;const L=Ue.grid;if(!L||!L.rows||!T(L.rows.forEach))return[];const X=[Ge.columnProperty,Ge.pointsProperty,Ge.orderProperty,Ge.swimlaneProperty,Ge.sprintProperty,Ge.epicProperty].filter(Ee=>typeof Ee=="string"),rt=L.columns&&T(L.columns.all)?L.columns.all():[],ft=Ee=>{if(L.columns&&T(L.columns.get)&&L.columns.get(Ee))return Ee;const $e=rt.find(at=>at&&at.field===Ee);return $e?$e.id:Ee},ht=new Map(X.map(Ee=>[Ee,ft(Ee)])),Ve=[];return L.rows.forEach(Ee=>{if(Ee&&Ee.group||Ee&&Ee.pending===!0)return;const $e=Ee.key,at={__boardKey:$e};for(const it of X)try{at[it]=L.rows.value($e,ht.get(it))}catch{at[it]=void 0}Ve.push(at)}),Ve}function ut(Ue,Ge={}){const L=k(Ge)?Ge:{},X=I(L);L.grid&&!Array.isArray(L.rows)&&(X.key=b("__boardKey"));const rt=new Fe("kanban"),ft=U(L.readonly),ht=Ue&&Ue.ownerDocument||typeof globalThis<"u"&&globalThis.document||null,Ve=!!L.grid&&!Array.isArray(L.rows),Ee=se(L.source)&&!Array.isArray(L.rows)&&!Ve,$e=new Map;let at=!1;const it=n=>{if(!Ve||typeof n!="string")return n;const u=L.grid.columns;if(!u)return n;try{if(T(u.get)&&u.get(n))return n;const j=(T(u.all)?u.all():[]).find(B=>B&&B.field===n);return j?j.id:n}catch{return n}},oe={collapsedColumns:new Set,collapsedLanes:new Set,columnOrder:Array.isArray(L.columnOrder)?[...L.columnOrder]:null,laneOrder:Array.isArray(L.laneOrder)?[...L.laneOrder]:null,filters:new Map(T(L.filter)?[[d,L.filter]]:[]),quickFilter:typeof L.quickFilter=="string"?L.quickFilter:"",sprint:L.sprint===void 0?void 0:L.sprint,epic:L.epic===void 0?void 0:L.epic,blockedFilter:!!L.blockedFilter},gt=W(),r={el:Ue||null,doc:ht,ctx:X,config:L,emitter:rt,isReadonly:ft,wired:!1,ready:gt.promise,rowKey:L.rowKey??(Ve?"__boardKey":"id"),model:{columns:[],cardsByKey:new Map,unplaced:[]},live:null,flowAvailable:!0,sourceBound:Ee,columnWidth:X.columnWidth,minColumnWidth:X.minColumnWidth,fire(n,u){rt.emit(n,u);for(const[_,j]of Object.entries(lt))j===n&&T(L[_])&&L[_](u)}},et=w({historyDepth:L.historyDepth});if(r._totals=new Map,r._pages=new Map,Ee&&T(L.source.resolveAggregatePlan)){const n=L.source.resolveAggregatePlan(me(X));(!n||!n.engine||!n.engine.length)&&x("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 ct=(n,u,_,j,B)=>{const ye=_.origin||"user",ve=()=>(r.fire(u,{..._,reason:_.reason||"prevented"}),B()),ge=rt.emitBefore(n,_,ye);return ge===!0?j():ge===!1?ve():ge.then(Ce=>Ce?j():ve())};T(L.onBeforeMove)&&rt.on("beforeMove",n=>L.onBeforeMove(n.card,n.from,n.to,n.index));const yt=()=>{$e.clear();for(const n of ot(L,X))$e.set(X.key(n),n)},e=()=>(r.model=N(X,[...$e.values()],oe),Ee&&_e(r.model,X,r._totals),r.el&&Q(r),r),t=(n,u)=>u===void 0?String(n):`${u}|${n}`,i=async()=>{try{const n=await L.source.aggregate(pe(X,oe),me(X)),u=le(X,n);r._totals=u.byKey,u.groups||x("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,x("kanban:source:totals:error",`the pushdown source failed to answer column totals: ${n&&n.message?n.message:n}`)}e()},p=async(n,u)=>{const _=t(n,u);let j=r._pages.get(_);if(j||(j={loaded:0,loading:!1,exhausted:!1},r._pages.set(_,j)),j.loading||j.exhausted)return!1;j.loading=!0;try{const B=He(X,oe,n,u,j.loaded,X.pageSize),ye=await L.source.fetch(B),ve=ye&&ye.rows||[],ge=Pe($e,X,ve);j.loaded+=ve.length;const Ce=ye&&typeof ye.total=="number"?ye.total:null;return(!ve.length||ve.length<X.pageSize||Ce!==null&&j.loaded>=Ce)&&(j.exhausted=!0),e(),r.fire("cards:loaded",{column:n,lane:u,keys:ge,more:!j.exhausted}),!j.exhausted}catch(B){return j.exhausted=!0,x("kanban:source:page",`the pushdown source failed to answer a column page: ${B&&B.message?B.message:B}`),!1}finally{j.loading=!1}};r.reload=async()=>{r._pages.clear(),$e.clear(),await i();const n=r.model.columns.map(_=>_.id),u=r.model.lanes?r.model.lanes.map(_=>_.id):void 0;if(u&&u.length)for(const _ of u)for(const j of n)await p(j,_);else for(const _ of n)await p(_,void 0);return r},r.loadMore=(n,u)=>Ee?p(n,u):Promise.resolve(!1),r.refresh=()=>(Ee||at||yt(),e()),r.repaint=()=>(r.el&&Q(r),r);const f={loading:!1,error:null};r.status=f,r.getState=()=>({collapsedColumns:[...oe.collapsedColumns],collapsedLanes:[...oe.collapsedLanes],columnOrder:oe.columnOrder?[...oe.columnOrder]:null,laneOrder:oe.laneOrder?[...oe.laneOrder]:null,quickFilter:oe.quickFilter,sprint:oe.sprint,epic:oe.epic,blockedFilter:oe.blockedFilter,selection:[...h]}),r.setState=n=>{const u=k(n)?n:{};if(Array.isArray(u.collapsedColumns)&&(oe.collapsedColumns=new Set(u.collapsedColumns)),Array.isArray(u.collapsedLanes)&&(oe.collapsedLanes=new Set(u.collapsedLanes)),"columnOrder"in u&&(oe.columnOrder=Array.isArray(u.columnOrder)?[...u.columnOrder]:null),"laneOrder"in u&&(oe.laneOrder=Array.isArray(u.laneOrder)?[...u.laneOrder]:null),typeof u.quickFilter=="string"&&(oe.quickFilter=u.quickFilter),"sprint"in u&&(oe.sprint=u.sprint),"epic"in u&&(oe.epic=u.epic),typeof u.blockedFilter=="boolean"&&(oe.blockedFilter=u.blockedFilter),Array.isArray(u.selection)){h.clear();for(const _ of u.selection)h.add(_)}return e()},r.setLoading=n=>(f.loading=!!n,e()),r.setError=n=>(f.error=ee(n)?null:String(n),e());const h=new Set;r.selection=()=>[...h],r.isSelected=n=>h.has(n),r.select=(n,u="set")=>{const _=(Array.isArray(n)?n:[n]).filter(j=>!ee(j));if(u==="set"){h.clear();for(const j of _)h.add(j)}else if(u==="add")for(const j of _)h.add(j);else if(u==="remove")for(const j of _)h.delete(j);else if(u==="toggle")for(const j of _)h.has(j)?h.delete(j):h.add(j);return r.selectionSet=h,r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("selection:changed",{keys:[...h]}),r},r.clearSelection=()=>r.select([],"set"),r.selectionSet=h,Se(r),r.collapseColumn=(n,u)=>{const _=u===void 0?!oe.collapsedColumns.has(n):!!u;return ct("beforeColumnChange","columnChange:cancelled",{column:n,collapsed:_,origin:"user"},()=>(_?oe.collapsedColumns.add(n):oe.collapsedColumns.delete(n),e(),r.fire("column:collapse",{column:n,collapsed:_}),r),()=>r)},r.collapseLane=(n,u)=>{const _=u===void 0?!oe.collapsedLanes.has(n):!!u;return _?oe.collapsedLanes.add(n):oe.collapsedLanes.delete(n),e(),r.fire("swimlane:collapse",{swimlane:n,collapsed:_}),r},r.reorderColumns=n=>Array.isArray(n)?ct("beforeColumnReorder","columnReorder:cancelled",{order:[...n],origin:"user"},()=>(oe.columnOrder=[...n],e(),r.fire("column:reorder",{order:r.model.columns.map(u=>u.id)}),r),()=>(r.el&&e(),r)):r,r.moveColumn=(n,u)=>{const _=r.model.columns.map(B=>B.id).filter(B=>B!==n),j=ee(u)?_.length:_.indexOf(u);return _.splice(j<0?_.length:j,0,n),r.reorderColumns(_)},r.reorderLanes=n=>Array.isArray(n)?ct("beforeLaneReorder","laneReorder:cancelled",{order:[...n],origin:"user"},()=>(oe.laneOrder=[...n],e(),r.fire("swimlane:reorder",{order:(r.model.lanes||[]).map(u=>u.id)}),r),()=>(r.el&&e(),r)):r,r.moveLane=(n,u)=>{const _=(r.model.lanes||[]).map(B=>B.id).filter(B=>B!==n),j=ee(u)?_.length:_.indexOf(u);return _.splice(j<0?_.length:j,0,n),r.reorderLanes(_)};const E=()=>{r.fire("filter:changed",{quickFilter:oe.quickFilter,hasFilter:oe.filters.size>0,filters:[...oe.filters.keys()]}),e(),Ee&&Promise.resolve(r.reload())};r.filters={DEFAULT:d,where(n,u){return n===void 0?[...oe.filters.keys()]:typeof n!="string"||!n.trim()?(x("kanban.filters.where.name","board.filters.where(name, fn) needs a non-empty string name; the predicate was not registered."),r):u===null?(oe.filters.delete(n)&&E(),r):T(u)?(oe.filters.set(n,u),E(),r):(x(`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,u){return n===void 0?[...oe.filters.keys()]:typeof n!="string"||!n.trim()?(x("kanban.filters.engine.name","board.filters.engine(name, condition) needs a non-empty string name; the filter was not registered."),r):u===null?(oe.filters.delete(n)&&E(),r):k(u)?(Ee||x("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)."),oe.filters.set(n,u),E(),r):(x(`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?oe.filters.size?(E(),!0):!1:oe.filters.has(n)?(E(),!0):(x(`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(d,T(n)?n:null),r.setQuickFilter=n=>(oe.quickFilter=typeof n=="string"?n:"",E(),r),r.facets=n=>{const u=m(n),_=new Map;for(const j of $e.values()){const B=u(j);_.set(B,(_.get(B)||0)+1)}return[..._.entries()].map(([j,B])=>({value:j,count:B})).sort((j,B)=>B.count-j.count)},r.BACKLOG=c,r.setSprint=n=>(oe.sprint=n,r.fire("sprint:changed",{sprint:n}),e()),r.showBacklog=()=>r.setSprint(c),r.setEpic=n=>(oe.epic=n,r.fire("epic:changed",{epic:n}),e()),r.sprints=()=>{const n=X.sprintProperty?r.facets(X.sprintProperty).map(j=>j.value):[];if(!X.sprintList)return n;const u=X.sprintList.map(j=>j.id),_=n.filter(j=>!ee(j)&&j!==""&&!u.some(B=>String(B)===String(j)));return[...u,..._]},r.sprintDefs=()=>{const n=X.sprintList||[],u=new Map(n.map(B=>[String(B.id),B])),_=n.map(B=>({id:B.id,title:ee(B.title)?String(B.id):String(B.title)})),j=X.sprintProperty?r.facets(X.sprintProperty).map(B=>B.value):[];for(const B of j)!ee(B)&&B!==""&&!u.has(String(B))&&_.push({id:B,title:String(B)});return _},r.epics=()=>X.epicProperty?r.facets(X.epicProperty).map(n=>n.value):[];const v=n=>X.doneColumns.has(String(m(X.columnProperty)(n)));r.rollup=n=>l(X,[...$e.values()],n,v),r.epicRollup=()=>X.epicProperty?r.rollup(X.epicProperty):[];const F=n=>{const u=L.children||{};if(T(u.load))return Promise.resolve(u.load(n));if(typeof u.property=="string"){const _=m(u.property);return Promise.resolve([...$e.values()].filter(j=>String(_(j))===String(n.key)))}return Promise.resolve([])};r.canExpand=n=>{const u=L.children;if(!u)return!1;if(T(u.hasChildren))return!!u.hasChildren(n);if(T(u.load))return!0;if(typeof u.property=="string"){const _=m(u.property);for(const j of $e.values())if(String(_(j))===String(n.key))return!0}return!1},r.expand=async(n,u={})=>{const _=r.model.cardsByKey.get(n);if(!_||!L.children)return null;const j=await F(_),B=u.depth!==void 0?u.depth:L.__depth||0,ye=je(r,_,j,B);return r.fire("card:expand",{card:_,rows:j,present:L.children.present||"drawer"}),B>0&&r.fire("card:drill",{card:_,rows:j,depth:B}),ye},r.buildChild=(n,u,_,j)=>{const B=L.children||{};if(T(B.render)){const ge=B.render(n,{card:u,rows:_,board:r,depth:j});return{destroy:()=>{T(ge)&&ge()}}}if(B.asBoard){const ge=ut(n,{...Y(B,u),rows:_,children:L.children,__depth:j+1});return{destroy:()=>ge.destroy()}}const ye=B.factory||typeof globalThis<"u"&&globalThis.LatticeGrid&&globalThis.LatticeGrid.createGrid;if(!T(ye))return x("kanban:children-factory","a card pop-out needs children.factory (a createGrid), children.render, or children.asBoard."),{destroy:()=>{}};const ve=ye(n,{rows:_,...Y(B,u)});return{destroy:()=>{ve&&T(ve.destroy)&&ve.destroy()}}};const Y=(n,u)=>{const _=n.gridOptions;return{...T(_)?_(u)||{}:k(_)?_:{}}};r.closeDetail=()=>(P(r),r),r.isFieldEditable=n=>{const u=X.cardSpecs[n];return!!(u&&u.edit&&typeof u.field=="string")},r.editCard=(n,u)=>{const _=r.model.cardsByKey.get(n);if(!_)return null;const j=u||Object.keys(X.cardSpecs).find(B=>r.isFieldEditable(B));return!j||!r.isFieldEditable(j)||r.isReadonly({column:_.columnId,card:n})?null:ae(r,n,j)},r.applyEdit=async(n,u,_,j={})=>{const B=j.origin||"user",ye=r.model.cardsByKey.get(n),ve=X.cardSpecs[u];if(!ye||!ve||typeof ve.field!="string")return!1;const ge=ve.field,Ce={card:ye,key:n,field:u,fieldPath:ge,value:_,origin:B};if(!await Promise.resolve(rt.emitBefore("beforeEdit",Ce,B)))return r.fire("edit:cancelled",{...Ce,reason:Ce.reason||"prevented"}),!1;if(Ve){const Xe=L.grid.edit.setCells([{key:n,colId:it(ge),value:_}],"cell");return r.refresh(),Xe===0?(x("kanban:writeback-noop",`an inline edit to "${ge}" 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 Oe={...$e.get(n)},qe=q(Oe,ge);if(C($e.get(n),ge,_),e(),r.fire("card:edit",Ce),T(L.onCardEdit)){let Xe=L.onCardEdit(Ce);if(Xe=Xe instanceof Promise?await Xe.then(bt=>bt,()=>!1):Xe,Xe===!1)return $e.set(n,Oe),e(),!1}return et.replaying||(et.record({label:"edit",undo:()=>r.applyEdit(n,u,qe),redo:()=>r.applyEdit(n,u,_)}),de()),!0},r.setBlocked=async(n,u,_,j={})=>{const B=j.origin||"user",ye=r.model.cardsByKey.get(n);if(!ye||!X.blockedProperty||r.isReadonly({column:ye.columnId,card:n}))return!1;const ve=X.blockedProperty,ge=u?typeof _=="string"&&_.trim()!==""?_.trim():!0:!1,Ce={card:ye,key:n,field:"blocked",fieldPath:ve,value:ge,origin:B};if(!await Promise.resolve(rt.emitBefore("beforeEdit",Ce,B)))return r.fire("edit:cancelled",{...Ce,reason:Ce.reason||"prevented"}),!1;if(Ve){const qe=L.grid.edit.setCells([{key:n,colId:it(ve),value:ge}],"cell");return r.refresh(),qe===0?(x("kanban:blocked-writeback-noop",`blocking/unblocking did not persist through the bound grid: writing "${ve}" was refused (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ce),!0)}const Oe={...$e.get(n)};if(C($e.get(n),ve,ge),e(),r.fire("card:edit",Ce),T(L.onCardEdit)){let qe=L.onCardEdit(Ce);if(qe=qe instanceof Promise?await qe.then(Xe=>Xe,()=>!1):qe,qe===!1)return $e.set(n,Oe),e(),!1}return!0},r.applyRequired=async(n,u,_,j={})=>{const B=j.origin||"user",ye=r.model.cardsByKey.get(n);if(!ye||typeof u!="string")return!1;const ve={card:ye,key:n,field:u,fieldPath:u,value:_,origin:B};if(!await Promise.resolve(rt.emitBefore("beforeEdit",ve,B)))return r.fire("edit:cancelled",{...ve,reason:ve.reason||"prevented"}),!1;if(Ve){const Oe=L.grid.edit.setCells([{key:n,colId:it(u),value:_}],"cell");return r.refresh(),Oe===0?(x("kanban:writeback-noop",`a required-field edit to "${u}" did not persist through the bound grid (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",ve),!0)}const Ce={...$e.get(n)},ze=q(Ce,u);if(C($e.get(n),u,_),e(),r.fire("card:edit",ve),T(L.onCardEdit)){let Oe=L.onCardEdit(ve);if(Oe=Oe instanceof Promise?await Oe.then(qe=>qe,()=>!1):Oe,Oe===!1)return $e.set(n,Ce),e(),!1}return et.replaying||(et.record({label:"edit",undo:()=>r.applyRequired(n,u,ze),redo:()=>r.applyRequired(n,u,_)}),de()),!0},r.toggleBlocked=(n,u)=>{const _=r.model.cardsByKey.get(n),j=!!(_&&_.explicitBlocked);return r.setBlocked(n,!j,u)},r.setBlockedFilter=n=>(oe.blockedFilter=!!n,r.fire("filter:changed",{quickFilter:oe.quickFilter,hasFilter:oe.filters.size>0,filters:[...oe.filters.keys()],blockedFilter:oe.blockedFilter}),e()),r.requestMove=(n,u,_=null,j=void 0,B={})=>{const ye=B.origin||"user",ve=(Array.isArray(n)?n:[n]).filter(ge=>r.model.cardsByKey.has(ge));if(!ve.length)return r.move(n,u,_,j,B);if(r.el){const ge=[];for(const Ce of ve){const ze=r.model.cardsByKey.get(Ce),Oe=A(ze.swimlane);for(const qe of J(X,Oe,u,ze.row))ge.push({key:Ce,card:ze,field:qe.field,label:qe.label,editor:qe.editor})}if(ge.length)return he(r,{keys:ve,toColumn:u,toIndex:_,toLane:j,origin:ye,entries:ge}),null}return r.move(n,u,_,j,B)},r.addCard=(n,u={})=>r.isReadonly({column:n})?null:ct("beforeAdd","add:cancelled",{column:n,seed:u,origin:"user"},()=>{let _={...u};if(C(_,X.columnProperty,n),Ve){const B=L.grid.edit.addRow?L.grid.edit.addRow(_):null;return B==null?(x("kanban:addRow","the bound grid cannot append a row (no mutate.append)."),null):(r.refresh(),r.fire("card:add",{column:n,key:B}),r.el&&r.editCard(B),B)}const j=B=>{let ye=X.key(B);return ee(ye)&&(ye=K("card"),typeof r.rowKey=="string"&&C(B,r.rowKey,ye)),$e.set(ye,B),e(),r.fire("card:add",{column:n,key:ye}),r.el&&r.editCard(ye),et.replaying||(et.record({label:"add",undo:()=>($e.delete(ye),e(),!0),redo:()=>($e.set(ye,B),e(),!0)}),de()),ye};if(T(L.onAddCard)){const B=L.onAddCard(n);if(B instanceof Promise)return B.then(ye=>j(k(ye)?ye:_),()=>null);k(B)&&(_=B)}return j(_)},()=>null);const ke=(n,u,_)=>{if(!X.orderProperty)return null;const j=r.model.columns.find(ge=>ge.id===u),B=(j?j.cards:[]).filter(ge=>!n.includes(ge.key)),ye=B.map(ge=>Number(m(X.orderProperty)(ge.row))),ve=ee(_)?B.length:_;return a(ye,ve,n.length)},ce=async(n,u,_,j="user")=>{const B=[],ye=[],ve=r.model.columns.find(ze=>ze.id===u),ge=X.enforceWip&&ve&&Number.isFinite(ve.wipLimit)?ve.wipLimit:null;let Ce=ve?Ee?ve.count:ve.cards.filter(ze=>!n.includes(ze.key)).length:0;for(const ze of n){const Oe=r.model.cardsByKey.get(ze);if(!Oe)continue;const qe=Oe.columnId;if(r.isReadonly({column:qe,card:ze})||r.isReadonly({column:u}))continue;const Xe=r.model.columns.findIndex(dt=>dt.id===u),bt=Oe.columnId===null?-1:r.model.columns.findIndex(dt=>dt.id===Oe.columnId),Te=A(Oe.swimlane);if(Oe.blocked&&Xe>bt&&xe(X,Te,Oe.columnId,u)){x(`kanban:blocked-move:${String(Oe.key)}`,`a move of blocked card "${String(Oe.key)}" into "${u}" was refused: a blocked card cannot move forward.`),ye.push({key:ze,card:Oe,from:qe,reason:"blocked"});continue}if(ge!==null&&qe!==u&&Ce+1>ge){x(`kanban:wip:${u}`,`a move into "${u}" was refused: it is at its WIP limit of ${ge}.`);continue}const Re={card:Oe,key:ze,from:qe,to:u,index:_,origin:j},De=rt.emitBefore("beforeMove",Re,j);(De===!0?!0:De===!1?!1:await De)!==!1?(B.push({key:ze,card:Oe,from:qe}),qe!==u&&(Ce+=1)):ye.push({key:ze,card:Oe,from:qe,reason:Re.reason||"prevented"})}for(const ze of ye)r.fire("move:cancelled",{keys:[ze.key],cards:[ze.card],from:[ze.from],to:u,index:_,reason:ze.reason});return B};r.move=async(n,u,_=null,j=void 0,B={})=>{const ye=B.origin||"user",ve=(Array.isArray(n)?n:[n]).filter(Te=>r.model.cardsByKey.has(Te));for(const Te of ve){const Re=r.model.cardsByKey.get(Te),De=A(Re.swimlane);if(!xe(X,De,Re.columnId,u))throw s(V(X,De,Re.columnId,u));const nt=J(X,De,u,Re.row);if(nt.length)throw s(re(X,De,u,nt))}const ge=await ce(ve,u,_,ye);if(!ge.length)return{moved:[],reverted:!1};const Ce=ge.map(Te=>Te.key),ze=Ve?null:ge.map(({key:Te,from:Re})=>{const De=r.model.columns.find(pt=>pt.id===Re),nt=De?De.cards.findIndex(pt=>pt.key===Te):0,dt=$e.get(Te),kt=X.swimlaneProperty&&dt?m(X.swimlaneProperty)(dt):void 0;return{key:Te,from:Re,index:nt,lane:kt}}),Oe=ke(Ce,u,_),qe=j!==void 0&&!!X.swimlaneProperty,Xe={keys:Ce,cards:ge.map(Te=>Te.card),from:ge.map(Te=>Te.from),to:u,index:_,origin:ye,lane:qe?j:void 0,orders:Oe};if(Ve){const Te=L.grid,Re=[],De=it(X.columnProperty),nt=X.orderProperty?it(X.orderProperty):null,dt=qe?it(X.swimlaneProperty):null;ge.forEach(({key:pt},Pt)=>{Re.push({key:pt,colId:De,value:u}),Oe&&nt&&Re.push({key:pt,colId:nt,value:Oe[Pt]}),dt&&Re.push({key:pt,colId:dt,value:j})});const kt=Te.edit.setCells(Re,"cell");return r.refresh(),kt===0&&Re.length?(x("kanban:writeback-noop",`a card move did not persist through the bound grid: writing "${X.columnProperty}" was refused (a read-only, non-editable, permission-blocked or unresolvable column), so the card stayed where it was.`),r.fire("card:reverted",{...Xe}),{moved:[],reverted:!0}):(r.fire("card:move",Xe),{moved:Ce,reverted:!1})}if(Ee){const Te=L.source.edit&&T(L.source.edit.commit)?L.source.edit:null;if(!Te)return x("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",{...Xe}),{moved:[],reverted:!0};const Re=[];ge.forEach(({key:De},nt)=>{Re.push({key:De,colId:X.columnProperty,value:u}),Oe&&X.orderProperty&&Re.push({key:De,colId:X.orderProperty,value:Oe[nt]}),qe&&Re.push({key:De,colId:X.swimlaneProperty,value:j})});try{await Promise.all(Re.map(De=>Te.commit(De)))}catch(De){return r.fire("card:reverted",{...Xe,reason:De&&De.message?De.message:"write failed"}),{moved:[],reverted:!0}}return r.fire("card:move",Xe),await r.reload(),{moved:Ce,reverted:!1}}const bt=ge.map(({key:Te})=>({key:Te,row:{...$e.get(Te)}}));if(ge.forEach(({key:Te},Re)=>{const De=$e.get(Te);C(De,X.columnProperty,u),Oe&&X.orderProperty&&C(De,X.orderProperty,Oe[Re]),qe&&C(De,X.swimlaneProperty,j)}),e(),r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("card:move",Xe),T(L.onCardMove)){let Te=L.onCardMove(Xe);if(Te=Te instanceof Promise?await Te.then(Re=>Re,()=>!1):Te,Te===!1){for(const Re of bt)$e.set(Re.key,Re.row);return e(),r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("card:reverted",{...Xe}),{moved:[],reverted:!0}}}if(!et.replaying){const Te=ze[0].from,Re=Math.min(...ze.map(nt=>nt.index)),De=X.swimlaneProperty?ze[0].lane:void 0;et.record({label:"move",undo:()=>r.move(Ce,Te,Re,De).then(nt=>nt.moved.length>0),redo:()=>r.move(Ce,u,_,j).then(nt=>nt.moved.length>0)}),de()}return{moved:Ce,reverted:!1}};const we=(n="undo")=>{if(Ve){const u=L.grid&&L.grid.history;if(!u||!T(u.peek))return null;const _=u.peek(n);return _?_.label:null}return et.peek(n)},de=()=>{r.fire("history",{canUndo:r.canUndo(),canRedo:r.canRedo(),label:we("undo")})};r.canUndo=()=>Ve?!!(L.grid&&L.grid.history&&T(L.grid.history.canUndo)&&L.grid.history.canUndo()):et.canUndo(),r.canRedo=()=>Ve?!!(L.grid&&L.grid.history&&T(L.grid.history.canRedo)&&L.grid.history.canRedo()):et.canRedo(),r.undo=async()=>{if(Ve){const u=L.grid&&L.grid.history,_=u&&T(u.undo)?u.undo():null;return de(),_}const n=await et.undo();return n&&n.applied===!1&&x("kanban:undo:vetoed","an undo was refused by a before-event handler or the write-back path; the card and history are unchanged."),de(),n},r.redo=async()=>{if(Ve){const u=L.grid&&L.grid.history,_=u&&T(u.redo)?u.redo():null;return de(),_}const n=await et.redo();return n&&n.applied===!1&&x("kanban:redo:vetoed","a redo was refused by a before-event handler or the write-back path; the card and history are unchanged."),de(),n};let Ye=()=>{};const z=[],Ae=()=>{for(;z.length;)z.pop()()},Be=()=>{Ae();const n=L.grid;if(!n||!T(n.on))return;const u=(_,j)=>{const B=n.on(_,j);z.push(()=>{T(B)?B():T(n.off)&&n.off(_,j)})};for(const _ of["cell:confirmed","cell:reverted","cell:conflict"])u(_,()=>r.refresh());u("rows:changed",()=>r.refresh()),u("filter:changed",()=>{typeof queueMicrotask=="function"?queueMicrotask(()=>r.refresh()):r.refresh()}),u("history:changed",()=>de()),u("history:applied",()=>r.refresh()),u("cell:reverted",_=>{if(!_||_.colId!==it(X.columnProperty))return;const j=r.card(_.key);r.fire("card:reverted",{keys:[_.key],cards:j?[j]:[],from:j?[j.columnId]:[],to:j?j.columnId:null,index:null,orders:null,reverted:!0,reason:_.reason})}),u("cell:confirmed",_=>{if(!_||_.colId!==it(X.columnProperty))return;const j=r.card(_.key);r.fire("card:confirmed",{keys:[_.key],cards:j?[j]:[],to:j?j.columnId:null})})};Ve&&Be(),r.rebind=n=>!Ve||!n||n===L.grid?r:(L.grid=n,X.grid=n,Be(),yt(),e()),r.rows={apply(n={}){if(Ve){x("kanban:apply-gridbound","rows.apply on a grid-bound board is ignored; route to the bound grid instead.");return}at=!0;for(const u of n.add||[])$e.set(X.key(u),u);for(const u of n.update||[]){const _=X.key(u);$e.set(_,G($e.get(_),u))}for(const u of n.remove||[])$e.delete(u);r.model=N(X,[...$e.values()],oe),r.el?Q(r):T(r.paintSelection)&&r.paintSelection(),r.sla&&T(r.sla.evaluate)&&r.sla.evaluate()},forEach(n){for(const[u,_]of $e)n(_,u)},get count(){return $e.size}},r.setRows=n=>Ve?(x("kanban:setRows-gridbound","setRows on a grid-bound board is ignored; the rows come from the bound grid."),r):(Array.isArray(n)&&(L.rows=n),at=!1,yt(),e()),r.setColumns=n=>Array.isArray(n)?(X.columns=n,L.columns=n,X.doneColumns=$(L.doneColumns,n),e()):r,r.columns=()=>r.model.columns,r.column=n=>r.model.columns.find(u=>u.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),r.on=(n,u)=>(Me.includes(n)||x(`kanban:event:${n}`,`"${n}" is not a board event; expected one of ${Me.join(", ")}.`),rt.on(n,u)),r.off=(n,u)=>rt.off(n,u),r.readonly=(n={})=>ft(n);let tt=null;if(r.destroy=()=>{gt.fail(new Error("lattice-grid: the board was destroyed before it became ready.")),tt&&(tt(),tt=null);const n=r.el;if(n){for(;n.firstChild;)n.removeChild(n.firstChild);n.classList.remove(st),delete n.__latticeKanban}r._tokenScopeOff&&(r._tokenScopeOff(),r._tokenScopeOff=null),Ae(),Ye(),et.clear(),r.flow&&T(r.flow.destroy)&&r.flow.destroy(),r.sla&&T(r.sla.destroy)&&r.sla.destroy(),r.model={columns:[],cardsByKey:new Map,unplaced:[]}},Ee){const n=L.transitionLog||(k(L.source)?L.source.transitionLog:null);r.flowAvailable=L.flow!==!1&&!!n,r.flowAvailable?r.flow=Qe(r,{...k(L.flow)?L.flow:{},history:n}):r.flow=null}else L.flow!==!1&&(r.flow=Qe(r,k(L.flow)?L.flow:{}));if(L.sla&&(r.sla=Le(r,k(L.sla)?L.sla:{})),k(L.state)){const n=L.state;if(Array.isArray(n.collapsedColumns)&&(oe.collapsedColumns=new Set(n.collapsedColumns)),Array.isArray(n.collapsedLanes)&&(oe.collapsedLanes=new Set(n.collapsedLanes)),"columnOrder"in n&&(Array.isArray(n.columnOrder)||n.columnOrder===null)&&(oe.columnOrder=n.columnOrder?[...n.columnOrder]:null),"laneOrder"in n&&(Array.isArray(n.laneOrder)||n.laneOrder===null)&&(oe.laneOrder=n.laneOrder?[...n.laneOrder]:null),typeof n.quickFilter=="string"&&(oe.quickFilter=n.quickFilter),"sprint"in n&&(oe.sprint=n.sprint),"epic"in n&&(oe.epic=n.epic),typeof n.blockedFilter=="boolean"&&(oe.blockedFilter=n.blockedFilter),Array.isArray(n.selection))for(const u of n.selection)h.add(u)}return Ee?Promise.resolve(r.reload()).then(()=>{r.flow&&T(r.flow.seed)&&r.flow.seed(),r.sla&&T(r.sla.start)&&r.sla.start(),gt.settleNow()}):(r.refresh(),r.flow&&T(r.flow.seed)&&r.flow.seed(),r.sla&&T(r.sla.start)&&r.sla.start(),gt.settleSoon()),r.el&&(Ye=R({root:r.el,undo:()=>r.undo(),redo:()=>r.redo()})),Ue&&(Ue.__latticeKanban=r),r.el&&(tt=fe(r.el,L).destroy),r}const mt=ut});var wt=$t("packages/modules/kanban/index.js");typeof module=="object"&&module.exports?module.exports=wt:typeof define=="function"&&define.amd?define(function(){return wt}):At.LatticeGridKanban=wt})(typeof globalThis<"u"?globalThis:this);
|
|
491
|
+
.${I} .${q}{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}
|
|
492
|
+
.${I} .${q}--br{inset-inline-end:0;bottom:0}
|
|
493
|
+
.${I} .${q}--bl{inset-inline-start:0;bottom:0}
|
|
494
|
+
.${I} .${q}--tl{inset-inline-start:0;top:0}
|
|
495
|
+
.${I} .${q}--tr{inset-inline-end:0;top:0}
|
|
496
|
+
.${I} .${q}__link{color:inherit;pointer-events:auto;text-decoration:underline;text-underline-offset:2px}
|
|
497
|
+
.${I} .${q}__free{display:block;margin-top:2px;font-size:12px;font-weight:500;letter-spacing:0;opacity:.92}
|
|
498
|
+
@media print{.${I} .${q}{opacity:1}}
|
|
499
|
+
`;class a{#t;#e;#n;#r=null;#o=[];#i;#s=0;#l=null;#a=null;#c=!1;constructor(_){this.#a=_.owner||null,this.#a&&k(this.#a.setAttribute)&&this.#a.setAttribute(P,""),this.#t=_.grid,this.#e=_.document,this.#n=_.element,this.#i=_.window||(typeof globalThis>"u"?{}:globalThis)}mount(){this.refresh(),k(this.#t.on)&&this.#o.push(this.#t.on("licence:changed",()=>this.refresh()));const _=this.#t.licence&&this.#t.licence.ready;_&&k(_.then)&&_.then(()=>this.refresh(),()=>this.refresh())}refresh(){const _=this.#p()&&!this.#u();_&&!this.#r?(this.#g(),this.#d()):!_&&this.#r&&(this.#h(),this.#f())}#u(){const _=this.#n;let A=_&&_.parentNode;for(this.#a&&A===this.#a&&(A=A.parentNode);A&&A.nodeType===1;){if(k(A.hasAttribute)&&A.hasAttribute(P))return!0;A=A.parentNode}return!1}#m(){const _=this.#i;if(!_||!k(_.matchMedia))return!1;try{return!!_.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}#d(){this.#f(),k(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)%Z.length,this.#h(),this.#g(),this.#d()},ie)))}#f(){this.#l!==null&&k(this.#i.clearTimeout)&&this.#i.clearTimeout(this.#l),this.#l=null}#p(){const _=this.#t.licence;return!!(_&&k(_.watermark)&&_.watermark())}#g(){const _=this.#t.messages&&k(this.#t.messages.t)?this.#t.messages:B,A=E(this.#e,"a",{class:`${q}__link`,text:_.t("licence.watermark"),attrs:{href:U,target:"_blank",rel:"noopener noreferrer"}}),W=E(this.#e,"span",{class:`${q}__free`,text:_.t("licence.watermark.free")});this.#r=E(this.#e,"div",{class:`${q} ${q}--${Z[this.#s]}`,attrs:{role:"note",title:"This grid is unlicensed for this domain. Visit latticegrid.dev for a licence."},children:[A,W]}),this.#o.push(R(this.#r,"pointerdown",G=>{k(G.stopPropagation)&&G.stopPropagation()})),this.#n&&k(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&&k(this.#r.remove)&&this.#r.remove(),this.#r=null}destroy(){this.#f(),this.#a&&k(this.#a.removeAttribute)&&this.#a.removeAttribute(P);for(const _ of this.#o)_();this.#o=[],this.#h()}}function h(f={},_=void 0){const A=globalThis[K],W=!f.licence&&_&&k(_.querySelector)?_.querySelector('meta[name="lattice-license"]')?.getAttribute("content"):null,G=f.licence||W;return G&&S(G),{licence:{watermark:()=>l(),get ready(){return A?A.verify():Promise.resolve()}},on:(X,Oe)=>X==="licence:changed"&&A?A.onSettled(()=>Oe()):()=>{}}}function c(f,_={}){const A=f&&f.ownerDocument;if(!A||!k(A.createElement))return{destroy(){},refresh(){}};const W=A.defaultView||void 0,G=h(_,A);let X=null,Oe=null,Se=null,O=!1;const oe=()=>{if(!A.getElementById(N)&&A.head){const Ie=A.createElement("style");Ie.id=N,Ie.textContent=w,A.head.appendChild(Ie)}W&&k(W.getComputedStyle)&&W.getComputedStyle(f).position==="static"&&(f.style.position="relative"),X=A.createElement("div"),X.className=I,f.appendChild(X),Oe=new a({grid:G,document:A,element:X,window:W,owner:f}),Oe.mount(),W&&k(W.MutationObserver)&&(Se=new W.MutationObserver(()=>{!O&&X&&X.parentNode!==f&&f.appendChild(X)}),Se.observe(f,{childList:!0}))},me=()=>{O||(Oe?Oe.refresh():G.licence.watermark()&&oe())};me();const ye=G.on("licence:changed",me);return G.licence.ready,{refresh:me,destroy(){O||(O=!0,ye(),Se&&Se.disconnect(),Oe&&Oe.destroy(),X&&X.parentNode&&X.parentNode.removeChild(X))}}}const u=a}),Ke("packages/modules/kanban/source.js",function(m,ee){"use strict";Object.defineProperty(m,"COUNT_ID",{enumerable:!0,get:function(){return l}}),Object.defineProperty(m,"POINTS_ID",{enumerable:!0,get:function(){return S}}),Object.defineProperty(m,"isPushdownSource",{enumerable:!0,get:function(){return B}}),Object.defineProperty(m,"engineFilterTree",{enumerable:!0,get:function(){return E}}),Object.defineProperty(m,"totalsRequest",{enumerable:!0,get:function(){return R}}),Object.defineProperty(m,"totalsAggregates",{enumerable:!0,get:function(){return q}}),Object.defineProperty(m,"totalsKey",{enumerable:!0,get:function(){return U}}),Object.defineProperty(m,"parseTotals",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(m,"applyTotals",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(m,"columnPageRequest",{enumerable:!0,get:function(){return K}}),Object.defineProperty(m,"appendRows",{enumerable:!0,get:function(){return P}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isFunction,T=o.isNil,te=o.isObject,j=ee("packages/core/src/internal/warn.js").warnOnce,l="\0kanban-count",S="\0kanban-points";function B(I){return te(I)&&k(I.fetch)&&k(I.aggregate)}function E(I){const N=[];if(I.filters&&I.filters.size)for(const w of I.filters.values())k(w)||te(w)&&N.push(w);return N.length?N.length===1?N[0]:{op:"and",conditions:N}:null}function R(I,N){const w=[I.columnProperty];I.swimlanes&&I.swimlaneProperty&&w.push(I.swimlaneProperty);const a=typeof N.quickFilter=="string"?N.quickFilter.trim():"";return{filters:E(N),quick:a||"",groupBy:w}}function q(I){const N=[{id:l,col:I.columnProperty,fn:"count"}];return I.pointsProperty&&N.push({id:S,col:I.pointsProperty,fn:"sum"}),N}function U(I,N){return N===void 0?String(I):`${N}|${I}`}function Z(I,N){const w=Array.isArray(N&&N.engine)?N.engine:[],a=Array.isArray(N&&N.client)?N.client:[],h=Array.isArray(N&&N.groups)?N.groups:null,c=new Map;if(!h)return{byKey:c,engine:w,client:a,groups:h};const u=I.swimlanes&&I.swimlaneProperty;for(const f of h){if(!f||!Array.isArray(f.keys))continue;const _=f.keys;if(T(_[0])||u&&T(_[1]))continue;const A=String(_[0]),W=u?String(_[1]):void 0,G=f.values||{},X=Number(G[l]),Oe=Number(G[S]);c.set(U(A,W),{count:Number.isFinite(X)?X:0,points:Number.isFinite(Oe)?Oe:0})}return{byKey:c,engine:w,client:a,groups:h}}function ie(I,N,w){const a=N.swimlanes&&N.swimlaneProperty;for(const h of I.columns){let c=0,u=0;if(a&&Array.isArray(I.lanes))for(const f of I.lanes){const _=Array.isArray(f.columns)?f.columns.find(W=>W.id===h.id):null,A=w.get(U(h.id,f.id))||{count:0,points:0};_&&(_.count=A.count,_.points=A.points),c+=A.count,u+=A.points}else{const f=w.get(U(h.id,void 0))||{count:0,points:0};c=f.count,u=f.points}h.count=c,h.points=u,h.over=h.wipLimit!==null&&c>h.wipLimit}if(a&&Array.isArray(I.lanes))for(const h of I.lanes){let c=0,u=0;for(const f of I.columns){const _=w.get(U(f.id,h.id))||{count:0,points:0};c+=_.count,u+=_.points}h.count=c,h.points=u}}function K(I,N,w,a,h,c){const u=[],f=E(N);f&&u.push(f),u.push({col:I.columnProperty,op:"eq",value:w,caseSensitive:!0}),a!==void 0&&I.swimlaneProperty&&u.push({col:I.swimlaneProperty,op:"eq",value:a,caseSensitive:!0});const _=typeof N.quickFilter=="string"?N.quickFilter.trim():"";return{filters:u.length===1?u[0]:{op:"and",conditions:u},quick:_||"",sort:I.orderProperty?[{col:I.orderProperty,dir:"asc"}]:null,range:{start:h,end:h+c}}}function P(I,N,w){const a=[];for(const h of w||[]){let c;try{c=N.key(h)}catch{continue}if(T(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,h),a.push(c)}return a}}),Ke("packages/modules/kanban/index.js",function(m,ee){"use strict";Object.defineProperty(m,"createKanban",{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(m,"default",{enumerable:!0,get:function(){return ot}});const o=ee("packages/core/src/internal/predicates.js"),k=o.isObject,T=o.isFunction,te=o.isNil,ne=ee("packages/core/src/internal/warn.js"),j=ne.warnOnce,l=ne.fail,S=ee("packages/core/src/internal/paths.js"),B=S.getPath,E=S.setPath,q=ee("packages/core/src/internal/uid.js").uid,Z=ee("packages/core/src/internal/merge.js").mergeRow,K=ee("packages/core/src/internal/ready.js").createReadySignal,P=ee("packages/modules/kanban/model.js"),I=P.resolveContext,N=P.groupRows,w=P.keyFn,a=P.computeOrders,h=P.accessorFor,c=P.rollup,u=P.BACKLOG,f=P.DEFAULT_FILTER,_=P.deriveDoneColumns,A=P.laneIdOf,W=P.resolveColumnWidth,G=P.resolveColumnWidthRange,X=ee("packages/modules/kanban/view.js"),Oe=X.resolveReadonly,Se=X.renderPreserving,O=X.applyColumnWidths,oe=X.installSelectionPainter,me=X.openDetail,ye=X.closeDetail,Ie=X.startEdit,Ne=X.openRequiredForm,J=X.closeRequiredForm,Q=ee("packages/modules/kanban/workflow.js"),re=Q.canMove,De=Q.transitionError,xe=Q.missingRequired,Ge=Q.requiredError,Ve=ee("packages/modules/shared/emitter.js").Emitter,je=ee("packages/modules/kanban/flow.js").createFlowAnalytics,ct=ee("packages/modules/kanban/sla.js").createSlaMonitor,y=ee("packages/modules/kanban/styles.js").NS,D=ee("packages/modules/kanban/history.js"),Y=D.createHistory,de=D.installUndoShortcuts,se=ee("packages/dom/src/watermark.js").mountViewWatermark,le=ee("packages/modules/kanban/source.js"),ce=le.isPushdownSource,he=le.totalsRequest,we=le.totalsAggregates,He=le.parseTotals,$e=le.applyTotals,ze=le.columnPageRequest,it=le.appendRows,ut=Object.freeze(["card:click","card:dblclick","card:contextmenu","card:move","card:reverted","card:confirmed","selection:changed","column:collapse","card:add","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"]),bt=Object.freeze({onCardClick:"card:click",onCardDblClick:"card:dblclick",onCardContextMenu:"card:contextmenu"});function gt(at,dt){if(Array.isArray(at.rows))return at.rows;const F=at.grid;if(!F||!F.rows||!T(F.rows.forEach))return[];const z=[dt.columnProperty,dt.pointsProperty,dt.orderProperty,dt.swimlaneProperty,dt.sprintProperty,dt.epicProperty].filter(Re=>typeof Re=="string"),rt=F.columns&&T(F.columns.all)?F.columns.all():[],ft=Re=>{if(F.columns&&T(F.columns.get)&&F.columns.get(Re))return Re;const ke=rt.find(st=>st&&st.field===Re);return ke?ke.id:Re},kt=new Map(z.map(Re=>[Re,ft(Re)])),Ue=[];return F.rows.forEach(Re=>{if(Re&&Re.group||Re&&Re.pending===!0)return;const ke=Re.key,st={__boardKey:ke};for(const et of z)try{st[et]=F.rows.value(ke,kt.get(et))}catch{st[et]=void 0}Ue.push(st)}),Ue}function Ye(at,dt={}){const F=k(dt)?dt:{},z=I(F);F.grid&&!Array.isArray(F.rows)&&(z.key=w("__boardKey"));const rt=new Ve("kanban"),ft=Oe(F.readonly),kt=at&&at.ownerDocument||typeof globalThis<"u"&&globalThis.document||null,Ue=!!F.grid&&!Array.isArray(F.rows),Re=ce(F.source)&&!Array.isArray(F.rows)&&!Ue,ke=new Map;let st=!1;const et=n=>{if(!Ue||typeof n!="string")return n;const d=F.grid.columns;if(!d)return n;try{if(T(d.get)&&d.get(n))return n;const x=(T(d.all)?d.all():[]).find(M=>M&&M.field===n);return x?x.id:n}catch{return n}},ae={collapsedColumns:new Set,collapsedLanes:new Set,columnOrder:Array.isArray(F.columnOrder)?[...F.columnOrder]:null,laneOrder:Array.isArray(F.laneOrder)?[...F.laneOrder]:null,filters:new Map(T(F.filter)?[[f,F.filter]]:[]),quickFilter:typeof F.quickFilter=="string"?F.quickFilter:"",sprint:F.sprint===void 0?void 0:F.sprint,epic:F.epic===void 0?void 0:F.epic,blockedFilter:!!F.blockedFilter},pt=K(),r={el:at||null,doc:kt,ctx:z,config:F,emitter:rt,isReadonly:ft,wired:!1,ready:pt.promise,rowKey:F.rowKey??(Ue?"__boardKey":"id"),model:{columns:[],cardsByKey:new Map,unplaced:[]},live:null,flowAvailable:!0,sourceBound:Re,columnWidth:z.columnWidth,minColumnWidth:z.minColumnWidth,maxColumnWidth:z.maxColumnWidth,fire(n,d){rt.emit(n,d);for(const[$,x]of Object.entries(bt))x===n&&T(F[$])&&F[$](d)}},e=Y({historyDepth:F.historyDepth});if(r._totals=new Map,r._pages=new Map,Re&&T(F.source.resolveAggregatePlan)){const n=F.source.resolveAggregatePlan(we(z));(!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,$,x,M)=>{const ge=$.origin||"user",_e=()=>(r.fire(d,{...$,reason:$.reason||"prevented"}),M()),pe=rt.emitBefore(n,$,ge);return pe===!0?x():pe===!1?_e():pe.then(Ee=>Ee?x():_e())};T(F.onBeforeMove)&&rt.on("beforeMove",n=>F.onBeforeMove(n.card,n.from,n.to,n.index));const i=()=>{ke.clear();for(const n of gt(F,z))ke.set(z.key(n),n)},s=()=>(r.model=N(z,[...ke.values()],ae),Re&&$e(r.model,z,r._totals),r.el&&Se(r),r),p=(n,d)=>d===void 0?String(n):`${d}|${n}`,b=async()=>{try{const n=await F.source.aggregate(he(z,ae),we(z)),d=He(z,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}`)}s()},L=async(n,d)=>{const $=p(n,d);let x=r._pages.get($);if(x||(x={loaded:0,loading:!1,exhausted:!1},r._pages.set($,x)),x.loading||x.exhausted)return!1;x.loading=!0;try{const M=ze(z,ae,n,d,x.loaded,z.pageSize),ge=await F.source.fetch(M),_e=ge&&ge.rows||[],pe=it(ke,z,_e);x.loaded+=_e.length;const Ee=ge&&typeof ge.total=="number"?ge.total:null;return(!_e.length||_e.length<z.pageSize||Ee!==null&&x.loaded>=Ee)&&(x.exhausted=!0),s(),r.fire("cards:loaded",{column:n,lane:d,keys:pe,more:!x.exhausted}),!x.exhausted}catch(M){return x.exhausted=!0,j("kanban:source:page",`the pushdown source failed to answer a column page: ${M&&M.message?M.message:M}`),!1}finally{x.loading=!1}};r.reload=async()=>{r._pages.clear(),ke.clear(),await b();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 x of n)await L(x,$);else for(const $ of n)await L($,void 0);return r},r.loadMore=(n,d)=>Re?L(n,d):Promise.resolve(!1),r.refresh=()=>(Re||st||i(),s()),r.repaint=()=>(r.el&&Se(r),r);const v={loading:!1,error:null};r.status=v,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:[...C]}),r.setState=n=>{const d=k(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)){C.clear();for(const $ of d.selection)C.add($)}return s()},r.setLoading=n=>(v.loading=!!n,s()),r.setError=n=>(v.error=te(n)?null:String(n),s());const C=new Set;r.selection=()=>[...C],r.isSelected=n=>C.has(n),r.select=(n,d="set")=>{const $=(Array.isArray(n)?n:[n]).filter(x=>!te(x));if(d==="set"){C.clear();for(const x of $)C.add(x)}else if(d==="add")for(const x of $)C.add(x);else if(d==="remove")for(const x of $)C.delete(x);else if(d==="toggle")for(const x of $)C.has(x)?C.delete(x):C.add(x);return r.selectionSet=C,r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("selection:changed",{keys:[...C]}),r},r.clearSelection=()=>r.select([],"set"),r.selectionSet=C,oe(r),r.collapseColumn=(n,d)=>{const $=d===void 0?!ae.collapsedColumns.has(n):!!d;return t("beforeColumnChange","columnChange:cancelled",{column:n,collapsed:$,origin:"user"},()=>($?ae.collapsedColumns.add(n):ae.collapsedColumns.delete(n),s(),r.fire("column:collapse",{column:n,collapsed:$}),r),()=>r)},r.collapseLane=(n,d)=>{const $=d===void 0?!ae.collapsedLanes.has(n):!!d;return $?ae.collapsedLanes.add(n):ae.collapsedLanes.delete(n),s(),r.fire("swimlane:collapse",{swimlane:n,collapsed:$}),r},r.reorderColumns=n=>Array.isArray(n)?t("beforeColumnReorder","columnReorder:cancelled",{order:[...n],origin:"user"},()=>(ae.columnOrder=[...n],s(),r.fire("column:reorder",{order:r.model.columns.map(d=>d.id)}),r),()=>(r.el&&s(),r)):r,r.moveColumn=(n,d)=>{const $=r.model.columns.map(M=>M.id).filter(M=>M!==n),x=te(d)?$.length:$.indexOf(d);return $.splice(x<0?$.length:x,0,n),r.reorderColumns($)},r.reorderLanes=n=>Array.isArray(n)?t("beforeLaneReorder","laneReorder:cancelled",{order:[...n],origin:"user"},()=>(ae.laneOrder=[...n],s(),r.fire("swimlane:reorder",{order:(r.model.lanes||[]).map(d=>d.id)}),r),()=>(r.el&&s(),r)):r,r.moveLane=(n,d)=>{const $=(r.model.lanes||[]).map(M=>M.id).filter(M=>M!==n),x=te(d)?$.length:$.indexOf(d);return $.splice(x<0?$.length:x,0,n),r.reorderLanes($)};const V=()=>{r.fire("filter:changed",{quickFilter:ae.quickFilter,hasFilter:ae.filters.size>0,filters:[...ae.filters.keys()]}),s(),Re&&Promise.resolve(r.reload())};r.filters={DEFAULT:f,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)&&V(),r):T(d)?(ae.filters.set(n,d),V(),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)&&V(),r):k(d)?(Re||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),V(),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?(V(),!0):!1:ae.filters.has(n)?(V(),!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,T(n)?n:null),r.setQuickFilter=n=>(ae.quickFilter=typeof n=="string"?n:"",V(),r),r.facets=n=>{const d=h(n),$=new Map;for(const x of ke.values()){const M=d(x);$.set(M,($.get(M)||0)+1)}return[...$.entries()].map(([x,M])=>({value:x,count:M})).sort((x,M)=>M.count-x.count)},r.BACKLOG=u,r.setSprint=n=>(ae.sprint=n,r.fire("sprint:changed",{sprint:n}),s()),r.showBacklog=()=>r.setSprint(u),r.setEpic=n=>(ae.epic=n,r.fire("epic:changed",{epic:n}),s()),r.sprints=()=>{const n=z.sprintProperty?r.facets(z.sprintProperty).map(x=>x.value):[];if(!z.sprintList)return n;const d=z.sprintList.map(x=>x.id),$=n.filter(x=>!te(x)&&x!==""&&!d.some(M=>String(M)===String(x)));return[...d,...$]},r.sprintDefs=()=>{const n=z.sprintList||[],d=new Map(n.map(M=>[String(M.id),M])),$=n.map(M=>({id:M.id,title:te(M.title)?String(M.id):String(M.title)})),x=z.sprintProperty?r.facets(z.sprintProperty).map(M=>M.value):[];for(const M of x)!te(M)&&M!==""&&!d.has(String(M))&&$.push({id:M,title:String(M)});return $},r.epics=()=>z.epicProperty?r.facets(z.epicProperty).map(n=>n.value):[];const ve=n=>z.doneColumns.has(String(h(z.columnProperty)(n)));r.rollup=n=>c(z,[...ke.values()],n,ve),r.epicRollup=()=>z.epicProperty?r.rollup(z.epicProperty):[];const ue=n=>{const d=F.children||{};if(T(d.load))return Promise.resolve(d.load(n));if(typeof d.property=="string"){const $=h(d.property);return Promise.resolve([...ke.values()].filter(x=>String($(x))===String(n.key)))}return Promise.resolve([])};r.canExpand=n=>{const d=F.children;if(!d)return!1;if(T(d.hasChildren))return!!d.hasChildren(n);if(T(d.load))return!0;if(typeof d.property=="string"){const $=h(d.property);for(const x of ke.values())if(String($(x))===String(n.key))return!0}return!1},r.expand=async(n,d={})=>{const $=r.model.cardsByKey.get(n);if(!$||!F.children)return null;const x=await ue($),M=d.depth!==void 0?d.depth:F.__depth||0,ge=me(r,$,x,M);return r.fire("card:expand",{card:$,rows:x,present:F.children.present||"drawer"}),M>0&&r.fire("card:drill",{card:$,rows:x,depth:M}),ge},r.buildChild=(n,d,$,x)=>{const M=F.children||{};if(T(M.render)){const pe=M.render(n,{card:d,rows:$,board:r,depth:x});return{destroy:()=>{T(pe)&&pe()}}}if(M.asBoard){const pe=Ye(n,{...be(M,d),rows:$,children:F.children,__depth:x+1});return{destroy:()=>pe.destroy()}}const ge=M.factory||typeof globalThis<"u"&&globalThis.LatticeGrid&&globalThis.LatticeGrid.createGrid;if(!T(ge))return j("kanban:children-factory","a card pop-out needs children.factory (a createGrid), children.render, or children.asBoard."),{destroy:()=>{}};const _e=ge(n,{rows:$,...be(M,d)});return{destroy:()=>{_e&&T(_e.destroy)&&_e.destroy()}}};const be=(n,d)=>{const $=n.gridOptions;return{...T($)?$(d)||{}:k($)?$:{}}};r.closeDetail=()=>(ye(r),r),r.isFieldEditable=n=>{const d=z.cardSpecs[n];return!!(d&&d.edit&&typeof d.field=="string")},r.editCard=(n,d)=>{const $=r.model.cardsByKey.get(n);if(!$)return null;const x=d||Object.keys(z.cardSpecs).find(M=>r.isFieldEditable(M));return!x||!r.isFieldEditable(x)||r.isReadonly({column:$.columnId,card:n})?null:Ie(r,n,x)},r.applyEdit=async(n,d,$,x={})=>{const M=x.origin||"user",ge=r.model.cardsByKey.get(n),_e=z.cardSpecs[d];if(!ge||!_e||typeof _e.field!="string")return!1;const pe=_e.field,Ee={card:ge,key:n,field:d,fieldPath:pe,value:$,origin:M};if(!await Promise.resolve(rt.emitBefore("beforeEdit",Ee,M)))return r.fire("edit:cancelled",{...Ee,reason:Ee.reason||"prevented"}),!1;if(Ue){const Ze=F.grid.edit.setCells([{key:n,colId:et(pe),value:$}],"cell");return r.refresh(),Ze===0?(j("kanban:writeback-noop",`an inline edit to "${pe}" 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 Pe={...ke.get(n)},qe=B(Pe,pe);if(E(ke.get(n),pe,$),s(),r.fire("card:edit",Ee),T(F.onCardEdit)){let Ze=F.onCardEdit(Ee);if(Ze=Ze instanceof Promise?await Ze.then(vt=>vt,()=>!1):Ze,Ze===!1)return ke.set(n,Pe),s(),!1}return e.replaying||(e.record({label:"edit",undo:()=>r.applyEdit(n,d,qe),redo:()=>r.applyEdit(n,d,$)}),fe()),!0},r.setBlocked=async(n,d,$,x={})=>{const M=x.origin||"user",ge=r.model.cardsByKey.get(n);if(!ge||!z.blockedProperty||r.isReadonly({column:ge.columnId,card:n}))return!1;const _e=z.blockedProperty,pe=d?typeof $=="string"&&$.trim()!==""?$.trim():!0:!1,Ee={card:ge,key:n,field:"blocked",fieldPath:_e,value:pe,origin:M};if(!await Promise.resolve(rt.emitBefore("beforeEdit",Ee,M)))return r.fire("edit:cancelled",{...Ee,reason:Ee.reason||"prevented"}),!1;if(Ue){const qe=F.grid.edit.setCells([{key:n,colId:et(_e),value:pe}],"cell");return r.refresh(),qe===0?(j("kanban:blocked-writeback-noop",`blocking/unblocking did not persist through the bound grid: writing "${_e}" was refused (a read-only, non-editable, permission-blocked or unresolvable column).`),!1):(r.fire("card:edit",Ee),!0)}const Pe={...ke.get(n)};if(E(ke.get(n),_e,pe),s(),r.fire("card:edit",Ee),T(F.onCardEdit)){let qe=F.onCardEdit(Ee);if(qe=qe instanceof Promise?await qe.then(Ze=>Ze,()=>!1):qe,qe===!1)return ke.set(n,Pe),s(),!1}return!0},r.applyRequired=async(n,d,$,x={})=>{const M=x.origin||"user",ge=r.model.cardsByKey.get(n);if(!ge||typeof d!="string")return!1;const _e={card:ge,key:n,field:d,fieldPath:d,value:$,origin:M};if(!await Promise.resolve(rt.emitBefore("beforeEdit",_e,M)))return r.fire("edit:cancelled",{..._e,reason:_e.reason||"prevented"}),!1;if(Ue){const Pe=F.grid.edit.setCells([{key:n,colId:et(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",_e),!0)}const Ee={...ke.get(n)},We=B(Ee,d);if(E(ke.get(n),d,$),s(),r.fire("card:edit",_e),T(F.onCardEdit)){let Pe=F.onCardEdit(_e);if(Pe=Pe instanceof Promise?await Pe.then(qe=>qe,()=>!1):Pe,Pe===!1)return ke.set(n,Ee),s(),!1}return e.replaying||(e.record({label:"edit",undo:()=>r.applyRequired(n,d,We),redo:()=>r.applyRequired(n,d,$)}),fe()),!0},r.toggleBlocked=(n,d)=>{const $=r.model.cardsByKey.get(n),x=!!($&&$.explicitBlocked);return r.setBlocked(n,!x,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}),s()),r.requestMove=(n,d,$=null,x=void 0,M={})=>{const ge=M.origin||"user",_e=(Array.isArray(n)?n:[n]).filter(pe=>r.model.cardsByKey.has(pe));if(!_e.length)return r.move(n,d,$,x,M);if(r.el){const pe=[];for(const Ee of _e){const We=r.model.cardsByKey.get(Ee),Pe=A(We.swimlane);for(const qe of xe(z,Pe,d,We.row))pe.push({key:Ee,card:We,field:qe.field,label:qe.label,editor:qe.editor})}if(pe.length)return Ne(r,{keys:_e,toColumn:d,toIndex:$,toLane:x,origin:ge,entries:pe}),null}return r.move(n,d,$,x,M)},r.addCard=(n,d={})=>r.isReadonly({column:n})?null:t("beforeAdd","add:cancelled",{column:n,seed:d,origin:"user"},()=>{let $={...d};if(E($,z.columnProperty,n),Ue){const M=F.grid.edit.addRow?F.grid.edit.addRow($):null;return M==null?(j("kanban:addRow","the bound grid cannot append a row (no mutate.append)."),null):(r.refresh(),r.fire("card:add",{column:n,key:M}),r.el&&r.editCard(M),M)}const x=M=>{let ge=z.key(M);return te(ge)&&(ge=q("card"),typeof r.rowKey=="string"&&E(M,r.rowKey,ge)),ke.set(ge,M),s(),r.fire("card:add",{column:n,key:ge}),r.el&&r.editCard(ge),e.replaying||(e.record({label:"add",undo:()=>(ke.delete(ge),s(),!0),redo:()=>(ke.set(ge,M),s(),!0)}),fe()),ge};if(T(F.onAddCard)){const M=F.onAddCard(n);if(M instanceof Promise)return M.then(ge=>x(k(ge)?ge:$),()=>null);k(M)&&($=M)}return x($)},()=>null);const Ce=(n,d,$)=>{if(!z.orderProperty)return null;const x=r.model.columns.find(pe=>pe.id===d),M=(x?x.cards:[]).filter(pe=>!n.includes(pe.key)),ge=M.map(pe=>Number(h(z.orderProperty)(pe.row))),_e=te($)?M.length:$;return a(ge,_e,n.length)},Xe=async(n,d,$,x="user")=>{const M=[],ge=[],_e=r.model.columns.find(We=>We.id===d),pe=z.enforceWip&&_e&&Number.isFinite(_e.wipLimit)?_e.wipLimit:null;let Ee=_e?Re?_e.count:_e.cards.filter(We=>!n.includes(We.key)).length:0;for(const We of n){const Pe=r.model.cardsByKey.get(We);if(!Pe)continue;const qe=Pe.columnId;if(r.isReadonly({column:qe,card:We})||r.isReadonly({column:d}))continue;const Ze=r.model.columns.findIndex(ht=>ht.id===d),vt=Pe.columnId===null?-1:r.model.columns.findIndex(ht=>ht.id===Pe.columnId),Te=A(Pe.swimlane);if(Pe.blocked&&Ze>vt&&re(z,Te,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.`),ge.push({key:We,card:Pe,from:qe,reason:"blocked"});continue}if(pe!==null&&qe!==d&&Ee+1>pe){j(`kanban:wip:${d}`,`a move into "${d}" was refused: it is at its WIP limit of ${pe}.`);continue}const Le={card:Pe,key:We,from:qe,to:d,index:$,origin:x},Me=rt.emitBefore("beforeMove",Le,x);(Me===!0?!0:Me===!1?!1:await Me)!==!1?(M.push({key:We,card:Pe,from:qe}),qe!==d&&(Ee+=1)):ge.push({key:We,card:Pe,from:qe,reason:Le.reason||"prevented"})}for(const We of ge)r.fire("move:cancelled",{keys:[We.key],cards:[We.card],from:[We.from],to:d,index:$,reason:We.reason});return M};r.move=async(n,d,$=null,x=void 0,M={})=>{const ge=M.origin||"user",_e=(Array.isArray(n)?n:[n]).filter(Te=>r.model.cardsByKey.has(Te));for(const Te of _e){const Le=r.model.cardsByKey.get(Te),Me=A(Le.swimlane);if(!re(z,Me,Le.columnId,d))throw l(De(z,Me,Le.columnId,d));const Qe=xe(z,Me,d,Le.row);if(Qe.length)throw l(Ge(z,Me,d,Qe))}const pe=await Xe(_e,d,$,ge);if(!pe.length)return{moved:[],reverted:!1};const Ee=pe.map(Te=>Te.key),We=Ue?null:pe.map(({key:Te,from:Le})=>{const Me=r.model.columns.find(yt=>yt.id===Le),Qe=Me?Me.cards.findIndex(yt=>yt.key===Te):0,ht=ke.get(Te),$t=z.swimlaneProperty&&ht?h(z.swimlaneProperty)(ht):void 0;return{key:Te,from:Le,index:Qe,lane:$t}}),Pe=Ce(Ee,d,$),qe=x!==void 0&&!!z.swimlaneProperty,Ze={keys:Ee,cards:pe.map(Te=>Te.card),from:pe.map(Te=>Te.from),to:d,index:$,origin:ge,lane:qe?x:void 0,orders:Pe};if(Ue){const Te=F.grid,Le=[],Me=et(z.columnProperty),Qe=z.orderProperty?et(z.orderProperty):null,ht=qe?et(z.swimlaneProperty):null;pe.forEach(({key:yt},St)=>{Le.push({key:yt,colId:Me,value:d}),Pe&&Qe&&Le.push({key:yt,colId:Qe,value:Pe[St]}),ht&&Le.push({key:yt,colId:ht,value:x})});const $t=Te.edit.setCells(Le,"cell");return r.refresh(),$t===0&&Le.length?(j("kanban:writeback-noop",`a card move did not persist through the bound grid: writing "${z.columnProperty}" was refused (a read-only, non-editable, permission-blocked or unresolvable column), so the card stayed where it was.`),r.fire("card:reverted",{...Ze}),{moved:[],reverted:!0}):(r.fire("card:move",Ze),{moved:Ee,reverted:!1})}if(Re){const Te=F.source.edit&&T(F.source.edit.commit)?F.source.edit:null;if(!Te)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",{...Ze}),{moved:[],reverted:!0};const Le=[];pe.forEach(({key:Me},Qe)=>{Le.push({key:Me,colId:z.columnProperty,value:d}),Pe&&z.orderProperty&&Le.push({key:Me,colId:z.orderProperty,value:Pe[Qe]}),qe&&Le.push({key:Me,colId:z.swimlaneProperty,value:x})});try{await Promise.all(Le.map(Me=>Te.commit(Me)))}catch(Me){return r.fire("card:reverted",{...Ze,reason:Me&&Me.message?Me.message:"write failed"}),{moved:[],reverted:!0}}return r.fire("card:move",Ze),await r.reload(),{moved:Ee,reverted:!1}}const vt=pe.map(({key:Te})=>({key:Te,row:{...ke.get(Te)}}));if(pe.forEach(({key:Te},Le)=>{const Me=ke.get(Te);E(Me,z.columnProperty,d),Pe&&z.orderProperty&&E(Me,z.orderProperty,Pe[Le]),qe&&E(Me,z.swimlaneProperty,x)}),s(),r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("card:move",Ze),T(F.onCardMove)){let Te=F.onCardMove(Ze);if(Te=Te instanceof Promise?await Te.then(Le=>Le,()=>!1):Te,Te===!1){for(const Le of vt)ke.set(Le.key,Le.row);return s(),r.el&&T(r.paintSelection)&&r.paintSelection(),r.fire("card:reverted",{...Ze}),{moved:[],reverted:!0}}}if(!e.replaying){const Te=We[0].from,Le=Math.min(...We.map(Qe=>Qe.index)),Me=z.swimlaneProperty?We[0].lane:void 0;e.record({label:"move",undo:()=>r.move(Ee,Te,Le,Me).then(Qe=>Qe.moved.length>0),redo:()=>r.move(Ee,d,$,x).then(Qe=>Qe.moved.length>0)}),fe()}return{moved:Ee,reverted:!1}};const H=(n="undo")=>{if(Ue){const d=F.grid&&F.grid.history;if(!d||!T(d.peek))return null;const $=d.peek(n);return $?$.label:null}return e.peek(n)},fe=()=>{r.fire("history",{canUndo:r.canUndo(),canRedo:r.canRedo(),label:H("undo")})};r.canUndo=()=>Ue?!!(F.grid&&F.grid.history&&T(F.grid.history.canUndo)&&F.grid.history.canUndo()):e.canUndo(),r.canRedo=()=>Ue?!!(F.grid&&F.grid.history&&T(F.grid.history.canRedo)&&F.grid.history.canRedo()):e.canRedo(),r.undo=async()=>{if(Ue){const d=F.grid&&F.grid.history,$=d&&T(d.undo)?d.undo():null;return fe(),$}const n=await e.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."),fe(),n},r.redo=async()=>{if(Ue){const d=F.grid&&F.grid.history,$=d&&T(d.redo)?d.redo():null;return fe(),$}const n=await e.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."),fe(),n};let Be=()=>{};const tt=[],nt=()=>{for(;tt.length;)tt.pop()()},mt=()=>{nt();const n=F.grid;if(!n||!T(n.on))return;const d=($,x)=>{const M=n.on($,x);tt.push(()=>{T(M)?M():T(n.off)&&n.off($,x)})};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",()=>fe()),d("history:applied",()=>r.refresh()),d("cell:reverted",$=>{if(!$||$.colId!==et(z.columnProperty))return;const x=r.card($.key);r.fire("card:reverted",{keys:[$.key],cards:x?[x]:[],from:x?[x.columnId]:[],to:x?x.columnId:null,index:null,orders:null,reverted:!0,reason:$.reason})}),d("cell:confirmed",$=>{if(!$||$.colId!==et(z.columnProperty))return;const x=r.card($.key);r.fire("card:confirmed",{keys:[$.key],cards:x?[x]:[],to:x?x.columnId:null})})};Ue&&mt(),r.rebind=n=>!Ue||!n||n===F.grid?r:(F.grid=n,z.grid=n,mt(),i(),s()),r.rows={apply(n={}){if(Ue){j("kanban:apply-gridbound","rows.apply on a grid-bound board is ignored; route to the bound grid instead.");return}st=!0;for(const d of n.add||[])ke.set(z.key(d),d);for(const d of n.update||[]){const $=z.key(d);ke.set($,Z(ke.get($),d))}for(const d of n.remove||[])ke.delete(d);r.model=N(z,[...ke.values()],ae),r.el?Se(r):T(r.paintSelection)&&r.paintSelection(),r.sla&&T(r.sla.evaluate)&&r.sla.evaluate()},forEach(n){for(const[d,$]of ke)n($,d)},get count(){return ke.size}},r.setRows=n=>Ue?(j("kanban:setRows-gridbound","setRows on a grid-bound board is ignored; the rows come from the bound grid."),r):(Array.isArray(n)&&(F.rows=n),st=!1,i(),s()),r.setColumns=n=>Array.isArray(n)?(z.columns=n,F.columns=n,z.doneColumns=_(F.doneColumns,n),s()):r,r.setColumnWidth=(n={})=>{if(!k(n))return r;"columnWidth"in n&&(z.columnWidth=W(n.columnWidth),F.columnWidth=z.columnWidth);const d=G({minColumnWidth:"minColumnWidth"in n?n.minColumnWidth:z.minColumnWidth,maxColumnWidth:"maxColumnWidth"in n?n.maxColumnWidth:z.maxColumnWidth});return z.minColumnWidth=d.minColumnWidth,z.maxColumnWidth=d.maxColumnWidth,F.minColumnWidth=d.minColumnWidth,F.maxColumnWidth=d.maxColumnWidth,r.columnWidth=z.columnWidth,r.minColumnWidth=z.minColumnWidth,r.maxColumnWidth=z.maxColumnWidth,O(r),r},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),r.on=(n,d)=>(ut.includes(n)||j(`kanban:event:${n}`,`"${n}" is not a board event; expected one of ${ut.join(", ")}.`),rt.on(n,d)),r.off=(n,d)=>rt.off(n,d),r.readonly=(n={})=>ft(n);let wt=null;if(r.destroy=()=>{pt.fail(new Error("lattice-grid: the board was destroyed before it became ready.")),wt&&(wt(),wt=null);const n=r.el;if(n){for(;n.firstChild;)n.removeChild(n.firstChild);n.classList.remove(y),delete n.__latticeKanban}r._tokenScopeOff&&(r._tokenScopeOff(),r._tokenScopeOff=null),nt(),Be(),e.clear(),r.flow&&T(r.flow.destroy)&&r.flow.destroy(),r.sla&&T(r.sla.destroy)&&r.sla.destroy(),r.model={columns:[],cardsByKey:new Map,unplaced:[]}},Re){const n=F.transitionLog||(k(F.source)?F.source.transitionLog:null);r.flowAvailable=F.flow!==!1&&!!n,r.flowAvailable?r.flow=je(r,{...k(F.flow)?F.flow:{},history:n}):r.flow=null}else F.flow!==!1&&(r.flow=je(r,k(F.flow)?F.flow:{}));if(F.sla&&(r.sla=ct(r,k(F.sla)?F.sla:{})),k(F.state)){const n=F.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)C.add(d)}return Re?Promise.resolve(r.reload()).then(()=>{r.flow&&T(r.flow.seed)&&r.flow.seed(),r.sla&&T(r.sla.start)&&r.sla.start(),pt.settleNow()}):(r.refresh(),r.flow&&T(r.flow.seed)&&r.flow.seed(),r.sla&&T(r.sla.start)&&r.sla.start(),pt.settleSoon()),r.el&&(Be=de({root:r.el,undo:()=>r.undo(),redo:()=>r.redo()})),at&&(at.__latticeKanban=r),r.el&&(wt=se(r.el,F).destroy),r}const ot=Ye});var _t=Pt("packages/modules/kanban/index.js");typeof module=="object"&&module.exports?module.exports=_t:typeof define=="function"&&define.amd?define(function(){return _t}):Ot.LatticeGridKanban=_t})(typeof globalThis<"u"?globalThis:this);
|
|
498
500
|
|
|
499
501
|
//# sourceMappingURL=kanban.min.js.map
|