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