@toolbox-web/grid 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all.js +2 -2
- package/all.js.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/plugin/index.d.ts +1 -0
- package/lib/core/plugin/types.d.ts +61 -0
- package/lib/core/types.d.ts +54 -2
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/export/index.js +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/export/types.d.ts +35 -5
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/index.js +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder-columns/index.js.map +1 -1
- package/lib/plugins/reorder-rows/index.js.map +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/row-drag-drop/index.js.map +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/sticky-rows/index.js.map +1 -1
- package/lib/plugins/tooltip/index.js.map +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/public.d.ts +1 -1
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/export.umd.js +1 -1
- package/umd/plugins/export.umd.js.map +1 -1
- package/umd/plugins/grouping-columns.umd.js +1 -1
- package/umd/plugins/grouping-columns.umd.js.map +1 -1
package/all.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{w as e,C as t,BaseGridPlugin as i,resolveCellValue as r,s as n,t as o,E as s,e as l,a,g as d,invalidateAccessorCache as c,f as u,b as h,c as g,d as p,h as f,i as m,GridClasses as w,j as b,aggregatorRegistry as v,k as y,l as C,r as x,getValueAggregator as E,P as S,m as R,n as A,o as k,p as I,M as _,q as T,u as L,v as F,D as G,builtInSort as D,x as M,y as N,z as q,F as P,T as z,N as O}from"./index.js";import{CORE_CONSUMED_ADAPTER_METHODS as H,DEFAULT_A11Y_MESSAGES as K,DEFAULT_ANIMATION_CONFIG as B,DEFAULT_GRID_ICONS as $,DGEvents as W,DataGridElement as V,FitModeEnum as j,GridCSSVars as U,GridDataAttrs as Y,DataGridElement as Z,GridSelectors as Q,PluginEvents as X,PluginManager as J,RenderPhase as ee,createGrid as te,defaultComparator as ie,queryGrid as re,setFeatureResolver as ne}from"./index.js";function oe(e,t,i=!0){let r=e;if(i&&(r=r.filter(e=>!e.hidden&&!e.field.startsWith("__")&&!0!==e.utility)),t?.length){const e=new Set(t);r=r.filter(t=>e.has(t.field))}return r}function se(e,t){return t?.length?[...t].sort((e,t)=>e-t).map(t=>e[t]).filter(e=>null!=e):e}function le(e,t){const i=t.delimiter??"\t",r=t.newline??"\n",n=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),o=n.length,s=[];let l=[],a=0,d=!1,c=!1;const u=e=>{const t=n.slice(a,e);return c?function(e){let t="",i=!1;for(let r=0;r<e.length;r++){const n=e[r];'"'===n?i?'"'===e[r+1]?(t+='"',r++):i=!1:i=!0:t+=n}return t}(t):t},h=()=>{(l.length>1||l.some(e=>""!==e.trim()))&&s.push(l),l=[]};for(let g=0;g<o;g++){const e=n[g];'"'===e?(c=!0,d?'"'===n[g+1]?g++:d=!1:d=!0):e!==i||d?e!==r||d||(l.push(u(g)),a=g+1,c=!1,h()):(l.push(u(g)),a=g+1,c=!1)}return l.push(u(o)),h(),s}function ae(e,t){const{rows:i,target:r,fields:n}=e;if(!r)return;const o=t.rows,s=t.effectiveConfig.columns??[],l=s.map(e=>e.field),a=/* @__PURE__ */new Map;s.forEach(e=>{a.set(e.field,!0===e.editable)});const d=[...o],c=r.bounds?r.bounds.endRow:1/0;i.forEach((e,t)=>{const i=r.row+t;if(!(i>c)){if(r.bounds){if(i>=d.length)return}else for(;i>=d.length;){const e={};l.forEach(t=>e[t]=""),d.push(e)}d[i]={...d[i]},e.forEach((e,t)=>{const r=n[t];r&&a.get(r)&&(d[i][r]=e)})}}),t.rows=d}class de extends i{static manifest={queries:[{type:"clipboard:copy",description:"Triggers a copy operation and returns the copied text"}]};static dependencies=[{name:"selection",required:!1,reason:"Enables copy/paste of selected cells instead of entire grid"}];name="clipboard";get defaultConfig(){return{includeHeaders:!1,delimiter:"\t",newline:"\n",quoteStrings:!1}}lastCopied=null;attach(e){super.attach(e),e.addEventListener("paste",e=>this.#e(e),{signal:this.disconnectSignal})}detach(){this.lastCopied=null}handleQuery(e){if("clipboard:copy"===e.type)return this.copy(),!0}onKeyDown(e){return!(!e.ctrlKey&&!e.metaKey||"c"!==e.key)&&(e.preventDefault(),this.#t(e.target),!0)}#t(e){const t=this.#i();if(t&&0===t.ranges.length){const t=this.#r(e);if(!t)return;const i=this.columns[t.col];if(!i)return;return void this.copy({rowIndices:[t.row],columns:[i.field]})}this.copy()}#e(e){if(this.#n(e.target))return;const t=e.clipboardData?.getData("text/plain");if(!t)return;e.preventDefault();const i=le(t,this.config),r=this.#i(),n=r?.ranges?.[0],o=n?.from.row??0,s=n?.from.col??0,l=n&&("range"===r?.mode||"row"===r?.mode)&&(n.from.row!==n.to.row||n.from.col!==n.to.col)?{endRow:n.to.row,endCol:n.to.col}:null,a=l?.endCol??this.visibleColumns.length-1,d=this.visibleColumns[s],c=d?{row:o,col:s,field:d.field,bounds:l}:null,u=[],h=i[0]?.length??0;for(let p=0;p<h&&s+p<=a;p++){const e=this.visibleColumns[s+p];e&&u.push(e.field)}const g={rows:i,text:t,target:c,fields:u};this.emit("paste",g),this.#o(g)}#o(e){if(!this.grid)return;const{pasteHandler:t}=this.config;if(null===t)return;(t??ae)(e,this.grid)}#n(e){return e instanceof Element&&!!e.closest('input, textarea, select, [contenteditable=""], [contenteditable="true"]')}#i(){const e=this.grid?.query("getSelection");return e?.[0]}#s(e){const t=this.#i();let i,r;if(e?.columns)i=oe(this.columns,e.columns);else if(t?.ranges.length&&"row"!==t.mode){const e=t.ranges[t.ranges.length-1],r=Math.min(e.from.col,e.to.col),n=Math.max(e.from.col,e.to.col);i=oe(this.visibleColumns.slice(r,n+1))}else i=oe(this.columns);if(e?.rowIndices)r=se(this.rows,e.rowIndices);else if(t?.ranges.length){const e=t.ranges[t.ranges.length-1],i=Math.min(e.from.row,e.to.row),n=Math.max(e.from.row,e.to.row);r=[];for(let t=i;t<=n;t++){const e=this.rows[t];e&&r.push(e)}}else r=this.rows;return{columns:i,rows:r}}#l(e,t,i){const n=i?.delimiter??this.config.delimiter??"\t",o=i?.newline??this.config.newline??"\n",s=i?.includeHeaders??this.config.includeHeaders??!1,l=i?.processCell??this.config.processCell,a=[];s&&a.push(e.map(e=>e.header||e.field).join(n));for(const d of t){const t=e.map(e=>{const t=r(d,e);return l?l(t,e.field,d):this.#a(e,t,d)});a.push(t.join(n))}return a.join(o)}#a(e,t,i){if(e.format)try{const r=e.format(t,i);return null==r?"":String(r)}catch{}if(e.renderer||e.viewRenderer){const t=this.#d(e.field,i);if(null!=t)return t}return function(e){return null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}(t)}#d(e,t){const i=this.gridElement;if(!i)return null;const r=this.rows.indexOf(t);if(-1===r)return null;const n=i.querySelector(`.cell[data-row="${r}"][data-field="${e}"]`);return n?n.textContent?.trim()??null:null}#r(e){const t=e.closest("[data-field-cache]");if(!t)return null;const i=t.dataset.fieldCache,r=t.dataset.row;if(!i||!r)return null;const n=parseInt(r,10);if(isNaN(n))return null;const o=this.columns.findIndex(e=>e.field===i);return-1===o?null:{row:n,col:o}}getSelectionAsText(e){const{columns:t,rows:i}=this.#s(e);return 0===t.length||0===i.length?"":this.#l(t,i,e)}async copy(i){const{columns:r,rows:n}=this.#s(i);if(0===r.length||0===n.length)return"";const o=this.#l(r,n,i);return await async function(i){try{return await navigator.clipboard.writeText(i),!0}catch(r){e(t,`Clipboard API failed: ${r}`);const n=document.createElement("textarea");n.value=i,n.style.position="fixed",n.style.opacity="0",n.style.pointerEvents="none",document.body.appendChild(n),n.select();const o=document.execCommand("copy");return document.body.removeChild(n),o}}(o),this.lastCopied={text:o,timestamp:Date.now()},this.emit("copy",{text:o,rowCount:n.length,columnCount:r.length}),o}async copyRows(e,t){return 0===e.length?"":this.copy({...t,rowIndices:e})}async paste(){const e=await async function(){try{return await navigator.clipboard.readText()}catch{return""}}();return e?le(e,this.config):null}getLastCopied(){return this.lastCopied}}function ce(e){if(null==e)return 100;if("number"==typeof e)return e;const t=parseFloat(e);return isNaN(t)?100:t}function ue(e){return e.map(e=>ce(e.width))}function he(e){const t=[];let i=0;for(const r of e)t.push(i),i+=ce(r.width);return t}function ge(e){return e.reduce((e,t)=>e+ce(t.width),0)}function pe(e,t,i,r,n){const o=i.length;if(0===o)return{startCol:0,endCol:0,visibleColumns:[]};let s=function(e,t,i){let r=0,n=t.length-1;for(;r<n;){const o=Math.floor((r+n)/2);t[o]+i[o]<=e?r=o+1:n=o}return r}(e,i,r);s=Math.max(0,s-n);const l=e+t;let a=s;for(let c=s;c<o;c++){if(i[c]>=l){a=c-1;break}a=c}a=Math.min(o-1,a+n);const d=[];for(let c=s;c<=a;c++)d.push(c);return{startCol:s,endCol:a,visibleColumns:d}}class fe extends i{name="columnVirtualization";get defaultConfig(){return{autoEnable:!0,threshold:30,overscan:3}}isVirtualized=!1;startCol=0;endCol=0;scrollLeft=0;totalWidth=0;columnWidths=[];columnOffsets=[];originalColumns=[];attach(e){super.attach(e);const t=this.columns;this.columnWidths=ue(t),this.columnOffsets=he(t),this.totalWidth=ge(t),this.endCol=t.length-1}detach(){this.#c(),this.columnWidths=[],this.columnOffsets=[],this.originalColumns=[],this.isVirtualized=!1,this.startCol=0,this.endCol=0,this.scrollLeft=0,this.totalWidth=0}#c(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".header-row");t&&(t.style.paddingLeft="",t.style.minWidth="");e.querySelectorAll(".data-grid-row").forEach(e=>{e.style.paddingLeft=""});const i=e.querySelector(".rows-viewport .rows");i&&(i.style.width="");const r=e.querySelector(".rows-body");r&&(r.style.minWidth="")}processColumns(e){(0===this.originalColumns.length||e.length>=this.originalColumns.length)&&(this.originalColumns=e,this.columnWidths=ue(e),this.columnOffsets=he(e),this.totalWidth=ge(e));const t=this.originalColumns,i=(r=t.length,n=this.config.threshold??30,!!(this.config.autoEnable??!0)&&r>n);var r,n;if(this.isVirtualized=i??!1,!i)return this.startCol=0,this.endCol=t.length-1,[...t];const o=this.grid?.clientWidth||800,s=pe(this.scrollLeft,o,this.columnOffsets,this.columnWidths,this.config.overscan??3);return this.startCol=s.startCol,this.endCol=s.endCol,s.visibleColumns.map(e=>t[e])}afterRender(){if(!this.isVirtualized)return;const e=this.gridElement;if(!e)return;const t=this.columnOffsets[this.startCol]??0,i=e.querySelector(".header-row"),r=e.querySelectorAll(".data-grid-row");i&&(i.style.paddingLeft=`${t}px`,i.style.minWidth=`${this.totalWidth}px`),r.forEach(e=>{e.style.paddingLeft=`${t}px`});const n=e.querySelector(".rows-viewport .rows");n&&(n.style.width=`${this.totalWidth}px`);const o=e.querySelector(".rows-body");o&&(o.style.minWidth=`${this.totalWidth}px`)}onScroll(e){if(!this.isVirtualized)return;Math.abs(e.scrollLeft-this.scrollLeft)<1||(this.scrollLeft=e.scrollLeft,this.requestColumnsRender())}getIsVirtualized(){return this.isVirtualized}getVisibleColumnRange(){return{start:this.startCol,end:this.endCol}}scrollToColumn(e){const t=this.columnOffsets[e]??0,i=this.gridElement;i&&(i.scrollLeft=t)}getColumnOffset(e){return this.columnOffsets[e]??0}getTotalWidth(){return this.totalWidth}}const me="@layer tbw-plugins{.tbw-context-menu{position:fixed;background:var(--tbw-context-menu-bg, var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg, var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border, var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius, var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow, 0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width, var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size, var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family, var(--tbw-font-family))}.tbw-context-menu-item{display:flex;align-items:center;padding:var(--tbw-context-menu-item-padding, var(--tbw-menu-item-padding));cursor:pointer;gap:var(--tbw-context-menu-item-gap, var(--tbw-menu-item-gap))}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover, var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger, var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size, var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut kbd{color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size, var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size, var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted))}.tbw-context-menu-separator{height:1px;background:var(--tbw-context-menu-border, var(--tbw-color-border));margin:var(--tbw-spacing-xs) 0}}";function we(e,t){return("function"==typeof e?e(t):e).filter(e=>!0!==e.hidden&&("function"!=typeof e.hidden||!e.hidden(t)))}function be(e,t){return!0===e.disabled||"function"==typeof e.disabled&&e.disabled(t)}function ve(e,t,i,r){const s=document.createElement("div");s.className="tbw-context-menu",s.setAttribute("role","menu");const l=e.some(e=>!e.separator&&e.icon);for(const a of e){if(a.separator){const e=document.createElement("div");e.className="tbw-context-menu-separator",e.setAttribute("role","separator"),s.appendChild(e);continue}const e=document.createElement("div");e.className="tbw-context-menu-item",a.cssClass&&e.classList.add(a.cssClass),e.setAttribute("role","menuitem"),e.setAttribute("data-id",a.id),e.setAttribute("tabindex","-1");const d=be(a,t);if(d&&(e.classList.add("disabled"),e.setAttribute("aria-disabled","true")),a.icon){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=n(a.icon),e.appendChild(t)}else if(l){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=" ",e.appendChild(t)}const c=document.createElement("span");if(c.className="tbw-context-menu-label",c.textContent=a.name,e.appendChild(c),a.shortcut){const t=document.createElement("span");if(t.className="tbw-context-menu-shortcut",Array.isArray(a.shortcut))a.shortcut.forEach((e,i)=>{i>0&&t.appendChild(document.createTextNode("+"));const r=document.createElement("kbd");r.textContent=e,t.appendChild(r)});else{const e=document.createElement("kbd");e.textContent=a.shortcut,t.appendChild(e)}e.appendChild(t)}if(a.subMenu?.length){const s=document.createElement("span");s.className="tbw-context-menu-arrow",s.dataset.icon=o("submenuArrow"),void 0!==r&&("string"==typeof r?s.innerHTML=n(r):r instanceof HTMLElement&&s.appendChild(r.cloneNode(!0))),e.appendChild(s),e.addEventListener("mouseenter",()=>{if(e.querySelector(".tbw-context-menu"))return;if(!a.subMenu)return;const n=ve(we(a.subMenu,t),t,i,r);n.classList.add("tbw-context-submenu"),n.style.position="absolute",n.style.left="100%",n.style.top="0",e.style.position="relative",e.appendChild(n)}),e.addEventListener("mouseleave",()=>{const t=e.querySelector(".tbw-context-menu");t&&t.remove()})}d||!a.action||a.subMenu||e.addEventListener("click",e=>{e.stopPropagation(),i(a)}),s.appendChild(e)}return s}const ye="getContextMenuItems";let Ce=null,xe=null,Ee=0;const Se=/* @__PURE__ */new Set,Re=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:e=>{const t=e.grid;t?.query?.("clipboard:copy")}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:e=>{const t=e.grid;t?.query?.("export:csv")}}];class Ae extends i{static manifest={queries:[{type:ye,description:"Collects context menu items from other plugins for header right-click menus"}]};name="contextMenu";get defaultConfig(){return{items:Re}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;attach(e){super.attach(e),this.installGlobalHandlers(),Ee++,Se.add(this)}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,Se.delete(this),this.uninstallGlobalHandlers()}syncSelectionOnContextMenu(e){if(e<0)return[];const t=this.grid?.query("getSelectedRowIndices"),i=t?.[0];return i?i.includes(e)?i:(this.grid?.query("selectRows",[e]),[e]):[e]}static CSS_VARS_TO_COPY=["--tbw-color-panel-bg","--tbw-color-fg","--tbw-color-fg-muted","--tbw-color-border","--tbw-color-row-hover","--tbw-color-shadow","--tbw-color-danger","--tbw-border-radius","--tbw-font-family","--tbw-font-size-sm","--tbw-font-size-xs","--tbw-font-size-2xs","--tbw-spacing-xs","--tbw-icon-size","--tbw-menu-min-width","--tbw-menu-item-padding","--tbw-menu-item-gap","--tbw-context-menu-bg","--tbw-context-menu-fg","--tbw-context-menu-border","--tbw-context-menu-radius","--tbw-context-menu-shadow","--tbw-context-menu-hover","--tbw-context-menu-danger","--tbw-context-menu-muted","--tbw-context-menu-min-width","--tbw-context-menu-font-size","--tbw-context-menu-font-family","--tbw-context-menu-item-padding","--tbw-context-menu-item-gap","--tbw-context-menu-icon-size","--tbw-context-menu-shortcut-size","--tbw-context-menu-arrow-size","--tbw-icon-submenu-arrow"];copyGridStyles(e){const t=this.gridElement;if(!t)return;const i=getComputedStyle(t),r=[],n=i.getPropertyValue("color-scheme").trim();n&&r.push(`color-scheme: ${n}`);for(const o of Ae.CSS_VARS_TO_COPY){const e=i.getPropertyValue(o).trim();e&&r.push(`${o}: ${e}`)}if(r.length>0){const t=e.getAttribute("style")||"";e.setAttribute("style",t+r.join("; ")+";")}}installGlobalHandlers(){if(!xe&&"undefined"!=typeof document&&me&&(xe=document.createElement("style"),xe.id="tbw-context-menu-styles",xe.textContent=me,document.head.appendChild(xe)),!Ce){Ce=new AbortController;const e=Ce.signal,t=()=>{for(const e of Se)e.isMenuOpen()&&e.hideMenu();document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove())};document.addEventListener("click",t,{signal:e}),document.addEventListener("keydown",e=>{"Escape"===e.key&&t()},{signal:e}),document.addEventListener("scroll",t,{capture:!0,signal:e})}}uninstallGlobalHandlers(){Ee--,Ee>0||(Ce&&(Ce.abort(),Ce=null),xe&&(xe.remove(),xe=null))}collectPluginItems(e){if(!this.grid)return[];const t=this.grid.query(ye,e),i=[];for(const r of t)Array.isArray(r)&&i.push(...r);return i.sort((e,t)=>(e.order??100)-(t.order??100)),this.insertGroupSeparators(i)}insertGroupSeparators(e){if(e.length<=1)return e;const t=[];let i=-1;for(const r of e){if(r.separator){t.push(r);continue}const e=Math.floor((r.order??100)/10);i>=0&&e!==i&&t.push({id:`__sep-${i}-${e}`,label:"",separator:!0,action:()=>{}}),i=e,t.push(r)}return t}convertPluginItems(e){return e.map(e=>({id:e.id,name:e.label,icon:e.icon,shortcut:e.shortcut,disabled:e.disabled??!1,action:()=>e.action(),separator:e.separator,cssClass:e.cssClass}))}openMenuAt(e,t,i,r=!1){this.params=e,this.position={x:t,y:i};const n=this.collectPluginItems(e);let o=we(this.config.items??Re,e);if(n.length>0){const e=this.convertPluginItems(n);o=o.length>0&&e.length>0?[...o,{id:"__plugin-sep",name:"",separator:!0},...e]:[...o,...e]}var s,l;(o=function(e){const t=[];for(const i of e)i.separator&&(0===t.length||t[t.length-1].separator)||t.push(i);return t.length>0&&t[t.length-1].separator&&t.pop(),t}(o),o.length)&&(document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove()),this.menuElement=null,this.menuElement=ve(o,e,t=>{t.action&&t.action(e),this.hideMenu()},this.grid?.gridConfig?.icons?.submenuArrow),s=this.menuElement,l=()=>this.hideMenu(),s.addEventListener("keydown",e=>{const t=Array.from(s.querySelectorAll('[role="menuitem"]:not(.disabled)'));if(!t.length)return;const i=document.activeElement,r=t.indexOf(i);switch(e.key){case"ArrowDown":e.preventDefault(),t[r<t.length-1?r+1:0].focus();break;case"ArrowUp":e.preventDefault(),t[r>0?r-1:t.length-1].focus();break;case"Enter":case" ":e.preventDefault(),i&&t.includes(i)&&i.click();break;case"Escape":e.preventDefault(),l()}}),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),function(e,t,i){e.style.position="fixed",e.style.left=`${t}px`,e.style.top=`${i}px`,e.style.visibility="hidden",e.style.zIndex="10000";const r=e.getBoundingClientRect(),n=window.innerWidth,o=window.innerHeight;let s=t,l=i;t+r.width>n&&(s=t-r.width),i+r.height>o&&(l=i-r.height),s=Math.max(0,s),l=Math.max(0,l),e.style.left=`${s}px`,e.style.top=`${l}px`,e.style.visibility="visible"}(this.menuElement,t,i),this.isOpen=!0,r&&function(e){const t=e.querySelector('[role="menuitem"]:not(.disabled)');t?.focus()}(this.menuElement),this.emit("context-menu-open",{params:e,items:o}))}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-grid-root");t&&"true"!==t.getAttribute("data-context-menu-bound")&&(t.setAttribute("data-context-menu-bound","true"),t.addEventListener("contextmenu",e=>{const t=e;t.preventDefault();const i=t.target,r=i.closest("[data-row][data-col]"),n=i.closest('[part~="header-cell"]');let o;if(r){const e=parseInt(r.getAttribute("data-row")??"-1",10),i=parseInt(r.getAttribute("data-col")??"-1",10),n=this.visibleColumns[i],s=this.rows[e],l=this.syncSelectionOnContextMenu(e);o={row:s,rowIndex:e,column:n,columnIndex:i,field:n?.field??"",value:s?.[n?.field]??null,isHeader:!1,event:t,selectedRows:l}}else{if(!n)return;{const e=parseInt(n.getAttribute("data-col")??"-1",10),i=this.visibleColumns[e];o={row:null,rowIndex:-1,column:i,columnIndex:e,field:i?.field??"",value:null,isHeader:!0,event:t,selectedRows:[]}}}this.openMenuAt(o,t.clientX,t.clientY)}))}onKeyDown(e){const t="F10"===e.key&&e.shiftKey,i="ContextMenu"===e.key;if(!t&&!i)return;e.preventDefault();const r=this.grid;if(!r)return;const n=r._focusRow,o=r._focusCol,s=this.visibleColumns[o],l=this.rows[n],a=this.gridElement,d=a?.querySelector(`[data-row="${n}"][data-col="${o}"]`);let c=0,u=0;if(d){const e=d.getBoundingClientRect();c=e.left+e.width/2,u=e.bottom}const h=this.syncSelectionOnContextMenu(n),g={row:l,rowIndex:n,column:s,columnIndex:o,field:s?.field??"",value:l?.[s?.field]??null,isHeader:!1,event:e,selectedRows:h};return this.openMenuAt(g,c,u,!0),!0}showMenu(e,t,i){const r={row:i.row??null,rowIndex:i.rowIndex??-1,column:i.column??null,columnIndex:i.columnIndex??-1,field:i.field??"",value:i.value??null,isHeader:i.isHeader??!1,event:i.event??new MouseEvent("contextmenu"),selectedRows:i.selectedRows??[]};this.openMenuAt(r,e,t)}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen&&(this.isOpen=!1)}isMenuOpen(){return this.isOpen}}function ke(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="date",t.value instanceof Date?r.valueAsDate=t.value:"string"==typeof t.value&&t.value&&(r.value=t.value.split("T")[0]),i?.min&&(r.min=i.min),i?.max&&(r.max=i.max),i?.placeholder&&(r.placeholder=i.placeholder);return r.addEventListener("change",()=>{var n;if(r.value)"string"==typeof t.value?t.commit(r.value):t.commit(r.valueAsDate);else if(e.nullable)t.commit(null);else{const e=i?.default;"string"==typeof t.value||"string"==typeof e?t.commit("string"==typeof e?e:`${(n=e??/* @__PURE__ */new Date).getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`):t.commit(e instanceof Date?e:/* @__PURE__ */new Date)}}),r.addEventListener("keydown",e=>{"Escape"===e.key&&t.cancel()}),r}}const Ie="__tbw_null__";function _e(e){switch(e.type){case"number":return function(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="number",r.value=null!=t.value?String(t.value):"",void 0!==i?.min&&(r.min=String(i.min)),void 0!==i?.max&&(r.max=String(i.max)),void 0!==i?.step&&(r.step=String(i.step)),i?.placeholder&&(r.placeholder=i.placeholder);const n=()=>{""===r.value?e.nullable?t.commit(null):t.commit(i?.min??0):t.commit(Number(r.value))};return r.addEventListener("blur",n),r.addEventListener("keydown",e=>{"Enter"===e.key&&n(),"Escape"===e.key&&t.cancel()}),r}}(e);case"boolean":return e=>{const t=document.createElement("input");return t.type="checkbox",t.checked=!!e.value,t.addEventListener("change",()=>e.commit(t.checked)),t};case"date":return ke(e);case"select":return function(e){return t=>{const i=e.editorParams,r=document.createElement("select");if(e.multi&&(r.multiple=!0),e.nullable||i?.includeEmpty){const n=document.createElement("option");n.value=e.nullable?Ie:"",n.textContent=e.nullable?i?.emptyLabel??"(Blank)":i?.emptyLabel??"",null==t.value&&(n.selected=!0),r.appendChild(n)}const n=function(e){const t=e.options;return t?"function"==typeof t?t():t:[]}(e);n.forEach(i=>{const n=document.createElement("option");n.value=String(i.value),n.textContent=i.label,e.multi&&Array.isArray(t.value)&&t.value.includes(i.value)?n.selected=!0:e.multi||t.value!==i.value||(n.selected=!0),r.appendChild(n)});const o=()=>{if(e.multi){const e=Array.from(r.selectedOptions).map(e=>e.value);t.commit(e)}else e.nullable&&r.value===Ie?t.commit(null):t.commit(r.value)};return r.addEventListener("change",o),r.addEventListener("blur",o),r.addEventListener("keydown",e=>{"Escape"===e.key&&t.cancel()}),r}}(e);default:return function(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="text",r.value=null!=t.value?String(t.value):"",void 0!==i?.maxLength&&(r.maxLength=i.maxLength),i?.pattern&&(r.pattern=i.pattern),i?.placeholder&&(r.placeholder=i.placeholder);const n=()=>{const i=r.value;""!==i?"string"==typeof t.value&&i===t.value.replace(/[\n\r]/g,"")||("number"==typeof t.value?t.commit(Number(i)):t.commit(i)):e.nullable?t.commit(null):t.commit("")};return r.addEventListener("blur",n),r.addEventListener("keydown",e=>{"Enter"===e.key&&n(),"Escape"===e.key&&t.cancel()}),r}}(e)}}function Te(e,t,i){if(e instanceof HTMLInputElement){if("checkbox"===e.type)return e.checked;if("number"===e.type){if(""===e.value){if(t?.nullable)return null;const e=t?.editorParams;return e?.min??0}return Number(e.value)}if("date"===e.type)return e.value?"string"==typeof i?e.value:e.valueAsDate:t?.nullable?null:"string"==typeof i?i||/* @__PURE__ */(new Date).toISOString().slice(0,10):i??/* @__PURE__ */new Date;if("number"==typeof i){if(""===e.value){if(t?.nullable)return null;const e=t?.editorParams;return e?.min??0}return Number(e.value)}return""===e.value&&null==i?t?.nullable?null:"":"string"==typeof i&&e.value===i.replace(/[\n\r]/g,"")?i:e.value}return"number"===t?.type&&""!==e.value||"number"==typeof i&&""!==e.value?Number(e.value):null==i&&""===e.value?t?.nullable?null:"":e.value}class Le{#u=/* @__PURE__ */new Map;#h;constructor(e){this.#h=e}setInvalid(e,t,i=""){let r=this.#u.get(e);r||(r=/* @__PURE__ */new Map,this.#u.set(e,r)),r.set(t,i),this.#h(e,t,!0)}clearInvalid(e,t){const i=this.#u.get(e);i&&(i.delete(t),0===i.size&&this.#u.delete(e)),this.#h(e,t,!1)}clearRowInvalid(e){const t=this.#u.get(e);if(t){const i=Array.from(t.keys());this.#u.delete(e),i.forEach(t=>this.#h(e,t,!1))}}clearAllInvalid(){const e=Array.from(this.#u.entries());this.#u.clear(),e.forEach(([e,t])=>{t.forEach((t,i)=>this.#h(e,i,!1))})}isCellInvalid(e,t){return this.#u.get(e)?.has(t)??!1}getInvalidMessage(e,t){return this.#u.get(e)?.get(t)}hasInvalidCells(e){const t=this.#u.get(e);return!!t&&t.size>0}getInvalidFields(e){return new Map(this.#u.get(e)??[])}}function Fe(e,t,i){const r=e.get(t);return!!r&&!Ge(r,i)}function Ge(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(typeof e!=typeof t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!Ge(e[i],t[i]))return!1;return!0}if("object"==typeof e){const i=e,r=t,n=Object.keys(i),o=Object.keys(r);if(n.length!==o.length)return!1;for(const e of n)if(!Ge(i[e],r[e]))return!1;return!0}return!1}function De(e,t,i){e.set(t,structuredClone(i))}function Me(e,t,i){const r=e.get(t);if(!r)return!1;const n=r,o=i;for(const s of Object.keys(n))o[s]=n[s];return!0}class Ne{baselines=/* @__PURE__ */new Map;baselinesWereCaptured=!1;newRowIds=/* @__PURE__ */new Set;changedRowIds=/* @__PURE__ */new Set;committedDirtyRowIds=/* @__PURE__ */new Set;clear(){this.changedRowIds.clear(),this.committedDirtyRowIds.clear(),this.baselines.clear(),this.newRowIds.clear(),this.baselinesWereCaptured=!1}capture(e,t){const i=this.baselines.size;!function(e,t,i){for(const r of t)try{const t=i(r);null==t||e.has(t)||e.set(t,structuredClone(r))}catch{}}(this.baselines,e,t),this.baselines.size>i&&(this.baselinesWereCaptured=!0)}drainCapturedFlag(){return this.baselinesWereCaptured?(this.baselinesWereCaptured=!1,this.baselines.size):null}isRowDirty(e,t){return Fe(this.baselines,e,t)}hasAnyDirty(e){if(this.newRowIds.size>0)return!0;for(const[t]of this.baselines){const i=e(t);if(i&&Fe(this.baselines,t,i))return!0}return!1}isCellDirty(e,t,i){return function(e,t,i,r){const n=e.get(t);return!!n&&!Ge(n[r],i[r])}(this.baselines,e,t,i)}getRowDirtyState(e,t){const i=this.newRowIds.has(e);return{isNew:i,isCommittedDirty:!i&&this.committedDirtyRowIds.has(e)&&Fe(this.baselines,e,t),hasBaseline:this.baselines.has(e)}}markPristine(e,t){De(this.baselines,e,t),this.newRowIds.delete(e),this.changedRowIds.delete(e),this.committedDirtyRowIds.delete(e)}markNew(e){this.newRowIds.add(e),this.committedDirtyRowIds.add(e)}markDirty(e){this.changedRowIds.add(e),this.committedDirtyRowIds.add(e)}markAllPristine(e){for(const[t]of this.baselines){const i=e(t);i&&De(this.baselines,t,i)}this.newRowIds.clear(),this.changedRowIds.clear(),this.committedDirtyRowIds.clear()}getOriginalRow(e){return function(e,t){const i=e.get(t);return i?structuredClone(i):void 0}(this.baselines,e)}hasBaseline(e){return this.baselines.has(e)}getDirtyRows(e){const t=[];for(const[i,r]of this.baselines){const n=e(i);n&&Fe(this.baselines,i,n)&&t.push({id:i,original:structuredClone(r),current:n})}for(const i of this.newRowIds){const r=e(i);r&&t.push({id:i,original:void 0,current:r})}return t}getDirtyRowIds(e){const t=[];for(const[i]of this.baselines){const r=e(i);r&&Fe(this.baselines,i,r)&&t.push(i)}for(const i of this.newRowIds)t.push(i);return t}revertRow(e,t){const i=Me(this.baselines,e,t);return i&&(this.changedRowIds.delete(e),this.committedDirtyRowIds.delete(e)),i}revertAll(e){for(const[t]of this.baselines){const i=e(t);i&&Me(this.baselines,t,i)}this.changedRowIds.clear(),this.committedDirtyRowIds.clear()}getChangedRows(e){const t=[];for(const i of this.changedRowIds){const r=e(i);r&&t.push(r)}return t}getChangedRowIds(){return Array.from(this.changedRowIds)}isRowChanged(e){return this.changedRowIds.has(e)}}const qe='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function Pe(e){return"string"==typeof e&&("__proto__"!==e&&"constructor"!==e&&"prototype"!==e)}function ze(e){}function Oe(e,t){return!1===e.onBeforeEditClose?.(t)}function He(t,i,r,n,o,l,a,d){if(!n.editable)return;if(l.classList.contains("editing"))return;const{grid:c,isGridMode:u,config:h,editingCells:g,editorValueCallbacks:p}=t;let f;try{f=c.getRowId?.(i)}catch{}const m=f?e=>c.updateRow(f,e,"cascade"):ze,w=Pe(n.field)?i[n.field]:void 0;l.classList.add("editing"),g.add(`${r}:${o}`);const b=d??l.parentElement;b&&function(e){const t=(e.__editingCellCount??0)+1;e.__editingCellCount=t,e.setAttribute("data-has-editing","")}(b);let v=!1;const y=e=>{if(v||!u&&!t.isEditSessionActive())return;const o=f?c._getRowEntry(f):void 0,s=o?.row??i,l=o?.index??r;t.commitCellValue(l,n,e,s)},C=()=>{if(v=!0,Pe(n.field)){const e=f?c._getRowEntry(f):void 0;(e?.row??i)[n.field]=w}},x=document.createElement("div");x.className="tbw-editor-host",l.firstElementChild&&c.__frameworkAdapter?.releaseCell?.(l),l.innerHTML="",l.appendChild(x),x.addEventListener("keydown",e=>{if(!e.defaultPrevented){if("Enter"===e.key){const t=e.target;if(t&&"true"===t.getAttribute?.("aria-expanded")&&t.hasAttribute?.("aria-controls"))return}if("Enter"===e.key){if(u){e.stopPropagation(),e.preventDefault();const t=x.querySelector("input,textarea,select");return void(t&&y(Te(t,n,w)))}if(Oe(h,e))return;e.stopPropagation(),e.preventDefault(),v=!0,t.exitRowEdit(r,!1)}if("Escape"===e.key){if(u)return e.stopPropagation(),void e.preventDefault();if(Oe(h,e))return;e.stopPropagation(),e.preventDefault(),C(),t.exitRowEdit(r,!0)}}});const E=n,S=E.__editorTemplate,R=function(e,t){if(t.editor)return t.editor;if(t.__editorTemplate)return"template";if(!t.type)return;const i=e.effectiveConfig?.typeDefaults;if(i?.[t.type]?.editor)return i[t.type].editor;const r=e.__frameworkAdapter;if(r?.getTypeDefault){const i=r.getTypeDefault(t.type,e._hostElement);if(i?.editor)return i.editor}}(c,E)??_e(n),A=w,k=`${r}:${n.field}`,I=[];p.set(k,e=>{for(const t of I)t(e)});const _=e=>{I.push(e)};if("template"===R&&S)!function(e,t,i,r,n,o,s,l,a){const d=i.__editorTemplate;if(!d)return;const c=d.cloneNode(!0),u=i.__compiledEditor;u?c.innerHTML=u({row:r,value:n,field:i.field,column:i,commit:o,cancel:s}):c.querySelectorAll("*").forEach(e=>{1===e.childNodes.length&&e.firstChild?.nodeType===Node.TEXT_NODE&&(e.textContent=e.textContent?.replace(/{{\s*value\s*}}/g,null==n?"":String(n)).replace(/{{\s*row\.([a-zA-Z0-9_]+)\s*}}/g,(e,t)=>{if(!Pe(t))return"";const i=r[t];return null==i?"":String(i)})||"")});const h=c.querySelector("input,textarea,select");if(h){h instanceof HTMLInputElement&&"checkbox"===h.type?h.checked=!!n:h.value=String(n??"");let t=!1;h.addEventListener("blur",()=>{t||o(Te(h,i,n))}),h.addEventListener("keydown",r=>{const l=r;if("Enter"===l.key){if(Oe(e.config,l))return;l.stopPropagation(),l.preventDefault(),t=!0,o(Te(h,i,n)),e.exitRowEdit(a,!1)}if("Escape"===l.key){if(Oe(e.config,l))return;l.stopPropagation(),l.preventDefault(),s(),e.exitRowEdit(a,!0)}}),h instanceof HTMLInputElement&&"checkbox"===h.type&&h.addEventListener("change",()=>o(h.checked)),l||setTimeout(()=>h.focus({preventScroll:!0}),0)}t.appendChild(c)}(t,x,E,i,w,y,C,a,r),_(e=>{if(null!=e&&"object"==typeof e)return;const t=x.querySelector("input,textarea,select");t&&(t instanceof HTMLInputElement&&"checkbox"===t.type?t.checked=!!e:t.value=String(e??""))});else if("string"==typeof R){const e=document.createElement(R);e.value=A,e.addEventListener("change",()=>y(e.value)),_(t=>{e.value=t}),x.appendChild(e),a||queueMicrotask(()=>{const e=x.querySelector(qe);e?.focus({preventScroll:!0})})}else if("function"==typeof R){const e=R({row:i,rowId:f??"",value:A,field:n.field,column:n,commit:y,cancel:C,updateRow:m,onValueChange:_,grid:t.grid});if("string"==typeof e)x.innerHTML=e,function(e,t,i,r){const n=e.querySelector("input,textarea,select");n&&(n.addEventListener("blur",()=>{i(Te(n,t,r))}),n instanceof HTMLInputElement&&"checkbox"===n.type?n.addEventListener("change",()=>i(n.checked)):n instanceof HTMLSelectElement&&n.addEventListener("change",()=>i(Te(n,t,r))))}(x,n,y,w),_(e=>{const t=x.querySelector("input,textarea,select");t&&(t instanceof HTMLInputElement&&"checkbox"===t.type?t.checked=!!e:t.value=String(e??""))});else if(e instanceof Node){x.appendChild(e);e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?_(t=>{e instanceof HTMLInputElement&&"checkbox"===e.type?e.checked=!!t:e.value=String(t??"")}):l.setAttribute("data-editor-managed","")}else!e&&x.hasChildNodes()&&l.setAttribute("data-editor-managed","");a||queueMicrotask(()=>{const e=x.querySelector(qe);e?.focus({preventScroll:!0})})}else if(R&&"object"==typeof R){const r=document.createElement("div");r.setAttribute("data-external-editor",""),r.setAttribute("data-field",n.field),x.appendChild(r),l.setAttribute("data-editor-managed","");const o={row:i,rowId:f??"",value:A,field:n.field,column:n,commit:y,cancel:C,updateRow:m,onValueChange:_,grid:t.grid};if(R.mount)try{R.mount({placeholder:r,context:o,spec:R})}catch(T){e(s,`External editor mount error for column '${n.field}': ${T}`,t.grid.id)}else c.dispatchEvent(new CustomEvent("mount-external-editor",{detail:{placeholder:r,spec:R,context:o}}))}}class Ke extends i{static manifest={ownedProperties:[{property:"editable",level:"column",description:'the "editable" column property',isUsed:e=>!0===e||"function"==typeof e},{property:"editor",level:"column",description:'the "editor" column property'},{property:"editorParams",level:"column",description:'the "editorParams" column property'},{property:"nullable",level:"column",description:'the "nullable" column property (allows null values)'}],events:[{type:"cell-edit-committed",description:"Emitted when a cell edit is committed (for plugin-to-plugin coordination)"}],queries:[{type:"isEditing",description:"Returns whether any cell is currently being edited"}]};name="editing";styles="@layer tbw-plugins{tbw-grid{--tbw-editing-bg: var(--tbw-color-selection);--tbw-editing-row-bg: var(--tbw-editing-bg);--tbw-editing-border: var(--tbw-border-input, 1px solid var(--tbw-color-border-strong));--tbw-padding-editing-input: var(--tbw-cell-padding-input, 2px 6px);--tbw-font-size-editor: inherit;--tbw-editing-row-outline-color: var(--tbw-color-accent);--tbw-editing-row-outline-width: 1px;&:not(.tbw-grid-mode) .data-grid-row:has(.editing){background:var(--tbw-editing-row-bg);outline:var(--tbw-editing-row-outline-width) solid var(--tbw-editing-row-outline-color);outline-offset:calc(-1 * var(--tbw-editing-row-outline-width))}.data-grid-row>.cell.editing{overflow:hidden;padding:0;display:flex;min-height:max(var(--tbw-row-height),calc(1lh + 2 * var(--tbw-cell-padding-v, .25em) + var(--tbw-border-width, 1px)));align-items:center;justify-content:center}.data-grid-row>.cell.editing input:not([type=checkbox]),.data-grid-row>.cell.editing select,.data-grid-row>.cell.editing textarea{width:100%;height:100%;flex:1 1 auto;align-self:stretch;min-width:0;border:var(--tbw-editing-border);padding:var(--tbw-padding-editing-input);font-size:var(--tbw-font-size-editor)}.tbw-editor-host{display:contents}--tbw-invalid-bg: light-dark(#fef2f2, #450a0a);--tbw-invalid-border-color: light-dark(#ef4444, #f87171);.data-grid-row>.cell[data-invalid=true]{background:var(--tbw-invalid-bg);outline:1px solid var(--tbw-invalid-border-color);outline-offset:-1px}}}";get defaultConfig(){return{mode:"row",editOn:"click"}}get#g(){return"grid"===this.config.mode}#p(e,t){const i=this.#f.effectiveConfig?.rowEditable;if(i&&!i(t))return!1;const{editable:r}=e;return"function"==typeof r?r(t):!0===r}#m(e){return!0===e.editable||"function"==typeof e.editable}#w=-1;#b;#v;#y=-1;#C=/* @__PURE__ */new Map;#x=/* @__PURE__ */new Set;#E=/* @__PURE__ */new Map;#S=!1;#R=-1;#A;#k=!1;#I=!1;#_=!1;#T=null;#L=new Ne;#F;get#f(){return this.grid}attach(e){super.attach(e);const t=this.disconnectSignal,i=this.#f;if(this.#A=new Le((e,t,i)=>{this.#G(e,t,i)}),this.#F={grid:i,isGridMode:this.#g,config:this.config,editingCells:this.#x,editorValueCallbacks:this.#E,isEditSessionActive:()=>-1!==this.#w,commitCellValue:(e,t,i,r)=>this.#D(e,t,i,r),exitRowEdit:(e,t)=>this.#M(e,t)},i._activeEditRows=-1,i._rowEditSnapshots=/* @__PURE__ */new Map,Object.defineProperty(e,"changedRows",{get:()=>this.changedRows,configurable:!0}),Object.defineProperty(e,"changedRowIds",{get:()=>this.changedRowIds,configurable:!0}),Object.defineProperty(e,"_changedRowIdSet",{get:()=>this.#L.changedRowIds,configurable:!0}),e.resetChangedRows=e=>this.resetChangedRows(e),document.addEventListener("keydown",e=>{if(!this.#g&&"Escape"===e.key&&-1!==this.#w){if(Oe(this.config,e))return;this.#M(this.#w,!0)}},{capture:!0,signal:t}),document.addEventListener("mousedown",e=>{if(this.#g)return;if(-1===this.#w)return;const t=i.findRenderedRowElement?.(this.#w);if(!t)return;if((e.composedPath&&e.composedPath()||[]).includes(t))return;const r=e.target;if(!r||this.gridElement.contains(r)||!this.grid.containsFocus?.(r)){if(r&&!this.gridElement.contains(r)){const e=i.findRenderedRowElement?.(this.#w);if(e&&function(e,t){if(!e)return!1;const i=t.querySelectorAll('[aria-expanded="true"][aria-controls]');for(let r=0;r<i.length;r++){const n=i[r].getAttribute("aria-controls");if(!n)continue;const o=t.ownerDocument?.getElementById(n);if(o&&o.contains(e))return!0}return!1}(r,e))return}Oe(this.config,e)||queueMicrotask(()=>{-1!==this.#w&&this.#M(this.#w,!1)})}},{signal:t}),this.config.focusTrap&&this.gridElement.addEventListener("focusout",e=>{if(this.#g)return;if(-1===this.#w)return;const t=e.relatedTarget;t&&this.grid.containsFocus?.(t)||t&&this.gridElement.contains(t)||queueMicrotask(()=>{-1!==this.#w&&this.#N()})},{signal:t}),this.gridElement.addEventListener("cell-change",e=>{const t=e.detail;if("user"===t.source)return;const i=`${t.rowIndex}:${t.field}`,r=this.#E.get(i);r&&r(t.newValue)},{signal:t}),this.config.dirtyTracking){const e=e=>{const t=e.detail,i=t?.action;if(!i)return;const r=this.rows[i.rowIndex];if(!r)return;const n=this.grid.getRowId(r);if(!n)return;const o=this.#L.isRowDirty(n,r);this.emit("dirty-change",{rowId:n,row:r,original:this.#L.getOriginalRow(n),type:o?"modified":"pristine"})};this.gridElement.addEventListener("undo",e,{signal:t}),this.gridElement.addEventListener("redo",e,{signal:t}),this.on("row-inserted",e=>{const t=this.grid.getRowId(e.row);null!=t&&this.markAsNew(String(t))})}this.#g&&(i._isGridEditMode=!0,this.gridElement.classList.add("tbw-grid-mode"),this.requestRender(),this.gridElement.addEventListener("focusin",e=>{const t=e.target;if(t!==this.gridElement&&t.matches(qe)){if(this.#I)return t.blur(),void this.gridElement.focus();const e=i._focusRow,r=i._focusCol,n=this.#T;if(!n||n.rowIndex!==e||n.colIndex!==r){const t=i._visibleColumns?.[r],n=i._rows?.[e];if(t?.field&&n){const i=t.field;this.#T={rowIndex:e,colIndex:r,field:i,value:n[i]}}}this.#k=!0}},{signal:t}),this.gridElement.addEventListener("focusout",e=>{const t=e.relatedTarget;t&&(this.gridElement.contains(t)||this.grid.containsFocus?.(t))&&t.matches(qe)||(this.#k=!1,this.#T=null)},{signal:t}),this.gridElement.addEventListener("keydown",e=>{if("Escape"===e.key&&this.#k){if(Oe(this.config,e))return void queueMicrotask(()=>{if(this.#k){this.#q();const e=document.activeElement;e&&this.gridElement.contains(e)&&(e.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0}});this.#q();const t=document.activeElement;t&&this.gridElement.contains(t)&&(t.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0,e.preventDefault(),e.stopPropagation()}},{capture:!0,signal:t}),this.gridElement.addEventListener("mousedown",e=>{e.target.matches(qe)&&(this.#I=!1)},{signal:t}))}detach(){this.#f._isGridEditMode=!1,this.gridElement.classList.remove("tbw-grid-mode"),this.#w=-1,this.#b=void 0,this.#v=void 0,this.#y=-1,this.#C.clear(),this.#L.clear(),this.#x.clear(),this.#E.clear(),this.#k=!1,this.#I=!1,this.#T=null,this.#_=!1,super.detach()}handleQuery(e){if("isEditing"===e.type)return this.#g||-1!==this.#w}onCellClick(e){if(this.#g)return!1;const t=this.#f,i=this.config.editOn??t.effectiveConfig?.editOn;if(!1===i||"manual"===i)return!1;if("click"!==i&&"dblclick"!==i)return!1;const r="dblclick"===e.originalEvent.type;if("click"===i&&r)return!1;if("dblclick"===i&&!r)return!1;const{rowIndex:n}=e,o=t._columns?.some(e=>this.#m(e));if(!o)return!1;const s=t._rows[n],l=t.effectiveConfig?.rowEditable;return!(s&&l&&!l(s))&&(e.originalEvent.stopPropagation(),this.beginBulkEdit(n),!0)}onKeyDown(e){const t=this.#f;if("Escape"===e.key){if(this.#g&&this.#k){this.#q();const e=document.activeElement;return e&&this.gridElement.contains(e)&&(e.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0,this.requestAfterRender(),!0}if(-1!==this.#w&&!this.#g)return Oe(this.config,e)||this.#M(this.#w,!0),!0}if(this.#g&&!this.#k&&("ArrowUp"===e.key||"ArrowDown"===e.key||"ArrowLeft"===e.key||"ArrowRight"===e.key))return!1;if(this.#g&&this.#k&&("ArrowUp"===e.key||"ArrowDown"===e.key))return!0;if(("ArrowUp"===e.key||"ArrowDown"===e.key)&&-1!==this.#w&&!this.#g)return!0;if("Tab"===e.key&&(-1!==this.#w||this.#g)){if(e.preventDefault(),this.#_)return this.#M(this.#w,!1),!0;const t=!e.shiftKey;return this.#P(t),!0}if(" "===e.key||"Spacebar"===e.key){if(-1!==this.#w)return!1;const i=t._focusRow,r=t._focusCol;if(i>=0&&r>=0){const n=t._visibleColumns[r],o=t._rows[i];if(n&&o&&this.#p(n,o)&&"boolean"===n.type){const t=n.field;if(Pe(t)){const r=!o[t];return this.#D(i,n,r,o),e.preventDefault(),this.requestRender(),!0}}}return!1}if(!("Enter"!==e.key||e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){if(this.#g&&!this.#k)return this.#N(),!0;if(-1!==this.#w){const t=e.target;return(!t||"true"!==t.getAttribute?.("aria-expanded")||!t.hasAttribute?.("aria-controls"))&&!!Oe(this.config,e)}const i=this.config.editOn??t.effectiveConfig?.editOn;if(!1===i||"manual"===i)return!1;const r=t._focusRow,n=t._focusCol;if(r>=0){const i=t._columns?.some(e=>this.#m(e)),o=t._rows[r],s=t.effectiveConfig?.rowEditable,l=o&&s&&!s(o);if(i&&!l){const i=t._visibleColumns[n],o=t._rows[r],s=i?.field??"",l=s&&o?o[s]:void 0,a=this.gridElement.querySelector(`[data-row="${r}"][data-col="${n}"]`),d=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,detail:{rowIndex:r,colIndex:n,field:s,value:l,row:o,cellEl:a,trigger:"keyboard",originalEvent:e}});return this.gridElement.dispatchEvent(d),d.defaultPrevented?(e.preventDefault(),!0):(this.beginBulkEdit(r),!0)}}return!1}if("F2"===e.key){if(-1!==this.#w||this.#g)return!1;if(!1===(this.config.editOn??t.effectiveConfig?.editOn))return!1;const i=t._focusRow,r=t._focusCol;if(i>=0&&r>=0){const n=t._visibleColumns[r],o=t._rows[i];if(n&&o&&this.#p(n,o)&&n.field)return e.preventDefault(),this.beginCellEdit(i,n.field),!0}return!1}return!1}processColumns(e){const t=this.#f,i=t.effectiveConfig?.typeDefaults,r=t.__frameworkAdapter;return i||r?.getTypeDefault?e.map(e=>{if(!e.type)return e;let n;if(i?.[e.type]?.editorParams&&(n=i[e.type].editorParams),!n&&r?.getTypeDefault){const i=r.getTypeDefault(e.type,t._hostElement);i?.editorParams&&(n=i.editorParams)}return n?{...e,editorParams:{...n,...e.editorParams}}:e}):e}processRows(e){const t=this.#f;if(this.config.dirtyTracking&&t.getRowId&&this.#L.capture(e,e=>{try{return t.getRowId?.(e)}catch{return}}),-1===this.#w||this.#g)return e;const i=this.#b,r=this.#v;if(!i||!r)return e;const n=[...e];let o=-1;for(let s=0;s<n.length;s++)try{if(t.getRowId?.(n[s])===i){o=s;break}}catch{}return-1===o?(setTimeout(()=>this.cancelActiveRowEdit(),0),n):(n[o]=r,this.#w!==o&&this.#z(this.#w,o),n)}afterRender(){const e=this.#f;if(-1!==this.#w&&this.#v&&!this.#g&&e._rows[this.#w]!==this.#v){const t=e._rows.indexOf(this.#v);if(-1===t)return void setTimeout(()=>this.cancelActiveRowEdit(),0);this.#z(this.#w,t)}if(this.#S&&(this.#S=!1,this.#O(e)),-1!==this.#R){const t=this.#R;this.#R=-1,e.animateRow?.(t,"change")}const t=this.#L.drainCapturedFlag();if(null!=t&&this.emit("baselines-captured",{count:t}),!this.#g&&0!==this.#x.size)for(const i of this.#x){const[t,r]=i.split(":"),n=parseInt(t,10),o=parseInt(r,10),s=e.findRenderedRowElement?.(n);if(!s)continue;const l=s.querySelector(`.cell[data-col="${o}"]`);if(!l||l.classList.contains("editing"))continue;const a=e._rows[n],d=e._visibleColumns[o];a&&d&&this.#H(a,n,d,o,l,!0)}}afterCellRender(e){const{row:t,rowIndex:i,column:r,colIndex:n,cellElement:o}=e,s=this.#p(r,t);if(s)o.removeAttribute("aria-readonly");else if(o.setAttribute("aria-readonly","true"),this.#g&&o.classList.contains("editing")){o.classList.remove("editing");const e=t[r.field];o.textContent=null==e?"":String(e)}this.#g&&s&&(o.classList.contains("editing")||this.#H(t,i,r,n,o,!0,e.rowElement))}afterRowRender(e){if(!this.config.dirtyTracking)return;const t=this.#f,i=t.getRowId?.(e.row);if(!i)return;const{isNew:r,isCommittedDirty:n,hasBaseline:o}=this.#L.getRowDirtyState(i,e.row),s=e.rowElement;if(s.classList.toggle("tbw-row-dirty",n),s.classList.toggle("tbw-row-new",r),o){const t=s.querySelectorAll(".cell[data-field]");for(let r=0;r<t.length;r++){const n=t[r],o=n.getAttribute("data-field");o&&n.classList.toggle("tbw-cell-dirty",this.#L.isCellDirty(i,e.row,o))}}else{const e=s.querySelectorAll(".tbw-cell-dirty");for(let t=0;t<e.length;t++)e[t].classList.remove("tbw-cell-dirty")}}onScrollRender(){this.afterRender()}get changedRows(){return this.#L.getChangedRows(e=>this.grid.getRow(e))}get changedRowIds(){return this.#L.getChangedRowIds()}get activeEditRow(){return this.#w}get activeEditCol(){return this.#y}isRowEditing(e){return this.#w===e}isCellEditing(e,t){return this.#x.has(`${e}:${t}`)}isRowChanged(e){const t=this.#f,i=t._rows[e];if(!i)return!1;try{const e=t.getRowId?.(i);return!!e&&this.#L.isRowChanged(e)}catch{return!1}}isRowChangedById(e){return this.#L.isRowChanged(e)}isDirty(e){if(!this.config.dirtyTracking)return!1;if(this.#L.newRowIds.has(e))return!0;const t=this.grid.getRow(e);return!!t&&this.#L.isRowDirty(e,t)}isPristine(e){return!this.isDirty(e)}get dirty(){if(!this.config.dirtyTracking)return!1;const e=this.#f;return this.#L.hasAnyDirty(t=>e._getRowEntry(t)?.row)}get pristine(){return!this.dirty}markAsPristine(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&(this.#L.markPristine(e,t),this.emit("dirty-change",{rowId:e,row:t,original:t,type:"pristine"}))}markAsNew(e){if(!this.config.dirtyTracking)return;this.#L.markNew(e);const t=this.grid.getRow(e);this.emit("dirty-change",{rowId:e,row:t,original:void 0,type:"new"})}markAsDirty(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&(this.#L.markDirty(e),this.emit("dirty-change",{rowId:e,row:t,original:this.#L.getOriginalRow(e),type:"modified"}))}markAllPristine(){if(!this.config.dirtyTracking)return;const e=this.#f;this.#L.markAllPristine(t=>e._getRowEntry(t)?.row)}getOriginalRow(e){if(this.config.dirtyTracking)return this.#L.getOriginalRow(e)}hasBaseline(e){return!!this.config.dirtyTracking&&this.#L.hasBaseline(e)}getDirtyRows(){if(!this.config.dirtyTracking)return[];const e=this.#f;return this.#L.getDirtyRows(t=>e._getRowEntry(t)?.row)}get dirtyRowIds(){if(!this.config.dirtyTracking)return[];const e=this.#f;return this.#L.getDirtyRowIds(t=>e._getRowEntry(t)?.row)}revertRow(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&this.#L.revertRow(e,t)&&(this.emit("dirty-change",{rowId:e,row:t,original:this.#L.getOriginalRow(e),type:"reverted"}),this.requestRender())}revertAll(){if(!this.config.dirtyTracking)return;const e=this.#f;this.#L.revertAll(t=>e._getRowEntry(t)?.row),this.requestRender()}setInvalid(e,t,i=""){this.#A.setInvalid(e,t,i)}clearInvalid(e,t){this.#A.clearInvalid(e,t)}clearRowInvalid(e){this.#A.clearRowInvalid(e)}clearAllInvalid(){this.#A.clearAllInvalid()}isCellInvalid(e,t){return this.#A.isCellInvalid(e,t)}getInvalidMessage(e,t){return this.#A.getInvalidMessage(e,t)}hasInvalidCells(e){return this.#A.hasInvalidCells(e)}getInvalidFields(e){return this.#A.getInvalidFields(e)}resetChangedRows(e){const t=this.changedRows,i=this.changedRowIds;this.#L.changedRowIds.clear(),this.#L.committedDirtyRowIds.clear(),this.#K(),e||this.emit("changed-rows-reset",{rows:t,ids:i});const r=this.#f;r._rowPool?.forEach(e=>e.classList.remove("changed"))}beginCellEdit(e,t){const i=this.#f,r=i._visibleColumns.findIndex(e=>e.field===t);if(-1===r)return;const n=i._visibleColumns[r],o=i._rows[e];if(!n||!o||!this.#p(n,o))return;const s=i.findRenderedRowElement?.(e),l=s?.querySelector(`.cell[data-col="${r}"]`);l&&(this.#_=!0,this.#B(e,r,l))}beginBulkEdit(e){const t=this.#f;if(!1===(this.config.editOn??t.effectiveConfig?.editOn))return;const i=t._columns?.some(e=>this.#m(e));if(!i)return;const r=t.findRenderedRowElement?.(e);if(!r)return;const n=t._rows[e],o=t.effectiveConfig?.rowEditable;n&&o&&!o(n)||(this.#_=!1,this.#$(e,n),Array.from(r.children).forEach((i,r)=>{const o=t._visibleColumns[r];if(o&&this.#p(o,n)){const t=i;t.classList.contains("editing")||this.#H(n,e,o,r,t,!0)}}),setTimeout(()=>{let e=r.querySelector(`.cell[data-col="${t._focusCol}"]`);if(e?.classList.contains("editing")||(e=r.querySelector(".cell.editing")),e?.classList.contains("editing")){const t=e.querySelector(qe);try{t?.focus({preventScroll:!0})}catch{}}},0))}commitActiveRowEdit(){-1!==this.#w&&this.#M(this.#w,!1)}cancelActiveRowEdit(){-1!==this.#w&&this.#M(this.#w,!0)}#G(e,t,i){const r=this.#f,n=r._visibleColumns?.findIndex(e=>e.field===t);if(-1===n||void 0===n)return;const o=r._rows,s=o?.findIndex(t=>{try{return r.getRowId?.(t)===e}catch{return!1}});if(-1===s||void 0===s)return;const l=r.findRenderedRowElement?.(s),a=l?.querySelector(`.cell[data-col="${n}"]`);if(a)if(i){a.setAttribute("data-invalid","true");const i=this.#A.getInvalidMessage(e,t);i&&a.setAttribute("title",i)}else a.removeAttribute("data-invalid"),a.removeAttribute("title")}#z(e,t){this.#w=t;const i=/* @__PURE__ */new Set,r=`${e}:`;for(const s of this.#x)s.startsWith(r)?i.add(`${t}:${s.substring(r.length)}`):i.add(s);this.#x.clear();for(const s of i)this.#x.add(s);const n=this.#C.get(e);void 0!==n&&(this.#C.delete(e),this.#C.set(t,n));const o=[];for(const[s,l]of this.#E)s.startsWith(r)&&(o.push([`${t}:${s.substring(r.length)}`,l]),this.#E.delete(s));for(const[s,l]of o)this.#E.set(s,l);this.#K()}#B(e,t,i){const r=this.#f,n=r._rows[e],o=r._visibleColumns[t];n&&o&&this.#p(o,n)&&(i.classList.contains("editing")||(this.#w!==e&&this.#$(e,n),this.#y=t,this.#H(n,e,o,t,i,!1)))}#q(){const e=this.#T;if(!e)return;const t=this.#f,i=t._rows?.[e.rowIndex];i&&(i[e.field]=e.value);const r=`${e.rowIndex}:${e.field}`,n=this.#E.get(r);if(n&&n(e.value),this.emit("cell-cancel",{rowIndex:e.rowIndex,colIndex:e.colIndex,field:e.field,previousValue:e.value}),i){let e;try{e=this.grid.getRowId(i)}catch{}e&&(this.config.dirtyTracking?this.#L.isRowDirty(e,i)||(this.#L.changedRowIds.delete(e),this.emit("dirty-change",{rowId:e,row:i,original:this.#L.getOriginalRow(e),type:"reverted"})):this.#L.changedRowIds.delete(e))}this.requestRender(),this.#T=null}#N(){const e=this.#f,t=e._focusRow,i=e._focusCol;if(t<0||i<0)return;const r=e.findRenderedRowElement?.(t),n=r?.querySelector(`.cell[data-col="${i}"]`);if(n?.classList.contains("editing")){const e=n.querySelector(qe);e&&(this.#I=!1,e.focus(),this.#k=!0,e instanceof HTMLInputElement&&("text"===e.type||"number"===e.type)&&e.select())}}#P(e){const t=this.#f,i=t._rows,r=this.#g?t._focusRow:this.#w,n=i[r],o=t._visibleColumns.map((e,t)=>n&&this.#p(e,n)?t:-1).filter(e=>e>=0);if(0===o.length)return;const s=o.indexOf(t._focusCol)+(e?1:-1);if(s>=0&&s<o.length){t._focusCol=o[s];const e=t.findRenderedRowElement?.(r),i=e?.querySelector(`.cell[data-col="${o[s]}"]`);if(i?.classList.contains("editing")){const e=i.querySelector(qe);e?.focus({preventScroll:!0})}return void l(t,{forceHorizontalScroll:!0})}const a=r+(e?1:-1);if(a>=0&&a<i.length){const n=i[a],o=t._visibleColumns.map((e,t)=>n&&this.#p(e,n)?t:-1).filter(e=>e>=0);if(0===o.length)return;this.#g?(t._focusRow=a,t._focusCol=e?o[0]:o[o.length-1],l(t,{forceHorizontalScroll:!0}),this.requestAfterRender(),setTimeout(()=>{const e=t.findRenderedRowElement?.(a),i=e?.querySelector(`.cell[data-col="${t._focusCol}"]`);if(i?.classList.contains("editing")){const e=i.querySelector(qe);e?.focus({preventScroll:!0})}},0)):(this.#M(r,!1),t._focusRow=a,t._focusCol=e?o[0]:o[o.length-1],this.beginBulkEdit(a),l(t,{forceHorizontalScroll:!0}))}}#K(){const e=this.#f;e._activeEditRows=this.#w,e._rowEditSnapshots=this.#C}#$(e,t){if(this.#w!==e){-1!==this.#w&&this.#M(this.#w,!1),this.#C.set(e,{...t}),this.#w=e,this.#v=t;const i=this.#f;try{this.#b=i.getRowId?.(t)??void 0}catch{this.#b=void 0}this.#K(),this.#g||(this.broadcast("edit-open",{rowIndex:e,rowId:this.#b??"",row:t}),a(this.gridElement,d(this.gridElement,"editingStarted",e)))}}#M(e,t){if(this.#w!==e)return;const i=this.#f,r=this.#C.get(e),n=i.findRenderedRowElement?.(e);let o=this.#b;const s=o?i._getRowEntry(o):void 0,l=s?.row??this.#v??i._rows[e];if(!o&&l)try{o=i.getRowId?.(l)}catch{}if(!t&&n&&l){n.querySelectorAll(".cell.editing").forEach(t=>{const r=Number(t.getAttribute("data-col"));if(isNaN(r))return;const n=i._visibleColumns[r];if(!n)return;if(t.hasAttribute("data-editor-managed"))return;const o=t.querySelector("input,textarea,select");if(o){const t=n.field,i=l[t],r=Te(o,n,i);i!==r&&this.#D(e,n,r,l)}})}if(t||this.#g||!l||this.emit("before-edit-close",{rowIndex:e,rowId:o??"",row:l}),t&&r&&l)Object.keys(r).forEach(e=>{l[e]=r[e]}),o&&(this.#L.changedRowIds.delete(o),this.#L.committedDirtyRowIds.delete(o),this.clearRowInvalid(o));else if(!t&&l){const t=function(e,t){if(!e)return!1;const i=e,r=t,n=/* @__PURE__ */new Set([...Object.keys(i),...Object.keys(r)]);for(const o of n)if(i[o]!==r[o])return!0;return!1}(r,l),i=o?this.#L.changedRowIds.has(o):t,n=this.emitCancelable("row-commit",{rowIndex:e,rowId:o??"",row:l,oldValue:r,newValue:l,changed:i,changedRows:this.changedRows,changedRowIds:this.changedRowIds});n&&r?(Object.keys(r).forEach(e=>{l[e]=r[e]}),o&&(this.#L.changedRowIds.delete(o),this.#L.committedDirtyRowIds.delete(o),this.clearRowInvalid(o))):n||(o&&this.config.dirtyTracking&&(this.#L.isRowDirty(o,l)?this.#L.committedDirtyRowIds.add(o):this.#L.committedDirtyRowIds.delete(o)),t&&this.isAnimationEnabled&&(this.#R=e))}this.#C.delete(e),this.#w=-1,this.#b=void 0,this.#v=void 0,this.#y=-1,this.#_=!1,this.#K();for(const a of this.#x)a.startsWith(`${e}:`)&&this.#x.delete(a);for(const a of this.#E.keys())a.startsWith(`${e}:`)&&this.#E.delete(a);if(this.#S=!0,n){const e=i.__frameworkAdapter,t=n.querySelectorAll(".cell.editing");e?.releaseCell&&t.forEach(t=>{e.releaseCell(t)}),t.forEach(e=>{e.classList.remove("editing"),function(e){e.__editingCellCount=0,e.removeAttribute("data-has-editing")}(e.parentElement)}),i.refreshVirtualWindow(!0)}else this.#O(i),this.#S=!1;!this.#g&&l&&(this.broadcast("edit-close",{rowIndex:e,rowId:o??"",row:l,reverted:t}),t||a(this.gridElement,d(this.gridElement,"editingCommitted",e)))}#D(e,t,i,r){const n=t.field;if(!Pe(n))return;const o=r[n];if(o===i)return;const s=this.#f;let l;try{l=this.grid.getRowId(r)}catch{}const a=!l||!this.#L.changedRowIds.has(l),d=l?e=>this.grid.updateRow(l,e,"cascade"):ze;let u=!1;const h=l?e=>{u=!0,this.setInvalid(l,n,e??"")}:()=>{};if(this.emitCancelable("cell-commit",{row:r,rowId:l??"",field:n,oldValue:o,value:i,rowIndex:e,changedRows:this.changedRows,changedRowIds:this.changedRowIds,firstTimeForRow:a,updateRow:d,setInvalid:h}))return;if(l&&!u&&this.isCellInvalid(l,n)&&this.clearInvalid(l,n),r[n]=i,c(r,n),l&&this.#L.changedRowIds.add(l),this.#K(),this.config.dirtyTracking&&l){const e=this.#L.isRowDirty(l,r);this.emit("dirty-change",{rowId:l,row:r,original:this.#L.getOriginalRow(l),type:e?"modified":"pristine"})}this.emitPluginEvent("cell-edit-committed",{rowIndex:e,field:n,oldValue:o,newValue:i});const g=s.findRenderedRowElement?.(e);g&&g.classList.add("changed")}#H(e,t,i,r,n,o,s){He(this.#F,e,t,i,r,n,o,s)}#O(e){queueMicrotask(()=>{try{const t=e._focusRow,i=e._focusCol,r=e.findRenderedRowElement?.(t);if(r){Array.from(e._bodyEl.querySelectorAll(".cell-focus")).forEach(e=>e.classList.remove("cell-focus"));const n=r.querySelector(`.cell[data-row="${t}"][data-col="${i}"]`);n&&(n.classList.add("cell-focus"),n.setAttribute("aria-selected","true"),n.hasAttribute("tabindex")||n.setAttribute("tabindex","-1"),n.focus({preventScroll:!0}))}}catch{}})}}function Be(e,t=!0){return"string"==typeof e?t&&(e.includes(",")||e.includes('"')||e.includes("\n")||e.includes("\r"))?`"${e.replace(/"/g,'""')}"`:e:"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}function $e(e,t,i,n={}){const o=n.delimiter??",",s=n.newline??"\n",l=n.quoteStrings??!0,a=[],d=n.bom?"\ufeff":"";if(!1!==i.includeHeaders){const e=t.map(e=>{const t=e.header||e.field;return Be(i.processHeader?i.processHeader(t,e.field):t,l)});a.push(e.join(o))}for(const c of e){const e=t.map(e=>{let t=r(c,e);return i.processCell&&(t=i.processCell(t,e.field,c)),Be(t,l)});a.push(e.join(o))}return d+a.join(s)}function We(e,t){const i=URL.createObjectURL(e),r=document.createElement("a");r.href=i,r.download=t,r.style.display="none",document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(i)}function Ve(e){return JSON.stringify(je(e))}function je(e){if(null==e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(je);const t={};for(const i of Object.keys(e).sort())t[i]=je(e[i]);return t}class Ue{#W=/* @__PURE__ */new Map;#V=0;register(e){const t=Ve(e),i=this.#W.get(t);if(i)return i.id;this.#V++;const r=`s${this.#V}`;return this.#W.set(t,{id:r,style:e}),r}getStyleId(e){return this.#W.get(Ve(e))?.id}get size(){return this.#W.size}toXml(){if(0===this.#W.size)return"";let e="\n<Styles>";for(const{id:t,style:i}of this.#W.values())e+=Ye(t,i);return e+="\n</Styles>",e}}function Ye(e,t){let i=`\n<Style ss:ID="${e}">`;if(t.font&&(i+="<Font",t.font.name&&(i+=` ss:FontName="${t.font.name}"`),t.font.size&&(i+=` ss:Size="${t.font.size}"`),t.font.bold&&(i+=' ss:Bold="1"'),t.font.italic&&(i+=' ss:Italic="1"'),t.font.color&&(i+=` ss:Color="${t.font.color}"`),i+="/>"),t.fill){const e=t.fill.pattern??"Solid";i+=`<Interior ss:Color="${t.fill.color}" ss:Pattern="${e}"/>`}return t.numberFormat&&(i+=`<NumberFormat ss:Format="${t.numberFormat}"/>`),t.alignment&&(i+="<Alignment",t.alignment.horizontal&&(i+=` ss:Horizontal="${t.alignment.horizontal}"`),t.alignment.vertical&&(i+=` ss:Vertical="${t.alignment.vertical}"`),t.alignment.wrapText&&(i+=' ss:WrapText="1"'),i+="/>"),t.borders&&(i+="<Borders>",t.borders.top&&(i+=Ze("Top",t.borders.top)),t.borders.bottom&&(i+=Ze("Bottom",t.borders.bottom)),t.borders.left&&(i+=Ze("Left",t.borders.left)),t.borders.right&&(i+=Ze("Right",t.borders.right)),i+="</Borders>"),i+="</Style>",i}function Ze(e,t){let i=`<Border ss:Position="${e}" ss:LineStyle="Continuous" ss:Weight="${function(e){switch(e){case"Thin":return 1;case"Medium":return 2;case"Thick":return 3}}(t.style)}"`;return t.color&&(i+=` ss:Color="${t.color}"`),i+="/>",i}function Qe(e,t,i,r,n){if(t.cellStyle){const o=t.cellStyle(i,r,n);if(o)return e.register(o)}const o=t.columnStyles?.[r];return o?e.getStyleId(o):t.defaultStyle?e.getStyleId(t.defaultStyle):void 0}function Xe(e,t){const i=Math.min(t.length,50);let r=(e.header??e.field).length;for(let n=0;n<i;n++){const i=t[n][e.field],o=null==i?0:String(i).length;o>r&&(r=o)}return r+2}function Je(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function et(e,t,i){const n=i.excelStyles,o=n?function(e){const t=new Ue;if(e.headerStyle&&t.register(e.headerStyle),e.defaultStyle&&t.register(e.defaultStyle),e.columnStyles)for(const i of Object.values(e.columnStyles))t.register(i);return t}(n):void 0;let s='<?xml version="1.0" encoding="UTF-8"?>\n<?mso-application progid="Excel.Sheet"?>\n<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';if(o){if(n.cellStyle)for(const i of e)for(const e of t){const t=r(i,e),s=n.cellStyle(t,e.field,i);s&&o.register(s)}s+=o.toXml()}s+='\n<Worksheet ss:Name="Sheet1">\n<Table>',n&&(s+=function(e,t,i){const r=i.columnWidths,n=i.autoFitColumns;if(!r&&!n)return"";let o="";for(const s of e){let e=r?.[s.field];null==e&&n&&(e=Xe(s,t)),o+=null!=e?`\n<Column ss:Width="${7*e}"/>`:"\n<Column/>"}return o}(t,e,n));const l=n?.headerStyle&&o?o.getStyleId(n.headerStyle):void 0;if(!1!==i.includeHeaders){s+="\n<Row>";for(const e of t){const t=e.header||e.field;s+=`<Cell${l?` ss:StyleID="${l}"`:""}><Data ss:Type="String">${Je(i.processHeader?i.processHeader(t,e.field):t)}</Data></Cell>`}s+="</Row>"}for(const a of e){s+="\n<Row>";for(const e of t){let t=r(a,e);i.processCell&&(t=i.processCell(t,e.field,a));let l="String",d="";null==t?d="":"number"!=typeof t||isNaN(t)?t instanceof Date?(l="DateTime",d=t.toISOString()):d=Je(String(t)):(l="Number",d=String(t));const c=o&&n?Qe(o,n,t,e.field,a):void 0;s+=`<Cell${c?` ss:StyleID="${c}"`:""}><Data ss:Type="${l}">${d}</Data></Cell>`}s+="</Row>"}return s+="\n</Table>\n</Worksheet>\n</Workbook>",s}class tt extends i{static manifest={queries:[{type:"export:csv",description:"Triggers a CSV export"}]};name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;handleQuery(e){if("export:csv"===e.type)return this.exportCsv(),!0}resolveExportData(e,t){const i=this.config,r={format:e,fileName:t?.fileName??i.fileName??"export",includeHeaders:t?.includeHeaders??i.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,mode:t?.mode??"raw",columns:t?.columns,rowIndices:t?.rowIndices,excelStyles:t?.excelStyles,fileExtension:t?.fileExtension},n=oe(this.columns,t?.columns,i.onlyVisible);let o;if(t?.rowIndices)o=se(this.rows,t.rowIndices);else if(i.onlySelected){const e=this.getSelectionState();o=e?.selected?.size?se(this.rows,[...e.selected]):[...this.rows]}else o=[...this.rows];return{columns:n,rows:o,fullParams:r}}resolveCellOutput(e,t,i,r,n){let o=e;if("formatted"===r){const r=this.#j(t);if(r)try{const t=r(e,i);o=null==t?"":String(t)}catch{o=null==e?"":String(e)}else o="date"===t.type?u(e):"boolean"===t.type?!!e:e}return n&&(o=n(o,t.field,i)),o}performExport(e,t){const{columns:i,rows:r,fullParams:n}=this.resolveExportData(e,t);this.isExportingFlag=!0;let o=n.fileName??"export";const s=this.#U(i);try{switch(e){case"csv":{const e=$e(this.#Y(r,i,n),s,{...n,processCell:void 0},{bom:!0});o=o.endsWith(".csv")?o:`${o}.csv`,function(e,t){We(new Blob([e],{type:"text/csv;charset=utf-8;"}),t)}(e,o);break}case"excel":{const e=et(this.#Y(r,i,n),s,{...n,processCell:void 0}),t=n.fileExtension??".xls",l=t.startsWith(".")?t:`.${t}`;o=o.endsWith(l)?o:`${o}${l}`,function(e,t){We(new Blob([e],{type:"application/vnd.ms-excel;charset=utf-8;"}),t)}(e,o);break}case"json":{const e=this.#Y(r,i,n),t=JSON.stringify(e,null,2);o=o.endsWith(".json")?o:`${o}.json`;We(new Blob([t],{type:"application/json"}),o);break}}this.lastExportInfo={format:e,timestamp:/* @__PURE__ */new Date},this.emit("export-complete",{format:e,fileName:o,rowCount:r.length,columnCount:i.length})}finally{this.isExportingFlag=!1}}#Y(e,t,i){const n=i.mode??"raw";return e.map(e=>{const o={};for(const s of t){const t=r(e,s);o[s.field]=this.resolveCellOutput(t,s,e,n,i.processCell)}return o})}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}export(e){const{columns:t,rows:i,fullParams:r}=this.resolveExportData("json",e);return this.#Y(i,t,r)}getResolvedColumns(e){return oe(this.columns,e?.columns,this.config.onlyVisible)}formatCsv(e,t,i){const{columns:r,fullParams:n}=this.resolveExportData("csv",t);return $e(e,this.#U(r),n,i)}formatExcel(e,t){const{columns:i,fullParams:r}=this.resolveExportData("excel",t);return et(e,this.#U(i),r)}#U(e){return e.map(e=>e.valueAccessor?{...e,valueAccessor:void 0}:e)}#j(e){if(e.format)return e.format;if(!e.type)return;const t=this.grid,i=t?.__frameworkAdapter;if(!i?.getTypeDefault)return;const r=i.getTypeDefault(e.type,t?._hostElement);return r?.format}exportCsv(e){this.performExport("csv",e)}exportExcel(e){this.performExport("excel",e)}exportJson(e){this.performExport("json",e)}isExporting(){return this.isExportingFlag}getLastExport(){return this.lastExportInfo}}const it="(Blank)";function rt(e){if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function nt(e,t,i=!1,r){if(!t.length)return e;const n=t.map(e=>function(e,t,i){const r=e.field,n=e.operator,o=i?e=>i(e[r],e):e=>e[r];if("blank"===n)return e=>{const t=o(e);return null==t||""===t||"number"==typeof t&&isNaN(t)};if("notBlank"===n)return e=>{const t=o(e);return null!=t&&""!==t&&!("number"==typeof t&&isNaN(t))};if(i&&("notIn"===n||"in"===n)){const t=e.value;if("notIn"===n){if(!Array.isArray(t))return()=>!0;const e=new Set(t);return t=>{const n=i(t[r],t),o=Array.isArray(n)?n:null!=n?[n]:[];return 0===o.length?!e.has(it):!o.some(t=>e.has(t))}}if(!Array.isArray(t))return()=>!1;const o=new Set(t);return e=>{const t=i(e[r],e),n=Array.isArray(t)?t:null!=t?[t]:[];return 0===n.length?o.has(it):n.some(e=>o.has(e))}}if("notIn"===n){if(!Array.isArray(e.value))return()=>!0;const t=new Set(e.value);return e=>{const i=e[r];return null==i||""===i?!t.has(it):!t.has(i)}}if("in"===n){if(!Array.isArray(e.value))return()=>!1;const t=new Set(e.value);return e=>{const i=e[r];return null==i||""===i?t.has(it):t.has(i)}}const s="number"===e.type&&!i,l=e=>null==e||""===e||"number"==typeof e&&isNaN(e);if("greaterThan"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i>t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r>t}}if("greaterThanOrEqual"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i>=t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r>=t}}if("lessThan"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i<t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r<t}}if("lessThanOrEqual"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i<=t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r<=t}}if("between"===n){const t=rt(e.value),i=rt(e.valueTo);return s?e=>{const n=e[r];return!l(n)&&(n>=t&&n<=i)}:e=>{const r=o(e);if(l(r))return!1;const n=rt(r);return!isNaN(n)&&n>=t&&n<=i}}const a=t?String(e.value):String(e.value).toLowerCase();return"contains"===n?t?e=>{const t=o(e);return null!=t&&String(t).includes(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().includes(a)}:"notContains"===n?t?e=>{const t=o(e);return null!=t&&!String(t).includes(a)}:e=>{const t=o(e);return null!=t&&!String(t).toLowerCase().includes(a)}:"equals"===n?t?e=>{const t=o(e);return null!=t&&String(t)===a}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase()===a}:"notEquals"===n?t?e=>{const t=o(e);return null!=t&&String(t)!==a}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase()!==a}:"startsWith"===n?t?e=>{const t=o(e);return null!=t&&String(t).startsWith(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().startsWith(a)}:"endsWith"===n?t?e=>{const t=o(e);return null!=t&&String(t).endsWith(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().endsWith(a)}:()=>!0}(e,i,r?.get(e.field)));return 1===n.length?e.filter(n[0]):e.filter(e=>{for(let t=0;t<n.length;t++)if(!n[t](e))return!1;return!0})}function ot(e,t,i){const r=/* @__PURE__ */new Set;let n=!1;for(const o of e){const e=o[t];if(i){const t=i(e,o);if(Array.isArray(t)){0===t.length&&(n=!0);for(const e of t)null!=e&&r.add(e)}else null!=t?r.add(t):n=!0}else null!=e&&""!==e?r.add(e):n=!0}return n&&r.add(it),[...r].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}const st="__tbw_expander";function lt(e){return e.field===st}function at(e){return!0===e.utility}function dt(e){return e?e.toISOString().split("T")[0]:""}function ct(e){return e?"string"==typeof e?e:"number"==typeof e?dt(new Date(e)):"":""}function ut(e,t,i,r,n,o){const{field:s,column:l}=t,a=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),d=e=>{if(null==e)return"(Blank)";if(l.format&&!l.filterValue){const t=l.format(e,void 0);if(t)return t}return String(e)};i=i.slice().sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:d(e).localeCompare(d(t)));const c=document.createElement("div");c.className="tbw-filter-search";const u=document.createElement("input");u.type="text",u.placeholder="Search...",u.className="tbw-filter-search-input",u.value=o.get(s)??"",c.appendChild(u),e.appendChild(c);const p=document.createElement("div");p.className="tbw-filter-actions";const f=document.createElement("label");f.className="tbw-filter-value-item",f.style.padding="0",f.style.margin="0";const m=document.createElement("input");m.type="checkbox",m.className="tbw-filter-checkbox";const w=document.createElement("span");w.textContent="Select All",f.appendChild(m),f.appendChild(w),p.appendChild(f);const b=/* @__PURE__ */new Map;i.forEach(e=>{const t=null==e?"__null__":String(e);b.set(t,!r.has(e))});const v=()=>{const e=[...b.values()],t=e.every(e=>e),i=e.every(e=>!e);m.checked=t,m.indeterminate=!t&&!i};m.addEventListener("change",()=>{const e=m.checked;for(const t of b.keys())b.set(t,e);v(),R()}),v(),e.appendChild(p);const y=document.createElement("div");y.className="tbw-filter-values";const C=document.createElement("div");C.className="tbw-filter-values-spacer",y.appendChild(C);const x=document.createElement("div");x.className="tbw-filter-values-content",y.appendChild(x);let E=[];const S=(e,t)=>{const i=d(e),r=null==e?"__null__":String(e),n=document.createElement("label");n.className="tbw-filter-value-item",n.style.position="absolute",n.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,n.style.left="0",n.style.right="0",n.style.boxSizing="border-box";const o=document.createElement("input");o.type="checkbox",o.className="tbw-filter-checkbox",o.checked=b.get(r)??!0,o.dataset.value=r,o.addEventListener("change",()=>{b.set(r,o.checked),v()});const s=document.createElement("span");return s.textContent=i,n.appendChild(o),n.appendChild(s),n},R=()=>{const e=E.length,t=y.clientHeight,i=y.scrollTop;if(C.style.height=e*a+"px",h(e,50/3))return x.innerHTML="",x.style.transform="translateY(0px)",void E.forEach((e,t)=>{x.appendChild(S(e,t))});const r=g({totalRows:e,viewportHeight:t,scrollTop:i,rowHeight:a,overscan:3});x.style.transform=`translateY(${r.offsetY}px)`,x.innerHTML="";for(let n=r.start;n<r.end;n++)x.appendChild(S(E[n],n-r.start))},A=e=>{const t=n.caseSensitive??!1,r=t?e:e.toLowerCase();if(E=i.filter(i=>{const n=d(i),o=t?n:n.toLowerCase();return!e||o.includes(r)}),E.sort((e,t)=>{const i=null==e?"__null__":String(e),r=null==t?"__null__":String(t),n=b.get(i)??!0;return n!==(b.get(r)??!0)?n?-1:1:"number"==typeof e&&"number"==typeof t?e-t:d(e).localeCompare(d(t))}),0===E.length){C.style.height="0px",x.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void x.appendChild(e)}R()};let k;y.addEventListener("scroll",()=>{E.length>0&&R()},{passive:!0}),A(u.value),e.appendChild(y),u.addEventListener("input",()=>{clearTimeout(k),k=setTimeout(()=>{o.set(s,u.value),A(u.value)},n.debounceMs??150)});const I=document.createElement("div");I.className="tbw-filter-buttons";const _=document.createElement("button");_.type="button",_.className="tbw-filter-apply-btn",_.textContent="Apply",_.addEventListener("click",()=>{const e=[];for(const[t,r]of b)if(!r)if("__null__"===t)e.push(null);else{const r=i.find(e=>String(e)===t);e.push(void 0!==r?r:t)}t.applySetFilter(e)}),I.appendChild(_);const T=document.createElement("button");T.type="button",T.className="tbw-filter-clear-btn",T.textContent="Clear Filter",T.addEventListener("click",()=>{t.clearFilter()}),I.appendChild(T),e.appendChild(I)}function ht(e,t){if("number"==typeof e)return e;if("string"==typeof e){const i=parseFloat(e);return isNaN(i)?t:i}return t}class gt extends i{static manifest={events:[{type:"filter-change",description:"Emitted when filter criteria change. Broadcast to both DOM consumers and plugin bus."}],queries:[{type:"getContextMenuItems",description:"Contributes filter-related items to the header context menu"}]};name="filtering";styles='@layer tbw-plugins{tbw-grid{.tbw-quick-filter-input{flex:1;max-width:300px;height:var(--tbw-input-height, 1.75rem);padding:var(--tbw-input-padding, 0 .5rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);color:var(--tbw-color-fg);font-size:var(--tbw-font-size-sm, .8125rem);&:focus{outline:none;border-color:var(--tbw-color-accent)}}.header-cell.filtered:before{content:"";position:absolute;top:var(--tbw-spacing-xs, .25rem);right:var(--tbw-spacing-xs, .25rem);width:var(--tbw-indicator-size, .375rem);height:var(--tbw-indicator-size, .375rem);background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:50%}.tbw-filter-btn{display:var(--tbw-filter-btn-display, inline-flex);visibility:var(--tbw-filter-btn-visibility, visible);align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;margin-left:var(--tbw-spacing-xs, .25rem);opacity:.4;transition:opacity .15s,visibility 0s,display 0s allow-discrete;color:inherit;vertical-align:middle;transition-behavior:allow-discrete;&:hover,&.active{opacity:1;visibility:visible;display:inline-flex}&.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}}.header-row .cell:hover .tbw-filter-btn,.header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getDataRows(){const e=this.sourceRows;if(e.length>0)return e;const t=this.rows;return 0===t.length?t:t.filter(e=>null!=e&&!0!==e.__loading)}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const i of e)if(i.field)if(i.filterValue)t||(t=/* @__PURE__ */new Map),t.set(i.field,i.filterValue);else if(i.valueAccessor){t||(t=/* @__PURE__ */new Map);const e=i;t.set(i.field,(t,i)=>r(i,e))}return t}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;panelButtonElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;columnLookup=null;columnLookupRef=null;getColumnByField(e){const t=this.grid.effectiveConfig?.columns;if(!t)return;let i=this.columnLookup;if(t!==this.columnLookupRef||!i){i=/* @__PURE__ */new Map;for(const e of t)e.field&&i.set(e.field,e);this.columnLookup=i,this.columnLookupRef=t}return i.get(e)}computeSelected(){const e={},t=[];for(const[i,n]of this.filters)if("set"===n.type)if("in"===n.operator&&Array.isArray(n.value))e[i]=n.value;else if("notIn"===n.operator){const e=this.getColumnByField(i),n=e?.filterValue??(e?.valueAccessor?(t,i)=>r(i,e):void 0);t.push({field:i,filterValue:n})}if(t.length>0){const i=function(e,t){const i=/* @__PURE__ */new Map;for(const{field:n,filterValue:o}of t)i.set(n,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o});for(const n of e)for(const{field:e,filterValue:r}of t){const t=i.get(e),o=n[e];if(r){const e=r(o,n);if(Array.isArray(e)){0===e.length&&(t.hasBlank=!0);for(const i of e)null!=i&&t.values.add(i)}else null!=e?t.values.add(e):t.hasBlank=!0}else null!=o&&""!==o?t.values.add(o):t.hasBlank=!0}const r=/* @__PURE__ */new Map;for(const[n,{values:o,hasBlank:s}]of i)s&&o.add(it),r.set(n,[...o].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return r}(this.getDataRows(),t);for(const{field:r}of t){const t=this.excludedValues.get(r),n=i.get(r)??[];e[r]=t?n.filter(e=>!t.has(e)):n}}return e}syncExcludedValues(e,t){if(t)if("set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value))this.excludedValues.set(e,new Set(t.value));else if("set"===t.type&&"in"===t.operator&&Array.isArray(t.value)){const i=this.getDataRows();if(!i||0===i.length)return void this.excludedValues.delete(e);const r=t.value,n=new Set(r.map(e=>null==e?it:e)),o=this.getUniqueValues(e),s=new Set(o.filter(e=>!n.has(e)));this.excludedValues.set(e,s)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.columnLookup=null,this.columnLookupRef=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("filter:get-model"===e.type){if(!this.filters.size)return;return Object.fromEntries(this.filters)}if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(i))return;const r=[],n=this.isFieldFiltered(i.field),o=this.filters.size>0;return n&&r.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(i.field)}),o&&r.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!o,action:()=>this.clearAllFilters()}),r.length>0?r:void 0}}processRows(e){if(!this.filters.size)return e;const t=[...this.filters.values()];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:e;const i=(r=t,JSON.stringify(r.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var r;const n={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},o=null!=this.cachedInputSpot&&n.len===this.cachedInputSpot.len&&n.first===this.cachedInputSpot.first&&n.mid===this.cachedInputSpot.mid&&n.last===this.cachedInputSpot.last;if(this.cacheKey===i&&this.cachedResult&&o)return this.cachedResult;if(!o)for(const[l,a]of this.filters)"set"===a.type&&"in"===a.operator&&this.syncExcludedValues(l,a);const s=nt(e,t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=i,this.cachedInputSpot=n,s}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(e=>{const t=e.getAttribute("data-col");if(null===t)return;const i=this.visibleColumns[parseInt(t,10)];if(!i||!this.isColumnFilterable(i))return;if(at(i))return;const r=i.field;if(!r)return;const n=this.filters.has(r);let o=e.querySelector(".tbw-filter-btn");if(o){const t=o.classList.contains("active");return o.classList.toggle("active",n),e.classList.toggle("filtered",n),n?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),void(t!==n&&this.setIcon(o,n?"filterActive":"filter"))}o=document.createElement("button"),o.type="button",o.className="tbw-filter-btn",o.setAttribute("aria-label",`Filter ${i.header??r}`),this.setIcon(o,n?"filterActive":"filter"),n&&(o.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),o.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(r,i,o)});const s=e.querySelector(".resize-handle");s?e.insertBefore(o,s):e.appendChild(o)})}setFilter(e,t,i){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const i={...t,field:e};this.filters.set(e,i),this.syncExcludedValues(e,i)}if(this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,i?.silent)this.emitPluginEvent("filter-change",{filters:[...this.filters.values()]});else{this.broadcast("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.();const i=this.getColumnByField(e)?.header??e;a(this.gridElement,d(this.gridElement,null===t?"filterCleared":"filterApplied",i))}this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e,t){this.filters.clear(),this.excludedValues.clear();for(const i of e)this.filters.set(i.field,i),this.syncExcludedValues(i.field,i);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,t?.silent?this.emitPluginEvent("filter-change",{filters:[...this.filters.values()]}):(this.broadcast("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||a(this.gridElement,d(this.gridElement,"allFiltersCleared"))}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.getColumnByField(e)?.header??e;a(this.gridElement,d(this.gridElement,"filterCleared",t))}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.getColumnByField(e),i=t?.filterValue;return ot(this.getDataRows(),e,i)}getStaleFilters(){const e=[];for(const[t,i]of this.filters){if("set"!==i.type)continue;const r=this.getUniqueValues(t);if("notIn"===i.operator&&Array.isArray(i.value)){const t=new Set(i.value);0===r.filter(e=>!t.has(e)).length&&e.push(i)}else if("in"===i.operator&&Array.isArray(i.value)){const t=new Set(i.value);0===r.filter(e=>t.has(e)).length&&e.push(i)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const i=t.valueTo;this.setFilter(e,i)}else this.setFilter(e,null);return}const i=this.filters.get(e),r=i&&"blank"!==i.operator&&"notBlank"!==i.operator?{type:i.type,operator:i.operator,value:i.value,valueTo:i.valueTo}:i?.valueTo;this.setFilter(e,{type:i?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:r})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const r of t.classList)r.startsWith("tbw-")||"selecting"===r||e.classList.add(r);const i=t.dataset.theme;i&&(e.dataset.theme=i)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{position:fixed;background:var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));color:var(--tbw-filter-panel-fg, var(--tbw-color-fg, light-dark(#222222, #eeeeee)));border:1px solid var(--tbw-filter-panel-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-panel-radius, var(--tbw-border-radius, .25rem));box-shadow:0 4px 16px var(--tbw-filter-panel-shadow, var(--tbw-color-shadow, light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3))));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;display:flex;flex-direction:column;font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-font-size, .8125rem);transform-origin:top center}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom center}.tbw-filter-panel.tbw-filter-panel-animated{animation:tbw-filter-panel-enter var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}.tbw-filter-panel.tbw-filter-panel-above.tbw-filter-panel-animated{animation:tbw-filter-panel-enter-above var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}@keyframes tbw-filter-panel-enter{0%{opacity:0;transform:scaleY(.3) translateY(-10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@keyframes tbw-filter-panel-enter-above{0%{opacity:0;transform:scaleY(.3) translateY(10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@supports (anchor-name: --test){.tbw-filter-panel{position-anchor:--tbw-filter-anchor;top:anchor(bottom);right:anchor(right);margin-top:4px;position-try-fallbacks:flip-inline,flip-block,flip-block flip-inline}}.tbw-filter-search{margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-search-input{height:var(--tbw-filter-item-height, 28px);width:100%;padding:var(--tbw-filter-search-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-search-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-actions{display:flex;padding:var(--tbw-button-padding-sm, .25rem .125rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-bottom:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{flex:1;overflow-y:auto;margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));max-height:180px;position:relative}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding-sm, .25rem .125rem);cursor:pointer;border-radius:3px;height:var(--tbw-filter-item-height, 28px)}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-checkbox{margin:0;cursor:pointer;accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}.tbw-filter-no-match{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{display:flex;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding-top:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-top:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)))}.tbw-filter-apply-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));color:var(--tbw-filter-accent-fg, var(--tbw-color-accent-fg, light-dark(#ffffff, #000000)));border:none;border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:transparent;color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-clear-btn:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-range-inputs,.tbw-filter-date-range{display:flex;align-items:flex-end;gap:var(--tbw-spacing-sm, .375rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-group,.tbw-filter-date-group{display:flex;flex-direction:column;gap:var(--tbw-spacing-xs, .25rem);flex:1}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)))}.tbw-filter-range-input,.tbw-filter-date-input{width:100%;height:var(--tbw-filter-item-height, 28px);padding:var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-sm, .375rem);background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-range-input:focus,.tbw-filter-date-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-range-separator{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding-bottom:var(--tbw-spacing-xs, .25rem)}.tbw-filter-blank-option{display:flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-spacing-xs, .25rem) 0;margin-bottom:var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-sm, .8125rem);cursor:pointer;user-select:none}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));margin:0;cursor:pointer}.tbw-filter-date-range.tbw-filter-disabled,.tbw-filter-range-inputs.tbw-filter-disabled,.tbw-filter-range-slider.tbw-filter-disabled{opacity:.4;pointer-events:none}.tbw-filter-range-slider{position:relative;height:24px;margin:var(--tbw-spacing-md, .5rem) 0 var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-track{position:absolute;top:50%;left:0;right:0;height:4px;background:var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-fill{position:absolute;top:50%;height:4px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-thumb{position:absolute;top:0;width:100%;height:100%;background:none;pointer-events:none;-webkit-appearance:none;appearance:none}.tbw-filter-range-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,i){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const n=document.createElement("div");if(n.className="tbw-filter-panel",this.copyGridThemeContext(n),this.isAnimationEnabled&&n.classList.add("tbw-filter-panel-animated"),this.panelElement=n,this.openPanelField=e,i.classList.add("active"),this.panelButtonElement=i,this.config.valuesHandler)return n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.positionPanel(n,i),this.setupPanelCloseHandler(n,i),void this.config.valuesHandler(e,t).then(i=>{this.openPanelField===e&&this.panelElement&&(n.innerHTML="",this.renderPanelContent(e,t,n,i))});const o=t.filterValue??(t.valueAccessor?(e,i)=>r(i,t):void 0),s=ot(this.getDataRows(),e,o);document.body.appendChild(n),this.positionPanel(n,i),this.renderPanelContent(e,t,n,s),this.setupPanelCloseHandler(n,i)}renderPanelContent(e,t,i,r){const n=this.filters.get(e);if("in"===n?.operator&&"set"===n.type&&Array.isArray(n.value)&&!this.excludedValues.has(e)){const t=n.value,i=new Set(t.map(e=>null==e?it:e)),o=new Set(r.filter(e=>!i.has(e)));this.excludedValues.set(e,o)}let o=this.excludedValues.get(e);o||(o=/* @__PURE__ */new Set,this.excludedValues.set(e,o));const s=this.searchText.get(e)??"",l={field:e,column:t,uniqueValues:r,excludedValues:o,searchText:s,currentFilter:this.filters.get(e),applySetFilter:(t,i)=>{this.applySetFilter(e,t,i),this.closeFilterPanel()},applyTextFilter:(t,i,r)=>{this.applyTextFilter(e,t,i,r),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let a=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(i,l),a=i.children.length>0),!a&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(i,l),a=i.children.length>0)}if(!a){const e=t.filterType??t.type;"number"===e?function(e,t,i,r){const{field:n,column:o}=t,s=o.filterParams,l=o.editorParams,a=i.filter(e=>"number"==typeof e&&!isNaN(e)),d=a.length>0?Math.min(...a):0,c=a.length>0?Math.max(...a):100,u=ht(s?.min??l?.min,d),h=ht(s?.max??l?.max,c),g=s?.step??l?.step??1,p=r.get(n);let f=u,m=h;const w="blank"===p?.operator;"between"===p?.operator?(f=ht(p.value,u),m=ht(p.valueTo,h)):"greaterThanOrEqual"===p?.operator?f=ht(p.value,u):"lessThanOrEqual"===p?.operator&&(m=ht(p.value,h));const b=document.createElement("div");b.className="tbw-filter-range-inputs";const v=document.createElement("div");v.className="tbw-filter-range-group";const y=document.createElement("label");y.textContent="Min",y.className="tbw-filter-range-label";const C=document.createElement("input");C.type="number",C.className="tbw-filter-range-input",C.min=String(u),C.max=String(h),C.step=String(g),C.value=String(f),v.appendChild(y),v.appendChild(C),b.appendChild(v);const x=document.createElement("span");x.className="tbw-filter-range-separator",x.textContent="–",b.appendChild(x);const E=document.createElement("div");E.className="tbw-filter-range-group";const S=document.createElement("label");S.textContent="Max",S.className="tbw-filter-range-label";const R=document.createElement("input");R.type="number",R.className="tbw-filter-range-input",R.min=String(u),R.max=String(h),R.step=String(g),R.value=String(m),E.appendChild(S),E.appendChild(R),b.appendChild(E),e.appendChild(b);const A=document.createElement("div");A.className="tbw-filter-range-slider";const k=document.createElement("div");k.className="tbw-filter-range-track";const I=document.createElement("div");I.className="tbw-filter-range-fill";const _=document.createElement("input");_.type="range",_.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",_.min=String(u),_.max=String(h),_.step=String(g),_.value=String(f);const T=document.createElement("input");T.type="range",T.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",T.min=String(u),T.max=String(h),T.step=String(g),T.value=String(m),A.appendChild(k),A.appendChild(I),A.appendChild(_),A.appendChild(T),e.appendChild(A);const L=document.createElement("label");L.className="tbw-filter-blank-option";const F=document.createElement("input");F.type="checkbox",F.className="tbw-filter-blank-checkbox",F.checked=w;const G=document.createTextNode("Blank");L.appendChild(F),L.appendChild(G);const D=e=>{C.disabled=e,R.disabled=e,_.disabled=e,T.disabled=e,b.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};D(w),F.addEventListener("change",()=>{D(F.checked)}),e.appendChild(L);const M=()=>{const e=parseFloat(_.value),t=parseFloat(T.value),i=h-u,r=(e-u)/i*100,n=(t-u)/i*100;I.style.left=`${r}%`,I.style.width=n-r+"%"};_.addEventListener("input",()=>{const e=Math.min(parseFloat(_.value),parseFloat(T.value));_.value=String(e),C.value=String(e),M()}),T.addEventListener("input",()=>{const e=Math.max(parseFloat(T.value),parseFloat(_.value));T.value=String(e),R.value=String(e),M()}),C.addEventListener("input",()=>{const e=parseFloat(C.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(R.value))),_.value=String(t),M()}),R.addEventListener("input",()=>{const e=parseFloat(R.value);let t=Number.isFinite(e)?e:h;t=Math.min(h,Math.max(t,parseFloat(C.value))),T.value=String(t),M()}),M();const N=document.createElement("div");N.className="tbw-filter-buttons";const q=document.createElement("button");q.type="button",q.className="tbw-filter-apply-btn",q.textContent="Apply",q.addEventListener("click",()=>{if(F.checked)return void t.applyTextFilter("blank","");const e=parseFloat(C.value),i=parseFloat(R.value),r=Number.isFinite(e)?e:u,n=Number.isFinite(i)?i:h;r!==u||n!==h?t.applyTextFilter("between",r,n):t.clearFilter()}),N.appendChild(q);const P=document.createElement("button");P.type="button",P.className="tbw-filter-clear-btn",P.textContent="Clear Filter",P.addEventListener("click",()=>{t.clearFilter()}),N.appendChild(P),e.appendChild(N)}(i,l,r,this.filters):"date"===e?function(e,t,i,r){const{field:n,column:o}=t,s=o.filterParams,l=o.editorParams,a=i.filter(e=>e instanceof Date||"string"==typeof e&&!isNaN(Date.parse(e))).map(e=>e instanceof Date?e:new Date(e)).filter(e=>!isNaN(e.getTime())),d=a.length>0?new Date(Math.min(...a.map(e=>e.getTime()))):null,c=a.length>0?new Date(Math.max(...a.map(e=>e.getTime()))):null,u=ct(s?.min)||ct(l?.min)||dt(d),h=ct(s?.max)||ct(l?.max)||dt(c),g=r.get(n);let p="",f="";const m="blank"===g?.operator;"between"===g?.operator?(p=ct(g.value)||"",f=ct(g.valueTo)||""):"greaterThanOrEqual"===g?.operator?p=ct(g.value)||"":"lessThanOrEqual"===g?.operator&&(f=ct(g.value)||"");const w=document.createElement("div");w.className="tbw-filter-date-range";const b=document.createElement("div");b.className="tbw-filter-date-group";const v=document.createElement("label");v.textContent="From",v.className="tbw-filter-range-label";const y=document.createElement("input");y.type="date",y.className="tbw-filter-date-input",u&&(y.min=u),h&&(y.max=h),y.value=p,b.appendChild(v),b.appendChild(y),w.appendChild(b);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",w.appendChild(C);const x=document.createElement("div");x.className="tbw-filter-date-group";const E=document.createElement("label");E.textContent="To",E.className="tbw-filter-range-label";const S=document.createElement("input");S.type="date",S.className="tbw-filter-date-input",u&&(S.min=u),h&&(S.max=h),S.value=f,x.appendChild(E),x.appendChild(S),w.appendChild(x),e.appendChild(w);const R=document.createElement("label");R.className="tbw-filter-blank-option";const A=document.createElement("input");A.type="checkbox",A.className="tbw-filter-blank-checkbox",A.checked=m;const k=document.createTextNode("Show only blank");R.appendChild(A),R.appendChild(k);const I=e=>{y.disabled=e,S.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};I(m),A.addEventListener("change",()=>{I(A.checked)}),e.appendChild(R);const _=document.createElement("div");_.className="tbw-filter-buttons";const T=document.createElement("button");T.type="button",T.className="tbw-filter-apply-btn",T.textContent="Apply",T.addEventListener("click",()=>{if(A.checked)return void t.applyTextFilter("blank","");const e=y.value,i=S.value;e&&i?t.applyTextFilter("between",e,i):e?t.applyTextFilter("greaterThanOrEqual",e):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),_.appendChild(T);const L=document.createElement("button");L.type="button",L.className="tbw-filter-clear-btn",L.textContent="Clear Filter",L.addEventListener("click",()=>{t.clearFilter()}),_.appendChild(L),e.appendChild(_)}(i,l,r,this.filters):ut(i,l,r,o,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController;const{signal:i}=this.panelAbortController;setTimeout(()=>{i.aborted||document.addEventListener("click",i=>{e.contains(i.target)||i.target===t||this.closeFilterPanel()},{signal:i})},0)}closeFilterPanel(){const e=this.panelElement;if(e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.panelButtonElement){const e=this.openPanelField;e&&this.filters.has(e)||this.panelButtonElement.classList.remove("active"),this.panelButtonElement=null}this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===gt.supportsAnchorPositioning&&(gt.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),gt.supportsAnchorPositioning}positionPanel(e,t){const i=t.closest(".header-row")??t;if(i.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=i,gt.checkAnchorPositioningSupport()){i.style.anchorName="",t.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=t;const r=i.getBoundingClientRect().bottom-t.getBoundingClientRect().bottom;return e.style.marginTop=`${r+4}px`,void requestAnimationFrame(()=>{const i=e.getBoundingClientRect(),r=t.getBoundingClientRect();i.top<r.top&&e.classList.add("tbw-filter-panel-above")})}const r=i.getBoundingClientRect(),n=t.getBoundingClientRect();e.style.position="fixed",e.style.top=`${r.bottom+4}px`,e.style.left=`${n.right}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();e.style.left=n.right-t.width+"px";n.right-t.width<8&&(e.style.left=`${n.left}px`),t.bottom>window.innerHeight-8&&(e.style.top=r.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,i){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else{const r=this.filters.get(e);if("in"===r?.operator){const r=this.getUniqueValues(e),n=new Set(t),o=r.filter(e=>!n.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:o,...void 0!==i&&{valueTo:i}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==i&&{valueTo:i}})}this.applyFiltersInternal()}applyTextFilter(e,t,i,r){const n=this.getColumnByField(e),o=n?.filterType??n?.type??"text";this.filters.set(e,{field:e,type:o,operator:t,value:i,valueTo:r}),this.applyFiltersInternal()}applyFiltersInternal(e){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const i=this.config.filterHandler(t,this.sourceRows),r=i=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=i,this.grid.rows=i,e?this.emitPluginEvent("filter-change",{filters:t}):(this.broadcast("filter-change",{filters:t,filteredRowCount:i.length,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()};return void(i&&"function"==typeof i.then?i.then(r):r(i))}e?this.emitPluginEvent("filter-change",{filters:t}):(this.broadcast("filter-change",{filters:t,filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const i={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,i),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null}}function pt(e){if(!e.length)return[];const t=[],i=/* @__PURE__ */new Map,r=(e,i)=>{if(!i.length)return;const r=t[t.length-1];r&&r.implicit&&r.firstIndex+r.columns.length===e?r.columns.push(...i):t.push({id:"__implicit__"+e,label:void 0,columns:i,firstIndex:e,implicit:!0})};let n=[],o=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===n.length&&(o=s),void n.push(e);n.length&&(r(o,n.slice()),n=[]);const a="string"==typeof l?l:l.id,d="string"==typeof l?void 0:l.label;d&&!i.has(a)&&i.set(a,d);const c=i.get(a)??d,u=t[t.length-1];u&&!u.implicit&&u.id===a?u.columns.push(e):t.push({id:a,label:c,columns:[e],firstIndex:s})}),n.length&&r(o,n),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function ft(e){const t=function(e){const t=/* @__PURE__ */new Set;for(let i=0;i<e.length;i++){if(!String(e[i].id).startsWith("__implicit__"))continue;if(!e[i].columns.every(e=>e.field?.startsWith("__tbw_")))continue;let r=null;for(let t=i-1;t>=0;t--)if(!String(e[t].id).startsWith("__implicit__")){r=e[t].id;break}let n=null;for(let t=i+1;t<e.length;t++)if(!String(e[t].id).startsWith("__implicit__")){n=e[t].id;break}r&&n&&r===n&&t.add(String(e[i].id))}return t}(e),i=function(e,t){const i=[];for(const r of e){if(String(r.id).startsWith("__implicit__")&&t.has(String(r.id)))continue;const e=i[i.length-1];e&&!String(r.id).startsWith("__implicit__")&&e.id===r.id?i[i.length-1]={...e,columns:[...e.columns,...r.columns]}:i.push({...r,columns:[...r.columns]})}return i}(e,t);return{merged:i,embedded:t}}function mt(e,t){const i=e.columns[0],r=e.columns[e.columns.length-1],n=i?t.findIndex(e=>e.field===i.field):-1,o=r?t.findIndex(e=>e.field===r.field):-1;return-1!==n&&-1!==o?[n,o]:null}class wt extends i{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:var(--tbw-button-padding-sm, .25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm, .9em);text-transform:uppercase;letter-spacing:.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#Z=/* @__PURE__ */new Set;#Q=[];#X=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#J,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#Z.clear(),this.#Q=[],this.#X.clear()}#J=e=>{if(!this.isActive)return;const t=e,{field:i,columnOrder:r}=t.detail;if(this.config.lockGroupOrder){const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const i=e.get(t.id);i?i.push(...t.columns):e.set(t.id,[...t.columns])}for(const[,n]of e)if(!this.#ee(n,r))return t.preventDefault(),void this.#te(i)}this.#ie(r)};#ie(e){this.#Z.clear();const t=/* @__PURE__ */new Map;for(const i of this.groups)for(const e of i.columns)t.set(e.field,i.id);for(let i=0;i<e.length-1;i++){t.get(e[i])!==t.get(e[i+1])&&this.#Z.add(e[i])}}#ee(e,t){const i=e.map(e=>t.indexOf(e.field)).filter(e=>-1!==e).sort((e,t)=>e-t);return i.length<=1||i.length===i[i.length-1]-i[0]+1}#te(e){const t=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);t&&(t.style.setProperty("--_flash-color","var(--tbw-color-error)"),t.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){if("getColumnGrouping"===e.type)return this.#re()}#re(){let e;if(this.#Q.length>0)e=this.#Q.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}));else if(this.isActive&&this.groups.length>0){const t=/* @__PURE__ */new Map;for(const e of this.groups){if(e.id.startsWith("__implicit__"))continue;const i=t.get(e.id);if(i)for(const t of e.columns)i.fields.includes(t.field)||i.fields.push(t.field);else t.set(e.id,{id:e.id,label:e.label??e.id,fields:e.columns.map(e=>e.field)})}e=Array.from(t.values());const i=this.columns;for(const r of i)if(r.hidden&&r.group){const t="string"==typeof r.group?r.group:r.group.id,i="string"==typeof r.group?r.group:r.group.label??r.group.id,n=e.find(e=>e.id===t);n?n.fields.includes(r.field)||n.fields.push(r.field):e.push({id:t,label:i,fields:[r.field]})}}else{const t=this.columns,i=/* @__PURE__ */new Map;for(const e of t){if(!e.group)continue;const t="string"==typeof e.group?e.group:e.group.id,r="string"==typeof e.group?e.group:e.group.label??e.group.id,n=i.get(t);n?n.fields.includes(e.field)||n.fields.push(e.field):i.set(t,{id:t,label:r,fields:[e.field]})}e=Array.from(i.values())}const t=this.grid?.getColumnOrder();if(t&&t.length>0){const i=new Map(t.map((e,t)=>[e,t]));for(const t of e)t.fields.sort((e,t)=>(i.get(e)??1/0)-(i.get(t)??1/0))}return e}static detect(e,t){const i=t?.features?.groupingColumns;if(i&&"object"==typeof i&&Array.isArray(i.columnGroups)&&i.columnGroups.length>0)return!0;if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const r=t?.columns;return!!Array.isArray(r)&&function(e){return e.some(e=>null!=e.group)}(r)}processColumns(e){const t=this.config?.columnGroups,i=this.grid?.gridConfig?.columnGroups;let r,n;if(t&&Array.isArray(t)&&t.length>0?(i&&Array.isArray(i)&&i.length>0&&this.warn(m,"columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),r=t):i&&Array.isArray(i)&&i.length>0&&(r=i),r&&r.length>0){const t=r.map(e=>{return e.id?e:(e.header||p(f,'ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.'),{...e,id:(t=e.header,t.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""))});var t});this.#Q=t,this.#X.clear();for(const e of t)e.renderer&&this.#X.set(e.id,e.renderer);const i=/* @__PURE__ */new Map;for(const e of t)for(const t of e.children)i.set(t,{id:e.id,label:e.header});n=e.map(e=>{const t=i.get(e.field);return t&&!e.group?{...e,group:t}:e})}else this.#Q=[],this.#X.clear(),n=[...e];const o=pt(n);if(0===o.length)return this.isActive=!1,this.groups=[],n;if(this.#X.size>0)for(const s of o){const e=this.#X.get(s.id);e&&(s.renderer=e)}this.isActive=!0,this.groups=o,this.#Z.clear();for(const s of o){const e=s.columns[s.columns.length-1];e?.field&&this.#Z.add(e.field)}return n}afterRender(){if(!this.isActive){const e=this.gridElement?.querySelector(".header"),t=e?.querySelector(".header-group-row");return void(t&&t.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const i=this.visibleColumns,r=pt(i);if(0===r.length)return;if(this.#X.size>0)for(const n of r){const e=this.#X.get(n.id);e&&(n.renderer=e)}this.#Z.clear();const o=ft(r);for(let n=0;n<o.merged.length;n++){const e=o.merged[n],t=e.columns[e.columns.length-1];t?.field&&n<o.merged.length-1&&this.#Z.add(t.field)}const s=function(e,t,i,r){if(0===e.length)return null;const o=document.createElement("div");o.className="header-group-row",o.setAttribute("role","row");const{merged:s}=r??ft(e);for(const l of s){const e=String(l.id),r=e.startsWith("__implicit__"),s=mt(l,t);if(!s)continue;const[a,d]=s,c=d-a+1,u=r?"":l.label||l.id,h=document.createElement("div");h.className="cell header-group-cell",r&&h.classList.add("implicit-group"),h.setAttribute("data-group",e),h.style.gridColumn=`${a+1} / span ${c}`;const g=!r&&(l.renderer||i)||void 0;if(g&&!r){const t=g({id:e,label:String(u),columns:l.columns,firstIndex:a,isImplicit:!1});t instanceof HTMLElement?h.appendChild(t):"string"==typeof t?h.innerHTML=n(t):h.textContent=u}else h.textContent=u;o.appendChild(h)}return o}(r,i,this.config.groupHeaderRenderer,o);if(s){s.classList.toggle("no-borders",!this.config.showGroupBorders);const t=e.querySelector(".header-row");t?e.insertBefore(s,t):e.appendChild(s)}const l=e.querySelector(".header-row");l&&(l.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,t,i,r){if(!t.length||!e)return;const{merged:n,embedded:o}=r??ft(t),s=/* @__PURE__ */new Map;for(const a of n)if(!String(a.id).startsWith("__implicit__"))for(const e of a.columns)e.field&&s.set(e.field,a.id);for(let a=0;a<t.length;a++){const e=t[a];if(String(e.id).startsWith("__implicit__")&&o.has(String(e.id)))for(let i=a-1;i>=0;i--)if(!String(t[i].id).startsWith("__implicit__")){for(const r of e.columns)r.field&&s.set(r.field,t[i].id);break}}const l=Array.from(e.querySelectorAll(".cell[data-field]"));l.forEach(e=>{const t=e.getAttribute("data-field")||"",i=s.get(t);i&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",i))});for(const a of n){const e=a.columns[a.columns.length-1],t=l.find(t=>t.getAttribute("data-field")===e.field);t&&t.classList.add("group-end")}}(l,r,0,o))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#Z.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){return this.groups.filter(t=>t.id===e).flatMap(e=>e.columns)}refresh(){this.requestRender()}}function bt({rows:e,config:t,expanded:i,initialExpanded:r,groupSortDirections:n}){const o=t.groupOn;if("function"!=typeof o)return[];const s={key:"__root__",value:null,depth:-1,rows:[],children:/* @__PURE__ */new Map};if(e.forEach(e=>{let t=o(e);null==t||!1===t?t=["__ungrouped__"]:Array.isArray(t)||(t=[t]);let i=s;t.forEach((t,r)=>{const n=null==t?"∅":String(t),o="__root__"===i.key?n:i.key+"||"+n;let s=i.children.get(n);s||(s={key:o,value:t,depth:r,rows:[],children:/* @__PURE__ */new Map,parent:i},i.children.set(n,s)),s.rows.push(e),i=s})}),1===s.children.size&&s.children.has("__ungrouped__")){if(s.children.get("__ungrouped__").rows.length===e.length)return[]}const l=/* @__PURE__ */new Map;for(let h=0;h<e.length;h++)l.set(e[h],h);const a=/* @__PURE__ */new Set([...i,...r??[]]),d=e=>{const t=[...e.children.values()],i=e===s?0:e.depth+1,r=n?.get(i)??1;return t.sort((e,t)=>{const i=e.value,n=t.value;return null==i&&null==n?0:null==i?r:null==n?-r:i>n?r:i<n?-r:0}),t},c=[],u=e=>{if(e===s){for(const t of d(e))u(t);return}const t=a.has(e.key);if(c.push({kind:"group",key:e.key,value:e.value,depth:e.depth,rows:e.rows,expanded:t}),t)if(e.children.size)for(const i of d(e))u(i);else e.rows.forEach(e=>c.push({kind:"data",row:e,rowIndex:l.get(e)??-1}))};return u(s),c}function vt(e,t){if(!0===e)return new Set(t);if(!1===e||null==e)/* @__PURE__ */
|
|
2
|
-
return new Set;if("number"==typeof e){const i=t[e];return i?/* @__PURE__ */new Set([i]):/* @__PURE__ */new Set}return"string"==typeof e?/* @__PURE__ */new Set([e]):Array.isArray(e)?new Set(e):/* @__PURE__ */new Set}function yt({groups:e,expanded:t,groupRows:i,loadingGroups:r,parentPath:n=[]}){const o=[],s=n.length;for(const l of e){const e=[...n,l.key],a=t.has(l.key),d=i.get(l.key)??[],c=r.has(l.key);if(o.push({kind:"group",key:l.key,value:l.value,depth:s,rows:d,expanded:a}),a)if(l.children?.length){const n=yt({groups:l.children,expanded:t,groupRows:i,loadingGroups:r,parentPath:e});o.push(...n)}else c?o.push({kind:"data",row:{__loading:!0,__groupKey:l.key},rowIndex:-1}):d.forEach((e,t)=>{o.push({kind:"data",row:e,rowIndex:t})})}return o}function Ct(e,t,i=[]){for(const r of e){const e=[...i,r.key];if(r.key===t)return e;if(r.children?.length){const i=Ct(r.children,t,e);if(i.length>0)return i}}return[]}class xt extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10,onHeaderClick:-1},incompatibleWith:[{name:"tree",reason:"Both plugins transform the entire row model. TreePlugin flattens nested hierarchies while GroupingRowsPlugin groups flat rows with synthetic headers. Use one approach per grid."},{name:"pivot",reason:"PivotPlugin creates its own aggregated row and column structure. Row grouping cannot be applied on top of pivot-generated rows."}],events:[{type:"group-toggle",description:"Emitted when groups are expanded/collapsed. Broadcast to both DOM consumers and plugin bus."},{type:"group-expand",description:"Emitted when a pre-defined group is expanded."},{type:"group-collapse",description:"Emitted when a pre-defined group is collapsed."}],queries:[{type:"canMoveRow",description:"Returns false for group header rows (cannot be reordered)"},{type:"grouping:get-grouped-fields",description:"Returns the column field names that match group depth levels (string[])"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level group indices for ServerSide pagination."}],configRules:[{id:"groupingRows/accordion-defaultExpanded",severity:"warn",message:'"accordion: true" and "defaultExpanded" (non-false) are used together.\n → In accordion mode, only one group can be open at a time.\n → Using defaultExpanded with multiple groups will collapse to one on first toggle.\n → Consider using "defaultExpanded: false" or a single group key/index with accordion mode.',check:e=>!0===e.accordion&&!1!==e.defaultExpanded&&void 0!==e.defaultExpanded&&!("number"==typeof e.defaultExpanded)&&!("string"==typeof e.defaultExpanded)&&(!0===e.defaultExpanded||Array.isArray(e.defaultExpanded)&&e.defaultExpanded.length>1)}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for coordinated group sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded grouped data"}];name="groupingRows";styles="@layer tbw-plugins{.group-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-grouping-rows-bg, var(--tbw-color-panel-bg));font-weight:500;border-bottom:var(--tbw-row-divider);min-height:var(--tbw-row-height)}.group-row .cell{display:flex;align-items:center;padding:var(--tbw-cell-padding, .125rem .5rem)}@media(hover:hover){.group-row:hover{background:var(--tbw-grouping-rows-bg-hover, var(--tbw-color-row-hover))}}.group-toggle{cursor:pointer;user-select:none;display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-toggle-size, 1.25rem);height:var(--tbw-toggle-size, 1.25rem);margin-right:.25rem;background:none;border:0;font:inherit}.group-toggle:hover{background:var(--tbw-grouping-rows-toggle-hover, var(--tbw-color-row-hover));border-radius:var(--tbw-border-radius, .125rem)}.group-label{display:inline-flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.group-count{color:var(--tbw-grouping-rows-count-color, var(--tbw-color-fg-muted));font-size:var(--tbw-font-size-xs, .85em);font-weight:400}.group-aggregates{display:inline-flex;align-items:center;gap:var(--tbw-spacing-lg, 1rem);margin-left:var(--tbw-spacing-lg, 1rem);font-weight:400;font-size:var(--tbw-font-size-sm, .875em);color:var(--tbw-grouping-rows-aggregate-color, var(--tbw-color-fg-muted))}.group-aggregate{white-space:nowrap}.group-row{padding-left:calc(var(--tbw-group-depth, 0) * var(--tbw-group-indent-width, 1.25em))}.data-grid-row.tbw-group-slide-in{animation:tbw-group-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-group-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.data-grid-row.tbw-group-fade-in{animation:tbw-group-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-group-fade-in{0%{opacity:0}to{opacity:1}}}";get defaultConfig(){return{defaultExpanded:!1,showRowCount:!0,indentWidth:20,aggregators:{},animation:"slide",accordion:!1}}expandedKeys=/* @__PURE__ */new Set;flattenedRows=[];isActive=!1;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;hasAppliedDefaultExpanded=!1;preDefinedGroups=[];groupRowsMap=/* @__PURE__ */new Map;loadingGroups=/* @__PURE__ */new Set;groupedFields=[];userGroupSortDirections=/* @__PURE__ */new Map;flatMeta=[];get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detach(){const e=this.gridElement?.querySelector(".rows-body");e?.setAttribute("role","grid"),this.expandedKeys.clear(),this.flattenedRows=[],this.flatMeta=[],this.isActive=!1,this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.hasAppliedDefaultExpanded=!1,this.preDefinedGroups=[],this.groupRowsMap.clear(),this.loadingGroups.clear(),this.groupedFields=[],this.userGroupSortDirections.clear()}getRowHeight(e,t){if(null!=this.config.groupRowHeight)return!0===e.__isGroupRow?this.config.groupRowHeight:void 0}handleQuery(e){if("canMoveRow"===e.type){const t=e.context;if(!0===t?.__isGroupRow)return!1}if("grouping:get-grouped-fields"===e.type)return[...this.groupedFields];if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:i}=e.context;if(0===this.flattenedRows.length)return;if(0===this.preDefinedGroups.length&&!Array.isArray(this.config.groups))return;const r=this.getActiveGroups();return{startNode:this.getTopLevelGroupIndex(t),endNode:this.getTopLevelGroupIndex(i)+1,totalLoadedNodes:r.length}}}getTopLevelGroupIndex(e){let t=-1;const i=Math.min(e,this.flattenedRows.length-1);for(let r=0;r<=i;r++){const e=this.flattenedRows[r];"group"===e.kind&&0===e.depth&&t++}return Math.max(0,t)}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0,this.preDefinedGroups=t.rows,this.groupRowsMap.clear(),this.loadingGroups.clear(),this.hasAppliedDefaultExpanded=!1,this.requestRender())}),this.on("datasource:children",e=>{const t=e;if("grouping-rows"!==t.context?.source)return;t.claimed=!0;const i=t.context.groupKey;i&&(this.groupRowsMap.set(i,t.rows),this.loadingGroups.delete(i),this.requestRender())})}onHeaderClick(e){const t=this.groupedFields.indexOf(e.field);if(-1===t)return;if(!e.column.sortable)return;const i=t,r=this.userGroupSortDirections.get(i)??1;return this.userGroupSortDirections.set(i,1===r?-1:1),this.requestRender(),!0}resolveGroupSortDirections(e){const t=this.config;if("function"!=typeof t.groupOn||0===e.length)return void(this.groupedFields=[]);const i=this.columns.map(e=>e.field),r=function(e,t,i){const r=/* @__PURE__ */new Map;if(0===e.length)return r;const n=e[0];let o=t(n);if(null==o||!1===o)return r;Array.isArray(o)||(o=[o]);for(let s=0;s<o.length;s++){const e=o[s];for(const t of i)if(n[t]===e){r.set(s,t);break}}return r}([...e],t.groupOn,i);if(this.groupedFields=[...r.values()],0===r.size)return;const n=new Map(this.userGroupSortDirections);if(n.size<r.size){const e=/* @__PURE__ */new Map,t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0){const i=t[0];if(Array.isArray(i))for(const t of i)e.set(t.field,"desc"===t.direction?-1:1)}if(0===e.size){const t=this.grid;t._sortState&&e.set(t._sortState.field,t._sortState.direction)}for(const[i,o]of r)if(!n.has(i)){const t=e.get(o);void 0!==t&&n.set(i,t)}}return n.size>0?n:void 0}static detect(e,t){return"function"==typeof t?.groupOn||"boolean"==typeof t?.enableRowGrouping||Array.isArray(t?.groups)}processRows(e){if(this.preDefinedGroups.length>0||Array.isArray(this.config.groups))return this.preDefinedGroups.length>0||Array.isArray(this.config.groups)&&this.config.groups.length>0?this.processPreDefinedGroups():(this.isActive=!1,this.flattenedRows=[],[]);const t=this.config;if("function"!=typeof t.groupOn)return this.isActive=!1,this.flattenedRows=[],[...e];const i=this.resolveGroupSortDirections(e),r=bt({rows:[...e],config:t,expanded:/* @__PURE__ */new Set,groupSortDirections:i});if(0===r.length)return this.isActive=!1,this.flattenedRows=[],[...e];let n;if(!this.hasAppliedDefaultExpanded&&0===this.expandedKeys.size&&!1!==t.defaultExpanded){const e=function(e){return e.filter(e=>"group"===e.kind).map(e=>e.key)}(r);n=vt(t.defaultExpanded??!1,e),n.size>0&&(this.expandedKeys=new Set(n),this.hasAppliedDefaultExpanded=!0)}const o=bt({rows:[...e],config:t,expanded:this.expandedKeys,initialExpanded:n,groupSortDirections:i});this.isActive=!0,this.flattenedRows=o,this.computeFlatMeta(),this.keysToAnimate.clear();const s=/* @__PURE__ */new Set;return o.forEach((e,t)=>{if("data"===e.kind){const e=`data-${t}`;s.add(e),this.previousVisibleKeys.has(e)||this.keysToAnimate.add(e)}}),this.previousVisibleKeys=s,o.map(e=>{return"group"===e.kind?{__isGroupRow:!0,__groupKey:e.key,__groupValue:e.value,__groupDepth:e.depth,__groupRows:e.rows,__groupExpanded:e.expanded,__groupRowCount:(t=e,"group"!==t.kind?0:t.rows.length),__rowCacheKey:`group:${e.key}`}:e.row;var t})}onCellClick(e){const t=e.row;if(t?.__isGroupRow){const i=e.originalEvent.target;if(i?.closest(`.${w.GROUP_TOGGLE}`))return this.toggle(t.__groupKey),!0}}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusRow,i=this.rows[t];return i?.__isGroupRow?(e.preventDefault(),this.toggle(i.__groupKey),this.requestRenderWithFocus(),!0):void 0}renderRow(e,t,i){if(!0===e?.__loading&&e?.__groupKey){t.className="data-grid-row",t.__isCustomRow=!0,t.innerHTML="";const e=document.createElement("div");return e.className="cell",e.style.gridColumn="1 / -1",e.setAttribute("role","gridcell"),e.textContent=" ",t.appendChild(e),b(t,!0),!0}if(!e?.__isGroupRow)return!1;const r=this.config;if(r.groupRowRenderer){const i=()=>{this.toggle(e.__groupKey)},n=r.groupRowRenderer({key:e.__groupKey,value:e.__groupValue,depth:e.__groupDepth,rows:e.__groupRows,expanded:e.__groupExpanded,toggleExpand:i});if(n)return t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),"string"==typeof n?t.innerHTML=n:(t.innerHTML="",t.appendChild(n)),!0}const n=()=>{this.toggle(e.__groupKey)};t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),t.setAttribute("role","row"),t.setAttribute("aria-expanded",String(e.__groupExpanded)),t.classList.toggle("tbw-row-expanded",!!e.__groupExpanded);const o=this.flatMeta[i];o&&(t.setAttribute("aria-level",String(o.level)),t.setAttribute("aria-setsize",String(o.setSize)),t.setAttribute("aria-posinset",String(o.posInSet))),t.style.setProperty("--tbw-group-depth",String(e.__groupDepth||0)),void 0!==r.indentWidth&&t.style.setProperty("--tbw-group-indent-width",`${r.indentWidth}px`),t.style.height="",t.innerHTML="";return!1!==r.fullWidth?this.renderFullWidthGroupRow(e,t,n):this.renderPerColumnGroupRow(e,t,n),!0}afterRender(){const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.gridElement?.querySelector(".rows-body");t&&"treegrid"!==t.getAttribute("role")&&t.setAttribute("role","treegrid");for(const n of e.querySelectorAll(".data-grid-row:not(.group-row)")){const e=n.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flatMeta[t];i&&(n.setAttribute("aria-level",String(i.level)),n.setAttribute("aria-setsize",String(i.setSize)),n.setAttribute("aria-posinset",String(i.posInSet)))}const i=this.animationStyle;if(!1===i||0===this.keysToAnimate.size)return;const r="fade"===i?"tbw-group-fade-in":"tbw-group-slide-in";for(const n of e.querySelectorAll(".data-grid-row:not(.group-row)")){const e=n.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flattenedRows[t],o="data"===i?.kind?`data-${t}`:void 0;o&&this.keysToAnimate.has(o)&&(n.classList.add(r),n.addEventListener("animationend",()=>n.classList.remove(r),{once:!0}))}this.keysToAnimate.clear()}computeFlatMeta(){const e=this.flattenedRows,t=new Array(e.length),i=/* @__PURE__ */new Map,r=/* @__PURE__ */new Map;let n=null,o=0;for(const d of e)if("group"===d.kind){n&&r.set(n.key,o),n=d,o=0;const e=`${d.key.split("||").slice(0,-1).join("||")}@${d.depth}`;i.set(e,(i.get(e)??0)+1)}else o++;n&&r.set(n.key,o);const s=/* @__PURE__ */new Map;let l=null,a=0;for(let d=0;d<e.length;d++){const n=e[d];if("group"===n.kind){const e=`${n.key.split("||").slice(0,-1).join("||")}@${n.depth}`,r=(s.get(e)??0)+1;s.set(e,r),t[d]={level:n.depth+1,setSize:i.get(e)??1,posInSet:r},l=n,a=0}else{a++;const i=l?.depth??-1,n=l?r.get(l.key)??1:e.length;t[d]={level:i+2,setSize:n,posInSet:a}}}this.flatMeta=t}processPreDefinedGroups(){const e=this.preDefinedGroups.length>0?this.preDefinedGroups:Array.isArray(this.config.groups)?this.config.groups:[];if(0===e.length)return this.isActive=!1,this.flattenedRows=[],[];if(!this.hasAppliedDefaultExpanded&&0===this.expandedKeys.size&&!1!==this.config.defaultExpanded){const t=this.collectGroupKeys(e),i=vt(this.config.defaultExpanded??!1,t);i.size>0&&(this.expandedKeys=new Set(i),this.hasAppliedDefaultExpanded=!0)}const t=yt({groups:e,expanded:this.expandedKeys,groupRows:this.groupRowsMap,loadingGroups:this.loadingGroups});this.isActive=!0,this.flattenedRows=t,this.computeFlatMeta(),this.keysToAnimate.clear();const i=/* @__PURE__ */new Set;return t.forEach((e,t)=>{if("data"===e.kind){const e=`data-${t}`;i.add(e),this.previousVisibleKeys.has(e)||this.keysToAnimate.add(e)}}),this.previousVisibleKeys=i,t.map(t=>{if("group"===t.kind){const i=this.findGroupDefinition(e,t.key),r=i?.rowCount??t.rows.length;return{__isGroupRow:!0,__groupKey:t.key,__groupValue:t.value,__groupDepth:t.depth,__groupRows:t.rows,__groupExpanded:t.expanded,__groupRowCount:r,__rowCacheKey:`group:${t.key}`}}return t.row})}collectGroupKeys(e){const t=[];for(const i of e)t.push(i.key),i.children?.length&&t.push(...this.collectGroupKeys(i.children));return t}getActiveGroups(){return this.preDefinedGroups.length>0?this.preDefinedGroups:Array.isArray(this.config.groups)?this.config.groups:[]}findGroupDefinition(e,t){for(const i of e){if(i.key===t)return i;if(i.children?.length){const e=this.findGroupDefinition(i.children,t);if(e)return e}}}createToggleButton(e,t){const i=document.createElement("button");return i.type="button",i.className=`${w.GROUP_TOGGLE}${e?` ${w.EXPANDED}`:""}`,i.setAttribute("aria-label",e?"Collapse group":"Expand group"),this.setIcon(i,e?"collapse":"expand"),i.addEventListener("click",e=>{e.stopPropagation(),t()}),i}getGroupLabelText(e,t,i){const r=this.config;return r.formatLabel?r.formatLabel(e,t,i):String(e)}renderFullWidthGroupRow(e,t,i){const r=this.config,n=r.aggregators??{},o=e.__groupRows??[],s=document.createElement("div");s.className="cell group-full",s.style.gridColumn="1 / -1",s.setAttribute("role","gridcell"),s.setAttribute("data-col","0"),s.appendChild(this.createToggleButton(e.__groupExpanded,i));const l=document.createElement("span");if(l.className=w.GROUP_LABEL,l.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey),s.appendChild(l),!1!==r.showRowCount){const t=document.createElement("span");t.className=w.GROUP_COUNT,t.textContent=`(${e.__groupRowCount??e.__groupRows?.length??0})`,s.appendChild(t)}const a=Object.entries(n);if(a.length>0){const e=document.createElement("span");e.className="group-aggregates";for(const[t,i]of a){const r=this.columns.find(e=>e.field===t),n=v.run(i,o,t,r);if(null!=n){const i=document.createElement("span");i.className="group-aggregate",i.setAttribute("data-field",t);const o=r?.header??t;i.textContent=`${o}: ${n}`,e.appendChild(i)}}e.children.length>0&&s.appendChild(e)}t.appendChild(s)}renderPerColumnGroupRow(e,t,i){const r=this.config,n=r.aggregators??{},o=this.columns,s=e.__groupRows??[],l=this.gridElement?.querySelector(".body"),a=l?.style.gridTemplateColumns||"";a&&(t.style.display="grid",t.style.gridTemplateColumns=a);let d=!1;o.forEach((o,l)=>{const a=document.createElement("div");if(a.className="cell group-cell",a.setAttribute("data-col",String(l)),a.setAttribute("role","gridcell"),lt(o))return a.setAttribute("data-field",o.field),void t.appendChild(a);if(d){const e=n[o.field];if(e){const t=v.run(e,s,o.field,o);a.textContent=null!=t?String(t):""}else a.textContent=""}else{d=!0,a.appendChild(this.createToggleButton(e.__groupExpanded,i));const t=document.createElement("span"),l=n[o.field];if(l){const i=v.run(l,s,o.field,o);t.textContent=String(null!=i?i:e.__groupValue)}else t.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey);if(a.appendChild(t),!1!==r.showRowCount){const e=document.createElement("span");e.className=w.GROUP_COUNT,e.textContent=` (${s.length})`,a.appendChild(e)}}t.appendChild(a)})}expandAll(){this.expandedKeys=function(e){const t=/* @__PURE__ */new Set;for(const i of e)"group"===i.kind&&t.add(i.key);return t}(this.flattenedRows),this.emitPluginEvent("group-toggle",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("group-toggle",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}toggle(e){const t=!this.expandedKeys.has(e),i=this.config,r=this.flattenedRows.find(t=>"group"===t.kind&&t.key===e);if(i.accordion&&t&&r){const t=/* @__PURE__ */new Set;for(const i of this.expandedKeys)if(e.startsWith(i+"||")||i.startsWith(e+"||"))e.startsWith(i+"||")&&t.add(i);else{const e=this.flattenedRows.find(e=>"group"===e.kind&&e.key===i);e&&e.depth!==r.depth&&t.add(i)}t.add(e),this.expandedKeys=t}else this.expandedKeys=function(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i}(this.expandedKeys,e);this.broadcast("group-toggle",{key:e,expanded:this.expandedKeys.has(e),value:r?.value,depth:r?.depth??0,expandedKeys:[...this.expandedKeys]});const n=this.getActiveGroups();if(n.length>0){const i=Ct(n,e);if(t){if(this.emit("group-expand",{groupKey:e,groupPath:i}),!this.groupRowsMap.has(e)){const t=this.findGroupDefinition(n,e);t&&(this.loadingGroups.add(e),this.grid?.query?.("datasource:fetch-children",{context:{source:"grouping-rows",groupKey:e,group:t,groupPath:i}}))}}else this.emit("group-collapse",{groupKey:e,groupPath:i})}const o=this.expandedKeys.has(e),s=null!=r?.value?String(r.value):e;if(o){const e=r?.rows?.length??0;a(this.gridElement,d(this.gridElement,"groupExpanded",s,e))}else a(this.gridElement,d(this.gridElement,"groupCollapsed",s));this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}expand(e){this.expandedKeys.has(e)||(this.expandedKeys=/* @__PURE__ */new Set([...this.expandedKeys,e]),this.requestRender())}collapse(e){if(this.expandedKeys.has(e)){const t=new Set(this.expandedKeys);t.delete(e),this.expandedKeys=t,this.requestRender()}}getGroupState(){const e=this.flattenedRows.filter(e=>"group"===e.kind);return{isActive:this.isActive,expandedCount:this.expandedKeys.size,totalGroups:e.length,expandedKeys:[...this.expandedKeys]}}getRowCount(){return this.flattenedRows.length}refreshGroups(){this.requestRender()}getExpandedGroups(){return[...this.expandedKeys]}getFlattenedRows(){return this.flattenedRows}isGroupingActive(){return this.isActive}setGroupOn(e){this.config.groupOn=e,this.requestRender()}setGroups(e){this.preDefinedGroups=e,this.groupRowsMap.clear(),this.loadingGroups.clear(),this.expandedKeys.clear(),this.hasAppliedDefaultExpanded=!1,this.requestRender()}getGroups(){return this.preDefinedGroups.length>0?[...this.preDefinedGroups]:Array.isArray(this.config.groups)?[...this.config.groups]:[]}setGroupRows(e,t){this.groupRowsMap.set(e,t),this.loadingGroups.delete(e),this.requestRender()}setGroupLoading(e,t){t?this.loadingGroups.add(e):this.loadingGroups.delete(e),this.requestRender()}clearGroupRows(e){null!=e?this.groupRowsMap.delete(e):this.groupRowsMap.clear(),this.requestRender()}}function Et(e,t){return e.has(t)?e.delete(t):e.add(t),e}function St(e,t,i,r){const n=document.createElement("div");n.className="master-detail-row",n.setAttribute("data-detail-for",String(t)),n.setAttribute("role","row");const o=document.createElement("div");o.className="master-detail-cell",o.setAttribute("role","cell"),o.style.gridColumn=`1 / ${r+1}`;const s=i(e,t);return"string"==typeof s?o.innerHTML=s:s instanceof HTMLElement&&o.appendChild(s),n.appendChild(o),n}class Rt extends i{name="masterDetail";styles="@layer tbw-plugins{tbw-grid{.cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:center}.header-row .cell[data-field=__tbw_expander]{display:none}.master-detail-expander{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.master-detail-toggle{cursor:pointer;opacity:.7;user-select:none;display:inline-flex;align-items:center;justify-content:center}.master-detail-toggle:hover{opacity:1}.master-detail-row{grid-column:1 / -1;display:grid;background:var(--tbw-master-detail-bg, var(--tbw-color-row-alt));border-bottom:1px solid var(--tbw-master-detail-border, var(--tbw-color-border));overflow:hidden}.master-detail-cell{padding:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));overflow:auto}.master-detail-row.tbw-expanding{animation:tbw-detail-expand var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}.master-detail-row.tbw-collapsing{animation:tbw-detail-collapse var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}}@keyframes tbw-detail-expand{0%{opacity:0;max-height:0;padding-top:0;padding-bottom:0}to{opacity:1;max-height:var(--tbw-detail-max-height, 31.25rem);padding-top:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));padding-bottom:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem))}}@keyframes tbw-detail-collapse{0%{opacity:1;max-height:var(--tbw-detail-max-height, 31.25rem)}to{opacity:0;max-height:0}}}";static dependencies=[{name:"serverSide",required:!1,reason:"Fetches detail data via datasource:fetch-children on expand"}];get#f(){return this.grid}get defaultConfig(){return{detailHeight:"auto",expandOnRowClick:!1,collapseOnClickOutside:!1,animation:"slide"}}attach(e){super.attach(e),this.parseLightDomDetail(),this.on("datasource:children",e=>{const t=e;if("master-detail"!==t.context?.source)return;t.claimed=!0;const i=t.context.row;if(i&&this.expandedRows.has(i)){this.detailDataMap.set(i,t.rows),this.loadingDetails.delete(i);const e=this.detailElements.get(i);e&&(e.remove(),this.detailElements.delete(i),this.measuredDetailHeights.delete(i)),this.requestRender()}})}parseLightDomDetail(){const e=this.gridElement;if(!e)return;const t=e.querySelector("tbw-grid-detail");if(!t)return;const i=this.#f.__frameworkAdapter;if(i?.parseDetailElement){const e=i.parseDetailElement(t);if(e)return void(this.config={...this.config,detailRenderer:e})}const r=t.getAttribute("animation"),o=t.getAttribute("show-expand-column"),s=t.getAttribute("expand-on-row-click"),l=t.getAttribute("collapse-on-click-outside"),a=t.getAttribute("height"),d={};null!==r&&(d.animation="false"!==r&&r),null!==o&&(d.showExpandColumn="false"!==o),null!==s&&(d.expandOnRowClick="true"===s),null!==l&&(d.collapseOnClickOutside="true"===l),null!==a&&(d.detailHeight="auto"===a?"auto":parseInt(a,10));const c=t.innerHTML.trim();c&&!this.config.detailRenderer&&(d.detailRenderer=(e,t)=>{const i=y(c,{value:e,row:e});return n(i)}),Object.keys(d).length>0&&(this.config={...this.config,...d})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}animateExpand(e,t,i){if(!this.isAnimationEnabled||!1===this.animationStyle)return!1;e.classList.add("tbw-expanding");let r=!1;const n=()=>{r||(r=!0,e.classList.remove("tbw-expanding"),void 0!==t&&void 0!==i&&this.#ne(e,t,i))};return e.addEventListener("animationend",n,{once:!0}),setTimeout(n,this.animationDuration+50),!0}animateCollapse(e,t){if(!this.isAnimationEnabled||!1===this.animationStyle)return void t();e.classList.add("tbw-collapsing");const i=()=>{e.classList.remove("tbw-collapsing"),t()};e.addEventListener("animationend",i,{once:!0}),setTimeout(i,this.animationDuration+50)}#ne(e,t,i){if(!e.isConnected)return;const r=e.offsetHeight;if(r>0){const e=this.measuredDetailHeights.get(t);this.measuredDetailHeights.set(t,r),e!==r&&this.grid.invalidateRowHeight(i)}}expandedRows=/* @__PURE__ */new Set;detailElements=/* @__PURE__ */new Map;measuredDetailHeights=/* @__PURE__ */new Map;rowsToAnimate=/* @__PURE__ */new Set;loadingDetails=/* @__PURE__ */new Set;detailDataMap=/* @__PURE__ */new Map;static DEFAULT_DETAIL_HEIGHT=150;getDetailHeight(e){const t=this.detailElements.get(e);if(t){if(!(t.classList.contains("tbw-expanding")||t.classList.contains("tbw-collapsing"))){const i=t.offsetHeight;if(i>0)return this.measuredDetailHeights.set(e,i),i}}const i=this.measuredDetailHeights.get(e);return i&&i>0?i:"number"==typeof this.config?.detailHeight?this.config.detailHeight:Rt.DEFAULT_DETAIL_HEIGHT}toggleAndEmit(e,t){if(e?.__isGroupRow)return;this.expandedRows=Et(this.expandedRows,e);const i=this.expandedRows.has(e);if(i){if(this.rowsToAnimate.add(e),!this.detailDataMap.has(e)){const i=this.grid?.query?.("datasource:is-active",null);i&&(this.loadingDetails.add(e),this.grid.query("datasource:fetch-children",{context:{source:"master-detail",row:e,rowIndex:t}}))}}else this.loadingDetails.delete(e);this.emit("detail-expand",{rowIndex:t,row:e,expanded:i}),this.requestRender()}detach(){this.expandedRows.clear(),this.detailElements.clear(),this.measuredDetailHeights.clear(),this.rowsToAnimate.clear(),this.loadingDetails.clear(),this.detailDataMap.clear()}processColumns(e){if(!(!0===this.config.showExpandColumn||!1!==this.config.showExpandColumn&&!!this.config.detailRenderer))return[...e];const t=[...e],i=function(e){return e.find(lt)}(t);if(i)return t;const r=(n=this.name,{field:st,header:"",width:32,resizable:!1,sortable:!1,filterable:!1,lockPosition:!0,utility:!0,meta:{expanderColumn:!0,expanderPlugin:n}});var n;return r.viewRenderer=e=>{const{row:t}=e,i=this.expandedRows.has(t),r=document.createElement("span");r.className="master-detail-expander expander-cell";const n=document.createElement("span");return n.className="master-detail-toggle"+(i?" expanded":""),this.setIcon(n,i?"collapse":"expand"),n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-expanded",String(i)),n.setAttribute("aria-label",i?"Collapse details":"Expand details"),r.appendChild(n),r},[r,...t]}onRowClick(e){if(this.config.expandOnRowClick&&this.config.detailRenderer)return this.toggleAndEmit(e.row,e.rowIndex),!1}onCellClick(e){const t=e.originalEvent?.target;if(t?.classList.contains("master-detail-toggle"))return this.toggleAndEmit(e.row,e.rowIndex),!0;this.expandedRows.size>0&&queueMicrotask(()=>this.#oe())}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusCol,i=this.grid._focusRow,r=this.visibleColumns[t];if(!r||!lt(r))return;const n=this.rows[i];return n?(e.preventDefault(),this.toggleAndEmit(n,i),this.requestRenderWithFocus(),!0):void 0}afterRender(){this.#se(),this.#oe()}#se(){const e=this.gridElement?.querySelector('.header-row .cell[data-field="__tbw_expander"]');if(!e)return;const t=parseInt(e.getAttribute("data-col")||"0",10),i=e.nextElementSibling;i&&(i.style.gridColumn=`${t+1} / ${t+3}`)}onScrollRender(){this.config.detailRenderer&&0!==this.expandedRows.size&&this.#oe()}#oe(){if(!this.config.detailRenderer)return;const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.grid,i=t._rowPool,r=t._virtualization?.start??0,n=t._virtualization?.end??0,o=this.columns.length,s=r,l=n,a=/* @__PURE__ */new Map;if(i){const t=Math.min(i.length,l-s);for(let r=0;r<t;r++){const t=i[r];t.parentNode===e&&a.set(s+r,t)}}else{const t=e.querySelectorAll(".data-grid-row");for(const e of t){const t=e.querySelector(".cell[data-row]"),i=t?parseInt(t.getAttribute("data-row")??"-1",10):-1;i>=0&&a.set(i,e)}}for(const[d,c]of this.detailElements){const e=this.rows.indexOf(d),t=this.expandedRows.has(d),i=e>=0&&a.has(e);if(!t||!i){const e=this.#f.__frameworkAdapter;if(e?.unmount){const t=c.querySelector(".master-detail-cell"),i=t?.firstElementChild;i&&e.unmount(i)}c.parentNode&&c.remove(),this.detailElements.delete(d)}}for(const[d,c]of a){const e=this.rows[d];if(!e)continue;const t=this.expandedRows.has(e);if(c.classList.toggle("tbw-row-expanded",t),!t)continue;const i=this.detailElements.get(e);if(i){i.previousElementSibling!==c&&c.after(i);continue}const r=St(e,d,this.config.detailRenderer,o);"number"==typeof this.config.detailHeight&&(r.style.height=`${this.config.detailHeight}px`),c.after(r),this.detailElements.set(e,r);const n=this.rowsToAnimate.has(e);n&&this.rowsToAnimate.delete(e);n&&this.animateExpand(r,e,d)||requestAnimationFrame(()=>{this.#ne(r,e,d)})}}getRowHeight(e,t){if(!this.expandedRows.has(e))return;return(this.grid.defaultRowHeight??28)+this.getDetailHeight(e)}adjustVirtualStart(e,t,i){if(0===this.expandedRows.size)return e;const r=this.grid?._virtualization?.positionCache;let n=e;if(r&&r.length>0)for(const o of this.expandedRows){const i=this.rows.indexOf(o);if(i<0||i>=e)continue;r[i].offset+r[i].height>t&&i<n&&(n=i)}else{const r=[];for(const e of this.expandedRows){const t=this.rows.indexOf(e);t>=0&&r.push({index:t,row:e})}r.sort((e,t)=>e.index-t.index);let o=0;for(const{index:s,row:l}of r){const r=s*i+o,a=this.getDetailHeight(l);o+=a,s>=e||r+i+a>t&&s<n&&(n=s)}}return n}expand(e){const t=this.rows[e];t&&!t.__isGroupRow&&(this.rowsToAnimate.add(t),this.expandedRows=function(e,t){return e.add(t),e}(this.expandedRows,t),this.requestRender())}collapse(e){const t=this.rows[e];t&&(this.expandedRows=function(e,t){return e.delete(t),e}(this.expandedRows,t),this.requestRender())}toggle(e){const t=this.rows[e];t&&!t.__isGroupRow&&(this.expandedRows=Et(this.expandedRows,t),this.expandedRows.has(t)&&this.rowsToAnimate.add(t),this.requestRender())}isExpanded(e){const t=this.rows[e];return!!t&&function(e,t){return e.has(t)}(this.expandedRows,t)}expandAll(){for(const e of this.rows)e?.__isGroupRow||(this.rowsToAnimate.add(e),this.expandedRows.add(e));this.requestRender()}collapseAll(){this.expandedRows.clear(),this.requestRender()}getExpandedRows(){const e=[];for(const t of this.expandedRows){const i=this.rows.indexOf(t);i>=0&&e.push(i)}return e}getDetailElement(e){const t=this.rows[e];return t?this.detailElements.get(t):void 0}getDetailData(e){const t=this.rows[e];return t?this.detailDataMap.get(t):void 0}isDetailLoading(e){const t=this.rows[e];return!!t&&this.loadingDetails.has(t)}refreshDetailRenderer(){const e=this.config.detailRenderer;if(this.config={...this.config,detailRenderer:void 0},this.parseLightDomDetail(),!this.config.detailRenderer&&e&&(this.config={...this.config,detailRenderer:e}),this.config.detailRenderer){const e=this.#f;"function"==typeof e.refreshColumns?e.refreshColumns():this.requestRender()}}}const At=new Intl.Collator(void 0,{sensitivity:"variant"});function kt(e,t){return null==e&&null==t?0:null==e?1:null==t?-1:"number"==typeof e&&"number"==typeof t?e-t:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():"boolean"==typeof e&&"boolean"==typeof t?e===t?0:e?-1:1:At.compare("string"==typeof e?e:String(e),"string"==typeof t?t:String(t))}function It(e,t){const i=e.findIndex(e=>e.field===t);return i>=0?i+1:void 0}function _t(e,t){return e.find(e=>e.field===t)?.direction}class Tt extends i{static manifest={queries:[{type:"sort:get-model",description:"Returns the current multi-sort model as SortModel[]"},{type:"sort:set-model",description:"Sets the multi-sort model from context (SortModel[])"}]};name="multiSort";styles='@layer tbw-plugins{.header-cell[data-sort=asc]:after{content:"↑";margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.header-cell[data-sort=desc]:after{content:"↓";margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.sort-indicator{margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.sort-index{font-size:var(--tbw-font-size-2xs, .7em);background:var(--tbw-multi-sort-badge-bg, var(--tbw-color-panel-bg));color:var(--tbw-multi-sort-badge-color, var(--tbw-color-fg));border-radius:50%;width:var(--tbw-multi-sort-badge-size, 1em);height:var(--tbw-multi-sort-badge-size, 1em);display:inline-flex;align-items:center;justify-content:center;margin-left:var(--tbw-spacing-xs, .125em);font-weight:600}}';get defaultConfig(){return{maxSortColumns:3,showSortIndex:!0}}sortModel=[];cachedSortResult=null;#le=!1;#ae=[];get#f(){return this.grid}clearCoreSortState(){this.#f._sortState=null}#de(e){const t=this.grid?.query?.("grouping:get-grouped-fields",null);if(!Array.isArray(t)||0===t.length)return e;const i=t[0];if(!Array.isArray(i)||0===i.length)return e;const r=new Set(i),n=e.filter(e=>!r.has(e.field));return n.length===e.length?e:n}detach(){this.sortModel=[],this.cachedSortResult=null}handleQuery(e){switch(e.type){case"sort:get-model":return[...this.sortModel];case"sort:set-model":{const t=e.context;return!!Array.isArray(t)&&(this.sortModel=[...t],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),!0)}default:return}}processRows(e){if(0===this.sortModel.length)return this.cachedSortResult=null,[...e];const t=this.#f;if(!t._isGridEditMode&&"number"==typeof t._activeEditRows&&-1!==t._activeEditRows&&this.cachedSortResult&&this.cachedSortResult.length===e.length)return[...this.cachedSortResult];const i=this.#de(this.sortModel),n=e;return i.length>0&&function(e,t,i){if(!t.length)return;const n=t.map(e=>{const t=i.find(t=>t.field===e.field),n=t?.sortComparator??kt,o=e.field,s=t?.valueAccessor?e=>r(e,t):e=>e[o];return{field:o,asc:"asc"===e.direction,comparator:n,getValue:s,pinPlaceholders:!t?.sortComparator}}),o=n.some(e=>e.pinPlaceholders)&&function(e){for(let t=0;t<e.length;t++)if(!0===e[t]?.__loading)return!0;return!1}(e),s=e.length,l=n.length,a=new Array(s*l);for(let r=0;r<s;r++){const t=e[r],i=r*l;for(let e=0;e<l;e++)a[i+e]=n[e].getValue(t)}const d=s<=4294967295?new Uint32Array(s):new Array(s);for(let r=0;r<s;r++)d[r]=r;const c=(t,i)=>{if(o){const r=function(e,t){const i=!0===e?.__loading;return i===(!0===t?.__loading)?0:i?1:-1}(e[t],e[i]);if(0!==r)return r}const r=t*l,s=i*l;for(let o=0;o<l;o++){const l=n[o],d=l.comparator(a[r+o],a[s+o],e[t],e[i]);if(0!==d)return l.asc?d:-d}return 0};Uint32Array,d.sort(c);const u=e.slice();for(let r=0;r<s;r++)e[r]=u[d[r]]}(n,i,this.columns),this.cachedSortResult=n,n}onHeaderClick(e){const t=this.columns.find(t=>t.field===e.field);if(!t?.sortable)return!1;const i=e.originalEvent.shiftKey,r=this.config.maxSortColumns??3;if(this.sortModel=function(e,t,i,r){const n=e.find(e=>e.field===t);return i?n?"asc"===n.direction?e.map(e=>e.field===t?{...e,direction:"desc"}:e):e.filter(e=>e.field!==t):e.length<r?[...e,{field:t,direction:"asc"}]:e:"asc"===n?.direction?[{field:t,direction:"desc"}]:"desc"===n?.direction?[]:[{field:t,direction:"asc"}]}(this.sortModel,e.field,i,r),this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),this.grid?.requestStateChange?.(),this.sortModel.length>0){const e=this.sortModel.map(e=>{const t=this.columns.find(t=>t.field===e.field);return`${t?.header??e.field} ${"asc"===e.direction?"ascending":"descending"}`});a(this.gridElement,d(this.gridElement,"sortApplied",e.join(", then "),""))}else a(this.gridElement,d(this.gridElement,"sortCleared"));return!0}afterRender(){const e=this.gridElement;if(!e)return;const t=!1!==this.config.showSortIndex;e.querySelectorAll(".header-row .cell[data-field]").forEach(e=>{const i=e.getAttribute("data-field");if(!i)return;const r=It(this.sortModel,i),n=_t(this.sortModel,i);if(e.querySelector(".sort-index")?.remove(),n){const i=this.updateSortIndicator(e,n);if(t&&this.sortModel.length>1&&void 0!==r){const t=document.createElement("span");t.className="sort-index",t.textContent=String(r),i.nextSibling?e.insertBefore(t,i.nextSibling):e.appendChild(t)}}else e.classList.contains("sortable")&&this.updateSortIndicator(e,null)})}getSortModel(){return[...this.sortModel]}setSortModel(e){if(this.sortModel=[...e],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...e]}),this.requestRender(),this.grid?.requestStateChange?.(),e.length>0){const t=e.map(e=>{const t=this.columns.find(t=>t.field===e.field);return`${t?.header??e.field} ${"asc"===e.direction?"ascending":"descending"}`});a(this.gridElement,d(this.gridElement,"sortApplied",t.join(", then "),""))}}clearSort(){this.sortModel=[],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[]}),this.requestRender(),this.grid?.requestStateChange?.(),a(this.gridElement,d(this.gridElement,"sortCleared"))}getSortIndex(e){return It(this.sortModel,e)}getSortDirection(e){return _t(this.sortModel,e)}getColumnState(e){const t=this.sortModel.findIndex(t=>t.field===e);if(-1===t)return;return{sort:{direction:this.sortModel[t].direction,priority:t}}}applyColumnState(e,t){if(this.#le||(this.#ae=[...this.sortModel]),t.sort){const i=this.sortModel.findIndex(t=>t.field===e),r={field:e,direction:t.sort.direction};-1!==i?this.sortModel[i]=r:this.sortModel.splice(t.sort.priority,0,r)}else this.sortModel=this.sortModel.filter(t=>t.field!==e);this.clearCoreSortState(),this.#le||(this.#le=!0,queueMicrotask(()=>{this.#le=!1;const e=this.#ae;this.#ae=[],function(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(e[i].field!==t[i].field||e[i].direction!==t[i].direction)return!1;return!0}(e,this.sortModel)||(this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender())}))}}function Lt(e){return e.pinned??e.meta?.pinned}function Ft(e,t){return x(e,t)}function Gt(e,t){const i=Lt(e);return!!i&&"left"===Ft(i,t)}function Dt(e,t){const i=Lt(e);return!!i&&"right"===Ft(i,t)}function Mt(e){for(let t=0;t<e.length;t++)if(null!=e[t].pinned||null!=e[t].meta?.pinned)return!0;return!1}function Nt(e,t){const i={groupEndAdjustments:{addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},leftOffsets:/* @__PURE__ */new Map,rightOffsets:/* @__PURE__ */new Map,splitGroups:[]},r=Array.from(e.querySelectorAll(".header-row .cell"));if(!r.length)return i;const n=C(e),o=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let l=0;for(const u of t)if(Gt(u,n)){const t=r.find(e=>e.getAttribute("data-field")===u.field);t&&(o.set(u.field,l),t.classList.add(w.STICKY_LEFT),t.style.position="sticky",t.style.left=l+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${u.field}"]`).forEach(e=>{e.classList.add(w.STICKY_LEFT),e.style.position="sticky",e.style.left=l+"px"}),l+=t.offsetWidth)}let a=0;for(const u of[...t].reverse())if(Dt(u,n)){const t=r.find(e=>e.getAttribute("data-field")===u.field);t&&(s.set(u.field,a),t.classList.add(w.STICKY_RIGHT),t.style.position="sticky",t.style.right=a+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${u.field}"]`).forEach(e=>{e.classList.add(w.STICKY_RIGHT),e.style.position="sticky",e.style.right=a+"px"}),a+=t.offsetWidth)}const d=[],c=function(e,t,i,r,n){const o={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},s=Array.from(e.querySelectorAll(".header-group-row .header-group-cell"));if(!s.length)return o;for(const l of s){const e=l.style.gridColumn;if(!e)continue;const s=e.match(/^(\d+)\s*\/\s*span\s+(\d+)$/);if(!s)continue;const a=parseInt(s[1],10)-1,d=a+parseInt(s[2],10)-1,c=t.slice(a,d+1);if(!c.length)continue;const u=c.every(e=>Gt(e,r)),h=c.every(e=>Dt(e,r));if(u){const e=c[0].field,t=i.find(t=>t.getAttribute("data-field")===e);t&&(l.classList.add(w.STICKY_LEFT),l.style.position="sticky",l.style.left=t.style.left)}else if(h){const e=c[c.length-1].field,t=i.find(t=>t.getAttribute("data-field")===e);t&&(l.classList.add(w.STICKY_RIGHT),l.style.position="sticky",l.style.right=t.style.right)}else if(l.classList.contains("implicit-group"))Pt(l,c,a,i,r,o);else{const e=c.some(e=>Gt(e,r)),t=c.some(e=>Dt(e,r));(e||t)&&zt(l,c,a,i,r,o,n)}}return o}(e,t,r,n,d);if(c.addGroupEnd.size>0||c.removeGroupEnd.size>0){for(const t of c.addGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.add("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(e=>{e.classList.add("group-end")})}for(const t of c.removeGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.remove("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(e=>{e.classList.remove("group-end")})}}return{groupEndAdjustments:c,leftOffsets:o,rightOffsets:s,splitGroups:d}}function qt(e,t){return Gt(e,t)?"left":Dt(e,t)?"right":"none"}function Pt(e,t,i,r,n,o){const s=[];for(let d=0;d<t.length;d++){const e=qt(t[d],n),r=s[s.length-1];r&&r.state===e?r.cols.push(t[d]):s.push({state:e,cols:[t[d]],colStart:i+d})}if(s.length<=1)return;const l=e.parentElement;if(!l)return;const a=e.nextSibling;l.removeChild(e);for(const d of s){const t=document.createElement("div");if(t.className=e.className,t.setAttribute("data-group",e.getAttribute("data-group")||""),t.style.gridColumn=`${d.colStart+1} / span ${d.cols.length}`,"left"===d.state){const e=d.cols[0].field,i=r.find(t=>t.getAttribute("data-field")===e);i&&(t.classList.add(w.STICKY_LEFT),t.style.position="sticky",t.style.left=i.style.left)}else if("right"===d.state){const e=d.cols[d.cols.length-1].field,i=r.find(t=>t.getAttribute("data-field")===e);i&&(t.classList.add(w.STICKY_RIGHT),t.style.position="sticky",t.style.right=i.style.right)}else if("none"===d.state){d.cols.every(e=>String(e.field||"").startsWith("__tbw_"))&&(t.style.borderRightStyle="none")}a?l.insertBefore(t,a):l.appendChild(t)}for(let d=0;d<s.length;d++){const e=s[d],t=s[d+1];if("none"!==e.state&&t&&"none"===t.state){const t=e.cols[e.cols.length-1].field;t&&o.addGroupEnd.add(t)}if("none"===e.state){if(e.cols.every(e=>String(e.field||"").startsWith("__tbw_"))){const t=e.cols[e.cols.length-1].field;t&&o.removeGroupEnd.add(t)}}}}function zt(e,t,i,r,n,o,s){const l=[];for(let w=0;w<t.length;w++){const e=qt(t[w],n),r=l[l.length-1];r&&r.state===e?r.cols.push(t[w]):l.push({state:e,cols:[t[w]],colStart:i+w})}if(l.length<=1)return;const a=e.parentElement;if(!a)return;const d=e.textContent||"",c=e.getAttribute("data-group")||"",u=e.nextSibling;a.removeChild(e);const h=l.findIndex(e=>"left"===e.state);let g=-1;for(let w=l.length-1;w>=0;w--)if("right"===l[w].state){g=w;break}const p=h>=0?h:g,f=h>=0&&h+1<l.length?h+1:g>=0&&g-1>=0?g-1:-1;let m,b,v,y="";for(let C=0;C<l.length;C++){const t=l[C],i=document.createElement("div");if(i.className=e.className,i.setAttribute("data-group",c),i.style.gridColumn=`${t.colStart+1} / span ${t.cols.length}`,"left"===t.state){const e=t.cols[0].field,n=r.find(t=>t.getAttribute("data-field")===e);n&&(i.classList.add(w.STICKY_LEFT),i.style.position="sticky",i.style.left=n.style.left,n.style.left),C===p&&(i.style.borderRightStyle="none",m=i,y=t.cols[t.cols.length-1].field)}else if("right"===t.state){const e=t.cols[t.cols.length-1].field,n=r.find(t=>t.getAttribute("data-field")===e);n&&(i.classList.add(w.STICKY_RIGHT),i.style.position="sticky",i.style.right=n.style.right),C===p&&(i.style.borderLeftStyle="none",m=i,y=t.cols[0].field)}if(C===f){i.style.overflow="visible";const e=document.createElement("span");e.textContent=d,e.style.position="relative",e.style.zIndex="36",e.style.display="block",e.style.overflow="hidden",e.style.textOverflow="ellipsis",e.style.whiteSpace="nowrap",i.appendChild(e),b=i,v=e}u?a.insertBefore(i,u):a.appendChild(i)}m&&b&&v&&y&&s.push({groupId:c,label:d,pinnedFragment:m,scrollableFragment:b,floatLabel:v,pinnedField:y,isTransferred:!1,floatOffset:0})}function Ot(e){e.querySelectorAll(`.${w.STICKY_LEFT}, .${w.STICKY_RIGHT}`).forEach(e=>{e.classList.remove(w.STICKY_LEFT,w.STICKY_RIGHT),e.style.position="",e.style.left="",e.style.right=""})}const Ht="canMoveColumn";class Kt extends i{static manifest={hookPriority:{processColumns:-10},ownedProperties:[{property:"pinned",level:"column",description:'the "pinned" column property',isUsed:e=>"left"===e||"right"===e||"start"===e||"end"===e}],queries:[{type:Ht,description:"Prevents pinned columns from being moved/reordered"},{type:"getStickyOffsets",description:"Returns the offsets for left/right pinned columns"},{type:"getContextMenuItems",description:"Contributes pin/unpin items to the header context menu"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=/* @__PURE__ */new Map;rightOffsets=/* @__PURE__ */new Map;#ce={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set};#ue=[];#he=[];detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1,this.#ce={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},this.#ue=[],this.#he=[]}static detect(e,t){const i=t?.columns;return!!Array.isArray(i)&&Mt(i)}processColumns(e){const t=[...e];if(this.isApplied=Mt(t),!this.isApplied)return t;const i=this.gridElement;return function(e,t="ltr"){const i=[],r=[],n=[];for(const o of e){const e=Lt(o);e?"left"===Ft(e,t)?i.push(o):n.push(o):r.push(o)}return[...i,...r,...n]}(t,i?C(i):"ltr")}afterRender(){if(!this.isApplied)return;const e=this.gridElement,t=[...this.columns];if(!Mt(t))return Ot(e),void(this.isApplied=!1);queueMicrotask(()=>{const i=Nt(e,t);this.#ce=i.groupEndAdjustments,this.leftOffsets=i.leftOffsets,this.rightOffsets=i.rightOffsets,this.#ue=i.splitGroups,this.#ge()})}afterCellRender(e){if(!this.isApplied)return;const t=e.column.field,i=e.cellElement,r=this.leftOffsets.get(t);if(void 0!==r)i.classList.contains(w.STICKY_LEFT)||i.classList.add(w.STICKY_LEFT),i.style.position="sticky",i.style.left=r+"px";else{const e=this.rightOffsets.get(t);void 0!==e&&(i.classList.contains(w.STICKY_RIGHT)||i.classList.add(w.STICKY_RIGHT),i.style.position="sticky",i.style.right=e+"px")}this.#ce.addGroupEnd.has(t)?e.cellElement.classList.add("group-end"):this.#ce.removeGroupEnd.has(t)&&e.cellElement.classList.remove("group-end")}onScroll(e){this.#ge()}#ge(){if(!this.isApplied||0===this.#ue.length)return;const e=this.gridElement;for(const t of this.#ue){const i=t.pinnedFragment.getBoundingClientRect(),r=t.scrollableFragment.getBoundingClientRect().right<=i.right;if(r&&!t.isTransferred?(t.pinnedFragment.textContent=t.label,t.pinnedFragment.style.overflow="hidden",t.pinnedFragment.style.textOverflow="ellipsis",t.pinnedFragment.style.whiteSpace="nowrap",t.pinnedFragment.style.borderRightStyle="",t.floatLabel.style.visibility="hidden",t.floatLabel.style.transform="",t.floatOffset=0,this.#ce.addGroupEnd.add(t.pinnedField),e.querySelectorAll(`.header-row .cell[data-field="${t.pinnedField}"], .data-grid-row .cell[data-field="${t.pinnedField}"]`).forEach(e=>e.classList.add("group-end")),t.isTransferred=!0):!r&&t.isTransferred&&(t.pinnedFragment.textContent="",t.pinnedFragment.style.overflow="",t.pinnedFragment.style.textOverflow="",t.pinnedFragment.style.whiteSpace="",t.pinnedFragment.style.borderRightStyle="none",t.floatLabel.style.visibility="",t.floatLabel.style.transform="",t.floatOffset=0,this.#ce.addGroupEnd.delete(t.pinnedField),e.querySelectorAll(`.header-row .cell[data-field="${t.pinnedField}"], .data-grid-row .cell[data-field="${t.pinnedField}"]`).forEach(e=>e.classList.remove("group-end")),t.isTransferred=!1),!t.isTransferred){const e=t.floatLabel.getBoundingClientRect().left-t.floatOffset,r=i.left;e<r?(t.floatOffset=r-e,t.floatLabel.style.transform=`translateX(${t.floatOffset}px)`):(t.floatOffset=0,t.floatLabel.style.transform="")}}}handleQuery(e){switch(e.type){case Ht:return null==Lt(e.context)&&void 0;case"getStickyOffsets":return{left:Object.fromEntries(this.leftOffsets),right:Object.fromEntries(this.rightOffsets)};case"getContextMenuItems":{const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockPinning||i.meta?.lockPinning)return;const r=[];return null!=Lt(i)?r.push({id:"pinned/unpin",label:"Unpin Column",icon:"📌",order:40,action:()=>this.setPinPosition(i.field,void 0)}):(r.push({id:"pinned/pin-left",label:"Pin Left",icon:"⬅",order:40,action:()=>this.setPinPosition(i.field,"left")}),r.push({id:"pinned/pin-right",label:"Pin Right",icon:"➡",order:41,action:()=>this.setPinPosition(i.field,"right")})),r}default:return}}setPinPosition(e,t){const i=this.columns;if(!i?.length)return;const r=i.findIndex(t=>t.field===e);if(-1===r)return;const n=this.gridElement;if(t){0===this.#he.length&&(this.#he=i.map(e=>e.field));const r=i.map(i=>{if(i.field!==e)return i;const r={...i};return r.pinned=t,r});n.columns=r}else{const t={...i[r]};delete t.pinned;const o=[...i];o.splice(r,1);const s=this.#he.indexOf(e);if(s>=0){let e=o.length;for(let t=0;t<o.length;t++){if(Lt(o[t]))continue;if(this.#he.indexOf(o[t].field)>s){e=t;break}}o.splice(e,0,t)}else o.splice(Math.min(r,o.length),0,t);o.some(e=>null!=Lt(e))||(this.#he=[]),n.columns=o}}refreshStickyOffsets(){const e=[...this.columns],t=Nt(this.gridElement,e);this.#ce=t.groupEndAdjustments,this.leftOffsets=t.leftOffsets,this.rightOffsets=t.rightOffsets,this.#ue=t.splitGroups}getLeftPinnedColumns(){return function(e,t="ltr"){return e.filter(e=>Gt(e,t))}([...this.columns],C(this.gridElement))}getRightPinnedColumns(){return function(e,t="ltr"){return e.filter(e=>Dt(e,t))}([...this.columns],C(this.gridElement))}clearStickyPositions(){Ot(this.gridElement)}getHorizontalScrollOffsets(e,t){if(!this.isApplied)return;let i=0,r=0;if(e){const t=e.querySelectorAll(`.${w.STICKY_LEFT}`),n=e.querySelectorAll(`.${w.STICKY_RIGHT}`);t.forEach(e=>{i+=e.offsetWidth}),n.forEach(e=>{r+=e.offsetWidth})}else{this.gridElement.querySelectorAll(".header-row .cell").forEach(e=>{e.classList.contains(w.STICKY_LEFT)?i+=e.offsetWidth:e.classList.contains(w.STICKY_RIGHT)&&(r+=e.offsetWidth)})}const n=t?.classList.contains(w.STICKY_LEFT)||t?.classList.contains(w.STICKY_RIGHT);return{left:i,right:r,skipScroll:n}}}function Bt(e,t){const i=document.createElement("div");i.className="tbw-pinned-rows",i.setAttribute("role","presentation"),i.setAttribute("aria-live","polite");const r=document.createElement("div");r.className="tbw-pinned-rows-left";const n=document.createElement("div");n.className="tbw-pinned-rows-center";const o=document.createElement("div");if(o.className="tbw-pinned-rows-right",!1!==e.showRowCount){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-row-count",e.textContent=`Total: ${t.totalRows} rows`,r.appendChild(e)}if(e.showFilteredCount&&t.filteredRows!==t.totalRows){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-filtered-count",e.textContent=`Filtered: ${t.filteredRows}`,r.appendChild(e)}if(e.showSelectedCount&&t.selectedRows>0){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-selected-count",e.textContent=`Selected: ${t.selectedRows}`,o.appendChild(e)}if(e.customPanels)for(const s of e.customPanels){const e=Yt(s,t);switch(s.position){case"left":r.appendChild(e);break;case"center":n.appendChild(e);break;case"right":o.appendChild(e)}}return i.appendChild(r),i.appendChild(n),i.appendChild(o),i}function $t(e){const t=document.createElement("div");return t.className=`tbw-aggregation-rows tbw-aggregation-rows-${e}`,t.setAttribute("role","presentation"),t}function Wt(e,t,i,r,n=!1){e.innerHTML="";for(const o of t){const t=document.createElement("div");t.className="tbw-aggregation-row",t.setAttribute("role","presentation"),o.id&&t.setAttribute("data-aggregation-id",o.id);o.fullWidth??n?Vt(t,o,i,r):jt(t,o,i,r),e.appendChild(t)}}function Vt(e,t,i,r){const n=document.createElement("div");n.className="tbw-aggregation-cell tbw-aggregation-cell-full",n.style.gridColumn="1 / -1";const o="function"==typeof t.label?t.label(r,i):t.label;if(o){const e=document.createElement("span");e.className="tbw-aggregation-label",e.textContent=o,n.appendChild(e)}const s=function(e,t,i){const r=e.aggregators&&Object.keys(e.aggregators).length>0,n=e.cells&&Object.keys(e.cells).length>0;if(!r&&!n)return null;const o=document.createElement("span");o.className="tbw-aggregation-aggregates";for(const s of t){const{value:t,formatter:r}=Ut(e,s,i);if(null!=t){const e=document.createElement("span");e.className="tbw-aggregation-aggregate",e.setAttribute("data-field",s.field);const i=s.header??s.field,n=r?r(t,s.field,s):String(t);e.textContent=`${i}: ${n}`,o.appendChild(e)}}return o.children.length>0?o:null}(t,i,r);s&&n.appendChild(s),e.appendChild(n)}function jt(e,t,i,r){for(const o of i){const i=document.createElement("div");i.className="tbw-aggregation-cell",i.setAttribute("data-field",o.field);const{value:n,formatter:s}=Ut(t,o,r);i.textContent=null!=n?s?s(n,o.field,o):String(n):"",e.appendChild(i)}const n="function"==typeof t.label?t.label(r,i):t.label;if(n){const t=document.createElement("span");t.className="tbw-aggregation-label",t.textContent=n,e.appendChild(t)}}function Ut(e,t,i){let r,n;const o=e.aggregators?.[t.field];if(o)if("object"==typeof(s=o)&&null!==s&&"aggFunc"in s){const e=v.get(o.aggFunc);e&&(r=e(i,t.field,t)),n=o.formatter}else{const e=v.get(o);e&&(r=e(i,t.field,t))}else if(e.cells&&Object.prototype.hasOwnProperty.call(e.cells,t.field)){const n=e.cells[t.field];r="function"==typeof n?n(i,t.field,t):n}var s;return{value:r,formatter:n}}function Yt(e,t){const i=document.createElement("div");i.className="tbw-status-panel tbw-status-panel-custom",i.id=`status-panel-${e.id}`;const r=e.render(t);return"string"==typeof r?i.innerHTML=n(r):i.appendChild(r),i}function Zt(e,t,i,r,n){const o=i?.sourceRows,s=i?.rows,l=Array.isArray(o)?o.length:e.length,a=Array.isArray(s)?s.length:e.length,d=l>0?l:a;return{totalRows:d,filteredRows:n?.cachedResult?.length??(a<l?a:d),selectedRows:r?.selected?.size??0,columns:t,rows:e,grid:i}}function Qt(){return e=>{const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-row-count",t.textContent=`Total: ${e.totalRows} rows`,t}}function Xt(){return e=>{if(e.selectedRows<=0)return null;const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-selected-count",t.textContent=`Selected: ${e.selectedRows}`,t}}function Jt(){return e=>{if(e.filteredRows===e.totalRows)return null;const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-filtered-count",t.textContent=`Filtered: ${e.filteredRows}`,t}}function ei(e){const t=document.createElement("div");return t.className="tbw-status-panel tbw-status-panel-custom",t.appendChild(e),t}function ti(e,t){const i=document.createElement("div");i.className="tbw-pinned-rows",i.setAttribute("role","presentation"),i.setAttribute("aria-live","polite"),e.id&&i.setAttribute("data-pinned-row-id",e.id);const r=document.createElement("div");r.className="tbw-pinned-rows-left";const n=document.createElement("div");n.className="tbw-pinned-rows-center";const o=document.createElement("div");o.className="tbw-pinned-rows-right";const s={left:r,center:n,right:o},l=Array.isArray(e.render)?e.render:[{zone:"left",render:e.render}];for(const a of l){const e=a.zone??"left",i=a.render(t);if(null==i)continue;const r=i.classList?.contains("tbw-status-panel");s[e].appendChild(r?i:ei(i))}return 0===r.children.length&&0===n.children.length&&0===o.children.length?null:(i.appendChild(r),i.appendChild(n),i.appendChild(o),i)}function ii(e,t,i,r,n=!1){const o=$t(t);return Wt(o,[e],i,r,n),o}class ri extends i{name="pinnedRows";styles="@layer tbw-plugins{.tbw-scroll-area{container-type:inline-size}.tbw-footer,.tbw-header-pinned{flex-shrink:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-color-panel-bg);min-width:fit-content}.tbw-pinned-rows{display:flex;align-items:center;justify-content:space-between;padding:var(--tbw-button-padding, var(--tbw-spacing-md, .5rem) var(--tbw-spacing-lg, .75rem));background:var(--tbw-pinned-rows-bg, var(--tbw-color-panel-bg));border-top:1px solid var(--tbw-pinned-rows-border, var(--tbw-color-border));font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-pinned-rows-color, var(--tbw-color-fg-muted));min-height:32px;box-sizing:border-box;position:sticky;left:0;min-width:0;width:100cqi}.tbw-pinned-rows+.tbw-pinned-rows{border-top:0}.tbw-pinned-rows-left,.tbw-pinned-rows-center,.tbw-pinned-rows-right{display:flex;align-items:center;gap:var(--tbw-spacing-xl, 1rem)}.tbw-pinned-rows-left{justify-content:flex-start}.tbw-pinned-rows-center{justify-content:center;flex:1}.tbw-pinned-rows-right{justify-content:flex-end}.tbw-status-panel{white-space:nowrap}.tbw-aggregation-rows{min-width:fit-content;background:var(--tbw-aggregation-bg, var(--tbw-color-header-bg))}.tbw-aggregation-rows-top{border-bottom:1px solid var(--tbw-aggregation-border, var(--tbw-color-border))}.tbw-aggregation-rows-bottom{border-top:1px solid var(--tbw-aggregation-border, var(--tbw-color-border))}.tbw-aggregation-row{display:grid;grid-template-columns:var(--tbw-column-template);font-size:var(--tbw-aggregation-font-size, .8em);font-weight:var(--tbw-aggregation-font-weight, 600);position:relative;background:inherit}.tbw-aggregation-row>.tbw-aggregation-label{position:sticky;left:0;grid-row:1;grid-column:1;display:flex;align-items:center;padding:var(--tbw-cell-padding, .125rem .5rem);background:inherit;z-index:1;pointer-events:none}.tbw-aggregation-row>.tbw-aggregation-cell:first-child{grid-column:1;grid-row:1}.tbw-aggregation-cell:not(:empty){position:relative;z-index:2;background:inherit}.tbw-aggregation-cell{padding:var(--tbw-cell-padding, .125rem .5rem);min-height:var(--tbw-row-height, 1.75rem);display:block;align-items:center;align-content:center;border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;text-overflow:ellipsis;white-space:var(--tbw-cell-white-space, nowrap)}.tbw-aggregation-cell:last-child{border-right:0}.tbw-aggregation-cell-full{grid-column:1 / -1;border-right:0;display:flex;align-items:center;gap:var(--tbw-spacing-lg, .75rem)}.tbw-aggregation-label{white-space:nowrap}.tbw-aggregation-aggregates{display:flex;align-items:center;gap:var(--tbw-spacing-lg, .75rem);font-weight:400;opacity:.85}.tbw-aggregation-aggregate{white-space:nowrap}}";get defaultConfig(){return{position:"bottom",showRowCount:!0,showSelectedCount:!0,showFilteredCount:!0}}infoBarElement=null;topAggregationContainer=null;bottomAggregationContainer=null;footerWrapper=null;headerWrapper=null;lastModeWasSlots=!1;detach(){this.cleanup()}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.querySelector(".tbw-grid-root");if(!t)return;this.footerWrapper&&!t.contains(this.footerWrapper)&&(this.footerWrapper=null,this.bottomAggregationContainer=null,this.infoBarElement=null),this.topAggregationContainer&&!t.contains(this.topAggregationContainer)&&(this.topAggregationContainer=null),this.infoBarElement&&!t.contains(this.infoBarElement)&&(this.infoBarElement=null),this.headerWrapper&&!t.contains(this.headerWrapper)&&(this.headerWrapper=null);const i=this.getSelectionState(),r=this.getFilterState(),n=Zt(this.sourceRows,this.columns,this.gridElement,i,r);this.config.slots?this.renderSlotMode(t,e,n):this.renderLegacyMode(t,e,n)}renderSlotMode(e,t,i){this.lastModeWasSlots||this.detachLegacyOnly(),this.lastModeWasSlots=!0;const r=this.config.slots??[],n=r.filter(e=>"top"===e.position),o=r.filter(e=>"top"!==e.position);n.length>0?(this.headerWrapper||(this.headerWrapper=document.createElement("div"),this.headerWrapper.className="tbw-header-pinned",e.insertBefore(this.headerWrapper,e.firstChild)),this.populateSlotWrapper(this.headerWrapper,n,"top",i)):this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null),o.length>0?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",e.appendChild(this.footerWrapper)),this.populateSlotWrapper(this.footerWrapper,o,"bottom",i)):this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null)}populateSlotWrapper(e,t,i,r){e.innerHTML="";for(const n of t){const t="render"in n&&null!=n.render?ti(n,r):ii(n,i,this.visibleColumns,this.sourceRows,this.config.fullWidth);t&&e.appendChild(t)}}renderLegacyMode(e,t,i){this.lastModeWasSlots&&(this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer=null,this.infoBarElement=null),this.lastModeWasSlots=!1;const r=this.config.aggregationRows||[],n=r.filter(e=>"top"===e.position),o=r.filter(e=>"top"!==e.position);n.length>0?(this.topAggregationContainer||(this.topAggregationContainer=$t("top"),e.insertBefore(this.topAggregationContainer,e.firstChild)),Wt(this.topAggregationContainer,n,this.visibleColumns,this.sourceRows,this.config.fullWidth)):this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null);const s=!1!==this.config.showRowCount||this.config.showSelectedCount&&i.selectedRows>0||this.config.showFilteredCount&&i.filteredRows!==i.totalRows||this.config.customPanels&&this.config.customPanels.length>0,l=s&&"top"!==this.config.position,a=o.length>0||l;if(s&&"top"===this.config.position)if(this.infoBarElement){const e=Bt(this.config,i);this.infoBarElement.replaceWith(e),this.infoBarElement=e}else this.infoBarElement=Bt(this.config,i),e.insertBefore(this.infoBarElement,e.firstChild);else"top"===this.config.position&&this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null);a?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",e.appendChild(this.footerWrapper)),this.footerWrapper.innerHTML="",o.length>0&&(this.bottomAggregationContainer||(this.bottomAggregationContainer=$t("bottom")),this.footerWrapper.appendChild(this.bottomAggregationContainer),Wt(this.bottomAggregationContainer,o,this.visibleColumns,this.sourceRows,this.config.fullWidth)),l&&(this.infoBarElement=Bt(this.config,i),this.footerWrapper.appendChild(this.infoBarElement))):this.cleanupFooter()}cleanup(){this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null),this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null)}detachLegacyOnly(){this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null)}cleanupFooter(){this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.infoBarElement&&"top"!==this.config.position&&(this.infoBarElement.remove(),this.infoBarElement=null)}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}getFilterState(){try{return this.grid?.getPluginState?.("filtering")??null}catch{return null}}refresh(){this.requestRender()}getContext(){const e=this.getSelectionState(),t=this.getFilterState();return Zt(this.rows,this.columns,this.gridElement,e,t)}addPanel(e){this.config.customPanels||(this.config.customPanels=[]),this.config.customPanels.push(e),this.requestRender()}removePanel(e){this.config.customPanels&&(this.config.customPanels=this.config.customPanels.filter(t=>t.id!==e),this.requestRender())}addAggregationRow(e){this.config.aggregationRows||(this.config.aggregationRows=[]),this.config.aggregationRows.push(e),this.requestRender()}removeAggregationRow(e){this.config.aggregationRows&&(this.config.aggregationRows=this.config.aggregationRows.filter(t=>t.id!==e),this.requestRender())}}function ni(e){return"function"==typeof e?e:E(e)}function oi(e,t){return[...e,t].join("|")}function si(e,t){const i=t.rowGroupFields??[],r=t.columnGroupFields??[],n=t.valueFields??[],o=function(e,t,i="asc"){if(0===t.length)return["value"];const r=/* @__PURE__ */new Set;for(const o of e){const e=t.map(e=>String(o[e]??"")).join("|");r.add(e)}const n=[...r].sort();return"desc"===i?n.reverse():n}(e,r,t.sortColumns),s=li(e,i,r,o,n,0,"");t.sortRows&&ui(s,t.sortRows,n);const l=function(e,t,i){const r={};function n(e){for(const o of e)if(o.isGroup&&o.children?.length)o.children&&n(o.children);else for(const e of t)for(const t of i){const i=oi([e],t.field);r[i]=(r[i]??0)+(o.values[i]??0)}}return n(e),r}(s,o,n);return{rows:s,columnKeys:o,totals:l,grandTotal:Object.values(l).reduce((e,t)=>e+t,0)}}function li(e,t,i,r,n,o,s){const l=[];if(0===t.length){const t=ai(e,i,r,n),a=di(t);return l.push({rowKey:s||"all",rowLabel:s||"All",depth:o,values:t,total:a,isGroup:!1,rowCount:e.length}),l}const a=t[0],d=t.slice(1),c=d.length>0,u=function(e,t){const i=/* @__PURE__ */new Map;for(const r of e){const e=String(r[t]??""),n=i.get(e);n?n.push(r):i.set(e,[r])}return i}(e,a);for(const[h,g]of u){const e=s?`${s}|${h}`:h,t=ai(g,i,r,n),a=di(t);let u;c&&(u=li(g,d,i,r,n,o+1,e)),l.push({rowKey:e,rowLabel:h||"(blank)",depth:o,values:t,total:a,isGroup:c,children:u,rowCount:g.length})}return l}function ai(e,t,i,r){const n={};if(0===t.length){for(const t of r){const i=[];for(let n=0;n<e.length;n++){const r=e[n][t.field];if(null==r||""===r)continue;const o=Number(r);isNaN(o)||i.push(o)}const r=ni(t.aggFunc);n[oi(["value"],t.field)]=i.length>0?r(i):null}return n}const o=/* @__PURE__ */new Map;for(let s=0;s<e.length;s++){const i=e[s];let r=String(i[t[0]]??"");for(let e=1;e<t.length;e++)r+="|",r+=String(i[t[e]]??"");const n=o.get(r);n?n.push(i):o.set(r,[i])}for(const s of i){const e=o.get(s);if(e&&0!==e.length)for(const t of r){const i=[];for(let n=0;n<e.length;n++){const r=e[n][t.field];if(null==r||""===r)continue;const o=Number(r);isNaN(o)||i.push(o)}const r=ni(t.aggFunc);n[oi([s],t.field)]=i.length>0?r(i):null}else for(const t of r)n[oi([s],t.field)]=null}return n}function di(e){let t=0;for(const i of Object.values(e))t+=i??0;return t}function ci(e){const t=[];function i(e){if(e.isGroup&&t.push(e.rowKey),e.children)for(const t of e.children)i(t)}for(const r of e)i(r);return t}function ui(e,t,i){const r="desc"===t.direction?-1:1;e.sort((e,n)=>{if("value"===t.by){if(t.valueField??i[0]?.field){return((e.total??0)-(n.total??0))*r}}return e.rowLabel.localeCompare(n.rowLabel)*r});for(const n of e)n.children?.length&&ui(n.children,t,i)}function hi(e,t,i){if(0===t.length)return;const r=new Set(i.map(e=>e.field)),n=t.map(e=>"value"===e.by?e.valueField?t=>((e,t)=>{if(null!=e.values[t])return"number"==typeof e.values[t]?e.values[t]:0;if(r.has(t)){const i=`|${t}`;let r=0,n=!1;for(const t of Object.keys(e.values))t.endsWith(i)&&(r+="number"==typeof e.values[t]?e.values[t]:0,n=!0);if(n)return r}return e.total??0})(t,e.valueField):e=>e.total??0:null);e.sort((e,i)=>{for(let r=0;r<t.length;r++){const o=t[r],s="desc"===o.direction?-1:1;let l=0;if("value"===o.by){const t=n[r];l=(t(e)-t(i))*s}else l=e.rowLabel.localeCompare(i.rowLabel)*s;if(0!==l)return l}return 0});for(const o of e)o.children?.length&&hi(o.children,t,i)}const gi=["sum","avg","count","min","max","first","last"];function pi(e,t,i,r){const n=new AbortController,o={config:t,callbacks:r,signal:n.signal},s=document.createElement("div");return s.className="tbw-pivot-panel",s.appendChild(fi("Options",()=>function(e,t){const{config:i,callbacks:r,signal:n}=t,o=document.createElement("div");return o.className="tbw-pivot-options",o.appendChild(vi("Enable Pivot View",e,e=>{r.onTogglePivot(e)},n)),o.appendChild(vi("Show Row Totals",i.showTotals??!0,e=>{r.onOptionChange("showTotals",e)},n)),o.appendChild(vi("Show Grand Total",i.showGrandTotal??!0,e=>{r.onOptionChange("showGrandTotal",e)},n)),o}(i,o))),s.appendChild(fi("Row Groups",()=>mi("rowGroups",o))),s.appendChild(fi("Column Groups",()=>mi("columnGroups",o))),s.appendChild(fi("Values",()=>function(e){const{config:t,callbacks:i,signal:r}=e,n=document.createElement("div");n.className="tbw-pivot-drop-zone tbw-pivot-values-zone",n.setAttribute("data-zone","values");const o=t.valueFields??[];if(0===o.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="Drag numeric fields here",n.appendChild(e)}else for(const s of o)n.appendChild(bi(s,e));return n.addEventListener("dragover",e=>{e.preventDefault(),n.classList.add("drag-over")},{signal:r}),n.addEventListener("dragleave",()=>{n.classList.remove("drag-over")},{signal:r}),n.addEventListener("drop",e=>{e.preventDefault(),n.classList.remove("drag-over");const t=e.dataTransfer?.getData("text/plain");t&&i.onAddValueField(t,"sum")},{signal:r}),n}(o))),s.appendChild(fi("Available Fields",()=>function(e){const{config:t,callbacks:i,signal:r}=e,n=document.createElement("div");n.className="tbw-pivot-available-fields";const o=i.getAvailableFields(),s=/* @__PURE__ */new Set([...t.rowGroupFields??[],...t.columnGroupFields??[],...t.valueFields?.map(e=>e.field)??[]]),l=o.filter(e=>!s.has(e.field));if(0===l.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="All fields are in use",n.appendChild(e)}else{const e=document.createElement("div");if(e.className="tbw-pivot-fields-list",l.length>=6){const t=document.createElement("input");t.type="text",t.placeholder="Filter fields…",t.className="tbw-pivot-field-search",t.addEventListener("input",()=>{const i=t.value.toLowerCase();for(const t of e.querySelectorAll(".tbw-pivot-field-chip")){const e=t;e.style.display=e.textContent?.toLowerCase().includes(i)?"":"none"}},{signal:r}),n.appendChild(t)}for(const t of l){const i=document.createElement("div");i.className="tbw-pivot-field-chip available",i.textContent=t.header,i.draggable=!0,i.title=`Drag to add "${t.field}" to a zone`,i.addEventListener("dragstart",e=>{e.dataTransfer?.setData("text/plain",t.field),i.classList.add(w.DRAGGING)},{signal:r}),i.addEventListener("dragend",()=>{i.classList.remove(w.DRAGGING)},{signal:r}),e.appendChild(i)}n.appendChild(e)}return n}(o))),e.appendChild(s),()=>{n.abort(),s.remove()}}function fi(e,t){const i=document.createElement("div");i.className="tbw-pivot-section";const r=document.createElement("div");r.className="tbw-pivot-section-header",r.textContent=e;const n=document.createElement("div");return n.className="tbw-pivot-section-content",n.appendChild(t()),i.appendChild(r),i.appendChild(n),i}function mi(e,t){const{config:i,callbacks:r,signal:n}=t,o=document.createElement("div");o.className="tbw-pivot-drop-zone",o.setAttribute("data-zone",e);const s="rowGroups"===e?i.rowGroupFields??[]:i.columnGroupFields??[];if(0===s.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="Drag fields here",o.appendChild(e)}else for(const l of s)o.appendChild(wi(l,e,t));return o.addEventListener("dragover",e=>{e.preventDefault(),o.classList.add("drag-over")},{signal:n}),o.addEventListener("dragleave",()=>{o.classList.remove("drag-over")},{signal:n}),o.addEventListener("drop",t=>{t.preventDefault(),o.classList.remove("drag-over");const i=t.dataTransfer?.getData("text/plain"),n=t.dataTransfer?.getData("source-zone");if(!i)return;const s=o.querySelectorAll(".tbw-pivot-field-chip");let l=s.length;for(let e=0;e<s.length;e++){const i=s[e].getBoundingClientRect();if(t.clientY<i.top+i.height/2){l=e;break}}!n||n===e||"rowGroups"!==n&&"columnGroups"!==n?n===e?r.onReorderFieldInZone(i,e,l):r.onAddFieldToZone(i,e):r.onMoveFieldBetweenZones(i,n,e)},{signal:n}),o}function wi(e,t,i){const{callbacks:r,signal:n}=i,o=document.createElement("div");o.className="tbw-pivot-field-chip",o.draggable=!0;const s=r.getAvailableFields().find(t=>t.field===e),l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=s?.header??e;const a=document.createElement("button");return a.type="button",a.className="tbw-pivot-chip-remove",a.innerHTML="×",a.title="Remove field",a.addEventListener("click",i=>{i.stopPropagation(),r.onRemoveFieldFromZone(e,t)},{signal:n}),o.appendChild(l),o.appendChild(a),o.addEventListener("dragstart",i=>{i.dataTransfer?.setData("text/plain",e),i.dataTransfer?.setData("source-zone",t),o.classList.add(w.DRAGGING)},{signal:n}),o.addEventListener("dragend",()=>{o.classList.remove(w.DRAGGING)},{signal:n}),o}function bi(e,t){const{callbacks:i,signal:r}=t,n=document.createElement("div");n.className="tbw-pivot-field-chip tbw-pivot-value-chip";const o=i.getAvailableFields().find(t=>t.field===e.field),s=document.createElement("div");s.className="tbw-pivot-value-label-wrapper";const l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=o?.header??e.field;const a="function"==typeof e.aggFunc,d=document.createElement("select");if(d.className="tbw-pivot-agg-select",d.title="Aggregation function",a){const e=document.createElement("option");e.value="__custom__",e.textContent="CUSTOM",e.selected=!0,d.appendChild(e),d.disabled=!0}for(const u of gi){const t=document.createElement("option");t.value=u,t.textContent=u.toUpperCase(),a||(t.selected=u===e.aggFunc),d.appendChild(t)}d.addEventListener("change",()=>{i.onUpdateValueAggFunc(e.field,d.value)},{signal:r});const c=document.createElement("button");return c.type="button",c.className="tbw-pivot-chip-remove",c.innerHTML="×",c.title="Remove value field",c.addEventListener("click",t=>{t.stopPropagation(),i.onRemoveValueField(e.field)},{signal:r}),s.appendChild(l),s.appendChild(d),n.appendChild(s),n.appendChild(c),n}function vi(e,t,i,r){const n=document.createElement("label");n.className="tbw-pivot-checkbox";const o=document.createElement("input");o.type="checkbox",o.checked=t,o.addEventListener("change",()=>i(o.checked),{signal:r});const s=document.createElement("span");return s.textContent=e,n.appendChild(o),n.appendChild(s),n}function yi(e,t,i){return t.className="data-grid-row pivot-grand-total-row",t.innerHTML="",i.forEach((i,r)=>{const n=document.createElement("div");if(n.className="cell",n.setAttribute("data-col",String(r)),0===r){const e=document.createElement("span");e.className="pivot-label",e.textContent="Grand Total",n.appendChild(e)}else{const t=e[i.field];n.textContent=null!=t?i.format?i.format(t,e):String(t):""}t.appendChild(n)}),!0}class Ci extends i{static manifest={modifiesRowStructure:!0,hookPriority:{onHeaderClick:-10,processRows:100},incompatibleWith:[{name:"groupingRows",reason:"PivotPlugin creates its own aggregated row and column structure. Row grouping cannot be applied on top of pivot-generated rows."},{name:"tree",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."},{name:"serverSide",reason:"PivotPlugin requires the full dataset to compute aggregations. ServerSidePlugin lazy-loads rows in blocks, so pivot aggregation cannot be performed client-side."}],queries:[{type:"sort:get-sort-config",description:"Returns the current pivot sort configuration"}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for pivot column sorting"}];name="pivot";styles='@layer tbw-plugins{.pivot-group-row{display:grid;grid-template-columns:var(--tbw-column-template);font-weight:600;background:var(--tbw-pivot-group-bg, var(--tbw-color-row-alt));min-height:var(--tbw-row-height);border-bottom:var(--tbw-row-divider)}@media(hover:hover){.pivot-group-row:hover{background:var(--tbw-pivot-group-hover, var(--tbw-color-row-hover))}}.pivot-leaf-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-pivot-leaf-bg, var(--tbw-color-bg));min-height:var(--tbw-row-height);border-bottom:var(--tbw-row-divider)}.pivot-grand-total-row{display:grid;grid-template-columns:var(--tbw-column-template);font-weight:700;background:var(--tbw-pivot-grand-total-bg, var(--tbw-color-header-bg));min-height:var(--tbw-row-height);border-top:2px solid var(--tbw-color-border-strong)}.pivot-grand-total-row>.cell{display:flex;align-items:center;padding:var(--tbw-cell-padding);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0}.pivot-grand-total-row>.cell:last-child{border-right:0}.pivot-grand-total-footer{position:sticky;bottom:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-pivot-grand-total-bg, var(--tbw-color-header-bg));min-width:fit-content}.pivot-group-row>.cell,.pivot-leaf-row>.cell{display:flex;align-items:center;padding:var(--tbw-cell-padding);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0}.pivot-group-row>.cell:last-child,.pivot-leaf-row>.cell:last-child{border-right:0}.pivot-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-pivot-toggle-size, var(--tbw-toggle-size, 1.25em));height:var(--tbw-pivot-toggle-size, var(--tbw-toggle-size, 1.25em));margin-right:var(--tbw-spacing-sm, .375em);border:none;background:transparent;cursor:pointer;color:var(--tbw-pivot-toggle-color, var(--tbw-color-fg-muted));border-radius:var(--tbw-border-radius);transition:background var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease),color var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease)}.pivot-toggle:hover{background:var(--tbw-pivot-toggle-hover-bg, var(--tbw-color-row-hover));color:var(--tbw-pivot-toggle-hover-color, var(--tbw-color-fg))}.pivot-toggle:focus{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}.pivot-label{font-weight:inherit}.pivot-count{color:var(--tbw-pivot-count-color, var(--tbw-color-fg-muted));font-size:.9em;font-weight:400}.pivot-total-row{font-weight:700;border-top:2px solid var(--tbw-pivot-border, var(--tbw-color-border-strong))}[data-pivot-depth="1"]{--tbw-pivot-depth: 1}[data-pivot-depth="2"]{--tbw-pivot-depth: 2}[data-pivot-depth="3"]{--tbw-pivot-depth: 3}[data-pivot-depth="4"]{--tbw-pivot-depth: 4}.tbw-pivot-panel{display:flex;flex-direction:column;gap:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));height:100%;overflow-y:auto;font-size:var(--tbw-font-size-sm, .8125rem)}.tbw-pivot-section{border:1px solid var(--tbw-pivot-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);background:var(--tbw-pivot-section-bg, var(--tbw-color-bg))}.tbw-pivot-section-header{padding:var(--tbw-button-padding, var(--tbw-spacing-md, .5rem) var(--tbw-spacing-lg, .75rem));font-weight:600;background:var(--tbw-pivot-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-pivot-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius) var(--tbw-border-radius) 0 0}.tbw-pivot-section-content{padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-pivot-toggle-wrapper{display:flex;align-items:center}.tbw-pivot-toggle-label{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));cursor:pointer}.tbw-pivot-toggle-label input{width:var(--tbw-icon-size, 1rem);height:var(--tbw-icon-size, 1rem);cursor:pointer}.tbw-pivot-drop-zone{min-height:60px;padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border:2px dashed var(--tbw-pivot-drop-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);background:var(--tbw-pivot-drop-bg, var(--tbw-color-row-alt));display:flex;flex-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem);align-content:flex-start;transition:all .15s ease}.tbw-pivot-drop-zone.drag-over{border-color:var(--tbw-color-accent);background:var(--tbw-pivot-drop-active, var(--tbw-focus-background))}.tbw-pivot-placeholder{color:var(--tbw-color-fg-muted);font-style:italic;padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));text-align:center;width:100%}.tbw-pivot-field-chip{display:inline-flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-button-padding-sm, var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-pivot-chip-bg, var(--tbw-color-header-bg));border:1px solid var(--tbw-pivot-chip-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);cursor:grab;font-size:var(--tbw-font-size-xs, .75rem);transition:all .15s ease}.tbw-pivot-field-chip:hover{background:var(--tbw-pivot-chip-hover, var(--tbw-color-row-hover));border-color:var(--tbw-color-accent)}.tbw-pivot-field-chip.available{background:var(--tbw-color-bg)}.tbw-pivot-field-chip.dragging{opacity:.5;cursor:grabbing}.tbw-pivot-chip-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.tbw-pivot-chip-remove{display:flex;align-items:center;justify-content:center;width:var(--tbw-icon-size, 1rem);height:var(--tbw-icon-size, 1rem);padding:0;border:none;background:transparent;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-sm, .875rem);font-weight:700;cursor:pointer;border-radius:50%;transition:all .15s ease}.tbw-pivot-chip-remove:hover{background:var(--tbw-pivot-chip-remove-hover-bg, var(--tbw-color-accent));color:var(--tbw-pivot-chip-remove-hover-fg, var(--tbw-color-accent-fg))}.tbw-pivot-value-chip{padding:var(--tbw-button-padding-sm, var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-md, .5rem))}.tbw-pivot-value-label-wrapper{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));flex:1;min-width:0}.tbw-pivot-agg-select{padding:var(--tbw-spacing-xs, .125rem) var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-xs, .6875rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);cursor:pointer}.tbw-pivot-available-fields{display:flex;flex-direction:column;gap:var(--tbw-spacing-sm, .375rem);min-height:40px}.tbw-pivot-field-search{width:100%;padding:.25rem .5rem;border:1px solid var(--tbw-color-border, #d0d5dd);border-radius:var(--tbw-radius-sm, .25rem);font-size:var(--tbw-font-size-sm, .875rem);background:var(--tbw-color-bg, #fff);color:var(--tbw-color-fg, #1a1a2e);outline:none}.tbw-pivot-field-search:focus{border-color:var(--tbw-color-primary, #3b82f6)}.tbw-pivot-fields-list{display:flex;flex-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem)}.tbw-pivot-options{display:flex;flex-direction:column;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-pivot-checkbox{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));cursor:pointer}.tbw-pivot-checkbox input{width:var(--tbw-icon-size-sm, .875rem);height:var(--tbw-icon-size-sm, .875rem);cursor:pointer}.pivot-group-row.tbw-pivot-slide-in,.pivot-leaf-row.tbw-pivot-slide-in{animation:tbw-pivot-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-pivot-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.pivot-group-row.tbw-pivot-fade-in,.pivot-leaf-row.tbw-pivot-fade-in{animation:tbw-pivot-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-pivot-fade-in{0%{opacity:0}to{opacity:1}}}';static PANEL_ID="pivot";get defaultConfig(){return{active:!0,showTotals:!0,showGrandTotal:!0,showToolPanel:!0,animation:"slide"}}isActive=!1;hasInitialized=!1;pivotResult=null;fieldHeaderMap=/* @__PURE__ */new Map;expandedKeys=/* @__PURE__ */new Set;defaultExpanded=!0;userHasToggledExpand=!1;originalColumns=[];panelContainer=null;grandTotalFooter=null;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;valueFormatters=/* @__PURE__ */new Map;columnTotals={};activeSortField=null;activeSortDir=null;hasValidPivotConfig(){return(this.config.valueFields?.length??0)>0}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detach(){this.isActive=!1,this.hasInitialized=!1,this.pivotResult=null,this.fieldHeaderMap.clear(),this.originalColumns=[],this.panelContainer=null,this.cleanupGrandTotalFooter(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.userHasToggledExpand=!1,this.valueFormatters.clear(),this.columnTotals={},this.activeSortField=null,this.activeSortDir=null,this.config.sortRows=void 0}getToolPanel(){if(!1!==(this.config?.showToolPanel??this.userConfig?.showToolPanel??!0))return{id:Ci.PANEL_ID,title:"Pivot",icon:"⊞",tooltip:"Configure pivot table",order:90,render:e=>this.renderPanel(e)}}processRows(e){if(!this.hasInitialized&&!1!==this.config.active&&this.hasValidPivotConfig()&&(this.hasInitialized=!0,this.isActive=!0),!this.isActive)return[...e];const t=function(e){const t=[];return e.rowGroupFields?.length||e.columnGroupFields?.length||t.push("At least one row or column group field is required"),e.valueFields?.length||t.push("At least one value field is required"),t}(this.config);if(t.length>0)return this.warn(`Config errors: ${t.join(", ")}`),[...e];this.buildFieldHeaderMap(),this.buildValueFormatters(),this.defaultExpanded=this.config.defaultExpanded??!0,this.pivotResult=si(e,this.config);const i=this.getMultiSortConfigs();if(i&&hi(this.pivotResult.rows,i,this.config.valueFields??[]),0===this.expandedKeys.size&&!this.userHasToggledExpand){const e=ci(this.pivotResult.rows);this.expandedKeys=function(e,t){if(!0===e||void 0===e)return new Set(t);if(!1===e)/* @__PURE__ */return new Set;if("number"==typeof e){const i=t[e];return i?/* @__PURE__ */new Set([i]):/* @__PURE__ */new Set}return"string"==typeof e?/* @__PURE__ */new Set([e]):Array.isArray(e)?new Set(e):/* @__PURE__ */new Set}(this.defaultExpanded,e)}this.config.valueDisplayMode&&"raw"!==this.config.valueDisplayMode&&(this.columnTotals=function(e,t,i){const r={};return function e(n){for(const o of n)if(o.isGroup&&o.children?.length)o.children&&e(o.children);else for(const e of t)for(const t of i){const i=oi([e],t.field);r[i]=(r[i]??0)+(o.values[i]??0)}}(e),r}(this.pivotResult.rows,this.pivotResult.columnKeys,this.config.valueFields??[]));const r=this.config.indentWidth??20,n=!0===this.defaultExpanded||void 0===this.defaultExpanded,o=function(e,t,i=!0){const r=[];function n(e){r.push(e);const o=t?t.has(e.rowKey):i;if(e.children&&o)for(const t of e.children)n(t)}for(const o of e)n(o);return r}(this.pivotResult.rows,this.expandedKeys,n).map(e=>({__pivotRowKey:e.rowKey,__pivotLabel:e.rowLabel,__pivotDepth:e.depth,__pivotIsGroup:e.isGroup,__pivotHasChildren:Boolean(e.children?.length),__pivotExpanded:this.expandedKeys.has(e.rowKey),__pivotRowCount:e.rowCount??0,__pivotIndent:e.depth*r,__pivotTotal:e.total,...e.values}));this.keysToAnimate.clear();const s=/* @__PURE__ */new Set;for(const l of o){const e=l.__pivotRowKey;s.add(e),!this.previousVisibleKeys.has(e)&&l.__pivotDepth>0&&this.keysToAnimate.add(e)}return this.previousVisibleKeys=s,this.config.grandTotalInRowModel&&this.config.showGrandTotal&&this.pivotResult&&o.push({__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotDepth:0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals}),o}processColumns(e){if(!this.isActive||!this.pivotResult)return[...e];const t=[],i=(this.config.rowGroupFields??[]).map(e=>this.fieldHeaderMap.get(e)??e).join(" / ");t.push({field:"__pivotLabel",header:i||"Group",width:200,sortable:!0});for(const r of this.pivotResult.columnKeys)for(const e of this.config.valueFields??[]){const i=oi([r],e.field),n=e.header||this.fieldHeaderMap.get(e.field)||e.field,o="function"==typeof e.aggFunc?"custom":e.aggFunc,s=this.valueFormatters.get(e.field);t.push({field:i,header:`${r} - ${n} (${o})`,width:120,type:"number",sortable:!0,...s?{format:e=>null!=e?s(Number(e)):""}:{}})}return this.config.showTotals&&t.push({field:"__pivotTotal",header:"Total",width:100,type:"number",sortable:!0}),t}renderRow(e,t,i){const r=e;return r.__pivotIsGrandTotal?yi(r,t,this.gridColumns):r.__pivotRowKey&&r.__pivotHasChildren?function(e,t,i){return t.className="data-grid-row pivot-group-row",t.setAttribute("data-pivot-depth",String(e.__pivotDepth??0)),t.setAttribute("data-pivot-key",String(e.__pivotRowKey??"")),t.setAttribute("role","row"),t.innerHTML="",i.columns.forEach((r,n)=>{const o=document.createElement("div");if(o.className="cell",o.setAttribute("data-col",String(n)),o.setAttribute("data-row",String(i.rowIndex)),o.setAttribute("role","gridcell"),0===n){const t=Number(e.__pivotIndent)||0;o.style.paddingLeft=`${t}px`;const r=String(e.__pivotRowKey),n=document.createElement("button");n.type="button",n.className="pivot-toggle",n.setAttribute("aria-label",e.__pivotExpanded?"Collapse group":"Expand group"),i.setIcon(n,e.__pivotExpanded?"collapse":"expand"),n.addEventListener("click",e=>{e.stopPropagation(),i.onToggle(r)}),o.appendChild(n);const s=document.createElement("span");s.className="pivot-label",s.textContent=String(e.__pivotLabel??""),o.appendChild(s);const l=document.createElement("span");l.className="pivot-count",l.textContent=` (${Number(e.__pivotRowCount)||0})`,o.appendChild(l)}else{const t=e[r.field];o.textContent=null!=t?r.format?r.format(t,e):String(t):""}t.appendChild(o)}),!0}(r,t,{columns:this.gridColumns,rowIndex:i,onToggle:e=>this.toggle(e),setIcon:(e,t)=>this.setIcon(e,t)}):void 0!==r.__pivotRowKey&&this.isActive?function(e,t,i,r){return t.className="data-grid-row pivot-leaf-row",t.setAttribute("data-pivot-depth",String(e.__pivotDepth??0)),t.setAttribute("data-pivot-key",String(e.__pivotRowKey??"")),t.innerHTML="",i.forEach((i,n)=>{const o=document.createElement("div");if(o.className="cell",o.setAttribute("data-col",String(n)),o.setAttribute("data-row",String(r)),o.setAttribute("role","gridcell"),0===n){const t=Number(e.__pivotIndent)||0;o.style.paddingLeft=`${t+20}px`;const i=document.createElement("span");i.className="pivot-label",i.textContent=String(e.__pivotLabel??""),o.appendChild(i)}else{const t=e[i.field];o.textContent=null!=t?i.format?i.format(t,e):String(t):""}t.appendChild(o)}),!0}(r,t,this.gridColumns,i):(this.cleanupPivotStyling(t),!1)}cleanupPivotStyling(e){(e.classList.contains("pivot-group-row")||e.classList.contains("pivot-leaf-row")||e.classList.contains("pivot-grand-total-row"))&&(e.classList.remove("pivot-group-row","pivot-leaf-row","pivot-grand-total-row"),e.classList.add("data-grid-row"),e.removeAttribute("data-pivot-depth"),e.innerHTML="")}onKeyDown(e){if(" "!==e.key)return;if(!this.isActive)return;const t=this.grid._focusRow,i=this.rows[t];return i?.__pivotIsGroup&&i.__pivotHasChildren?(e.preventDefault(),this.toggle(i.__pivotRowKey),this.requestRenderWithFocus(),!0):void 0}handleQuery(e){if("sort:get-sort-config"===e.type){const e=this.getMultiSortConfigs();return e||(this.config.sortRows??null)}}onHeaderClick(e){if(!this.isActive)return!1;const t=e.field;if(!this.isPivotField(t))return!1;if(this.isMultiSortActive())return!1;const i=this.mapFieldToSortConfig(t);if(!i)return!1;const r=this.activeSortDir;let n;n=this.activeSortField!==t?"asc":"asc"===r?"desc":null,this.activeSortField=n?t:null,this.activeSortDir=n,this.config.sortRows=n?{...i,direction:n}:void 0,this.emit("pivot-config-change",{property:"sortRows"}),this.refresh();const o=this.gridElement;if(o){const i=e.column.header??t;a(o,n?d(o,"sortApplied",i,"asc"===n?"ascending":"descending"):d(o,"sortCleared"))}return!0}isPivotField(e){return"__pivotLabel"===e||"__pivotTotal"===e||e.includes("|")}isMultiSortActive(){const e=this.grid?.query?.("sort:get-model",null);return Array.isArray(e)&&e.length>0}getMultiSortConfigs(){const e=this.grid?.query?.("sort:get-model",null);if(!e||0===e.length)return null;const t=e[0];if(!Array.isArray(t)||0===t.length)return null;const i=[];for(const r of t){if(!this.isPivotField(r.field))continue;const e=this.mapFieldToSortConfig(r.field);e&&i.push({...e,direction:r.direction})}return i.length>0?i:null}mapFieldToSortConfig(e){return"__pivotLabel"===e?{by:"label"}:"__pivotTotal"===e?{by:"value"}:e.includes("|")?{by:"value",valueField:e}:null}afterRender(){this.isActive&&this.config.showGrandTotal&&this.pivotResult&&!this.config.grandTotalInRowModel?this.renderGrandTotalFooter():this.cleanupGrandTotalFooter(),this.isActive&&!this.isMultiSortActive()&&this.updateSortIndicators();const e=this.animationStyle;if(!1===e||0===this.keysToAnimate.size)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i="fade"===e?"tbw-pivot-fade-in":"tbw-pivot-slide-in";for(const r of t.querySelectorAll(".pivot-group-row, .pivot-leaf-row")){const e=r.dataset.pivotKey;e&&this.keysToAnimate.has(e)&&(r.classList.add(i),r.addEventListener("animationend",()=>r.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}updateSortIndicators(){const e=this.gridElement;if(!e)return;const t=this.activeSortField,i=this.activeSortDir,r=t?null:this.config.sortRows,n=e.querySelectorAll(".header-row .cell[data-field]");for(const o of n){const e=o.getAttribute("data-field");if(!e||!this.isPivotField(e))continue;let n=null;t===e?n=i:r&&("label"===r.by&&"__pivotLabel"===e?n=r.direction??"asc":"value"!==r.by||"__pivotTotal"!==e||r.valueField?"value"===r.by&&r.valueField&&e===r.valueField&&(n=r.direction??"asc"):n=r.direction??"asc"),this.updateSortIndicator(o,n)}}renderGrandTotalFooter(){if(!this.pivotResult)return;const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.querySelector(".tbw-grid-root");if(!t)return;this.grandTotalFooter||(this.grandTotalFooter=document.createElement("div"),this.grandTotalFooter.className="pivot-grand-total-footer",t.appendChild(this.grandTotalFooter));yi({__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals},this.grandTotalFooter,this.gridColumns),this.grandTotalFooter.setAttribute("role","presentation")}cleanupGrandTotalFooter(){this.grandTotalFooter&&(this.grandTotalFooter.remove(),this.grandTotalFooter=null)}toggle(e){this.userHasToggledExpand=!0;const t=this.expandedKeys.has(e);t?this.expandedKeys.delete(e):this.expandedKeys.add(e),this.emitToggle(e,!t),this.requestRender()}expand(e){this.userHasToggledExpand=!0,this.expandedKeys.add(e),this.emitToggle(e,!0),this.requestRender()}collapse(e){this.userHasToggledExpand=!0,this.expandedKeys.delete(e),this.emitToggle(e,!1),this.requestRender()}expandAll(){this.userHasToggledExpand=!0,this.expandAllKeys(),this.requestRender()}collapseAll(){this.userHasToggledExpand=!0,this.expandedKeys.clear(),this.requestRender()}expandAllKeys(){if(!this.pivotResult)return;const e=ci(this.pivotResult.rows);for(const t of e)this.expandedKeys.add(t)}isExpanded(e){return this.expandedKeys.has(e)}getExpandedGroups(){return[...this.expandedKeys]}enablePivot(){0===this.originalColumns.length&&this.captureOriginalColumns(),this.isActive=!0,this.emit("pivot-state-change",{active:!0}),this.requestRender()}disablePivot(){this.isActive=!1,this.pivotResult=null,this.emit("pivot-state-change",{active:!1}),this.requestRender()}isPivotActive(){return this.isActive}getPivotResult(){return this.pivotResult}setRowGroupFields(e){this.config.rowGroupFields=e,this.emitConfigChange("rowGroupFields"),this.refresh()}setColumnGroupFields(e){this.config.columnGroupFields=e,this.emitConfigChange("columnGroupFields"),this.refresh()}setValueFields(e){this.config.valueFields=e,this.emitConfigChange("valueFields"),this.refresh()}refresh(){this.pivotResult=null,this.requestRender()}showPanel(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(Ci.PANEL_ID)||this.grid.toggleToolPanelSection(Ci.PANEL_ID)}hidePanel(){this.grid.closeToolPanel()}togglePanel(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(Ci.PANEL_ID)}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(Ci.PANEL_ID)}get gridColumns(){return this.grid.columns??[]}refreshIfActive(){this.isActive&&this.refresh(),this.refreshPanel()}buildFieldHeaderMap(){const e=this.getAvailableFields();this.fieldHeaderMap.clear();for(const t of e)this.fieldHeaderMap.set(t.field,t.header)}getAvailableFields(){return this.originalColumns.length>0?this.originalColumns:this.captureOriginalColumns()}captureOriginalColumns(){try{const e=this.grid.getAllColumns?.()??this.grid.columns??[];return this.originalColumns=e.filter(e=>!e.field.startsWith("__pivot")).map(e=>({field:e.field,header:e.header??e.field})),this.originalColumns}catch{return[]}}renderPanel(e){this.panelContainer=e,0===this.originalColumns.length&&this.captureOriginalColumns();const t={onTogglePivot:e=>{e?this.enablePivot():this.disablePivot(),this.refreshPanel()},onAddFieldToZone:(e,t)=>{this.addFieldToZone(e,t),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onRemoveFieldFromZone:(e,t)=>{this.removeFieldFromZone(e,t),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onReorderFieldInZone:(e,t,i)=>{this.reorderFieldInZone(e,t,i),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onMoveFieldBetweenZones:(e,t,i)=>{this.moveFieldBetweenZones(e,t,i),this.emitConfigChange("rowGroups"===i?"rowGroupFields":"columnGroupFields",e,i)},onAddValueField:(e,t)=>{this.addValueField(e,t),this.emitConfigChange("valueFields",e,"values")},onRemoveValueField:e=>{this.removeValueField(e),this.emitConfigChange("valueFields",e,"values")},onUpdateValueAggFunc:(e,t)=>{this.updateValueAggFunc(e,t),this.emitConfigChange("valueFields",e,"values")},onOptionChange:(e,t)=>{this.config[e]=t,this.emitConfigChange(e),this.isActive&&this.refresh()},getAvailableFields:()=>this.getAvailableFields()};return pi(e,this.config,this.isActive,t)}refreshPanel(){this.panelContainer&&(this.panelContainer.innerHTML="",this.renderPanel(this.panelContainer))}addFieldToZone(e,t){if("rowGroups"===t){const t=this.config.rowGroupFields??[];t.includes(e)||(this.config.rowGroupFields=[...t,e])}else{const t=this.config.columnGroupFields??[];t.includes(e)||(this.config.columnGroupFields=[...t,e])}this.removeFromOtherZones(e,t),this.refreshIfActive()}removeFieldFromZone(e,t){"rowGroups"===t?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e),this.refreshIfActive()}reorderFieldInZone(e,t,i){const r="rowGroups"===t?[...this.config.rowGroupFields??[]]:[...this.config.columnGroupFields??[]],n=r.indexOf(e);-1!==n&&n!==i&&(r.splice(n,1),r.splice(i>n?i-1:i,0,e),"rowGroups"===t?this.config.rowGroupFields=r:this.config.columnGroupFields=r,this.refreshIfActive())}moveFieldBetweenZones(e,t,i){"rowGroups"===t?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e),"rowGroups"===i?this.config.rowGroupFields=[...this.config.rowGroupFields??[],e]:this.config.columnGroupFields=[...this.config.columnGroupFields??[],e],this.refreshIfActive()}removeFromOtherZones(e,t){"rowGroups"!==t&&(this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e)),"columnGroups"!==t&&(this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e)),"values"!==t&&(this.config.valueFields=(this.config.valueFields??[]).filter(t=>t.field!==e))}addValueField(e,t){const i=this.config.valueFields??[];i.some(t=>t.field===e)||(this.config.valueFields=[...i,{field:e,aggFunc:t}]),this.removeFromOtherZones(e,"values"),this.refreshIfActive()}removeValueField(e){this.config.valueFields=(this.config.valueFields??[]).filter(t=>t.field!==e),this.refreshIfActive()}updateValueAggFunc(e,t){const i=this.config.valueFields??[],r=i.findIndex(t=>t.field===e);r>=0&&(i[r]={...i[r],aggFunc:t},this.config.valueFields=[...i]),this.isActive&&this.refresh()}emitToggle(e,t){const i=this.rows.find(t=>t.__pivotRowKey===e);this.emit("pivot-toggle",{key:e,expanded:t,label:i?.__pivotLabel??e,depth:i?.__pivotDepth??0})}emitConfigChange(e,t,i){this.emit("pivot-config-change",{property:e,field:t,zone:i})}buildValueFormatters(){this.valueFormatters.clear();const e=this.config.valueFields??[];for(const t of e)if(t.format)this.valueFormatters.set(t.field,t.format);else{if(this.originalColumns.find(e=>e.field===t.field)){const e=(this.grid.getAllColumns?.()??this.grid.columns??[]).find(e=>e.field===t.field);if(e?.format){const i=e.format;this.valueFormatters.set(t.field,e=>i(e,{}))}}}}}const xi="tbw-print-isolation-style";async function Ei(t,i={}){const{orientation:r="landscape"}=i,n=t.id;document.querySelectorAll(`#${CSS.escape(n)}`).length>1&&e(S,`Multiple elements found with id="${n}". Print isolation may not work correctly. Ensure each grid has a unique ID.`,n,"print"),document.getElementById(xi)?.remove();const o=function(e,t){const i=document.createElement("style");return i.id=xi,i.textContent=`\n /* Print isolation: hide everything except the target grid */\n @media print {\n /* Hide all body children by default */\n body > *:not(#${e}) {\n display: none !important;\n }\n\n /* But show the grid and ensure it's not hidden by ancestor rules */\n #${e} {\n display: block !important;\n position: static !important;\n visibility: visible !important;\n opacity: 1 !important;\n overflow: visible !important;\n height: auto !important;\n width: 100% !important;\n max-height: none !important;\n margin: 0 !important;\n padding: 0 !important;\n transform: none !important;\n }\n\n /* If grid is nested, we need to show its ancestors too */\n #${e},\n #${e} * {\n visibility: visible !important;\n }\n\n /* Walk up the DOM and show all ancestors of the grid */\n body *:has(> #${e}),\n body *:has(#${e}) {\n display: block !important;\n visibility: visible !important;\n opacity: 1 !important;\n overflow: visible !important;\n height: auto !important;\n position: static !important;\n transform: none !important;\n background: transparent !important;\n border: none !important;\n padding: 0 !important;\n margin: 0 !important;\n }\n\n /* Hide siblings of ancestors (everything that's not in the path to the grid) */\n body *:has(#${e}) > *:not(:has(#${e})):not(#${e}) {\n display: none !important;\n }\n\n /* Page settings */\n @page {\n size: ${t};\n margin: 1cm;\n }\n\n /* Ensure proper print styling */\n body {\n margin: 0 !important;\n padding: 0 !important;\n background: white !important;\n color-scheme: light !important;\n }\n }\n\n /* Screen: also apply isolation for print preview */\n @media screen {\n /* When this stylesheet is active, we're about to print */\n /* No screen-specific rules needed - isolation only applies to print */\n }\n `,i}(n,r);return document.head.appendChild(o),new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),document.getElementById(xi)?.remove(),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{window.removeEventListener("afterprint",t),document.getElementById(xi)?.remove(),e()},5e3)})}const Si={button:!1,orientation:"landscape",warnThreshold:500,maxRows:0,includeTitle:!0,includeTimestamp:!0,title:"",isolate:!1};class Ri extends i{name="print";version="1.0.0";styles=".tbw-print-header,.tbw-print-footer{display:none}@media print{tbw-grid{overflow:visible!important;height:auto!important;border:none!important;border-radius:0!important;color-scheme:light only;-webkit-print-color-adjust:exact;print-color-adjust:exact}tbw-grid .tbw-grid-content{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .tbw-scroll-area{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .rows-body{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .rows-container,tbw-grid .rows-viewport,tbw-grid .rows{overflow:visible!important;height:auto!important;max-height:none!important;transform:none!important}tbw-grid .rows-viewport .rows{position:static!important}tbw-grid .resize-handle,tbw-grid [part=sort-indicator],tbw-grid .tbw-filter-btn,tbw-grid .tool-panel,tbw-grid .tool-panel-content,tbw-grid .tbw-shell-header,tbw-grid .shell-toolbar,tbw-grid .tool-panel-toggle,tbw-grid [data-print-hide],tbw-grid .expander-cell,tbw-grid .tree-toggle,tbw-grid .context-menu,tbw-grid .faux-vscroll{display:none!important}tbw-grid .tbw-print-header{display:flex;justify-content:space-between;align-items:baseline;padding:var(--tbw-spacing-md, .5em) 0;margin-bottom:var(--tbw-spacing-md, .5em);border-bottom:2px solid var(--tbw-print-border, var(--tbw-color-border-strong));font-family:inherit}.tbw-print-header-title{font-size:1.25em;font-weight:700}.tbw-print-header-timestamp{font-size:var(--tbw-font-size-sm, .875em);color:var(--tbw-print-muted, var(--tbw-color-fg-muted))}tbw-grid .tbw-print-footer{display:block;margin-top:var(--tbw-spacing-md, .5em);padding-top:var(--tbw-spacing-md, .5em);border-top:1px solid var(--tbw-print-border, var(--tbw-color-border));font-size:var(--tbw-font-size-xs, .75em);color:var(--tbw-print-muted, var(--tbw-color-fg-muted));text-align:end}tbw-grid .data-grid-row{break-inside:avoid;page-break-inside:avoid}tbw-grid .cell{border:1px solid var(--tbw-print-cell-border, var(--tbw-color-border))!important}tbw-grid .header-row,tbw-grid .data-grid-row{padding-inline-end:1px}tbw-grid .data-grid-row:hover,tbw-grid .cell:hover{background:inherit!important}@page{margin:1cm}tbw-grid.print-landscape{@page{size:landscape}}tbw-grid.print-portrait{@page{size:portrait}}}";#pe=!1;#fe=null;#me=null;#we=null;#be=null;#ve=null;#ye=null;get#f(){return this.grid}isPrinting(){return this.#pe}async print(e){if(this.#pe)return void this.warn(R,"Print already in progress");const t=this.gridElement;if(!t)return void this.warn(A,"Grid not available");const i={...Si,...this.config,...e},r=this.rows.length;let n=r,o=!1;if(i.warnThreshold>0&&r>i.warnThreshold){const e=i.maxRows>0?`\n\nNote: Output will be limited to ${i.maxRows.toLocaleString()} rows.`:"";if(!confirm(`This grid has ${r.toLocaleString()} rows. Printing large datasets may cause performance issues or browser slowdowns.${e}\n\nClick OK to continue, or Cancel to abort.`))return}i.maxRows>0&&r>i.maxRows&&(n=i.maxRows,o=!0),this.#pe=!0;const s=performance.now();this.emit("print-start",{rowCount:n,limitApplied:o,originalRowCount:r});try{const e=this.#f;this.#me={bypassThreshold:e._virtualization?.bypassThreshold??24},this.#Ce(),o&&(this.#we=this.sourceRows,this.grid.rows=this.sourceRows.slice(0,n),await new Promise(e=>setTimeout(e,50))),(i.includeTitle||i.includeTimestamp)&&this.#xe(i),await this.#Ee(),await new Promise(e=>requestAnimationFrame(e)),await new Promise(e=>requestAnimationFrame(e)),t.classList.add(`print-${i.orientation}`),await new Promise(e=>requestAnimationFrame(e)),await new Promise(e=>requestAnimationFrame(e)),i.isolate?await this.#Se(i):await this.#Re(),this.emit("print-complete",{success:!0,rowCount:n,duration:Math.round(performance.now()-s)})}catch(l){k(I,`Print failed: ${l}`,this.gridElement?.id,this.name),this.emit("print-complete",{success:!1,rowCount:0,duration:Math.round(performance.now()-s)})}finally{this.#Ae(),this.#pe=!1}}#xe(e){const t=this.gridElement;if(t){if(this.#be=document.createElement("div"),this.#be.className="tbw-print-header",e.includeTitle){const t=e.title||this.grid.effectiveConfig?.shell?.header?.title||"Grid Data",i=document.createElement("div");i.className="tbw-print-header-title",i.textContent=t,this.#be.appendChild(i)}if(e.includeTimestamp){const e=document.createElement("div");e.className="tbw-print-header-timestamp",e.textContent=`Printed: ${/* @__PURE__ */(new Date).toLocaleString()}`,this.#be.appendChild(e)}t.insertBefore(this.#be,t.firstChild),this.#ve=document.createElement("div"),this.#ve.className="tbw-print-footer",this.#ve.textContent=`Page generated from ${window.location.hostname}`,t.appendChild(this.#ve)}}async#Ee(){const e=this.#f;if(!e._virtualization)return;const t=this.rows.length;e._virtualization.bypassThreshold=t+100,e.refreshVirtualWindow(!0),await new Promise(e=>setTimeout(e,100))}async#Re(){return new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{"undefined"!=typeof window&&window.removeEventListener("afterprint",t),e()},1e3)})}async#Se(e){const t=this.gridElement;t&&await Ei(t,{orientation:e.orientation})}#Ce(){const e=this.columns;if(e){this.#fe=/* @__PURE__ */new Map;for(const t of e){if(!t.field)continue;(!0===t.printHidden||!0===t.utility&&!1!==t.printHidden)&&(this.#fe.set(t.field,!t.hidden),this.grid.setColumnVisible(t.field,!1))}}}#ke(){if(this.#fe){for(const[e,t]of this.#fe)this.grid.setColumnVisible(e,t);this.#fe=null}}#Ae(){const e=this.gridElement;if(!e)return;this.#ke(),e.classList.remove("print-portrait","print-landscape"),null!==this.#ye&&(e.style.transform="",e.style.transformOrigin="",e.style.width="",this.#ye=null),this.#be&&(this.#be.remove(),this.#be=null),this.#ve&&(this.#ve.remove(),this.#ve=null);const t=this.#f;this.#me&&t._virtualization&&(t._virtualization.bypassThreshold=this.#me.bypassThreshold,t.refreshVirtualWindow(!0),this.#me=null),null!==this.#we&&(this.grid.rows=this.#we,this.#we=null)}afterRender(){this.config?.button&&!this.#Ie&&(this.#_e(),this.#Ie=!0)}#Ie=!1;#_e(){const e=this.#f;e.registerToolbarContent?.({id:"print-button",order:900,render:e=>{const t=document.createElement("button");t.className="tbw-toolbar-btn tbw-print-btn",t.title="Print grid",t.type="button",this.setIcon(t,"print"),t.addEventListener("click",()=>{this.print()},{signal:this.disconnectSignal}),e.appendChild(t)}})}}function Ai(e){if(!0===e.lockPosition)return!1;if(!0===e.utility)return!1;const t=e.meta??{};return!0!==t.lockPosition&&!0!==t.suppressMovable}function ki(e,t,i){if(t===i)return e;if(t<0||t>=e.length)return e;if(i<0||i>e.length)return e;const r=[...e],[n]=r.splice(t,1);return r.splice(i,0,n),r}const Ii="canMoveColumn";class _i extends i{name="reorderColumns";aliases=["reorder"];styles='@layer tbw-plugins{.header-row>.cell[draggable=true]{cursor:grab;position:relative}.header-row>.cell.dragging{opacity:.5;cursor:grabbing}.header-row>.cell.drop-before:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--tbw-reorder-indicator, var(--tbw-color-accent));z-index:1}.header-row>.cell.drop-after:after{content:"";position:absolute;right:0;top:0;bottom:0;width:2px;background:var(--tbw-reorder-indicator, var(--tbw-color-accent));z-index:1}.cell.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}@keyframes reorder-fade-in{0%{opacity:0}to{opacity:1}}.cell.fade-animating{animation:reorder-fade-in var(--tbw-animation-duration, .2s) ease-out backwards}}';static manifest={queries:[{type:Ii,description:"Authoritative check for whether a column may be reordered (honors lockPosition)."}]};handleQuery(e){if(e.type===Ii){const t=e.context;return t?Ai(t):void 0}}get defaultConfig(){return{animation:"flip"}}get animationType(){return!!this.isAnimationEnabled&&(void 0!==this.config.animation?this.config.animation:"flip")}get animationDuration(){return void 0!==this.config.animationDuration?this.config.animationDuration:super.animationDuration}isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupFields=[];get#f(){return this.grid}canMoveColumnWithPlugins(e){if(!e||!Ai(e))return!1;return!this.grid.query(Ii,e).includes(!1)}clearDragClasses(){this.gridElement?.querySelectorAll(".header-row > .cell, .header-group-row > .cell").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-reorder-request",e=>{const t=e.detail;t?.field&&"number"==typeof t.toIndex&&this.moveColumn(t.field,t.toIndex)},{signal:this.disconnectSignal})}detach(){this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[]}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll(".header-row > .cell").forEach(e=>{const t=e,i=t.getAttribute("data-field");if(!i)return;const r=this.columns.find(e=>e.field===i);this.canMoveColumnWithPlugins(r)?(t.draggable=!0,t.getAttribute("data-dragstart-bound")||(t.setAttribute("data-dragstart-bound","true"),t.addEventListener("dragstart",e=>{const r=this.getColumnOrder().indexOf(i);this.isDragging=!0,this.draggedField=i,this.draggedIndex=r,this.draggedGroupFields=[],e.dataTransfer&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",i)),t.classList.add(w.DRAGGING)}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[],this.clearDragClasses()}),t.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedField===i&&0===this.draggedGroupFields.length)return;if(this.draggedGroupFields.includes(i))return;const r=t.getBoundingClientRect(),n=r.left+r.width/2,o=this.getColumnOrder().indexOf(i);if(this.dropIndex=e.clientX<n?o:o+1,this.clearDragClasses(),this.draggedGroupFields.length>0)for(const t of this.draggedGroupFields)this.gridElement?.querySelector(`.header-row > .cell[data-field="${t}"]`)?.classList.add(w.DRAGGING);else this.draggedField&&this.gridElement?.querySelector(`.header-row > .cell[data-field="${this.draggedField}"]`)?.classList.add(w.DRAGGING);t.classList.add("drop-target"),t.classList.toggle("drop-before",e.clientX<n),t.classList.toggle("drop-after",e.clientX>=n)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length>0){if(this.draggedGroupFields.includes(i))return;const r=t.getBoundingClientRect(),n=e.clientX<r.left+r.width/2;return void this.executeGroupBlockMove(this.draggedGroupFields,[i],n)}const r=this.draggedField,n=this.draggedIndex,o=this.dropIndex;if(!this.isDragging||null===r||null===n||null===o)return;const s=o>n?o-1:o,l=ki(this.getColumnOrder(),n,s),a={field:r,fromIndex:n,toIndex:s,columnOrder:l};this.emitCancelable("column-move",a)||this.updateColumnOrder(l)}))):t.draggable=!1}),queueMicrotask(()=>this.setupGroupHeaderDrag(e))}setupGroupHeaderDrag(e){e.querySelectorAll(".header-group-row > .cell[data-group]").forEach(t=>{const i=t,r=i.getAttribute("data-group");if(!r||r.startsWith("__implicit__"))return;if(i.getAttribute("data-group-drag-bound"))return;i.setAttribute("data-group-drag-bound","true");const n=this.getGroupFragmentFields(i,r);if(0===n.length)return;n.every(e=>{const t=this.columns.find(t=>t.field===e);return this.canMoveColumnWithPlugins(t)})&&(i.draggable=!0,i.style.cursor="grab",i.addEventListener("dragstart",t=>{this.isDragging=!0,this.draggedField=null,this.draggedIndex=null,this.draggedGroupFields=[...n],t.dataTransfer&&(t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",`group:${r}`)),i.classList.add(w.DRAGGING);for(const i of n)e.querySelector(`.header-row > .cell[data-field="${i}"]`)?.classList.add(w.DRAGGING)}),i.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[],this.clearDragClasses()}),i.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length>0&&this.draggedGroupFields.length===n.length&&this.draggedGroupFields.every(e=>n.includes(e)))return;const t=i.getBoundingClientRect(),r=t.left+t.width/2,o=e.clientX<r;this.clearDragClasses(),i.classList.add("drop-target"),i.classList.toggle("drop-before",o),i.classList.toggle("drop-after",!o)}),i.addEventListener("dragleave",()=>{i.classList.remove("drop-target","drop-before","drop-after")}),i.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;const t=i.getBoundingClientRect(),r=e.clientX<t.left+t.width/2;if(this.draggedGroupFields.length>0){if(this.draggedGroupFields.length===n.length&&this.draggedGroupFields.every(e=>n.includes(e)))return;this.executeGroupBlockMove(this.draggedGroupFields,n,r)}else if(this.draggedField){const e=this.getColumnOrder(),t=r?n[0]:n[n.length-1],i=e.indexOf(this.draggedField),o=r?e.indexOf(t):e.indexOf(t)+1;if(-1===i||-1===o)return;const s=o>i?o-1:o,l=ki(e,i,s);this.emitCancelable("column-move",{field:this.draggedField,fromIndex:i,toIndex:s,columnOrder:l})||this.updateColumnOrder(l)}}))})}getGroupFragmentFields(e,t){const i=e.style.gridColumn,r=/(\d+)\s*\/\s*span\s+(\d+)/.exec(i);if(!r)return[];const n=parseInt(r[1],10),o=parseInt(r[2],10),s=this.visibleColumns,l=[];for(let a=n-1;a<n-1+o&&a<s.length;a++){const e=s[a];e&&l.push(e.field)}return l}executeGroupBlockMove(e,t,i){const r=this.getColumnOrder(),n=r.filter(t=>!e.includes(t)),o=i?t[0]:t[t.length-1],s=n.indexOf(o);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));n.splice(l,0,...a);this.emitCancelable("column-move",{field:e[0],fromIndex:r.indexOf(e[0]),toIndex:l,columnOrder:n})||this.updateColumnOrder(n)}onKeyDown(e){if(!e.altKey||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key)return;const t=this.#f,i=t._focusCol,r=t._visibleColumns;if(i<0||i>=r.length)return;const n=r[i];if(!this.canMoveColumnWithPlugins(n))return;const o=this.getColumnOrder(),s=o.indexOf(n.field);if(-1===s)return;const a="ArrowLeft"===e.key?s-1:s+1;if(a<0||a>=o.length)return;const d=r.find(e=>e.field===o[a]);return this.canMoveColumnWithPlugins(d)?(this.moveColumn(n.field,a),t._focusCol=a,l(this.#f),e.preventDefault(),e.stopPropagation(),!0):void 0}getColumnOrder(){return this.grid.getColumnOrder()}moveColumn(e,t){const i=this.getColumnOrder(),r=i.indexOf(e);if(-1===r)return;const n=ki(i,r,t);this.emitCancelable("column-move",{field:e,fromIndex:r,toIndex:t,columnOrder:n})||this.updateColumnOrder(n)}setColumnOrder(e){this.updateColumnOrder(e)}resetColumnOrder(){const e=this.columns.map(e=>e.field);this.updateColumnOrder(e)}captureHeaderPositions(){const e=/* @__PURE__ */new Map;return this.gridElement?.querySelectorAll(".header-row > .cell[data-field]").forEach(t=>{const i=t.getAttribute("data-field");i&&e.set(i,t.getBoundingClientRect().left)}),e}animateFLIP(e){const t=this.gridElement;if(!t||0===e.size)return;const i=/* @__PURE__ */new Map;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(t=>{const r=t.getAttribute("data-field");if(!r)return;const n=e.get(r);if(void 0===n)return;const o=n-t.getBoundingClientRect().left;Math.abs(o)>1&&i.set(r,o)}),0===i.size)return;const r=[];if(t.querySelectorAll(".cell[data-field]").forEach(e=>{const t=i.get(e.getAttribute("data-field")??"");if(void 0!==t){const i=e;i.style.transform=`translateX(${t}px)`,r.push(i)}}),0===r.length)return;t.offsetHeight;const n=this.animationDuration;requestAnimationFrame(()=>{r.forEach(e=>{e.classList.add("flip-animating"),e.style.transform=""}),setTimeout(()=>{r.forEach(e=>{e.style.transform="",e.classList.remove("flip-animating")})},n+50)})}animateFade(e){const t=this.gridElement;if(!t)return void e();const i=this.captureHeaderPositions();e();const r=/* @__PURE__ */new Set;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(e=>{const t=e.getAttribute("data-field");if(!t)return;const n=i.get(t);if(void 0===n)return;const o=e.getBoundingClientRect().left;Math.abs(n-o)>1&&r.add(t)}),0===r.size)return;const n=[];if(t.querySelectorAll(".cell[data-field]").forEach(e=>{const t=e.getAttribute("data-field");if(t&&r.has(t)){const t=e;t.classList.add("fade-animating"),n.push(t)}}),0===n.length)return;const o=this.animationDuration;setTimeout(()=>{n.forEach(e=>e.classList.remove("fade-animating"))},o+50)}updateColumnOrder(e){const t=this.animationType;if("flip"===t&&this.gridElement){const t=this.captureHeaderPositions();this.grid.setColumnOrder(e),"function"==typeof this.grid.forceLayout?this.grid.forceLayout().then(()=>{this.animateFLIP(t)}):requestAnimationFrame(()=>{this.animateFLIP(t)})}else"fade"===t?this.animateFade(()=>this.grid.setColumnOrder(e)):this.grid.setColumnOrder(e);this.grid.requestStateChange?.()}}const Ti=/* @__PURE__ */new Map;function Li(e){const t=Ti.get(e);if(!t)return;if(t.hasPrimitives)return;const i=[];for(const r of t.refs){const e=r.deref();if(void 0===e)return;i.push(e)}return i}function Fi(e){Ti.delete(e)}function Gi(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues){const e=new Uint32Array(2);return crypto.getRandomValues(e),`drag-${Date.now().toString(36)}-${e[0].toString(36)}${e[1].toString(36)}`}return`drag-${Date.now().toString(36)}-${(++Di).toString(36)}`}let Di=0,Mi=null;function Ni(){return Mi}function qi(){Mi=null}const Pi="application/x-tbw-grid-rows+json";function zi(e){const t=e.match(/^application\/x-tbw-grid-rows\+json;zone=(.*)$/);if(!t)return null;try{return decodeURIComponent(t[1])}catch{return t[1]}}function Oi(e){return JSON.stringify(e)}function Hi(e,t,i,r){if(!e)return{overIndex:null,insertIndex:r,isBefore:!1};const n=i(e);if(n<0)return{overIndex:null,insertIndex:r,isBefore:!1};const o=e.getBoundingClientRect(),s=t<o.top+o.height/2;return{overIndex:n,insertIndex:s?n:n+1,isBefore:s}}const Ki="__tbw_row_drag";let Bi=null;const $i=/* @__PURE__ */new Set;function Wi(){if("undefined"==typeof BroadcastChannel)return null;if(Bi)return Bi;try{Bi=new BroadcastChannel("tbw-row-drag-drop"),Bi.addEventListener("message",e=>{const t=e.data;if(t&&"tbw-row-drag-drop:transfer"===t.type)for(const i of Array.from($i))try{i(t)}catch{}})}catch{Bi=null}return Bi}class Vi extends i{name="rowDragDrop";aliases=["reorderRows","rowReorder"];styles='@layer tbw-plugins{[data-field=__tbw_row_drag]{display:flex;align-items:center;justify-content:center}.dg-row-drag-handle{display:flex;align-items:center;justify-content:center;min-width:1em;min-height:1em;cursor:grab;user-select:none;color:var(--tbw-row-reorder-handle-color, var(--tbw-color-fg-muted));transition:color var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease);font-size:var(--tbw-font-size, 1em);letter-spacing:-2px;&:hover{color:var(--tbw-row-reorder-handle-hover, var(--tbw-color-fg))}&:active{cursor:grabbing}}.data-grid-row.dragging{opacity:.6}.data-grid-row[draggable=true]{cursor:grab}.data-grid-row[draggable=true].dragging{cursor:grabbing}.tbw-row-drag-clone{position:fixed;top:-10000px;left:-10000px;pointer-events:none}.tbw-row-drag-count{position:fixed;top:-1000px;left:-1000px;pointer-events:none;background:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));color:var(--tbw-color-accent-fg);font:600 12px/1.4 system-ui,sans-serif;border-radius:999px;padding:2px 8px;box-shadow:0 2px 6px var(--tbw-color-shadow);z-index:9999}.data-grid-row.drop-target{position:relative;&.drop-before:before,&.drop-after:after{content:"";position:absolute;left:0;right:0;height:var(--tbw-drop-indicator-width, 2px);background-color:var(--tbw-drop-indicator-color, var(--tbw-row-reorder-indicator, var(--tbw-color-accent)));z-index:10;pointer-events:none}&.drop-before:before{top:0}&.drop-after:after{bottom:0}}.tbw-grid--drop-target-active{outline:2px dashed var(--tbw-drop-indicator-color, var(--tbw-color-accent));outline-offset:-2px}.tbw-grid--drop-target-rejected{outline:2px dashed var(--tbw-color-danger);outline-offset:-2px}.tbw-grid--auto-scrolling{cursor:ns-resize}.data-grid-row.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}}';static manifest={events:[{type:"row-move",description:"Intra-grid row reorder.",cancelable:!0},{type:"row-drag-start",description:"Cross-grid drag started on this grid.",cancelable:!0},{type:"row-drag-end",description:"Drag finished on this grid (regardless of outcome)."},{type:"row-drop",description:"Cross-grid drop landing on this grid.",cancelable:!0},{type:"row-transfer",description:"Cross-grid transfer completed (fires on both grids)."}]};get defaultConfig(){return{enableKeyboard:!0,dragHandlePosition:"left",dragHandleWidth:40,debounceMs:150,animation:"flip",operation:"move",autoScroll:!0,dragFrom:"handle"}}shouldRenderDragHandle(){const e=this.config.showDragHandle;return!1!==e&&(!0===e||"row"!==this.config.dragFrom)}get rowIsDraggable(){return"row"===this.config.dragFrom||"both"===this.config.dragFrom}get animationType(){return!!this.isAnimationEnabled&&(void 0!==this.config.animation?this.config.animation:"flip")}isDragging=!1;draggedRowIndex=null;draggedRows=[];draggedIndices=[];dragSessionId=null;dragAccepted=!1;dropRowIndex=null;pendingMove=null;debounceTimer=null;lastFocusCol=0;autoScroller=null;gridId="";remoteTransferListener=e=>this.onRemoteTransfer(e);get internalGrid(){return this.grid}attach(e){super.attach(e);const t=this.gridElement;var i;t&&(this.gridId=t.id||`tbw-grid-${Gi().slice(0,8)}`,t.id||(t.id=this.gridId),this.setupDelegatedDragListeners(),i=this.remoteTransferListener,$i.add(i),Wi())}detach(){this.clearDebounceTimer(),this.autoScroller?.stop(),this.autoScroller=null,function(e){if($i.delete(e),0===$i.size&&Bi){try{Bi.close()}catch{}Bi=null}}(this.remoteTransferListener),this.dragSessionId&&Fi(this.dragSessionId),qi(),this.resetDragState(),super.detach()}processColumns(e){if(!this.shouldRenderDragHandle())return[...e];const t={field:Ki,header:"",width:this.config.dragHandleWidth??40,resizable:!1,sortable:!1,filterable:!1,lockPosition:!0,utility:!0,viewRenderer:()=>{const e=document.createElement("div");return e.className="dg-row-drag-handle",e.setAttribute("aria-label","Drag to reorder"),e.setAttribute("role","button"),e.setAttribute("tabindex","-1"),e.draggable=!0,this.setIcon(e,"dragHandle"),e}};return"right"===this.config.dragHandlePosition?[...e,t]:[t,...e]}afterRender(){this.applyRowDraggable()}onScrollRender(){this.applyRowDraggable()}applyRowDraggable(){const e=this.internalGrid._bodyEl;if(!e)return;const t=this.rowIsDraggable,i=e.querySelectorAll(".data-grid-row");for(const r of i)t?"true"!==r.getAttribute("draggable")&&r.setAttribute("draggable","true"):r.hasAttribute("draggable")&&r.removeAttribute("draggable")}onKeyDown(e){if(!this.config.enableKeyboard)return;if(!e.ctrlKey||"ArrowUp"!==e.key&&"ArrowDown"!==e.key)return;const t=this.internalGrid,i=t._focusRow,r=t._rows??this.sourceRows;if(i<0||i>=r.length)return;const n="up"===("ArrowUp"===e.key?"up":"down")?i-1:i+1;if(n<0||n>=r.length)return;const o=r[i];return this.canMoveRow(i,n)?(this.handleKeyboardMove(o,i,n,t._focusCol),e.preventDefault(),e.stopPropagation(),!0):void 0}onCellClick(){this.flushPendingMove()}moveRow(e,t){const i=[...this.sourceRows];e<0||e>=i.length||t<0||t>=i.length||e!==t&&this.canMoveRow(e,t)&&this.executeIntraGridMove(i[e],e,t,"keyboard")}canMoveRow(e,t){const i=this.internalGrid._rows??this.sourceRows;if(e<0||e>=i.length)return!1;if(t<0||t>=i.length)return!1;if(e===t)return!1;const r=i[e],n=this.grid?.query?.("canMoveRow",r);if(Array.isArray(n)&&n.includes(!1))return!1;if(this.config.canDrag&&!this.config.canDrag(r,e))return!1;if(this.config.canMove){const i=t<e?"up":"down";if(!this.config.canMove(r,e,t,i))return!1}if(this.config.canDrop){const i={sessionId:"intra",sourceGridId:this.gridId,dropZone:this.config.dropZone??"",rows:[r],rowIndices:[e],operation:"move"};if(!this.config.canDrop(i,t))return!1}return!0}setupDelegatedDragListeners(){const e=this.gridElement;if(!e)return;const t=this.disconnectSignal;e.addEventListener("dragstart",e=>this.onDragStart(e),{signal:t}),e.addEventListener("dragend",()=>this.onDragEnd(),{signal:t}),e.addEventListener("dragover",e=>this.onDragOver(e),{signal:t}),e.addEventListener("dragleave",e=>this.onDragLeave(e),{signal:t}),e.addEventListener("drop",e=>this.onDrop(e),{signal:t})}onDragStart(e){const t=e.target;if(!t)return;const i=t.closest(".dg-row-drag-handle");let r=null,n=!1;if(i)r=i.closest(".data-grid-row"),n=!0;else if(this.rowIsDraggable){if(this.isInteractiveDragOrigin(t))return;r=t.closest(".data-grid-row")}if(!r)return;const o=this.getRowIndex(r);if(o<0)return;const{rows:s,indices:l}=this.resolveDraggedRows(o);if(0===s.length)return;if(this.config.canDrag&&!this.config.canDrag(s[0],o))return void e.preventDefault();const a=this.config.operation??"move",d=this.config.dropZone??"",c=Gi(),u={rows:s,indices:l,operation:a,dropZone:d};if(this.emitCancelable("row-drag-start",u))return void e.preventDefault();this.isDragging=!0,this.draggedRowIndex=o,this.draggedRows=s,this.draggedIndices=l,this.dragSessionId=c,this.dragAccepted=!1;const h=this.config.serializeRow??(e=>e),g={sessionId:c,sourceGridId:this.gridId,dropZone:d,rows:s.map(h),rowIndices:l,operation:a};if(e.dataTransfer){e.dataTransfer.effectAllowed="copy"===a?"copyMove":"move";try{e.dataTransfer.setData(Pi,Oi(g)),d&&e.dataTransfer.setData(`${Pi};zone=${encodeURIComponent(d)}`,Oi(g)),e.dataTransfer.setData("text/plain",function(e,t){const i=t.filter(e=>!e.utility&&"string"==typeof e.field&&""!==e.field),r=[];for(const n of e){const e=i.map(e=>{const t=n[e.field];return null==t?"":String(t).replace(/[\t\r\n]+/g," ")});r.push(e.join("\t"))}return r.join("\n")}(s,this.columns))}catch{}if(s.length>1){const t=document.createElement("div");t.className="tbw-row-drag-count",t.textContent=`${s.length} rows`,document.body.appendChild(t);try{e.dataTransfer.setDragImage(t,10,10)}catch{}setTimeout(()=>t.remove(),0)}else this.attachRowCloneDragImage(e,r,n?i:null)}!function(e,t,i){const r=[];let n=!1;for(const o of t)null!==o&&"object"==typeof o?r.push(new WeakRef(o)):n=!0;Ti.set(e,{refs:r,hasPrimitives:n,meta:i})}(c,s),function(e,t){Mi={sessionId:e,payload:t}}(c,g),r.classList.add(w.DRAGGING),this.gridElement.classList.add("tbw-grid--drag-source")}static INTERACTIVE_DRAG_SELECTORS='input,textarea,select,button,a,[contenteditable=""],[contenteditable="true"],.dg-cell-editor,.tbw-checkbox-cell';isInteractiveDragOrigin(e){return null!==e.closest(Vi.INTERACTIVE_DRAG_SELECTORS)}attachRowCloneDragImage(e,t,i){if(!e.dataTransfer)return;const r=t.getBoundingClientRect(),n=t.cloneNode(!0);n.classList.add("tbw-row-drag-clone"),n.classList.remove("dragging","drop-target","drop-before","drop-after","flip-animating","row-focus"),n.removeAttribute("aria-selected"),n.style.width=`${r.width}px`,n.style.height=`${r.height}px`,this.gridElement.appendChild(n);let o=e.clientX-r.left,s=e.clientY-r.top;if(i){const e=i.getBoundingClientRect();o=e.left-r.left+e.width/2,s=e.top-r.top+e.height/2}o=Math.max(0,Math.min(r.width,o)),s=Math.max(0,Math.min(r.height,s));try{e.dataTransfer.setDragImage(n,o,s)}catch{}setTimeout(()=>n.remove(),0)}onDragOver(e){const t=e.dataTransfer;if(!t)return;const i=t.types?Array.from(t.types):[];if(!function(e){for(const t of e)if(t===Pi||t.startsWith(`${Pi};`))return!0;return!1}(i)&&!this.isDragging)return;const r=this.config.dropZone??"",n=Ni(),o=this.isDragging&&n?.payload.sourceGridId===this.gridId;if(!o){if(!r)return;const e=function(e,t){for(const i of e)if(zi(i)===t)return i;return null}(i,r);if(!(e||n&&n.payload.dropZone===r))return}e.preventDefault(),t&&(t.dropEffect=n?.payload.operation??this.config.operation??"move");const s=e.target.closest(".data-grid-row"),l=this.internalGrid._rows??[],a=Hi(s,e.clientY,e=>this.getRowIndex(e),l.length);if(o&&null!==a.overIndex&&a.overIndex===this.draggedRowIndex)this.clearDropTargetClasses();else{if(n&&this.config.canDrop){const e=this.config.canDrop(n.payload,a.insertIndex);if(this.gridElement.classList.toggle("tbw-grid--drop-target-active",e),this.gridElement.classList.toggle("tbw-grid--drop-target-rejected",!e),!e)return void this.clearDropTargetClasses()}else this.gridElement.classList.add("tbw-grid--drop-target-active");this.dropRowIndex=a.insertIndex,this.applyDropPositionClasses(s,a.isBefore),!1!==this.config.autoScroll&&(this.ensureAutoScroller(),this.autoScroller?.onPointerMove(e.clientY))}}onDragLeave(e){const t=e.target.closest(".data-grid-row");t&&t.classList.remove("drop-target","drop-before","drop-after"),e.currentTarget&&!this.gridElement.contains(e.relatedTarget)&&(this.gridElement.classList.remove("tbw-grid--drop-target-active","tbw-grid--drop-target-rejected"),this.autoScroller?.stop())}onDrop(e){e.preventDefault(),this.autoScroller?.stop(),this.gridElement.classList.remove("tbw-grid--drop-target-active","tbw-grid--drop-target-rejected"),this.clearDropTargetClasses();const t=e.dataTransfer;if(!t)return;const i=Ni();let r=i?.payload??null,n=null;if(r){const e=Li(r.sessionId);e&&(n=e)}else{if(r=function(e){if(!e)return null;try{const t=JSON.parse(e);if("string"!=typeof t?.sessionId||"string"!=typeof t?.sourceGridId||"string"!=typeof t?.dropZone||!Array.isArray(t?.rows)||!Array.isArray(t?.rowIndices)||"move"!==t.operation&&"copy"!==t.operation)return null;for(const e of t.rowIndices)if("number"!=typeof e||!Number.isInteger(e)||e<0)return null;return t}catch{return null}}(t.getData(Pi)),r){const e=Li(r.sessionId);e&&(n=e)}}if(!r)return;const o=e.target.closest(".data-grid-row"),s=this.internalGrid._rows??[],l=Hi(o,e.clientY,e=>this.getRowIndex(e),s.length);let a=this.dropRowIndex??l.insertIndex;const d=r.sourceGridId===this.gridId,c=this.config.dropZone??"";if(d){const e=r.rowIndices[0];if(1===r.rowIndices.length&&a>e&&a--,e===a)return;const t=(n??r.rows)[0];if(!this.canMoveRow(e,a))return;return void this.executeIntraGridMove(t,e,a,"drag")}if(!c||c!==r.dropZone)return;if(this.config.canDrop&&!this.config.canDrop(r,a))return this.gridElement.classList.add("tbw-grid--drop-target-rejected"),void setTimeout(()=>this.gridElement.classList.remove("tbw-grid--drop-target-rejected"),200);const u=this.config.deserializeRow??(e=>e),h=n??r.rows.map(e=>u(e)),g={payload:r,sourceGridId:r.sourceGridId,targetIndex:a,operation:r.operation};if(this.emitCancelable("row-drop",g))return;const p=[...s];p.splice(a,0,...h),this.grid.rows=p;const f=this.findPeerOnGrid(r.sourceGridId);if("move"===r.operation&&f){const e=document.getElementById(r.sourceGridId);if(e){const t=(e._rows??e.rows??[]).slice(),i=[...r.rowIndices].sort((e,t)=>t-e);for(const e of i)e>=0&&e<t.length&&t.splice(e,1);e.rows=t}}f&&(f.dragAccepted=!0);const m={rows:h,fromGridId:r.sourceGridId,toGridId:this.gridId,fromIndices:r.rowIndices,toIndex:a,operation:r.operation};this.emit("row-transfer",m),f?f.emitTransfer(m):function(e){const t=Wi();if(t)try{t.postMessage(e)}catch{}}({type:"tbw-row-drag-drop:transfer",sessionId:r.sessionId,sourceGridId:r.sourceGridId,toGridId:this.gridId,dropZone:c,rowIndices:r.rowIndices,toIndex:a,operation:r.operation,serializedRows:r.rows})}onRemoteTransfer(e){if(e.sourceGridId!==this.gridId)return;const t=this.config.dropZone??"";if(!t||e.dropZone!==t)return;const i=this.config.deserializeRow??(e=>e),r=e.serializedRows.map(e=>i(e));if("move"===e.operation){const t=(this.internalGrid._rows??this.sourceRows).slice(),i=[...e.rowIndices].sort((e,t)=>t-e);for(const e of i)e>=0&&e<t.length&&t.splice(e,1);this.grid.rows=t}this.dragAccepted=!0,this.emit("row-transfer",{rows:r,fromGridId:e.sourceGridId,toGridId:e.toGridId,fromIndices:e.rowIndices,toIndex:e.toIndex,operation:e.operation})}onDragEnd(){if(this.dragSessionId&&Fi(this.dragSessionId),qi(),this.autoScroller?.stop(),this.gridElement.classList.remove("tbw-grid--drag-source"),this.isDragging){const e={rows:this.draggedRows,indices:this.draggedIndices,accepted:this.dragAccepted};this.emit("row-drag-end",e)}this.clearDragClasses(),this.resetDragState()}emitTransfer(e){this.emit("row-transfer",e)}findPeerOnGrid(e){const t=document.getElementById(e);return t?.getPluginByName?t.getPluginByName("rowDragDrop")??null:null}resolveDraggedRows(e){const t=this.internalGrid._rows??this.sourceRows,i=t[e],r=this.grid?.getPluginByName?.("selection");if(r?.getSelectedRowIndices){const i=r.getSelectedRowIndices();if(i.includes(e)&&i.length>1){const e=[...i].sort((e,t)=>e-t);return{rows:e.map(e=>t[e]),indices:e}}}return{rows:[i],indices:[e]}}ensureAutoScroller(){if(this.autoScroller)return;const e=this.gridElement.querySelector(".rows-viewport");if(!e)return;const t="object"==typeof this.config.autoScroll?this.config.autoScroll:void 0;this.autoScroller=function(e,t={},i){const r=t.edgeSize??60,n=t.speed??8,o=t.maxSpeed??24;let s=null,l=null,a=!1;const d=e=>{e!==a&&(a=e,i?.(e))},c=()=>{if(s=null,null===l)return void d(!1);const t=e.getBoundingClientRect();let i=0;if(l<t.top+r){const e=1-Math.max(0,l-t.top)/r;i=-Math.round(n+(o-n)*e)}else if(l>t.bottom-r){const e=1-Math.max(0,t.bottom-l)/r;i=Math.round(n+(o-n)*e)}if(0===i)return void d(!1);const a=e.scrollTop;e.scrollTop=a+i,e.scrollTop!==a?(d(!0),s=requestAnimationFrame(c)):d(!1)};return{onPointerMove(e){l=e,null===s&&(s=requestAnimationFrame(c))},stop(){null!==s&&(cancelAnimationFrame(s),s=null),l=null,d(!1)},get isScrolling(){return a}}}(e,t,e=>{this.gridElement.classList.toggle("tbw-grid--auto-scrolling",e)})}applyDropPositionClasses(e,t){this.clearDropTargetClasses(),e&&(e.classList.add("drop-target"),e.classList.toggle("drop-before",t),e.classList.toggle("drop-after",!t))}clearDropTargetClasses(){this.gridElement?.querySelectorAll(".data-grid-row.drop-target").forEach(e=>{e.classList.remove("drop-target","drop-before","drop-after")})}clearDragClasses(){this.gridElement?.querySelectorAll(".data-grid-row").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}resetDragState(){this.isDragging=!1,this.draggedRowIndex=null,this.draggedRows=[],this.draggedIndices=[],this.dragSessionId=null,this.dragAccepted=!1,this.dropRowIndex=null,this.pendingMove=null}getRowIndex(e){const t=e.querySelector(".cell[data-row]");return t?parseInt(t.getAttribute("data-row")??"-1",10):-1}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}handleKeyboardMove(e,t,i,r){this.pendingMove?this.pendingMove.currentIndex=i:this.pendingMove={originalIndex:t,currentIndex:i,row:e},this.lastFocusCol=r;const n=this.internalGrid,o=[...n._rows??this.sourceRows],[s]=o.splice(t,1);o.splice(i,0,s),n._rows=o,n._focusRow=i,n._focusCol=r,n.refreshVirtualWindow(!0),l(n),this.clearDebounceTimer(),this.debounceTimer=setTimeout(()=>this.flushPendingMove(),this.config.debounceMs??300)}flushPendingMove(){if(this.clearDebounceTimer(),!this.pendingMove)return;const{originalIndex:e,currentIndex:t,row:i}=this.pendingMove;if(this.pendingMove=null,e===t)return;const r=this.internalGrid,n={row:i,fromIndex:e,toIndex:t,rows:[...r._rows??this.sourceRows],source:"keyboard"};this.emitCancelable("row-move",n)&&(r._rows=[...this.sourceRows],r._focusRow=e,r._focusCol=this.lastFocusCol,r.refreshVirtualWindow(!0),l(r))}executeIntraGridMove(e,t,i,r){const n=[...this.sourceRows],[o]=n.splice(t,1);n.splice(i,0,o);const s={row:e,fromIndex:t,toIndex:i,rows:n,source:r};if(!this.emitCancelable("row-move",s))if("flip"===this.animationType&&this.gridElement){const e=this.captureRowPositions();this.grid.rows=n,requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(e,t,i)})}else this.grid.rows=n}captureRowPositions(){const e=/* @__PURE__ */new Map;return this.gridElement?.querySelectorAll(".data-grid-row").forEach(t=>{const i=this.getRowIndex(t);i>=0&&e.set(i,t.getBoundingClientRect().top)}),e}animateFLIP(e,t,i){const r=this.gridElement;if(!r||0===e.size)return;const n=Math.min(t,i),o=Math.max(t,i),s=[];if(r.querySelectorAll(".data-grid-row").forEach(r=>{const l=r,a=this.getRowIndex(l);if(a<0||a<n||a>o)return;let d;d=a===i?t:t<i?a+1:a-1;const c=e.get(d);if(void 0===c)return;const u=c-l.getBoundingClientRect().top;Math.abs(u)>1&&s.push({el:l,deltaY:u})}),0===s.length)return;s.forEach(({el:e,deltaY:t})=>{e.style.transform=`translateY(${t}px)`}),r.offsetHeight;const l=this.animationDuration;requestAnimationFrame(()=>{s.forEach(({el:e})=>{e.classList.add("flip-animating"),e.style.transform=""}),setTimeout(()=>{s.forEach(({el:e})=>{e.style.transform="",e.classList.remove("flip-animating")})},l+50)})}}class ji extends i{name="responsive";version="1.0.0";styles='tbw-grid[data-responsive-animate]{.data-grid-row,.data-grid-row>.cell{transition:opacity var(--tbw-responsive-duration, .2s) ease-out,transform var(--tbw-responsive-duration, .2s) ease-out}}tbw-grid[data-responsive][data-responsive-animate]{.data-grid-row{animation:responsive-card-enter var(--tbw-responsive-duration, .2s) ease-out}}@keyframes responsive-card-enter{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}tbw-grid[data-responsive]{.header{display:none!important}.footer-row{display:none}.tbw-scroll-area{overflow-x:hidden;min-width:0!important}.rows-body-wrapper{min-width:0!important}.data-grid-row:not(.group-row){display:block!important;grid-template-columns:none!important;padding:var(--tbw-cell-padding);padding-inline-start:var(--tbw-spacing-xl);border-bottom:1px solid var(--tbw-color-border);min-height:auto!important;height:auto!important;contain:none!important;content-visibility:visible!important;background:var(--tbw-color-bg);position:relative;&:nth-child(2n){background:var(--tbw-color-row-alt)}&:hover{background:var(--tbw-color-row-hover)}&[aria-selected=true]{background:var(--tbw-color-selection);&:before{content:"";position:absolute;inset-inline-start:0;top:0;bottom:0;width:4px;background:var(--tbw-color-accent)}}}.data-grid-row:not(.group-row)>.cell{display:flex!important;justify-content:space-between;align-items:center;padding:var(--tbw-spacing-xs) var(--tbw-spacing-md);width:100%!important;min-width:0!important;min-height:auto!important;height:auto!important;line-height:1.5!important;position:static!important;left:auto!important;right:auto!important;border:none!important;border-bottom:none!important;border-inline-end:none!important;background:transparent!important;white-space:normal!important;overflow:visible!important;&:before{content:attr(data-header) ": ";font-weight:600;color:var(--tbw-color-header-fg);flex-shrink:0;margin-inline-end:var(--tbw-spacing-md);min-width:100px}&:after{content:none}}.cell[data-utility]{display:none!important}}tbw-grid[data-responsive] .data-grid-row>.cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .data-grid-row>.cell[data-responsive-value-only]{&:before{display:none!important}justify-content:flex-start!important;font-weight:500}tbw-grid:not([data-responsive]) .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive]{.tbw-footer,.tbw-header-pinned,.tbw-pinned-rows,.tbw-aggregation-rows{display:none!important}.tbw-pinned-rows,.tbw-aggregation-rows,.tbw-aggregation-row{min-width:0!important}}tbw-grid[data-responsive] .data-grid-row.responsive-card{display:block!important;padding:var(--tbw-cell-padding);border-bottom:1px solid var(--tbw-color-border);>*{width:100%}.cell:before{display:none}}';static manifest={queries:[{type:"isCardMode",description:"Returns whether the grid is currently in responsive card mode"}]};#Te;#Le=!1;#Fe;#Ge=!1;#De=0;#Me=/* @__PURE__ */new Set;#Ne=/* @__PURE__ */new Set;#qe=null;#Pe=[];get#f(){return this.grid}isResponsive(){return this.#Le}setResponsive(e){e!==this.#Le&&(this.#Le=e,this.#ze(),this.emit("responsive-change",{isResponsive:e,width:this.#De,breakpoint:this.config.breakpoint??0}),this.requestRender())}setBreakpoint(e){this.config.breakpoint=e,this.#Oe(this.#De)}setCardRenderer(e){this.config.cardRenderer=e,this.#Le&&this.requestRender()}getWidth(){return this.#De}getActiveBreakpoint(){return this.#qe}attach(e){super.attach(e),this.#He(),this.#Ke(this.config.hiddenColumns),this.config.breakpoints?.length&&(this.#Pe=[...this.config.breakpoints].sort((e,t)=>t.maxWidth-e.maxWidth)),this.#Te=new ResizeObserver(e=>{const t=e[0]?.contentRect.width??0;this.#De=t,clearTimeout(this.#Fe),this.#Fe=setTimeout(()=>{this.#Oe(t)},this.config.debounceMs??100)}),this.#Te.observe(this.gridElement)}#He(){const e=this.gridElement;if(!e)return;const t=e.querySelector("tbw-grid-responsive-card");if(!t)return;const i=this.#f.__frameworkAdapter;if(i?.parseResponsiveCardElement){const e=i.parseResponsiveCardElement(t);e&&(this.config={...this.config,cardRenderer:e})}const r=t.getAttribute("breakpoint"),o=t.getAttribute("card-row-height"),s=t.getAttribute("hidden-columns"),l=t.getAttribute("hide-header"),a=t.getAttribute("debounce-ms"),d={};if(null!==r){const e=parseInt(r,10);isNaN(e)||(d.breakpoint=e)}if(null!==o&&(d.cardRowHeight="auto"===o?"auto":parseInt(o,10)),null!==s&&(d.hiddenColumns=s.split(",").map(e=>e.trim()).filter(e=>e.length>0)),null!==l&&(d.hideHeader="false"!==l),null!==a){const e=parseInt(a,10);isNaN(e)||(d.debounceMs=e)}const c=t.innerHTML.trim();!c||this.config.cardRenderer||i?.parseResponsiveCardElement||(d.cardRenderer=e=>{const t=y(c,{value:e,row:e}),i=n(t),r=document.createElement("div");return r.className="tbw-responsive-card-content",r.innerHTML=i,r}),Object.keys(d).length>0&&(this.config={...this.config,...d})}#Ke(e){if(this.#Me.clear(),this.#Ne.clear(),e)for(const t of e)"string"==typeof t?this.#Me.add(t):t.showValue?this.#Ne.add(t.field):this.#Me.add(t.field)}detach(){this.#Te?.disconnect(),this.#Te=void 0,clearTimeout(this.#Fe),this.#Fe=void 0,this.gridElement&&this.gridElement.removeAttribute("data-responsive"),super.detach()}handleQuery(e){if("isCardMode"===e.type)return this.#Le}afterRender(){this.#Be();if(!(this.#Pe.length>0?null!==this.#qe:this.#Le))return;const e=this.#Me.size>0,t=this.#Ne.size>0;if(!e&&!t)return;const i=this.gridElement.querySelectorAll(".cell[data-field]");for(const r of i){const e=r.getAttribute("data-field");e&&(this.#Me.has(e)?(r.setAttribute("data-responsive-hidden",""),r.removeAttribute("data-responsive-value-only")):this.#Ne.has(e)?(r.setAttribute("data-responsive-value-only",""),r.removeAttribute("data-responsive-hidden")):(r.removeAttribute("data-responsive-hidden"),r.removeAttribute("data-responsive-value-only")))}}#Oe(e){if(this.#Pe.length>0)return void this.#$e(e);const t=this.config.breakpoint??0;0!==t||this.#Ge||(this.#Ge=!0,this.warn(_,"No breakpoint configured. Responsive mode is disabled. Set a breakpoint based on your grid's column count."));const i=t>0&&e<t;i!==this.#Le&&(this.#Le=i,this.#ze(),this.emit("responsive-change",{isResponsive:i,width:e,breakpoint:t}),this.requestRender())}#$e(e){let t=null;for(const i of this.#Pe)e<=i.maxWidth&&(t=i);if(t!==this.#qe){this.#qe=t,t?.hiddenColumns?this.#Ke(t.hiddenColumns):this.#Ke(this.config.hiddenColumns);const i=!0===t?.cardLayout;i!==this.#Le&&(this.#Le=i,this.#ze()),this.emit("responsive-change",{isResponsive:this.#Le,width:e,breakpoint:t?.maxWidth??0}),this.requestRender()}}#We;#ze(){this.gridElement.toggleAttribute("data-responsive",this.#Le);const e=!1!==this.config.animate;this.gridElement.toggleAttribute("data-responsive-animate",e),this.config.animationDuration&&this.gridElement.style.setProperty("--tbw-responsive-duration",`${this.config.animationDuration}ms`);const t=this.#f;if(this.#Le){t._virtualization&&(this.#We=t._virtualization.rowHeight);const e=this.gridElement.querySelector(".tbw-scroll-area");e&&(e.scrollLeft=0)}else{const e=this.gridElement.querySelectorAll(".data-grid-row");for(const t of e)t.style.height="",t.classList.remove("responsive-card");this.#We&&this.#We>0&&t._virtualization&&(t._virtualization.rowHeight=this.#We,this.#We=void 0),this.#Ve=void 0,this.#je=void 0,this.#Ue=void 0}}renderRow(e,t,i){if(!this.#Le||!this.config.cardRenderer)return;if(e.__isGroupRow)return;t.replaceChildren();const r=this.config.cardRenderer(e,i);t.className="data-grid-row responsive-card";const n=this.config.cardRowHeight;return t.style.height="auto"===n||void 0===n?"auto":`${this.#Ye()}px`,t.appendChild(r),!0}onKeyDown(e){if(!this.#Le)return!1;if(this.config.cardRenderer){if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.key))return!1}const t=this.rows.length-1,i=this.visibleColumns.length-1;switch(e.key){case"ArrowDown":if(this.grid._focusCol<i)return this.grid._focusCol+=1,e.preventDefault(),l(this.#f),!0;if(this.grid._focusRow<t)return this.grid._focusRow+=1,this.grid._focusCol=0,e.preventDefault(),l(this.#f),!0;break;case"ArrowUp":if(this.grid._focusCol>0)return this.grid._focusCol-=1,e.preventDefault(),l(this.#f),!0;if(this.grid._focusRow>0)return this.grid._focusRow-=1,this.grid._focusCol=i,e.preventDefault(),l(this.#f),!0;break;case"ArrowRight":if(this.grid._focusRow<t)return this.grid._focusRow+=1,e.preventDefault(),l(this.#f),!0;break;case"ArrowLeft":if(this.grid._focusRow>0)return this.grid._focusRow-=1,e.preventDefault(),l(this.#f),!0}return!1}#Ve;#je;#Ue;#Ye(){if(this.#Ve&&this.#Ve>0)return this.#Ve;const e=this.config.cardRowHeight;return"number"==typeof e&&e>0?e:80}#Ze(){return this.#je&&this.#je>0?this.#je:this.#We??28}#Qe(){for(const e of this.rows)if(e.__isGroupRow)return!0;return!1}getRowHeight(e,t){if(this.#Le&&this.config.cardRenderer)return e.__isGroupRow?this.#Ze():this.#Ye()}#Xe(){let e=0;for(const t of this.rows)t.__isGroupRow||e++;return e}#Je=!1;#Be(){if(!this.#Le)return;let e=!1;const t=this.#f,i=this.#Qe(),r=this.#Xe();if(r!==this.#Ue&&(this.#Ue=r,e=!0),i){const t=this.gridElement.querySelector(".data-grid-row.group-row");if(t){const i=t.getBoundingClientRect().height;i>0&&i!==this.#je&&(this.#je=i,e=!0)}}const n=this.config.cardRenderer?".data-grid-row.responsive-card":".data-grid-row:not(.group-row)",o=this.gridElement.querySelector(n);if(o){const r=o.getBoundingClientRect().height;r>0&&r!==this.#Ve&&(this.#Ve=r,e=!0,!i&&t._virtualization&&(t._virtualization.rowHeight=r))}e&&!this.#Je&&(this.#Je=!0,queueMicrotask(()=>{this.#Je=!1,this.grid&&this.#Le&&this.#f.refreshVirtualWindow?.(!0,!0)}))}}function Ui(e){const t=/* @__PURE__ */new Set(["cell","row","column","range"]);if("string"==typeof e){if(!t.has(e))throw new Error(`[SelectionPlugin] Invalid selection mode: "${e}". Expected one of: 'cell' | 'row' | 'column' | 'range'.`);return{primary:e,columnEnabled:"column"===e,bothAxes:!1}}if(!Array.isArray(e))throw new Error(`[SelectionPlugin] Invalid selection mode: expected string or array, got ${typeof e}.`);if(0===e.length)throw new Error("[SelectionPlugin] Invalid selection mode: array must contain at least one mode.");for(const r of e)if(!t.has(r))throw new Error(`[SelectionPlugin] Invalid selection mode in array: "${r}". Expected one of: 'cell' | 'row' | 'column' | 'range'.`);if(new Set(e).size!==e.length)throw new Error(`[SelectionPlugin] Invalid selection mode: array contains duplicate entries (${e.join(", ")}).`);if(1===e.length)return Ui(e[0]);if(e.length>2)throw new Error(`[SelectionPlugin] Invalid selection mode: arrays of more than 2 modes are not supported. Got [${e.join(", ")}].`);if(!e.includes("column"))throw new Error(`[SelectionPlugin] Invalid selection mode: [${e.join(", ")}]. Two-mode arrays must include 'column' (the only valid combinations are ['row','column'], ['cell','column'], ['range','column']). Other in-row modes don't compose meaningfully.`);const i=e.find(e=>"column"!==e);if("column"===i)throw new Error(`[SelectionPlugin] Invalid selection mode: [${e.join(", ")}].`);return{primary:i,columnEnabled:!0,bothAxes:!0}}function Yi(e){const t=[];for(const i of e)!0!==i.utility&&"string"==typeof i.field&&i.field.length>0&&t.push(i.field);return t}function Zi(e,t){return t.indexOf(e)}function Qi(e){return{startRow:Math.min(e.startRow,e.endRow),startCol:Math.min(e.startCol,e.endCol),endRow:Math.max(e.startRow,e.endRow),endCol:Math.max(e.startCol,e.endCol)}}function Xi(e){const t=Qi(e);return{from:{row:t.startRow,col:t.startCol},to:{row:t.endRow,col:t.endCol}}}function Ji(e,t,i){return i.some(i=>function(e,t,i){const r=Qi(i);return e>=r.startRow&&e<=r.endRow&&t>=r.startCol&&t<=r.endCol}(e,t,i))}function er(e){const t=[],i=Qi(e);for(let r=i.startRow;r<=i.endRow;r++)for(let e=i.startCol;e<=i.endCol;e++)t.push({row:r,col:e});return t}function tr(e,t){return{startRow:e.row,startCol:e.col,endRow:t.row,endCol:t.col}}function ir(e,t){const i=Qi(e),r=Qi(t);return i.startRow===r.startRow&&i.startCol===r.startCol&&i.endRow===r.endRow&&i.endCol===r.endCol}function rr(e){if("string"==typeof e)return e;if(Array.isArray(e)){const t=e.find(e=>"column"!==e);if(t)return t;if(e.includes("column"))return"column"}return"cell"}const nr="__tbw_checkbox";class or extends i{static manifest={queries:[{type:"getSelection",description:"Get the current selection state"},{type:"selectRows",description:"Select specific rows by index (row mode only)"},{type:"getSelectedRowIndices",description:"Get sorted array of selected row indices"},{type:"getSelectedRows",description:"Get actual row objects for the current selection (works in all modes)"},{type:"getSelectedColumns",description:"Get field names of selected columns (column mode only)"},{type:"selectColumns",description:"Select specific columns by field name (column mode only)"}],configRules:[{id:"selection/range-dblclick",severity:"warn",message:'"triggerOn: \'dblclick\'" has no effect when mode is "range".\n → Range selection uses drag interaction (mousedown → mousemove), not click events.\n → The "triggerOn" option only affects "cell" and "row" selection modes.',check:e=>"range"===rr(e.mode)&&"dblclick"===e.triggerOn},{id:"selection/column-checkbox",severity:"warn",message:'"checkbox: true" only renders in row mode.\n → Column selection has no checkbox UI; activate columns via Ctrl+Click on a header or Ctrl+Space on a focused cell.',check:e=>!!e.checkbox&&"row"!==rr(e.mode)}]};name="selection";styles='@layer tbw-plugins{tbw-grid{&.selecting .data-grid-row>.cell{user-select:none}&:has(.selection){user-select:none;&[data-selection-mode=row] .cell-focus,&[data-selection-mode=row] .row-focus,&[data-selection-mode=range] .cell-focus{outline:none}}.data-grid-row.row-focus{background-color:var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%));outline:none;position:relative;&:after{content:"";position:absolute;inset:0;pointer-events:none;border-width:0;border-style:var(--tbw-selection-border-style, var(--tbw-border-style));border-color:var(--tbw-range-border-color, var(--tbw-color-accent));border-top-width:var(--tbw-selection-border-width, var(--tbw-border-width));border-bottom-width:var(--tbw-selection-border-width, var(--tbw-border-width));z-index:26}+.data-grid-row.row-focus:after{border-top-width:0}&:has(+.data-grid-row.row-focus):after{border-bottom-width:0}>.cell.sticky-left,>.cell.sticky-right{background:linear-gradient(var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}}.data-grid-row.row-focus[data-selectable=false]{>.cell.sticky-left,>.cell.sticky-right{background:var(--tbw-color-row-alt)}}.data-grid-row>.cell.selected{background-color:var(--tbw-range-selection-bg);position:relative;&:after{content:"";position:absolute;inset:0;pointer-events:none;border:0 var(--tbw-selection-border-style, var(--tbw-border-style)) var(--tbw-range-border-color);z-index:1}&.top:after{border-top-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.bottom:after{border-bottom-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.first:after{border-left-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.last:after{border-right-width:var(--tbw-selection-border-width, var(--tbw-border-width))}}.data-grid-row[data-selectable=false]{cursor:not-allowed;opacity:.6;&.row-focus{background-color:var(--tbw-color-row-alt)}}.data-grid-row>.cell[data-selectable=false]{cursor:not-allowed;opacity:.6;&.selected{background-color:var(--tbw-selection-warning-bg, rgba(from var(--tbw-color-error) r g b / 50%))}}.tbw-selection-summary{font-size:var(--tbw-font-size-sm, .8125rem);color:var(--tbw-color-fg-muted);white-space:nowrap}.data-grid-row>.cell[data-field=__tbw_checkbox],.header-row>.cell[data-field=__tbw_checkbox]{text-align:center;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}.tbw-select-row-checkbox{pointer-events:none;margin:0;cursor:pointer}.tbw-checkbox-header{display:flex;justify-content:center;align-items:center;height:100%}.tbw-select-all-checkbox{margin:0;cursor:pointer}.header-row>.cell.column-selected,.data-grid-row>.cell.column-selected{background:linear-gradient(var(--tbw-column-selection-bg, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}.data-grid-row>.cell.column-selected.sticky-left,.data-grid-row>.cell.column-selected.sticky-right,.header-row>.cell.column-selected.sticky-left,.header-row>.cell.column-selected.sticky-right{background:linear-gradient(var(--tbw-column-selection-bg, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}}}';get defaultConfig(){return{mode:"cell",triggerOn:"click",enabled:!0,multiSelect:!0}}selected=/* @__PURE__ */new Set;lastSelected=null;anchor=null;ranges=[];activeRange=null;cellAnchor=null;isDragging=!1;pendingKeyboardUpdate=null;pendingRowKeyUpdate=null;selectedCell=null;selectedColumns=/* @__PURE__ */new Set;columnAnchor=null;columnHead=null;activeAxis="none";#et={primary:"cell",columnEnabled:!1,bothAxes:!1};lastSyncedFocusRow=-1;lastSyncedFocusCol=-1;announceTimer=null;explicitSelection=!1;isSelectionEnabled(){return!1!==this.config.enabled&&!1!==this.grid.effectiveConfig?.selectable}checkSelectable(e,t){const{isSelectable:i}=this.config;if(!i)return!0;const r=this.rows[e];if(!r)return!1;return i(r,e,void 0!==t?this.visibleColumns[t]:void 0,t)}isRowSelectable(e){return this.checkSelectable(e)}isCellSelectable(e,t){return this.checkSelectable(e,t)}attach(e){super.attach(e),this.#et=Ui(this.config.mode),this.on("filter-change",()=>this.clearSelectionSilent()),this.on("group-toggle",()=>this.clearSelectionSilent()),this.on("tree-expand",()=>this.clearSelectionSilent()),this.on("sort-change",()=>this.clearSelectionSilent()),this.on("edit-open",({rowIndex:e,row:t})=>{this.isSelectionEnabled()&&(null==t||e<0||"row"===this.#et.primary&&this.isRowSelectable(e)&&(this.selected.has(e)||(!1===this.config.multiSelect&&this.selected.clear(),this.selected.add(e),this.lastSelected=e,this.anchor=e,this.explicitSelection=!0,this.emit("selection-change",this.#tt()),this.requestAfterRender())))});let t=-1;e.addEventListener("data-change",e=>{const{sourceRowCount:i}=e.detail,r=this.selected.size>0||this.ranges.length>0||null!==this.selectedCell;-1!==t&&i!==t&&r&&this.clearSelectionSilent(),t=i},{signal:this.disconnectSignal})}handleQuery(e){if("getSelection"===e.type)return this.getSelection();if("getSelectedRowIndices"===e.type)return this.getSelectedRowIndices();if("getSelectedRows"===e.type)return this.getSelectedRows();if("selectRows"===e.type)return this.selectRows(e.context),!0;if("getSelectedColumns"===e.type)return this.getSelectedColumns();if("selectColumns"===e.type){const t=e.context;return this.#it(t),!0}}detach(){const e=this.gridElement?.querySelector(".rows-body");e?.removeAttribute("aria-multiselectable"),this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.isDragging=!1,this.selectedCell=null,this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.pendingKeyboardUpdate=null,this.pendingRowKeyUpdate=null,this.lastSyncedFocusRow=-1,this.lastSyncedFocusCol=-1}clearSelectionSilent(){this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.selectedCell=null,this.lastSelected=null,this.anchor=null,this.lastSyncedFocusRow=-1,this.lastSyncedFocusCol=-1,"column"!==this.activeAxis&&(this.activeAxis="none"),this.requestAfterRender()}onCellClick(e){if(!this.isSelectionEnabled())return!1;const{rowIndex:t,colIndex:i,originalEvent:r}=e,{triggerOn:n="click"}=this.config,o=this.#et.primary;if(r.type!==n)return!1;const s=e.column,l=s&&at(s);if("cell"===o){if(l)return!1;if(!this.isCellSelectable(t,i))return!1;const e=this.selectedCell;return e&&e.row===t&&e.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#tt()),this.requestAfterRender()),!1}if("row"===o){if(!this.isRowSelectable(t))return!1;const e=!1!==this.config.multiSelect,i=r.shiftKey&&e,n=(r.ctrlKey||r.metaKey)&&e,o=!0===s?.checkboxColumn;if(i&&null!==this.anchor){const e=Math.min(this.anchor,t),i=Math.max(this.anchor,t);n||this.selected.clear();for(let t=e;t<=i;t++)this.isRowSelectable(t)&&this.selected.add(t)}else if(n||o&&e)this.selected.has(t)?this.selected.delete(t):this.selected.add(t),this.anchor=t;else{if(1===this.selected.size&&this.selected.has(t))return!1;this.selected.clear(),this.selected.add(t),this.anchor=t}return this.lastSelected=t,this.explicitSelection=!0,this.emit("selection-change",this.#tt()),this.requestAfterRender(),!1}if("range"===o){if(l)return!1;if(!this.isCellSelectable(t,i))return!1;const e=r.shiftKey,n=(r.ctrlKey||r.metaKey)&&!1!==this.config.multiSelect;if(e&&this.cellAnchor){const e=tr(this.cellAnchor,{row:t,col:i}),r=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;if(r&&ir(r,e))return!1;n?this.ranges.length>0?this.ranges[this.ranges.length-1]=e:this.ranges.push(e):this.ranges=[e],this.activeRange=e}else if(n){const e={startRow:t,startCol:i,endRow:t,endCol:i};this.ranges.push(e),this.activeRange=e,this.cellAnchor={row:t,col:i}}else{const e={startRow:t,startCol:i,endRow:t,endCol:i};if(1===this.ranges.length&&ir(this.ranges[0],e))return!1;this.ranges=[e],this.activeRange=e,this.cellAnchor={row:t,col:i}}return this.emit("selection-change",this.#tt()),this.requestAfterRender(),!1}return!1}onKeyDown(e){if(!this.isSelectionEnabled())return!1;const t=this.#et.primary,i=this.#et.columnEnabled,r=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","Home","End","PageUp","PageDown"].includes(e.key);if(i&&(e.ctrlKey||e.metaKey)&&(" "===e.key||"Spacebar"===e.key)){const t=this.grid._focusCol,i=this.visibleColumns[t];if(i&&!at(i)&&"string"==typeof i.field)return e.preventDefault(),e.stopPropagation(),this.selectColumn(i.field,{toggle:!0}),!0}if(i&&"column"===this.activeAxis&&!1!==this.config.multiSelect&&(e.ctrlKey||e.metaKey)&&e.shiftKey&&("ArrowLeft"===e.key||"ArrowRight"===e.key)){const t=Yi(this.visibleColumns),i="ArrowLeft"===e.key?"left":"right",r=function(e,t,i){if(0===t.length)return null;if(null===e)return null;const r=Zi(e,t);if(r<0)return null;const n="left"===i?Math.max(0,r-1):Math.min(t.length-1,r+1);return n===r?null:t[n]}(this.columnHead,t,i);if(null!==r&&null!==this.columnAnchor)return e.preventDefault(),e.stopPropagation(),this.selectColumn(r,{range:!0}),!0}if("Escape"===e.key){return!this.grid.query("isEditing").some(Boolean)&&("column"===this.activeAxis?(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.emit("selection-change",this.#tt()),this.requestAfterRender(),!0):("cell"===t?this.selectedCell=null:"row"===t?(this.selected.clear(),this.anchor=null):"range"===t&&(this.ranges=[],this.activeRange=null,this.cellAnchor=null),this.emit("selection-change",this.#tt()),this.requestAfterRender(),!0))}if("cell"===t&&r)return queueMicrotask(()=>{const e=this.grid._focusRow,t=this.grid._focusCol;this.isCellSelectable(e,t)?this.selectedCell={row:e,col:t}:this.selectedCell=null,this.emit("selection-change",this.#tt()),this.requestAfterRender()}),!1;if("row"===t){const t=!1!==this.config.multiSelect;if("ArrowUp"===e.key||"ArrowDown"===e.key||"PageUp"===e.key||"PageDown"===e.key||(e.ctrlKey||e.metaKey)&&("Home"===e.key||"End"===e.key)){const i=e.shiftKey&&t;return i&&null===this.anchor&&(this.anchor=this.grid._focusRow),this.explicitSelection=!0,this.pendingRowKeyUpdate={shiftKey:i},queueMicrotask(()=>this.requestAfterRender()),!1}if(t&&"a"===e.key&&(e.ctrlKey||e.metaKey)){return!this.grid.query("isEditing").some(Boolean)&&(e.preventDefault(),e.stopPropagation(),this.selectAll(),!0)}}if("range"===t&&r){const t="Tab"===e.key,i=e.shiftKey&&!t;return i&&!this.cellAnchor&&(this.cellAnchor={row:this.grid._focusRow,col:this.grid._focusCol}),this.pendingKeyboardUpdate={shiftKey:i},queueMicrotask(()=>this.requestAfterRender()),!1}if("range"===t&&!1!==this.config.multiSelect&&"a"===e.key&&(e.ctrlKey||e.metaKey)){return!this.grid.query("isEditing").some(Boolean)&&(e.preventDefault(),e.stopPropagation(),this.selectAll(),!0)}return!1}onCellMouseDown(e){if(!this.isSelectionEnabled())return;if("range"!==this.#et.primary)return;if(void 0===e.rowIndex||void 0===e.colIndex)return;if(e.rowIndex<0)return;if(e.column&&at(e.column))return;if(!this.isCellSelectable(e.rowIndex,e.colIndex))return;if(e.originalEvent.shiftKey&&this.cellAnchor)return;this.isDragging=!0;const t=e.rowIndex,i=e.colIndex,r=(e.originalEvent.ctrlKey||e.originalEvent.metaKey)&&!1!==this.config.multiSelect,n={startRow:t,startCol:i,endRow:t,endCol:i};return!r&&1===this.ranges.length&&ir(this.ranges[0],n)?(this.cellAnchor={row:t,col:i},!0):(this.cellAnchor={row:t,col:i},r||(this.ranges=[]),this.ranges.push(n),this.activeRange=n,this.emit("selection-change",this.#tt()),this.requestAfterRender(),!0)}onCellMouseMove(e){if(!this.isSelectionEnabled())return;if("range"!==this.#et.primary)return;if(!this.isDragging||!this.cellAnchor)return;if(void 0===e.rowIndex||void 0===e.colIndex)return;if(e.rowIndex<0)return;let t=e.colIndex;const i=this.visibleColumns[t];if(i&&at(i)){const e=this.visibleColumns.findIndex(e=>!at(e));e>=0&&(t=e)}const r=tr(this.cellAnchor,{row:e.rowIndex,col:t}),n=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;return n&&ir(n,r)||(this.ranges.length>0?this.ranges[this.ranges.length-1]=r:this.ranges.push(r),this.activeRange=r,this.emit("selection-change",this.#tt()),this.requestAfterRender()),!0}onCellMouseUp(e){if(this.isSelectionEnabled()&&"range"===this.#et.primary)return this.isDragging?(this.isDragging=!1,!0):void 0}onHeaderClick(e){if(!this.isSelectionEnabled())return!1;if(!this.#et.columnEnabled)return!1;if(e.column&&at(e.column))return!1;const t=e.originalEvent;if(!(t.ctrlKey||t.metaKey))return!1;const i=e.field;if(!i)return!1;t.preventDefault(),"function"==typeof t.stopPropagation&&t.stopPropagation();const r=!0===t.shiftKey&&!1!==this.config.multiSelect&&null!==this.columnAnchor;return this.selectColumn(i,r?{range:!0}:{toggle:!0}),!0}processColumns(e){if(this.config.checkbox&&"row"===this.#et.primary){if(e.some(e=>e.field===nr))return e;const t=this.#rt(),i=e.findIndex(lt),r=i>=0?i+1:0;return[...e.slice(0,r),t,...e.slice(r)]}return e}#rt(){return{field:nr,header:"",width:32,resizable:!1,sortable:!1,lockPosition:!0,utility:!0,checkboxColumn:!0,headerRenderer:()=>{const e=document.createElement("div");if(e.className="tbw-checkbox-header",!1===this.config.multiSelect)return e;const t=document.createElement("input");return t.type="checkbox",t.className="tbw-select-all-checkbox",t.addEventListener("click",e=>{e.stopPropagation(),e.target.checked?this.selectAll():this.clearSelection()}),e.appendChild(t),e},renderer:e=>{const t=document.createElement("input");t.type="checkbox",t.className="tbw-select-row-checkbox";const i=e.cellEl;if(i){const e=parseInt(i.getAttribute("data-row")??"-1",10);e>=0&&(t.checked=this.selected.has(e))}return t}}}#nt(e){e.querySelectorAll(".tbw-select-row-checkbox").forEach(e=>{const t=e.closest(".cell"),i=t?T(t):-1;i>=0&&(e.checked=this.selected.has(i))});const t=e.querySelector(".tbw-select-all-checkbox");if(t){const e=this.rows.length;let i=0;if(this.config.isSelectable)for(let t=0;t<e;t++)this.isRowSelectable(t)&&i++;else i=e;const r=i>0&&this.selected.size>=i,n=this.selected.size>0;t.checked=r,t.indeterminate=n&&!r}}#ot(e){const t=this.grid._focusRow,i=this.grid._focusCol;if("row"===e){if(this.explicitSelection)return this.explicitSelection=!1,void(this.lastSyncedFocusRow=t);t!==this.lastSyncedFocusRow&&(this.lastSyncedFocusRow=t,this.isRowSelectable(t)&&(this.selected.has(t)&&1===this.selected.size||(this.selected.clear(),this.selected.add(t),this.lastSelected=t,this.anchor=t,this.emit("selection-change",this.#tt()))))}if("cell"===e){if(this.explicitSelection)return this.explicitSelection=!1,this.lastSyncedFocusRow=t,void(this.lastSyncedFocusCol=i);if((t!==this.lastSyncedFocusRow||i!==this.lastSyncedFocusCol)&&(this.lastSyncedFocusRow=t,this.lastSyncedFocusCol=i,this.isCellSelectable(t,i))){const e=this.selectedCell;e&&e.row===t&&e.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#tt()))}}}#st(){const e=this.gridElement;if(!e)return;const t=this.#et.primary,i=this.#et.columnEnabled,r=!!this.config.isSelectable,n=e.querySelector(".rows-body");if(n){const e=!1!==this.config.multiSelect;n.setAttribute("aria-multiselectable",e?"true":"false")}e.querySelectorAll(".cell").forEach(e=>{const t=e.classList.contains(w.SELECTED)||e.classList.contains("column-selected");e.classList.remove(w.SELECTED,"top","bottom","first","last","column-selected"),t&&e.removeAttribute("aria-selected"),r&&e.removeAttribute("data-selectable")});const o=e.querySelectorAll(".data-grid-row");if(o.forEach(e=>{e.classList.remove(w.SELECTED,"row-focus"),e.setAttribute("aria-selected","false"),r&&e.removeAttribute("data-selectable")}),i){e.querySelectorAll(".header-row > .cell").forEach(e=>{e.classList.remove("column-selected"),e.removeAttribute("aria-selected")})}if("row"===t&&(L(e),o.forEach(e=>{const t=e.querySelector(".cell[data-row]"),i=T(t);i>=0&&(r&&!this.isRowSelectable(i)&&e.setAttribute("data-selectable","false"),this.selected.has(i)&&(e.classList.add(w.SELECTED,"row-focus"),e.setAttribute("aria-selected","true")))}),this.config.checkbox&&this.#nt(e)),("cell"===t||"range"===t)&&r){e.querySelectorAll(".cell[data-row][data-col]").forEach(e=>{const t=parseInt(e.getAttribute("data-row")??"-1",10),i=parseInt(e.getAttribute("data-col")??"-1",10);t>=0&&i>=0&&(this.isCellSelectable(t,i)||e.setAttribute("data-selectable","false"))})}if("range"===t&&this.ranges.length>0){L(e);const t=this.ranges.map(Qi),i=(e,i)=>{for(const r of t)if(e>=r.startRow&&e<=r.endRow&&i>=r.startCol&&i<=r.endCol)return!0;return!1};e.querySelectorAll(".cell[data-row][data-col]").forEach(e=>{const t=parseInt(e.getAttribute("data-row")??"-1",10),r=parseInt(e.getAttribute("data-col")??"-1",10);if(t>=0&&r>=0){const n=this.visibleColumns[r];if(n&&at(n))return;i(t,r)&&(e.classList.add(w.SELECTED),e.setAttribute("aria-selected","true"),i(t-1,r)||e.classList.add("top"),i(t+1,r)||e.classList.add("bottom"),i(t,r-1)||e.classList.add("first"),i(t,r+1)||e.classList.add("last"))}})}if(i&&this.selectedColumns.size>0){const t=this.visibleColumns.map(e=>"string"==typeof e.field?e.field:void 0);e.querySelectorAll(".header-row > .cell[data-col]").forEach(e=>{const i=parseInt(e.getAttribute("data-col")??"-1",10),r=i>=0?t[i]:void 0;r&&this.selectedColumns.has(r)&&(e.classList.add("column-selected"),e.setAttribute("aria-selected","true"))});e.querySelectorAll(".cell[data-col]:not(.header-row .cell)").forEach(e=>{if(e.closest(".header-row"))return;const i=parseInt(e.getAttribute("data-col")??"-1",10);if(i<0)return;const r=this.visibleColumns[i];if(!r||at(r))return;const n=t[i];n&&this.selectedColumns.has(n)&&(e.classList.add("column-selected"),e.setAttribute("aria-selected","true"))})}}afterRender(){if(!this.isSelectionEnabled())return;const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-grid-root"),i=this.#et.primary;if(this.pendingRowKeyUpdate&&"row"===i){const{shiftKey:e}=this.pendingRowKeyUpdate;this.pendingRowKeyUpdate=null;const t=this.grid._focusRow;if(e&&null!==this.anchor){this.selected.clear();const e=Math.min(this.anchor,t),i=Math.max(this.anchor,t);for(let t=e;t<=i;t++)this.isRowSelectable(t)&&this.selected.add(t)}else this.isRowSelectable(t)?(this.selected.clear(),this.selected.add(t),this.anchor=t):this.selected.clear();this.lastSelected=t,this.emit("selection-change",this.#tt())}if(this.pendingKeyboardUpdate&&"range"===i){const{shiftKey:e}=this.pendingKeyboardUpdate;this.pendingKeyboardUpdate=null;const t=this.grid._focusRow,i=this.grid._focusCol;if(e&&this.cellAnchor){const e=tr(this.cellAnchor,{row:t,col:i});this.ranges=[e],this.activeRange=e}else e||(this.ranges=[],this.activeRange=null,this.cellAnchor={row:t,col:i});this.emit("selection-change",this.#tt())}this.#ot(i),this.gridElement.setAttribute("data-selection-mode",i),t&&t.classList.toggle("selecting",this.isDragging),this.#st()}onScrollRender(){this.isSelectionEnabled()&&this.#st()}getSelection(){const e=this.#tt();return{mode:this.config.mode,activeAxis:e.activeAxis,ranges:e.ranges,selectedColumns:e.selectedColumns,anchor:this.cellAnchor}}getSelectedCells(){return function(e){const t=/* @__PURE__ */new Map;for(const i of e)for(const e of er(i))t.set(`${e.row},${e.col}`,e);return[...t.values()]}(this.ranges)}isCellSelected(e,t){return Ji(e,t,this.ranges)}selectAll(){const{mode:e,multiSelect:t}=this.config;if(!1!==t)if("row"===e){this.selected.clear();for(let e=0;e<this.rows.length;e++)this.isRowSelectable(e)&&this.selected.add(e);this.explicitSelection=!0,this.emit("selection-change",this.#tt()),this.requestAfterRender()}else if("range"===e){const e=this.rows.length,t=this.columns.length;if(e>0&&t>0){const i={startRow:0,startCol:0,endRow:e-1,endCol:t-1};this.ranges=[i],this.activeRange=i,this.emit("selection-change",this.#tt()),this.requestAfterRender()}}}selectRows(e){if("row"!==this.#et.primary)return;const t=!1===this.config.multiSelect&&e.length>1?[e[e.length-1]]:e;this.selected.clear();for(const i of t)i>=0&&i<this.rows.length&&this.isRowSelectable(i)&&this.selected.add(i);this.anchor=t.length>0?t[t.length-1]:null,this.explicitSelection=!0,this.emit("selection-change",this.#tt()),this.requestAfterRender()}getSelectedRowIndices(){return[...this.selected].sort((e,t)=>e-t)}getSelectedRows(){const e=this.#et.primary,t=this.rows;if("row"===e)return this.getSelectedRowIndices().filter(e=>e>=0&&e<t.length).map(e=>t[e]);if("cell"===e&&this.selectedCell){const{row:e}=this.selectedCell;return e>=0&&e<t.length?[t[e]]:[]}if("range"===e&&this.ranges.length>0){const e=/* @__PURE__ */new Set;for(const i of this.ranges){const r=Math.max(0,Math.min(i.startRow,i.endRow)),n=Math.min(t.length-1,Math.max(i.startRow,i.endRow));for(let t=r;t<=n;t++)e.add(t)}return[...e].sort((e,t)=>e-t).map(e=>t[e])}return[]}#it(e){if(!this.#et.columnEnabled)return;const t=Yi(this.visibleColumns),i=new Set(t),r=[],n=/* @__PURE__ */new Set;for(const s of e)i.has(s)&&!n.has(s)&&(n.add(s),r.push(s));this.#lt("column"),this.selectedColumns.clear();for(const s of r)this.selectedColumns.add(s);const o=r.length>0?r[r.length-1]:null;this.columnAnchor=o,this.columnHead=o,this.activeAxis=this.selectedColumns.size>0?"column":"none",this.emit("selection-change",this.#tt()),this.requestAfterRender()}selectColumn(e,t={}){if(!this.#et.columnEnabled)return;const i=Yi(this.visibleColumns);if(!i.includes(e))return;this.#lt("column");if(!1!==this.config.multiSelect)if(t.range&&this.columnAnchor){const t=function(e,t,i){const r=Zi(e,i),n=Zi(t,i);if(-1===r||-1===n)return[];const o=Math.min(r,n),s=Math.max(r,n);return i.slice(o,s+1)}(this.columnAnchor,e,i);this.selectedColumns.clear();for(const e of t)this.selectedColumns.add(e);this.columnHead=e}else t.toggle?(this.selectedColumns.has(e)?this.selectedColumns.delete(e):this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e):(this.selectedColumns.clear(),this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e);else this.selectedColumns.clear(),this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e;this.activeAxis=this.selectedColumns.size>0?"column":"none",this.emit("selection-change",this.#tt()),this.requestAfterRender()}deselectColumn(e){this.#et.columnEnabled&&this.selectedColumns.delete(e)&&(0===this.selectedColumns.size&&(this.columnAnchor=null,this.columnHead=null,"column"===this.activeAxis&&(this.activeAxis="none")),this.emit("selection-change",this.#tt()),this.requestAfterRender())}selectAllColumns(){if(!this.#et.columnEnabled)return;if(!1===this.config.multiSelect)return;const e=Yi(this.visibleColumns);if(0!==e.length){this.#lt("column"),this.selectedColumns.clear();for(const t of e)this.selectedColumns.add(t);this.columnAnchor=e[0],this.columnHead=e[e.length-1],this.activeAxis="column",this.emit("selection-change",this.#tt()),this.requestAfterRender()}}clearColumnSelection(){0!==this.selectedColumns.size&&(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,"column"===this.activeAxis&&(this.activeAxis="none"),this.emit("selection-change",this.#tt()),this.requestAfterRender())}getSelectedColumns(){if(0===this.selectedColumns.size)return[];return Yi(this.visibleColumns).filter(e=>this.selectedColumns.has(e))}clearSelection(){this.selectedCell=null,this.selected.clear(),this.anchor=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.emit("selection-change",this.#tt()),this.requestAfterRender()}setRanges(e){this.ranges=e.map(e=>({startRow:e.from.row,startCol:e.from.col,endRow:e.to.row,endCol:e.to.col})),this.activeRange=this.ranges.length>0?this.ranges[this.ranges.length-1]:null,this.emit("selection-change",this.#tt()),this.requestAfterRender()}#tt(){const e=this.#et.primary,t="row"===e&&this.selected.size>0||"cell"===e&&null!==this.selectedCell||"range"===e&&this.ranges.length>0;let i;this.#et.bothAxes&&t&&this.selectedColumns.size>0&&(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.gridElement&&a(this.gridElement,d(this.gridElement,"selectionAxisChanged","row"))),i=t?"row"===e?"row":"cell"===e?"cell":"range":this.selectedColumns.size>0?"column":"none",this.activeAxis=i;const r=function(e,t,i,r,n,o){if("column"===t&&r.selectedColumns.size>0)return{mode:e,activeAxis:"column",ranges:[],selectedColumns:o.filter(e=>r.selectedColumns.has(e))};if("cell"===i&&r.selectedCell)return{mode:e,activeAxis:"cell",ranges:[{from:{row:r.selectedCell.row,col:r.selectedCell.col},to:{row:r.selectedCell.row,col:r.selectedCell.col}}],selectedColumns:[]};if("row"===i&&r.selected.size>0){const t=[...r.selected].sort((e,t)=>e-t),i=[];let o=t[0],s=o;for(let e=1;e<t.length;e++)t[e]===s+1?s=t[e]:(i.push({from:{row:o,col:0},to:{row:s,col:n-1}}),o=t[e],s=o);return i.push({from:{row:o,col:0},to:{row:s,col:n-1}}),{mode:e,activeAxis:"row",ranges:i,selectedColumns:[]}}return"range"===i&&r.ranges.length>0?{mode:e,activeAxis:"range",ranges:(s=r.ranges,s.map(Xi)),selectedColumns:[]}:{mode:e,activeAxis:"none",ranges:[],selectedColumns:[]};var s}(this.config.mode,i,e,{selectedCell:this.selectedCell,selected:this.selected,ranges:this.ranges,selectedColumns:this.selectedColumns},this.columns.length,Yi(this.visibleColumns));return this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=setTimeout(()=>{if("column"===r.activeAxis){const e=r.selectedColumns;if(1===e.length){const t=e[0],i=this.columns.find(e=>e.field===t),r="string"==typeof i?.header&&i.header||t;a(this.gridElement,d(this.gridElement,"columnSelected",r))}else e.length>1?a(this.gridElement,d(this.gridElement,"columnSelectionChanged",e.length)):a(this.gridElement,d(this.gridElement,"columnSelectionCleared"))}else{const e="row"===r.activeAxis?this.selected.size:r.ranges.length;e>0&&a(this.gridElement,d(this.gridElement,"selectionChanged",e))}},150),r}#lt(e){if(this.#et.bothAxes&&"column"===e){if(!(this.selected.size>0||null!==this.selectedCell||this.ranges.length>0))return;this.selected.clear(),this.lastSelected=null,this.anchor=null,this.selectedCell=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.gridElement&&a(this.gridElement,d(this.gridElement,"selectionAxisChanged","column"))}}}function sr(e,t){return Math.floor(e/t)}function lr(){return new DOMException("Aborted","AbortError")}function ar(e,t,i,r,n){const o=function(e,t){return{start:e*t,end:(e+1)*t}}(t,i);return function(e,t){return t.aborted?Promise.reject(lr()):"object"!=typeof(i=e)||null===i||"function"!=typeof i.subscribe||"function"==typeof i.then?new Promise((i,r)=>{const n=()=>r(lr());t.addEventListener("abort",n,{once:!0}),Promise.resolve(e).then(e=>{t.removeEventListener("abort",n),i(e)},e=>{t.removeEventListener("abort",n),r(e)})}):new Promise((i,r)=>{let n=!1;const o=e.subscribe({next:e=>{n||(n=!0,i(e),o.unsubscribe())},error:e=>{n||(n=!0,r(e))},complete:()=>{n||(n=!0,r(new Error("getRows observable completed without emitting a value")))}});n||t.addEventListener("abort",()=>{n||(n=!0,o.unsubscribe(),r(lr()))},{once:!0})});var i}(e.getRows({startNode:o.start,endNode:o.end,sortModel:r.sortModel,filterModel:r.filterModel,signal:n}),n)}function dr(e,t,i){const r=sr(e,t),n=i.get(r);if(!n)return;return n[e%t]}class cr extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:-10},incompatibleWith:[{name:"pivot",reason:"PivotPlugin requires the full dataset to compute aggregations. ServerSidePlugin lazy-loads rows in blocks, so pivot aggregation cannot be performed client-side."}],events:[{type:"datasource:data",description:"Root data page/block loaded"},{type:"datasource:children",description:"Child data loaded for a parent context"},{type:"datasource:loading",description:"Loading state changed"},{type:"datasource:error",description:"Fetch operation failed"}],queries:[{type:"datasource:fetch-children",description:"Request child rows for a parent context"},{type:"datasource:is-active",description:"Check if ServerSide plugin has an active data source"}]};name="serverSide";get defaultConfig(){return{pageSize:100,cacheBlockSize:100,maxConcurrentRequests:2}}dataSource=null;totalNodeCount=0;infiniteScrollMode=!1;loadedBlocks=/* @__PURE__ */new Map;loadingBlocks=/* @__PURE__ */new Set;blockControllers=/* @__PURE__ */new Map;lastRequestId=0;scrollDebounceTimer;managedNodes=[];attach(e){super.attach(e),this.on("sort-change",()=>{"local"===this.config.sortMode?this.requestRender():this.onModelChange()}),this.on("filter-change",()=>{"local"===this.config.filterMode?this.requestRender():this.onModelChange()}),this.config.dataSource&&this.setDataSource(this.config.dataSource)}detach(){this.dataSource=null,this.totalNodeCount=0,this.infiniteScrollMode=!1,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.abortAllBlocks(),this.managedNodes=[],this.lastRequestId=0,this.scrollDebounceTimer&&(clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=void 0)}abortAllBlocks(){for(const e of this.blockControllers.values())e.abort();this.blockControllers.clear()}getEnrichmentParams(){const e="local"===this.config.sortMode,t="local"===this.config.filterMode,i=e?void 0:this.grid?.query?.("sort:get-model",null),r=t?void 0:this.grid?.query?.("filter:get-model",null);let n=i?.[0];const o=this.grid;if(!e&&!n&&o?._sortState){const{field:e,direction:t}=o._sortState;n=[{field:e,direction:1===t?"asc":"desc"}]}return{sortModel:n,filterModel:r?.[0]}}getViewportMapping(e,t){const i={viewportStart:e,viewportEnd:t},r=this.grid?.query?.("datasource:viewport-mapping",i);return r?.[0]?r[0]:{startNode:e,endNode:t,totalLoadedNodes:this.totalNodeCount}}onModelChange(){this.dataSource&&(this.abortAllBlocks(),this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1,this.requestRender(),this.loadRequiredBlocks())}applyServerResult(e,t,i){void 0!==e.lastNode?(this.totalNodeCount=e.lastNode+1,this.infiniteScrollMode=!1):-1===e.totalNodeCount?this.infiniteScrollMode=!0:(this.totalNodeCount=e.totalNodeCount,this.infiniteScrollMode=!1),this.infiniteScrollMode&&e.rows.length<i&&(this.totalNodeCount=t*i+e.rows.length,this.infiniteScrollMode=!1)}getInfiniteScrollEstimate(e){let t=0;for(const[i,r]of this.loadedBlocks){const n=i*e+r.length;n>t&&(t=n)}return t+e}loadRequiredBlocks(){if(!this.dataSource)return;const e=this.grid,t=this.config.cacheBlockSize??100,i=this.getViewportMapping(e._virtualization.start,e._virtualization.end),r=Math.max(0,this.config.loadThreshold??0),n=Math.max(0,i.startNode-r),o=this.totalNodeCount>0?this.totalNodeCount:1/0,s=Math.min(o,i.endNode+r);if(s<=n)return;const l=function(e,t,i){const r=sr(e,i),n=sr(t-1,i),o=[];for(let s=r;s<=n;s++)o.push(s);return o}(n,s,t),a=this.getEnrichmentParams(),d=this.grid?.getAttribute?.("id")??void 0;for(const c of l){if(this.loadedBlocks.has(c)||this.loadingBlocks.has(c))continue;if(this.loadingBlocks.size>=(this.config.maxConcurrentRequests??2)){F(q,"Concurrent request limit reached, deferring block load",d);break}this.loadingBlocks.add(c);const e=new AbortController;this.blockControllers.set(c,e),this.broadcast("datasource:loading",{loading:!0}),ar(this.dataSource,c,t,a,e.signal).then(i=>{if(this.blockControllers.delete(c),e.signal.aborted)return this.loadingBlocks.delete(c),void(0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1}));this.loadedBlocks.set(c,i.rows);const r=this.managedNodes.length;this.applyServerResult(i,c,t),this.loadingBlocks.delete(c);const n=c*t;for(let e=0;e<i.rows.length;e++)n+e<this.managedNodes.length&&(this.managedNodes[n+e]=i.rows[e]);const o={rows:i.rows,totalNodeCount:i.totalNodeCount,startNode:n,endNode:n+i.rows.length,claimed:!1};this.broadcast("datasource:data",o),0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1});0===r||this.managedNodes.length<(Number.isFinite(this.totalNodeCount)?this.totalNodeCount:0)?this.requestRender():this.requestVirtualRefresh(),this.loadRequiredBlocks()}).catch(t=>{if(this.blockControllers.delete(c),this.loadingBlocks.delete(c),e.signal.aborted)return void(0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1}));const i=t instanceof Error?t:new Error(String(t));k(G,`getRows() failed: ${i.message}`,d),this.broadcast("datasource:error",{error:i}),0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1})})}}processRows(e){if(!this.dataSource)return[...e];const t=this.config.cacheBlockSize??100,i=this.infiniteScrollMode?this.getInfiniteScrollEstimate(t):Number.isFinite(this.totalNodeCount)&&this.totalNodeCount>=0?this.totalNodeCount:0;for(;this.managedNodes.length<i;){const e=this.managedNodes.length;this.managedNodes.push({__loading:!0,__index:e})}this.managedNodes.length=i;for(let n=0;n<i;n++){const e=dr(n,t,this.loadedBlocks);e&&(this.managedNodes[n]=e)}const r=this.grid;if("local"===this.config.sortMode&&r?._sortState){const e=r._columns??[],t=(r.effectiveConfig?.sortHandler??D)(this.managedNodes,r._sortState,e);return t&&"function"==typeof t.then?(t.catch(()=>{}),this.managedNodes):t}return this.managedNodes}onScroll(e){this.dataSource&&(this.loadRequiredBlocks(),this.scrollDebounceTimer&&clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=setTimeout(()=>{this.loadRequiredBlocks()},100))}handleQuery(e){switch(e.type){case"datasource:is-active":return null!=this.dataSource;case"datasource:fetch-children":{const{context:t}=e.context;return void this.fetchChildren(t)}}}fetchChildren(t){if(!this.dataSource)return;const i=this.grid?.getAttribute?.("id")??void 0;if(!this.dataSource.getChildRows)return void e(M,`Plugin "${t.source}" requested child rows but getChildRows() is not implemented on the dataSource`,i);const r=this.getEnrichmentParams();this.broadcast("datasource:loading",{loading:!0,context:t}),this.dataSource.getChildRows({context:t,sortModel:r.sortModel,filterModel:r.filterModel}).then(e=>{const i={rows:e.rows,context:t,claimed:!1};this.broadcast("datasource:children",i),this.broadcast("datasource:loading",{loading:!1,context:t})}).catch(e=>{const r=e instanceof Error?e:new Error(String(e));k(N,`getChildRows() failed: ${r.message}`,i),this.broadcast("datasource:error",{error:r,context:t}),this.broadcast("datasource:loading",{loading:!1,context:t})})}setDataSource(e){this.abortAllBlocks(),this.dataSource=e,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1;const t=this.config.cacheBlockSize??100,i=this.getEnrichmentParams(),r=this.grid?.getAttribute?.("id")??void 0,n=new AbortController;this.blockControllers.set(0,n),this.loadingBlocks.add(0),this.broadcast("datasource:loading",{loading:!0}),ar(e,0,t,i,n.signal).then(e=>{if(this.blockControllers.delete(0),this.loadingBlocks.delete(0),n.signal.aborted)return void this.broadcast("datasource:loading",{loading:!1});this.loadedBlocks.set(0,e.rows),this.applyServerResult(e,0,t);const i={rows:e.rows,totalNodeCount:e.totalNodeCount,startNode:0,endNode:e.rows.length,claimed:!1};this.broadcast("datasource:data",i),this.broadcast("datasource:loading",{loading:!1}),this.requestRender(),(this.config.loadThreshold??0)>0&&this.loadRequiredBlocks()}).catch(e=>{if(this.blockControllers.delete(0),this.loadingBlocks.delete(0),n.signal.aborted)return void this.broadcast("datasource:loading",{loading:!1});const t=e instanceof Error?e:new Error(String(e));k(G,`getRows() failed: ${t.message}`,r),this.broadcast("datasource:error",{error:t}),this.broadcast("datasource:loading",{loading:!1})})}refresh(){if(!this.dataSource)return;const e=this.dataSource;this.abortAllBlocks(),this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1,this.setDataSource(e)}purgeCache(){this.abortAllBlocks(),this.loadedBlocks.clear(),this.managedNodes=[]}getTotalNodeCount(){return this.totalNodeCount}getTotalRowCount(){return this.totalNodeCount}isNodeLoaded(e){const t=sr(e,this.config.cacheBlockSize??100);return this.loadedBlocks.has(t)}isRowLoaded(e){return this.isNodeLoaded(e)}getLoadedBlockCount(){return this.loadedBlocks.size}}class ur extends i{name="stickyRows";styles="@layer tbw-plugins{.tbw-sticky-rows{position:absolute;top:0;left:0;display:block;z-index:var(--tbw-z-layer-sticky-rows, 22);background:var(--tbw-color-bg, var(--tbw-color-panel-bg));min-width:100%;width:fit-content;overflow:visible}.tbw-sticky-rows:empty{display:none}.tbw-sticky-rows .tbw-sticky-row{box-shadow:0 1px 0 var(--tbw-color-border);background:var(--tbw-color-bg, var(--tbw-color-panel-bg))}.tbw-sticky-rows[data-mode=push] .tbw-sticky-row{will-change:transform}}";get defaultConfig(){return{mode:"push",maxStacked:1/0}}container=null;stickyIndices=[];cloneCache=/* @__PURE__ */new Map;displayedIndices=[];lastPushOffset=0;detach(){this.container?.remove(),this.container=null,this.cloneCache.clear(),this.stickyIndices=[],this.displayedIndices=[],this.lastPushOffset=0}afterRender(){this.recomputeStickyIndices(),this.ensureContainer(),this.primeCloneCache(),this.refreshDisplay()}onScrollRender(){this.primeCloneCache(),this.refreshClonesInWindow(),this.refreshDisplay()}onScroll(e){this.refreshDisplay(e.scrollTop)}resolvePredicate(){const e=this.config.isSticky;if("function"==typeof e)return e;if("string"==typeof e){const t=e;return e=>null!=e&&"object"==typeof e&&Boolean(e[t])}return()=>!1}recomputeStickyIndices(){const e=this.rows,t=this.resolvePredicate(),i=[];for(let r=0;r<e.length;r++)t(e[r],r)&&i.push(r);(i.length!==this.stickyIndices.length||i.some((e,t)=>e!==this.stickyIndices[t]))&&this.cloneCache.clear(),this.stickyIndices=i}ensureContainer(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".rows-viewport");t?this.container&&t.contains(this.container)||(this.container=document.createElement("div"),this.container.className="tbw-sticky-rows",this.container.setAttribute("role","presentation"),this.container.dataset.mode=this.config.mode??"push",this.config.className&&this.container.classList.add(this.config.className),t.insertBefore(this.container,t.firstChild)):this.container=null}offsetOf(e){const t=this.getVirtualState(),i=t?.positionCache;if(i&&i[e])return i[e].offset;return e*(t?.rowHeight??28)}heightOf(e){const t=this.getVirtualState(),i=t?.positionCache;return i&&i[e]?i[e].height:t?.rowHeight??28}getVirtualState(){return this.grid?._virtualization}getCurrentScrollTop(){const e=this.getVirtualState(),t=e?.container?.scrollTop;return"number"==typeof t?t:"number"!=typeof e?.start||"number"!=typeof e?.rowHeight||e.positionCache&&e.positionCache.length?e?.positionCache&&"number"==typeof e.start&&e.positionCache[e.start]?e.positionCache[e.start].offset:0:e.start*e.rowHeight}computeDisplay(e){if("stack"===this.config.mode){const t=this.config.maxStacked??1/0,i=[];let r=0;for(const n of this.stickyIndices)if(i.length<t){if(!(this.offsetOf(n)<e+r))break;i.push(n),r+=this.heightOf(n)}else{const t=this.heightOf(i[0]);if(!(this.offsetOf(n)<e+r-t))break;i.shift(),r-=t,i.push(n),r+=this.heightOf(n)}if(i.length===t&&i.length>0){const t=this.findNextSticky(i[i.length-1]);if(null!=t){const n=this.offsetOf(t)-(e+r);if(n<0){const e=this.heightOf(i[0]);return{indices:i,pushOffset:Math.min(-n,e)}}}}return{indices:i,pushOffset:0}}const t=[];for(const o of this.stickyIndices){if(!(this.offsetOf(o)<e))break;t.push(o)}if(0===t.length)return{indices:t,pushOffset:0};const i=t[t.length-1],r=this.findNextSticky(i);let n=0;if(null!=r){const t=this.heightOf(i),o=this.offsetOf(r)-e;o<t&&(n=t-Math.max(0,o))}return{indices:[i],pushOffset:n}}findRenderedRow(e){const t=this.gridElement;if(!t)return null;const i=t.querySelector(`.rows .data-grid-row .cell[data-row="${e}"]`);return i?.parentElement??null}buildClone(e){const t=this.findRenderedRow(e);if(!t)return this.cloneCache.get(e)??null;const i=t.cloneNode(!0);return i.classList.add("tbw-sticky-row"),i.removeAttribute("aria-rowindex"),i.setAttribute("aria-hidden","true"),i.dataset.stickyRow=String(e),i.classList.remove("row-focus","cell-focus"),i.querySelectorAll(".cell-focus, .row-focus").forEach(e=>e.classList.remove("cell-focus","row-focus")),i.removeAttribute("tabindex"),i.querySelectorAll("[tabindex]").forEach(e=>e.removeAttribute("tabindex")),this.cloneCache.set(e,i),i}refreshClonesInWindow(){if(this.displayedIndices.length)for(const e of this.displayedIndices){if(this.findRenderedRow(e)){const t=this.buildClone(e),i=this.container?.querySelector(`[data-sticky-row="${e}"]`);t&&i&&i!==t&&i.replaceWith(t)}}}primeCloneCache(){if(this.stickyIndices.length)for(const e of this.stickyIndices)this.findRenderedRow(e)&&this.buildClone(e)}refreshDisplay(e){if(!this.container)return;const t=e??this.getCurrentScrollTop(),{indices:i,pushOffset:r}=this.computeDisplay(t);this.container.dataset.mode!==this.config.mode&&(this.container.dataset.mode=this.config.mode??"push");if(!(i.length===this.displayedIndices.length&&i.every((e,t)=>e===this.displayedIndices[t]))){const e=document.createDocumentFragment(),t=[];for(const r of i){let i=this.cloneCache.get(r)??null;i=this.buildClone(r)??i,i&&(e.appendChild(i),t.push(r))}this.container.replaceChildren(e),this.displayedIndices=t}r!==this.lastPushOffset&&(this.container.style.transform=r>0?`translateY(${-r}px)`:"",this.lastPushOffset=r)}findNextSticky(e){for(const t of this.stickyIndices)if(t>e)return t;return null}}function hr(e){return e.scrollWidth>e.clientWidth}function gr(){return"function"==typeof HTMLElement.prototype?.showPopover}class pr extends i{name="tooltip";styles='@layer tbw-plugins{.tbw-tooltip-popover{margin:0;padding:var(--tbw-tooltip-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-tooltip-bg, light-dark(#333338, #484850));color:var(--tbw-tooltip-fg, light-dark(#f5f5f5, #f0f0f0));border:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-radius:var(--tbw-tooltip-radius, var(--tbw-border-radius, .25rem));box-shadow:none;filter:var(--tbw-tooltip-shadow, drop-shadow(0 4px 4px rgba(0, 0, 0, .45)));font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-tooltip-font-size, var(--tbw-font-size-sm, .9285em));max-width:var(--tbw-tooltip-max-width, 300px);white-space:pre-line;word-wrap:break-word;overflow-wrap:break-word;pointer-events:none;z-index:10001}.tbw-tooltip-popover:after{content:"";position:absolute;width:var(--tbw-tooltip-arrow-size, 14px);height:var(--tbw-tooltip-arrow-size, 14px);left:var(--tbw-tooltip-arrow-offset, 16px);background:inherit;pointer-events:none}.tbw-tooltip-popover:not(.tbw-tooltip-above):after{top:calc(var(--tbw-tooltip-arrow-size, 14px) / -2);transform:rotate(45deg);border-top:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-left:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72))}.tbw-tooltip-popover.tbw-tooltip-above:after{bottom:calc(var(--tbw-tooltip-arrow-size, 14px) / -2);transform:rotate(45deg);border-bottom:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-right:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72))}@supports (anchor-name: --test){.tbw-tooltip-popover{position-anchor:--tbw-tooltip-anchor;top:calc(anchor(bottom) + 11px);left:anchor(left);position-try-fallbacks:--tbw-tooltip-flip-above}@position-try --tbw-tooltip-flip-above{top:auto;bottom:calc(anchor(top) + 11px)}}}';static manifest={ownedProperties:[{property:"cellTooltip",level:"column",description:'the "cellTooltip" column property'},{property:"headerTooltip",level:"column",description:'the "headerTooltip" column property'}],configRules:[]};#at=null;#dt=null;#ct=!1;get#ut(){return!1!==this.config.header}get#ht(){return!1!==this.config.cell}attach(e){super.attach(e)}detach(){this.#gt(),this.#at?.remove(),this.#at=null,this.#ct=!1,super.detach()}afterRender(){this.#pt(),this.#ft()}#pt(){if(this.#at)return;const e=document.createElement("div");e.className="tbw-tooltip-popover",e.setAttribute("popover","hint"),e.style.overflow="visible",e.style.margin="0",document.body.appendChild(e),this.#at=e}#mt(e,t){if(this.#at){if(this.#wt(),e.style.setProperty("anchor-name","--tbw-tooltip-anchor"),this.#dt=e,this.#at.textContent=t,gr())try{this.#at.showPopover()}catch{}"undefined"!=typeof CSS&&!0===CSS.supports?.("anchor-name","--test")?requestAnimationFrame(()=>this.#bt(e)):this.#vt(e)}}#gt(){if(this.#at){if(gr())try{this.#at.hidePopover()}catch{}this.#at.classList.remove("tbw-tooltip-above")}this.#wt()}#wt(){this.#dt&&("--tbw-tooltip-anchor"===this.#dt.style.getPropertyValue("anchor-name")&&this.#dt.style.removeProperty("anchor-name"),this.#dt=null)}#vt(e){if(!this.#at)return;const t=e.getBoundingClientRect();this.#at.style.position="fixed",this.#at.style.left=`${t.left}px`;window.innerHeight-t.bottom<80?(this.#at.style.top="",this.#at.style.bottom=window.innerHeight-t.top+11+"px",this.#at.classList.add("tbw-tooltip-above")):(this.#at.style.top=`${t.bottom+11}px`,this.#at.style.bottom="",this.#at.classList.remove("tbw-tooltip-above"))}#bt(e){if(!this.#at)return;const t=e.getBoundingClientRect(),i=this.#at.getBoundingClientRect();this.#at.classList.toggle("tbw-tooltip-above",i.bottom<=t.top)}#ft(){if(this.#ct)return;const e=this.gridElement?.querySelector(".tbw-grid-root");e&&(this.#ct=!0,e.addEventListener("mouseover",e=>this.#yt(e),{signal:this.disconnectSignal}),e.addEventListener("mouseout",e=>this.#Ct(e),{signal:this.disconnectSignal}))}#yt(e){const t=e.target;if(!t?.closest)return;const i=t.closest('[part~="header-cell"]');if(i&&this.#ut)return void this.#xt(i);const r=t.closest("[data-row][data-col]");r&&this.#ht&&!r.style.getPropertyValue("anchor-name")&&this.#Et(r)}#Ct(e){const t=e.target;if(!t?.closest)return;const i=t.closest('[part~="header-cell"], [data-row][data-col]');if(!i)return;const r=e.relatedTarget;r&&i.contains(r)||this.#gt()}#xt(e){const t=parseInt(e.getAttribute("data-col")??"-1",10);if(t<0)return;const i=this.visibleColumns[t];if(!i)return;const r=function(e,t){const i=e.headerTooltip;if(!1===i)return null;if("string"==typeof i)return i;if("function"==typeof i)return i({column:e,value:e.header??e.field});const r=t.querySelector("span:first-child")??t;return hr(r)&&r.textContent?.trim()||null}(i,e);r&&this.#mt(e,r)}#Et(e){const t=parseInt(e.getAttribute("data-row")??"-1",10),i=parseInt(e.getAttribute("data-col")??"-1",10);if(t<0||i<0)return;const r=this.visibleColumns[i];if(!r)return;const n=this.rows[t],o=n?.[r.field],s=function(e,t,i,r,n){const o=e.cellTooltip;if(!1===o)return null;if("string"==typeof o)return o;if("function"==typeof o)return o({value:r,row:i,column:e,field:e.field,grid:n});return hr(t)&&t.textContent?.trim()||null}(r,e,n,o,this.grid);s&&this.#mt(e,s)}}function fr(e,t,i){return void 0!==e.id?String(e.id):i?`${i}-${t}`:String(t)}function mr(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i}function wr(e,t,i=null,r=0){const n=t.childrenField??"children",o=/* @__PURE__ */new Set;for(let s=0;s<e.length;s++){const l=e[s],a=fr(l,s,i),d=l[n];if(Array.isArray(d)&&d.length>0){o.add(a);const e=wr(d,t,a,r+1);for(const t of e)o.add(t)}}return o}function br(e,t,i,r=null,n=0){const o=i.childrenField??"children";for(let s=0;s<e.length;s++){const l=e[s],a=fr(l,s,r);if(a===t)return[a];const d=l[o];if(Array.isArray(d)&&d.length>0){const e=br(d,t,i,a,n+1);if(e)return[a,...e]}}return null}function vr(e,t,i,r){const n=br(e,t,i);if(!n)return r;const o=new Set(r);for(let s=0;s<n.length-1;s++)o.add(n[s]);return o}function yr(e,t){const i=Math.min(t,e.length-1);if(i<0)return 0;let r=i;for(;r>0&&e[r].depth>0;)r--;let n=0;for(let o=0;o<=r;o++)0===e[o].depth&&n++;return n-1}function Cr(e,t="children"){if(!Array.isArray(e)||0===e.length)return!1;for(const i of e){if(!i)continue;const e=i[t];if(Array.isArray(e)&&e.length>0)return!0;if(null!=e&&!Array.isArray(e)&&e)return!0}return!1}class xr extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10},incompatibleWith:[{name:"groupingRows",reason:"Both plugins transform the entire row model. TreePlugin flattens nested hierarchies while GroupingRowsPlugin groups flat rows with synthetic headers. Use one approach per grid."},{name:"pivot",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."}],events:[{type:"tree-expand",description:"Emitted when tree expansion state changes (toggle, expand all, collapse all). Broadcast to both DOM consumers and plugin bus."}],queries:[{type:"canMoveRow",description:"Returns false for rows with children (parent nodes cannot be reordered)"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level node indices for ServerSide pagination."}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for coordinated tree sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded tree data"}];name="tree";styles='@layer tbw-plugins{tbw-grid{.cell[data-field=__tbw_expander]{border-inline-end:none!important;padding:0;display:flex;align-items:center;justify-content:flex-start}.header-row .cell[data-field=__tbw_expander]{display:none}.header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}.tree-cell-wrapper{display:inline-flex;align-items:center;vertical-align:middle;overflow:visible;padding-inline-start:calc(var(--tbw-tree-depth, 0) * var(--tbw-tree-indent-width, var(--tbw-tree-toggle-size, 1.25em)))}.tree-expander{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;box-sizing:border-box}.tree-toggle{cursor:pointer;user-select:none;display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-tree-toggle-size, 1.25em);height:var(--tbw-tree-toggle-size, 1.25em);flex-shrink:0}.tree-toggle:hover{color:var(--tbw-tree-accent, var(--tbw-color-accent))}.tree-spacer{width:var(--tbw-tree-toggle-size, 1.25em);height:var(--tbw-tree-toggle-size, 1.25em);display:inline-block;flex-shrink:0}.data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}.data-grid-row.tbw-tree-fade-in{animation:tbw-tree-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}}@keyframes tbw-tree-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes tbw-tree-fade-in{0%{opacity:0}to{opacity:1}}tbw-grid.tbw-tree-loading .rows-viewport:after{content:"";display:block;height:2px;background:linear-gradient(90deg,transparent,var(--tbw-color-accent, #2563eb),transparent);animation:tbw-tree-loading-bar 1s ease-in-out infinite;position:sticky;bottom:0;left:0;right:0}@keyframes tbw-tree-loading-bar{0%{transform:translate(-100%)}to{transform:translate(100%)}}}';get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=/* @__PURE__ */new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=/* @__PURE__ */new Map;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;sortState=null;loadingKeys=/* @__PURE__ */new Set;#St=/* @__PURE__ */new WeakMap;#Rt=/* @__PURE__ */new WeakMap;originalTreeColumnRenderer;wrappedTreeColumnField;detach(){const e=this.gridElement?.querySelector(".rows-body");e?.setAttribute("role","grid"),this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null,this.loadingKeys.clear(),this.originalTreeColumnRenderer=void 0,this.wrappedTreeColumnField=void 0}handleQuery(e){if("canMoveRow"===e.type){const t=e.context,i=this.config.childrenField??"children",r=t?.[i];if(Array.isArray(r)&&r.length>0)return!1}if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:i}=e.context;if(0===this.flattenedRows.length)return;return{startNode:yr(this.flattenedRows,t),endNode:yr(this.flattenedRows,i)+1,totalLoadedNodes:function(e){let t=0;for(const i of e)0===i.depth&&t++;return t}(this.flattenedRows)}}}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0)}),this.on("datasource:children",e=>{const t=e;if("tree"!==t.context?.source)return;t.claimed=!0;const i=t.context.parentNode;if(i){i[this.config.childrenField??"children"]=t.rows;const e=this.#St.get(i)??String(i.id??"?");this.loadingKeys.delete(e),this.requestRender()}})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detect(e){if(!this.config.autoDetect)return!1;const t=e,i=this.config.childrenField??function(e){if(!Array.isArray(e)||0===e.length)return null;const t=["children","items","nodes","subRows","nested"];for(const i of e)if(i&&"object"==typeof i)for(const e of t){const t=i[e];if(Array.isArray(t)&&t.length>0)return e}return null}(t)??"children";return Cr(t,i)}processRows(e){const t=this.config.childrenField??"children",i=e;if(0===i.length||!Cr(i,t))return this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),[...e];const r=this.resolveEffectiveSortState();this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=wr(i,this.config),this.initialExpansionDone=!0),this.flattenedRows=this.#At(i,this.expandedKeys,r,null,0),this.#Rt=/* @__PURE__ */new WeakMap,this.rowKeyMap.clear(),this.keysToAnimate.clear();const n=/* @__PURE__ */new Set;for(const o of this.flattenedRows)this.rowKeyMap.set(o.key,o),this.#Rt.set(o.data,o),n.add(o.key),!this.previousVisibleKeys.has(o.key)&&o.depth>0&&this.keysToAnimate.add(o.key);return this.previousVisibleKeys=n,this.flattenedRows.map(e=>e.data)}#kt(e,t,i){if(void 0!==e.id){const t=String(e.id);return this.#St.set(e,t),t}const r=this.#St.get(e);if(void 0!==r)return r;const n=i?`${i}-${t}`:String(t);return this.#St.set(e,n),n}#At(e,t,i,r,n){const o=this.config.childrenField??"children";for(let a=0;a<e.length;a++)this.#kt(e[a],a,r);const s=i?this.#It(e,i.field,i.direction):e,l=[];for(let a=0;a<s.length;a++){const e=s[a],d=this.#kt(e,a,r),c=e[o],u=Array.isArray(c)&&c.length>0,h=null!=c&&!Array.isArray(c)&&!!c,g=u||h,p=t.has(d);l.push({key:d,data:e,depth:n,hasChildren:g,isExpanded:p,parentKey:r,posInSet:a+1,setSize:s.length}),u&&p&&l.push(...this.#At(c,t,i,d,n+1))}return l}#It(e,t,i){const r=this.grid,n=r?._columns??[],o={field:t,direction:i},s=[...e],l=(r?.effectiveConfig?.sortHandler??D)(s,o,n);return l&&"function"==typeof l.then?(l.catch(()=>{}),D(s,o,n)):l}requestLazyChildren(e){if(this.loadingKeys.has(e.key))return;const t=this.config.childrenField??"children",i=e.data[t];if(Array.isArray(i)&&i.length>0)return;const r=this.grid?.query?.("datasource:is-active",null);r&&(this.loadingKeys.add(e.key),this.grid.query("datasource:fetch-children",{context:{source:"tree",parentNode:e.data,nodePath:[e.key]}}))}resolveEffectiveSortState(){const e=this.grid?.query?.("sort:get-model",null);if(Array.isArray(e)&&e.length>0){const t=e[0];if(Array.isArray(t)&&t.length>0)return{field:t[0].field,direction:"desc"===t[0].direction?-1:1}}return this.sortState}processColumns(e){if(0===this.flattenedRows.length)return[...e];const t=[...e];if(0===t.length)return t;const{treeColumn:i}=this.config;let r=0;if(i){const e=t.findIndex(e=>e.field===i);e>=0&&(r=e)}const n=t[r],o=n.field;this.wrappedTreeColumnField!==o&&(this.originalTreeColumnRenderer=n.viewRenderer,this.wrappedTreeColumnField=o);const s=this.originalTreeColumnRenderer,l=()=>this.config,a=this.setIcon.bind(this);return t[r]={...n,viewRenderer:e=>{const{row:t,value:i}=e,{showExpandIcons:r=!0,indentWidth:n}=l(),o=this.#Rt.get(t),d=o?.depth??0,c=document.createElement("span");if(c.className="tree-cell-wrapper",c.style.setProperty("--tbw-tree-depth",String(d)),void 0!==n&&c.style.setProperty("--tbw-tree-indent-width",`${n}px`),r)if(o&&o.hasChildren){const e=document.createElement("span");e.className=`${w.TREE_TOGGLE}${o.isExpanded?` ${w.EXPANDED}`:""}`,a(e,o.isExpanded?"collapse":"expand"),e.setAttribute("data-tree-key",o.key),c.appendChild(e)}else{const e=document.createElement("span");e.className="tree-spacer",c.appendChild(e)}const u=document.createElement("span");if(u.className="tree-content",s){const t=s(e);t instanceof Node?u.appendChild(t):"string"==typeof t&&(u.innerHTML=t)}else u.textContent=null!=i?String(i):"";return c.appendChild(u),c}},t}onCellClick(e){const t=e.originalEvent?.target;if(!t?.classList.contains(w.TREE_TOGGLE))return!1;const i=t.getAttribute("data-tree-key");if(!i)return!1;const r=this.rowKeyMap.get(i);return!!r&&(this.expandedKeys=mr(this.expandedKeys,i),this.expandedKeys.has(i)&&this.requestLazyChildren(r),this.broadcast("tree-expand",{key:i,row:r.data,expanded:this.expandedKeys.has(i),depth:r.depth,expandedKeys:[...this.expandedKeys]}),this.requestRender(),!0)}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusRow,i=this.flattenedRows[t];return i?.hasChildren?(e.preventDefault(),this.expandedKeys=mr(this.expandedKeys,i.key),this.expandedKeys.has(i.key)&&this.requestLazyChildren(i),this.broadcast("tree-expand",{key:i.key,row:i.data,expanded:this.expandedKeys.has(i.key),depth:i.depth,expandedKeys:[...this.expandedKeys]}),this.requestRenderWithFocus(),!0):void 0}onHeaderClick(e){if(0===this.flattenedRows.length||!e.column.sortable)return!1;const t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0)return!1;const{field:i}=e.column;this.sortState&&this.sortState.field===i?1===this.sortState.direction?this.sortState={field:i,direction:-1}:this.sortState=null:this.sortState={field:i,direction:1};const r=this.grid;return void 0!==r._sortState&&(r._sortState=this.sortState?{...this.sortState}:null),this.broadcast("sort-change",{field:i,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.gridElement?.querySelector(".rows-body");e&&"treegrid"!==e.getAttribute("role")&&e.setAttribute("role","treegrid");const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=this.animationStyle,r=!1!==i&&this.keysToAnimate.size>0,n="fade"===i?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const o of t.querySelectorAll(".data-grid-row")){const e=o.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flattenedRows[t];i&&(o.setAttribute("aria-level",String(i.depth+1)),o.setAttribute("aria-setsize",String(i.setSize)),o.setAttribute("aria-posinset",String(i.posInSet)),i.hasChildren?o.setAttribute("aria-expanded",String(i.isExpanded)):o.hasAttribute("aria-expanded")&&o.removeAttribute("aria-expanded"),o.classList.toggle("tbw-row-expanded",i.hasChildren&&i.isExpanded),r&&i.key&&this.keysToAnimate.has(i.key)&&(o.classList.add(n),o.addEventListener("animationend",()=>o.classList.remove(n),{once:!0})))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e);const t=this.rowKeyMap.get(e);t&&this.requestLazyChildren(t),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=mr(this.expandedKeys,e);const t=this.rowKeyMap.get(e);t?(this.expandedKeys.has(e)&&this.requestLazyChildren(t),this.broadcast("tree-expand",{key:e,row:t.data,expanded:this.expandedKeys.has(e),depth:t.depth,expandedKeys:[...this.expandedKeys]})):this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}expandAll(){this.expandedKeys=wr(this.rows,this.config),this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowMeta(e){return this.#Rt.get(e)}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=vr(this.rows,e,this.config,this.expandedKeys),this.requestRender()}}function Er(e,t,i){const r=[...e.undoStack,t];for(;r.length>i;)r.shift();return{undoStack:r,redoStack:[]}}function Sr(e){if(0===e.undoStack.length)return{newState:e,action:null};const t=[...e.undoStack],i=t.pop();return i?{newState:{undoStack:t,redoStack:[...e.redoStack,i]},action:i}:{newState:e,action:null}}function Rr(e){if(0===e.redoStack.length)return{newState:e,action:null};const t=[...e.redoStack],i=t.pop();return i?{newState:{undoStack:[...e.undoStack,i],redoStack:t},action:i}:{newState:e,action:null}}class Ar extends i{static dependencies=[{name:"editing",required:!0,reason:"UndoRedoPlugin tracks cell edit history"}];name="undoRedo";get defaultConfig(){return{maxHistorySize:100}}undoStack=[];redoStack=[];#_t=!1;#Tt=null;#Lt(e,t){const i=this.rows[e.rowIndex];if(i){try{const r=this.grid.getRowId(i);if(r)return void this.grid.updateRow(r,{[e.field]:t})}catch{}i[e.field]=t}}#Ft(e){const t=this.grid,i=t._visibleColumns?.findIndex(t=>t.field===e.field)??-1;if(i<0)return;t._focusRow=e.rowIndex,t._focusCol=i;const r=t.findRenderedRowElement?.(e.rowIndex);if(!r)return;const n=r.querySelector(`.cell[data-col="${i}"]`);if(n?.classList.contains(w.EDITING)){const e=n.querySelector(P);e?.focus({preventScroll:!0})}}#Gt(e,t){if(this.#_t=!0,"compound"===e.type){const i="undo"===t?[...e.actions].reverse():e.actions;for(const e of i)this.#Lt(e,"undo"===t?e.oldValue:e.newValue)}else this.#Lt(e,"undo"===t?e.oldValue:e.newValue);this.#_t=!1}#Dt(e){const t="compound"===e.type?e.actions[e.actions.length-1]:e;t&&this.#Ft(t)}attach(e){super.attach(e),this.on("cell-edit-committed",e=>{this.#_t||this.recordEdit(e.rowIndex,e.field,e.oldValue,e.newValue)})}detach(){this.undoStack=[],this.redoStack=[],this.#Tt=null}onKeyDown(e){const t=(e.ctrlKey||e.metaKey)&&"z"===e.key&&!e.shiftKey,i=(e.ctrlKey||e.metaKey)&&("y"===e.key||"z"===e.key&&e.shiftKey);if(!t&&!i)return!1;const r=t?"undo":"redo";return this.#Mt(e.target)?(this.#Nt(e.target,r),!0):(e.preventDefault(),this.#qt(r),!0)}#qt(e){const t={undoStack:this.undoStack,redoStack:this.redoStack},i="undo"===e?Sr(t):Rr(t);i.action&&(this.#Gt(i.action,e),this.undoStack=i.newState.undoStack,this.redoStack=i.newState.redoStack,this.emit(e,{action:i.action,type:e}),this.#Dt(i.action),this.requestRenderWithFocus())}#Mt(e){return e instanceof Element&&!!e.closest('input, textarea, [contenteditable=""], [contenteditable="true"]')}#Nt(e,t){const i="undo"===t?"historyUndo":"historyRedo";let r=!1;const n=e=>{e.inputType===i&&(r=!0)};e.addEventListener("beforeinput",n,{capture:!0}),queueMicrotask(()=>{e.removeEventListener("beforeinput",n,{capture:!0}),r||this.#qt(t)})}recordEdit(e,t,i,r){const n=function(e,t,i,r){return{type:"cell-edit",rowIndex:e,field:t,oldValue:i,newValue:r,timestamp:Date.now()}}(e,t,i,r);if(this.#Tt)return void this.#Tt.push(n);const o=Er({undoStack:this.undoStack,redoStack:this.redoStack},n,this.config.maxHistorySize??100);this.undoStack=o.undoStack,this.redoStack=o.redoStack}beginTransaction(){this.#Tt&&p(z,"Transaction already in progress. Call endTransaction() first."),this.#Tt=[]}endTransaction(){const e=this.#Tt;if(e||p(O,"No transaction in progress. Call beginTransaction() first."),this.#Tt=null,0===e.length)return;const t=1===e.length?e[0]:{type:"compound",actions:e,timestamp:Date.now()};const i=Er({undoStack:this.undoStack,redoStack:this.redoStack},t,this.config.maxHistorySize??100);this.undoStack=i.undoStack,this.redoStack=i.redoStack}undo(){const e=Sr({undoStack:this.undoStack,redoStack:this.redoStack});return e.action&&(this.#Gt(e.action,"undo"),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.#Dt(e.action),this.requestRenderWithFocus()),e.action}redo(){const e=Rr({undoStack:this.undoStack,redoStack:this.redoStack});return e.action&&(this.#Gt(e.action,"redo"),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.#Dt(e.action),this.requestRenderWithFocus()),e.action}canUndo(){return{undoStack:this.undoStack,redoStack:this.redoStack}.undoStack.length>0}canRedo(){return{undoStack:this.undoStack,redoStack:this.redoStack}.redoStack.length>0}clearHistory(){const e={undoStack:[],redoStack:[]};this.undoStack=e.undoStack,this.redoStack=e.redoStack,this.#Tt=null}getUndoStack(){return[...this.undoStack]}getRedoStack(){return[...this.redoStack]}}class kr extends i{static dependencies=[{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];static manifest={queries:[{type:"getContextMenuItems",description:'Contributes "Hide column" item to the header context menu'}]};name="visibility";static PANEL_ID="columns";styles='@layer tbw-plugins{.tbw-visibility-content{display:flex;flex-direction:column;height:100%}.tbw-visibility-list{flex:1;overflow-y:auto;padding:var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem))}.tbw-visibility-row{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-menu-item-padding, .375rem .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);border-radius:var(--tbw-border-radius, .25rem);position:relative}.tbw-visibility-row:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-row input[type=checkbox]{cursor:pointer}.tbw-visibility-row.locked span{color:var(--tbw-color-fg-muted)}.tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs, .625rem);letter-spacing:-2px;user-select:none;flex-shrink:0}.tbw-visibility-row.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-label{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));flex:1;cursor:pointer}.tbw-visibility-row.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-row.drop-before:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-row.drop-after:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-show-all{margin:var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding, .5rem .75rem);border:1px solid var(--tbw-visibility-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius, .25rem);background:var(--tbw-visibility-btn-bg, var(--tbw-color-header-bg));color:var(--tbw-color-fg);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem)}.tbw-visibility-show-all:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-group-header{display:flex;align-items:center;padding:var(--tbw-menu-item-padding, .375rem .25rem);font-size:var(--tbw-font-size-sm, .8125rem);font-weight:600;color:var(--tbw-color-fg);border-bottom:1px solid var(--tbw-color-border);margin-top:var(--tbw-spacing-sm, .25rem);position:relative}.tbw-visibility-group-header:first-child{margin-top:0}.tbw-visibility-group-header .tbw-visibility-label{gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-visibility-group-header.reorderable{cursor:grab}.tbw-visibility-group-header.reorderable:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-group-header .tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs, .625rem);letter-spacing:-2px;user-select:none;flex-shrink:0}.tbw-visibility-group-header.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-group-header.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-group-header.drop-before:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-group-header.drop-after:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-row--grouped{padding-left:calc(var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem)) + .75rem)}}';get defaultConfig(){return{allowHideAll:!1}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupId=null;draggedGroupFields=[];clearDragClasses(e){e.querySelectorAll(".tbw-visibility-row, .tbw-visibility-group-header").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-move",()=>{this.columnListElement&&requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})},{signal:this.disconnectSignal})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockVisible||i.meta?.lockVisibility)return;return[{id:"visibility/hide-column",label:"Hide Column",icon:"👁",order:30,action:()=>this.hideColumn(i.field)}]}}getToolPanel(){return{id:kr.PANEL_ID,title:"Columns",icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}show(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(kr.PANEL_ID)||this.grid.toggleToolPanelSection(kr.PANEL_ID)}hide(){this.grid.closeToolPanel()}toggle(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(kr.PANEL_ID)}isColumnVisible(e){return this.grid.isColumnVisible(e)}setColumnVisible(e,t){this.grid.setColumnVisible(e,t)}getVisibleColumns(){return this.grid.getAllColumns().filter(e=>e.visible).map(e=>e.field)}getHiddenColumns(){return this.grid.getAllColumns().filter(e=>!e.visible).map(e=>e.field)}showAll(){this.grid.showAllColumns()}toggleColumn(e){this.grid.toggleColumnVisibility(e)}showColumn(e){this.setColumnVisible(e,!0)}hideColumn(e){this.setColumnVisible(e,!1)}getAllColumns(){return this.grid.getAllColumns()}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(kr.PANEL_ID)}renderPanelContent(e){const t=document.createElement("div");t.className="tbw-visibility-content";const i=document.createElement("div");i.className="tbw-visibility-list",t.appendChild(i);const r=document.createElement("button");return r.type="button",r.className="tbw-visibility-show-all",r.textContent="Show All",r.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(r),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!(!e||"function"!=typeof e.moveColumn)}canMoveColumn(e){const t=this.grid.columns.find(t=>t.field===e.field);if(!t)return!1;const i=this.grid.query("canMoveColumn",t);return i.length>0&&!i.includes(!1)}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(e=>!e.utility),r=this.grid.query("getColumnGrouping"),n=r?.flat().filter(e=>e&&e.fields.length>0)??[];if(0===n.length)return void this.renderFlatColumnList(i,t,e);const o=/* @__PURE__ */new Map;for(const l of n)for(const e of l.fields)o.set(e,l);const s=this.computeFragments(i,o);for(const l of s)if(l.group)this.renderGroupSection(l.group,l.columns,t,e);else{const r=i.indexOf(l.columns[0]);e.appendChild(this.createColumnRow(l.columns[0],r,t,e))}}computeFragments(e,t){const i=[];let r=null,n=[];for(const o of e){const e=t.get(o.field)??null;e&&r&&e.id===r.id?n.push(o):(n.length>0&&i.push({group:r,columns:n}),r=e,n=[o])}return n.length>0&&i.push({group:r,columns:n}),i}renderGroupSection(e,t,i,r){const n=t.map(e=>e.field),o=document.createElement("div");o.className="tbw-visibility-group-header",o.setAttribute("data-group-id",e.id),i&&(o.draggable=!0,o.classList.add("reorderable"),this.setupGroupDragListeners(o,e,n,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox";const a=t.filter(e=>e.visible).length,d=t.every(e=>e.lockVisible);a===t.length?(l.checked=!0,l.indeterminate=!1):0===a?(l.checked=!1,l.indeterminate=!1):(l.checked=!1,l.indeterminate=!0),l.disabled=d,l.addEventListener("change",()=>{const e=l.checked;for(const i of t)i.lockVisible||this.grid.setColumnVisible(i.field,e);setTimeout(()=>this.rebuildToggles(r),0)});const c=document.createElement("span");if(c.textContent=e.label,s.appendChild(l),s.appendChild(c),o.appendChild(s),i){const e=document.createElement("span");e.className="tbw-visibility-handle",this.setIcon(e,"dragHandle"),e.title="Drag to reorder group",o.insertBefore(e,s)}r.appendChild(o);const u=this.grid.getAllColumns().filter(e=>!e.utility);for(const h of t){const e=u.findIndex(e=>e.field===h.field),t=this.createColumnRow(h,e,i,r);t.classList.add("tbw-visibility-row--grouped"),r.appendChild(t)}}renderFlatColumnList(e,t,i){const r=this.grid.getAllColumns().filter(e=>!e.utility);for(const n of e){const e=r.findIndex(e=>e.field===n.field);i.appendChild(this.createColumnRow(n,e,t,i))}}createColumnRow(e,t,i,r){const n=e.header||e.field,o=document.createElement("div");o.className=e.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",o.setAttribute("data-field",e.field),o.setAttribute("data-index",String(t)),i&&this.canMoveColumn(e)&&(o.draggable=!0,o.classList.add("reorderable"),this.setupDragListeners(o,e.field,t,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox",l.checked=e.visible,l.disabled=e.lockVisible??!1,l.addEventListener("change",()=>{this.grid.toggleColumnVisibility(e.field),setTimeout(()=>this.rebuildToggles(r),0)});const a=document.createElement("span");if(a.textContent=n,s.appendChild(l),s.appendChild(a),i&&this.canMoveColumn(e)){const e=document.createElement("span");e.className="tbw-visibility-handle",this.setIcon(e,"dragHandle"),e.title="Drag to reorder",o.appendChild(e)}return o.appendChild(s),o}setupGroupDragListeners(e,t,i,r){e.addEventListener("dragstart",n=>{this.isDragging=!0,this.draggedGroupId=t.id,this.draggedGroupFields=[...i],this.draggedField=null,this.draggedIndex=null,n.dataTransfer&&(n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("text/plain",`group:${t.id}`)),e.classList.add(w.DRAGGING),r.querySelectorAll(".tbw-visibility-row--grouped").forEach(e=>{const t=e.getAttribute("data-field");t&&this.draggedGroupFields.includes(t)&&e.classList.add(w.DRAGGING)})}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedGroupId=null,this.draggedGroupFields=[],this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(r)}),e.addEventListener("dragover",t=>{if(t.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length===i.length&&this.draggedGroupFields.every(e=>i.includes(e)))return;if(!this.draggedGroupId)return;const n=e.getBoundingClientRect(),o=n.top+n.height/2,s=t.clientY<o;this.clearDragClasses(r),e.classList.add("drop-target"),e.classList.toggle("drop-before",s),e.classList.toggle("drop-after",!s)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",t=>{if(t.preventDefault(),!this.isDragging||!this.draggedGroupId)return;if(this.draggedGroupFields.length===i.length&&this.draggedGroupFields.every(e=>i.includes(e)))return;const r=e.getBoundingClientRect(),n=t.clientY<r.top+r.height/2;this.executeGroupDrop(this.draggedGroupFields,i,n)})}executeGroupDrop(e,t,i){const r=this.grid.getAllColumns().map(e=>e.field),n=r.filter(t=>!e.includes(t)),o=i?t[0]:t[t.length-1],s=n.indexOf(o);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));n.splice(l,0,...a);const d=this.grid.getPluginByName?.("reorder");d?.setColumnOrder&&d.gridElement?d.setColumnOrder(n):this.grid.setColumnOrder(n),requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})}setupDragListeners(e,t,i,r){e.addEventListener("dragstart",r=>{this.isDragging=!0,this.draggedField=t,this.draggedIndex=i,this.draggedGroupId=null,this.draggedGroupFields=[],r.dataTransfer&&(r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",t)),e.classList.add(w.DRAGGING)}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(r)}),e.addEventListener("dragover",n=>{if(n.preventDefault(),!this.isDragging)return;if(this.draggedGroupId){if(e.classList.contains("tbw-visibility-row--grouped"))return}else if(this.draggedField===t)return;const o=e.getBoundingClientRect(),s=o.top+o.height/2;this.dropIndex=n.clientY<s?i:i+1,this.clearDragClasses(r),this.draggedGroupId?(r.querySelector(`.tbw-visibility-group-header[data-group-id="${this.draggedGroupId}"]`)?.classList.add(w.DRAGGING),r.querySelectorAll(".tbw-visibility-row--grouped").forEach(e=>{const t=e.getAttribute("data-field");t&&this.draggedGroupFields.includes(t)&&e.classList.add(w.DRAGGING)})):this.draggedField&&r.querySelector(`.tbw-visibility-row[data-field="${this.draggedField}"]`)?.classList.add(w.DRAGGING),e.classList.add("drop-target"),e.classList.toggle("drop-before",n.clientY<s),e.classList.toggle("drop-after",n.clientY>=s)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",i=>{if(i.preventDefault(),!this.isDragging)return;if(this.draggedGroupId&&this.draggedGroupFields.length>0){if(e.classList.contains("tbw-visibility-row--grouped"))return;const r=e.getBoundingClientRect(),n=i.clientY<r.top+r.height/2;return void this.executeGroupDrop(this.draggedGroupFields,[t],n)}const r=this.draggedField,n=this.draggedIndex,o=this.dropIndex;if(null===r||null===n||null===o)return;const s=o>n?o-1:o;if(s!==n){const e=this.grid.getAllColumns(),t=e.filter(e=>!e.utility),i=t[s]?.field,o={field:r,fromIndex:n,toIndex:i?e.findIndex(e=>e.field===i):e.length};this.emit("column-reorder-request",o)}})}}export{it as BLANK_FILTER_VALUE,i as BaseGridPlugin,H as CORE_CONSUMED_ADAPTER_METHODS,de as ClipboardPlugin,fe as ColumnVirtualizationPlugin,Ae as ContextMenuPlugin,K as DEFAULT_A11Y_MESSAGES,B as DEFAULT_ANIMATION_CONFIG,$ as DEFAULT_GRID_ICONS,W as DGEvents,V as DataGridElement,Ke as EditingPlugin,tt as ExportPlugin,gt as FilteringPlugin,j as FitModeEnum,U as GridCSSVars,w as GridClasses,Y as GridDataAttrs,Z as GridElement,Q as GridSelectors,wt as GroupingColumnsPlugin,xt as GroupingRowsPlugin,Rt as MasterDetailPlugin,Tt as MultiSortPlugin,Kt as PinnedColumnsPlugin,ri as PinnedRowsPlugin,Ci as PivotPlugin,X as PluginEvents,J as PluginManager,Ri as PrintPlugin,Ki as ROW_DRAG_HANDLE_FIELD,ee as RenderPhase,_i as ReorderPlugin,ji as ResponsivePlugin,Vi as RowDragDropPlugin,Vi as RowReorderPlugin,or as SelectionPlugin,cr as ServerSidePlugin,ur as StickyRowsPlugin,pr as TooltipPlugin,xr as TreePlugin,Ar as UndoRedoPlugin,kr as VisibilityPlugin,D as builtInSort,te as createGrid,ie as defaultComparator,_e as defaultEditorFor,ae as defaultPasteHandler,Jt as filteredCountPanel,c as invalidateAccessorCache,Ei as printGridIsolated,re as queryGrid,r as resolveCellValue,Qt as rowCountPanel,Xt as selectedCountPanel,ne as setFeatureResolver};//# sourceMappingURL=all.js.map
|
|
1
|
+
import{w as e,C as t,BaseGridPlugin as i,resolveCellValue as r,s as n,t as o,E as s,e as l,a,g as d,invalidateAccessorCache as c,f as u,b as h,c as g,d as p,h as f,i as m,GridClasses as w,j as b,aggregatorRegistry as v,k as y,l as C,r as x,getValueAggregator as E,P as S,m as R,n as A,o as k,p as I,M as _,q as T,u as L,v as F,D as G,builtInSort as D,x as M,y as N,z as q,F as P,T as z,N as H}from"./index.js";import{CORE_CONSUMED_ADAPTER_METHODS as O,DEFAULT_A11Y_MESSAGES as K,DEFAULT_ANIMATION_CONFIG as B,DEFAULT_GRID_ICONS as $,DGEvents as W,DataGridElement as V,FitModeEnum as j,GridCSSVars as U,GridDataAttrs as Y,DataGridElement as Z,GridSelectors as Q,PluginEvents as X,PluginManager as J,RenderPhase as ee,createGrid as te,defaultComparator as ie,queryGrid as re,setFeatureResolver as ne}from"./index.js";function oe(e,t,i=!0){let r=e;if(i&&(r=r.filter(e=>!e.hidden&&!e.field.startsWith("__")&&!0!==e.utility)),t?.length){const e=new Set(t);r=r.filter(t=>e.has(t.field))}return r}function se(e,t){return t?.length?[...t].sort((e,t)=>e-t).map(t=>e[t]).filter(e=>null!=e):e}function le(e,t){const i=t.delimiter??"\t",r=t.newline??"\n",n=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),o=n.length,s=[];let l=[],a=0,d=!1,c=!1;const u=e=>{const t=n.slice(a,e);return c?function(e){let t="",i=!1;for(let r=0;r<e.length;r++){const n=e[r];'"'===n?i?'"'===e[r+1]?(t+='"',r++):i=!1:i=!0:t+=n}return t}(t):t},h=()=>{(l.length>1||l.some(e=>""!==e.trim()))&&s.push(l),l=[]};for(let g=0;g<o;g++){const e=n[g];'"'===e?(c=!0,d?'"'===n[g+1]?g++:d=!1:d=!0):e!==i||d?e!==r||d||(l.push(u(g)),a=g+1,c=!1,h()):(l.push(u(g)),a=g+1,c=!1)}return l.push(u(o)),h(),s}function ae(e,t){const{rows:i,target:r,fields:n}=e;if(!r)return;const o=t.rows,s=t.effectiveConfig.columns??[],l=s.map(e=>e.field),a=/* @__PURE__ */new Map;s.forEach(e=>{a.set(e.field,!0===e.editable)});const d=[...o],c=r.bounds?r.bounds.endRow:1/0;i.forEach((e,t)=>{const i=r.row+t;if(!(i>c)){if(r.bounds){if(i>=d.length)return}else for(;i>=d.length;){const e={};l.forEach(t=>e[t]=""),d.push(e)}d[i]={...d[i]},e.forEach((e,t)=>{const r=n[t];r&&a.get(r)&&(d[i][r]=e)})}}),t.rows=d}class de extends i{static manifest={queries:[{type:"clipboard:copy",description:"Triggers a copy operation and returns the copied text"}]};static dependencies=[{name:"selection",required:!1,reason:"Enables copy/paste of selected cells instead of entire grid"}];name="clipboard";get defaultConfig(){return{includeHeaders:!1,delimiter:"\t",newline:"\n",quoteStrings:!1}}lastCopied=null;attach(e){super.attach(e),e.addEventListener("paste",e=>this.#e(e),{signal:this.disconnectSignal})}detach(){this.lastCopied=null}handleQuery(e){if("clipboard:copy"===e.type)return this.copy(),!0}onKeyDown(e){return!(!e.ctrlKey&&!e.metaKey||"c"!==e.key)&&(e.preventDefault(),this.#t(e.target),!0)}#t(e){const t=this.#i();if(t&&0===t.ranges.length){const t=this.#r(e);if(!t)return;const i=this.columns[t.col];if(!i)return;return void this.copy({rowIndices:[t.row],columns:[i.field]})}this.copy()}#e(e){if(this.#n(e.target))return;const t=e.clipboardData?.getData("text/plain");if(!t)return;e.preventDefault();const i=le(t,this.config),r=this.#i(),n=r?.ranges?.[0],o=n?.from.row??0,s=n?.from.col??0,l=n&&("range"===r?.mode||"row"===r?.mode)&&(n.from.row!==n.to.row||n.from.col!==n.to.col)?{endRow:n.to.row,endCol:n.to.col}:null,a=l?.endCol??this.visibleColumns.length-1,d=this.visibleColumns[s],c=d?{row:o,col:s,field:d.field,bounds:l}:null,u=[],h=i[0]?.length??0;for(let p=0;p<h&&s+p<=a;p++){const e=this.visibleColumns[s+p];e&&u.push(e.field)}const g={rows:i,text:t,target:c,fields:u};this.emit("paste",g),this.#o(g)}#o(e){if(!this.grid)return;const{pasteHandler:t}=this.config;if(null===t)return;(t??ae)(e,this.grid)}#n(e){return e instanceof Element&&!!e.closest('input, textarea, select, [contenteditable=""], [contenteditable="true"]')}#i(){const e=this.grid?.query("getSelection");return e?.[0]}#s(e){const t=this.#i();let i,r;if(e?.columns)i=oe(this.columns,e.columns);else if(t?.ranges.length&&"row"!==t.mode){const e=t.ranges[t.ranges.length-1],r=Math.min(e.from.col,e.to.col),n=Math.max(e.from.col,e.to.col);i=oe(this.visibleColumns.slice(r,n+1))}else i=oe(this.columns);if(e?.rowIndices)r=se(this.rows,e.rowIndices);else if(t?.ranges.length){const e=t.ranges[t.ranges.length-1],i=Math.min(e.from.row,e.to.row),n=Math.max(e.from.row,e.to.row);r=[];for(let t=i;t<=n;t++){const e=this.rows[t];e&&r.push(e)}}else r=this.rows;return{columns:i,rows:r}}#l(e,t,i){const n=i?.delimiter??this.config.delimiter??"\t",o=i?.newline??this.config.newline??"\n",s=i?.includeHeaders??this.config.includeHeaders??!1,l=i?.processCell??this.config.processCell,a=[];s&&a.push(e.map(e=>e.header||e.field).join(n));for(const d of t){const t=e.map(e=>{const t=r(d,e);return l?l(t,e.field,d):this.#a(e,t,d)});a.push(t.join(n))}return a.join(o)}#a(e,t,i){if(e.format)try{const r=e.format(t,i);return null==r?"":String(r)}catch{}if(e.renderer||e.viewRenderer){const t=this.#d(e.field,i);if(null!=t)return t}return function(e){return null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}(t)}#d(e,t){const i=this.gridElement;if(!i)return null;const r=this.rows.indexOf(t);if(-1===r)return null;const n=i.querySelector(`.cell[data-row="${r}"][data-field="${e}"]`);return n?n.textContent?.trim()??null:null}#r(e){const t=e.closest("[data-field-cache]");if(!t)return null;const i=t.dataset.fieldCache,r=t.dataset.row;if(!i||!r)return null;const n=parseInt(r,10);if(isNaN(n))return null;const o=this.columns.findIndex(e=>e.field===i);return-1===o?null:{row:n,col:o}}getSelectionAsText(e){const{columns:t,rows:i}=this.#s(e);return 0===t.length||0===i.length?"":this.#l(t,i,e)}async copy(i){const{columns:r,rows:n}=this.#s(i);if(0===r.length||0===n.length)return"";const o=this.#l(r,n,i);return await async function(i){try{return await navigator.clipboard.writeText(i),!0}catch(r){e(t,`Clipboard API failed: ${r}`);const n=document.createElement("textarea");n.value=i,n.style.position="fixed",n.style.opacity="0",n.style.pointerEvents="none",document.body.appendChild(n),n.select();const o=document.execCommand("copy");return document.body.removeChild(n),o}}(o),this.lastCopied={text:o,timestamp:Date.now()},this.emit("copy",{text:o,rowCount:n.length,columnCount:r.length}),o}async copyRows(e,t){return 0===e.length?"":this.copy({...t,rowIndices:e})}async paste(){const e=await async function(){try{return await navigator.clipboard.readText()}catch{return""}}();return e?le(e,this.config):null}getLastCopied(){return this.lastCopied}}function ce(e){if(null==e)return 100;if("number"==typeof e)return e;const t=parseFloat(e);return isNaN(t)?100:t}function ue(e){return e.map(e=>ce(e.width))}function he(e){const t=[];let i=0;for(const r of e)t.push(i),i+=ce(r.width);return t}function ge(e){return e.reduce((e,t)=>e+ce(t.width),0)}function pe(e,t,i,r,n){const o=i.length;if(0===o)return{startCol:0,endCol:0,visibleColumns:[]};let s=function(e,t,i){let r=0,n=t.length-1;for(;r<n;){const o=Math.floor((r+n)/2);t[o]+i[o]<=e?r=o+1:n=o}return r}(e,i,r);s=Math.max(0,s-n);const l=e+t;let a=s;for(let c=s;c<o;c++){if(i[c]>=l){a=c-1;break}a=c}a=Math.min(o-1,a+n);const d=[];for(let c=s;c<=a;c++)d.push(c);return{startCol:s,endCol:a,visibleColumns:d}}class fe extends i{name="columnVirtualization";get defaultConfig(){return{autoEnable:!0,threshold:30,overscan:3}}isVirtualized=!1;startCol=0;endCol=0;scrollLeft=0;totalWidth=0;columnWidths=[];columnOffsets=[];originalColumns=[];attach(e){super.attach(e);const t=this.columns;this.columnWidths=ue(t),this.columnOffsets=he(t),this.totalWidth=ge(t),this.endCol=t.length-1}detach(){this.#c(),this.columnWidths=[],this.columnOffsets=[],this.originalColumns=[],this.isVirtualized=!1,this.startCol=0,this.endCol=0,this.scrollLeft=0,this.totalWidth=0}#c(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".header-row");t&&(t.style.paddingLeft="",t.style.minWidth="");e.querySelectorAll(".data-grid-row").forEach(e=>{e.style.paddingLeft=""});const i=e.querySelector(".rows-viewport .rows");i&&(i.style.width="");const r=e.querySelector(".rows-body");r&&(r.style.minWidth="")}processColumns(e){(0===this.originalColumns.length||e.length>=this.originalColumns.length)&&(this.originalColumns=e,this.columnWidths=ue(e),this.columnOffsets=he(e),this.totalWidth=ge(e));const t=this.originalColumns,i=(r=t.length,n=this.config.threshold??30,!!(this.config.autoEnable??!0)&&r>n);var r,n;if(this.isVirtualized=i??!1,!i)return this.startCol=0,this.endCol=t.length-1,[...t];const o=this.grid?.clientWidth||800,s=pe(this.scrollLeft,o,this.columnOffsets,this.columnWidths,this.config.overscan??3);return this.startCol=s.startCol,this.endCol=s.endCol,s.visibleColumns.map(e=>t[e])}afterRender(){if(!this.isVirtualized)return;const e=this.gridElement;if(!e)return;const t=this.columnOffsets[this.startCol]??0,i=e.querySelector(".header-row"),r=e.querySelectorAll(".data-grid-row");i&&(i.style.paddingLeft=`${t}px`,i.style.minWidth=`${this.totalWidth}px`),r.forEach(e=>{e.style.paddingLeft=`${t}px`});const n=e.querySelector(".rows-viewport .rows");n&&(n.style.width=`${this.totalWidth}px`);const o=e.querySelector(".rows-body");o&&(o.style.minWidth=`${this.totalWidth}px`)}onScroll(e){if(!this.isVirtualized)return;Math.abs(e.scrollLeft-this.scrollLeft)<1||(this.scrollLeft=e.scrollLeft,this.requestColumnsRender())}getIsVirtualized(){return this.isVirtualized}getVisibleColumnRange(){return{start:this.startCol,end:this.endCol}}scrollToColumn(e){const t=this.columnOffsets[e]??0,i=this.gridElement;i&&(i.scrollLeft=t)}getColumnOffset(e){return this.columnOffsets[e]??0}getTotalWidth(){return this.totalWidth}}const me="@layer tbw-plugins{.tbw-context-menu{position:fixed;background:var(--tbw-context-menu-bg, var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg, var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border, var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius, var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow, 0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width, var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size, var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family, var(--tbw-font-family))}.tbw-context-menu-item{display:flex;align-items:center;padding:var(--tbw-context-menu-item-padding, var(--tbw-menu-item-padding));cursor:pointer;gap:var(--tbw-context-menu-item-gap, var(--tbw-menu-item-gap))}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover, var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger, var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size, var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut kbd{color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size, var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size, var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted))}.tbw-context-menu-separator{height:1px;background:var(--tbw-context-menu-border, var(--tbw-color-border));margin:var(--tbw-spacing-xs) 0}}";function we(e,t){return("function"==typeof e?e(t):e).filter(e=>!0!==e.hidden&&("function"!=typeof e.hidden||!e.hidden(t)))}function be(e,t){return!0===e.disabled||"function"==typeof e.disabled&&e.disabled(t)}function ve(e,t,i,r){const s=document.createElement("div");s.className="tbw-context-menu",s.setAttribute("role","menu");const l=e.some(e=>!e.separator&&e.icon);for(const a of e){if(a.separator){const e=document.createElement("div");e.className="tbw-context-menu-separator",e.setAttribute("role","separator"),s.appendChild(e);continue}const e=document.createElement("div");e.className="tbw-context-menu-item",a.cssClass&&e.classList.add(a.cssClass),e.setAttribute("role","menuitem"),e.setAttribute("data-id",a.id),e.setAttribute("tabindex","-1");const d=be(a,t);if(d&&(e.classList.add("disabled"),e.setAttribute("aria-disabled","true")),a.icon){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=n(a.icon),e.appendChild(t)}else if(l){const t=document.createElement("span");t.className="tbw-context-menu-icon",t.innerHTML=" ",e.appendChild(t)}const c=document.createElement("span");if(c.className="tbw-context-menu-label",c.textContent=a.name,e.appendChild(c),a.shortcut){const t=document.createElement("span");if(t.className="tbw-context-menu-shortcut",Array.isArray(a.shortcut))a.shortcut.forEach((e,i)=>{i>0&&t.appendChild(document.createTextNode("+"));const r=document.createElement("kbd");r.textContent=e,t.appendChild(r)});else{const e=document.createElement("kbd");e.textContent=a.shortcut,t.appendChild(e)}e.appendChild(t)}if(a.subMenu?.length){const s=document.createElement("span");s.className="tbw-context-menu-arrow",s.dataset.icon=o("submenuArrow"),void 0!==r&&("string"==typeof r?s.innerHTML=n(r):r instanceof HTMLElement&&s.appendChild(r.cloneNode(!0))),e.appendChild(s),e.addEventListener("mouseenter",()=>{if(e.querySelector(".tbw-context-menu"))return;if(!a.subMenu)return;const n=ve(we(a.subMenu,t),t,i,r);n.classList.add("tbw-context-submenu"),n.style.position="absolute",n.style.left="100%",n.style.top="0",e.style.position="relative",e.appendChild(n)}),e.addEventListener("mouseleave",()=>{const t=e.querySelector(".tbw-context-menu");t&&t.remove()})}d||!a.action||a.subMenu||e.addEventListener("click",e=>{e.stopPropagation(),i(a)}),s.appendChild(e)}return s}const ye="getContextMenuItems";let Ce=null,xe=null,Ee=0;const Se=/* @__PURE__ */new Set,Re=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:e=>{const t=e.grid;t?.query?.("clipboard:copy")}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:e=>{const t=e.grid;t?.query?.("export:csv")}}];class Ae extends i{static manifest={queries:[{type:ye,description:"Collects context menu items from other plugins for header right-click menus"}]};name="contextMenu";get defaultConfig(){return{items:Re}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;attach(e){super.attach(e),this.installGlobalHandlers(),Ee++,Se.add(this)}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,Se.delete(this),this.uninstallGlobalHandlers()}syncSelectionOnContextMenu(e){if(e<0)return[];const t=this.grid?.query("getSelectedRowIndices"),i=t?.[0];return i?i.includes(e)?i:(this.grid?.query("selectRows",[e]),[e]):[e]}static CSS_VARS_TO_COPY=["--tbw-color-panel-bg","--tbw-color-fg","--tbw-color-fg-muted","--tbw-color-border","--tbw-color-row-hover","--tbw-color-shadow","--tbw-color-danger","--tbw-border-radius","--tbw-font-family","--tbw-font-size-sm","--tbw-font-size-xs","--tbw-font-size-2xs","--tbw-spacing-xs","--tbw-icon-size","--tbw-menu-min-width","--tbw-menu-item-padding","--tbw-menu-item-gap","--tbw-context-menu-bg","--tbw-context-menu-fg","--tbw-context-menu-border","--tbw-context-menu-radius","--tbw-context-menu-shadow","--tbw-context-menu-hover","--tbw-context-menu-danger","--tbw-context-menu-muted","--tbw-context-menu-min-width","--tbw-context-menu-font-size","--tbw-context-menu-font-family","--tbw-context-menu-item-padding","--tbw-context-menu-item-gap","--tbw-context-menu-icon-size","--tbw-context-menu-shortcut-size","--tbw-context-menu-arrow-size","--tbw-icon-submenu-arrow"];copyGridStyles(e){const t=this.gridElement;if(!t)return;const i=getComputedStyle(t),r=[],n=i.getPropertyValue("color-scheme").trim();n&&r.push(`color-scheme: ${n}`);for(const o of Ae.CSS_VARS_TO_COPY){const e=i.getPropertyValue(o).trim();e&&r.push(`${o}: ${e}`)}if(r.length>0){const t=e.getAttribute("style")||"";e.setAttribute("style",t+r.join("; ")+";")}}installGlobalHandlers(){if(!xe&&"undefined"!=typeof document&&me&&(xe=document.createElement("style"),xe.id="tbw-context-menu-styles",xe.textContent=me,document.head.appendChild(xe)),!Ce){Ce=new AbortController;const e=Ce.signal,t=()=>{for(const e of Se)e.isMenuOpen()&&e.hideMenu();document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove())};document.addEventListener("click",t,{signal:e}),document.addEventListener("keydown",e=>{"Escape"===e.key&&t()},{signal:e}),document.addEventListener("scroll",t,{capture:!0,signal:e})}}uninstallGlobalHandlers(){Ee--,Ee>0||(Ce&&(Ce.abort(),Ce=null),xe&&(xe.remove(),xe=null))}collectPluginItems(e){if(!this.grid)return[];const t=this.grid.query(ye,e),i=[];for(const r of t)Array.isArray(r)&&i.push(...r);return i.sort((e,t)=>(e.order??100)-(t.order??100)),this.insertGroupSeparators(i)}insertGroupSeparators(e){if(e.length<=1)return e;const t=[];let i=-1;for(const r of e){if(r.separator){t.push(r);continue}const e=Math.floor((r.order??100)/10);i>=0&&e!==i&&t.push({id:`__sep-${i}-${e}`,label:"",separator:!0,action:()=>{}}),i=e,t.push(r)}return t}convertPluginItems(e){return e.map(e=>({id:e.id,name:e.label,icon:e.icon,shortcut:e.shortcut,disabled:e.disabled??!1,action:()=>e.action(),separator:e.separator,cssClass:e.cssClass}))}openMenuAt(e,t,i,r=!1){this.params=e,this.position={x:t,y:i};const n=this.collectPluginItems(e);let o=we(this.config.items??Re,e);if(n.length>0){const e=this.convertPluginItems(n);o=o.length>0&&e.length>0?[...o,{id:"__plugin-sep",name:"",separator:!0},...e]:[...o,...e]}var s,l;(o=function(e){const t=[];for(const i of e)i.separator&&(0===t.length||t[t.length-1].separator)||t.push(i);return t.length>0&&t[t.length-1].separator&&t.pop(),t}(o),o.length)&&(document.querySelectorAll(".tbw-context-menu").forEach(e=>e.remove()),this.menuElement=null,this.menuElement=ve(o,e,t=>{t.action&&t.action(e),this.hideMenu()},this.grid?.gridConfig?.icons?.submenuArrow),s=this.menuElement,l=()=>this.hideMenu(),s.addEventListener("keydown",e=>{const t=Array.from(s.querySelectorAll('[role="menuitem"]:not(.disabled)'));if(!t.length)return;const i=document.activeElement,r=t.indexOf(i);switch(e.key){case"ArrowDown":e.preventDefault(),t[r<t.length-1?r+1:0].focus();break;case"ArrowUp":e.preventDefault(),t[r>0?r-1:t.length-1].focus();break;case"Enter":case" ":e.preventDefault(),i&&t.includes(i)&&i.click();break;case"Escape":e.preventDefault(),l()}}),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),function(e,t,i){e.style.position="fixed",e.style.left=`${t}px`,e.style.top=`${i}px`,e.style.visibility="hidden",e.style.zIndex="10000";const r=e.getBoundingClientRect(),n=window.innerWidth,o=window.innerHeight;let s=t,l=i;t+r.width>n&&(s=t-r.width),i+r.height>o&&(l=i-r.height),s=Math.max(0,s),l=Math.max(0,l),e.style.left=`${s}px`,e.style.top=`${l}px`,e.style.visibility="visible"}(this.menuElement,t,i),this.isOpen=!0,r&&function(e){const t=e.querySelector('[role="menuitem"]:not(.disabled)');t?.focus()}(this.menuElement),this.emit("context-menu-open",{params:e,items:o}))}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-grid-root");t&&"true"!==t.getAttribute("data-context-menu-bound")&&(t.setAttribute("data-context-menu-bound","true"),t.addEventListener("contextmenu",e=>{const t=e;t.preventDefault();const i=t.target,r=i.closest("[data-row][data-col]"),n=i.closest('[part~="header-cell"]');let o;if(r){const e=parseInt(r.getAttribute("data-row")??"-1",10),i=parseInt(r.getAttribute("data-col")??"-1",10),n=this.visibleColumns[i],s=this.rows[e],l=this.syncSelectionOnContextMenu(e);o={row:s,rowIndex:e,column:n,columnIndex:i,field:n?.field??"",value:s?.[n?.field]??null,isHeader:!1,event:t,selectedRows:l}}else{if(!n)return;{const e=parseInt(n.getAttribute("data-col")??"-1",10),i=this.visibleColumns[e];o={row:null,rowIndex:-1,column:i,columnIndex:e,field:i?.field??"",value:null,isHeader:!0,event:t,selectedRows:[]}}}this.openMenuAt(o,t.clientX,t.clientY)}))}onKeyDown(e){const t="F10"===e.key&&e.shiftKey,i="ContextMenu"===e.key;if(!t&&!i)return;e.preventDefault();const r=this.grid;if(!r)return;const n=r._focusRow,o=r._focusCol,s=this.visibleColumns[o],l=this.rows[n],a=this.gridElement,d=a?.querySelector(`[data-row="${n}"][data-col="${o}"]`);let c=0,u=0;if(d){const e=d.getBoundingClientRect();c=e.left+e.width/2,u=e.bottom}const h=this.syncSelectionOnContextMenu(n),g={row:l,rowIndex:n,column:s,columnIndex:o,field:s?.field??"",value:l?.[s?.field]??null,isHeader:!1,event:e,selectedRows:h};return this.openMenuAt(g,c,u,!0),!0}showMenu(e,t,i){const r={row:i.row??null,rowIndex:i.rowIndex??-1,column:i.column??null,columnIndex:i.columnIndex??-1,field:i.field??"",value:i.value??null,isHeader:i.isHeader??!1,event:i.event??new MouseEvent("contextmenu"),selectedRows:i.selectedRows??[]};this.openMenuAt(r,e,t)}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen&&(this.isOpen=!1)}isMenuOpen(){return this.isOpen}}function ke(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="date",t.value instanceof Date?r.valueAsDate=t.value:"string"==typeof t.value&&t.value&&(r.value=t.value.split("T")[0]),i?.min&&(r.min=i.min),i?.max&&(r.max=i.max),i?.placeholder&&(r.placeholder=i.placeholder);return r.addEventListener("change",()=>{var n;if(r.value)"string"==typeof t.value?t.commit(r.value):t.commit(r.valueAsDate);else if(e.nullable)t.commit(null);else{const e=i?.default;"string"==typeof t.value||"string"==typeof e?t.commit("string"==typeof e?e:`${(n=e??/* @__PURE__ */new Date).getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`):t.commit(e instanceof Date?e:/* @__PURE__ */new Date)}}),r.addEventListener("keydown",e=>{"Escape"===e.key&&t.cancel()}),r}}const Ie="__tbw_null__";function _e(e){switch(e.type){case"number":return function(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="number",r.value=null!=t.value?String(t.value):"",void 0!==i?.min&&(r.min=String(i.min)),void 0!==i?.max&&(r.max=String(i.max)),void 0!==i?.step&&(r.step=String(i.step)),i?.placeholder&&(r.placeholder=i.placeholder);const n=()=>{""===r.value?e.nullable?t.commit(null):t.commit(i?.min??0):t.commit(Number(r.value))};return r.addEventListener("blur",n),r.addEventListener("keydown",e=>{"Enter"===e.key&&n(),"Escape"===e.key&&t.cancel()}),r}}(e);case"boolean":return e=>{const t=document.createElement("input");return t.type="checkbox",t.checked=!!e.value,t.addEventListener("change",()=>e.commit(t.checked)),t};case"date":return ke(e);case"select":return function(e){return t=>{const i=e.editorParams,r=document.createElement("select");if(e.multi&&(r.multiple=!0),e.nullable||i?.includeEmpty){const n=document.createElement("option");n.value=e.nullable?Ie:"",n.textContent=e.nullable?i?.emptyLabel??"(Blank)":i?.emptyLabel??"",null==t.value&&(n.selected=!0),r.appendChild(n)}const n=function(e){const t=e.options;return t?"function"==typeof t?t():t:[]}(e);n.forEach(i=>{const n=document.createElement("option");n.value=String(i.value),n.textContent=i.label,e.multi&&Array.isArray(t.value)&&t.value.includes(i.value)?n.selected=!0:e.multi||t.value!==i.value||(n.selected=!0),r.appendChild(n)});const o=()=>{if(e.multi){const e=Array.from(r.selectedOptions).map(e=>e.value);t.commit(e)}else e.nullable&&r.value===Ie?t.commit(null):t.commit(r.value)};return r.addEventListener("change",o),r.addEventListener("blur",o),r.addEventListener("keydown",e=>{"Escape"===e.key&&t.cancel()}),r}}(e);default:return function(e){return t=>{const i=e.editorParams,r=document.createElement("input");r.type="text",r.value=null!=t.value?String(t.value):"",void 0!==i?.maxLength&&(r.maxLength=i.maxLength),i?.pattern&&(r.pattern=i.pattern),i?.placeholder&&(r.placeholder=i.placeholder);const n=()=>{const i=r.value;""!==i?"string"==typeof t.value&&i===t.value.replace(/[\n\r]/g,"")||("number"==typeof t.value?t.commit(Number(i)):t.commit(i)):e.nullable?t.commit(null):t.commit("")};return r.addEventListener("blur",n),r.addEventListener("keydown",e=>{"Enter"===e.key&&n(),"Escape"===e.key&&t.cancel()}),r}}(e)}}function Te(e,t,i){if(e instanceof HTMLInputElement){if("checkbox"===e.type)return e.checked;if("number"===e.type){if(""===e.value){if(t?.nullable)return null;const e=t?.editorParams;return e?.min??0}return Number(e.value)}if("date"===e.type)return e.value?"string"==typeof i?e.value:e.valueAsDate:t?.nullable?null:"string"==typeof i?i||/* @__PURE__ */(new Date).toISOString().slice(0,10):i??/* @__PURE__ */new Date;if("number"==typeof i){if(""===e.value){if(t?.nullable)return null;const e=t?.editorParams;return e?.min??0}return Number(e.value)}return""===e.value&&null==i?t?.nullable?null:"":"string"==typeof i&&e.value===i.replace(/[\n\r]/g,"")?i:e.value}return"number"===t?.type&&""!==e.value||"number"==typeof i&&""!==e.value?Number(e.value):null==i&&""===e.value?t?.nullable?null:"":e.value}class Le{#u=/* @__PURE__ */new Map;#h;constructor(e){this.#h=e}setInvalid(e,t,i=""){let r=this.#u.get(e);r||(r=/* @__PURE__ */new Map,this.#u.set(e,r)),r.set(t,i),this.#h(e,t,!0)}clearInvalid(e,t){const i=this.#u.get(e);i&&(i.delete(t),0===i.size&&this.#u.delete(e)),this.#h(e,t,!1)}clearRowInvalid(e){const t=this.#u.get(e);if(t){const i=Array.from(t.keys());this.#u.delete(e),i.forEach(t=>this.#h(e,t,!1))}}clearAllInvalid(){const e=Array.from(this.#u.entries());this.#u.clear(),e.forEach(([e,t])=>{t.forEach((t,i)=>this.#h(e,i,!1))})}isCellInvalid(e,t){return this.#u.get(e)?.has(t)??!1}getInvalidMessage(e,t){return this.#u.get(e)?.get(t)}hasInvalidCells(e){const t=this.#u.get(e);return!!t&&t.size>0}getInvalidFields(e){return new Map(this.#u.get(e)??[])}}function Fe(e,t,i){const r=e.get(t);return!!r&&!Ge(r,i)}function Ge(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(typeof e!=typeof t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!Ge(e[i],t[i]))return!1;return!0}if("object"==typeof e){const i=e,r=t,n=Object.keys(i),o=Object.keys(r);if(n.length!==o.length)return!1;for(const e of n)if(!Ge(i[e],r[e]))return!1;return!0}return!1}function De(e,t,i){e.set(t,structuredClone(i))}function Me(e,t,i){const r=e.get(t);if(!r)return!1;const n=r,o=i;for(const s of Object.keys(n))o[s]=n[s];return!0}class Ne{baselines=/* @__PURE__ */new Map;baselinesWereCaptured=!1;newRowIds=/* @__PURE__ */new Set;changedRowIds=/* @__PURE__ */new Set;committedDirtyRowIds=/* @__PURE__ */new Set;clear(){this.changedRowIds.clear(),this.committedDirtyRowIds.clear(),this.baselines.clear(),this.newRowIds.clear(),this.baselinesWereCaptured=!1}capture(e,t){const i=this.baselines.size;!function(e,t,i){for(const r of t)try{const t=i(r);null==t||e.has(t)||e.set(t,structuredClone(r))}catch{}}(this.baselines,e,t),this.baselines.size>i&&(this.baselinesWereCaptured=!0)}drainCapturedFlag(){return this.baselinesWereCaptured?(this.baselinesWereCaptured=!1,this.baselines.size):null}isRowDirty(e,t){return Fe(this.baselines,e,t)}hasAnyDirty(e){if(this.newRowIds.size>0)return!0;for(const[t]of this.baselines){const i=e(t);if(i&&Fe(this.baselines,t,i))return!0}return!1}isCellDirty(e,t,i){return function(e,t,i,r){const n=e.get(t);return!!n&&!Ge(n[r],i[r])}(this.baselines,e,t,i)}getRowDirtyState(e,t){const i=this.newRowIds.has(e);return{isNew:i,isCommittedDirty:!i&&this.committedDirtyRowIds.has(e)&&Fe(this.baselines,e,t),hasBaseline:this.baselines.has(e)}}markPristine(e,t){De(this.baselines,e,t),this.newRowIds.delete(e),this.changedRowIds.delete(e),this.committedDirtyRowIds.delete(e)}markNew(e){this.newRowIds.add(e),this.committedDirtyRowIds.add(e)}markDirty(e){this.changedRowIds.add(e),this.committedDirtyRowIds.add(e)}markAllPristine(e){for(const[t]of this.baselines){const i=e(t);i&&De(this.baselines,t,i)}this.newRowIds.clear(),this.changedRowIds.clear(),this.committedDirtyRowIds.clear()}getOriginalRow(e){return function(e,t){const i=e.get(t);return i?structuredClone(i):void 0}(this.baselines,e)}hasBaseline(e){return this.baselines.has(e)}getDirtyRows(e){const t=[];for(const[i,r]of this.baselines){const n=e(i);n&&Fe(this.baselines,i,n)&&t.push({id:i,original:structuredClone(r),current:n})}for(const i of this.newRowIds){const r=e(i);r&&t.push({id:i,original:void 0,current:r})}return t}getDirtyRowIds(e){const t=[];for(const[i]of this.baselines){const r=e(i);r&&Fe(this.baselines,i,r)&&t.push(i)}for(const i of this.newRowIds)t.push(i);return t}revertRow(e,t){const i=Me(this.baselines,e,t);return i&&(this.changedRowIds.delete(e),this.committedDirtyRowIds.delete(e)),i}revertAll(e){for(const[t]of this.baselines){const i=e(t);i&&Me(this.baselines,t,i)}this.changedRowIds.clear(),this.committedDirtyRowIds.clear()}getChangedRows(e){const t=[];for(const i of this.changedRowIds){const r=e(i);r&&t.push(r)}return t}getChangedRowIds(){return Array.from(this.changedRowIds)}isRowChanged(e){return this.changedRowIds.has(e)}}const qe='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function Pe(e){return"string"==typeof e&&("__proto__"!==e&&"constructor"!==e&&"prototype"!==e)}function ze(e){}function He(e,t){return!1===e.onBeforeEditClose?.(t)}function Oe(t,i,r,n,o,l,a,d){if(!n.editable)return;if(l.classList.contains("editing"))return;const{grid:c,isGridMode:u,config:h,editingCells:g,editorValueCallbacks:p}=t;let f;try{f=c.getRowId?.(i)}catch{}const m=f?e=>c.updateRow(f,e,"cascade"):ze,w=Pe(n.field)?i[n.field]:void 0;l.classList.add("editing"),g.add(`${r}:${o}`);const b=d??l.parentElement;b&&function(e){const t=(e.__editingCellCount??0)+1;e.__editingCellCount=t,e.setAttribute("data-has-editing","")}(b);let v=!1;const y=e=>{if(v||!u&&!t.isEditSessionActive())return;const o=f?c._getRowEntry(f):void 0,s=o?.row??i,l=o?.index??r;t.commitCellValue(l,n,e,s)},C=()=>{if(v=!0,Pe(n.field)){const e=f?c._getRowEntry(f):void 0;(e?.row??i)[n.field]=w}},x=document.createElement("div");x.className="tbw-editor-host",l.firstElementChild&&c.__frameworkAdapter?.releaseCell?.(l),l.innerHTML="",l.appendChild(x),x.addEventListener("keydown",e=>{if(!e.defaultPrevented){if("Enter"===e.key){const t=e.target;if(t&&"true"===t.getAttribute?.("aria-expanded")&&t.hasAttribute?.("aria-controls"))return}if("Enter"===e.key){if(u){e.stopPropagation(),e.preventDefault();const t=x.querySelector("input,textarea,select");return void(t&&y(Te(t,n,w)))}if(He(h,e))return;e.stopPropagation(),e.preventDefault(),v=!0,t.exitRowEdit(r,!1)}if("Escape"===e.key){if(u)return e.stopPropagation(),void e.preventDefault();if(He(h,e))return;e.stopPropagation(),e.preventDefault(),C(),t.exitRowEdit(r,!0)}}});const E=n,S=E.__editorTemplate,R=function(e,t){if(t.editor)return t.editor;if(t.__editorTemplate)return"template";if(!t.type)return;const i=e.effectiveConfig?.typeDefaults;if(i?.[t.type]?.editor)return i[t.type].editor;const r=e.__frameworkAdapter;if(r?.getTypeDefault){const i=r.getTypeDefault(t.type,e._hostElement);if(i?.editor)return i.editor}}(c,E)??_e(n),A=w,k=`${r}:${n.field}`,I=[];p.set(k,e=>{for(const t of I)t(e)});const _=e=>{I.push(e)};if("template"===R&&S)!function(e,t,i,r,n,o,s,l,a){const d=i.__editorTemplate;if(!d)return;const c=d.cloneNode(!0),u=i.__compiledEditor;u?c.innerHTML=u({row:r,value:n,field:i.field,column:i,commit:o,cancel:s}):c.querySelectorAll("*").forEach(e=>{1===e.childNodes.length&&e.firstChild?.nodeType===Node.TEXT_NODE&&(e.textContent=e.textContent?.replace(/{{\s*value\s*}}/g,null==n?"":String(n)).replace(/{{\s*row\.([a-zA-Z0-9_]+)\s*}}/g,(e,t)=>{if(!Pe(t))return"";const i=r[t];return null==i?"":String(i)})||"")});const h=c.querySelector("input,textarea,select");if(h){h instanceof HTMLInputElement&&"checkbox"===h.type?h.checked=!!n:h.value=String(n??"");let t=!1;h.addEventListener("blur",()=>{t||o(Te(h,i,n))}),h.addEventListener("keydown",r=>{const l=r;if("Enter"===l.key){if(He(e.config,l))return;l.stopPropagation(),l.preventDefault(),t=!0,o(Te(h,i,n)),e.exitRowEdit(a,!1)}if("Escape"===l.key){if(He(e.config,l))return;l.stopPropagation(),l.preventDefault(),s(),e.exitRowEdit(a,!0)}}),h instanceof HTMLInputElement&&"checkbox"===h.type&&h.addEventListener("change",()=>o(h.checked)),l||setTimeout(()=>h.focus({preventScroll:!0}),0)}t.appendChild(c)}(t,x,E,i,w,y,C,a,r),_(e=>{if(null!=e&&"object"==typeof e)return;const t=x.querySelector("input,textarea,select");t&&(t instanceof HTMLInputElement&&"checkbox"===t.type?t.checked=!!e:t.value=String(e??""))});else if("string"==typeof R){const e=document.createElement(R);e.value=A,e.addEventListener("change",()=>y(e.value)),_(t=>{e.value=t}),x.appendChild(e),a||queueMicrotask(()=>{const e=x.querySelector(qe);e?.focus({preventScroll:!0})})}else if("function"==typeof R){const e=R({row:i,rowId:f??"",value:A,field:n.field,column:n,commit:y,cancel:C,updateRow:m,onValueChange:_,grid:t.grid});if("string"==typeof e)x.innerHTML=e,function(e,t,i,r){const n=e.querySelector("input,textarea,select");n&&(n.addEventListener("blur",()=>{i(Te(n,t,r))}),n instanceof HTMLInputElement&&"checkbox"===n.type?n.addEventListener("change",()=>i(n.checked)):n instanceof HTMLSelectElement&&n.addEventListener("change",()=>i(Te(n,t,r))))}(x,n,y,w),_(e=>{const t=x.querySelector("input,textarea,select");t&&(t instanceof HTMLInputElement&&"checkbox"===t.type?t.checked=!!e:t.value=String(e??""))});else if(e instanceof Node){x.appendChild(e);e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?_(t=>{e instanceof HTMLInputElement&&"checkbox"===e.type?e.checked=!!t:e.value=String(t??"")}):l.setAttribute("data-editor-managed","")}else!e&&x.hasChildNodes()&&l.setAttribute("data-editor-managed","");a||queueMicrotask(()=>{const e=x.querySelector(qe);e?.focus({preventScroll:!0})})}else if(R&&"object"==typeof R){const r=document.createElement("div");r.setAttribute("data-external-editor",""),r.setAttribute("data-field",n.field),x.appendChild(r),l.setAttribute("data-editor-managed","");const o={row:i,rowId:f??"",value:A,field:n.field,column:n,commit:y,cancel:C,updateRow:m,onValueChange:_,grid:t.grid};if(R.mount)try{R.mount({placeholder:r,context:o,spec:R})}catch(T){e(s,`External editor mount error for column '${n.field}': ${T}`,t.grid.id)}else c.dispatchEvent(new CustomEvent("mount-external-editor",{detail:{placeholder:r,spec:R,context:o}}))}}class Ke extends i{static manifest={ownedProperties:[{property:"editable",level:"column",description:'the "editable" column property',isUsed:e=>!0===e||"function"==typeof e},{property:"editor",level:"column",description:'the "editor" column property'},{property:"editorParams",level:"column",description:'the "editorParams" column property'},{property:"nullable",level:"column",description:'the "nullable" column property (allows null values)'}],events:[{type:"cell-edit-committed",description:"Emitted when a cell edit is committed (for plugin-to-plugin coordination)"}],queries:[{type:"isEditing",description:"Returns whether any cell is currently being edited"}]};name="editing";styles="@layer tbw-plugins{tbw-grid{--tbw-editing-bg: var(--tbw-color-selection);--tbw-editing-row-bg: var(--tbw-editing-bg);--tbw-editing-border: var(--tbw-border-input, 1px solid var(--tbw-color-border-strong));--tbw-padding-editing-input: var(--tbw-cell-padding-input, 2px 6px);--tbw-font-size-editor: inherit;--tbw-editing-row-outline-color: var(--tbw-color-accent);--tbw-editing-row-outline-width: 1px;&:not(.tbw-grid-mode) .data-grid-row:has(.editing){background:var(--tbw-editing-row-bg);outline:var(--tbw-editing-row-outline-width) solid var(--tbw-editing-row-outline-color);outline-offset:calc(-1 * var(--tbw-editing-row-outline-width))}.data-grid-row>.cell.editing{overflow:hidden;padding:0;display:flex;min-height:max(var(--tbw-row-height),calc(1lh + 2 * var(--tbw-cell-padding-v, .25em) + var(--tbw-border-width, 1px)));align-items:center;justify-content:center}.data-grid-row>.cell.editing input:not([type=checkbox]),.data-grid-row>.cell.editing select,.data-grid-row>.cell.editing textarea{width:100%;height:100%;flex:1 1 auto;align-self:stretch;min-width:0;border:var(--tbw-editing-border);padding:var(--tbw-padding-editing-input);font-size:var(--tbw-font-size-editor)}.tbw-editor-host{display:contents}--tbw-invalid-bg: light-dark(#fef2f2, #450a0a);--tbw-invalid-border-color: light-dark(#ef4444, #f87171);.data-grid-row>.cell[data-invalid=true]{background:var(--tbw-invalid-bg);outline:1px solid var(--tbw-invalid-border-color);outline-offset:-1px}}}";get defaultConfig(){return{mode:"row",editOn:"click"}}get#g(){return"grid"===this.config.mode}#p(e,t){const i=this.#f.effectiveConfig?.rowEditable;if(i&&!i(t))return!1;const{editable:r}=e;return"function"==typeof r?r(t):!0===r}#m(e){return!0===e.editable||"function"==typeof e.editable}#w=-1;#b;#v;#y=-1;#C=/* @__PURE__ */new Map;#x=/* @__PURE__ */new Set;#E=/* @__PURE__ */new Map;#S=!1;#R=-1;#A;#k=!1;#I=!1;#_=!1;#T=null;#L=new Ne;#F;get#f(){return this.grid}attach(e){super.attach(e);const t=this.disconnectSignal,i=this.#f;if(this.#A=new Le((e,t,i)=>{this.#G(e,t,i)}),this.#F={grid:i,isGridMode:this.#g,config:this.config,editingCells:this.#x,editorValueCallbacks:this.#E,isEditSessionActive:()=>-1!==this.#w,commitCellValue:(e,t,i,r)=>this.#D(e,t,i,r),exitRowEdit:(e,t)=>this.#M(e,t)},i._activeEditRows=-1,i._rowEditSnapshots=/* @__PURE__ */new Map,Object.defineProperty(e,"changedRows",{get:()=>this.changedRows,configurable:!0}),Object.defineProperty(e,"changedRowIds",{get:()=>this.changedRowIds,configurable:!0}),Object.defineProperty(e,"_changedRowIdSet",{get:()=>this.#L.changedRowIds,configurable:!0}),e.resetChangedRows=e=>this.resetChangedRows(e),document.addEventListener("keydown",e=>{if(!this.#g&&"Escape"===e.key&&-1!==this.#w){if(He(this.config,e))return;this.#M(this.#w,!0)}},{capture:!0,signal:t}),document.addEventListener("mousedown",e=>{if(this.#g)return;if(-1===this.#w)return;const t=i.findRenderedRowElement?.(this.#w);if(!t)return;if((e.composedPath&&e.composedPath()||[]).includes(t))return;const r=e.target;if(!r||this.gridElement.contains(r)||!this.grid.containsFocus?.(r)){if(r&&!this.gridElement.contains(r)){const e=i.findRenderedRowElement?.(this.#w);if(e&&function(e,t){if(!e)return!1;const i=t.querySelectorAll('[aria-expanded="true"][aria-controls]');for(let r=0;r<i.length;r++){const n=i[r].getAttribute("aria-controls");if(!n)continue;const o=t.ownerDocument?.getElementById(n);if(o&&o.contains(e))return!0}return!1}(r,e))return}He(this.config,e)||queueMicrotask(()=>{-1!==this.#w&&this.#M(this.#w,!1)})}},{signal:t}),this.config.focusTrap&&this.gridElement.addEventListener("focusout",e=>{if(this.#g)return;if(-1===this.#w)return;const t=e.relatedTarget;t&&this.grid.containsFocus?.(t)||t&&this.gridElement.contains(t)||queueMicrotask(()=>{-1!==this.#w&&this.#N()})},{signal:t}),this.gridElement.addEventListener("cell-change",e=>{const t=e.detail;if("user"===t.source)return;const i=`${t.rowIndex}:${t.field}`,r=this.#E.get(i);r&&r(t.newValue)},{signal:t}),this.config.dirtyTracking){const e=e=>{const t=e.detail,i=t?.action;if(!i)return;const r=this.rows[i.rowIndex];if(!r)return;const n=this.grid.getRowId(r);if(!n)return;const o=this.#L.isRowDirty(n,r);this.emit("dirty-change",{rowId:n,row:r,original:this.#L.getOriginalRow(n),type:o?"modified":"pristine"})};this.gridElement.addEventListener("undo",e,{signal:t}),this.gridElement.addEventListener("redo",e,{signal:t}),this.on("row-inserted",e=>{const t=this.grid.getRowId(e.row);null!=t&&this.markAsNew(String(t))})}this.#g&&(i._isGridEditMode=!0,this.gridElement.classList.add("tbw-grid-mode"),this.requestRender(),this.gridElement.addEventListener("focusin",e=>{const t=e.target;if(t!==this.gridElement&&t.matches(qe)){if(this.#I)return t.blur(),void this.gridElement.focus();const e=i._focusRow,r=i._focusCol,n=this.#T;if(!n||n.rowIndex!==e||n.colIndex!==r){const t=i._visibleColumns?.[r],n=i._rows?.[e];if(t?.field&&n){const i=t.field;this.#T={rowIndex:e,colIndex:r,field:i,value:n[i]}}}this.#k=!0}},{signal:t}),this.gridElement.addEventListener("focusout",e=>{const t=e.relatedTarget;t&&(this.gridElement.contains(t)||this.grid.containsFocus?.(t))&&t.matches(qe)||(this.#k=!1,this.#T=null)},{signal:t}),this.gridElement.addEventListener("keydown",e=>{if("Escape"===e.key&&this.#k){if(He(this.config,e))return void queueMicrotask(()=>{if(this.#k){this.#q();const e=document.activeElement;e&&this.gridElement.contains(e)&&(e.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0}});this.#q();const t=document.activeElement;t&&this.gridElement.contains(t)&&(t.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0,e.preventDefault(),e.stopPropagation()}},{capture:!0,signal:t}),this.gridElement.addEventListener("mousedown",e=>{e.target.matches(qe)&&(this.#I=!1)},{signal:t}))}detach(){this.#f._isGridEditMode=!1,this.gridElement.classList.remove("tbw-grid-mode"),this.#w=-1,this.#b=void 0,this.#v=void 0,this.#y=-1,this.#C.clear(),this.#L.clear(),this.#x.clear(),this.#E.clear(),this.#k=!1,this.#I=!1,this.#T=null,this.#_=!1,super.detach()}handleQuery(e){if("isEditing"===e.type)return this.#g||-1!==this.#w}onCellClick(e){if(this.#g)return!1;const t=this.#f,i=this.config.editOn??t.effectiveConfig?.editOn;if(!1===i||"manual"===i)return!1;if("click"!==i&&"dblclick"!==i)return!1;const r="dblclick"===e.originalEvent.type;if("click"===i&&r)return!1;if("dblclick"===i&&!r)return!1;const{rowIndex:n}=e,o=t._columns?.some(e=>this.#m(e));if(!o)return!1;const s=t._rows[n],l=t.effectiveConfig?.rowEditable;return!(s&&l&&!l(s))&&(e.originalEvent.stopPropagation(),this.beginBulkEdit(n),!0)}onKeyDown(e){const t=this.#f;if("Escape"===e.key){if(this.#g&&this.#k){this.#q();const e=document.activeElement;return e&&this.gridElement.contains(e)&&(e.blur(),this.gridElement.focus()),this.#k=!1,this.#I=!0,this.requestAfterRender(),!0}if(-1!==this.#w&&!this.#g)return He(this.config,e)||this.#M(this.#w,!0),!0}if(this.#g&&!this.#k&&("ArrowUp"===e.key||"ArrowDown"===e.key||"ArrowLeft"===e.key||"ArrowRight"===e.key))return!1;if(this.#g&&this.#k&&("ArrowUp"===e.key||"ArrowDown"===e.key))return!0;if(("ArrowUp"===e.key||"ArrowDown"===e.key)&&-1!==this.#w&&!this.#g)return!0;if("Tab"===e.key&&(-1!==this.#w||this.#g)){if(e.preventDefault(),this.#_)return this.#M(this.#w,!1),!0;const t=!e.shiftKey;return this.#P(t),!0}if(" "===e.key||"Spacebar"===e.key){if(-1!==this.#w)return!1;const i=t._focusRow,r=t._focusCol;if(i>=0&&r>=0){const n=t._visibleColumns[r],o=t._rows[i];if(n&&o&&this.#p(n,o)&&"boolean"===n.type){const t=n.field;if(Pe(t)){const r=!o[t];return this.#D(i,n,r,o),e.preventDefault(),this.requestRender(),!0}}}return!1}if(!("Enter"!==e.key||e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){if(this.#g&&!this.#k)return this.#N(),!0;if(-1!==this.#w){const t=e.target;return(!t||"true"!==t.getAttribute?.("aria-expanded")||!t.hasAttribute?.("aria-controls"))&&!!He(this.config,e)}const i=this.config.editOn??t.effectiveConfig?.editOn;if(!1===i||"manual"===i)return!1;const r=t._focusRow,n=t._focusCol;if(r>=0){const i=t._columns?.some(e=>this.#m(e)),o=t._rows[r],s=t.effectiveConfig?.rowEditable,l=o&&s&&!s(o);if(i&&!l){const i=t._visibleColumns[n],o=t._rows[r],s=i?.field??"",l=s&&o?o[s]:void 0,a=this.gridElement.querySelector(`[data-row="${r}"][data-col="${n}"]`),d=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,detail:{rowIndex:r,colIndex:n,field:s,value:l,row:o,cellEl:a,trigger:"keyboard",originalEvent:e}});return this.gridElement.dispatchEvent(d),d.defaultPrevented?(e.preventDefault(),!0):(this.beginBulkEdit(r),!0)}}return!1}if("F2"===e.key){if(-1!==this.#w||this.#g)return!1;if(!1===(this.config.editOn??t.effectiveConfig?.editOn))return!1;const i=t._focusRow,r=t._focusCol;if(i>=0&&r>=0){const n=t._visibleColumns[r],o=t._rows[i];if(n&&o&&this.#p(n,o)&&n.field)return e.preventDefault(),this.beginCellEdit(i,n.field),!0}return!1}return!1}processColumns(e){const t=this.#f,i=t.effectiveConfig?.typeDefaults,r=t.__frameworkAdapter;return i||r?.getTypeDefault?e.map(e=>{if(!e.type)return e;let n;if(i?.[e.type]?.editorParams&&(n=i[e.type].editorParams),!n&&r?.getTypeDefault){const i=r.getTypeDefault(e.type,t._hostElement);i?.editorParams&&(n=i.editorParams)}return n?{...e,editorParams:{...n,...e.editorParams}}:e}):e}processRows(e){const t=this.#f;if(this.config.dirtyTracking&&t.getRowId&&this.#L.capture(e,e=>{try{return t.getRowId?.(e)}catch{return}}),-1===this.#w||this.#g)return e;const i=this.#b,r=this.#v;if(!i||!r)return e;const n=[...e];let o=-1;for(let s=0;s<n.length;s++)try{if(t.getRowId?.(n[s])===i){o=s;break}}catch{}return-1===o?(setTimeout(()=>this.cancelActiveRowEdit(),0),n):(n[o]=r,this.#w!==o&&this.#z(this.#w,o),n)}afterRender(){const e=this.#f;if(-1!==this.#w&&this.#v&&!this.#g&&e._rows[this.#w]!==this.#v){const t=e._rows.indexOf(this.#v);if(-1===t)return void setTimeout(()=>this.cancelActiveRowEdit(),0);this.#z(this.#w,t)}if(this.#S&&(this.#S=!1,this.#H(e)),-1!==this.#R){const t=this.#R;this.#R=-1,e.animateRow?.(t,"change")}const t=this.#L.drainCapturedFlag();if(null!=t&&this.emit("baselines-captured",{count:t}),!this.#g&&0!==this.#x.size)for(const i of this.#x){const[t,r]=i.split(":"),n=parseInt(t,10),o=parseInt(r,10),s=e.findRenderedRowElement?.(n);if(!s)continue;const l=s.querySelector(`.cell[data-col="${o}"]`);if(!l||l.classList.contains("editing"))continue;const a=e._rows[n],d=e._visibleColumns[o];a&&d&&this.#O(a,n,d,o,l,!0)}}afterCellRender(e){const{row:t,rowIndex:i,column:r,colIndex:n,cellElement:o}=e,s=this.#p(r,t);if(s)o.removeAttribute("aria-readonly");else if(o.setAttribute("aria-readonly","true"),this.#g&&o.classList.contains("editing")){o.classList.remove("editing");const e=t[r.field];o.textContent=null==e?"":String(e)}this.#g&&s&&(o.classList.contains("editing")||this.#O(t,i,r,n,o,!0,e.rowElement))}afterRowRender(e){if(!this.config.dirtyTracking)return;const t=this.#f,i=t.getRowId?.(e.row);if(!i)return;const{isNew:r,isCommittedDirty:n,hasBaseline:o}=this.#L.getRowDirtyState(i,e.row),s=e.rowElement;if(s.classList.toggle("tbw-row-dirty",n),s.classList.toggle("tbw-row-new",r),o){const t=s.querySelectorAll(".cell[data-field]");for(let r=0;r<t.length;r++){const n=t[r],o=n.getAttribute("data-field");o&&n.classList.toggle("tbw-cell-dirty",this.#L.isCellDirty(i,e.row,o))}}else{const e=s.querySelectorAll(".tbw-cell-dirty");for(let t=0;t<e.length;t++)e[t].classList.remove("tbw-cell-dirty")}}onScrollRender(){this.afterRender()}get changedRows(){return this.#L.getChangedRows(e=>this.grid.getRow(e))}get changedRowIds(){return this.#L.getChangedRowIds()}get activeEditRow(){return this.#w}get activeEditCol(){return this.#y}isRowEditing(e){return this.#w===e}isCellEditing(e,t){return this.#x.has(`${e}:${t}`)}isRowChanged(e){const t=this.#f,i=t._rows[e];if(!i)return!1;try{const e=t.getRowId?.(i);return!!e&&this.#L.isRowChanged(e)}catch{return!1}}isRowChangedById(e){return this.#L.isRowChanged(e)}isDirty(e){if(!this.config.dirtyTracking)return!1;if(this.#L.newRowIds.has(e))return!0;const t=this.grid.getRow(e);return!!t&&this.#L.isRowDirty(e,t)}isPristine(e){return!this.isDirty(e)}get dirty(){if(!this.config.dirtyTracking)return!1;const e=this.#f;return this.#L.hasAnyDirty(t=>e._getRowEntry(t)?.row)}get pristine(){return!this.dirty}markAsPristine(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&(this.#L.markPristine(e,t),this.emit("dirty-change",{rowId:e,row:t,original:t,type:"pristine"}))}markAsNew(e){if(!this.config.dirtyTracking)return;this.#L.markNew(e);const t=this.grid.getRow(e);this.emit("dirty-change",{rowId:e,row:t,original:void 0,type:"new"})}markAsDirty(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&(this.#L.markDirty(e),this.emit("dirty-change",{rowId:e,row:t,original:this.#L.getOriginalRow(e),type:"modified"}))}markAllPristine(){if(!this.config.dirtyTracking)return;const e=this.#f;this.#L.markAllPristine(t=>e._getRowEntry(t)?.row)}getOriginalRow(e){if(this.config.dirtyTracking)return this.#L.getOriginalRow(e)}hasBaseline(e){return!!this.config.dirtyTracking&&this.#L.hasBaseline(e)}getDirtyRows(){if(!this.config.dirtyTracking)return[];const e=this.#f;return this.#L.getDirtyRows(t=>e._getRowEntry(t)?.row)}get dirtyRowIds(){if(!this.config.dirtyTracking)return[];const e=this.#f;return this.#L.getDirtyRowIds(t=>e._getRowEntry(t)?.row)}revertRow(e){if(!this.config.dirtyTracking)return;const t=this.grid.getRow(e);t&&this.#L.revertRow(e,t)&&(this.emit("dirty-change",{rowId:e,row:t,original:this.#L.getOriginalRow(e),type:"reverted"}),this.requestRender())}revertAll(){if(!this.config.dirtyTracking)return;const e=this.#f;this.#L.revertAll(t=>e._getRowEntry(t)?.row),this.requestRender()}setInvalid(e,t,i=""){this.#A.setInvalid(e,t,i)}clearInvalid(e,t){this.#A.clearInvalid(e,t)}clearRowInvalid(e){this.#A.clearRowInvalid(e)}clearAllInvalid(){this.#A.clearAllInvalid()}isCellInvalid(e,t){return this.#A.isCellInvalid(e,t)}getInvalidMessage(e,t){return this.#A.getInvalidMessage(e,t)}hasInvalidCells(e){return this.#A.hasInvalidCells(e)}getInvalidFields(e){return this.#A.getInvalidFields(e)}resetChangedRows(e){const t=this.changedRows,i=this.changedRowIds;this.#L.changedRowIds.clear(),this.#L.committedDirtyRowIds.clear(),this.#K(),e||this.emit("changed-rows-reset",{rows:t,ids:i});const r=this.#f;r._rowPool?.forEach(e=>e.classList.remove("changed"))}beginCellEdit(e,t){const i=this.#f,r=i._visibleColumns.findIndex(e=>e.field===t);if(-1===r)return;const n=i._visibleColumns[r],o=i._rows[e];if(!n||!o||!this.#p(n,o))return;const s=i.findRenderedRowElement?.(e),l=s?.querySelector(`.cell[data-col="${r}"]`);l&&(this.#_=!0,this.#B(e,r,l))}beginBulkEdit(e){const t=this.#f;if(!1===(this.config.editOn??t.effectiveConfig?.editOn))return;const i=t._columns?.some(e=>this.#m(e));if(!i)return;const r=t.findRenderedRowElement?.(e);if(!r)return;const n=t._rows[e],o=t.effectiveConfig?.rowEditable;n&&o&&!o(n)||(this.#_=!1,this.#$(e,n),Array.from(r.children).forEach((i,r)=>{const o=t._visibleColumns[r];if(o&&this.#p(o,n)){const t=i;t.classList.contains("editing")||this.#O(n,e,o,r,t,!0)}}),setTimeout(()=>{let e=r.querySelector(`.cell[data-col="${t._focusCol}"]`);if(e?.classList.contains("editing")||(e=r.querySelector(".cell.editing")),e?.classList.contains("editing")){const t=e.querySelector(qe);try{t?.focus({preventScroll:!0})}catch{}}},0))}commitActiveRowEdit(){-1!==this.#w&&this.#M(this.#w,!1)}cancelActiveRowEdit(){-1!==this.#w&&this.#M(this.#w,!0)}#G(e,t,i){const r=this.#f,n=r._visibleColumns?.findIndex(e=>e.field===t);if(-1===n||void 0===n)return;const o=r._rows,s=o?.findIndex(t=>{try{return r.getRowId?.(t)===e}catch{return!1}});if(-1===s||void 0===s)return;const l=r.findRenderedRowElement?.(s),a=l?.querySelector(`.cell[data-col="${n}"]`);if(a)if(i){a.setAttribute("data-invalid","true");const i=this.#A.getInvalidMessage(e,t);i&&a.setAttribute("title",i)}else a.removeAttribute("data-invalid"),a.removeAttribute("title")}#z(e,t){this.#w=t;const i=/* @__PURE__ */new Set,r=`${e}:`;for(const s of this.#x)s.startsWith(r)?i.add(`${t}:${s.substring(r.length)}`):i.add(s);this.#x.clear();for(const s of i)this.#x.add(s);const n=this.#C.get(e);void 0!==n&&(this.#C.delete(e),this.#C.set(t,n));const o=[];for(const[s,l]of this.#E)s.startsWith(r)&&(o.push([`${t}:${s.substring(r.length)}`,l]),this.#E.delete(s));for(const[s,l]of o)this.#E.set(s,l);this.#K()}#B(e,t,i){const r=this.#f,n=r._rows[e],o=r._visibleColumns[t];n&&o&&this.#p(o,n)&&(i.classList.contains("editing")||(this.#w!==e&&this.#$(e,n),this.#y=t,this.#O(n,e,o,t,i,!1)))}#q(){const e=this.#T;if(!e)return;const t=this.#f,i=t._rows?.[e.rowIndex];i&&(i[e.field]=e.value);const r=`${e.rowIndex}:${e.field}`,n=this.#E.get(r);if(n&&n(e.value),this.emit("cell-cancel",{rowIndex:e.rowIndex,colIndex:e.colIndex,field:e.field,previousValue:e.value}),i){let e;try{e=this.grid.getRowId(i)}catch{}e&&(this.config.dirtyTracking?this.#L.isRowDirty(e,i)||(this.#L.changedRowIds.delete(e),this.emit("dirty-change",{rowId:e,row:i,original:this.#L.getOriginalRow(e),type:"reverted"})):this.#L.changedRowIds.delete(e))}this.requestRender(),this.#T=null}#N(){const e=this.#f,t=e._focusRow,i=e._focusCol;if(t<0||i<0)return;const r=e.findRenderedRowElement?.(t),n=r?.querySelector(`.cell[data-col="${i}"]`);if(n?.classList.contains("editing")){const e=n.querySelector(qe);e&&(this.#I=!1,e.focus(),this.#k=!0,e instanceof HTMLInputElement&&("text"===e.type||"number"===e.type)&&e.select())}}#P(e){const t=this.#f,i=t._rows,r=this.#g?t._focusRow:this.#w,n=i[r],o=t._visibleColumns.map((e,t)=>n&&this.#p(e,n)?t:-1).filter(e=>e>=0);if(0===o.length)return;const s=o.indexOf(t._focusCol)+(e?1:-1);if(s>=0&&s<o.length){t._focusCol=o[s];const e=t.findRenderedRowElement?.(r),i=e?.querySelector(`.cell[data-col="${o[s]}"]`);if(i?.classList.contains("editing")){const e=i.querySelector(qe);e?.focus({preventScroll:!0})}return void l(t,{forceHorizontalScroll:!0})}const a=r+(e?1:-1);if(a>=0&&a<i.length){const n=i[a],o=t._visibleColumns.map((e,t)=>n&&this.#p(e,n)?t:-1).filter(e=>e>=0);if(0===o.length)return;this.#g?(t._focusRow=a,t._focusCol=e?o[0]:o[o.length-1],l(t,{forceHorizontalScroll:!0}),this.requestAfterRender(),setTimeout(()=>{const e=t.findRenderedRowElement?.(a),i=e?.querySelector(`.cell[data-col="${t._focusCol}"]`);if(i?.classList.contains("editing")){const e=i.querySelector(qe);e?.focus({preventScroll:!0})}},0)):(this.#M(r,!1),t._focusRow=a,t._focusCol=e?o[0]:o[o.length-1],this.beginBulkEdit(a),l(t,{forceHorizontalScroll:!0}))}}#K(){const e=this.#f;e._activeEditRows=this.#w,e._rowEditSnapshots=this.#C}#$(e,t){if(this.#w!==e){-1!==this.#w&&this.#M(this.#w,!1),this.#C.set(e,{...t}),this.#w=e,this.#v=t;const i=this.#f;try{this.#b=i.getRowId?.(t)??void 0}catch{this.#b=void 0}this.#K(),this.#g||(this.broadcast("edit-open",{rowIndex:e,rowId:this.#b??"",row:t}),a(this.gridElement,d(this.gridElement,"editingStarted",e)))}}#M(e,t){if(this.#w!==e)return;const i=this.#f,r=this.#C.get(e),n=i.findRenderedRowElement?.(e);let o=this.#b;const s=o?i._getRowEntry(o):void 0,l=s?.row??this.#v??i._rows[e];if(!o&&l)try{o=i.getRowId?.(l)}catch{}if(!t&&n&&l){n.querySelectorAll(".cell.editing").forEach(t=>{const r=Number(t.getAttribute("data-col"));if(isNaN(r))return;const n=i._visibleColumns[r];if(!n)return;if(t.hasAttribute("data-editor-managed"))return;const o=t.querySelector("input,textarea,select");if(o){const t=n.field,i=l[t],r=Te(o,n,i);i!==r&&this.#D(e,n,r,l)}})}if(t||this.#g||!l||this.emit("before-edit-close",{rowIndex:e,rowId:o??"",row:l}),t&&r&&l)Object.keys(r).forEach(e=>{l[e]=r[e]}),o&&(this.#L.changedRowIds.delete(o),this.#L.committedDirtyRowIds.delete(o),this.clearRowInvalid(o));else if(!t&&l){const t=function(e,t){if(!e)return!1;const i=e,r=t,n=/* @__PURE__ */new Set([...Object.keys(i),...Object.keys(r)]);for(const o of n)if(i[o]!==r[o])return!0;return!1}(r,l),i=o?this.#L.changedRowIds.has(o):t,n=this.emitCancelable("row-commit",{rowIndex:e,rowId:o??"",row:l,oldValue:r,newValue:l,changed:i,changedRows:this.changedRows,changedRowIds:this.changedRowIds});n&&r?(Object.keys(r).forEach(e=>{l[e]=r[e]}),o&&(this.#L.changedRowIds.delete(o),this.#L.committedDirtyRowIds.delete(o),this.clearRowInvalid(o))):n||(o&&this.config.dirtyTracking&&(this.#L.isRowDirty(o,l)?this.#L.committedDirtyRowIds.add(o):this.#L.committedDirtyRowIds.delete(o)),t&&this.isAnimationEnabled&&(this.#R=e))}this.#C.delete(e),this.#w=-1,this.#b=void 0,this.#v=void 0,this.#y=-1,this.#_=!1,this.#K();for(const a of this.#x)a.startsWith(`${e}:`)&&this.#x.delete(a);for(const a of this.#E.keys())a.startsWith(`${e}:`)&&this.#E.delete(a);if(this.#S=!0,n){const e=i.__frameworkAdapter,t=n.querySelectorAll(".cell.editing");e?.releaseCell&&t.forEach(t=>{e.releaseCell(t)}),t.forEach(e=>{e.classList.remove("editing"),function(e){e.__editingCellCount=0,e.removeAttribute("data-has-editing")}(e.parentElement)}),i.refreshVirtualWindow(!0)}else this.#H(i),this.#S=!1;!this.#g&&l&&(this.broadcast("edit-close",{rowIndex:e,rowId:o??"",row:l,reverted:t}),t||a(this.gridElement,d(this.gridElement,"editingCommitted",e)))}#D(e,t,i,r){const n=t.field;if(!Pe(n))return;const o=r[n];if(o===i)return;const s=this.#f;let l;try{l=this.grid.getRowId(r)}catch{}const a=!l||!this.#L.changedRowIds.has(l),d=l?e=>this.grid.updateRow(l,e,"cascade"):ze;let u=!1;const h=l?e=>{u=!0,this.setInvalid(l,n,e??"")}:()=>{};if(this.emitCancelable("cell-commit",{row:r,rowId:l??"",field:n,oldValue:o,value:i,rowIndex:e,changedRows:this.changedRows,changedRowIds:this.changedRowIds,firstTimeForRow:a,updateRow:d,setInvalid:h}))return;if(l&&!u&&this.isCellInvalid(l,n)&&this.clearInvalid(l,n),r[n]=i,c(r,n),l&&this.#L.changedRowIds.add(l),this.#K(),this.config.dirtyTracking&&l){const e=this.#L.isRowDirty(l,r);this.emit("dirty-change",{rowId:l,row:r,original:this.#L.getOriginalRow(l),type:e?"modified":"pristine"})}this.emitPluginEvent("cell-edit-committed",{rowIndex:e,field:n,oldValue:o,newValue:i});const g=s.findRenderedRowElement?.(e);g&&g.classList.add("changed")}#O(e,t,i,r,n,o,s){Oe(this.#F,e,t,i,r,n,o,s)}#H(e){queueMicrotask(()=>{try{const t=e._focusRow,i=e._focusCol,r=e.findRenderedRowElement?.(t);if(r){Array.from(e._bodyEl.querySelectorAll(".cell-focus")).forEach(e=>e.classList.remove("cell-focus"));const n=r.querySelector(`.cell[data-row="${t}"][data-col="${i}"]`);n&&(n.classList.add("cell-focus"),n.setAttribute("aria-selected","true"),n.hasAttribute("tabindex")||n.setAttribute("tabindex","-1"),n.focus({preventScroll:!0}))}}catch{}})}}function Be(e,t=!0){return"string"==typeof e?t&&(e.includes(",")||e.includes('"')||e.includes("\n")||e.includes("\r"))?`"${e.replace(/"/g,'""')}"`:e:"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":null==e?"":e instanceof Date?e.toISOString():"object"==typeof e?JSON.stringify(e):String(e)}function $e(e,t,i,n={}){const o=n.delimiter??",",s=n.newline??"\n",l=n.quoteStrings??!0,a=[],d=n.bom?"\ufeff":"";if(!1!==i.includeHeaders){const e=t.map(e=>{const t=e.header||e.field;return Be(i.processHeader?i.processHeader(t,e.field):t,l)});a.push(e.join(o))}for(const c of e){const e=t.map(e=>{let t=r(c,e);return i.processCell&&(t=i.processCell(t,e.field,c)),Be(t,l)});a.push(e.join(o))}return d+a.join(s)}function We(e,t){const i=URL.createObjectURL(e),r=document.createElement("a");r.href=i,r.download=t,r.style.display="none",document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(i)}function Ve(e){return JSON.stringify(je(e))}function je(e){if(null==e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(je);const t={};for(const i of Object.keys(e).sort())t[i]=je(e[i]);return t}class Ue{#W=/* @__PURE__ */new Map;#V=0;register(e){const t=Ve(e),i=this.#W.get(t);if(i)return i.id;this.#V++;const r=`s${this.#V}`;return this.#W.set(t,{id:r,style:e}),r}getStyleId(e){return this.#W.get(Ve(e))?.id}get size(){return this.#W.size}toXml(){if(0===this.#W.size)return"";let e="\n<Styles>";for(const{id:t,style:i}of this.#W.values())e+=Ye(t,i);return e+="\n</Styles>",e}}function Ye(e,t){let i=`\n<Style ss:ID="${e}">`;if(t.font&&(i+="<Font",t.font.name&&(i+=` ss:FontName="${t.font.name}"`),t.font.size&&(i+=` ss:Size="${t.font.size}"`),t.font.bold&&(i+=' ss:Bold="1"'),t.font.italic&&(i+=' ss:Italic="1"'),t.font.color&&(i+=` ss:Color="${t.font.color}"`),i+="/>"),t.fill){const e=t.fill.pattern??"Solid";i+=`<Interior ss:Color="${t.fill.color}" ss:Pattern="${e}"/>`}return t.numberFormat&&(i+=`<NumberFormat ss:Format="${t.numberFormat}"/>`),t.alignment&&(i+="<Alignment",t.alignment.horizontal&&(i+=` ss:Horizontal="${t.alignment.horizontal}"`),t.alignment.vertical&&(i+=` ss:Vertical="${t.alignment.vertical}"`),t.alignment.wrapText&&(i+=' ss:WrapText="1"'),i+="/>"),t.borders&&(i+="<Borders>",t.borders.top&&(i+=Ze("Top",t.borders.top)),t.borders.bottom&&(i+=Ze("Bottom",t.borders.bottom)),t.borders.left&&(i+=Ze("Left",t.borders.left)),t.borders.right&&(i+=Ze("Right",t.borders.right)),i+="</Borders>"),i+="</Style>",i}function Ze(e,t){let i=`<Border ss:Position="${e}" ss:LineStyle="Continuous" ss:Weight="${function(e){switch(e){case"Thin":return 1;case"Medium":return 2;case"Thick":return 3}}(t.style)}"`;return t.color&&(i+=` ss:Color="${t.color}"`),i+="/>",i}function Qe(e,t,i,r,n){if(t.cellStyle){const o=t.cellStyle(i,r,n);if(o)return e.register(o)}const o=t.columnStyles?.[r];return o?e.getStyleId(o):t.defaultStyle?e.getStyleId(t.defaultStyle):void 0}function Xe(e,t){const i=Math.min(t.length,50);let r=(e.header??e.field).length;for(let n=0;n<i;n++){const i=t[n][e.field],o=null==i?0:String(i).length;o>r&&(r=o)}return r+2}function Je(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function et(e,t,i){const n=i.excelStyles,o=n?function(e){const t=new Ue;if(e.headerStyle&&t.register(e.headerStyle),e.groupHeaderStyle&&t.register(e.groupHeaderStyle),e.defaultStyle&&t.register(e.defaultStyle),e.columnStyles)for(const i of Object.values(e.columnStyles))t.register(i);return t}(n):void 0;let s='<?xml version="1.0" encoding="UTF-8"?>\n<?mso-application progid="Excel.Sheet"?>\n<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';if(o){if(n.cellStyle)for(const i of e)for(const e of t){const t=r(i,e),s=n.cellStyle(t,e.field,i);s&&o.register(s)}s+=o.toXml()}s+='\n<Worksheet ss:Name="Sheet1">\n<Table>',n&&(s+=function(e,t,i){const r=i.columnWidths,n=i.autoFitColumns;if(!r&&!n)return"";let o="";for(const s of e){let e=r?.[s.field];null==e&&n&&(e=Xe(s,t)),o+=null!=e?`\n<Column ss:Width="${7*e}"/>`:"\n<Column/>"}return o}(t,e,n));const l=n?.headerStyle&&o?o.getStyleId(n.headerStyle):void 0,a=n?.groupHeaderStyle&&o?o.getStyleId(n.groupHeaderStyle):l;if(!1!==i.includeHeaders&&i.headerRows&&i.headerRows.length>0){const e=a?` ss:StyleID="${a}"`:"";for(const t of i.headerRows){s+="\n<Row>";for(const i of t.cells){const t=Math.max(1,0|i.span);s+=`<Cell${e}${t>1?` ss:MergeAcross="${t-1}"`:""}><Data ss:Type="String">${Je(i.label??"")}</Data></Cell>`}s+="</Row>"}}if(!1!==i.includeHeaders){s+="\n<Row>";for(const e of t){const t=e.header||e.field;s+=`<Cell${l?` ss:StyleID="${l}"`:""}><Data ss:Type="String">${Je(i.processHeader?i.processHeader(t,e.field):t)}</Data></Cell>`}s+="</Row>"}for(const d of e){s+="\n<Row>";for(const e of t){let t=r(d,e);i.processCell&&(t=i.processCell(t,e.field,d));let l="String",a="";null==t?a="":"number"!=typeof t||isNaN(t)?t instanceof Date?(l="DateTime",a=t.toISOString()):a=Je(String(t)):(l="Number",a=String(t));const c=o&&n?Qe(o,n,t,e.field,d):void 0;s+=`<Cell${c?` ss:StyleID="${c}"`:""}><Data ss:Type="${l}">${a}</Data></Cell>`}s+="</Row>"}return s+="\n</Table>\n</Worksheet>\n</Workbook>",s}class tt extends i{static manifest={queries:[{type:"export:csv",description:"Triggers a CSV export"}]};name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;handleQuery(e){if("export:csv"===e.type)return this.exportCsv(),!0}resolveExportData(e,t){const i=this.config,r={format:e,fileName:t?.fileName??i.fileName??"export",includeHeaders:t?.includeHeaders??i.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,processHeaderRow:t?.processHeaderRow,mode:t?.mode??"raw",columns:t?.columns,rowIndices:t?.rowIndices,excelStyles:t?.excelStyles,fileExtension:t?.fileExtension,headerRows:t?.headerRows},n=oe(this.columns,t?.columns,i.onlyVisible);let o;if(t?.rowIndices)o=se(this.rows,t.rowIndices);else if(i.onlySelected){const e=this.getSelectionState();o=e?.selected?.size?se(this.rows,[...e.selected]):[...this.rows]}else o=[...this.rows];if(!1===r.includeHeaders)r.headerRows=void 0;else{const e=r.headerRows??this.#j(n);r.headerRows=this.#U(e,n,r.processHeaderRow)}return{columns:n,rows:o,fullParams:r}}#j(e){if(0===e.length)return[];const t=this.grid;if(!t?.query)return[];const i=t.query("collectHeaderRows",{columns:e});if(!i||0===i.length)return[];const r=[];for(const n of i)if(n)if(Array.isArray(n))for(const e of n)e&&Array.isArray(e.cells)&&e.cells.length>0&&r.push(e);else Array.isArray(n.cells)&&n.cells.length>0&&r.push(n);return r}#U(e,t,i){if(!e||0===e.length)return;const r=t.length,n=[];for(let o=0;o<e.length;o++){const t=e[o];if(!t||!Array.isArray(t.cells)||0===t.cells.length)continue;const s=[];let l=!1,a=0,d=!1;for(const e of t.cells){const t=Math.max(1,0|e.span);if(a+t>r){d=!0;break}a+=t;const n=i?i(e,o):e;null===n?s.push({label:"",span:t}):(s.push({...n,span:t}),""!==(n.label??"")&&(l=!0))}d||(a<r&&s.push({label:"",span:r-a}),l&&n.push({cells:s}))}return n.length>0?n:void 0}resolveCellOutput(e,t,i,r,n){let o=e;if("formatted"===r){const r=this.#Y(t);if(r)try{const t=r(e,i);o=null==t?"":String(t)}catch{o=null==e?"":String(e)}else o="date"===t.type?u(e):"boolean"===t.type?!!e:e}return n&&(o=n(o,t.field,i)),o}performExport(e,t){const{columns:i,rows:r,fullParams:n}=this.resolveExportData(e,t);this.isExportingFlag=!0;let o=n.fileName??"export";const s=this.#Z(i);try{switch(e){case"csv":{const e=$e(this.#Q(r,i,n),s,{...n,processCell:void 0},{bom:!0});o=o.endsWith(".csv")?o:`${o}.csv`,function(e,t){We(new Blob([e],{type:"text/csv;charset=utf-8;"}),t)}(e,o);break}case"excel":{const e=et(this.#Q(r,i,n),s,{...n,processCell:void 0}),t=n.fileExtension??".xls",l=t.startsWith(".")?t:`.${t}`;o=o.endsWith(l)?o:`${o}${l}`,function(e,t){We(new Blob([e],{type:"application/vnd.ms-excel;charset=utf-8;"}),t)}(e,o);break}case"json":{const e=this.#Q(r,i,n),t=n.headerRows&&n.headerRows.length>0?{headerRows:n.headerRows,rows:e}:e,s=JSON.stringify(t,null,2);o=o.endsWith(".json")?o:`${o}.json`;We(new Blob([s],{type:"application/json"}),o);break}}this.lastExportInfo={format:e,timestamp:/* @__PURE__ */new Date},this.emit("export-complete",{format:e,fileName:o,rowCount:r.length,columnCount:i.length})}finally{this.isExportingFlag=!1}}#Q(e,t,i){const n=i.mode??"raw";return e.map(e=>{const o={};for(const s of t){const t=r(e,s);o[s.field]=this.resolveCellOutput(t,s,e,n,i.processCell)}return o})}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}export(e){const{columns:t,rows:i,fullParams:r}=this.resolveExportData("json",e);return this.#Q(i,t,r)}getResolvedColumns(e){return oe(this.columns,e?.columns,this.config.onlyVisible)}formatCsv(e,t,i){const{columns:r,fullParams:n}=this.resolveExportData("csv",t);return $e(e,this.#Z(r),n,i)}formatExcel(e,t){const{columns:i,fullParams:r}=this.resolveExportData("excel",t);return et(e,this.#Z(i),r)}#Z(e){return e.map(e=>e.valueAccessor?{...e,valueAccessor:void 0}:e)}#Y(e){if(e.format)return e.format;if(!e.type)return;const t=this.grid,i=t?.__frameworkAdapter;if(!i?.getTypeDefault)return;const r=i.getTypeDefault(e.type,t?._hostElement);return r?.format}exportCsv(e){this.performExport("csv",e)}exportExcel(e){this.performExport("excel",e)}exportJson(e){this.performExport("json",e)}isExporting(){return this.isExportingFlag}getLastExport(){return this.lastExportInfo}}const it="(Blank)";function rt(e){if("number"==typeof e)return e;if(e instanceof Date)return e.getTime();const t=Number(e);if(!isNaN(t))return t;return new Date(e).getTime()}function nt(e,t,i=!1,r){if(!t.length)return e;const n=t.map(e=>function(e,t,i){const r=e.field,n=e.operator,o=i?e=>i(e[r],e):e=>e[r];if("blank"===n)return e=>{const t=o(e);return null==t||""===t||"number"==typeof t&&isNaN(t)};if("notBlank"===n)return e=>{const t=o(e);return null!=t&&""!==t&&!("number"==typeof t&&isNaN(t))};if(i&&("notIn"===n||"in"===n)){const t=e.value;if("notIn"===n){if(!Array.isArray(t))return()=>!0;const e=new Set(t);return t=>{const n=i(t[r],t),o=Array.isArray(n)?n:null!=n?[n]:[];return 0===o.length?!e.has(it):!o.some(t=>e.has(t))}}if(!Array.isArray(t))return()=>!1;const o=new Set(t);return e=>{const t=i(e[r],e),n=Array.isArray(t)?t:null!=t?[t]:[];return 0===n.length?o.has(it):n.some(e=>o.has(e))}}if("notIn"===n){if(!Array.isArray(e.value))return()=>!0;const t=new Set(e.value);return e=>{const i=e[r];return null==i||""===i?!t.has(it):!t.has(i)}}if("in"===n){if(!Array.isArray(e.value))return()=>!1;const t=new Set(e.value);return e=>{const i=e[r];return null==i||""===i?t.has(it):t.has(i)}}const s="number"===e.type&&!i,l=e=>null==e||""===e||"number"==typeof e&&isNaN(e);if("greaterThan"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i>t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r>t}}if("greaterThanOrEqual"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i>=t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r>=t}}if("lessThan"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i<t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r<t}}if("lessThanOrEqual"===n){const t=rt(e.value);return s?e=>{const i=e[r];return!l(i)&&i<=t}:e=>{const i=o(e);if(l(i))return!1;const r=rt(i);return!isNaN(r)&&r<=t}}if("between"===n){const t=rt(e.value),i=rt(e.valueTo);return s?e=>{const n=e[r];return!l(n)&&(n>=t&&n<=i)}:e=>{const r=o(e);if(l(r))return!1;const n=rt(r);return!isNaN(n)&&n>=t&&n<=i}}const a=t?String(e.value):String(e.value).toLowerCase();return"contains"===n?t?e=>{const t=o(e);return null!=t&&String(t).includes(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().includes(a)}:"notContains"===n?t?e=>{const t=o(e);return null!=t&&!String(t).includes(a)}:e=>{const t=o(e);return null!=t&&!String(t).toLowerCase().includes(a)}:"equals"===n?t?e=>{const t=o(e);return null!=t&&String(t)===a}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase()===a}:"notEquals"===n?t?e=>{const t=o(e);return null!=t&&String(t)!==a}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase()!==a}:"startsWith"===n?t?e=>{const t=o(e);return null!=t&&String(t).startsWith(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().startsWith(a)}:"endsWith"===n?t?e=>{const t=o(e);return null!=t&&String(t).endsWith(a)}:e=>{const t=o(e);return null!=t&&String(t).toLowerCase().endsWith(a)}:()=>!0}(e,i,r?.get(e.field)));return 1===n.length?e.filter(n[0]):e.filter(e=>{for(let t=0;t<n.length;t++)if(!n[t](e))return!1;return!0})}function ot(e,t,i){const r=/* @__PURE__ */new Set;let n=!1;for(const o of e){const e=o[t];if(i){const t=i(e,o);if(Array.isArray(t)){0===t.length&&(n=!0);for(const e of t)null!=e&&r.add(e)}else null!=t?r.add(t):n=!0}else null!=e&&""!==e?r.add(e):n=!0}return n&&r.add(it),[...r].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t)))}const st="__tbw_expander";function lt(e){return e.field===st}function at(e){return!0===e.utility}function dt(e){return e?e.toISOString().split("T")[0]:""}function ct(e){return e?"string"==typeof e?e:"number"==typeof e?dt(new Date(e)):"":""}function ut(e,t,i,r,n,o){const{field:s,column:l}=t,a=function(e){if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-filter-item-height");if(t&&t.trim()){const e=parseFloat(t);if(!isNaN(e)&&e>0)return e}}return 28}(e),d=e=>{if(null==e)return"(Blank)";if(l.format&&!l.filterValue){const t=l.format(e,void 0);if(t)return t}return String(e)};i=i.slice().sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:d(e).localeCompare(d(t)));const c=document.createElement("div");c.className="tbw-filter-search";const u=document.createElement("input");u.type="text",u.placeholder="Search...",u.className="tbw-filter-search-input",u.value=o.get(s)??"",c.appendChild(u),e.appendChild(c);const p=document.createElement("div");p.className="tbw-filter-actions";const f=document.createElement("label");f.className="tbw-filter-value-item",f.style.padding="0",f.style.margin="0";const m=document.createElement("input");m.type="checkbox",m.className="tbw-filter-checkbox";const w=document.createElement("span");w.textContent="Select All",f.appendChild(m),f.appendChild(w),p.appendChild(f);const b=/* @__PURE__ */new Map;i.forEach(e=>{const t=null==e?"__null__":String(e);b.set(t,!r.has(e))});const v=()=>{const e=[...b.values()],t=e.every(e=>e),i=e.every(e=>!e);m.checked=t,m.indeterminate=!t&&!i};m.addEventListener("change",()=>{const e=m.checked;for(const t of b.keys())b.set(t,e);v(),R()}),v(),e.appendChild(p);const y=document.createElement("div");y.className="tbw-filter-values";const C=document.createElement("div");C.className="tbw-filter-values-spacer",y.appendChild(C);const x=document.createElement("div");x.className="tbw-filter-values-content",y.appendChild(x);let E=[];const S=(e,t)=>{const i=d(e),r=null==e?"__null__":String(e),n=document.createElement("label");n.className="tbw-filter-value-item",n.style.position="absolute",n.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${t})`,n.style.left="0",n.style.right="0",n.style.boxSizing="border-box";const o=document.createElement("input");o.type="checkbox",o.className="tbw-filter-checkbox",o.checked=b.get(r)??!0,o.dataset.value=r,o.addEventListener("change",()=>{b.set(r,o.checked),v()});const s=document.createElement("span");return s.textContent=i,n.appendChild(o),n.appendChild(s),n},R=()=>{const e=E.length,t=y.clientHeight,i=y.scrollTop;if(C.style.height=e*a+"px",h(e,50/3))return x.innerHTML="",x.style.transform="translateY(0px)",void E.forEach((e,t)=>{x.appendChild(S(e,t))});const r=g({totalRows:e,viewportHeight:t,scrollTop:i,rowHeight:a,overscan:3});x.style.transform=`translateY(${r.offsetY}px)`,x.innerHTML="";for(let n=r.start;n<r.end;n++)x.appendChild(S(E[n],n-r.start))},A=e=>{const t=n.caseSensitive??!1,r=t?e:e.toLowerCase();if(E=i.filter(i=>{const n=d(i),o=t?n:n.toLowerCase();return!e||o.includes(r)}),E.sort((e,t)=>{const i=null==e?"__null__":String(e),r=null==t?"__null__":String(t),n=b.get(i)??!0;return n!==(b.get(r)??!0)?n?-1:1:"number"==typeof e&&"number"==typeof t?e-t:d(e).localeCompare(d(t))}),0===E.length){C.style.height="0px",x.innerHTML="";const e=document.createElement("div");return e.className="tbw-filter-no-match",e.textContent="No matching values",void x.appendChild(e)}R()};let k;y.addEventListener("scroll",()=>{E.length>0&&R()},{passive:!0}),A(u.value),e.appendChild(y),u.addEventListener("input",()=>{clearTimeout(k),k=setTimeout(()=>{o.set(s,u.value),A(u.value)},n.debounceMs??150)});const I=document.createElement("div");I.className="tbw-filter-buttons";const _=document.createElement("button");_.type="button",_.className="tbw-filter-apply-btn",_.textContent="Apply",_.addEventListener("click",()=>{const e=[];for(const[t,r]of b)if(!r)if("__null__"===t)e.push(null);else{const r=i.find(e=>String(e)===t);e.push(void 0!==r?r:t)}t.applySetFilter(e)}),I.appendChild(_);const T=document.createElement("button");T.type="button",T.className="tbw-filter-clear-btn",T.textContent="Clear Filter",T.addEventListener("click",()=>{t.clearFilter()}),I.appendChild(T),e.appendChild(I)}function ht(e,t){if("number"==typeof e)return e;if("string"==typeof e){const i=parseFloat(e);return isNaN(i)?t:i}return t}class gt extends i{static manifest={events:[{type:"filter-change",description:"Emitted when filter criteria change. Broadcast to both DOM consumers and plugin bus."}],queries:[{type:"getContextMenuItems",description:"Contributes filter-related items to the header context menu"}]};name="filtering";styles='@layer tbw-plugins{tbw-grid{.tbw-quick-filter-input{flex:1;max-width:300px;height:var(--tbw-input-height, 1.75rem);padding:var(--tbw-input-padding, 0 .5rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);color:var(--tbw-color-fg);font-size:var(--tbw-font-size-sm, .8125rem);&:focus{outline:none;border-color:var(--tbw-color-accent)}}.header-cell.filtered:before{content:"";position:absolute;top:var(--tbw-spacing-xs, .25rem);right:var(--tbw-spacing-xs, .25rem);width:var(--tbw-indicator-size, .375rem);height:var(--tbw-indicator-size, .375rem);background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:50%}.tbw-filter-btn{display:var(--tbw-filter-btn-display, inline-flex);visibility:var(--tbw-filter-btn-visibility, visible);align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;margin-left:var(--tbw-spacing-xs, .25rem);opacity:.4;transition:opacity .15s,visibility 0s,display 0s allow-discrete;color:inherit;vertical-align:middle;transition-behavior:allow-discrete;&:hover,&.active{opacity:1;visibility:visible;display:inline-flex}&.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}}.header-row .cell:hover .tbw-filter-btn,.header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}}';get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return!1!==this.grid.effectiveConfig?.filterable}isColumnFilterable(e){return!!this.isFilteringEnabled()&&!1!==e.filterable}getDataRows(){const e=this.sourceRows;if(e.length>0)return e;const t=this.rows;return 0===t.length?t:t.filter(e=>null!=e&&!0!==e.__loading)}getFilterValues(){const e=this.grid.effectiveConfig?.columns;if(!e)return;let t;for(const i of e)if(i.field)if(i.filterValue)t||(t=/* @__PURE__ */new Map),t.set(i.field,i.filterValue);else if(i.valueAccessor){t||(t=/* @__PURE__ */new Map);const e=i;t.set(i.field,(t,i)=>r(i,e))}return t}filters=/* @__PURE__ */new Map;cachedResult=null;cacheKey=null;cachedInputSpot=null;openPanelField=null;panelElement=null;panelAnchorElement=null;panelButtonElement=null;searchText=/* @__PURE__ */new Map;excludedValues=/* @__PURE__ */new Map;panelAbortController=null;globalStylesInjected=!1;columnLookup=null;columnLookupRef=null;getColumnByField(e){const t=this.grid.effectiveConfig?.columns;if(!t)return;let i=this.columnLookup;if(t!==this.columnLookupRef||!i){i=/* @__PURE__ */new Map;for(const e of t)e.field&&i.set(e.field,e);this.columnLookup=i,this.columnLookupRef=t}return i.get(e)}computeSelected(){const e={},t=[];for(const[i,n]of this.filters)if("set"===n.type)if("in"===n.operator&&Array.isArray(n.value))e[i]=n.value;else if("notIn"===n.operator){const e=this.getColumnByField(i),n=e?.filterValue??(e?.valueAccessor?(t,i)=>r(i,e):void 0);t.push({field:i,filterValue:n})}if(t.length>0){const i=function(e,t){const i=/* @__PURE__ */new Map;for(const{field:n,filterValue:o}of t)i.set(n,{values:/* @__PURE__ */new Set,hasBlank:!1,hasExtractor:!!o});for(const n of e)for(const{field:e,filterValue:r}of t){const t=i.get(e),o=n[e];if(r){const e=r(o,n);if(Array.isArray(e)){0===e.length&&(t.hasBlank=!0);for(const i of e)null!=i&&t.values.add(i)}else null!=e?t.values.add(e):t.hasBlank=!0}else null!=o&&""!==o?t.values.add(o):t.hasBlank=!0}const r=/* @__PURE__ */new Map;for(const[n,{values:o,hasBlank:s}]of i)s&&o.add(it),r.set(n,[...o].sort((e,t)=>"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))));return r}(this.getDataRows(),t);for(const{field:r}of t){const t=this.excludedValues.get(r),n=i.get(r)??[];e[r]=t?n.filter(e=>!t.has(e)):n}}return e}syncExcludedValues(e,t){if(t)if("set"===t.type&&"notIn"===t.operator&&Array.isArray(t.value))this.excludedValues.set(e,new Set(t.value));else if("set"===t.type&&"in"===t.operator&&Array.isArray(t.value)){const i=this.getDataRows();if(!i||0===i.length)return void this.excludedValues.delete(e);const r=t.value,n=new Set(r.map(e=>null==e?it:e)),o=this.getUniqueValues(e),s=new Set(o.filter(e=>!n.has(e)));this.excludedValues.set(e,s)}else"set"===t.type&&this.excludedValues.delete(e);else this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,this.columnLookup=null,this.columnLookupRef=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}handleQuery(e){if("filter:get-model"===e.type){if(!this.filters.size)return;return Object.fromEntries(this.filters)}if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(!this.isFilteringEnabled())return;if(!this.isColumnFilterable(i))return;const r=[],n=this.isFieldFiltered(i.field),o=this.filters.size>0;return n&&r.push({id:"filtering/clear-column-filter",label:"Clear Filter",icon:"✕",order:20,action:()=>this.clearFieldFilter(i.field)}),o&&r.push({id:"filtering/clear-all-filters",label:"Clear All Filters",icon:"✕",order:21,disabled:!o,action:()=>this.clearAllFilters()}),r.length>0?r:void 0}}processRows(e){if(!this.filters.size)return e;const t=[...this.filters.values()];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:e;const i=(r=t,JSON.stringify(r.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo}))));var r;const n={len:e.length,first:e[0],mid:e[Math.floor(e.length/2)],last:e[e.length-1]},o=null!=this.cachedInputSpot&&n.len===this.cachedInputSpot.len&&n.first===this.cachedInputSpot.first&&n.mid===this.cachedInputSpot.mid&&n.last===this.cachedInputSpot.last;if(this.cacheKey===i&&this.cachedResult&&o)return this.cachedResult;if(!o)for(const[l,a]of this.filters)"set"===a.type&&"in"===a.operator&&this.syncExcludedValues(l,a);const s=nt(e,t,this.config.caseSensitive,this.getFilterValues());return this.cachedResult=s,this.cacheKey=i,this.cachedInputSpot=n,s}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(e=>{const t=e.getAttribute("data-col");if(null===t)return;const i=this.visibleColumns[parseInt(t,10)];if(!i||!this.isColumnFilterable(i))return;if(at(i))return;const r=i.field;if(!r)return;const n=this.filters.has(r);let o=e.querySelector(".tbw-filter-btn");if(o){const t=o.classList.contains("active");return o.classList.toggle("active",n),e.classList.toggle("filtered",n),n?e.setAttribute("aria-description","Filtered"):e.removeAttribute("aria-description"),void(t!==n&&this.setIcon(o,n?"filterActive":"filter"))}o=document.createElement("button"),o.type="button",o.className="tbw-filter-btn",o.setAttribute("aria-label",`Filter ${i.header??r}`),this.setIcon(o,n?"filterActive":"filter"),n&&(o.classList.add("active"),e.classList.add("filtered"),e.setAttribute("aria-description","Filtered")),o.addEventListener("click",e=>{e.stopPropagation(),this.toggleFilterPanel(r,i,o)});const s=e.querySelector(".resize-handle");s?e.insertBefore(o,s):e.appendChild(o)})}setFilter(e,t,i){if(null===t)this.filters.delete(e),this.syncExcludedValues(e,null);else{const i={...t,field:e};this.filters.set(e,i),this.syncExcludedValues(e,i)}if(this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,i?.silent)this.emitPluginEvent("filter-change",{filters:[...this.filters.values()]});else{this.broadcast("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.();const i=this.getColumnByField(e)?.header??e;a(this.gridElement,d(this.gridElement,null===t?"filterCleared":"filterApplied",i))}this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e,t){this.filters.clear(),this.excludedValues.clear();for(const i of e)this.filters.set(i.field,i),this.syncExcludedValues(i.field,i);this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null,t?.silent?this.emitPluginEvent("filter-change",{filters:[...this.filters.values()]}):(this.broadcast("filter-change",{filters:[...this.filters.values()],filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()}clearAllFilters(e){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal(e?.silent),e?.silent||a(this.gridElement,d(this.gridElement,"allFiltersCleared"))}clearFieldFilter(e,t){if(this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal(t?.silent),!t?.silent){const t=this.getColumnByField(e)?.header??e;a(this.gridElement,d(this.gridElement,"filterCleared",t))}}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){const t=this.getColumnByField(e),i=t?.filterValue;return ot(this.getDataRows(),e,i)}getStaleFilters(){const e=[];for(const[t,i]of this.filters){if("set"!==i.type)continue;const r=this.getUniqueValues(t);if("notIn"===i.operator&&Array.isArray(i.value)){const t=new Set(i.value);0===r.filter(e=>!t.has(e)).length&&e.push(i)}else if("in"===i.operator&&Array.isArray(i.value)){const t=new Set(i.value);0===r.filter(e=>t.has(e)).length&&e.push(i)}}return e}getBlankMode(e){const t=this.filters.get(e);return"blank"===t?.operator?"blanksOnly":"notBlank"===t?.operator?"nonBlanksOnly":"all"}toggleBlankFilter(e,t){if("all"===t){const t=this.filters.get(e);if(t?.valueTo&&"object"==typeof t.valueTo){const i=t.valueTo;this.setFilter(e,i)}else this.setFilter(e,null);return}const i=this.filters.get(e),r=i&&"blank"!==i.operator&&"notBlank"!==i.operator?{type:i.type,operator:i.operator,value:i.value,valueTo:i.valueTo}:i?.valueTo;this.setFilter(e,{type:i?.type??"text",operator:"blanksOnly"===t?"blank":"notBlank",value:"",valueTo:r})}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const r of t.classList)r.startsWith("tbw-")||"selecting"===r||e.classList.add(r);const i=t.dataset.theme;i&&(e.dataset.theme=i)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles"))return void(this.globalStylesInjected=!0);const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent="@layer tbw-plugins{.tbw-filter-panel{position:fixed;background:var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));color:var(--tbw-filter-panel-fg, var(--tbw-color-fg, light-dark(#222222, #eeeeee)));border:1px solid var(--tbw-filter-panel-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-panel-radius, var(--tbw-border-radius, .25rem));box-shadow:0 4px 16px var(--tbw-filter-panel-shadow, var(--tbw-color-shadow, light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3))));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));z-index:10000;min-width:200px;max-width:280px;max-height:350px;display:flex;flex-direction:column;font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-font-size, .8125rem);transform-origin:top center}.tbw-filter-panel.tbw-filter-panel-above{transform-origin:bottom center}.tbw-filter-panel.tbw-filter-panel-animated{animation:tbw-filter-panel-enter var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}.tbw-filter-panel.tbw-filter-panel-above.tbw-filter-panel-animated{animation:tbw-filter-panel-enter-above var(--tbw-animation-duration, .15s) var(--tbw-animation-easing, ease-out)}@keyframes tbw-filter-panel-enter{0%{opacity:0;transform:scaleY(.3) translateY(-10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@keyframes tbw-filter-panel-enter-above{0%{opacity:0;transform:scaleY(.3) translateY(10px)}to{opacity:1;transform:scaleY(1) translateY(0)}}@supports (anchor-name: --test){.tbw-filter-panel{position-anchor:--tbw-filter-anchor;top:anchor(bottom);right:anchor(right);margin-top:4px;position-try-fallbacks:flip-inline,flip-block,flip-block flip-inline}}.tbw-filter-search{margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-search-input{height:var(--tbw-filter-item-height, 28px);width:100%;padding:var(--tbw-filter-search-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-search-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-actions{display:flex;padding:var(--tbw-button-padding-sm, .25rem .125rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-bottom:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));min-height:var(--tbw-filter-item-height, 28px)}.tbw-filter-actions .tbw-filter-value-item{flex:1}.tbw-filter-values{flex:1;overflow-y:auto;margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));max-height:180px;position:relative}.tbw-filter-values-spacer{width:1px}.tbw-filter-values-content{position:absolute;top:0;left:0;right:0}.tbw-filter-value-item{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding-sm, .25rem .125rem);cursor:pointer;border-radius:3px;height:var(--tbw-filter-item-height, 28px)}.tbw-filter-value-item:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-checkbox{margin:0;cursor:pointer;accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}.tbw-filter-no-match{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem)) 0;text-align:center;font-style:italic}.tbw-filter-buttons{display:flex;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding-top:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border-top:1px solid var(--tbw-filter-divider, var(--tbw-color-border, light-dark(#d0d0d4, #454545)))}.tbw-filter-apply-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));color:var(--tbw-filter-accent-fg, var(--tbw-color-accent-fg, light-dark(#ffffff, #000000)));border:none;border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-apply-btn:hover{filter:brightness(.9)}.tbw-filter-clear-btn{flex:1;padding:var(--tbw-filter-btn-padding, var(--tbw-button-padding, .375rem .75rem));background:transparent;color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-border-radius, .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);font-weight:var(--tbw-filter-btn-font-weight, 500);min-height:var(--tbw-filter-btn-min-height, auto)}.tbw-filter-clear-btn:hover{background:var(--tbw-filter-hover, var(--tbw-color-row-hover, light-dark(#f0f6ff, #1c1c1c)))}.tbw-filter-range-inputs,.tbw-filter-date-range{display:flex;align-items:flex-end;gap:var(--tbw-spacing-sm, .375rem);margin-bottom:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-group,.tbw-filter-date-group{display:flex;flex-direction:column;gap:var(--tbw-spacing-xs, .25rem);flex:1}.tbw-filter-range-label{font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)))}.tbw-filter-range-input,.tbw-filter-date-input{width:100%;height:var(--tbw-filter-item-height, 28px);padding:var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-sm, .375rem);background:var(--tbw-filter-input-bg, var(--tbw-color-bg, transparent));color:inherit;border:1px solid var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:var(--tbw-filter-input-radius, var(--tbw-border-radius, .25rem));font-size:inherit;box-sizing:border-box}.tbw-filter-range-input:focus,.tbw-filter-date-input:focus{outline:none;border-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));box-shadow:0 0 0 2px rgba(from var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6)) r g b / 15%)}.tbw-filter-range-separator{color:var(--tbw-filter-muted, var(--tbw-color-fg-muted, light-dark(#555555, #aaaaaa)));padding-bottom:var(--tbw-spacing-xs, .25rem)}.tbw-filter-blank-option{display:flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-spacing-xs, .25rem) 0;margin-bottom:var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-sm, .8125rem);cursor:pointer;user-select:none}.tbw-filter-blank-checkbox{accent-color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));margin:0;cursor:pointer}.tbw-filter-date-range.tbw-filter-disabled,.tbw-filter-range-inputs.tbw-filter-disabled,.tbw-filter-range-slider.tbw-filter-disabled{opacity:.4;pointer-events:none}.tbw-filter-range-slider{position:relative;height:24px;margin:var(--tbw-spacing-md, .5rem) 0 var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-filter-range-track{position:absolute;top:50%;left:0;right:0;height:4px;background:var(--tbw-filter-input-border, var(--tbw-color-border, light-dark(#d0d0d4, #454545)));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-fill{position:absolute;top:50%;height:4px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border-radius:2px;transform:translateY(-50%)}.tbw-filter-range-thumb{position:absolute;top:0;width:100%;height:100%;background:none;pointer-events:none;-webkit-appearance:none;appearance:none}.tbw-filter-range-thumb::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-moz-range-thumb{width:16px;height:16px;background:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));border:2px solid var(--tbw-filter-panel-bg, var(--tbw-color-panel-bg, light-dark(#eeeeee, #222222)));border-radius:50%;cursor:pointer;pointer-events:all;box-shadow:0 1px 3px #0003}.tbw-filter-range-thumb::-webkit-slider-thumb:hover{transform:scale(1.1)}.tbw-filter-range-thumb::-moz-range-thumb:hover{transform:scale(1.1)}}",document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,i){if(this.openPanelField===e)return void this.closeFilterPanel();this.closeFilterPanel();const n=document.createElement("div");if(n.className="tbw-filter-panel",this.copyGridThemeContext(n),this.isAnimationEnabled&&n.classList.add("tbw-filter-panel-animated"),this.panelElement=n,this.openPanelField=e,i.classList.add("active"),this.panelButtonElement=i,this.config.valuesHandler)return n.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(n),this.positionPanel(n,i),this.setupPanelCloseHandler(n,i),void this.config.valuesHandler(e,t).then(i=>{this.openPanelField===e&&this.panelElement&&(n.innerHTML="",this.renderPanelContent(e,t,n,i))});const o=t.filterValue??(t.valueAccessor?(e,i)=>r(i,t):void 0),s=ot(this.getDataRows(),e,o);document.body.appendChild(n),this.positionPanel(n,i),this.renderPanelContent(e,t,n,s),this.setupPanelCloseHandler(n,i)}renderPanelContent(e,t,i,r){const n=this.filters.get(e);if("in"===n?.operator&&"set"===n.type&&Array.isArray(n.value)&&!this.excludedValues.has(e)){const t=n.value,i=new Set(t.map(e=>null==e?it:e)),o=new Set(r.filter(e=>!i.has(e)));this.excludedValues.set(e,o)}let o=this.excludedValues.get(e);o||(o=/* @__PURE__ */new Set,this.excludedValues.set(e,o));const s=this.searchText.get(e)??"",l={field:e,column:t,uniqueValues:r,excludedValues:o,searchText:s,currentFilter:this.filters.get(e),applySetFilter:(t,i)=>{this.applySetFilter(e,t,i),this.closeFilterPanel()},applyTextFilter:(t,i,r)=>{this.applyTextFilter(e,t,i,r),this.closeFilterPanel()},clearFilter:()=>{this.clearFieldFilter(e),this.closeFilterPanel()},closePanel:()=>this.closeFilterPanel()};let a=!1;if(this.config.filterPanelRenderer&&(this.config.filterPanelRenderer(i,l),a=i.children.length>0),!a&&t.type){const e=this.grid.effectiveConfig.typeDefaults?.[t.type];e?.filterPanelRenderer&&(e.filterPanelRenderer(i,l),a=i.children.length>0)}if(!a){const e=t.filterType??t.type;"number"===e?function(e,t,i,r){const{field:n,column:o}=t,s=o.filterParams,l=o.editorParams,a=i.filter(e=>"number"==typeof e&&!isNaN(e)),d=a.length>0?Math.min(...a):0,c=a.length>0?Math.max(...a):100,u=ht(s?.min??l?.min,d),h=ht(s?.max??l?.max,c),g=s?.step??l?.step??1,p=r.get(n);let f=u,m=h;const w="blank"===p?.operator;"between"===p?.operator?(f=ht(p.value,u),m=ht(p.valueTo,h)):"greaterThanOrEqual"===p?.operator?f=ht(p.value,u):"lessThanOrEqual"===p?.operator&&(m=ht(p.value,h));const b=document.createElement("div");b.className="tbw-filter-range-inputs";const v=document.createElement("div");v.className="tbw-filter-range-group";const y=document.createElement("label");y.textContent="Min",y.className="tbw-filter-range-label";const C=document.createElement("input");C.type="number",C.className="tbw-filter-range-input",C.min=String(u),C.max=String(h),C.step=String(g),C.value=String(f),v.appendChild(y),v.appendChild(C),b.appendChild(v);const x=document.createElement("span");x.className="tbw-filter-range-separator",x.textContent="–",b.appendChild(x);const E=document.createElement("div");E.className="tbw-filter-range-group";const S=document.createElement("label");S.textContent="Max",S.className="tbw-filter-range-label";const R=document.createElement("input");R.type="number",R.className="tbw-filter-range-input",R.min=String(u),R.max=String(h),R.step=String(g),R.value=String(m),E.appendChild(S),E.appendChild(R),b.appendChild(E),e.appendChild(b);const A=document.createElement("div");A.className="tbw-filter-range-slider";const k=document.createElement("div");k.className="tbw-filter-range-track";const I=document.createElement("div");I.className="tbw-filter-range-fill";const _=document.createElement("input");_.type="range",_.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",_.min=String(u),_.max=String(h),_.step=String(g),_.value=String(f);const T=document.createElement("input");T.type="range",T.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",T.min=String(u),T.max=String(h),T.step=String(g),T.value=String(m),A.appendChild(k),A.appendChild(I),A.appendChild(_),A.appendChild(T),e.appendChild(A);const L=document.createElement("label");L.className="tbw-filter-blank-option";const F=document.createElement("input");F.type="checkbox",F.className="tbw-filter-blank-checkbox",F.checked=w;const G=document.createTextNode("Blank");L.appendChild(F),L.appendChild(G);const D=e=>{C.disabled=e,R.disabled=e,_.disabled=e,T.disabled=e,b.classList.toggle("tbw-filter-disabled",e),A.classList.toggle("tbw-filter-disabled",e)};D(w),F.addEventListener("change",()=>{D(F.checked)}),e.appendChild(L);const M=()=>{const e=parseFloat(_.value),t=parseFloat(T.value),i=h-u,r=(e-u)/i*100,n=(t-u)/i*100;I.style.left=`${r}%`,I.style.width=n-r+"%"};_.addEventListener("input",()=>{const e=Math.min(parseFloat(_.value),parseFloat(T.value));_.value=String(e),C.value=String(e),M()}),T.addEventListener("input",()=>{const e=Math.max(parseFloat(T.value),parseFloat(_.value));T.value=String(e),R.value=String(e),M()}),C.addEventListener("input",()=>{const e=parseFloat(C.value);let t=Number.isFinite(e)?e:u;t=Math.max(u,Math.min(t,parseFloat(R.value))),_.value=String(t),M()}),R.addEventListener("input",()=>{const e=parseFloat(R.value);let t=Number.isFinite(e)?e:h;t=Math.min(h,Math.max(t,parseFloat(C.value))),T.value=String(t),M()}),M();const N=document.createElement("div");N.className="tbw-filter-buttons";const q=document.createElement("button");q.type="button",q.className="tbw-filter-apply-btn",q.textContent="Apply",q.addEventListener("click",()=>{if(F.checked)return void t.applyTextFilter("blank","");const e=parseFloat(C.value),i=parseFloat(R.value),r=Number.isFinite(e)?e:u,n=Number.isFinite(i)?i:h;r!==u||n!==h?t.applyTextFilter("between",r,n):t.clearFilter()}),N.appendChild(q);const P=document.createElement("button");P.type="button",P.className="tbw-filter-clear-btn",P.textContent="Clear Filter",P.addEventListener("click",()=>{t.clearFilter()}),N.appendChild(P),e.appendChild(N)}(i,l,r,this.filters):"date"===e?function(e,t,i,r){const{field:n,column:o}=t,s=o.filterParams,l=o.editorParams,a=i.filter(e=>e instanceof Date||"string"==typeof e&&!isNaN(Date.parse(e))).map(e=>e instanceof Date?e:new Date(e)).filter(e=>!isNaN(e.getTime())),d=a.length>0?new Date(Math.min(...a.map(e=>e.getTime()))):null,c=a.length>0?new Date(Math.max(...a.map(e=>e.getTime()))):null,u=ct(s?.min)||ct(l?.min)||dt(d),h=ct(s?.max)||ct(l?.max)||dt(c),g=r.get(n);let p="",f="";const m="blank"===g?.operator;"between"===g?.operator?(p=ct(g.value)||"",f=ct(g.valueTo)||""):"greaterThanOrEqual"===g?.operator?p=ct(g.value)||"":"lessThanOrEqual"===g?.operator&&(f=ct(g.value)||"");const w=document.createElement("div");w.className="tbw-filter-date-range";const b=document.createElement("div");b.className="tbw-filter-date-group";const v=document.createElement("label");v.textContent="From",v.className="tbw-filter-range-label";const y=document.createElement("input");y.type="date",y.className="tbw-filter-date-input",u&&(y.min=u),h&&(y.max=h),y.value=p,b.appendChild(v),b.appendChild(y),w.appendChild(b);const C=document.createElement("span");C.className="tbw-filter-range-separator",C.textContent="–",w.appendChild(C);const x=document.createElement("div");x.className="tbw-filter-date-group";const E=document.createElement("label");E.textContent="To",E.className="tbw-filter-range-label";const S=document.createElement("input");S.type="date",S.className="tbw-filter-date-input",u&&(S.min=u),h&&(S.max=h),S.value=f,x.appendChild(E),x.appendChild(S),w.appendChild(x),e.appendChild(w);const R=document.createElement("label");R.className="tbw-filter-blank-option";const A=document.createElement("input");A.type="checkbox",A.className="tbw-filter-blank-checkbox",A.checked=m;const k=document.createTextNode("Show only blank");R.appendChild(A),R.appendChild(k);const I=e=>{y.disabled=e,S.disabled=e,w.classList.toggle("tbw-filter-disabled",e)};I(m),A.addEventListener("change",()=>{I(A.checked)}),e.appendChild(R);const _=document.createElement("div");_.className="tbw-filter-buttons";const T=document.createElement("button");T.type="button",T.className="tbw-filter-apply-btn",T.textContent="Apply",T.addEventListener("click",()=>{if(A.checked)return void t.applyTextFilter("blank","");const e=y.value,i=S.value;e&&i?t.applyTextFilter("between",e,i):e?t.applyTextFilter("greaterThanOrEqual",e):i?t.applyTextFilter("lessThanOrEqual",i):t.clearFilter()}),_.appendChild(T);const L=document.createElement("button");L.type="button",L.className="tbw-filter-clear-btn",L.textContent="Clear Filter",L.addEventListener("click",()=>{t.clearFilter()}),_.appendChild(L),e.appendChild(_)}(i,l,r,this.filters):ut(i,l,r,o,{caseSensitive:this.config.caseSensitive,debounceMs:this.config.debounceMs},this.searchText)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController;const{signal:i}=this.panelAbortController;setTimeout(()=>{i.aborted||document.addEventListener("click",i=>{e.contains(i.target)||i.target===t||this.closeFilterPanel()},{signal:i})},0)}closeFilterPanel(){const e=this.panelElement;if(e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.panelButtonElement){const e=this.openPanelField;e&&this.filters.has(e)||this.panelButtonElement.classList.remove("active"),this.panelButtonElement=null}this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return null===gt.supportsAnchorPositioning&&(gt.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),gt.supportsAnchorPositioning}positionPanel(e,t){const i=t.closest(".header-row")??t;if(i.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=i,gt.checkAnchorPositioningSupport()){i.style.anchorName="",t.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=t;const r=i.getBoundingClientRect().bottom-t.getBoundingClientRect().bottom;return e.style.marginTop=`${r+4}px`,void requestAnimationFrame(()=>{const i=e.getBoundingClientRect(),r=t.getBoundingClientRect();i.top<r.top&&e.classList.add("tbw-filter-panel-above")})}const r=i.getBoundingClientRect(),n=t.getBoundingClientRect();e.style.position="fixed",e.style.top=`${r.bottom+4}px`,e.style.left=`${n.right}px`,requestAnimationFrame(()=>{const t=e.getBoundingClientRect();e.style.left=n.right-t.width+"px";n.right-t.width<8&&(e.style.left=`${n.left}px`),t.bottom>window.innerHeight-8&&(e.style.top=r.top-t.height-4+"px",e.classList.add("tbw-filter-panel-above"))})}applySetFilter(e,t,i){if(this.excludedValues.set(e,new Set(t)),0===t.length)this.filters.delete(e);else{const r=this.filters.get(e);if("in"===r?.operator){const r=this.getUniqueValues(e),n=new Set(t),o=r.filter(e=>!n.has(e));this.filters.set(e,{field:e,type:"set",operator:"in",value:o,...void 0!==i&&{valueTo:i}})}else this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t,...void 0!==i&&{valueTo:i}})}this.applyFiltersInternal()}applyTextFilter(e,t,i,r){const n=this.getColumnByField(e),o=n?.filterType??n?.type??"text";this.filters.set(e,{field:e,type:o,operator:t,value:i,valueTo:r}),this.applyFiltersInternal()}applyFiltersInternal(e){this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null;const t=[...this.filters.values()];if(this.config.filterHandler){this.gridElement.setAttribute("aria-busy","true");const i=this.config.filterHandler(t,this.sourceRows),r=i=>{this.gridElement.removeAttribute("aria-busy"),this.cachedResult=i,this.grid.rows=i,e?this.emitPluginEvent("filter-change",{filters:t}):(this.broadcast("filter-change",{filters:t,filteredRowCount:i.length,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()};return void(i&&"function"==typeof i.then?i.then(r):r(i))}e?this.emitPluginEvent("filter-change",{filters:t}):(this.broadcast("filter-change",{filters:t,filteredRowCount:0,selected:this.computeSelected()}),this.config.trackColumnState&&this.grid.requestStateChange?.()),this.requestRender()}getColumnState(e){if(!this.config.trackColumnState)return;const t=this.filters.get(e);return t?{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}:void 0}applyColumnState(e,t){if(!this.config.trackColumnState)return;if(!t.filter)return void this.filters.delete(e);const i={field:e,type:t.filter.type,operator:t.filter.operator,value:t.filter.value,valueTo:t.filter.valueTo};this.filters.set(e,i),this.cachedResult=null,this.cacheKey=null,this.cachedInputSpot=null}}function pt(e){if(!e.length)return[];const t=[],i=/* @__PURE__ */new Map,r=(e,i)=>{if(!i.length)return;const r=t[t.length-1];r&&r.implicit&&r.firstIndex+r.columns.length===e?r.columns.push(...i):t.push({id:"__implicit__"+e,label:void 0,columns:i,firstIndex:e,implicit:!0})};let n=[],o=0;return e.forEach((e,s)=>{const l=e.group;if(!l)return 0===n.length&&(o=s),void n.push(e);n.length&&(r(o,n.slice()),n=[]);const a="string"==typeof l?l:l.id,d="string"==typeof l?void 0:l.label;d&&!i.has(a)&&i.set(a,d);const c=i.get(a)??d,u=t[t.length-1];u&&!u.implicit&&u.id===a?u.columns.push(e):t.push({id:a,label:c,columns:[e],firstIndex:s})}),n.length&&r(o,n),1===t.length&&t[0].implicit&&t[0].columns.length===e.length?[]:t}function ft(e){const t=function(e){const t=/* @__PURE__ */new Set;for(let i=0;i<e.length;i++){if(!String(e[i].id).startsWith("__implicit__"))continue;if(!e[i].columns.every(e=>e.field?.startsWith("__tbw_")))continue;let r=null;for(let t=i-1;t>=0;t--)if(!String(e[t].id).startsWith("__implicit__")){r=e[t].id;break}let n=null;for(let t=i+1;t<e.length;t++)if(!String(e[t].id).startsWith("__implicit__")){n=e[t].id;break}r&&n&&r===n&&t.add(String(e[i].id))}return t}(e),i=function(e,t){const i=[];for(const r of e){if(String(r.id).startsWith("__implicit__")&&t.has(String(r.id)))continue;const e=i[i.length-1];e&&!String(r.id).startsWith("__implicit__")&&e.id===r.id?i[i.length-1]={...e,columns:[...e.columns,...r.columns]}:i.push({...r,columns:[...r.columns]})}return i}(e,t);return{merged:i,embedded:t}}function mt(e,t){const i=e.columns[0],r=e.columns[e.columns.length-1],n=i?t.findIndex(e=>e.field===i.field):-1,o=r?t.findIndex(e=>e.field===r.field):-1;return-1!==n&&-1!==o?[n,o]:null}class wt extends i{static manifest={ownedProperties:[{property:"group",level:"column",description:'the "group" column property'},{property:"columnGroups",level:"config",description:'the "columnGroups" config property',isUsed:e=>Array.isArray(e)&&e.length>0}],queries:[{type:"getColumnGrouping",description:"Returns column group metadata for the visibility panel"},{type:"collectHeaderRows",description:"Contributes a group-header row above the leaf header for exports / printers"}]};name="groupingColumns";styles="@layer tbw-plugins{.header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:var(--tbw-button-padding-sm, .25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm, .9em);text-transform:uppercase;letter-spacing:.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";get defaultConfig(){return{showGroupBorders:!0,lockGroupOrder:!1}}groups=[];isActive=!1;#X=/* @__PURE__ */new Set;#J=[];#ee=/* @__PURE__ */new Map;attach(e){super.attach(e),this.gridElement.addEventListener("column-move",this.#te,{signal:this.disconnectSignal})}detach(){this.groups=[],this.isActive=!1,this.#X.clear(),this.#J=[],this.#ee.clear()}#te=e=>{if(!this.isActive)return;const t=e,{field:i,columnOrder:r}=t.detail;if(this.config.lockGroupOrder){const e=/* @__PURE__ */new Map;for(const t of this.groups){if(t.id.startsWith("__implicit__"))continue;const i=e.get(t.id);i?i.push(...t.columns):e.set(t.id,[...t.columns])}for(const[,n]of e)if(!this.#ie(n,r))return t.preventDefault(),void this.#re(i)}this.#ne(r)};#ne(e){this.#X.clear();const t=/* @__PURE__ */new Map;for(const i of this.groups)for(const e of i.columns)t.set(e.field,i.id);for(let i=0;i<e.length-1;i++){t.get(e[i])!==t.get(e[i+1])&&this.#X.add(e[i])}}#ie(e,t){const i=e.map(e=>t.indexOf(e.field)).filter(e=>-1!==e).sort((e,t)=>e-t);return i.length<=1||i.length===i[i.length-1]-i[0]+1}#re(e){const t=this.gridElement?.querySelector(`.header-row [part~="header-cell"][data-field="${e}"]`);t&&(t.style.setProperty("--_flash-color","var(--tbw-color-error)"),t.animate([{backgroundColor:"rgba(from var(--_flash-color) r g b / 30%)"},{backgroundColor:"transparent"}],{duration:400,easing:"ease-out"}))}handleQuery(e){return"getColumnGrouping"===e.type?this.#oe():"collectHeaderRows"===e.type?this.#se(e.context):void 0}#se(e){const t=e?.columns;if(!Array.isArray(t)||0===t.length)return;const i=pt(t);if(0===i.length)return;const{merged:r}=ft(i),n=[];for(const o of r){const e=String(o.id).startsWith("__implicit__"),i=o.columns[0],r=o.columns[o.columns.length-1];if(!i||!r)continue;const s=t.findIndex(e=>e.field===i.field),l=t.findIndex(e=>e.field===r.field);if(s<0||l<0)continue;const a=l-s+1;n.push({label:e?"":o.label??o.id,span:a,source:this.name})}if(0===n.length)return;return n.reduce((e,t)=>e+t.span,0)!==t.length?{cells:[{label:"",span:t.length,source:this.name}]}:{cells:n}}#oe(){let e;if(this.#J.length>0)e=this.#J.filter(e=>e.children.length>0).map(e=>({id:e.id,label:e.header,fields:[...e.children]}));else if(this.isActive&&this.groups.length>0){const t=/* @__PURE__ */new Map;for(const e of this.groups){if(e.id.startsWith("__implicit__"))continue;const i=t.get(e.id);if(i)for(const t of e.columns)i.fields.includes(t.field)||i.fields.push(t.field);else t.set(e.id,{id:e.id,label:e.label??e.id,fields:e.columns.map(e=>e.field)})}e=Array.from(t.values());const i=this.columns;for(const r of i)if(r.hidden&&r.group){const t="string"==typeof r.group?r.group:r.group.id,i="string"==typeof r.group?r.group:r.group.label??r.group.id,n=e.find(e=>e.id===t);n?n.fields.includes(r.field)||n.fields.push(r.field):e.push({id:t,label:i,fields:[r.field]})}}else{const t=this.columns,i=/* @__PURE__ */new Map;for(const e of t){if(!e.group)continue;const t="string"==typeof e.group?e.group:e.group.id,r="string"==typeof e.group?e.group:e.group.label??e.group.id,n=i.get(t);n?n.fields.includes(e.field)||n.fields.push(e.field):i.set(t,{id:t,label:r,fields:[e.field]})}e=Array.from(i.values())}const t=this.grid?.getColumnOrder();if(t&&t.length>0){const i=new Map(t.map((e,t)=>[e,t]));for(const t of e)t.fields.sort((e,t)=>(i.get(e)??1/0)-(i.get(t)??1/0))}return e}static detect(e,t){const i=t?.features?.groupingColumns;if(i&&"object"==typeof i&&Array.isArray(i.columnGroups)&&i.columnGroups.length>0)return!0;if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const r=t?.columns;return!!Array.isArray(r)&&function(e){return e.some(e=>null!=e.group)}(r)}processColumns(e){const t=this.config?.columnGroups,i=this.grid?.gridConfig?.columnGroups;let r,n;if(t&&Array.isArray(t)&&t.length>0?(i&&Array.isArray(i)&&i.length>0&&this.warn(m,"columnGroups defined in both gridConfig and groupingColumns feature config. Using feature config (higher precedence)."),r=t):i&&Array.isArray(i)&&i.length>0&&(r=i),r&&r.length>0){const t=r.map(e=>{return e.id?e:(e.header||p(f,'ColumnGroupDefinition requires either an "id" or a "header" to generate an id from.'),{...e,id:(t=e.header,t.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""))});var t});this.#J=t,this.#ee.clear();for(const e of t)e.renderer&&this.#ee.set(e.id,e.renderer);const i=/* @__PURE__ */new Map;for(const e of t)for(const t of e.children)i.set(t,{id:e.id,label:e.header});n=e.map(e=>{const t=i.get(e.field);return t&&!e.group?{...e,group:t}:e})}else this.#J=[],this.#ee.clear(),n=[...e];const o=pt(n);if(0===o.length)return this.isActive=!1,this.groups=[],n;if(this.#ee.size>0)for(const s of o){const e=this.#ee.get(s.id);e&&(s.renderer=e)}this.isActive=!0,this.groups=o,this.#X.clear();for(const s of o){const e=s.columns[s.columns.length-1];e?.field&&this.#X.add(e.field)}return n}afterRender(){if(!this.isActive){const e=this.gridElement?.querySelector(".header"),t=e?.querySelector(".header-group-row");return void(t&&t.remove())}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const i=this.visibleColumns,r=pt(i);if(0===r.length)return;if(this.#ee.size>0)for(const n of r){const e=this.#ee.get(n.id);e&&(n.renderer=e)}this.#X.clear();const o=ft(r);for(let n=0;n<o.merged.length;n++){const e=o.merged[n],t=e.columns[e.columns.length-1];t?.field&&n<o.merged.length-1&&this.#X.add(t.field)}const s=function(e,t,i,r){if(0===e.length)return null;const o=document.createElement("div");o.className="header-group-row",o.setAttribute("role","row");const{merged:s}=r??ft(e);for(const l of s){const e=String(l.id),r=e.startsWith("__implicit__"),s=mt(l,t);if(!s)continue;const[a,d]=s,c=d-a+1,u=r?"":l.label||l.id,h=document.createElement("div");h.className="cell header-group-cell",r&&h.classList.add("implicit-group"),h.setAttribute("data-group",e),h.style.gridColumn=`${a+1} / span ${c}`;const g=!r&&(l.renderer||i)||void 0;if(g&&!r){const t=g({id:e,label:String(u),columns:l.columns,firstIndex:a,isImplicit:!1});t instanceof HTMLElement?h.appendChild(t):"string"==typeof t?h.innerHTML=n(t):h.textContent=u}else h.textContent=u;o.appendChild(h)}return o}(r,i,this.config.groupHeaderRenderer,o);if(s){s.classList.toggle("no-borders",!this.config.showGroupBorders);const t=e.querySelector(".header-row");t?e.insertBefore(s,t):e.appendChild(s)}const l=e.querySelector(".header-row");l&&(l.classList.toggle("no-group-borders",!this.config.showGroupBorders),function(e,t,i,r){if(!t.length||!e)return;const{merged:n,embedded:o}=r??ft(t),s=/* @__PURE__ */new Map;for(const a of n)if(!String(a.id).startsWith("__implicit__"))for(const e of a.columns)e.field&&s.set(e.field,a.id);for(let a=0;a<t.length;a++){const e=t[a];if(String(e.id).startsWith("__implicit__")&&o.has(String(e.id)))for(let i=a-1;i>=0;i--)if(!String(t[i].id).startsWith("__implicit__")){for(const r of e.columns)r.field&&s.set(r.field,t[i].id);break}}const l=Array.from(e.querySelectorAll(".cell[data-field]"));l.forEach(e=>{const t=e.getAttribute("data-field")||"",i=s.get(t);i&&(e.classList.add("grouped"),e.getAttribute("data-group")||e.setAttribute("data-group",i))});for(const a of n){const e=a.columns[a.columns.length-1],t=l.find(t=>t.getAttribute("data-field")===e.field);t&&t.classList.add("group-end")}}(l,r,0,o))}afterCellRender(e){this.isActive&&this.config.showGroupBorders&&e.cellElement.classList.toggle("group-end",this.#X.has(e.column.field))}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){return this.groups.filter(t=>t.id===e).flatMap(e=>e.columns)}refresh(){this.requestRender()}}function bt({rows:e,config:t,expanded:i,initialExpanded:r,groupSortDirections:n}){const o=t.groupOn;if("function"!=typeof o)return[];const s={key:"__root__",value:null,depth:-1,rows:[],children:/* @__PURE__ */new Map};if(e.forEach(e=>{let t=o(e);null==t||!1===t?t=["__ungrouped__"]:Array.isArray(t)||(t=[t]);let i=s;t.forEach((t,r)=>{const n=null==t?"∅":String(t),o="__root__"===i.key?n:i.key+"||"+n;let s=i.children.get(n);s||(s={key:o,value:t,depth:r,rows:[],children:/* @__PURE__ */new Map,parent:i},i.children.set(n,s)),s.rows.push(e),i=s})}),1===s.children.size&&s.children.has("__ungrouped__")){if(s.children.get("__ungrouped__").rows.length===e.length)return[]}const l=/* @__PURE__ */new Map;for(let h=0;h<e.length;h++)l.set(e[h],h);const a=/* @__PURE__ */new Set([...i,...r??[]]),d=e=>{const t=[...e.children.values()],i=e===s?0:e.depth+1,r=n?.get(i)??1;return t.sort((e,t)=>{const i=e.value,n=t.value;return null==i&&null==n?0:null==i?r:null==n?-r:i>n?r:i<n?-r:0}),t},c=[],u=e=>{if(e===s){for(const t of d(e))u(t);return}const t=a.has(e.key);if(c.push({kind:"group",key:e.key,value:e.value,depth:e.depth,rows:e.rows,expanded:t}),t)if(e.children.size)for(const i of d(e))u(i);else e.rows.forEach(e=>c.push({kind:"data",row:e,rowIndex:l.get(e)??-1}))};return u(s),c}function vt(e,t){if(!0===e)return new Set(t);if(!1===e||null==e)/* @__PURE__ */
|
|
2
|
+
return new Set;if("number"==typeof e){const i=t[e];return i?/* @__PURE__ */new Set([i]):/* @__PURE__ */new Set}return"string"==typeof e?/* @__PURE__ */new Set([e]):Array.isArray(e)?new Set(e):/* @__PURE__ */new Set}function yt({groups:e,expanded:t,groupRows:i,loadingGroups:r,parentPath:n=[]}){const o=[],s=n.length;for(const l of e){const e=[...n,l.key],a=t.has(l.key),d=i.get(l.key)??[],c=r.has(l.key);if(o.push({kind:"group",key:l.key,value:l.value,depth:s,rows:d,expanded:a}),a)if(l.children?.length){const n=yt({groups:l.children,expanded:t,groupRows:i,loadingGroups:r,parentPath:e});o.push(...n)}else c?o.push({kind:"data",row:{__loading:!0,__groupKey:l.key},rowIndex:-1}):d.forEach((e,t)=>{o.push({kind:"data",row:e,rowIndex:t})})}return o}function Ct(e,t,i=[]){for(const r of e){const e=[...i,r.key];if(r.key===t)return e;if(r.children?.length){const i=Ct(r.children,t,e);if(i.length>0)return i}}return[]}class xt extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10,onHeaderClick:-1},incompatibleWith:[{name:"tree",reason:"Both plugins transform the entire row model. TreePlugin flattens nested hierarchies while GroupingRowsPlugin groups flat rows with synthetic headers. Use one approach per grid."},{name:"pivot",reason:"PivotPlugin creates its own aggregated row and column structure. Row grouping cannot be applied on top of pivot-generated rows."}],events:[{type:"group-toggle",description:"Emitted when groups are expanded/collapsed. Broadcast to both DOM consumers and plugin bus."},{type:"group-expand",description:"Emitted when a pre-defined group is expanded."},{type:"group-collapse",description:"Emitted when a pre-defined group is collapsed."}],queries:[{type:"canMoveRow",description:"Returns false for group header rows (cannot be reordered)"},{type:"grouping:get-grouped-fields",description:"Returns the column field names that match group depth levels (string[])"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level group indices for ServerSide pagination."}],configRules:[{id:"groupingRows/accordion-defaultExpanded",severity:"warn",message:'"accordion: true" and "defaultExpanded" (non-false) are used together.\n → In accordion mode, only one group can be open at a time.\n → Using defaultExpanded with multiple groups will collapse to one on first toggle.\n → Consider using "defaultExpanded: false" or a single group key/index with accordion mode.',check:e=>!0===e.accordion&&!1!==e.defaultExpanded&&void 0!==e.defaultExpanded&&!("number"==typeof e.defaultExpanded)&&!("string"==typeof e.defaultExpanded)&&(!0===e.defaultExpanded||Array.isArray(e.defaultExpanded)&&e.defaultExpanded.length>1)}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for coordinated group sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded grouped data"}];name="groupingRows";styles="@layer tbw-plugins{.group-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-grouping-rows-bg, var(--tbw-color-panel-bg));font-weight:500;border-bottom:var(--tbw-row-divider);min-height:var(--tbw-row-height)}.group-row .cell{display:flex;align-items:center;padding:var(--tbw-cell-padding, .125rem .5rem)}@media(hover:hover){.group-row:hover{background:var(--tbw-grouping-rows-bg-hover, var(--tbw-color-row-hover))}}.group-toggle{cursor:pointer;user-select:none;display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-toggle-size, 1.25rem);height:var(--tbw-toggle-size, 1.25rem);margin-right:.25rem;background:none;border:0;font:inherit}.group-toggle:hover{background:var(--tbw-grouping-rows-toggle-hover, var(--tbw-color-row-hover));border-radius:var(--tbw-border-radius, .125rem)}.group-label{display:inline-flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.group-count{color:var(--tbw-grouping-rows-count-color, var(--tbw-color-fg-muted));font-size:var(--tbw-font-size-xs, .85em);font-weight:400}.group-aggregates{display:inline-flex;align-items:center;gap:var(--tbw-spacing-lg, 1rem);margin-left:var(--tbw-spacing-lg, 1rem);font-weight:400;font-size:var(--tbw-font-size-sm, .875em);color:var(--tbw-grouping-rows-aggregate-color, var(--tbw-color-fg-muted))}.group-aggregate{white-space:nowrap}.group-row{padding-left:calc(var(--tbw-group-depth, 0) * var(--tbw-group-indent-width, 1.25em))}.data-grid-row.tbw-group-slide-in{animation:tbw-group-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-group-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.data-grid-row.tbw-group-fade-in{animation:tbw-group-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-group-fade-in{0%{opacity:0}to{opacity:1}}}";get defaultConfig(){return{defaultExpanded:!1,showRowCount:!0,indentWidth:20,aggregators:{},animation:"slide",accordion:!1}}expandedKeys=/* @__PURE__ */new Set;flattenedRows=[];isActive=!1;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;hasAppliedDefaultExpanded=!1;preDefinedGroups=[];groupRowsMap=/* @__PURE__ */new Map;loadingGroups=/* @__PURE__ */new Set;groupedFields=[];userGroupSortDirections=/* @__PURE__ */new Map;flatMeta=[];get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detach(){const e=this.gridElement?.querySelector(".rows-body");e?.setAttribute("role","grid"),this.expandedKeys.clear(),this.flattenedRows=[],this.flatMeta=[],this.isActive=!1,this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.hasAppliedDefaultExpanded=!1,this.preDefinedGroups=[],this.groupRowsMap.clear(),this.loadingGroups.clear(),this.groupedFields=[],this.userGroupSortDirections.clear()}getRowHeight(e,t){if(null!=this.config.groupRowHeight)return!0===e.__isGroupRow?this.config.groupRowHeight:void 0}handleQuery(e){if("canMoveRow"===e.type){const t=e.context;if(!0===t?.__isGroupRow)return!1}if("grouping:get-grouped-fields"===e.type)return[...this.groupedFields];if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:i}=e.context;if(0===this.flattenedRows.length)return;if(0===this.preDefinedGroups.length&&!Array.isArray(this.config.groups))return;const r=this.getActiveGroups();return{startNode:this.getTopLevelGroupIndex(t),endNode:this.getTopLevelGroupIndex(i)+1,totalLoadedNodes:r.length}}}getTopLevelGroupIndex(e){let t=-1;const i=Math.min(e,this.flattenedRows.length-1);for(let r=0;r<=i;r++){const e=this.flattenedRows[r];"group"===e.kind&&0===e.depth&&t++}return Math.max(0,t)}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0,this.preDefinedGroups=t.rows,this.groupRowsMap.clear(),this.loadingGroups.clear(),this.hasAppliedDefaultExpanded=!1,this.requestRender())}),this.on("datasource:children",e=>{const t=e;if("grouping-rows"!==t.context?.source)return;t.claimed=!0;const i=t.context.groupKey;i&&(this.groupRowsMap.set(i,t.rows),this.loadingGroups.delete(i),this.requestRender())})}onHeaderClick(e){const t=this.groupedFields.indexOf(e.field);if(-1===t)return;if(!e.column.sortable)return;const i=t,r=this.userGroupSortDirections.get(i)??1;return this.userGroupSortDirections.set(i,1===r?-1:1),this.requestRender(),!0}resolveGroupSortDirections(e){const t=this.config;if("function"!=typeof t.groupOn||0===e.length)return void(this.groupedFields=[]);const i=this.columns.map(e=>e.field),r=function(e,t,i){const r=/* @__PURE__ */new Map;if(0===e.length)return r;const n=e[0];let o=t(n);if(null==o||!1===o)return r;Array.isArray(o)||(o=[o]);for(let s=0;s<o.length;s++){const e=o[s];for(const t of i)if(n[t]===e){r.set(s,t);break}}return r}([...e],t.groupOn,i);if(this.groupedFields=[...r.values()],0===r.size)return;const n=new Map(this.userGroupSortDirections);if(n.size<r.size){const e=/* @__PURE__ */new Map,t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0){const i=t[0];if(Array.isArray(i))for(const t of i)e.set(t.field,"desc"===t.direction?-1:1)}if(0===e.size){const t=this.grid;t._sortState&&e.set(t._sortState.field,t._sortState.direction)}for(const[i,o]of r)if(!n.has(i)){const t=e.get(o);void 0!==t&&n.set(i,t)}}return n.size>0?n:void 0}static detect(e,t){return"function"==typeof t?.groupOn||"boolean"==typeof t?.enableRowGrouping||Array.isArray(t?.groups)}processRows(e){if(this.preDefinedGroups.length>0||Array.isArray(this.config.groups))return this.preDefinedGroups.length>0||Array.isArray(this.config.groups)&&this.config.groups.length>0?this.processPreDefinedGroups():(this.isActive=!1,this.flattenedRows=[],[]);const t=this.config;if("function"!=typeof t.groupOn)return this.isActive=!1,this.flattenedRows=[],[...e];const i=this.resolveGroupSortDirections(e),r=bt({rows:[...e],config:t,expanded:/* @__PURE__ */new Set,groupSortDirections:i});if(0===r.length)return this.isActive=!1,this.flattenedRows=[],[...e];let n;if(!this.hasAppliedDefaultExpanded&&0===this.expandedKeys.size&&!1!==t.defaultExpanded){const e=function(e){return e.filter(e=>"group"===e.kind).map(e=>e.key)}(r);n=vt(t.defaultExpanded??!1,e),n.size>0&&(this.expandedKeys=new Set(n),this.hasAppliedDefaultExpanded=!0)}const o=bt({rows:[...e],config:t,expanded:this.expandedKeys,initialExpanded:n,groupSortDirections:i});this.isActive=!0,this.flattenedRows=o,this.computeFlatMeta(),this.keysToAnimate.clear();const s=/* @__PURE__ */new Set;return o.forEach((e,t)=>{if("data"===e.kind){const e=`data-${t}`;s.add(e),this.previousVisibleKeys.has(e)||this.keysToAnimate.add(e)}}),this.previousVisibleKeys=s,o.map(e=>{return"group"===e.kind?{__isGroupRow:!0,__groupKey:e.key,__groupValue:e.value,__groupDepth:e.depth,__groupRows:e.rows,__groupExpanded:e.expanded,__groupRowCount:(t=e,"group"!==t.kind?0:t.rows.length),__rowCacheKey:`group:${e.key}`}:e.row;var t})}onCellClick(e){const t=e.row;if(t?.__isGroupRow){const i=e.originalEvent.target;if(i?.closest(`.${w.GROUP_TOGGLE}`))return this.toggle(t.__groupKey),!0}}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusRow,i=this.rows[t];return i?.__isGroupRow?(e.preventDefault(),this.toggle(i.__groupKey),this.requestRenderWithFocus(),!0):void 0}renderRow(e,t,i){if(!0===e?.__loading&&e?.__groupKey){t.className="data-grid-row",t.__isCustomRow=!0,t.innerHTML="";const e=document.createElement("div");return e.className="cell",e.style.gridColumn="1 / -1",e.setAttribute("role","gridcell"),e.textContent=" ",t.appendChild(e),b(t,!0),!0}if(!e?.__isGroupRow)return!1;const r=this.config;if(r.groupRowRenderer){const i=()=>{this.toggle(e.__groupKey)},n=r.groupRowRenderer({key:e.__groupKey,value:e.__groupValue,depth:e.__groupDepth,rows:e.__groupRows,expanded:e.__groupExpanded,toggleExpand:i});if(n)return t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),"string"==typeof n?t.innerHTML=n:(t.innerHTML="",t.appendChild(n)),!0}const n=()=>{this.toggle(e.__groupKey)};t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),t.setAttribute("role","row"),t.setAttribute("aria-expanded",String(e.__groupExpanded)),t.classList.toggle("tbw-row-expanded",!!e.__groupExpanded);const o=this.flatMeta[i];o&&(t.setAttribute("aria-level",String(o.level)),t.setAttribute("aria-setsize",String(o.setSize)),t.setAttribute("aria-posinset",String(o.posInSet))),t.style.setProperty("--tbw-group-depth",String(e.__groupDepth||0)),void 0!==r.indentWidth&&t.style.setProperty("--tbw-group-indent-width",`${r.indentWidth}px`),t.style.height="",t.innerHTML="";return!1!==r.fullWidth?this.renderFullWidthGroupRow(e,t,n):this.renderPerColumnGroupRow(e,t,n),!0}afterRender(){const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.gridElement?.querySelector(".rows-body");t&&"treegrid"!==t.getAttribute("role")&&t.setAttribute("role","treegrid");for(const n of e.querySelectorAll(".data-grid-row:not(.group-row)")){const e=n.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flatMeta[t];i&&(n.setAttribute("aria-level",String(i.level)),n.setAttribute("aria-setsize",String(i.setSize)),n.setAttribute("aria-posinset",String(i.posInSet)))}const i=this.animationStyle;if(!1===i||0===this.keysToAnimate.size)return;const r="fade"===i?"tbw-group-fade-in":"tbw-group-slide-in";for(const n of e.querySelectorAll(".data-grid-row:not(.group-row)")){const e=n.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flattenedRows[t],o="data"===i?.kind?`data-${t}`:void 0;o&&this.keysToAnimate.has(o)&&(n.classList.add(r),n.addEventListener("animationend",()=>n.classList.remove(r),{once:!0}))}this.keysToAnimate.clear()}computeFlatMeta(){const e=this.flattenedRows,t=new Array(e.length),i=/* @__PURE__ */new Map,r=/* @__PURE__ */new Map;let n=null,o=0;for(const d of e)if("group"===d.kind){n&&r.set(n.key,o),n=d,o=0;const e=`${d.key.split("||").slice(0,-1).join("||")}@${d.depth}`;i.set(e,(i.get(e)??0)+1)}else o++;n&&r.set(n.key,o);const s=/* @__PURE__ */new Map;let l=null,a=0;for(let d=0;d<e.length;d++){const n=e[d];if("group"===n.kind){const e=`${n.key.split("||").slice(0,-1).join("||")}@${n.depth}`,r=(s.get(e)??0)+1;s.set(e,r),t[d]={level:n.depth+1,setSize:i.get(e)??1,posInSet:r},l=n,a=0}else{a++;const i=l?.depth??-1,n=l?r.get(l.key)??1:e.length;t[d]={level:i+2,setSize:n,posInSet:a}}}this.flatMeta=t}processPreDefinedGroups(){const e=this.preDefinedGroups.length>0?this.preDefinedGroups:Array.isArray(this.config.groups)?this.config.groups:[];if(0===e.length)return this.isActive=!1,this.flattenedRows=[],[];if(!this.hasAppliedDefaultExpanded&&0===this.expandedKeys.size&&!1!==this.config.defaultExpanded){const t=this.collectGroupKeys(e),i=vt(this.config.defaultExpanded??!1,t);i.size>0&&(this.expandedKeys=new Set(i),this.hasAppliedDefaultExpanded=!0)}const t=yt({groups:e,expanded:this.expandedKeys,groupRows:this.groupRowsMap,loadingGroups:this.loadingGroups});this.isActive=!0,this.flattenedRows=t,this.computeFlatMeta(),this.keysToAnimate.clear();const i=/* @__PURE__ */new Set;return t.forEach((e,t)=>{if("data"===e.kind){const e=`data-${t}`;i.add(e),this.previousVisibleKeys.has(e)||this.keysToAnimate.add(e)}}),this.previousVisibleKeys=i,t.map(t=>{if("group"===t.kind){const i=this.findGroupDefinition(e,t.key),r=i?.rowCount??t.rows.length;return{__isGroupRow:!0,__groupKey:t.key,__groupValue:t.value,__groupDepth:t.depth,__groupRows:t.rows,__groupExpanded:t.expanded,__groupRowCount:r,__rowCacheKey:`group:${t.key}`}}return t.row})}collectGroupKeys(e){const t=[];for(const i of e)t.push(i.key),i.children?.length&&t.push(...this.collectGroupKeys(i.children));return t}getActiveGroups(){return this.preDefinedGroups.length>0?this.preDefinedGroups:Array.isArray(this.config.groups)?this.config.groups:[]}findGroupDefinition(e,t){for(const i of e){if(i.key===t)return i;if(i.children?.length){const e=this.findGroupDefinition(i.children,t);if(e)return e}}}createToggleButton(e,t){const i=document.createElement("button");return i.type="button",i.className=`${w.GROUP_TOGGLE}${e?` ${w.EXPANDED}`:""}`,i.setAttribute("aria-label",e?"Collapse group":"Expand group"),this.setIcon(i,e?"collapse":"expand"),i.addEventListener("click",e=>{e.stopPropagation(),t()}),i}getGroupLabelText(e,t,i){const r=this.config;return r.formatLabel?r.formatLabel(e,t,i):String(e)}renderFullWidthGroupRow(e,t,i){const r=this.config,n=r.aggregators??{},o=e.__groupRows??[],s=document.createElement("div");s.className="cell group-full",s.style.gridColumn="1 / -1",s.setAttribute("role","gridcell"),s.setAttribute("data-col","0"),s.appendChild(this.createToggleButton(e.__groupExpanded,i));const l=document.createElement("span");if(l.className=w.GROUP_LABEL,l.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey),s.appendChild(l),!1!==r.showRowCount){const t=document.createElement("span");t.className=w.GROUP_COUNT,t.textContent=`(${e.__groupRowCount??e.__groupRows?.length??0})`,s.appendChild(t)}const a=Object.entries(n);if(a.length>0){const e=document.createElement("span");e.className="group-aggregates";for(const[t,i]of a){const r=this.columns.find(e=>e.field===t),n=v.run(i,o,t,r);if(null!=n){const i=document.createElement("span");i.className="group-aggregate",i.setAttribute("data-field",t);const o=r?.header??t;i.textContent=`${o}: ${n}`,e.appendChild(i)}}e.children.length>0&&s.appendChild(e)}t.appendChild(s)}renderPerColumnGroupRow(e,t,i){const r=this.config,n=r.aggregators??{},o=this.columns,s=e.__groupRows??[],l=this.gridElement?.querySelector(".body"),a=l?.style.gridTemplateColumns||"";a&&(t.style.display="grid",t.style.gridTemplateColumns=a);let d=!1;o.forEach((o,l)=>{const a=document.createElement("div");if(a.className="cell group-cell",a.setAttribute("data-col",String(l)),a.setAttribute("role","gridcell"),lt(o))return a.setAttribute("data-field",o.field),void t.appendChild(a);if(d){const e=n[o.field];if(e){const t=v.run(e,s,o.field,o);a.textContent=null!=t?String(t):""}else a.textContent=""}else{d=!0,a.appendChild(this.createToggleButton(e.__groupExpanded,i));const t=document.createElement("span"),l=n[o.field];if(l){const i=v.run(l,s,o.field,o);t.textContent=String(null!=i?i:e.__groupValue)}else t.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey);if(a.appendChild(t),!1!==r.showRowCount){const e=document.createElement("span");e.className=w.GROUP_COUNT,e.textContent=` (${s.length})`,a.appendChild(e)}}t.appendChild(a)})}expandAll(){this.expandedKeys=function(e){const t=/* @__PURE__ */new Set;for(const i of e)"group"===i.kind&&t.add(i.key);return t}(this.flattenedRows),this.emitPluginEvent("group-toggle",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("group-toggle",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}toggle(e){const t=!this.expandedKeys.has(e),i=this.config,r=this.flattenedRows.find(t=>"group"===t.kind&&t.key===e);if(i.accordion&&t&&r){const t=/* @__PURE__ */new Set;for(const i of this.expandedKeys)if(e.startsWith(i+"||")||i.startsWith(e+"||"))e.startsWith(i+"||")&&t.add(i);else{const e=this.flattenedRows.find(e=>"group"===e.kind&&e.key===i);e&&e.depth!==r.depth&&t.add(i)}t.add(e),this.expandedKeys=t}else this.expandedKeys=function(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i}(this.expandedKeys,e);this.broadcast("group-toggle",{key:e,expanded:this.expandedKeys.has(e),value:r?.value,depth:r?.depth??0,expandedKeys:[...this.expandedKeys]});const n=this.getActiveGroups();if(n.length>0){const i=Ct(n,e);if(t){if(this.emit("group-expand",{groupKey:e,groupPath:i}),!this.groupRowsMap.has(e)){const t=this.findGroupDefinition(n,e);t&&(this.loadingGroups.add(e),this.grid?.query?.("datasource:fetch-children",{context:{source:"grouping-rows",groupKey:e,group:t,groupPath:i}}))}}else this.emit("group-collapse",{groupKey:e,groupPath:i})}const o=this.expandedKeys.has(e),s=null!=r?.value?String(r.value):e;if(o){const e=r?.rows?.length??0;a(this.gridElement,d(this.gridElement,"groupExpanded",s,e))}else a(this.gridElement,d(this.gridElement,"groupCollapsed",s));this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}expand(e){this.expandedKeys.has(e)||(this.expandedKeys=/* @__PURE__ */new Set([...this.expandedKeys,e]),this.requestRender())}collapse(e){if(this.expandedKeys.has(e)){const t=new Set(this.expandedKeys);t.delete(e),this.expandedKeys=t,this.requestRender()}}getGroupState(){const e=this.flattenedRows.filter(e=>"group"===e.kind);return{isActive:this.isActive,expandedCount:this.expandedKeys.size,totalGroups:e.length,expandedKeys:[...this.expandedKeys]}}getRowCount(){return this.flattenedRows.length}refreshGroups(){this.requestRender()}getExpandedGroups(){return[...this.expandedKeys]}getFlattenedRows(){return this.flattenedRows}isGroupingActive(){return this.isActive}setGroupOn(e){this.config.groupOn=e,this.requestRender()}setGroups(e){this.preDefinedGroups=e,this.groupRowsMap.clear(),this.loadingGroups.clear(),this.expandedKeys.clear(),this.hasAppliedDefaultExpanded=!1,this.requestRender()}getGroups(){return this.preDefinedGroups.length>0?[...this.preDefinedGroups]:Array.isArray(this.config.groups)?[...this.config.groups]:[]}setGroupRows(e,t){this.groupRowsMap.set(e,t),this.loadingGroups.delete(e),this.requestRender()}setGroupLoading(e,t){t?this.loadingGroups.add(e):this.loadingGroups.delete(e),this.requestRender()}clearGroupRows(e){null!=e?this.groupRowsMap.delete(e):this.groupRowsMap.clear(),this.requestRender()}}function Et(e,t){return e.has(t)?e.delete(t):e.add(t),e}function St(e,t,i,r){const n=document.createElement("div");n.className="master-detail-row",n.setAttribute("data-detail-for",String(t)),n.setAttribute("role","row");const o=document.createElement("div");o.className="master-detail-cell",o.setAttribute("role","cell"),o.style.gridColumn=`1 / ${r+1}`;const s=i(e,t);return"string"==typeof s?o.innerHTML=s:s instanceof HTMLElement&&o.appendChild(s),n.appendChild(o),n}class Rt extends i{name="masterDetail";styles="@layer tbw-plugins{tbw-grid{.cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:center}.header-row .cell[data-field=__tbw_expander]{display:none}.master-detail-expander{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.master-detail-toggle{cursor:pointer;opacity:.7;user-select:none;display:inline-flex;align-items:center;justify-content:center}.master-detail-toggle:hover{opacity:1}.master-detail-row{grid-column:1 / -1;display:grid;background:var(--tbw-master-detail-bg, var(--tbw-color-row-alt));border-bottom:1px solid var(--tbw-master-detail-border, var(--tbw-color-border));overflow:hidden}.master-detail-cell{padding:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));overflow:auto}.master-detail-row.tbw-expanding{animation:tbw-detail-expand var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}.master-detail-row.tbw-collapsing{animation:tbw-detail-collapse var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}}@keyframes tbw-detail-expand{0%{opacity:0;max-height:0;padding-top:0;padding-bottom:0}to{opacity:1;max-height:var(--tbw-detail-max-height, 31.25rem);padding-top:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));padding-bottom:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem))}}@keyframes tbw-detail-collapse{0%{opacity:1;max-height:var(--tbw-detail-max-height, 31.25rem)}to{opacity:0;max-height:0}}}";static dependencies=[{name:"serverSide",required:!1,reason:"Fetches detail data via datasource:fetch-children on expand"}];get#f(){return this.grid}get defaultConfig(){return{detailHeight:"auto",expandOnRowClick:!1,collapseOnClickOutside:!1,animation:"slide"}}attach(e){super.attach(e),this.parseLightDomDetail(),this.on("datasource:children",e=>{const t=e;if("master-detail"!==t.context?.source)return;t.claimed=!0;const i=t.context.row;if(i&&this.expandedRows.has(i)){this.detailDataMap.set(i,t.rows),this.loadingDetails.delete(i);const e=this.detailElements.get(i);e&&(e.remove(),this.detailElements.delete(i),this.measuredDetailHeights.delete(i)),this.requestRender()}})}parseLightDomDetail(){const e=this.gridElement;if(!e)return;const t=e.querySelector("tbw-grid-detail");if(!t)return;const i=this.#f.__frameworkAdapter;if(i?.parseDetailElement){const e=i.parseDetailElement(t);if(e)return void(this.config={...this.config,detailRenderer:e})}const r=t.getAttribute("animation"),o=t.getAttribute("show-expand-column"),s=t.getAttribute("expand-on-row-click"),l=t.getAttribute("collapse-on-click-outside"),a=t.getAttribute("height"),d={};null!==r&&(d.animation="false"!==r&&r),null!==o&&(d.showExpandColumn="false"!==o),null!==s&&(d.expandOnRowClick="true"===s),null!==l&&(d.collapseOnClickOutside="true"===l),null!==a&&(d.detailHeight="auto"===a?"auto":parseInt(a,10));const c=t.innerHTML.trim();c&&!this.config.detailRenderer&&(d.detailRenderer=(e,t)=>{const i=y(c,{value:e,row:e});return n(i)}),Object.keys(d).length>0&&(this.config={...this.config,...d})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}animateExpand(e,t,i){if(!this.isAnimationEnabled||!1===this.animationStyle)return!1;e.classList.add("tbw-expanding");let r=!1;const n=()=>{r||(r=!0,e.classList.remove("tbw-expanding"),void 0!==t&&void 0!==i&&this.#le(e,t,i))};return e.addEventListener("animationend",n,{once:!0}),setTimeout(n,this.animationDuration+50),!0}animateCollapse(e,t){if(!this.isAnimationEnabled||!1===this.animationStyle)return void t();e.classList.add("tbw-collapsing");const i=()=>{e.classList.remove("tbw-collapsing"),t()};e.addEventListener("animationend",i,{once:!0}),setTimeout(i,this.animationDuration+50)}#le(e,t,i){if(!e.isConnected)return;const r=e.offsetHeight;if(r>0){const e=this.measuredDetailHeights.get(t);this.measuredDetailHeights.set(t,r),e!==r&&this.grid.invalidateRowHeight(i)}}expandedRows=/* @__PURE__ */new Set;detailElements=/* @__PURE__ */new Map;measuredDetailHeights=/* @__PURE__ */new Map;rowsToAnimate=/* @__PURE__ */new Set;loadingDetails=/* @__PURE__ */new Set;detailDataMap=/* @__PURE__ */new Map;static DEFAULT_DETAIL_HEIGHT=150;getDetailHeight(e){const t=this.detailElements.get(e);if(t){if(!(t.classList.contains("tbw-expanding")||t.classList.contains("tbw-collapsing"))){const i=t.offsetHeight;if(i>0)return this.measuredDetailHeights.set(e,i),i}}const i=this.measuredDetailHeights.get(e);return i&&i>0?i:"number"==typeof this.config?.detailHeight?this.config.detailHeight:Rt.DEFAULT_DETAIL_HEIGHT}toggleAndEmit(e,t){if(e?.__isGroupRow)return;this.expandedRows=Et(this.expandedRows,e);const i=this.expandedRows.has(e);if(i){if(this.rowsToAnimate.add(e),!this.detailDataMap.has(e)){const i=this.grid?.query?.("datasource:is-active",null);i&&(this.loadingDetails.add(e),this.grid.query("datasource:fetch-children",{context:{source:"master-detail",row:e,rowIndex:t}}))}}else this.loadingDetails.delete(e);this.emit("detail-expand",{rowIndex:t,row:e,expanded:i}),this.requestRender()}detach(){this.expandedRows.clear(),this.detailElements.clear(),this.measuredDetailHeights.clear(),this.rowsToAnimate.clear(),this.loadingDetails.clear(),this.detailDataMap.clear()}processColumns(e){if(!(!0===this.config.showExpandColumn||!1!==this.config.showExpandColumn&&!!this.config.detailRenderer))return[...e];const t=[...e],i=function(e){return e.find(lt)}(t);if(i)return t;const r=(n=this.name,{field:st,header:"",width:32,resizable:!1,sortable:!1,filterable:!1,lockPosition:!0,utility:!0,meta:{expanderColumn:!0,expanderPlugin:n}});var n;return r.viewRenderer=e=>{const{row:t}=e,i=this.expandedRows.has(t),r=document.createElement("span");r.className="master-detail-expander expander-cell";const n=document.createElement("span");return n.className="master-detail-toggle"+(i?" expanded":""),this.setIcon(n,i?"collapse":"expand"),n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-expanded",String(i)),n.setAttribute("aria-label",i?"Collapse details":"Expand details"),r.appendChild(n),r},[r,...t]}onRowClick(e){if(this.config.expandOnRowClick&&this.config.detailRenderer)return this.toggleAndEmit(e.row,e.rowIndex),!1}onCellClick(e){const t=e.originalEvent?.target;if(t?.classList.contains("master-detail-toggle"))return this.toggleAndEmit(e.row,e.rowIndex),!0;this.expandedRows.size>0&&queueMicrotask(()=>this.#ae())}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusCol,i=this.grid._focusRow,r=this.visibleColumns[t];if(!r||!lt(r))return;const n=this.rows[i];return n?(e.preventDefault(),this.toggleAndEmit(n,i),this.requestRenderWithFocus(),!0):void 0}afterRender(){this.#de(),this.#ae()}#de(){const e=this.gridElement?.querySelector('.header-row .cell[data-field="__tbw_expander"]');if(!e)return;const t=parseInt(e.getAttribute("data-col")||"0",10),i=e.nextElementSibling;i&&(i.style.gridColumn=`${t+1} / ${t+3}`)}onScrollRender(){this.config.detailRenderer&&0!==this.expandedRows.size&&this.#ae()}#ae(){if(!this.config.detailRenderer)return;const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=this.grid,i=t._rowPool,r=t._virtualization?.start??0,n=t._virtualization?.end??0,o=this.columns.length,s=r,l=n,a=/* @__PURE__ */new Map;if(i){const t=Math.min(i.length,l-s);for(let r=0;r<t;r++){const t=i[r];t.parentNode===e&&a.set(s+r,t)}}else{const t=e.querySelectorAll(".data-grid-row");for(const e of t){const t=e.querySelector(".cell[data-row]"),i=t?parseInt(t.getAttribute("data-row")??"-1",10):-1;i>=0&&a.set(i,e)}}for(const[d,c]of this.detailElements){const e=this.rows.indexOf(d),t=this.expandedRows.has(d),i=e>=0&&a.has(e);if(!t||!i){const e=this.#f.__frameworkAdapter;if(e?.unmount){const t=c.querySelector(".master-detail-cell"),i=t?.firstElementChild;i&&e.unmount(i)}c.parentNode&&c.remove(),this.detailElements.delete(d)}}for(const[d,c]of a){const e=this.rows[d];if(!e)continue;const t=this.expandedRows.has(e);if(c.classList.toggle("tbw-row-expanded",t),!t)continue;const i=this.detailElements.get(e);if(i){i.previousElementSibling!==c&&c.after(i);continue}const r=St(e,d,this.config.detailRenderer,o);"number"==typeof this.config.detailHeight&&(r.style.height=`${this.config.detailHeight}px`),c.after(r),this.detailElements.set(e,r);const n=this.rowsToAnimate.has(e);n&&this.rowsToAnimate.delete(e);n&&this.animateExpand(r,e,d)||requestAnimationFrame(()=>{this.#le(r,e,d)})}}getRowHeight(e,t){if(!this.expandedRows.has(e))return;return(this.grid.defaultRowHeight??28)+this.getDetailHeight(e)}adjustVirtualStart(e,t,i){if(0===this.expandedRows.size)return e;const r=this.grid?._virtualization?.positionCache;let n=e;if(r&&r.length>0)for(const o of this.expandedRows){const i=this.rows.indexOf(o);if(i<0||i>=e)continue;r[i].offset+r[i].height>t&&i<n&&(n=i)}else{const r=[];for(const e of this.expandedRows){const t=this.rows.indexOf(e);t>=0&&r.push({index:t,row:e})}r.sort((e,t)=>e.index-t.index);let o=0;for(const{index:s,row:l}of r){const r=s*i+o,a=this.getDetailHeight(l);o+=a,s>=e||r+i+a>t&&s<n&&(n=s)}}return n}expand(e){const t=this.rows[e];t&&!t.__isGroupRow&&(this.rowsToAnimate.add(t),this.expandedRows=function(e,t){return e.add(t),e}(this.expandedRows,t),this.requestRender())}collapse(e){const t=this.rows[e];t&&(this.expandedRows=function(e,t){return e.delete(t),e}(this.expandedRows,t),this.requestRender())}toggle(e){const t=this.rows[e];t&&!t.__isGroupRow&&(this.expandedRows=Et(this.expandedRows,t),this.expandedRows.has(t)&&this.rowsToAnimate.add(t),this.requestRender())}isExpanded(e){const t=this.rows[e];return!!t&&function(e,t){return e.has(t)}(this.expandedRows,t)}expandAll(){for(const e of this.rows)e?.__isGroupRow||(this.rowsToAnimate.add(e),this.expandedRows.add(e));this.requestRender()}collapseAll(){this.expandedRows.clear(),this.requestRender()}getExpandedRows(){const e=[];for(const t of this.expandedRows){const i=this.rows.indexOf(t);i>=0&&e.push(i)}return e}getDetailElement(e){const t=this.rows[e];return t?this.detailElements.get(t):void 0}getDetailData(e){const t=this.rows[e];return t?this.detailDataMap.get(t):void 0}isDetailLoading(e){const t=this.rows[e];return!!t&&this.loadingDetails.has(t)}refreshDetailRenderer(){const e=this.config.detailRenderer;if(this.config={...this.config,detailRenderer:void 0},this.parseLightDomDetail(),!this.config.detailRenderer&&e&&(this.config={...this.config,detailRenderer:e}),this.config.detailRenderer){const e=this.#f;"function"==typeof e.refreshColumns?e.refreshColumns():this.requestRender()}}}const At=new Intl.Collator(void 0,{sensitivity:"variant"});function kt(e,t){return null==e&&null==t?0:null==e?1:null==t?-1:"number"==typeof e&&"number"==typeof t?e-t:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():"boolean"==typeof e&&"boolean"==typeof t?e===t?0:e?-1:1:At.compare("string"==typeof e?e:String(e),"string"==typeof t?t:String(t))}function It(e,t){const i=e.findIndex(e=>e.field===t);return i>=0?i+1:void 0}function _t(e,t){return e.find(e=>e.field===t)?.direction}class Tt extends i{static manifest={queries:[{type:"sort:get-model",description:"Returns the current multi-sort model as SortModel[]"},{type:"sort:set-model",description:"Sets the multi-sort model from context (SortModel[])"}]};name="multiSort";styles='@layer tbw-plugins{.header-cell[data-sort=asc]:after{content:"↑";margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.header-cell[data-sort=desc]:after{content:"↓";margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.sort-indicator{margin-left:var(--tbw-spacing-xs, .25em);opacity:.8}.sort-index{font-size:var(--tbw-font-size-2xs, .7em);background:var(--tbw-multi-sort-badge-bg, var(--tbw-color-panel-bg));color:var(--tbw-multi-sort-badge-color, var(--tbw-color-fg));border-radius:50%;width:var(--tbw-multi-sort-badge-size, 1em);height:var(--tbw-multi-sort-badge-size, 1em);display:inline-flex;align-items:center;justify-content:center;margin-left:var(--tbw-spacing-xs, .125em);font-weight:600}}';get defaultConfig(){return{maxSortColumns:3,showSortIndex:!0}}sortModel=[];cachedSortResult=null;#ce=!1;#ue=[];get#f(){return this.grid}clearCoreSortState(){this.#f._sortState=null}#he(e){const t=this.grid?.query?.("grouping:get-grouped-fields",null);if(!Array.isArray(t)||0===t.length)return e;const i=t[0];if(!Array.isArray(i)||0===i.length)return e;const r=new Set(i),n=e.filter(e=>!r.has(e.field));return n.length===e.length?e:n}detach(){this.sortModel=[],this.cachedSortResult=null}handleQuery(e){switch(e.type){case"sort:get-model":return[...this.sortModel];case"sort:set-model":{const t=e.context;return!!Array.isArray(t)&&(this.sortModel=[...t],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),!0)}default:return}}processRows(e){if(0===this.sortModel.length)return this.cachedSortResult=null,[...e];const t=this.#f;if(!t._isGridEditMode&&"number"==typeof t._activeEditRows&&-1!==t._activeEditRows&&this.cachedSortResult&&this.cachedSortResult.length===e.length)return[...this.cachedSortResult];const i=this.#he(this.sortModel),n=e;return i.length>0&&function(e,t,i){if(!t.length)return;const n=t.map(e=>{const t=i.find(t=>t.field===e.field),n=t?.sortComparator??kt,o=e.field,s=t?.valueAccessor?e=>r(e,t):e=>e[o];return{field:o,asc:"asc"===e.direction,comparator:n,getValue:s,pinPlaceholders:!t?.sortComparator}}),o=n.some(e=>e.pinPlaceholders)&&function(e){for(let t=0;t<e.length;t++)if(!0===e[t]?.__loading)return!0;return!1}(e),s=e.length,l=n.length,a=new Array(s*l);for(let r=0;r<s;r++){const t=e[r],i=r*l;for(let e=0;e<l;e++)a[i+e]=n[e].getValue(t)}const d=s<=4294967295?new Uint32Array(s):new Array(s);for(let r=0;r<s;r++)d[r]=r;const c=(t,i)=>{if(o){const r=function(e,t){const i=!0===e?.__loading;return i===(!0===t?.__loading)?0:i?1:-1}(e[t],e[i]);if(0!==r)return r}const r=t*l,s=i*l;for(let o=0;o<l;o++){const l=n[o],d=l.comparator(a[r+o],a[s+o],e[t],e[i]);if(0!==d)return l.asc?d:-d}return 0};Uint32Array,d.sort(c);const u=e.slice();for(let r=0;r<s;r++)e[r]=u[d[r]]}(n,i,this.columns),this.cachedSortResult=n,n}onHeaderClick(e){const t=this.columns.find(t=>t.field===e.field);if(!t?.sortable)return!1;const i=e.originalEvent.shiftKey,r=this.config.maxSortColumns??3;if(this.sortModel=function(e,t,i,r){const n=e.find(e=>e.field===t);return i?n?"asc"===n.direction?e.map(e=>e.field===t?{...e,direction:"desc"}:e):e.filter(e=>e.field!==t):e.length<r?[...e,{field:t,direction:"asc"}]:e:"asc"===n?.direction?[{field:t,direction:"desc"}]:"desc"===n?.direction?[]:[{field:t,direction:"asc"}]}(this.sortModel,e.field,i,r),this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),this.grid?.requestStateChange?.(),this.sortModel.length>0){const e=this.sortModel.map(e=>{const t=this.columns.find(t=>t.field===e.field);return`${t?.header??e.field} ${"asc"===e.direction?"ascending":"descending"}`});a(this.gridElement,d(this.gridElement,"sortApplied",e.join(", then "),""))}else a(this.gridElement,d(this.gridElement,"sortCleared"));return!0}afterRender(){const e=this.gridElement;if(!e)return;const t=!1!==this.config.showSortIndex;e.querySelectorAll(".header-row .cell[data-field]").forEach(e=>{const i=e.getAttribute("data-field");if(!i)return;const r=It(this.sortModel,i),n=_t(this.sortModel,i);if(e.querySelector(".sort-index")?.remove(),n){const i=this.updateSortIndicator(e,n);if(t&&this.sortModel.length>1&&void 0!==r){const t=document.createElement("span");t.className="sort-index",t.textContent=String(r),i.nextSibling?e.insertBefore(t,i.nextSibling):e.appendChild(t)}}else e.classList.contains("sortable")&&this.updateSortIndicator(e,null)})}getSortModel(){return[...this.sortModel]}setSortModel(e){if(this.sortModel=[...e],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[...e]}),this.requestRender(),this.grid?.requestStateChange?.(),e.length>0){const t=e.map(e=>{const t=this.columns.find(t=>t.field===e.field);return`${t?.header??e.field} ${"asc"===e.direction?"ascending":"descending"}`});a(this.gridElement,d(this.gridElement,"sortApplied",t.join(", then "),""))}}clearSort(){this.sortModel=[],this.clearCoreSortState(),this.broadcast("sort-change",{sortModel:[]}),this.requestRender(),this.grid?.requestStateChange?.(),a(this.gridElement,d(this.gridElement,"sortCleared"))}getSortIndex(e){return It(this.sortModel,e)}getSortDirection(e){return _t(this.sortModel,e)}getColumnState(e){const t=this.sortModel.findIndex(t=>t.field===e);if(-1===t)return;return{sort:{direction:this.sortModel[t].direction,priority:t}}}applyColumnState(e,t){if(this.#ce||(this.#ue=[...this.sortModel]),t.sort){const i=this.sortModel.findIndex(t=>t.field===e),r={field:e,direction:t.sort.direction};-1!==i?this.sortModel[i]=r:this.sortModel.splice(t.sort.priority,0,r)}else this.sortModel=this.sortModel.filter(t=>t.field!==e);this.clearCoreSortState(),this.#ce||(this.#ce=!0,queueMicrotask(()=>{this.#ce=!1;const e=this.#ue;this.#ue=[],function(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(e[i].field!==t[i].field||e[i].direction!==t[i].direction)return!1;return!0}(e,this.sortModel)||(this.broadcast("sort-change",{sortModel:[...this.sortModel]}),this.requestRender())}))}}function Lt(e){return e.pinned??e.meta?.pinned}function Ft(e,t){return x(e,t)}function Gt(e,t){const i=Lt(e);return!!i&&"left"===Ft(i,t)}function Dt(e,t){const i=Lt(e);return!!i&&"right"===Ft(i,t)}function Mt(e){for(let t=0;t<e.length;t++)if(null!=e[t].pinned||null!=e[t].meta?.pinned)return!0;return!1}function Nt(e,t){const i={groupEndAdjustments:{addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},leftOffsets:/* @__PURE__ */new Map,rightOffsets:/* @__PURE__ */new Map,splitGroups:[]},r=Array.from(e.querySelectorAll(".header-row .cell"));if(!r.length)return i;const n=C(e),o=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let l=0;for(const u of t)if(Gt(u,n)){const t=r.find(e=>e.getAttribute("data-field")===u.field);t&&(o.set(u.field,l),t.classList.add(w.STICKY_LEFT),t.style.position="sticky",t.style.left=l+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${u.field}"]`).forEach(e=>{e.classList.add(w.STICKY_LEFT),e.style.position="sticky",e.style.left=l+"px"}),l+=t.offsetWidth)}let a=0;for(const u of[...t].reverse())if(Dt(u,n)){const t=r.find(e=>e.getAttribute("data-field")===u.field);t&&(s.set(u.field,a),t.classList.add(w.STICKY_RIGHT),t.style.position="sticky",t.style.right=a+"px",e.querySelectorAll(`.data-grid-row .cell[data-field="${u.field}"]`).forEach(e=>{e.classList.add(w.STICKY_RIGHT),e.style.position="sticky",e.style.right=a+"px"}),a+=t.offsetWidth)}const d=[],c=function(e,t,i,r,n){const o={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},s=Array.from(e.querySelectorAll(".header-group-row .header-group-cell"));if(!s.length)return o;for(const l of s){const e=l.style.gridColumn;if(!e)continue;const s=e.match(/^(\d+)\s*\/\s*span\s+(\d+)$/);if(!s)continue;const a=parseInt(s[1],10)-1,d=a+parseInt(s[2],10)-1,c=t.slice(a,d+1);if(!c.length)continue;const u=c.every(e=>Gt(e,r)),h=c.every(e=>Dt(e,r));if(u){const e=c[0].field,t=i.find(t=>t.getAttribute("data-field")===e);t&&(l.classList.add(w.STICKY_LEFT),l.style.position="sticky",l.style.left=t.style.left)}else if(h){const e=c[c.length-1].field,t=i.find(t=>t.getAttribute("data-field")===e);t&&(l.classList.add(w.STICKY_RIGHT),l.style.position="sticky",l.style.right=t.style.right)}else if(l.classList.contains("implicit-group"))Pt(l,c,a,i,r,o);else{const e=c.some(e=>Gt(e,r)),t=c.some(e=>Dt(e,r));(e||t)&&zt(l,c,a,i,r,o,n)}}return o}(e,t,r,n,d);if(c.addGroupEnd.size>0||c.removeGroupEnd.size>0){for(const t of c.addGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.add("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(e=>{e.classList.add("group-end")})}for(const t of c.removeGroupEnd){const i=r.find(e=>e.getAttribute("data-field")===t);i&&i.classList.remove("group-end"),e.querySelectorAll(`.data-grid-row .cell[data-field="${t}"]`).forEach(e=>{e.classList.remove("group-end")})}}return{groupEndAdjustments:c,leftOffsets:o,rightOffsets:s,splitGroups:d}}function qt(e,t){return Gt(e,t)?"left":Dt(e,t)?"right":"none"}function Pt(e,t,i,r,n,o){const s=[];for(let d=0;d<t.length;d++){const e=qt(t[d],n),r=s[s.length-1];r&&r.state===e?r.cols.push(t[d]):s.push({state:e,cols:[t[d]],colStart:i+d})}if(s.length<=1)return;const l=e.parentElement;if(!l)return;const a=e.nextSibling;l.removeChild(e);for(const d of s){const t=document.createElement("div");if(t.className=e.className,t.setAttribute("data-group",e.getAttribute("data-group")||""),t.style.gridColumn=`${d.colStart+1} / span ${d.cols.length}`,"left"===d.state){const e=d.cols[0].field,i=r.find(t=>t.getAttribute("data-field")===e);i&&(t.classList.add(w.STICKY_LEFT),t.style.position="sticky",t.style.left=i.style.left)}else if("right"===d.state){const e=d.cols[d.cols.length-1].field,i=r.find(t=>t.getAttribute("data-field")===e);i&&(t.classList.add(w.STICKY_RIGHT),t.style.position="sticky",t.style.right=i.style.right)}else if("none"===d.state){d.cols.every(e=>String(e.field||"").startsWith("__tbw_"))&&(t.style.borderRightStyle="none")}a?l.insertBefore(t,a):l.appendChild(t)}for(let d=0;d<s.length;d++){const e=s[d],t=s[d+1];if("none"!==e.state&&t&&"none"===t.state){const t=e.cols[e.cols.length-1].field;t&&o.addGroupEnd.add(t)}if("none"===e.state){if(e.cols.every(e=>String(e.field||"").startsWith("__tbw_"))){const t=e.cols[e.cols.length-1].field;t&&o.removeGroupEnd.add(t)}}}}function zt(e,t,i,r,n,o,s){const l=[];for(let w=0;w<t.length;w++){const e=qt(t[w],n),r=l[l.length-1];r&&r.state===e?r.cols.push(t[w]):l.push({state:e,cols:[t[w]],colStart:i+w})}if(l.length<=1)return;const a=e.parentElement;if(!a)return;const d=e.textContent||"",c=e.getAttribute("data-group")||"",u=e.nextSibling;a.removeChild(e);const h=l.findIndex(e=>"left"===e.state);let g=-1;for(let w=l.length-1;w>=0;w--)if("right"===l[w].state){g=w;break}const p=h>=0?h:g,f=h>=0&&h+1<l.length?h+1:g>=0&&g-1>=0?g-1:-1;let m,b,v,y="";for(let C=0;C<l.length;C++){const t=l[C],i=document.createElement("div");if(i.className=e.className,i.setAttribute("data-group",c),i.style.gridColumn=`${t.colStart+1} / span ${t.cols.length}`,"left"===t.state){const e=t.cols[0].field,n=r.find(t=>t.getAttribute("data-field")===e);n&&(i.classList.add(w.STICKY_LEFT),i.style.position="sticky",i.style.left=n.style.left,n.style.left),C===p&&(i.style.borderRightStyle="none",m=i,y=t.cols[t.cols.length-1].field)}else if("right"===t.state){const e=t.cols[t.cols.length-1].field,n=r.find(t=>t.getAttribute("data-field")===e);n&&(i.classList.add(w.STICKY_RIGHT),i.style.position="sticky",i.style.right=n.style.right),C===p&&(i.style.borderLeftStyle="none",m=i,y=t.cols[0].field)}if(C===f){i.style.overflow="visible";const e=document.createElement("span");e.textContent=d,e.style.position="relative",e.style.zIndex="36",e.style.display="block",e.style.overflow="hidden",e.style.textOverflow="ellipsis",e.style.whiteSpace="nowrap",i.appendChild(e),b=i,v=e}u?a.insertBefore(i,u):a.appendChild(i)}m&&b&&v&&y&&s.push({groupId:c,label:d,pinnedFragment:m,scrollableFragment:b,floatLabel:v,pinnedField:y,isTransferred:!1,floatOffset:0})}function Ht(e){e.querySelectorAll(`.${w.STICKY_LEFT}, .${w.STICKY_RIGHT}`).forEach(e=>{e.classList.remove(w.STICKY_LEFT,w.STICKY_RIGHT),e.style.position="",e.style.left="",e.style.right=""})}const Ot="canMoveColumn";class Kt extends i{static manifest={hookPriority:{processColumns:-10},ownedProperties:[{property:"pinned",level:"column",description:'the "pinned" column property',isUsed:e=>"left"===e||"right"===e||"start"===e||"end"===e}],queries:[{type:Ot,description:"Prevents pinned columns from being moved/reordered"},{type:"getStickyOffsets",description:"Returns the offsets for left/right pinned columns"},{type:"getContextMenuItems",description:"Contributes pin/unpin items to the header context menu"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=/* @__PURE__ */new Map;rightOffsets=/* @__PURE__ */new Map;#ge={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set};#pe=[];#fe=[];detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1,this.#ge={addGroupEnd:/* @__PURE__ */new Set,removeGroupEnd:/* @__PURE__ */new Set},this.#pe=[],this.#fe=[]}static detect(e,t){const i=t?.columns;return!!Array.isArray(i)&&Mt(i)}processColumns(e){const t=[...e];if(this.isApplied=Mt(t),!this.isApplied)return t;const i=this.gridElement;return function(e,t="ltr"){const i=[],r=[],n=[];for(const o of e){const e=Lt(o);e?"left"===Ft(e,t)?i.push(o):n.push(o):r.push(o)}return[...i,...r,...n]}(t,i?C(i):"ltr")}afterRender(){if(!this.isApplied)return;const e=this.gridElement,t=[...this.columns];if(!Mt(t))return Ht(e),void(this.isApplied=!1);queueMicrotask(()=>{const i=Nt(e,t);this.#ge=i.groupEndAdjustments,this.leftOffsets=i.leftOffsets,this.rightOffsets=i.rightOffsets,this.#pe=i.splitGroups,this.#me()})}afterCellRender(e){if(!this.isApplied)return;const t=e.column.field,i=e.cellElement,r=this.leftOffsets.get(t);if(void 0!==r)i.classList.contains(w.STICKY_LEFT)||i.classList.add(w.STICKY_LEFT),i.style.position="sticky",i.style.left=r+"px";else{const e=this.rightOffsets.get(t);void 0!==e&&(i.classList.contains(w.STICKY_RIGHT)||i.classList.add(w.STICKY_RIGHT),i.style.position="sticky",i.style.right=e+"px")}this.#ge.addGroupEnd.has(t)?e.cellElement.classList.add("group-end"):this.#ge.removeGroupEnd.has(t)&&e.cellElement.classList.remove("group-end")}onScroll(e){this.#me()}#me(){if(!this.isApplied||0===this.#pe.length)return;const e=this.gridElement;for(const t of this.#pe){const i=t.pinnedFragment.getBoundingClientRect(),r=t.scrollableFragment.getBoundingClientRect().right<=i.right;if(r&&!t.isTransferred?(t.pinnedFragment.textContent=t.label,t.pinnedFragment.style.overflow="hidden",t.pinnedFragment.style.textOverflow="ellipsis",t.pinnedFragment.style.whiteSpace="nowrap",t.pinnedFragment.style.borderRightStyle="",t.floatLabel.style.visibility="hidden",t.floatLabel.style.transform="",t.floatOffset=0,this.#ge.addGroupEnd.add(t.pinnedField),e.querySelectorAll(`.header-row .cell[data-field="${t.pinnedField}"], .data-grid-row .cell[data-field="${t.pinnedField}"]`).forEach(e=>e.classList.add("group-end")),t.isTransferred=!0):!r&&t.isTransferred&&(t.pinnedFragment.textContent="",t.pinnedFragment.style.overflow="",t.pinnedFragment.style.textOverflow="",t.pinnedFragment.style.whiteSpace="",t.pinnedFragment.style.borderRightStyle="none",t.floatLabel.style.visibility="",t.floatLabel.style.transform="",t.floatOffset=0,this.#ge.addGroupEnd.delete(t.pinnedField),e.querySelectorAll(`.header-row .cell[data-field="${t.pinnedField}"], .data-grid-row .cell[data-field="${t.pinnedField}"]`).forEach(e=>e.classList.remove("group-end")),t.isTransferred=!1),!t.isTransferred){const e=t.floatLabel.getBoundingClientRect().left-t.floatOffset,r=i.left;e<r?(t.floatOffset=r-e,t.floatLabel.style.transform=`translateX(${t.floatOffset}px)`):(t.floatOffset=0,t.floatLabel.style.transform="")}}}handleQuery(e){switch(e.type){case Ot:return null==Lt(e.context)&&void 0;case"getStickyOffsets":return{left:Object.fromEntries(this.leftOffsets),right:Object.fromEntries(this.rightOffsets)};case"getContextMenuItems":{const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockPinning||i.meta?.lockPinning)return;const r=[];return null!=Lt(i)?r.push({id:"pinned/unpin",label:"Unpin Column",icon:"📌",order:40,action:()=>this.setPinPosition(i.field,void 0)}):(r.push({id:"pinned/pin-left",label:"Pin Left",icon:"⬅",order:40,action:()=>this.setPinPosition(i.field,"left")}),r.push({id:"pinned/pin-right",label:"Pin Right",icon:"➡",order:41,action:()=>this.setPinPosition(i.field,"right")})),r}default:return}}setPinPosition(e,t){const i=this.columns;if(!i?.length)return;const r=i.findIndex(t=>t.field===e);if(-1===r)return;const n=this.gridElement;if(t){0===this.#fe.length&&(this.#fe=i.map(e=>e.field));const r=i.map(i=>{if(i.field!==e)return i;const r={...i};return r.pinned=t,r});n.columns=r}else{const t={...i[r]};delete t.pinned;const o=[...i];o.splice(r,1);const s=this.#fe.indexOf(e);if(s>=0){let e=o.length;for(let t=0;t<o.length;t++){if(Lt(o[t]))continue;if(this.#fe.indexOf(o[t].field)>s){e=t;break}}o.splice(e,0,t)}else o.splice(Math.min(r,o.length),0,t);o.some(e=>null!=Lt(e))||(this.#fe=[]),n.columns=o}}refreshStickyOffsets(){const e=[...this.columns],t=Nt(this.gridElement,e);this.#ge=t.groupEndAdjustments,this.leftOffsets=t.leftOffsets,this.rightOffsets=t.rightOffsets,this.#pe=t.splitGroups}getLeftPinnedColumns(){return function(e,t="ltr"){return e.filter(e=>Gt(e,t))}([...this.columns],C(this.gridElement))}getRightPinnedColumns(){return function(e,t="ltr"){return e.filter(e=>Dt(e,t))}([...this.columns],C(this.gridElement))}clearStickyPositions(){Ht(this.gridElement)}getHorizontalScrollOffsets(e,t){if(!this.isApplied)return;let i=0,r=0;if(e){const t=e.querySelectorAll(`.${w.STICKY_LEFT}`),n=e.querySelectorAll(`.${w.STICKY_RIGHT}`);t.forEach(e=>{i+=e.offsetWidth}),n.forEach(e=>{r+=e.offsetWidth})}else{this.gridElement.querySelectorAll(".header-row .cell").forEach(e=>{e.classList.contains(w.STICKY_LEFT)?i+=e.offsetWidth:e.classList.contains(w.STICKY_RIGHT)&&(r+=e.offsetWidth)})}const n=t?.classList.contains(w.STICKY_LEFT)||t?.classList.contains(w.STICKY_RIGHT);return{left:i,right:r,skipScroll:n}}}function Bt(e,t){const i=document.createElement("div");i.className="tbw-pinned-rows",i.setAttribute("role","presentation"),i.setAttribute("aria-live","polite");const r=document.createElement("div");r.className="tbw-pinned-rows-left";const n=document.createElement("div");n.className="tbw-pinned-rows-center";const o=document.createElement("div");if(o.className="tbw-pinned-rows-right",!1!==e.showRowCount){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-row-count",e.textContent=`Total: ${t.totalRows} rows`,r.appendChild(e)}if(e.showFilteredCount&&t.filteredRows!==t.totalRows){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-filtered-count",e.textContent=`Filtered: ${t.filteredRows}`,r.appendChild(e)}if(e.showSelectedCount&&t.selectedRows>0){const e=document.createElement("span");e.className="tbw-status-panel tbw-status-panel-selected-count",e.textContent=`Selected: ${t.selectedRows}`,o.appendChild(e)}if(e.customPanels)for(const s of e.customPanels){const e=Yt(s,t);switch(s.position){case"left":r.appendChild(e);break;case"center":n.appendChild(e);break;case"right":o.appendChild(e)}}return i.appendChild(r),i.appendChild(n),i.appendChild(o),i}function $t(e){const t=document.createElement("div");return t.className=`tbw-aggregation-rows tbw-aggregation-rows-${e}`,t.setAttribute("role","presentation"),t}function Wt(e,t,i,r,n=!1){e.innerHTML="";for(const o of t){const t=document.createElement("div");t.className="tbw-aggregation-row",t.setAttribute("role","presentation"),o.id&&t.setAttribute("data-aggregation-id",o.id);o.fullWidth??n?Vt(t,o,i,r):jt(t,o,i,r),e.appendChild(t)}}function Vt(e,t,i,r){const n=document.createElement("div");n.className="tbw-aggregation-cell tbw-aggregation-cell-full",n.style.gridColumn="1 / -1";const o="function"==typeof t.label?t.label(r,i):t.label;if(o){const e=document.createElement("span");e.className="tbw-aggregation-label",e.textContent=o,n.appendChild(e)}const s=function(e,t,i){const r=e.aggregators&&Object.keys(e.aggregators).length>0,n=e.cells&&Object.keys(e.cells).length>0;if(!r&&!n)return null;const o=document.createElement("span");o.className="tbw-aggregation-aggregates";for(const s of t){const{value:t,formatter:r}=Ut(e,s,i);if(null!=t){const e=document.createElement("span");e.className="tbw-aggregation-aggregate",e.setAttribute("data-field",s.field);const i=s.header??s.field,n=r?r(t,s.field,s):String(t);e.textContent=`${i}: ${n}`,o.appendChild(e)}}return o.children.length>0?o:null}(t,i,r);s&&n.appendChild(s),e.appendChild(n)}function jt(e,t,i,r){for(const o of i){const i=document.createElement("div");i.className="tbw-aggregation-cell",i.setAttribute("data-field",o.field);const{value:n,formatter:s}=Ut(t,o,r);i.textContent=null!=n?s?s(n,o.field,o):String(n):"",e.appendChild(i)}const n="function"==typeof t.label?t.label(r,i):t.label;if(n){const t=document.createElement("span");t.className="tbw-aggregation-label",t.textContent=n,e.appendChild(t)}}function Ut(e,t,i){let r,n;const o=e.aggregators?.[t.field];if(o)if("object"==typeof(s=o)&&null!==s&&"aggFunc"in s){const e=v.get(o.aggFunc);e&&(r=e(i,t.field,t)),n=o.formatter}else{const e=v.get(o);e&&(r=e(i,t.field,t))}else if(e.cells&&Object.prototype.hasOwnProperty.call(e.cells,t.field)){const n=e.cells[t.field];r="function"==typeof n?n(i,t.field,t):n}var s;return{value:r,formatter:n}}function Yt(e,t){const i=document.createElement("div");i.className="tbw-status-panel tbw-status-panel-custom",i.id=`status-panel-${e.id}`;const r=e.render(t);return"string"==typeof r?i.innerHTML=n(r):i.appendChild(r),i}function Zt(e,t,i,r,n){const o=i?.sourceRows,s=i?.rows,l=Array.isArray(o)?o.length:e.length,a=Array.isArray(s)?s.length:e.length,d=l>0?l:a;return{totalRows:d,filteredRows:n?.cachedResult?.length??(a<l?a:d),selectedRows:r?.selected?.size??0,columns:t,rows:e,grid:i}}function Qt(){return e=>{const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-row-count",t.textContent=`Total: ${e.totalRows} rows`,t}}function Xt(){return e=>{if(e.selectedRows<=0)return null;const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-selected-count",t.textContent=`Selected: ${e.selectedRows}`,t}}function Jt(){return e=>{if(e.filteredRows===e.totalRows)return null;const t=document.createElement("span");return t.className="tbw-status-panel tbw-status-panel-filtered-count",t.textContent=`Filtered: ${e.filteredRows}`,t}}function ei(e){const t=document.createElement("div");return t.className="tbw-status-panel tbw-status-panel-custom",t.appendChild(e),t}function ti(e,t){const i=document.createElement("div");i.className="tbw-pinned-rows",i.setAttribute("role","presentation"),i.setAttribute("aria-live","polite"),e.id&&i.setAttribute("data-pinned-row-id",e.id);const r=document.createElement("div");r.className="tbw-pinned-rows-left";const n=document.createElement("div");n.className="tbw-pinned-rows-center";const o=document.createElement("div");o.className="tbw-pinned-rows-right";const s={left:r,center:n,right:o},l=Array.isArray(e.render)?e.render:[{zone:"left",render:e.render}];for(const a of l){const e=a.zone??"left",i=a.render(t);if(null==i)continue;const r=i.classList?.contains("tbw-status-panel");s[e].appendChild(r?i:ei(i))}return 0===r.children.length&&0===n.children.length&&0===o.children.length?null:(i.appendChild(r),i.appendChild(n),i.appendChild(o),i)}function ii(e,t,i,r,n=!1){const o=$t(t);return Wt(o,[e],i,r,n),o}class ri extends i{name="pinnedRows";styles="@layer tbw-plugins{.tbw-scroll-area{container-type:inline-size}.tbw-footer,.tbw-header-pinned{flex-shrink:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-color-panel-bg);min-width:fit-content}.tbw-pinned-rows{display:flex;align-items:center;justify-content:space-between;padding:var(--tbw-button-padding, var(--tbw-spacing-md, .5rem) var(--tbw-spacing-lg, .75rem));background:var(--tbw-pinned-rows-bg, var(--tbw-color-panel-bg));border-top:1px solid var(--tbw-pinned-rows-border, var(--tbw-color-border));font-size:var(--tbw-font-size-xs, .75rem);color:var(--tbw-pinned-rows-color, var(--tbw-color-fg-muted));min-height:32px;box-sizing:border-box;position:sticky;left:0;min-width:0;width:100cqi}.tbw-pinned-rows+.tbw-pinned-rows{border-top:0}.tbw-pinned-rows-left,.tbw-pinned-rows-center,.tbw-pinned-rows-right{display:flex;align-items:center;gap:var(--tbw-spacing-xl, 1rem)}.tbw-pinned-rows-left{justify-content:flex-start}.tbw-pinned-rows-center{justify-content:center;flex:1}.tbw-pinned-rows-right{justify-content:flex-end}.tbw-status-panel{white-space:nowrap}.tbw-aggregation-rows{min-width:fit-content;background:var(--tbw-aggregation-bg, var(--tbw-color-header-bg))}.tbw-aggregation-rows-top{border-bottom:1px solid var(--tbw-aggregation-border, var(--tbw-color-border))}.tbw-aggregation-rows-bottom{border-top:1px solid var(--tbw-aggregation-border, var(--tbw-color-border))}.tbw-aggregation-row{display:grid;grid-template-columns:var(--tbw-column-template);font-size:var(--tbw-aggregation-font-size, .8em);font-weight:var(--tbw-aggregation-font-weight, 600);position:relative;background:inherit}.tbw-aggregation-row>.tbw-aggregation-label{position:sticky;left:0;grid-row:1;grid-column:1;display:flex;align-items:center;padding:var(--tbw-cell-padding, .125rem .5rem);background:inherit;z-index:1;pointer-events:none}.tbw-aggregation-row>.tbw-aggregation-cell:first-child{grid-column:1;grid-row:1}.tbw-aggregation-cell:not(:empty){position:relative;z-index:2;background:inherit}.tbw-aggregation-cell{padding:var(--tbw-cell-padding, .125rem .5rem);min-height:var(--tbw-row-height, 1.75rem);display:block;align-items:center;align-content:center;border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;text-overflow:ellipsis;white-space:var(--tbw-cell-white-space, nowrap)}.tbw-aggregation-cell:last-child{border-right:0}.tbw-aggregation-cell-full{grid-column:1 / -1;border-right:0;display:flex;align-items:center;gap:var(--tbw-spacing-lg, .75rem)}.tbw-aggregation-label{white-space:nowrap}.tbw-aggregation-aggregates{display:flex;align-items:center;gap:var(--tbw-spacing-lg, .75rem);font-weight:400;opacity:.85}.tbw-aggregation-aggregate{white-space:nowrap}}";get defaultConfig(){return{position:"bottom",showRowCount:!0,showSelectedCount:!0,showFilteredCount:!0}}infoBarElement=null;topAggregationContainer=null;bottomAggregationContainer=null;footerWrapper=null;headerWrapper=null;lastModeWasSlots=!1;detach(){this.cleanup()}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.querySelector(".tbw-grid-root");if(!t)return;this.footerWrapper&&!t.contains(this.footerWrapper)&&(this.footerWrapper=null,this.bottomAggregationContainer=null,this.infoBarElement=null),this.topAggregationContainer&&!t.contains(this.topAggregationContainer)&&(this.topAggregationContainer=null),this.infoBarElement&&!t.contains(this.infoBarElement)&&(this.infoBarElement=null),this.headerWrapper&&!t.contains(this.headerWrapper)&&(this.headerWrapper=null);const i=this.getSelectionState(),r=this.getFilterState(),n=Zt(this.sourceRows,this.columns,this.gridElement,i,r);this.config.slots?this.renderSlotMode(t,e,n):this.renderLegacyMode(t,e,n)}renderSlotMode(e,t,i){this.lastModeWasSlots||this.detachLegacyOnly(),this.lastModeWasSlots=!0;const r=this.config.slots??[],n=r.filter(e=>"top"===e.position),o=r.filter(e=>"top"!==e.position);n.length>0?(this.headerWrapper||(this.headerWrapper=document.createElement("div"),this.headerWrapper.className="tbw-header-pinned",e.insertBefore(this.headerWrapper,e.firstChild)),this.populateSlotWrapper(this.headerWrapper,n,"top",i)):this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null),o.length>0?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",e.appendChild(this.footerWrapper)),this.populateSlotWrapper(this.footerWrapper,o,"bottom",i)):this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null)}populateSlotWrapper(e,t,i,r){e.innerHTML="";for(const n of t){const t="render"in n&&null!=n.render?ti(n,r):ii(n,i,this.visibleColumns,this.sourceRows,this.config.fullWidth);t&&e.appendChild(t)}}renderLegacyMode(e,t,i){this.lastModeWasSlots&&(this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer=null,this.infoBarElement=null),this.lastModeWasSlots=!1;const r=this.config.aggregationRows||[],n=r.filter(e=>"top"===e.position),o=r.filter(e=>"top"!==e.position);n.length>0?(this.topAggregationContainer||(this.topAggregationContainer=$t("top"),e.insertBefore(this.topAggregationContainer,e.firstChild)),Wt(this.topAggregationContainer,n,this.visibleColumns,this.sourceRows,this.config.fullWidth)):this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null);const s=!1!==this.config.showRowCount||this.config.showSelectedCount&&i.selectedRows>0||this.config.showFilteredCount&&i.filteredRows!==i.totalRows||this.config.customPanels&&this.config.customPanels.length>0,l=s&&"top"!==this.config.position,a=o.length>0||l;if(s&&"top"===this.config.position)if(this.infoBarElement){const e=Bt(this.config,i);this.infoBarElement.replaceWith(e),this.infoBarElement=e}else this.infoBarElement=Bt(this.config,i),e.insertBefore(this.infoBarElement,e.firstChild);else"top"===this.config.position&&this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null);a?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",e.appendChild(this.footerWrapper)),this.footerWrapper.innerHTML="",o.length>0&&(this.bottomAggregationContainer||(this.bottomAggregationContainer=$t("bottom")),this.footerWrapper.appendChild(this.bottomAggregationContainer),Wt(this.bottomAggregationContainer,o,this.visibleColumns,this.sourceRows,this.config.fullWidth)),l&&(this.infoBarElement=Bt(this.config,i),this.footerWrapper.appendChild(this.infoBarElement))):this.cleanupFooter()}cleanup(){this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null),this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.headerWrapper&&(this.headerWrapper.remove(),this.headerWrapper=null)}detachLegacyOnly(){this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null)}cleanupFooter(){this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.infoBarElement&&"top"!==this.config.position&&(this.infoBarElement.remove(),this.infoBarElement=null)}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}getFilterState(){try{return this.grid?.getPluginState?.("filtering")??null}catch{return null}}refresh(){this.requestRender()}getContext(){const e=this.getSelectionState(),t=this.getFilterState();return Zt(this.rows,this.columns,this.gridElement,e,t)}addPanel(e){this.config.customPanels||(this.config.customPanels=[]),this.config.customPanels.push(e),this.requestRender()}removePanel(e){this.config.customPanels&&(this.config.customPanels=this.config.customPanels.filter(t=>t.id!==e),this.requestRender())}addAggregationRow(e){this.config.aggregationRows||(this.config.aggregationRows=[]),this.config.aggregationRows.push(e),this.requestRender()}removeAggregationRow(e){this.config.aggregationRows&&(this.config.aggregationRows=this.config.aggregationRows.filter(t=>t.id!==e),this.requestRender())}}function ni(e){return"function"==typeof e?e:E(e)}function oi(e,t){return[...e,t].join("|")}function si(e,t){const i=t.rowGroupFields??[],r=t.columnGroupFields??[],n=t.valueFields??[],o=function(e,t,i="asc"){if(0===t.length)return["value"];const r=/* @__PURE__ */new Set;for(const o of e){const e=t.map(e=>String(o[e]??"")).join("|");r.add(e)}const n=[...r].sort();return"desc"===i?n.reverse():n}(e,r,t.sortColumns),s=li(e,i,r,o,n,0,"");t.sortRows&&ui(s,t.sortRows,n);const l=function(e,t,i){const r={};function n(e){for(const o of e)if(o.isGroup&&o.children?.length)o.children&&n(o.children);else for(const e of t)for(const t of i){const i=oi([e],t.field);r[i]=(r[i]??0)+(o.values[i]??0)}}return n(e),r}(s,o,n);return{rows:s,columnKeys:o,totals:l,grandTotal:Object.values(l).reduce((e,t)=>e+t,0)}}function li(e,t,i,r,n,o,s){const l=[];if(0===t.length){const t=ai(e,i,r,n),a=di(t);return l.push({rowKey:s||"all",rowLabel:s||"All",depth:o,values:t,total:a,isGroup:!1,rowCount:e.length}),l}const a=t[0],d=t.slice(1),c=d.length>0,u=function(e,t){const i=/* @__PURE__ */new Map;for(const r of e){const e=String(r[t]??""),n=i.get(e);n?n.push(r):i.set(e,[r])}return i}(e,a);for(const[h,g]of u){const e=s?`${s}|${h}`:h,t=ai(g,i,r,n),a=di(t);let u;c&&(u=li(g,d,i,r,n,o+1,e)),l.push({rowKey:e,rowLabel:h||"(blank)",depth:o,values:t,total:a,isGroup:c,children:u,rowCount:g.length})}return l}function ai(e,t,i,r){const n={};if(0===t.length){for(const t of r){const i=[];for(let n=0;n<e.length;n++){const r=e[n][t.field];if(null==r||""===r)continue;const o=Number(r);isNaN(o)||i.push(o)}const r=ni(t.aggFunc);n[oi(["value"],t.field)]=i.length>0?r(i):null}return n}const o=/* @__PURE__ */new Map;for(let s=0;s<e.length;s++){const i=e[s];let r=String(i[t[0]]??"");for(let e=1;e<t.length;e++)r+="|",r+=String(i[t[e]]??"");const n=o.get(r);n?n.push(i):o.set(r,[i])}for(const s of i){const e=o.get(s);if(e&&0!==e.length)for(const t of r){const i=[];for(let n=0;n<e.length;n++){const r=e[n][t.field];if(null==r||""===r)continue;const o=Number(r);isNaN(o)||i.push(o)}const r=ni(t.aggFunc);n[oi([s],t.field)]=i.length>0?r(i):null}else for(const t of r)n[oi([s],t.field)]=null}return n}function di(e){let t=0;for(const i of Object.values(e))t+=i??0;return t}function ci(e){const t=[];function i(e){if(e.isGroup&&t.push(e.rowKey),e.children)for(const t of e.children)i(t)}for(const r of e)i(r);return t}function ui(e,t,i){const r="desc"===t.direction?-1:1;e.sort((e,n)=>{if("value"===t.by){if(t.valueField??i[0]?.field){return((e.total??0)-(n.total??0))*r}}return e.rowLabel.localeCompare(n.rowLabel)*r});for(const n of e)n.children?.length&&ui(n.children,t,i)}function hi(e,t,i){if(0===t.length)return;const r=new Set(i.map(e=>e.field)),n=t.map(e=>"value"===e.by?e.valueField?t=>((e,t)=>{if(null!=e.values[t])return"number"==typeof e.values[t]?e.values[t]:0;if(r.has(t)){const i=`|${t}`;let r=0,n=!1;for(const t of Object.keys(e.values))t.endsWith(i)&&(r+="number"==typeof e.values[t]?e.values[t]:0,n=!0);if(n)return r}return e.total??0})(t,e.valueField):e=>e.total??0:null);e.sort((e,i)=>{for(let r=0;r<t.length;r++){const o=t[r],s="desc"===o.direction?-1:1;let l=0;if("value"===o.by){const t=n[r];l=(t(e)-t(i))*s}else l=e.rowLabel.localeCompare(i.rowLabel)*s;if(0!==l)return l}return 0});for(const o of e)o.children?.length&&hi(o.children,t,i)}const gi=["sum","avg","count","min","max","first","last"];function pi(e,t,i,r){const n=new AbortController,o={config:t,callbacks:r,signal:n.signal},s=document.createElement("div");return s.className="tbw-pivot-panel",s.appendChild(fi("Options",()=>function(e,t){const{config:i,callbacks:r,signal:n}=t,o=document.createElement("div");return o.className="tbw-pivot-options",o.appendChild(vi("Enable Pivot View",e,e=>{r.onTogglePivot(e)},n)),o.appendChild(vi("Show Row Totals",i.showTotals??!0,e=>{r.onOptionChange("showTotals",e)},n)),o.appendChild(vi("Show Grand Total",i.showGrandTotal??!0,e=>{r.onOptionChange("showGrandTotal",e)},n)),o}(i,o))),s.appendChild(fi("Row Groups",()=>mi("rowGroups",o))),s.appendChild(fi("Column Groups",()=>mi("columnGroups",o))),s.appendChild(fi("Values",()=>function(e){const{config:t,callbacks:i,signal:r}=e,n=document.createElement("div");n.className="tbw-pivot-drop-zone tbw-pivot-values-zone",n.setAttribute("data-zone","values");const o=t.valueFields??[];if(0===o.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="Drag numeric fields here",n.appendChild(e)}else for(const s of o)n.appendChild(bi(s,e));return n.addEventListener("dragover",e=>{e.preventDefault(),n.classList.add("drag-over")},{signal:r}),n.addEventListener("dragleave",()=>{n.classList.remove("drag-over")},{signal:r}),n.addEventListener("drop",e=>{e.preventDefault(),n.classList.remove("drag-over");const t=e.dataTransfer?.getData("text/plain");t&&i.onAddValueField(t,"sum")},{signal:r}),n}(o))),s.appendChild(fi("Available Fields",()=>function(e){const{config:t,callbacks:i,signal:r}=e,n=document.createElement("div");n.className="tbw-pivot-available-fields";const o=i.getAvailableFields(),s=/* @__PURE__ */new Set([...t.rowGroupFields??[],...t.columnGroupFields??[],...t.valueFields?.map(e=>e.field)??[]]),l=o.filter(e=>!s.has(e.field));if(0===l.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="All fields are in use",n.appendChild(e)}else{const e=document.createElement("div");if(e.className="tbw-pivot-fields-list",l.length>=6){const t=document.createElement("input");t.type="text",t.placeholder="Filter fields…",t.className="tbw-pivot-field-search",t.addEventListener("input",()=>{const i=t.value.toLowerCase();for(const t of e.querySelectorAll(".tbw-pivot-field-chip")){const e=t;e.style.display=e.textContent?.toLowerCase().includes(i)?"":"none"}},{signal:r}),n.appendChild(t)}for(const t of l){const i=document.createElement("div");i.className="tbw-pivot-field-chip available",i.textContent=t.header,i.draggable=!0,i.title=`Drag to add "${t.field}" to a zone`,i.addEventListener("dragstart",e=>{e.dataTransfer?.setData("text/plain",t.field),i.classList.add(w.DRAGGING)},{signal:r}),i.addEventListener("dragend",()=>{i.classList.remove(w.DRAGGING)},{signal:r}),e.appendChild(i)}n.appendChild(e)}return n}(o))),e.appendChild(s),()=>{n.abort(),s.remove()}}function fi(e,t){const i=document.createElement("div");i.className="tbw-pivot-section";const r=document.createElement("div");r.className="tbw-pivot-section-header",r.textContent=e;const n=document.createElement("div");return n.className="tbw-pivot-section-content",n.appendChild(t()),i.appendChild(r),i.appendChild(n),i}function mi(e,t){const{config:i,callbacks:r,signal:n}=t,o=document.createElement("div");o.className="tbw-pivot-drop-zone",o.setAttribute("data-zone",e);const s="rowGroups"===e?i.rowGroupFields??[]:i.columnGroupFields??[];if(0===s.length){const e=document.createElement("div");e.className="tbw-pivot-placeholder",e.textContent="Drag fields here",o.appendChild(e)}else for(const l of s)o.appendChild(wi(l,e,t));return o.addEventListener("dragover",e=>{e.preventDefault(),o.classList.add("drag-over")},{signal:n}),o.addEventListener("dragleave",()=>{o.classList.remove("drag-over")},{signal:n}),o.addEventListener("drop",t=>{t.preventDefault(),o.classList.remove("drag-over");const i=t.dataTransfer?.getData("text/plain"),n=t.dataTransfer?.getData("source-zone");if(!i)return;const s=o.querySelectorAll(".tbw-pivot-field-chip");let l=s.length;for(let e=0;e<s.length;e++){const i=s[e].getBoundingClientRect();if(t.clientY<i.top+i.height/2){l=e;break}}!n||n===e||"rowGroups"!==n&&"columnGroups"!==n?n===e?r.onReorderFieldInZone(i,e,l):r.onAddFieldToZone(i,e):r.onMoveFieldBetweenZones(i,n,e)},{signal:n}),o}function wi(e,t,i){const{callbacks:r,signal:n}=i,o=document.createElement("div");o.className="tbw-pivot-field-chip",o.draggable=!0;const s=r.getAvailableFields().find(t=>t.field===e),l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=s?.header??e;const a=document.createElement("button");return a.type="button",a.className="tbw-pivot-chip-remove",a.innerHTML="×",a.title="Remove field",a.addEventListener("click",i=>{i.stopPropagation(),r.onRemoveFieldFromZone(e,t)},{signal:n}),o.appendChild(l),o.appendChild(a),o.addEventListener("dragstart",i=>{i.dataTransfer?.setData("text/plain",e),i.dataTransfer?.setData("source-zone",t),o.classList.add(w.DRAGGING)},{signal:n}),o.addEventListener("dragend",()=>{o.classList.remove(w.DRAGGING)},{signal:n}),o}function bi(e,t){const{callbacks:i,signal:r}=t,n=document.createElement("div");n.className="tbw-pivot-field-chip tbw-pivot-value-chip";const o=i.getAvailableFields().find(t=>t.field===e.field),s=document.createElement("div");s.className="tbw-pivot-value-label-wrapper";const l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=o?.header??e.field;const a="function"==typeof e.aggFunc,d=document.createElement("select");if(d.className="tbw-pivot-agg-select",d.title="Aggregation function",a){const e=document.createElement("option");e.value="__custom__",e.textContent="CUSTOM",e.selected=!0,d.appendChild(e),d.disabled=!0}for(const u of gi){const t=document.createElement("option");t.value=u,t.textContent=u.toUpperCase(),a||(t.selected=u===e.aggFunc),d.appendChild(t)}d.addEventListener("change",()=>{i.onUpdateValueAggFunc(e.field,d.value)},{signal:r});const c=document.createElement("button");return c.type="button",c.className="tbw-pivot-chip-remove",c.innerHTML="×",c.title="Remove value field",c.addEventListener("click",t=>{t.stopPropagation(),i.onRemoveValueField(e.field)},{signal:r}),s.appendChild(l),s.appendChild(d),n.appendChild(s),n.appendChild(c),n}function vi(e,t,i,r){const n=document.createElement("label");n.className="tbw-pivot-checkbox";const o=document.createElement("input");o.type="checkbox",o.checked=t,o.addEventListener("change",()=>i(o.checked),{signal:r});const s=document.createElement("span");return s.textContent=e,n.appendChild(o),n.appendChild(s),n}function yi(e,t,i){return t.className="data-grid-row pivot-grand-total-row",t.innerHTML="",i.forEach((i,r)=>{const n=document.createElement("div");if(n.className="cell",n.setAttribute("data-col",String(r)),0===r){const e=document.createElement("span");e.className="pivot-label",e.textContent="Grand Total",n.appendChild(e)}else{const t=e[i.field];n.textContent=null!=t?i.format?i.format(t,e):String(t):""}t.appendChild(n)}),!0}class Ci extends i{static manifest={modifiesRowStructure:!0,hookPriority:{onHeaderClick:-10,processRows:100},incompatibleWith:[{name:"groupingRows",reason:"PivotPlugin creates its own aggregated row and column structure. Row grouping cannot be applied on top of pivot-generated rows."},{name:"tree",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."},{name:"serverSide",reason:"PivotPlugin requires the full dataset to compute aggregations. ServerSidePlugin lazy-loads rows in blocks, so pivot aggregation cannot be performed client-side."}],queries:[{type:"sort:get-sort-config",description:"Returns the current pivot sort configuration"}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for pivot column sorting"}];name="pivot";styles='@layer tbw-plugins{.pivot-group-row{display:grid;grid-template-columns:var(--tbw-column-template);font-weight:600;background:var(--tbw-pivot-group-bg, var(--tbw-color-row-alt));min-height:var(--tbw-row-height);border-bottom:var(--tbw-row-divider)}@media(hover:hover){.pivot-group-row:hover{background:var(--tbw-pivot-group-hover, var(--tbw-color-row-hover))}}.pivot-leaf-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-pivot-leaf-bg, var(--tbw-color-bg));min-height:var(--tbw-row-height);border-bottom:var(--tbw-row-divider)}.pivot-grand-total-row{display:grid;grid-template-columns:var(--tbw-column-template);font-weight:700;background:var(--tbw-pivot-grand-total-bg, var(--tbw-color-header-bg));min-height:var(--tbw-row-height);border-top:2px solid var(--tbw-color-border-strong)}.pivot-grand-total-row>.cell{display:flex;align-items:center;padding:var(--tbw-cell-padding);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0}.pivot-grand-total-row>.cell:last-child{border-right:0}.pivot-grand-total-footer{position:sticky;bottom:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-pivot-grand-total-bg, var(--tbw-color-header-bg));min-width:fit-content}.pivot-group-row>.cell,.pivot-leaf-row>.cell{display:flex;align-items:center;padding:var(--tbw-cell-padding);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0}.pivot-group-row>.cell:last-child,.pivot-leaf-row>.cell:last-child{border-right:0}.pivot-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-pivot-toggle-size, var(--tbw-toggle-size, 1.25em));height:var(--tbw-pivot-toggle-size, var(--tbw-toggle-size, 1.25em));margin-right:var(--tbw-spacing-sm, .375em);border:none;background:transparent;cursor:pointer;color:var(--tbw-pivot-toggle-color, var(--tbw-color-fg-muted));border-radius:var(--tbw-border-radius);transition:background var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease),color var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease)}.pivot-toggle:hover{background:var(--tbw-pivot-toggle-hover-bg, var(--tbw-color-row-hover));color:var(--tbw-pivot-toggle-hover-color, var(--tbw-color-fg))}.pivot-toggle:focus{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}.pivot-label{font-weight:inherit}.pivot-count{color:var(--tbw-pivot-count-color, var(--tbw-color-fg-muted));font-size:.9em;font-weight:400}.pivot-total-row{font-weight:700;border-top:2px solid var(--tbw-pivot-border, var(--tbw-color-border-strong))}[data-pivot-depth="1"]{--tbw-pivot-depth: 1}[data-pivot-depth="2"]{--tbw-pivot-depth: 2}[data-pivot-depth="3"]{--tbw-pivot-depth: 3}[data-pivot-depth="4"]{--tbw-pivot-depth: 4}.tbw-pivot-panel{display:flex;flex-direction:column;gap:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));padding:var(--tbw-panel-padding, var(--tbw-spacing-lg, .75rem));height:100%;overflow-y:auto;font-size:var(--tbw-font-size-sm, .8125rem)}.tbw-pivot-section{border:1px solid var(--tbw-pivot-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);background:var(--tbw-pivot-section-bg, var(--tbw-color-bg))}.tbw-pivot-section-header{padding:var(--tbw-button-padding, var(--tbw-spacing-md, .5rem) var(--tbw-spacing-lg, .75rem));font-weight:600;background:var(--tbw-pivot-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-pivot-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius) var(--tbw-border-radius) 0 0}.tbw-pivot-section-content{padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-pivot-toggle-wrapper{display:flex;align-items:center}.tbw-pivot-toggle-label{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));cursor:pointer}.tbw-pivot-toggle-label input{width:var(--tbw-icon-size, 1rem);height:var(--tbw-icon-size, 1rem);cursor:pointer}.tbw-pivot-drop-zone{min-height:60px;padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));border:2px dashed var(--tbw-pivot-drop-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);background:var(--tbw-pivot-drop-bg, var(--tbw-color-row-alt));display:flex;flex-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem);align-content:flex-start;transition:all .15s ease}.tbw-pivot-drop-zone.drag-over{border-color:var(--tbw-color-accent);background:var(--tbw-pivot-drop-active, var(--tbw-focus-background))}.tbw-pivot-placeholder{color:var(--tbw-color-fg-muted);font-style:italic;padding:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));text-align:center;width:100%}.tbw-pivot-field-chip{display:inline-flex;align-items:center;gap:var(--tbw-spacing-sm, .375rem);padding:var(--tbw-button-padding-sm, var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-pivot-chip-bg, var(--tbw-color-header-bg));border:1px solid var(--tbw-pivot-chip-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius);cursor:grab;font-size:var(--tbw-font-size-xs, .75rem);transition:all .15s ease}.tbw-pivot-field-chip:hover{background:var(--tbw-pivot-chip-hover, var(--tbw-color-row-hover));border-color:var(--tbw-color-accent)}.tbw-pivot-field-chip.available{background:var(--tbw-color-bg)}.tbw-pivot-field-chip.dragging{opacity:.5;cursor:grabbing}.tbw-pivot-chip-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.tbw-pivot-chip-remove{display:flex;align-items:center;justify-content:center;width:var(--tbw-icon-size, 1rem);height:var(--tbw-icon-size, 1rem);padding:0;border:none;background:transparent;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-sm, .875rem);font-weight:700;cursor:pointer;border-radius:50%;transition:all .15s ease}.tbw-pivot-chip-remove:hover{background:var(--tbw-pivot-chip-remove-hover-bg, var(--tbw-color-accent));color:var(--tbw-pivot-chip-remove-hover-fg, var(--tbw-color-accent-fg))}.tbw-pivot-value-chip{padding:var(--tbw-button-padding-sm, var(--tbw-spacing-xs, .25rem) var(--tbw-spacing-md, .5rem))}.tbw-pivot-value-label-wrapper{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));flex:1;min-width:0}.tbw-pivot-agg-select{padding:var(--tbw-spacing-xs, .125rem) var(--tbw-spacing-xs, .25rem);font-size:var(--tbw-font-size-xs, .6875rem);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);background:var(--tbw-color-bg);cursor:pointer}.tbw-pivot-available-fields{display:flex;flex-direction:column;gap:var(--tbw-spacing-sm, .375rem);min-height:40px}.tbw-pivot-field-search{width:100%;padding:.25rem .5rem;border:1px solid var(--tbw-color-border, #d0d5dd);border-radius:var(--tbw-radius-sm, .25rem);font-size:var(--tbw-font-size-sm, .875rem);background:var(--tbw-color-bg, #fff);color:var(--tbw-color-fg, #1a1a2e);outline:none}.tbw-pivot-field-search:focus{border-color:var(--tbw-color-primary, #3b82f6)}.tbw-pivot-fields-list{display:flex;flex-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem)}.tbw-pivot-options{display:flex;flex-direction:column;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-pivot-checkbox{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));cursor:pointer}.tbw-pivot-checkbox input{width:var(--tbw-icon-size-sm, .875rem);height:var(--tbw-icon-size-sm, .875rem);cursor:pointer}.pivot-group-row.tbw-pivot-slide-in,.pivot-leaf-row.tbw-pivot-slide-in{animation:tbw-pivot-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-pivot-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.pivot-group-row.tbw-pivot-fade-in,.pivot-leaf-row.tbw-pivot-fade-in{animation:tbw-pivot-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}@keyframes tbw-pivot-fade-in{0%{opacity:0}to{opacity:1}}}';static PANEL_ID="pivot";get defaultConfig(){return{active:!0,showTotals:!0,showGrandTotal:!0,showToolPanel:!0,animation:"slide"}}isActive=!1;hasInitialized=!1;pivotResult=null;fieldHeaderMap=/* @__PURE__ */new Map;expandedKeys=/* @__PURE__ */new Set;defaultExpanded=!0;userHasToggledExpand=!1;originalColumns=[];panelContainer=null;grandTotalFooter=null;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;valueFormatters=/* @__PURE__ */new Map;columnTotals={};activeSortField=null;activeSortDir=null;hasValidPivotConfig(){return(this.config.valueFields?.length??0)>0}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detach(){this.isActive=!1,this.hasInitialized=!1,this.pivotResult=null,this.fieldHeaderMap.clear(),this.originalColumns=[],this.panelContainer=null,this.cleanupGrandTotalFooter(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.userHasToggledExpand=!1,this.valueFormatters.clear(),this.columnTotals={},this.activeSortField=null,this.activeSortDir=null,this.config.sortRows=void 0}getToolPanel(){if(!1!==(this.config?.showToolPanel??this.userConfig?.showToolPanel??!0))return{id:Ci.PANEL_ID,title:"Pivot",icon:"⊞",tooltip:"Configure pivot table",order:90,render:e=>this.renderPanel(e)}}processRows(e){if(!this.hasInitialized&&!1!==this.config.active&&this.hasValidPivotConfig()&&(this.hasInitialized=!0,this.isActive=!0),!this.isActive)return[...e];const t=function(e){const t=[];return e.rowGroupFields?.length||e.columnGroupFields?.length||t.push("At least one row or column group field is required"),e.valueFields?.length||t.push("At least one value field is required"),t}(this.config);if(t.length>0)return this.warn(`Config errors: ${t.join(", ")}`),[...e];this.buildFieldHeaderMap(),this.buildValueFormatters(),this.defaultExpanded=this.config.defaultExpanded??!0,this.pivotResult=si(e,this.config);const i=this.getMultiSortConfigs();if(i&&hi(this.pivotResult.rows,i,this.config.valueFields??[]),0===this.expandedKeys.size&&!this.userHasToggledExpand){const e=ci(this.pivotResult.rows);this.expandedKeys=function(e,t){if(!0===e||void 0===e)return new Set(t);if(!1===e)/* @__PURE__ */return new Set;if("number"==typeof e){const i=t[e];return i?/* @__PURE__ */new Set([i]):/* @__PURE__ */new Set}return"string"==typeof e?/* @__PURE__ */new Set([e]):Array.isArray(e)?new Set(e):/* @__PURE__ */new Set}(this.defaultExpanded,e)}this.config.valueDisplayMode&&"raw"!==this.config.valueDisplayMode&&(this.columnTotals=function(e,t,i){const r={};return function e(n){for(const o of n)if(o.isGroup&&o.children?.length)o.children&&e(o.children);else for(const e of t)for(const t of i){const i=oi([e],t.field);r[i]=(r[i]??0)+(o.values[i]??0)}}(e),r}(this.pivotResult.rows,this.pivotResult.columnKeys,this.config.valueFields??[]));const r=this.config.indentWidth??20,n=!0===this.defaultExpanded||void 0===this.defaultExpanded,o=function(e,t,i=!0){const r=[];function n(e){r.push(e);const o=t?t.has(e.rowKey):i;if(e.children&&o)for(const t of e.children)n(t)}for(const o of e)n(o);return r}(this.pivotResult.rows,this.expandedKeys,n).map(e=>({__pivotRowKey:e.rowKey,__pivotLabel:e.rowLabel,__pivotDepth:e.depth,__pivotIsGroup:e.isGroup,__pivotHasChildren:Boolean(e.children?.length),__pivotExpanded:this.expandedKeys.has(e.rowKey),__pivotRowCount:e.rowCount??0,__pivotIndent:e.depth*r,__pivotTotal:e.total,...e.values}));this.keysToAnimate.clear();const s=/* @__PURE__ */new Set;for(const l of o){const e=l.__pivotRowKey;s.add(e),!this.previousVisibleKeys.has(e)&&l.__pivotDepth>0&&this.keysToAnimate.add(e)}return this.previousVisibleKeys=s,this.config.grandTotalInRowModel&&this.config.showGrandTotal&&this.pivotResult&&o.push({__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotDepth:0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals}),o}processColumns(e){if(!this.isActive||!this.pivotResult)return[...e];const t=[],i=(this.config.rowGroupFields??[]).map(e=>this.fieldHeaderMap.get(e)??e).join(" / ");t.push({field:"__pivotLabel",header:i||"Group",width:200,sortable:!0});for(const r of this.pivotResult.columnKeys)for(const e of this.config.valueFields??[]){const i=oi([r],e.field),n=e.header||this.fieldHeaderMap.get(e.field)||e.field,o="function"==typeof e.aggFunc?"custom":e.aggFunc,s=this.valueFormatters.get(e.field);t.push({field:i,header:`${r} - ${n} (${o})`,width:120,type:"number",sortable:!0,...s?{format:e=>null!=e?s(Number(e)):""}:{}})}return this.config.showTotals&&t.push({field:"__pivotTotal",header:"Total",width:100,type:"number",sortable:!0}),t}renderRow(e,t,i){const r=e;return r.__pivotIsGrandTotal?yi(r,t,this.gridColumns):r.__pivotRowKey&&r.__pivotHasChildren?function(e,t,i){return t.className="data-grid-row pivot-group-row",t.setAttribute("data-pivot-depth",String(e.__pivotDepth??0)),t.setAttribute("data-pivot-key",String(e.__pivotRowKey??"")),t.setAttribute("role","row"),t.innerHTML="",i.columns.forEach((r,n)=>{const o=document.createElement("div");if(o.className="cell",o.setAttribute("data-col",String(n)),o.setAttribute("data-row",String(i.rowIndex)),o.setAttribute("role","gridcell"),0===n){const t=Number(e.__pivotIndent)||0;o.style.paddingLeft=`${t}px`;const r=String(e.__pivotRowKey),n=document.createElement("button");n.type="button",n.className="pivot-toggle",n.setAttribute("aria-label",e.__pivotExpanded?"Collapse group":"Expand group"),i.setIcon(n,e.__pivotExpanded?"collapse":"expand"),n.addEventListener("click",e=>{e.stopPropagation(),i.onToggle(r)}),o.appendChild(n);const s=document.createElement("span");s.className="pivot-label",s.textContent=String(e.__pivotLabel??""),o.appendChild(s);const l=document.createElement("span");l.className="pivot-count",l.textContent=` (${Number(e.__pivotRowCount)||0})`,o.appendChild(l)}else{const t=e[r.field];o.textContent=null!=t?r.format?r.format(t,e):String(t):""}t.appendChild(o)}),!0}(r,t,{columns:this.gridColumns,rowIndex:i,onToggle:e=>this.toggle(e),setIcon:(e,t)=>this.setIcon(e,t)}):void 0!==r.__pivotRowKey&&this.isActive?function(e,t,i,r){return t.className="data-grid-row pivot-leaf-row",t.setAttribute("data-pivot-depth",String(e.__pivotDepth??0)),t.setAttribute("data-pivot-key",String(e.__pivotRowKey??"")),t.innerHTML="",i.forEach((i,n)=>{const o=document.createElement("div");if(o.className="cell",o.setAttribute("data-col",String(n)),o.setAttribute("data-row",String(r)),o.setAttribute("role","gridcell"),0===n){const t=Number(e.__pivotIndent)||0;o.style.paddingLeft=`${t+20}px`;const i=document.createElement("span");i.className="pivot-label",i.textContent=String(e.__pivotLabel??""),o.appendChild(i)}else{const t=e[i.field];o.textContent=null!=t?i.format?i.format(t,e):String(t):""}t.appendChild(o)}),!0}(r,t,this.gridColumns,i):(this.cleanupPivotStyling(t),!1)}cleanupPivotStyling(e){(e.classList.contains("pivot-group-row")||e.classList.contains("pivot-leaf-row")||e.classList.contains("pivot-grand-total-row"))&&(e.classList.remove("pivot-group-row","pivot-leaf-row","pivot-grand-total-row"),e.classList.add("data-grid-row"),e.removeAttribute("data-pivot-depth"),e.innerHTML="")}onKeyDown(e){if(" "!==e.key)return;if(!this.isActive)return;const t=this.grid._focusRow,i=this.rows[t];return i?.__pivotIsGroup&&i.__pivotHasChildren?(e.preventDefault(),this.toggle(i.__pivotRowKey),this.requestRenderWithFocus(),!0):void 0}handleQuery(e){if("sort:get-sort-config"===e.type){const e=this.getMultiSortConfigs();return e||(this.config.sortRows??null)}}onHeaderClick(e){if(!this.isActive)return!1;const t=e.field;if(!this.isPivotField(t))return!1;if(this.isMultiSortActive())return!1;const i=this.mapFieldToSortConfig(t);if(!i)return!1;const r=this.activeSortDir;let n;n=this.activeSortField!==t?"asc":"asc"===r?"desc":null,this.activeSortField=n?t:null,this.activeSortDir=n,this.config.sortRows=n?{...i,direction:n}:void 0,this.emit("pivot-config-change",{property:"sortRows"}),this.refresh();const o=this.gridElement;if(o){const i=e.column.header??t;a(o,n?d(o,"sortApplied",i,"asc"===n?"ascending":"descending"):d(o,"sortCleared"))}return!0}isPivotField(e){return"__pivotLabel"===e||"__pivotTotal"===e||e.includes("|")}isMultiSortActive(){const e=this.grid?.query?.("sort:get-model",null);return Array.isArray(e)&&e.length>0}getMultiSortConfigs(){const e=this.grid?.query?.("sort:get-model",null);if(!e||0===e.length)return null;const t=e[0];if(!Array.isArray(t)||0===t.length)return null;const i=[];for(const r of t){if(!this.isPivotField(r.field))continue;const e=this.mapFieldToSortConfig(r.field);e&&i.push({...e,direction:r.direction})}return i.length>0?i:null}mapFieldToSortConfig(e){return"__pivotLabel"===e?{by:"label"}:"__pivotTotal"===e?{by:"value"}:e.includes("|")?{by:"value",valueField:e}:null}afterRender(){this.isActive&&this.config.showGrandTotal&&this.pivotResult&&!this.config.grandTotalInRowModel?this.renderGrandTotalFooter():this.cleanupGrandTotalFooter(),this.isActive&&!this.isMultiSortActive()&&this.updateSortIndicators();const e=this.animationStyle;if(!1===e||0===this.keysToAnimate.size)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i="fade"===e?"tbw-pivot-fade-in":"tbw-pivot-slide-in";for(const r of t.querySelectorAll(".pivot-group-row, .pivot-leaf-row")){const e=r.dataset.pivotKey;e&&this.keysToAnimate.has(e)&&(r.classList.add(i),r.addEventListener("animationend",()=>r.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}updateSortIndicators(){const e=this.gridElement;if(!e)return;const t=this.activeSortField,i=this.activeSortDir,r=t?null:this.config.sortRows,n=e.querySelectorAll(".header-row .cell[data-field]");for(const o of n){const e=o.getAttribute("data-field");if(!e||!this.isPivotField(e))continue;let n=null;t===e?n=i:r&&("label"===r.by&&"__pivotLabel"===e?n=r.direction??"asc":"value"!==r.by||"__pivotTotal"!==e||r.valueField?"value"===r.by&&r.valueField&&e===r.valueField&&(n=r.direction??"asc"):n=r.direction??"asc"),this.updateSortIndicator(o,n)}}renderGrandTotalFooter(){if(!this.pivotResult)return;const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.querySelector(".tbw-grid-root");if(!t)return;this.grandTotalFooter||(this.grandTotalFooter=document.createElement("div"),this.grandTotalFooter.className="pivot-grand-total-footer",t.appendChild(this.grandTotalFooter));yi({__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals},this.grandTotalFooter,this.gridColumns),this.grandTotalFooter.setAttribute("role","presentation")}cleanupGrandTotalFooter(){this.grandTotalFooter&&(this.grandTotalFooter.remove(),this.grandTotalFooter=null)}toggle(e){this.userHasToggledExpand=!0;const t=this.expandedKeys.has(e);t?this.expandedKeys.delete(e):this.expandedKeys.add(e),this.emitToggle(e,!t),this.requestRender()}expand(e){this.userHasToggledExpand=!0,this.expandedKeys.add(e),this.emitToggle(e,!0),this.requestRender()}collapse(e){this.userHasToggledExpand=!0,this.expandedKeys.delete(e),this.emitToggle(e,!1),this.requestRender()}expandAll(){this.userHasToggledExpand=!0,this.expandAllKeys(),this.requestRender()}collapseAll(){this.userHasToggledExpand=!0,this.expandedKeys.clear(),this.requestRender()}expandAllKeys(){if(!this.pivotResult)return;const e=ci(this.pivotResult.rows);for(const t of e)this.expandedKeys.add(t)}isExpanded(e){return this.expandedKeys.has(e)}getExpandedGroups(){return[...this.expandedKeys]}enablePivot(){0===this.originalColumns.length&&this.captureOriginalColumns(),this.isActive=!0,this.emit("pivot-state-change",{active:!0}),this.requestRender()}disablePivot(){this.isActive=!1,this.pivotResult=null,this.emit("pivot-state-change",{active:!1}),this.requestRender()}isPivotActive(){return this.isActive}getPivotResult(){return this.pivotResult}setRowGroupFields(e){this.config.rowGroupFields=e,this.emitConfigChange("rowGroupFields"),this.refresh()}setColumnGroupFields(e){this.config.columnGroupFields=e,this.emitConfigChange("columnGroupFields"),this.refresh()}setValueFields(e){this.config.valueFields=e,this.emitConfigChange("valueFields"),this.refresh()}refresh(){this.pivotResult=null,this.requestRender()}showPanel(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(Ci.PANEL_ID)||this.grid.toggleToolPanelSection(Ci.PANEL_ID)}hidePanel(){this.grid.closeToolPanel()}togglePanel(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(Ci.PANEL_ID)}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(Ci.PANEL_ID)}get gridColumns(){return this.grid.columns??[]}refreshIfActive(){this.isActive&&this.refresh(),this.refreshPanel()}buildFieldHeaderMap(){const e=this.getAvailableFields();this.fieldHeaderMap.clear();for(const t of e)this.fieldHeaderMap.set(t.field,t.header)}getAvailableFields(){return this.originalColumns.length>0?this.originalColumns:this.captureOriginalColumns()}captureOriginalColumns(){try{const e=this.grid.getAllColumns?.()??this.grid.columns??[];return this.originalColumns=e.filter(e=>!e.field.startsWith("__pivot")).map(e=>({field:e.field,header:e.header??e.field})),this.originalColumns}catch{return[]}}renderPanel(e){this.panelContainer=e,0===this.originalColumns.length&&this.captureOriginalColumns();const t={onTogglePivot:e=>{e?this.enablePivot():this.disablePivot(),this.refreshPanel()},onAddFieldToZone:(e,t)=>{this.addFieldToZone(e,t),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onRemoveFieldFromZone:(e,t)=>{this.removeFieldFromZone(e,t),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onReorderFieldInZone:(e,t,i)=>{this.reorderFieldInZone(e,t,i),this.emitConfigChange("rowGroups"===t?"rowGroupFields":"columnGroupFields",e,t)},onMoveFieldBetweenZones:(e,t,i)=>{this.moveFieldBetweenZones(e,t,i),this.emitConfigChange("rowGroups"===i?"rowGroupFields":"columnGroupFields",e,i)},onAddValueField:(e,t)=>{this.addValueField(e,t),this.emitConfigChange("valueFields",e,"values")},onRemoveValueField:e=>{this.removeValueField(e),this.emitConfigChange("valueFields",e,"values")},onUpdateValueAggFunc:(e,t)=>{this.updateValueAggFunc(e,t),this.emitConfigChange("valueFields",e,"values")},onOptionChange:(e,t)=>{this.config[e]=t,this.emitConfigChange(e),this.isActive&&this.refresh()},getAvailableFields:()=>this.getAvailableFields()};return pi(e,this.config,this.isActive,t)}refreshPanel(){this.panelContainer&&(this.panelContainer.innerHTML="",this.renderPanel(this.panelContainer))}addFieldToZone(e,t){if("rowGroups"===t){const t=this.config.rowGroupFields??[];t.includes(e)||(this.config.rowGroupFields=[...t,e])}else{const t=this.config.columnGroupFields??[];t.includes(e)||(this.config.columnGroupFields=[...t,e])}this.removeFromOtherZones(e,t),this.refreshIfActive()}removeFieldFromZone(e,t){"rowGroups"===t?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e),this.refreshIfActive()}reorderFieldInZone(e,t,i){const r="rowGroups"===t?[...this.config.rowGroupFields??[]]:[...this.config.columnGroupFields??[]],n=r.indexOf(e);-1!==n&&n!==i&&(r.splice(n,1),r.splice(i>n?i-1:i,0,e),"rowGroups"===t?this.config.rowGroupFields=r:this.config.columnGroupFields=r,this.refreshIfActive())}moveFieldBetweenZones(e,t,i){"rowGroups"===t?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e),"rowGroups"===i?this.config.rowGroupFields=[...this.config.rowGroupFields??[],e]:this.config.columnGroupFields=[...this.config.columnGroupFields??[],e],this.refreshIfActive()}removeFromOtherZones(e,t){"rowGroups"!==t&&(this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(t=>t!==e)),"columnGroups"!==t&&(this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(t=>t!==e)),"values"!==t&&(this.config.valueFields=(this.config.valueFields??[]).filter(t=>t.field!==e))}addValueField(e,t){const i=this.config.valueFields??[];i.some(t=>t.field===e)||(this.config.valueFields=[...i,{field:e,aggFunc:t}]),this.removeFromOtherZones(e,"values"),this.refreshIfActive()}removeValueField(e){this.config.valueFields=(this.config.valueFields??[]).filter(t=>t.field!==e),this.refreshIfActive()}updateValueAggFunc(e,t){const i=this.config.valueFields??[],r=i.findIndex(t=>t.field===e);r>=0&&(i[r]={...i[r],aggFunc:t},this.config.valueFields=[...i]),this.isActive&&this.refresh()}emitToggle(e,t){const i=this.rows.find(t=>t.__pivotRowKey===e);this.emit("pivot-toggle",{key:e,expanded:t,label:i?.__pivotLabel??e,depth:i?.__pivotDepth??0})}emitConfigChange(e,t,i){this.emit("pivot-config-change",{property:e,field:t,zone:i})}buildValueFormatters(){this.valueFormatters.clear();const e=this.config.valueFields??[];for(const t of e)if(t.format)this.valueFormatters.set(t.field,t.format);else{if(this.originalColumns.find(e=>e.field===t.field)){const e=(this.grid.getAllColumns?.()??this.grid.columns??[]).find(e=>e.field===t.field);if(e?.format){const i=e.format;this.valueFormatters.set(t.field,e=>i(e,{}))}}}}}const xi="tbw-print-isolation-style";async function Ei(t,i={}){const{orientation:r="landscape"}=i,n=t.id;document.querySelectorAll(`#${CSS.escape(n)}`).length>1&&e(S,`Multiple elements found with id="${n}". Print isolation may not work correctly. Ensure each grid has a unique ID.`,n,"print"),document.getElementById(xi)?.remove();const o=function(e,t){const i=document.createElement("style");return i.id=xi,i.textContent=`\n /* Print isolation: hide everything except the target grid */\n @media print {\n /* Hide all body children by default */\n body > *:not(#${e}) {\n display: none !important;\n }\n\n /* But show the grid and ensure it's not hidden by ancestor rules */\n #${e} {\n display: block !important;\n position: static !important;\n visibility: visible !important;\n opacity: 1 !important;\n overflow: visible !important;\n height: auto !important;\n width: 100% !important;\n max-height: none !important;\n margin: 0 !important;\n padding: 0 !important;\n transform: none !important;\n }\n\n /* If grid is nested, we need to show its ancestors too */\n #${e},\n #${e} * {\n visibility: visible !important;\n }\n\n /* Walk up the DOM and show all ancestors of the grid */\n body *:has(> #${e}),\n body *:has(#${e}) {\n display: block !important;\n visibility: visible !important;\n opacity: 1 !important;\n overflow: visible !important;\n height: auto !important;\n position: static !important;\n transform: none !important;\n background: transparent !important;\n border: none !important;\n padding: 0 !important;\n margin: 0 !important;\n }\n\n /* Hide siblings of ancestors (everything that's not in the path to the grid) */\n body *:has(#${e}) > *:not(:has(#${e})):not(#${e}) {\n display: none !important;\n }\n\n /* Page settings */\n @page {\n size: ${t};\n margin: 1cm;\n }\n\n /* Ensure proper print styling */\n body {\n margin: 0 !important;\n padding: 0 !important;\n background: white !important;\n color-scheme: light !important;\n }\n }\n\n /* Screen: also apply isolation for print preview */\n @media screen {\n /* When this stylesheet is active, we're about to print */\n /* No screen-specific rules needed - isolation only applies to print */\n }\n `,i}(n,r);return document.head.appendChild(o),new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),document.getElementById(xi)?.remove(),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{window.removeEventListener("afterprint",t),document.getElementById(xi)?.remove(),e()},5e3)})}const Si={button:!1,orientation:"landscape",warnThreshold:500,maxRows:0,includeTitle:!0,includeTimestamp:!0,title:"",isolate:!1};class Ri extends i{name="print";version="1.0.0";styles=".tbw-print-header,.tbw-print-footer{display:none}@media print{tbw-grid{overflow:visible!important;height:auto!important;border:none!important;border-radius:0!important;color-scheme:light only;-webkit-print-color-adjust:exact;print-color-adjust:exact}tbw-grid .tbw-grid-content{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .tbw-scroll-area{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .rows-body{overflow:visible!important;height:auto!important;max-height:none!important}tbw-grid .rows-container,tbw-grid .rows-viewport,tbw-grid .rows{overflow:visible!important;height:auto!important;max-height:none!important;transform:none!important}tbw-grid .rows-viewport .rows{position:static!important}tbw-grid .resize-handle,tbw-grid [part=sort-indicator],tbw-grid .tbw-filter-btn,tbw-grid .tool-panel,tbw-grid .tool-panel-content,tbw-grid .tbw-shell-header,tbw-grid .shell-toolbar,tbw-grid .tool-panel-toggle,tbw-grid [data-print-hide],tbw-grid .expander-cell,tbw-grid .tree-toggle,tbw-grid .context-menu,tbw-grid .faux-vscroll{display:none!important}tbw-grid .tbw-print-header{display:flex;justify-content:space-between;align-items:baseline;padding:var(--tbw-spacing-md, .5em) 0;margin-bottom:var(--tbw-spacing-md, .5em);border-bottom:2px solid var(--tbw-print-border, var(--tbw-color-border-strong));font-family:inherit}.tbw-print-header-title{font-size:1.25em;font-weight:700}.tbw-print-header-timestamp{font-size:var(--tbw-font-size-sm, .875em);color:var(--tbw-print-muted, var(--tbw-color-fg-muted))}tbw-grid .tbw-print-footer{display:block;margin-top:var(--tbw-spacing-md, .5em);padding-top:var(--tbw-spacing-md, .5em);border-top:1px solid var(--tbw-print-border, var(--tbw-color-border));font-size:var(--tbw-font-size-xs, .75em);color:var(--tbw-print-muted, var(--tbw-color-fg-muted));text-align:end}tbw-grid .data-grid-row{break-inside:avoid;page-break-inside:avoid}tbw-grid .cell{border:1px solid var(--tbw-print-cell-border, var(--tbw-color-border))!important}tbw-grid .header-row,tbw-grid .data-grid-row{padding-inline-end:1px}tbw-grid .data-grid-row:hover,tbw-grid .cell:hover{background:inherit!important}@page{margin:1cm}tbw-grid.print-landscape{@page{size:landscape}}tbw-grid.print-portrait{@page{size:portrait}}}";#we=!1;#be=null;#ve=null;#ye=null;#Ce=null;#xe=null;#Ee=null;get#f(){return this.grid}isPrinting(){return this.#we}async print(e){if(this.#we)return void this.warn(R,"Print already in progress");const t=this.gridElement;if(!t)return void this.warn(A,"Grid not available");const i={...Si,...this.config,...e},r=this.rows.length;let n=r,o=!1;if(i.warnThreshold>0&&r>i.warnThreshold){const e=i.maxRows>0?`\n\nNote: Output will be limited to ${i.maxRows.toLocaleString()} rows.`:"";if(!confirm(`This grid has ${r.toLocaleString()} rows. Printing large datasets may cause performance issues or browser slowdowns.${e}\n\nClick OK to continue, or Cancel to abort.`))return}i.maxRows>0&&r>i.maxRows&&(n=i.maxRows,o=!0),this.#we=!0;const s=performance.now();this.emit("print-start",{rowCount:n,limitApplied:o,originalRowCount:r});try{const e=this.#f;this.#ve={bypassThreshold:e._virtualization?.bypassThreshold??24},this.#Se(),o&&(this.#ye=this.sourceRows,this.grid.rows=this.sourceRows.slice(0,n),await new Promise(e=>setTimeout(e,50))),(i.includeTitle||i.includeTimestamp)&&this.#Re(i),await this.#Ae(),await new Promise(e=>requestAnimationFrame(e)),await new Promise(e=>requestAnimationFrame(e)),t.classList.add(`print-${i.orientation}`),await new Promise(e=>requestAnimationFrame(e)),await new Promise(e=>requestAnimationFrame(e)),i.isolate?await this.#ke(i):await this.#Ie(),this.emit("print-complete",{success:!0,rowCount:n,duration:Math.round(performance.now()-s)})}catch(l){k(I,`Print failed: ${l}`,this.gridElement?.id,this.name),this.emit("print-complete",{success:!1,rowCount:0,duration:Math.round(performance.now()-s)})}finally{this.#_e(),this.#we=!1}}#Re(e){const t=this.gridElement;if(t){if(this.#Ce=document.createElement("div"),this.#Ce.className="tbw-print-header",e.includeTitle){const t=e.title||this.grid.effectiveConfig?.shell?.header?.title||"Grid Data",i=document.createElement("div");i.className="tbw-print-header-title",i.textContent=t,this.#Ce.appendChild(i)}if(e.includeTimestamp){const e=document.createElement("div");e.className="tbw-print-header-timestamp",e.textContent=`Printed: ${/* @__PURE__ */(new Date).toLocaleString()}`,this.#Ce.appendChild(e)}t.insertBefore(this.#Ce,t.firstChild),this.#xe=document.createElement("div"),this.#xe.className="tbw-print-footer",this.#xe.textContent=`Page generated from ${window.location.hostname}`,t.appendChild(this.#xe)}}async#Ae(){const e=this.#f;if(!e._virtualization)return;const t=this.rows.length;e._virtualization.bypassThreshold=t+100,e.refreshVirtualWindow(!0),await new Promise(e=>setTimeout(e,100))}async#Ie(){return new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{"undefined"!=typeof window&&window.removeEventListener("afterprint",t),e()},1e3)})}async#ke(e){const t=this.gridElement;t&&await Ei(t,{orientation:e.orientation})}#Se(){const e=this.columns;if(e){this.#be=/* @__PURE__ */new Map;for(const t of e){if(!t.field)continue;(!0===t.printHidden||!0===t.utility&&!1!==t.printHidden)&&(this.#be.set(t.field,!t.hidden),this.grid.setColumnVisible(t.field,!1))}}}#Te(){if(this.#be){for(const[e,t]of this.#be)this.grid.setColumnVisible(e,t);this.#be=null}}#_e(){const e=this.gridElement;if(!e)return;this.#Te(),e.classList.remove("print-portrait","print-landscape"),null!==this.#Ee&&(e.style.transform="",e.style.transformOrigin="",e.style.width="",this.#Ee=null),this.#Ce&&(this.#Ce.remove(),this.#Ce=null),this.#xe&&(this.#xe.remove(),this.#xe=null);const t=this.#f;this.#ve&&t._virtualization&&(t._virtualization.bypassThreshold=this.#ve.bypassThreshold,t.refreshVirtualWindow(!0),this.#ve=null),null!==this.#ye&&(this.grid.rows=this.#ye,this.#ye=null)}afterRender(){this.config?.button&&!this.#Le&&(this.#Fe(),this.#Le=!0)}#Le=!1;#Fe(){const e=this.#f;e.registerToolbarContent?.({id:"print-button",order:900,render:e=>{const t=document.createElement("button");t.className="tbw-toolbar-btn tbw-print-btn",t.title="Print grid",t.type="button",this.setIcon(t,"print"),t.addEventListener("click",()=>{this.print()},{signal:this.disconnectSignal}),e.appendChild(t)}})}}function Ai(e){if(!0===e.lockPosition)return!1;if(!0===e.utility)return!1;const t=e.meta??{};return!0!==t.lockPosition&&!0!==t.suppressMovable}function ki(e,t,i){if(t===i)return e;if(t<0||t>=e.length)return e;if(i<0||i>e.length)return e;const r=[...e],[n]=r.splice(t,1);return r.splice(i,0,n),r}const Ii="canMoveColumn";class _i extends i{name="reorderColumns";aliases=["reorder"];styles='@layer tbw-plugins{.header-row>.cell[draggable=true]{cursor:grab;position:relative}.header-row>.cell.dragging{opacity:.5;cursor:grabbing}.header-row>.cell.drop-before:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--tbw-reorder-indicator, var(--tbw-color-accent));z-index:1}.header-row>.cell.drop-after:after{content:"";position:absolute;right:0;top:0;bottom:0;width:2px;background:var(--tbw-reorder-indicator, var(--tbw-color-accent));z-index:1}.cell.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}@keyframes reorder-fade-in{0%{opacity:0}to{opacity:1}}.cell.fade-animating{animation:reorder-fade-in var(--tbw-animation-duration, .2s) ease-out backwards}}';static manifest={queries:[{type:Ii,description:"Authoritative check for whether a column may be reordered (honors lockPosition)."}]};handleQuery(e){if(e.type===Ii){const t=e.context;return t?Ai(t):void 0}}get defaultConfig(){return{animation:"flip"}}get animationType(){return!!this.isAnimationEnabled&&(void 0!==this.config.animation?this.config.animation:"flip")}get animationDuration(){return void 0!==this.config.animationDuration?this.config.animationDuration:super.animationDuration}isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupFields=[];get#f(){return this.grid}canMoveColumnWithPlugins(e){if(!e||!Ai(e))return!1;return!this.grid.query(Ii,e).includes(!1)}clearDragClasses(){this.gridElement?.querySelectorAll(".header-row > .cell, .header-group-row > .cell").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-reorder-request",e=>{const t=e.detail;t?.field&&"number"==typeof t.toIndex&&this.moveColumn(t.field,t.toIndex)},{signal:this.disconnectSignal})}detach(){this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[]}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll(".header-row > .cell").forEach(e=>{const t=e,i=t.getAttribute("data-field");if(!i)return;const r=this.columns.find(e=>e.field===i);this.canMoveColumnWithPlugins(r)?(t.draggable=!0,t.getAttribute("data-dragstart-bound")||(t.setAttribute("data-dragstart-bound","true"),t.addEventListener("dragstart",e=>{const r=this.getColumnOrder().indexOf(i);this.isDragging=!0,this.draggedField=i,this.draggedIndex=r,this.draggedGroupFields=[],e.dataTransfer&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",i)),t.classList.add(w.DRAGGING)}),t.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[],this.clearDragClasses()}),t.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedField===i&&0===this.draggedGroupFields.length)return;if(this.draggedGroupFields.includes(i))return;const r=t.getBoundingClientRect(),n=r.left+r.width/2,o=this.getColumnOrder().indexOf(i);if(this.dropIndex=e.clientX<n?o:o+1,this.clearDragClasses(),this.draggedGroupFields.length>0)for(const t of this.draggedGroupFields)this.gridElement?.querySelector(`.header-row > .cell[data-field="${t}"]`)?.classList.add(w.DRAGGING);else this.draggedField&&this.gridElement?.querySelector(`.header-row > .cell[data-field="${this.draggedField}"]`)?.classList.add(w.DRAGGING);t.classList.add("drop-target"),t.classList.toggle("drop-before",e.clientX<n),t.classList.toggle("drop-after",e.clientX>=n)}),t.addEventListener("dragleave",()=>{t.classList.remove("drop-target","drop-before","drop-after")}),t.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length>0){if(this.draggedGroupFields.includes(i))return;const r=t.getBoundingClientRect(),n=e.clientX<r.left+r.width/2;return void this.executeGroupBlockMove(this.draggedGroupFields,[i],n)}const r=this.draggedField,n=this.draggedIndex,o=this.dropIndex;if(!this.isDragging||null===r||null===n||null===o)return;const s=o>n?o-1:o,l=ki(this.getColumnOrder(),n,s),a={field:r,fromIndex:n,toIndex:s,columnOrder:l};this.emitCancelable("column-move",a)||this.updateColumnOrder(l)}))):t.draggable=!1}),queueMicrotask(()=>this.setupGroupHeaderDrag(e))}setupGroupHeaderDrag(e){e.querySelectorAll(".header-group-row > .cell[data-group]").forEach(t=>{const i=t,r=i.getAttribute("data-group");if(!r||r.startsWith("__implicit__"))return;if(i.getAttribute("data-group-drag-bound"))return;i.setAttribute("data-group-drag-bound","true");const n=this.getGroupFragmentFields(i,r);if(0===n.length)return;n.every(e=>{const t=this.columns.find(t=>t.field===e);return this.canMoveColumnWithPlugins(t)})&&(i.draggable=!0,i.style.cursor="grab",i.addEventListener("dragstart",t=>{this.isDragging=!0,this.draggedField=null,this.draggedIndex=null,this.draggedGroupFields=[...n],t.dataTransfer&&(t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",`group:${r}`)),i.classList.add(w.DRAGGING);for(const i of n)e.querySelector(`.header-row > .cell[data-field="${i}"]`)?.classList.add(w.DRAGGING)}),i.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.draggedGroupFields=[],this.clearDragClasses()}),i.addEventListener("dragover",e=>{if(e.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length>0&&this.draggedGroupFields.length===n.length&&this.draggedGroupFields.every(e=>n.includes(e)))return;const t=i.getBoundingClientRect(),r=t.left+t.width/2,o=e.clientX<r;this.clearDragClasses(),i.classList.add("drop-target"),i.classList.toggle("drop-before",o),i.classList.toggle("drop-after",!o)}),i.addEventListener("dragleave",()=>{i.classList.remove("drop-target","drop-before","drop-after")}),i.addEventListener("drop",e=>{if(e.preventDefault(),!this.isDragging)return;const t=i.getBoundingClientRect(),r=e.clientX<t.left+t.width/2;if(this.draggedGroupFields.length>0){if(this.draggedGroupFields.length===n.length&&this.draggedGroupFields.every(e=>n.includes(e)))return;this.executeGroupBlockMove(this.draggedGroupFields,n,r)}else if(this.draggedField){const e=this.getColumnOrder(),t=r?n[0]:n[n.length-1],i=e.indexOf(this.draggedField),o=r?e.indexOf(t):e.indexOf(t)+1;if(-1===i||-1===o)return;const s=o>i?o-1:o,l=ki(e,i,s);this.emitCancelable("column-move",{field:this.draggedField,fromIndex:i,toIndex:s,columnOrder:l})||this.updateColumnOrder(l)}}))})}getGroupFragmentFields(e,t){const i=e.style.gridColumn,r=/(\d+)\s*\/\s*span\s+(\d+)/.exec(i);if(!r)return[];const n=parseInt(r[1],10),o=parseInt(r[2],10),s=this.visibleColumns,l=[];for(let a=n-1;a<n-1+o&&a<s.length;a++){const e=s[a];e&&l.push(e.field)}return l}executeGroupBlockMove(e,t,i){const r=this.getColumnOrder(),n=r.filter(t=>!e.includes(t)),o=i?t[0]:t[t.length-1],s=n.indexOf(o);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));n.splice(l,0,...a);this.emitCancelable("column-move",{field:e[0],fromIndex:r.indexOf(e[0]),toIndex:l,columnOrder:n})||this.updateColumnOrder(n)}onKeyDown(e){if(!e.altKey||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key)return;const t=this.#f,i=t._focusCol,r=t._visibleColumns;if(i<0||i>=r.length)return;const n=r[i];if(!this.canMoveColumnWithPlugins(n))return;const o=this.getColumnOrder(),s=o.indexOf(n.field);if(-1===s)return;const a="ArrowLeft"===e.key?s-1:s+1;if(a<0||a>=o.length)return;const d=r.find(e=>e.field===o[a]);return this.canMoveColumnWithPlugins(d)?(this.moveColumn(n.field,a),t._focusCol=a,l(this.#f),e.preventDefault(),e.stopPropagation(),!0):void 0}getColumnOrder(){return this.grid.getColumnOrder()}moveColumn(e,t){const i=this.getColumnOrder(),r=i.indexOf(e);if(-1===r)return;const n=ki(i,r,t);this.emitCancelable("column-move",{field:e,fromIndex:r,toIndex:t,columnOrder:n})||this.updateColumnOrder(n)}setColumnOrder(e){this.updateColumnOrder(e)}resetColumnOrder(){const e=this.columns.map(e=>e.field);this.updateColumnOrder(e)}captureHeaderPositions(){const e=/* @__PURE__ */new Map;return this.gridElement?.querySelectorAll(".header-row > .cell[data-field]").forEach(t=>{const i=t.getAttribute("data-field");i&&e.set(i,t.getBoundingClientRect().left)}),e}animateFLIP(e){const t=this.gridElement;if(!t||0===e.size)return;const i=/* @__PURE__ */new Map;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(t=>{const r=t.getAttribute("data-field");if(!r)return;const n=e.get(r);if(void 0===n)return;const o=n-t.getBoundingClientRect().left;Math.abs(o)>1&&i.set(r,o)}),0===i.size)return;const r=[];if(t.querySelectorAll(".cell[data-field]").forEach(e=>{const t=i.get(e.getAttribute("data-field")??"");if(void 0!==t){const i=e;i.style.transform=`translateX(${t}px)`,r.push(i)}}),0===r.length)return;t.offsetHeight;const n=this.animationDuration;requestAnimationFrame(()=>{r.forEach(e=>{e.classList.add("flip-animating"),e.style.transform=""}),setTimeout(()=>{r.forEach(e=>{e.style.transform="",e.classList.remove("flip-animating")})},n+50)})}animateFade(e){const t=this.gridElement;if(!t)return void e();const i=this.captureHeaderPositions();e();const r=/* @__PURE__ */new Set;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(e=>{const t=e.getAttribute("data-field");if(!t)return;const n=i.get(t);if(void 0===n)return;const o=e.getBoundingClientRect().left;Math.abs(n-o)>1&&r.add(t)}),0===r.size)return;const n=[];if(t.querySelectorAll(".cell[data-field]").forEach(e=>{const t=e.getAttribute("data-field");if(t&&r.has(t)){const t=e;t.classList.add("fade-animating"),n.push(t)}}),0===n.length)return;const o=this.animationDuration;setTimeout(()=>{n.forEach(e=>e.classList.remove("fade-animating"))},o+50)}updateColumnOrder(e){const t=this.animationType;if("flip"===t&&this.gridElement){const t=this.captureHeaderPositions();this.grid.setColumnOrder(e),"function"==typeof this.grid.forceLayout?this.grid.forceLayout().then(()=>{this.animateFLIP(t)}):requestAnimationFrame(()=>{this.animateFLIP(t)})}else"fade"===t?this.animateFade(()=>this.grid.setColumnOrder(e)):this.grid.setColumnOrder(e);this.grid.requestStateChange?.()}}const Ti=/* @__PURE__ */new Map;function Li(e){const t=Ti.get(e);if(!t)return;if(t.hasPrimitives)return;const i=[];for(const r of t.refs){const e=r.deref();if(void 0===e)return;i.push(e)}return i}function Fi(e){Ti.delete(e)}function Gi(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues){const e=new Uint32Array(2);return crypto.getRandomValues(e),`drag-${Date.now().toString(36)}-${e[0].toString(36)}${e[1].toString(36)}`}return`drag-${Date.now().toString(36)}-${(++Di).toString(36)}`}let Di=0,Mi=null;function Ni(){return Mi}function qi(){Mi=null}const Pi="application/x-tbw-grid-rows+json";function zi(e){const t=e.match(/^application\/x-tbw-grid-rows\+json;zone=(.*)$/);if(!t)return null;try{return decodeURIComponent(t[1])}catch{return t[1]}}function Hi(e){return JSON.stringify(e)}function Oi(e,t,i,r){if(!e)return{overIndex:null,insertIndex:r,isBefore:!1};const n=i(e);if(n<0)return{overIndex:null,insertIndex:r,isBefore:!1};const o=e.getBoundingClientRect(),s=t<o.top+o.height/2;return{overIndex:n,insertIndex:s?n:n+1,isBefore:s}}const Ki="__tbw_row_drag";let Bi=null;const $i=/* @__PURE__ */new Set;function Wi(){if("undefined"==typeof BroadcastChannel)return null;if(Bi)return Bi;try{Bi=new BroadcastChannel("tbw-row-drag-drop"),Bi.addEventListener("message",e=>{const t=e.data;if(t&&"tbw-row-drag-drop:transfer"===t.type)for(const i of Array.from($i))try{i(t)}catch{}})}catch{Bi=null}return Bi}class Vi extends i{name="rowDragDrop";aliases=["reorderRows","rowReorder"];styles='@layer tbw-plugins{[data-field=__tbw_row_drag]{display:flex;align-items:center;justify-content:center}.dg-row-drag-handle{display:flex;align-items:center;justify-content:center;min-width:1em;min-height:1em;cursor:grab;user-select:none;color:var(--tbw-row-reorder-handle-color, var(--tbw-color-fg-muted));transition:color var(--tbw-transition-duration, .12s) var(--tbw-transition-ease, ease);font-size:var(--tbw-font-size, 1em);letter-spacing:-2px;&:hover{color:var(--tbw-row-reorder-handle-hover, var(--tbw-color-fg))}&:active{cursor:grabbing}}.data-grid-row.dragging{opacity:.6}.data-grid-row[draggable=true]{cursor:grab}.data-grid-row[draggable=true].dragging{cursor:grabbing}.tbw-row-drag-clone{position:fixed;top:-10000px;left:-10000px;pointer-events:none}.tbw-row-drag-count{position:fixed;top:-1000px;left:-1000px;pointer-events:none;background:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));color:var(--tbw-color-accent-fg);font:600 12px/1.4 system-ui,sans-serif;border-radius:999px;padding:2px 8px;box-shadow:0 2px 6px var(--tbw-color-shadow);z-index:9999}.data-grid-row.drop-target{position:relative;&.drop-before:before,&.drop-after:after{content:"";position:absolute;left:0;right:0;height:var(--tbw-drop-indicator-width, 2px);background-color:var(--tbw-drop-indicator-color, var(--tbw-row-reorder-indicator, var(--tbw-color-accent)));z-index:10;pointer-events:none}&.drop-before:before{top:0}&.drop-after:after{bottom:0}}.tbw-grid--drop-target-active{outline:2px dashed var(--tbw-drop-indicator-color, var(--tbw-color-accent));outline-offset:-2px}.tbw-grid--drop-target-rejected{outline:2px dashed var(--tbw-color-danger);outline-offset:-2px}.tbw-grid--auto-scrolling{cursor:ns-resize}.data-grid-row.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}}';static manifest={events:[{type:"row-move",description:"Intra-grid row reorder.",cancelable:!0},{type:"row-drag-start",description:"Cross-grid drag started on this grid.",cancelable:!0},{type:"row-drag-end",description:"Drag finished on this grid (regardless of outcome)."},{type:"row-drop",description:"Cross-grid drop landing on this grid.",cancelable:!0},{type:"row-transfer",description:"Cross-grid transfer completed (fires on both grids)."}]};get defaultConfig(){return{enableKeyboard:!0,dragHandlePosition:"left",dragHandleWidth:40,debounceMs:150,animation:"flip",operation:"move",autoScroll:!0,dragFrom:"handle"}}shouldRenderDragHandle(){const e=this.config.showDragHandle;return!1!==e&&(!0===e||"row"!==this.config.dragFrom)}get rowIsDraggable(){return"row"===this.config.dragFrom||"both"===this.config.dragFrom}get animationType(){return!!this.isAnimationEnabled&&(void 0!==this.config.animation?this.config.animation:"flip")}isDragging=!1;draggedRowIndex=null;draggedRows=[];draggedIndices=[];dragSessionId=null;dragAccepted=!1;dropRowIndex=null;pendingMove=null;debounceTimer=null;lastFocusCol=0;autoScroller=null;gridId="";remoteTransferListener=e=>this.onRemoteTransfer(e);get internalGrid(){return this.grid}attach(e){super.attach(e);const t=this.gridElement;var i;t&&(this.gridId=t.id||`tbw-grid-${Gi().slice(0,8)}`,t.id||(t.id=this.gridId),this.setupDelegatedDragListeners(),i=this.remoteTransferListener,$i.add(i),Wi())}detach(){this.clearDebounceTimer(),this.autoScroller?.stop(),this.autoScroller=null,function(e){if($i.delete(e),0===$i.size&&Bi){try{Bi.close()}catch{}Bi=null}}(this.remoteTransferListener),this.dragSessionId&&Fi(this.dragSessionId),qi(),this.resetDragState(),super.detach()}processColumns(e){if(!this.shouldRenderDragHandle())return[...e];const t={field:Ki,header:"",width:this.config.dragHandleWidth??40,resizable:!1,sortable:!1,filterable:!1,lockPosition:!0,utility:!0,viewRenderer:()=>{const e=document.createElement("div");return e.className="dg-row-drag-handle",e.setAttribute("aria-label","Drag to reorder"),e.setAttribute("role","button"),e.setAttribute("tabindex","-1"),e.draggable=!0,this.setIcon(e,"dragHandle"),e}};return"right"===this.config.dragHandlePosition?[...e,t]:[t,...e]}afterRender(){this.applyRowDraggable()}onScrollRender(){this.applyRowDraggable()}applyRowDraggable(){const e=this.internalGrid._bodyEl;if(!e)return;const t=this.rowIsDraggable,i=e.querySelectorAll(".data-grid-row");for(const r of i)t?"true"!==r.getAttribute("draggable")&&r.setAttribute("draggable","true"):r.hasAttribute("draggable")&&r.removeAttribute("draggable")}onKeyDown(e){if(!this.config.enableKeyboard)return;if(!e.ctrlKey||"ArrowUp"!==e.key&&"ArrowDown"!==e.key)return;const t=this.internalGrid,i=t._focusRow,r=t._rows??this.sourceRows;if(i<0||i>=r.length)return;const n="up"===("ArrowUp"===e.key?"up":"down")?i-1:i+1;if(n<0||n>=r.length)return;const o=r[i];return this.canMoveRow(i,n)?(this.handleKeyboardMove(o,i,n,t._focusCol),e.preventDefault(),e.stopPropagation(),!0):void 0}onCellClick(){this.flushPendingMove()}moveRow(e,t){const i=[...this.sourceRows];e<0||e>=i.length||t<0||t>=i.length||e!==t&&this.canMoveRow(e,t)&&this.executeIntraGridMove(i[e],e,t,"keyboard")}canMoveRow(e,t){const i=this.internalGrid._rows??this.sourceRows;if(e<0||e>=i.length)return!1;if(t<0||t>=i.length)return!1;if(e===t)return!1;const r=i[e],n=this.grid?.query?.("canMoveRow",r);if(Array.isArray(n)&&n.includes(!1))return!1;if(this.config.canDrag&&!this.config.canDrag(r,e))return!1;if(this.config.canMove){const i=t<e?"up":"down";if(!this.config.canMove(r,e,t,i))return!1}if(this.config.canDrop){const i={sessionId:"intra",sourceGridId:this.gridId,dropZone:this.config.dropZone??"",rows:[r],rowIndices:[e],operation:"move"};if(!this.config.canDrop(i,t))return!1}return!0}setupDelegatedDragListeners(){const e=this.gridElement;if(!e)return;const t=this.disconnectSignal;e.addEventListener("dragstart",e=>this.onDragStart(e),{signal:t}),e.addEventListener("dragend",()=>this.onDragEnd(),{signal:t}),e.addEventListener("dragover",e=>this.onDragOver(e),{signal:t}),e.addEventListener("dragleave",e=>this.onDragLeave(e),{signal:t}),e.addEventListener("drop",e=>this.onDrop(e),{signal:t})}onDragStart(e){const t=e.target;if(!t)return;const i=t.closest(".dg-row-drag-handle");let r=null,n=!1;if(i)r=i.closest(".data-grid-row"),n=!0;else if(this.rowIsDraggable){if(this.isInteractiveDragOrigin(t))return;r=t.closest(".data-grid-row")}if(!r)return;const o=this.getRowIndex(r);if(o<0)return;const{rows:s,indices:l}=this.resolveDraggedRows(o);if(0===s.length)return;if(this.config.canDrag&&!this.config.canDrag(s[0],o))return void e.preventDefault();const a=this.config.operation??"move",d=this.config.dropZone??"",c=Gi(),u={rows:s,indices:l,operation:a,dropZone:d};if(this.emitCancelable("row-drag-start",u))return void e.preventDefault();this.isDragging=!0,this.draggedRowIndex=o,this.draggedRows=s,this.draggedIndices=l,this.dragSessionId=c,this.dragAccepted=!1;const h=this.config.serializeRow??(e=>e),g={sessionId:c,sourceGridId:this.gridId,dropZone:d,rows:s.map(h),rowIndices:l,operation:a};if(e.dataTransfer){e.dataTransfer.effectAllowed="copy"===a?"copyMove":"move";try{e.dataTransfer.setData(Pi,Hi(g)),d&&e.dataTransfer.setData(`${Pi};zone=${encodeURIComponent(d)}`,Hi(g)),e.dataTransfer.setData("text/plain",function(e,t){const i=t.filter(e=>!e.utility&&"string"==typeof e.field&&""!==e.field),r=[];for(const n of e){const e=i.map(e=>{const t=n[e.field];return null==t?"":String(t).replace(/[\t\r\n]+/g," ")});r.push(e.join("\t"))}return r.join("\n")}(s,this.columns))}catch{}if(s.length>1){const t=document.createElement("div");t.className="tbw-row-drag-count",t.textContent=`${s.length} rows`,document.body.appendChild(t);try{e.dataTransfer.setDragImage(t,10,10)}catch{}setTimeout(()=>t.remove(),0)}else this.attachRowCloneDragImage(e,r,n?i:null)}!function(e,t,i){const r=[];let n=!1;for(const o of t)null!==o&&"object"==typeof o?r.push(new WeakRef(o)):n=!0;Ti.set(e,{refs:r,hasPrimitives:n,meta:i})}(c,s),function(e,t){Mi={sessionId:e,payload:t}}(c,g),r.classList.add(w.DRAGGING),this.gridElement.classList.add("tbw-grid--drag-source")}static INTERACTIVE_DRAG_SELECTORS='input,textarea,select,button,a,[contenteditable=""],[contenteditable="true"],.dg-cell-editor,.tbw-checkbox-cell';isInteractiveDragOrigin(e){return null!==e.closest(Vi.INTERACTIVE_DRAG_SELECTORS)}attachRowCloneDragImage(e,t,i){if(!e.dataTransfer)return;const r=t.getBoundingClientRect(),n=t.cloneNode(!0);n.classList.add("tbw-row-drag-clone"),n.classList.remove("dragging","drop-target","drop-before","drop-after","flip-animating","row-focus"),n.removeAttribute("aria-selected"),n.style.width=`${r.width}px`,n.style.height=`${r.height}px`,this.gridElement.appendChild(n);let o=e.clientX-r.left,s=e.clientY-r.top;if(i){const e=i.getBoundingClientRect();o=e.left-r.left+e.width/2,s=e.top-r.top+e.height/2}o=Math.max(0,Math.min(r.width,o)),s=Math.max(0,Math.min(r.height,s));try{e.dataTransfer.setDragImage(n,o,s)}catch{}setTimeout(()=>n.remove(),0)}onDragOver(e){const t=e.dataTransfer;if(!t)return;const i=t.types?Array.from(t.types):[];if(!function(e){for(const t of e)if(t===Pi||t.startsWith(`${Pi};`))return!0;return!1}(i)&&!this.isDragging)return;const r=this.config.dropZone??"",n=Ni(),o=this.isDragging&&n?.payload.sourceGridId===this.gridId;if(!o){if(!r)return;const e=function(e,t){for(const i of e)if(zi(i)===t)return i;return null}(i,r);if(!(e||n&&n.payload.dropZone===r))return}e.preventDefault(),t&&(t.dropEffect=n?.payload.operation??this.config.operation??"move");const s=e.target.closest(".data-grid-row"),l=this.internalGrid._rows??[],a=Oi(s,e.clientY,e=>this.getRowIndex(e),l.length);if(o&&null!==a.overIndex&&a.overIndex===this.draggedRowIndex)this.clearDropTargetClasses();else{if(n&&this.config.canDrop){const e=this.config.canDrop(n.payload,a.insertIndex);if(this.gridElement.classList.toggle("tbw-grid--drop-target-active",e),this.gridElement.classList.toggle("tbw-grid--drop-target-rejected",!e),!e)return void this.clearDropTargetClasses()}else this.gridElement.classList.add("tbw-grid--drop-target-active");this.dropRowIndex=a.insertIndex,this.applyDropPositionClasses(s,a.isBefore),!1!==this.config.autoScroll&&(this.ensureAutoScroller(),this.autoScroller?.onPointerMove(e.clientY))}}onDragLeave(e){const t=e.target.closest(".data-grid-row");t&&t.classList.remove("drop-target","drop-before","drop-after"),e.currentTarget&&!this.gridElement.contains(e.relatedTarget)&&(this.gridElement.classList.remove("tbw-grid--drop-target-active","tbw-grid--drop-target-rejected"),this.autoScroller?.stop())}onDrop(e){e.preventDefault(),this.autoScroller?.stop(),this.gridElement.classList.remove("tbw-grid--drop-target-active","tbw-grid--drop-target-rejected"),this.clearDropTargetClasses();const t=e.dataTransfer;if(!t)return;const i=Ni();let r=i?.payload??null,n=null;if(r){const e=Li(r.sessionId);e&&(n=e)}else{if(r=function(e){if(!e)return null;try{const t=JSON.parse(e);if("string"!=typeof t?.sessionId||"string"!=typeof t?.sourceGridId||"string"!=typeof t?.dropZone||!Array.isArray(t?.rows)||!Array.isArray(t?.rowIndices)||"move"!==t.operation&&"copy"!==t.operation)return null;for(const e of t.rowIndices)if("number"!=typeof e||!Number.isInteger(e)||e<0)return null;return t}catch{return null}}(t.getData(Pi)),r){const e=Li(r.sessionId);e&&(n=e)}}if(!r)return;const o=e.target.closest(".data-grid-row"),s=this.internalGrid._rows??[],l=Oi(o,e.clientY,e=>this.getRowIndex(e),s.length);let a=this.dropRowIndex??l.insertIndex;const d=r.sourceGridId===this.gridId,c=this.config.dropZone??"";if(d){const e=r.rowIndices[0];if(1===r.rowIndices.length&&a>e&&a--,e===a)return;const t=(n??r.rows)[0];if(!this.canMoveRow(e,a))return;return void this.executeIntraGridMove(t,e,a,"drag")}if(!c||c!==r.dropZone)return;if(this.config.canDrop&&!this.config.canDrop(r,a))return this.gridElement.classList.add("tbw-grid--drop-target-rejected"),void setTimeout(()=>this.gridElement.classList.remove("tbw-grid--drop-target-rejected"),200);const u=this.config.deserializeRow??(e=>e),h=n??r.rows.map(e=>u(e)),g={payload:r,sourceGridId:r.sourceGridId,targetIndex:a,operation:r.operation};if(this.emitCancelable("row-drop",g))return;const p=[...s];p.splice(a,0,...h),this.grid.rows=p;const f=this.findPeerOnGrid(r.sourceGridId);if("move"===r.operation&&f){const e=document.getElementById(r.sourceGridId);if(e){const t=(e._rows??e.rows??[]).slice(),i=[...r.rowIndices].sort((e,t)=>t-e);for(const e of i)e>=0&&e<t.length&&t.splice(e,1);e.rows=t}}f&&(f.dragAccepted=!0);const m={rows:h,fromGridId:r.sourceGridId,toGridId:this.gridId,fromIndices:r.rowIndices,toIndex:a,operation:r.operation};this.emit("row-transfer",m),f?f.emitTransfer(m):function(e){const t=Wi();if(t)try{t.postMessage(e)}catch{}}({type:"tbw-row-drag-drop:transfer",sessionId:r.sessionId,sourceGridId:r.sourceGridId,toGridId:this.gridId,dropZone:c,rowIndices:r.rowIndices,toIndex:a,operation:r.operation,serializedRows:r.rows})}onRemoteTransfer(e){if(e.sourceGridId!==this.gridId)return;const t=this.config.dropZone??"";if(!t||e.dropZone!==t)return;const i=this.config.deserializeRow??(e=>e),r=e.serializedRows.map(e=>i(e));if("move"===e.operation){const t=(this.internalGrid._rows??this.sourceRows).slice(),i=[...e.rowIndices].sort((e,t)=>t-e);for(const e of i)e>=0&&e<t.length&&t.splice(e,1);this.grid.rows=t}this.dragAccepted=!0,this.emit("row-transfer",{rows:r,fromGridId:e.sourceGridId,toGridId:e.toGridId,fromIndices:e.rowIndices,toIndex:e.toIndex,operation:e.operation})}onDragEnd(){if(this.dragSessionId&&Fi(this.dragSessionId),qi(),this.autoScroller?.stop(),this.gridElement.classList.remove("tbw-grid--drag-source"),this.isDragging){const e={rows:this.draggedRows,indices:this.draggedIndices,accepted:this.dragAccepted};this.emit("row-drag-end",e)}this.clearDragClasses(),this.resetDragState()}emitTransfer(e){this.emit("row-transfer",e)}findPeerOnGrid(e){const t=document.getElementById(e);return t?.getPluginByName?t.getPluginByName("rowDragDrop")??null:null}resolveDraggedRows(e){const t=this.internalGrid._rows??this.sourceRows,i=t[e],r=this.grid?.getPluginByName?.("selection");if(r?.getSelectedRowIndices){const i=r.getSelectedRowIndices();if(i.includes(e)&&i.length>1){const e=[...i].sort((e,t)=>e-t);return{rows:e.map(e=>t[e]),indices:e}}}return{rows:[i],indices:[e]}}ensureAutoScroller(){if(this.autoScroller)return;const e=this.gridElement.querySelector(".rows-viewport");if(!e)return;const t="object"==typeof this.config.autoScroll?this.config.autoScroll:void 0;this.autoScroller=function(e,t={},i){const r=t.edgeSize??60,n=t.speed??8,o=t.maxSpeed??24;let s=null,l=null,a=!1;const d=e=>{e!==a&&(a=e,i?.(e))},c=()=>{if(s=null,null===l)return void d(!1);const t=e.getBoundingClientRect();let i=0;if(l<t.top+r){const e=1-Math.max(0,l-t.top)/r;i=-Math.round(n+(o-n)*e)}else if(l>t.bottom-r){const e=1-Math.max(0,t.bottom-l)/r;i=Math.round(n+(o-n)*e)}if(0===i)return void d(!1);const a=e.scrollTop;e.scrollTop=a+i,e.scrollTop!==a?(d(!0),s=requestAnimationFrame(c)):d(!1)};return{onPointerMove(e){l=e,null===s&&(s=requestAnimationFrame(c))},stop(){null!==s&&(cancelAnimationFrame(s),s=null),l=null,d(!1)},get isScrolling(){return a}}}(e,t,e=>{this.gridElement.classList.toggle("tbw-grid--auto-scrolling",e)})}applyDropPositionClasses(e,t){this.clearDropTargetClasses(),e&&(e.classList.add("drop-target"),e.classList.toggle("drop-before",t),e.classList.toggle("drop-after",!t))}clearDropTargetClasses(){this.gridElement?.querySelectorAll(".data-grid-row.drop-target").forEach(e=>{e.classList.remove("drop-target","drop-before","drop-after")})}clearDragClasses(){this.gridElement?.querySelectorAll(".data-grid-row").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}resetDragState(){this.isDragging=!1,this.draggedRowIndex=null,this.draggedRows=[],this.draggedIndices=[],this.dragSessionId=null,this.dragAccepted=!1,this.dropRowIndex=null,this.pendingMove=null}getRowIndex(e){const t=e.querySelector(".cell[data-row]");return t?parseInt(t.getAttribute("data-row")??"-1",10):-1}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}handleKeyboardMove(e,t,i,r){this.pendingMove?this.pendingMove.currentIndex=i:this.pendingMove={originalIndex:t,currentIndex:i,row:e},this.lastFocusCol=r;const n=this.internalGrid,o=[...n._rows??this.sourceRows],[s]=o.splice(t,1);o.splice(i,0,s),n._rows=o,n._focusRow=i,n._focusCol=r,n.refreshVirtualWindow(!0),l(n),this.clearDebounceTimer(),this.debounceTimer=setTimeout(()=>this.flushPendingMove(),this.config.debounceMs??300)}flushPendingMove(){if(this.clearDebounceTimer(),!this.pendingMove)return;const{originalIndex:e,currentIndex:t,row:i}=this.pendingMove;if(this.pendingMove=null,e===t)return;const r=this.internalGrid,n={row:i,fromIndex:e,toIndex:t,rows:[...r._rows??this.sourceRows],source:"keyboard"};this.emitCancelable("row-move",n)&&(r._rows=[...this.sourceRows],r._focusRow=e,r._focusCol=this.lastFocusCol,r.refreshVirtualWindow(!0),l(r))}executeIntraGridMove(e,t,i,r){const n=[...this.sourceRows],[o]=n.splice(t,1);n.splice(i,0,o);const s={row:e,fromIndex:t,toIndex:i,rows:n,source:r};if(!this.emitCancelable("row-move",s))if("flip"===this.animationType&&this.gridElement){const e=this.captureRowPositions();this.grid.rows=n,requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(e,t,i)})}else this.grid.rows=n}captureRowPositions(){const e=/* @__PURE__ */new Map;return this.gridElement?.querySelectorAll(".data-grid-row").forEach(t=>{const i=this.getRowIndex(t);i>=0&&e.set(i,t.getBoundingClientRect().top)}),e}animateFLIP(e,t,i){const r=this.gridElement;if(!r||0===e.size)return;const n=Math.min(t,i),o=Math.max(t,i),s=[];if(r.querySelectorAll(".data-grid-row").forEach(r=>{const l=r,a=this.getRowIndex(l);if(a<0||a<n||a>o)return;let d;d=a===i?t:t<i?a+1:a-1;const c=e.get(d);if(void 0===c)return;const u=c-l.getBoundingClientRect().top;Math.abs(u)>1&&s.push({el:l,deltaY:u})}),0===s.length)return;s.forEach(({el:e,deltaY:t})=>{e.style.transform=`translateY(${t}px)`}),r.offsetHeight;const l=this.animationDuration;requestAnimationFrame(()=>{s.forEach(({el:e})=>{e.classList.add("flip-animating"),e.style.transform=""}),setTimeout(()=>{s.forEach(({el:e})=>{e.style.transform="",e.classList.remove("flip-animating")})},l+50)})}}class ji extends i{name="responsive";version="1.0.0";styles='tbw-grid[data-responsive-animate]{.data-grid-row,.data-grid-row>.cell{transition:opacity var(--tbw-responsive-duration, .2s) ease-out,transform var(--tbw-responsive-duration, .2s) ease-out}}tbw-grid[data-responsive][data-responsive-animate]{.data-grid-row{animation:responsive-card-enter var(--tbw-responsive-duration, .2s) ease-out}}@keyframes responsive-card-enter{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}tbw-grid[data-responsive]{.header{display:none!important}.footer-row{display:none}.tbw-scroll-area{overflow-x:hidden;min-width:0!important}.rows-body-wrapper{min-width:0!important}.data-grid-row:not(.group-row){display:block!important;grid-template-columns:none!important;padding:var(--tbw-cell-padding);padding-inline-start:var(--tbw-spacing-xl);border-bottom:1px solid var(--tbw-color-border);min-height:auto!important;height:auto!important;contain:none!important;content-visibility:visible!important;background:var(--tbw-color-bg);position:relative;&:nth-child(2n){background:var(--tbw-color-row-alt)}&:hover{background:var(--tbw-color-row-hover)}&[aria-selected=true]{background:var(--tbw-color-selection);&:before{content:"";position:absolute;inset-inline-start:0;top:0;bottom:0;width:4px;background:var(--tbw-color-accent)}}}.data-grid-row:not(.group-row)>.cell{display:flex!important;justify-content:space-between;align-items:center;padding:var(--tbw-spacing-xs) var(--tbw-spacing-md);width:100%!important;min-width:0!important;min-height:auto!important;height:auto!important;line-height:1.5!important;position:static!important;left:auto!important;right:auto!important;border:none!important;border-bottom:none!important;border-inline-end:none!important;background:transparent!important;white-space:normal!important;overflow:visible!important;&:before{content:attr(data-header) ": ";font-weight:600;color:var(--tbw-color-header-fg);flex-shrink:0;margin-inline-end:var(--tbw-spacing-md);min-width:100px}&:after{content:none}}.cell[data-utility]{display:none!important}}tbw-grid[data-responsive] .data-grid-row>.cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .data-grid-row>.cell[data-responsive-value-only]{&:before{display:none!important}justify-content:flex-start!important;font-weight:500}tbw-grid:not([data-responsive]) .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive]{.tbw-footer,.tbw-header-pinned,.tbw-pinned-rows,.tbw-aggregation-rows{display:none!important}.tbw-pinned-rows,.tbw-aggregation-rows,.tbw-aggregation-row{min-width:0!important}}tbw-grid[data-responsive] .data-grid-row.responsive-card{display:block!important;padding:var(--tbw-cell-padding);border-bottom:1px solid var(--tbw-color-border);>*{width:100%}.cell:before{display:none}}';static manifest={queries:[{type:"isCardMode",description:"Returns whether the grid is currently in responsive card mode"}]};#Ge;#De=!1;#Me;#Ne=!1;#qe=0;#Pe=/* @__PURE__ */new Set;#ze=/* @__PURE__ */new Set;#He=null;#Oe=[];get#f(){return this.grid}isResponsive(){return this.#De}setResponsive(e){e!==this.#De&&(this.#De=e,this.#Ke(),this.emit("responsive-change",{isResponsive:e,width:this.#qe,breakpoint:this.config.breakpoint??0}),this.requestRender())}setBreakpoint(e){this.config.breakpoint=e,this.#Be(this.#qe)}setCardRenderer(e){this.config.cardRenderer=e,this.#De&&this.requestRender()}getWidth(){return this.#qe}getActiveBreakpoint(){return this.#He}attach(e){super.attach(e),this.#$e(),this.#We(this.config.hiddenColumns),this.config.breakpoints?.length&&(this.#Oe=[...this.config.breakpoints].sort((e,t)=>t.maxWidth-e.maxWidth)),this.#Ge=new ResizeObserver(e=>{const t=e[0]?.contentRect.width??0;this.#qe=t,clearTimeout(this.#Me),this.#Me=setTimeout(()=>{this.#Be(t)},this.config.debounceMs??100)}),this.#Ge.observe(this.gridElement)}#$e(){const e=this.gridElement;if(!e)return;const t=e.querySelector("tbw-grid-responsive-card");if(!t)return;const i=this.#f.__frameworkAdapter;if(i?.parseResponsiveCardElement){const e=i.parseResponsiveCardElement(t);e&&(this.config={...this.config,cardRenderer:e})}const r=t.getAttribute("breakpoint"),o=t.getAttribute("card-row-height"),s=t.getAttribute("hidden-columns"),l=t.getAttribute("hide-header"),a=t.getAttribute("debounce-ms"),d={};if(null!==r){const e=parseInt(r,10);isNaN(e)||(d.breakpoint=e)}if(null!==o&&(d.cardRowHeight="auto"===o?"auto":parseInt(o,10)),null!==s&&(d.hiddenColumns=s.split(",").map(e=>e.trim()).filter(e=>e.length>0)),null!==l&&(d.hideHeader="false"!==l),null!==a){const e=parseInt(a,10);isNaN(e)||(d.debounceMs=e)}const c=t.innerHTML.trim();!c||this.config.cardRenderer||i?.parseResponsiveCardElement||(d.cardRenderer=e=>{const t=y(c,{value:e,row:e}),i=n(t),r=document.createElement("div");return r.className="tbw-responsive-card-content",r.innerHTML=i,r}),Object.keys(d).length>0&&(this.config={...this.config,...d})}#We(e){if(this.#Pe.clear(),this.#ze.clear(),e)for(const t of e)"string"==typeof t?this.#Pe.add(t):t.showValue?this.#ze.add(t.field):this.#Pe.add(t.field)}detach(){this.#Ge?.disconnect(),this.#Ge=void 0,clearTimeout(this.#Me),this.#Me=void 0,this.gridElement&&this.gridElement.removeAttribute("data-responsive"),super.detach()}handleQuery(e){if("isCardMode"===e.type)return this.#De}afterRender(){this.#Ve();if(!(this.#Oe.length>0?null!==this.#He:this.#De))return;const e=this.#Pe.size>0,t=this.#ze.size>0;if(!e&&!t)return;const i=this.gridElement.querySelectorAll(".cell[data-field]");for(const r of i){const e=r.getAttribute("data-field");e&&(this.#Pe.has(e)?(r.setAttribute("data-responsive-hidden",""),r.removeAttribute("data-responsive-value-only")):this.#ze.has(e)?(r.setAttribute("data-responsive-value-only",""),r.removeAttribute("data-responsive-hidden")):(r.removeAttribute("data-responsive-hidden"),r.removeAttribute("data-responsive-value-only")))}}#Be(e){if(this.#Oe.length>0)return void this.#je(e);const t=this.config.breakpoint??0;0!==t||this.#Ne||(this.#Ne=!0,this.warn(_,"No breakpoint configured. Responsive mode is disabled. Set a breakpoint based on your grid's column count."));const i=t>0&&e<t;i!==this.#De&&(this.#De=i,this.#Ke(),this.emit("responsive-change",{isResponsive:i,width:e,breakpoint:t}),this.requestRender())}#je(e){let t=null;for(const i of this.#Oe)e<=i.maxWidth&&(t=i);if(t!==this.#He){this.#He=t,t?.hiddenColumns?this.#We(t.hiddenColumns):this.#We(this.config.hiddenColumns);const i=!0===t?.cardLayout;i!==this.#De&&(this.#De=i,this.#Ke()),this.emit("responsive-change",{isResponsive:this.#De,width:e,breakpoint:t?.maxWidth??0}),this.requestRender()}}#Ue;#Ke(){this.gridElement.toggleAttribute("data-responsive",this.#De);const e=!1!==this.config.animate;this.gridElement.toggleAttribute("data-responsive-animate",e),this.config.animationDuration&&this.gridElement.style.setProperty("--tbw-responsive-duration",`${this.config.animationDuration}ms`);const t=this.#f;if(this.#De){t._virtualization&&(this.#Ue=t._virtualization.rowHeight);const e=this.gridElement.querySelector(".tbw-scroll-area");e&&(e.scrollLeft=0)}else{const e=this.gridElement.querySelectorAll(".data-grid-row");for(const t of e)t.style.height="",t.classList.remove("responsive-card");this.#Ue&&this.#Ue>0&&t._virtualization&&(t._virtualization.rowHeight=this.#Ue,this.#Ue=void 0),this.#Ye=void 0,this.#Ze=void 0,this.#Qe=void 0}}renderRow(e,t,i){if(!this.#De||!this.config.cardRenderer)return;if(e.__isGroupRow)return;t.replaceChildren();const r=this.config.cardRenderer(e,i);t.className="data-grid-row responsive-card";const n=this.config.cardRowHeight;return t.style.height="auto"===n||void 0===n?"auto":`${this.#Xe()}px`,t.appendChild(r),!0}onKeyDown(e){if(!this.#De)return!1;if(this.config.cardRenderer){if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.key))return!1}const t=this.rows.length-1,i=this.visibleColumns.length-1;switch(e.key){case"ArrowDown":if(this.grid._focusCol<i)return this.grid._focusCol+=1,e.preventDefault(),l(this.#f),!0;if(this.grid._focusRow<t)return this.grid._focusRow+=1,this.grid._focusCol=0,e.preventDefault(),l(this.#f),!0;break;case"ArrowUp":if(this.grid._focusCol>0)return this.grid._focusCol-=1,e.preventDefault(),l(this.#f),!0;if(this.grid._focusRow>0)return this.grid._focusRow-=1,this.grid._focusCol=i,e.preventDefault(),l(this.#f),!0;break;case"ArrowRight":if(this.grid._focusRow<t)return this.grid._focusRow+=1,e.preventDefault(),l(this.#f),!0;break;case"ArrowLeft":if(this.grid._focusRow>0)return this.grid._focusRow-=1,e.preventDefault(),l(this.#f),!0}return!1}#Ye;#Ze;#Qe;#Xe(){if(this.#Ye&&this.#Ye>0)return this.#Ye;const e=this.config.cardRowHeight;return"number"==typeof e&&e>0?e:80}#Je(){return this.#Ze&&this.#Ze>0?this.#Ze:this.#Ue??28}#et(){for(const e of this.rows)if(e.__isGroupRow)return!0;return!1}getRowHeight(e,t){if(this.#De&&this.config.cardRenderer)return e.__isGroupRow?this.#Je():this.#Xe()}#tt(){let e=0;for(const t of this.rows)t.__isGroupRow||e++;return e}#it=!1;#Ve(){if(!this.#De)return;let e=!1;const t=this.#f,i=this.#et(),r=this.#tt();if(r!==this.#Qe&&(this.#Qe=r,e=!0),i){const t=this.gridElement.querySelector(".data-grid-row.group-row");if(t){const i=t.getBoundingClientRect().height;i>0&&i!==this.#Ze&&(this.#Ze=i,e=!0)}}const n=this.config.cardRenderer?".data-grid-row.responsive-card":".data-grid-row:not(.group-row)",o=this.gridElement.querySelector(n);if(o){const r=o.getBoundingClientRect().height;r>0&&r!==this.#Ye&&(this.#Ye=r,e=!0,!i&&t._virtualization&&(t._virtualization.rowHeight=r))}e&&!this.#it&&(this.#it=!0,queueMicrotask(()=>{this.#it=!1,this.grid&&this.#De&&this.#f.refreshVirtualWindow?.(!0,!0)}))}}function Ui(e){const t=/* @__PURE__ */new Set(["cell","row","column","range"]);if("string"==typeof e){if(!t.has(e))throw new Error(`[SelectionPlugin] Invalid selection mode: "${e}". Expected one of: 'cell' | 'row' | 'column' | 'range'.`);return{primary:e,columnEnabled:"column"===e,bothAxes:!1}}if(!Array.isArray(e))throw new Error(`[SelectionPlugin] Invalid selection mode: expected string or array, got ${typeof e}.`);if(0===e.length)throw new Error("[SelectionPlugin] Invalid selection mode: array must contain at least one mode.");for(const r of e)if(!t.has(r))throw new Error(`[SelectionPlugin] Invalid selection mode in array: "${r}". Expected one of: 'cell' | 'row' | 'column' | 'range'.`);if(new Set(e).size!==e.length)throw new Error(`[SelectionPlugin] Invalid selection mode: array contains duplicate entries (${e.join(", ")}).`);if(1===e.length)return Ui(e[0]);if(e.length>2)throw new Error(`[SelectionPlugin] Invalid selection mode: arrays of more than 2 modes are not supported. Got [${e.join(", ")}].`);if(!e.includes("column"))throw new Error(`[SelectionPlugin] Invalid selection mode: [${e.join(", ")}]. Two-mode arrays must include 'column' (the only valid combinations are ['row','column'], ['cell','column'], ['range','column']). Other in-row modes don't compose meaningfully.`);const i=e.find(e=>"column"!==e);if("column"===i)throw new Error(`[SelectionPlugin] Invalid selection mode: [${e.join(", ")}].`);return{primary:i,columnEnabled:!0,bothAxes:!0}}function Yi(e){const t=[];for(const i of e)!0!==i.utility&&"string"==typeof i.field&&i.field.length>0&&t.push(i.field);return t}function Zi(e,t){return t.indexOf(e)}function Qi(e){return{startRow:Math.min(e.startRow,e.endRow),startCol:Math.min(e.startCol,e.endCol),endRow:Math.max(e.startRow,e.endRow),endCol:Math.max(e.startCol,e.endCol)}}function Xi(e){const t=Qi(e);return{from:{row:t.startRow,col:t.startCol},to:{row:t.endRow,col:t.endCol}}}function Ji(e,t,i){return i.some(i=>function(e,t,i){const r=Qi(i);return e>=r.startRow&&e<=r.endRow&&t>=r.startCol&&t<=r.endCol}(e,t,i))}function er(e){const t=[],i=Qi(e);for(let r=i.startRow;r<=i.endRow;r++)for(let e=i.startCol;e<=i.endCol;e++)t.push({row:r,col:e});return t}function tr(e,t){return{startRow:e.row,startCol:e.col,endRow:t.row,endCol:t.col}}function ir(e,t){const i=Qi(e),r=Qi(t);return i.startRow===r.startRow&&i.startCol===r.startCol&&i.endRow===r.endRow&&i.endCol===r.endCol}function rr(e){if("string"==typeof e)return e;if(Array.isArray(e)){const t=e.find(e=>"column"!==e);if(t)return t;if(e.includes("column"))return"column"}return"cell"}const nr="__tbw_checkbox";class or extends i{static manifest={queries:[{type:"getSelection",description:"Get the current selection state"},{type:"selectRows",description:"Select specific rows by index (row mode only)"},{type:"getSelectedRowIndices",description:"Get sorted array of selected row indices"},{type:"getSelectedRows",description:"Get actual row objects for the current selection (works in all modes)"},{type:"getSelectedColumns",description:"Get field names of selected columns (column mode only)"},{type:"selectColumns",description:"Select specific columns by field name (column mode only)"}],configRules:[{id:"selection/range-dblclick",severity:"warn",message:'"triggerOn: \'dblclick\'" has no effect when mode is "range".\n → Range selection uses drag interaction (mousedown → mousemove), not click events.\n → The "triggerOn" option only affects "cell" and "row" selection modes.',check:e=>"range"===rr(e.mode)&&"dblclick"===e.triggerOn},{id:"selection/column-checkbox",severity:"warn",message:'"checkbox: true" only renders in row mode.\n → Column selection has no checkbox UI; activate columns via Ctrl+Click on a header or Ctrl+Space on a focused cell.',check:e=>!!e.checkbox&&"row"!==rr(e.mode)}]};name="selection";styles='@layer tbw-plugins{tbw-grid{&.selecting .data-grid-row>.cell{user-select:none}&:has(.selection){user-select:none;&[data-selection-mode=row] .cell-focus,&[data-selection-mode=row] .row-focus,&[data-selection-mode=range] .cell-focus{outline:none}}.data-grid-row.row-focus{background-color:var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%));outline:none;position:relative;&:after{content:"";position:absolute;inset:0;pointer-events:none;border-width:0;border-style:var(--tbw-selection-border-style, var(--tbw-border-style));border-color:var(--tbw-range-border-color, var(--tbw-color-accent));border-top-width:var(--tbw-selection-border-width, var(--tbw-border-width));border-bottom-width:var(--tbw-selection-border-width, var(--tbw-border-width));z-index:26}+.data-grid-row.row-focus:after{border-top-width:0}&:has(+.data-grid-row.row-focus):after{border-bottom-width:0}>.cell.sticky-left,>.cell.sticky-right{background:linear-gradient(var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}}.data-grid-row.row-focus[data-selectable=false]{>.cell.sticky-left,>.cell.sticky-right{background:var(--tbw-color-row-alt)}}.data-grid-row>.cell.selected{background-color:var(--tbw-range-selection-bg);position:relative;&:after{content:"";position:absolute;inset:0;pointer-events:none;border:0 var(--tbw-selection-border-style, var(--tbw-border-style)) var(--tbw-range-border-color);z-index:1}&.top:after{border-top-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.bottom:after{border-bottom-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.first:after{border-left-width:var(--tbw-selection-border-width, var(--tbw-border-width))}&.last:after{border-right-width:var(--tbw-selection-border-width, var(--tbw-border-width))}}.data-grid-row[data-selectable=false]{cursor:not-allowed;opacity:.6;&.row-focus{background-color:var(--tbw-color-row-alt)}}.data-grid-row>.cell[data-selectable=false]{cursor:not-allowed;opacity:.6;&.selected{background-color:var(--tbw-selection-warning-bg, rgba(from var(--tbw-color-error) r g b / 50%))}}.tbw-selection-summary{font-size:var(--tbw-font-size-sm, .8125rem);color:var(--tbw-color-fg-muted);white-space:nowrap}.data-grid-row>.cell[data-field=__tbw_checkbox],.header-row>.cell[data-field=__tbw_checkbox]{text-align:center;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}.tbw-select-row-checkbox{pointer-events:none;margin:0;cursor:pointer}.tbw-checkbox-header{display:flex;justify-content:center;align-items:center;height:100%}.tbw-select-all-checkbox{margin:0;cursor:pointer}.header-row>.cell.column-selected,.data-grid-row>.cell.column-selected{background:linear-gradient(var(--tbw-column-selection-bg, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}.data-grid-row>.cell.column-selected.sticky-left,.data-grid-row>.cell.column-selected.sticky-right,.header-row>.cell.column-selected.sticky-left,.header-row>.cell.column-selected.sticky-right{background:linear-gradient(var(--tbw-column-selection-bg, rgba(from var(--tbw-color-accent) r g b / 12%)) 0 0),var(--tbw-color-panel-bg)}}}';get defaultConfig(){return{mode:"cell",triggerOn:"click",enabled:!0,multiSelect:!0}}selected=/* @__PURE__ */new Set;lastSelected=null;anchor=null;ranges=[];activeRange=null;cellAnchor=null;isDragging=!1;pendingKeyboardUpdate=null;pendingRowKeyUpdate=null;selectedCell=null;selectedColumns=/* @__PURE__ */new Set;columnAnchor=null;columnHead=null;activeAxis="none";#rt={primary:"cell",columnEnabled:!1,bothAxes:!1};lastSyncedFocusRow=-1;lastSyncedFocusCol=-1;announceTimer=null;explicitSelection=!1;isSelectionEnabled(){return!1!==this.config.enabled&&!1!==this.grid.effectiveConfig?.selectable}checkSelectable(e,t){const{isSelectable:i}=this.config;if(!i)return!0;const r=this.rows[e];if(!r)return!1;return i(r,e,void 0!==t?this.visibleColumns[t]:void 0,t)}isRowSelectable(e){return this.checkSelectable(e)}isCellSelectable(e,t){return this.checkSelectable(e,t)}attach(e){super.attach(e),this.#rt=Ui(this.config.mode),this.on("filter-change",()=>this.clearSelectionSilent()),this.on("group-toggle",()=>this.clearSelectionSilent()),this.on("tree-expand",()=>this.clearSelectionSilent()),this.on("sort-change",()=>this.clearSelectionSilent()),this.on("edit-open",({rowIndex:e,row:t})=>{this.isSelectionEnabled()&&(null==t||e<0||"row"===this.#rt.primary&&this.isRowSelectable(e)&&(this.selected.has(e)||(!1===this.config.multiSelect&&this.selected.clear(),this.selected.add(e),this.lastSelected=e,this.anchor=e,this.explicitSelection=!0,this.emit("selection-change",this.#nt()),this.requestAfterRender())))});let t=-1;e.addEventListener("data-change",e=>{const{sourceRowCount:i}=e.detail,r=this.selected.size>0||this.ranges.length>0||null!==this.selectedCell;-1!==t&&i!==t&&r&&this.clearSelectionSilent(),t=i},{signal:this.disconnectSignal})}handleQuery(e){if("getSelection"===e.type)return this.getSelection();if("getSelectedRowIndices"===e.type)return this.getSelectedRowIndices();if("getSelectedRows"===e.type)return this.getSelectedRows();if("selectRows"===e.type)return this.selectRows(e.context),!0;if("getSelectedColumns"===e.type)return this.getSelectedColumns();if("selectColumns"===e.type){const t=e.context;return this.#ot(t),!0}}detach(){const e=this.gridElement?.querySelector(".rows-body");e?.removeAttribute("aria-multiselectable"),this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.isDragging=!1,this.selectedCell=null,this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.pendingKeyboardUpdate=null,this.pendingRowKeyUpdate=null,this.lastSyncedFocusRow=-1,this.lastSyncedFocusCol=-1}clearSelectionSilent(){this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.selectedCell=null,this.lastSelected=null,this.anchor=null,this.lastSyncedFocusRow=-1,this.lastSyncedFocusCol=-1,"column"!==this.activeAxis&&(this.activeAxis="none"),this.requestAfterRender()}onCellClick(e){if(!this.isSelectionEnabled())return!1;const{rowIndex:t,colIndex:i,originalEvent:r}=e,{triggerOn:n="click"}=this.config,o=this.#rt.primary;if(r.type!==n)return!1;const s=e.column,l=s&&at(s);if("cell"===o){if(l)return!1;if(!this.isCellSelectable(t,i))return!1;const e=this.selectedCell;return e&&e.row===t&&e.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#nt()),this.requestAfterRender()),!1}if("row"===o){if(!this.isRowSelectable(t))return!1;const e=!1!==this.config.multiSelect,i=r.shiftKey&&e,n=(r.ctrlKey||r.metaKey)&&e,o=!0===s?.checkboxColumn;if(i&&null!==this.anchor){const e=Math.min(this.anchor,t),i=Math.max(this.anchor,t);n||this.selected.clear();for(let t=e;t<=i;t++)this.isRowSelectable(t)&&this.selected.add(t)}else if(n||o&&e)this.selected.has(t)?this.selected.delete(t):this.selected.add(t),this.anchor=t;else{if(1===this.selected.size&&this.selected.has(t))return!1;this.selected.clear(),this.selected.add(t),this.anchor=t}return this.lastSelected=t,this.explicitSelection=!0,this.emit("selection-change",this.#nt()),this.requestAfterRender(),!1}if("range"===o){if(l)return!1;if(!this.isCellSelectable(t,i))return!1;const e=r.shiftKey,n=(r.ctrlKey||r.metaKey)&&!1!==this.config.multiSelect;if(e&&this.cellAnchor){const e=tr(this.cellAnchor,{row:t,col:i}),r=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;if(r&&ir(r,e))return!1;n?this.ranges.length>0?this.ranges[this.ranges.length-1]=e:this.ranges.push(e):this.ranges=[e],this.activeRange=e}else if(n){const e={startRow:t,startCol:i,endRow:t,endCol:i};this.ranges.push(e),this.activeRange=e,this.cellAnchor={row:t,col:i}}else{const e={startRow:t,startCol:i,endRow:t,endCol:i};if(1===this.ranges.length&&ir(this.ranges[0],e))return!1;this.ranges=[e],this.activeRange=e,this.cellAnchor={row:t,col:i}}return this.emit("selection-change",this.#nt()),this.requestAfterRender(),!1}return!1}onKeyDown(e){if(!this.isSelectionEnabled())return!1;const t=this.#rt.primary,i=this.#rt.columnEnabled,r=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","Home","End","PageUp","PageDown"].includes(e.key);if(i&&(e.ctrlKey||e.metaKey)&&(" "===e.key||"Spacebar"===e.key)){const t=this.grid._focusCol,i=this.visibleColumns[t];if(i&&!at(i)&&"string"==typeof i.field)return e.preventDefault(),e.stopPropagation(),this.selectColumn(i.field,{toggle:!0}),!0}if(i&&"column"===this.activeAxis&&!1!==this.config.multiSelect&&(e.ctrlKey||e.metaKey)&&e.shiftKey&&("ArrowLeft"===e.key||"ArrowRight"===e.key)){const t=Yi(this.visibleColumns),i="ArrowLeft"===e.key?"left":"right",r=function(e,t,i){if(0===t.length)return null;if(null===e)return null;const r=Zi(e,t);if(r<0)return null;const n="left"===i?Math.max(0,r-1):Math.min(t.length-1,r+1);return n===r?null:t[n]}(this.columnHead,t,i);if(null!==r&&null!==this.columnAnchor)return e.preventDefault(),e.stopPropagation(),this.selectColumn(r,{range:!0}),!0}if("Escape"===e.key){return!this.grid.query("isEditing").some(Boolean)&&("column"===this.activeAxis?(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.emit("selection-change",this.#nt()),this.requestAfterRender(),!0):("cell"===t?this.selectedCell=null:"row"===t?(this.selected.clear(),this.anchor=null):"range"===t&&(this.ranges=[],this.activeRange=null,this.cellAnchor=null),this.emit("selection-change",this.#nt()),this.requestAfterRender(),!0))}if("cell"===t&&r)return queueMicrotask(()=>{const e=this.grid._focusRow,t=this.grid._focusCol;this.isCellSelectable(e,t)?this.selectedCell={row:e,col:t}:this.selectedCell=null,this.emit("selection-change",this.#nt()),this.requestAfterRender()}),!1;if("row"===t){const t=!1!==this.config.multiSelect;if("ArrowUp"===e.key||"ArrowDown"===e.key||"PageUp"===e.key||"PageDown"===e.key||(e.ctrlKey||e.metaKey)&&("Home"===e.key||"End"===e.key)){const i=e.shiftKey&&t;return i&&null===this.anchor&&(this.anchor=this.grid._focusRow),this.explicitSelection=!0,this.pendingRowKeyUpdate={shiftKey:i},queueMicrotask(()=>this.requestAfterRender()),!1}if(t&&"a"===e.key&&(e.ctrlKey||e.metaKey)){return!this.grid.query("isEditing").some(Boolean)&&(e.preventDefault(),e.stopPropagation(),this.selectAll(),!0)}}if("range"===t&&r){const t="Tab"===e.key,i=e.shiftKey&&!t;return i&&!this.cellAnchor&&(this.cellAnchor={row:this.grid._focusRow,col:this.grid._focusCol}),this.pendingKeyboardUpdate={shiftKey:i},queueMicrotask(()=>this.requestAfterRender()),!1}if("range"===t&&!1!==this.config.multiSelect&&"a"===e.key&&(e.ctrlKey||e.metaKey)){return!this.grid.query("isEditing").some(Boolean)&&(e.preventDefault(),e.stopPropagation(),this.selectAll(),!0)}return!1}onCellMouseDown(e){if(!this.isSelectionEnabled())return;if("range"!==this.#rt.primary)return;if(void 0===e.rowIndex||void 0===e.colIndex)return;if(e.rowIndex<0)return;if(e.column&&at(e.column))return;if(!this.isCellSelectable(e.rowIndex,e.colIndex))return;if(e.originalEvent.shiftKey&&this.cellAnchor)return;this.isDragging=!0;const t=e.rowIndex,i=e.colIndex,r=(e.originalEvent.ctrlKey||e.originalEvent.metaKey)&&!1!==this.config.multiSelect,n={startRow:t,startCol:i,endRow:t,endCol:i};return!r&&1===this.ranges.length&&ir(this.ranges[0],n)?(this.cellAnchor={row:t,col:i},!0):(this.cellAnchor={row:t,col:i},r||(this.ranges=[]),this.ranges.push(n),this.activeRange=n,this.emit("selection-change",this.#nt()),this.requestAfterRender(),!0)}onCellMouseMove(e){if(!this.isSelectionEnabled())return;if("range"!==this.#rt.primary)return;if(!this.isDragging||!this.cellAnchor)return;if(void 0===e.rowIndex||void 0===e.colIndex)return;if(e.rowIndex<0)return;let t=e.colIndex;const i=this.visibleColumns[t];if(i&&at(i)){const e=this.visibleColumns.findIndex(e=>!at(e));e>=0&&(t=e)}const r=tr(this.cellAnchor,{row:e.rowIndex,col:t}),n=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;return n&&ir(n,r)||(this.ranges.length>0?this.ranges[this.ranges.length-1]=r:this.ranges.push(r),this.activeRange=r,this.emit("selection-change",this.#nt()),this.requestAfterRender()),!0}onCellMouseUp(e){if(this.isSelectionEnabled()&&"range"===this.#rt.primary)return this.isDragging?(this.isDragging=!1,!0):void 0}onHeaderClick(e){if(!this.isSelectionEnabled())return!1;if(!this.#rt.columnEnabled)return!1;if(e.column&&at(e.column))return!1;const t=e.originalEvent;if(!(t.ctrlKey||t.metaKey))return!1;const i=e.field;if(!i)return!1;t.preventDefault(),"function"==typeof t.stopPropagation&&t.stopPropagation();const r=!0===t.shiftKey&&!1!==this.config.multiSelect&&null!==this.columnAnchor;return this.selectColumn(i,r?{range:!0}:{toggle:!0}),!0}processColumns(e){if(this.config.checkbox&&"row"===this.#rt.primary){if(e.some(e=>e.field===nr))return e;const t=this.#st(),i=e.findIndex(lt),r=i>=0?i+1:0;return[...e.slice(0,r),t,...e.slice(r)]}return e}#st(){return{field:nr,header:"",width:32,resizable:!1,sortable:!1,lockPosition:!0,utility:!0,checkboxColumn:!0,headerRenderer:()=>{const e=document.createElement("div");if(e.className="tbw-checkbox-header",!1===this.config.multiSelect)return e;const t=document.createElement("input");return t.type="checkbox",t.className="tbw-select-all-checkbox",t.addEventListener("click",e=>{e.stopPropagation(),e.target.checked?this.selectAll():this.clearSelection()}),e.appendChild(t),e},renderer:e=>{const t=document.createElement("input");t.type="checkbox",t.className="tbw-select-row-checkbox";const i=e.cellEl;if(i){const e=parseInt(i.getAttribute("data-row")??"-1",10);e>=0&&(t.checked=this.selected.has(e))}return t}}}#lt(e){e.querySelectorAll(".tbw-select-row-checkbox").forEach(e=>{const t=e.closest(".cell"),i=t?T(t):-1;i>=0&&(e.checked=this.selected.has(i))});const t=e.querySelector(".tbw-select-all-checkbox");if(t){const e=this.rows.length;let i=0;if(this.config.isSelectable)for(let t=0;t<e;t++)this.isRowSelectable(t)&&i++;else i=e;const r=i>0&&this.selected.size>=i,n=this.selected.size>0;t.checked=r,t.indeterminate=n&&!r}}#at(e){const t=this.grid._focusRow,i=this.grid._focusCol;if("row"===e){if(this.explicitSelection)return this.explicitSelection=!1,void(this.lastSyncedFocusRow=t);t!==this.lastSyncedFocusRow&&(this.lastSyncedFocusRow=t,this.isRowSelectable(t)&&(this.selected.has(t)&&1===this.selected.size||(this.selected.clear(),this.selected.add(t),this.lastSelected=t,this.anchor=t,this.emit("selection-change",this.#nt()))))}if("cell"===e){if(this.explicitSelection)return this.explicitSelection=!1,this.lastSyncedFocusRow=t,void(this.lastSyncedFocusCol=i);if((t!==this.lastSyncedFocusRow||i!==this.lastSyncedFocusCol)&&(this.lastSyncedFocusRow=t,this.lastSyncedFocusCol=i,this.isCellSelectable(t,i))){const e=this.selectedCell;e&&e.row===t&&e.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#nt()))}}}#dt(){const e=this.gridElement;if(!e)return;const t=this.#rt.primary,i=this.#rt.columnEnabled,r=!!this.config.isSelectable,n=e.querySelector(".rows-body");if(n){const e=!1!==this.config.multiSelect;n.setAttribute("aria-multiselectable",e?"true":"false")}e.querySelectorAll(".cell").forEach(e=>{const t=e.classList.contains(w.SELECTED)||e.classList.contains("column-selected");e.classList.remove(w.SELECTED,"top","bottom","first","last","column-selected"),t&&e.removeAttribute("aria-selected"),r&&e.removeAttribute("data-selectable")});const o=e.querySelectorAll(".data-grid-row");if(o.forEach(e=>{e.classList.remove(w.SELECTED,"row-focus"),e.setAttribute("aria-selected","false"),r&&e.removeAttribute("data-selectable")}),i){e.querySelectorAll(".header-row > .cell").forEach(e=>{e.classList.remove("column-selected"),e.removeAttribute("aria-selected")})}if("row"===t&&(L(e),o.forEach(e=>{const t=e.querySelector(".cell[data-row]"),i=T(t);i>=0&&(r&&!this.isRowSelectable(i)&&e.setAttribute("data-selectable","false"),this.selected.has(i)&&(e.classList.add(w.SELECTED,"row-focus"),e.setAttribute("aria-selected","true")))}),this.config.checkbox&&this.#lt(e)),("cell"===t||"range"===t)&&r){e.querySelectorAll(".cell[data-row][data-col]").forEach(e=>{const t=parseInt(e.getAttribute("data-row")??"-1",10),i=parseInt(e.getAttribute("data-col")??"-1",10);t>=0&&i>=0&&(this.isCellSelectable(t,i)||e.setAttribute("data-selectable","false"))})}if("range"===t&&this.ranges.length>0){L(e);const t=this.ranges.map(Qi),i=(e,i)=>{for(const r of t)if(e>=r.startRow&&e<=r.endRow&&i>=r.startCol&&i<=r.endCol)return!0;return!1};e.querySelectorAll(".cell[data-row][data-col]").forEach(e=>{const t=parseInt(e.getAttribute("data-row")??"-1",10),r=parseInt(e.getAttribute("data-col")??"-1",10);if(t>=0&&r>=0){const n=this.visibleColumns[r];if(n&&at(n))return;i(t,r)&&(e.classList.add(w.SELECTED),e.setAttribute("aria-selected","true"),i(t-1,r)||e.classList.add("top"),i(t+1,r)||e.classList.add("bottom"),i(t,r-1)||e.classList.add("first"),i(t,r+1)||e.classList.add("last"))}})}if(i&&this.selectedColumns.size>0){const t=this.visibleColumns.map(e=>"string"==typeof e.field?e.field:void 0);e.querySelectorAll(".header-row > .cell[data-col]").forEach(e=>{const i=parseInt(e.getAttribute("data-col")??"-1",10),r=i>=0?t[i]:void 0;r&&this.selectedColumns.has(r)&&(e.classList.add("column-selected"),e.setAttribute("aria-selected","true"))});e.querySelectorAll(".cell[data-col]:not(.header-row .cell)").forEach(e=>{if(e.closest(".header-row"))return;const i=parseInt(e.getAttribute("data-col")??"-1",10);if(i<0)return;const r=this.visibleColumns[i];if(!r||at(r))return;const n=t[i];n&&this.selectedColumns.has(n)&&(e.classList.add("column-selected"),e.setAttribute("aria-selected","true"))})}}afterRender(){if(!this.isSelectionEnabled())return;const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-grid-root"),i=this.#rt.primary;if(this.pendingRowKeyUpdate&&"row"===i){const{shiftKey:e}=this.pendingRowKeyUpdate;this.pendingRowKeyUpdate=null;const t=this.grid._focusRow;if(e&&null!==this.anchor){this.selected.clear();const e=Math.min(this.anchor,t),i=Math.max(this.anchor,t);for(let t=e;t<=i;t++)this.isRowSelectable(t)&&this.selected.add(t)}else this.isRowSelectable(t)?(this.selected.clear(),this.selected.add(t),this.anchor=t):this.selected.clear();this.lastSelected=t,this.emit("selection-change",this.#nt())}if(this.pendingKeyboardUpdate&&"range"===i){const{shiftKey:e}=this.pendingKeyboardUpdate;this.pendingKeyboardUpdate=null;const t=this.grid._focusRow,i=this.grid._focusCol;if(e&&this.cellAnchor){const e=tr(this.cellAnchor,{row:t,col:i});this.ranges=[e],this.activeRange=e}else e||(this.ranges=[],this.activeRange=null,this.cellAnchor={row:t,col:i});this.emit("selection-change",this.#nt())}this.#at(i),this.gridElement.setAttribute("data-selection-mode",i),t&&t.classList.toggle("selecting",this.isDragging),this.#dt()}onScrollRender(){this.isSelectionEnabled()&&this.#dt()}getSelection(){const e=this.#nt();return{mode:this.config.mode,activeAxis:e.activeAxis,ranges:e.ranges,selectedColumns:e.selectedColumns,anchor:this.cellAnchor}}getSelectedCells(){return function(e){const t=/* @__PURE__ */new Map;for(const i of e)for(const e of er(i))t.set(`${e.row},${e.col}`,e);return[...t.values()]}(this.ranges)}isCellSelected(e,t){return Ji(e,t,this.ranges)}selectAll(){const{mode:e,multiSelect:t}=this.config;if(!1!==t)if("row"===e){this.selected.clear();for(let e=0;e<this.rows.length;e++)this.isRowSelectable(e)&&this.selected.add(e);this.explicitSelection=!0,this.emit("selection-change",this.#nt()),this.requestAfterRender()}else if("range"===e){const e=this.rows.length,t=this.columns.length;if(e>0&&t>0){const i={startRow:0,startCol:0,endRow:e-1,endCol:t-1};this.ranges=[i],this.activeRange=i,this.emit("selection-change",this.#nt()),this.requestAfterRender()}}}selectRows(e){if("row"!==this.#rt.primary)return;const t=!1===this.config.multiSelect&&e.length>1?[e[e.length-1]]:e;this.selected.clear();for(const i of t)i>=0&&i<this.rows.length&&this.isRowSelectable(i)&&this.selected.add(i);this.anchor=t.length>0?t[t.length-1]:null,this.explicitSelection=!0,this.emit("selection-change",this.#nt()),this.requestAfterRender()}getSelectedRowIndices(){return[...this.selected].sort((e,t)=>e-t)}getSelectedRows(){const e=this.#rt.primary,t=this.rows;if("row"===e)return this.getSelectedRowIndices().filter(e=>e>=0&&e<t.length).map(e=>t[e]);if("cell"===e&&this.selectedCell){const{row:e}=this.selectedCell;return e>=0&&e<t.length?[t[e]]:[]}if("range"===e&&this.ranges.length>0){const e=/* @__PURE__ */new Set;for(const i of this.ranges){const r=Math.max(0,Math.min(i.startRow,i.endRow)),n=Math.min(t.length-1,Math.max(i.startRow,i.endRow));for(let t=r;t<=n;t++)e.add(t)}return[...e].sort((e,t)=>e-t).map(e=>t[e])}return[]}#ot(e){if(!this.#rt.columnEnabled)return;const t=Yi(this.visibleColumns),i=new Set(t),r=[],n=/* @__PURE__ */new Set;for(const s of e)i.has(s)&&!n.has(s)&&(n.add(s),r.push(s));this.#ct("column"),this.selectedColumns.clear();for(const s of r)this.selectedColumns.add(s);const o=r.length>0?r[r.length-1]:null;this.columnAnchor=o,this.columnHead=o,this.activeAxis=this.selectedColumns.size>0?"column":"none",this.emit("selection-change",this.#nt()),this.requestAfterRender()}selectColumn(e,t={}){if(!this.#rt.columnEnabled)return;const i=Yi(this.visibleColumns);if(!i.includes(e))return;this.#ct("column");if(!1!==this.config.multiSelect)if(t.range&&this.columnAnchor){const t=function(e,t,i){const r=Zi(e,i),n=Zi(t,i);if(-1===r||-1===n)return[];const o=Math.min(r,n),s=Math.max(r,n);return i.slice(o,s+1)}(this.columnAnchor,e,i);this.selectedColumns.clear();for(const e of t)this.selectedColumns.add(e);this.columnHead=e}else t.toggle?(this.selectedColumns.has(e)?this.selectedColumns.delete(e):this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e):(this.selectedColumns.clear(),this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e);else this.selectedColumns.clear(),this.selectedColumns.add(e),this.columnAnchor=e,this.columnHead=e;this.activeAxis=this.selectedColumns.size>0?"column":"none",this.emit("selection-change",this.#nt()),this.requestAfterRender()}deselectColumn(e){this.#rt.columnEnabled&&this.selectedColumns.delete(e)&&(0===this.selectedColumns.size&&(this.columnAnchor=null,this.columnHead=null,"column"===this.activeAxis&&(this.activeAxis="none")),this.emit("selection-change",this.#nt()),this.requestAfterRender())}selectAllColumns(){if(!this.#rt.columnEnabled)return;if(!1===this.config.multiSelect)return;const e=Yi(this.visibleColumns);if(0!==e.length){this.#ct("column"),this.selectedColumns.clear();for(const t of e)this.selectedColumns.add(t);this.columnAnchor=e[0],this.columnHead=e[e.length-1],this.activeAxis="column",this.emit("selection-change",this.#nt()),this.requestAfterRender()}}clearColumnSelection(){0!==this.selectedColumns.size&&(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,"column"===this.activeAxis&&(this.activeAxis="none"),this.emit("selection-change",this.#nt()),this.requestAfterRender())}getSelectedColumns(){if(0===this.selectedColumns.size)return[];return Yi(this.visibleColumns).filter(e=>this.selectedColumns.has(e))}clearSelection(){this.selectedCell=null,this.selected.clear(),this.anchor=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.activeAxis="none",this.emit("selection-change",this.#nt()),this.requestAfterRender()}setRanges(e){this.ranges=e.map(e=>({startRow:e.from.row,startCol:e.from.col,endRow:e.to.row,endCol:e.to.col})),this.activeRange=this.ranges.length>0?this.ranges[this.ranges.length-1]:null,this.emit("selection-change",this.#nt()),this.requestAfterRender()}#nt(){const e=this.#rt.primary,t="row"===e&&this.selected.size>0||"cell"===e&&null!==this.selectedCell||"range"===e&&this.ranges.length>0;let i;this.#rt.bothAxes&&t&&this.selectedColumns.size>0&&(this.selectedColumns.clear(),this.columnAnchor=null,this.columnHead=null,this.gridElement&&a(this.gridElement,d(this.gridElement,"selectionAxisChanged","row"))),i=t?"row"===e?"row":"cell"===e?"cell":"range":this.selectedColumns.size>0?"column":"none",this.activeAxis=i;const r=function(e,t,i,r,n,o){if("column"===t&&r.selectedColumns.size>0)return{mode:e,activeAxis:"column",ranges:[],selectedColumns:o.filter(e=>r.selectedColumns.has(e))};if("cell"===i&&r.selectedCell)return{mode:e,activeAxis:"cell",ranges:[{from:{row:r.selectedCell.row,col:r.selectedCell.col},to:{row:r.selectedCell.row,col:r.selectedCell.col}}],selectedColumns:[]};if("row"===i&&r.selected.size>0){const t=[...r.selected].sort((e,t)=>e-t),i=[];let o=t[0],s=o;for(let e=1;e<t.length;e++)t[e]===s+1?s=t[e]:(i.push({from:{row:o,col:0},to:{row:s,col:n-1}}),o=t[e],s=o);return i.push({from:{row:o,col:0},to:{row:s,col:n-1}}),{mode:e,activeAxis:"row",ranges:i,selectedColumns:[]}}return"range"===i&&r.ranges.length>0?{mode:e,activeAxis:"range",ranges:(s=r.ranges,s.map(Xi)),selectedColumns:[]}:{mode:e,activeAxis:"none",ranges:[],selectedColumns:[]};var s}(this.config.mode,i,e,{selectedCell:this.selectedCell,selected:this.selected,ranges:this.ranges,selectedColumns:this.selectedColumns},this.columns.length,Yi(this.visibleColumns));return this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=setTimeout(()=>{if("column"===r.activeAxis){const e=r.selectedColumns;if(1===e.length){const t=e[0],i=this.columns.find(e=>e.field===t),r="string"==typeof i?.header&&i.header||t;a(this.gridElement,d(this.gridElement,"columnSelected",r))}else e.length>1?a(this.gridElement,d(this.gridElement,"columnSelectionChanged",e.length)):a(this.gridElement,d(this.gridElement,"columnSelectionCleared"))}else{const e="row"===r.activeAxis?this.selected.size:r.ranges.length;e>0&&a(this.gridElement,d(this.gridElement,"selectionChanged",e))}},150),r}#ct(e){if(this.#rt.bothAxes&&"column"===e){if(!(this.selected.size>0||null!==this.selectedCell||this.ranges.length>0))return;this.selected.clear(),this.lastSelected=null,this.anchor=null,this.selectedCell=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.gridElement&&a(this.gridElement,d(this.gridElement,"selectionAxisChanged","column"))}}}function sr(e,t){return Math.floor(e/t)}function lr(){return new DOMException("Aborted","AbortError")}function ar(e,t,i,r,n){const o=function(e,t){return{start:e*t,end:(e+1)*t}}(t,i);return function(e,t){return t.aborted?Promise.reject(lr()):"object"!=typeof(i=e)||null===i||"function"!=typeof i.subscribe||"function"==typeof i.then?new Promise((i,r)=>{const n=()=>r(lr());t.addEventListener("abort",n,{once:!0}),Promise.resolve(e).then(e=>{t.removeEventListener("abort",n),i(e)},e=>{t.removeEventListener("abort",n),r(e)})}):new Promise((i,r)=>{let n=!1;const o=e.subscribe({next:e=>{n||(n=!0,i(e),o.unsubscribe())},error:e=>{n||(n=!0,r(e))},complete:()=>{n||(n=!0,r(new Error("getRows observable completed without emitting a value")))}});n||t.addEventListener("abort",()=>{n||(n=!0,o.unsubscribe(),r(lr()))},{once:!0})});var i}(e.getRows({startNode:o.start,endNode:o.end,sortModel:r.sortModel,filterModel:r.filterModel,signal:n}),n)}function dr(e,t,i){const r=sr(e,t),n=i.get(r);if(!n)return;return n[e%t]}class cr extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:-10},incompatibleWith:[{name:"pivot",reason:"PivotPlugin requires the full dataset to compute aggregations. ServerSidePlugin lazy-loads rows in blocks, so pivot aggregation cannot be performed client-side."}],events:[{type:"datasource:data",description:"Root data page/block loaded"},{type:"datasource:children",description:"Child data loaded for a parent context"},{type:"datasource:loading",description:"Loading state changed"},{type:"datasource:error",description:"Fetch operation failed"}],queries:[{type:"datasource:fetch-children",description:"Request child rows for a parent context"},{type:"datasource:is-active",description:"Check if ServerSide plugin has an active data source"}]};name="serverSide";get defaultConfig(){return{pageSize:100,cacheBlockSize:100,maxConcurrentRequests:2}}dataSource=null;totalNodeCount=0;infiniteScrollMode=!1;loadedBlocks=/* @__PURE__ */new Map;loadingBlocks=/* @__PURE__ */new Set;blockControllers=/* @__PURE__ */new Map;lastRequestId=0;scrollDebounceTimer;managedNodes=[];attach(e){super.attach(e),this.on("sort-change",()=>{"local"===this.config.sortMode?this.requestRender():this.onModelChange()}),this.on("filter-change",()=>{"local"===this.config.filterMode?this.requestRender():this.onModelChange()}),this.config.dataSource&&this.setDataSource(this.config.dataSource)}detach(){this.dataSource=null,this.totalNodeCount=0,this.infiniteScrollMode=!1,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.abortAllBlocks(),this.managedNodes=[],this.lastRequestId=0,this.scrollDebounceTimer&&(clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=void 0)}abortAllBlocks(){for(const e of this.blockControllers.values())e.abort();this.blockControllers.clear()}getEnrichmentParams(){const e="local"===this.config.sortMode,t="local"===this.config.filterMode,i=e?void 0:this.grid?.query?.("sort:get-model",null),r=t?void 0:this.grid?.query?.("filter:get-model",null);let n=i?.[0];const o=this.grid;if(!e&&!n&&o?._sortState){const{field:e,direction:t}=o._sortState;n=[{field:e,direction:1===t?"asc":"desc"}]}return{sortModel:n,filterModel:r?.[0]}}getViewportMapping(e,t){const i={viewportStart:e,viewportEnd:t},r=this.grid?.query?.("datasource:viewport-mapping",i);return r?.[0]?r[0]:{startNode:e,endNode:t,totalLoadedNodes:this.totalNodeCount}}onModelChange(){this.dataSource&&(this.abortAllBlocks(),this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1,this.requestRender(),this.loadRequiredBlocks())}applyServerResult(e,t,i){void 0!==e.lastNode?(this.totalNodeCount=e.lastNode+1,this.infiniteScrollMode=!1):-1===e.totalNodeCount?this.infiniteScrollMode=!0:(this.totalNodeCount=e.totalNodeCount,this.infiniteScrollMode=!1),this.infiniteScrollMode&&e.rows.length<i&&(this.totalNodeCount=t*i+e.rows.length,this.infiniteScrollMode=!1)}getInfiniteScrollEstimate(e){let t=0;for(const[i,r]of this.loadedBlocks){const n=i*e+r.length;n>t&&(t=n)}return t+e}loadRequiredBlocks(){if(!this.dataSource)return;const e=this.grid,t=this.config.cacheBlockSize??100,i=this.getViewportMapping(e._virtualization.start,e._virtualization.end),r=Math.max(0,this.config.loadThreshold??0),n=Math.max(0,i.startNode-r),o=this.totalNodeCount>0?this.totalNodeCount:1/0,s=Math.min(o,i.endNode+r);if(s<=n)return;const l=function(e,t,i){const r=sr(e,i),n=sr(t-1,i),o=[];for(let s=r;s<=n;s++)o.push(s);return o}(n,s,t),a=this.getEnrichmentParams(),d=this.grid?.getAttribute?.("id")??void 0;for(const c of l){if(this.loadedBlocks.has(c)||this.loadingBlocks.has(c))continue;if(this.loadingBlocks.size>=(this.config.maxConcurrentRequests??2)){F(q,"Concurrent request limit reached, deferring block load",d);break}this.loadingBlocks.add(c);const e=new AbortController;this.blockControllers.set(c,e),this.broadcast("datasource:loading",{loading:!0}),ar(this.dataSource,c,t,a,e.signal).then(i=>{if(this.blockControllers.delete(c),e.signal.aborted)return this.loadingBlocks.delete(c),void(0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1}));this.loadedBlocks.set(c,i.rows);const r=this.managedNodes.length;this.applyServerResult(i,c,t),this.loadingBlocks.delete(c);const n=c*t;for(let e=0;e<i.rows.length;e++)n+e<this.managedNodes.length&&(this.managedNodes[n+e]=i.rows[e]);const o={rows:i.rows,totalNodeCount:i.totalNodeCount,startNode:n,endNode:n+i.rows.length,claimed:!1};this.broadcast("datasource:data",o),0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1});0===r||this.managedNodes.length<(Number.isFinite(this.totalNodeCount)?this.totalNodeCount:0)?this.requestRender():this.requestVirtualRefresh(),this.loadRequiredBlocks()}).catch(t=>{if(this.blockControllers.delete(c),this.loadingBlocks.delete(c),e.signal.aborted)return void(0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1}));const i=t instanceof Error?t:new Error(String(t));k(G,`getRows() failed: ${i.message}`,d),this.broadcast("datasource:error",{error:i}),0===this.loadingBlocks.size&&this.broadcast("datasource:loading",{loading:!1})})}}processRows(e){if(!this.dataSource)return[...e];const t=this.config.cacheBlockSize??100,i=this.infiniteScrollMode?this.getInfiniteScrollEstimate(t):Number.isFinite(this.totalNodeCount)&&this.totalNodeCount>=0?this.totalNodeCount:0;for(;this.managedNodes.length<i;){const e=this.managedNodes.length;this.managedNodes.push({__loading:!0,__index:e})}this.managedNodes.length=i;for(let n=0;n<i;n++){const e=dr(n,t,this.loadedBlocks);e&&(this.managedNodes[n]=e)}const r=this.grid;if("local"===this.config.sortMode&&r?._sortState){const e=r._columns??[],t=(r.effectiveConfig?.sortHandler??D)(this.managedNodes,r._sortState,e);return t&&"function"==typeof t.then?(t.catch(()=>{}),this.managedNodes):t}return this.managedNodes}onScroll(e){this.dataSource&&(this.loadRequiredBlocks(),this.scrollDebounceTimer&&clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=setTimeout(()=>{this.loadRequiredBlocks()},100))}handleQuery(e){switch(e.type){case"datasource:is-active":return null!=this.dataSource;case"datasource:fetch-children":{const{context:t}=e.context;return void this.fetchChildren(t)}}}fetchChildren(t){if(!this.dataSource)return;const i=this.grid?.getAttribute?.("id")??void 0;if(!this.dataSource.getChildRows)return void e(M,`Plugin "${t.source}" requested child rows but getChildRows() is not implemented on the dataSource`,i);const r=this.getEnrichmentParams();this.broadcast("datasource:loading",{loading:!0,context:t}),this.dataSource.getChildRows({context:t,sortModel:r.sortModel,filterModel:r.filterModel}).then(e=>{const i={rows:e.rows,context:t,claimed:!1};this.broadcast("datasource:children",i),this.broadcast("datasource:loading",{loading:!1,context:t})}).catch(e=>{const r=e instanceof Error?e:new Error(String(e));k(N,`getChildRows() failed: ${r.message}`,i),this.broadcast("datasource:error",{error:r,context:t}),this.broadcast("datasource:loading",{loading:!1,context:t})})}setDataSource(e){this.abortAllBlocks(),this.dataSource=e,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1;const t=this.config.cacheBlockSize??100,i=this.getEnrichmentParams(),r=this.grid?.getAttribute?.("id")??void 0,n=new AbortController;this.blockControllers.set(0,n),this.loadingBlocks.add(0),this.broadcast("datasource:loading",{loading:!0}),ar(e,0,t,i,n.signal).then(e=>{if(this.blockControllers.delete(0),this.loadingBlocks.delete(0),n.signal.aborted)return void this.broadcast("datasource:loading",{loading:!1});this.loadedBlocks.set(0,e.rows),this.applyServerResult(e,0,t);const i={rows:e.rows,totalNodeCount:e.totalNodeCount,startNode:0,endNode:e.rows.length,claimed:!1};this.broadcast("datasource:data",i),this.broadcast("datasource:loading",{loading:!1}),this.requestRender(),(this.config.loadThreshold??0)>0&&this.loadRequiredBlocks()}).catch(e=>{if(this.blockControllers.delete(0),this.loadingBlocks.delete(0),n.signal.aborted)return void this.broadcast("datasource:loading",{loading:!1});const t=e instanceof Error?e:new Error(String(e));k(G,`getRows() failed: ${t.message}`,r),this.broadcast("datasource:error",{error:t}),this.broadcast("datasource:loading",{loading:!1})})}refresh(){if(!this.dataSource)return;const e=this.dataSource;this.abortAllBlocks(),this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.managedNodes=[],this.totalNodeCount=0,this.infiniteScrollMode=!1,this.setDataSource(e)}purgeCache(){this.abortAllBlocks(),this.loadedBlocks.clear(),this.managedNodes=[]}getTotalNodeCount(){return this.totalNodeCount}getTotalRowCount(){return this.totalNodeCount}isNodeLoaded(e){const t=sr(e,this.config.cacheBlockSize??100);return this.loadedBlocks.has(t)}isRowLoaded(e){return this.isNodeLoaded(e)}getLoadedBlockCount(){return this.loadedBlocks.size}}class ur extends i{name="stickyRows";styles="@layer tbw-plugins{.tbw-sticky-rows{position:absolute;top:0;left:0;display:block;z-index:var(--tbw-z-layer-sticky-rows, 22);background:var(--tbw-color-bg, var(--tbw-color-panel-bg));min-width:100%;width:fit-content;overflow:visible}.tbw-sticky-rows:empty{display:none}.tbw-sticky-rows .tbw-sticky-row{box-shadow:0 1px 0 var(--tbw-color-border);background:var(--tbw-color-bg, var(--tbw-color-panel-bg))}.tbw-sticky-rows[data-mode=push] .tbw-sticky-row{will-change:transform}}";get defaultConfig(){return{mode:"push",maxStacked:1/0}}container=null;stickyIndices=[];cloneCache=/* @__PURE__ */new Map;displayedIndices=[];lastPushOffset=0;detach(){this.container?.remove(),this.container=null,this.cloneCache.clear(),this.stickyIndices=[],this.displayedIndices=[],this.lastPushOffset=0}afterRender(){this.recomputeStickyIndices(),this.ensureContainer(),this.primeCloneCache(),this.refreshDisplay()}onScrollRender(){this.primeCloneCache(),this.refreshClonesInWindow(),this.refreshDisplay()}onScroll(e){this.refreshDisplay(e.scrollTop)}resolvePredicate(){const e=this.config.isSticky;if("function"==typeof e)return e;if("string"==typeof e){const t=e;return e=>null!=e&&"object"==typeof e&&Boolean(e[t])}return()=>!1}recomputeStickyIndices(){const e=this.rows,t=this.resolvePredicate(),i=[];for(let r=0;r<e.length;r++)t(e[r],r)&&i.push(r);(i.length!==this.stickyIndices.length||i.some((e,t)=>e!==this.stickyIndices[t]))&&this.cloneCache.clear(),this.stickyIndices=i}ensureContainer(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".rows-viewport");t?this.container&&t.contains(this.container)||(this.container=document.createElement("div"),this.container.className="tbw-sticky-rows",this.container.setAttribute("role","presentation"),this.container.dataset.mode=this.config.mode??"push",this.config.className&&this.container.classList.add(this.config.className),t.insertBefore(this.container,t.firstChild)):this.container=null}offsetOf(e){const t=this.getVirtualState(),i=t?.positionCache;if(i&&i[e])return i[e].offset;return e*(t?.rowHeight??28)}heightOf(e){const t=this.getVirtualState(),i=t?.positionCache;return i&&i[e]?i[e].height:t?.rowHeight??28}getVirtualState(){return this.grid?._virtualization}getCurrentScrollTop(){const e=this.getVirtualState(),t=e?.container?.scrollTop;return"number"==typeof t?t:"number"!=typeof e?.start||"number"!=typeof e?.rowHeight||e.positionCache&&e.positionCache.length?e?.positionCache&&"number"==typeof e.start&&e.positionCache[e.start]?e.positionCache[e.start].offset:0:e.start*e.rowHeight}computeDisplay(e){if("stack"===this.config.mode){const t=this.config.maxStacked??1/0,i=[];let r=0;for(const n of this.stickyIndices)if(i.length<t){if(!(this.offsetOf(n)<e+r))break;i.push(n),r+=this.heightOf(n)}else{const t=this.heightOf(i[0]);if(!(this.offsetOf(n)<e+r-t))break;i.shift(),r-=t,i.push(n),r+=this.heightOf(n)}if(i.length===t&&i.length>0){const t=this.findNextSticky(i[i.length-1]);if(null!=t){const n=this.offsetOf(t)-(e+r);if(n<0){const e=this.heightOf(i[0]);return{indices:i,pushOffset:Math.min(-n,e)}}}}return{indices:i,pushOffset:0}}const t=[];for(const o of this.stickyIndices){if(!(this.offsetOf(o)<e))break;t.push(o)}if(0===t.length)return{indices:t,pushOffset:0};const i=t[t.length-1],r=this.findNextSticky(i);let n=0;if(null!=r){const t=this.heightOf(i),o=this.offsetOf(r)-e;o<t&&(n=t-Math.max(0,o))}return{indices:[i],pushOffset:n}}findRenderedRow(e){const t=this.gridElement;if(!t)return null;const i=t.querySelector(`.rows .data-grid-row .cell[data-row="${e}"]`);return i?.parentElement??null}buildClone(e){const t=this.findRenderedRow(e);if(!t)return this.cloneCache.get(e)??null;const i=t.cloneNode(!0);return i.classList.add("tbw-sticky-row"),i.removeAttribute("aria-rowindex"),i.setAttribute("aria-hidden","true"),i.dataset.stickyRow=String(e),i.classList.remove("row-focus","cell-focus"),i.querySelectorAll(".cell-focus, .row-focus").forEach(e=>e.classList.remove("cell-focus","row-focus")),i.removeAttribute("tabindex"),i.querySelectorAll("[tabindex]").forEach(e=>e.removeAttribute("tabindex")),this.cloneCache.set(e,i),i}refreshClonesInWindow(){if(this.displayedIndices.length)for(const e of this.displayedIndices){if(this.findRenderedRow(e)){const t=this.buildClone(e),i=this.container?.querySelector(`[data-sticky-row="${e}"]`);t&&i&&i!==t&&i.replaceWith(t)}}}primeCloneCache(){if(this.stickyIndices.length)for(const e of this.stickyIndices)this.findRenderedRow(e)&&this.buildClone(e)}refreshDisplay(e){if(!this.container)return;const t=e??this.getCurrentScrollTop(),{indices:i,pushOffset:r}=this.computeDisplay(t);this.container.dataset.mode!==this.config.mode&&(this.container.dataset.mode=this.config.mode??"push");if(!(i.length===this.displayedIndices.length&&i.every((e,t)=>e===this.displayedIndices[t]))){const e=document.createDocumentFragment(),t=[];for(const r of i){let i=this.cloneCache.get(r)??null;i=this.buildClone(r)??i,i&&(e.appendChild(i),t.push(r))}this.container.replaceChildren(e),this.displayedIndices=t}r!==this.lastPushOffset&&(this.container.style.transform=r>0?`translateY(${-r}px)`:"",this.lastPushOffset=r)}findNextSticky(e){for(const t of this.stickyIndices)if(t>e)return t;return null}}function hr(e){return e.scrollWidth>e.clientWidth}function gr(){return"function"==typeof HTMLElement.prototype?.showPopover}class pr extends i{name="tooltip";styles='@layer tbw-plugins{.tbw-tooltip-popover{margin:0;padding:var(--tbw-tooltip-padding, var(--tbw-spacing-sm, .375rem) var(--tbw-spacing-md, .5rem));background:var(--tbw-tooltip-bg, light-dark(#333338, #484850));color:var(--tbw-tooltip-fg, light-dark(#f5f5f5, #f0f0f0));border:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-radius:var(--tbw-tooltip-radius, var(--tbw-border-radius, .25rem));box-shadow:none;filter:var(--tbw-tooltip-shadow, drop-shadow(0 4px 4px rgba(0, 0, 0, .45)));font-family:var(--tbw-font-family, system-ui, sans-serif);font-size:var(--tbw-tooltip-font-size, var(--tbw-font-size-sm, .9285em));max-width:var(--tbw-tooltip-max-width, 300px);white-space:pre-line;word-wrap:break-word;overflow-wrap:break-word;pointer-events:none;z-index:10001}.tbw-tooltip-popover:after{content:"";position:absolute;width:var(--tbw-tooltip-arrow-size, 14px);height:var(--tbw-tooltip-arrow-size, 14px);left:var(--tbw-tooltip-arrow-offset, 16px);background:inherit;pointer-events:none}.tbw-tooltip-popover:not(.tbw-tooltip-above):after{top:calc(var(--tbw-tooltip-arrow-size, 14px) / -2);transform:rotate(45deg);border-top:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-left:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72))}.tbw-tooltip-popover.tbw-tooltip-above:after{bottom:calc(var(--tbw-tooltip-arrow-size, 14px) / -2);transform:rotate(45deg);border-bottom:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72));border-right:1px solid var(--tbw-tooltip-border, light-dark(#222226, #6a6a72))}@supports (anchor-name: --test){.tbw-tooltip-popover{position-anchor:--tbw-tooltip-anchor;top:calc(anchor(bottom) + 11px);left:anchor(left);position-try-fallbacks:--tbw-tooltip-flip-above}@position-try --tbw-tooltip-flip-above{top:auto;bottom:calc(anchor(top) + 11px)}}}';static manifest={ownedProperties:[{property:"cellTooltip",level:"column",description:'the "cellTooltip" column property'},{property:"headerTooltip",level:"column",description:'the "headerTooltip" column property'}],configRules:[]};#ut=null;#ht=null;#gt=!1;get#pt(){return!1!==this.config.header}get#ft(){return!1!==this.config.cell}attach(e){super.attach(e)}detach(){this.#mt(),this.#ut?.remove(),this.#ut=null,this.#gt=!1,super.detach()}afterRender(){this.#wt(),this.#bt()}#wt(){if(this.#ut)return;const e=document.createElement("div");e.className="tbw-tooltip-popover",e.setAttribute("popover","hint"),e.style.overflow="visible",e.style.margin="0",document.body.appendChild(e),this.#ut=e}#vt(e,t){if(this.#ut){if(this.#yt(),e.style.setProperty("anchor-name","--tbw-tooltip-anchor"),this.#ht=e,this.#ut.textContent=t,gr())try{this.#ut.showPopover()}catch{}"undefined"!=typeof CSS&&!0===CSS.supports?.("anchor-name","--test")?requestAnimationFrame(()=>this.#Ct(e)):this.#xt(e)}}#mt(){if(this.#ut){if(gr())try{this.#ut.hidePopover()}catch{}this.#ut.classList.remove("tbw-tooltip-above")}this.#yt()}#yt(){this.#ht&&("--tbw-tooltip-anchor"===this.#ht.style.getPropertyValue("anchor-name")&&this.#ht.style.removeProperty("anchor-name"),this.#ht=null)}#xt(e){if(!this.#ut)return;const t=e.getBoundingClientRect();this.#ut.style.position="fixed",this.#ut.style.left=`${t.left}px`;window.innerHeight-t.bottom<80?(this.#ut.style.top="",this.#ut.style.bottom=window.innerHeight-t.top+11+"px",this.#ut.classList.add("tbw-tooltip-above")):(this.#ut.style.top=`${t.bottom+11}px`,this.#ut.style.bottom="",this.#ut.classList.remove("tbw-tooltip-above"))}#Ct(e){if(!this.#ut)return;const t=e.getBoundingClientRect(),i=this.#ut.getBoundingClientRect();this.#ut.classList.toggle("tbw-tooltip-above",i.bottom<=t.top)}#bt(){if(this.#gt)return;const e=this.gridElement?.querySelector(".tbw-grid-root");e&&(this.#gt=!0,e.addEventListener("mouseover",e=>this.#Et(e),{signal:this.disconnectSignal}),e.addEventListener("mouseout",e=>this.#St(e),{signal:this.disconnectSignal}))}#Et(e){const t=e.target;if(!t?.closest)return;const i=t.closest('[part~="header-cell"]');if(i&&this.#pt)return void this.#Rt(i);const r=t.closest("[data-row][data-col]");r&&this.#ft&&!r.style.getPropertyValue("anchor-name")&&this.#At(r)}#St(e){const t=e.target;if(!t?.closest)return;const i=t.closest('[part~="header-cell"], [data-row][data-col]');if(!i)return;const r=e.relatedTarget;r&&i.contains(r)||this.#mt()}#Rt(e){const t=parseInt(e.getAttribute("data-col")??"-1",10);if(t<0)return;const i=this.visibleColumns[t];if(!i)return;const r=function(e,t){const i=e.headerTooltip;if(!1===i)return null;if("string"==typeof i)return i;if("function"==typeof i)return i({column:e,value:e.header??e.field});const r=t.querySelector("span:first-child")??t;return hr(r)&&r.textContent?.trim()||null}(i,e);r&&this.#vt(e,r)}#At(e){const t=parseInt(e.getAttribute("data-row")??"-1",10),i=parseInt(e.getAttribute("data-col")??"-1",10);if(t<0||i<0)return;const r=this.visibleColumns[i];if(!r)return;const n=this.rows[t],o=n?.[r.field],s=function(e,t,i,r,n){const o=e.cellTooltip;if(!1===o)return null;if("string"==typeof o)return o;if("function"==typeof o)return o({value:r,row:i,column:e,field:e.field,grid:n});return hr(t)&&t.textContent?.trim()||null}(r,e,n,o,this.grid);s&&this.#vt(e,s)}}function fr(e,t,i){return void 0!==e.id?String(e.id):i?`${i}-${t}`:String(t)}function mr(e,t){const i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i}function wr(e,t,i=null,r=0){const n=t.childrenField??"children",o=/* @__PURE__ */new Set;for(let s=0;s<e.length;s++){const l=e[s],a=fr(l,s,i),d=l[n];if(Array.isArray(d)&&d.length>0){o.add(a);const e=wr(d,t,a,r+1);for(const t of e)o.add(t)}}return o}function br(e,t,i,r=null,n=0){const o=i.childrenField??"children";for(let s=0;s<e.length;s++){const l=e[s],a=fr(l,s,r);if(a===t)return[a];const d=l[o];if(Array.isArray(d)&&d.length>0){const e=br(d,t,i,a,n+1);if(e)return[a,...e]}}return null}function vr(e,t,i,r){const n=br(e,t,i);if(!n)return r;const o=new Set(r);for(let s=0;s<n.length-1;s++)o.add(n[s]);return o}function yr(e,t){const i=Math.min(t,e.length-1);if(i<0)return 0;let r=i;for(;r>0&&e[r].depth>0;)r--;let n=0;for(let o=0;o<=r;o++)0===e[o].depth&&n++;return n-1}function Cr(e,t="children"){if(!Array.isArray(e)||0===e.length)return!1;for(const i of e){if(!i)continue;const e=i[t];if(Array.isArray(e)&&e.length>0)return!0;if(null!=e&&!Array.isArray(e)&&e)return!0}return!1}class xr extends i{static manifest={modifiesRowStructure:!0,hookPriority:{processRows:10},incompatibleWith:[{name:"groupingRows",reason:"Both plugins transform the entire row model. TreePlugin flattens nested hierarchies while GroupingRowsPlugin groups flat rows with synthetic headers. Use one approach per grid."},{name:"pivot",reason:"PivotPlugin replaces the entire row and column structure with aggregated pivot data. Tree hierarchy cannot coexist with pivot aggregation."}],events:[{type:"tree-expand",description:"Emitted when tree expansion state changes (toggle, expand all, collapse all). Broadcast to both DOM consumers and plugin bus."}],queries:[{type:"canMoveRow",description:"Returns false for rows with children (parent nodes cannot be reordered)"},{type:"datasource:viewport-mapping",description:"Translates flat viewport row indices to top-level node indices for ServerSide pagination."}]};static dependencies=[{name:"multiSort",required:!1,reason:"Queries sort model for coordinated tree sorting"},{name:"serverSide",required:!1,reason:"Consumes datasource events for lazy-loaded tree data"}];name="tree";styles='@layer tbw-plugins{tbw-grid{.cell[data-field=__tbw_expander]{border-inline-end:none!important;padding:0;display:flex;align-items:center;justify-content:flex-start}.header-row .cell[data-field=__tbw_expander]{display:none}.header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}.tree-cell-wrapper{display:inline-flex;align-items:center;vertical-align:middle;overflow:visible;padding-inline-start:calc(var(--tbw-tree-depth, 0) * var(--tbw-tree-indent-width, var(--tbw-tree-toggle-size, 1.25em)))}.tree-expander{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;box-sizing:border-box}.tree-toggle{cursor:pointer;user-select:none;display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-tree-toggle-size, 1.25em);height:var(--tbw-tree-toggle-size, 1.25em);flex-shrink:0}.tree-toggle:hover{color:var(--tbw-tree-accent, var(--tbw-color-accent))}.tree-spacer{width:var(--tbw-tree-toggle-size, 1.25em);height:var(--tbw-tree-toggle-size, 1.25em);display:inline-block;flex-shrink:0}.data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}.data-grid-row.tbw-tree-fade-in{animation:tbw-tree-fade-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}}@keyframes tbw-tree-slide-in{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes tbw-tree-fade-in{0%{opacity:0}to{opacity:1}}tbw-grid.tbw-tree-loading .rows-viewport:after{content:"";display:block;height:2px;background:linear-gradient(90deg,transparent,var(--tbw-color-accent, #2563eb),transparent);animation:tbw-tree-loading-bar 1s ease-in-out infinite;position:sticky;bottom:0;left:0;right:0}@keyframes tbw-tree-loading-bar{0%{transform:translate(-100%)}to{transform:translate(100%)}}}';get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=/* @__PURE__ */new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=/* @__PURE__ */new Map;previousVisibleKeys=/* @__PURE__ */new Set;keysToAnimate=/* @__PURE__ */new Set;sortState=null;loadingKeys=/* @__PURE__ */new Set;#kt=/* @__PURE__ */new WeakMap;#It=/* @__PURE__ */new WeakMap;originalTreeColumnRenderer;wrappedTreeColumnField;detach(){const e=this.gridElement?.querySelector(".rows-body");e?.setAttribute("role","grid"),this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null,this.loadingKeys.clear(),this.originalTreeColumnRenderer=void 0,this.wrappedTreeColumnField=void 0}handleQuery(e){if("canMoveRow"===e.type){const t=e.context,i=this.config.childrenField??"children",r=t?.[i];if(Array.isArray(r)&&r.length>0)return!1}if("datasource:viewport-mapping"===e.type){const{viewportStart:t,viewportEnd:i}=e.context;if(0===this.flattenedRows.length)return;return{startNode:yr(this.flattenedRows,t),endNode:yr(this.flattenedRows,i)+1,totalLoadedNodes:function(e){let t=0;for(const i of e)0===i.depth&&t++;return t}(this.flattenedRows)}}}attach(e){super.attach(e),this.on("datasource:data",e=>{const t=e;t.claimed||(t.claimed=!0)}),this.on("datasource:children",e=>{const t=e;if("tree"!==t.context?.source)return;t.claimed=!0;const i=t.context.parentNode;if(i){i[this.config.childrenField??"children"]=t.rows;const e=this.#kt.get(i)??String(i.id??"?");this.loadingKeys.delete(e),this.requestRender()}})}get animationStyle(){return!!this.isAnimationEnabled&&(this.config.animation??"slide")}detect(e){if(!this.config.autoDetect)return!1;const t=e,i=this.config.childrenField??function(e){if(!Array.isArray(e)||0===e.length)return null;const t=["children","items","nodes","subRows","nested"];for(const i of e)if(i&&"object"==typeof i)for(const e of t){const t=i[e];if(Array.isArray(t)&&t.length>0)return e}return null}(t)??"children";return Cr(t,i)}processRows(e){const t=this.config.childrenField??"children",i=e;if(0===i.length||!Cr(i,t))return this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),[...e];const r=this.resolveEffectiveSortState();this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=wr(i,this.config),this.initialExpansionDone=!0),this.flattenedRows=this.#_t(i,this.expandedKeys,r,null,0),this.#It=/* @__PURE__ */new WeakMap,this.rowKeyMap.clear(),this.keysToAnimate.clear();const n=/* @__PURE__ */new Set;for(const o of this.flattenedRows)this.rowKeyMap.set(o.key,o),this.#It.set(o.data,o),n.add(o.key),!this.previousVisibleKeys.has(o.key)&&o.depth>0&&this.keysToAnimate.add(o.key);return this.previousVisibleKeys=n,this.flattenedRows.map(e=>e.data)}#Tt(e,t,i){if(void 0!==e.id){const t=String(e.id);return this.#kt.set(e,t),t}const r=this.#kt.get(e);if(void 0!==r)return r;const n=i?`${i}-${t}`:String(t);return this.#kt.set(e,n),n}#_t(e,t,i,r,n){const o=this.config.childrenField??"children";for(let a=0;a<e.length;a++)this.#Tt(e[a],a,r);const s=i?this.#Lt(e,i.field,i.direction):e,l=[];for(let a=0;a<s.length;a++){const e=s[a],d=this.#Tt(e,a,r),c=e[o],u=Array.isArray(c)&&c.length>0,h=null!=c&&!Array.isArray(c)&&!!c,g=u||h,p=t.has(d);l.push({key:d,data:e,depth:n,hasChildren:g,isExpanded:p,parentKey:r,posInSet:a+1,setSize:s.length}),u&&p&&l.push(...this.#_t(c,t,i,d,n+1))}return l}#Lt(e,t,i){const r=this.grid,n=r?._columns??[],o={field:t,direction:i},s=[...e],l=(r?.effectiveConfig?.sortHandler??D)(s,o,n);return l&&"function"==typeof l.then?(l.catch(()=>{}),D(s,o,n)):l}requestLazyChildren(e){if(this.loadingKeys.has(e.key))return;const t=this.config.childrenField??"children",i=e.data[t];if(Array.isArray(i)&&i.length>0)return;const r=this.grid?.query?.("datasource:is-active",null);r&&(this.loadingKeys.add(e.key),this.grid.query("datasource:fetch-children",{context:{source:"tree",parentNode:e.data,nodePath:[e.key]}}))}resolveEffectiveSortState(){const e=this.grid?.query?.("sort:get-model",null);if(Array.isArray(e)&&e.length>0){const t=e[0];if(Array.isArray(t)&&t.length>0)return{field:t[0].field,direction:"desc"===t[0].direction?-1:1}}return this.sortState}processColumns(e){if(0===this.flattenedRows.length)return[...e];const t=[...e];if(0===t.length)return t;const{treeColumn:i}=this.config;let r=0;if(i){const e=t.findIndex(e=>e.field===i);e>=0&&(r=e)}const n=t[r],o=n.field;this.wrappedTreeColumnField!==o&&(this.originalTreeColumnRenderer=n.viewRenderer,this.wrappedTreeColumnField=o);const s=this.originalTreeColumnRenderer,l=()=>this.config,a=this.setIcon.bind(this);return t[r]={...n,viewRenderer:e=>{const{row:t,value:i}=e,{showExpandIcons:r=!0,indentWidth:n}=l(),o=this.#It.get(t),d=o?.depth??0,c=document.createElement("span");if(c.className="tree-cell-wrapper",c.style.setProperty("--tbw-tree-depth",String(d)),void 0!==n&&c.style.setProperty("--tbw-tree-indent-width",`${n}px`),r)if(o&&o.hasChildren){const e=document.createElement("span");e.className=`${w.TREE_TOGGLE}${o.isExpanded?` ${w.EXPANDED}`:""}`,a(e,o.isExpanded?"collapse":"expand"),e.setAttribute("data-tree-key",o.key),c.appendChild(e)}else{const e=document.createElement("span");e.className="tree-spacer",c.appendChild(e)}const u=document.createElement("span");if(u.className="tree-content",s){const t=s(e);t instanceof Node?u.appendChild(t):"string"==typeof t&&(u.innerHTML=t)}else u.textContent=null!=i?String(i):"";return c.appendChild(u),c}},t}onCellClick(e){const t=e.originalEvent?.target;if(!t?.classList.contains(w.TREE_TOGGLE))return!1;const i=t.getAttribute("data-tree-key");if(!i)return!1;const r=this.rowKeyMap.get(i);return!!r&&(this.expandedKeys=mr(this.expandedKeys,i),this.expandedKeys.has(i)&&this.requestLazyChildren(r),this.broadcast("tree-expand",{key:i,row:r.data,expanded:this.expandedKeys.has(i),depth:r.depth,expandedKeys:[...this.expandedKeys]}),this.requestRender(),!0)}onKeyDown(e){if(" "!==e.key)return;const t=this.grid._focusRow,i=this.flattenedRows[t];return i?.hasChildren?(e.preventDefault(),this.expandedKeys=mr(this.expandedKeys,i.key),this.expandedKeys.has(i.key)&&this.requestLazyChildren(i),this.broadcast("tree-expand",{key:i.key,row:i.data,expanded:this.expandedKeys.has(i.key),depth:i.depth,expandedKeys:[...this.expandedKeys]}),this.requestRenderWithFocus(),!0):void 0}onHeaderClick(e){if(0===this.flattenedRows.length||!e.column.sortable)return!1;const t=this.grid?.query?.("sort:get-model",null);if(Array.isArray(t)&&t.length>0)return!1;const{field:i}=e.column;this.sortState&&this.sortState.field===i?1===this.sortState.direction?this.sortState={field:i,direction:-1}:this.sortState=null:this.sortState={field:i,direction:1};const r=this.grid;return void 0!==r._sortState&&(r._sortState=this.sortState?{...this.sortState}:null),this.broadcast("sort-change",{field:i,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.gridElement?.querySelector(".rows-body");e&&"treegrid"!==e.getAttribute("role")&&e.setAttribute("role","treegrid");const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=this.animationStyle,r=!1!==i&&this.keysToAnimate.size>0,n="fade"===i?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const o of t.querySelectorAll(".data-grid-row")){const e=o.querySelector(".cell[data-row]"),t=e?parseInt(e.getAttribute("data-row")??"-1",10):-1,i=this.flattenedRows[t];i&&(o.setAttribute("aria-level",String(i.depth+1)),o.setAttribute("aria-setsize",String(i.setSize)),o.setAttribute("aria-posinset",String(i.posInSet)),i.hasChildren?o.setAttribute("aria-expanded",String(i.isExpanded)):o.hasAttribute("aria-expanded")&&o.removeAttribute("aria-expanded"),o.classList.toggle("tbw-row-expanded",i.hasChildren&&i.isExpanded),r&&i.key&&this.keysToAnimate.has(i.key)&&(o.classList.add(n),o.addEventListener("animationend",()=>o.classList.remove(n),{once:!0})))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e);const t=this.rowKeyMap.get(e);t&&this.requestLazyChildren(t),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=mr(this.expandedKeys,e);const t=this.rowKeyMap.get(e);t?(this.expandedKeys.has(e)&&this.requestLazyChildren(t),this.broadcast("tree-expand",{key:e,row:t.data,expanded:this.expandedKeys.has(e),depth:t.depth,expandedKeys:[...this.expandedKeys]})):this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}expandAll(){this.expandedKeys=wr(this.rows,this.config),this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}collapseAll(){this.expandedKeys=/* @__PURE__ */new Set,this.emitPluginEvent("tree-expand",{expandedKeys:[...this.expandedKeys]}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowMeta(e){return this.#It.get(e)}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=vr(this.rows,e,this.config,this.expandedKeys),this.requestRender()}}function Er(e,t,i){const r=[...e.undoStack,t];for(;r.length>i;)r.shift();return{undoStack:r,redoStack:[]}}function Sr(e){if(0===e.undoStack.length)return{newState:e,action:null};const t=[...e.undoStack],i=t.pop();return i?{newState:{undoStack:t,redoStack:[...e.redoStack,i]},action:i}:{newState:e,action:null}}function Rr(e){if(0===e.redoStack.length)return{newState:e,action:null};const t=[...e.redoStack],i=t.pop();return i?{newState:{undoStack:[...e.undoStack,i],redoStack:t},action:i}:{newState:e,action:null}}class Ar extends i{static dependencies=[{name:"editing",required:!0,reason:"UndoRedoPlugin tracks cell edit history"}];name="undoRedo";get defaultConfig(){return{maxHistorySize:100}}undoStack=[];redoStack=[];#Ft=!1;#Gt=null;#Dt(e,t){const i=this.rows[e.rowIndex];if(i){try{const r=this.grid.getRowId(i);if(r)return void this.grid.updateRow(r,{[e.field]:t})}catch{}i[e.field]=t}}#Mt(e){const t=this.grid,i=t._visibleColumns?.findIndex(t=>t.field===e.field)??-1;if(i<0)return;t._focusRow=e.rowIndex,t._focusCol=i;const r=t.findRenderedRowElement?.(e.rowIndex);if(!r)return;const n=r.querySelector(`.cell[data-col="${i}"]`);if(n?.classList.contains(w.EDITING)){const e=n.querySelector(P);e?.focus({preventScroll:!0})}}#Nt(e,t){if(this.#Ft=!0,"compound"===e.type){const i="undo"===t?[...e.actions].reverse():e.actions;for(const e of i)this.#Dt(e,"undo"===t?e.oldValue:e.newValue)}else this.#Dt(e,"undo"===t?e.oldValue:e.newValue);this.#Ft=!1}#qt(e){const t="compound"===e.type?e.actions[e.actions.length-1]:e;t&&this.#Mt(t)}attach(e){super.attach(e),this.on("cell-edit-committed",e=>{this.#Ft||this.recordEdit(e.rowIndex,e.field,e.oldValue,e.newValue)})}detach(){this.undoStack=[],this.redoStack=[],this.#Gt=null}onKeyDown(e){const t=(e.ctrlKey||e.metaKey)&&"z"===e.key&&!e.shiftKey,i=(e.ctrlKey||e.metaKey)&&("y"===e.key||"z"===e.key&&e.shiftKey);if(!t&&!i)return!1;const r=t?"undo":"redo";return this.#Pt(e.target)?(this.#zt(e.target,r),!0):(e.preventDefault(),this.#Ht(r),!0)}#Ht(e){const t={undoStack:this.undoStack,redoStack:this.redoStack},i="undo"===e?Sr(t):Rr(t);i.action&&(this.#Nt(i.action,e),this.undoStack=i.newState.undoStack,this.redoStack=i.newState.redoStack,this.emit(e,{action:i.action,type:e}),this.#qt(i.action),this.requestRenderWithFocus())}#Pt(e){return e instanceof Element&&!!e.closest('input, textarea, [contenteditable=""], [contenteditable="true"]')}#zt(e,t){const i="undo"===t?"historyUndo":"historyRedo";let r=!1;const n=e=>{e.inputType===i&&(r=!0)};e.addEventListener("beforeinput",n,{capture:!0}),queueMicrotask(()=>{e.removeEventListener("beforeinput",n,{capture:!0}),r||this.#Ht(t)})}recordEdit(e,t,i,r){const n=function(e,t,i,r){return{type:"cell-edit",rowIndex:e,field:t,oldValue:i,newValue:r,timestamp:Date.now()}}(e,t,i,r);if(this.#Gt)return void this.#Gt.push(n);const o=Er({undoStack:this.undoStack,redoStack:this.redoStack},n,this.config.maxHistorySize??100);this.undoStack=o.undoStack,this.redoStack=o.redoStack}beginTransaction(){this.#Gt&&p(z,"Transaction already in progress. Call endTransaction() first."),this.#Gt=[]}endTransaction(){const e=this.#Gt;if(e||p(H,"No transaction in progress. Call beginTransaction() first."),this.#Gt=null,0===e.length)return;const t=1===e.length?e[0]:{type:"compound",actions:e,timestamp:Date.now()};const i=Er({undoStack:this.undoStack,redoStack:this.redoStack},t,this.config.maxHistorySize??100);this.undoStack=i.undoStack,this.redoStack=i.redoStack}undo(){const e=Sr({undoStack:this.undoStack,redoStack:this.redoStack});return e.action&&(this.#Nt(e.action,"undo"),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.#qt(e.action),this.requestRenderWithFocus()),e.action}redo(){const e=Rr({undoStack:this.undoStack,redoStack:this.redoStack});return e.action&&(this.#Nt(e.action,"redo"),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.#qt(e.action),this.requestRenderWithFocus()),e.action}canUndo(){return{undoStack:this.undoStack,redoStack:this.redoStack}.undoStack.length>0}canRedo(){return{undoStack:this.undoStack,redoStack:this.redoStack}.redoStack.length>0}clearHistory(){const e={undoStack:[],redoStack:[]};this.undoStack=e.undoStack,this.redoStack=e.redoStack,this.#Gt=null}getUndoStack(){return[...this.undoStack]}getRedoStack(){return[...this.redoStack]}}class kr extends i{static dependencies=[{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];static manifest={queries:[{type:"getContextMenuItems",description:'Contributes "Hide column" item to the header context menu'}]};name="visibility";static PANEL_ID="columns";styles='@layer tbw-plugins{.tbw-visibility-content{display:flex;flex-direction:column;height:100%}.tbw-visibility-list{flex:1;overflow-y:auto;padding:var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem))}.tbw-visibility-row{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));padding:var(--tbw-menu-item-padding, .375rem .25rem);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem);border-radius:var(--tbw-border-radius, .25rem);position:relative}.tbw-visibility-row:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-row input[type=checkbox]{cursor:pointer}.tbw-visibility-row.locked span{color:var(--tbw-color-fg-muted)}.tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs, .625rem);letter-spacing:-2px;user-select:none;flex-shrink:0}.tbw-visibility-row.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-label{display:flex;align-items:center;gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem));flex:1;cursor:pointer}.tbw-visibility-row.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-row.drop-before:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-row.drop-after:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-show-all{margin:var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem));padding:var(--tbw-button-padding, .5rem .75rem);border:1px solid var(--tbw-visibility-border, var(--tbw-color-border));border-radius:var(--tbw-border-radius, .25rem);background:var(--tbw-visibility-btn-bg, var(--tbw-color-header-bg));color:var(--tbw-color-fg);cursor:pointer;font-size:var(--tbw-font-size-sm, .8125rem)}.tbw-visibility-show-all:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-group-header{display:flex;align-items:center;padding:var(--tbw-menu-item-padding, .375rem .25rem);font-size:var(--tbw-font-size-sm, .8125rem);font-weight:600;color:var(--tbw-color-fg);border-bottom:1px solid var(--tbw-color-border);margin-top:var(--tbw-spacing-sm, .25rem);position:relative}.tbw-visibility-group-header:first-child{margin-top:0}.tbw-visibility-group-header .tbw-visibility-label{gap:var(--tbw-panel-gap, var(--tbw-spacing-md, .5rem))}.tbw-visibility-group-header.reorderable{cursor:grab}.tbw-visibility-group-header.reorderable:hover{background:var(--tbw-visibility-hover, var(--tbw-color-row-hover))}.tbw-visibility-group-header .tbw-visibility-handle{cursor:grab;color:var(--tbw-color-fg-muted);font-size:var(--tbw-font-size-2xs, .625rem);letter-spacing:-2px;user-select:none;flex-shrink:0}.tbw-visibility-group-header.reorderable:hover .tbw-visibility-handle{color:var(--tbw-color-fg)}.tbw-visibility-group-header.dragging{opacity:.5;cursor:grabbing}.tbw-visibility-group-header.drop-before:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-group-header.drop-after:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--tbw-visibility-indicator, var(--tbw-color-accent))}.tbw-visibility-row--grouped{padding-left:calc(var(--tbw-panel-padding, var(--tbw-spacing-md, .5rem)) + .75rem)}}';get defaultConfig(){return{allowHideAll:!1}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;draggedGroupId=null;draggedGroupFields=[];clearDragClasses(e){e.querySelectorAll(".tbw-visibility-row, .tbw-visibility-group-header").forEach(e=>{e.classList.remove(w.DRAGGING,"drop-target","drop-before","drop-after")})}attach(e){super.attach(e),this.gridElement.addEventListener("column-move",()=>{this.columnListElement&&requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})},{signal:this.disconnectSignal})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}handleQuery(e){if("getContextMenuItems"===e.type){const t=e.context;if(!t.isHeader)return;const i=t.column;if(!i?.field)return;if(i.lockVisible||i.meta?.lockVisibility)return;return[{id:"visibility/hide-column",label:"Hide Column",icon:"👁",order:30,action:()=>this.hideColumn(i.field)}]}}getToolPanel(){return{id:kr.PANEL_ID,title:"Columns",icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}show(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(kr.PANEL_ID)||this.grid.toggleToolPanelSection(kr.PANEL_ID)}hide(){this.grid.closeToolPanel()}toggle(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(kr.PANEL_ID)}isColumnVisible(e){return this.grid.isColumnVisible(e)}setColumnVisible(e,t){this.grid.setColumnVisible(e,t)}getVisibleColumns(){return this.grid.getAllColumns().filter(e=>e.visible).map(e=>e.field)}getHiddenColumns(){return this.grid.getAllColumns().filter(e=>!e.visible).map(e=>e.field)}showAll(){this.grid.showAllColumns()}toggleColumn(e){this.grid.toggleColumnVisibility(e)}showColumn(e){this.setColumnVisible(e,!0)}hideColumn(e){this.setColumnVisible(e,!1)}getAllColumns(){return this.grid.getAllColumns()}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(kr.PANEL_ID)}renderPanelContent(e){const t=document.createElement("div");t.className="tbw-visibility-content";const i=document.createElement("div");i.className="tbw-visibility-list",t.appendChild(i);const r=document.createElement("button");return r.type="button",r.className="tbw-visibility-show-all",r.textContent="Show All",r.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(r),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!(!e||"function"!=typeof e.moveColumn)}canMoveColumn(e){const t=this.grid.columns.find(t=>t.field===e.field);if(!t)return!1;const i=this.grid.query("canMoveColumn",t);return i.length>0&&!i.includes(!1)}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(e=>!e.utility),r=this.grid.query("getColumnGrouping"),n=r?.flat().filter(e=>e&&e.fields.length>0)??[];if(0===n.length)return void this.renderFlatColumnList(i,t,e);const o=/* @__PURE__ */new Map;for(const l of n)for(const e of l.fields)o.set(e,l);const s=this.computeFragments(i,o);for(const l of s)if(l.group)this.renderGroupSection(l.group,l.columns,t,e);else{const r=i.indexOf(l.columns[0]);e.appendChild(this.createColumnRow(l.columns[0],r,t,e))}}computeFragments(e,t){const i=[];let r=null,n=[];for(const o of e){const e=t.get(o.field)??null;e&&r&&e.id===r.id?n.push(o):(n.length>0&&i.push({group:r,columns:n}),r=e,n=[o])}return n.length>0&&i.push({group:r,columns:n}),i}renderGroupSection(e,t,i,r){const n=t.map(e=>e.field),o=document.createElement("div");o.className="tbw-visibility-group-header",o.setAttribute("data-group-id",e.id),i&&(o.draggable=!0,o.classList.add("reorderable"),this.setupGroupDragListeners(o,e,n,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox";const a=t.filter(e=>e.visible).length,d=t.every(e=>e.lockVisible);a===t.length?(l.checked=!0,l.indeterminate=!1):0===a?(l.checked=!1,l.indeterminate=!1):(l.checked=!1,l.indeterminate=!0),l.disabled=d,l.addEventListener("change",()=>{const e=l.checked;for(const i of t)i.lockVisible||this.grid.setColumnVisible(i.field,e);setTimeout(()=>this.rebuildToggles(r),0)});const c=document.createElement("span");if(c.textContent=e.label,s.appendChild(l),s.appendChild(c),o.appendChild(s),i){const e=document.createElement("span");e.className="tbw-visibility-handle",this.setIcon(e,"dragHandle"),e.title="Drag to reorder group",o.insertBefore(e,s)}r.appendChild(o);const u=this.grid.getAllColumns().filter(e=>!e.utility);for(const h of t){const e=u.findIndex(e=>e.field===h.field),t=this.createColumnRow(h,e,i,r);t.classList.add("tbw-visibility-row--grouped"),r.appendChild(t)}}renderFlatColumnList(e,t,i){const r=this.grid.getAllColumns().filter(e=>!e.utility);for(const n of e){const e=r.findIndex(e=>e.field===n.field);i.appendChild(this.createColumnRow(n,e,t,i))}}createColumnRow(e,t,i,r){const n=e.header||e.field,o=document.createElement("div");o.className=e.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",o.setAttribute("data-field",e.field),o.setAttribute("data-index",String(t)),i&&this.canMoveColumn(e)&&(o.draggable=!0,o.classList.add("reorderable"),this.setupDragListeners(o,e.field,t,r));const s=document.createElement("label");s.className="tbw-visibility-label";const l=document.createElement("input");l.type="checkbox",l.checked=e.visible,l.disabled=e.lockVisible??!1,l.addEventListener("change",()=>{this.grid.toggleColumnVisibility(e.field),setTimeout(()=>this.rebuildToggles(r),0)});const a=document.createElement("span");if(a.textContent=n,s.appendChild(l),s.appendChild(a),i&&this.canMoveColumn(e)){const e=document.createElement("span");e.className="tbw-visibility-handle",this.setIcon(e,"dragHandle"),e.title="Drag to reorder",o.appendChild(e)}return o.appendChild(s),o}setupGroupDragListeners(e,t,i,r){e.addEventListener("dragstart",n=>{this.isDragging=!0,this.draggedGroupId=t.id,this.draggedGroupFields=[...i],this.draggedField=null,this.draggedIndex=null,n.dataTransfer&&(n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("text/plain",`group:${t.id}`)),e.classList.add(w.DRAGGING),r.querySelectorAll(".tbw-visibility-row--grouped").forEach(e=>{const t=e.getAttribute("data-field");t&&this.draggedGroupFields.includes(t)&&e.classList.add(w.DRAGGING)})}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedGroupId=null,this.draggedGroupFields=[],this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(r)}),e.addEventListener("dragover",t=>{if(t.preventDefault(),!this.isDragging)return;if(this.draggedGroupFields.length===i.length&&this.draggedGroupFields.every(e=>i.includes(e)))return;if(!this.draggedGroupId)return;const n=e.getBoundingClientRect(),o=n.top+n.height/2,s=t.clientY<o;this.clearDragClasses(r),e.classList.add("drop-target"),e.classList.toggle("drop-before",s),e.classList.toggle("drop-after",!s)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",t=>{if(t.preventDefault(),!this.isDragging||!this.draggedGroupId)return;if(this.draggedGroupFields.length===i.length&&this.draggedGroupFields.every(e=>i.includes(e)))return;const r=e.getBoundingClientRect(),n=t.clientY<r.top+r.height/2;this.executeGroupDrop(this.draggedGroupFields,i,n)})}executeGroupDrop(e,t,i){const r=this.grid.getAllColumns().map(e=>e.field),n=r.filter(t=>!e.includes(t)),o=i?t[0]:t[t.length-1],s=n.indexOf(o);if(-1===s)return;const l=i?s:s+1,a=r.filter(t=>e.includes(t));n.splice(l,0,...a);const d=this.grid.getPluginByName?.("reorder");d?.setColumnOrder&&d.gridElement?d.setColumnOrder(n):this.grid.setColumnOrder(n),requestAnimationFrame(()=>{this.columnListElement&&this.rebuildToggles(this.columnListElement)})}setupDragListeners(e,t,i,r){e.addEventListener("dragstart",r=>{this.isDragging=!0,this.draggedField=t,this.draggedIndex=i,this.draggedGroupId=null,this.draggedGroupFields=[],r.dataTransfer&&(r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",t)),e.classList.add(w.DRAGGING)}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(r)}),e.addEventListener("dragover",n=>{if(n.preventDefault(),!this.isDragging)return;if(this.draggedGroupId){if(e.classList.contains("tbw-visibility-row--grouped"))return}else if(this.draggedField===t)return;const o=e.getBoundingClientRect(),s=o.top+o.height/2;this.dropIndex=n.clientY<s?i:i+1,this.clearDragClasses(r),this.draggedGroupId?(r.querySelector(`.tbw-visibility-group-header[data-group-id="${this.draggedGroupId}"]`)?.classList.add(w.DRAGGING),r.querySelectorAll(".tbw-visibility-row--grouped").forEach(e=>{const t=e.getAttribute("data-field");t&&this.draggedGroupFields.includes(t)&&e.classList.add(w.DRAGGING)})):this.draggedField&&r.querySelector(`.tbw-visibility-row[data-field="${this.draggedField}"]`)?.classList.add(w.DRAGGING),e.classList.add("drop-target"),e.classList.toggle("drop-before",n.clientY<s),e.classList.toggle("drop-after",n.clientY>=s)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",i=>{if(i.preventDefault(),!this.isDragging)return;if(this.draggedGroupId&&this.draggedGroupFields.length>0){if(e.classList.contains("tbw-visibility-row--grouped"))return;const r=e.getBoundingClientRect(),n=i.clientY<r.top+r.height/2;return void this.executeGroupDrop(this.draggedGroupFields,[t],n)}const r=this.draggedField,n=this.draggedIndex,o=this.dropIndex;if(null===r||null===n||null===o)return;const s=o>n?o-1:o;if(s!==n){const e=this.grid.getAllColumns(),t=e.filter(e=>!e.utility),i=t[s]?.field,o={field:r,fromIndex:n,toIndex:i?e.findIndex(e=>e.field===i):e.length};this.emit("column-reorder-request",o)}})}}export{it as BLANK_FILTER_VALUE,i as BaseGridPlugin,O as CORE_CONSUMED_ADAPTER_METHODS,de as ClipboardPlugin,fe as ColumnVirtualizationPlugin,Ae as ContextMenuPlugin,K as DEFAULT_A11Y_MESSAGES,B as DEFAULT_ANIMATION_CONFIG,$ as DEFAULT_GRID_ICONS,W as DGEvents,V as DataGridElement,Ke as EditingPlugin,tt as ExportPlugin,gt as FilteringPlugin,j as FitModeEnum,U as GridCSSVars,w as GridClasses,Y as GridDataAttrs,Z as GridElement,Q as GridSelectors,wt as GroupingColumnsPlugin,xt as GroupingRowsPlugin,Rt as MasterDetailPlugin,Tt as MultiSortPlugin,Kt as PinnedColumnsPlugin,ri as PinnedRowsPlugin,Ci as PivotPlugin,X as PluginEvents,J as PluginManager,Ri as PrintPlugin,Ki as ROW_DRAG_HANDLE_FIELD,ee as RenderPhase,_i as ReorderPlugin,ji as ResponsivePlugin,Vi as RowDragDropPlugin,Vi as RowReorderPlugin,or as SelectionPlugin,cr as ServerSidePlugin,ur as StickyRowsPlugin,pr as TooltipPlugin,xr as TreePlugin,Ar as UndoRedoPlugin,kr as VisibilityPlugin,D as builtInSort,te as createGrid,ie as defaultComparator,_e as defaultEditorFor,ae as defaultPasteHandler,Jt as filteredCountPanel,c as invalidateAccessorCache,Ei as printGridIsolated,re as queryGrid,r as resolveCellValue,Qt as rowCountPanel,Xt as selectedCountPanel,ne as setFeatureResolver};//# sourceMappingURL=all.js.map
|