@vuu-ui/vuu-utils 0.8.13 → 0.8.14-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/index.js CHANGED
@@ -1,7 +1,3069 @@
1
- "use strict";var z=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var kt=Object.getOwnPropertyNames;var At=Object.prototype.hasOwnProperty;var vt=(e,t)=>{for(var n in t)z(e,n,{get:t[n],enumerable:!0})},Mt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of kt(t))!At.call(e,o)&&o!==n&&z(e,o,{get:()=>t[o],enumerable:!(r=Vt(t,o))||r.enumerable});return e};var It=e=>Mt(z({},"__esModule",{value:!0}),e);var $t=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var g=(e,t,n)=>($t(e,t,"read from private field"),n?n.call(e):t.get(e)),ke=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)};var _i={};vt(_i,{AggregationType:()=>en,ArrowDown:()=>co,ArrowLeft:()=>po,ArrowRight:()=>mo,ArrowUp:()=>ao,DOWN1:()=>O,DOWN2:()=>H,DataWindow:()=>ue,End:()=>yo,Enter:()=>fo,Escape:()=>go,EventEmitter:()=>de,Home:()=>ho,KeySet:()=>xe,MEASURES:()=>Tr,NULL_RANGE:()=>hr,PageDown:()=>bo,PageUp:()=>Co,RangeMonitor:()=>fe,RowSelected:()=>d,Space:()=>xo,Tab:()=>To,UP1:()=>I,UP2:()=>$,WindowRange:()=>R,actualRowPositioning:()=>So,addColumnToSubscribedColumns:()=>qn,addGroupColumn:()=>Yr,addSortColumn:()=>Xo,applyDefaultColumnConfig:()=>nr,applyFilterToColumns:()=>Fn,applyGroupByToColumns:()=>Sn,applySort:()=>zo,applySortToColumns:()=>Ln,boxContainsPoint:()=>Wt,buildColumnMap:()=>hn,createEl:()=>vr,dateFormatter:()=>rt,debounce:()=>wo,defaultValueFormatter:()=>Ce,deselectItem:()=>ko,dispatchCustomEvent:()=>Gr,dispatchMouseEvent:()=>Ur,expandSelection:()=>Bo,extractFilterForColumn:()=>ne,extractGroupColumn:()=>Ge,filterAsQuery:()=>k,findColumn:()=>Ne,flattenColumnGroup:()=>A,focusFirstFocusableElement:()=>Or,formatDate:()=>pe,fromServerDataType:()=>sn,getAddedItems:()=>Gt,getCalculatedColumnDetails:()=>M,getCalculatedColumnExpression:()=>Xn,getCalculatedColumnName:()=>Be,getCalculatedColumnType:()=>Jn,getCellConfigPanelRenderer:()=>gr,getCellRenderer:()=>pr,getCellRendererOptions:()=>cr,getClosest:()=>Qe,getClosestIndexItem:()=>Ir,getColumnLabel:()=>vn,getColumnName:()=>An,getColumnStyle:()=>Rn,getColumnsInViewport:()=>Hn,getConfigurationEditor:()=>fr,getCookieValue:()=>ie,getDefaultAlignment:()=>rn,getDefaultColumnType:()=>re,getEditRuleValidator:()=>dr,getElementByDataIndex:()=>$r,getElementDataIndex:()=>Mr,getFocusableElement:()=>Ze,getFullRange:()=>yr,getGroupValueAndOffset:()=>jn,getLoggingConfigForWorker:()=>Vr,getMissingItems:()=>jt,getMovingValueDirection:()=>wr,getRegisteredCellRenderers:()=>ar,getRowRecord:()=>$n,getScrollbarSize:()=>_r,getSelectionStatus:()=>Wo,getTableHeadings:()=>Dn,getTypeFormattingFromColumn:()=>Bn,getUniqueId:()=>Xr,getUrlParameter:()=>ti,getValueFormatter:()=>Jr,hasHeadings:()=>_e,hasUrlParameter:()=>ni,hasValidationRules:()=>dn,invariant:()=>eo,isAndFilter:()=>qt,isCalculatedColumn:()=>oe,isCharacterKey:()=>Zr,isColumnTypeRenderer:()=>v,isCompleteFilter:()=>Jt,isDataLoading:()=>On,isDateColumn:()=>Oe,isDatePattern:()=>le,isDateTimeColumn:()=>ee,isDateTimePattern:()=>ce,isFilterClause:()=>Y,isFilteredColumn:()=>Pn,isGroupColumn:()=>je,isGroupMenuItemDescriptor:()=>Do,isInFilter:()=>Kt,isJsonAttribute:()=>We,isJsonColumn:()=>xn,isJsonGroup:()=>bn,isKeyedColumn:()=>$e,isLookupRenderer:()=>fn,isMappedValueTypeRenderer:()=>te,isMultiClauseFilter:()=>L,isMultiValueFilter:()=>Z,isNamedFilter:()=>Bt,isNotHidden:()=>Q,isNumericColumn:()=>un,isOrFilter:()=>zt,isPinned:()=>ln,isQuoteKey:()=>Qr,isResizing:()=>an,isRowSelected:()=>Fo,isRowSelectedLast:()=>Po,isSelectableElement:()=>Hr,isSelected:()=>No,isSimpleColumnType:()=>Ue,isSingleValueFilter:()=>X,isTextColumn:()=>cn,isTimeColumn:()=>He,isTimePattern:()=>ae,isTypeDescriptor:()=>x,isValidColumnAlignment:()=>Ie,isValidFilterClauseOp:()=>Nt,isValidNumber:()=>Dr,isValidPinLocation:()=>on,isValueListRenderer:()=>gn,itemToString:()=>no,itemsChanged:()=>Ht,itemsOrOrderChanged:()=>_t,jsonToDataSourceRows:()=>lo,lastWord:()=>Yo,logger:()=>me,mapSortCriteria:()=>tn,metadataKeys:()=>C,moveColumnTo:()=>er,moveItem:()=>J,moveItemDeprecated:()=>Ut,numericFormatter:()=>ot,partition:()=>Ot,projectUpdates:()=>yn,rangeNewItems:()=>br,registerComponent:()=>ur,registerConfigurationEditor:()=>lr,removeColumnFromFilter:()=>Zt,replaceColumn:()=>tr,resetRange:()=>Cr,roundDecimal:()=>ye,selectItem:()=>Mo,setAggregations:()=>wn,setCalculatedColumnExpression:()=>Qn,setCalculatedColumnName:()=>Yn,setCalculatedColumnType:()=>Zn,setSortColumn:()=>Jo,shallowEquals:()=>Rr,sortPinnedColumns:()=>Tn,stripFilterFromColumns:()=>Vn,subscribedOnly:()=>Kn,takeScreenshot:()=>Hi,throttle:()=>Eo,toColumnDescriptor:()=>pn,toDataSourceColumns:()=>In,updateColumn:()=>Mn,updateColumnRenderProps:()=>Nn,updateColumnType:()=>Wn,uuid:()=>Ro,virtualRowPositioning:()=>Lo,visibleColumnAtIndex:()=>_n,withinRange:()=>Je,wordify:()=>ei});module.exports=It(_i);function Ot(e,t,n=[],r=[]){for(let o=0,i=e.length;o<i;o++)(t(e[o],o)?n:r).push(e[o]);return[n,r]}function Ht(e,t,n){return e.length!==t.length?!0:n===void 0?!e.every(r=>t.includes(r)):e.some(r=>t.findIndex(o=>o[n]===r[n])===-1)}function _t(e,t,n){return e.length!==t.length?!0:n===void 0?e.some((r,o)=>t[o]!==r):e.some((r,o)=>t[o][n]!==r[n])}var Ut=(e,t,n)=>{let r=e.indexOf(t);if(r===n)return e;let o=e.slice();if(r===-1)throw Error("moveItem, item to be moved not found");if(o.splice(r,1),n===-1)o.push(t);else{let i=(n>r,0);o.splice(n+i,0,t)}return o},J=(e,t,n)=>{if(t===n)return e;{let r=e.slice(),[o]=r.splice(t,1);if(n===-1)return r.concat(o);{let i=(n>t,0);return r.splice(n+i,0,o),r}}},Gt=(e,t)=>{let n=r=>!(e!=null&&e.includes(r));return e===void 0?t:t.some(n)?t.filter(n):[]},jt=(e,t,n)=>t.filter(r=>e.findIndex(o=>n(o)===r)===-1);function Wt(e,t,n){if(e)return t>=e.left&&t<e.right&&n>=e.top&&n<e.bottom}var Ae=new Set(["=","!=",">",">=","<","<=","starts","ends"]),Nt=e=>e==="in"||Ae.has(e),Bt=e=>e!==void 0&&e.name!==void 0,X=e=>e!==void 0&&Ae.has(e.op),Y=e=>e!==void 0&&(X(e)||Z(e)),Z=e=>e!==void 0&&e.op==="in",Kt=e=>e.op==="in",qt=e=>e.op==="and",zt=e=>e.op==="or",Jt=e=>X(e)&&e.column!==void 0&&e.op!==void 0&&e.value!==void 0;function L(e){return e!==void 0&&(e.op==="and"||e.op==="or")}var Xt=e=>typeof e=="string"?`"${e}"`:e,Yt=e=>typeof e=="string"?`"${e}"`:e,k=e=>L(e)?e.filters.map(t=>k(t)).join(` ${e.op} `):Z(e)?`${e.column} ${e.op} [${e.values.map(Yt).join(",")}]`:`${e.column} ${e.op} ${Xt(e.value)}`,Zt=(e,t)=>{if(L(t)){let[n,r]=t.filters;if(n.column===e.name)return[r,k(r)];if(r.column===e.name)return[n,k(n)]}return[void 0,""]};var Qt="asc",ve=[],en={Average:2,Count:3,Distinct:6,Sum:1,High:4,Low:5};function tn(e,t,n=0){return e.map(r=>{if(typeof r=="string")return[t[r]+n,"asc"];if(Array.isArray(r)){let[o,i]=r;return[t[o]+n,i||Qt]}else throw Error("columnUtils.mapSortCriteria invalid input")})}var nn=["int","long","double"],rn=e=>e===void 0?"left":nn.includes(e)?"right":"left",Ie=e=>e==="left"||e==="right",on=e=>Ie(e)||e==="floating"||e==="",$e=e=>typeof e.key=="number",sn=e=>{switch(e){case"double":case"int":case"long":return"number";case"boolean":return"boolean";default:return"string"}},un=({serverDataType:e,type:t})=>e==="int"||e==="long"||e==="double"?!0:typeof t=="string"?t==="number":typeof(t==null?void 0:t.name)=="string"?(t==null?void 0:t.name)==="number":!1,Oe=({type:e})=>(x(e)?e.name:e)==="date",He=({type:e})=>(x(e)?e.name:e)==="time",ee=e=>Oe(e)||He(e),ln=e=>typeof e.pin=="string",_e=e=>Array.isArray(e.heading)&&e.heading.length>0,an=e=>e.resizing,cn=({serverDataType:e})=>e===void 0?!1:e==="char"||e==="string",pn=e=>({name:e}),Ue=e=>typeof e=="string"&&["string","number","boolean","json","date","time","checkbox"].includes(e),x=e=>typeof e<"u"&&typeof e!="string",mn={},v=e=>typeof(e==null?void 0:e.name)<"u",fn=e=>typeof(e==null?void 0:e.name)<"u"&&"lookup"in e,gn=e=>typeof(e==null?void 0:e.name)<"u"&&Array.isArray(e.values),dn=e=>x(e)&&v(e.renderer)&&Array.isArray(e.renderer.rules)&&e.renderer.rules.length>0,te=e=>e!==void 0&&typeof(e==null?void 0:e.map)<"u";function hn(e){let t=C.count;return e?e.reduce((n,r,o)=>(typeof r=="string"?n[r]=t+o:$e(r)?n[r.name]=r.key:n[r.name]=t+o,n),{}):mn}function yn(e){let t=[],n=C.count-2;for(let r=0;r<e.length;r+=3)t[r]=e[r]+n,t[r+1]=e[r+1],t[r+2]=e[r+2];return t}var C={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:"parent_idx",IDX_POINTER:"idx_pointer",FILTER_COUNT:"filter_count",NEXT_FILTER_IDX:"next_filter_idx"},Cn=(e,t)=>{let{originalIdx:n}=t;if(typeof n=="number")for(let r=0;r<e.length;r++){let{originalIdx:o=-1}=e[r];if(o>n)return e.splice(r,0,t),e}return e.push(t),e},A=e=>{var t;if((t=e[0])!=null&&t.isGroup){let[n,...r]=e;return n.columns.forEach(o=>{Cn(r,o)}),r}else return e};function Ge(e,t,n=!0){if(t&&t.length>0){let r=A(e),[o,i]=r.reduce((a,p,b)=>{let[T,q]=a;return t.includes(p.name)?T.push({...p,originalIdx:b}):q.push(p),a},[[],[]]);if(o.length!==t.length)throw Error(`extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(t)} `);let s=t.length,u=t.map((a,p)=>({...o.find(T=>T.name===a),groupLevel:s-p}));return[{key:-1,name:"group-col",heading:["group-col"],isGroup:!0,columns:u,groupConfirmed:n,width:u.map(a=>a.width).reduce((a,p)=>a+p)+100},i]}return[null,A(e)]}var je=e=>e.isGroup===!0,We=e=>typeof e=="string"&&e.endsWith("+"),bn=(e,t)=>{var n;return((n=e.type)==null?void 0:n.name)==="json"&&We(t[e.key])},xn=e=>{var t;return((t=e.type)==null?void 0:t.name)==="json"},Tn=e=>{let t=[],n=[],r=[],o=4;for(let s of e)switch(s.pin){case"left":t.push({...s,endPin:void 0,pinnedOffset:o}),o+=s.width;break;case"right":n.unshift(s);break;default:r.push(s)}t.length&&t.push({...t.pop(),endPin:!0});let i=t.length?t.concat(r):r;if(n.length){let s=[],u=0;for(let l of n)s.unshift({...l,pinnedOffset:u}),u+=l.width;return s[0].endPin=!0,i.concat(s)}else return i},Dn=e=>{if(e.some(_e)){let t=e.reduce((i,{heading:s})=>{var u;return Math.max(i,(u=s==null?void 0:s.length)!=null?u:0)},0),n,r=[],o;for(let i=0;i<t;i++)o=[],e.forEach(({heading:s=ve,width:u})=>{var a;let l=(a=s[i])!=null?a:"";n&&n.label===l?n.width+=u:(n={label:l,width:u},o.push(n))}),r.push(o);return r}return ve},Rn=({pin:e,pinnedOffset:t=e==="left"?0:4,width:n})=>e==="left"?{left:t,width:n,"--pin-width":`${t+n-3}px`}:e==="right"?{right:t,width:n,"--pin-width":`${t+n}px`}:{width:n},wn=(e,t,n)=>e.filter(r=>r.column!==t.name).concat({column:t.name,aggType:n}),ne=(e,t)=>{if(L(e))return En(e,t);if(Y(e))return e.column===t?e:void 0},En=(e,t)=>{let{filters:n,op:r}=e,o=[];if(n.forEach(i=>{let s=ne(i,t);s&&o.push(s)}),o.length!==0)return o.length===1?o[0]:{op:r,filters:o}},Sn=(e,t,n=!0)=>{var r;if(t.length){let[o,i]=Ge(e,t,n);if(o)return[o].concat(i)}else if((r=e[0])!=null&&r.isGroup)return A(e);return e},Ln=(e,t)=>e.map(n=>{let r=kn(n,t);return r!==void 0?{...n,sorted:r}:n.sorted?{...n,sorted:void 0}:n}),Fn=(e,{filterStruct:t})=>e.map(n=>{let r=ne(t,n.name);return r!==void 0?{...n,filter:r}:n.filter?{...n,filter:void 0}:n}),Pn=e=>e.filter!==void 0,Vn=e=>e.map(t=>{let{filter:n,...r}=t;return n?r:t}),kn=(e,{sortDefs:t})=>{let n=t.find(r=>r.column===e.name);if(n)return t.length>1?(t.indexOf(n)+1)*(n.sortType==="A"?1:-1):n.sortType},An=e=>{let t=e.indexOf(":");return t===-1?e:e.slice(0,t)},vn=e=>e.label?e.label:oe(e.name)?Be(e):e.name,Ne=(e,t)=>{let n=e.find(r=>r.name===t);if(n)return n;{let r=e.find(o=>o.isGroup);if(r)return Ne(r.columns,t)}};function Mn(e,t,n){let r=typeof t=="string"?e.find(o=>o.name===t):t;if(r){let o=n?{...r,...n}:r;return e.map(i=>i.name===o.name?o:i)}else throw Error("column-utils.replaceColun, column not found")}var In=e=>e.name,$n=(e,t)=>Object.entries(t).reduce((n,[r,o])=>(n[r]=e[o],n),{}),On=e=>je(e[0])&&e[0].groupConfirmed===!1,Hn=(e,t,n)=>{var i;let r=[],o=0;for(let s=0,u=0;u<e.length;u++){let l=e[u];if(!l.hidden){if(s+l.width<t)l.pin==="left"||s+l.width+((i=e[u+1])==null?void 0:i.width)>t?r.push(l):o+=l.width;else if(s>n){r.push(l);break}else r.push(l);s+=l.width}}return[r,o]},Q=e=>e.hidden!==!0,_n=(e,t)=>e.every(Q)?e[t]:e.filter(Q).at(t),{DEPTH:Un,IS_LEAF:Gn}=C,jn=(e,t)=>{let{[Un]:n,[Gn]:r}=t;if(r||n>e.length)return[null,n===null?0:Math.max(0,n-1)];if(n===0)return["$root",0];{let{key:o,valueFormatter:i}=e[n-1];return[i(t[o]),n-1]}},re=e=>{switch(e){case"int":case"long":case"double":return"number";case"boolean":return"boolean";default:return"string"}},Wn=(e,t)=>{let{serverDataType:n,type:r=re(n)}=e;return typeof r=="string"||r===void 0?{...e,type:{name:r,formatting:t}}:{...e,type:{...r,formatting:t}}},Nn=(e,t)=>{let{serverDataType:n,type:r}=e;return r===void 0?{...e,type:{name:re(n),renderer:t}}:Ue(r)?{...e,type:{name:r,renderer:t}}:{...e,type:{...r,renderer:t}}},Me={},Bn=e=>{var t;return x(e.type)&&(t=e.type.formatting)!=null?t:Me},Kn=e=>t=>e==null?void 0:e.includes(t.name),qn=(e,t,n)=>{let r=(u=n)=>l=>l.name===u;if(e.findIndex(r())!==-1)throw Error(`column-utils, addColumnToSubscribedColumns column ${n} is already subscribed`);let o=t.findIndex(r());if(o===-1)throw Error(`column-utils, addColumnToSubscribedColumns column ${n} is not available`);let i={...t[o]},s=-1;for(let u=o-1;u>=0;u--){let{name:l}=t[u];if(s=e.findIndex(r(l)),s!==-1)break}if(s===-1)return[i].concat(e);{let u=[];for(let l=0;l<e.length;l++)u.push(e[l]),l===s&&(u.push(i),s=Number.MAX_SAFE_INTEGER);return u}},zn=/.*:.*:.*/,oe=e=>e!==void 0&&zn.test(e),M=e=>{if(oe(e.name))return e.name.split(/:=?/);throw Error(`column-utils, getCalculatedColumnDetails column name ${e.name} is not valid calculated column`)},Be=e=>M(e)[0],Jn=e=>M(e)[1],Xn=e=>M(e)[2],Yn=(e,t)=>{let[,n,r]=e.name.split(":");return{...e,name:`${t}:${n}:${r}`}},Zn=(e,t)=>{let[n,,r]=e.name.split(":");return{...e,name:`${n}:${t}:${r}`}},Qn=(e,t)=>{let[n,r]=e.name.split(":");return{...e,name:`${n}:${r}:=${t}`}},er=(e,t,n)=>{let r=e.findIndex(o=>o.name===t.name);return J(e,r,n)};function tr(e,t){return e.map(n=>n.name===t.name?t:n)}var nr=({columns:e,table:t},n)=>typeof n=="function"?e.map(r=>{let o=n(t.table,r.name);return o?{...r,...o}:r}):e;var ie=e=>{var t,n;if(((t=globalThis.document)==null?void 0:t.cookie)!==void 0)return(n=globalThis.document.cookie.split("; ").find(r=>r.startsWith(`${e}=`)))==null?void 0:n.split("=")[1]};var D=new Map,Ke=new Map,qe=new Map,ze=new Map,se=new Map,rr=(e,t)=>e===void 0||e==="private"?!0:Array.isArray(e)?e.includes(t):e===t,or=(e,t)=>e==="cell-renderer",ir=(e,t)=>e==="cell-config-panel",sr=(e,t)=>e==="data-edit-validator";function ur(e,t,n="cell-renderer",r){or(n,t)?D.set(e,t):ir(n,t)?qe.set(e,t):sr(n,t)&&ze.set(e,t),r&&se.set(e,r)}var lr=(e,t)=>{Ke.set(e,t)},ar=e=>{let n=Array.from(D.keys()).map(r=>({name:r,...se.get(r)}));return e?n.filter(r=>rr(r.serverDataType,e)):n},cr=e=>se.get(e);function pr(e,t="cell"){if(t==="cell")return mr(e);if(t==="col-label"&&e.colHeaderLabelRenderer)return D.get(e.colHeaderLabelRenderer);if(t==="col-content"&&e.colHeaderContentRenderer)return D.get(e.colHeaderContentRenderer)}function mr(e){if(x(e.type)){let{renderer:t}=e.type;if(v(t))return D.get(t.name)}else{if(e.serverDataType==="boolean")return D.get("checkbox-cell");if(e.editable)return D.get("input-cell")}}function fr(e=""){return Ke.get(e)}function gr(e){return qe.get(e)}function dr(e){return ze.get(e)}var hr={from:0,to:0};function yr({from:e,to:t},n=0,r=Number.MAX_SAFE_INTEGER){if(n===0)return r<e?{from:0,to:0}:{from:e,to:Math.min(t,r)};if(e===0)return{from:e,to:Math.min(t+n,r)};{let o=t-e,i=Math.round(n/2),s=e-i<0,u=r-(t+i)<0;return s&&u?{from:0,to:r}:s?{from:0,to:o+n}:u?{from:Math.max(0,r-(o+n)),to:r}:{from:e-i,to:t+i}}}function Cr({from:e,to:t,bufferSize:n=0}){return{from:0,to:t-e,bufferSize:n,reset:!0}}var Je=(e,{from:t,to:n})=>e>=t&&e<n,br=({from:e,to:t},n)=>{let{from:r,to:o}=n,i=r>=t||o<=e,s=r<e&&o>t;return i||s?n:o>t?{from:t,to:o}:{from:r,to:e}},R=class{constructor(t,n){this.from=t,this.to=n}isWithin(t){return Je(t,this)}overlap(t,n){return t>=this.to||n<this.from?[0,0]:[Math.max(t,this.from),Math.min(n,this.to)]}copy(){return new R(this.from,this.to)}};var{KEY:xr}=C,ue=class{constructor({from:t,to:n}){this.rowCount=0;this.setRowCount=t=>{t<this.data.length&&(this.data.length=t),this.rowCount=t};this.range=new R(t,n),this.data=new Array(n-t)}add(t){let[n]=t;if(this.isWithinRange(n)){let r=n-this.range.from,o=this.data[r]!==void 0;return this.data[r]=t,o}else return!1}getAtIndex(t){return this.range.isWithin(t)&&this.data[t-this.range.from]!=null?this.data[t-this.range.from]:void 0}getByKey(t){return this.data.find(n=>n[xr]===t)}isWithinRange(t){return this.range.isWithin(t)&&t<=this.rowCount}setRange(t,n){if(t!==this.range.from||n!==this.range.to){let[r,o]=this.range.overlap(t,n),i=new Array(n-t);for(let s=r;s<o;s++){let u=this.getAtIndex(s);if(u){let l=s-t;i[l]=u}}this.data=i,this.range.from=t,this.range.to=n}}hasData(t,n){let r=this.range.from,o=t-r,i=Math.min(n-r-1,this.rowCount-1);return this.data[o]!==void 0&&this.data[i]!==void 0}getData(t,n){var u;let{from:r,to:o}=this.range,i=Math.max(0,t-r),s=Math.min(n-r,(u=this.rowCount)!=null?u:n);return this.data.slice(i,s)}};var Tr={horizontal:{positionProp:"left",sizeProp:"width"},vertical:{positionProp:"top",sizeProp:"height"}};var I="up1",$="up2",O="down1",H="down2",Dr=e=>typeof e=="number"&&isFinite(e),Xe={},Rr=(e=Xe,t=Xe)=>{let n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(o=>e[o]===t[o])};function wr(e,t,n,r){if(e===void 0||!isFinite(e)||n===void 0||t===void 0)return"";{let o=e-n;return o&&typeof r=="number"&&(o=+e.toFixed(r)-+n.toFixed(r)),o?t===""?o<0?O:I:o>0?t===O||t===H||t===$?I:$:t===I||t===$||t===H?O:H:""}}var le=e=>e==="dd.mm.yyyy",ae=e=>e==="kk:mm:ss",ce=e=>e!==void 0&&le(e)||ae(e),F=e=>e<10?"0"+e:e.toString(),pe=(e,t="dd.mm.yyyy")=>{if(le(t)){let n=e.getDate(),r=e.getMonth(),o=e.getFullYear();return`${F(n)}.${F(r+1)}.${o}`}else if(ae(t)){let n=e.getHours(),r=e.getMinutes(),o=e.getSeconds();return`${F(n)}:${F(r)}:${F(o)}`}else return e.toUTCString()};var Er=["error","warn","info","debug"],Sr=e=>typeof e=="string"&&Er.includes(e),Lr="error",_=()=>{},Fr="error",{loggingLevel:U=Fr}=Pr(),me=e=>{let t=U==="debug",n=t||U==="info",r=n||U==="warn",o=r||U==="error",i=n?a=>console.info(`[${e}] ${a}`):_,s=r?a=>console.warn(`[${e}] ${a}`):_,u=t?a=>console.debug(`[${e}] ${a}`):_;return{errorEnabled:o,error:o?a=>console.error(`[${e}] ${a}`):_}};function Pr(){return typeof loggingSettings<"u"?loggingSettings:{loggingLevel:Ye()}}function Ye(){let e=ie("vuu-logging-level");return Sr(e)?e:Lr}var Vr=()=>`const loggingSettings = { loggingLevel: "${Ye()}"};`;var{debug:kr,debugEnabled:Ar}=me("range-monitor"),fe=class{constructor(t){this.source=t;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:t,to:n}){let{timestamp:r}=this;if(this.range.from=t,this.range.to=n,this.timestamp=performance.now(),r)Ar&&kr(`<${this.source}> [${t}-${n}], ${(this.timestamp-r).toFixed(0)} ms elapsed`);else return 0}};var vr=(e,t,n)=>{let r=document.createElement(e);return t&&(r.className=t),n&&(r.textContent=n),r},Ze=(e,t)=>{if(e){if(e.hasAttribute("tabindex")){let r=parseInt(e.getAttribute("tabindex"));if(!isNaN(r)&&(t===void 0||r===t))return e}let n=typeof t=="number"?e.querySelector(`[tabindex="${t}"]`):e.querySelector("[tabindex]");if(n)return n}},Mr=e=>{if(e){let t=parseInt(e.dataset.index||"");if(!isNaN(t))return t}return-1},Qe=(e,t)=>e.closest(`[data-${t}]`),Ir=e=>Qe(e,"index");function $r(e,t,n=!1){if(e===null&&n)throw Error("html-utils getElementByDataIndex, container is null");let r=e==null?void 0:e.querySelector(`[data-index="${t}"]`);if(r)return r;if(n)throw Error("html-utils getElementByDataIndex, Item not found with data-index='${index}'")}var Or=(e,t)=>{requestAnimationFrame(()=>{let n=Ze(e,t);n&&n.focus()})},Hr=e=>{let t=e==null?void 0:e.closest("[data-index]");return!(!t||t.ariaDisabled||t.dataset.selectable==="false"||t.querySelector('[data-selectable="false"],[aria-disabled="true"]'))},ge;function _r(){if(ge===void 0){let e=document.createElement("div");e.className="scrollable-content",e.style.width="50px",e.style.height="50px",e.style.overflowY="scroll",e.style.position="absolute",e.style.top="-200px",e.style.left="-200px";let t=document.createElement("div");t.style.height="100px",t.style.width="100%",e.appendChild(t),document.body.appendChild(e);let n=e.offsetWidth,r=t.offsetWidth;document.body.removeChild(e),ge=n-r,e=null}return ge}var Ur=(e,t)=>{let n=new MouseEvent(t,{view:window,bubbles:!0,cancelable:!0});e.dispatchEvent(n)},Gr=(e,t)=>{let n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)};function et(e){return Array.isArray(e)}function jr(e){return!Array.isArray(e)}var m,de=class{constructor(){ke(this,m,new Map)}addListener(t,n){let r=g(this,m).get(t);r?et(r)?r.push(n):jr(r)&&g(this,m).set(t,[r,n]):g(this,m).set(t,n)}removeListener(t,n){if(!g(this,m).has(t))return;let r=g(this,m).get(t),o=-1;if(r===n)g(this,m).delete(t);else if(Array.isArray(r)){for(let i=length;i-- >0;)if(r[i]===n){o=i;break}if(o<0)return;r.length===1?(r.length=0,g(this,m).delete(t)):r.splice(o,1)}}removeAllListeners(t){t&&g(this,m).has(t)?g(this,m).delete(t):t===void 0&&g(this,m).clear()}emit(t,...n){if(g(this,m)){let r=g(this,m).get(t);r&&this.invokeHandler(r,n)}}once(t,n){let r=(...o)=>{this.removeListener(t,r),n(...o)};this.on(t,r)}on(t,n){this.addListener(t,n)}hasListener(t,n){let r=g(this,m).get(t);return Array.isArray(r)?r.includes(n):r===n}invokeHandler(t,n){if(et(t))t.slice().forEach(r=>this.invokeHandler(r,n));else switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;default:t.call(null,...n)}}};m=new WeakMap;var G=String.fromCharCode(8200),c=String.fromCharCode(8199),Wr=-1,tt={DIGIT:c,TWO_DIGITS:c+c,THREE_DIGITS:c+c+c,FULL_PADDING:[null,G+c,G+c+c,G+c+c+c,G+c+c+c+c]},Nr={DIGIT:"0",TWO_DIGITS:"00",THREE_DIGITS:"000",FULL_PADDING:[null,"0","00","000","0000"]};function Br(e,t=6){return(Kr+e).slice(-t)}var Kr=c+c+c+c+c+c+c+c+c,he={Right:"right",Center:"center",Left:"left"};function nt(e,t,n){let r=e.length,o=t-r;if(o>0)o===1?e=e+n.DIGIT:o===2?e=e+n.TWO_DIGITS:o===3&&(e=e+n.THREE_DIGITS);else if(o<0&&(e=e.slice(0,t),r=t),n===tt&&e.charAt(r-1)==="0")return e=e.replace(/0+$/,""),nt(e,t,n);return e}function ye(e,t=he.Right,n=4,r,o){if(e===void 0||typeof e!="number"||isNaN(e))return"";let i,s,u,[l,a=""]=e.toString().split("."),p=a.length;return i=parseFloat(l).toLocaleString(),t===he.Left&&o&&(i=Br(i)),n===Wr||p===n?s=a:p>n?s=parseFloat("0."+a).toFixed(n).slice(2):(u=r?Nr:o&&t!==he.Left?tt:null)?p===0?s=u.FULL_PADDING[n]:s=nt(a,n,u):s=a,i+(s?"."+s:"")}var qr={},Ce=e=>e==null?"":typeof e=="string"?e:e.toString(),rt=e=>{let{type:t}=e,n="dd.mm.yyyy";return x(t)&&t.formatting&&ce(t.formatting.pattern)&&(n=t.formatting.pattern),r=>typeof r=="number"&&r!==0?pe(new Date(r),n):""},ot=({align:e="right",type:t})=>{var n;if(t===void 0||typeof t=="string")return Ce;{let{alignOnDecimals:r=!1,decimals:o,zeroPad:i=!1}=(n=t.formatting)!=null?n:qr;return s=>{if(typeof s=="string"&&(s.startsWith("\u03A3")||s.startsWith("[")))return s;let u=typeof s=="number"?s:typeof s=="string"?parseFloat(s):void 0;return ye(u,e,o,i,r)}}},zr=e=>t=>{var n;return(n=e[t])!=null?n:""},Jr=(e,t=e.serverDataType)=>{if(ee(e))return rt(e);let{type:n}=e;return x(n)&&te(n==null?void 0:n.renderer)?zr(n.renderer.map):t==="string"||t==="char"?r=>r:t==="double"?ot(e):Ce};var Xr=()=>`hw-${Math.round(Math.random()*1e5)}`;function Yr(e,t){return e?e.concat(t.name):[t.name]}var Zr=e=>e.length===1,Qr=e=>e.key==='"'||e.key==="'";function eo(e,t){if(!e){let n=new Error(t);throw n.name="Invariant Violation",n.framesToPop=1,n}}var to=e=>Object.prototype.toString.call(e)==="[object Object]";function no(e){return typeof e=="string"?e:to(e)?Object.prototype.hasOwnProperty.call(e,"label")?String(e.label):(console.warn(["itemToString: you've likely forgotten to set the label prop on the item object.","You can also provide your own `itemToString` implementation."].join(`
2
- `)),""):String(e)}var{COUNT:ro}=C,it=e=>typeof e=="object"&&e!==null,oo=["boolean","number","string"],io=e=>oo.includes(typeof e),so=e=>typeof e=="boolean"?"boolean":typeof e=="number"?"number":"string",uo=(e,t)=>{if(it(t))return{attribute:`${e}+`,attributeValue:"",type:"json"};if(t===void 0)return{attribute:e,attributeValue:"undefined",type:"string"};if(io(t))return{attribute:e,attributeValue:t,type:so(t)};throw Error(`unsupported type ${typeof t} in JSON`)},be={name:"json",renderer:{name:"json"}},lo=e=>{let t=[];t.push({name:"col 1",type:be},{name:"col 2",type:be});let n=[];return st(n,e,t),[t,n]},st=(e,t,n,r={value:0},o="$root",i=0)=>{let s=0,u=0;i===n.length-1&&n.push({name:`col ${n.length+1}`,hidden:!0,type:be});let l=Object.entries(t);for(let a=0;a<l.length;a++,r.value+=1){let[p,b]=l[a],{attribute:T,attributeValue:q,type:Lt}=uo(p,b),Ft=Lt!=="json",Pt=Array(i).fill(""),Le=`${o}|${p}`,Fe=[r.value,r.value,Ft,!1,i,0,Le,0,...Pt,T,q];if(e.push(Fe),u+=1,it(b)){let[Pe,Ve]=st(e,b,n,{value:r.value+1},Le,i+1);Fe[ro]=Pe,s+=Pe,u+=Ve,r.value+=Ve}else s+=1}return[s,u]};var ao="ArrowUp",co="ArrowDown",po="ArrowLeft",mo="ArrowRight",fo="Enter",go="Escape",ho="Home",yo="End",Co="PageUp",bo="PageDown",xo=" ",To="Tab";var xe=class{constructor(t){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(t)}next(){return this.free.length>0?this.free.pop():this.nextKeyValue++}reset({from:t,to:n}){this.keys.forEach((o,i)=>{(i<t||i>=n)&&(this.free.push(o),this.keys.delete(i))});let r=n-t;this.keys.size+this.free.length>r&&(this.free.length=Math.max(0,r-this.keys.size));for(let o=t;o<n;o++)if(!this.keys.has(o)){let i=this.next();this.keys.set(o,i)}this.nextKeyValue>this.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(t){let n=this.keys.get(t);if(n===void 0)throw console.log(`key not found
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __accessCheck = (obj, member, msg) => {
20
+ if (!member.has(obj))
21
+ throw TypeError("Cannot " + msg);
22
+ };
23
+ var __privateGet = (obj, member, getter) => {
24
+ __accessCheck(obj, member, "read from private field");
25
+ return getter ? getter.call(obj) : member.get(obj);
26
+ };
27
+ var __privateAdd = (obj, member, value) => {
28
+ if (member.has(obj))
29
+ throw TypeError("Cannot add the same private member more than once");
30
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
31
+ };
32
+
33
+ // src/index.ts
34
+ var src_exports = {};
35
+ __export(src_exports, {
36
+ AggregationType: () => AggregationType,
37
+ ArrowDown: () => ArrowDown,
38
+ ArrowLeft: () => ArrowLeft,
39
+ ArrowRight: () => ArrowRight,
40
+ ArrowUp: () => ArrowUp,
41
+ DOWN1: () => DOWN1,
42
+ DOWN2: () => DOWN2,
43
+ DataWindow: () => DataWindow,
44
+ End: () => End,
45
+ Enter: () => Enter,
46
+ Escape: () => Escape,
47
+ EventEmitter: () => EventEmitter,
48
+ Home: () => Home,
49
+ KeySet: () => KeySet,
50
+ MEASURES: () => MEASURES,
51
+ NULL_RANGE: () => NULL_RANGE,
52
+ PageDown: () => PageDown,
53
+ PageUp: () => PageUp,
54
+ RangeMonitor: () => RangeMonitor,
55
+ RowSelected: () => RowSelected,
56
+ Space: () => Space2,
57
+ Tab: () => Tab,
58
+ UP1: () => UP1,
59
+ UP2: () => UP2,
60
+ WindowRange: () => WindowRange,
61
+ actualRowPositioning: () => actualRowPositioning,
62
+ addColumnToSubscribedColumns: () => addColumnToSubscribedColumns,
63
+ addGroupColumn: () => addGroupColumn,
64
+ addSortColumn: () => addSortColumn,
65
+ applyDefaultColumnConfig: () => applyDefaultColumnConfig,
66
+ applyFilterToColumns: () => applyFilterToColumns,
67
+ applyGroupByToColumns: () => applyGroupByToColumns,
68
+ applySort: () => applySort,
69
+ applySortToColumns: () => applySortToColumns,
70
+ boxContainsPoint: () => boxContainsPoint,
71
+ buildColumnMap: () => buildColumnMap,
72
+ createEl: () => createEl,
73
+ dateFormatter: () => dateFormatter,
74
+ debounce: () => debounce,
75
+ defaultValueFormatter: () => defaultValueFormatter,
76
+ deselectItem: () => deselectItem,
77
+ dispatchCustomEvent: () => dispatchCustomEvent,
78
+ dispatchMouseEvent: () => dispatchMouseEvent,
79
+ expandSelection: () => expandSelection,
80
+ extractFilterForColumn: () => extractFilterForColumn,
81
+ extractGroupColumn: () => extractGroupColumn,
82
+ filterAsQuery: () => filterAsQuery,
83
+ findColumn: () => findColumn,
84
+ flattenColumnGroup: () => flattenColumnGroup,
85
+ focusFirstFocusableElement: () => focusFirstFocusableElement,
86
+ formatDate: () => formatDate,
87
+ fromServerDataType: () => fromServerDataType,
88
+ getAddedItems: () => getAddedItems,
89
+ getCalculatedColumnDetails: () => getCalculatedColumnDetails,
90
+ getCalculatedColumnExpression: () => getCalculatedColumnExpression,
91
+ getCalculatedColumnName: () => getCalculatedColumnName,
92
+ getCalculatedColumnType: () => getCalculatedColumnType,
93
+ getCellConfigPanelRenderer: () => getCellConfigPanelRenderer,
94
+ getCellRenderer: () => getCellRenderer,
95
+ getCellRendererOptions: () => getCellRendererOptions,
96
+ getClosest: () => getClosest,
97
+ getClosestIndexItem: () => getClosestIndexItem,
98
+ getColumnLabel: () => getColumnLabel,
99
+ getColumnName: () => getColumnName,
100
+ getColumnStyle: () => getColumnStyle,
101
+ getColumnsInViewport: () => getColumnsInViewport,
102
+ getConfigurationEditor: () => getConfigurationEditor,
103
+ getCookieValue: () => getCookieValue,
104
+ getDefaultAlignment: () => getDefaultAlignment,
105
+ getDefaultColumnType: () => getDefaultColumnType,
106
+ getEditRuleValidator: () => getEditRuleValidator,
107
+ getElementByDataIndex: () => getElementByDataIndex,
108
+ getElementDataIndex: () => getElementDataIndex,
109
+ getFocusableElement: () => getFocusableElement,
110
+ getFullRange: () => getFullRange,
111
+ getGroupValueAndOffset: () => getGroupValueAndOffset,
112
+ getLoggingConfigForWorker: () => getLoggingConfigForWorker,
113
+ getMissingItems: () => getMissingItems,
114
+ getMovingValueDirection: () => getMovingValueDirection,
115
+ getRegisteredCellRenderers: () => getRegisteredCellRenderers,
116
+ getRowRecord: () => getRowRecord,
117
+ getScrollbarSize: () => getScrollbarSize,
118
+ getSelectionStatus: () => getSelectionStatus,
119
+ getTableHeadings: () => getTableHeadings,
120
+ getTypeFormattingFromColumn: () => getTypeFormattingFromColumn,
121
+ getUniqueId: () => getUniqueId,
122
+ getUrlParameter: () => getUrlParameter,
123
+ getValueFormatter: () => getValueFormatter,
124
+ hasHeadings: () => hasHeadings,
125
+ hasUrlParameter: () => hasUrlParameter,
126
+ hasValidationRules: () => hasValidationRules,
127
+ invariant: () => invariant,
128
+ isAndFilter: () => isAndFilter,
129
+ isCalculatedColumn: () => isCalculatedColumn,
130
+ isCharacterKey: () => isCharacterKey,
131
+ isColumnTypeRenderer: () => isColumnTypeRenderer,
132
+ isCompleteFilter: () => isCompleteFilter,
133
+ isDataLoading: () => isDataLoading,
134
+ isDateColumn: () => isDateColumn,
135
+ isDatePattern: () => isDatePattern,
136
+ isDateTimeColumn: () => isDateTimeColumn,
137
+ isDateTimePattern: () => isDateTimePattern,
138
+ isFilterClause: () => isFilterClause,
139
+ isFilteredColumn: () => isFilteredColumn,
140
+ isGroupColumn: () => isGroupColumn,
141
+ isGroupMenuItemDescriptor: () => isGroupMenuItemDescriptor,
142
+ isInFilter: () => isInFilter,
143
+ isJsonAttribute: () => isJsonAttribute,
144
+ isJsonColumn: () => isJsonColumn,
145
+ isJsonGroup: () => isJsonGroup,
146
+ isKeyedColumn: () => isKeyedColumn,
147
+ isLookupRenderer: () => isLookupRenderer,
148
+ isMappedValueTypeRenderer: () => isMappedValueTypeRenderer,
149
+ isMultiClauseFilter: () => isMultiClauseFilter,
150
+ isMultiValueFilter: () => isMultiValueFilter,
151
+ isNamedFilter: () => isNamedFilter,
152
+ isNotHidden: () => isNotHidden,
153
+ isNumericColumn: () => isNumericColumn,
154
+ isOrFilter: () => isOrFilter,
155
+ isPinned: () => isPinned,
156
+ isQuoteKey: () => isQuoteKey,
157
+ isResizing: () => isResizing,
158
+ isRowSelected: () => isRowSelected,
159
+ isRowSelectedLast: () => isRowSelectedLast,
160
+ isSelectableElement: () => isSelectableElement,
161
+ isSelected: () => isSelected,
162
+ isSimpleColumnType: () => isSimpleColumnType,
163
+ isSingleValueFilter: () => isSingleValueFilter,
164
+ isTextColumn: () => isTextColumn,
165
+ isTimeColumn: () => isTimeColumn,
166
+ isTimePattern: () => isTimePattern,
167
+ isTypeDescriptor: () => isTypeDescriptor,
168
+ isValidColumnAlignment: () => isValidColumnAlignment,
169
+ isValidFilterClauseOp: () => isValidFilterClauseOp,
170
+ isValidNumber: () => isValidNumber,
171
+ isValidPinLocation: () => isValidPinLocation,
172
+ isValueListRenderer: () => isValueListRenderer,
173
+ itemToString: () => itemToString,
174
+ itemsChanged: () => itemsChanged,
175
+ itemsOrOrderChanged: () => itemsOrOrderChanged,
176
+ jsonToDataSourceRows: () => jsonToDataSourceRows,
177
+ lastWord: () => lastWord,
178
+ logger: () => logger,
179
+ mapSortCriteria: () => mapSortCriteria,
180
+ metadataKeys: () => metadataKeys,
181
+ moveColumnTo: () => moveColumnTo,
182
+ moveItem: () => moveItem,
183
+ moveItemDeprecated: () => moveItemDeprecated,
184
+ numericFormatter: () => numericFormatter,
185
+ partition: () => partition,
186
+ projectUpdates: () => projectUpdates,
187
+ rangeNewItems: () => rangeNewItems,
188
+ registerComponent: () => registerComponent,
189
+ registerConfigurationEditor: () => registerConfigurationEditor,
190
+ removeColumnFromFilter: () => removeColumnFromFilter,
191
+ replaceColumn: () => replaceColumn,
192
+ resetRange: () => resetRange,
193
+ roundDecimal: () => roundDecimal,
194
+ selectItem: () => selectItem,
195
+ setAggregations: () => setAggregations,
196
+ setCalculatedColumnExpression: () => setCalculatedColumnExpression,
197
+ setCalculatedColumnName: () => setCalculatedColumnName,
198
+ setCalculatedColumnType: () => setCalculatedColumnType,
199
+ setSortColumn: () => setSortColumn,
200
+ shallowEquals: () => shallowEquals,
201
+ sortPinnedColumns: () => sortPinnedColumns,
202
+ stripFilterFromColumns: () => stripFilterFromColumns,
203
+ subscribedOnly: () => subscribedOnly,
204
+ takeScreenshot: () => takeScreenshot,
205
+ throttle: () => throttle,
206
+ toColumnDescriptor: () => toColumnDescriptor,
207
+ toDataSourceColumns: () => toDataSourceColumns,
208
+ updateColumn: () => updateColumn,
209
+ updateColumnRenderProps: () => updateColumnRenderProps,
210
+ updateColumnType: () => updateColumnType,
211
+ uuid: () => uuid,
212
+ virtualRowPositioning: () => virtualRowPositioning,
213
+ visibleColumnAtIndex: () => visibleColumnAtIndex,
214
+ withinRange: () => withinRange,
215
+ wordify: () => wordify
216
+ });
217
+ module.exports = __toCommonJS(src_exports);
218
+
219
+ // src/array-utils.ts
220
+ function partition(array, test, pass = [], fail = []) {
221
+ for (let i = 0, len = array.length; i < len; i++) {
222
+ (test(array[i], i) ? pass : fail).push(array[i]);
223
+ }
224
+ return [pass, fail];
225
+ }
226
+ function itemsChanged(currentItems, newItems, identityProperty) {
227
+ if (currentItems.length !== newItems.length) {
228
+ return true;
229
+ }
230
+ if (identityProperty === void 0) {
231
+ return !currentItems.every((item) => newItems.includes(item));
232
+ } else {
233
+ return currentItems.some(
234
+ (currentItem) => newItems.findIndex(
235
+ (newItem) => newItem[identityProperty] === currentItem[identityProperty]
236
+ ) === -1
237
+ );
238
+ }
239
+ }
240
+ function itemsOrOrderChanged(currentItems, newItems, identityProperty) {
241
+ if (currentItems.length !== newItems.length) {
242
+ return true;
243
+ }
244
+ if (identityProperty === void 0) {
245
+ return currentItems.some((item, index) => newItems[index] !== item);
246
+ } else {
247
+ return currentItems.some(
248
+ (currentItem, index) => newItems[index][identityProperty] !== currentItem[identityProperty]
249
+ );
250
+ }
251
+ }
252
+ var moveItemDeprecated = (items, item, moveTo) => {
253
+ const fromIndex = items.indexOf(item);
254
+ if (fromIndex === moveTo) {
255
+ return items;
256
+ }
257
+ const newItems = items.slice();
258
+ if (fromIndex === -1) {
259
+ throw Error("moveItem, item to be moved not found");
260
+ }
261
+ newItems.splice(fromIndex, 1);
262
+ if (moveTo === -1) {
263
+ newItems.push(item);
264
+ } else {
265
+ const offset = moveTo > fromIndex ? 0 : 0;
266
+ newItems.splice(moveTo + offset, 0, item);
267
+ }
268
+ return newItems;
269
+ };
270
+ var moveItem = (items, fromIndex, toIndex) => {
271
+ if (fromIndex === toIndex) {
272
+ return items;
273
+ } else {
274
+ const newItems = items.slice();
275
+ const [item] = newItems.splice(fromIndex, 1);
276
+ if (toIndex === -1) {
277
+ return newItems.concat(item);
278
+ } else {
279
+ const offset = toIndex > fromIndex ? 0 : 0;
280
+ newItems.splice(toIndex + offset, 0, item);
281
+ return newItems;
282
+ }
283
+ }
284
+ };
285
+ var getAddedItems = (values, newValues) => {
286
+ const isNew = (v) => !(values == null ? void 0 : values.includes(v));
287
+ if (values === void 0) {
288
+ return newValues;
289
+ } else if (newValues.some(isNew)) {
290
+ return newValues.filter(isNew);
291
+ } else {
292
+ return [];
293
+ }
294
+ };
295
+ var getMissingItems = (sourceItems, items, identity) => items.filter((i) => sourceItems.findIndex((s) => identity(s) === i) === -1);
296
+
297
+ // src/box-utils.ts
298
+ function boxContainsPoint(rect, x, y) {
299
+ if (rect) {
300
+ return x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;
301
+ }
302
+ }
303
+
304
+ // src/filter-utils.ts
305
+ var singleValueFilterOps = /* @__PURE__ */ new Set([
306
+ "=",
307
+ "!=",
308
+ ">",
309
+ ">=",
310
+ "<",
311
+ "<=",
312
+ "starts",
313
+ "ends"
314
+ ]);
315
+ var isValidFilterClauseOp = (op) => op === "in" || singleValueFilterOps.has(op);
316
+ var isNamedFilter = (f) => f !== void 0 && f.name !== void 0;
317
+ var isSingleValueFilter = (f) => f !== void 0 && singleValueFilterOps.has(f.op);
318
+ var isFilterClause = (f) => f !== void 0 && (isSingleValueFilter(f) || isMultiValueFilter(f));
319
+ var isMultiValueFilter = (f) => f !== void 0 && f.op === "in";
320
+ var isInFilter = (f) => f.op === "in";
321
+ var isAndFilter = (f) => f.op === "and";
322
+ var isOrFilter = (f) => f.op === "or";
323
+ var isCompleteFilter = (filter) => isSingleValueFilter(filter) && filter.column !== void 0 && filter.op !== void 0 && filter.value !== void 0;
324
+ function isMultiClauseFilter(f) {
325
+ return f !== void 0 && (f.op === "and" || f.op === "or");
326
+ }
327
+ var filterValue = (value) => typeof value === "string" ? `"${value}"` : value;
328
+ var quotedStrings = (value) => typeof value === "string" ? `"${value}"` : value;
329
+ var filterAsQuery = (f) => {
330
+ if (isMultiClauseFilter(f)) {
331
+ return f.filters.map((filter) => filterAsQuery(filter)).join(` ${f.op} `);
332
+ } else if (isMultiValueFilter(f)) {
333
+ return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(",")}]`;
334
+ } else {
335
+ return `${f.column} ${f.op} ${filterValue(f.value)}`;
336
+ }
337
+ };
338
+ var removeColumnFromFilter = (column, filter) => {
339
+ if (isMultiClauseFilter(filter)) {
340
+ const [clause1, clause2] = filter.filters;
341
+ if (clause1.column === column.name) {
342
+ return [clause2, filterAsQuery(clause2)];
343
+ }
344
+ if (clause2.column === column.name) {
345
+ return [clause1, filterAsQuery(clause1)];
346
+ }
347
+ }
348
+ return [void 0, ""];
349
+ };
350
+
351
+ // src/column-utils.ts
352
+ var SORT_ASC = "asc";
353
+ var NO_HEADINGS = [];
354
+ var AggregationType = {
355
+ Average: 2,
356
+ Count: 3,
357
+ Distinct: 6,
358
+ Sum: 1,
359
+ High: 4,
360
+ Low: 5
361
+ };
362
+ function mapSortCriteria(sortCriteria, columnMap, metadataOffset = 0) {
363
+ return sortCriteria.map((s) => {
364
+ if (typeof s === "string") {
365
+ return [columnMap[s] + metadataOffset, "asc"];
366
+ } else if (Array.isArray(s)) {
367
+ const [columnName, sortDir] = s;
368
+ return [columnMap[columnName] + metadataOffset, sortDir || SORT_ASC];
369
+ } else {
370
+ throw Error("columnUtils.mapSortCriteria invalid input");
371
+ }
372
+ });
373
+ }
374
+ var numericTypes = ["int", "long", "double"];
375
+ var getDefaultAlignment = (serverDataType) => serverDataType === void 0 ? "left" : numericTypes.includes(serverDataType) ? "right" : "left";
376
+ var isValidColumnAlignment = (v) => v === "left" || v === "right";
377
+ var isValidPinLocation = (v) => isValidColumnAlignment(v) || v === "floating" || v === "";
378
+ var isKeyedColumn = (column) => {
379
+ return typeof column.key === "number";
380
+ };
381
+ var fromServerDataType = (serverDataType) => {
382
+ switch (serverDataType) {
383
+ case "double":
384
+ case "int":
385
+ case "long":
386
+ return "number";
387
+ case "boolean":
388
+ return "boolean";
389
+ default:
390
+ return "string";
391
+ }
392
+ };
393
+ var isNumericColumn = ({ serverDataType, type }) => {
394
+ if (serverDataType === "int" || serverDataType === "long" || serverDataType === "double") {
395
+ return true;
396
+ }
397
+ if (typeof type === "string") {
398
+ return type === "number";
399
+ }
400
+ if (typeof (type == null ? void 0 : type.name) === "string") {
401
+ return (type == null ? void 0 : type.name) === "number";
402
+ }
403
+ return false;
404
+ };
405
+ var isDateColumn = ({ type }) => (isTypeDescriptor(type) ? type.name : type) === "date";
406
+ var isTimeColumn = ({ type }) => (isTypeDescriptor(type) ? type.name : type) === "time";
407
+ var isDateTimeColumn = (column) => isDateColumn(column) || isTimeColumn(column);
408
+ var isPinned = (column) => typeof column.pin === "string";
409
+ var hasHeadings = (column) => Array.isArray(column.heading) && column.heading.length > 0;
410
+ var isResizing = (column) => column.resizing;
411
+ var isTextColumn = ({ serverDataType }) => serverDataType === void 0 ? false : serverDataType === "char" || serverDataType === "string";
412
+ var toColumnDescriptor = (name) => ({
413
+ name
414
+ });
415
+ var isSimpleColumnType = (value) => typeof value === "string" && ["string", "number", "boolean", "json", "date", "time", "checkbox"].includes(
416
+ value
417
+ );
418
+ var isTypeDescriptor = (type) => typeof type !== "undefined" && typeof type !== "string";
419
+ var EMPTY_COLUMN_MAP = {};
420
+ var isColumnTypeRenderer = (renderer) => typeof (renderer == null ? void 0 : renderer.name) !== "undefined";
421
+ var isLookupRenderer = (renderer) => typeof (renderer == null ? void 0 : renderer.name) !== "undefined" && "lookup" in renderer;
422
+ var isValueListRenderer = (renderer) => typeof (renderer == null ? void 0 : renderer.name) !== "undefined" && Array.isArray(renderer.values);
423
+ var hasValidationRules = (type) => isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer) && Array.isArray(type.renderer.rules) && type.renderer.rules.length > 0;
424
+ var isMappedValueTypeRenderer = (renderer) => renderer !== void 0 && typeof (renderer == null ? void 0 : renderer.map) !== "undefined";
425
+ function buildColumnMap(columns) {
426
+ const start = metadataKeys.count;
427
+ if (columns) {
428
+ return columns.reduce((map, column, i) => {
429
+ if (typeof column === "string") {
430
+ map[column] = start + i;
431
+ } else if (isKeyedColumn(column)) {
432
+ map[column.name] = column.key;
433
+ } else {
434
+ map[column.name] = start + i;
435
+ }
436
+ return map;
437
+ }, {});
438
+ } else {
439
+ return EMPTY_COLUMN_MAP;
440
+ }
441
+ }
442
+ function projectUpdates(updates) {
443
+ const results = [];
444
+ const metadataOffset = metadataKeys.count - 2;
445
+ for (let i = 0; i < updates.length; i += 3) {
446
+ results[i] = updates[i] + metadataOffset;
447
+ results[i + 1] = updates[i + 1];
448
+ results[i + 2] = updates[i + 2];
449
+ }
450
+ return results;
451
+ }
452
+ var metadataKeys = {
453
+ IDX: 0,
454
+ RENDER_IDX: 1,
455
+ IS_LEAF: 2,
456
+ IS_EXPANDED: 3,
457
+ DEPTH: 4,
458
+ COUNT: 5,
459
+ KEY: 6,
460
+ SELECTED: 7,
461
+ count: 8,
462
+ // TODO following only used in datamodel
463
+ PARENT_IDX: "parent_idx",
464
+ IDX_POINTER: "idx_pointer",
465
+ FILTER_COUNT: "filter_count",
466
+ NEXT_FILTER_IDX: "next_filter_idx"
467
+ };
468
+ var insertColumn = (columns, column) => {
469
+ const { originalIdx } = column;
470
+ if (typeof originalIdx === "number") {
471
+ for (let i = 0; i < columns.length; i++) {
472
+ const { originalIdx: colIdx = -1 } = columns[i];
473
+ if (colIdx > originalIdx) {
474
+ columns.splice(i, 0, column);
475
+ return columns;
476
+ }
477
+ }
478
+ }
479
+ columns.push(column);
480
+ return columns;
481
+ };
482
+ var flattenColumnGroup = (columns) => {
483
+ var _a;
484
+ if ((_a = columns[0]) == null ? void 0 : _a.isGroup) {
485
+ const [groupColumn, ...nonGroupedColumns] = columns;
486
+ groupColumn.columns.forEach((groupColumn2) => {
487
+ insertColumn(nonGroupedColumns, groupColumn2);
488
+ });
489
+ return nonGroupedColumns;
490
+ } else {
491
+ return columns;
492
+ }
493
+ };
494
+ function extractGroupColumn(columns, groupBy, confirmed = true) {
495
+ if (groupBy && groupBy.length > 0) {
496
+ const flattenedColumns = flattenColumnGroup(columns);
497
+ const [groupedColumns, rest] = flattenedColumns.reduce(
498
+ (result, column, i) => {
499
+ const [g, r] = result;
500
+ if (groupBy.includes(column.name)) {
501
+ g.push({
502
+ ...column,
503
+ originalIdx: i
504
+ });
505
+ } else {
506
+ r.push(column);
507
+ }
508
+ return result;
509
+ },
510
+ [[], []]
511
+ );
512
+ if (groupedColumns.length !== groupBy.length) {
513
+ throw Error(
514
+ `extractGroupColumn: no column definition found for all groupBy cols ${JSON.stringify(
515
+ groupBy
516
+ )} `
517
+ );
518
+ }
519
+ const groupCount = groupBy.length;
520
+ const groupCols = groupBy.map((name, idx) => {
521
+ const column = groupedColumns.find(
522
+ (col) => col.name === name
523
+ );
524
+ return {
525
+ ...column,
526
+ groupLevel: groupCount - idx
527
+ };
528
+ });
529
+ const groupCol = {
530
+ key: -1,
531
+ name: "group-col",
532
+ heading: ["group-col"],
533
+ isGroup: true,
534
+ columns: groupCols,
535
+ groupConfirmed: confirmed,
536
+ width: groupCols.map((c) => c.width).reduce((a, b) => a + b) + 100
537
+ };
538
+ return [groupCol, rest];
539
+ }
540
+ return [null, flattenColumnGroup(columns)];
541
+ }
542
+ var isGroupColumn = (column) => column.isGroup === true;
543
+ var isJsonAttribute = (value) => typeof value === "string" && value.endsWith("+");
544
+ var isJsonGroup = (column, row) => {
545
+ var _a;
546
+ return ((_a = column.type) == null ? void 0 : _a.name) === "json" && isJsonAttribute(row[column.key]);
547
+ };
548
+ var isJsonColumn = (column) => {
549
+ var _a;
550
+ return ((_a = column.type) == null ? void 0 : _a.name) === "json";
551
+ };
552
+ var sortPinnedColumns = (columns) => {
553
+ const leftPinnedColumns = [];
554
+ const rightPinnedColumns = [];
555
+ const restColumns = [];
556
+ let pinnedWidthLeft = 4;
557
+ for (const column of columns) {
558
+ switch (column.pin) {
559
+ case "left":
560
+ {
561
+ leftPinnedColumns.push({
562
+ ...column,
563
+ endPin: void 0,
564
+ pinnedOffset: pinnedWidthLeft
565
+ });
566
+ pinnedWidthLeft += column.width;
567
+ }
568
+ break;
569
+ case "right":
570
+ rightPinnedColumns.unshift(column);
571
+ break;
572
+ default:
573
+ restColumns.push(column);
574
+ }
575
+ }
576
+ if (leftPinnedColumns.length) {
577
+ leftPinnedColumns.push({
578
+ ...leftPinnedColumns.pop(),
579
+ endPin: true
580
+ });
581
+ }
582
+ const allColumns = leftPinnedColumns.length ? leftPinnedColumns.concat(restColumns) : restColumns;
583
+ if (rightPinnedColumns.length) {
584
+ const measuredRightPinnedColumns = [];
585
+ let pinnedWidthRight = 0;
586
+ for (const column of rightPinnedColumns) {
587
+ measuredRightPinnedColumns.unshift({
588
+ ...column,
589
+ pinnedOffset: pinnedWidthRight
590
+ });
591
+ pinnedWidthRight += column.width;
592
+ }
593
+ measuredRightPinnedColumns[0].endPin = true;
594
+ return allColumns.concat(measuredRightPinnedColumns);
595
+ } else {
596
+ return allColumns;
597
+ }
598
+ };
599
+ var getTableHeadings = (columns) => {
600
+ if (columns.some(hasHeadings)) {
601
+ const maxHeadingDepth = columns.reduce(
602
+ (max, { heading: heading2 }) => {
603
+ var _a;
604
+ return Math.max(max, (_a = heading2 == null ? void 0 : heading2.length) != null ? _a : 0);
605
+ },
606
+ 0
607
+ );
608
+ let heading = void 0;
609
+ const tableHeadings = [];
610
+ let tableHeadingsRow;
611
+ for (let level = 0; level < maxHeadingDepth; level++) {
612
+ tableHeadingsRow = [];
613
+ columns.forEach(({ heading: columnHeading = NO_HEADINGS, width }) => {
614
+ var _a;
615
+ const label = (_a = columnHeading[level]) != null ? _a : "";
616
+ if (heading && heading.label === label) {
617
+ heading.width += width;
618
+ } else {
619
+ heading = { label, width };
620
+ tableHeadingsRow.push(heading);
621
+ }
622
+ });
623
+ tableHeadings.push(tableHeadingsRow);
624
+ }
625
+ return tableHeadings;
626
+ }
627
+ return NO_HEADINGS;
628
+ };
629
+ var getColumnStyle = ({
630
+ pin,
631
+ pinnedOffset = pin === "left" ? 0 : 4,
632
+ width
633
+ }) => pin === "left" ? {
634
+ left: pinnedOffset,
635
+ width,
636
+ "--pin-width": `${pinnedOffset + width - 3}px`
637
+ } : pin === "right" ? {
638
+ right: pinnedOffset,
639
+ width,
640
+ "--pin-width": `${pinnedOffset + width}px`
641
+ } : { width };
642
+ var setAggregations = (aggregations, column, aggType) => {
643
+ return aggregations.filter((agg) => agg.column !== column.name).concat({ column: column.name, aggType });
644
+ };
645
+ var extractFilterForColumn = (filter, columnName) => {
646
+ if (isMultiClauseFilter(filter)) {
647
+ return collectFiltersForColumn(filter, columnName);
648
+ }
649
+ if (isFilterClause(filter)) {
650
+ return filter.column === columnName ? filter : void 0;
651
+ }
652
+ return void 0;
653
+ };
654
+ var collectFiltersForColumn = (filter, columnName) => {
655
+ const { filters, op } = filter;
656
+ const results = [];
657
+ filters.forEach((filter2) => {
658
+ const ffc = extractFilterForColumn(filter2, columnName);
659
+ if (ffc) {
660
+ results.push(ffc);
661
+ }
662
+ });
663
+ if (results.length === 0) {
664
+ return void 0;
665
+ } else if (results.length === 1) {
666
+ return results[0];
667
+ }
668
+ return {
669
+ op,
670
+ filters: results
671
+ };
672
+ };
673
+ var applyGroupByToColumns = (columns, groupBy, confirmed = true) => {
674
+ var _a;
675
+ if (groupBy.length) {
676
+ const [groupColumn, nonGroupedColumns] = extractGroupColumn(
677
+ columns,
678
+ groupBy,
679
+ confirmed
680
+ );
681
+ if (groupColumn) {
682
+ return [groupColumn].concat(nonGroupedColumns);
683
+ }
684
+ } else if ((_a = columns[0]) == null ? void 0 : _a.isGroup) {
685
+ return flattenColumnGroup(columns);
686
+ }
687
+ return columns;
688
+ };
689
+ var applySortToColumns = (colunms, sort) => colunms.map((column) => {
690
+ const sorted = getSortType(column, sort);
691
+ if (sorted !== void 0) {
692
+ return {
693
+ ...column,
694
+ sorted
695
+ };
696
+ } else if (column.sorted) {
697
+ return {
698
+ ...column,
699
+ sorted: void 0
700
+ };
701
+ } else {
702
+ return column;
703
+ }
704
+ });
705
+ var applyFilterToColumns = (columns, { filterStruct }) => columns.map((column) => {
706
+ const filter = extractFilterForColumn(filterStruct, column.name);
707
+ if (filter !== void 0) {
708
+ return {
709
+ ...column,
710
+ filter
711
+ };
712
+ } else if (column.filter) {
713
+ return {
714
+ ...column,
715
+ filter: void 0
716
+ };
717
+ } else {
718
+ return column;
719
+ }
720
+ });
721
+ var isFilteredColumn = (column) => column.filter !== void 0;
722
+ var stripFilterFromColumns = (columns) => columns.map((col) => {
723
+ const { filter, ...rest } = col;
724
+ return filter ? rest : col;
725
+ });
726
+ var getSortType = (column, { sortDefs }) => {
727
+ const sortDef = sortDefs.find((sortCol) => sortCol.column === column.name);
728
+ if (sortDef) {
729
+ return sortDefs.length > 1 ? (sortDefs.indexOf(sortDef) + 1) * (sortDef.sortType === "A" ? 1 : -1) : sortDef.sortType;
730
+ }
731
+ };
732
+ var getColumnName = (name) => {
733
+ const pos = name.indexOf(":");
734
+ if (pos === -1) {
735
+ return name;
736
+ } else {
737
+ return name.slice(0, pos);
738
+ }
739
+ };
740
+ var getColumnLabel = (column) => {
741
+ if (column.label) {
742
+ return column.label;
743
+ } else if (isCalculatedColumn(column.name)) {
744
+ return getCalculatedColumnName(column);
745
+ } else {
746
+ return column.name;
747
+ }
748
+ };
749
+ var findColumn = (columns, columnName) => {
750
+ const column = columns.find((col) => col.name === columnName);
751
+ if (column) {
752
+ return column;
753
+ } else {
754
+ const groupColumn = columns.find(
755
+ (col) => col.isGroup
756
+ );
757
+ if (groupColumn) {
758
+ return findColumn(groupColumn.columns, columnName);
759
+ }
760
+ }
761
+ };
762
+ function updateColumn(columns, column, options) {
763
+ const targetColumn = typeof column === "string" ? columns.find((col) => col.name === column) : column;
764
+ if (targetColumn) {
765
+ const replacementColumn = options ? { ...targetColumn, ...options } : targetColumn;
766
+ return columns.map(
767
+ (col) => col.name === replacementColumn.name ? replacementColumn : col
768
+ );
769
+ } else {
770
+ throw Error("column-utils.replaceColun, column not found");
771
+ }
772
+ }
773
+ var toDataSourceColumns = (column) => column.name;
774
+ var getRowRecord = (row, columnMap) => {
775
+ return Object.entries(columnMap).reduce(
776
+ (map, [colName, key]) => {
777
+ map[colName] = row[key];
778
+ return map;
779
+ },
780
+ {}
781
+ );
782
+ };
783
+ var isDataLoading = (columns) => {
784
+ return isGroupColumn(columns[0]) && columns[0].groupConfirmed === false;
785
+ };
786
+ var getColumnsInViewport = (columns, vpStart, vpEnd) => {
787
+ var _a;
788
+ const visibleColumns = [];
789
+ let preSpan = 0;
790
+ for (let offset = 0, i = 0; i < columns.length; i++) {
791
+ const column = columns[i];
792
+ if (column.hidden) {
793
+ continue;
794
+ } else if (offset + column.width < vpStart) {
795
+ if (column.pin === "left") {
796
+ visibleColumns.push(column);
797
+ } else if (offset + column.width + ((_a = columns[i + 1]) == null ? void 0 : _a.width) > vpStart) {
798
+ visibleColumns.push(column);
799
+ } else {
800
+ preSpan += column.width;
801
+ }
802
+ } else if (offset > vpEnd) {
803
+ visibleColumns.push(column);
804
+ break;
805
+ } else {
806
+ visibleColumns.push(column);
807
+ }
808
+ offset += column.width;
809
+ }
810
+ return [visibleColumns, preSpan];
811
+ };
812
+ var isNotHidden = (column) => column.hidden !== true;
813
+ var visibleColumnAtIndex = (columns, index) => {
814
+ if (columns.every(isNotHidden)) {
815
+ return columns[index];
816
+ } else {
817
+ return columns.filter(isNotHidden).at(index);
818
+ }
819
+ };
820
+ var { DEPTH, IS_LEAF } = metadataKeys;
821
+ var getGroupValueAndOffset = (columns, row) => {
822
+ const { [DEPTH]: depth, [IS_LEAF]: isLeaf } = row;
823
+ if (isLeaf || depth > columns.length) {
824
+ return [null, depth === null ? 0 : Math.max(0, depth - 1)];
825
+ } else if (depth === 0) {
826
+ return ["$root", 0];
827
+ } else {
828
+ const { key, valueFormatter } = columns[depth - 1];
829
+ const value = valueFormatter(row[key]);
830
+ return [value, depth - 1];
831
+ }
832
+ };
833
+ var getDefaultColumnType = (serverDataType) => {
834
+ switch (serverDataType) {
835
+ case "int":
836
+ case "long":
837
+ case "double":
838
+ return "number";
839
+ case "boolean":
840
+ return "boolean";
841
+ default:
842
+ return "string";
843
+ }
844
+ };
845
+ var updateColumnType = (column, formatting) => {
846
+ const { serverDataType, type = getDefaultColumnType(serverDataType) } = column;
847
+ if (typeof type === "string" || type === void 0) {
848
+ return {
849
+ ...column,
850
+ type: {
851
+ name: type,
852
+ formatting
853
+ }
854
+ };
855
+ } else {
856
+ return {
857
+ ...column,
858
+ type: {
859
+ ...type,
860
+ formatting
861
+ }
862
+ };
863
+ }
864
+ };
865
+ var updateColumnRenderProps = (column, renderer) => {
866
+ const { serverDataType, type } = column;
867
+ if (type === void 0) {
868
+ return {
869
+ ...column,
870
+ type: {
871
+ name: getDefaultColumnType(serverDataType),
872
+ renderer
873
+ }
874
+ };
875
+ } else if (isSimpleColumnType(type)) {
876
+ return {
877
+ ...column,
878
+ type: {
879
+ name: type,
880
+ renderer
881
+ }
882
+ };
883
+ } else {
884
+ return {
885
+ ...column,
886
+ type: {
887
+ ...type,
888
+ // TODO do we need to preserve any existing attributes from renderer ?
889
+ renderer
890
+ }
891
+ };
892
+ }
893
+ };
894
+ var NO_TYPE_SETTINGS = {};
895
+ var getTypeFormattingFromColumn = (column) => {
896
+ var _a;
897
+ if (isTypeDescriptor(column.type)) {
898
+ return (_a = column.type.formatting) != null ? _a : NO_TYPE_SETTINGS;
899
+ } else {
900
+ return NO_TYPE_SETTINGS;
901
+ }
902
+ };
903
+ var subscribedOnly = (columnNames) => (column) => columnNames == null ? void 0 : columnNames.includes(column.name);
904
+ var addColumnToSubscribedColumns = (subscribedColumns, availableColumns, columnName) => {
905
+ const byColName = (n = columnName) => (column) => column.name === n;
906
+ if (subscribedColumns.findIndex(byColName()) !== -1) {
907
+ throw Error(
908
+ `column-utils, addColumnToSubscribedColumns column ${columnName} is already subscribed`
909
+ );
910
+ }
911
+ const indexOfAvailableColumn = availableColumns.findIndex(byColName());
912
+ if (indexOfAvailableColumn === -1) {
913
+ throw Error(
914
+ `column-utils, addColumnToSubscribedColumns column ${columnName} is not available`
915
+ );
916
+ }
917
+ const newColumn = {
918
+ ...availableColumns[indexOfAvailableColumn]
919
+ };
920
+ let index = -1;
921
+ for (let i = indexOfAvailableColumn - 1; i >= 0; i--) {
922
+ const { name } = availableColumns[i];
923
+ index = subscribedColumns.findIndex(byColName(name));
924
+ if (index !== -1) {
925
+ break;
926
+ }
927
+ }
928
+ if (index === -1) {
929
+ return [newColumn].concat(subscribedColumns);
930
+ } else {
931
+ const results = [];
932
+ for (let i = 0; i < subscribedColumns.length; i++) {
933
+ results.push(subscribedColumns[i]);
934
+ if (i === index) {
935
+ results.push(newColumn);
936
+ index = Number.MAX_SAFE_INTEGER;
937
+ }
938
+ }
939
+ return results;
940
+ }
941
+ };
942
+ var CalculatedColumnPattern = /.*:.*:.*/;
943
+ var isCalculatedColumn = (columnName) => columnName !== void 0 && CalculatedColumnPattern.test(columnName);
944
+ var getCalculatedColumnDetails = (column) => {
945
+ if (isCalculatedColumn(column.name)) {
946
+ return column.name.split(/:=?/);
947
+ } else {
948
+ throw Error(
949
+ `column-utils, getCalculatedColumnDetails column name ${column.name} is not valid calculated column`
950
+ );
951
+ }
952
+ };
953
+ var getCalculatedColumnName = (column) => getCalculatedColumnDetails(column)[0];
954
+ var getCalculatedColumnType = (column) => getCalculatedColumnDetails(column)[1];
955
+ var getCalculatedColumnExpression = (column) => getCalculatedColumnDetails(column)[2];
956
+ var setCalculatedColumnName = (column, name) => {
957
+ const [, type, expression] = column.name.split(":");
958
+ return {
959
+ ...column,
960
+ name: `${name}:${type}:${expression}`
961
+ };
962
+ };
963
+ var setCalculatedColumnType = (column, type) => {
964
+ const [name, , expression] = column.name.split(":");
965
+ return {
966
+ ...column,
967
+ name: `${name}:${type}:${expression}`
968
+ };
969
+ };
970
+ var setCalculatedColumnExpression = (column, expression) => {
971
+ const [name, type] = column.name.split(":");
972
+ return {
973
+ ...column,
974
+ name: `${name}:${type}:=${expression}`
975
+ };
976
+ };
977
+ var moveColumnTo = (columns, column, newIndex) => {
978
+ const index = columns.findIndex((col) => col.name === column.name);
979
+ return moveItem(columns, index, newIndex);
980
+ };
981
+ function replaceColumn(columns, column) {
982
+ return columns.map((col) => col.name === column.name ? column : col);
983
+ }
984
+ var applyDefaultColumnConfig = ({ columns, table }, getDefaultColumnConfig) => {
985
+ if (typeof getDefaultColumnConfig === "function") {
986
+ return columns.map((column) => {
987
+ const config = getDefaultColumnConfig(table.table, column.name);
988
+ if (config) {
989
+ return {
990
+ ...column,
991
+ ...config
992
+ };
993
+ } else {
994
+ return column;
995
+ }
996
+ });
997
+ } else {
998
+ return columns;
999
+ }
1000
+ };
1001
+
1002
+ // src/cookie-utils.ts
1003
+ var getCookieValue = (name) => {
1004
+ var _a, _b;
1005
+ if (((_a = globalThis.document) == null ? void 0 : _a.cookie) !== void 0) {
1006
+ return (_b = globalThis.document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))) == null ? void 0 : _b.split("=")[1];
1007
+ }
1008
+ };
1009
+
1010
+ // src/component-registry.ts
1011
+ var cellRenderersMap = /* @__PURE__ */ new Map();
1012
+ var configEditorsMap = /* @__PURE__ */ new Map();
1013
+ var cellConfigPanelsMap = /* @__PURE__ */ new Map();
1014
+ var editRuleValidatorsMap = /* @__PURE__ */ new Map();
1015
+ var optionsMap = /* @__PURE__ */ new Map();
1016
+ var isTypeCompatible = (rendererType, serverDataType) => {
1017
+ if (rendererType === void 0 || rendererType === "private") {
1018
+ return true;
1019
+ } else if (Array.isArray(rendererType)) {
1020
+ return rendererType.includes(serverDataType);
1021
+ } else {
1022
+ return rendererType === serverDataType;
1023
+ }
1024
+ };
1025
+ var isCellRenderer = (type, component) => type === "cell-renderer";
1026
+ var isCellConfigPanel = (type, component) => type === "cell-config-panel";
1027
+ var isEditRuleValidator = (type, component) => type === "data-edit-validator";
1028
+ function registerComponent(componentName, component, type = "cell-renderer", options) {
1029
+ if (isCellRenderer(type, component)) {
1030
+ cellRenderersMap.set(componentName, component);
1031
+ } else if (isCellConfigPanel(type, component)) {
1032
+ cellConfigPanelsMap.set(componentName, component);
1033
+ } else if (isEditRuleValidator(type, component)) {
1034
+ editRuleValidatorsMap.set(componentName, component);
1035
+ }
1036
+ if (options) {
1037
+ optionsMap.set(componentName, options);
1038
+ }
1039
+ }
1040
+ var registerConfigurationEditor = (componentName, configurationEditor) => {
1041
+ configEditorsMap.set(componentName, configurationEditor);
1042
+ };
1043
+ var getRegisteredCellRenderers = (serverDataType) => {
1044
+ const rendererNames = Array.from(cellRenderersMap.keys());
1045
+ const allRenderers = rendererNames.map((name) => ({
1046
+ name,
1047
+ ...optionsMap.get(name)
1048
+ }));
1049
+ if (serverDataType) {
1050
+ return allRenderers.filter(
1051
+ (renderer) => isTypeCompatible(renderer.serverDataType, serverDataType)
1052
+ );
1053
+ } else {
1054
+ return allRenderers;
1055
+ }
1056
+ };
1057
+ var getCellRendererOptions = (renderName) => optionsMap.get(renderName);
1058
+ function getCellRenderer(column, cellType = "cell") {
1059
+ if (cellType === "cell") {
1060
+ return dataCellRenderer(column);
1061
+ } else if (cellType === "col-label" && column.colHeaderLabelRenderer) {
1062
+ return cellRenderersMap.get(column.colHeaderLabelRenderer);
1063
+ } else if (cellType === "col-content" && column.colHeaderContentRenderer) {
1064
+ return cellRenderersMap.get(column.colHeaderContentRenderer);
1065
+ }
1066
+ }
1067
+ function dataCellRenderer(column) {
1068
+ if (isTypeDescriptor(column.type)) {
1069
+ const { renderer } = column.type;
1070
+ if (isColumnTypeRenderer(renderer)) {
1071
+ return cellRenderersMap.get(renderer.name);
1072
+ }
1073
+ } else if (column.serverDataType === "boolean") {
1074
+ return cellRenderersMap.get("checkbox-cell");
1075
+ } else if (column.editable) {
1076
+ return cellRenderersMap.get("input-cell");
1077
+ }
1078
+ }
1079
+ function getConfigurationEditor(configEditor = "") {
1080
+ return configEditorsMap.get(configEditor);
1081
+ }
1082
+ function getCellConfigPanelRenderer(name) {
1083
+ return cellConfigPanelsMap.get(name);
1084
+ }
1085
+ function getEditRuleValidator(name) {
1086
+ return editRuleValidatorsMap.get(name);
1087
+ }
1088
+
1089
+ // src/range-utils.ts
1090
+ var NULL_RANGE = { from: 0, to: 0 };
1091
+ function getFullRange({ from, to }, bufferSize = 0, rowCount = Number.MAX_SAFE_INTEGER) {
1092
+ if (bufferSize === 0) {
1093
+ if (rowCount < from) {
1094
+ return { from: 0, to: 0 };
1095
+ } else {
1096
+ return { from, to: Math.min(to, rowCount) };
1097
+ }
1098
+ } else if (from === 0) {
1099
+ return { from, to: Math.min(to + bufferSize, rowCount) };
1100
+ } else {
1101
+ const rangeSize = to - from;
1102
+ const buff = Math.round(bufferSize / 2);
1103
+ const shortfallBefore = from - buff < 0;
1104
+ const shortFallAfter = rowCount - (to + buff) < 0;
1105
+ if (shortfallBefore && shortFallAfter) {
1106
+ return { from: 0, to: rowCount };
1107
+ } else if (shortfallBefore) {
1108
+ return { from: 0, to: rangeSize + bufferSize };
1109
+ } else if (shortFallAfter) {
1110
+ return {
1111
+ from: Math.max(0, rowCount - (rangeSize + bufferSize)),
1112
+ to: rowCount
1113
+ };
1114
+ } else {
1115
+ return { from: from - buff, to: to + buff };
1116
+ }
1117
+ }
1118
+ }
1119
+ function resetRange({ from, to, bufferSize = 0 }) {
1120
+ return {
1121
+ from: 0,
1122
+ to: to - from,
1123
+ bufferSize,
1124
+ reset: true
1125
+ };
1126
+ }
1127
+ var withinRange = (value, { from, to }) => value >= from && value < to;
1128
+ var rangeNewItems = ({ from: from1, to: to1 }, newRange) => {
1129
+ const { from: from2, to: to2 } = newRange;
1130
+ const noOverlap = from2 >= to1 || to2 <= from1;
1131
+ const newFullySubsumesOld = from2 < from1 && to2 > to1;
1132
+ return noOverlap || newFullySubsumesOld ? newRange : to2 > to1 ? { from: to1, to: to2 } : { from: from2, to: from1 };
1133
+ };
1134
+ var WindowRange = class {
1135
+ constructor(from, to) {
1136
+ this.from = from;
1137
+ this.to = to;
1138
+ }
1139
+ isWithin(index) {
1140
+ return withinRange(index, this);
1141
+ }
1142
+ //find the overlap of this range and a new one
1143
+ overlap(from, to) {
1144
+ return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)];
1145
+ }
1146
+ copy() {
1147
+ return new WindowRange(this.from, this.to);
1148
+ }
1149
+ };
1150
+
1151
+ // src/DataWindow.ts
1152
+ var { KEY } = metadataKeys;
1153
+ var DataWindow = class {
1154
+ constructor({ from, to }) {
1155
+ this.rowCount = 0;
1156
+ this.setRowCount = (rowCount) => {
1157
+ if (rowCount < this.data.length) {
1158
+ this.data.length = rowCount;
1159
+ }
1160
+ this.rowCount = rowCount;
1161
+ };
1162
+ this.range = new WindowRange(from, to);
1163
+ this.data = new Array(to - from);
1164
+ }
1165
+ // return true if existing row was updated
1166
+ add(data) {
1167
+ const [index] = data;
1168
+ if (this.isWithinRange(index)) {
1169
+ const internalIndex = index - this.range.from;
1170
+ const isUpdate = this.data[internalIndex] !== void 0;
1171
+ this.data[internalIndex] = data;
1172
+ return isUpdate;
1173
+ } else {
1174
+ return false;
1175
+ }
1176
+ }
1177
+ getAtIndex(index) {
1178
+ return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
1179
+ }
1180
+ getByKey(key) {
1181
+ return this.data.find((row) => row[KEY] === key);
1182
+ }
1183
+ isWithinRange(index) {
1184
+ return this.range.isWithin(index) && index <= this.rowCount;
1185
+ }
1186
+ setRange(from, to) {
1187
+ if (from !== this.range.from || to !== this.range.to) {
1188
+ const [overlapFrom, overlapTo] = this.range.overlap(from, to);
1189
+ const newData = new Array(to - from);
1190
+ for (let i = overlapFrom; i < overlapTo; i++) {
1191
+ const data = this.getAtIndex(i);
1192
+ if (data) {
1193
+ const index = i - from;
1194
+ newData[index] = data;
1195
+ }
1196
+ }
1197
+ this.data = newData;
1198
+ this.range.from = from;
1199
+ this.range.to = to;
1200
+ }
1201
+ }
1202
+ hasData(from, to) {
1203
+ const offset = this.range.from;
1204
+ const start = from - offset;
1205
+ const end = Math.min(to - offset - 1, this.rowCount - 1);
1206
+ return this.data[start] !== void 0 && this.data[end] !== void 0;
1207
+ }
1208
+ getData(from, to) {
1209
+ var _a;
1210
+ const { from: clientFrom, to: clientTo } = this.range;
1211
+ const startOffset = Math.max(0, from - clientFrom);
1212
+ const endOffset = Math.min(to - clientFrom, (_a = this.rowCount) != null ? _a : to);
1213
+ return this.data.slice(startOffset, endOffset);
1214
+ }
1215
+ };
1216
+
1217
+ // src/common-types.ts
1218
+ var MEASURES = {
1219
+ horizontal: {
1220
+ positionProp: "left",
1221
+ sizeProp: "width"
1222
+ },
1223
+ vertical: {
1224
+ positionProp: "top",
1225
+ sizeProp: "height"
1226
+ }
1227
+ };
1228
+
1229
+ // src/data-utils.ts
1230
+ var UP1 = "up1";
1231
+ var UP2 = "up2";
1232
+ var DOWN1 = "down1";
1233
+ var DOWN2 = "down2";
1234
+ var isValidNumber = (n) => typeof n === "number" && isFinite(n);
1235
+ var EMPTY = {};
1236
+ var shallowEquals = (o1 = EMPTY, o2 = EMPTY) => {
1237
+ const props1 = Object.keys(o1);
1238
+ const props2 = Object.keys(o2);
1239
+ return props1.length === props2.length && props1.every((key) => o1[key] === o2[key]);
1240
+ };
1241
+ function getMovingValueDirection(newValue, direction, prevValue, decimalPlaces) {
1242
+ if (newValue === void 0) {
1243
+ return "";
1244
+ }
1245
+ if (!isFinite(newValue) || prevValue === void 0 || direction === void 0) {
1246
+ return "";
1247
+ } else {
1248
+ let diff = newValue - prevValue;
1249
+ if (diff) {
1250
+ if (typeof decimalPlaces === "number") {
1251
+ diff = +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);
1252
+ }
1253
+ }
1254
+ if (diff) {
1255
+ if (direction === "") {
1256
+ if (diff < 0) {
1257
+ return DOWN1;
1258
+ } else {
1259
+ return UP1;
1260
+ }
1261
+ } else if (diff > 0) {
1262
+ if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {
1263
+ return UP1;
1264
+ } else {
1265
+ return UP2;
1266
+ }
1267
+ } else if (direction === UP1 || direction === UP2 || direction === DOWN2) {
1268
+ return DOWN1;
1269
+ } else {
1270
+ return DOWN2;
1271
+ }
1272
+ } else {
1273
+ return "";
1274
+ }
1275
+ }
1276
+ }
1277
+
1278
+ // src/date-utils.ts
1279
+ var isDatePattern = (pattern) => pattern === "dd.mm.yyyy";
1280
+ var isTimePattern = (pattern) => pattern === "kk:mm:ss";
1281
+ var isDateTimePattern = (pattern) => pattern !== void 0 && isDatePattern(pattern) || isTimePattern(pattern);
1282
+ var leadZero = (digit) => {
1283
+ return digit < 10 ? `0` + digit : digit.toString();
1284
+ };
1285
+ var formatDate = (date, format = "dd.mm.yyyy") => {
1286
+ if (isDatePattern(format)) {
1287
+ const dd = date.getDate();
1288
+ const mm = date.getMonth();
1289
+ const yyyy = date.getFullYear();
1290
+ return `${leadZero(dd)}.${leadZero(mm + 1)}.${yyyy}`;
1291
+ } else if (isTimePattern(format)) {
1292
+ const hh = date.getHours();
1293
+ const mm = date.getMinutes();
1294
+ const ss = date.getSeconds();
1295
+ return `${leadZero(hh)}:${leadZero(mm)}:${leadZero(ss)}`;
1296
+ } else {
1297
+ return date.toUTCString();
1298
+ }
1299
+ };
1300
+
1301
+ // src/logging-utils.ts
1302
+ var logLevels = ["error", "warn", "info", "debug"];
1303
+ var isValidLogLevel = (value) => typeof value === "string" && logLevels.includes(value);
1304
+ var DEFAULT_LOG_LEVEL = "error";
1305
+ var NO_OP = () => void 0;
1306
+ var DEFAULT_DEBUG_LEVEL = false ? "error" : "info";
1307
+ var { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings();
1308
+ var logger = (category) => {
1309
+ const debugEnabled2 = loggingLevel === "debug";
1310
+ const infoEnabled = debugEnabled2 || loggingLevel === "info";
1311
+ const warnEnabled = infoEnabled || loggingLevel === "warn";
1312
+ const errorEnabled = warnEnabled || loggingLevel === "error";
1313
+ const info = infoEnabled ? (message) => console.info(`[${category}] ${message}`) : NO_OP;
1314
+ const warn = warnEnabled ? (message) => console.warn(`[${category}] ${message}`) : NO_OP;
1315
+ const debug2 = debugEnabled2 ? (message) => console.debug(`[${category}] ${message}`) : NO_OP;
1316
+ const error = errorEnabled ? (message) => console.error(`[${category}] ${message}`) : NO_OP;
1317
+ if (false) {
1318
+ return {
1319
+ errorEnabled,
1320
+ error
1321
+ };
1322
+ } else {
1323
+ return {
1324
+ debugEnabled: debugEnabled2,
1325
+ infoEnabled,
1326
+ warnEnabled,
1327
+ errorEnabled,
1328
+ info,
1329
+ warn,
1330
+ debug: debug2,
1331
+ error
1332
+ };
1333
+ }
1334
+ };
1335
+ function getLoggingSettings() {
1336
+ if (typeof loggingSettings !== "undefined") {
1337
+ return loggingSettings;
1338
+ } else {
1339
+ return {
1340
+ loggingLevel: getLoggingLevelFromCookie()
1341
+ };
1342
+ }
1343
+ }
1344
+ function getLoggingLevelFromCookie() {
1345
+ const value = getCookieValue("vuu-logging-level");
1346
+ if (isValidLogLevel(value)) {
1347
+ return value;
1348
+ } else {
1349
+ return DEFAULT_LOG_LEVEL;
1350
+ }
1351
+ }
1352
+ var getLoggingConfigForWorker = () => {
1353
+ return `const loggingSettings = { loggingLevel: "${getLoggingLevelFromCookie()}"};`;
1354
+ };
1355
+
1356
+ // src/debug-utils.ts
1357
+ var { debug, debugEnabled } = logger("range-monitor");
1358
+ var RangeMonitor = class {
1359
+ constructor(source) {
1360
+ this.source = source;
1361
+ this.range = { from: 0, to: 0 };
1362
+ this.timestamp = 0;
1363
+ }
1364
+ isSet() {
1365
+ return this.timestamp !== 0;
1366
+ }
1367
+ set({ from, to }) {
1368
+ const { timestamp } = this;
1369
+ this.range.from = from;
1370
+ this.range.to = to;
1371
+ this.timestamp = performance.now();
1372
+ if (timestamp) {
1373
+ debugEnabled && debug(
1374
+ `<${this.source}> [${from}-${to}], ${(this.timestamp - timestamp).toFixed(0)} ms elapsed`
1375
+ );
1376
+ } else {
1377
+ return 0;
1378
+ }
1379
+ }
1380
+ };
1381
+
1382
+ // src/html-utils.ts
1383
+ var createEl = (elementType, className, textContent) => {
1384
+ const el = document.createElement(elementType);
1385
+ if (className) {
1386
+ el.className = className;
1387
+ }
1388
+ if (textContent) {
1389
+ el.textContent = textContent;
1390
+ }
1391
+ return el;
1392
+ };
1393
+ var getFocusableElement = (el, tabIndex) => {
1394
+ if (el) {
1395
+ if (el.hasAttribute("tabindex")) {
1396
+ const rootTabIndex = parseInt(el.getAttribute("tabindex"));
1397
+ if (!isNaN(rootTabIndex) && (tabIndex === void 0 || rootTabIndex === tabIndex)) {
1398
+ return el;
1399
+ }
1400
+ }
1401
+ const focusableEl = typeof tabIndex === "number" ? el.querySelector(`[tabindex="${tabIndex}"]`) : el.querySelector("[tabindex]");
1402
+ if (focusableEl) {
1403
+ return focusableEl;
1404
+ }
1405
+ }
1406
+ };
1407
+ var getElementDataIndex = (el) => {
1408
+ if (el) {
1409
+ const index = parseInt(el.dataset.index || "");
1410
+ if (!isNaN(index)) {
1411
+ return index;
1412
+ }
1413
+ }
1414
+ return -1;
1415
+ };
1416
+ var getClosest = (el, dataProperty) => el.closest(`[data-${dataProperty}]`);
1417
+ var getClosestIndexItem = (el) => getClosest(el, "index");
1418
+ function getElementByDataIndex(container, index, throwIfNotFound = false) {
1419
+ if (container === null && throwIfNotFound) {
1420
+ throw Error("html-utils getElementByDataIndex, container is null");
1421
+ }
1422
+ const element = container == null ? void 0 : container.querySelector(
1423
+ `[data-index="${index}"]`
1424
+ );
1425
+ if (element) {
1426
+ return element;
1427
+ } else if (throwIfNotFound) {
1428
+ throw Error(
1429
+ "html-utils getElementByDataIndex, Item not found with data-index='${index}'"
1430
+ );
1431
+ } else {
1432
+ return void 0;
1433
+ }
1434
+ }
1435
+ var focusFirstFocusableElement = (el, tabIndex) => {
1436
+ requestAnimationFrame(() => {
1437
+ const focusableElement = getFocusableElement(el, tabIndex);
1438
+ if (focusableElement) {
1439
+ focusableElement.focus();
1440
+ }
1441
+ });
1442
+ };
1443
+ var isSelectableElement = (el) => {
1444
+ const item = el == null ? void 0 : el.closest("[data-index]");
1445
+ if (!item || item.ariaDisabled || item.dataset.selectable === "false" || item.querySelector('[data-selectable="false"],[aria-disabled="true"]')) {
1446
+ return false;
1447
+ } else {
1448
+ return true;
1449
+ }
1450
+ };
1451
+ var size;
1452
+ function getScrollbarSize() {
1453
+ if (size === void 0) {
1454
+ let outer = document.createElement("div");
1455
+ outer.className = "scrollable-content";
1456
+ outer.style.width = "50px";
1457
+ outer.style.height = "50px";
1458
+ outer.style.overflowY = "scroll";
1459
+ outer.style.position = "absolute";
1460
+ outer.style.top = "-200px";
1461
+ outer.style.left = "-200px";
1462
+ const inner = document.createElement("div");
1463
+ inner.style.height = "100px";
1464
+ inner.style.width = "100%";
1465
+ outer.appendChild(inner);
1466
+ document.body.appendChild(outer);
1467
+ const outerWidth = outer.offsetWidth;
1468
+ const innerWidth = inner.offsetWidth;
1469
+ document.body.removeChild(outer);
1470
+ size = outerWidth - innerWidth;
1471
+ outer = null;
1472
+ }
1473
+ return size;
1474
+ }
1475
+ var dispatchMouseEvent = (el, type) => {
1476
+ const evt = new MouseEvent(type, {
1477
+ view: window,
1478
+ bubbles: true,
1479
+ cancelable: true
1480
+ });
1481
+ el.dispatchEvent(evt);
1482
+ };
1483
+ var dispatchCustomEvent = (el, type) => {
1484
+ const evt = new Event(type, {
1485
+ bubbles: true,
1486
+ cancelable: true
1487
+ });
1488
+ el.dispatchEvent(evt);
1489
+ };
1490
+
1491
+ // src/event-emitter.ts
1492
+ function isArrayOfListeners(listeners) {
1493
+ return Array.isArray(listeners);
1494
+ }
1495
+ function isOnlyListener(listeners) {
1496
+ return !Array.isArray(listeners);
1497
+ }
1498
+ var _events;
1499
+ var EventEmitter = class {
1500
+ constructor() {
1501
+ __privateAdd(this, _events, /* @__PURE__ */ new Map());
1502
+ }
1503
+ addListener(event, listener) {
1504
+ const listeners = __privateGet(this, _events).get(event);
1505
+ if (!listeners) {
1506
+ __privateGet(this, _events).set(event, listener);
1507
+ } else if (isArrayOfListeners(listeners)) {
1508
+ listeners.push(listener);
1509
+ } else if (isOnlyListener(listeners)) {
1510
+ __privateGet(this, _events).set(event, [listeners, listener]);
1511
+ }
1512
+ }
1513
+ removeListener(event, listener) {
1514
+ if (!__privateGet(this, _events).has(event)) {
1515
+ return;
1516
+ }
1517
+ const listenerOrListeners = __privateGet(this, _events).get(event);
1518
+ let position = -1;
1519
+ if (listenerOrListeners === listener) {
1520
+ __privateGet(this, _events).delete(event);
1521
+ } else if (Array.isArray(listenerOrListeners)) {
1522
+ for (let i = length; i-- > 0; ) {
1523
+ if (listenerOrListeners[i] === listener) {
1524
+ position = i;
1525
+ break;
1526
+ }
1527
+ }
1528
+ if (position < 0) {
1529
+ return;
1530
+ }
1531
+ if (listenerOrListeners.length === 1) {
1532
+ listenerOrListeners.length = 0;
1533
+ __privateGet(this, _events).delete(event);
1534
+ } else {
1535
+ listenerOrListeners.splice(position, 1);
1536
+ }
1537
+ }
1538
+ }
1539
+ removeAllListeners(event) {
1540
+ if (event && __privateGet(this, _events).has(event)) {
1541
+ __privateGet(this, _events).delete(event);
1542
+ } else if (event === void 0) {
1543
+ __privateGet(this, _events).clear();
1544
+ }
1545
+ }
1546
+ emit(event, ...args) {
1547
+ if (__privateGet(this, _events)) {
1548
+ const handler = __privateGet(this, _events).get(event);
1549
+ if (handler) {
1550
+ this.invokeHandler(handler, args);
1551
+ }
1552
+ }
1553
+ }
1554
+ once(event, listener) {
1555
+ const handler = (...args) => {
1556
+ this.removeListener(event, handler);
1557
+ listener(...args);
1558
+ };
1559
+ this.on(event, handler);
1560
+ }
1561
+ on(event, listener) {
1562
+ this.addListener(event, listener);
1563
+ }
1564
+ hasListener(event, listener) {
1565
+ const listeners = __privateGet(this, _events).get(event);
1566
+ if (Array.isArray(listeners)) {
1567
+ return listeners.includes(listener);
1568
+ } else {
1569
+ return listeners === listener;
1570
+ }
1571
+ }
1572
+ invokeHandler(handler, args) {
1573
+ if (isArrayOfListeners(handler)) {
1574
+ handler.slice().forEach((listener) => this.invokeHandler(listener, args));
1575
+ } else {
1576
+ switch (args.length) {
1577
+ case 0:
1578
+ handler();
1579
+ break;
1580
+ case 1:
1581
+ handler(args[0]);
1582
+ break;
1583
+ case 2:
1584
+ handler(args[0], args[1]);
1585
+ break;
1586
+ default:
1587
+ handler.call(null, ...args);
1588
+ }
1589
+ }
1590
+ }
1591
+ };
1592
+ _events = new WeakMap();
1593
+
1594
+ // src/round-decimal.ts
1595
+ var PUNCTUATION_STR = String.fromCharCode(8200);
1596
+ var DIGIT_STR = String.fromCharCode(8199);
1597
+ var DECIMALS_AUTO = -1;
1598
+ var Space = {
1599
+ DIGIT: DIGIT_STR,
1600
+ TWO_DIGITS: DIGIT_STR + DIGIT_STR,
1601
+ THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,
1602
+ FULL_PADDING: [
1603
+ null,
1604
+ PUNCTUATION_STR + DIGIT_STR,
1605
+ PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,
1606
+ PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,
1607
+ PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR
1608
+ ]
1609
+ };
1610
+ var Zero = {
1611
+ DIGIT: "0",
1612
+ TWO_DIGITS: "00",
1613
+ THREE_DIGITS: "000",
1614
+ FULL_PADDING: [null, "0", "00", "000", "0000"]
1615
+ };
1616
+ function padLeft(value, maxLength = 6) {
1617
+ return (LEADING_FILL + value).slice(-maxLength);
1618
+ }
1619
+ var LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR;
1620
+ var Align = {
1621
+ Right: "right",
1622
+ Center: "center",
1623
+ Left: "left"
1624
+ };
1625
+ function pad(n, dp, Pad) {
1626
+ let len = n.length;
1627
+ const diff = dp - len;
1628
+ if (diff > 0) {
1629
+ if (diff === 1) {
1630
+ n = n + Pad.DIGIT;
1631
+ } else if (diff === 2) {
1632
+ n = n + Pad.TWO_DIGITS;
1633
+ } else if (diff === 3) {
1634
+ n = n + Pad.THREE_DIGITS;
1635
+ }
1636
+ } else {
1637
+ if (diff < 0) {
1638
+ n = n.slice(0, dp);
1639
+ len = dp;
1640
+ }
1641
+ if (Pad === Space && n.charAt(len - 1) === "0") {
1642
+ n = n.replace(/0+$/, "");
1643
+ return pad(n, dp, Pad);
1644
+ }
1645
+ }
1646
+ return n;
1647
+ }
1648
+ function roundDecimal(value, align = Align.Right, decimals = 4, zeroPad, alignOnDecimals) {
1649
+ if (value === void 0 || typeof value !== "number" || isNaN(value)) {
1650
+ return "";
1651
+ }
1652
+ let integral, fraction, Pad;
1653
+ const [part1, part2 = ""] = value.toString().split(".");
1654
+ const actualDecimals = part2.length;
1655
+ integral = parseFloat(part1).toLocaleString();
1656
+ if (align === Align.Left && alignOnDecimals) {
1657
+ integral = padLeft(integral);
1658
+ }
1659
+ if (decimals === DECIMALS_AUTO || actualDecimals === decimals) {
1660
+ fraction = part2;
1661
+ } else if (actualDecimals > decimals) {
1662
+ fraction = parseFloat("0." + part2).toFixed(decimals).slice(2);
1663
+ } else {
1664
+ if (Pad = zeroPad ? Zero : alignOnDecimals && align !== Align.Left ? Space : null) {
1665
+ if (actualDecimals === 0) {
1666
+ fraction = Pad.FULL_PADDING[decimals];
1667
+ } else {
1668
+ fraction = pad(part2, decimals, Pad);
1669
+ }
1670
+ } else {
1671
+ fraction = part2;
1672
+ }
1673
+ }
1674
+ return integral + (fraction ? "." + fraction : "");
1675
+ }
1676
+
1677
+ // src/formatting-utils.ts
1678
+ var DEFAULT_NUMERIC_FORMAT = {};
1679
+ var defaultValueFormatter = (value) => value == null ? "" : typeof value === "string" ? value : value.toString();
1680
+ var dateFormatter = (column) => {
1681
+ const { type } = column;
1682
+ let pattern = "dd.mm.yyyy";
1683
+ if (isTypeDescriptor(type) && type.formatting) {
1684
+ if (isDateTimePattern(type.formatting.pattern)) {
1685
+ pattern = type.formatting.pattern;
1686
+ }
1687
+ }
1688
+ return (value) => {
1689
+ if (typeof value === "number" && value !== 0) {
1690
+ return formatDate(new Date(value), pattern);
1691
+ } else {
1692
+ return "";
1693
+ }
1694
+ };
1695
+ };
1696
+ var numericFormatter = ({
1697
+ align = "right",
1698
+ type
1699
+ }) => {
1700
+ var _a;
1701
+ if (type === void 0 || typeof type === "string") {
1702
+ return defaultValueFormatter;
1703
+ } else {
1704
+ const {
1705
+ alignOnDecimals = false,
1706
+ decimals,
1707
+ zeroPad = false
1708
+ } = (_a = type.formatting) != null ? _a : DEFAULT_NUMERIC_FORMAT;
1709
+ return (value) => {
1710
+ if (typeof value === "string" && (value.startsWith("\u03A3") || value.startsWith("["))) {
1711
+ return value;
1712
+ }
1713
+ const number = typeof value === "number" ? value : typeof value === "string" ? parseFloat(value) : void 0;
1714
+ return roundDecimal(number, align, decimals, zeroPad, alignOnDecimals);
1715
+ };
1716
+ }
1717
+ };
1718
+ var mapFormatter = (map) => {
1719
+ return (value) => {
1720
+ var _a;
1721
+ return (_a = map[value]) != null ? _a : "";
1722
+ };
1723
+ };
1724
+ var getValueFormatter = (column, serverDataType = column.serverDataType) => {
1725
+ if (isDateTimeColumn(column)) {
1726
+ return dateFormatter(column);
1727
+ }
1728
+ const { type } = column;
1729
+ if (isTypeDescriptor(type) && isMappedValueTypeRenderer(type == null ? void 0 : type.renderer)) {
1730
+ return mapFormatter(type.renderer.map);
1731
+ } else if (serverDataType === "string" || serverDataType === "char") {
1732
+ return (value) => value;
1733
+ } else if (serverDataType === "double") {
1734
+ return numericFormatter(column);
1735
+ }
1736
+ return defaultValueFormatter;
1737
+ };
1738
+
1739
+ // src/getUniqueId.ts
1740
+ var getUniqueId = () => `hw-${Math.round(Math.random() * 1e5)}`;
1741
+
1742
+ // src/group-utils.ts
1743
+ function addGroupColumn(groupBy, column) {
1744
+ if (groupBy) {
1745
+ return groupBy.concat(column.name);
1746
+ } else {
1747
+ return [column.name];
1748
+ }
1749
+ }
1750
+
1751
+ // src/input-utils.ts
1752
+ var isCharacterKey = (key) => key.length === 1;
1753
+ var isQuoteKey = (evt) => {
1754
+ return evt.key === '"' || evt.key === "'";
1755
+ };
1756
+
1757
+ // src/invariant.ts
1758
+ function invariant(condition, message) {
1759
+ if (!condition) {
1760
+ const error = new Error(message);
1761
+ error.name = "Invariant Violation";
1762
+ error.framesToPop = 1;
1763
+ throw error;
1764
+ }
1765
+ }
1766
+
1767
+ // src/itemToString.ts
1768
+ var isPlainObject = (obj) => Object.prototype.toString.call(obj) === "[object Object]";
1769
+ function itemToString(item) {
1770
+ if (typeof item === "string") {
1771
+ return item;
1772
+ } else if (!isPlainObject(item)) {
1773
+ return String(item);
1774
+ }
1775
+ if (Object.prototype.hasOwnProperty.call(item, "label")) {
1776
+ return String(item.label);
1777
+ }
1778
+ console.warn(
1779
+ [
1780
+ "itemToString: you've likely forgotten to set the label prop on the item object.",
1781
+ "You can also provide your own `itemToString` implementation."
1782
+ ].join("\n")
1783
+ );
1784
+ return "";
1785
+ }
1786
+
1787
+ // src/json-utils.ts
1788
+ var { COUNT } = metadataKeys;
1789
+ var isJsonData = (value) => typeof value === "object" && value !== null;
1790
+ var vuuRowDataItemTypes = ["boolean", "number", "string"];
1791
+ var isVuuRowDataItem = (value) => vuuRowDataItemTypes.includes(typeof value);
1792
+ var typeofVuuDataItem = (value) => typeof value === "boolean" ? "boolean" : typeof value === "number" ? "number" : "string";
1793
+ var getCellValue = (attribute, attributeValue) => {
1794
+ if (isJsonData(attributeValue)) {
1795
+ return { attribute: `${attribute}+`, attributeValue: "", type: "json" };
1796
+ } else if (attributeValue === void 0) {
1797
+ return {
1798
+ attribute,
1799
+ attributeValue: "undefined",
1800
+ type: "string"
1801
+ };
1802
+ } else if (isVuuRowDataItem(attributeValue)) {
1803
+ return {
1804
+ attribute,
1805
+ attributeValue,
1806
+ type: typeofVuuDataItem(attributeValue)
1807
+ };
1808
+ } else {
1809
+ throw Error(`unsupported type ${typeof attributeValue} in JSON`);
1810
+ }
1811
+ };
1812
+ var jsonColumnType = {
1813
+ name: "json",
1814
+ renderer: {
1815
+ name: "json"
1816
+ }
1817
+ };
1818
+ var jsonToDataSourceRows = (json) => {
1819
+ const cols = [];
1820
+ cols.push(
1821
+ {
1822
+ name: "col 1",
1823
+ type: jsonColumnType
1824
+ },
1825
+ {
1826
+ name: "col 2",
1827
+ type: jsonColumnType
1828
+ }
1829
+ );
1830
+ const rows = [];
1831
+ addChildValues(rows, json, cols);
1832
+ return [cols, rows];
1833
+ };
1834
+ var addChildValues = (rows, json, cols, index = { value: 0 }, keyBase = "$root", depth = 0) => {
1835
+ let leafCount = 0;
1836
+ let rowCount = 0;
1837
+ if (depth === cols.length - 1) {
1838
+ cols.push({
1839
+ name: `col ${cols.length + 1}`,
1840
+ hidden: true,
1841
+ type: jsonColumnType
1842
+ });
1843
+ }
1844
+ const columnEntries = Object.entries(json);
1845
+ for (let i = 0; i < columnEntries.length; i++, index.value += 1) {
1846
+ const [key, value] = columnEntries[i];
1847
+ const { attribute, attributeValue, type } = getCellValue(key, value);
1848
+ const isLeaf = type !== "json";
1849
+ const blanks = Array(depth).fill("");
1850
+ const fullKey = `${keyBase}|${key}`;
1851
+ const row = [index.value, index.value, isLeaf, false, depth, 0, fullKey, 0, ...blanks, attribute, attributeValue];
1852
+ rows.push(row);
1853
+ rowCount += 1;
1854
+ if (isJsonData(value)) {
1855
+ const [nestedLeafCount, nestedRowCount] = addChildValues(
1856
+ rows,
1857
+ value,
1858
+ cols,
1859
+ { value: index.value + 1 },
1860
+ fullKey,
1861
+ depth + 1
1862
+ );
1863
+ row[COUNT] = nestedLeafCount;
1864
+ leafCount += nestedLeafCount;
1865
+ rowCount += nestedRowCount;
1866
+ index.value += nestedRowCount;
1867
+ } else {
1868
+ leafCount += 1;
1869
+ }
1870
+ }
1871
+ return [leafCount, rowCount];
1872
+ };
1873
+
1874
+ // src/keyboard-utils.ts
1875
+ var ArrowUp = "ArrowUp";
1876
+ var ArrowDown = "ArrowDown";
1877
+ var ArrowLeft = "ArrowLeft";
1878
+ var ArrowRight = "ArrowRight";
1879
+ var Enter = "Enter";
1880
+ var Escape = "Escape";
1881
+ var Home = "Home";
1882
+ var End = "End";
1883
+ var PageUp = "PageUp";
1884
+ var PageDown = "PageDown";
1885
+ var Space2 = " ";
1886
+ var Tab = "Tab";
1887
+
1888
+ // src/keyset.ts
1889
+ var KeySet = class {
1890
+ constructor(range) {
1891
+ this.keys = /* @__PURE__ */ new Map();
1892
+ this.free = [];
1893
+ this.nextKeyValue = 0;
1894
+ this.reset(range);
1895
+ }
1896
+ next() {
1897
+ if (this.free.length > 0) {
1898
+ return this.free.pop();
1899
+ } else {
1900
+ return this.nextKeyValue++;
1901
+ }
1902
+ }
1903
+ reset({ from, to }) {
1904
+ this.keys.forEach((keyValue, rowIndex) => {
1905
+ if (rowIndex < from || rowIndex >= to) {
1906
+ this.free.push(keyValue);
1907
+ this.keys.delete(rowIndex);
1908
+ }
1909
+ });
1910
+ const size2 = to - from;
1911
+ if (this.keys.size + this.free.length > size2) {
1912
+ this.free.length = Math.max(0, size2 - this.keys.size);
1913
+ }
1914
+ for (let rowIndex = from; rowIndex < to; rowIndex++) {
1915
+ if (!this.keys.has(rowIndex)) {
1916
+ const nextKeyValue = this.next();
1917
+ this.keys.set(rowIndex, nextKeyValue);
1918
+ }
1919
+ }
1920
+ if (this.nextKeyValue > this.keys.size) {
1921
+ this.nextKeyValue = this.keys.size;
1922
+ }
1923
+ }
1924
+ keyFor(rowIndex) {
1925
+ const key = this.keys.get(rowIndex);
1926
+ if (key === void 0) {
1927
+ console.log(`key not found
3
1928
  keys: ${this.toDebugString()}
4
1929
  free : ${this.free.join(",")}
5
- `),Error(`KeySet, no key found for rowIndex ${t}`);return n}toDebugString(){return Array.from(this.keys.entries()).map((t,n)=>`${t}=>${n}`).join(",")}};var Do=e=>e!==void 0&&"children"in e;var Ro=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e));for(;e--;){let r=n[e]&63;r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r<63?t+="_":t+="-"}return t};function wo(e,t){let n;return(...r)=>{clearTimeout(n),n=window.setTimeout(()=>e(...r),t)}}function Eo(e,t){let n=!1,r;function o(){r==null?n=!1:(e(...r),r=void 0,setTimeout(o,t))}return(...i)=>{n?r=i:(e(...i),n=!0,setTimeout(o,t))}}var{IDX:ut}=C,So=e=>[t=>t[ut]*e,t=>Math.floor(t/e)],Lo=(e,t,n)=>[r=>{let o=n.current*t;return r[ut]*e-o},r=>{let o=n.current*t;return Math.floor((r+o)/e)}];var j=[],{SELECTED:lt}=C,d={False:0,True:1,First:2,Last:4},Fo=e=>(e[lt]&d.True)===d.True,Po=e=>e!==void 0&&(e[lt]&d.Last)===d.Last,Vo=(e,t)=>{let n=typeof e=="number"?e:e[0],r=typeof t=="number"?t:t[0];return n-r},ko=(e,t,n,r,o=!1)=>e==="single"||(e==="extended"||e==="checkbox")&&!o&&!r||!r&&!o?j:!r&&o?Io(t,n):j,Ao=(e,t)=>{for(let n=0;n<e.length;n++){let r=e[n];if(typeof r=="number"){if(r===t-1)return!0;if(r>t)return!1}else{if(r[0]===t+1||r[1]===t-1)return!0;if(r[0]>t)return!1}}return!1},vo=(e,t)=>{for(let n=0;n<e.length;n++){let r=e[n];if(typeof r=="number"){if(r===t-1){let o=e[n+1];if(o===t+1){let i=[r,o];return e.slice(0,n).concat([i]).concat(e.slice(n+2))}else{let i=[r,t];return e.slice(0,n).concat([i]).concat(e.slice(n+1))}}else if(r>t)break}else if(r[0]===t+1){let o=[t,r[1]];return e.slice(0,n).concat([o]).concat(e.slice(n+1))}else if(r[1]===t-1){let o=e[n+1];if(Array.isArray(o)&&o[0]===t+1){let i=[r[0],o[1]];return e.slice(0,n).concat([i]).concat(e.slice(n+2))}else if(typeof o=="number"&&o===t+1){let i=[r[0],o];return e.slice(0,n).concat([i]).concat(e.slice(n+2))}else{let i=[r[0],t];return e.slice(0,n).concat([i]).concat(e.slice(n+1))}}}return e},Mo=(e,t,n,r,o=!1,i=-1)=>{let s=e==="single",u=e==="extended"||e==="checkbox",l=s||u&&!o&&!r;if(e==="none")return j;if(l)return[n];if(r){if(t.length===0)return[n];{let a=n>i?[i,n]:[n,i];return $o(t,a)}}else if(!r)return Ao(t,n)?vo(t,n):t==null?void 0:t.concat(n).sort(Vo);return j};function Io(e,t){if(e.includes(t))return e.filter(n=>n!==t);{let n=[];for(let r of e)Array.isArray(r)&&W(r,t)?n.push(...Ko(r,t)):n.push(r);return n}}function $o(e,t){let[n,r]=t;return e.reduce((o,i)=>(typeof i=="number"?i<n||i>r?o.push(i):_o(o.at(-1),i)||o.push(t):Oo(i,t)?o.push(Ho(i,t)):(t[1]<i[0]&&o.push(t),o.push(i)),o),[])}var Oo=(e,t)=>e[1]>=t[0]&&e[1]<=t[1]||e[0]>=t[0]&&e[0]<=t[1],Ho=(e,t)=>[Math.min(e[0],t[0]),Math.max(e[1],t[1])],_o=(e,t)=>typeof e>"u"||typeof e=="number"?!1:W(e,t),W=(e,t)=>t>=e[0]&&t<=e[1],Uo=d.True+d.First+d.Last,Go=d.True+d.First,jo=d.True+d.Last,Wo=(e,t)=>{for(let n of e)if(typeof n=="number"){if(n===t)return Uo}else if(W(n,t))return t===n[0]?Go:t===n[1]?jo:d.True;return d.False},No=(e,t)=>{for(let n of e)if(typeof n=="number"){if(n===t)return!0;if(n>t)return!1}else{if(W(n,t))return!0;if(n[0]>t)return!1}return!1},Bo=e=>{if(e.every(n=>typeof n=="number"))return e;let t=[];for(let n of e)if(typeof n=="number")t.push(n);else for(let r=n[0];r<=n[1];r++)t.push(r);return t};function Ko([e,t],n){return n===e?[[e+1,t]]:n===t?[[e,t-1]]:t-e===2?[e,t]:n===t-1?[[e,t-2],t]:[[e,n-1],[n+1,t]]}var qo=e=>e==="A"?"D":"A",zo=({sortDefs:e},{name:t},n=!1,r)=>{if(n)return{sortDefs:e.concat({column:t,sortType:r!=null?r:"A"})};let o=typeof r=="string"?r:e.length===1&&e[0].column===t?qo(e[0].sortType):"A";return{sortDefs:[{column:t,sortType:o}]}},Jo=({sortDefs:e},t,n)=>{if(n===void 0){let r=e.find(o=>o.column===t.name);if(r)return{sortDefs:[{column:t.name,sortType:r.sortType==="A"?"D":"A"}]}}return{sortDefs:[{column:t.name,sortType:n!=null?n:"A"}]}},Xo=({sortDefs:e},t,n="A")=>{let r={column:t.name,sortType:n};return e.length>0?{sortDefs:e.concat(r)}:{sortDefs:[r]}};var Yo=e=>{let t=e.trim(),n=t.lastIndexOf(" ");return n===-1?t:t.slice(n+1)},Zo=e=>e.length===0?"":e[0].toUpperCase()+e.slice(1),Qo=/(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/,ei=e=>{let[t,...n]=e.split(Qo);return`${Zo(t)} ${n.join(" ")}`};var ti=(e,t)=>{var n;return(n=new URL(document.location.href).searchParams.get(e))!=null?n:t},ni=e=>new URL(document.location.href).searchParams.has(e);function at(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),t&&(r.href=t),o.href=e,o.href}var ct=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function y(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}function N(e,t){let r=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return r?parseFloat(r.replace("px","")):0}function ri(e){let t=N(e,"border-left-width"),n=N(e,"border-right-width");return e.clientWidth+t+n}function oi(e){let t=N(e,"border-top-width"),n=N(e,"border-bottom-width");return e.clientHeight+t+n}function Te(e,t={}){let n=t.width||ri(e),r=t.height||oi(e);return{width:n,height:r}}function pt(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var h=16384;function mt(e){(e.width>h||e.height>h)&&(e.width>h&&e.height>h?e.width>e.height?(e.height*=h/e.width,e.width=h):(e.width*=h/e.height,e.height=h):e.width>h?(e.height*=h/e.width,e.width=h):(e.width*=h/e.height,e.height=h))}function w(e){return new Promise((t,n)=>{let r=new Image;r.decode=()=>t(r),r.onload=()=>t(r),r.onerror=n,r.crossOrigin="anonymous",r.decoding="async",r.src=e})}async function ii(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(t=>`data:image/svg+xml;charset=utf-8,${t}`)}async function ft(e,t,n){let r="http://www.w3.org/2000/svg",o=document.createElementNS(r,"svg"),i=document.createElementNS(r,"foreignObject");return o.setAttribute("width",`${t}`),o.setAttribute("height",`${n}`),o.setAttribute("viewBox",`0 0 ${t} ${n}`),i.setAttribute("width","100%"),i.setAttribute("height","100%"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("externalResourcesRequired","true"),o.appendChild(i),i.appendChild(e),ii(o)}var f=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||f(n,t)};function si(e){let t=e.getPropertyValue("content");return`${e.cssText} content: '${t.replace(/'|"/g,"")}';`}function ui(e){return y(e).map(t=>{let n=e.getPropertyValue(t),r=e.getPropertyPriority(t);return`${t}: ${n}${r?" !important":""};`}).join(" ")}function li(e,t,n){let r=`.${e}:${t}`,o=n.cssText?si(n):ui(n);return document.createTextNode(`${r}{${o}}`)}function gt(e,t,n){let r=window.getComputedStyle(e,n),o=r.getPropertyValue("content");if(o===""||o==="none")return;let i=ct();try{t.className=`${t.className} ${i}`}catch{return}let s=document.createElement("style");s.appendChild(li(i,n,r)),t.appendChild(s)}function dt(e,t){gt(e,t,":before"),gt(e,t,":after")}var ht="application/font-woff",yt="image/jpeg",ai={woff:ht,woff2:ht,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:yt,jpeg:yt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function ci(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:""}function E(e){let t=ci(e).toLowerCase();return ai[t]||""}function pi(e){return e.split(/,/)[1]}function P(e){return e.search(/^(data:)/)!==-1}function Re(e,t){return`data:${t};base64,${e}`}async function we(e,t,n){let r=await fetch(e,t);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);let o=await r.blob();return new Promise((i,s)=>{let u=new FileReader;u.onerror=s,u.onloadend=()=>{try{i(n({res:r,result:u.result}))}catch(l){s(l)}},u.readAsDataURL(o)})}var De={};function mi(e,t,n){let r=e.replace(/\?.*/,"");return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),t?`[${t}]${r}`:r}async function S(e,t,n){let r=mi(e,t,n.includeQueryParams);if(De[r]!=null)return De[r];n.cacheBust&&(e+=(/\?/.test(e)?"&":"?")+new Date().getTime());let o;try{let i=await we(e,n.fetchRequestInit,({res:s,result:u})=>(t||(t=s.headers.get("Content-Type")||""),pi(u)));o=Re(i,t)}catch(i){o=n.imagePlaceholder||"";let s=`Failed to fetch resource: ${e}`;i&&(s=typeof i=="string"?i:i.message),s&&console.warn(s)}return De[r]=o,o}async function fi(e){let t=e.toDataURL();return t==="data:,"?e.cloneNode(!1):w(t)}async function gi(e,t){if(e.currentSrc){let i=document.createElement("canvas"),s=i.getContext("2d");i.width=e.clientWidth,i.height=e.clientHeight,s==null||s.drawImage(e,0,0,i.width,i.height);let u=i.toDataURL();return w(u)}let n=e.poster,r=E(n),o=await S(n,r,t);return w(o)}async function di(e){var t;try{if(!((t=e==null?void 0:e.contentDocument)===null||t===void 0)&&t.body)return await V(e.contentDocument.body,{},!0)}catch{}return e.cloneNode(!1)}async function hi(e,t){return f(e,HTMLCanvasElement)?fi(e):f(e,HTMLVideoElement)?gi(e,t):f(e,HTMLIFrameElement)?di(e):e.cloneNode(!1)}var yi=e=>e.tagName!=null&&e.tagName.toUpperCase()==="SLOT";async function Ci(e,t,n){var r,o;let i=[];return yi(e)&&e.assignedNodes?i=y(e.assignedNodes()):f(e,HTMLIFrameElement)&&(!((r=e.contentDocument)===null||r===void 0)&&r.body)?i=y(e.contentDocument.body.childNodes):i=y(((o=e.shadowRoot)!==null&&o!==void 0?o:e).childNodes),i.length===0||f(e,HTMLVideoElement)||await i.reduce((s,u)=>s.then(()=>V(u,n)).then(l=>{l&&t.appendChild(l)}),Promise.resolve()),t}function bi(e,t){let n=t.style;if(!n)return;let r=window.getComputedStyle(e);r.cssText?(n.cssText=r.cssText,n.transformOrigin=r.transformOrigin):y(r).forEach(o=>{let i=r.getPropertyValue(o);o==="font-size"&&i.endsWith("px")&&(i=`${Math.floor(parseFloat(i.substring(0,i.length-2)))-.1}px`),f(e,HTMLIFrameElement)&&o==="display"&&i==="inline"&&(i="block"),o==="d"&&t.getAttribute("d")&&(i=`path(${t.getAttribute("d")})`),n.setProperty(o,i,r.getPropertyPriority(o))})}function xi(e,t){f(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),f(e,HTMLInputElement)&&t.setAttribute("value",e.value)}function Ti(e,t){if(f(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(o=>e.value===o.getAttribute("value"));r&&r.setAttribute("selected","")}}function Di(e,t){return f(t,Element)&&(bi(e,t),dt(e,t),xi(e,t),Ti(e,t)),t}async function Ri(e,t){let n=e.querySelectorAll?e.querySelectorAll("use"):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let u=n[i].getAttribute("xlink:href");if(u){let l=e.querySelector(u),a=document.querySelector(u);!l&&a&&!r[u]&&(r[u]=await V(a,t,!0))}}let o=Object.values(r);if(o.length){let i="http://www.w3.org/1999/xhtml",s=document.createElementNS(i,"svg");s.setAttribute("xmlns",i),s.style.position="absolute",s.style.width="0",s.style.height="0",s.style.overflow="hidden",s.style.display="none";let u=document.createElementNS(i,"defs");s.appendChild(u);for(let l=0;l<o.length;l++)u.appendChild(o[l]);e.appendChild(s)}return e}async function V(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(r=>hi(r,t)).then(r=>Ci(e,r,t)).then(r=>Di(e,r)).then(r=>Ri(r,t))}var Ct=/url\((['"]?)([^'"]+?)\1\)/g,wi=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ei=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Si(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,"g")}function Li(e){let t=[];return e.replace(Ct,(n,r,o)=>(t.push(o),n)),t.filter(n=>!P(n))}async function Fi(e,t,n,r,o){try{let i=n?at(t,n):t,s=E(t),u;if(o){let l=await o(i);u=Re(l,s)}else u=await S(i,s,r);return e.replace(Si(t),`$1${u}$3`)}catch{}return e}function Pi(e,{preferredFontFormat:t}){return t?e.replace(Ei,n=>{for(;;){let[r,,o]=wi.exec(n)||[];if(!o)return"";if(o===t)return`src: ${r};`}}):e}function Ee(e){return e.search(Ct)!==-1}async function B(e,t,n){if(!Ee(e))return e;let r=Pi(e,n);return Li(r).reduce((i,s)=>i.then(u=>Fi(u,s,t,n)),Promise.resolve(r))}async function K(e,t,n){var r;let o=(r=t.style)===null||r===void 0?void 0:r.getPropertyValue(e);if(o){let i=await B(o,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function Vi(e,t){await K("background",e,t)||await K("background-image",e,t),await K("mask",e,t)||await K("mask-image",e,t)}async function ki(e,t){let n=f(e,HTMLImageElement);if(!(n&&!P(e.src))&&!(f(e,SVGImageElement)&&!P(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,o=await S(r,E(r),t);await new Promise((i,s)=>{e.onload=i,e.onerror=s;let u=e;u.decode&&(u.decode=i),u.loading==="lazy"&&(u.loading="eager"),n?(e.srcset="",e.src=o):e.href.baseVal=o})}async function Ai(e,t){let r=y(e.childNodes).map(o=>Se(o,t));await Promise.all(r).then(()=>e)}async function Se(e,t){f(e,Element)&&(await Vi(e,t),await ki(e,t),await Ai(e,t))}function bt(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(o=>{n[o]=r[o]}),e}var xt={};async function Tt(e){let t=xt[e];if(t!=null)return t;let r=await(await fetch(e)).text();return t={url:e,cssText:r},xt[e]=t,t}async function Dt(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async s=>{let u=s.replace(r,"$1");return u.startsWith("https://")||(u=new URL(u,e.url).href),we(u,t.fetchRequestInit,({result:l})=>(n=n.replace(s,`url(${l})`),[s,l]))});return Promise.all(i).then(()=>n)}function Rt(e){if(e==null)return[];let t=[],n=/(\/\*[\s\S]*?\*\/)/gi,r=e.replace(n,""),o=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){let l=o.exec(r);if(l===null)break;t.push(l[0])}r=r.replace(o,"");let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,s="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",u=new RegExp(s,"gi");for(;;){let l=i.exec(r);if(l===null){if(l=u.exec(r),l===null)break;i.lastIndex=u.lastIndex}else u.lastIndex=i.lastIndex;t.push(l[0])}return t}async function vi(e,t){let n=[],r=[];return e.forEach(o=>{if("cssRules"in o)try{y(o.cssRules||[]).forEach((i,s)=>{if(i.type===CSSRule.IMPORT_RULE){let u=s+1,l=i.href,a=Tt(l).then(p=>Dt(p,t)).then(p=>Rt(p).forEach(b=>{try{o.insertRule(b,b.startsWith("@import")?u+=1:o.cssRules.length)}catch(T){console.error("Error inserting rule from remote css",{rule:b,error:T})}})).catch(p=>{console.error("Error loading remote css",p.toString())});r.push(a)}})}catch(i){let s=e.find(u=>u.href==null)||document.styleSheets[0];o.href!=null&&r.push(Tt(o.href).then(u=>Dt(u,t)).then(u=>Rt(u).forEach(l=>{s.insertRule(l,o.cssRules.length)})).catch(u=>{console.error("Error loading remote stylesheet",u)})),console.error("Error inlining remote css file",i)}}),Promise.all(r).then(()=>(e.forEach(o=>{if("cssRules"in o)try{y(o.cssRules||[]).forEach(i=>{n.push(i)})}catch(i){console.error(`Error while reading CSS rules from ${o.href}`,i)}}),n))}function Mi(e){return e.filter(t=>t.type===CSSRule.FONT_FACE_RULE).filter(t=>Ee(t.style.getPropertyValue("src")))}async function Ii(e,t){if(e.ownerDocument==null)throw new Error("Provided element is not within a Document");let n=y(e.ownerDocument.styleSheets),r=await vi(n,t);return Mi(r)}async function wt(e,t){let n=await Ii(e,t);return(await Promise.all(n.map(o=>{let i=o.parentStyleSheet?o.parentStyleSheet.href:null;return B(o.cssText,i,t)}))).join(`
6
- `)}async function Et(e,t){let n=t.fontEmbedCSS!=null?t.fontEmbedCSS:t.skipFonts?null:await wt(e,t);if(n){let r=document.createElement("style"),o=document.createTextNode(n);r.appendChild(o),e.firstChild?e.insertBefore(r,e.firstChild):e.appendChild(r)}}async function $i(e,t={}){let{width:n,height:r}=Te(e,t),o=await V(e,t,!0);return await Et(o,t),await Se(o,t),bt(o,t),await ft(o,n,r)}async function Oi(e,t={}){let{width:n,height:r}=Te(e,t),o=await $i(e,t),i=await w(o),s=document.createElement("canvas"),u=s.getContext("2d"),l=t.pixelRatio||pt(),a=t.canvasWidth||n,p=t.canvasHeight||r;return s.width=a*l,s.height=p*l,t.skipAutoScale||mt(s),s.style.width=`${a}`,s.style.height=`${p}`,t.backgroundColor&&(u.fillStyle=t.backgroundColor,u.fillRect(0,0,s.width,s.height)),u.drawImage(i,0,0,s.width,s.height),s}async function St(e,t={}){return(await Oi(e,t)).toDataURL()}async function Hi(e){let t=await St(e,{cacheBust:!0}).then(n=>n).catch(n=>{console.error("Error taking screenshot",n)});if(t)return t}
1930
+ `);
1931
+ throw Error(`KeySet, no key found for rowIndex ${rowIndex}`);
1932
+ }
1933
+ return key;
1934
+ }
1935
+ toDebugString() {
1936
+ return Array.from(this.keys.entries()).map((k, v) => `${k}=>${v}`).join(",");
1937
+ }
1938
+ };
1939
+
1940
+ // src/menu-utils.ts
1941
+ var isGroupMenuItemDescriptor = (menuItem) => menuItem !== void 0 && "children" in menuItem;
1942
+
1943
+ // src/nanoid/index.ts
1944
+ var uuid = (size2 = 21) => {
1945
+ let id = "";
1946
+ let bytes = crypto.getRandomValues(new Uint8Array(size2));
1947
+ while (size2--) {
1948
+ let byte = bytes[size2] & 63;
1949
+ if (byte < 36) {
1950
+ id += byte.toString(36);
1951
+ } else if (byte < 62) {
1952
+ id += (byte - 26).toString(36).toUpperCase();
1953
+ } else if (byte < 63) {
1954
+ id += "_";
1955
+ } else {
1956
+ id += "-";
1957
+ }
1958
+ }
1959
+ return id;
1960
+ };
1961
+
1962
+ // src/perf-utils.ts
1963
+ function debounce(callback, timeInterval) {
1964
+ let timeout;
1965
+ return (...args) => {
1966
+ clearTimeout(timeout);
1967
+ timeout = window.setTimeout(() => callback(...args), timeInterval);
1968
+ };
1969
+ }
1970
+ function throttle(callback, limit) {
1971
+ let wait = false;
1972
+ let lastArgs = void 0;
1973
+ function checkLastArgs() {
1974
+ if (lastArgs == void 0) {
1975
+ wait = false;
1976
+ } else {
1977
+ callback(...lastArgs);
1978
+ lastArgs = void 0;
1979
+ setTimeout(checkLastArgs, limit);
1980
+ }
1981
+ }
1982
+ return (...args) => {
1983
+ if (wait) {
1984
+ lastArgs = args;
1985
+ } else {
1986
+ callback(...args);
1987
+ wait = true;
1988
+ setTimeout(checkLastArgs, limit);
1989
+ }
1990
+ };
1991
+ }
1992
+
1993
+ // src/row-utils.ts
1994
+ var { IDX } = metadataKeys;
1995
+ var actualRowPositioning = (rowHeight) => [
1996
+ (row) => row[IDX] * rowHeight,
1997
+ (position) => Math.floor(position / rowHeight)
1998
+ ];
1999
+ var virtualRowPositioning = (rowHeight, additionalPixelsNeeded, pctScrollTop) => [
2000
+ (row) => {
2001
+ const rowOffset = pctScrollTop.current * additionalPixelsNeeded;
2002
+ return row[IDX] * rowHeight - rowOffset;
2003
+ },
2004
+ (position) => {
2005
+ const rowOffset = pctScrollTop.current * additionalPixelsNeeded;
2006
+ const result = Math.floor((position + rowOffset) / rowHeight);
2007
+ return result;
2008
+ }
2009
+ ];
2010
+
2011
+ // src/selection-utils.ts
2012
+ var NO_SELECTION = [];
2013
+ var { SELECTED } = metadataKeys;
2014
+ var RowSelected = {
2015
+ False: 0,
2016
+ True: 1,
2017
+ First: 2,
2018
+ Last: 4
2019
+ };
2020
+ var isRowSelected = (row) => (row[SELECTED] & RowSelected.True) === RowSelected.True;
2021
+ var isRowSelectedLast = (row) => row !== void 0 && (row[SELECTED] & RowSelected.Last) === RowSelected.Last;
2022
+ var inAscendingOrder = (item1, item2) => {
2023
+ const n1 = typeof item1 === "number" ? item1 : item1[0];
2024
+ const n2 = typeof item2 === "number" ? item2 : item2[0];
2025
+ return n1 - n2;
2026
+ };
2027
+ var deselectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false) => {
2028
+ const singleSelect = selectionModel === "single";
2029
+ const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
2030
+ const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
2031
+ if (actsLikeSingleSelect || !rangeSelect && !keepExistingSelection) {
2032
+ return NO_SELECTION;
2033
+ } else if (!rangeSelect && keepExistingSelection) {
2034
+ return removeSelectedItem(selected, itemIndex);
2035
+ }
2036
+ return NO_SELECTION;
2037
+ };
2038
+ var newSelectedFillsGapOrExtends = (selection, itemIndex) => {
2039
+ for (let i = 0; i < selection.length; i++) {
2040
+ const item = selection[i];
2041
+ if (typeof item === "number") {
2042
+ if (item === itemIndex - 1) {
2043
+ return true;
2044
+ } else if (item > itemIndex) {
2045
+ return false;
2046
+ }
2047
+ } else if (item[0] === itemIndex + 1 || item[1] === itemIndex - 1) {
2048
+ return true;
2049
+ } else if (item[0] > itemIndex) {
2050
+ return false;
2051
+ }
2052
+ }
2053
+ return false;
2054
+ };
2055
+ var fillGapOrExtendSelection = (selection, itemIndex) => {
2056
+ for (let i = 0; i < selection.length; i++) {
2057
+ const item = selection[i];
2058
+ if (typeof item === "number") {
2059
+ if (item === itemIndex - 1) {
2060
+ const nextSelectionItem = selection[i + 1];
2061
+ if (nextSelectionItem === itemIndex + 1) {
2062
+ const newRange = [item, nextSelectionItem];
2063
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
2064
+ } else {
2065
+ const newRange = [item, itemIndex];
2066
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
2067
+ }
2068
+ } else if (item > itemIndex) {
2069
+ break;
2070
+ }
2071
+ } else if (item[0] === itemIndex + 1) {
2072
+ const newRange = [itemIndex, item[1]];
2073
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
2074
+ } else if (item[1] === itemIndex - 1) {
2075
+ const nextItem = selection[i + 1];
2076
+ if (Array.isArray(nextItem) && nextItem[0] === itemIndex + 1) {
2077
+ const newRange = [item[0], nextItem[1]];
2078
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
2079
+ } else if (typeof nextItem === "number" && nextItem === itemIndex + 1) {
2080
+ const newRange = [item[0], nextItem];
2081
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 2));
2082
+ } else {
2083
+ const newRange = [item[0], itemIndex];
2084
+ return selection.slice(0, i).concat([newRange]).concat(selection.slice(i + 1));
2085
+ }
2086
+ }
2087
+ }
2088
+ return selection;
2089
+ };
2090
+ var selectItem = (selectionModel, selected, itemIndex, rangeSelect, keepExistingSelection = false, activeItemIndex = -1) => {
2091
+ const singleSelect = selectionModel === "single";
2092
+ const multiSelect = selectionModel === "extended" || selectionModel === "checkbox";
2093
+ const actsLikeSingleSelect = singleSelect || multiSelect && !keepExistingSelection && !rangeSelect;
2094
+ if (selectionModel === "none") {
2095
+ return NO_SELECTION;
2096
+ } else if (actsLikeSingleSelect) {
2097
+ return [itemIndex];
2098
+ } else if (rangeSelect) {
2099
+ if (selected.length === 0) {
2100
+ return [itemIndex];
2101
+ } else {
2102
+ const range = itemIndex > activeItemIndex ? [activeItemIndex, itemIndex] : [itemIndex, activeItemIndex];
2103
+ return insertRange(selected, range);
2104
+ }
2105
+ } else if (!rangeSelect) {
2106
+ if (newSelectedFillsGapOrExtends(selected, itemIndex)) {
2107
+ return fillGapOrExtendSelection(selected, itemIndex);
2108
+ } else {
2109
+ return selected == null ? void 0 : selected.concat(itemIndex).sort(inAscendingOrder);
2110
+ }
2111
+ } else if (multiSelect) {
2112
+ }
2113
+ return NO_SELECTION;
2114
+ };
2115
+ function removeSelectedItem(selected, itemIndex) {
2116
+ if (selected.includes(itemIndex)) {
2117
+ return selected.filter((selectedItem) => selectedItem !== itemIndex);
2118
+ } else {
2119
+ const newSelected = [];
2120
+ for (const selectedItem of selected) {
2121
+ if (Array.isArray(selectedItem)) {
2122
+ if (rangeIncludes(selectedItem, itemIndex)) {
2123
+ newSelected.push(...splitRange(selectedItem, itemIndex));
2124
+ } else {
2125
+ newSelected.push(selectedItem);
2126
+ }
2127
+ } else {
2128
+ newSelected.push(selectedItem);
2129
+ }
2130
+ }
2131
+ return newSelected;
2132
+ }
2133
+ }
2134
+ function insertRange(selected, range) {
2135
+ const [from, to] = range;
2136
+ return selected.reduce((newSelected, selectedItem) => {
2137
+ if (typeof selectedItem === "number") {
2138
+ if (selectedItem < from || selectedItem > to) {
2139
+ newSelected.push(selectedItem);
2140
+ } else if (!includedInRange(newSelected.at(-1), selectedItem)) {
2141
+ newSelected.push(range);
2142
+ }
2143
+ } else if (overlappingRange(selectedItem, range)) {
2144
+ newSelected.push(mergeRanges(selectedItem, range));
2145
+ } else {
2146
+ if (range[1] < selectedItem[0]) {
2147
+ newSelected.push(range);
2148
+ }
2149
+ newSelected.push(selectedItem);
2150
+ }
2151
+ return newSelected;
2152
+ }, []);
2153
+ }
2154
+ var overlappingRange = (r1, r2) => r1[1] >= r2[0] && r1[1] <= r2[1] || r1[0] >= r2[0] && r1[0] <= r2[1];
2155
+ var mergeRanges = (r1, r2) => [
2156
+ Math.min(r1[0], r2[0]),
2157
+ Math.max(r1[1], r2[1])
2158
+ ];
2159
+ var includedInRange = (selectedItem, index) => {
2160
+ if (typeof selectedItem === "undefined" || typeof selectedItem === "number") {
2161
+ return false;
2162
+ } else
2163
+ return rangeIncludes(selectedItem, index);
2164
+ };
2165
+ var rangeIncludes = (range, index) => index >= range[0] && index <= range[1];
2166
+ var SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last;
2167
+ var FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;
2168
+ var LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;
2169
+ var getSelectionStatus = (selected, itemIndex) => {
2170
+ for (const item of selected) {
2171
+ if (typeof item === "number") {
2172
+ if (item === itemIndex) {
2173
+ return SINGLE_SELECTED_ROW;
2174
+ }
2175
+ } else if (rangeIncludes(item, itemIndex)) {
2176
+ if (itemIndex === item[0]) {
2177
+ return FIRST_SELECTED_ROW_OF_BLOCK;
2178
+ } else if (itemIndex === item[1]) {
2179
+ return LAST_SELECTED_ROW_OF_BLOCK;
2180
+ } else {
2181
+ return RowSelected.True;
2182
+ }
2183
+ }
2184
+ }
2185
+ return RowSelected.False;
2186
+ };
2187
+ var isSelected = (selected, itemIndex) => {
2188
+ for (const item of selected) {
2189
+ if (typeof item === "number") {
2190
+ if (item === itemIndex) {
2191
+ return true;
2192
+ } else if (item > itemIndex) {
2193
+ return false;
2194
+ }
2195
+ } else if (rangeIncludes(item, itemIndex)) {
2196
+ return true;
2197
+ } else if (item[0] > itemIndex) {
2198
+ return false;
2199
+ }
2200
+ }
2201
+ return false;
2202
+ };
2203
+ var expandSelection = (selected) => {
2204
+ if (selected.every((selectedItem) => typeof selectedItem === "number")) {
2205
+ return selected;
2206
+ }
2207
+ const expandedSelected = [];
2208
+ for (const selectedItem of selected) {
2209
+ if (typeof selectedItem === "number") {
2210
+ expandedSelected.push(selectedItem);
2211
+ } else {
2212
+ for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {
2213
+ expandedSelected.push(i);
2214
+ }
2215
+ }
2216
+ }
2217
+ return expandedSelected;
2218
+ };
2219
+ function splitRange([from, to], itemIndex) {
2220
+ if (itemIndex === from) {
2221
+ return [[from + 1, to]];
2222
+ } else if (itemIndex === to) {
2223
+ return [[from, to - 1]];
2224
+ } else if (to - from === 2) {
2225
+ return [from, to];
2226
+ } else if (itemIndex === to - 1) {
2227
+ return [[from, to - 2], to];
2228
+ } else {
2229
+ return [
2230
+ [from, itemIndex - 1],
2231
+ [itemIndex + 1, to]
2232
+ ];
2233
+ }
2234
+ }
2235
+
2236
+ // src/sort-utils.ts
2237
+ var toggle = (sortType) => sortType === "A" ? "D" : "A";
2238
+ var applySort = ({ sortDefs }, { name: column }, extendSort = false, sortType) => {
2239
+ if (extendSort) {
2240
+ return {
2241
+ sortDefs: sortDefs.concat({
2242
+ column,
2243
+ sortType: sortType != null ? sortType : "A"
2244
+ })
2245
+ };
2246
+ }
2247
+ const newSortType = typeof sortType === "string" ? sortType : sortDefs.length === 1 && sortDefs[0].column === column ? toggle(sortDefs[0].sortType) : "A";
2248
+ return {
2249
+ sortDefs: [{ column, sortType: newSortType }]
2250
+ };
2251
+ };
2252
+ var setSortColumn = ({ sortDefs }, column, sortType) => {
2253
+ if (sortType === void 0) {
2254
+ const columnSort = sortDefs.find((item) => item.column === column.name);
2255
+ if (columnSort) {
2256
+ return {
2257
+ sortDefs: [
2258
+ {
2259
+ column: column.name,
2260
+ sortType: columnSort.sortType === "A" ? "D" : "A"
2261
+ }
2262
+ ]
2263
+ };
2264
+ }
2265
+ }
2266
+ return { sortDefs: [{ column: column.name, sortType: sortType != null ? sortType : "A" }] };
2267
+ };
2268
+ var addSortColumn = ({ sortDefs }, column, sortType = "A") => {
2269
+ const sortEntry = { column: column.name, sortType };
2270
+ if (sortDefs.length > 0) {
2271
+ return {
2272
+ sortDefs: sortDefs.concat(sortEntry)
2273
+ };
2274
+ } else {
2275
+ return { sortDefs: [sortEntry] };
2276
+ }
2277
+ };
2278
+
2279
+ // src/text-utils.ts
2280
+ var lastWord = (text) => {
2281
+ const trimmedText = text.trim();
2282
+ const pos = trimmedText.lastIndexOf(" ");
2283
+ if (pos === -1) {
2284
+ return trimmedText;
2285
+ } else {
2286
+ return trimmedText.slice(pos + 1);
2287
+ }
2288
+ };
2289
+ var capitalize = (text) => text.length === 0 ? "" : text[0].toUpperCase() + text.slice(1);
2290
+ var regexp_worfify = /(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])/;
2291
+ var wordify = (text) => {
2292
+ const [firstWord, ...rest] = text.split(regexp_worfify);
2293
+ return `${capitalize(firstWord)} ${rest.join(" ")}`;
2294
+ };
2295
+
2296
+ // src/url-utils.ts
2297
+ var getUrlParameter = (paramName, defaultValue) => {
2298
+ var _a;
2299
+ return (_a = new URL(document.location.href).searchParams.get(paramName)) != null ? _a : defaultValue;
2300
+ };
2301
+ var hasUrlParameter = (paramName) => new URL(document.location.href).searchParams.has(paramName);
2302
+
2303
+ // ../../node_modules/html-to-image/es/util.js
2304
+ function resolveUrl(url, baseUrl) {
2305
+ if (url.match(/^[a-z]+:\/\//i)) {
2306
+ return url;
2307
+ }
2308
+ if (url.match(/^\/\//)) {
2309
+ return window.location.protocol + url;
2310
+ }
2311
+ if (url.match(/^[a-z]+:/i)) {
2312
+ return url;
2313
+ }
2314
+ const doc = document.implementation.createHTMLDocument();
2315
+ const base = doc.createElement("base");
2316
+ const a = doc.createElement("a");
2317
+ doc.head.appendChild(base);
2318
+ doc.body.appendChild(a);
2319
+ if (baseUrl) {
2320
+ base.href = baseUrl;
2321
+ }
2322
+ a.href = url;
2323
+ return a.href;
2324
+ }
2325
+ var uuid2 = (() => {
2326
+ let counter = 0;
2327
+ const random = () => (
2328
+ // eslint-disable-next-line no-bitwise
2329
+ `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4)
2330
+ );
2331
+ return () => {
2332
+ counter += 1;
2333
+ return `u${random()}${counter}`;
2334
+ };
2335
+ })();
2336
+ function toArray(arrayLike) {
2337
+ const arr = [];
2338
+ for (let i = 0, l = arrayLike.length; i < l; i++) {
2339
+ arr.push(arrayLike[i]);
2340
+ }
2341
+ return arr;
2342
+ }
2343
+ function px(node, styleProperty) {
2344
+ const win = node.ownerDocument.defaultView || window;
2345
+ const val = win.getComputedStyle(node).getPropertyValue(styleProperty);
2346
+ return val ? parseFloat(val.replace("px", "")) : 0;
2347
+ }
2348
+ function getNodeWidth(node) {
2349
+ const leftBorder = px(node, "border-left-width");
2350
+ const rightBorder = px(node, "border-right-width");
2351
+ return node.clientWidth + leftBorder + rightBorder;
2352
+ }
2353
+ function getNodeHeight(node) {
2354
+ const topBorder = px(node, "border-top-width");
2355
+ const bottomBorder = px(node, "border-bottom-width");
2356
+ return node.clientHeight + topBorder + bottomBorder;
2357
+ }
2358
+ function getImageSize(targetNode, options = {}) {
2359
+ const width = options.width || getNodeWidth(targetNode);
2360
+ const height = options.height || getNodeHeight(targetNode);
2361
+ return { width, height };
2362
+ }
2363
+ function getPixelRatio() {
2364
+ let ratio;
2365
+ let FINAL_PROCESS;
2366
+ try {
2367
+ FINAL_PROCESS = process;
2368
+ } catch (e) {
2369
+ }
2370
+ const val = FINAL_PROCESS && FINAL_PROCESS.env ? FINAL_PROCESS.env.devicePixelRatio : null;
2371
+ if (val) {
2372
+ ratio = parseInt(val, 10);
2373
+ if (Number.isNaN(ratio)) {
2374
+ ratio = 1;
2375
+ }
2376
+ }
2377
+ return ratio || window.devicePixelRatio || 1;
2378
+ }
2379
+ var canvasDimensionLimit = 16384;
2380
+ function checkCanvasDimensions(canvas) {
2381
+ if (canvas.width > canvasDimensionLimit || canvas.height > canvasDimensionLimit) {
2382
+ if (canvas.width > canvasDimensionLimit && canvas.height > canvasDimensionLimit) {
2383
+ if (canvas.width > canvas.height) {
2384
+ canvas.height *= canvasDimensionLimit / canvas.width;
2385
+ canvas.width = canvasDimensionLimit;
2386
+ } else {
2387
+ canvas.width *= canvasDimensionLimit / canvas.height;
2388
+ canvas.height = canvasDimensionLimit;
2389
+ }
2390
+ } else if (canvas.width > canvasDimensionLimit) {
2391
+ canvas.height *= canvasDimensionLimit / canvas.width;
2392
+ canvas.width = canvasDimensionLimit;
2393
+ } else {
2394
+ canvas.width *= canvasDimensionLimit / canvas.height;
2395
+ canvas.height = canvasDimensionLimit;
2396
+ }
2397
+ }
2398
+ }
2399
+ function createImage(url) {
2400
+ return new Promise((resolve, reject) => {
2401
+ const img = new Image();
2402
+ img.decode = () => resolve(img);
2403
+ img.onload = () => resolve(img);
2404
+ img.onerror = reject;
2405
+ img.crossOrigin = "anonymous";
2406
+ img.decoding = "async";
2407
+ img.src = url;
2408
+ });
2409
+ }
2410
+ async function svgToDataURL(svg) {
2411
+ return Promise.resolve().then(() => new XMLSerializer().serializeToString(svg)).then(encodeURIComponent).then((html) => `data:image/svg+xml;charset=utf-8,${html}`);
2412
+ }
2413
+ async function nodeToDataURL(node, width, height) {
2414
+ const xmlns = "http://www.w3.org/2000/svg";
2415
+ const svg = document.createElementNS(xmlns, "svg");
2416
+ const foreignObject = document.createElementNS(xmlns, "foreignObject");
2417
+ svg.setAttribute("width", `${width}`);
2418
+ svg.setAttribute("height", `${height}`);
2419
+ svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
2420
+ foreignObject.setAttribute("width", "100%");
2421
+ foreignObject.setAttribute("height", "100%");
2422
+ foreignObject.setAttribute("x", "0");
2423
+ foreignObject.setAttribute("y", "0");
2424
+ foreignObject.setAttribute("externalResourcesRequired", "true");
2425
+ svg.appendChild(foreignObject);
2426
+ foreignObject.appendChild(node);
2427
+ return svgToDataURL(svg);
2428
+ }
2429
+ var isInstanceOfElement = (node, instance) => {
2430
+ if (node instanceof instance)
2431
+ return true;
2432
+ const nodePrototype = Object.getPrototypeOf(node);
2433
+ if (nodePrototype === null)
2434
+ return false;
2435
+ return nodePrototype.constructor.name === instance.name || isInstanceOfElement(nodePrototype, instance);
2436
+ };
2437
+
2438
+ // ../../node_modules/html-to-image/es/clone-pseudos.js
2439
+ function formatCSSText(style) {
2440
+ const content = style.getPropertyValue("content");
2441
+ return `${style.cssText} content: '${content.replace(/'|"/g, "")}';`;
2442
+ }
2443
+ function formatCSSProperties(style) {
2444
+ return toArray(style).map((name) => {
2445
+ const value = style.getPropertyValue(name);
2446
+ const priority = style.getPropertyPriority(name);
2447
+ return `${name}: ${value}${priority ? " !important" : ""};`;
2448
+ }).join(" ");
2449
+ }
2450
+ function getPseudoElementStyle(className, pseudo, style) {
2451
+ const selector = `.${className}:${pseudo}`;
2452
+ const cssText = style.cssText ? formatCSSText(style) : formatCSSProperties(style);
2453
+ return document.createTextNode(`${selector}{${cssText}}`);
2454
+ }
2455
+ function clonePseudoElement(nativeNode, clonedNode, pseudo) {
2456
+ const style = window.getComputedStyle(nativeNode, pseudo);
2457
+ const content = style.getPropertyValue("content");
2458
+ if (content === "" || content === "none") {
2459
+ return;
2460
+ }
2461
+ const className = uuid2();
2462
+ try {
2463
+ clonedNode.className = `${clonedNode.className} ${className}`;
2464
+ } catch (err) {
2465
+ return;
2466
+ }
2467
+ const styleElement = document.createElement("style");
2468
+ styleElement.appendChild(getPseudoElementStyle(className, pseudo, style));
2469
+ clonedNode.appendChild(styleElement);
2470
+ }
2471
+ function clonePseudoElements(nativeNode, clonedNode) {
2472
+ clonePseudoElement(nativeNode, clonedNode, ":before");
2473
+ clonePseudoElement(nativeNode, clonedNode, ":after");
2474
+ }
2475
+
2476
+ // ../../node_modules/html-to-image/es/mimes.js
2477
+ var WOFF = "application/font-woff";
2478
+ var JPEG = "image/jpeg";
2479
+ var mimes = {
2480
+ woff: WOFF,
2481
+ woff2: WOFF,
2482
+ ttf: "application/font-truetype",
2483
+ eot: "application/vnd.ms-fontobject",
2484
+ png: "image/png",
2485
+ jpg: JPEG,
2486
+ jpeg: JPEG,
2487
+ gif: "image/gif",
2488
+ tiff: "image/tiff",
2489
+ svg: "image/svg+xml",
2490
+ webp: "image/webp"
2491
+ };
2492
+ function getExtension(url) {
2493
+ const match = /\.([^./]*?)$/g.exec(url);
2494
+ return match ? match[1] : "";
2495
+ }
2496
+ function getMimeType(url) {
2497
+ const extension = getExtension(url).toLowerCase();
2498
+ return mimes[extension] || "";
2499
+ }
2500
+
2501
+ // ../../node_modules/html-to-image/es/dataurl.js
2502
+ function getContentFromDataUrl(dataURL) {
2503
+ return dataURL.split(/,/)[1];
2504
+ }
2505
+ function isDataUrl(url) {
2506
+ return url.search(/^(data:)/) !== -1;
2507
+ }
2508
+ function makeDataUrl(content, mimeType) {
2509
+ return `data:${mimeType};base64,${content}`;
2510
+ }
2511
+ async function fetchAsDataURL(url, init, process2) {
2512
+ const res = await fetch(url, init);
2513
+ if (res.status === 404) {
2514
+ throw new Error(`Resource "${res.url}" not found`);
2515
+ }
2516
+ const blob = await res.blob();
2517
+ return new Promise((resolve, reject) => {
2518
+ const reader = new FileReader();
2519
+ reader.onerror = reject;
2520
+ reader.onloadend = () => {
2521
+ try {
2522
+ resolve(process2({ res, result: reader.result }));
2523
+ } catch (error) {
2524
+ reject(error);
2525
+ }
2526
+ };
2527
+ reader.readAsDataURL(blob);
2528
+ });
2529
+ }
2530
+ var cache = {};
2531
+ function getCacheKey(url, contentType, includeQueryParams) {
2532
+ let key = url.replace(/\?.*/, "");
2533
+ if (includeQueryParams) {
2534
+ key = url;
2535
+ }
2536
+ if (/ttf|otf|eot|woff2?/i.test(key)) {
2537
+ key = key.replace(/.*\//, "");
2538
+ }
2539
+ return contentType ? `[${contentType}]${key}` : key;
2540
+ }
2541
+ async function resourceToDataURL(resourceUrl, contentType, options) {
2542
+ const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);
2543
+ if (cache[cacheKey] != null) {
2544
+ return cache[cacheKey];
2545
+ }
2546
+ if (options.cacheBust) {
2547
+ resourceUrl += (/\?/.test(resourceUrl) ? "&" : "?") + (/* @__PURE__ */ new Date()).getTime();
2548
+ }
2549
+ let dataURL;
2550
+ try {
2551
+ const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {
2552
+ if (!contentType) {
2553
+ contentType = res.headers.get("Content-Type") || "";
2554
+ }
2555
+ return getContentFromDataUrl(result);
2556
+ });
2557
+ dataURL = makeDataUrl(content, contentType);
2558
+ } catch (error) {
2559
+ dataURL = options.imagePlaceholder || "";
2560
+ let msg = `Failed to fetch resource: ${resourceUrl}`;
2561
+ if (error) {
2562
+ msg = typeof error === "string" ? error : error.message;
2563
+ }
2564
+ if (msg) {
2565
+ console.warn(msg);
2566
+ }
2567
+ }
2568
+ cache[cacheKey] = dataURL;
2569
+ return dataURL;
2570
+ }
2571
+
2572
+ // ../../node_modules/html-to-image/es/clone-node.js
2573
+ async function cloneCanvasElement(canvas) {
2574
+ const dataURL = canvas.toDataURL();
2575
+ if (dataURL === "data:,") {
2576
+ return canvas.cloneNode(false);
2577
+ }
2578
+ return createImage(dataURL);
2579
+ }
2580
+ async function cloneVideoElement(video, options) {
2581
+ if (video.currentSrc) {
2582
+ const canvas = document.createElement("canvas");
2583
+ const ctx = canvas.getContext("2d");
2584
+ canvas.width = video.clientWidth;
2585
+ canvas.height = video.clientHeight;
2586
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
2587
+ const dataURL2 = canvas.toDataURL();
2588
+ return createImage(dataURL2);
2589
+ }
2590
+ const poster = video.poster;
2591
+ const contentType = getMimeType(poster);
2592
+ const dataURL = await resourceToDataURL(poster, contentType, options);
2593
+ return createImage(dataURL);
2594
+ }
2595
+ async function cloneIFrameElement(iframe) {
2596
+ var _a;
2597
+ try {
2598
+ if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {
2599
+ return await cloneNode(iframe.contentDocument.body, {}, true);
2600
+ }
2601
+ } catch (_b) {
2602
+ }
2603
+ return iframe.cloneNode(false);
2604
+ }
2605
+ async function cloneSingleNode(node, options) {
2606
+ if (isInstanceOfElement(node, HTMLCanvasElement)) {
2607
+ return cloneCanvasElement(node);
2608
+ }
2609
+ if (isInstanceOfElement(node, HTMLVideoElement)) {
2610
+ return cloneVideoElement(node, options);
2611
+ }
2612
+ if (isInstanceOfElement(node, HTMLIFrameElement)) {
2613
+ return cloneIFrameElement(node);
2614
+ }
2615
+ return node.cloneNode(false);
2616
+ }
2617
+ var isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === "SLOT";
2618
+ async function cloneChildren(nativeNode, clonedNode, options) {
2619
+ var _a, _b;
2620
+ let children = [];
2621
+ if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {
2622
+ children = toArray(nativeNode.assignedNodes());
2623
+ } else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) && ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {
2624
+ children = toArray(nativeNode.contentDocument.body.childNodes);
2625
+ } else {
2626
+ children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);
2627
+ }
2628
+ if (children.length === 0 || isInstanceOfElement(nativeNode, HTMLVideoElement)) {
2629
+ return clonedNode;
2630
+ }
2631
+ await children.reduce((deferred, child) => deferred.then(() => cloneNode(child, options)).then((clonedChild) => {
2632
+ if (clonedChild) {
2633
+ clonedNode.appendChild(clonedChild);
2634
+ }
2635
+ }), Promise.resolve());
2636
+ return clonedNode;
2637
+ }
2638
+ function cloneCSSStyle(nativeNode, clonedNode) {
2639
+ const targetStyle = clonedNode.style;
2640
+ if (!targetStyle) {
2641
+ return;
2642
+ }
2643
+ const sourceStyle = window.getComputedStyle(nativeNode);
2644
+ if (sourceStyle.cssText) {
2645
+ targetStyle.cssText = sourceStyle.cssText;
2646
+ targetStyle.transformOrigin = sourceStyle.transformOrigin;
2647
+ } else {
2648
+ toArray(sourceStyle).forEach((name) => {
2649
+ let value = sourceStyle.getPropertyValue(name);
2650
+ if (name === "font-size" && value.endsWith("px")) {
2651
+ const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;
2652
+ value = `${reducedFont}px`;
2653
+ }
2654
+ if (isInstanceOfElement(nativeNode, HTMLIFrameElement) && name === "display" && value === "inline") {
2655
+ value = "block";
2656
+ }
2657
+ if (name === "d" && clonedNode.getAttribute("d")) {
2658
+ value = `path(${clonedNode.getAttribute("d")})`;
2659
+ }
2660
+ targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));
2661
+ });
2662
+ }
2663
+ }
2664
+ function cloneInputValue(nativeNode, clonedNode) {
2665
+ if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {
2666
+ clonedNode.innerHTML = nativeNode.value;
2667
+ }
2668
+ if (isInstanceOfElement(nativeNode, HTMLInputElement)) {
2669
+ clonedNode.setAttribute("value", nativeNode.value);
2670
+ }
2671
+ }
2672
+ function cloneSelectValue(nativeNode, clonedNode) {
2673
+ if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {
2674
+ const clonedSelect = clonedNode;
2675
+ const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute("value"));
2676
+ if (selectedOption) {
2677
+ selectedOption.setAttribute("selected", "");
2678
+ }
2679
+ }
2680
+ }
2681
+ function decorate(nativeNode, clonedNode) {
2682
+ if (isInstanceOfElement(clonedNode, Element)) {
2683
+ cloneCSSStyle(nativeNode, clonedNode);
2684
+ clonePseudoElements(nativeNode, clonedNode);
2685
+ cloneInputValue(nativeNode, clonedNode);
2686
+ cloneSelectValue(nativeNode, clonedNode);
2687
+ }
2688
+ return clonedNode;
2689
+ }
2690
+ async function ensureSVGSymbols(clone, options) {
2691
+ const uses = clone.querySelectorAll ? clone.querySelectorAll("use") : [];
2692
+ if (uses.length === 0) {
2693
+ return clone;
2694
+ }
2695
+ const processedDefs = {};
2696
+ for (let i = 0; i < uses.length; i++) {
2697
+ const use = uses[i];
2698
+ const id = use.getAttribute("xlink:href");
2699
+ if (id) {
2700
+ const exist = clone.querySelector(id);
2701
+ const definition = document.querySelector(id);
2702
+ if (!exist && definition && !processedDefs[id]) {
2703
+ processedDefs[id] = await cloneNode(definition, options, true);
2704
+ }
2705
+ }
2706
+ }
2707
+ const nodes = Object.values(processedDefs);
2708
+ if (nodes.length) {
2709
+ const ns = "http://www.w3.org/1999/xhtml";
2710
+ const svg = document.createElementNS(ns, "svg");
2711
+ svg.setAttribute("xmlns", ns);
2712
+ svg.style.position = "absolute";
2713
+ svg.style.width = "0";
2714
+ svg.style.height = "0";
2715
+ svg.style.overflow = "hidden";
2716
+ svg.style.display = "none";
2717
+ const defs = document.createElementNS(ns, "defs");
2718
+ svg.appendChild(defs);
2719
+ for (let i = 0; i < nodes.length; i++) {
2720
+ defs.appendChild(nodes[i]);
2721
+ }
2722
+ clone.appendChild(svg);
2723
+ }
2724
+ return clone;
2725
+ }
2726
+ async function cloneNode(node, options, isRoot) {
2727
+ if (!isRoot && options.filter && !options.filter(node)) {
2728
+ return null;
2729
+ }
2730
+ return Promise.resolve(node).then((clonedNode) => cloneSingleNode(clonedNode, options)).then((clonedNode) => cloneChildren(node, clonedNode, options)).then((clonedNode) => decorate(node, clonedNode)).then((clonedNode) => ensureSVGSymbols(clonedNode, options));
2731
+ }
2732
+
2733
+ // ../../node_modules/html-to-image/es/embed-resources.js
2734
+ var URL_REGEX = /url\((['"]?)([^'"]+?)\1\)/g;
2735
+ var URL_WITH_FORMAT_REGEX = /url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g;
2736
+ var FONT_SRC_REGEX = /src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;
2737
+ function toRegex(url) {
2738
+ const escaped = url.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
2739
+ return new RegExp(`(url\\(['"]?)(${escaped})(['"]?\\))`, "g");
2740
+ }
2741
+ function parseURLs(cssText) {
2742
+ const urls = [];
2743
+ cssText.replace(URL_REGEX, (raw, quotation, url) => {
2744
+ urls.push(url);
2745
+ return raw;
2746
+ });
2747
+ return urls.filter((url) => !isDataUrl(url));
2748
+ }
2749
+ async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {
2750
+ try {
2751
+ const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;
2752
+ const contentType = getMimeType(resourceURL);
2753
+ let dataURL;
2754
+ if (getContentFromUrl) {
2755
+ const content = await getContentFromUrl(resolvedURL);
2756
+ dataURL = makeDataUrl(content, contentType);
2757
+ } else {
2758
+ dataURL = await resourceToDataURL(resolvedURL, contentType, options);
2759
+ }
2760
+ return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);
2761
+ } catch (error) {
2762
+ }
2763
+ return cssText;
2764
+ }
2765
+ function filterPreferredFontFormat(str, { preferredFontFormat }) {
2766
+ return !preferredFontFormat ? str : str.replace(FONT_SRC_REGEX, (match) => {
2767
+ while (true) {
2768
+ const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];
2769
+ if (!format) {
2770
+ return "";
2771
+ }
2772
+ if (format === preferredFontFormat) {
2773
+ return `src: ${src};`;
2774
+ }
2775
+ }
2776
+ });
2777
+ }
2778
+ function shouldEmbed(url) {
2779
+ return url.search(URL_REGEX) !== -1;
2780
+ }
2781
+ async function embedResources(cssText, baseUrl, options) {
2782
+ if (!shouldEmbed(cssText)) {
2783
+ return cssText;
2784
+ }
2785
+ const filteredCSSText = filterPreferredFontFormat(cssText, options);
2786
+ const urls = parseURLs(filteredCSSText);
2787
+ return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));
2788
+ }
2789
+
2790
+ // ../../node_modules/html-to-image/es/embed-images.js
2791
+ async function embedProp(propName, node, options) {
2792
+ var _a;
2793
+ const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);
2794
+ if (propValue) {
2795
+ const cssString = await embedResources(propValue, null, options);
2796
+ node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));
2797
+ return true;
2798
+ }
2799
+ return false;
2800
+ }
2801
+ async function embedBackground(clonedNode, options) {
2802
+ if (!await embedProp("background", clonedNode, options)) {
2803
+ await embedProp("background-image", clonedNode, options);
2804
+ }
2805
+ if (!await embedProp("mask", clonedNode, options)) {
2806
+ await embedProp("mask-image", clonedNode, options);
2807
+ }
2808
+ }
2809
+ async function embedImageNode(clonedNode, options) {
2810
+ const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);
2811
+ if (!(isImageElement && !isDataUrl(clonedNode.src)) && !(isInstanceOfElement(clonedNode, SVGImageElement) && !isDataUrl(clonedNode.href.baseVal))) {
2812
+ return;
2813
+ }
2814
+ const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;
2815
+ const dataURL = await resourceToDataURL(url, getMimeType(url), options);
2816
+ await new Promise((resolve, reject) => {
2817
+ clonedNode.onload = resolve;
2818
+ clonedNode.onerror = reject;
2819
+ const image = clonedNode;
2820
+ if (image.decode) {
2821
+ image.decode = resolve;
2822
+ }
2823
+ if (image.loading === "lazy") {
2824
+ image.loading = "eager";
2825
+ }
2826
+ if (isImageElement) {
2827
+ clonedNode.srcset = "";
2828
+ clonedNode.src = dataURL;
2829
+ } else {
2830
+ clonedNode.href.baseVal = dataURL;
2831
+ }
2832
+ });
2833
+ }
2834
+ async function embedChildren(clonedNode, options) {
2835
+ const children = toArray(clonedNode.childNodes);
2836
+ const deferreds = children.map((child) => embedImages(child, options));
2837
+ await Promise.all(deferreds).then(() => clonedNode);
2838
+ }
2839
+ async function embedImages(clonedNode, options) {
2840
+ if (isInstanceOfElement(clonedNode, Element)) {
2841
+ await embedBackground(clonedNode, options);
2842
+ await embedImageNode(clonedNode, options);
2843
+ await embedChildren(clonedNode, options);
2844
+ }
2845
+ }
2846
+
2847
+ // ../../node_modules/html-to-image/es/apply-style.js
2848
+ function applyStyle(node, options) {
2849
+ const { style } = node;
2850
+ if (options.backgroundColor) {
2851
+ style.backgroundColor = options.backgroundColor;
2852
+ }
2853
+ if (options.width) {
2854
+ style.width = `${options.width}px`;
2855
+ }
2856
+ if (options.height) {
2857
+ style.height = `${options.height}px`;
2858
+ }
2859
+ const manual = options.style;
2860
+ if (manual != null) {
2861
+ Object.keys(manual).forEach((key) => {
2862
+ style[key] = manual[key];
2863
+ });
2864
+ }
2865
+ return node;
2866
+ }
2867
+
2868
+ // ../../node_modules/html-to-image/es/embed-webfonts.js
2869
+ var cssFetchCache = {};
2870
+ async function fetchCSS(url) {
2871
+ let cache2 = cssFetchCache[url];
2872
+ if (cache2 != null) {
2873
+ return cache2;
2874
+ }
2875
+ const res = await fetch(url);
2876
+ const cssText = await res.text();
2877
+ cache2 = { url, cssText };
2878
+ cssFetchCache[url] = cache2;
2879
+ return cache2;
2880
+ }
2881
+ async function embedFonts(data, options) {
2882
+ let cssText = data.cssText;
2883
+ const regexUrl = /url\(["']?([^"')]+)["']?\)/g;
2884
+ const fontLocs = cssText.match(/url\([^)]+\)/g) || [];
2885
+ const loadFonts = fontLocs.map(async (loc) => {
2886
+ let url = loc.replace(regexUrl, "$1");
2887
+ if (!url.startsWith("https://")) {
2888
+ url = new URL(url, data.url).href;
2889
+ }
2890
+ return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {
2891
+ cssText = cssText.replace(loc, `url(${result})`);
2892
+ return [loc, result];
2893
+ });
2894
+ });
2895
+ return Promise.all(loadFonts).then(() => cssText);
2896
+ }
2897
+ function parseCSS(source) {
2898
+ if (source == null) {
2899
+ return [];
2900
+ }
2901
+ const result = [];
2902
+ const commentsRegex = /(\/\*[\s\S]*?\*\/)/gi;
2903
+ let cssText = source.replace(commentsRegex, "");
2904
+ const keyframesRegex = new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})", "gi");
2905
+ while (true) {
2906
+ const matches = keyframesRegex.exec(cssText);
2907
+ if (matches === null) {
2908
+ break;
2909
+ }
2910
+ result.push(matches[0]);
2911
+ }
2912
+ cssText = cssText.replace(keyframesRegex, "");
2913
+ const importRegex = /@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi;
2914
+ const combinedCSSRegex = "((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})";
2915
+ const unifiedRegex = new RegExp(combinedCSSRegex, "gi");
2916
+ while (true) {
2917
+ let matches = importRegex.exec(cssText);
2918
+ if (matches === null) {
2919
+ matches = unifiedRegex.exec(cssText);
2920
+ if (matches === null) {
2921
+ break;
2922
+ } else {
2923
+ importRegex.lastIndex = unifiedRegex.lastIndex;
2924
+ }
2925
+ } else {
2926
+ unifiedRegex.lastIndex = importRegex.lastIndex;
2927
+ }
2928
+ result.push(matches[0]);
2929
+ }
2930
+ return result;
2931
+ }
2932
+ async function getCSSRules(styleSheets, options) {
2933
+ const ret = [];
2934
+ const deferreds = [];
2935
+ styleSheets.forEach((sheet) => {
2936
+ if ("cssRules" in sheet) {
2937
+ try {
2938
+ toArray(sheet.cssRules || []).forEach((item, index) => {
2939
+ if (item.type === CSSRule.IMPORT_RULE) {
2940
+ let importIndex = index + 1;
2941
+ const url = item.href;
2942
+ const deferred = fetchCSS(url).then((metadata) => embedFonts(metadata, options)).then((cssText) => parseCSS(cssText).forEach((rule) => {
2943
+ try {
2944
+ sheet.insertRule(rule, rule.startsWith("@import") ? importIndex += 1 : sheet.cssRules.length);
2945
+ } catch (error) {
2946
+ console.error("Error inserting rule from remote css", {
2947
+ rule,
2948
+ error
2949
+ });
2950
+ }
2951
+ })).catch((e) => {
2952
+ console.error("Error loading remote css", e.toString());
2953
+ });
2954
+ deferreds.push(deferred);
2955
+ }
2956
+ });
2957
+ } catch (e) {
2958
+ const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];
2959
+ if (sheet.href != null) {
2960
+ deferreds.push(fetchCSS(sheet.href).then((metadata) => embedFonts(metadata, options)).then((cssText) => parseCSS(cssText).forEach((rule) => {
2961
+ inline.insertRule(rule, sheet.cssRules.length);
2962
+ })).catch((err) => {
2963
+ console.error("Error loading remote stylesheet", err);
2964
+ }));
2965
+ }
2966
+ console.error("Error inlining remote css file", e);
2967
+ }
2968
+ }
2969
+ });
2970
+ return Promise.all(deferreds).then(() => {
2971
+ styleSheets.forEach((sheet) => {
2972
+ if ("cssRules" in sheet) {
2973
+ try {
2974
+ toArray(sheet.cssRules || []).forEach((item) => {
2975
+ ret.push(item);
2976
+ });
2977
+ } catch (e) {
2978
+ console.error(`Error while reading CSS rules from ${sheet.href}`, e);
2979
+ }
2980
+ }
2981
+ });
2982
+ return ret;
2983
+ });
2984
+ }
2985
+ function getWebFontRules(cssRules) {
2986
+ return cssRules.filter((rule) => rule.type === CSSRule.FONT_FACE_RULE).filter((rule) => shouldEmbed(rule.style.getPropertyValue("src")));
2987
+ }
2988
+ async function parseWebFontRules(node, options) {
2989
+ if (node.ownerDocument == null) {
2990
+ throw new Error("Provided element is not within a Document");
2991
+ }
2992
+ const styleSheets = toArray(node.ownerDocument.styleSheets);
2993
+ const cssRules = await getCSSRules(styleSheets, options);
2994
+ return getWebFontRules(cssRules);
2995
+ }
2996
+ async function getWebFontCSS(node, options) {
2997
+ const rules = await parseWebFontRules(node, options);
2998
+ const cssTexts = await Promise.all(rules.map((rule) => {
2999
+ const baseUrl = rule.parentStyleSheet ? rule.parentStyleSheet.href : null;
3000
+ return embedResources(rule.cssText, baseUrl, options);
3001
+ }));
3002
+ return cssTexts.join("\n");
3003
+ }
3004
+ async function embedWebFonts(clonedNode, options) {
3005
+ const cssText = options.fontEmbedCSS != null ? options.fontEmbedCSS : options.skipFonts ? null : await getWebFontCSS(clonedNode, options);
3006
+ if (cssText) {
3007
+ const styleNode = document.createElement("style");
3008
+ const sytleContent = document.createTextNode(cssText);
3009
+ styleNode.appendChild(sytleContent);
3010
+ if (clonedNode.firstChild) {
3011
+ clonedNode.insertBefore(styleNode, clonedNode.firstChild);
3012
+ } else {
3013
+ clonedNode.appendChild(styleNode);
3014
+ }
3015
+ }
3016
+ }
3017
+
3018
+ // ../../node_modules/html-to-image/es/index.js
3019
+ async function toSvg(node, options = {}) {
3020
+ const { width, height } = getImageSize(node, options);
3021
+ const clonedNode = await cloneNode(node, options, true);
3022
+ await embedWebFonts(clonedNode, options);
3023
+ await embedImages(clonedNode, options);
3024
+ applyStyle(clonedNode, options);
3025
+ const datauri = await nodeToDataURL(clonedNode, width, height);
3026
+ return datauri;
3027
+ }
3028
+ async function toCanvas(node, options = {}) {
3029
+ const { width, height } = getImageSize(node, options);
3030
+ const svg = await toSvg(node, options);
3031
+ const img = await createImage(svg);
3032
+ const canvas = document.createElement("canvas");
3033
+ const context = canvas.getContext("2d");
3034
+ const ratio = options.pixelRatio || getPixelRatio();
3035
+ const canvasWidth = options.canvasWidth || width;
3036
+ const canvasHeight = options.canvasHeight || height;
3037
+ canvas.width = canvasWidth * ratio;
3038
+ canvas.height = canvasHeight * ratio;
3039
+ if (!options.skipAutoScale) {
3040
+ checkCanvasDimensions(canvas);
3041
+ }
3042
+ canvas.style.width = `${canvasWidth}`;
3043
+ canvas.style.height = `${canvasHeight}`;
3044
+ if (options.backgroundColor) {
3045
+ context.fillStyle = options.backgroundColor;
3046
+ context.fillRect(0, 0, canvas.width, canvas.height);
3047
+ }
3048
+ context.drawImage(img, 0, 0, canvas.width, canvas.height);
3049
+ return canvas;
3050
+ }
3051
+ async function toPng(node, options = {}) {
3052
+ const canvas = await toCanvas(node, options);
3053
+ return canvas.toDataURL();
3054
+ }
3055
+
3056
+ // src/screenshot-utils.ts
3057
+ async function takeScreenshot(node) {
3058
+ const screenshot = await toPng(node, { cacheBust: true }).then((dataUrl) => {
3059
+ return dataUrl;
3060
+ }).catch((err) => {
3061
+ console.error("Error taking screenshot", err);
3062
+ return void 0;
3063
+ });
3064
+ if (!screenshot) {
3065
+ return void 0;
3066
+ }
3067
+ return screenshot;
3068
+ }
7
3069
  //# sourceMappingURL=index.js.map