@toclocoinc/lattice-grid 1.89.0 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +1 -1
- package/angular/package.json +1 -1
- package/docs/API.html +5 -5
- package/docs/THEMING.md +27 -0
- 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/deckgl.html +1 -1
- package/docs/api/designer.html +2 -2
- 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 +1 -1
- package/docs/api/kanban.html +1 -1
- 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/mapview.html +1 -1
- package/docs/api/mock-socket.html +1 -1
- package/docs/api/presets.html +1 -1
- package/docs/api/tabs.html +1 -1
- package/docs/api/types.html +1 -1
- package/docs/api-detail.html +4 -4
- package/docs/warnings.json +1 -1
- package/lattice-grid.d.ts +1 -1
- package/lattice-grid.esm.min.js +3 -3
- package/lattice-grid.min.cjs +3 -3
- package/lattice-grid.min.css +1 -1
- package/lattice-grid.min.js +3 -3
- package/modules/ai.d.ts +1 -1
- package/modules/ai.esm.min.js +2 -2
- package/modules/ai.min.cjs +2 -2
- package/modules/ai.min.js +2 -2
- package/modules/alarms.d.ts +1 -1
- package/modules/alarms.esm.min.js +2 -2
- package/modules/alarms.min.cjs +2 -2
- package/modules/alarms.min.js +2 -2
- package/modules/angular.d.ts +1 -1
- package/modules/angular.esm.min.js +2 -2
- package/modules/angular.min.cjs +2 -2
- package/modules/angular.min.js +2 -2
- package/modules/calendar.d.ts +1 -1
- package/modules/calendar.esm.min.js +2 -2
- package/modules/calendar.min.cjs +2 -2
- package/modules/calendar.min.js +2 -2
- 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-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 +2 -2
- package/modules/charts.min.cjs +2 -2
- package/modules/charts.min.js +2 -2
- package/modules/dashboard.d.ts +1 -1
- package/modules/dashboard.esm.min.js +2 -2
- package/modules/dashboard.min.cjs +2 -2
- package/modules/dashboard.min.js +2 -2
- package/modules/data-router.d.ts +1 -1
- package/modules/data-router.esm.min.js +2 -2
- package/modules/data-router.min.cjs +2 -2
- package/modules/data-router.min.js +2 -2
- package/modules/deckgl.d.ts +1 -1
- package/modules/deckgl.esm.min.js +2 -2
- package/modules/deckgl.min.cjs +2 -2
- package/modules/deckgl.min.js +2 -2
- package/modules/designer.d.ts +1 -1
- package/modules/designer.esm.min.js +187 -73
- package/modules/designer.esm.min.js.map +2 -2
- package/modules/designer.min.cjs +187 -73
- package/modules/designer.min.js +187 -73
- package/modules/designer.min.js.map +2 -2
- 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 +2 -2
- package/modules/dhtmlx-compat.min.cjs +2 -2
- package/modules/dhtmlx-compat.min.js +2 -2
- package/modules/gantt.d.ts +1 -1
- package/modules/gantt.esm.min.js +2 -2
- package/modules/gantt.min.cjs +2 -2
- package/modules/gantt.min.js +2 -2
- 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 +2 -2
- package/modules/geometry.min.cjs +2 -2
- package/modules/geometry.min.js +2 -2
- package/modules/htmx.d.ts +1 -1
- package/modules/htmx.esm.min.js +3 -3
- package/modules/htmx.min.cjs +3 -3
- package/modules/htmx.min.js +3 -3
- package/modules/kanban.d.ts +1 -1
- package/modules/kanban.esm.min.js +2 -2
- package/modules/kanban.min.cjs +2 -2
- package/modules/kanban.min.js +2 -2
- package/modules/kpi.d.ts +1 -1
- package/modules/kpi.esm.min.js +2 -2
- package/modules/kpi.min.cjs +2 -2
- package/modules/kpi.min.js +2 -2
- package/modules/layout.d.ts +1 -1
- package/modules/layout.esm.min.js +2 -2
- package/modules/layout.min.cjs +2 -2
- package/modules/layout.min.js +2 -2
- package/modules/leaflet.d.ts +1 -1
- package/modules/leaflet.esm.min.js +2 -2
- package/modules/leaflet.min.cjs +2 -2
- package/modules/leaflet.min.js +2 -2
- package/modules/list.d.ts +1 -1
- package/modules/list.esm.min.js +2 -2
- package/modules/list.min.cjs +2 -2
- package/modules/list.min.js +2 -2
- package/modules/mapview.d.ts +1 -1
- package/modules/mapview.esm.min.js +2 -2
- package/modules/mapview.min.cjs +2 -2
- package/modules/mapview.min.js +2 -2
- 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/antd5.css +9 -0
- package/modules/presets/bootstrap5.css +9 -0
- package/modules/presets/fluent2.css +9 -0
- package/modules/presets/material3.css +9 -0
- package/modules/presets.d.ts +1 -1
- package/modules/presets.esm.min.js +2 -2
- package/modules/presets.min.cjs +2 -2
- package/modules/presets.min.js +2 -2
- package/modules/react.d.ts +1 -1
- package/modules/react.esm.min.js +2 -2
- package/modules/react.min.cjs +2 -2
- package/modules/react.min.js +2 -2
- package/modules/svelte.d.ts +1 -1
- package/modules/svelte.esm.min.js +2 -2
- package/modules/svelte.min.cjs +2 -2
- package/modules/svelte.min.js +2 -2
- package/modules/tabs.d.ts +1 -1
- package/modules/tabs.esm.min.js +2 -2
- package/modules/tabs.min.cjs +2 -2
- package/modules/tabs.min.js +2 -2
- package/modules/vue.d.ts +1 -1
- package/modules/vue.esm.min.js +2 -2
- package/modules/vue.min.cjs +2 -2
- package/modules/vue.min.js +2 -2
- package/modules/webcomponent.d.ts +1 -1
- package/modules/webcomponent.esm.min.js +3 -3
- package/modules/webcomponent.min.cjs +3 -3
- package/modules/webcomponent.min.js +3 -3
- package/package.json +1 -1
package/modules/kanban.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.89.
|
|
2
|
+
* Lattice Grid 1.89.1, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.0";async function D(){return d}const E="1.89.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(P.length?T=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));P=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>H(P.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)T.push(I);return T}if(!M){for(let I=0;I<P;I++)T.push(X-(P-I));return T}if(!m){for(let I=0;I<P;I++)T.push(B+1+I);return T}const A=(X-B)/(P+1);for(let I=0;I<P;I++)T.push(B+A*(I+1));return T}function ge(y,p,P,S,B=3){const X=P>0?P:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.1";async function D(){return d}const E="1.89.1",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(P.length?T=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));P=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>H(P.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)T.push(I);return T}if(!M){for(let I=0;I<P;I++)T.push(X-(P-I));return T}if(!m){for(let I=0;I<P;I++)T.push(B+1+I);return T}const A=(X-B)/(P+1);for(let I=0;I<P;I++)T.push(B+A*(I+1));return T}function ge(y,p,P,S,B=3){const X=P>0?P:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kanban.min.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.89.
|
|
2
|
+
* Lattice Grid 1.89.1, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.0";async function D(){return d}const E="1.89.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.1";async function D(){return d}const E="1.89.1",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kanban.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.89.
|
|
2
|
+
* Lattice Grid 1.89.1, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.0";async function D(){return d}const E="1.89.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return G}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.89.1";async function D(){return d}const E="1.89.1",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function x(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function G(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function P(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return P=>{const S=y(P);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return P=>E(P,p)}function Y(y,p,P,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(P,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[P,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[P]={field:S.field,edit:!!S.edit,editor:S.editor}:p[P]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const P=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(P.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(P.length?L=[...P.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const P=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,P,m.field);return{key:P,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,P={}){const S=J(Z(y,p),P),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,P)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,P):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let P=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));P=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return P.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((P,S)=>G(P.order)-G(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((P,S)=>P+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,P){if(P.filters&&P.filters.size){for(const X of P.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,P)||!w(y,p,P))return!1;const S=typeof P.quickFilter=="string"?P.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const x="\0backlog",h="\0default";function l(y,p,P){if(P.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return P.sprint===x?U(S)||S==="":String(S)===String(P.sprint)}function w(y,p,P){return P.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(P.epic)}function C(y,p,P,S){const B=oe(P),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,P,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of P.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function G(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,P){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<P;I++)L.push(I);return L}if(!M){for(let I=0;I<P;I++)L.push(X-(P-I));return L}if(!m){for(let I=0;I<P;I++)L.push(B+1+I);return L}const A=(X-B)/(P+1);for(let I=0;I<P;I++)L.push(B+A*(I+1));return L}function ge(y,p,P,S,B=3){const X=P>0?P:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(P=>f(P)&&P.done).map(P=>String(P.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(P=>f(P)?{id:P.id,title:P.title}:{id:P}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kpi.d.ts
CHANGED
package/modules/kpi.esm.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.89.
|
|
2
|
+
* Lattice Grid 1.89.1, kpi module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
var Ut=Object.create(null),Bt=Object.create(null);function Ue(g,ce){Ut[g]=ce}function zt(g){var ce=Bt[g];if(ce)return ce;var X=Object.create(null);Bt[g]=X;var J=Ut[g];if(!J)throw new Error("[lattice] missing module: "+g);return J(X,zt),X}Ue("packages/core/src/internal/util.js",function(g,ce){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return w}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return le}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return n}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.89.0";async function J(){return X}const N="1.89.0",A=new Set,m=2e3;function R(a){if(A.add(a),A.size>m){const l=A.values().next().value;l!==void 0&&A.delete(l)}}const u=[],E=500;function L(a,l,f){u.push({key:a,level:l,message:f.map(y=>typeof y=="string"?y:U(y)).join(" "),at:Date.now()}),u.length>E&&u.shift()}function U(a){if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}function P(){return u.map(a=>({...a}))}function F(a){if(a.length===0||typeof a[0]!="string")return a;const l=a[0].replace(/^\[lattice\]\s*/,"");return l===a[0]?a:[l,...a.slice(1)]}function _(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"warn",f),console.warn("[lattice]",...f)}function Y(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"info",f),console.info("[lattice]",...f)}function G(){A.clear(),u.length=0}function d(a,l){const f=new Error(`[lattice] ${a}`);throw l!==void 0&&(f.cause=l),f}function b(a,l){a||d(l)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(a){return a!==null&&typeof a=="object"&&!Array.isArray(a)}function w(a){return typeof a=="function"}function j(a){return a==null}function O(a){return a==null||a===""}function D(a){return typeof a!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(a))?!0:!!(a.prototype&&Object.getOwnPropertyNames(a.prototype).length>1)}const W=new Map;function le(a){let l=W.get(a);if(l)return l;if(!a.includes("."))l=f=>f?.[a];else{const f=a.split("."),y=f.length;l=x=>{let te=x;for(let re=0;re<y;re++){if(te==null)return;te=te[f[re]]}return te}}return W.set(a,l),l}const q=new Map;function h(a){let l=q.get(a);if(l)return l;if(!a.includes("."))l=(f,y)=>{f!=null&&(f[a]=y)};else{const f=a.split("."),y=f.length-1;l=(x,te)=>{let re=x;for(let fe=0;fe<y;fe++){if(re==null)return;const ke=f[fe];re[ke]==null&&(re[ke]={}),re=re[ke]}re!=null&&(re[f[y]]=te)}}return q.set(a,l),l}function v(a,l){return le(l)(a)}function I(a,l,f){h(l)(a,f)}function M(a){return a?(a.includes(".")?a.slice(a.lastIndexOf(".")+1):a).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ue(a){const l=a==null?"":String(a);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function ae(a){return String(a).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function ve(a,l,f){if(a!==void 0)return a===!0?{enabled:!0,...f}:a===!1?{enabled:!1}:p(a)?a:{[l]:a,enabled:!0}}function T(a){return a==null?[]:Array.isArray(a)?a:[a]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function z(a,l){if(!p(a))return p(l)?{...l}:l;if(!p(l))return l===void 0?a:l;const f={...a};for(const y of Object.keys(l)){if(C.has(y))continue;const x=l[y];x!==void 0&&(f[y]=p(x)&&p(f[y])?z(f[y],x):x)}return f}function ee(a,l){if(!p(a)||!p(l)||a===l)return l;const f=Object.create(Object.getPrototypeOf(a));return Object.assign(f,a,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const y=f.get(l);return f.delete(l),f.set(l,y),y}peek(l){return this.#t.get(l)}set(l,f){const y=this.#t;return y.has(l)&&y.delete(l),y.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,y=l.get(f);l.delete(f),this.#n&&this.#n(y,f)}}}const $=new Map;function B(a,l){const f=`${a||""}|${l?JSON.stringify(l):""}`;let y=$.get(f);return y||(y=new Intl.Collator(a||void 0,{numeric:!0,sensitivity:"variant",...l}),$.set(f,y)),y}function K(a,l){if(a===l)return 0;if(a==null)return 1;if(l==null)return-1;if(typeof a=="number"&&typeof l=="number")return Number.isNaN(a)?Number.isNaN(l)?0:1:Number.isNaN(l)||a<l?-1:a>l?1:0;const f=String(a),y=String(l);return f<y?-1:f>y?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const t=typeof requestAnimationFrame=="function";function e(a){return t?requestAnimationFrame(a):setTimeout(()=>a(S()),16)}function r(a){a!=null&&(t?cancelAnimationFrame(a):clearTimeout(a))}function o(a){let l=null,f=null;const y=()=>{l=null;const te=f;f=null,a(...te||[])},x=(...te)=>{f=te,l===null&&(l=e(y))};return x.cancel=()=>{r(l),l=null,f=null},x.flush=()=>{l!==null&&(r(l),y())},x}function i(a,l){let f=null,y=null;const x=()=>{if(f=null,y===null)return;const fe=y;y=null,a(...fe),te()},te=()=>{f=setTimeout(x,l),typeof f?.unref=="function"&&f.unref()},re=(...fe)=>{f===null?(a(...fe),te()):(y=fe,clearTimeout(f),te())};return re.flush=()=>{if(f!==null&&clearTimeout(f),f=null,y===null)return;const fe=y;y=null,a(...fe)},re.cancel=()=>{f!==null&&clearTimeout(f),f=null,y=null},re.pending=()=>f!==null||y!==null,re}function n(a,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(a,{timeout:l}):setTimeout(()=>a({timeRemaining:()=>0,didTimeout:!0}),1)}let s=0;function c(a="l"){return`${a}${(++s).toString(36)}`}}),Ue("packages/modules/kpi/aggregate.js",function(g,ce){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return G}});const X=ce("packages/core/src/internal/util.js"),J=X.isNil,N=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(J(d)||d==="")return null;const b=typeof d=="number"?d:Number(d);return Number.isFinite(b)?b:null}function u(d){switch(d){case"count":{let b=0;return{add(){b+=1},remove(){b-=1},value(){return b}}}case"sum":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b:0}}}case"avg":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b/k:null}}}case"countDistinct":{const b=new Map;return{add(k){J(k)||b.set(k,(b.get(k)||0)+1)},remove(k){if(J(k))return;const p=b.get(k);p&&(p===1?b.delete(k):b.set(k,p-1))},value(){return b.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const b=new Map;let k=null,p=!1;const w=(O,D)=>d?O>D:O<D,j=()=>{let O=null;for(const D of b.keys())(O===null||w(D,O))&&(O=D);return O};return{add(O){const D=R(O);D!==null&&(b.set(D,(b.get(D)||0)+1),!p&&(k===null||w(D,k))&&(k=D))},remove(O){const D=R(O);if(D===null)return;const W=b.get(D);W&&(W===1?(b.delete(D),D===k&&(p=!0)):b.set(D,W-1))},value(){return b.size===0?null:(p&&(k=j(),p=!1),k)}}}function L(d){return N(d)?d:typeof d=="string"&&d?A(d):()=>{}}function U(d,b){if(d==null||Number.isNaN(d))return null;if(Array.isArray(b.bands)){for(const w of b.bands){const j=J(w.min)?-1/0:w.min,O=J(w.max)?1/0:w.max;if(d>=j&&d<O)return w.status??null}return null}const k=b.thresholds;return!k||J(k.warn)||J(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const P="unknown";function F(d,b,k){return k?U(d,b):P}function _(d){if(!d)return null;const b=[];let k=!1;const p=O=>{if(J(O))return!1;const D=Number(O);return Number.isFinite(D)?(b.push(D),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!J(d.thresholds.warn)&&!J(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&b.push(0),!b.length)return null;const w=Math.min(...b),j=Math.max(...b);return j>w?{lo:w,hi:j}:null}function Y(d,b){if(!b||J(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=b.hi-b.lo;return p?Math.max(0,Math.min(1,(k-b.lo)/p))*100:null}function G(d,b,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof b=="string"?{type:b}:b||{},w=p.type||"number",j=p.locale||void 0,O={};w==="currency"?(O.style="currency",O.currency=p.currency||"USD"):w==="percent"?O.style="percent":w==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),J(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const D=typeof p.prefix=="string"?p.prefix:"",W=typeof p.suffix=="string"?p.suffix:"";try{return D+new Intl.NumberFormat(j,O).format(d)+W}catch{return D+String(d)+W}}}),Ue("packages/core/src/source/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return _}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.warnOnce,A="",m="\0tree:";function R(Y,G){return{physical:Y,key:G,level:0,children:[],value:void 0}}function u(Y,G){const d=[],b=new Map;for(let k=0;k<Y.length;k++){const p=Y[k],w=G.pathOf(p),j=Array.isArray(w)?w.map(D=>String(D)):[];if(!j.length){const D=R(p,G.keyOf(p));d.push(D);continue}let O=null;for(let D=0;D<j.length;D++){const W=j.slice(0,D+1).join(A),le=D===j.length-1;let q=b.get(W);q&&le&&q.physical===-1&&(q.physical=p,q.key=G.keyOf(p)),q||(q=R(le?p:-1,le?G.keyOf(p):m+W),q.level=D,q.value=j[D],b.set(W,q),O?O.children.push(q):d.push(q)),O=q}}return{roots:d,nodes:b}}function E(Y,G){const d=new Map,b=[];for(let j=0;j<Y.length;j++){const O=Y[j],D=G.keyOf(O),W=R(O,D);d.set(D,W);const le=G.parentOf(O);le!=null&&le!==""&&b.push({node:W,parent:String(le)})}let k=null;const p=new Map;for(const{node:j,parent:O}of b){const D=d.get(O);if(D){p.set(j.key,D);continue}G.orphans&&G.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=G.orphans),p.set(j.key,k))}const w=[];for(const j of d.values()){const O=p.get(j.key);O?O.children.push(j):w.push(j)}return k&&k.children.length&&w.push(k),{roots:L(w,d,G.orphans,k),nodes:d}}function L(Y,G,d,b){const k=new Set,p=[...Y];for(;p.length;){const W=p.pop();if(!k.has(W.key)){k.add(W.key);for(const le of W.children)p.push(le)}}const w=[];for(const W of G.values())k.has(W.key)||w.push(W);if(!w.length)return Y;const j=!!d&&d!=="root";N("tree.cycle",`tree.parentKey produced ${w.length} row(s) inside a parent cycle; `+(j?`they are shown under "${d}".`:"they are shown at the root."));for(const W of w)W.children=W.children.filter(le=>k.has(le.key));if(!j)return[...Y,...w];let O=b;const D=[...Y];return O||(O=R(-1,`${m}orphans`),O.value=d,D.push(O)),O.children.push(...w),D}function U(Y){let G=0;const d=(b,k)=>{for(const p of b)p.level=k,k>G&&(G=k),p.children.length&&d(p.children,k+1)};return d(Y,0),G}function P(Y,G){if(!Y||typeof Y!="object")return null;const d=Y.path,b=Y.parentKey,k=J(Y.hasChildren)?p=>!!Y.hasChildren(G.dataAt(p)):null;if(J(d))return{mode:"path",pathOf:p=>d(G.dataAt(p)),keyOf:G.keyOf,declaresChildren:k};if(b!=null){const p=J(b)?b:w=>w?.[b];return{mode:"parentKey",parentOf:w=>p(G.dataAt(w)),keyOf:G.keyOf,orphans:Y.orphans||"root",declaresChildren:k}}return N("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Y,G){const d=G.mode==="path"?u(Y,G):E(Y,G),b=U(d.roots);return{...d,depth:b}}function _(Y,G){const d=new Map,b=k=>{for(let p=0;p<k.length;p++){const w=k[p];if(w.physical>=0){const j=G?G(w.physical):!1,O=j&&w.children.length===0;d.set(w.physical,{level:w.level,posinset:p+1,setsize:k.length,hasChildren:w.children.length>0||j,lazy:O})}w.children.length&&b(w.children)}};return b(Y),d}}),Ue("packages/modules/kpi/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.isObject,A=X.warnOnce,m=ce("packages/core/src/source/tree.js"),R=m.resolveTree,u=m.buildTree,E=".",L=Object.freeze({good:1,warn:2,critical:3}),U=Object.freeze([null,"good","warn","critical"]);function P(w){return!!w&&w.kind!=="clock"&&(w.value===null||w.value===void 0)}function F(w,j){const O=Math.max(L[w]||0,L[j]||0);return U[O]}function _(w,j){if(!j.length||w===!1)return null;if(w==null)return j.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=N(w)?w:{},D=j.map((h,v)=>v),W=h=>j[h].id;if(J(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>j[v].spec,keyOf:W});return h?Y({...u(D,h),mode:h.mode},j):null}const le=typeof O.separator=="string"&&O.separator?O.separator:E;if(!j.some(h=>h.id.includes(le)))return null;const q=R({path:h=>String(h).split(le)},{dataAt:h=>j[h].id,keyOf:W});return Y({...u(D,q),mode:"id"},j)}function Y(w,j){const O=new Set,D=new Set(j.map(q=>q.id)),W=(q,h)=>{for(const v of q){const I=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),M=`${h}/${I}`;v.physical>=0?O.add(v.physical):D.has(M)||(v.key=M,D.add(M)),W(v.children,M)}};W(w.roots,"");const le=j.filter((q,h)=>!O.has(h)).map(q=>q.id);return le.length&&A("kpi:tree:unplaced",`${le.length} KPI tile(s) are not on the tree and will not render: ${le.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),w}function G(w,j){return w&&w.spec&&w.spec.label!==null&&w.spec.label!==void 0?String(w.spec.label):j!=null?String(j):w?w.label:""}function d(w,j,O,D){const W=(le,q,h,v)=>{const I=le.physical>=0?j[le.physical]:null,M=I?O.get(I.id):null,H=le.children.map((C,z)=>W(C,q+1,z,le.children.length)),ue=M?M.status:null;let ae=L[ue]?ue:null,ve=ue==="unknown"||P(M)?1:0,T=M?1:0;for(const C of H)ae=F(ae,C.rollup),ve+=C.unknown,T+=C.items;return{key:le.key,id:M?M.id:null,label:G(I,le.value),level:q,posinset:h+1,setsize:v,hasChildren:H.length>0,expanded:H.length>0&&D.has(le.key),children:H,tile:M,value:M?M.value:null,formatted:M?M.formatted:null,status:ue??null,rollup:ae,unknown:ve,items:T}};return w.roots.map((le,q)=>W(le,0,q,w.roots.length))}function b(w){const j=[],O=D=>{for(const W of D)j.push(W),O(W.children)};return O(w),j}function k(w){const j=[],O=D=>{for(const W of D)j.push(W),W.expanded&&O(W.children)};return O(w),j}function p(w){const j=[],O=D=>{for(const W of D)W.children.length&&(j.push(W.key),O(W.children))};return O(w),j}}),Ue("packages/modules/kpi/messages.js",function(g,ce){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return u}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.group.name":"KPI: {name}","kpi.group.unnamed":"KPI","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,L){return L?E.replace(/\{(\w+)\}/g,(U,P)=>P in L?String(L[P]):U):E}function R(E){const L=N(E.messages)&&J(E.messages.t)&&E.messages||N(E.grid)&&N(E.grid.messages)&&J(E.grid.messages.t)&&E.grid.messages||null;return(U,P)=>{if(L){let F;try{F=L.t(U,P)}catch{F=null}if(typeof F=="string"&&F&&F!==U)return F}return m(A[U]||U,P)}}const u=R({})}),Ue("packages/modules/kpi/view.js",function(g,ce){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return le}});const J=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=ce("packages/modules/kpi/tree.js").visibleNodes,R=ce("packages/modules/kpi/messages.js").fallbackT,u="lat-kpi",E=R("kpi.status.unknown"),L=R,U=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(i,n){return n?i(`kpi.status.${n}`):""}function F(i){return i&&i.stale?"kpi.status.stale":"kpi.status.unknown"}class _{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const c of this.map.get(n)||[])c(s)}}function Y(i){if(!i||i.getElementById&&i.getElementById(`${u}-styles`))return;const n=i.createElement("style");n.id=`${u}-styles`,n.setAttribute("id",`${u}-styles`),n.textContent=`
|
|
6
|
+
var Ut=Object.create(null),Bt=Object.create(null);function Ue(g,ce){Ut[g]=ce}function zt(g){var ce=Bt[g];if(ce)return ce;var X=Object.create(null);Bt[g]=X;var J=Ut[g];if(!J)throw new Error("[lattice] missing module: "+g);return J(X,zt),X}Ue("packages/core/src/internal/util.js",function(g,ce){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return w}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return le}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return n}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.89.1";async function J(){return X}const N="1.89.1",A=new Set,m=2e3;function R(a){if(A.add(a),A.size>m){const l=A.values().next().value;l!==void 0&&A.delete(l)}}const u=[],E=500;function L(a,l,f){u.push({key:a,level:l,message:f.map(y=>typeof y=="string"?y:U(y)).join(" "),at:Date.now()}),u.length>E&&u.shift()}function U(a){if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}function P(){return u.map(a=>({...a}))}function F(a){if(a.length===0||typeof a[0]!="string")return a;const l=a[0].replace(/^\[lattice\]\s*/,"");return l===a[0]?a:[l,...a.slice(1)]}function _(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"warn",f),console.warn("[lattice]",...f)}function Y(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"info",f),console.info("[lattice]",...f)}function G(){A.clear(),u.length=0}function d(a,l){const f=new Error(`[lattice] ${a}`);throw l!==void 0&&(f.cause=l),f}function b(a,l){a||d(l)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(a){return a!==null&&typeof a=="object"&&!Array.isArray(a)}function w(a){return typeof a=="function"}function j(a){return a==null}function O(a){return a==null||a===""}function D(a){return typeof a!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(a))?!0:!!(a.prototype&&Object.getOwnPropertyNames(a.prototype).length>1)}const W=new Map;function le(a){let l=W.get(a);if(l)return l;if(!a.includes("."))l=f=>f?.[a];else{const f=a.split("."),y=f.length;l=x=>{let te=x;for(let re=0;re<y;re++){if(te==null)return;te=te[f[re]]}return te}}return W.set(a,l),l}const q=new Map;function h(a){let l=q.get(a);if(l)return l;if(!a.includes("."))l=(f,y)=>{f!=null&&(f[a]=y)};else{const f=a.split("."),y=f.length-1;l=(x,te)=>{let re=x;for(let fe=0;fe<y;fe++){if(re==null)return;const ke=f[fe];re[ke]==null&&(re[ke]={}),re=re[ke]}re!=null&&(re[f[y]]=te)}}return q.set(a,l),l}function v(a,l){return le(l)(a)}function I(a,l,f){h(l)(a,f)}function M(a){return a?(a.includes(".")?a.slice(a.lastIndexOf(".")+1):a).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ue(a){const l=a==null?"":String(a);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function ae(a){return String(a).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function ve(a,l,f){if(a!==void 0)return a===!0?{enabled:!0,...f}:a===!1?{enabled:!1}:p(a)?a:{[l]:a,enabled:!0}}function T(a){return a==null?[]:Array.isArray(a)?a:[a]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function z(a,l){if(!p(a))return p(l)?{...l}:l;if(!p(l))return l===void 0?a:l;const f={...a};for(const y of Object.keys(l)){if(C.has(y))continue;const x=l[y];x!==void 0&&(f[y]=p(x)&&p(f[y])?z(f[y],x):x)}return f}function ee(a,l){if(!p(a)||!p(l)||a===l)return l;const f=Object.create(Object.getPrototypeOf(a));return Object.assign(f,a,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const y=f.get(l);return f.delete(l),f.set(l,y),y}peek(l){return this.#t.get(l)}set(l,f){const y=this.#t;return y.has(l)&&y.delete(l),y.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,y=l.get(f);l.delete(f),this.#n&&this.#n(y,f)}}}const $=new Map;function B(a,l){const f=`${a||""}|${l?JSON.stringify(l):""}`;let y=$.get(f);return y||(y=new Intl.Collator(a||void 0,{numeric:!0,sensitivity:"variant",...l}),$.set(f,y)),y}function K(a,l){if(a===l)return 0;if(a==null)return 1;if(l==null)return-1;if(typeof a=="number"&&typeof l=="number")return Number.isNaN(a)?Number.isNaN(l)?0:1:Number.isNaN(l)||a<l?-1:a>l?1:0;const f=String(a),y=String(l);return f<y?-1:f>y?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const t=typeof requestAnimationFrame=="function";function e(a){return t?requestAnimationFrame(a):setTimeout(()=>a(S()),16)}function r(a){a!=null&&(t?cancelAnimationFrame(a):clearTimeout(a))}function o(a){let l=null,f=null;const y=()=>{l=null;const te=f;f=null,a(...te||[])},x=(...te)=>{f=te,l===null&&(l=e(y))};return x.cancel=()=>{r(l),l=null,f=null},x.flush=()=>{l!==null&&(r(l),y())},x}function i(a,l){let f=null,y=null;const x=()=>{if(f=null,y===null)return;const fe=y;y=null,a(...fe),te()},te=()=>{f=setTimeout(x,l),typeof f?.unref=="function"&&f.unref()},re=(...fe)=>{f===null?(a(...fe),te()):(y=fe,clearTimeout(f),te())};return re.flush=()=>{if(f!==null&&clearTimeout(f),f=null,y===null)return;const fe=y;y=null,a(...fe)},re.cancel=()=>{f!==null&&clearTimeout(f),f=null,y=null},re.pending=()=>f!==null||y!==null,re}function n(a,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(a,{timeout:l}):setTimeout(()=>a({timeRemaining:()=>0,didTimeout:!0}),1)}let s=0;function c(a="l"){return`${a}${(++s).toString(36)}`}}),Ue("packages/modules/kpi/aggregate.js",function(g,ce){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return G}});const X=ce("packages/core/src/internal/util.js"),J=X.isNil,N=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(J(d)||d==="")return null;const b=typeof d=="number"?d:Number(d);return Number.isFinite(b)?b:null}function u(d){switch(d){case"count":{let b=0;return{add(){b+=1},remove(){b-=1},value(){return b}}}case"sum":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b:0}}}case"avg":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b/k:null}}}case"countDistinct":{const b=new Map;return{add(k){J(k)||b.set(k,(b.get(k)||0)+1)},remove(k){if(J(k))return;const p=b.get(k);p&&(p===1?b.delete(k):b.set(k,p-1))},value(){return b.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const b=new Map;let k=null,p=!1;const w=(O,D)=>d?O>D:O<D,j=()=>{let O=null;for(const D of b.keys())(O===null||w(D,O))&&(O=D);return O};return{add(O){const D=R(O);D!==null&&(b.set(D,(b.get(D)||0)+1),!p&&(k===null||w(D,k))&&(k=D))},remove(O){const D=R(O);if(D===null)return;const W=b.get(D);W&&(W===1?(b.delete(D),D===k&&(p=!0)):b.set(D,W-1))},value(){return b.size===0?null:(p&&(k=j(),p=!1),k)}}}function L(d){return N(d)?d:typeof d=="string"&&d?A(d):()=>{}}function U(d,b){if(d==null||Number.isNaN(d))return null;if(Array.isArray(b.bands)){for(const w of b.bands){const j=J(w.min)?-1/0:w.min,O=J(w.max)?1/0:w.max;if(d>=j&&d<O)return w.status??null}return null}const k=b.thresholds;return!k||J(k.warn)||J(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const P="unknown";function F(d,b,k){return k?U(d,b):P}function _(d){if(!d)return null;const b=[];let k=!1;const p=O=>{if(J(O))return!1;const D=Number(O);return Number.isFinite(D)?(b.push(D),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!J(d.thresholds.warn)&&!J(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&b.push(0),!b.length)return null;const w=Math.min(...b),j=Math.max(...b);return j>w?{lo:w,hi:j}:null}function Y(d,b){if(!b||J(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=b.hi-b.lo;return p?Math.max(0,Math.min(1,(k-b.lo)/p))*100:null}function G(d,b,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof b=="string"?{type:b}:b||{},w=p.type||"number",j=p.locale||void 0,O={};w==="currency"?(O.style="currency",O.currency=p.currency||"USD"):w==="percent"?O.style="percent":w==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),J(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const D=typeof p.prefix=="string"?p.prefix:"",W=typeof p.suffix=="string"?p.suffix:"";try{return D+new Intl.NumberFormat(j,O).format(d)+W}catch{return D+String(d)+W}}}),Ue("packages/core/src/source/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return _}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.warnOnce,A="",m="\0tree:";function R(Y,G){return{physical:Y,key:G,level:0,children:[],value:void 0}}function u(Y,G){const d=[],b=new Map;for(let k=0;k<Y.length;k++){const p=Y[k],w=G.pathOf(p),j=Array.isArray(w)?w.map(D=>String(D)):[];if(!j.length){const D=R(p,G.keyOf(p));d.push(D);continue}let O=null;for(let D=0;D<j.length;D++){const W=j.slice(0,D+1).join(A),le=D===j.length-1;let q=b.get(W);q&&le&&q.physical===-1&&(q.physical=p,q.key=G.keyOf(p)),q||(q=R(le?p:-1,le?G.keyOf(p):m+W),q.level=D,q.value=j[D],b.set(W,q),O?O.children.push(q):d.push(q)),O=q}}return{roots:d,nodes:b}}function E(Y,G){const d=new Map,b=[];for(let j=0;j<Y.length;j++){const O=Y[j],D=G.keyOf(O),W=R(O,D);d.set(D,W);const le=G.parentOf(O);le!=null&&le!==""&&b.push({node:W,parent:String(le)})}let k=null;const p=new Map;for(const{node:j,parent:O}of b){const D=d.get(O);if(D){p.set(j.key,D);continue}G.orphans&&G.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=G.orphans),p.set(j.key,k))}const w=[];for(const j of d.values()){const O=p.get(j.key);O?O.children.push(j):w.push(j)}return k&&k.children.length&&w.push(k),{roots:L(w,d,G.orphans,k),nodes:d}}function L(Y,G,d,b){const k=new Set,p=[...Y];for(;p.length;){const W=p.pop();if(!k.has(W.key)){k.add(W.key);for(const le of W.children)p.push(le)}}const w=[];for(const W of G.values())k.has(W.key)||w.push(W);if(!w.length)return Y;const j=!!d&&d!=="root";N("tree.cycle",`tree.parentKey produced ${w.length} row(s) inside a parent cycle; `+(j?`they are shown under "${d}".`:"they are shown at the root."));for(const W of w)W.children=W.children.filter(le=>k.has(le.key));if(!j)return[...Y,...w];let O=b;const D=[...Y];return O||(O=R(-1,`${m}orphans`),O.value=d,D.push(O)),O.children.push(...w),D}function U(Y){let G=0;const d=(b,k)=>{for(const p of b)p.level=k,k>G&&(G=k),p.children.length&&d(p.children,k+1)};return d(Y,0),G}function P(Y,G){if(!Y||typeof Y!="object")return null;const d=Y.path,b=Y.parentKey,k=J(Y.hasChildren)?p=>!!Y.hasChildren(G.dataAt(p)):null;if(J(d))return{mode:"path",pathOf:p=>d(G.dataAt(p)),keyOf:G.keyOf,declaresChildren:k};if(b!=null){const p=J(b)?b:w=>w?.[b];return{mode:"parentKey",parentOf:w=>p(G.dataAt(w)),keyOf:G.keyOf,orphans:Y.orphans||"root",declaresChildren:k}}return N("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Y,G){const d=G.mode==="path"?u(Y,G):E(Y,G),b=U(d.roots);return{...d,depth:b}}function _(Y,G){const d=new Map,b=k=>{for(let p=0;p<k.length;p++){const w=k[p];if(w.physical>=0){const j=G?G(w.physical):!1,O=j&&w.children.length===0;d.set(w.physical,{level:w.level,posinset:p+1,setsize:k.length,hasChildren:w.children.length>0||j,lazy:O})}w.children.length&&b(w.children)}};return b(Y),d}}),Ue("packages/modules/kpi/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.isObject,A=X.warnOnce,m=ce("packages/core/src/source/tree.js"),R=m.resolveTree,u=m.buildTree,E=".",L=Object.freeze({good:1,warn:2,critical:3}),U=Object.freeze([null,"good","warn","critical"]);function P(w){return!!w&&w.kind!=="clock"&&(w.value===null||w.value===void 0)}function F(w,j){const O=Math.max(L[w]||0,L[j]||0);return U[O]}function _(w,j){if(!j.length||w===!1)return null;if(w==null)return j.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=N(w)?w:{},D=j.map((h,v)=>v),W=h=>j[h].id;if(J(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>j[v].spec,keyOf:W});return h?Y({...u(D,h),mode:h.mode},j):null}const le=typeof O.separator=="string"&&O.separator?O.separator:E;if(!j.some(h=>h.id.includes(le)))return null;const q=R({path:h=>String(h).split(le)},{dataAt:h=>j[h].id,keyOf:W});return Y({...u(D,q),mode:"id"},j)}function Y(w,j){const O=new Set,D=new Set(j.map(q=>q.id)),W=(q,h)=>{for(const v of q){const I=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),M=`${h}/${I}`;v.physical>=0?O.add(v.physical):D.has(M)||(v.key=M,D.add(M)),W(v.children,M)}};W(w.roots,"");const le=j.filter((q,h)=>!O.has(h)).map(q=>q.id);return le.length&&A("kpi:tree:unplaced",`${le.length} KPI tile(s) are not on the tree and will not render: ${le.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),w}function G(w,j){return w&&w.spec&&w.spec.label!==null&&w.spec.label!==void 0?String(w.spec.label):j!=null?String(j):w?w.label:""}function d(w,j,O,D){const W=(le,q,h,v)=>{const I=le.physical>=0?j[le.physical]:null,M=I?O.get(I.id):null,H=le.children.map((C,z)=>W(C,q+1,z,le.children.length)),ue=M?M.status:null;let ae=L[ue]?ue:null,ve=ue==="unknown"||P(M)?1:0,T=M?1:0;for(const C of H)ae=F(ae,C.rollup),ve+=C.unknown,T+=C.items;return{key:le.key,id:M?M.id:null,label:G(I,le.value),level:q,posinset:h+1,setsize:v,hasChildren:H.length>0,expanded:H.length>0&&D.has(le.key),children:H,tile:M,value:M?M.value:null,formatted:M?M.formatted:null,status:ue??null,rollup:ae,unknown:ve,items:T}};return w.roots.map((le,q)=>W(le,0,q,w.roots.length))}function b(w){const j=[],O=D=>{for(const W of D)j.push(W),O(W.children)};return O(w),j}function k(w){const j=[],O=D=>{for(const W of D)j.push(W),W.expanded&&O(W.children)};return O(w),j}function p(w){const j=[],O=D=>{for(const W of D)W.children.length&&(j.push(W.key),O(W.children))};return O(w),j}}),Ue("packages/modules/kpi/messages.js",function(g,ce){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return u}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,N=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.group.name":"KPI: {name}","kpi.group.unnamed":"KPI","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,L){return L?E.replace(/\{(\w+)\}/g,(U,P)=>P in L?String(L[P]):U):E}function R(E){const L=N(E.messages)&&J(E.messages.t)&&E.messages||N(E.grid)&&N(E.grid.messages)&&J(E.grid.messages.t)&&E.grid.messages||null;return(U,P)=>{if(L){let F;try{F=L.t(U,P)}catch{F=null}if(typeof F=="string"&&F&&F!==U)return F}return m(A[U]||U,P)}}const u=R({})}),Ue("packages/modules/kpi/view.js",function(g,ce){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return le}});const J=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=ce("packages/modules/kpi/tree.js").visibleNodes,R=ce("packages/modules/kpi/messages.js").fallbackT,u="lat-kpi",E=R("kpi.status.unknown"),L=R,U=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(i,n){return n?i(`kpi.status.${n}`):""}function F(i){return i&&i.stale?"kpi.status.stale":"kpi.status.unknown"}class _{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const c of this.map.get(n)||[])c(s)}}function Y(i){if(!i||i.getElementById&&i.getElementById(`${u}-styles`))return;const n=i.createElement("style");n.id=`${u}-styles`,n.setAttribute("id",`${u}-styles`),n.textContent=`
|
|
7
7
|
.${u}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${u}-tile-min,160px),1fr));font-family:var(--${u}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${u}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${u}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${u}-fg,var(--lattice-foreground));--${u}-meter-w:var(--${u}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
|
|
8
8
|
/* The author display:grid above outranks the browser's own [hidden] rule,
|
|
9
9
|
so a hidden host stays painted without this guard (BACKLOG-0001605). */
|
package/modules/kpi.min.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.89.
|
|
2
|
+
* Lattice Grid 1.89.1, kpi module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(Wt){"use strict";var Ft=Object.create(null),Lt=Object.create(null);function _e(g,ce){Ft[g]=ce}function It(g){var ce=Lt[g];if(ce)return ce;var X=Object.create(null);Lt[g]=X;var J=Ft[g];if(!J)throw new Error("[lattice] missing module: "+g);return J(X,It),X}_e("packages/core/src/internal/util.js",function(g,ce){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return w}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return le}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return n}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.89.0";async function J(){return X}const T="1.89.0",A=new Set,m=2e3;function R(a){if(A.add(a),A.size>m){const l=A.values().next().value;l!==void 0&&A.delete(l)}}const u=[],E=500;function L(a,l,f){u.push({key:a,level:l,message:f.map(y=>typeof y=="string"?y:U(y)).join(" "),at:Date.now()}),u.length>E&&u.shift()}function U(a){if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}function P(){return u.map(a=>({...a}))}function F(a){if(a.length===0||typeof a[0]!="string")return a;const l=a[0].replace(/^\[lattice\]\s*/,"");return l===a[0]?a:[l,...a.slice(1)]}function _(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"warn",f),console.warn("[lattice]",...f)}function Y(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"info",f),console.info("[lattice]",...f)}function G(){A.clear(),u.length=0}function d(a,l){const f=new Error(`[lattice] ${a}`);throw l!==void 0&&(f.cause=l),f}function b(a,l){a||d(l)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(a){return a!==null&&typeof a=="object"&&!Array.isArray(a)}function w(a){return typeof a=="function"}function j(a){return a==null}function O(a){return a==null||a===""}function D(a){return typeof a!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(a))?!0:!!(a.prototype&&Object.getOwnPropertyNames(a.prototype).length>1)}const K=new Map;function le(a){let l=K.get(a);if(l)return l;if(!a.includes("."))l=f=>f?.[a];else{const f=a.split("."),y=f.length;l=x=>{let te=x;for(let re=0;re<y;re++){if(te==null)return;te=te[f[re]]}return te}}return K.set(a,l),l}const q=new Map;function h(a){let l=q.get(a);if(l)return l;if(!a.includes("."))l=(f,y)=>{f!=null&&(f[a]=y)};else{const f=a.split("."),y=f.length-1;l=(x,te)=>{let re=x;for(let fe=0;fe<y;fe++){if(re==null)return;const ke=f[fe];re[ke]==null&&(re[ke]={}),re=re[ke]}re!=null&&(re[f[y]]=te)}}return q.set(a,l),l}function v(a,l){return le(l)(a)}function I(a,l,f){h(l)(a,f)}function M(a){return a?(a.includes(".")?a.slice(a.lastIndexOf(".")+1):a).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ue(a){const l=a==null?"":String(a);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function ae(a){return String(a).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function ve(a,l,f){if(a!==void 0)return a===!0?{enabled:!0,...f}:a===!1?{enabled:!1}:p(a)?a:{[l]:a,enabled:!0}}function N(a){return a==null?[]:Array.isArray(a)?a:[a]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function z(a,l){if(!p(a))return p(l)?{...l}:l;if(!p(l))return l===void 0?a:l;const f={...a};for(const y of Object.keys(l)){if(C.has(y))continue;const x=l[y];x!==void 0&&(f[y]=p(x)&&p(f[y])?z(f[y],x):x)}return f}function ee(a,l){if(!p(a)||!p(l)||a===l)return l;const f=Object.create(Object.getPrototypeOf(a));return Object.assign(f,a,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const y=f.get(l);return f.delete(l),f.set(l,y),y}peek(l){return this.#t.get(l)}set(l,f){const y=this.#t;return y.has(l)&&y.delete(l),y.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,y=l.get(f);l.delete(f),this.#n&&this.#n(y,f)}}}const $=new Map;function B(a,l){const f=`${a||""}|${l?JSON.stringify(l):""}`;let y=$.get(f);return y||(y=new Intl.Collator(a||void 0,{numeric:!0,sensitivity:"variant",...l}),$.set(f,y)),y}function W(a,l){if(a===l)return 0;if(a==null)return 1;if(l==null)return-1;if(typeof a=="number"&&typeof l=="number")return Number.isNaN(a)?Number.isNaN(l)?0:1:Number.isNaN(l)||a<l?-1:a>l?1:0;const f=String(a),y=String(l);return f<y?-1:f>y?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const t=typeof requestAnimationFrame=="function";function e(a){return t?requestAnimationFrame(a):setTimeout(()=>a(S()),16)}function r(a){a!=null&&(t?cancelAnimationFrame(a):clearTimeout(a))}function o(a){let l=null,f=null;const y=()=>{l=null;const te=f;f=null,a(...te||[])},x=(...te)=>{f=te,l===null&&(l=e(y))};return x.cancel=()=>{r(l),l=null,f=null},x.flush=()=>{l!==null&&(r(l),y())},x}function i(a,l){let f=null,y=null;const x=()=>{if(f=null,y===null)return;const fe=y;y=null,a(...fe),te()},te=()=>{f=setTimeout(x,l),typeof f?.unref=="function"&&f.unref()},re=(...fe)=>{f===null?(a(...fe),te()):(y=fe,clearTimeout(f),te())};return re.flush=()=>{if(f!==null&&clearTimeout(f),f=null,y===null)return;const fe=y;y=null,a(...fe)},re.cancel=()=>{f!==null&&clearTimeout(f),f=null,y=null},re.pending=()=>f!==null||y!==null,re}function n(a,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(a,{timeout:l}):setTimeout(()=>a({timeRemaining:()=>0,didTimeout:!0}),1)}let s=0;function c(a="l"){return`${a}${(++s).toString(36)}`}}),_e("packages/modules/kpi/aggregate.js",function(g,ce){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return G}});const X=ce("packages/core/src/internal/util.js"),J=X.isNil,T=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(J(d)||d==="")return null;const b=typeof d=="number"?d:Number(d);return Number.isFinite(b)?b:null}function u(d){switch(d){case"count":{let b=0;return{add(){b+=1},remove(){b-=1},value(){return b}}}case"sum":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b:0}}}case"avg":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b/k:null}}}case"countDistinct":{const b=new Map;return{add(k){J(k)||b.set(k,(b.get(k)||0)+1)},remove(k){if(J(k))return;const p=b.get(k);p&&(p===1?b.delete(k):b.set(k,p-1))},value(){return b.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const b=new Map;let k=null,p=!1;const w=(O,D)=>d?O>D:O<D,j=()=>{let O=null;for(const D of b.keys())(O===null||w(D,O))&&(O=D);return O};return{add(O){const D=R(O);D!==null&&(b.set(D,(b.get(D)||0)+1),!p&&(k===null||w(D,k))&&(k=D))},remove(O){const D=R(O);if(D===null)return;const K=b.get(D);K&&(K===1?(b.delete(D),D===k&&(p=!0)):b.set(D,K-1))},value(){return b.size===0?null:(p&&(k=j(),p=!1),k)}}}function L(d){return T(d)?d:typeof d=="string"&&d?A(d):()=>{}}function U(d,b){if(d==null||Number.isNaN(d))return null;if(Array.isArray(b.bands)){for(const w of b.bands){const j=J(w.min)?-1/0:w.min,O=J(w.max)?1/0:w.max;if(d>=j&&d<O)return w.status??null}return null}const k=b.thresholds;return!k||J(k.warn)||J(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const P="unknown";function F(d,b,k){return k?U(d,b):P}function _(d){if(!d)return null;const b=[];let k=!1;const p=O=>{if(J(O))return!1;const D=Number(O);return Number.isFinite(D)?(b.push(D),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!J(d.thresholds.warn)&&!J(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&b.push(0),!b.length)return null;const w=Math.min(...b),j=Math.max(...b);return j>w?{lo:w,hi:j}:null}function Y(d,b){if(!b||J(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=b.hi-b.lo;return p?Math.max(0,Math.min(1,(k-b.lo)/p))*100:null}function G(d,b,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof b=="string"?{type:b}:b||{},w=p.type||"number",j=p.locale||void 0,O={};w==="currency"?(O.style="currency",O.currency=p.currency||"USD"):w==="percent"?O.style="percent":w==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),J(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const D=typeof p.prefix=="string"?p.prefix:"",K=typeof p.suffix=="string"?p.suffix:"";try{return D+new Intl.NumberFormat(j,O).format(d)+K}catch{return D+String(d)+K}}}),_e("packages/core/src/source/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return _}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.warnOnce,A="",m="\0tree:";function R(Y,G){return{physical:Y,key:G,level:0,children:[],value:void 0}}function u(Y,G){const d=[],b=new Map;for(let k=0;k<Y.length;k++){const p=Y[k],w=G.pathOf(p),j=Array.isArray(w)?w.map(D=>String(D)):[];if(!j.length){const D=R(p,G.keyOf(p));d.push(D);continue}let O=null;for(let D=0;D<j.length;D++){const K=j.slice(0,D+1).join(A),le=D===j.length-1;let q=b.get(K);q&&le&&q.physical===-1&&(q.physical=p,q.key=G.keyOf(p)),q||(q=R(le?p:-1,le?G.keyOf(p):m+K),q.level=D,q.value=j[D],b.set(K,q),O?O.children.push(q):d.push(q)),O=q}}return{roots:d,nodes:b}}function E(Y,G){const d=new Map,b=[];for(let j=0;j<Y.length;j++){const O=Y[j],D=G.keyOf(O),K=R(O,D);d.set(D,K);const le=G.parentOf(O);le!=null&&le!==""&&b.push({node:K,parent:String(le)})}let k=null;const p=new Map;for(const{node:j,parent:O}of b){const D=d.get(O);if(D){p.set(j.key,D);continue}G.orphans&&G.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=G.orphans),p.set(j.key,k))}const w=[];for(const j of d.values()){const O=p.get(j.key);O?O.children.push(j):w.push(j)}return k&&k.children.length&&w.push(k),{roots:L(w,d,G.orphans,k),nodes:d}}function L(Y,G,d,b){const k=new Set,p=[...Y];for(;p.length;){const K=p.pop();if(!k.has(K.key)){k.add(K.key);for(const le of K.children)p.push(le)}}const w=[];for(const K of G.values())k.has(K.key)||w.push(K);if(!w.length)return Y;const j=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${w.length} row(s) inside a parent cycle; `+(j?`they are shown under "${d}".`:"they are shown at the root."));for(const K of w)K.children=K.children.filter(le=>k.has(le.key));if(!j)return[...Y,...w];let O=b;const D=[...Y];return O||(O=R(-1,`${m}orphans`),O.value=d,D.push(O)),O.children.push(...w),D}function U(Y){let G=0;const d=(b,k)=>{for(const p of b)p.level=k,k>G&&(G=k),p.children.length&&d(p.children,k+1)};return d(Y,0),G}function P(Y,G){if(!Y||typeof Y!="object")return null;const d=Y.path,b=Y.parentKey,k=J(Y.hasChildren)?p=>!!Y.hasChildren(G.dataAt(p)):null;if(J(d))return{mode:"path",pathOf:p=>d(G.dataAt(p)),keyOf:G.keyOf,declaresChildren:k};if(b!=null){const p=J(b)?b:w=>w?.[b];return{mode:"parentKey",parentOf:w=>p(G.dataAt(w)),keyOf:G.keyOf,orphans:Y.orphans||"root",declaresChildren:k}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Y,G){const d=G.mode==="path"?u(Y,G):E(Y,G),b=U(d.roots);return{...d,depth:b}}function _(Y,G){const d=new Map,b=k=>{for(let p=0;p<k.length;p++){const w=k[p];if(w.physical>=0){const j=G?G(w.physical):!1,O=j&&w.children.length===0;d.set(w.physical,{level:w.level,posinset:p+1,setsize:k.length,hasChildren:w.children.length>0||j,lazy:O})}w.children.length&&b(w.children)}};return b(Y),d}}),_e("packages/modules/kpi/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.isObject,A=X.warnOnce,m=ce("packages/core/src/source/tree.js"),R=m.resolveTree,u=m.buildTree,E=".",L=Object.freeze({good:1,warn:2,critical:3}),U=Object.freeze([null,"good","warn","critical"]);function P(w){return!!w&&w.kind!=="clock"&&(w.value===null||w.value===void 0)}function F(w,j){const O=Math.max(L[w]||0,L[j]||0);return U[O]}function _(w,j){if(!j.length||w===!1)return null;if(w==null)return j.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=T(w)?w:{},D=j.map((h,v)=>v),K=h=>j[h].id;if(J(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>j[v].spec,keyOf:K});return h?Y({...u(D,h),mode:h.mode},j):null}const le=typeof O.separator=="string"&&O.separator?O.separator:E;if(!j.some(h=>h.id.includes(le)))return null;const q=R({path:h=>String(h).split(le)},{dataAt:h=>j[h].id,keyOf:K});return Y({...u(D,q),mode:"id"},j)}function Y(w,j){const O=new Set,D=new Set(j.map(q=>q.id)),K=(q,h)=>{for(const v of q){const I=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),M=`${h}/${I}`;v.physical>=0?O.add(v.physical):D.has(M)||(v.key=M,D.add(M)),K(v.children,M)}};K(w.roots,"");const le=j.filter((q,h)=>!O.has(h)).map(q=>q.id);return le.length&&A("kpi:tree:unplaced",`${le.length} KPI tile(s) are not on the tree and will not render: ${le.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),w}function G(w,j){return w&&w.spec&&w.spec.label!==null&&w.spec.label!==void 0?String(w.spec.label):j!=null?String(j):w?w.label:""}function d(w,j,O,D){const K=(le,q,h,v)=>{const I=le.physical>=0?j[le.physical]:null,M=I?O.get(I.id):null,H=le.children.map((C,z)=>K(C,q+1,z,le.children.length)),ue=M?M.status:null;let ae=L[ue]?ue:null,ve=ue==="unknown"||P(M)?1:0,N=M?1:0;for(const C of H)ae=F(ae,C.rollup),ve+=C.unknown,N+=C.items;return{key:le.key,id:M?M.id:null,label:G(I,le.value),level:q,posinset:h+1,setsize:v,hasChildren:H.length>0,expanded:H.length>0&&D.has(le.key),children:H,tile:M,value:M?M.value:null,formatted:M?M.formatted:null,status:ue??null,rollup:ae,unknown:ve,items:N}};return w.roots.map((le,q)=>K(le,0,q,w.roots.length))}function b(w){const j=[],O=D=>{for(const K of D)j.push(K),O(K.children)};return O(w),j}function k(w){const j=[],O=D=>{for(const K of D)j.push(K),K.expanded&&O(K.children)};return O(w),j}function p(w){const j=[],O=D=>{for(const K of D)K.children.length&&(j.push(K.key),O(K.children))};return O(w),j}}),_e("packages/modules/kpi/messages.js",function(g,ce){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return u}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.group.name":"KPI: {name}","kpi.group.unnamed":"KPI","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,L){return L?E.replace(/\{(\w+)\}/g,(U,P)=>P in L?String(L[P]):U):E}function R(E){const L=T(E.messages)&&J(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&J(E.grid.messages.t)&&E.grid.messages||null;return(U,P)=>{if(L){let F;try{F=L.t(U,P)}catch{F=null}if(typeof F=="string"&&F&&F!==U)return F}return m(A[U]||U,P)}}const u=R({})}),_e("packages/modules/kpi/view.js",function(g,ce){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return le}});const J=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=ce("packages/modules/kpi/tree.js").visibleNodes,R=ce("packages/modules/kpi/messages.js").fallbackT,u="lat-kpi",E=R("kpi.status.unknown"),L=R,U=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(i,n){return n?i(`kpi.status.${n}`):""}function F(i){return i&&i.stale?"kpi.status.stale":"kpi.status.unknown"}class _{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const c of this.map.get(n)||[])c(s)}}function Y(i){if(!i||i.getElementById&&i.getElementById(`${u}-styles`))return;const n=i.createElement("style");n.id=`${u}-styles`,n.setAttribute("id",`${u}-styles`),n.textContent=`
|
|
6
|
+
(function(Wt){"use strict";var Ft=Object.create(null),Lt=Object.create(null);function _e(g,ce){Ft[g]=ce}function It(g){var ce=Lt[g];if(ce)return ce;var X=Object.create(null);Lt[g]=X;var J=Ft[g];if(!J)throw new Error("[lattice] missing module: "+g);return J(X,It),X}_e("packages/core/src/internal/util.js",function(g,ce){"use strict";Object.defineProperty(g,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(g,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"warnOnce",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"infoOnce",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"invariant",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"DEV",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"isObject",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"isFunction",{enumerable:!0,get:function(){return w}}),Object.defineProperty(g,"isNil",{enumerable:!0,get:function(){return j}}),Object.defineProperty(g,"isBlank",{enumerable:!0,get:function(){return O}}),Object.defineProperty(g,"isCtor",{enumerable:!0,get:function(){return D}}),Object.defineProperty(g,"pathGetter",{enumerable:!0,get:function(){return le}}),Object.defineProperty(g,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(g,"getPath",{enumerable:!0,get:function(){return v}}),Object.defineProperty(g,"setPath",{enumerable:!0,get:function(){return I}}),Object.defineProperty(g,"humanise",{enumerable:!0,get:function(){return M}}),Object.defineProperty(g,"escapeHtml",{enumerable:!0,get:function(){return ue}}),Object.defineProperty(g,"titleCase",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(g,"expand",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(g,"toArray",{enumerable:!0,get:function(){return N}}),Object.defineProperty(g,"merge",{enumerable:!0,get:function(){return z}}),Object.defineProperty(g,"mergeRow",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(g,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(g,"collator",{enumerable:!0,get:function(){return B}}),Object.defineProperty(g,"defaultCompare",{enumerable:!0,get:function(){return W}}),Object.defineProperty(g,"now",{enumerable:!0,get:function(){return S}}),Object.defineProperty(g,"nextFrame",{enumerable:!0,get:function(){return e}}),Object.defineProperty(g,"cancelFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(g,"frameBatched",{enumerable:!0,get:function(){return o}}),Object.defineProperty(g,"settleDebounce",{enumerable:!0,get:function(){return i}}),Object.defineProperty(g,"whenIdle",{enumerable:!0,get:function(){return n}}),Object.defineProperty(g,"uid",{enumerable:!0,get:function(){return c}});const X="1.89.1";async function J(){return X}const T="1.89.1",A=new Set,m=2e3;function R(a){if(A.add(a),A.size>m){const l=A.values().next().value;l!==void 0&&A.delete(l)}}const u=[],E=500;function L(a,l,f){u.push({key:a,level:l,message:f.map(y=>typeof y=="string"?y:U(y)).join(" "),at:Date.now()}),u.length>E&&u.shift()}function U(a){if(a instanceof Error)return a.message;try{return JSON.stringify(a)}catch{return String(a)}}function P(){return u.map(a=>({...a}))}function F(a){if(a.length===0||typeof a[0]!="string")return a;const l=a[0].replace(/^\[lattice\]\s*/,"");return l===a[0]?a:[l,...a.slice(1)]}function _(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"warn",f),console.warn("[lattice]",...f)}function Y(a,...l){if(A.has(a))return;R(a);const f=F(l);L(a,"info",f),console.info("[lattice]",...f)}function G(){A.clear(),u.length=0}function d(a,l){const f=new Error(`[lattice] ${a}`);throw l!==void 0&&(f.cause=l),f}function b(a,l){a||d(l)}const k=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function p(a){return a!==null&&typeof a=="object"&&!Array.isArray(a)}function w(a){return typeof a=="function"}function j(a){return a==null}function O(a){return a==null||a===""}function D(a){return typeof a!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(a))?!0:!!(a.prototype&&Object.getOwnPropertyNames(a.prototype).length>1)}const K=new Map;function le(a){let l=K.get(a);if(l)return l;if(!a.includes("."))l=f=>f?.[a];else{const f=a.split("."),y=f.length;l=x=>{let te=x;for(let re=0;re<y;re++){if(te==null)return;te=te[f[re]]}return te}}return K.set(a,l),l}const q=new Map;function h(a){let l=q.get(a);if(l)return l;if(!a.includes("."))l=(f,y)=>{f!=null&&(f[a]=y)};else{const f=a.split("."),y=f.length-1;l=(x,te)=>{let re=x;for(let fe=0;fe<y;fe++){if(re==null)return;const ke=f[fe];re[ke]==null&&(re[ke]={}),re=re[ke]}re!=null&&(re[f[y]]=te)}}return q.set(a,l),l}function v(a,l){return le(l)(a)}function I(a,l,f){h(l)(a,f)}function M(a){return a?(a.includes(".")?a.slice(a.lastIndexOf(".")+1):a).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ue(a){const l=a==null?"":String(a);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function ae(a){return String(a).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function ve(a,l,f){if(a!==void 0)return a===!0?{enabled:!0,...f}:a===!1?{enabled:!1}:p(a)?a:{[l]:a,enabled:!0}}function N(a){return a==null?[]:Array.isArray(a)?a:[a]}const C=Object.freeze(new Set(["__proto__","constructor","prototype"]));function z(a,l){if(!p(a))return p(l)?{...l}:l;if(!p(l))return l===void 0?a:l;const f={...a};for(const y of Object.keys(l)){if(C.has(y))continue;const x=l[y];x!==void 0&&(f[y]=p(x)&&p(f[y])?z(f[y],x):x)}return f}function ee(a,l){if(!p(a)||!p(l)||a===l)return l;const f=Object.create(Object.getPrototypeOf(a));return Object.assign(f,a,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const y=f.get(l);return f.delete(l),f.set(l,y),y}peek(l){return this.#t.get(l)}set(l,f){const y=this.#t;return y.has(l)&&y.delete(l),y.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,y=l.get(f);l.delete(f),this.#n&&this.#n(y,f)}}}const $=new Map;function B(a,l){const f=`${a||""}|${l?JSON.stringify(l):""}`;let y=$.get(f);return y||(y=new Intl.Collator(a||void 0,{numeric:!0,sensitivity:"variant",...l}),$.set(f,y)),y}function W(a,l){if(a===l)return 0;if(a==null)return 1;if(l==null)return-1;if(typeof a=="number"&&typeof l=="number")return Number.isNaN(a)?Number.isNaN(l)?0:1:Number.isNaN(l)||a<l?-1:a>l?1:0;const f=String(a),y=String(l);return f<y?-1:f>y?1:0}function S(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const t=typeof requestAnimationFrame=="function";function e(a){return t?requestAnimationFrame(a):setTimeout(()=>a(S()),16)}function r(a){a!=null&&(t?cancelAnimationFrame(a):clearTimeout(a))}function o(a){let l=null,f=null;const y=()=>{l=null;const te=f;f=null,a(...te||[])},x=(...te)=>{f=te,l===null&&(l=e(y))};return x.cancel=()=>{r(l),l=null,f=null},x.flush=()=>{l!==null&&(r(l),y())},x}function i(a,l){let f=null,y=null;const x=()=>{if(f=null,y===null)return;const fe=y;y=null,a(...fe),te()},te=()=>{f=setTimeout(x,l),typeof f?.unref=="function"&&f.unref()},re=(...fe)=>{f===null?(a(...fe),te()):(y=fe,clearTimeout(f),te())};return re.flush=()=>{if(f!==null&&clearTimeout(f),f=null,y===null)return;const fe=y;y=null,a(...fe)},re.cancel=()=>{f!==null&&clearTimeout(f),f=null,y=null},re.pending=()=>f!==null||y!==null,re}function n(a,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(a,{timeout:l}):setTimeout(()=>a({timeRemaining:()=>0,didTimeout:!0}),1)}let s=0;function c(a="l"){return`${a}${(++s).toString(36)}`}}),_e("packages/modules/kpi/aggregate.js",function(g,ce){"use strict";Object.defineProperty(g,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"makeAccumulator",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"accessorFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(g,"bandFor",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"statusFor",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"barBounds",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"barPercent",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"formatValue",{enumerable:!0,get:function(){return G}});const X=ce("packages/core/src/internal/util.js"),J=X.isNil,T=X.isFunction,A=X.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function R(d){if(J(d)||d==="")return null;const b=typeof d=="number"?d:Number(d);return Number.isFinite(b)?b:null}function u(d){switch(d){case"count":{let b=0;return{add(){b+=1},remove(){b-=1},value(){return b}}}case"sum":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b:0}}}case"avg":{let b=0,k=0;return{add(p){const w=R(p);w!==null&&(b+=w,k+=1)},remove(p){const w=R(p);w!==null&&(b-=w,k-=1)},value(){return k>0?b/k:null}}}case"countDistinct":{const b=new Map;return{add(k){J(k)||b.set(k,(b.get(k)||0)+1)},remove(k){if(J(k))return;const p=b.get(k);p&&(p===1?b.delete(k):b.set(k,p-1))},value(){return b.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const b=new Map;let k=null,p=!1;const w=(O,D)=>d?O>D:O<D,j=()=>{let O=null;for(const D of b.keys())(O===null||w(D,O))&&(O=D);return O};return{add(O){const D=R(O);D!==null&&(b.set(D,(b.get(D)||0)+1),!p&&(k===null||w(D,k))&&(k=D))},remove(O){const D=R(O);if(D===null)return;const K=b.get(D);K&&(K===1?(b.delete(D),D===k&&(p=!0)):b.set(D,K-1))},value(){return b.size===0?null:(p&&(k=j(),p=!1),k)}}}function L(d){return T(d)?d:typeof d=="string"&&d?A(d):()=>{}}function U(d,b){if(d==null||Number.isNaN(d))return null;if(Array.isArray(b.bands)){for(const w of b.bands){const j=J(w.min)?-1/0:w.min,O=J(w.max)?1/0:w.max;if(d>=j&&d<O)return w.status??null}return null}const k=b.thresholds;return!k||J(k.warn)||J(k.critical)?null:k.direction==="lowerIsBetter"?d<=k.warn?"good":d<=k.critical?"warn":"critical":d>=k.warn?"good":d>=k.critical?"warn":"critical"}const P="unknown";function F(d,b,k){return k?U(d,b):P}function _(d){if(!d)return null;const b=[];let k=!1;const p=O=>{if(J(O))return!1;const D=Number(O);return Number.isFinite(D)?(b.push(D),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const O of d.bands||[])p(O&&O.min)||(k=!0),p(O&&O.max)||(k=!0);else d.thresholds&&!J(d.thresholds.warn)&&!J(d.thresholds.critical)&&(p(d.thresholds.warn),p(d.thresholds.critical)),k=!0;if(p(d.target),k&&b.push(0),!b.length)return null;const w=Math.min(...b),j=Math.max(...b);return j>w?{lo:w,hi:j}:null}function Y(d,b){if(!b||J(d))return null;const k=Number(d);if(!Number.isFinite(k))return null;const p=b.hi-b.lo;return p?Math.max(0,Math.min(1,(k-b.lo)/p))*100:null}function G(d,b,k="—"){if(d==null||Number.isNaN(d))return k;const p=typeof b=="string"?{type:b}:b||{},w=p.type||"number",j=p.locale||void 0,O={};w==="currency"?(O.style="currency",O.currency=p.currency||"USD"):w==="percent"?O.style="percent":w==="compact"&&(O.notation="compact",typeof p.currency=="string"&&p.currency&&(O.style="currency",O.currency=p.currency)),J(p.decimals)||(O.minimumFractionDigits=p.decimals,O.maximumFractionDigits=p.decimals);const D=typeof p.prefix=="string"?p.prefix:"",K=typeof p.suffix=="string"?p.suffix:"";try{return D+new Intl.NumberFormat(j,O).format(d)+K}catch{return D+String(d)+K}}}),_e("packages/core/src/source/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(g,"buildFromPath",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"assignLevels",{enumerable:!0,get:function(){return U}}),Object.defineProperty(g,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(g,"buildTree",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"indexTree",{enumerable:!0,get:function(){return _}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.warnOnce,A="",m="\0tree:";function R(Y,G){return{physical:Y,key:G,level:0,children:[],value:void 0}}function u(Y,G){const d=[],b=new Map;for(let k=0;k<Y.length;k++){const p=Y[k],w=G.pathOf(p),j=Array.isArray(w)?w.map(D=>String(D)):[];if(!j.length){const D=R(p,G.keyOf(p));d.push(D);continue}let O=null;for(let D=0;D<j.length;D++){const K=j.slice(0,D+1).join(A),le=D===j.length-1;let q=b.get(K);q&&le&&q.physical===-1&&(q.physical=p,q.key=G.keyOf(p)),q||(q=R(le?p:-1,le?G.keyOf(p):m+K),q.level=D,q.value=j[D],b.set(K,q),O?O.children.push(q):d.push(q)),O=q}}return{roots:d,nodes:b}}function E(Y,G){const d=new Map,b=[];for(let j=0;j<Y.length;j++){const O=Y[j],D=G.keyOf(O),K=R(O,D);d.set(D,K);const le=G.parentOf(O);le!=null&&le!==""&&b.push({node:K,parent:String(le)})}let k=null;const p=new Map;for(const{node:j,parent:O}of b){const D=d.get(O);if(D){p.set(j.key,D);continue}G.orphans&&G.orphans!=="root"&&(k||(k=R(-1,`${m}orphans`),k.value=G.orphans),p.set(j.key,k))}const w=[];for(const j of d.values()){const O=p.get(j.key);O?O.children.push(j):w.push(j)}return k&&k.children.length&&w.push(k),{roots:L(w,d,G.orphans,k),nodes:d}}function L(Y,G,d,b){const k=new Set,p=[...Y];for(;p.length;){const K=p.pop();if(!k.has(K.key)){k.add(K.key);for(const le of K.children)p.push(le)}}const w=[];for(const K of G.values())k.has(K.key)||w.push(K);if(!w.length)return Y;const j=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${w.length} row(s) inside a parent cycle; `+(j?`they are shown under "${d}".`:"they are shown at the root."));for(const K of w)K.children=K.children.filter(le=>k.has(le.key));if(!j)return[...Y,...w];let O=b;const D=[...Y];return O||(O=R(-1,`${m}orphans`),O.value=d,D.push(O)),O.children.push(...w),D}function U(Y){let G=0;const d=(b,k)=>{for(const p of b)p.level=k,k>G&&(G=k),p.children.length&&d(p.children,k+1)};return d(Y,0),G}function P(Y,G){if(!Y||typeof Y!="object")return null;const d=Y.path,b=Y.parentKey,k=J(Y.hasChildren)?p=>!!Y.hasChildren(G.dataAt(p)):null;if(J(d))return{mode:"path",pathOf:p=>d(G.dataAt(p)),keyOf:G.keyOf,declaresChildren:k};if(b!=null){const p=J(b)?b:w=>w?.[b];return{mode:"parentKey",parentOf:w=>p(G.dataAt(w)),keyOf:G.keyOf,orphans:Y.orphans||"root",declaresChildren:k}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function F(Y,G){const d=G.mode==="path"?u(Y,G):E(Y,G),b=U(d.roots);return{...d,depth:b}}function _(Y,G){const d=new Map,b=k=>{for(let p=0;p<k.length;p++){const w=k[p];if(w.physical>=0){const j=G?G(w.physical):!1,O=j&&w.children.length===0;d.set(w.physical,{level:w.level,posinset:p+1,setsize:k.length,hasChildren:w.children.length>0||j,lazy:O})}w.children.length&&b(w.children)}};return b(Y),d}}),_e("packages/modules/kpi/tree.js",function(g,ce){"use strict";Object.defineProperty(g,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"worseOf",{enumerable:!0,get:function(){return F}}),Object.defineProperty(g,"resolveHierarchy",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(g,"allNodes",{enumerable:!0,get:function(){return b}}),Object.defineProperty(g,"visibleNodes",{enumerable:!0,get:function(){return k}}),Object.defineProperty(g,"branchKeys",{enumerable:!0,get:function(){return p}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.isObject,A=X.warnOnce,m=ce("packages/core/src/source/tree.js"),R=m.resolveTree,u=m.buildTree,E=".",L=Object.freeze({good:1,warn:2,critical:3}),U=Object.freeze([null,"good","warn","critical"]);function P(w){return!!w&&w.kind!=="clock"&&(w.value===null||w.value===void 0)}function F(w,j){const O=Math.max(L[w]||0,L[j]||0);return U[O]}function _(w,j){if(!j.length||w===!1)return null;if(w==null)return j.some(h=>h.id.includes(E))&&A("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const O=T(w)?w:{},D=j.map((h,v)=>v),K=h=>j[h].id;if(J(O.path)||O.parentKey!==null&&O.parentKey!==void 0){const h=R(O,{dataAt:v=>j[v].spec,keyOf:K});return h?Y({...u(D,h),mode:h.mode},j):null}const le=typeof O.separator=="string"&&O.separator?O.separator:E;if(!j.some(h=>h.id.includes(le)))return null;const q=R({path:h=>String(h).split(le)},{dataAt:h=>j[h].id,keyOf:K});return Y({...u(D,q),mode:"id"},j)}function Y(w,j){const O=new Set,D=new Set(j.map(q=>q.id)),K=(q,h)=>{for(const v of q){const I=v.physical>=0?v.key:v.value===null||v.value===void 0?"":String(v.value),M=`${h}/${I}`;v.physical>=0?O.add(v.physical):D.has(M)||(v.key=M,D.add(M)),K(v.children,M)}};K(w.roots,"");const le=j.filter((q,h)=>!O.has(h)).map(q=>q.id);return le.length&&A("kpi:tree:unplaced",`${le.length} KPI tile(s) are not on the tree and will not render: ${le.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),w}function G(w,j){return w&&w.spec&&w.spec.label!==null&&w.spec.label!==void 0?String(w.spec.label):j!=null?String(j):w?w.label:""}function d(w,j,O,D){const K=(le,q,h,v)=>{const I=le.physical>=0?j[le.physical]:null,M=I?O.get(I.id):null,H=le.children.map((C,z)=>K(C,q+1,z,le.children.length)),ue=M?M.status:null;let ae=L[ue]?ue:null,ve=ue==="unknown"||P(M)?1:0,N=M?1:0;for(const C of H)ae=F(ae,C.rollup),ve+=C.unknown,N+=C.items;return{key:le.key,id:M?M.id:null,label:G(I,le.value),level:q,posinset:h+1,setsize:v,hasChildren:H.length>0,expanded:H.length>0&&D.has(le.key),children:H,tile:M,value:M?M.value:null,formatted:M?M.formatted:null,status:ue??null,rollup:ae,unknown:ve,items:N}};return w.roots.map((le,q)=>K(le,0,q,w.roots.length))}function b(w){const j=[],O=D=>{for(const K of D)j.push(K),O(K.children)};return O(w),j}function k(w){const j=[],O=D=>{for(const K of D)j.push(K),K.expanded&&O(K.children)};return O(w),j}function p(w){const j=[],O=D=>{for(const K of D)K.children.length&&(j.push(K.key),O(K.children))};return O(w),j}}),_e("packages/modules/kpi/messages.js",function(g,ce){"use strict";Object.defineProperty(g,"FALLBACK_EN",{enumerable:!0,get:function(){return A}}),Object.defineProperty(g,"resolveMessages",{enumerable:!0,get:function(){return R}}),Object.defineProperty(g,"fallbackT",{enumerable:!0,get:function(){return u}});const X=ce("packages/core/src/internal/util.js"),J=X.isFunction,T=X.isObject,A=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.group.name":"KPI: {name}","kpi.group.unnamed":"KPI","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,L){return L?E.replace(/\{(\w+)\}/g,(U,P)=>P in L?String(L[P]):U):E}function R(E){const L=T(E.messages)&&J(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&J(E.grid.messages.t)&&E.grid.messages||null;return(U,P)=>{if(L){let F;try{F=L.t(U,P)}catch{F=null}if(typeof F=="string"&&F&&F!==U)return F}return m(A[U]||U,P)}}const u=R({})}),_e("packages/modules/kpi/view.js",function(g,ce){"use strict";Object.defineProperty(g,"NS",{enumerable:!0,get:function(){return u}}),Object.defineProperty(g,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(g,"Emitter",{enumerable:!0,get:function(){return _}}),Object.defineProperty(g,"injectStyles",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(g,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(g,"tileMinFor",{enumerable:!0,get:function(){return p}}),Object.defineProperty(g,"renderKPI",{enumerable:!0,get:function(){return le}});const J=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,A=ce("packages/modules/kpi/tree.js").visibleNodes,R=ce("packages/modules/kpi/messages.js").fallbackT,u="lat-kpi",E=R("kpi.status.unknown"),L=R,U=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(i,n){return n?i(`kpi.status.${n}`):""}function F(i){return i&&i.stale?"kpi.status.stale":"kpi.status.unknown"}class _{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const c of this.map.get(n)||[])c(s)}}function Y(i){if(!i||i.getElementById&&i.getElementById(`${u}-styles`))return;const n=i.createElement("style");n.id=`${u}-styles`,n.setAttribute("id",`${u}-styles`),n.textContent=`
|
|
7
7
|
.${u}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${u}-tile-min,160px),1fr));font-family:var(--${u}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${u}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${u}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${u}-fg,var(--lattice-foreground));--${u}-meter-w:var(--${u}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
|
|
8
8
|
/* The author display:grid above outranks the browser's own [hidden] rule,
|
|
9
9
|
so a hidden host stays painted without this guard (BACKLOG-0001605). */
|