@toclocoinc/lattice-grid 1.9.1 → 1.10.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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.9.1 — core + DOM renderer
2
+ * Lattice Grid 1.10.0 — core + DOM renderer
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -15049,6 +15049,354 @@ if(isFunction(emit))emit(type,payload);
15049
15049
  }
15050
15050
  }
15051
15051
  });
15052
+ __def("packages/core/src/source/derive.js",function(__exports,__req){
15053
+ 'use strict';
15054
+ Object.defineProperty(__exports,"FOLLOW_MODES",{enumerable:true,get:function(){return FOLLOW_MODES;}});
15055
+ Object.defineProperty(__exports,"BUCKETS",{enumerable:true,get:function(){return BUCKETS;}});
15056
+ Object.defineProperty(__exports,"DERIVED_ROW_KEY",{enumerable:true,get:function(){return DERIVED_ROW_KEY;}});
15057
+ Object.defineProperty(__exports,"readPath",{enumerable:true,get:function(){return readPath;}});
15058
+ Object.defineProperty(__exports,"unnest",{enumerable:true,get:function(){return unnest;}});
15059
+ Object.defineProperty(__exports,"bucketOf",{enumerable:true,get:function(){return bucketOf;}});
15060
+ Object.defineProperty(__exports,"reduceValues",{enumerable:true,get:function(){return reduceValues;}});
15061
+ Object.defineProperty(__exports,"applyLimit",{enumerable:true,get:function(){return applyLimit;}});
15062
+ Object.defineProperty(__exports,"applyCumulative",{enumerable:true,get:function(){return applyCumulative;}});
15063
+ Object.defineProperty(__exports,"derive",{enumerable:true,get:function(){return derive;}});
15064
+ const __m0=__req("packages/core/src/internal/util.js");
15065
+ const isFunction=__m0["isFunction"];
15066
+ const isObject=__m0["isObject"];
15067
+ const __m1=__req("packages/core/src/compute/total.js");
15068
+ const TOTAL_FNS=__m1["TOTAL_FNS"];
15069
+ const FOLLOW_MODES=Object.freeze(['filtered','all','selected','grouped']);
15070
+ const BUCKETS=Object.freeze(['day','week','month','quarter','year']);
15071
+ const DERIVED_ROW_KEY='__key';
15072
+ function readPath(obj,path){
15073
+ if(!isObject(obj)||typeof path!=='string')return undefined;
15074
+ if(!path.includes('.'))return(obj)[path];
15075
+ let cursor=(obj);
15076
+ for(const part of path.split('.')){
15077
+ if(!isObject(cursor))return undefined;
15078
+ cursor=(cursor)[part];
15079
+ }
15080
+ return cursor;
15081
+ }
15082
+ function unnest(rows,path){
15083
+ const out=[];
15084
+ for(const row of rows){
15085
+ const list=readPath(row,path);
15086
+ if(!Array.isArray(list)||!list.length)continue;
15087
+ for(const item of list)out.push({...((row)),[path]:item});
15088
+ }
15089
+ return out;
15090
+ }
15091
+ function bucketOf(value,by){
15092
+ const at=value instanceof Date?value:new Date((value));
15093
+ const time=at.getTime();
15094
+ if(!Number.isFinite(time))return null;
15095
+ const y=at.getUTCFullYear();
15096
+ const m=at.getUTCMonth();
15097
+ const d=at.getUTCDate();
15098
+ const iso=(date)=>date.toISOString().slice(0,10);
15099
+ switch(by){
15100
+ case'year':return iso(new Date(Date.UTC(y,0,1)));
15101
+ case'quarter':return iso(new Date(Date.UTC(y,Math.floor(m/3)*3,1)));
15102
+ case'month':return iso(new Date(Date.UTC(y,m,1)));
15103
+ case'week':{
15104
+ const day=(at.getUTCDay()+6)%7;
15105
+ return iso(new Date(Date.UTC(y,m,d-day)));
15106
+ }
15107
+ default:return iso(new Date(Date.UTC(y,m,d)));
15108
+ }
15109
+ }
15110
+ function groupKeyOf(row,by,bucket){
15111
+ const values=by.map((path)=>(
15112
+ bucket&&bucket.of===path?bucketOf(readPath(row,path),bucket.by):readPath(row,path)
15113
+ ));
15114
+ return{key:values.map((v)=>(v===undefined||v===null?'\u0000':String(v))).join('\u001f'),values};
15115
+ }
15116
+ function reduceValues(values,fn){
15117
+ const kernel=TOTAL_FNS[fn];
15118
+ if(!kernel)return null;
15119
+ return kernel({get:(i)=>values[i]},ROW_INDICES(values.length));
15120
+ }
15121
+ function reduceGroup(rows,select){
15122
+ const out={};
15123
+ const indices=ROW_INDICES(rows.length);
15124
+ for(const[id,spec]of Object.entries(select)){
15125
+ const fn=spec.fn||'count';
15126
+ const kernel=TOTAL_FNS[fn];
15127
+ if(!kernel){out[id]=null;continue;}
15128
+ const values=spec.of?rows.map((row)=>readPath(row,spec.of)):[];
15129
+ out[id]=kernel({get:(i)=>values[i]},indices);
15130
+ }
15131
+ return out;
15132
+ }
15133
+ const ROW_INDICES=(()=>{
15134
+ const cache=new Map();
15135
+ return(n)=>{
15136
+ let hit=cache.get(n);
15137
+ if(!hit){
15138
+ hit=new Uint32Array(n);
15139
+ for(let i=0;i<n;i++)hit[i]=i;
15140
+ if(cache.size<512)cache.set(n,hit);
15141
+ }
15142
+ return hit;
15143
+ };
15144
+ })();
15145
+ function applyLimit(rows,limit,per){
15146
+ if(!Number.isFinite(limit)||limit<=0)return rows;
15147
+ if(!per)return rows.slice(0,limit);
15148
+ const seen=new Map();
15149
+ const out=[];
15150
+ for(const row of rows){
15151
+ const key=String(readPath(row,per));
15152
+ const taken=seen.get(key)||0;
15153
+ if(taken>=limit)continue;
15154
+ seen.set(key,taken+1);
15155
+ out.push(row);
15156
+ }
15157
+ return out;
15158
+ }
15159
+ function applyCumulative(rows,spec){
15160
+ const total=rows.reduce((sum,row)=>sum+(Number(readPath(row,spec.of))||0),0);
15161
+ if(!total)return rows;
15162
+ const cutoff=total*spec.upTo;
15163
+ let running=0;
15164
+ const out=[];
15165
+ for(const row of rows){
15166
+ out.push(row);
15167
+ running+=Number(readPath(row,spec.of))||0;
15168
+ if(running>=cutoff)break;
15169
+ }
15170
+ return out;
15171
+ }
15172
+ function sortRows(rows,spec){
15173
+ if(!Array.isArray(spec)||!spec.length)return rows;
15174
+ return[...rows].sort((a,b)=>{
15175
+ for(const entry of spec){
15176
+ const av=readPath(a,entry.col);
15177
+ const bv=readPath(b,entry.col);
15178
+ if(av===bv)continue;
15179
+ if(av===null||av===undefined)return 1;
15180
+ if(bv===null||bv===undefined)return-1;
15181
+ const less=typeof av==='number'&&typeof bv==='number'
15182
+ ?av<bv
15183
+ :String(av)<String(bv);
15184
+ return(less?-1:1)*(entry.dir==='desc'?-1:1);
15185
+ }
15186
+ return 0;
15187
+ });
15188
+ }
15189
+ function derive(rows,spec){
15190
+ let working=Array.isArray(rows)?rows:[];
15191
+ if(spec.unnest)working=unnest(working,spec.unnest);
15192
+ if(isFunction(spec.where))working=working.filter((row)=>!!spec.where(row));
15193
+ const by=spec.groupBy
15194
+ ?(Array.isArray(spec.groupBy)?spec.groupBy:[spec.groupBy])
15195
+ :null;
15196
+ const bucket=isObject(spec.bucket)?spec.bucket:null;
15197
+ let out;
15198
+ if(!by){
15199
+ out=working.map((row,i)=>({
15200
+ ...((row)),
15201
+ [DERIVED_ROW_KEY]:String(readPath(row,spec.rowKey||'id')??i),
15202
+ }));
15203
+ }else{
15204
+ const groups=new Map();
15205
+ for(const row of working){
15206
+ const{key,values}=groupKeyOf(row,by,bucket);
15207
+ let bucketed=groups.get(key);
15208
+ if(!bucketed){bucketed={values,rows:[]};groups.set(key,bucketed);}
15209
+ bucketed.rows.push(row);
15210
+ }
15211
+ out=[...groups.entries()].map(([key,group])=>{
15212
+ const row={[DERIVED_ROW_KEY]:key};
15213
+ by.forEach((path,i)=>{row[path.includes('.')?path.split('.').pop():path]=group.values[i];});
15214
+ Object.assign(row,reduceGroup(group.rows,spec.select||{}));
15215
+ return row;
15216
+ });
15217
+ }
15218
+ out=sortRows(out,spec.sort);
15219
+ if(isObject(spec.cumulative))out=applyCumulative(out,spec.cumulative);
15220
+ return applyLimit(out,spec.limit,spec.limitPer||null);
15221
+ }
15222
+ });
15223
+ __def("packages/core/src/source/derived.js",function(__exports,__req){
15224
+ 'use strict';
15225
+ Object.defineProperty(__exports,"IDLE_REFRESH_MS",{enumerable:true,get:function(){return IDLE_REFRESH_MS;}});
15226
+ Object.defineProperty(__exports,"PROFILE_FIELDS",{enumerable:true,get:function(){return PROFILE_FIELDS;}});
15227
+ Object.defineProperty(__exports,"DerivedSource",{enumerable:true,get:function(){return DerivedSource;}});
15228
+ Object.defineProperty(__exports,"createDerivedSource",{enumerable:true,get:function(){return createDerivedSource;}});
15229
+ const __m0=__req("packages/core/src/internal/util.js");
15230
+ const isFunction=__m0["isFunction"];
15231
+ const isObject=__m0["isObject"];
15232
+ const warnOnce=__m0["warnOnce"];
15233
+ const __m1=__req("packages/core/src/source/memory.js");
15234
+ const MemorySource=__m1["MemorySource"];
15235
+ const __m2=__req("packages/core/src/source/derive.js");
15236
+ const derive=__m2["derive"];
15237
+ const FOLLOW_MODES=__m2["FOLLOW_MODES"];
15238
+ const DERIVED_ROW_KEY=__m2["DERIVED_ROW_KEY"];
15239
+ const IDLE_REFRESH_MS=16;
15240
+ const PROFILE_FIELDS=Object.freeze([
15241
+ 'column','rows','present','missing','distinct',
15242
+ 'min','max','mean','median','q1','q3','iqr','stddev','outliers',
15243
+ ]);
15244
+ class DerivedSource extends MemorySource{
15245
+ #from=null;
15246
+ #spec={};
15247
+ #off=[];
15248
+ #pending=null;
15249
+ #gone=false;
15250
+ #ctx={};
15251
+ #deriving=false;
15252
+ constructor(config,ctx){
15253
+ super({mode:'memory',rows:[]},ctx);
15254
+ this.#ctx=ctx||{};
15255
+ this.#spec=isObject(config)?config:{};
15256
+ this.#from=(this.#spec.from)||null;
15257
+ if(!this.#from){
15258
+ warnOnce('source.derived.from','source.mode "derived" needs `from`: the grid to derive from.');
15259
+ return;
15260
+ }
15261
+ if(this.#spec.follow&&!FOLLOW_MODES.includes(String(this.#spec.follow))){
15262
+ warnOnce(
15263
+ `source.derived.follow.${this.#spec.follow}`,
15264
+ `unknown follow "${this.#spec.follow}"; using "filtered". Known: ${FOLLOW_MODES.join(', ')}.`,
15265
+ );
15266
+ }
15267
+ this.#watch();
15268
+ this.refresh();
15269
+ }
15270
+ #watch(){
15271
+ const grid=this.#from;
15272
+ if(!grid||!isFunction(grid.on))return;
15273
+ const follow=String(this.#spec.follow||'filtered');
15274
+ const events=['rows:changed'];
15275
+ if(follow==='filtered'||follow==='grouped')events.push('filter:changed');
15276
+ if(follow==='selected')events.push('selection:changed');
15277
+ if(follow==='grouped')events.push('column:grouped');
15278
+ for(const name of events){
15279
+ const handler=()=>this.schedule();
15280
+ grid.on(name,handler);
15281
+ this.#off.push(()=>isFunction(grid.off)&&grid.off(name,handler));
15282
+ }
15283
+ }
15284
+ schedule(){
15285
+ const mode=this.#spec.refresh===undefined?'idle':this.#spec.refresh;
15286
+ if(mode==='manual')return;
15287
+ if(mode==='live'){this.refresh();return;}
15288
+ const wait=typeof mode==='number'&&Number.isFinite(mode)?mode:IDLE_REFRESH_MS;
15289
+ if(this.#pending)return;
15290
+ this.#pending=setTimeout(()=>{this.#pending=null;this.refresh();},wait);
15291
+ }
15292
+ refresh(){
15293
+ if(this.#gone||!this.#from)return;
15294
+ if(this.#deriving){
15295
+ warnOnce(
15296
+ 'source.derived.cycle',
15297
+ 'a derived grid is deriving from itself, directly or through a chain. '
15298
+ +'The cycle was refused; check the `from` of each grid in the chain.',
15299
+ );
15300
+ return;
15301
+ }
15302
+ this.#deriving=true;
15303
+ try{
15304
+ const rows=this.#spec.profile
15305
+ ?this.#deriveProfile()
15306
+ :derive(this.#sourceRows(),this.#resolvedSpec());
15307
+ this.setRows(rows);
15308
+ this.invalidate('filter');
15309
+ if(isFunction(this.#ctx.emit)){
15310
+ (this.#ctx.emit)('rows:changed',{},'derived');
15311
+ }
15312
+ }finally{
15313
+ this.#deriving=false;
15314
+ }
15315
+ }
15316
+ #resolvedSpec(){
15317
+ if(String(this.#spec.follow||'filtered')!=='grouped')return this.#spec;
15318
+ const grid=this.#from;
15319
+ const state=grid&&grid.state&&isFunction(grid.state.get)?grid.state.get():null;
15320
+ const grouped=state&&Array.isArray(state.group)?state.group:[];
15321
+ if(!grouped.length)return this.#spec;
15322
+ return{...this.#spec,groupBy:[...grouped]};
15323
+ }
15324
+ #sourceRows(){
15325
+ const grid=this.#from;
15326
+ const follow=String(this.#spec.follow||'filtered');
15327
+ if(!grid||!grid.rows)return[];
15328
+ if(follow==='all'){
15329
+ const every=[];
15330
+ if(isFunction(grid.rows.forEachAll)){
15331
+ grid.rows.forEachAll((row)=>{if(!row.group)every.push(unwrap(row));});
15332
+ }
15333
+ return every;
15334
+ }
15335
+ if(follow==='selected'){
15336
+ const rows=grid.selection&&isFunction(grid.selection.rows)?grid.selection.rows():[];
15337
+ return rows.filter(Boolean).map(unwrap);
15338
+ }
15339
+ const out=[];
15340
+ if(isFunction(grid.rows.forEach)){
15341
+ grid.rows.forEach((row)=>{if(!row.group)out.push(unwrap(row));});
15342
+ }
15343
+ return out;
15344
+ }
15345
+ #deriveProfile(){
15346
+ const grid=this.#from;
15347
+ if(!grid||!grid.statistics||!isFunction(grid.statistics.profile))return[];
15348
+ const wanted=Array.isArray(this.#spec.profile)?this.#spec.profile:[this.#spec.profile];
15349
+ const rows=wanted.filter(Boolean).map((colId)=>{
15350
+ const stats=grid.statistics.profile(String(colId))||{};
15351
+ const row={[DERIVED_ROW_KEY]:String(colId)};
15352
+ for(const field of PROFILE_FIELDS){
15353
+ row[field]=field==='column'?String(colId):(stats[field]??null);
15354
+ }
15355
+ row.outliers=Array.isArray(stats.outliers)?stats.outliers.length:(stats.outliers??null);
15356
+ return row;
15357
+ });
15358
+ if(this.#spec.orient!=='metrics')return rows;
15359
+ const first=rows[0];
15360
+ if(!first)return[];
15361
+ return PROFILE_FIELDS.filter((f)=>f!=='column').map((field)=>({
15362
+ [DERIVED_ROW_KEY]:field,metric:field,value:first[field],
15363
+ }));
15364
+ }
15365
+ apply(change){
15366
+ const ops=['add','update','remove'];
15367
+ const rejected=[];
15368
+ for(const op of ops){
15369
+ for(const row of(change&&change[op])||[]){
15370
+ rejected.push({operation:op,id:row&&row.id,reason:'derived-read-only'});
15371
+ }
15372
+ }
15373
+ if(rejected.length){
15374
+ warnOnce(
15375
+ 'source.derived.readonly',
15376
+ 'a derived grid is read-only: its rows are computed from another grid. '
15377
+ +'Write to the source grid instead, and the derived one follows.',
15378
+ );
15379
+ }
15380
+ return{added:[],updated:[],removed:[],rejected};
15381
+ }
15382
+ destroy(){
15383
+ this.#gone=true;
15384
+ if(this.#pending){clearTimeout(this.#pending);this.#pending=null;}
15385
+ for(const off of this.#off){try{off();}catch{}}
15386
+ this.#off=[];
15387
+ this.#from=null;
15388
+ super.destroy();
15389
+ }
15390
+ }
15391
+ function unwrap(row){
15392
+ return isObject(row)&&'data'in(row)
15393
+ ?(row).data
15394
+ :row;
15395
+ }
15396
+ function createDerivedSource(config,ctx){
15397
+ return new DerivedSource(config,ctx);
15398
+ }
15399
+ });
15052
15400
  __def("packages/core/src/source/index.js",function(__exports,__req){
15053
15401
  'use strict';
15054
15402
  Object.defineProperty(__exports,"createMemorySource",{enumerable:true,get:function(){return createMemorySource;}});
@@ -15062,6 +15410,10 @@ Object.defineProperty(__exports,"PROTOCOL",{enumerable:true,get:function(){retur
15062
15410
  Object.defineProperty(__exports,"createStreamSource",{enumerable:true,get:function(){return createStreamSource;}});
15063
15411
  Object.defineProperty(__exports,"StreamSource",{enumerable:true,get:function(){return StreamSource;}});
15064
15412
  Object.defineProperty(__exports,"DEFAULT_PROMOTE_BELOW",{enumerable:true,get:function(){return DEFAULT_PROMOTE_BELOW;}});
15413
+ Object.defineProperty(__exports,"createDerivedSource",{enumerable:true,get:function(){return createDerivedSource;}});
15414
+ Object.defineProperty(__exports,"DerivedSource",{enumerable:true,get:function(){return DerivedSource;}});
15415
+ Object.defineProperty(__exports,"IDLE_REFRESH_MS",{enumerable:true,get:function(){return IDLE_REFRESH_MS;}});
15416
+ Object.defineProperty(__exports,"PROFILE_FIELDS",{enumerable:true,get:function(){return PROFILE_FIELDS;}});
15065
15417
  Object.defineProperty(__exports,"MODES",{enumerable:true,get:function(){return MODES;}});
15066
15418
  Object.defineProperty(__exports,"createSource",{enumerable:true,get:function(){return createSource;}});
15067
15419
  const __m0=__req("packages/core/src/internal/util.js");
@@ -15083,41 +15435,57 @@ const __m4=__req("packages/core/src/source/stream.js");
15083
15435
  const createStreamSource=__m4["createStreamSource"];
15084
15436
  const StreamSource=__m4["StreamSource"];
15085
15437
  const DEFAULT_PROMOTE_BELOW=__m4["DEFAULT_PROMOTE_BELOW"];
15086
- const __m5=__req("packages/core/src/source/abort.js");
15087
- Object.defineProperty(__exports,"AbortScope",{enumerable:true,get:function(){return __m5["AbortScope"];}});
15088
- Object.defineProperty(__exports,"RequestToken",{enumerable:true,get:function(){return __m5["RequestToken"];}});
15089
- Object.defineProperty(__exports,"SupersededError",{enumerable:true,get:function(){return __m5["SupersededError"];}});
15090
- Object.defineProperty(__exports,"createAbortScope",{enumerable:true,get:function(){return __m5["createAbortScope"];}});
15091
- Object.defineProperty(__exports,"isAbortError",{enumerable:true,get:function(){return __m5["isAbortError"];}});
15092
- const __m6=__req("packages/core/src/source/filterwire.js");
15093
- Object.defineProperty(__exports,"RELATIVE_TOKENS",{enumerable:true,get:function(){return __m6["RELATIVE_TOKENS"];}});
15094
- Object.defineProperty(__exports,"parseRelativeToken",{enumerable:true,get:function(){return __m6["parseRelativeToken"];}});
15095
- Object.defineProperty(__exports,"resolveRelativeRange",{enumerable:true,get:function(){return __m6["resolveRelativeRange"];}});
15096
- Object.defineProperty(__exports,"resolveRelativeCondition",{enumerable:true,get:function(){return __m6["resolveRelativeCondition"];}});
15097
- Object.defineProperty(__exports,"relativeTokenOf",{enumerable:true,get:function(){return __m6["relativeTokenOf"];}});
15098
- Object.defineProperty(__exports,"buildFilterSet",{enumerable:true,get:function(){return __m6["buildFilterSet"];}});
15099
- Object.defineProperty(__exports,"normaliseFilterSet",{enumerable:true,get:function(){return __m6["normaliseFilterSet"];}});
15100
- Object.defineProperty(__exports,"wireFilters",{enumerable:true,get:function(){return __m6["wireFilters"];}});
15101
- Object.defineProperty(__exports,"querySignature",{enumerable:true,get:function(){return __m6["querySignature"];}});
15102
- Object.defineProperty(__exports,"mapConditions",{enumerable:true,get:function(){return __m6["mapConditions"];}});
15103
- Object.defineProperty(__exports,"forEachCondition",{enumerable:true,get:function(){return __m6["forEachCondition"];}});
15104
- Object.defineProperty(__exports,"isGroup",{enumerable:true,get:function(){return __m6["isGroup"];}});
15105
- const __m7=__req("packages/core/src/source/blockcache.js");
15106
- Object.defineProperty(__exports,"BlockCache",{enumerable:true,get:function(){return __m7["BlockCache"];}});
15107
- Object.defineProperty(__exports,"DEFAULT_PAGE_SIZE",{enumerable:true,get:function(){return __m7["DEFAULT_PAGE_SIZE"];}});
15108
- Object.defineProperty(__exports,"DEFAULT_MAX_CACHED_PAGES",{enumerable:true,get:function(){return __m7["DEFAULT_MAX_CACHED_PAGES"];}});
15109
- const __m8=__req("packages/core/src/source/gapbuffer.js");
15110
- Object.defineProperty(__exports,"GapBuffer",{enumerable:true,get:function(){return __m8["GapBuffer"];}});
15111
- const __m9=__req("packages/core/src/source/rows.js");
15112
- Object.defineProperty(__exports,"RowFactory",{enumerable:true,get:function(){return __m9["RowFactory"];}});
15113
- Object.defineProperty(__exports,"createRowFactory",{enumerable:true,get:function(){return __m9["createRowFactory"];}});
15114
- Object.defineProperty(__exports,"groupKey",{enumerable:true,get:function(){return __m9["groupKey"];}});
15115
- Object.defineProperty(__exports,"lazyRowView",{enumerable:true,get:function(){return __m9["lazyRowView"];}});
15116
- Object.defineProperty(__exports,"DEFAULT_ROW_HEIGHT",{enumerable:true,get:function(){return __m9["DEFAULT_ROW_HEIGHT"];}});
15117
- const __m10=__req("packages/core/src/source/handles.js");
15118
- Object.defineProperty(__exports,"HandleProvider",{enumerable:true,get:function(){return __m10["HandleProvider"];}});
15119
- Object.defineProperty(__exports,"createHandleProvider",{enumerable:true,get:function(){return __m10["createHandleProvider"];}});
15120
- const MODES=Object.freeze(['memory','paged','remote','stream']);
15438
+ const __m5=__req("packages/core/src/source/derived.js");
15439
+ const createDerivedSource=__m5["createDerivedSource"];
15440
+ const DerivedSource=__m5["DerivedSource"];
15441
+ const IDLE_REFRESH_MS=__m5["IDLE_REFRESH_MS"];
15442
+ const PROFILE_FIELDS=__m5["PROFILE_FIELDS"];
15443
+ const __m6=__req("packages/core/src/source/derive.js");
15444
+ Object.defineProperty(__exports,"derive",{enumerable:true,get:function(){return __m6["derive"];}});
15445
+ Object.defineProperty(__exports,"unnest",{enumerable:true,get:function(){return __m6["unnest"];}});
15446
+ Object.defineProperty(__exports,"readPath",{enumerable:true,get:function(){return __m6["readPath"];}});
15447
+ Object.defineProperty(__exports,"bucketOf",{enumerable:true,get:function(){return __m6["bucketOf"];}});
15448
+ Object.defineProperty(__exports,"applyLimit",{enumerable:true,get:function(){return __m6["applyLimit"];}});
15449
+ Object.defineProperty(__exports,"applyCumulative",{enumerable:true,get:function(){return __m6["applyCumulative"];}});
15450
+ Object.defineProperty(__exports,"reduceValues",{enumerable:true,get:function(){return __m6["reduceValues"];}});
15451
+ Object.defineProperty(__exports,"FOLLOW_MODES",{enumerable:true,get:function(){return __m6["FOLLOW_MODES"];}});
15452
+ Object.defineProperty(__exports,"BUCKETS",{enumerable:true,get:function(){return __m6["BUCKETS"];}});
15453
+ Object.defineProperty(__exports,"DERIVED_ROW_KEY",{enumerable:true,get:function(){return __m6["DERIVED_ROW_KEY"];}});
15454
+ const __m7=__req("packages/core/src/source/abort.js");
15455
+ Object.defineProperty(__exports,"AbortScope",{enumerable:true,get:function(){return __m7["AbortScope"];}});
15456
+ Object.defineProperty(__exports,"RequestToken",{enumerable:true,get:function(){return __m7["RequestToken"];}});
15457
+ Object.defineProperty(__exports,"SupersededError",{enumerable:true,get:function(){return __m7["SupersededError"];}});
15458
+ Object.defineProperty(__exports,"createAbortScope",{enumerable:true,get:function(){return __m7["createAbortScope"];}});
15459
+ Object.defineProperty(__exports,"isAbortError",{enumerable:true,get:function(){return __m7["isAbortError"];}});
15460
+ const __m8=__req("packages/core/src/source/filterwire.js");
15461
+ Object.defineProperty(__exports,"RELATIVE_TOKENS",{enumerable:true,get:function(){return __m8["RELATIVE_TOKENS"];}});
15462
+ Object.defineProperty(__exports,"parseRelativeToken",{enumerable:true,get:function(){return __m8["parseRelativeToken"];}});
15463
+ Object.defineProperty(__exports,"resolveRelativeRange",{enumerable:true,get:function(){return __m8["resolveRelativeRange"];}});
15464
+ Object.defineProperty(__exports,"resolveRelativeCondition",{enumerable:true,get:function(){return __m8["resolveRelativeCondition"];}});
15465
+ Object.defineProperty(__exports,"relativeTokenOf",{enumerable:true,get:function(){return __m8["relativeTokenOf"];}});
15466
+ Object.defineProperty(__exports,"buildFilterSet",{enumerable:true,get:function(){return __m8["buildFilterSet"];}});
15467
+ Object.defineProperty(__exports,"normaliseFilterSet",{enumerable:true,get:function(){return __m8["normaliseFilterSet"];}});
15468
+ Object.defineProperty(__exports,"wireFilters",{enumerable:true,get:function(){return __m8["wireFilters"];}});
15469
+ Object.defineProperty(__exports,"querySignature",{enumerable:true,get:function(){return __m8["querySignature"];}});
15470
+ Object.defineProperty(__exports,"mapConditions",{enumerable:true,get:function(){return __m8["mapConditions"];}});
15471
+ Object.defineProperty(__exports,"forEachCondition",{enumerable:true,get:function(){return __m8["forEachCondition"];}});
15472
+ Object.defineProperty(__exports,"isGroup",{enumerable:true,get:function(){return __m8["isGroup"];}});
15473
+ const __m9=__req("packages/core/src/source/blockcache.js");
15474
+ Object.defineProperty(__exports,"BlockCache",{enumerable:true,get:function(){return __m9["BlockCache"];}});
15475
+ Object.defineProperty(__exports,"DEFAULT_PAGE_SIZE",{enumerable:true,get:function(){return __m9["DEFAULT_PAGE_SIZE"];}});
15476
+ Object.defineProperty(__exports,"DEFAULT_MAX_CACHED_PAGES",{enumerable:true,get:function(){return __m9["DEFAULT_MAX_CACHED_PAGES"];}});
15477
+ const __m10=__req("packages/core/src/source/gapbuffer.js");
15478
+ Object.defineProperty(__exports,"GapBuffer",{enumerable:true,get:function(){return __m10["GapBuffer"];}});
15479
+ const __m11=__req("packages/core/src/source/rows.js");
15480
+ Object.defineProperty(__exports,"RowFactory",{enumerable:true,get:function(){return __m11["RowFactory"];}});
15481
+ Object.defineProperty(__exports,"createRowFactory",{enumerable:true,get:function(){return __m11["createRowFactory"];}});
15482
+ Object.defineProperty(__exports,"groupKey",{enumerable:true,get:function(){return __m11["groupKey"];}});
15483
+ Object.defineProperty(__exports,"lazyRowView",{enumerable:true,get:function(){return __m11["lazyRowView"];}});
15484
+ Object.defineProperty(__exports,"DEFAULT_ROW_HEIGHT",{enumerable:true,get:function(){return __m11["DEFAULT_ROW_HEIGHT"];}});
15485
+ const __m12=__req("packages/core/src/source/handles.js");
15486
+ Object.defineProperty(__exports,"HandleProvider",{enumerable:true,get:function(){return __m12["HandleProvider"];}});
15487
+ Object.defineProperty(__exports,"createHandleProvider",{enumerable:true,get:function(){return __m12["createHandleProvider"];}});
15488
+ const MODES=Object.freeze(['memory','paged','remote','stream','derived']);
15121
15489
  function createSource(config,ctx){
15122
15490
  if(!ctx)fail('createSource requires a SourceContext');
15123
15491
  const resolved=isObject(config)?config:{mode:'memory'};
@@ -15127,6 +15495,7 @@ case'memory':return createMemorySource((resolved),ctx);
15127
15495
  case'paged':return createPagedSource((resolved),ctx);
15128
15496
  case'remote':return createRemoteSource((resolved),ctx);
15129
15497
  case'stream':return createStreamSource((resolved),ctx);
15498
+ case'derived':return createDerivedSource((resolved),ctx);
15130
15499
  default:
15131
15500
  warnOnce(
15132
15501
  `source.mode.${mode}`,
@@ -25217,6 +25586,7 @@ const __m19=__req("packages/core/src/compute/index.js");
25217
25586
  const compute=__m19;
25218
25587
  const __m20=__req("packages/core/src/source/index.js");
25219
25588
  const createSource=__m20["createSource"];
25589
+ const DERIVED_ROW_KEY=__m20["DERIVED_ROW_KEY"];
25220
25590
  const __m21=__req("packages/core/src/source/rows.js");
25221
25591
  const pinnedRow=__m21["pinnedRow"];
25222
25592
  const DEFAULT_ROW_HEIGHT=__m21["DEFAULT_ROW_HEIGHT"];
@@ -25473,6 +25843,10 @@ for(const[name,fn]of Object.entries(this.#config.totalFns||{})){
25473
25843
  if(isFunction(fn))this.#registry.register('totalFn',name,fn);
25474
25844
  }
25475
25845
  this.#pool=new MaskPool();
25846
+ if(this.#config.rowKey===undefined&&isObject(this.#config.source)
25847
+ &&(this.#config.source).mode==='derived'){
25848
+ this.#config.rowKey=DERIVED_ROW_KEY;
25849
+ }
25476
25850
  this.#rowKeyResolver=createRowKey(this.#config.rowKey);
25477
25851
  this.#rowKey=(data,index)=>this.#rowKeyResolver.key(data,index);
25478
25852
  if(Array.isArray(this.#config.pinnedTopRows))this.#pinnedTop=this.#config.pinnedTopRows.slice();
@@ -38450,6 +38824,7 @@ const PREFIX='lat';
38450
38824
  const NAMESPACE='lattice';
38451
38825
  const CLASS={
38452
38826
  root:`${PREFIX}-grid-root`,
38827
+ title:`${PREFIX}-title`,
38453
38828
  header:`${PREFIX}-header`,
38454
38829
  headerStart:`${PREFIX}-header-left-pinned`,
38455
38830
  headerCentreClip:`${PREFIX}-header-centre-clip`,
@@ -38505,6 +38880,8 @@ fail('DomRenderer needs a DOM. Use createHeadlessGrid() on the server.');
38505
38880
  this.#document=document;
38506
38881
  this.#host=element;
38507
38882
  this.root=el(document,`${NAMESPACE} ${CLASS.root}`);
38883
+ this.title=el(document,CLASS.title);
38884
+ this.title.hidden=true;
38508
38885
  this.header=el(document,CLASS.header);
38509
38886
  this.headerStart=el(document,CLASS.headerStart);
38510
38887
  this.headerCentreClip=el(document,CLASS.headerCentreClip);
@@ -38534,6 +38911,7 @@ this.stickyBottom=el(document,CLASS.stickyBottom);
38534
38911
  this.overlays=el(document,CLASS.overlays);
38535
38912
  this.statusBar=el(document,CLASS.statusBar);
38536
38913
  this.measureLayer=el(document,CLASS.measure);
38914
+ this.root.appendChild(this.title);
38537
38915
  this.root.appendChild(this.header);
38538
38916
  this.root.appendChild(this.bodyViewport);
38539
38917
  this.root.appendChild(this.stickyTop);
@@ -38543,6 +38921,14 @@ this.root.appendChild(this.statusBar);
38543
38921
  this.root.appendChild(this.measureLayer);
38544
38922
  }
38545
38923
  get document(){return this.#document;}
38924
+ setTitle(text){
38925
+ const value=text===null||text===undefined?'':String(text);
38926
+ this.title.textContent=value;
38927
+ this.title.hidden=value==='';
38928
+ }
38929
+ setHeaderVisible(visible){
38930
+ this.header.hidden=!visible;
38931
+ }
38546
38932
  mount(){
38547
38933
  this.#host.appendChild(this.root);
38548
38934
  }
@@ -42290,6 +42676,7 @@ this.#host=host;
42290
42676
  this.#cellLayer=host.cellLayer||textCellLayer;
42291
42677
  this.#overscan=Number.isFinite(host.config?.overscan)?host.config.overscan:DEFAULT_OVERSCAN;
42292
42678
  this.#viewport=new Viewport(element,{document:host.document});
42679
+ this.#applyChrome(host.config);
42293
42680
  this.#layout=new ColumnLayout({
42294
42681
  columns:()=>this.#visibleColumns(),
42295
42682
  threshold:host.config?.columnVirtualisationAbove,
@@ -42359,6 +42746,11 @@ onFrame:(ctx)=>this.#frame(ctx),
42359
42746
  onScrollEnd:()=>this.#host.emit('scroll:end',this.scrollPosition()),
42360
42747
  });
42361
42748
  }
42749
+ #applyChrome(config){
42750
+ const title=config&&config.title;
42751
+ this.#viewport.setTitle(typeof title==='string'?title:null);
42752
+ this.#viewport.setHeaderVisible(!(config&&config.showHeader===false));
42753
+ }
42362
42754
  mount(){
42363
42755
  if(this.#mountedOnce)return;
42364
42756
  this.#mountedOnce=true;
@@ -63035,6 +63427,229 @@ grids.push(el.tagName==='TABLE'?hydrateTable(el,config):createGrid(el,config));
63035
63427
  return grids;
63036
63428
  }
63037
63429
  });
63430
+ __def("packages/dom/src/stat.js",function(__exports,__req){
63431
+ 'use strict';
63432
+ Object.defineProperty(__exports,"deltaOf",{enumerable:true,get:function(){return deltaOf;}});
63433
+ Object.defineProperty(__exports,"toneOf",{enumerable:true,get:function(){return toneOf;}});
63434
+ Object.defineProperty(__exports,"createStat",{enumerable:true,get:function(){return createStat;}});
63435
+ const __m0=__req("packages/core/src/internal/util.js");
63436
+ const isFunction=__m0["isFunction"];
63437
+ const isObject=__m0["isObject"];
63438
+ const warnOnce=__m0["warnOnce"];
63439
+ const __m1=__req("packages/core/src/source/derive.js");
63440
+ const reduceValues=__m1["reduceValues"];
63441
+ const CLS={
63442
+ root:'lat-stat',
63443
+ title:'lat-stat__title',
63444
+ value:'lat-stat__value',
63445
+ delta:'lat-stat__delta',
63446
+ footer:'lat-stat__footer',
63447
+ };
63448
+ const UNIT_PRESERVING=new Set([
63449
+ 'sum','min','max','avg','first','last','mode',
63450
+ 'median','p25','p75','p90','p95','p99',
63451
+ 'stddev','stddevP','mad','range','iqr',
63452
+ 'trimmedMean','winsorizedMean','geomean','harmean',
63453
+ ]);
63454
+ const NO_DELTA=Object.freeze({direction:'flat',change:null,percent:null});
63455
+ function deltaOf(value,baseline){
63456
+ if(!Number.isFinite((value))
63457
+ ||!Number.isFinite((baseline)))return NO_DELTA;
63458
+ const change=(value)-(baseline);
63459
+ const direction=change>0?'up':(change<0?'down':'flat');
63460
+ const percent=baseline===0?null:(change/Math.abs((baseline)))*100;
63461
+ return{direction,change,percent};
63462
+ }
63463
+ function toneOf(direction,goodWhen){
63464
+ if(direction==='flat'||goodWhen==='neither')return'flat';
63465
+ return direction===goodWhen?'good':'bad';
63466
+ }
63467
+ function createStat(spec){
63468
+ const config=isObject(spec)?spec:{};
63469
+ const grid=config.grid||null;
63470
+ const host=resolveContainer(config.container,grid);
63471
+ if(!host){
63472
+ warnOnce('stat.container','createStat needs a `container`: an element or a selector.');
63473
+ return inert();
63474
+ }
63475
+ const doc=host.ownerDocument||(typeof document==='undefined'?null:document);
63476
+ if(!doc){
63477
+ warnOnce('stat.document','createStat needs a document; it draws DOM.');
63478
+ return inert();
63479
+ }
63480
+ const root=doc.createElement('div');
63481
+ root.className=['lattice',CLS.root,config.class].filter(Boolean).join(' ');
63482
+ root.setAttribute('role','group');
63483
+ const titleEl=doc.createElement('div');
63484
+ titleEl.className=CLS.title;
63485
+ const valueEl=doc.createElement('div');
63486
+ valueEl.className=CLS.value;
63487
+ const deltaEl=doc.createElement('div');
63488
+ deltaEl.className=CLS.delta;
63489
+ const footerEl=doc.createElement('div');
63490
+ footerEl.className=CLS.footer;
63491
+ root.appendChild(titleEl);
63492
+ root.appendChild(valueEl);
63493
+ root.appendChild(deltaEl);
63494
+ root.appendChild(footerEl);
63495
+ host.appendChild(root);
63496
+ let current=null;
63497
+ const off=[];
63498
+ let gone=false;
63499
+ function compute(){
63500
+ if(isFunction(config.value))return config.value(grid);
63501
+ if(config.value!==undefined&&!isObject(config.value))return config.value;
63502
+ const from=isObject(config.value)?config.value:config;
63503
+ const col=from.of;
63504
+ const fn=from.fn||'sum';
63505
+ const show=from.show;
63506
+ if(!grid)return null;
63507
+ if(fn==='count')return rowsInScope().length;
63508
+ if(!col)return null;
63509
+ if(show)return pick(String(col),String(fn),String(show));
63510
+ if(scope()==='filtered'&&grid.statistics&&isFunction(grid.statistics.reduce)){
63511
+ return grid.statistics.reduce(String(col),String(fn));
63512
+ }
63513
+ return reduceValues(rowsInScope().map((row)=>valueOf(row,String(col))),String(fn));
63514
+ }
63515
+ function scope(){
63516
+ return String(config.scope||'filtered');
63517
+ }
63518
+ function rowsInScope(){
63519
+ if(!grid||!grid.rows)return[];
63520
+ const want=scope();
63521
+ if(want==='all'){
63522
+ const every=[];
63523
+ if(isFunction(grid.rows.forEachAll))grid.rows.forEachAll((row)=>{if(!row.group)every.push(plain(row));});
63524
+ return every;
63525
+ }
63526
+ if(want==='selected'){
63527
+ const rows=grid.selection&&isFunction(grid.selection.rows)?grid.selection.rows():[];
63528
+ return rows.filter(Boolean).map(plain);
63529
+ }
63530
+ const out=[];
63531
+ if(isFunction(grid.rows.forEach)){
63532
+ grid.rows.forEach((row)=>{if(!row.group)out.push(plain(row));});
63533
+ }
63534
+ return out;
63535
+ }
63536
+ function pick(col,fn,show){
63537
+ if(fn!=='min'&&fn!=='max'){
63538
+ warnOnce(
63539
+ `stat.show.${fn}`,
63540
+ `\`show\` needs \`fn: 'min'\` or \`fn: 'max'\`: "${fn}" reduces to a value that no single `
63541
+ +'row holds, so there is no row to report from.',
63542
+ );
63543
+ return null;
63544
+ }
63545
+ let best=null;
63546
+ let bestRow=null;
63547
+ for(const row of rowsInScope()){
63548
+ const value=Number(valueOf(row,col));
63549
+ if(!Number.isFinite(value))continue;
63550
+ if(best===null||(fn==='max'?value>best:value<best)){
63551
+ best=value;
63552
+ bestRow=row;
63553
+ }
63554
+ }
63555
+ return bestRow===null?null:valueOf(bestRow,show);
63556
+ }
63557
+ function render(value){
63558
+ if(isFunction(config.format))return String(config.format(value,grid));
63559
+ if(value===null||value===undefined)return config.empty??'—';
63560
+ const from=isObject(config.value)?config.value:config;
63561
+ const source=from.show||from.of;
63562
+ const borrow=from.show?true:UNIT_PRESERVING.has(String(from.fn||'sum'));
63563
+ if(borrow&&grid&&source&&isFunction(grid.columns?.get)){
63564
+ const column=grid.columns.get(String(source));
63565
+ if(column&&isFunction(column.formatValue))return column.formatValue(value);
63566
+ }
63567
+ if(typeof value==='number'){
63568
+ return Number.isInteger(value)?String(value):value.toFixed(config.decimals??2);
63569
+ }
63570
+ return String(value);
63571
+ }
63572
+ function refresh(){
63573
+ if(gone)return;
63574
+ const value=compute();
63575
+ const baseline=isFunction(config.baseline)?config.baseline(grid):config.baseline;
63576
+ current=value;
63577
+ titleEl.textContent=config.title??'';
63578
+ titleEl.hidden=!config.title;
63579
+ valueEl.textContent=render(value);
63580
+ const delta=baseline===undefined||baseline===null
63581
+ ?NO_DELTA
63582
+ :deltaOf(typeof value==='number'?value:null,Number(baseline));
63583
+ const tone=toneOf(delta.direction,config.goodWhen||'up');
63584
+ deltaEl.hidden=delta.change===null;
63585
+ if(delta.change!==null){
63586
+ const arrow=delta.direction==='up'?'↑':(delta.direction==='down'?'↓':'→');
63587
+ const size=delta.percent===null
63588
+ ?render(Math.abs(delta.change))
63589
+ :`${Math.abs(delta.percent).toFixed(1)}%`;
63590
+ deltaEl.textContent=`${arrow} ${size}`;
63591
+ deltaEl.setAttribute('data-tone',tone);
63592
+ deltaEl.setAttribute('data-direction',delta.direction);
63593
+ }
63594
+ footerEl.textContent=isFunction(config.footer)?String(config.footer(value,grid)):(config.footer??'');
63595
+ footerEl.hidden=!footerEl.textContent;
63596
+ root.setAttribute('aria-label',[
63597
+ config.title,valueEl.textContent,
63598
+ delta.change===null?'':deltaEl.textContent,
63599
+ footerEl.textContent,
63600
+ ].filter(Boolean).join(', '));
63601
+ }
63602
+ if(grid&&isFunction(grid.on)&&config.live!==false){
63603
+ for(const event of['rows:changed','filter:changed','selection:changed']){
63604
+ const handler=()=>refresh();
63605
+ grid.on(event,handler);
63606
+ off.push(()=>isFunction(grid.off)&&grid.off(event,handler));
63607
+ }
63608
+ }
63609
+ refresh();
63610
+ return{
63611
+ element:()=>root,
63612
+ value:()=>current,
63613
+ refresh,
63614
+ destroy(){
63615
+ gone=true;
63616
+ for(const remove of off){try{remove();}catch{}}
63617
+ off.length=0;
63618
+ root.remove();
63619
+ },
63620
+ };
63621
+ }
63622
+ function plain(row){
63623
+ return isObject(row)&&'data'in(row)
63624
+ ?(row).data
63625
+ :row;
63626
+ }
63627
+ function valueOf(row,path){
63628
+ if(!isObject(row))return undefined;
63629
+ if(!path.includes('.'))return(row)[path];
63630
+ let cursor=(row);
63631
+ for(const part of path.split('.')){
63632
+ if(!isObject(cursor))return undefined;
63633
+ cursor=(cursor)[part];
63634
+ }
63635
+ return cursor;
63636
+ }
63637
+ function resolveContainer(container,grid){
63638
+ if(container&&typeof container==='object')return(container);
63639
+ if(typeof container!=='string')return null;
63640
+ const doc=(grid&&grid.element&&grid.element.ownerDocument)
63641
+ ||(typeof document==='undefined'?null:document);
63642
+ return doc?doc.querySelector(container):null;
63643
+ }
63644
+ function inert(){
63645
+ return{
63646
+ element:()=>null,
63647
+ value:()=>null,
63648
+ refresh(){},
63649
+ destroy(){},
63650
+ };
63651
+ }
63652
+ });
63038
63653
  __def("packages/dom/src/index.js",function(__exports,__req){
63039
63654
  'use strict';
63040
63655
  Object.defineProperty(__exports,"LatticeGrid",{enumerable:true,get:function(){return LatticeGrid;}});
@@ -63057,6 +63672,10 @@ const serialiseState=__m4["serialiseState"];
63057
63672
  const restoreState=__m4["restoreState"];
63058
63673
  Object.defineProperty(__exports,"createGrid",{enumerable:true,get:function(){return __m0["createGrid"];}});
63059
63674
  Object.defineProperty(__exports,"gridElementsWithin",{enumerable:true,get:function(){return __m0["gridElementsWithin"];}});
63675
+ const __m5=__req("packages/dom/src/stat.js");
63676
+ Object.defineProperty(__exports,"createStat",{enumerable:true,get:function(){return __m5["createStat"];}});
63677
+ Object.defineProperty(__exports,"deltaOf",{enumerable:true,get:function(){return __m5["deltaOf"];}});
63678
+ Object.defineProperty(__exports,"toneOf",{enumerable:true,get:function(){return __m5["toneOf"];}});
63060
63679
  Object.defineProperty(__exports,"readTable",{enumerable:true,get:function(){return __m1["readTable"];}});
63061
63680
  Object.defineProperty(__exports,"hydrateTable",{enumerable:true,get:function(){return __m1["hydrateTable"];}});
63062
63681
  Object.defineProperty(__exports,"autoInit",{enumerable:true,get:function(){return __m2["autoInit"];}});
@@ -63165,71 +63784,71 @@ Object.defineProperty(__exports,"STATE_VERSION",{enumerable:true,get:function(){
63165
63784
  Object.defineProperty(__exports,"serialiseState",{enumerable:true,get:function(){return __m4["serialiseState"];}});
63166
63785
  Object.defineProperty(__exports,"restoreState",{enumerable:true,get:function(){return __m4["restoreState"];}});
63167
63786
  Object.defineProperty(__exports,"VERSION",{enumerable:true,get:function(){return __m4["VERSION"];}});
63168
- const __m5=__req("packages/dom/src/renderer/index.js");
63169
- Object.defineProperty(__exports,"DomRenderer",{enumerable:true,get:function(){return __m5["DomRenderer"];}});
63170
- const __m6=__req("packages/dom/src/filtermenu.js");
63171
- Object.defineProperty(__exports,"FilterMenu",{enumerable:true,get:function(){return __m6["FilterMenu"];}});
63172
- Object.defineProperty(__exports,"mergeColumnFilter",{enumerable:true,get:function(){return __m6["mergeColumnFilter"];}});
63173
- Object.defineProperty(__exports,"branchFor",{enumerable:true,get:function(){return __m6["branchFor"];}});
63174
- const __m7=__req("packages/dom/src/columnmenu.js");
63175
- Object.defineProperty(__exports,"ColumnMenu",{enumerable:true,get:function(){return __m7["ColumnMenu"];}});
63176
- Object.defineProperty(__exports,"columnMenuItems",{enumerable:true,get:function(){return __m7["columnMenuItems"];}});
63177
- Object.defineProperty(__exports,"cellMenuItems",{enumerable:true,get:function(){return __m7["cellMenuItems"];}});
63178
- Object.defineProperty(__exports,"autoGroupMenuItems",{enumerable:true,get:function(){return __m7["autoGroupMenuItems"];}});
63179
- const __m8=__req("packages/dom/src/alignedgrids.js");
63180
- Object.defineProperty(__exports,"AlignedGrids",{enumerable:true,get:function(){return __m8["AlignedGrids"];}});
63181
- Object.defineProperty(__exports,"alignGrids",{enumerable:true,get:function(){return __m8["alignGrids"];}});
63182
- Object.defineProperty(__exports,"layoutState",{enumerable:true,get:function(){return __m8["layoutState"];}});
63183
- const __m9=__req("packages/dom/src/toolpanelmount.js");
63184
- Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return __m9["ToolPanelDock"];}});
63185
- Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return __m9["panelHost"];}});
63186
- Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return __m9["mountPanel"];}});
63187
- const __m10=__req("packages/dom/src/celledit.js");
63188
- Object.defineProperty(__exports,"CellEditController",{enumerable:true,get:function(){return __m10["CellEditController"];}});
63189
- const __m11=__req("packages/dom/src/editbar.js");
63190
- Object.defineProperty(__exports,"EditBar",{enumerable:true,get:function(){return __m11["EditBar"];}});
63191
- const __m12=__req("packages/dom/src/historybar.js");
63192
- Object.defineProperty(__exports,"HistoryBar",{enumerable:true,get:function(){return __m12["HistoryBar"];}});
63193
- Object.defineProperty(__exports,"HISTORY_CLS",{enumerable:true,get:function(){return __m12["HISTORY_CLS"];}});
63194
- const __m13=__req("packages/dom/src/diffpaint.js");
63195
- Object.defineProperty(__exports,"DiffPainter",{enumerable:true,get:function(){return __m13["DiffPainter"];}});
63196
- const __m14=__req("packages/dom/src/viewpicker.js");
63197
- Object.defineProperty(__exports,"ViewPicker",{enumerable:true,get:function(){return __m14["ViewPicker"];}});
63198
- Object.defineProperty(__exports,"VIEW_CLS",{enumerable:true,get:function(){return __m14["VIEW_CLS"];}});
63199
- Object.defineProperty(__exports,"summariseDiff",{enumerable:true,get:function(){return __m14["summariseDiff"];}});
63200
- const __m15=__req("packages/dom/src/promptbar.js");
63201
- Object.defineProperty(__exports,"PromptBar",{enumerable:true,get:function(){return __m15["PromptBar"];}});
63202
- Object.defineProperty(__exports,"PROMPT_CLASS",{enumerable:true,get:function(){return __m15["PROMPT_CLASS"];}});
63203
- const __m16=__req("packages/dom/src/cell/index.js");
63204
- Object.defineProperty(__exports,"createCellLayer",{enumerable:true,get:function(){return __m16["createCellLayer"];}});
63205
- Object.defineProperty(__exports,"compileTemplate",{enumerable:true,get:function(){return __m16["compileTemplate"];}});
63206
- Object.defineProperty(__exports,"compileVariant",{enumerable:true,get:function(){return __m16["compileVariant"];}});
63207
- Object.defineProperty(__exports,"checkVariant",{enumerable:true,get:function(){return __m16["checkVariant"];}});
63208
- Object.defineProperty(__exports,"VariantRegistry",{enumerable:true,get:function(){return __m16["VariantRegistry"];}});
63209
- Object.defineProperty(__exports,"BUILTIN_RENDERERS",{enumerable:true,get:function(){return __m16["BUILTIN_RENDERERS"];}});
63210
- Object.defineProperty(__exports,"BUILTIN_VARIANTS",{enumerable:true,get:function(){return __m16["BUILTIN_VARIANTS"];}});
63211
- Object.defineProperty(__exports,"BUILTIN_PIPES",{enumerable:true,get:function(){return __m16["BUILTIN_PIPES"];}});
63212
- const __m17=__req("packages/dom/src/editors/index.js");
63213
- Object.defineProperty(__exports,"editors",{enumerable:true,get:function(){return __m17["editors"];}});
63214
- Object.defineProperty(__exports,"createEditor",{enumerable:true,get:function(){return __m17["createEditor"];}});
63215
- Object.defineProperty(__exports,"editorFor",{enumerable:true,get:function(){return __m17["editorFor"];}});
63216
- Object.defineProperty(__exports,"BaseEditor",{enumerable:true,get:function(){return __m17["BaseEditor"];}});
63217
- const __m18=__req("packages/dom/src/filters/index.js");
63218
- Object.defineProperty(__exports,"filters",{enumerable:true,get:function(){return __m18["filters"];}});
63219
- Object.defineProperty(__exports,"createFilter",{enumerable:true,get:function(){return __m18["createFilter"];}});
63220
- Object.defineProperty(__exports,"filterFor",{enumerable:true,get:function(){return __m18["filterFor"];}});
63221
- Object.defineProperty(__exports,"parseExpression",{enumerable:true,get:function(){return __m18["parseExpression"];}});
63222
- const __m19=__req("packages/dom/src/ui/index.js");
63223
- Object.defineProperty(__exports,"StatusBar",{enumerable:true,get:function(){return __m19["StatusBar"];}});
63224
- Object.defineProperty(__exports,"ContextMenu",{enumerable:true,get:function(){return __m19["ContextMenu"];}});
63225
- Object.defineProperty(__exports,"ToolPanel",{enumerable:true,get:function(){return __m19["ToolPanel"];}});
63226
- Object.defineProperty(__exports,"TooltipManager",{enumerable:true,get:function(){return __m19["TooltipManager"];}});
63227
- Object.defineProperty(__exports,"Pagination",{enumerable:true,get:function(){return __m19["Pagination"];}});
63228
- Object.defineProperty(__exports,"OverlayLayer",{enumerable:true,get:function(){return __m19["OverlayLayer"];}});
63229
- const __m20=__req("packages/core/src/registry/licence.js");
63230
- Object.defineProperty(__exports,"setLicense",{enumerable:true,get:function(){return __m20["setLicence"];}});
63231
- Object.defineProperty(__exports,"licenseInfo",{enumerable:true,get:function(){return __m20["licenceInfo"];}});
63232
- Object.defineProperty(__exports,"licenseState",{enumerable:true,get:function(){return __m20["licenceState"];}});
63787
+ const __m6=__req("packages/dom/src/renderer/index.js");
63788
+ Object.defineProperty(__exports,"DomRenderer",{enumerable:true,get:function(){return __m6["DomRenderer"];}});
63789
+ const __m7=__req("packages/dom/src/filtermenu.js");
63790
+ Object.defineProperty(__exports,"FilterMenu",{enumerable:true,get:function(){return __m7["FilterMenu"];}});
63791
+ Object.defineProperty(__exports,"mergeColumnFilter",{enumerable:true,get:function(){return __m7["mergeColumnFilter"];}});
63792
+ Object.defineProperty(__exports,"branchFor",{enumerable:true,get:function(){return __m7["branchFor"];}});
63793
+ const __m8=__req("packages/dom/src/columnmenu.js");
63794
+ Object.defineProperty(__exports,"ColumnMenu",{enumerable:true,get:function(){return __m8["ColumnMenu"];}});
63795
+ Object.defineProperty(__exports,"columnMenuItems",{enumerable:true,get:function(){return __m8["columnMenuItems"];}});
63796
+ Object.defineProperty(__exports,"cellMenuItems",{enumerable:true,get:function(){return __m8["cellMenuItems"];}});
63797
+ Object.defineProperty(__exports,"autoGroupMenuItems",{enumerable:true,get:function(){return __m8["autoGroupMenuItems"];}});
63798
+ const __m9=__req("packages/dom/src/alignedgrids.js");
63799
+ Object.defineProperty(__exports,"AlignedGrids",{enumerable:true,get:function(){return __m9["AlignedGrids"];}});
63800
+ Object.defineProperty(__exports,"alignGrids",{enumerable:true,get:function(){return __m9["alignGrids"];}});
63801
+ Object.defineProperty(__exports,"layoutState",{enumerable:true,get:function(){return __m9["layoutState"];}});
63802
+ const __m10=__req("packages/dom/src/toolpanelmount.js");
63803
+ Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return __m10["ToolPanelDock"];}});
63804
+ Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return __m10["panelHost"];}});
63805
+ Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return __m10["mountPanel"];}});
63806
+ const __m11=__req("packages/dom/src/celledit.js");
63807
+ Object.defineProperty(__exports,"CellEditController",{enumerable:true,get:function(){return __m11["CellEditController"];}});
63808
+ const __m12=__req("packages/dom/src/editbar.js");
63809
+ Object.defineProperty(__exports,"EditBar",{enumerable:true,get:function(){return __m12["EditBar"];}});
63810
+ const __m13=__req("packages/dom/src/historybar.js");
63811
+ Object.defineProperty(__exports,"HistoryBar",{enumerable:true,get:function(){return __m13["HistoryBar"];}});
63812
+ Object.defineProperty(__exports,"HISTORY_CLS",{enumerable:true,get:function(){return __m13["HISTORY_CLS"];}});
63813
+ const __m14=__req("packages/dom/src/diffpaint.js");
63814
+ Object.defineProperty(__exports,"DiffPainter",{enumerable:true,get:function(){return __m14["DiffPainter"];}});
63815
+ const __m15=__req("packages/dom/src/viewpicker.js");
63816
+ Object.defineProperty(__exports,"ViewPicker",{enumerable:true,get:function(){return __m15["ViewPicker"];}});
63817
+ Object.defineProperty(__exports,"VIEW_CLS",{enumerable:true,get:function(){return __m15["VIEW_CLS"];}});
63818
+ Object.defineProperty(__exports,"summariseDiff",{enumerable:true,get:function(){return __m15["summariseDiff"];}});
63819
+ const __m16=__req("packages/dom/src/promptbar.js");
63820
+ Object.defineProperty(__exports,"PromptBar",{enumerable:true,get:function(){return __m16["PromptBar"];}});
63821
+ Object.defineProperty(__exports,"PROMPT_CLASS",{enumerable:true,get:function(){return __m16["PROMPT_CLASS"];}});
63822
+ const __m17=__req("packages/dom/src/cell/index.js");
63823
+ Object.defineProperty(__exports,"createCellLayer",{enumerable:true,get:function(){return __m17["createCellLayer"];}});
63824
+ Object.defineProperty(__exports,"compileTemplate",{enumerable:true,get:function(){return __m17["compileTemplate"];}});
63825
+ Object.defineProperty(__exports,"compileVariant",{enumerable:true,get:function(){return __m17["compileVariant"];}});
63826
+ Object.defineProperty(__exports,"checkVariant",{enumerable:true,get:function(){return __m17["checkVariant"];}});
63827
+ Object.defineProperty(__exports,"VariantRegistry",{enumerable:true,get:function(){return __m17["VariantRegistry"];}});
63828
+ Object.defineProperty(__exports,"BUILTIN_RENDERERS",{enumerable:true,get:function(){return __m17["BUILTIN_RENDERERS"];}});
63829
+ Object.defineProperty(__exports,"BUILTIN_VARIANTS",{enumerable:true,get:function(){return __m17["BUILTIN_VARIANTS"];}});
63830
+ Object.defineProperty(__exports,"BUILTIN_PIPES",{enumerable:true,get:function(){return __m17["BUILTIN_PIPES"];}});
63831
+ const __m18=__req("packages/dom/src/editors/index.js");
63832
+ Object.defineProperty(__exports,"editors",{enumerable:true,get:function(){return __m18["editors"];}});
63833
+ Object.defineProperty(__exports,"createEditor",{enumerable:true,get:function(){return __m18["createEditor"];}});
63834
+ Object.defineProperty(__exports,"editorFor",{enumerable:true,get:function(){return __m18["editorFor"];}});
63835
+ Object.defineProperty(__exports,"BaseEditor",{enumerable:true,get:function(){return __m18["BaseEditor"];}});
63836
+ const __m19=__req("packages/dom/src/filters/index.js");
63837
+ Object.defineProperty(__exports,"filters",{enumerable:true,get:function(){return __m19["filters"];}});
63838
+ Object.defineProperty(__exports,"createFilter",{enumerable:true,get:function(){return __m19["createFilter"];}});
63839
+ Object.defineProperty(__exports,"filterFor",{enumerable:true,get:function(){return __m19["filterFor"];}});
63840
+ Object.defineProperty(__exports,"parseExpression",{enumerable:true,get:function(){return __m19["parseExpression"];}});
63841
+ const __m20=__req("packages/dom/src/ui/index.js");
63842
+ Object.defineProperty(__exports,"StatusBar",{enumerable:true,get:function(){return __m20["StatusBar"];}});
63843
+ Object.defineProperty(__exports,"ContextMenu",{enumerable:true,get:function(){return __m20["ContextMenu"];}});
63844
+ Object.defineProperty(__exports,"ToolPanel",{enumerable:true,get:function(){return __m20["ToolPanel"];}});
63845
+ Object.defineProperty(__exports,"TooltipManager",{enumerable:true,get:function(){return __m20["TooltipManager"];}});
63846
+ Object.defineProperty(__exports,"Pagination",{enumerable:true,get:function(){return __m20["Pagination"];}});
63847
+ Object.defineProperty(__exports,"OverlayLayer",{enumerable:true,get:function(){return __m20["OverlayLayer"];}});
63848
+ const __m21=__req("packages/core/src/registry/licence.js");
63849
+ Object.defineProperty(__exports,"setLicense",{enumerable:true,get:function(){return __m21["setLicence"];}});
63850
+ Object.defineProperty(__exports,"licenseInfo",{enumerable:true,get:function(){return __m21["licenceInfo"];}});
63851
+ Object.defineProperty(__exports,"licenseState",{enumerable:true,get:function(){return __m21["licenceState"];}});
63233
63852
  const LatticeGrid={
63234
63853
  createGrid,
63235
63854
  createHeadlessGrid,