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