@toclocoinc/lattice-grid 1.65.0 → 1.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +6 -4
  2. package/angular/LICENSE +111 -0
  3. package/angular/README.md +78 -0
  4. package/angular/fesm2022/toclocoinc-lattice-grid-angular.mjs +2843 -0
  5. package/angular/package.json +16 -0
  6. package/angular/types/toclocoinc-lattice-grid-angular.d.ts +1366 -0
  7. package/docs/API.html +741 -27
  8. package/docs/api-detail.html +137 -4
  9. package/lattice-grid.d.ts +9 -6
  10. package/lattice-grid.esm.min.js +26 -10
  11. package/lattice-grid.min.cjs +26 -10
  12. package/lattice-grid.min.css +1 -1
  13. package/lattice-grid.min.js +26 -10
  14. package/modules/ai.d.ts +1 -1
  15. package/modules/ai.esm.min.js +3 -3
  16. package/modules/ai.min.cjs +3 -3
  17. package/modules/ai.min.js +3 -3
  18. package/modules/angular.d.ts +1 -1
  19. package/modules/angular.esm.min.js +7 -7
  20. package/modules/angular.min.cjs +7 -7
  21. package/modules/angular.min.js +7 -7
  22. package/modules/chart-alluvial.d.ts +1 -1
  23. package/modules/chart-alluvial.esm.min.js +1 -1
  24. package/modules/chart-alluvial.min.cjs +1 -1
  25. package/modules/chart-alluvial.min.js +1 -1
  26. package/modules/chart-arc.d.ts +1 -1
  27. package/modules/chart-arc.esm.min.js +1 -1
  28. package/modules/chart-arc.min.cjs +1 -1
  29. package/modules/chart-arc.min.js +1 -1
  30. package/modules/chart-bubblemap.d.ts +1 -1
  31. package/modules/chart-bubblemap.esm.min.js +1 -1
  32. package/modules/chart-bubblemap.min.cjs +1 -1
  33. package/modules/chart-bubblemap.min.js +1 -1
  34. package/modules/chart-bump.d.ts +1 -1
  35. package/modules/chart-bump.esm.min.js +1 -1
  36. package/modules/chart-bump.min.cjs +1 -1
  37. package/modules/chart-bump.min.js +1 -1
  38. package/modules/chart-calendar.d.ts +1 -1
  39. package/modules/chart-calendar.esm.min.js +1 -1
  40. package/modules/chart-calendar.min.cjs +1 -1
  41. package/modules/chart-calendar.min.js +1 -1
  42. package/modules/chart-decomposition.d.ts +1 -1
  43. package/modules/chart-decomposition.esm.min.js +1 -1
  44. package/modules/chart-decomposition.min.cjs +1 -1
  45. package/modules/chart-decomposition.min.js +1 -1
  46. package/modules/chart-diverging.d.ts +1 -1
  47. package/modules/chart-diverging.esm.min.js +1 -1
  48. package/modules/chart-diverging.min.cjs +1 -1
  49. package/modules/chart-diverging.min.js +1 -1
  50. package/modules/chart-dumbbell.d.ts +1 -1
  51. package/modules/chart-dumbbell.esm.min.js +1 -1
  52. package/modules/chart-dumbbell.min.cjs +1 -1
  53. package/modules/chart-dumbbell.min.js +1 -1
  54. package/modules/chart-fan.d.ts +1 -1
  55. package/modules/chart-fan.esm.min.js +1 -1
  56. package/modules/chart-fan.min.cjs +1 -1
  57. package/modules/chart-fan.min.js +1 -1
  58. package/modules/chart-hexbin.d.ts +1 -1
  59. package/modules/chart-hexbin.esm.min.js +1 -1
  60. package/modules/chart-hexbin.min.cjs +1 -1
  61. package/modules/chart-hexbin.min.js +1 -1
  62. package/modules/chart-hexmap.d.ts +1 -1
  63. package/modules/chart-hexmap.esm.min.js +1 -1
  64. package/modules/chart-hexmap.min.cjs +1 -1
  65. package/modules/chart-hexmap.min.js +1 -1
  66. package/modules/chart-icicle.d.ts +1 -1
  67. package/modules/chart-icicle.esm.min.js +1 -1
  68. package/modules/chart-icicle.min.cjs +1 -1
  69. package/modules/chart-icicle.min.js +1 -1
  70. package/modules/chart-markermap.d.ts +1 -1
  71. package/modules/chart-markermap.esm.min.js +1 -1
  72. package/modules/chart-markermap.min.cjs +1 -1
  73. package/modules/chart-markermap.min.js +1 -1
  74. package/modules/chart-parallel.d.ts +1 -1
  75. package/modules/chart-parallel.esm.min.js +1 -1
  76. package/modules/chart-parallel.min.cjs +1 -1
  77. package/modules/chart-parallel.min.js +1 -1
  78. package/modules/chart-ridgeline.d.ts +1 -1
  79. package/modules/chart-ridgeline.esm.min.js +1 -1
  80. package/modules/chart-ridgeline.min.cjs +1 -1
  81. package/modules/chart-ridgeline.min.js +1 -1
  82. package/modules/chart-roc.d.ts +1 -1
  83. package/modules/chart-roc.esm.min.js +1 -1
  84. package/modules/chart-roc.min.cjs +1 -1
  85. package/modules/chart-roc.min.js +1 -1
  86. package/modules/chart-slope.d.ts +1 -1
  87. package/modules/chart-slope.esm.min.js +1 -1
  88. package/modules/chart-slope.min.cjs +1 -1
  89. package/modules/chart-slope.min.js +1 -1
  90. package/modules/chart-splom.d.ts +1 -1
  91. package/modules/chart-splom.esm.min.js +1 -1
  92. package/modules/chart-splom.min.cjs +1 -1
  93. package/modules/chart-splom.min.js +1 -1
  94. package/modules/chart-waffle.d.ts +1 -1
  95. package/modules/chart-waffle.esm.min.js +1 -1
  96. package/modules/chart-waffle.min.cjs +1 -1
  97. package/modules/chart-waffle.min.js +1 -1
  98. package/modules/charts.d.ts +1 -1
  99. package/modules/charts.esm.min.js +261 -48
  100. package/modules/charts.min.cjs +261 -48
  101. package/modules/charts.min.js +261 -48
  102. package/modules/data-router.d.ts +8 -3
  103. package/modules/data-router.esm.min.js +28 -6
  104. package/modules/data-router.min.cjs +28 -6
  105. package/modules/data-router.min.js +28 -6
  106. package/modules/devtools.d.ts +1 -1
  107. package/modules/devtools.esm.min.js +1 -1
  108. package/modules/devtools.min.cjs +1 -1
  109. package/modules/devtools.min.js +1 -1
  110. package/modules/dhtmlx-compat.d.ts +1 -1
  111. package/modules/dhtmlx-compat.esm.min.js +3 -3
  112. package/modules/dhtmlx-compat.min.cjs +3 -3
  113. package/modules/dhtmlx-compat.min.js +3 -3
  114. package/modules/gantt.d.ts +8 -3
  115. package/modules/gantt.esm.min.js +27 -4
  116. package/modules/gantt.min.cjs +27 -4
  117. package/modules/gantt.min.js +27 -4
  118. package/modules/geo-europe-nuts.d.ts +1 -1
  119. package/modules/geo-europe-nuts.esm.min.js +1 -1
  120. package/modules/geo-uk.d.ts +1 -1
  121. package/modules/geo-uk.esm.min.js +1 -1
  122. package/modules/geo-us-states.d.ts +1 -1
  123. package/modules/geo-us-states.esm.min.js +1 -1
  124. package/modules/geo-world-110m.d.ts +1 -1
  125. package/modules/geo-world-110m.esm.min.js +1 -1
  126. package/modules/geo-world-50m.d.ts +1 -1
  127. package/modules/geo-world-50m.esm.min.js +1 -1
  128. package/modules/htmx.d.ts +1 -1
  129. package/modules/htmx.esm.min.js +26 -10
  130. package/modules/htmx.min.cjs +26 -10
  131. package/modules/htmx.min.js +26 -10
  132. package/modules/kanban.d.ts +10 -3
  133. package/modules/kanban.esm.min.js +24 -4
  134. package/modules/kanban.min.cjs +24 -4
  135. package/modules/kanban.min.js +24 -4
  136. package/modules/kpi.d.ts +10 -3
  137. package/modules/kpi.esm.min.js +27 -4
  138. package/modules/kpi.min.cjs +27 -4
  139. package/modules/kpi.min.js +27 -4
  140. package/modules/layout.d.ts +1 -1
  141. package/modules/layout.esm.min.js +3 -3
  142. package/modules/layout.min.cjs +3 -3
  143. package/modules/layout.min.js +3 -3
  144. package/modules/mock-socket.d.ts +1 -1
  145. package/modules/mock-socket.esm.min.js +1 -1
  146. package/modules/mock-socket.min.cjs +1 -1
  147. package/modules/mock-socket.min.js +1 -1
  148. package/modules/react.d.ts +1 -1
  149. package/modules/react.esm.min.js +3 -3
  150. package/modules/react.min.cjs +3 -3
  151. package/modules/react.min.js +3 -3
  152. package/modules/svelte.d.ts +251 -2
  153. package/modules/svelte.esm.min.js +960 -6
  154. package/modules/svelte.min.cjs +942 -5
  155. package/modules/svelte.min.js +942 -5
  156. package/modules/tabs.d.ts +1 -1
  157. package/modules/tabs.esm.min.js +3 -3
  158. package/modules/tabs.min.cjs +3 -3
  159. package/modules/tabs.min.js +3 -3
  160. package/modules/vue.d.ts +398 -9
  161. package/modules/vue.esm.min.js +1163 -31
  162. package/modules/vue.min.cjs +1147 -30
  163. package/modules/vue.min.js +1147 -30
  164. package/modules/webcomponent.d.ts +233 -1
  165. package/modules/webcomponent.esm.min.js +1274 -41
  166. package/modules/webcomponent.min.cjs +1256 -41
  167. package/modules/webcomponent.min.js +1256 -41
  168. package/package.json +27 -2
  169. package/svelte/Chart.svelte +34 -0
  170. package/svelte/Gantt.svelte +34 -0
  171. package/svelte/Grid.svelte +30 -0
  172. package/svelte/GridProvider.svelte +13 -0
  173. package/svelte/KPI.svelte +34 -0
  174. package/svelte/Kanban.svelte +34 -0
  175. package/svelte/Layout.svelte +34 -0
  176. package/svelte/Router.svelte +16 -0
  177. package/svelte/Tabs.svelte +53 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.65.0, svelte module
2
+ * Lattice Grid 1.67.0, svelte module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -16,6 +16,403 @@ if(!fn)throw new Error('[lattice] missing module: '+id);
16
16
  fn(exports,__req);
17
17
  return exports;
18
18
  }
19
+ __def("packages/core/src/internal/util.js",function(__exports,__req){
20
+ 'use strict';
21
+ Object.defineProperty(__exports,"VERSION",{enumerable:true,get:function(){return VERSION;}});
22
+ Object.defineProperty(__exports,"reportedWarnings",{enumerable:true,get:function(){return reportedWarnings;}});
23
+ Object.defineProperty(__exports,"warnOnce",{enumerable:true,get:function(){return warnOnce;}});
24
+ Object.defineProperty(__exports,"infoOnce",{enumerable:true,get:function(){return infoOnce;}});
25
+ Object.defineProperty(__exports,"resetWarnings",{enumerable:true,get:function(){return resetWarnings;}});
26
+ Object.defineProperty(__exports,"fail",{enumerable:true,get:function(){return fail;}});
27
+ Object.defineProperty(__exports,"invariant",{enumerable:true,get:function(){return invariant;}});
28
+ Object.defineProperty(__exports,"DEV",{enumerable:true,get:function(){return DEV;}});
29
+ Object.defineProperty(__exports,"isObject",{enumerable:true,get:function(){return isObject;}});
30
+ Object.defineProperty(__exports,"isFunction",{enumerable:true,get:function(){return isFunction;}});
31
+ Object.defineProperty(__exports,"isNil",{enumerable:true,get:function(){return isNil;}});
32
+ Object.defineProperty(__exports,"isBlank",{enumerable:true,get:function(){return isBlank;}});
33
+ Object.defineProperty(__exports,"isCtor",{enumerable:true,get:function(){return isCtor;}});
34
+ Object.defineProperty(__exports,"pathGetter",{enumerable:true,get:function(){return pathGetter;}});
35
+ Object.defineProperty(__exports,"pathSetter",{enumerable:true,get:function(){return pathSetter;}});
36
+ Object.defineProperty(__exports,"getPath",{enumerable:true,get:function(){return getPath;}});
37
+ Object.defineProperty(__exports,"setPath",{enumerable:true,get:function(){return setPath;}});
38
+ Object.defineProperty(__exports,"humanise",{enumerable:true,get:function(){return humanise;}});
39
+ Object.defineProperty(__exports,"escapeHtml",{enumerable:true,get:function(){return escapeHtml;}});
40
+ Object.defineProperty(__exports,"titleCase",{enumerable:true,get:function(){return titleCase;}});
41
+ Object.defineProperty(__exports,"expand",{enumerable:true,get:function(){return expand;}});
42
+ Object.defineProperty(__exports,"toArray",{enumerable:true,get:function(){return toArray;}});
43
+ Object.defineProperty(__exports,"merge",{enumerable:true,get:function(){return merge;}});
44
+ Object.defineProperty(__exports,"mergeRow",{enumerable:true,get:function(){return mergeRow;}});
45
+ Object.defineProperty(__exports,"Lru",{enumerable:true,get:function(){return Lru;}});
46
+ Object.defineProperty(__exports,"collator",{enumerable:true,get:function(){return collator;}});
47
+ Object.defineProperty(__exports,"defaultCompare",{enumerable:true,get:function(){return defaultCompare;}});
48
+ Object.defineProperty(__exports,"now",{enumerable:true,get:function(){return now;}});
49
+ Object.defineProperty(__exports,"nextFrame",{enumerable:true,get:function(){return nextFrame;}});
50
+ Object.defineProperty(__exports,"cancelFrame",{enumerable:true,get:function(){return cancelFrame;}});
51
+ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){return frameBatched;}});
52
+ Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
53
+ Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
54
+ Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
55
+ const STAMPED_VERSION="1.67.0";
56
+ async function resolveVersion(){
57
+ if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
58
+ return STAMPED_VERSION;
59
+ }
60
+ const VERSION="1.67.0";
61
+ const warned=new Set();
62
+ const WARNED_LIMIT=2000;
63
+ function rememberWarned(key){
64
+ warned.add(key);
65
+ if(warned.size>WARNED_LIMIT){
66
+ const oldest=warned.values().next().value;
67
+ if(oldest!==undefined)warned.delete(oldest);
68
+ }
69
+ }
70
+ const reported=[];
71
+ const REPORT_LIMIT=500;
72
+ function record(key,level,message){
73
+ reported.push({
74
+ key,
75
+ level,
76
+ message:message.map((m)=>(typeof m==='string'?m:safeString(m))).join(' '),
77
+ at:Date.now(),
78
+ });
79
+ if(reported.length>REPORT_LIMIT)reported.shift();
80
+ }
81
+ function safeString(value){
82
+ if(value instanceof Error)return value.message;
83
+ try{return JSON.stringify(value);}catch{return String(value);}
84
+ }
85
+ function reportedWarnings(){return reported.map((r)=>({...r}));}
86
+ function warnOnce(key,...message){
87
+ if(warned.has(key))return;
88
+ rememberWarned(key);
89
+ record(key,'warn',message);
90
+ console.warn('[lattice]',...message);
91
+ }
92
+ function infoOnce(key,...message){
93
+ if(warned.has(key))return;
94
+ rememberWarned(key);
95
+ record(key,'info',message);
96
+ console.info('[lattice]',...message);
97
+ }
98
+ function resetWarnings(){
99
+ warned.clear();
100
+ reported.length=0;
101
+ }
102
+ function fail(message,extra){
103
+ const err=new Error(`[lattice] ${message}`);
104
+ if(extra!==undefined)err.cause=extra;
105
+ throw err;
106
+ }
107
+ function invariant(condition,message){
108
+ if(!condition)fail(message);
109
+ }
110
+ const DEV=(()=>{
111
+ try{
112
+ return!(typeof process!=='undefined'&&process.env
113
+ &&process.env.NODE_ENV==='production');
114
+ }catch{
115
+ return true;
116
+ }
117
+ })();
118
+ function isObject(v){
119
+ return v!==null&&typeof v==='object'&&!Array.isArray(v);
120
+ }
121
+ function isFunction(v){
122
+ return typeof v==='function';
123
+ }
124
+ function isNil(v){
125
+ return v===null||v===undefined;
126
+ }
127
+ function isBlank(v){
128
+ return v===null||v===undefined||v==='';
129
+ }
130
+ function isCtor(v){
131
+ if(typeof v!=='function')return false;
132
+ if(/^class[\s{]/.test(Function.prototype.toString.call(v)))return true;
133
+ return!!(v.prototype&&Object.getOwnPropertyNames(v.prototype).length>1);
134
+ }
135
+ const pathCache=new Map();
136
+ function pathGetter(path){
137
+ let fn=pathCache.get(path);
138
+ if(fn)return fn;
139
+ if(!path.includes('.')){
140
+ fn=(o)=>(o==null?undefined:o[path]);
141
+ }else{
142
+ const parts=path.split('.');
143
+ const n=parts.length;
144
+ fn=(o)=>{
145
+ let cur=o;
146
+ for(let i=0;i<n;i++){
147
+ if(cur==null)return undefined;
148
+ cur=cur[parts[i]];
149
+ }
150
+ return cur;
151
+ };
152
+ }
153
+ pathCache.set(path,fn);
154
+ return fn;
155
+ }
156
+ const setterCache=new Map();
157
+ function pathSetter(path){
158
+ let fn=setterCache.get(path);
159
+ if(fn)return fn;
160
+ if(!path.includes('.')){
161
+ fn=(o,v)=>{if(o!=null)o[path]=v;};
162
+ }else{
163
+ const parts=path.split('.');
164
+ const last=parts.length-1;
165
+ fn=(o,v)=>{
166
+ let cur=o;
167
+ for(let i=0;i<last;i++){
168
+ if(cur==null)return;
169
+ const k=parts[i];
170
+ if(cur[k]==null)cur[k]={};
171
+ cur=cur[k];
172
+ }
173
+ if(cur!=null)cur[parts[last]]=v;
174
+ };
175
+ }
176
+ setterCache.set(path,fn);
177
+ return fn;
178
+ }
179
+ function getPath(obj,path){
180
+ return pathGetter(path)(obj);
181
+ }
182
+ function setPath(obj,path,value){
183
+ pathSetter(path)(obj,value);
184
+ }
185
+ function humanise(field){
186
+ if(!field)return'';
187
+ const leaf=field.includes('.')?field.slice(field.lastIndexOf('.')+1):field;
188
+ return leaf
189
+ .replace(/[_-]+/g,' ')
190
+ .replace(/([a-z0-9])([A-Z])/g,'$1 $2')
191
+ .replace(/([A-Z]+)([A-Z][a-z])/g,'$1 $2')
192
+ .replace(/\s+/g,' ')
193
+ .trim()
194
+ .replace(/^./,(c)=>c.toUpperCase());
195
+ }
196
+ const ESCAPES={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'};
197
+ function escapeHtml(s){
198
+ const str=s==null?'':String(s);
199
+ return/[&<>"']/.test(str)?str.replace(/[&<>"']/g,(c)=>ESCAPES[c]):str;
200
+ }
201
+ function titleCase(s){
202
+ return String(s).replace(/\w\S*/g,(t)=>t[0].toUpperCase()+t.slice(1).toLowerCase());
203
+ }
204
+ function expand(value,key,whenTrue){
205
+ if(value===undefined)return undefined;
206
+ if(value===true)return{enabled:true,...whenTrue};
207
+ if(value===false)return{enabled:false};
208
+ if(isObject(value))return value;
209
+ return{[key]:value,enabled:true};
210
+ }
211
+ function toArray(v){
212
+ if(v===undefined||v===null)return[];
213
+ return Array.isArray(v)?v:[v];
214
+ }
215
+ const MERGE_FORBIDDEN_KEYS=Object.freeze(new Set(['__proto__','constructor','prototype']));
216
+ function merge(a,b){
217
+ if(!isObject(a))return isObject(b)?{...b}:b;
218
+ if(!isObject(b))return b===undefined?a:b;
219
+ const out={...a};
220
+ for(const k of Object.keys(b)){
221
+ if(MERGE_FORBIDDEN_KEYS.has(k))continue;
222
+ const bv=b[k];
223
+ if(bv===undefined)continue;
224
+ out[k]=isObject(bv)&&isObject(out[k])?merge(out[k],bv):bv;
225
+ }
226
+ return out;
227
+ }
228
+ function mergeRow(previous,patch){
229
+ if(!isObject(previous)||!isObject(patch)||previous===patch)return patch;
230
+ const out=Object.create(Object.getPrototypeOf(previous));
231
+ Object.assign(out,previous,patch);
232
+ return out;
233
+ }
234
+ class Lru{
235
+ #max;
236
+ #map=new Map();
237
+ #onEvict;
238
+ constructor(max=256,onEvict=null){
239
+ this.#max=max;
240
+ this.#onEvict=onEvict;
241
+ }
242
+ get size(){
243
+ return this.#map.size;
244
+ }
245
+ get max(){
246
+ return this.#max;
247
+ }
248
+ set max(v){
249
+ this.#max=v;
250
+ this.#trim();
251
+ }
252
+ has(k){
253
+ return this.#map.has(k);
254
+ }
255
+ get(k){
256
+ const m=this.#map;
257
+ if(!m.has(k))return undefined;
258
+ const v=m.get(k);
259
+ m.delete(k);
260
+ m.set(k,v);
261
+ return v;
262
+ }
263
+ peek(k){
264
+ return this.#map.get(k);
265
+ }
266
+ set(k,v){
267
+ const m=this.#map;
268
+ if(m.has(k))m.delete(k);
269
+ m.set(k,v);
270
+ this.#trim();
271
+ return v;
272
+ }
273
+ delete(k){
274
+ const v=this.#map.get(k);
275
+ if(this.#map.delete(k)&&this.#onEvict)this.#onEvict(v,k);
276
+ return v;
277
+ }
278
+ clear(){
279
+ if(this.#onEvict)for(const[k,v]of this.#map)this.#onEvict(v,k);
280
+ this.#map.clear();
281
+ }
282
+ keys(){
283
+ return this.#map.keys();
284
+ }
285
+ values(){
286
+ return this.#map.values();
287
+ }
288
+ #trim(){
289
+ const m=this.#map;
290
+ while(m.size>this.#max){
291
+ const oldest=m.keys().next().value;
292
+ const v=m.get(oldest);
293
+ m.delete(oldest);
294
+ if(this.#onEvict)this.#onEvict(v,oldest);
295
+ }
296
+ }
297
+ }
298
+ const collators=new Map();
299
+ function collator(locale,opts){
300
+ const key=`${locale||''}|${opts?JSON.stringify(opts):''}`;
301
+ let c=collators.get(key);
302
+ if(!c){
303
+ c=new Intl.Collator(locale||undefined,{
304
+ numeric:true,sensitivity:'variant',...opts,
305
+ });
306
+ collators.set(key,c);
307
+ }
308
+ return c;
309
+ }
310
+ function defaultCompare(a,b){
311
+ if(a===b)return 0;
312
+ if(a===null||a===undefined)return 1;
313
+ if(b===null||b===undefined)return-1;
314
+ if(typeof a==='number'&&typeof b==='number'){
315
+ if(Number.isNaN(a))return Number.isNaN(b)?0:1;
316
+ if(Number.isNaN(b))return-1;
317
+ return a<b?-1:a>b?1:0;
318
+ }
319
+ const sa=String(a);
320
+ const sb=String(b);
321
+ return sa<sb?-1:sa>sb?1:0;
322
+ }
323
+ function now(){
324
+ return typeof performance!=='undefined'&&performance.now
325
+ ?performance.now()
326
+ :Date.now();
327
+ }
328
+ const hasRaf=typeof requestAnimationFrame==='function';
329
+ function nextFrame(fn){
330
+ if(hasRaf)return requestAnimationFrame(fn);
331
+ return setTimeout(()=>fn(now()),16);
332
+ }
333
+ function cancelFrame(handle){
334
+ if(handle==null)return;
335
+ if(hasRaf)cancelAnimationFrame(handle);
336
+ else clearTimeout(handle);
337
+ }
338
+ function frameBatched(fn){
339
+ let handle=null;
340
+ let lastArgs=null;
341
+ const run=()=>{
342
+ handle=null;
343
+ const a=lastArgs;
344
+ lastArgs=null;
345
+ fn(...(a||[]));
346
+ };
347
+ const wrapped=(...args)=>{
348
+ lastArgs=args;
349
+ if(handle===null)handle=nextFrame(run);
350
+ };
351
+ wrapped.cancel=()=>{
352
+ cancelFrame(handle);
353
+ handle=null;
354
+ lastArgs=null;
355
+ };
356
+ wrapped.flush=()=>{
357
+ if(handle!==null){
358
+ cancelFrame(handle);
359
+ run();
360
+ }
361
+ };
362
+ return wrapped;
363
+ }
364
+ function settleDebounce(fn,waitMs){
365
+ let timer=null;
366
+ let held=null;
367
+ const trailing=()=>{
368
+ timer=null;
369
+ if(held===null)return;
370
+ const args=held;
371
+ held=null;
372
+ fn(...args);
373
+ arm();
374
+ };
375
+ const arm=()=>{
376
+ timer=setTimeout(trailing,waitMs);
377
+ if(typeof timer?.unref==='function')timer.unref();
378
+ };
379
+ const wrapped=(...args)=>{
380
+ if(timer===null){
381
+ fn(...args);
382
+ arm();
383
+ }else{
384
+ held=args;
385
+ clearTimeout(timer);
386
+ arm();
387
+ }
388
+ };
389
+ wrapped.flush=()=>{
390
+ if(timer!==null)clearTimeout(timer);
391
+ timer=null;
392
+ if(held===null)return;
393
+ const args=held;
394
+ held=null;
395
+ fn(...args);
396
+ };
397
+ wrapped.cancel=()=>{
398
+ if(timer!==null)clearTimeout(timer);
399
+ timer=null;
400
+ held=null;
401
+ };
402
+ wrapped.pending=()=>timer!==null||held!==null;
403
+ return wrapped;
404
+ }
405
+ function whenIdle(fn,timeout=50){
406
+ if(typeof requestIdleCallback==='function'){
407
+ return requestIdleCallback(fn,{timeout});
408
+ }
409
+ return setTimeout(()=>fn({timeRemaining:()=>0,didTimeout:true}),1);
410
+ }
411
+ let idSeq=0;
412
+ function uid(prefix='l'){
413
+ return`${prefix}${(++idSeq).toString(36)}`;
414
+ }
415
+ });
19
416
  __def("packages/modules/shared/adapter.js",function(__exports,__req){
20
417
  'use strict';
21
418
  Object.defineProperty(__exports,"EVENT_NAMES",{enumerable:true,get:function(){return EVENT_NAMES;}});
@@ -170,16 +567,203 @@ grid.destroy();
170
567
  };
171
568
  }
172
569
  });
570
+ __def("packages/modules/react/viewers.js",function(__exports,__req){
571
+ 'use strict';
572
+ Object.defineProperty(__exports,"VIEWER_EVENTS",{enumerable:true,get:function(){return VIEWER_EVENTS;}});
573
+ Object.defineProperty(__exports,"VIEWER_APPLY",{enumerable:true,get:function(){return VIEWER_APPLY;}});
574
+ Object.defineProperty(__exports,"VIEWER_BULK_UPDATE",{enumerable:true,get:function(){return VIEWER_BULK_UPDATE;}});
575
+ Object.defineProperty(__exports,"viewerHandlerName",{enumerable:true,get:function(){return viewerHandlerName;}});
576
+ Object.defineProperty(__exports,"partitionViewerProps",{enumerable:true,get:function(){return partitionViewerProps;}});
577
+ Object.defineProperty(__exports,"createViewerController",{enumerable:true,get:function(){return createViewerController;}});
578
+ const __m0=__req("packages/core/src/internal/util.js");
579
+ const warnOnce=__m0["warnOnce"];
580
+ const VIEWER_EVENTS=Object.freeze({
581
+ kpi:Object.freeze([
582
+ 'tile:click','tile:dblclick','tile:contextmenu','node:toggle','change',
583
+ ]),
584
+ kanban:Object.freeze([
585
+ 'card:click','card:dblclick','card:contextmenu',
586
+ 'card:move','card:reverted','card:confirmed','selection:changed','column:collapse','card:add',
587
+ 'drag:start','drag:end','swimlane:collapse','swimlane:reorder','column:reorder',
588
+ 'filter:changed','sprint:changed','epic:changed','card:expand','card:drill','card:edit',
589
+ 'card:sla',
590
+ 'beforeMove','beforeAdd','beforeEdit',
591
+ 'beforeLaneReorder','beforeColumnReorder','beforeColumnChange',
592
+ 'move:cancelled','add:cancelled','edit:cancelled',
593
+ 'laneReorder:cancelled','columnReorder:cancelled','columnChange:cancelled',
594
+ ]),
595
+ tabs:Object.freeze(['beforeTabChange','tab:changed','tabChange:cancelled']),
596
+ chart:Object.freeze(['click','hover','leave','draw','legend']),
597
+ gantt:Object.freeze(['schedule','error']),
598
+ layout:Object.freeze([
599
+ 'layout:changed','window:moved','window:resized','window:closed',
600
+ 'beforeWindowClose','windowClose:cancelled',
601
+ ]),
602
+ router:Object.freeze(['metrics']),
603
+ });
604
+ const VIEWER_APPLY=Object.freeze({
605
+ kpi:Object.freeze({
606
+ rows:(kpi,value)=>kpi.setRows(Array.isArray(value)?value:[]),
607
+ }),
608
+ kanban:Object.freeze({
609
+ rows:(board,value)=>board.setRows(Array.isArray(value)?value:[]),
610
+ quickFilter:(board,value)=>board.setQuickFilter(typeof value==='string'?value:''),
611
+ sprint:(board,value)=>board.setSprint(value),
612
+ epic:(board,value)=>board.setEpic(value),
613
+ loading:(board,value)=>board.setLoading(!!value),
614
+ error:(board,value)=>board.setError(value??null),
615
+ }),
616
+ gantt:Object.freeze({
617
+ tasks:(gantt,value)=>gantt.setTasks(Array.isArray(value)?value:[]),
618
+ dependencies:(gantt,value)=>gantt.setDependencies(Array.isArray(value)?value:[]),
619
+ }),
620
+ tabs:Object.freeze({
621
+ active:(tabs,value)=>{if(typeof value==='string')tabs.activate(value);},
622
+ }),
623
+ chart:Object.freeze({}),
624
+ layout:Object.freeze({}),
625
+ });
626
+ const VIEWER_BULK_UPDATE=Object.freeze({chart:'update'});
627
+ function viewerHandlerName(event){
628
+ const parts=String(event).split(':');
629
+ return`on${parts.map((p)=>p.charAt(0).toUpperCase()+p.slice(1)).join('')}`;
630
+ }
631
+ const BY_HANDLER=Object.freeze(Object.fromEntries(
632
+ Object.entries(VIEWER_EVENTS).map(([viewer,events])=>[
633
+ viewer,
634
+ Object.freeze(Object.fromEntries(events.map((e)=>[viewerHandlerName(e),e]))),
635
+ ]),
636
+ ));
637
+ function partitionViewerProps(viewer,props){
638
+ const byHandler=BY_HANDLER[viewer]||{};
639
+ const applies=VIEWER_APPLY[viewer]||{};
640
+ const config={};
641
+ const live={};
642
+ const handlers={};
643
+ for(const[key,value]of Object.entries(props||{})){
644
+ if(Object.hasOwn(byHandler,key)){handlers[key]=value;continue;}
645
+ if(Object.hasOwn(applies,key)){live[key]=value;config[key]=value;continue;}
646
+ config[key]=value;
647
+ }
648
+ return{config,live,handlers};
649
+ }
650
+ function createViewerController(opts){
651
+ const viewer=String(opts.viewer);
652
+ const mount=opts.mount;
653
+ const label=opts.name||viewer;
654
+ if(typeof mount!=='function'){
655
+ throw new TypeError(
656
+ `createViewerController needs a mount factory for "${viewer}"; pass the module's own `
657
+ +'factory in, e.g. { createKPI } from lattice-grid/modules/kpi.');
658
+ }
659
+ const initial=partitionViewerProps(viewer,opts.props||{});
660
+ const instance=mount(opts.element,{...initial.config});
661
+ if(!instance||typeof instance!=='object'){
662
+ throw new TypeError(`the ${label} factory returned no instance; nothing can be driven.`);
663
+ }
664
+ let handlers=initial.handlers;
665
+ let config=initial.config;
666
+ const live={...initial.live};
667
+ const off=[];
668
+ if(typeof instance.on==='function'){
669
+ for(const event of VIEWER_EVENTS[viewer]||[]){
670
+ const prop=viewerHandlerName(event);
671
+ const stop=instance.on(event,(payload)=>{
672
+ const fn=handlers[prop];
673
+ if(typeof fn==='function')fn(payload);
674
+ });
675
+ if(typeof stop==='function')off.push(stop);
676
+ }
677
+ }
678
+ const bulk=VIEWER_BULK_UPDATE[viewer];
679
+ const applies=VIEWER_APPLY[viewer]||{};
680
+ let destroyed=false;
681
+ return{
682
+ instance,
683
+ update(next){
684
+ if(destroyed)return;
685
+ const parts=partitionViewerProps(viewer,next||{});
686
+ handlers=parts.handlers;
687
+ const changed={};
688
+ for(const[key,value]of Object.entries(parts.config)){
689
+ if(!Object.is(config[key],value))changed[key]=value;
690
+ }
691
+ config=parts.config;
692
+ if(!Object.keys(changed).length)return;
693
+ const unapplied=[];
694
+ for(const key of Object.keys(changed)){
695
+ const apply=applies[key];
696
+ if(apply){
697
+ apply(instance,changed[key]);
698
+ live[key]=changed[key];
699
+ continue;
700
+ }
701
+ if(bulk&&typeof instance[bulk]==='function')continue;
702
+ unapplied.push(key);
703
+ }
704
+ if(bulk&&typeof instance[bulk]==='function'){
705
+ const spec={};
706
+ for(const key of Object.keys(changed))if(!applies[key])spec[key]=changed[key];
707
+ if(Object.keys(spec).length)instance[bulk](spec);
708
+ }
709
+ if(unapplied.length){
710
+ warnOnce(`react.viewer.${viewer}.mountOnly.${unapplied.join('.')}`,
711
+ `${label}: ${unapplied.map((k)=>`\`${k}\``).join(', ')} changed, but `
712
+ +`${label} takes ${unapplied.length===1?'it':'them'} only when the viewer is `
713
+ +'created. Nothing was applied and the viewer was NOT rebuilt — rebuilding it silently '
714
+ +'would throw away scroll position, selection and expansion. Give the component a '
715
+ +'`key` that changes when this must take effect, so the rebuild is yours and visible, '
716
+ +'or drive the instance through the ref.');
717
+ }
718
+ },
719
+ destroy(){
720
+ if(destroyed)return;
721
+ destroyed=true;
722
+ for(const stop of off){
723
+ try{stop();}catch{}
724
+ }
725
+ off.length=0;
726
+ if(typeof instance.destroy==='function')instance.destroy();
727
+ },
728
+ };
729
+ }
730
+ });
173
731
  __def("packages/modules/svelte/index.js",function(__exports,__req){
174
732
  'use strict';
175
733
  Object.defineProperty(__exports,"EVENT_NAMES",{enumerable:true,get:function(){return EVENT_NAMES;}});
176
734
  Object.defineProperty(__exports,"dashedName",{enumerable:true,get:function(){return dashedName;}});
735
+ Object.defineProperty(__exports,"VIEWER_EVENTS",{enumerable:true,get:function(){return VIEWER_EVENTS;}});
736
+ Object.defineProperty(__exports,"VIEWER_APPLY",{enumerable:true,get:function(){return VIEWER_APPLY;}});
737
+ Object.defineProperty(__exports,"viewerHandlerName",{enumerable:true,get:function(){return viewerHandlerName;}});
738
+ Object.defineProperty(__exports,"createViewerController",{enumerable:true,get:function(){return createViewerController;}});
177
739
  Object.defineProperty(__exports,"createLatticeAction",{enumerable:true,get:function(){return createLatticeAction;}});
178
740
  Object.defineProperty(__exports,"default",{enumerable:true,get:function(){return __default;}});
179
- const __m0=__req("packages/modules/shared/adapter.js");
180
- const createGridController=__m0["createGridController"];
181
- const EVENT_NAMES=__m0["EVENT_NAMES"];
182
- const dashedName=__m0["dashedName"];
741
+ Object.defineProperty(__exports,"GRID_REGISTRY_KEY",{enumerable:true,get:function(){return GRID_REGISTRY_KEY;}});
742
+ Object.defineProperty(__exports,"ROUTER_KEY",{enumerable:true,get:function(){return ROUTER_KEY;}});
743
+ Object.defineProperty(__exports,"DEFAULT_GRID_NAME",{enumerable:true,get:function(){return DEFAULT_GRID_NAME;}});
744
+ Object.defineProperty(__exports,"pickCallback",{enumerable:true,get:function(){return pickCallback;}});
745
+ Object.defineProperty(__exports,"adaptProps",{enumerable:true,get:function(){return adaptProps;}});
746
+ Object.defineProperty(__exports,"createGridRegistry",{enumerable:true,get:function(){return createGridRegistry;}});
747
+ Object.defineProperty(__exports,"bindGrid",{enumerable:true,get:function(){return bindGrid;}});
748
+ Object.defineProperty(__exports,"VIEWER_BINDING",{enumerable:true,get:function(){return VIEWER_BINDING;}});
749
+ Object.defineProperty(__exports,"viewerMount",{enumerable:true,get:function(){return viewerMount;}});
750
+ Object.defineProperty(__exports,"bindViewer",{enumerable:true,get:function(){return bindViewer;}});
751
+ Object.defineProperty(__exports,"snippetTabIds",{enumerable:true,get:function(){return snippetTabIds;}});
752
+ Object.defineProperty(__exports,"bindTabs",{enumerable:true,get:function(){return bindTabs;}});
753
+ Object.defineProperty(__exports,"createRouterHandle",{enumerable:true,get:function(){return createRouterHandle;}});
754
+ const __m0=__req("packages/core/src/internal/util.js");
755
+ const warnOnce=__m0["warnOnce"];
756
+ const __m1=__req("packages/modules/shared/adapter.js");
757
+ const createGridController=__m1["createGridController"];
758
+ const EVENT_NAMES=__m1["EVENT_NAMES"];
759
+ const dashedName=__m1["dashedName"];
760
+ const handlerName=__m1["handlerName"];
761
+ const aliasConfigKey=__m1["aliasConfigKey"];
762
+ const __m2=__req("packages/modules/react/viewers.js");
763
+ const VIEWER_EVENTS=__m2["VIEWER_EVENTS"];
764
+ const VIEWER_APPLY=__m2["VIEWER_APPLY"];
765
+ const viewerHandlerName=__m2["viewerHandlerName"];
766
+ const createViewerController=__m2["createViewerController"];
183
767
  const RESERVED=Object.freeze(['onGrid']);
184
768
  function createLatticeAction(deps){
185
769
  const createGrid=deps&&deps.createGrid;
@@ -226,10 +810,380 @@ destroy(){controller.destroy();},
226
810
  };
227
811
  }
228
812
  const __default=createLatticeAction;
813
+ const GRID_REGISTRY_KEY=Symbol.for('lattice.svelte.gridRegistry');
814
+ const ROUTER_KEY=Symbol.for('lattice.svelte.router');
815
+ const DEFAULT_GRID_NAME='default';
816
+ const HOST_PROPS=new Set(['class','style','id','children']);
817
+ const OWN_PROPS=Object.freeze({
818
+ grid:new Set(['name','route','routeOptions','predicates','rowUpdates']),
819
+ viewer:new Set(['grid','gridName']),
820
+ tabs:new Set(['contentIds']),
821
+ });
822
+ const OWN_CALLBACKS=Object.freeze({
823
+ grid:Object.freeze(['onGridReady','onGridDestroyed']),
824
+ viewer:Object.freeze(['onReady','onDestroyed']),
825
+ });
826
+ function pickCallback(props,camel){
827
+ const bag=props||{};
828
+ const fn=Object.hasOwn(bag,camel)?bag[camel]:bag[camel.toLowerCase()];
829
+ return typeof fn==='function'?fn:null;
830
+ }
831
+ const HANDLERS=(()=>{
832
+ const out={};
833
+ const add=(kind,events,name)=>{
834
+ const canonical=new Set(events.map(name));
835
+ for(const own of OWN_CALLBACKS[kind==='grid'?'grid':'viewer'])canonical.add(own);
836
+ const lower=new Map([...canonical].map((c)=>[c.toLowerCase(),c]));
837
+ out[kind]={events,canonical,lower};
838
+ };
839
+ add('grid',EVENT_NAMES,handlerName);
840
+ for(const viewer of Object.keys(VIEWER_EVENTS)){
841
+ add(viewer,VIEWER_EVENTS[viewer],viewerHandlerName);
842
+ }
843
+ return out;
844
+ })();
845
+ function adaptProps(kind,props){
846
+ const table=HANDLERS[kind];
847
+ if(!table){
848
+ throw new TypeError(
849
+ `adaptProps: "${kind}" is not a component kind this adapter knows; expected grid or one of `
850
+ +`${Object.keys(VIEWER_EVENTS).join(', ')}.`);
851
+ }
852
+ const mine=OWN_PROPS[kind]||OWN_PROPS.viewer;
853
+ const config={};
854
+ const own={};
855
+ for(const[key,value]of Object.entries(props||{})){
856
+ if(HOST_PROPS.has(key))continue;
857
+ if(mine.has(key)){own[key]=value;continue;}
858
+ if(table.canonical.has(key)){config[key]=value;continue;}
859
+ const canonical=table.lower.get(key);
860
+ if(canonical){config[canonical]=value;continue;}
861
+ config[aliasConfigKey(key)]=value;
862
+ }
863
+ for(const name of OWN_CALLBACKS[kind==='grid'?'grid':'viewer']){
864
+ if(Object.hasOwn(config,name)){own[name]=config[name];delete config[name];}
865
+ }
866
+ return{config,own};
867
+ }
868
+ function createGridRegistry(){
869
+ const grids=new Map();
870
+ const listeners=new Set();
871
+ const notify=()=>{for(const fn of[...listeners])fn();};
872
+ return{
873
+ publish(name,grid){
874
+ const key=name||DEFAULT_GRID_NAME;
875
+ if(grid)grids.set(key,grid);
876
+ else grids.delete(key);
877
+ notify();
878
+ },
879
+ get(name){return grids.get(name||DEFAULT_GRID_NAME)||null;},
880
+ names(){return[...grids.keys()];},
881
+ subscribe(fn){
882
+ listeners.add(fn);
883
+ return()=>{listeners.delete(fn);};
884
+ },
885
+ };
886
+ }
887
+ function applyPredicates(grid,next,previous){
888
+ const now=next&&typeof next==='object'?next:{};
889
+ const before=previous&&typeof previous==='object'?previous:{};
890
+ for(const[name,fn]of Object.entries(now)){
891
+ if(Object.is(before[name],fn))continue;
892
+ grid.filters.where(name,typeof fn==='function'?fn:null);
893
+ }
894
+ for(const name of Object.keys(before)){
895
+ if(!Object.hasOwn(now,name))grid.filters.where(name,null);
896
+ }
897
+ }
898
+ function bindGrid(opts){
899
+ const createGrid=opts&&opts.createGrid;
900
+ if(typeof createGrid!=='function'){
901
+ throw new TypeError('bindGrid needs createGrid: bindGrid({ createGrid, element, props }).');
902
+ }
903
+ const registry=(opts&&opts.registry)||null;
904
+ const router=(opts&&opts.router)||null;
905
+ const first=adaptProps('grid',opts.props||{});
906
+ const controller=createGridController({
907
+ createGrid,element:opts.element,props:first.config,
908
+ });
909
+ const{grid}=controller;
910
+ let predicates;
911
+ if(first.own.predicates){
912
+ applyPredicates(grid,(first.own.predicates),{});
913
+ predicates=first.own.predicates;
914
+ }
915
+ const publishedAs=typeof first.own.name==='string'&&first.own.name
916
+ ?first.own.name:DEFAULT_GRID_NAME;
917
+ if(registry)registry.publish(publishedAs,grid);
918
+ if(router&&first.own.route!==undefined){
919
+ router.attach(grid,first.own.route,first.own.routeOptions||{});
920
+ }
921
+ let rowUpdates=first.own.rowUpdates;
922
+ const ready=pickCallback(first.own,'onGridReady');
923
+ if(ready)ready(grid);
924
+ let destroyed=false;
925
+ return{
926
+ grid,
927
+ update(next){
928
+ if(destroyed)return;
929
+ const parts=adaptProps('grid',next||{});
930
+ controller.update(parts.config);
931
+ if(!Object.is(parts.own.predicates,predicates)){
932
+ applyPredicates(grid,(parts.own.predicates),
933
+ (predicates));
934
+ predicates=parts.own.predicates;
935
+ }
936
+ if(parts.own.rowUpdates&&!Object.is(parts.own.rowUpdates,rowUpdates)){
937
+ grid.rows.apply((parts.own.rowUpdates));
938
+ }
939
+ rowUpdates=parts.own.rowUpdates;
940
+ const name=typeof parts.own.name==='string'&&parts.own.name
941
+ ?parts.own.name:DEFAULT_GRID_NAME;
942
+ if(name!==publishedAs){
943
+ warnOnce('svelte.grid.mountOnly.name',
944
+ `LatticeGrid: \`name\` changed from "${publishedAs}" to "${name}", but a grid publishes `
945
+ +'itself under the name it had when it mounted. Nothing was republished and the grid '
946
+ +'was NOT rebuilt — rebuilding it would throw away scroll position, selection and '
947
+ +'expansion. Give the component a `key`-style `{#if}` when a genuine rebuild is wanted.');
948
+ }
949
+ },
950
+ destroy(props){
951
+ if(destroyed)return;
952
+ destroyed=true;
953
+ const gone=pickCallback(adaptProps('grid',props||{}).own,'onGridDestroyed');
954
+ if(gone)gone();
955
+ if(router){
956
+ try{router.detach(grid);}catch{}
957
+ }
958
+ if(registry)registry.publish(publishedAs,null);
959
+ controller.destroy();
960
+ },
961
+ };
962
+ }
963
+ const VIEWER_BINDING=Object.freeze({
964
+ kpi:Object.freeze({label:'LatticeKPI',requires:Object.freeze([]),fromContext:'grid'}),
965
+ chart:Object.freeze({label:'LatticeChart',requires:Object.freeze(['grid']),fromContext:'grid'}),
966
+ kanban:Object.freeze({label:'LatticeKanban',requires:Object.freeze([]),fromContext:'grid'}),
967
+ gantt:Object.freeze({label:'LatticeGantt',requires:Object.freeze([]),fromContext:null}),
968
+ layout:Object.freeze({label:'LatticeLayout',requires:Object.freeze([]),fromContext:null}),
969
+ });
970
+ function viewerMount(viewer,factory){
971
+ if(viewer==='chart')return(el,config)=>factory({...config,container:el});
972
+ if(viewer==='gantt')return(el,config)=>factory({...config,element:el});
973
+ return(el,config)=>factory(el,config);
974
+ }
975
+ function bindViewer(opts){
976
+ const viewer=String((opts&&opts.viewer)||'');
977
+ const factory=opts&&opts.factory;
978
+ if(!Object.hasOwn(VIEWER_BINDING,viewer)){
979
+ throw new TypeError(
980
+ `bindViewer: "${viewer}" is not a viewer this adapter knows; expected one of `
981
+ +`${Object.keys(VIEWER_BINDING).join(', ')}.`);
982
+ }
983
+ const{label,requires,fromContext}=VIEWER_BINDING[viewer];
984
+ if(typeof factory!=='function'){
985
+ throw new TypeError(`${label} needs the module's factory: bindViewer({ viewer, factory, element }).`);
986
+ }
987
+ const mount=viewerMount(viewer,factory);
988
+ const registry=opts.registry||null;
989
+ let controller=null;
990
+ let builtAgainst=null;
991
+ let lastOwn={};
992
+ let destroyed=false;
993
+ const boundGrid=(own)=>{
994
+ if(!fromContext)return null;
995
+ if(own.grid!==undefined)return(own.grid)||null;
996
+ if(!registry)return null;
997
+ const key=typeof own.gridName==='string'&&own.gridName?own.gridName:DEFAULT_GRID_NAME;
998
+ return registry.get(key);
999
+ };
1000
+ const tearDown=()=>{
1001
+ const live=controller;
1002
+ controller=null;
1003
+ builtAgainst=null;
1004
+ if(!live)return;
1005
+ const gone=pickCallback(lastOwn,'onDestroyed');
1006
+ if(gone)gone();
1007
+ live.destroy();
1008
+ };
1009
+ return{
1010
+ get instance(){return controller?controller.instance:null;},
1011
+ sync(props){
1012
+ if(destroyed)return;
1013
+ const parts=adaptProps(viewer,props||{});
1014
+ lastOwn=parts.own;
1015
+ const bound=boundGrid(parts.own);
1016
+ if(fromContext&&bound)parts.config[fromContext]=bound;
1017
+ if(controller&&!Object.is(builtAgainst,bound))tearDown();
1018
+ if(!controller){
1019
+ for(const key of requires){
1020
+ if(parts.config[key]===undefined||parts.config[key]===null)return;
1021
+ }
1022
+ controller=createViewerController({
1023
+ viewer,mount,element:opts.element,props:parts.config,name:label,
1024
+ });
1025
+ builtAgainst=bound;
1026
+ const ready=pickCallback(parts.own,'onReady');
1027
+ if(ready)ready(controller.instance);
1028
+ return;
1029
+ }
1030
+ controller.update(parts.config);
1031
+ },
1032
+ destroy(){
1033
+ if(destroyed)return;
1034
+ destroyed=true;
1035
+ tearDown();
1036
+ },
1037
+ };
1038
+ }
1039
+ function snippetTabIds(tabs,props){
1040
+ const declared=Array.isArray(tabs)?tabs:[];
1041
+ const bag=props||{};
1042
+ return declared
1043
+ .map((tab)=>(tab&&(tab).id))
1044
+ .filter((id)=>typeof id==='string'&&typeof bag[id]==='function');
1045
+ }
1046
+ function bindTabs(opts){
1047
+ const createTabs=opts&&opts.createTabs;
1048
+ if(typeof createTabs!=='function'){
1049
+ throw new TypeError('bindTabs needs createTabs: bindTabs({ createTabs, element }).');
1050
+ }
1051
+ const onPanels=typeof opts.onPanels==='function'?opts.onPanels:()=>{};
1052
+ const panels=new Map();
1053
+ let controller=null;
1054
+ let mountedTabs=null;
1055
+ let destroyed=false;
1056
+ const announce=()=>onPanels([...panels.keys()]);
1057
+ const describe=(config,contentIds)=>{
1058
+ const declared=Array.isArray(config.tabs)?config.tabs:[];
1059
+ const owned=new Set(contentIds);
1060
+ return declared.map((tab)=>{
1061
+ const spec=(tab);
1062
+ if(!owned.has(spec.id))return spec;
1063
+ return{
1064
+ ...spec,
1065
+ view:(bodyEl)=>{
1066
+ panels.set(spec.id,bodyEl);
1067
+ announce();
1068
+ return{
1069
+ destroy(){
1070
+ panels.delete(spec.id);
1071
+ announce();
1072
+ },
1073
+ };
1074
+ },
1075
+ };
1076
+ });
1077
+ };
1078
+ return{
1079
+ get instance(){return controller?controller.instance:null;},
1080
+ sync(props){
1081
+ if(destroyed)return;
1082
+ const parts=adaptProps('tabs',props||{});
1083
+ const contentIds=Array.isArray(parts.own.contentIds)
1084
+ ?(parts.own.contentIds):[];
1085
+ if(!controller){
1086
+ const config={...parts.config,tabs:describe(parts.config,contentIds)};
1087
+ config.createGrid=opts.createGrid||(()=>{
1088
+ throw new Error(
1089
+ '[lattice] LatticeTabs: a tab has neither a {#snippet} nor a grid factory to build it '
1090
+ +'with. Give the tab a snippet named after its id, or import the Tabs component from '
1091
+ +'a build that carries createGrid.');
1092
+ });
1093
+ controller=createViewerController({
1094
+ viewer:'tabs',mount:createTabs,element:opts.element,props:config,name:'LatticeTabs',
1095
+ });
1096
+ mountedTabs=parts.config.tabs;
1097
+ const ready=pickCallback(parts.own,'onReady');
1098
+ if(ready)ready(controller.instance);
1099
+ return;
1100
+ }
1101
+ if(!Object.is(mountedTabs,parts.config.tabs)){
1102
+ mountedTabs=parts.config.tabs;
1103
+ warnOnce('svelte.tabs.mountOnly.tabs',
1104
+ 'LatticeTabs: `tabs` changed (a label, a badge or a descriptor), but the strip takes it '
1105
+ +'only when created — the module has no way to repaint an existing tab. Nothing was '
1106
+ +'applied and the strip was NOT rebuilt, which would have lost whichever tab is open '
1107
+ +'and any state its content holds. Wrap the strip in an `{#if}` you toggle when a '
1108
+ +'genuine rebuild is wanted; a live badge otherwise belongs in your own markup.');
1109
+ }
1110
+ const{tabs:_mountOnly,...live}=parts.config;
1111
+ controller.update(live);
1112
+ },
1113
+ place(id,holder){
1114
+ const panel=panels.get(id);
1115
+ const node=(holder);
1116
+ if(!node||!panel||node.parentNode===panel)return;
1117
+ panel.appendChild(node);
1118
+ },
1119
+ destroy(props){
1120
+ if(destroyed)return;
1121
+ destroyed=true;
1122
+ const live=controller;
1123
+ controller=null;
1124
+ panels.clear();
1125
+ if(!live)return;
1126
+ const gone=pickCallback(adaptProps('tabs',props||{}).own,'onDestroyed');
1127
+ if(gone)gone();
1128
+ live.destroy();
1129
+ },
1130
+ };
1131
+ }
1132
+ function createRouterHandle(opts){
1133
+ const createDataRouter=opts&&opts.createDataRouter;
1134
+ if(typeof createDataRouter!=='function'){
1135
+ throw new TypeError(
1136
+ 'createRouterHandle needs createDataRouter: createRouterHandle({ createDataRouter }).');
1137
+ }
1138
+ const declared=opts&&opts.config;
1139
+ let instance=null;
1140
+ let torn=false;
1141
+ const handle={
1142
+ get router(){
1143
+ if(!instance&&!torn){
1144
+ instance=createDataRouter(
1145
+ (typeof declared==='function'?declared():declared)||{});
1146
+ }
1147
+ return instance;
1148
+ },
1149
+ attach(grid,route,routeOptions){
1150
+ if(torn)return;
1151
+ (handle.router).attach(grid,route,routeOptions||{});
1152
+ },
1153
+ detach(grid){
1154
+ if(torn||!instance)return;
1155
+ (instance).detach(grid);
1156
+ },
1157
+ destroy(){
1158
+ torn=true;
1159
+ const live=instance;
1160
+ instance=null;
1161
+ if(live)(live).destroy();
1162
+ },
1163
+ };
1164
+ return handle;
1165
+ }
229
1166
  });
230
1167
  const __entry=__req("packages/modules/svelte/index.js");
231
1168
  export const
232
1169
  EVENT_NAMES=__entry.EVENT_NAMES,
233
1170
  dashedName=__entry.dashedName,
234
- createLatticeAction=__entry.createLatticeAction;
1171
+ VIEWER_EVENTS=__entry.VIEWER_EVENTS,
1172
+ VIEWER_APPLY=__entry.VIEWER_APPLY,
1173
+ viewerHandlerName=__entry.viewerHandlerName,
1174
+ createViewerController=__entry.createViewerController,
1175
+ createLatticeAction=__entry.createLatticeAction,
1176
+ GRID_REGISTRY_KEY=__entry.GRID_REGISTRY_KEY,
1177
+ ROUTER_KEY=__entry.ROUTER_KEY,
1178
+ DEFAULT_GRID_NAME=__entry.DEFAULT_GRID_NAME,
1179
+ pickCallback=__entry.pickCallback,
1180
+ adaptProps=__entry.adaptProps,
1181
+ createGridRegistry=__entry.createGridRegistry,
1182
+ bindGrid=__entry.bindGrid,
1183
+ VIEWER_BINDING=__entry.VIEWER_BINDING,
1184
+ viewerMount=__entry.viewerMount,
1185
+ bindViewer=__entry.bindViewer,
1186
+ snippetTabIds=__entry.snippetTabIds,
1187
+ bindTabs=__entry.bindTabs,
1188
+ createRouterHandle=__entry.createRouterHandle;
235
1189
  export default __entry.default;