@toolbox-web/grid 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/all.js +9 -8
  2. package/all.js.map +1 -1
  3. package/index.js +668 -583
  4. package/index.js.map +1 -1
  5. package/lib/core/grid.d.ts +46 -0
  6. package/lib/core/grid.d.ts.map +1 -1
  7. package/lib/core/types.d.ts +114 -0
  8. package/lib/core/types.d.ts.map +1 -1
  9. package/lib/plugins/clipboard/index.js.map +1 -1
  10. package/lib/plugins/column-virtualization/index.js.map +1 -1
  11. package/lib/plugins/context-menu/ContextMenuPlugin.d.ts.map +1 -1
  12. package/lib/plugins/context-menu/index.js +72 -71
  13. package/lib/plugins/context-menu/index.js.map +1 -1
  14. package/lib/plugins/editing/index.js.map +1 -1
  15. package/lib/plugins/export/index.js.map +1 -1
  16. package/lib/plugins/filtering/index.js.map +1 -1
  17. package/lib/plugins/grouping-columns/index.js.map +1 -1
  18. package/lib/plugins/grouping-rows/index.js.map +1 -1
  19. package/lib/plugins/master-detail/index.js.map +1 -1
  20. package/lib/plugins/multi-sort/index.js.map +1 -1
  21. package/lib/plugins/pinned-columns/index.js.map +1 -1
  22. package/lib/plugins/pinned-rows/index.js.map +1 -1
  23. package/lib/plugins/pivot/index.js.map +1 -1
  24. package/lib/plugins/print/PrintPlugin.d.ts.map +1 -1
  25. package/lib/plugins/print/index.js +1 -1
  26. package/lib/plugins/print/index.js.map +1 -1
  27. package/lib/plugins/reorder/index.js.map +1 -1
  28. package/lib/plugins/responsive/index.js.map +1 -1
  29. package/lib/plugins/row-reorder/index.js.map +1 -1
  30. package/lib/plugins/selection/index.js.map +1 -1
  31. package/lib/plugins/server-side/index.js.map +1 -1
  32. package/lib/plugins/tree/index.js.map +1 -1
  33. package/lib/plugins/undo-redo/index.js.map +1 -1
  34. package/lib/plugins/visibility/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/public.d.ts +1 -1
  37. package/public.d.ts.map +1 -1
  38. package/umd/grid.all.umd.js +13 -13
  39. package/umd/grid.all.umd.js.map +1 -1
  40. package/umd/grid.umd.js +11 -11
  41. package/umd/grid.umd.js.map +1 -1
  42. package/umd/plugins/context-menu.umd.js +1 -1
  43. package/umd/plugins/context-menu.umd.js.map +1 -1
  44. package/umd/plugins/print.umd.js +1 -1
  45. package/umd/plugins/print.umd.js.map +1 -1
@@ -1,4 +1,4 @@
1
- (function(x,J){typeof exports=="object"&&typeof module<"u"?J(exports):typeof define=="function"&&define.amd?define(["exports"],J):(x=typeof globalThis<"u"?globalThis:x||self,J(x.TbwGrid={}))})(this,(function(x){"use strict";const J='@layer tbw-base,tbw-plugins,tbw-theme;@layer tbw-base{tbw-grid{--tbw-base-icon-size: 1em;--tbw-base-radius: .25em;--tbw-font-size: 1em;--tbw-font-size-sm: .9285em;--tbw-font-size-xs: .7857em;--tbw-font-size-2xs: .7142em;--tbw-spacing-xs: .25em;--tbw-spacing-sm: .375em;--tbw-spacing-md: .5em;--tbw-spacing-lg: .75em;--tbw-spacing-xl: 1em;--tbw-icon-size: var(--tbw-base-icon-size);--tbw-icon-size-sm: .875em;--tbw-checkbox-size: var(--tbw-base-icon-size);--tbw-toggle-size: 1.25em;--tbw-border-radius: var(--tbw-base-radius);--tbw-color-bg: transparent;--tbw-color-panel-bg: light-dark(#eeeeee, #222222);--tbw-color-fg: light-dark(#222222, #eeeeee);--tbw-color-fg-muted: light-dark(#555555, #aaaaaa);--tbw-color-accent: light-dark(#3b82f6, #3b82f6);--tbw-color-accent-fg: light-dark(#ffffff, #000000);--tbw-color-success: light-dark(hsl(122, 39%, 40%), hsl(122, 39%, 49%));--tbw-color-warning: light-dark(hsl(38, 92%, 50%), hsl(38, 92%, 50%));--tbw-color-error: light-dark(hsl(0, 65%, 51%), hsl(0, 65%, 55%));--tbw-color-danger: var(--tbw-color-error);--tbw-color-selection: light-dark(#fff7d6, #333333);--tbw-color-row-alt: var(--tbw-color-bg);--tbw-color-row-hover: light-dark(#f0f6ff, #1c1c1c);--tbw-color-header-bg: color-mix(in hsl, var(--tbw-color-panel-bg) 85%, var(--tbw-color-fg));--tbw-color-header-fg: color-mix(in hsl, var(--tbw-color-fg) 75%, var(--tbw-color-panel-bg));--tbw-color-border: light-dark(#d0d0d4, #454545);--tbw-color-border-strong: light-dark(#777777, #666666);--tbw-color-border-cell: var(--tbw-color-border);--tbw-color-border-header: var(--tbw-color-border);--tbw-color-shadow: light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3));--tbw-font-family: inherit;--tbw-font-size-header: var(--tbw-font-size);--tbw-font-weight-header: bold;--tbw-cell-padding-header: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-cell-padding: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-cell-padding-input: var(--tbw-spacing-xs) var(--tbw-spacing-sm);--tbw-row-height: 1.75em;--tbw-header-height: 1.875em;--tbw-cell-white-space: nowrap;--tbw-border-input: 1px solid var(--tbw-color-border-strong);--tbw-border-header: 1px solid var(--tbw-color-border-header);--tbw-row-divider: 1px solid var(--tbw-color-border-cell);--tbw-row-hover-outline: 0;--tbw-color-active-row-bg: var(--tbw-color-selection);--tbw-active-row-outline: 0;--tbw-focus-outline: 2px solid var(--tbw-color-accent);--tbw-focus-outline-offset: -2px;--tbw-focus-background: rgba(from var(--tbw-color-accent) r g b / 12%);--tbw-range-border-color: var(--tbw-color-accent);--tbw-range-selection-bg: rgba(from var(--tbw-range-border-color) r g b / 12%);--tbw-resize-handle-width: var(--tbw-spacing-sm);--tbw-resize-handle-color: transparent;--tbw-resize-handle-color-hover: var(--tbw-color-accent);--tbw-resize-handle-border-radius: 0;--tbw-resize-indicator-width: 2px;--tbw-resize-indicator-color: var(--tbw-color-accent);--tbw-resize-indicator-opacity: .6;--tbw-scrollbar-thumb: var(--tbw-color-border-strong);--tbw-scrollbar-track: var(--tbw-color-bg);--tbw-transition-duration: .12s;--tbw-transition-ease: ease;--tbw-animation-duration: .2s;--tbw-animation-easing: ease-out;--tbw-animation-enabled: 1;--tbw-row-change-duration: .5s;--tbw-row-insert-duration: .3s;--tbw-row-remove-duration: .2s;--tbw-row-change-color: rgba(from var(--tbw-color-accent) r g b / 25%);--tbw-sort-indicator-color: var(--tbw-color-fg-muted);--tbw-sort-indicator-active-color: var(--tbw-color-accent);--tbw-sort-indicator-display: inline-flex;--tbw-sort-indicator-visibility: visible;--tbw-header-text-transform: none;--tbw-header-letter-spacing: normal;--tbw-color-header-separator: var(--tbw-color-border-cell);--tbw-density-scale: 1;--tbw-shell-header-height: 2.75em;--tbw-shell-header-bg: var(--tbw-color-panel-bg);--tbw-shell-header-border: var(--tbw-color-border);--tbw-shell-title-font-size: var(--tbw-font-size);--tbw-shell-title-font-weight: 600;--tbw-tool-panel-width: 17.5em;--tbw-tool-panel-bg: var(--tbw-color-panel-bg);--tbw-tool-panel-border: var(--tbw-color-border);--tbw-tool-panel-header-height: 2.5em;--tbw-tool-panel-transition: var(--tbw-animation-duration) var(--tbw-animation-easing);--tbw-toolbar-button-size: 2em;--tbw-toolbar-button-gap: var(--tbw-spacing-xs);--tbw-panel-padding: var(--tbw-spacing-lg);--tbw-panel-gap: var(--tbw-spacing-md);--tbw-menu-item-padding: var(--tbw-spacing-sm) var(--tbw-spacing-lg);--tbw-menu-item-gap: var(--tbw-spacing-md);--tbw-menu-min-width: 10rem;--tbw-button-padding: var(--tbw-spacing-sm) var(--tbw-spacing-lg);--tbw-button-padding-sm: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-input-height: var(--tbw-row-height);--tbw-input-padding: 0 var(--tbw-spacing-md);--tbw-detail-padding: var(--tbw-spacing-xl);--tbw-detail-max-height: 31.25rem;--tbw-indicator-size: var(--tbw-spacing-sm);position:relative;display:block;width:100%;height:100%;min-height:0;contain:content;font-family:var(--tbw-font-family);font-size:var(--tbw-font-size);background:var(--tbw-color-bg);color:var(--tbw-color-fg);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);overflow:clip;outline:none}tbw-grid,tbw-grid *{box-sizing:border-box}tbw-grid .header{display:block;flex-shrink:0;z-index:var(--tbw-z-layer-header, 30);background:var(--tbw-color-header-bg);overflow:visible}tbw-grid .header-group-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-color-header-bg);z-index:var(--tbw-z-layer-header, 30)}tbw-grid .header-group-cell{display:flex;align-items:center;justify-content:flex-start;padding:var(--tbw-cell-padding-header, 2px 8px);color:var(--tbw-color-header-group-fg, var(--tbw-color-header-fg));font-weight:var(--tbw-font-weight-header-group, var(--tbw-font-weight-header));justify-content:var(--tbw-align-header-group, var(--tbw-align-header, flex-start))}tbw-grid .header-group-cell:not(:last-child){border-right:2px solid var(--tbw-color-border)}tbw-grid .header-row{display:grid;grid-template-columns:var(--tbw-column-template);color:var(--tbw-color-header-fg);font-size:var(--tbw-font-size-header);min-height:var(--tbw-header-height);border-bottom:var(--tbw-border-header);z-index:var(--tbw-z-layer-header, 30)}tbw-grid .header-row>.cell{display:flex;align-items:center;gap:4px;padding:var(--tbw-cell-padding-header, 2px 8px);background-color:var(--tbw-color-header-bg);font-weight:var(--tbw-font-weight-header);border-right:1px solid var(--tbw-color-border-cell);overflow:visible;min-width:0}tbw-grid .header-row>.cell>span:first-child{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:inherit}tbw-grid .header-row>.cell>span[part~=sort-indicator]{flex-shrink:0;opacity:.6;display:var(--tbw-sort-indicator-display, inline-flex);visibility:var(--tbw-sort-indicator-visibility, visible);transition:opacity .15s,visibility 0s,display 0s allow-discrete;transition-behavior:allow-discrete}tbw-grid .header-row>.cell:hover>span[part~=sort-indicator],tbw-grid .header-row>.cell[aria-sort=ascending]>span[part~=sort-indicator],tbw-grid .header-row>.cell[aria-sort=descending]>span[part~=sort-indicator]{display:inline-flex;visibility:visible}tbw-grid .header-row>.cell:last-child{border-right:0}tbw-grid .header-row>.cell.grouped.group-end:not(:last-child){border-right:2px solid var(--tbw-color-border)}tbw-grid .header-row>.cell.resizable{position:relative}tbw-grid .header-row>.cell.sticky-left,tbw-grid .header-row>.cell.sticky-right{background:var(--tbw-color-header-bg);z-index:35}tbw-grid .tbw-grid-root{display:flex;flex-direction:column;height:100%}tbw-grid .tbw-grid-root.has-shell{display:flex;flex-direction:column;height:100%}tbw-grid .rows-body-wrapper{flex:1;min-height:0;display:flex;flex-direction:row;width:100%;min-width:fit-content}tbw-grid .rows-body{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:visible}tbw-grid .rows-container{display:flex;flex-direction:row;flex:1;min-height:0;overflow:visible}tbw-grid .rows-viewport{flex:1;min-width:0;position:relative;display:block;overflow:clip}tbw-grid .rows-viewport .rows{position:absolute;top:0;left:0;min-width:100%;will-change:transform;z-index:var(--tbw-z-layer-rows, 1)}tbw-grid .faux-vscroll{position:sticky;inset-inline-end:0;flex-shrink:0;width:auto;overflow-y:auto;overflow-x:hidden;z-index:var(--tbw-z-layer-header, 30)}tbw-grid .faux-vscroll-spacer{width:1px}tbw-grid .data-grid-row{display:grid;grid-template-columns:var(--tbw-column-template);contain:layout style;content-visibility:auto;contain-intrinsic-size:auto var(--tbw-row-height)}tbw-grid .data-grid-row:nth-child(2n){background:var(--tbw-color-row-alt)}tbw-grid .data-grid-row:hover{background:var(--tbw-color-row-hover)}tbw-grid .data-grid-row>.cell{display:block;padding:var(--tbw-cell-padding, 2px 8px);border-bottom:var(--tbw-row-divider);min-height:var(--tbw-row-height);line-height:calc(var(--tbw-row-height) - 5px);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0;white-space:var(--tbw-cell-white-space, nowrap);text-overflow:ellipsis}tbw-grid .data-grid-row>.cell>*{overflow:hidden;text-overflow:ellipsis;white-space:inherit;min-width:0}tbw-grid .data-grid-row>.cell:last-child{border-right:0}tbw-grid .data-grid-row>.cell[data-type=boolean]{text-align:center}tbw-grid .data-grid-row>.cell[data-type=boolean] input[type=checkbox]{margin:0;width:var(--tbw-checkbox-size);height:var(--tbw-checkbox-size);vertical-align:middle}tbw-grid .data-grid-row>.cell.selected:focus-visible,tbw-grid .data-grid-row>.cell:focus-visible:not(.cell-focus){outline:none}tbw-grid .data-grid-row>.cell.sticky-left,tbw-grid .data-grid-row>.cell.sticky-right{background:var(--tbw-color-panel-bg)}tbw-grid .selecting .data-grid-row>.cell{-webkit-user-select:none;user-select:none}tbw-grid .sortable{cursor:pointer;-webkit-user-select:none;user-select:none}tbw-grid .resize-handle{position:absolute;top:0;right:calc(var(--tbw-resize-handle-width) / -2);width:var(--tbw-resize-handle-width);height:100%;cursor:e-resize;-webkit-user-select:none;user-select:none;touch-action:none;z-index:20;background:var(--tbw-resize-handle-color);transition:background .12s ease;border-radius:var(--tbw-resize-handle-border-radius)}tbw-grid .resize-handle:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);width:var(--tbw-resize-indicator-width, 2px);height:0;background:var(--tbw-resize-indicator-color, var(--tbw-color-accent));opacity:0;pointer-events:none;transition:opacity .12s ease,height 0s .12s;z-index:1000}tbw-grid .resize-handle:hover{background:var(--tbw-resize-handle-color-hover)}tbw-grid .resize-handle:hover:after{height:100vh;opacity:var(--tbw-resize-indicator-opacity, .6);transition:opacity .12s ease,height 0s}tbw-grid[data-has-focus] .cell-focus,tbw-grid[data-has-focus] .row-focus{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}tbw-grid .sticky-left,tbw-grid .sticky-right{position:sticky;z-index:25}tbw-grid .sticky-left{box-shadow:1px 0 0 var(--tbw-color-border)}tbw-grid .sticky-right{box-shadow:-1px 0 0 var(--tbw-color-border)}tbw-grid .tbw-shell-header{display:flex;align-items:center;gap:8px;min-height:var(--tbw-shell-header-height);padding:0 8px;background:var(--tbw-shell-header-bg);border-bottom:1px solid var(--tbw-shell-header-border);flex-shrink:0}tbw-grid .tbw-shell-title{font-size:var(--tbw-shell-title-font-size);font-weight:var(--tbw-shell-title-font-weight);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}tbw-grid .tbw-shell-content{flex:1;display:flex;align-items:center;gap:12px;min-width:0;overflow:hidden}tbw-grid .tbw-shell-toolbar{display:flex;align-items:center;gap:var(--tbw-toolbar-button-gap);flex-shrink:0}tbw-grid .tbw-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-toolbar-button-size);height:var(--tbw-toolbar-button-size);padding:0;border:1px solid transparent;border-radius:var(--tbw-border-radius);background:transparent;color:var(--tbw-color-fg);cursor:pointer;font-size:16px;transition:background var(--tbw-transition-duration) var(--tbw-transition-ease),border-color var(--tbw-transition-duration) var(--tbw-transition-ease)}tbw-grid .tbw-toolbar-btn:hover{background:var(--tbw-color-row-hover)}tbw-grid .tbw-toolbar-btn:focus-visible{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}tbw-grid .tbw-toolbar-btn.active{background:var(--tbw-focus-background);border-color:var(--tbw-color-accent)}tbw-grid .tbw-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}tbw-grid .tbw-toolbar-separator{width:1px;height:20px;background:var(--tbw-color-border);margin:0 4px}tbw-grid .tbw-shell-body{position:relative;display:flex;flex:1;min-height:0;overflow:visible}tbw-grid .tbw-grid-content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:row;overflow:hidden}tbw-grid .tbw-scroll-area{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow-x:auto;overflow-y:hidden;overflow-anchor:none}tbw-grid .tbw-tool-panel{position:absolute;top:0;bottom:0;right:0;width:0;overflow:hidden;background:var(--tbw-tool-panel-bg);border-left:1px solid var(--tbw-tool-panel-border);transition:width var(--tbw-tool-panel-transition);display:flex;flex-direction:column;z-index:30;box-shadow:-2px 0 8px var(--tbw-color-shadow)}tbw-grid .tbw-tool-panel[data-position=left]{right:auto;left:0;border-left:none;border-right:1px solid var(--tbw-tool-panel-border);box-shadow:2px 0 8px var(--tbw-color-shadow)}tbw-grid .tbw-tool-panel.open{width:var(--tbw-tool-panel-width)}tbw-grid .tbw-tool-panel-resize{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;background:transparent;z-index:10;transition:background var(--tbw-transition-duration) var(--tbw-transition-ease)}tbw-grid .tbw-tool-panel-resize[data-handle-position=left]{left:0}tbw-grid .tbw-tool-panel-resize[data-handle-position=right]{right:0}tbw-grid .tbw-tool-panel-resize:hover,tbw-grid .tbw-tool-panel-resize.resizing{background:var(--tbw-color-accent)}tbw-grid .tbw-tool-panel-header{display:flex;align-items:center;justify-content:space-between;min-height:var(--tbw-tool-panel-header-height);padding:0 12px;border-bottom:1px solid var(--tbw-tool-panel-border);flex-shrink:0}tbw-grid .tbw-tool-panel-title{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}tbw-grid .tbw-tool-panel-close{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--tbw-border-radius);background:transparent;color:var(--tbw-color-fg-muted);cursor:pointer;font-size:14px}tbw-grid .tbw-tool-panel-close:hover{background:var(--tbw-color-row-hover);color:var(--tbw-color-fg)}tbw-grid .tbw-tool-panel-content{flex:1;overflow:auto}tbw-grid .tbw-accordion{display:flex;flex-direction:column;gap:0}tbw-grid .tbw-accordion-section{border-bottom:1px solid var(--tbw-tool-panel-border)}tbw-grid .tbw-accordion-section:last-child{border-bottom:none}tbw-grid .tbw-accordion-section.single .tbw-accordion-header{cursor:default}tbw-grid .tbw-accordion-section.single .tbw-accordion-header:hover{background:transparent}tbw-grid .tbw-accordion-section.expanded .tbw-accordion-chevron{transform:rotate(90deg)}tbw-grid .tbw-accordion-section.expanded .tbw-accordion-content{display:block}tbw-grid .tbw-accordion-header{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;background:transparent;color:var(--tbw-color-fg);font-size:13px;font-weight:600;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none}tbw-grid .tbw-accordion-header:hover{background:var(--tbw-color-row-hover)}tbw-grid .tbw-accordion-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:10px;color:var(--tbw-color-fg-muted);transition:transform .15s ease;flex-shrink:0}tbw-grid .tbw-accordion-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:14px;flex-shrink:0}tbw-grid .tbw-accordion-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}tbw-grid .tbw-accordion-content{display:none}tbw-grid .tbw-expanding{animation:tbw-expand var(--tbw-animation-duration) var(--tbw-animation-easing) forwards;overflow:hidden}tbw-grid .tbw-collapsing{animation:tbw-collapse var(--tbw-animation-duration) var(--tbw-animation-easing) forwards;overflow:hidden}tbw-grid[data-animation-mode=off]{--tbw-animation-enabled: 0;--tbw-animation-duration: 0ms}tbw-grid[data-animation-mode=off] .data-grid-row[data-animating]{animation:none}@media(forced-colors:active){tbw-grid{--tbw-color-border: CanvasText;--tbw-color-border-strong: CanvasText;--tbw-color-border-cell: CanvasText;--tbw-color-border-header: CanvasText;--tbw-color-fg: CanvasText;--tbw-color-bg: Canvas;--tbw-color-panel-bg: Canvas;--tbw-color-header-bg: Canvas;--tbw-color-header-fg: CanvasText;--tbw-color-accent: Highlight;--tbw-color-accent-fg: HighlightText;--tbw-color-selection: Highlight;--tbw-color-row-hover: Highlight;--tbw-focus-outline: 2px solid Highlight;--tbw-range-border-color: Highlight}tbw-grid .cell:focus,tbw-grid .cell.active-cell{outline:2px solid Highlight!important;outline-offset:-2px}tbw-grid .data-grid-row[aria-selected=true]{background:Highlight!important;color:HighlightText!important}}@media(prefers-reduced-motion:reduce){tbw-grid[data-animation-mode=reduced-motion]{--tbw-animation-enabled: 0;--tbw-animation-duration: 0ms}tbw-grid[data-animation-mode=reduced-motion] .data-grid-row[data-animating]{animation:none}}@keyframes tbw-expand{0%{opacity:0;max-height:0;transform:translateY(-8px)}to{opacity:1;max-height:500px;transform:translateY(0)}}@keyframes tbw-collapse{0%{opacity:1;max-height:500px;transform:translateY(0)}to{opacity:0;max-height:0;transform:translateY(-8px)}}@keyframes tbw-row-change{0%{background-color:transparent}20%{background-color:var(--tbw-row-change-color)}to{background-color:transparent}}@keyframes tbw-row-insert{0%{opacity:0;max-height:0;overflow:hidden}to{opacity:1;max-height:var(--tbw-row-height, 28px);overflow:hidden}}@keyframes tbw-row-remove{0%{opacity:1;transform:translateY(0);max-height:var(--tbw-row-height, 28px)}to{opacity:0;max-height:0;transform:translateY(-8px)}}tbw-grid .data-grid-row[data-animating=change]{animation:tbw-row-change var(--tbw-row-change-duration) ease-out}tbw-grid .data-grid-row[data-animating=insert]{animation:tbw-row-insert var(--tbw-row-insert-duration) ease-out;will-change:max-height,opacity}tbw-grid .data-grid-row[data-animating=remove]{animation:tbw-row-remove var(--tbw-row-remove-duration) ease-out forwards;will-change:max-height,opacity,transform;pointer-events:none}}',Q={STRETCH:"stretch",FIXED:"fixed"},at={mode:"reduced-motion",duration:200,easing:"ease-out"},dt='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',G={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:dt,filterActive:dt,print:"🖨️"};function Hi(n){return Array.from(n.querySelectorAll("tbw-grid-column")).map(t=>{const i=t.getAttribute("field")||"";if(!i)return null;const o=t.getAttribute("type")||void 0,s=o&&new Set(["number","string","date","boolean","select"]).has(o)?o:void 0,l=t.getAttribute("header")||void 0,a=t.hasAttribute("sortable"),d=t.hasAttribute("editable"),c={field:i,type:s,header:l,sortable:a,editable:d},u=t.getAttribute("width");if(u){const b=parseFloat(u);!isNaN(b)&&/^\d+(\.\d+)?$/.test(u.trim())?c.width=b:c.width=u}const h=t.getAttribute("minWidth")||t.getAttribute("min-width");if(h){const b=parseFloat(h);isNaN(b)||(c.minWidth=b)}t.hasAttribute("resizable")&&(c.resizable=!0),t.hasAttribute("sizable")&&(c.resizable=!0);const f=t.getAttribute("editor"),p=t.getAttribute("renderer");f&&(c.__editorName=f),p&&(c.__rendererName=p);const g=t.getAttribute("options");g&&(c.options=g.split(",").map(b=>{const[S,R]=b.includes(":")?b.split(":"):[b.trim(),b.trim()];return{value:S.trim(),label:R?.trim()||S.trim()}}));const w=t.querySelector("tbw-grid-column-view"),m=t.querySelector("tbw-grid-column-editor"),y=t.querySelector("tbw-grid-column-header");w&&(c.__viewTemplate=w),m&&(c.__editorTemplate=m),y&&(c.__headerTemplate=y);const T=globalThis.DataGridElement?.getAdapters?.()??[],_=w??t,E=T.find(b=>b.canHandle(_));if(E){const b=E.createRenderer(_);b&&(c.viewRenderer=b)}const P=m??t,L=T.find(b=>b.canHandle(P));if(L){const b=L.createEditor(P);b&&(c.editor=b)}return c}).filter(t=>!!t)}function ct(n,e){if((!n||!n.length)&&(!e||!e.length))return[];if(!n||!n.length)return e||[];if(!e||!e.length)return n;const t={};e.forEach(o=>{const r=t[o.field];if(r){o.header&&!r.header&&(r.header=o.header),o.type&&!r.type&&(r.type=o.type),o.sortable&&(r.sortable=!0),o.editable&&(r.editable=!0),o.resizable&&(r.resizable=!0),o.width!=null&&r.width==null&&(r.width=o.width),o.minWidth!=null&&r.minWidth==null&&(r.minWidth=o.minWidth),o.__viewTemplate&&(r.__viewTemplate=o.__viewTemplate),o.__editorTemplate&&(r.__editorTemplate=o.__editorTemplate),o.__headerTemplate&&(r.__headerTemplate=o.__headerTemplate);const s=o.renderer||o.viewRenderer,l=r.renderer||r.viewRenderer;s&&!l&&(r.viewRenderer=s,o.renderer&&(r.renderer=s)),o.editor&&!r.editor&&(r.editor=o.editor)}else t[o.field]={...o}});const i=n.map(o=>{const r=t[o.field];if(!r)return o;const s={...o};r.header&&!s.header&&(s.header=r.header),r.type&&!s.type&&(s.type=r.type),s.sortable=o.sortable||r.sortable,(o.resizable===!0||r.resizable===!0)&&(s.resizable=!0),s.editable=o.editable||r.editable,r.width!=null&&s.width==null&&(s.width=r.width),r.minWidth!=null&&s.minWidth==null&&(s.minWidth=r.minWidth),r.__viewTemplate&&(s.__viewTemplate=r.__viewTemplate),r.__editorTemplate&&(s.__editorTemplate=r.__editorTemplate),r.__headerTemplate&&(s.__headerTemplate=r.__headerTemplate);const l=r.renderer||r.viewRenderer,a=s.renderer||s.viewRenderer;return l&&!a&&(s.viewRenderer=l,r.renderer&&(s.renderer=l)),r.editor&&!s.editor&&(s.editor=r.editor),delete t[o.field],s});return Object.keys(t).forEach(o=>i.push(t[o])),i}function ut(n,e){try{n.part?.add?.(e)}catch{}const t=n.getAttribute("part");t?t.split(/\s+/).includes(e)||n.setAttribute("part",t+" "+e):n.setAttribute("part",e)}function ht(n){const e=n.effectiveConfig?.fitMode||n.fitMode||Q.STRETCH;if(e!==Q.STRETCH&&e!==Q.FIXED||n.__didInitialAutoSize||!n.isConnected)return;const t=Array.from(n._headerRowEl?.children||[]);if(!t.length)return;let i=!1;n._visibleColumns.forEach((o,r)=>{if(o.width)return;const s=t[r];let l=s?s.scrollWidth:0;for(const a of n._rowPool){const d=a.children[r];if(d){const c=d.scrollWidth;c>l&&(l=c)}}l>0&&(o.width=l+2,o.__autoSized=!0,i=!0)}),i&&le(n),n.__didInitialAutoSize=!0}function le(n){(n.effectiveConfig?.fitMode||n.fitMode||Q.STRETCH)===Q.STRETCH?n._gridTemplate=n._visibleColumns.map(t=>{if(t.width)return`${t.width}px`;const i=t.minWidth;return i!=null?`minmax(${i}px, 1fr)`:"1fr"}).join(" ").trim():n._gridTemplate=n._visibleColumns.map(t=>t.width?`${t.width}px`:"max-content").join(" "),n.style.setProperty("--tbw-column-template",n._gridTemplate)}function Ii(n){return n==null?"string":typeof n=="number"?"number":typeof n=="boolean"?"boolean":n instanceof Date||typeof n=="string"&&/\d{4}-\d{2}-\d{2}/.test(n)&&!isNaN(Date.parse(n))?"date":"string"}function Mi(n,e){const t=n[0]||{},i=Object.keys(t).map(r=>{const s=t[r],l=Ii(s);return{field:r,header:r.charAt(0).toUpperCase()+r.slice(1),type:l}}),o={};return i.forEach(r=>{o[r.field]=r.type||"string"}),{columns:i,typeMap:o}}const Ni=/{{\s*([^}]+)\s*}}/g,q="__DG_EMPTY__",Oi=/^[\w$. '?+\-*/%:()!<>=,&|]+$/,zi=/__(proto|defineGetter|defineSetter)|constructor|window|globalThis|global|process|Function|import|eval|Reflect|Proxy|Error|arguments|document|location|cookie|localStorage|sessionStorage|indexedDB|fetch|XMLHttpRequest|WebSocket|Worker|SharedWorker|ServiceWorker|opener|parent|top|frames|self|this\b/;function Fi(n){return!n||typeof n!="string"?"":n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const qi=new Set(["script","iframe","object","embed","form","input","button","textarea","select","link","meta","base","style","template","slot","portal","frame","frameset","applet","noscript","noembed","plaintext","xmp","listing"]),ft=/^on\w+$/i,Gi=new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),Bi=/^\s*(javascript|vbscript|data|blob):/i;function U(n){if(!n||typeof n!="string")return"";if(n.indexOf("<")===-1)return n;const e=document.createElement("template");return e.innerHTML=n,Ki(e.content),e.innerHTML}function Ki(n){const e=[],t=n.querySelectorAll("*");for(const i of t){const o=i.tagName.toLowerCase();if(qi.has(o)){e.push(i);continue}if((o==="svg"||i.namespaceURI==="http://www.w3.org/2000/svg")&&Array.from(i.attributes).some(l=>ft.test(l.name)||l.name==="href"||l.name==="xlink:href")){e.push(i);continue}const r=[];for(const s of i.attributes){const l=s.name.toLowerCase();if(ft.test(l)){r.push(s.name);continue}if(Gi.has(l)&&Bi.test(s.value)){r.push(s.name);continue}if(l==="style"&&/expression\s*\(|javascript:|behavior\s*:/i.test(s.value)){r.push(s.name);continue}}r.forEach(s=>i.removeAttribute(s))}e.forEach(i=>i.remove())}function ke(n,e){if(!n||n.indexOf("{{")===-1)return n;const t=[],i=n.replace(Ni,(l,a)=>{const d=Vi(a,e);return t.push({expr:a.trim(),result:d}),d}),o=$i(i),r=t.length&&t.every(l=>l.result===""||l.result===q);return/Reflect\.|\bProxy\b|ownKeys\(/.test(n)||r?"":o}function Vi(n,e){if(n=(n||"").trim(),!n||/\b(Reflect|Proxy|ownKeys)\b/.test(n))return q;if(n==="value")return e.value==null?q:String(e.value);if(n.startsWith("row.")&&!/[()?]/.test(n)&&!n.includes(":")){const i=n.slice(4),o=e.row?e.row[i]:void 0;return o==null?q:String(o)}if(n.length>80||!Oi.test(n)||zi.test(n))return q;const t=n.match(/\./g);if(t&&t.length>1)return q;try{const o=new Function("value","row",`return (${n});`)(e.value,e.row),r=o==null?"":String(o);return/Reflect|Proxy|ownKeys/.test(r)?q:r||q}catch{return q}}function $i(n){return n&&n.replace(new RegExp(q,"g"),"").replace(/Reflect\.[^<>{}\s]+/g,"").replace(/\bProxy\b/g,"").replace(/ownKeys\([^)]*\)/g,"")}function Wi(n){if(/Reflect|Proxy|ownKeys/.test(n.textContent||"")){if(Array.from(n.childNodes).forEach(e=>{e.nodeType===Node.TEXT_NODE&&/Reflect|Proxy|ownKeys/.test(e.textContent||"")&&(e.textContent="")}),/Reflect|Proxy|ownKeys/.test(n.textContent||"")){if(/Reflect|Proxy|ownKeys/.test(n.textContent||""))for(;n.firstChild;)n.removeChild(n.firstChild);n.textContent=(n.textContent||"").replace(/Reflect|Proxy|ownKeys/g,"")}(n.textContent||"").trim().length===0&&(n.textContent="")}}function gt(n){const e=/Reflect\.|\bProxy\b|ownKeys\(/.test(n),t=(i=>e?"":ke(n,i));return t.__blocked=e,t}const Ui=100;class ji{#t;#e;#u;#d;#s;#l={};#n={};#h=!0;#g=[];#f;#c;#m;#a;#w;constructor(e){this.#a=e}get original(){return this.#l}get effective(){return this.#n}get columns(){return this.#n.columns??[]}set columns(e){this.#n.columns=e}get lightDomColumnsCache(){return this.#d}set lightDomColumnsCache(e){this.#d=e}get originalColumnNodes(){return this.#s}set originalColumnNodes(e){this.#s=e}get lightDomTitle(){return this.#w}set lightDomTitle(e){this.#w=e}get initialColumnState(){return this.#m}set initialColumnState(e){this.#m=e}get sourcesChanged(){return this.#h}markSourcesChanged(){this.#h=!0}setGridConfig(e){this.#t=e,this.#h=!0,this.#d=void 0}getGridConfig(){return this.#t}setColumns(e){this.#e=e,this.#h=!0}getColumns(){return this.#e}setFitMode(e){this.#u=e,this.#h=!0}getFitMode(){return this.#u}merge(){const e=(this.#n.columns?.length??0)>0;if(!this.#h&&e)return;const t=this.#b();this.#h=!1,this.#l=t,Object.freeze(this.#l),this.#l.columns&&Object.freeze(this.#l.columns),this.#n=this.#y(this.#l),this.#C()}#y(e){const t={...e};return e.columns&&(t.columns=e.columns.map(i=>({...i}))),e.shell&&(t.shell={...e.shell,header:e.shell.header?{...e.shell.header}:void 0,toolPanel:e.shell.toolPanel?{...e.shell.toolPanel}:void 0,toolPanels:e.shell.toolPanels?.map(i=>({...i})),headerContents:e.shell.headerContents?.map(i=>({...i}))}),t}#C(){const e=this.#n;e.rowHeight&&e.rowHeight>0&&this.#a.setRowHeight(e.rowHeight),e.fitMode==="fixed"&&this.columns.forEach(i=>{i.width==null&&(i.width=80)}),this.#a.applyAnimationConfig(e)}#b(){const e=this.#t?{...this.#t}:{},t=Array.isArray(e.columns)?[...e.columns]:[],i=(this.#d??[]).map(s=>({...s}));let o=ct(t,i);this.#e&&this.#e.length&&(o=ct(this.#e,i));const r=this.#a.getRows();return o.length===0&&r.length&&(o=Mi(r).columns),o.length&&(o.forEach(s=>{s.sortable===void 0&&(s.sortable=!0),s.resizable===void 0&&(s.resizable=!0),s.__originalWidth===void 0&&typeof s.width=="number"&&(s.__originalWidth=s.width)}),o.forEach(s=>{s.__viewTemplate&&!s.__compiledView&&(s.__compiledView=gt(s.__viewTemplate.innerHTML)),s.__editorTemplate&&!s.__compiledEditor&&(s.__compiledEditor=gt(s.__editorTemplate.innerHTML))}),e.columns=o),this.#u&&(e.fitMode=this.#u),e.fitMode||(e.fitMode="stretch"),this.#E(e),e.columnState&&!this.#m&&(this.#m=e.columnState),e}#E(e){e.shell=e.shell?{...e.shell}:{},e.shell.header=e.shell.header?{...e.shell.header}:{};const t=this.#a.getShellLightDomTitle();t&&(this.#w=t),this.#w&&!e.shell.header.title&&(e.shell.header.title=this.#w);const i=this.#a.getShellLightDomHeaderContent();i?.length>0&&(e.shell.header.lightDomContent=i),this.#a.getShellHasToolButtonsContainer()&&(e.shell.header.hasToolButtonsContainer=!0);const o=this.#a.getShellToolPanels();if(o.size>0){const u=Array.from(o.values());u.sort((h,f)=>(h.order??100)-(f.order??100)),e.shell.toolPanels=u}const r=this.#a.getShellHeaderContents();if(r.size>0){const u=Array.from(r.values());u.sort((h,f)=>(h.order??100)-(f.order??100)),e.shell.headerContents=u}const s=this.#a.getShellToolbarContents(),l=Array.from(s.values()),a=this.#t?.shell?.header?.toolbarContents??[],d=new Set(a.map(u=>u.id)),c=[...a];for(const u of l)d.has(u.id)||c.push(u);c.sort((u,h)=>(u.order??0)-(h.order??0)),e.shell.header.toolbarContents=c}collectState(e){const t=this.columns,i=this.#R();return{columns:t.map((o,r)=>{const s={field:o.field,order:r,visible:!o.hidden},l=o;l.__renderedWidth!==void 0?s.width=l.__renderedWidth:o.width!==void 0&&(s.width=typeof o.width=="string"?parseFloat(o.width):o.width);const a=i.get(o.field);a&&(s.sort=a);for(const d of e)if(d.getColumnState){const c=d.getColumnState(o.field);c&&Object.assign(s,c)}return s})}}applyState(e,t){if(!e.columns||e.columns.length===0)return;const i=this.columns,o=new Map(e.columns.map(l=>[l.field,l])),r=i.map(l=>{const a=o.get(l.field);if(!a)return l;const d={...l};return a.width!==void 0&&(d.width=a.width,d.__renderedWidth=a.width),a.visible!==void 0&&(d.hidden=!a.visible),d});r.sort((l,a)=>{const d=o.get(l.field)?.order??1/0,c=o.get(a.field)?.order??1/0;return d-c}),this.columns=r;const s=e.columns.filter(l=>l.sort!==void 0).sort((l,a)=>(l.sort?.priority??0)-(a.sort?.priority??0));if(s.length>0){const l=s[0];l.sort&&this.#a.setSortState({field:l.field,direction:l.sort.direction==="asc"?1:-1})}else this.#a.setSortState(null);for(const l of t)if(l.applyColumnState)for(const a of e.columns)l.applyColumnState(a.field,a)}resetState(e){this.#m=void 0,this.#a.setSortState(null),this.#n=this.#y(this.#l),this.#C();for(const t of e)if(t.applyColumnState)for(const i of this.columns)t.applyColumnState(i.field,{field:i.field,order:0,visible:!0});this.requestStateChange(e)}#R(){const e=new Map,t=this.#a.getSortState();return t&&e.set(t.field,{direction:t.direction===1?"asc":"desc",priority:0}),e}requestStateChange(e){this.#c&&clearTimeout(this.#c),this.#c=setTimeout(()=>{this.#c=void 0;const t=this.collectState(e);this.#a.emit("column-state-change",t)},Ui)}setColumnVisible(e,t){const i=this.columns,o=i.find(s=>s.field===e);return!o||!t&&o.lockVisible||!t&&i.filter(l=>!l.hidden&&l.field!==e).length===0||!!o.hidden===!t?!1:(o.hidden=!t,this.#a.emit("column-visibility",{field:e,visible:t,visibleColumns:i.filter(s=>!s.hidden).map(s=>s.field)}),this.#a.clearRowPool(),this.#a.setup(),!0)}toggleColumnVisibility(e){const t=this.columns.find(i=>i.field===e);return t?this.setColumnVisible(e,!!t.hidden):!1}isColumnVisible(e){const t=this.columns.find(i=>i.field===e);return t?!t.hidden:!1}showAllColumns(){const e=this.columns;e.some(t=>t.hidden)&&(e.forEach(t=>t.hidden=!1),this.#a.emit("column-visibility",{visibleColumns:e.map(t=>t.field)}),this.#a.clearRowPool(),this.#a.setup())}getAllColumns(){return this.columns.map(e=>({field:e.field,header:e.header||e.field,visible:!e.hidden,lockVisible:e.lockVisible,utility:e.meta?.utility===!0}))}getColumnOrder(){return this.columns.map(e=>e.field)}setColumnOrder(e){if(!e.length)return;const t=new Map(this.columns.map(o=>[o.field,o])),i=[];for(const o of e){const r=t.get(o);r&&(i.push(r),t.delete(o))}for(const o of t.values())i.push(o);this.columns=i,this.#a.renderHeader(),this.#a.updateTemplate(),this.#a.refreshVirtualWindow()}parseLightDomColumns(e){this.#d||(this.#s=Array.from(e.querySelectorAll("tbw-grid-column")),this.#d=this.#s.length?Hi(e):[])}clearLightDomCache(){this.#d=void 0}#v=new Map;registerLightDomHandler(e,t){this.#v.set(e.toLowerCase(),t)}unregisterLightDomHandler(e){this.#v.delete(e.toLowerCase())}observeLightDOM(e){this.#f&&this.#f.disconnect();const t=new Set;let i=null;const o=()=>{i=null;for(const r of t)this.#v.get(r)?.();t.clear()};this.#f=new MutationObserver(r=>{for(const s of r){for(const l of s.addedNodes){if(l.nodeType!==Node.ELEMENT_NODE)continue;const d=l.tagName.toLowerCase();this.#v.has(d)&&t.add(d)}if(s.type==="attributes"&&s.target.nodeType===Node.ELEMENT_NODE){const a=s.target.tagName.toLowerCase();this.#v.has(a)&&t.add(a)}}t.size>0&&!i&&(i=setTimeout(o,0))}),this.#f.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["title","field","header","width","hidden","id","icon","tooltip","order"]})}onChange(e){this.#g.push(e)}notifyChange(){for(const e of this.#g)e()}dispose(){this.#f?.disconnect(),this.#g=[],this.#c&&clearTimeout(this.#c)}}function pt(n){return`<span role="checkbox" aria-checked="${n}" aria-label="${n}">${n?"&#x1F5F9;":"&#9744;"}</span>`}function wt(n){if(n==null||n==="")return"";if(n instanceof Date)return isNaN(n.getTime())?"":n.toLocaleDateString();if(typeof n=="number"||typeof n=="string"){const e=new Date(n);return isNaN(e.getTime())?"":e.toLocaleDateString()}return""}function Pe(n){if(!n)return-1;const e=n.getAttribute("data-row");if(e)return parseInt(e,10);const t=n.closest(".data-grid-row");if(!t)return-1;const i=t.parentElement;if(!i)return-1;const o=i.querySelectorAll(":scope > .data-grid-row");for(let r=0;r<o.length;r++)if(o[r]===t)return r;return-1}function Yi(n){if(!n)return-1;const e=n.getAttribute("data-col");return e?parseInt(e,10):-1}function ae(n){n&&n.querySelectorAll(".cell-focus").forEach(e=>e.classList.remove("cell-focus"))}function mt(n,e){const t=e.renderer||e.viewRenderer;if(t)return t;if(!e.type)return;const i=n.effectiveConfig?.typeDefaults;if(i?.[e.type]?.renderer)return i[e.type].renderer;const o=n.__frameworkAdapter;if(o?.getTypeDefault){const r=o.getTypeDefault(e.type);if(r?.renderer)return r.renderer}}function bt(n,e){if(e.format)return e.format;if(!e.type)return;const t=n.effectiveConfig?.typeDefaults;if(t?.[e.type]?.format)return t[e.type].format;const i=n.__frameworkAdapter;if(i?.getTypeDefault){const o=i.getTypeDefault(e.type);if(o?.format)return o.format}}const vt='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function Le(n){return(n.__editingCellCount??0)>0}function De(n){n.__editingCellCount=0,n.removeAttribute("data-has-editing"),n.querySelectorAll(".cell.editing").forEach(t=>t.classList.remove("editing"))}const yt=document.createElement("template");yt.innerHTML='<div class="cell" role="gridcell" part="cell"></div>';const Ct=document.createElement("template");Ct.innerHTML='<div class="data-grid-row" role="row" part="row"></div>';function Xi(){return yt.content.firstElementChild.cloneNode(!0)}function Zi(){return Ct.content.firstElementChild.cloneNode(!0)}function me(n){n.__cellDisplayCache=void 0,n.__cellCacheEpoch=void 0,n.__hasSpecialColumns=void 0}function Ji(n,e,t,i,o){const r=Math.max(0,t-e),s=n._bodyEl,l=n._visibleColumns,a=l.length;let d=n.__cachedHeaderRowCount;for(d===void 0&&(d=n.querySelector(".header-group-row")?2:1,n.__cachedHeaderRowCount=d);n._rowPool.length<r;){const h=Zi();n._rowPool.push(h)}if(n._rowPool.length>r){for(let h=r;h<n._rowPool.length;h++){const f=n._rowPool[h];f.parentNode===s&&f.remove()}n._rowPool.length=r}const c=o&&n.__hasRenderRowPlugins!==!1,u=n._hasAfterRowRenderHook?.()??!1;for(let h=0;h<r;h++){const f=e+h,p=n._rows[f],g=n._rowPool[h];if(g.setAttribute("aria-rowindex",String(f+d+1)),c&&o(p,g,f)){g.__epoch=i,g.__rowDataRef=p,g.parentNode!==s&&s.appendChild(g);continue}const w=g.__epoch,m=g.__rowDataRef,y=g.children.length,T=w===i&&y===a,_=m!==p;let E=!1;if(T&&_){for(let R=0;R<a;R++)if(l[R].externalView&&!g.querySelector(`.cell[data-col="${R}"] [data-external-view]`)){E=!0;break}}if(!T||E){const R=Le(g),k=n._activeEditRows===f;R&&!k?(g.__isCustomRow&&(g.className="data-grid-row",g.setAttribute("role","row"),g.__isCustomRow=!1),De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):R&&k?(He(n,g,p,f),g.__rowDataRef=p):(g.__isCustomRow&&(g.className="data-grid-row",g.setAttribute("role","row"),g.__isCustomRow=!1),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p)}else if(_){const R=Le(g),k=n._activeEditRows===f;R&&!k?(De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):(He(n,g,p,f),g.__rowDataRef=p)}else{const R=Le(g),k=n._activeEditRows===f;R&&!k?(De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):He(n,g,p,f)}let P=!1;const L=n.changedRowIds;if(L&&L.length>0)try{const R=n.getRowId?.(p);R&&(P=L.includes(R))}catch{}const b=g.classList.contains("changed");P!==b&&g.classList.toggle("changed",P);const S=n.effectiveConfig?.rowClass;if(S){const R=g.getAttribute("data-dynamic-classes");R&&R.split(" ").forEach(k=>k&&g.classList.remove(k));try{const k=S(p);if(k&&k.length>0){const v=k.filter(A=>A&&typeof A=="string");v.forEach(A=>g.classList.add(A)),g.setAttribute("data-dynamic-classes",v.join(" "))}else g.removeAttribute("data-dynamic-classes")}catch(k){console.warn("[tbw-grid] rowClass callback error:",k),g.removeAttribute("data-dynamic-classes")}}u&&n._afterRowRender?.({row:p,rowIndex:f,rowElement:g}),g.parentNode!==s&&s.appendChild(g)}}function He(n,e,t,i){const o=e.children,r=n._visibleColumns,s=r.length,l=o.length,a=s<l?s:l,d=n._focusRow,c=n._focusCol,u=n._hasAfterCellRenderHook?.()??!1;let h=n.__hasSpecialColumns;if(h===void 0){h=!1;const p=n.effectiveConfig?.typeDefaults,g=n.__frameworkAdapter;for(let w=0;w<s;w++){const m=r[w];if(m.__viewTemplate||m.__compiledView||m.renderer||m.viewRenderer||m.externalView||m.format||m.type==="date"||m.type==="boolean"||m.type&&p?.[m.type]?.renderer||m.type&&p?.[m.type]?.format||m.type&&g?.getTypeDefault?.(m.type)?.renderer||m.type&&g?.getTypeDefault?.(m.type)?.format){h=!0;break}}n.__hasSpecialColumns=h}const f=String(i);if(!h){for(let p=0;p<a;p++){const g=o[p];if(g.classList.contains("editing"))continue;const w=r[p],m=t[w.field];g.textContent=m==null?"":String(m),g.getAttribute("data-row")!==f&&g.setAttribute("data-row",f);const y=d===i&&c===p,C=g.classList.contains("cell-focus");y!==C&&(g.classList.toggle("cell-focus",y),g.setAttribute("aria-selected",String(y))),u&&n._afterCellRender?.({row:t,rowIndex:i,column:w,colIndex:p,value:m,cellElement:g,rowElement:e})}return}for(let p=0;p<a;p++)if(r[p].externalView&&!o[p].querySelector("[data-external-view]")){de(n,e,t,i);return}for(let p=0;p<a;p++){const g=r[p],w=o[p];w.getAttribute("data-row")!==f&&w.setAttribute("data-row",f);const m=d===i&&c===p,y=w.classList.contains("cell-focus");m!==y&&(w.classList.toggle("cell-focus",m),w.setAttribute("aria-selected",String(m)));const C=g.cellClass;if(C){const L=w.getAttribute("data-dynamic-classes");L&&L.split(" ").forEach(b=>b&&w.classList.remove(b));try{const b=t[g.field],S=C(b,t,g);if(S&&S.length>0){const R=S.filter(k=>k&&typeof k=="string");R.forEach(k=>w.classList.add(k)),w.setAttribute("data-dynamic-classes",R.join(" "))}else w.removeAttribute("data-dynamic-classes")}catch(b){console.warn(`[tbw-grid] cellClass callback error for column '${g.field}':`,b),w.removeAttribute("data-dynamic-classes")}}if(w.classList.contains("editing"))continue;const T=mt(n,g);if(T){const L=t[g.field],b=T({row:t,value:L,field:g.field,column:g,cellEl:w});typeof b=="string"?w.innerHTML=U(b):b instanceof Node?b.parentElement!==w&&(w.innerHTML="",w.appendChild(b)):b==null&&(w.textContent=L==null?"":String(L)),u&&n._afterCellRender?.({row:t,rowIndex:i,column:g,colIndex:p,value:L,cellElement:w,rowElement:e});continue}if(g.__viewTemplate||g.__compiledView||g.externalView)continue;const _=t[g.field];let E;const P=bt(n,g);if(P)try{const L=P(_,t);E=L==null?"":String(L)}catch(L){console.warn(`[tbw-grid] Format error in column '${g.field}':`,L),E=_==null?"":String(_)}else g.type==="date"?(E=wt(_),w.textContent=E):g.type==="boolean"?w.innerHTML=pt(!!_):(E=_==null?"":String(_),w.textContent=E);u&&n._afterCellRender?.({row:t,rowIndex:i,column:g,colIndex:p,value:_,cellElement:w,rowElement:e})}}function de(n,e,t,i){e.innerHTML="";const o=n._visibleColumns,r=o.length,s=n._focusRow,l=n._focusCol,a=n,d=n._hasAfterCellRenderHook?.()??!1,c=document.createDocumentFragment();for(let u=0;u<r;u++){const h=o[u],f=Xi();f.setAttribute("aria-colindex",String(u+1)),f.setAttribute("data-col",String(u)),f.setAttribute("data-row",String(i)),f.setAttribute("data-field",h.field),f.setAttribute("data-header",h.header??h.field),h.type&&f.setAttribute("data-type",h.type);let p=t[h.field];const g=bt(n,h);if(g)try{p=g(p,t)}catch(E){console.warn(`[tbw-grid] Format error in column '${h.field}':`,E)}const w=h.__compiledView,m=h.__viewTemplate,y=mt(n,h),C=h.externalView;let T=!1;if(y){const E=y({row:t,value:p,field:h.field,column:h,cellEl:f});typeof E=="string"?(f.innerHTML=U(E),T=!0):E instanceof Node?E.parentElement!==f&&(f.textContent="",f.appendChild(E)):E==null&&(f.textContent=p==null?"":String(p))}else if(C){const E=C,P=document.createElement("div");P.setAttribute("data-external-view",""),P.setAttribute("data-field",h.field),f.appendChild(P);const L={row:t,value:p,field:h.field,column:h};if(E.mount)try{E.mount({placeholder:P,context:L,spec:E})}catch(b){console.warn(`[tbw-grid] External view mount error for column '${h.field}':`,b)}else queueMicrotask(()=>{try{a.dispatchEvent(new CustomEvent("mount-external-view",{bubbles:!0,composed:!0,detail:{placeholder:P,spec:E,context:L}}))}catch(b){console.warn(`[tbw-grid] External view event dispatch error for column '${h.field}':`,b)}});P.setAttribute("data-mounted","")}else if(w){const E=w({row:t,value:p,field:h.field,column:h}),P=w.__blocked;f.innerHTML=P?"":U(E),T=!0,P&&(f.textContent="",f.setAttribute("data-blocked-template",""))}else if(m){const E=m.innerHTML;/Reflect\.|\bProxy\b|ownKeys\(/.test(E)?(f.textContent="",f.setAttribute("data-blocked-template","")):(f.innerHTML=U(ke(E,{row:t,value:p})),T=!0)}else h.type==="date"?f.textContent=wt(p):h.type==="boolean"?f.innerHTML=pt(!!p):f.textContent=p==null?"":String(p);if(T){Wi(f);const E=f.textContent||"";/Proxy|Reflect\.ownKeys/.test(E)&&(f.textContent=E.replace(/Proxy|Reflect\.ownKeys/g,"").trim(),/Proxy|Reflect\.ownKeys/.test(f.textContent||"")&&(f.textContent=""))}f.hasAttribute("data-blocked-template")&&(f.textContent||"").trim().length&&(f.textContent=""),h.editable?f.tabIndex=0:h.type==="boolean"&&(f.hasAttribute("tabindex")||(f.tabIndex=0)),s===i&&l===u?(f.classList.add("cell-focus"),f.setAttribute("aria-selected","true")):f.setAttribute("aria-selected","false");const _=h.cellClass;if(_)try{const E=t[h.field],P=_(E,t,h);if(P&&P.length>0){const L=P.filter(b=>b&&typeof b=="string");L.forEach(b=>f.classList.add(b)),f.setAttribute("data-dynamic-classes",L.join(" "))}}catch(E){console.warn(`[tbw-grid] cellClass callback error for column '${h.field}':`,E)}d&&n._afterCellRender?.({row:t,rowIndex:i,column:h,colIndex:u,value:p,cellElement:f,rowElement:e}),c.appendChild(f)}e.appendChild(c)}function xt(n,e,t){if(e.target?.closest(".resize-handle"))return;const i=t.querySelector(".cell[data-row]"),o=Pe(i);if(o<0)return;const r=n._rows[o];if(!r||n._dispatchRowClick?.(e,o,r,t))return;const s=e.target?.closest(".cell[data-col]");if(s){const l=Number(s.getAttribute("data-col"));if(!isNaN(l)){if(n._dispatchCellClick?.(e,o,l,s))return;const a=n._focusRow!==o||n._focusCol!==l;if(n._focusRow=o,n._focusCol=l,s.classList.contains("editing")){a&&(ae(n._bodyEl??n),s.classList.add("cell-focus"));const d=s.querySelector(vt);try{d?.focus({preventScroll:!0})}catch{}return}F(n)}}}function Qi(n,e){if(n._dispatchKeyDown?.(e))return;const t=n._rows.length-1,i=n._visibleColumns.length-1,o=n._activeEditRows!==void 0&&n._activeEditRows!==-1,s=n._visibleColumns[n._focusCol]?.type,l=e.composedPath?.()??[],a=l.length?l[0]:e.target,d=c=>{if(!c)return!1;const u=c.tagName;return!!(u==="INPUT"||u==="SELECT"||u==="TEXTAREA"||c.isContentEditable)};if(!(d(a)&&(e.key==="Home"||e.key==="End"))&&!(d(a)&&(e.key==="ArrowUp"||e.key==="ArrowDown")&&a.tagName==="INPUT"&&a.type==="number")&&!(d(a)&&(e.key==="ArrowLeft"||e.key==="ArrowRight"))&&!(d(a)&&(e.key==="Enter"||e.key==="Escape"))&&!(o&&s==="select"&&(e.key==="ArrowDown"||e.key==="ArrowUp"))){switch(e.key){case"Tab":{e.preventDefault(),!e.shiftKey?n._focusCol<i?n._focusCol+=1:(typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow<t&&(n._focusRow+=1,n._focusCol=0)):n._focusCol>0?n._focusCol-=1:n._focusRow>0&&(typeof n.commitActiveRowEdit=="function"&&n._activeEditRows===n._focusRow&&n.commitActiveRowEdit(),n._focusRow-=1,n._focusCol=i),F(n);return}case"ArrowDown":o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=Math.min(t,n._focusRow+1),e.preventDefault();break;case"ArrowUp":o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=Math.max(0,n._focusRow-1),e.preventDefault();break;case"ArrowRight":n._focusCol=Math.min(i,n._focusCol+1),e.preventDefault();break;case"ArrowLeft":n._focusCol=Math.max(0,n._focusCol-1),e.preventDefault();break;case"Home":(e.ctrlKey||e.metaKey)&&(o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=0),n._focusCol=0,e.preventDefault(),F(n,{forceScrollLeft:!0});return;case"End":(e.ctrlKey||e.metaKey)&&(o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=t),n._focusCol=i,e.preventDefault(),F(n,{forceScrollRight:!0});return;case"PageDown":n._focusRow=Math.min(t,n._focusRow+20),e.preventDefault();break;case"PageUp":n._focusRow=Math.max(0,n._focusRow-20),e.preventDefault();break;case"Enter":{const c=n._focusRow,u=n._focusCol,h=n._visibleColumns[u],f=n._rows[c],p=h?.field??"",g=p&&f?f[p]:void 0,w=n.querySelector(`[data-row="${c}"][data-col="${u}"]`),m={rowIndex:c,colIndex:u,field:p,value:g,row:f,cellEl:w,trigger:"keyboard",originalEvent:e},y=new CustomEvent("cell-activate",{cancelable:!0,detail:m});n.dispatchEvent(y);const C=new CustomEvent("activate-cell",{cancelable:!0,detail:{row:c,col:u}});if(n.dispatchEvent(C),y.defaultPrevented||C.defaultPrevented){e.preventDefault();return}break}default:return}F(n)}}function F(n,e){if(n._virtualization?.enabled){const{rowHeight:s,container:l,viewportEl:a}=n._virtualization,d=l,c=a?.clientHeight??d?.clientHeight??0;if(d&&c>0){const u=n._focusRow*s;u<d.scrollTop?d.scrollTop=u:u+s>d.scrollTop+c&&(d.scrollTop=u-c+s)}}const t=n._activeEditRows!==void 0&&n._activeEditRows!==-1;t||n.refreshVirtualWindow(!1),ae(n._bodyEl),Array.from(n._bodyEl.querySelectorAll('[aria-selected="true"]')).forEach(s=>{s.setAttribute("aria-selected","false")});const i=n._focusRow,o=n._virtualization.start??0,r=n._virtualization.end??n._rows.length;if(i>=o&&i<r){const s=n._bodyEl.querySelectorAll(".data-grid-row")[i-o];let l=s?.children[n._focusCol];if((!l||!l.classList?.contains("cell"))&&(l=s?.querySelector(`.cell[data-col="${n._focusCol}"]`)??s?.querySelector(".cell[data-col]")),l){l.classList.add("cell-focus"),l.setAttribute("aria-selected","true");const a=n.querySelector(".tbw-scroll-area");if(a&&l&&!t)if(e?.forceScrollLeft)a.scrollLeft=0;else if(e?.forceScrollRight)a.scrollLeft=a.scrollWidth-a.clientWidth;else{const d=n._getHorizontalScrollOffsets?.(s??void 0,l)??{left:0,right:0};if(!d.skipScroll){const c=l.getBoundingClientRect(),u=a.getBoundingClientRect(),h=c.left-u.left+a.scrollLeft,f=h+c.width,p=a.scrollLeft+d.left,g=a.scrollLeft+a.clientWidth-d.right;h<p?a.scrollLeft=h-d.left:f>g&&(a.scrollLeft=f-a.clientWidth+d.right)}}if(n._activeEditRows!==void 0&&n._activeEditRows!==-1&&l.classList.contains("editing")){const d=l.querySelector(vt);if(d&&document.activeElement!==d)try{d.focus({preventScroll:!0})}catch{}}else if(!l.contains(document.activeElement)){l.hasAttribute("tabindex")||l.setAttribute("tabindex","-1");try{l.focus({preventScroll:!0})}catch{}}}}}const be=new WeakMap;function en(n,e){const t=Pe(e),i=Yi(e);t<0||i<0||(n._focusRow=t,n._focusCol=i,ae(n._bodyEl),e.classList.add("cell-focus"),e.setAttribute("aria-selected","true"))}function Ie(n,e,t,i){let o=null;const r=t.composedPath?.();if(r&&r.length>0?o=r[0]:o=t.target,o&&!e.contains(o)){const g=document.elementFromPoint(t.clientX,t.clientY);g&&(o=g)}const s=o?.closest?.("[data-col]"),l=o?.closest?.(".data-grid-row"),a=o?.closest?.(".header-row");let d,c,u,h,f,p;return s&&(d=parseInt(s.getAttribute("data-row")??"-1",10),c=parseInt(s.getAttribute("data-col")??"-1",10),d>=0&&c>=0&&(u=n._rows[d],p=n._columns[c],h=p?.field,f=u&&h?u[h]:void 0)),{type:i,row:u,rowIndex:d!==void 0&&d>=0?d:void 0,colIndex:c!==void 0&&c>=0?c:void 0,field:h,value:f,column:p,originalEvent:t,cellElement:s??void 0,rowElement:l??void 0,isHeader:!!a,cell:d!==void 0&&c!==void 0&&d>=0&&c>=0?{row:d,col:c}:void 0}}function tn(n,e,t){const i=Ie(n,e,t,"mousedown");(n._dispatchCellMouseDown?.(i)??!1)&&be.set(n,!0)}function nn(n,e,t){if(!be.get(n))return;const i=Ie(n,e,t,"mousemove");n._dispatchCellMouseMove?.(i)}function on(n,e,t){if(!be.get(n))return;const i=Ie(n,e,t,"mouseup");n._dispatchCellMouseUp?.(i),be.set(n,!1)}function rn(n,e,t){e.addEventListener("mousedown",i=>{const o=i.target.closest(".cell[data-col]");o&&(o.classList.contains("editing")||en(n,o))},{signal:t}),e.addEventListener("click",i=>{const o=i.target.closest(".data-grid-row");o&&xt(n,i,o)},{signal:t}),e.addEventListener("dblclick",i=>{const o=i.target.closest(".data-grid-row");o&&xt(n,i,o)},{signal:t})}function sn(n,e,t,i){e.addEventListener("keydown",o=>Qi(n,o),{signal:i}),t.addEventListener("mousedown",o=>tn(n,t,o),{signal:i}),document.addEventListener("mousemove",o=>nn(n,t,o),{signal:i}),document.addEventListener("mouseup",o=>on(n,t,o),{signal:i})}function Et(n,e){return n==null&&e==null?0:n==null?-1:e==null||n>e?1:n<e?-1:0}function Rt(n,e,t){const o=t.find(l=>l.field===e.field)?.sortComparator??Et,{field:r,direction:s}=e;return[...n].sort((l,a)=>o(l[r],a[r],l,a)*s)}function St(n,e,t,i){n._rows=e,n.__rowRenderEpoch++,n._rowPool.forEach(o=>o.__epoch=-1),xe(n),n.refreshVirtualWindow(!0),n.dispatchEvent(new CustomEvent("sort-change",{detail:{field:t.field,direction:i}})),n.requestStateChange?.()}function _t(n,e){!n._sortState||n._sortState.field!==e.field?(n._sortState||(n.__originalOrder=n._rows.slice()),At(n,e,1)):n._sortState.direction===1?At(n,e,-1):(n._sortState=null,n.__rowRenderEpoch++,n._rowPool.forEach(i=>i.__epoch=-1),n._rows=n.__originalOrder.slice(),xe(n),n._headerRowEl?.querySelectorAll('[role="columnheader"].sortable')?.forEach(i=>{i.getAttribute("aria-sort")?(i.getAttribute("aria-sort")==="ascending"||i.getAttribute("aria-sort")==="descending")&&(n._sortState||i.setAttribute("aria-sort","none")):i.setAttribute("aria-sort","none")}),n.refreshVirtualWindow(!0),n.dispatchEvent(new CustomEvent("sort-change",{detail:{field:e.field,direction:0}})),n.requestStateChange?.())}function At(n,e,t){n._sortState={field:e.field,direction:t};const i={field:e.field,direction:t},o=n._columns,s=(n.effectiveConfig?.sortHandler??Rt)(n._rows,i,o);s&&typeof s.then=="function"?s.then(l=>{St(n,l,e,t)}):St(n,s,e,t)}function ce(n,e){return n.effectiveConfig?.sortable!==!1&&e.sortable===!0}function ln(n,e){typeof e=="string"?n.textContent=e:e instanceof HTMLElement&&(n.innerHTML="",n.appendChild(e.cloneNode(!0)))}function ve(n,e){const t=document.createElement("span");ut(t,"sort-indicator");const i=n._sortState?.field===e.field?n._sortState.direction:0,o={...G,...n.icons},r=i===1?o.sortAsc:i===-1?o.sortDesc:o.sortNone;return ln(t,r),t}function ye(n,e,t){const i=document.createElement("div");return i.className="resize-handle",i.setAttribute("aria-hidden","true"),i.addEventListener("mousedown",o=>{o.stopPropagation(),o.preventDefault(),n._resizeController.start(o,e,t)}),i.addEventListener("dblclick",o=>{o.stopPropagation(),o.preventDefault(),n._resizeController.resetColumn(e)}),i}function Ce(n,e,t,i){i.classList.add("sortable"),i.tabIndex=0;const o=n._sortState?.field===e.field?n._sortState.direction:0;i.setAttribute("aria-sort",o===0?"none":o===1?"ascending":"descending"),i.addEventListener("click",r=>{n._resizeController?.isResizing||n._dispatchHeaderClick?.(r,t,i)||_t(n,e)}),i.addEventListener("keydown",r=>{if(r.key==="Enter"||r.key===" "){if(r.preventDefault(),n._dispatchHeaderClick?.(r,t,i))return;_t(n,e)}})}function an(n,e){if(e!=null)if(typeof e=="string"){const t=document.createElement("span");for(t.innerHTML=U(e);t.firstChild;)n.appendChild(t.firstChild)}else e instanceof Node&&n.appendChild(e)}function xe(n){n._headerRowEl=n.findHeaderRow();const e=n._headerRowEl;e&&(e.innerHTML="",n._visibleColumns.forEach((t,i)=>{const o=document.createElement("div");o.className="cell",ut(o,"header-cell"),o.setAttribute("role","columnheader"),o.setAttribute("aria-colindex",String(i+1)),o.setAttribute("data-field",t.field),o.setAttribute("data-col",String(i));const r=t.header??t.field,s=n._sortState?.field===t.field?n._sortState.direction:0,l=s===1?"asc":s===-1?"desc":null;if(t.headerRenderer){const a={column:t,value:r,sortState:l,filterActive:!1,cellEl:o,renderSortIcon:()=>ce(n,t)?ve(n,t):null,renderFilterButton:()=>null,renderResizeHandle:()=>ye(n,i,o)},d=t.headerRenderer(a);an(o,d),ce(n,t)&&Ce(n,t,i,o),t.resizable&&o.classList.add("resizable")}else if(t.headerLabelRenderer){const a={column:t,value:r},d=t.headerLabelRenderer(a),c=document.createElement("span");d==null?c.textContent=r:typeof d=="string"?c.innerHTML=U(d):d instanceof Node&&c.appendChild(d),o.appendChild(c),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)))}else if(t.__headerTemplate)Array.from(t.__headerTemplate.childNodes).forEach(a=>o.appendChild(a.cloneNode(!0))),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)));else{const a=document.createElement("span");a.textContent=r,o.appendChild(a),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)))}e.appendChild(o)}),e.querySelectorAll(".cell.sortable").forEach(t=>{t.getAttribute("aria-sort")||t.setAttribute("aria-sort","none")}),e.children.length>0?(e.setAttribute("role","row"),e.setAttribute("aria-rowindex","1")):(e.removeAttribute("role"),e.removeAttribute("aria-rowindex")))}const Tt=typeof requestIdleCallback=="function";function dn(n,e){return Tt?requestIdleCallback(n,e):window.setTimeout(()=>{const t=Date.now();n({didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))})},1)}function kt(n){Tt?cancelIdleCallback(n):clearTimeout(n)}var I=(n=>(n[n.STYLE=1]="STYLE",n[n.VIRTUALIZATION=2]="VIRTUALIZATION",n[n.HEADER=3]="HEADER",n[n.ROWS=4]="ROWS",n[n.COLUMNS=5]="COLUMNS",n[n.FULL=6]="FULL",n))(I||{});class cn{#t;#e=0;#u=0;#d=null;#s=null;#l=null;#n=!1;constructor(e){this.#t=e}requestPhase(e,t){e>this.#e&&(this.#e=e),this.#u===0&&(this.#h(),this.#u=requestAnimationFrame(()=>this.#g()))}whenReady(){return this.#d?this.#d:Promise.resolve()}setInitialReadyResolver(e){this.#l=e}cancel(){this.#u!==0&&(cancelAnimationFrame(this.#u),this.#u=0),this.#e=0,this.#s&&(this.#s(),this.#s=null,this.#d=null)}get isPending(){return this.#e!==0}get pendingPhase(){return this.#e}#h(){this.#d||(this.#d=new Promise(e=>{this.#s=e}))}#g(){if(this.#u=0,!this.#t.isConnected()){this.#e=0,this.#s&&(this.#s(),this.#s=null,this.#d=null);return}const e=this.#e;this.#e=0,e>=5&&this.#t.mergeConfig(),e>=4&&this.#t.processRows(),e>=5&&(this.#t.processColumns(),this.#t.updateTemplate()),e>=3&&this.#t.renderHeader(),e>=2&&this.#t.renderVirtualWindow(),e>=1&&this.#t.afterRender(),!this.#n&&this.#l&&(this.#n=!0,this.#l()),this.#s&&(this.#s(),this.#s=null,this.#d=null)}}function Pt(n){let e=null,t=null,i=null,o=null;const r=a=>{if(!e)return;const d=a.clientX-e.startX,c=Math.max(40,e.startWidth+d),u=n._visibleColumns[e.colIndex];u.width=c,u.__userResized=!0,u.__renderedWidth=c,t==null&&(t=requestAnimationFrame(()=>{t=null,n.updateTemplate?.()})),n.dispatchEvent(new CustomEvent("column-resize",{detail:{field:u.field,width:c}}))};let s=!1;const l=()=>{const a=e!==null;a&&(s=!0,requestAnimationFrame(()=>{s=!1})),window.removeEventListener("mousemove",r),window.removeEventListener("mouseup",l),i!==null&&(document.documentElement.style.cursor=i,i=null),o!==null&&(document.body.style.userSelect=o,o=null),e=null,a&&n.requestStateChange&&n.requestStateChange()};return{get isResizing(){return e!==null||s},start(a,d,c){a.preventDefault();const u=n._visibleColumns[d],h=typeof u?.width=="number"?u.width:void 0,f=u?.__renderedWidth??h??c.getBoundingClientRect().width;e={startX:a.clientX,colIndex:d,startWidth:f},window.addEventListener("mousemove",r),window.addEventListener("mouseup",l),i===null&&(i=document.documentElement.style.cursor),document.documentElement.style.cursor="e-resize",o===null&&(o=document.body.style.userSelect),document.body.style.userSelect="none"},resetColumn(a){const d=n._visibleColumns[a];d&&(d.__userResized=!1,d.__renderedWidth=void 0,d.width=d.__originalWidth,n.updateTemplate?.(),n.requestStateChange?.(),n.dispatchEvent(new CustomEvent("column-resize-reset",{detail:{field:d.field,width:d.width}})))},dispose(){l()}}}const Me="data-animating",un={change:"--tbw-row-change-duration",insert:"--tbw-row-insert-duration",remove:"--tbw-row-remove-duration"},hn={change:500,insert:300,remove:200};function fn(n){const e=n.trim().toLowerCase();return e.endsWith("ms")?parseFloat(e):e.endsWith("s")?parseFloat(e)*1e3:parseFloat(e)}function gn(n,e){const t=un[e],i=getComputedStyle(n).getPropertyValue(t);if(i){const o=fn(i);if(!isNaN(o)&&o>0)return o}return hn[e]}function Lt(n,e,t){n.removeAttribute(Me),n.offsetWidth,n.setAttribute(Me,e);const i=gn(n,e);setTimeout(()=>{e!=="remove"&&n.removeAttribute(Me)},i)}function Ne(n,e,t){if(e<0)return!1;const i=n.findRenderedRowElement?.(e);return i?(Lt(i,t),!0):!1}function pn(n,e,t){let i=0;for(const o of e)Ne(n,o,t)&&i++;return i}function wn(n,e,t){const i=n._rows??[],o=n.getRowId;if(!o)return!1;const r=i.findIndex(s=>o(s)===e);return r<0?!1:Ne(n,r,t)}function Ee(n,e,t){const i=document.createElement(n);if(e)for(const o in e){const r=e[o];r!=null&&i.setAttribute(o,r)}return i}function z(n,e){const t=document.createElement("div");if(n&&(t.className=n),e)for(const i in e){const o=e[i];o!=null&&t.setAttribute(i,o)}return t}function Dt(n,e,t){const i=document.createElement("button");if(n&&(i.className=n),e)for(const o in e){const r=e[o];r!=null&&i.setAttribute(o,r)}return i}const Ht=document.createElement("template");Ht.innerHTML=`
1
+ (function(x,J){typeof exports=="object"&&typeof module<"u"?J(exports):typeof define=="function"&&define.amd?define(["exports"],J):(x=typeof globalThis<"u"?globalThis:x||self,J(x.TbwGrid={}))})(this,(function(x){"use strict";const J='@layer tbw-base,tbw-plugins,tbw-theme;@layer tbw-base{tbw-grid{--tbw-base-icon-size: 1em;--tbw-base-radius: .25em;--tbw-font-size: 1em;--tbw-font-size-sm: .9285em;--tbw-font-size-xs: .7857em;--tbw-font-size-2xs: .7142em;--tbw-spacing-xs: .25em;--tbw-spacing-sm: .375em;--tbw-spacing-md: .5em;--tbw-spacing-lg: .75em;--tbw-spacing-xl: 1em;--tbw-icon-size: var(--tbw-base-icon-size);--tbw-icon-size-sm: .875em;--tbw-checkbox-size: var(--tbw-base-icon-size);--tbw-toggle-size: 1.25em;--tbw-border-radius: var(--tbw-base-radius);--tbw-color-bg: transparent;--tbw-color-panel-bg: light-dark(#eeeeee, #222222);--tbw-color-fg: light-dark(#222222, #eeeeee);--tbw-color-fg-muted: light-dark(#555555, #aaaaaa);--tbw-color-accent: light-dark(#3b82f6, #3b82f6);--tbw-color-accent-fg: light-dark(#ffffff, #000000);--tbw-color-success: light-dark(hsl(122, 39%, 40%), hsl(122, 39%, 49%));--tbw-color-warning: light-dark(hsl(38, 92%, 50%), hsl(38, 92%, 50%));--tbw-color-error: light-dark(hsl(0, 65%, 51%), hsl(0, 65%, 55%));--tbw-color-danger: var(--tbw-color-error);--tbw-color-selection: light-dark(#fff7d6, #333333);--tbw-color-row-alt: var(--tbw-color-bg);--tbw-color-row-hover: light-dark(#f0f6ff, #1c1c1c);--tbw-color-header-bg: color-mix(in hsl, var(--tbw-color-panel-bg) 85%, var(--tbw-color-fg));--tbw-color-header-fg: color-mix(in hsl, var(--tbw-color-fg) 75%, var(--tbw-color-panel-bg));--tbw-color-border: light-dark(#d0d0d4, #454545);--tbw-color-border-strong: light-dark(#777777, #666666);--tbw-color-border-cell: var(--tbw-color-border);--tbw-color-border-header: var(--tbw-color-border);--tbw-color-shadow: light-dark(rgba(0, 0, 0, .1), rgba(0, 0, 0, .3));--tbw-font-family: inherit;--tbw-font-size-header: var(--tbw-font-size);--tbw-font-weight-header: bold;--tbw-cell-padding-header: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-cell-padding: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-cell-padding-input: var(--tbw-spacing-xs) var(--tbw-spacing-sm);--tbw-row-height: 1.75em;--tbw-header-height: 1.875em;--tbw-cell-white-space: nowrap;--tbw-border-input: 1px solid var(--tbw-color-border-strong);--tbw-border-header: 1px solid var(--tbw-color-border-header);--tbw-row-divider: 1px solid var(--tbw-color-border-cell);--tbw-row-hover-outline: 0;--tbw-color-active-row-bg: var(--tbw-color-selection);--tbw-active-row-outline: 0;--tbw-focus-outline: 2px solid var(--tbw-color-accent);--tbw-focus-outline-offset: -2px;--tbw-focus-background: rgba(from var(--tbw-color-accent) r g b / 12%);--tbw-range-border-color: var(--tbw-color-accent);--tbw-range-selection-bg: rgba(from var(--tbw-range-border-color) r g b / 12%);--tbw-resize-handle-width: var(--tbw-spacing-sm);--tbw-resize-handle-color: transparent;--tbw-resize-handle-color-hover: var(--tbw-color-accent);--tbw-resize-handle-border-radius: 0;--tbw-resize-indicator-width: 2px;--tbw-resize-indicator-color: var(--tbw-color-accent);--tbw-resize-indicator-opacity: .6;--tbw-transition-duration: .12s;--tbw-transition-ease: ease;--tbw-animation-duration: .2s;--tbw-animation-easing: ease-out;--tbw-animation-enabled: 1;--tbw-row-change-duration: .5s;--tbw-row-insert-duration: .3s;--tbw-row-remove-duration: .2s;--tbw-row-change-color: rgba(from var(--tbw-color-accent) r g b / 25%);--tbw-sort-indicator-color: var(--tbw-color-fg-muted);--tbw-sort-indicator-active-color: var(--tbw-color-accent);--tbw-sort-indicator-display: inline-flex;--tbw-sort-indicator-visibility: visible;--tbw-header-text-transform: none;--tbw-header-letter-spacing: normal;--tbw-color-header-separator: var(--tbw-color-border-cell);--tbw-density-scale: 1;--tbw-shell-header-height: 2.75em;--tbw-shell-header-bg: var(--tbw-color-panel-bg);--tbw-shell-header-border: var(--tbw-color-border);--tbw-shell-title-font-size: var(--tbw-font-size);--tbw-shell-title-font-weight: 600;--tbw-tool-panel-width: 17.5em;--tbw-tool-panel-bg: var(--tbw-color-panel-bg);--tbw-tool-panel-border: var(--tbw-color-border);--tbw-tool-panel-header-height: 2.5em;--tbw-tool-panel-transition: var(--tbw-animation-duration) var(--tbw-animation-easing);--tbw-toolbar-button-size: 2em;--tbw-toolbar-button-gap: var(--tbw-spacing-xs);--tbw-panel-padding: var(--tbw-spacing-lg);--tbw-panel-gap: var(--tbw-spacing-md);--tbw-menu-item-padding: var(--tbw-spacing-sm) var(--tbw-spacing-lg);--tbw-menu-item-gap: var(--tbw-spacing-md);--tbw-menu-min-width: 10rem;--tbw-button-padding: var(--tbw-spacing-sm) var(--tbw-spacing-lg);--tbw-button-padding-sm: var(--tbw-spacing-xs) var(--tbw-spacing-md);--tbw-input-height: var(--tbw-row-height);--tbw-input-padding: 0 var(--tbw-spacing-md);--tbw-detail-padding: var(--tbw-spacing-xl);--tbw-detail-max-height: 31.25rem;--tbw-indicator-size: var(--tbw-spacing-sm);color-scheme:light dark;position:relative;display:block;width:100%;height:100%;min-height:0;contain:content;font-family:var(--tbw-font-family);font-size:var(--tbw-font-size);background:var(--tbw-color-bg);color:var(--tbw-color-fg);border:1px solid var(--tbw-color-border);border-radius:var(--tbw-border-radius);overflow:clip;outline:none}tbw-grid,tbw-grid *{box-sizing:border-box}tbw-grid .header{display:block;flex-shrink:0;z-index:var(--tbw-z-layer-header, 30);background:var(--tbw-color-header-bg);overflow:visible}tbw-grid .header-group-row{display:grid;grid-template-columns:var(--tbw-column-template);background:var(--tbw-color-header-bg);z-index:var(--tbw-z-layer-header, 30)}tbw-grid .header-group-cell{display:flex;align-items:center;justify-content:flex-start;padding:var(--tbw-cell-padding-header, 2px 8px);color:var(--tbw-color-header-group-fg, var(--tbw-color-header-fg));font-weight:var(--tbw-font-weight-header-group, var(--tbw-font-weight-header));justify-content:var(--tbw-align-header-group, var(--tbw-align-header, flex-start))}tbw-grid .header-group-cell:not(:last-child){border-right:2px solid var(--tbw-color-border)}tbw-grid .header-row{display:grid;grid-template-columns:var(--tbw-column-template);color:var(--tbw-color-header-fg);font-size:var(--tbw-font-size-header);min-height:var(--tbw-header-height);border-bottom:var(--tbw-border-header);z-index:var(--tbw-z-layer-header, 30);text-transform:var(--tbw-header-text-transform);letter-spacing:var(--tbw-header-letter-spacing)}tbw-grid .header-row>.cell{display:flex;align-items:center;gap:4px;padding:var(--tbw-cell-padding-header, 2px 8px);background-color:var(--tbw-color-header-bg);font-weight:var(--tbw-font-weight-header);border-right:1px solid var(--tbw-color-border-cell);overflow:visible;min-width:0}tbw-grid .header-row>.cell>span:first-child{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:inherit}tbw-grid .header-row>.cell>span[part~=sort-indicator]{flex-shrink:0;opacity:.6;color:var(--tbw-sort-indicator-color);display:var(--tbw-sort-indicator-display, inline-flex);visibility:var(--tbw-sort-indicator-visibility, visible);transition:opacity .15s,visibility 0s,display 0s allow-discrete;transition-behavior:allow-discrete}tbw-grid .header-row>.cell:hover>span[part~=sort-indicator]{display:inline-flex;visibility:visible}tbw-grid .header-row>.cell[aria-sort=ascending]>span[part~=sort-indicator],tbw-grid .header-row>.cell[aria-sort=descending]>span[part~=sort-indicator]{display:inline-flex;visibility:visible;opacity:1;color:var(--tbw-sort-indicator-active-color)}tbw-grid .header-row>.cell:last-child{border-right:0}tbw-grid .header-row>.cell.grouped.group-end:not(:last-child){border-right:2px solid var(--tbw-color-border)}tbw-grid .header-row>.cell.resizable{position:relative}tbw-grid .header-row>.cell.sticky-left,tbw-grid .header-row>.cell.sticky-right{background:var(--tbw-color-header-bg);z-index:35}tbw-grid .tbw-grid-root{position:relative;display:flex;flex-direction:column;height:100%}tbw-grid .tbw-grid-root.has-shell{display:flex;flex-direction:column;height:100%}tbw-grid .rows-body-wrapper{flex:1;min-height:0;display:flex;flex-direction:row;width:100%;min-width:fit-content}tbw-grid .rows-body{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:visible}tbw-grid .rows-container{display:flex;flex-direction:row;flex:1;min-height:0;overflow:visible}tbw-grid .rows-viewport{flex:1;min-width:0;position:relative;display:block;overflow:clip}tbw-grid .rows-viewport .rows{position:absolute;top:0;left:0;min-width:100%;will-change:transform;z-index:var(--tbw-z-layer-rows, 1)}tbw-grid .faux-vscroll{position:sticky;inset-inline-end:0;flex-shrink:0;width:auto;overflow-y:auto;overflow-x:hidden;z-index:var(--tbw-z-layer-header, 30)}tbw-grid .faux-vscroll-spacer{width:1px}tbw-grid .data-grid-row{display:grid;grid-template-columns:var(--tbw-column-template);contain:layout style;content-visibility:auto;contain-intrinsic-size:auto var(--tbw-row-height)}tbw-grid .data-grid-row:nth-child(2n){background:var(--tbw-color-row-alt)}tbw-grid .data-grid-row:hover{background:var(--tbw-color-row-hover)}tbw-grid .data-grid-row>.cell{display:block;padding:var(--tbw-cell-padding, 2px 8px);border-bottom:var(--tbw-row-divider);min-height:var(--tbw-row-height);line-height:calc(var(--tbw-row-height) - 5px);border-right:1px solid var(--tbw-color-border-cell);overflow:hidden;min-width:0;white-space:var(--tbw-cell-white-space, nowrap);text-overflow:ellipsis}tbw-grid .data-grid-row>.cell>*{overflow:hidden;text-overflow:ellipsis;white-space:inherit;min-width:0}tbw-grid .data-grid-row>.cell:last-child{border-right:0}tbw-grid .data-grid-row>.cell[data-type=boolean]{text-align:center}tbw-grid .data-grid-row>.cell[data-type=boolean] input[type=checkbox]{margin:0;width:var(--tbw-checkbox-size);height:var(--tbw-checkbox-size);vertical-align:middle}tbw-grid .data-grid-row>.cell.selected:focus-visible,tbw-grid .data-grid-row>.cell:focus-visible:not(.cell-focus){outline:none}tbw-grid .data-grid-row>.cell.sticky-left,tbw-grid .data-grid-row>.cell.sticky-right{background:var(--tbw-color-panel-bg)}tbw-grid .selecting .data-grid-row>.cell{-webkit-user-select:none;user-select:none}tbw-grid .sortable{cursor:pointer;-webkit-user-select:none;user-select:none}tbw-grid .resize-handle{position:absolute;top:0;right:calc(var(--tbw-resize-handle-width) / -2);width:var(--tbw-resize-handle-width);height:100%;cursor:e-resize;-webkit-user-select:none;user-select:none;touch-action:none;z-index:20;background:var(--tbw-resize-handle-color);transition:background .12s ease;border-radius:var(--tbw-resize-handle-border-radius)}tbw-grid .resize-handle:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);width:var(--tbw-resize-indicator-width, 2px);height:0;background:var(--tbw-resize-indicator-color, var(--tbw-color-accent));opacity:0;pointer-events:none;transition:opacity .12s ease,height 0s .12s;z-index:1000}tbw-grid .resize-handle:hover{background:var(--tbw-resize-handle-color-hover)}tbw-grid .resize-handle:hover:after{height:100vh;opacity:var(--tbw-resize-indicator-opacity, .6);transition:opacity .12s ease,height 0s}tbw-grid[data-has-focus] .cell-focus,tbw-grid[data-has-focus] .row-focus{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}tbw-grid .sticky-left,tbw-grid .sticky-right{position:sticky;z-index:25}tbw-grid .sticky-left{box-shadow:1px 0 0 var(--tbw-color-border)}tbw-grid .sticky-right{box-shadow:-1px 0 0 var(--tbw-color-border)}tbw-grid .tbw-shell-header{display:flex;align-items:center;gap:8px;min-height:var(--tbw-shell-header-height);padding:0 8px;background:var(--tbw-shell-header-bg);border-bottom:1px solid var(--tbw-shell-header-border);flex-shrink:0}tbw-grid .tbw-shell-title{font-size:var(--tbw-shell-title-font-size);font-weight:var(--tbw-shell-title-font-weight);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}tbw-grid .tbw-shell-content{flex:1;display:flex;align-items:center;gap:12px;min-width:0;overflow:hidden}tbw-grid .tbw-shell-toolbar{display:flex;align-items:center;gap:var(--tbw-toolbar-button-gap);flex-shrink:0}tbw-grid .tbw-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--tbw-toolbar-button-size);height:var(--tbw-toolbar-button-size);padding:0;border:1px solid transparent;border-radius:var(--tbw-border-radius);background:transparent;color:var(--tbw-color-fg);cursor:pointer;font-size:16px;transition:background var(--tbw-transition-duration) var(--tbw-transition-ease),border-color var(--tbw-transition-duration) var(--tbw-transition-ease)}tbw-grid .tbw-toolbar-btn:hover{background:var(--tbw-color-row-hover)}tbw-grid .tbw-toolbar-btn:focus-visible{outline:var(--tbw-focus-outline);outline-offset:var(--tbw-focus-outline-offset)}tbw-grid .tbw-toolbar-btn.active{background:var(--tbw-focus-background);border-color:var(--tbw-color-accent)}tbw-grid .tbw-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}tbw-grid .tbw-toolbar-separator{width:1px;height:20px;background:var(--tbw-color-border);margin:0 4px}tbw-grid .tbw-shell-body{position:relative;display:flex;flex:1;min-height:0;overflow:visible}tbw-grid .tbw-grid-content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:row;overflow:hidden}tbw-grid .tbw-scroll-area{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow-x:auto;overflow-y:hidden;overflow-anchor:none}tbw-grid .tbw-tool-panel{position:absolute;top:0;bottom:0;right:0;width:0;overflow:hidden;background:var(--tbw-tool-panel-bg);border-left:1px solid var(--tbw-tool-panel-border);transition:width var(--tbw-tool-panel-transition);display:flex;flex-direction:column;z-index:30;box-shadow:-2px 0 8px var(--tbw-color-shadow)}tbw-grid .tbw-tool-panel[data-position=left]{right:auto;left:0;border-left:none;border-right:1px solid var(--tbw-tool-panel-border);box-shadow:2px 0 8px var(--tbw-color-shadow)}tbw-grid .tbw-tool-panel.open{width:var(--tbw-tool-panel-width)}tbw-grid .tbw-tool-panel-resize{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;background:transparent;z-index:10;transition:background var(--tbw-transition-duration) var(--tbw-transition-ease)}tbw-grid .tbw-tool-panel-resize[data-handle-position=left]{left:0}tbw-grid .tbw-tool-panel-resize[data-handle-position=right]{right:0}tbw-grid .tbw-tool-panel-resize:hover,tbw-grid .tbw-tool-panel-resize.resizing{background:var(--tbw-color-accent)}tbw-grid .tbw-tool-panel-header{display:flex;align-items:center;justify-content:space-between;min-height:var(--tbw-tool-panel-header-height);padding:0 12px;border-bottom:1px solid var(--tbw-tool-panel-border);flex-shrink:0}tbw-grid .tbw-tool-panel-title{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}tbw-grid .tbw-tool-panel-close{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:var(--tbw-border-radius);background:transparent;color:var(--tbw-color-fg-muted);cursor:pointer;font-size:14px}tbw-grid .tbw-tool-panel-close:hover{background:var(--tbw-color-row-hover);color:var(--tbw-color-fg)}tbw-grid .tbw-tool-panel-content{flex:1;overflow:auto}tbw-grid .tbw-accordion{display:flex;flex-direction:column;gap:0}tbw-grid .tbw-accordion-section{border-bottom:1px solid var(--tbw-tool-panel-border)}tbw-grid .tbw-accordion-section:last-child{border-bottom:none}tbw-grid .tbw-accordion-section.single .tbw-accordion-header{cursor:default}tbw-grid .tbw-accordion-section.single .tbw-accordion-header:hover{background:transparent}tbw-grid .tbw-accordion-section.expanded .tbw-accordion-chevron{transform:rotate(90deg)}tbw-grid .tbw-accordion-section.expanded .tbw-accordion-content{display:block}tbw-grid .tbw-accordion-header{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;background:transparent;color:var(--tbw-color-fg);font-size:13px;font-weight:600;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none}tbw-grid .tbw-accordion-header:hover{background:var(--tbw-color-row-hover)}tbw-grid .tbw-accordion-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:10px;color:var(--tbw-color-fg-muted);transition:transform .15s ease;flex-shrink:0}tbw-grid .tbw-accordion-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:14px;flex-shrink:0}tbw-grid .tbw-accordion-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}tbw-grid .tbw-accordion-content{display:none}tbw-grid .tbw-expanding{animation:tbw-expand var(--tbw-animation-duration) var(--tbw-animation-easing) forwards;overflow:hidden}tbw-grid .tbw-collapsing{animation:tbw-collapse var(--tbw-animation-duration) var(--tbw-animation-easing) forwards;overflow:hidden}tbw-grid[data-animation-mode=off]{--tbw-animation-enabled: 0;--tbw-animation-duration: 0ms}tbw-grid[data-animation-mode=off] .data-grid-row[data-animating]{animation:none}@media(forced-colors:active){tbw-grid{--tbw-color-border: CanvasText;--tbw-color-border-strong: CanvasText;--tbw-color-border-cell: CanvasText;--tbw-color-border-header: CanvasText;--tbw-color-fg: CanvasText;--tbw-color-bg: Canvas;--tbw-color-panel-bg: Canvas;--tbw-color-header-bg: Canvas;--tbw-color-header-fg: CanvasText;--tbw-color-accent: Highlight;--tbw-color-accent-fg: HighlightText;--tbw-color-selection: Highlight;--tbw-color-row-hover: Highlight;--tbw-focus-outline: 2px solid Highlight;--tbw-range-border-color: Highlight}tbw-grid .cell:focus,tbw-grid .cell.active-cell{outline:2px solid Highlight!important;outline-offset:-2px}tbw-grid .data-grid-row[aria-selected=true]{background:Highlight!important;color:HighlightText!important}}@media(prefers-reduced-motion:reduce){tbw-grid[data-animation-mode=reduced-motion]{--tbw-animation-enabled: 0;--tbw-animation-duration: 0ms}tbw-grid[data-animation-mode=reduced-motion] .data-grid-row[data-animating]{animation:none}}@keyframes tbw-expand{0%{opacity:0;max-height:0;transform:translateY(-8px)}to{opacity:1;max-height:500px;transform:translateY(0)}}@keyframes tbw-collapse{0%{opacity:1;max-height:500px;transform:translateY(0)}to{opacity:0;max-height:0;transform:translateY(-8px)}}@keyframes tbw-row-change{0%{background-color:transparent}20%{background-color:var(--tbw-row-change-color)}to{background-color:transparent}}@keyframes tbw-row-insert{0%{opacity:0;max-height:0;overflow:hidden}to{opacity:1;max-height:var(--tbw-row-height, 28px);overflow:hidden}}@keyframes tbw-row-remove{0%{opacity:1;transform:translateY(0);max-height:var(--tbw-row-height, 28px)}to{opacity:0;max-height:0;transform:translateY(-8px)}}tbw-grid .data-grid-row[data-animating=change]{animation:tbw-row-change var(--tbw-row-change-duration) ease-out}tbw-grid .data-grid-row[data-animating=insert]{animation:tbw-row-insert var(--tbw-row-insert-duration) ease-out;will-change:max-height,opacity}tbw-grid .data-grid-row[data-animating=remove]{animation:tbw-row-remove var(--tbw-row-remove-duration) ease-out forwards;will-change:max-height,opacity,transform;pointer-events:none}@keyframes tbw-spin{to{transform:rotate(360deg)}}.tbw-loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:light-dark(rgba(255,255,255,.7),rgba(0,0,0,.5));z-index:1000;pointer-events:all;animation:tbw-fade-in .15s ease-out}@keyframes tbw-fade-in{0%{opacity:0}to{opacity:1}}.tbw-spinner{--tbw-spinner-size: 48px;--tbw-spinner-border-width: 3px;--tbw-spinner-color: var(--tbw-color-accent);--tbw-spinner-track-color: var(--tbw-color-border);width:var(--tbw-spinner-size);height:var(--tbw-spinner-size);border:var(--tbw-spinner-border-width) solid var(--tbw-spinner-track-color);border-top-color:var(--tbw-spinner-color);border-radius:50%;animation:tbw-spin .8s linear infinite}.tbw-spinner--large{--tbw-spinner-size: min(48px, calc(100% - 16px) )}.tbw-spinner--small{--tbw-spinner-size: calc(var(--tbw-row-height, 28px) * .6);--tbw-spinner-border-width: 2px}.data-grid-row.tbw-row-loading{position:relative;pointer-events:none}.data-grid-row.tbw-row-loading:before{content:"";position:absolute;inset:0;background:light-dark(rgba(255,255,255,.7),rgba(0,0,0,.5));z-index:10;animation:tbw-fade-in .15s ease-out}.data-grid-row.tbw-row-loading:after{--_spinner-size: calc(var(--tbw-row-height, 28px) * .6);content:"";position:absolute;left:var(--tbw-spacing-md);top:0;bottom:0;margin:auto 0;width:var(--_spinner-size);height:var(--_spinner-size);border:2px solid var(--tbw-spinner-track-color, var(--tbw-color-border));border-top-color:var(--tbw-spinner-color, var(--tbw-color-accent));border-radius:50%;animation:tbw-spin .8s linear infinite;z-index:11}.cell.tbw-cell-loading{position:relative;pointer-events:none}.cell.tbw-cell-loading:before{content:"";position:absolute;inset:0;background:light-dark(rgba(255,255,255,.7),rgba(0,0,0,.5));z-index:10;animation:tbw-fade-in .15s ease-out}.cell.tbw-cell-loading:after{--_spinner-size: calc(var(--tbw-row-height, 28px) * .5);content:"";position:absolute;left:var(--tbw-spacing-sm);top:0;bottom:0;margin:auto 0;width:var(--_spinner-size);height:var(--_spinner-size);border:2px solid var(--tbw-spinner-track-color, var(--tbw-color-border));border-top-color:var(--tbw-spinner-color, var(--tbw-color-accent));border-radius:50%;animation:tbw-spin .8s linear infinite;z-index:11}}',Q={STRETCH:"stretch",FIXED:"fixed"},at={mode:"reduced-motion",duration:200,easing:"ease-out"},dt='<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/></svg>',G={expand:"▶",collapse:"▼",sortAsc:"▲",sortDesc:"▼",sortNone:"⇅",submenuArrow:"▶",dragHandle:"⋮⋮",toolPanel:"☰",filter:dt,filterActive:dt,print:"🖨️"};function Hi(n){return Array.from(n.querySelectorAll("tbw-grid-column")).map(t=>{const i=t.getAttribute("field")||"";if(!i)return null;const o=t.getAttribute("type")||void 0,s=o&&new Set(["number","string","date","boolean","select"]).has(o)?o:void 0,l=t.getAttribute("header")||void 0,a=t.hasAttribute("sortable"),d=t.hasAttribute("editable"),c={field:i,type:s,header:l,sortable:a,editable:d},u=t.getAttribute("width");if(u){const b=parseFloat(u);!isNaN(b)&&/^\d+(\.\d+)?$/.test(u.trim())?c.width=b:c.width=u}const h=t.getAttribute("minWidth")||t.getAttribute("min-width");if(h){const b=parseFloat(h);isNaN(b)||(c.minWidth=b)}t.hasAttribute("resizable")&&(c.resizable=!0),t.hasAttribute("sizable")&&(c.resizable=!0);const f=t.getAttribute("editor"),p=t.getAttribute("renderer");f&&(c.__editorName=f),p&&(c.__rendererName=p);const g=t.getAttribute("options");g&&(c.options=g.split(",").map(b=>{const[S,R]=b.includes(":")?b.split(":"):[b.trim(),b.trim()];return{value:S.trim(),label:R?.trim()||S.trim()}}));const w=t.querySelector("tbw-grid-column-view"),m=t.querySelector("tbw-grid-column-editor"),y=t.querySelector("tbw-grid-column-header");w&&(c.__viewTemplate=w),m&&(c.__editorTemplate=m),y&&(c.__headerTemplate=y);const T=globalThis.DataGridElement?.getAdapters?.()??[],_=w??t,E=T.find(b=>b.canHandle(_));if(E){const b=E.createRenderer(_);b&&(c.viewRenderer=b)}const L=m??t,P=T.find(b=>b.canHandle(L));if(P){const b=P.createEditor(L);b&&(c.editor=b)}return c}).filter(t=>!!t)}function ct(n,e){if((!n||!n.length)&&(!e||!e.length))return[];if(!n||!n.length)return e||[];if(!e||!e.length)return n;const t={};e.forEach(o=>{const r=t[o.field];if(r){o.header&&!r.header&&(r.header=o.header),o.type&&!r.type&&(r.type=o.type),o.sortable&&(r.sortable=!0),o.editable&&(r.editable=!0),o.resizable&&(r.resizable=!0),o.width!=null&&r.width==null&&(r.width=o.width),o.minWidth!=null&&r.minWidth==null&&(r.minWidth=o.minWidth),o.__viewTemplate&&(r.__viewTemplate=o.__viewTemplate),o.__editorTemplate&&(r.__editorTemplate=o.__editorTemplate),o.__headerTemplate&&(r.__headerTemplate=o.__headerTemplate);const s=o.renderer||o.viewRenderer,l=r.renderer||r.viewRenderer;s&&!l&&(r.viewRenderer=s,o.renderer&&(r.renderer=s)),o.editor&&!r.editor&&(r.editor=o.editor)}else t[o.field]={...o}});const i=n.map(o=>{const r=t[o.field];if(!r)return o;const s={...o};r.header&&!s.header&&(s.header=r.header),r.type&&!s.type&&(s.type=r.type),s.sortable=o.sortable||r.sortable,(o.resizable===!0||r.resizable===!0)&&(s.resizable=!0),s.editable=o.editable||r.editable,r.width!=null&&s.width==null&&(s.width=r.width),r.minWidth!=null&&s.minWidth==null&&(s.minWidth=r.minWidth),r.__viewTemplate&&(s.__viewTemplate=r.__viewTemplate),r.__editorTemplate&&(s.__editorTemplate=r.__editorTemplate),r.__headerTemplate&&(s.__headerTemplate=r.__headerTemplate);const l=r.renderer||r.viewRenderer,a=s.renderer||s.viewRenderer;return l&&!a&&(s.viewRenderer=l,r.renderer&&(s.renderer=l)),r.editor&&!s.editor&&(s.editor=r.editor),delete t[o.field],s});return Object.keys(t).forEach(o=>i.push(t[o])),i}function ut(n,e){try{n.part?.add?.(e)}catch{}const t=n.getAttribute("part");t?t.split(/\s+/).includes(e)||n.setAttribute("part",t+" "+e):n.setAttribute("part",e)}function ht(n){const e=n.effectiveConfig?.fitMode||n.fitMode||Q.STRETCH;if(e!==Q.STRETCH&&e!==Q.FIXED||n.__didInitialAutoSize||!n.isConnected)return;const t=Array.from(n._headerRowEl?.children||[]);if(!t.length)return;let i=!1;n._visibleColumns.forEach((o,r)=>{if(o.width)return;const s=t[r];let l=s?s.scrollWidth:0;for(const a of n._rowPool){const d=a.children[r];if(d){const c=d.scrollWidth;c>l&&(l=c)}}l>0&&(o.width=l+2,o.__autoSized=!0,i=!0)}),i&&le(n),n.__didInitialAutoSize=!0}function le(n){(n.effectiveConfig?.fitMode||n.fitMode||Q.STRETCH)===Q.STRETCH?n._gridTemplate=n._visibleColumns.map(t=>{if(t.width)return`${t.width}px`;const i=t.minWidth;return i!=null?`minmax(${i}px, 1fr)`:"1fr"}).join(" ").trim():n._gridTemplate=n._visibleColumns.map(t=>t.width?`${t.width}px`:"max-content").join(" "),n.style.setProperty("--tbw-column-template",n._gridTemplate)}function Ii(n){return n==null?"string":typeof n=="number"?"number":typeof n=="boolean"?"boolean":n instanceof Date||typeof n=="string"&&/\d{4}-\d{2}-\d{2}/.test(n)&&!isNaN(Date.parse(n))?"date":"string"}function Mi(n,e){const t=n[0]||{},i=Object.keys(t).map(r=>{const s=t[r],l=Ii(s);return{field:r,header:r.charAt(0).toUpperCase()+r.slice(1),type:l}}),o={};return i.forEach(r=>{o[r.field]=r.type||"string"}),{columns:i,typeMap:o}}const Ni=/{{\s*([^}]+)\s*}}/g,q="__DG_EMPTY__",zi=/^[\w$. '?+\-*/%:()!<>=,&|]+$/,Oi=/__(proto|defineGetter|defineSetter)|constructor|window|globalThis|global|process|Function|import|eval|Reflect|Proxy|Error|arguments|document|location|cookie|localStorage|sessionStorage|indexedDB|fetch|XMLHttpRequest|WebSocket|Worker|SharedWorker|ServiceWorker|opener|parent|top|frames|self|this\b/;function Fi(n){return!n||typeof n!="string"?"":n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const qi=new Set(["script","iframe","object","embed","form","input","button","textarea","select","link","meta","base","style","template","slot","portal","frame","frameset","applet","noscript","noembed","plaintext","xmp","listing"]),ft=/^on\w+$/i,Gi=new Set(["href","src","action","formaction","data","srcdoc","xlink:href","poster","srcset"]),Bi=/^\s*(javascript|vbscript|data|blob):/i;function U(n){if(!n||typeof n!="string")return"";if(n.indexOf("<")===-1)return n;const e=document.createElement("template");return e.innerHTML=n,$i(e.content),e.innerHTML}function $i(n){const e=[],t=n.querySelectorAll("*");for(const i of t){const o=i.tagName.toLowerCase();if(qi.has(o)){e.push(i);continue}if((o==="svg"||i.namespaceURI==="http://www.w3.org/2000/svg")&&Array.from(i.attributes).some(l=>ft.test(l.name)||l.name==="href"||l.name==="xlink:href")){e.push(i);continue}const r=[];for(const s of i.attributes){const l=s.name.toLowerCase();if(ft.test(l)){r.push(s.name);continue}if(Gi.has(l)&&Bi.test(s.value)){r.push(s.name);continue}if(l==="style"&&/expression\s*\(|javascript:|behavior\s*:/i.test(s.value)){r.push(s.name);continue}}r.forEach(s=>i.removeAttribute(s))}e.forEach(i=>i.remove())}function ke(n,e){if(!n||n.indexOf("{{")===-1)return n;const t=[],i=n.replace(Ni,(l,a)=>{const d=Ki(a,e);return t.push({expr:a.trim(),result:d}),d}),o=Vi(i),r=t.length&&t.every(l=>l.result===""||l.result===q);return/Reflect\.|\bProxy\b|ownKeys\(/.test(n)||r?"":o}function Ki(n,e){if(n=(n||"").trim(),!n||/\b(Reflect|Proxy|ownKeys)\b/.test(n))return q;if(n==="value")return e.value==null?q:String(e.value);if(n.startsWith("row.")&&!/[()?]/.test(n)&&!n.includes(":")){const i=n.slice(4),o=e.row?e.row[i]:void 0;return o==null?q:String(o)}if(n.length>80||!zi.test(n)||Oi.test(n))return q;const t=n.match(/\./g);if(t&&t.length>1)return q;try{const o=new Function("value","row",`return (${n});`)(e.value,e.row),r=o==null?"":String(o);return/Reflect|Proxy|ownKeys/.test(r)?q:r||q}catch{return q}}function Vi(n){return n&&n.replace(new RegExp(q,"g"),"").replace(/Reflect\.[^<>{}\s]+/g,"").replace(/\bProxy\b/g,"").replace(/ownKeys\([^)]*\)/g,"")}function Wi(n){if(/Reflect|Proxy|ownKeys/.test(n.textContent||"")){if(Array.from(n.childNodes).forEach(e=>{e.nodeType===Node.TEXT_NODE&&/Reflect|Proxy|ownKeys/.test(e.textContent||"")&&(e.textContent="")}),/Reflect|Proxy|ownKeys/.test(n.textContent||"")){if(/Reflect|Proxy|ownKeys/.test(n.textContent||""))for(;n.firstChild;)n.removeChild(n.firstChild);n.textContent=(n.textContent||"").replace(/Reflect|Proxy|ownKeys/g,"")}(n.textContent||"").trim().length===0&&(n.textContent="")}}function gt(n){const e=/Reflect\.|\bProxy\b|ownKeys\(/.test(n),t=(i=>e?"":ke(n,i));return t.__blocked=e,t}const Ui=100;class ji{#t;#e;#u;#d;#s;#l={};#n={};#h=!0;#g=[];#f;#c;#m;#a;#w;constructor(e){this.#a=e}get original(){return this.#l}get effective(){return this.#n}get columns(){return this.#n.columns??[]}set columns(e){this.#n.columns=e}get lightDomColumnsCache(){return this.#d}set lightDomColumnsCache(e){this.#d=e}get originalColumnNodes(){return this.#s}set originalColumnNodes(e){this.#s=e}get lightDomTitle(){return this.#w}set lightDomTitle(e){this.#w=e}get initialColumnState(){return this.#m}set initialColumnState(e){this.#m=e}get sourcesChanged(){return this.#h}markSourcesChanged(){this.#h=!0}setGridConfig(e){this.#t=e,this.#h=!0,this.#d=void 0}getGridConfig(){return this.#t}setColumns(e){this.#e=e,this.#h=!0}getColumns(){return this.#e}setFitMode(e){this.#u=e,this.#h=!0}getFitMode(){return this.#u}merge(){const e=(this.#n.columns?.length??0)>0;if(!this.#h&&e)return;const t=this.#b();this.#h=!1,this.#l=t,Object.freeze(this.#l),this.#l.columns&&Object.freeze(this.#l.columns),this.#n=this.#y(this.#l),this.#C()}#y(e){const t={...e};return e.columns&&(t.columns=e.columns.map(i=>({...i}))),e.shell&&(t.shell={...e.shell,header:e.shell.header?{...e.shell.header}:void 0,toolPanel:e.shell.toolPanel?{...e.shell.toolPanel}:void 0,toolPanels:e.shell.toolPanels?.map(i=>({...i})),headerContents:e.shell.headerContents?.map(i=>({...i}))}),t}#C(){const e=this.#n;e.rowHeight&&e.rowHeight>0&&this.#a.setRowHeight(e.rowHeight),e.fitMode==="fixed"&&this.columns.forEach(i=>{i.width==null&&(i.width=80)}),this.#a.applyAnimationConfig(e)}#b(){const e=this.#t?{...this.#t}:{},t=Array.isArray(e.columns)?[...e.columns]:[],i=(this.#d??[]).map(s=>({...s}));let o=ct(t,i);this.#e&&this.#e.length&&(o=ct(this.#e,i));const r=this.#a.getRows();return o.length===0&&r.length&&(o=Mi(r).columns),o.length&&(o.forEach(s=>{s.sortable===void 0&&(s.sortable=!0),s.resizable===void 0&&(s.resizable=!0),s.__originalWidth===void 0&&typeof s.width=="number"&&(s.__originalWidth=s.width)}),o.forEach(s=>{s.__viewTemplate&&!s.__compiledView&&(s.__compiledView=gt(s.__viewTemplate.innerHTML)),s.__editorTemplate&&!s.__compiledEditor&&(s.__compiledEditor=gt(s.__editorTemplate.innerHTML))}),e.columns=o),this.#u&&(e.fitMode=this.#u),e.fitMode||(e.fitMode="stretch"),this.#E(e),e.columnState&&!this.#m&&(this.#m=e.columnState),e}#E(e){e.shell=e.shell?{...e.shell}:{},e.shell.header=e.shell.header?{...e.shell.header}:{};const t=this.#a.getShellLightDomTitle();t&&(this.#w=t),this.#w&&!e.shell.header.title&&(e.shell.header.title=this.#w);const i=this.#a.getShellLightDomHeaderContent();i?.length>0&&(e.shell.header.lightDomContent=i),this.#a.getShellHasToolButtonsContainer()&&(e.shell.header.hasToolButtonsContainer=!0);const o=this.#a.getShellToolPanels();if(o.size>0){const u=Array.from(o.values());u.sort((h,f)=>(h.order??100)-(f.order??100)),e.shell.toolPanels=u}const r=this.#a.getShellHeaderContents();if(r.size>0){const u=Array.from(r.values());u.sort((h,f)=>(h.order??100)-(f.order??100)),e.shell.headerContents=u}const s=this.#a.getShellToolbarContents(),l=Array.from(s.values()),a=this.#t?.shell?.header?.toolbarContents??[],d=new Set(a.map(u=>u.id)),c=[...a];for(const u of l)d.has(u.id)||c.push(u);c.sort((u,h)=>(u.order??0)-(h.order??0)),e.shell.header.toolbarContents=c}collectState(e){const t=this.columns,i=this.#R();return{columns:t.map((o,r)=>{const s={field:o.field,order:r,visible:!o.hidden},l=o;l.__renderedWidth!==void 0?s.width=l.__renderedWidth:o.width!==void 0&&(s.width=typeof o.width=="string"?parseFloat(o.width):o.width);const a=i.get(o.field);a&&(s.sort=a);for(const d of e)if(d.getColumnState){const c=d.getColumnState(o.field);c&&Object.assign(s,c)}return s})}}applyState(e,t){if(!e.columns||e.columns.length===0)return;const i=this.columns,o=new Map(e.columns.map(l=>[l.field,l])),r=i.map(l=>{const a=o.get(l.field);if(!a)return l;const d={...l};return a.width!==void 0&&(d.width=a.width,d.__renderedWidth=a.width),a.visible!==void 0&&(d.hidden=!a.visible),d});r.sort((l,a)=>{const d=o.get(l.field)?.order??1/0,c=o.get(a.field)?.order??1/0;return d-c}),this.columns=r;const s=e.columns.filter(l=>l.sort!==void 0).sort((l,a)=>(l.sort?.priority??0)-(a.sort?.priority??0));if(s.length>0){const l=s[0];l.sort&&this.#a.setSortState({field:l.field,direction:l.sort.direction==="asc"?1:-1})}else this.#a.setSortState(null);for(const l of t)if(l.applyColumnState)for(const a of e.columns)l.applyColumnState(a.field,a)}resetState(e){this.#m=void 0,this.#a.setSortState(null),this.#n=this.#y(this.#l),this.#C();for(const t of e)if(t.applyColumnState)for(const i of this.columns)t.applyColumnState(i.field,{field:i.field,order:0,visible:!0});this.requestStateChange(e)}#R(){const e=new Map,t=this.#a.getSortState();return t&&e.set(t.field,{direction:t.direction===1?"asc":"desc",priority:0}),e}requestStateChange(e){this.#c&&clearTimeout(this.#c),this.#c=setTimeout(()=>{this.#c=void 0;const t=this.collectState(e);this.#a.emit("column-state-change",t)},Ui)}setColumnVisible(e,t){const i=this.columns,o=i.find(s=>s.field===e);return!o||!t&&o.lockVisible||!t&&i.filter(l=>!l.hidden&&l.field!==e).length===0||!!o.hidden===!t?!1:(o.hidden=!t,this.#a.emit("column-visibility",{field:e,visible:t,visibleColumns:i.filter(s=>!s.hidden).map(s=>s.field)}),this.#a.clearRowPool(),this.#a.setup(),!0)}toggleColumnVisibility(e){const t=this.columns.find(i=>i.field===e);return t?this.setColumnVisible(e,!!t.hidden):!1}isColumnVisible(e){const t=this.columns.find(i=>i.field===e);return t?!t.hidden:!1}showAllColumns(){const e=this.columns;e.some(t=>t.hidden)&&(e.forEach(t=>t.hidden=!1),this.#a.emit("column-visibility",{visibleColumns:e.map(t=>t.field)}),this.#a.clearRowPool(),this.#a.setup())}getAllColumns(){return this.columns.map(e=>({field:e.field,header:e.header||e.field,visible:!e.hidden,lockVisible:e.lockVisible,utility:e.meta?.utility===!0}))}getColumnOrder(){return this.columns.map(e=>e.field)}setColumnOrder(e){if(!e.length)return;const t=new Map(this.columns.map(o=>[o.field,o])),i=[];for(const o of e){const r=t.get(o);r&&(i.push(r),t.delete(o))}for(const o of t.values())i.push(o);this.columns=i,this.#a.renderHeader(),this.#a.updateTemplate(),this.#a.refreshVirtualWindow()}parseLightDomColumns(e){this.#d||(this.#s=Array.from(e.querySelectorAll("tbw-grid-column")),this.#d=this.#s.length?Hi(e):[])}clearLightDomCache(){this.#d=void 0}#v=new Map;registerLightDomHandler(e,t){this.#v.set(e.toLowerCase(),t)}unregisterLightDomHandler(e){this.#v.delete(e.toLowerCase())}observeLightDOM(e){this.#f&&this.#f.disconnect();const t=new Set;let i=null;const o=()=>{i=null;for(const r of t)this.#v.get(r)?.();t.clear()};this.#f=new MutationObserver(r=>{for(const s of r){for(const l of s.addedNodes){if(l.nodeType!==Node.ELEMENT_NODE)continue;const d=l.tagName.toLowerCase();this.#v.has(d)&&t.add(d)}if(s.type==="attributes"&&s.target.nodeType===Node.ELEMENT_NODE){const a=s.target.tagName.toLowerCase();this.#v.has(a)&&t.add(a)}}t.size>0&&!i&&(i=setTimeout(o,0))}),this.#f.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["title","field","header","width","hidden","id","icon","tooltip","order"]})}onChange(e){this.#g.push(e)}notifyChange(){for(const e of this.#g)e()}dispose(){this.#f?.disconnect(),this.#g=[],this.#c&&clearTimeout(this.#c)}}function pt(n){return`<span role="checkbox" aria-checked="${n}" aria-label="${n}">${n?"&#x1F5F9;":"&#9744;"}</span>`}function wt(n){if(n==null||n==="")return"";if(n instanceof Date)return isNaN(n.getTime())?"":n.toLocaleDateString();if(typeof n=="number"||typeof n=="string"){const e=new Date(n);return isNaN(e.getTime())?"":e.toLocaleDateString()}return""}function Le(n){if(!n)return-1;const e=n.getAttribute("data-row");if(e)return parseInt(e,10);const t=n.closest(".data-grid-row");if(!t)return-1;const i=t.parentElement;if(!i)return-1;const o=i.querySelectorAll(":scope > .data-grid-row");for(let r=0;r<o.length;r++)if(o[r]===t)return r;return-1}function Yi(n){if(!n)return-1;const e=n.getAttribute("data-col");return e?parseInt(e,10):-1}function ae(n){n&&n.querySelectorAll(".cell-focus").forEach(e=>e.classList.remove("cell-focus"))}function mt(n,e){const t=e.renderer||e.viewRenderer;if(t)return t;if(!e.type)return;const i=n.effectiveConfig?.typeDefaults;if(i?.[e.type]?.renderer)return i[e.type].renderer;const o=n.__frameworkAdapter;if(o?.getTypeDefault){const r=o.getTypeDefault(e.type);if(r?.renderer)return r.renderer}}function bt(n,e){if(e.format)return e.format;if(!e.type)return;const t=n.effectiveConfig?.typeDefaults;if(t?.[e.type]?.format)return t[e.type].format;const i=n.__frameworkAdapter;if(i?.getTypeDefault){const o=i.getTypeDefault(e.type);if(o?.format)return o.format}}const vt='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function Pe(n){return(n.__editingCellCount??0)>0}function De(n){n.__editingCellCount=0,n.removeAttribute("data-has-editing"),n.querySelectorAll(".cell.editing").forEach(t=>t.classList.remove("editing"))}const yt=document.createElement("template");yt.innerHTML='<div class="cell" role="gridcell" part="cell"></div>';const Ct=document.createElement("template");Ct.innerHTML='<div class="data-grid-row" role="row" part="row"></div>';function Xi(){return yt.content.firstElementChild.cloneNode(!0)}function Zi(){return Ct.content.firstElementChild.cloneNode(!0)}function me(n){n.__cellDisplayCache=void 0,n.__cellCacheEpoch=void 0,n.__hasSpecialColumns=void 0}function Ji(n,e,t,i,o){const r=Math.max(0,t-e),s=n._bodyEl,l=n._visibleColumns,a=l.length;let d=n.__cachedHeaderRowCount;for(d===void 0&&(d=n.querySelector(".header-group-row")?2:1,n.__cachedHeaderRowCount=d);n._rowPool.length<r;){const h=Zi();n._rowPool.push(h)}if(n._rowPool.length>r){for(let h=r;h<n._rowPool.length;h++){const f=n._rowPool[h];f.parentNode===s&&f.remove()}n._rowPool.length=r}const c=o&&n.__hasRenderRowPlugins!==!1,u=n._hasAfterRowRenderHook?.()??!1;for(let h=0;h<r;h++){const f=e+h,p=n._rows[f],g=n._rowPool[h];if(g.setAttribute("aria-rowindex",String(f+d+1)),c&&o(p,g,f)){g.__epoch=i,g.__rowDataRef=p,g.parentNode!==s&&s.appendChild(g);continue}const w=g.__epoch,m=g.__rowDataRef,y=g.children.length,T=w===i&&y===a,_=m!==p;let E=!1;if(T&&_){for(let R=0;R<a;R++)if(l[R].externalView&&!g.querySelector(`.cell[data-col="${R}"] [data-external-view]`)){E=!0;break}}if(!T||E){const R=Pe(g),k=n._activeEditRows===f;R&&!k?(g.__isCustomRow&&(g.className="data-grid-row",g.setAttribute("role","row"),g.__isCustomRow=!1),De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):R&&k?(He(n,g,p,f),g.__rowDataRef=p):(g.__isCustomRow&&(g.className="data-grid-row",g.setAttribute("role","row"),g.__isCustomRow=!1),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p)}else if(_){const R=Pe(g),k=n._activeEditRows===f;R&&!k?(De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):(He(n,g,p,f),g.__rowDataRef=p)}else{const R=Pe(g),k=n._activeEditRows===f;R&&!k?(De(g),de(n,g,p,f),g.__epoch=i,g.__rowDataRef=p):He(n,g,p,f)}let L=!1;const P=n.changedRowIds;if(P&&P.length>0)try{const R=n.getRowId?.(p);R&&(L=P.includes(R))}catch{}const b=g.classList.contains("changed");L!==b&&g.classList.toggle("changed",L);const S=n.effectiveConfig?.rowClass;if(S){const R=g.getAttribute("data-dynamic-classes");R&&R.split(" ").forEach(k=>k&&g.classList.remove(k));try{const k=S(p);if(k&&k.length>0){const v=k.filter(A=>A&&typeof A=="string");v.forEach(A=>g.classList.add(A)),g.setAttribute("data-dynamic-classes",v.join(" "))}else g.removeAttribute("data-dynamic-classes")}catch(k){console.warn("[tbw-grid] rowClass callback error:",k),g.removeAttribute("data-dynamic-classes")}}u&&n._afterRowRender?.({row:p,rowIndex:f,rowElement:g}),g.parentNode!==s&&s.appendChild(g)}}function He(n,e,t,i){const o=e.children,r=n._visibleColumns,s=r.length,l=o.length,a=s<l?s:l,d=n._focusRow,c=n._focusCol,u=n._hasAfterCellRenderHook?.()??!1;let h=n.__hasSpecialColumns;if(h===void 0){h=!1;const p=n.effectiveConfig?.typeDefaults,g=n.__frameworkAdapter;for(let w=0;w<s;w++){const m=r[w];if(m.__viewTemplate||m.__compiledView||m.renderer||m.viewRenderer||m.externalView||m.format||m.type==="date"||m.type==="boolean"||m.type&&p?.[m.type]?.renderer||m.type&&p?.[m.type]?.format||m.type&&g?.getTypeDefault?.(m.type)?.renderer||m.type&&g?.getTypeDefault?.(m.type)?.format){h=!0;break}}n.__hasSpecialColumns=h}const f=String(i);if(!h){for(let p=0;p<a;p++){const g=o[p];if(g.classList.contains("editing"))continue;const w=r[p],m=t[w.field];g.textContent=m==null?"":String(m),g.getAttribute("data-row")!==f&&g.setAttribute("data-row",f);const y=d===i&&c===p,C=g.classList.contains("cell-focus");y!==C&&(g.classList.toggle("cell-focus",y),g.setAttribute("aria-selected",String(y))),u&&n._afterCellRender?.({row:t,rowIndex:i,column:w,colIndex:p,value:m,cellElement:g,rowElement:e})}return}for(let p=0;p<a;p++)if(r[p].externalView&&!o[p].querySelector("[data-external-view]")){de(n,e,t,i);return}for(let p=0;p<a;p++){const g=r[p],w=o[p];w.getAttribute("data-row")!==f&&w.setAttribute("data-row",f);const m=d===i&&c===p,y=w.classList.contains("cell-focus");m!==y&&(w.classList.toggle("cell-focus",m),w.setAttribute("aria-selected",String(m)));const C=g.cellClass;if(C){const P=w.getAttribute("data-dynamic-classes");P&&P.split(" ").forEach(b=>b&&w.classList.remove(b));try{const b=t[g.field],S=C(b,t,g);if(S&&S.length>0){const R=S.filter(k=>k&&typeof k=="string");R.forEach(k=>w.classList.add(k)),w.setAttribute("data-dynamic-classes",R.join(" "))}else w.removeAttribute("data-dynamic-classes")}catch(b){console.warn(`[tbw-grid] cellClass callback error for column '${g.field}':`,b),w.removeAttribute("data-dynamic-classes")}}if(w.classList.contains("editing"))continue;const T=mt(n,g);if(T){const P=t[g.field],b=T({row:t,value:P,field:g.field,column:g,cellEl:w});typeof b=="string"?w.innerHTML=U(b):b instanceof Node?b.parentElement!==w&&(w.innerHTML="",w.appendChild(b)):b==null&&(w.textContent=P==null?"":String(P)),u&&n._afterCellRender?.({row:t,rowIndex:i,column:g,colIndex:p,value:P,cellElement:w,rowElement:e});continue}if(g.__viewTemplate||g.__compiledView||g.externalView)continue;const _=t[g.field];let E;const L=bt(n,g);if(L)try{const P=L(_,t);E=P==null?"":String(P)}catch(P){console.warn(`[tbw-grid] Format error in column '${g.field}':`,P),E=_==null?"":String(_)}else g.type==="date"?(E=wt(_),w.textContent=E):g.type==="boolean"?w.innerHTML=pt(!!_):(E=_==null?"":String(_),w.textContent=E);u&&n._afterCellRender?.({row:t,rowIndex:i,column:g,colIndex:p,value:_,cellElement:w,rowElement:e})}}function de(n,e,t,i){e.innerHTML="";const o=n._visibleColumns,r=o.length,s=n._focusRow,l=n._focusCol,a=n,d=n._hasAfterCellRenderHook?.()??!1,c=document.createDocumentFragment();for(let u=0;u<r;u++){const h=o[u],f=Xi();f.setAttribute("aria-colindex",String(u+1)),f.setAttribute("data-col",String(u)),f.setAttribute("data-row",String(i)),f.setAttribute("data-field",h.field),f.setAttribute("data-header",h.header??h.field),h.type&&f.setAttribute("data-type",h.type);let p=t[h.field];const g=bt(n,h);if(g)try{p=g(p,t)}catch(E){console.warn(`[tbw-grid] Format error in column '${h.field}':`,E)}const w=h.__compiledView,m=h.__viewTemplate,y=mt(n,h),C=h.externalView;let T=!1;if(y){const E=y({row:t,value:p,field:h.field,column:h,cellEl:f});typeof E=="string"?(f.innerHTML=U(E),T=!0):E instanceof Node?E.parentElement!==f&&(f.textContent="",f.appendChild(E)):E==null&&(f.textContent=p==null?"":String(p))}else if(C){const E=C,L=document.createElement("div");L.setAttribute("data-external-view",""),L.setAttribute("data-field",h.field),f.appendChild(L);const P={row:t,value:p,field:h.field,column:h};if(E.mount)try{E.mount({placeholder:L,context:P,spec:E})}catch(b){console.warn(`[tbw-grid] External view mount error for column '${h.field}':`,b)}else queueMicrotask(()=>{try{a.dispatchEvent(new CustomEvent("mount-external-view",{bubbles:!0,composed:!0,detail:{placeholder:L,spec:E,context:P}}))}catch(b){console.warn(`[tbw-grid] External view event dispatch error for column '${h.field}':`,b)}});L.setAttribute("data-mounted","")}else if(w){const E=w({row:t,value:p,field:h.field,column:h}),L=w.__blocked;f.innerHTML=L?"":U(E),T=!0,L&&(f.textContent="",f.setAttribute("data-blocked-template",""))}else if(m){const E=m.innerHTML;/Reflect\.|\bProxy\b|ownKeys\(/.test(E)?(f.textContent="",f.setAttribute("data-blocked-template","")):(f.innerHTML=U(ke(E,{row:t,value:p})),T=!0)}else h.type==="date"?f.textContent=wt(p):h.type==="boolean"?f.innerHTML=pt(!!p):f.textContent=p==null?"":String(p);if(T){Wi(f);const E=f.textContent||"";/Proxy|Reflect\.ownKeys/.test(E)&&(f.textContent=E.replace(/Proxy|Reflect\.ownKeys/g,"").trim(),/Proxy|Reflect\.ownKeys/.test(f.textContent||"")&&(f.textContent=""))}f.hasAttribute("data-blocked-template")&&(f.textContent||"").trim().length&&(f.textContent=""),h.editable?f.tabIndex=0:h.type==="boolean"&&(f.hasAttribute("tabindex")||(f.tabIndex=0)),s===i&&l===u?(f.classList.add("cell-focus"),f.setAttribute("aria-selected","true")):f.setAttribute("aria-selected","false");const _=h.cellClass;if(_)try{const E=t[h.field],L=_(E,t,h);if(L&&L.length>0){const P=L.filter(b=>b&&typeof b=="string");P.forEach(b=>f.classList.add(b)),f.setAttribute("data-dynamic-classes",P.join(" "))}}catch(E){console.warn(`[tbw-grid] cellClass callback error for column '${h.field}':`,E)}d&&n._afterCellRender?.({row:t,rowIndex:i,column:h,colIndex:u,value:p,cellElement:f,rowElement:e}),c.appendChild(f)}e.appendChild(c)}function xt(n,e,t){if(e.target?.closest(".resize-handle"))return;const i=t.querySelector(".cell[data-row]"),o=Le(i);if(o<0)return;const r=n._rows[o];if(!r||n._dispatchRowClick?.(e,o,r,t))return;const s=e.target?.closest(".cell[data-col]");if(s){const l=Number(s.getAttribute("data-col"));if(!isNaN(l)){if(n._dispatchCellClick?.(e,o,l,s))return;const a=n._focusRow!==o||n._focusCol!==l;if(n._focusRow=o,n._focusCol=l,s.classList.contains("editing")){a&&(ae(n._bodyEl??n),s.classList.add("cell-focus"));const d=s.querySelector(vt);try{d?.focus({preventScroll:!0})}catch{}return}F(n)}}}function Qi(n,e){if(n._dispatchKeyDown?.(e))return;const t=n._rows.length-1,i=n._visibleColumns.length-1,o=n._activeEditRows!==void 0&&n._activeEditRows!==-1,s=n._visibleColumns[n._focusCol]?.type,l=e.composedPath?.()??[],a=l.length?l[0]:e.target,d=c=>{if(!c)return!1;const u=c.tagName;return!!(u==="INPUT"||u==="SELECT"||u==="TEXTAREA"||c.isContentEditable)};if(!(d(a)&&(e.key==="Home"||e.key==="End"))&&!(d(a)&&(e.key==="ArrowUp"||e.key==="ArrowDown")&&a.tagName==="INPUT"&&a.type==="number")&&!(d(a)&&(e.key==="ArrowLeft"||e.key==="ArrowRight"))&&!(d(a)&&(e.key==="Enter"||e.key==="Escape"))&&!(o&&s==="select"&&(e.key==="ArrowDown"||e.key==="ArrowUp"))){switch(e.key){case"Tab":{e.preventDefault(),!e.shiftKey?n._focusCol<i?n._focusCol+=1:(typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow<t&&(n._focusRow+=1,n._focusCol=0)):n._focusCol>0?n._focusCol-=1:n._focusRow>0&&(typeof n.commitActiveRowEdit=="function"&&n._activeEditRows===n._focusRow&&n.commitActiveRowEdit(),n._focusRow-=1,n._focusCol=i),F(n);return}case"ArrowDown":o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=Math.min(t,n._focusRow+1),e.preventDefault();break;case"ArrowUp":o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=Math.max(0,n._focusRow-1),e.preventDefault();break;case"ArrowRight":n._focusCol=Math.min(i,n._focusCol+1),e.preventDefault();break;case"ArrowLeft":n._focusCol=Math.max(0,n._focusCol-1),e.preventDefault();break;case"Home":(e.ctrlKey||e.metaKey)&&(o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=0),n._focusCol=0,e.preventDefault(),F(n,{forceScrollLeft:!0});return;case"End":(e.ctrlKey||e.metaKey)&&(o&&typeof n.commitActiveRowEdit=="function"&&n.commitActiveRowEdit(),n._focusRow=t),n._focusCol=i,e.preventDefault(),F(n,{forceScrollRight:!0});return;case"PageDown":n._focusRow=Math.min(t,n._focusRow+20),e.preventDefault();break;case"PageUp":n._focusRow=Math.max(0,n._focusRow-20),e.preventDefault();break;case"Enter":{const c=n._focusRow,u=n._focusCol,h=n._visibleColumns[u],f=n._rows[c],p=h?.field??"",g=p&&f?f[p]:void 0,w=n.querySelector(`[data-row="${c}"][data-col="${u}"]`),m={rowIndex:c,colIndex:u,field:p,value:g,row:f,cellEl:w,trigger:"keyboard",originalEvent:e},y=new CustomEvent("cell-activate",{cancelable:!0,detail:m});n.dispatchEvent(y);const C=new CustomEvent("activate-cell",{cancelable:!0,detail:{row:c,col:u}});if(n.dispatchEvent(C),y.defaultPrevented||C.defaultPrevented){e.preventDefault();return}break}default:return}F(n)}}function F(n,e){if(n._virtualization?.enabled){const{rowHeight:s,container:l,viewportEl:a}=n._virtualization,d=l,c=a?.clientHeight??d?.clientHeight??0;if(d&&c>0){const u=n._focusRow*s;u<d.scrollTop?d.scrollTop=u:u+s>d.scrollTop+c&&(d.scrollTop=u-c+s)}}const t=n._activeEditRows!==void 0&&n._activeEditRows!==-1;t||n.refreshVirtualWindow(!1),ae(n._bodyEl),Array.from(n._bodyEl.querySelectorAll('[aria-selected="true"]')).forEach(s=>{s.setAttribute("aria-selected","false")});const i=n._focusRow,o=n._virtualization.start??0,r=n._virtualization.end??n._rows.length;if(i>=o&&i<r){const s=n._bodyEl.querySelectorAll(".data-grid-row")[i-o];let l=s?.children[n._focusCol];if((!l||!l.classList?.contains("cell"))&&(l=s?.querySelector(`.cell[data-col="${n._focusCol}"]`)??s?.querySelector(".cell[data-col]")),l){l.classList.add("cell-focus"),l.setAttribute("aria-selected","true");const a=n.querySelector(".tbw-scroll-area");if(a&&l&&!t)if(e?.forceScrollLeft)a.scrollLeft=0;else if(e?.forceScrollRight)a.scrollLeft=a.scrollWidth-a.clientWidth;else{const d=n._getHorizontalScrollOffsets?.(s??void 0,l)??{left:0,right:0};if(!d.skipScroll){const c=l.getBoundingClientRect(),u=a.getBoundingClientRect(),h=c.left-u.left+a.scrollLeft,f=h+c.width,p=a.scrollLeft+d.left,g=a.scrollLeft+a.clientWidth-d.right;h<p?a.scrollLeft=h-d.left:f>g&&(a.scrollLeft=f-a.clientWidth+d.right)}}if(n._activeEditRows!==void 0&&n._activeEditRows!==-1&&l.classList.contains("editing")){const d=l.querySelector(vt);if(d&&document.activeElement!==d)try{d.focus({preventScroll:!0})}catch{}}else if(!l.contains(document.activeElement)){l.hasAttribute("tabindex")||l.setAttribute("tabindex","-1");try{l.focus({preventScroll:!0})}catch{}}}}}const be=new WeakMap;function en(n,e){const t=Le(e),i=Yi(e);t<0||i<0||(n._focusRow=t,n._focusCol=i,ae(n._bodyEl),e.classList.add("cell-focus"),e.setAttribute("aria-selected","true"))}function Ie(n,e,t,i){let o=null;const r=t.composedPath?.();if(r&&r.length>0?o=r[0]:o=t.target,o&&!e.contains(o)){const g=document.elementFromPoint(t.clientX,t.clientY);g&&(o=g)}const s=o?.closest?.("[data-col]"),l=o?.closest?.(".data-grid-row"),a=o?.closest?.(".header-row");let d,c,u,h,f,p;return s&&(d=parseInt(s.getAttribute("data-row")??"-1",10),c=parseInt(s.getAttribute("data-col")??"-1",10),d>=0&&c>=0&&(u=n._rows[d],p=n._columns[c],h=p?.field,f=u&&h?u[h]:void 0)),{type:i,row:u,rowIndex:d!==void 0&&d>=0?d:void 0,colIndex:c!==void 0&&c>=0?c:void 0,field:h,value:f,column:p,originalEvent:t,cellElement:s??void 0,rowElement:l??void 0,isHeader:!!a,cell:d!==void 0&&c!==void 0&&d>=0&&c>=0?{row:d,col:c}:void 0}}function tn(n,e,t){const i=Ie(n,e,t,"mousedown");(n._dispatchCellMouseDown?.(i)??!1)&&be.set(n,!0)}function nn(n,e,t){if(!be.get(n))return;const i=Ie(n,e,t,"mousemove");n._dispatchCellMouseMove?.(i)}function on(n,e,t){if(!be.get(n))return;const i=Ie(n,e,t,"mouseup");n._dispatchCellMouseUp?.(i),be.set(n,!1)}function rn(n,e,t){e.addEventListener("mousedown",i=>{const o=i.target.closest(".cell[data-col]");o&&(o.classList.contains("editing")||en(n,o))},{signal:t}),e.addEventListener("click",i=>{const o=i.target.closest(".data-grid-row");o&&xt(n,i,o)},{signal:t}),e.addEventListener("dblclick",i=>{const o=i.target.closest(".data-grid-row");o&&xt(n,i,o)},{signal:t})}function sn(n,e,t,i){e.addEventListener("keydown",o=>Qi(n,o),{signal:i}),t.addEventListener("mousedown",o=>tn(n,t,o),{signal:i}),document.addEventListener("mousemove",o=>nn(n,t,o),{signal:i}),document.addEventListener("mouseup",o=>on(n,t,o),{signal:i})}function Et(n,e){return n==null&&e==null?0:n==null?-1:e==null||n>e?1:n<e?-1:0}function Rt(n,e,t){const o=t.find(l=>l.field===e.field)?.sortComparator??Et,{field:r,direction:s}=e;return[...n].sort((l,a)=>o(l[r],a[r],l,a)*s)}function St(n,e,t,i){n._rows=e,n.__rowRenderEpoch++,n._rowPool.forEach(o=>o.__epoch=-1),xe(n),n.refreshVirtualWindow(!0),n.dispatchEvent(new CustomEvent("sort-change",{detail:{field:t.field,direction:i}})),n.requestStateChange?.()}function _t(n,e){!n._sortState||n._sortState.field!==e.field?(n._sortState||(n.__originalOrder=n._rows.slice()),At(n,e,1)):n._sortState.direction===1?At(n,e,-1):(n._sortState=null,n.__rowRenderEpoch++,n._rowPool.forEach(i=>i.__epoch=-1),n._rows=n.__originalOrder.slice(),xe(n),n._headerRowEl?.querySelectorAll('[role="columnheader"].sortable')?.forEach(i=>{i.getAttribute("aria-sort")?(i.getAttribute("aria-sort")==="ascending"||i.getAttribute("aria-sort")==="descending")&&(n._sortState||i.setAttribute("aria-sort","none")):i.setAttribute("aria-sort","none")}),n.refreshVirtualWindow(!0),n.dispatchEvent(new CustomEvent("sort-change",{detail:{field:e.field,direction:0}})),n.requestStateChange?.())}function At(n,e,t){n._sortState={field:e.field,direction:t};const i={field:e.field,direction:t},o=n._columns,s=(n.effectiveConfig?.sortHandler??Rt)(n._rows,i,o);s&&typeof s.then=="function"?s.then(l=>{St(n,l,e,t)}):St(n,s,e,t)}function ce(n,e){return n.effectiveConfig?.sortable!==!1&&e.sortable===!0}function ln(n,e){typeof e=="string"?n.textContent=e:e instanceof HTMLElement&&(n.innerHTML="",n.appendChild(e.cloneNode(!0)))}function ve(n,e){const t=document.createElement("span");ut(t,"sort-indicator");const i=n._sortState?.field===e.field?n._sortState.direction:0,o={...G,...n.icons},r=i===1?o.sortAsc:i===-1?o.sortDesc:o.sortNone;return ln(t,r),t}function ye(n,e,t){const i=document.createElement("div");return i.className="resize-handle",i.setAttribute("aria-hidden","true"),i.addEventListener("mousedown",o=>{o.stopPropagation(),o.preventDefault(),n._resizeController.start(o,e,t)}),i.addEventListener("dblclick",o=>{o.stopPropagation(),o.preventDefault(),n._resizeController.resetColumn(e)}),i}function Ce(n,e,t,i){i.classList.add("sortable"),i.tabIndex=0;const o=n._sortState?.field===e.field?n._sortState.direction:0;i.setAttribute("aria-sort",o===0?"none":o===1?"ascending":"descending"),i.addEventListener("click",r=>{n._resizeController?.isResizing||n._dispatchHeaderClick?.(r,t,i)||_t(n,e)}),i.addEventListener("keydown",r=>{if(r.key==="Enter"||r.key===" "){if(r.preventDefault(),n._dispatchHeaderClick?.(r,t,i))return;_t(n,e)}})}function an(n,e){if(e!=null)if(typeof e=="string"){const t=document.createElement("span");for(t.innerHTML=U(e);t.firstChild;)n.appendChild(t.firstChild)}else e instanceof Node&&n.appendChild(e)}function xe(n){n._headerRowEl=n.findHeaderRow();const e=n._headerRowEl;e&&(e.innerHTML="",n._visibleColumns.forEach((t,i)=>{const o=document.createElement("div");o.className="cell",ut(o,"header-cell"),o.setAttribute("role","columnheader"),o.setAttribute("aria-colindex",String(i+1)),o.setAttribute("data-field",t.field),o.setAttribute("data-col",String(i));const r=t.header??t.field,s=n._sortState?.field===t.field?n._sortState.direction:0,l=s===1?"asc":s===-1?"desc":null;if(t.headerRenderer){const a={column:t,value:r,sortState:l,filterActive:!1,cellEl:o,renderSortIcon:()=>ce(n,t)?ve(n,t):null,renderFilterButton:()=>null,renderResizeHandle:()=>ye(n,i,o)},d=t.headerRenderer(a);an(o,d),ce(n,t)&&Ce(n,t,i,o),t.resizable&&o.classList.add("resizable")}else if(t.headerLabelRenderer){const a={column:t,value:r},d=t.headerLabelRenderer(a),c=document.createElement("span");d==null?c.textContent=r:typeof d=="string"?c.innerHTML=U(d):d instanceof Node&&c.appendChild(d),o.appendChild(c),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)))}else if(t.__headerTemplate)Array.from(t.__headerTemplate.childNodes).forEach(a=>o.appendChild(a.cloneNode(!0))),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)));else{const a=document.createElement("span");a.textContent=r,o.appendChild(a),ce(n,t)&&(Ce(n,t,i,o),o.appendChild(ve(n,t))),t.resizable&&(o.classList.add("resizable"),o.appendChild(ye(n,i,o)))}e.appendChild(o)}),e.querySelectorAll(".cell.sortable").forEach(t=>{t.getAttribute("aria-sort")||t.setAttribute("aria-sort","none")}),e.children.length>0?(e.setAttribute("role","row"),e.setAttribute("aria-rowindex","1")):(e.removeAttribute("role"),e.removeAttribute("aria-rowindex")))}const Tt=typeof requestIdleCallback=="function";function dn(n,e){return Tt?requestIdleCallback(n,e):window.setTimeout(()=>{const t=Date.now();n({didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))})},1)}function kt(n){Tt?cancelIdleCallback(n):clearTimeout(n)}var I=(n=>(n[n.STYLE=1]="STYLE",n[n.VIRTUALIZATION=2]="VIRTUALIZATION",n[n.HEADER=3]="HEADER",n[n.ROWS=4]="ROWS",n[n.COLUMNS=5]="COLUMNS",n[n.FULL=6]="FULL",n))(I||{});class cn{#t;#e=0;#u=0;#d=null;#s=null;#l=null;#n=!1;constructor(e){this.#t=e}requestPhase(e,t){e>this.#e&&(this.#e=e),this.#u===0&&(this.#h(),this.#u=requestAnimationFrame(()=>this.#g()))}whenReady(){return this.#d?this.#d:Promise.resolve()}setInitialReadyResolver(e){this.#l=e}cancel(){this.#u!==0&&(cancelAnimationFrame(this.#u),this.#u=0),this.#e=0,this.#s&&(this.#s(),this.#s=null,this.#d=null)}get isPending(){return this.#e!==0}get pendingPhase(){return this.#e}#h(){this.#d||(this.#d=new Promise(e=>{this.#s=e}))}#g(){if(this.#u=0,!this.#t.isConnected()){this.#e=0,this.#s&&(this.#s(),this.#s=null,this.#d=null);return}const e=this.#e;this.#e=0,e>=5&&this.#t.mergeConfig(),e>=4&&this.#t.processRows(),e>=5&&(this.#t.processColumns(),this.#t.updateTemplate()),e>=3&&this.#t.renderHeader(),e>=2&&this.#t.renderVirtualWindow(),e>=1&&this.#t.afterRender(),!this.#n&&this.#l&&(this.#n=!0,this.#l()),this.#s&&(this.#s(),this.#s=null,this.#d=null)}}function Lt(n){let e=null,t=null,i=null,o=null;const r=a=>{if(!e)return;const d=a.clientX-e.startX,c=Math.max(40,e.startWidth+d),u=n._visibleColumns[e.colIndex];u.width=c,u.__userResized=!0,u.__renderedWidth=c,t==null&&(t=requestAnimationFrame(()=>{t=null,n.updateTemplate?.()})),n.dispatchEvent(new CustomEvent("column-resize",{detail:{field:u.field,width:c}}))};let s=!1;const l=()=>{const a=e!==null;a&&(s=!0,requestAnimationFrame(()=>{s=!1})),window.removeEventListener("mousemove",r),window.removeEventListener("mouseup",l),i!==null&&(document.documentElement.style.cursor=i,i=null),o!==null&&(document.body.style.userSelect=o,o=null),e=null,a&&n.requestStateChange&&n.requestStateChange()};return{get isResizing(){return e!==null||s},start(a,d,c){a.preventDefault();const u=n._visibleColumns[d],h=typeof u?.width=="number"?u.width:void 0,f=u?.__renderedWidth??h??c.getBoundingClientRect().width;e={startX:a.clientX,colIndex:d,startWidth:f},window.addEventListener("mousemove",r),window.addEventListener("mouseup",l),i===null&&(i=document.documentElement.style.cursor),document.documentElement.style.cursor="e-resize",o===null&&(o=document.body.style.userSelect),document.body.style.userSelect="none"},resetColumn(a){const d=n._visibleColumns[a];d&&(d.__userResized=!1,d.__renderedWidth=void 0,d.width=d.__originalWidth,n.updateTemplate?.(),n.requestStateChange?.(),n.dispatchEvent(new CustomEvent("column-resize-reset",{detail:{field:d.field,width:d.width}})))},dispose(){l()}}}const Me="data-animating",un={change:"--tbw-row-change-duration",insert:"--tbw-row-insert-duration",remove:"--tbw-row-remove-duration"},hn={change:500,insert:300,remove:200};function fn(n){const e=n.trim().toLowerCase();return e.endsWith("ms")?parseFloat(e):e.endsWith("s")?parseFloat(e)*1e3:parseFloat(e)}function gn(n,e){const t=un[e],i=getComputedStyle(n).getPropertyValue(t);if(i){const o=fn(i);if(!isNaN(o)&&o>0)return o}return hn[e]}function Pt(n,e,t){n.removeAttribute(Me),n.offsetWidth,n.setAttribute(Me,e);const i=gn(n,e);setTimeout(()=>{e!=="remove"&&n.removeAttribute(Me)},i)}function Ne(n,e,t){if(e<0)return!1;const i=n.findRenderedRowElement?.(e);return i?(Pt(i,t),!0):!1}function pn(n,e,t){let i=0;for(const o of e)Ne(n,o,t)&&i++;return i}function wn(n,e,t){const i=n._rows??[],o=n.getRowId;if(!o)return!1;const r=i.findIndex(s=>o(s)===e);return r<0?!1:Ne(n,r,t)}function Ee(n,e,t){const i=document.createElement(n);if(e)for(const o in e){const r=e[o];r!=null&&i.setAttribute(o,r)}return i}function O(n,e){const t=document.createElement("div");if(n&&(t.className=n),e)for(const i in e){const o=e[i];o!=null&&t.setAttribute(i,o)}return t}function Dt(n,e,t){const i=document.createElement("button");if(n&&(i.className=n),e)for(const o in e){const r=e[o];r!=null&&i.setAttribute(o,r)}return i}const Ht=document.createElement("template");Ht.innerHTML=`
2
2
  <div class="tbw-scroll-area">
3
3
  <div class="rows-body-wrapper">
4
4
  <div class="rows-body" role="grid">
@@ -16,7 +16,7 @@
16
16
  <div class="faux-vscroll">
17
17
  <div class="faux-vscroll-spacer"></div>
18
18
  </div>
19
- `;function It(){return Ht.content.cloneNode(!0)}function Mt(n){const e=document.createDocumentFragment(),t=z(n.hasShell?"tbw-grid-root has-shell":"tbw-grid-root");if(n.hasShell&&n.shellHeader&&n.shellBody)t.appendChild(n.shellHeader),t.appendChild(n.shellBody);else{const i=z("tbw-grid-content");i.appendChild(It()),t.appendChild(i)}return e.appendChild(t),e}function mn(n){const e=z("tbw-shell-header",{part:"shell-header",role:"presentation"});if(n.title){const r=z("tbw-shell-title");r.textContent=n.title,e.appendChild(r)}const t=z("tbw-shell-content",{part:"shell-content",role:"presentation","data-light-dom-header-content":""});e.appendChild(t);const i=z("tbw-shell-toolbar",{part:"shell-toolbar",role:"presentation"});for(const r of n.configButtons)r.hasRender&&i.appendChild(z("tbw-toolbar-content-slot",{"data-toolbar-content":r.id}));for(const r of n.apiButtons)r.hasRender&&i.appendChild(z("tbw-toolbar-content-slot",{"data-toolbar-content":r.id}));if((n.configButtons.some(r=>r.hasRender)||n.apiButtons.some(r=>r.hasRender))&&n.hasPanels&&i.appendChild(z("tbw-toolbar-separator")),n.hasPanels){const r=Dt(n.isPanelOpen?"tbw-toolbar-btn active":"tbw-toolbar-btn",{"data-panel-toggle":"",title:"Settings","aria-label":"Toggle settings panel","aria-pressed":String(n.isPanelOpen),"aria-controls":"tbw-tool-panel"});r.innerHTML=n.toolPanelIcon,i.appendChild(r)}return e.appendChild(i),e}function bn(n){const e=z("tbw-shell-body"),t=n.panels.length>0,i=n.panels.length===1,o=z("tbw-grid-content");o.appendChild(It());let r=null;if(t){r=Ee("aside",{class:n.isPanelOpen?"tbw-tool-panel open":"tbw-tool-panel",part:"tool-panel","data-position":n.position,role:"presentation",id:"tbw-tool-panel"});const s=n.position==="left"?"right":"left";r.appendChild(z("tbw-tool-panel-resize",{"data-resize-handle":"","data-handle-position":s,"aria-hidden":"true"}));const l=z("tbw-tool-panel-content",{role:"presentation"}),a=z("tbw-accordion");for(const d of n.panels){const c=`tbw-accordion-section${d.isExpanded?" expanded":""}${i?" single":""}`,u=z(c,{"data-section":d.id}),h=Dt("tbw-accordion-header",{"aria-expanded":String(d.isExpanded),"aria-controls":`tbw-section-${d.id}`});if(i&&h.setAttribute("aria-disabled","true"),d.icon){const p=Ee("span",{class:"tbw-accordion-icon"});p.innerHTML=d.icon,h.appendChild(p)}const f=Ee("span",{class:"tbw-accordion-title"});if(f.textContent=d.title,h.appendChild(f),!i){const p=Ee("span",{class:"tbw-accordion-chevron"});p.innerHTML=d.isExpanded?n.collapseIcon:n.expandIcon,h.appendChild(p)}u.appendChild(h),u.appendChild(z("tbw-accordion-content",{id:`tbw-section-${d.id}`,role:"presentation"})),a.appendChild(u)}l.appendChild(a),r.appendChild(l)}return n.position==="left"&&r?(e.appendChild(r),e.appendChild(o)):(e.appendChild(o),r&&e.appendChild(r)),e}function j(n){return n?typeof n=="string"?n:n.outerHTML:""}function vn(){return{toolPanels:new Map,headerContents:new Map,toolbarContents:new Map,hasToolButtonsContainer:!1,lightDomHeaderContent:[],lightDomTitle:null,lightDomToolPanelIds:new Set,lightDomToolbarContentIds:new Set,apiToolPanelIds:new Set,isPanelOpen:!1,expandedSections:new Set,headerContentCleanups:new Map,panelCleanups:new Map,toolbarContentCleanups:new Map,lightDomContentMoved:!1}}function Nt(n){return!!(n?.header?.title||n?.header?.toolbarContents?.length||n?.toolPanels?.length||n?.headerContents?.length||n?.header?.lightDomContent?.length||n?.header?.hasToolButtonsContainer)}function Ot(n,e,t="☰"){const i=n?.header?.title??e.lightDomTitle??"",o=!!i,r=j(t),s=n?.header?.toolbarContents??[],l=[...e.toolbarContents.values()],a=new Set(s.map(g=>g.id)),d=[...s];for(const g of l)a.has(g.id)||d.push(g);const c=d.length>0,u=e.toolPanels.size>0,h=c&&u,f=[...d].sort((g,w)=>(g.order??0)-(w.order??0));let p="";for(const g of f)p+=`<div class="tbw-toolbar-content-slot" data-toolbar-content="${g.id}"></div>`;if(h&&(p+='<div class="tbw-toolbar-separator"></div>'),u){const g=e.isPanelOpen;p+=`<button class="${g?"tbw-toolbar-btn active":"tbw-toolbar-btn"}" data-panel-toggle title="Settings" aria-label="Toggle settings panel" aria-pressed="${g}" aria-controls="tbw-tool-panel">${r}</button>`}return`
19
+ `;function It(){return Ht.content.cloneNode(!0)}function Mt(n){const e=document.createDocumentFragment(),t=O(n.hasShell?"tbw-grid-root has-shell":"tbw-grid-root");if(n.hasShell&&n.shellHeader&&n.shellBody)t.appendChild(n.shellHeader),t.appendChild(n.shellBody);else{const i=O("tbw-grid-content");i.appendChild(It()),t.appendChild(i)}return e.appendChild(t),e}function mn(n){const e=O("tbw-shell-header",{part:"shell-header",role:"presentation"});if(n.title){const r=O("tbw-shell-title");r.textContent=n.title,e.appendChild(r)}const t=O("tbw-shell-content",{part:"shell-content",role:"presentation","data-light-dom-header-content":""});e.appendChild(t);const i=O("tbw-shell-toolbar",{part:"shell-toolbar",role:"presentation"});for(const r of n.configButtons)r.hasRender&&i.appendChild(O("tbw-toolbar-content-slot",{"data-toolbar-content":r.id}));for(const r of n.apiButtons)r.hasRender&&i.appendChild(O("tbw-toolbar-content-slot",{"data-toolbar-content":r.id}));if((n.configButtons.some(r=>r.hasRender)||n.apiButtons.some(r=>r.hasRender))&&n.hasPanels&&i.appendChild(O("tbw-toolbar-separator")),n.hasPanels){const r=Dt(n.isPanelOpen?"tbw-toolbar-btn active":"tbw-toolbar-btn",{"data-panel-toggle":"",title:"Settings","aria-label":"Toggle settings panel","aria-pressed":String(n.isPanelOpen),"aria-controls":"tbw-tool-panel"});r.innerHTML=n.toolPanelIcon,i.appendChild(r)}return e.appendChild(i),e}function bn(n){const e=O("tbw-shell-body"),t=n.panels.length>0,i=n.panels.length===1,o=O("tbw-grid-content");o.appendChild(It());let r=null;if(t){r=Ee("aside",{class:n.isPanelOpen?"tbw-tool-panel open":"tbw-tool-panel",part:"tool-panel","data-position":n.position,role:"presentation",id:"tbw-tool-panel"});const s=n.position==="left"?"right":"left";r.appendChild(O("tbw-tool-panel-resize",{"data-resize-handle":"","data-handle-position":s,"aria-hidden":"true"}));const l=O("tbw-tool-panel-content",{role:"presentation"}),a=O("tbw-accordion");for(const d of n.panels){const c=`tbw-accordion-section${d.isExpanded?" expanded":""}${i?" single":""}`,u=O(c,{"data-section":d.id}),h=Dt("tbw-accordion-header",{"aria-expanded":String(d.isExpanded),"aria-controls":`tbw-section-${d.id}`});if(i&&h.setAttribute("aria-disabled","true"),d.icon){const p=Ee("span",{class:"tbw-accordion-icon"});p.innerHTML=d.icon,h.appendChild(p)}const f=Ee("span",{class:"tbw-accordion-title"});if(f.textContent=d.title,h.appendChild(f),!i){const p=Ee("span",{class:"tbw-accordion-chevron"});p.innerHTML=d.isExpanded?n.collapseIcon:n.expandIcon,h.appendChild(p)}u.appendChild(h),u.appendChild(O("tbw-accordion-content",{id:`tbw-section-${d.id}`,role:"presentation"})),a.appendChild(u)}l.appendChild(a),r.appendChild(l)}return n.position==="left"&&r?(e.appendChild(r),e.appendChild(o)):(e.appendChild(o),r&&e.appendChild(r)),e}function j(n){return n?typeof n=="string"?n:n.outerHTML:""}function vn(){return{toolPanels:new Map,headerContents:new Map,toolbarContents:new Map,hasToolButtonsContainer:!1,lightDomHeaderContent:[],lightDomTitle:null,lightDomToolPanelIds:new Set,lightDomToolbarContentIds:new Set,apiToolPanelIds:new Set,isPanelOpen:!1,expandedSections:new Set,headerContentCleanups:new Map,panelCleanups:new Map,toolbarContentCleanups:new Map,lightDomContentMoved:!1}}function Nt(n){return!!(n?.header?.title||n?.header?.toolbarContents?.length||n?.toolPanels?.length||n?.headerContents?.length||n?.header?.lightDomContent?.length||n?.header?.hasToolButtonsContainer)}function zt(n,e,t="☰"){const i=n?.header?.title??e.lightDomTitle??"",o=!!i,r=j(t),s=n?.header?.toolbarContents??[],l=[...e.toolbarContents.values()],a=new Set(s.map(g=>g.id)),d=[...s];for(const g of l)a.has(g.id)||d.push(g);const c=d.length>0,u=e.toolPanels.size>0,h=c&&u,f=[...d].sort((g,w)=>(g.order??0)-(w.order??0));let p="";for(const g of f)p+=`<div class="tbw-toolbar-content-slot" data-toolbar-content="${g.id}"></div>`;if(h&&(p+='<div class="tbw-toolbar-separator"></div>'),u){const g=e.isPanelOpen;p+=`<button class="${g?"tbw-toolbar-btn active":"tbw-toolbar-btn"}" data-panel-toggle title="Settings" aria-label="Toggle settings panel" aria-pressed="${g}" aria-controls="tbw-tool-panel">${r}</button>`}return`
20
20
  <div class="tbw-shell-header" part="shell-header" role="presentation">
21
21
  ${o?`<div class="tbw-shell-title">${Fi(i)}</div>`:""}
22
22
  <div class="tbw-shell-content" part="shell-content" role="presentation" data-light-dom-header-content></div>
@@ -24,7 +24,7 @@
24
24
  ${p}
25
25
  </div>
26
26
  </div>
27
- `}function ee(n,e){const t=n.querySelector("tbw-grid-header");if(!t)return;if(!e.lightDomTitle){const o=t.getAttribute("title");o&&(e.lightDomTitle=o)}const i=t.querySelectorAll("tbw-grid-header-content");i.length>0&&e.lightDomHeaderContent.length===0&&(e.lightDomHeaderContent=Array.from(i)),t.style.display="none"}function te(n,e,t){const i=n.querySelector(":scope > tbw-grid-tool-buttons");if(!i)return;e.hasToolButtonsContainer=!0;const o="light-dom-toolbar-content";if(e.lightDomToolbarContentIds.has(o))return;const r={id:o,order:0,render:(s=>{for(;i.firstChild;)s.appendChild(i.firstChild)})};e.toolbarContents.set(o,r),e.lightDomToolbarContentIds.add(o),i.style.display="none"}function ie(n,e,t){n.querySelectorAll(":scope > tbw-grid-tool-panel").forEach(o=>{const r=o,s=r.getAttribute("id"),l=r.getAttribute("title");if(!s||!l){console.warn(`[parseLightDomToolPanels] Tool panel missing required id or title attribute: id="${s??""}", title="${l??""}"`);return}const a=r.getAttribute("icon")??void 0,d=r.getAttribute("tooltip")??void 0,c=parseInt(r.getAttribute("order")??"100",10);let u;const h=t?.(r);if(h)u=h;else{const g=r.innerHTML.trim();u=w=>{const m=document.createElement("div");return m.innerHTML=g,w.appendChild(m),()=>m.remove()}}const f=e.toolPanels.get(s);if(f){if(h){f.render=u,f.order=c,f.icon=a,f.tooltip=d;const g=e.panelCleanups.get(s);g&&(g(),e.panelCleanups.delete(s))}return}const p={id:s,title:l,icon:a,tooltip:d,order:c,render:u};e.toolPanels.set(s,p),e.lightDomToolPanelIds.add(s),r.style.display="none"})}function yn(n,e,t,i){const o=n.querySelector(".tbw-shell-toolbar");o&&o.addEventListener("click",s=>{if(s.target.closest("[data-panel-toggle]")){i.onPanelToggle();return}});const r=n.querySelector(".tbw-accordion");r&&r.addEventListener("click",s=>{const a=s.target.closest(".tbw-accordion-header");if(a){const c=a.closest("[data-section]")?.getAttribute("data-section");c&&i.onSectionToggle(c)}})}function Cn(n,e,t){const i=n.querySelector(".tbw-tool-panel"),o=n.querySelector("[data-resize-handle]"),r=n.querySelector(".tbw-shell-body");if(!i||!o||!r)return()=>{};const s=e?.toolPanel?.position??"right",l=200;let a=0,d=0,c=0,u=!1;const h=g=>{if(!u)return;g.preventDefault();const w=s==="left"?g.clientX-a:a-g.clientX,m=Math.min(c,Math.max(l,d+w));i.style.width=`${m}px`},f=()=>{if(!u)return;u=!1,o.classList.remove("resizing"),i.style.transition="",document.body.style.cursor="",document.body.style.userSelect="";const g=i.getBoundingClientRect().width;t(g),document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",f)},p=g=>{g.preventDefault(),u=!0,a=g.clientX,d=i.getBoundingClientRect().width,c=r.getBoundingClientRect().width-20,o.classList.add("resizing"),i.style.transition="none",document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",h),document.addEventListener("mouseup",f)};return o.addEventListener("mousedown",p),()=>{o.removeEventListener("mousedown",p),document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",f)}}function zt(n,e,t){const i=e?.header?.toolbarContents??[],o=[...t.toolbarContents.values()],r=new Set(i.map(l=>l.id)),s=[...i];for(const l of o)r.has(l.id)||s.push(l);for(const l of s){if(t.toolbarContentCleanups.has(l.id)||!l.render)continue;const a=n.querySelector(`[data-toolbar-content="${l.id}"]`);if(!a)continue;const d=l.render(a);d&&t.toolbarContentCleanups.set(l.id,d)}}function Oe(n,e){const t=e.lightDomHeaderContent.length>0&&!e.lightDomContentMoved,i=e.headerContents.size>0;if(!t&&!i)return;const o=n.querySelector(".tbw-shell-content");if(!o)return;if(t){for(const s of e.lightDomHeaderContent)s.style.display="",o.appendChild(s);e.lightDomContentMoved=!0}const r=[...e.headerContents.values()].sort((s,l)=>(s.order??100)-(l.order??100));for(const s of r){const l=e.headerContentCleanups.get(s.id);l&&(l(),e.headerContentCleanups.delete(s.id));let a=o.querySelector(`[data-header-content="${s.id}"]`);a||(a=document.createElement("div"),a.setAttribute("data-header-content",s.id),o.appendChild(a));const d=s.render(a);d&&e.headerContentCleanups.set(s.id,d)}}function xn(n,e,t){if(!e.isPanelOpen)return;const i=j(t?.expand??G.expand),o=j(t?.collapse??G.collapse);for(const[r,s]of e.toolPanels){const l=e.expandedSections.has(r),a=n.querySelector(`[data-section="${r}"]`),d=a?.querySelector(".tbw-accordion-content");if(!a||!d)continue;a.classList.toggle("expanded",l);const c=a.querySelector(".tbw-accordion-header");c&&c.setAttribute("aria-expanded",String(l));const u=a.querySelector(".tbw-accordion-chevron");if(u&&(u.innerHTML=l?o:i),l){if(d.children.length===0){const h=s.render(d);h&&e.panelCleanups.set(r,h)}}else{const h=e.panelCleanups.get(r);h&&(h(),e.panelCleanups.delete(r)),d.innerHTML=""}}}function Ft(n,e){const t=n.querySelector("[data-panel-toggle]");t&&(t.classList.toggle("active",e.isPanelOpen),t.setAttribute("aria-pressed",String(e.isPanelOpen)))}function qt(n,e){const t=n.querySelector(".tbw-tool-panel");t&&(t.classList.toggle("open",e.isPanelOpen),e.isPanelOpen||(t.style.width=""))}function En(n){for(const e of n.headerContentCleanups.values())e();n.headerContentCleanups.clear();for(const e of n.panelCleanups.values())e();n.panelCleanups.clear();for(const e of n.toolbarContentCleanups.values())e();n.toolbarContentCleanups.clear();for(const e of n.toolbarContents.values())e.onDestroy?.();if(n.isPanelOpen)for(const e of n.expandedSections)n.toolPanels.get(e)?.onClose?.();n.isPanelOpen=!1,n.expandedSections.clear(),n.toolPanels.clear(),n.headerContents.clear(),n.toolbarContents.clear(),n.lightDomHeaderContent=[],n.lightDomToolPanelIds.clear(),n.lightDomToolbarContentIds.clear(),n.lightDomContentMoved=!1}function Rn(n,e){let t=!1;const i={get isInitialized(){return t},setInitialized(o){t=o},get isPanelOpen(){return n.isPanelOpen},get activePanel(){return n.isPanelOpen&&n.expandedSections.size>0?[...n.expandedSections][0]:null},get expandedSections(){return[...n.expandedSections]},openToolPanel(){if(n.isPanelOpen)return;if(n.toolPanels.size===0){console.warn("[tbw-grid] No tool panels registered");return}if(n.isPanelOpen=!0,n.expandedSections.size===0&&n.toolPanels.size>0){const s=[...n.toolPanels.values()].sort((l,a)=>(l.order??100)-(a.order??100))[0];s&&n.expandedSections.add(s.id)}const o=e.getShadow();Ft(o,n),qt(o,n),xn(o,n,e.getAccordionIcons()),e.emit("tool-panel-open",{sections:i.expandedSections})},closeToolPanel(){if(!n.isPanelOpen)return;for(const r of n.panelCleanups.values())r();n.panelCleanups.clear();for(const r of n.toolPanels.values())r.onClose?.();n.isPanelOpen=!1;const o=e.getShadow();Ft(o,n),qt(o,n),e.emit("tool-panel-close",{})},toggleToolPanel(){n.isPanelOpen?i.closeToolPanel():i.openToolPanel()},toggleToolPanelSection(o){const r=n.toolPanels.get(o);if(!r){console.warn(`[tbw-grid] Tool panel section "${o}" not found`);return}if(n.toolPanels.size===1)return;const s=e.getShadow(),l=n.expandedSections.has(o);if(l){const a=n.panelCleanups.get(o);a&&(a(),n.panelCleanups.delete(o)),r.onClose?.(),n.expandedSections.delete(o),ze(s,o,!1)}else{for(const[a,d]of n.toolPanels)if(a!==o&&n.expandedSections.has(a)){const c=n.panelCleanups.get(a);c&&(c(),n.panelCleanups.delete(a)),d.onClose?.(),n.expandedSections.delete(a),ze(s,a,!1);const u=s.querySelector(`[data-section="${a}"] .tbw-accordion-content`);u&&(u.innerHTML="")}n.expandedSections.add(o),ze(s,o,!0),Sn(s,n,o)}e.emit("tool-panel-section-toggle",{id:o,expanded:!l})},getToolPanels(){return[...n.toolPanels.values()]},registerToolPanel(o){if(n.toolPanels.has(o.id)){console.warn(`[tbw-grid] Tool panel "${o.id}" already registered`);return}n.toolPanels.set(o.id,o),t&&e.refreshShellHeader()},unregisterToolPanel(o){if(n.expandedSections.has(o)){const r=n.panelCleanups.get(o);r&&(r(),n.panelCleanups.delete(o)),n.expandedSections.delete(o)}n.toolPanels.delete(o),t&&e.refreshShellHeader()},getHeaderContents(){return[...n.headerContents.values()]},registerHeaderContent(o){if(n.headerContents.has(o.id)){console.warn(`[tbw-grid] Header content "${o.id}" already registered`);return}n.headerContents.set(o.id,o),t&&Oe(e.getShadow(),n)},unregisterHeaderContent(o){const r=n.headerContentCleanups.get(o);r&&(r(),n.headerContentCleanups.delete(o)),n.headerContents.get(o)?.onDestroy?.(),n.headerContents.delete(o),e.getShadow().querySelector(`[data-header-content="${o}"]`)?.remove()},getToolbarContents(){return[...n.toolbarContents.values()].sort((o,r)=>(o.order??0)-(r.order??0))},registerToolbarContent(o){if(n.toolbarContents.has(o.id)){console.warn(`[tbw-grid] Toolbar content "${o.id}" already registered`);return}n.toolbarContents.set(o.id,o),t&&e.refreshShellHeader()},unregisterToolbarContent(o){const r=n.toolbarContentCleanups.get(o);r&&(r(),n.toolbarContentCleanups.delete(o));const s=n.toolbarContents.get(o);s?.onDestroy&&s.onDestroy(),n.toolbarContents.delete(o),t&&e.refreshShellHeader()}};return i}function ze(n,e,t){const i=n.querySelector(`[data-section="${e}"]`);i&&i.classList.toggle("expanded",t)}function Sn(n,e,t){const i=e.toolPanels.get(t);if(!i?.render)return;const o=n.querySelector(`[data-section="${t}"] .tbw-accordion-content`);if(!o)return;const r=i.render(o);r&&e.panelCleanups.set(t,r)}function _n(n,e,t,i){const o=Nt(e),r=[],s=["tbw-grid-header","tbw-grid-tool-buttons","tbw-grid-tool-panel","tbw-grid-column","tbw-grid-detail","tbw-grid-responsive-card"];for(const l of s)n.querySelectorAll(`:scope > ${l}`).forEach(d=>r.push(d));n.replaceChildren();for(const l of r)n.appendChild(l);if(o){const l=j(i?.toolPanel??G.toolPanel),a=j(i?.expand??G.expand),d=j(i?.collapse??G.collapse),u=[...e?.header?.toolbarContents??[]].sort((C,T)=>(C.order??0)-(T.order??0)),f=[...e?.toolPanels??[]].sort((C,T)=>(C.order??100)-(T.order??100)),p={title:e?.header?.title??void 0,hasPanels:f.length>0,isPanelOpen:t.isPanelOpen,toolPanelIcon:l,configButtons:u.map(C=>({id:C.id,hasElement:!1,hasRender:!!C.render})),apiButtons:[]},g={position:e?.toolPanel?.position??"right",isPanelOpen:t.isPanelOpen,expandIcon:a,collapseIcon:d,panels:f.map(C=>({id:C.id,title:C.title,icon:j(C.icon),isExpanded:t.expandedSections.has(C.id)}))},w=mn(p),m=bn(g),y=Mt({hasShell:!0,shellHeader:w,shellBody:m});n.appendChild(y)}else{const l=Mt({hasShell:!1});n.appendChild(l)}return o}function An(){return{startY:null,startX:null,scrollTop:null,scrollLeft:null,lastY:null,lastX:null,lastTime:null,velocityY:0,velocityX:0,momentumRaf:0}}function Tn(n){n.startY=null,n.startX=null,n.scrollTop=null,n.scrollLeft=null,n.lastY=null,n.lastX=null,n.lastTime=null}function Gt(n){n.momentumRaf&&(cancelAnimationFrame(n.momentumRaf),n.momentumRaf=0)}function kn(n,e,t){if(n.touches.length!==1)return;Gt(e);const i=n.touches[0];e.startY=i.clientY,e.startX=i.clientX,e.lastY=i.clientY,e.lastX=i.clientX,e.lastTime=performance.now(),e.scrollTop=t.fauxScrollbar.scrollTop,e.scrollLeft=t.scrollArea?.scrollLeft??0,e.velocityY=0,e.velocityX=0}function Pn(n,e,t){if(n.touches.length!==1||e.startY===null||e.startX===null||e.scrollTop===null||e.scrollLeft===null)return!1;const i=n.touches[0],o=i.clientY,r=i.clientX,s=performance.now(),l=e.startY-o,a=e.startX-r;if(e.lastTime!==null&&e.lastY!==null&&e.lastX!==null){const g=s-e.lastTime;g>0&&(e.velocityY=(e.lastY-o)/g,e.velocityX=(e.lastX-r)/g)}e.lastY=o,e.lastX=r,e.lastTime=s;const{scrollTop:d,scrollHeight:c,clientHeight:u}=t.fauxScrollbar,h=c-u,f=l>0&&d<h||l<0&&d>0;let p=!1;if(t.scrollArea){const{scrollLeft:g,scrollWidth:w,clientWidth:m}=t.scrollArea,y=w-m;p=a>0&&g<y||a<0&&g>0}return f&&(t.fauxScrollbar.scrollTop=e.scrollTop+l),p&&t.scrollArea&&(t.scrollArea.scrollLeft=e.scrollLeft+a),f||p}function Ln(n,e){(Math.abs(n.velocityY)>.1||Math.abs(n.velocityX)>.1)&&Dn(n,e),Tn(n)}function Dn(n,e){const o=()=>{n.velocityY*=.95,n.velocityX*=.95;const r=n.velocityY*16,s=n.velocityX*16;Math.abs(n.velocityY)>.01&&(e.fauxScrollbar.scrollTop+=r),Math.abs(n.velocityX)>.01&&e.scrollArea&&(e.scrollArea.scrollLeft+=s),Math.abs(n.velocityY)>.01||Math.abs(n.velocityX)>.01?n.momentumRaf=requestAnimationFrame(o):n.momentumRaf=0};n.momentumRaf=requestAnimationFrame(o)}function Hn(n,e,t,i){n.addEventListener("touchstart",o=>kn(o,e,t),{passive:!0,signal:i}),n.addEventListener("touchmove",o=>{Pn(o,e,t)&&o.preventDefault()},{passive:!1,signal:i}),n.addEventListener("touchend",()=>Ln(e,t),{passive:!0,signal:i})}const In=[{property:"editable",pluginName:"editing",level:"column",description:'the "editable" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';",isUsed:n=>n===!0},{property:"editor",pluginName:"editing",level:"column",description:'the "editor" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';"},{property:"editorParams",pluginName:"editing",level:"column",description:'the "editorParams" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';"},{property:"group",pluginName:"groupingColumns",level:"column",description:'the "group" column property',importHint:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';"},{property:"sticky",pluginName:"pinnedColumns",level:"column",description:'the "sticky" column property',importHint:"import { PinnedColumnsPlugin } from '@toolbox-web/grid/plugins/pinned-columns';",isUsed:n=>n==="left"||n==="right"}],Mn=[{property:"columnGroups",pluginName:"groupingColumns",level:"config",description:'the "columnGroups" config property',importHint:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';",isUsed:n=>Array.isArray(n)&&n.length>0}],Nn={editing:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';",selection:"import { SelectionPlugin } from '@toolbox-web/grid/plugins/selection';",reorder:"import { ReorderPlugin } from '@toolbox-web/grid/plugins/reorder';",clipboard:"import { ClipboardPlugin } from '@toolbox-web/grid/plugins/clipboard';",filtering:"import { FilteringPlugin } from '@toolbox-web/grid/plugins/filtering';",multiSort:"import { MultiSortPlugin } from '@toolbox-web/grid/plugins/multi-sort';",groupingRows:"import { GroupingRowsPlugin } from '@toolbox-web/grid/plugins/grouping-rows';",groupingColumns:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';",tree:"import { TreePlugin } from '@toolbox-web/grid/plugins/tree';",masterDetail:"import { MasterDetailPlugin } from '@toolbox-web/grid/plugins/master-detail';",pinnedColumns:"import { PinnedColumnsPlugin } from '@toolbox-web/grid/plugins/pinned-columns';",pinnedRows:"import { PinnedRowsPlugin } from '@toolbox-web/grid/plugins/pinned-rows';",visibility:"import { VisibilityPlugin } from '@toolbox-web/grid/plugins/visibility';",undoRedo:"import { UndoRedoPlugin } from '@toolbox-web/grid/plugins/undo-redo';",export:"import { ExportPlugin } from '@toolbox-web/grid/plugins/export';",contextMenu:"import { ContextMenuPlugin } from '@toolbox-web/grid/plugins/context-menu';",pivot:"import { PivotPlugin } from '@toolbox-web/grid/plugins/pivot';",serverSide:"import { ServerSidePlugin } from '@toolbox-web/grid/plugins/server-side';",columnVirtualization:"import { ColumnVirtualizationPlugin } from '@toolbox-web/grid/plugins/column-virtualization';"};function Fe(n){return Nn[n]??`import { ${B(n)}Plugin } from '@toolbox-web/grid/plugins/${n}';`}function Bt(){if(typeof window<"u"&&window.location){const n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1"||n==="::1")return!0}return typeof process<"u"&&process.env?.NODE_ENV!=="production"}function B(n){return n.charAt(0).toUpperCase()+n.slice(1)}function Kt(n,e){return n.some(t=>t.name===e)}function On(n,e){const t=In,i=Mn,o=new Map;function r(l,a,d,c,u=!1){o.has(l)||o.set(l,{description:a,importHint:d,fields:[],isConfigProperty:u});const h=o.get(l);h.fields.includes(c)||h.fields.push(c)}for(const l of i){const a=n[l.property];(l.isUsed?l.isUsed(a):a!==void 0)&&!Kt(e,l.pluginName)&&r(l.pluginName,l.description,l.importHint??Fe(l.pluginName),l.property,!0)}const s=n.columns;if(s&&s.length>0)for(const l of s)for(const a of t){const d=l[a.property];if((a.isUsed?a.isUsed(d):d!==void 0)&&!Kt(e,a.pluginName)){const u=l.field||"<unknown>";r(a.pluginName,a.description,a.importHint??Fe(a.pluginName),u)}}if(o.size>0){const l=[];for(const[a,{description:d,importHint:c,fields:u,isConfigProperty:h}]of o)if(h)l.push(`Config uses ${d}, but the required plugin is not loaded.
27
+ `}function ee(n,e){const t=n.querySelector("tbw-grid-header");if(!t)return;if(!e.lightDomTitle){const o=t.getAttribute("title");o&&(e.lightDomTitle=o)}const i=t.querySelectorAll("tbw-grid-header-content");i.length>0&&e.lightDomHeaderContent.length===0&&(e.lightDomHeaderContent=Array.from(i)),t.style.display="none"}function te(n,e,t){const i=n.querySelector(":scope > tbw-grid-tool-buttons");if(!i)return;e.hasToolButtonsContainer=!0;const o="light-dom-toolbar-content";if(e.lightDomToolbarContentIds.has(o))return;const r={id:o,order:0,render:(s=>{for(;i.firstChild;)s.appendChild(i.firstChild)})};e.toolbarContents.set(o,r),e.lightDomToolbarContentIds.add(o),i.style.display="none"}function ie(n,e,t){n.querySelectorAll(":scope > tbw-grid-tool-panel").forEach(o=>{const r=o,s=r.getAttribute("id"),l=r.getAttribute("title");if(!s||!l){console.warn(`[parseLightDomToolPanels] Tool panel missing required id or title attribute: id="${s??""}", title="${l??""}"`);return}const a=r.getAttribute("icon")??void 0,d=r.getAttribute("tooltip")??void 0,c=parseInt(r.getAttribute("order")??"100",10);let u;const h=t?.(r);if(h)u=h;else{const g=r.innerHTML.trim();u=w=>{const m=document.createElement("div");return m.innerHTML=g,w.appendChild(m),()=>m.remove()}}const f=e.toolPanels.get(s);if(f){if(h){f.render=u,f.order=c,f.icon=a,f.tooltip=d;const g=e.panelCleanups.get(s);g&&(g(),e.panelCleanups.delete(s))}return}const p={id:s,title:l,icon:a,tooltip:d,order:c,render:u};e.toolPanels.set(s,p),e.lightDomToolPanelIds.add(s),r.style.display="none"})}function yn(n,e,t,i){const o=n.querySelector(".tbw-shell-toolbar");o&&o.addEventListener("click",s=>{if(s.target.closest("[data-panel-toggle]")){i.onPanelToggle();return}});const r=n.querySelector(".tbw-accordion");r&&r.addEventListener("click",s=>{const a=s.target.closest(".tbw-accordion-header");if(a){const c=a.closest("[data-section]")?.getAttribute("data-section");c&&i.onSectionToggle(c)}})}function Cn(n,e,t){const i=n.querySelector(".tbw-tool-panel"),o=n.querySelector("[data-resize-handle]"),r=n.querySelector(".tbw-shell-body");if(!i||!o||!r)return()=>{};const s=e?.toolPanel?.position??"right",l=200;let a=0,d=0,c=0,u=!1;const h=g=>{if(!u)return;g.preventDefault();const w=s==="left"?g.clientX-a:a-g.clientX,m=Math.min(c,Math.max(l,d+w));i.style.width=`${m}px`},f=()=>{if(!u)return;u=!1,o.classList.remove("resizing"),i.style.transition="",document.body.style.cursor="",document.body.style.userSelect="";const g=i.getBoundingClientRect().width;t(g),document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",f)},p=g=>{g.preventDefault(),u=!0,a=g.clientX,d=i.getBoundingClientRect().width,c=r.getBoundingClientRect().width-20,o.classList.add("resizing"),i.style.transition="none",document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",h),document.addEventListener("mouseup",f)};return o.addEventListener("mousedown",p),()=>{o.removeEventListener("mousedown",p),document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",f)}}function Ot(n,e,t){const i=e?.header?.toolbarContents??[],o=[...t.toolbarContents.values()],r=new Set(i.map(l=>l.id)),s=[...i];for(const l of o)r.has(l.id)||s.push(l);for(const l of s){if(t.toolbarContentCleanups.has(l.id)||!l.render)continue;const a=n.querySelector(`[data-toolbar-content="${l.id}"]`);if(!a)continue;const d=l.render(a);d&&t.toolbarContentCleanups.set(l.id,d)}}function ze(n,e){const t=e.lightDomHeaderContent.length>0&&!e.lightDomContentMoved,i=e.headerContents.size>0;if(!t&&!i)return;const o=n.querySelector(".tbw-shell-content");if(!o)return;if(t){for(const s of e.lightDomHeaderContent)s.style.display="",o.appendChild(s);e.lightDomContentMoved=!0}const r=[...e.headerContents.values()].sort((s,l)=>(s.order??100)-(l.order??100));for(const s of r){const l=e.headerContentCleanups.get(s.id);l&&(l(),e.headerContentCleanups.delete(s.id));let a=o.querySelector(`[data-header-content="${s.id}"]`);a||(a=document.createElement("div"),a.setAttribute("data-header-content",s.id),o.appendChild(a));const d=s.render(a);d&&e.headerContentCleanups.set(s.id,d)}}function xn(n,e,t){if(!e.isPanelOpen)return;const i=j(t?.expand??G.expand),o=j(t?.collapse??G.collapse);for(const[r,s]of e.toolPanels){const l=e.expandedSections.has(r),a=n.querySelector(`[data-section="${r}"]`),d=a?.querySelector(".tbw-accordion-content");if(!a||!d)continue;a.classList.toggle("expanded",l);const c=a.querySelector(".tbw-accordion-header");c&&c.setAttribute("aria-expanded",String(l));const u=a.querySelector(".tbw-accordion-chevron");if(u&&(u.innerHTML=l?o:i),l){if(d.children.length===0){const h=s.render(d);h&&e.panelCleanups.set(r,h)}}else{const h=e.panelCleanups.get(r);h&&(h(),e.panelCleanups.delete(r)),d.innerHTML=""}}}function Ft(n,e){const t=n.querySelector("[data-panel-toggle]");t&&(t.classList.toggle("active",e.isPanelOpen),t.setAttribute("aria-pressed",String(e.isPanelOpen)))}function qt(n,e){const t=n.querySelector(".tbw-tool-panel");t&&(t.classList.toggle("open",e.isPanelOpen),e.isPanelOpen||(t.style.width=""))}function En(n){for(const e of n.headerContentCleanups.values())e();n.headerContentCleanups.clear();for(const e of n.panelCleanups.values())e();n.panelCleanups.clear();for(const e of n.toolbarContentCleanups.values())e();n.toolbarContentCleanups.clear();for(const e of n.toolbarContents.values())e.onDestroy?.();if(n.isPanelOpen)for(const e of n.expandedSections)n.toolPanels.get(e)?.onClose?.();n.isPanelOpen=!1,n.expandedSections.clear(),n.toolPanels.clear(),n.headerContents.clear(),n.toolbarContents.clear(),n.lightDomHeaderContent=[],n.lightDomToolPanelIds.clear(),n.lightDomToolbarContentIds.clear(),n.lightDomContentMoved=!1}function Rn(n,e){let t=!1;const i={get isInitialized(){return t},setInitialized(o){t=o},get isPanelOpen(){return n.isPanelOpen},get activePanel(){return n.isPanelOpen&&n.expandedSections.size>0?[...n.expandedSections][0]:null},get expandedSections(){return[...n.expandedSections]},openToolPanel(){if(n.isPanelOpen)return;if(n.toolPanels.size===0){console.warn("[tbw-grid] No tool panels registered");return}if(n.isPanelOpen=!0,n.expandedSections.size===0&&n.toolPanels.size>0){const s=[...n.toolPanels.values()].sort((l,a)=>(l.order??100)-(a.order??100))[0];s&&n.expandedSections.add(s.id)}const o=e.getShadow();Ft(o,n),qt(o,n),xn(o,n,e.getAccordionIcons()),e.emit("tool-panel-open",{sections:i.expandedSections})},closeToolPanel(){if(!n.isPanelOpen)return;for(const r of n.panelCleanups.values())r();n.panelCleanups.clear();for(const r of n.toolPanels.values())r.onClose?.();n.isPanelOpen=!1;const o=e.getShadow();Ft(o,n),qt(o,n),e.emit("tool-panel-close",{})},toggleToolPanel(){n.isPanelOpen?i.closeToolPanel():i.openToolPanel()},toggleToolPanelSection(o){const r=n.toolPanels.get(o);if(!r){console.warn(`[tbw-grid] Tool panel section "${o}" not found`);return}if(n.toolPanels.size===1)return;const s=e.getShadow(),l=n.expandedSections.has(o);if(l){const a=n.panelCleanups.get(o);a&&(a(),n.panelCleanups.delete(o)),r.onClose?.(),n.expandedSections.delete(o),Oe(s,o,!1)}else{for(const[a,d]of n.toolPanels)if(a!==o&&n.expandedSections.has(a)){const c=n.panelCleanups.get(a);c&&(c(),n.panelCleanups.delete(a)),d.onClose?.(),n.expandedSections.delete(a),Oe(s,a,!1);const u=s.querySelector(`[data-section="${a}"] .tbw-accordion-content`);u&&(u.innerHTML="")}n.expandedSections.add(o),Oe(s,o,!0),Sn(s,n,o)}e.emit("tool-panel-section-toggle",{id:o,expanded:!l})},getToolPanels(){return[...n.toolPanels.values()]},registerToolPanel(o){if(n.toolPanels.has(o.id)){console.warn(`[tbw-grid] Tool panel "${o.id}" already registered`);return}n.toolPanels.set(o.id,o),t&&e.refreshShellHeader()},unregisterToolPanel(o){if(n.expandedSections.has(o)){const r=n.panelCleanups.get(o);r&&(r(),n.panelCleanups.delete(o)),n.expandedSections.delete(o)}n.toolPanels.delete(o),t&&e.refreshShellHeader()},getHeaderContents(){return[...n.headerContents.values()]},registerHeaderContent(o){if(n.headerContents.has(o.id)){console.warn(`[tbw-grid] Header content "${o.id}" already registered`);return}n.headerContents.set(o.id,o),t&&ze(e.getShadow(),n)},unregisterHeaderContent(o){const r=n.headerContentCleanups.get(o);r&&(r(),n.headerContentCleanups.delete(o)),n.headerContents.get(o)?.onDestroy?.(),n.headerContents.delete(o),e.getShadow().querySelector(`[data-header-content="${o}"]`)?.remove()},getToolbarContents(){return[...n.toolbarContents.values()].sort((o,r)=>(o.order??0)-(r.order??0))},registerToolbarContent(o){if(n.toolbarContents.has(o.id)){console.warn(`[tbw-grid] Toolbar content "${o.id}" already registered`);return}n.toolbarContents.set(o.id,o),t&&e.refreshShellHeader()},unregisterToolbarContent(o){const r=n.toolbarContentCleanups.get(o);r&&(r(),n.toolbarContentCleanups.delete(o));const s=n.toolbarContents.get(o);s?.onDestroy&&s.onDestroy(),n.toolbarContents.delete(o),t&&e.refreshShellHeader()}};return i}function Oe(n,e,t){const i=n.querySelector(`[data-section="${e}"]`);i&&i.classList.toggle("expanded",t)}function Sn(n,e,t){const i=e.toolPanels.get(t);if(!i?.render)return;const o=n.querySelector(`[data-section="${t}"] .tbw-accordion-content`);if(!o)return;const r=i.render(o);r&&e.panelCleanups.set(t,r)}function _n(n,e,t,i){const o=Nt(e),r=[],s=["tbw-grid-header","tbw-grid-tool-buttons","tbw-grid-tool-panel","tbw-grid-column","tbw-grid-detail","tbw-grid-responsive-card"];for(const l of s)n.querySelectorAll(`:scope > ${l}`).forEach(d=>r.push(d));n.replaceChildren();for(const l of r)n.appendChild(l);if(o){const l=j(i?.toolPanel??G.toolPanel),a=j(i?.expand??G.expand),d=j(i?.collapse??G.collapse),u=[...e?.header?.toolbarContents??[]].sort((C,T)=>(C.order??0)-(T.order??0)),f=[...e?.toolPanels??[]].sort((C,T)=>(C.order??100)-(T.order??100)),p={title:e?.header?.title??void 0,hasPanels:f.length>0,isPanelOpen:t.isPanelOpen,toolPanelIcon:l,configButtons:u.map(C=>({id:C.id,hasElement:!1,hasRender:!!C.render})),apiButtons:[]},g={position:e?.toolPanel?.position??"right",isPanelOpen:t.isPanelOpen,expandIcon:a,collapseIcon:d,panels:f.map(C=>({id:C.id,title:C.title,icon:j(C.icon),isExpanded:t.expandedSections.has(C.id)}))},w=mn(p),m=bn(g),y=Mt({hasShell:!0,shellHeader:w,shellBody:m});n.appendChild(y)}else{const l=Mt({hasShell:!1});n.appendChild(l)}return o}function An(){return{startY:null,startX:null,scrollTop:null,scrollLeft:null,lastY:null,lastX:null,lastTime:null,velocityY:0,velocityX:0,momentumRaf:0}}function Tn(n){n.startY=null,n.startX=null,n.scrollTop=null,n.scrollLeft=null,n.lastY=null,n.lastX=null,n.lastTime=null}function Gt(n){n.momentumRaf&&(cancelAnimationFrame(n.momentumRaf),n.momentumRaf=0)}function kn(n,e,t){if(n.touches.length!==1)return;Gt(e);const i=n.touches[0];e.startY=i.clientY,e.startX=i.clientX,e.lastY=i.clientY,e.lastX=i.clientX,e.lastTime=performance.now(),e.scrollTop=t.fauxScrollbar.scrollTop,e.scrollLeft=t.scrollArea?.scrollLeft??0,e.velocityY=0,e.velocityX=0}function Ln(n,e,t){if(n.touches.length!==1||e.startY===null||e.startX===null||e.scrollTop===null||e.scrollLeft===null)return!1;const i=n.touches[0],o=i.clientY,r=i.clientX,s=performance.now(),l=e.startY-o,a=e.startX-r;if(e.lastTime!==null&&e.lastY!==null&&e.lastX!==null){const g=s-e.lastTime;g>0&&(e.velocityY=(e.lastY-o)/g,e.velocityX=(e.lastX-r)/g)}e.lastY=o,e.lastX=r,e.lastTime=s;const{scrollTop:d,scrollHeight:c,clientHeight:u}=t.fauxScrollbar,h=c-u,f=l>0&&d<h||l<0&&d>0;let p=!1;if(t.scrollArea){const{scrollLeft:g,scrollWidth:w,clientWidth:m}=t.scrollArea,y=w-m;p=a>0&&g<y||a<0&&g>0}return f&&(t.fauxScrollbar.scrollTop=e.scrollTop+l),p&&t.scrollArea&&(t.scrollArea.scrollLeft=e.scrollLeft+a),f||p}function Pn(n,e){(Math.abs(n.velocityY)>.1||Math.abs(n.velocityX)>.1)&&Dn(n,e),Tn(n)}function Dn(n,e){const o=()=>{n.velocityY*=.95,n.velocityX*=.95;const r=n.velocityY*16,s=n.velocityX*16;Math.abs(n.velocityY)>.01&&(e.fauxScrollbar.scrollTop+=r),Math.abs(n.velocityX)>.01&&e.scrollArea&&(e.scrollArea.scrollLeft+=s),Math.abs(n.velocityY)>.01||Math.abs(n.velocityX)>.01?n.momentumRaf=requestAnimationFrame(o):n.momentumRaf=0};n.momentumRaf=requestAnimationFrame(o)}function Hn(n,e,t,i){n.addEventListener("touchstart",o=>kn(o,e,t),{passive:!0,signal:i}),n.addEventListener("touchmove",o=>{Ln(o,e,t)&&o.preventDefault()},{passive:!1,signal:i}),n.addEventListener("touchend",()=>Pn(e,t),{passive:!0,signal:i})}const In=[{property:"editable",pluginName:"editing",level:"column",description:'the "editable" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';",isUsed:n=>n===!0},{property:"editor",pluginName:"editing",level:"column",description:'the "editor" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';"},{property:"editorParams",pluginName:"editing",level:"column",description:'the "editorParams" column property',importHint:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';"},{property:"group",pluginName:"groupingColumns",level:"column",description:'the "group" column property',importHint:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';"},{property:"sticky",pluginName:"pinnedColumns",level:"column",description:'the "sticky" column property',importHint:"import { PinnedColumnsPlugin } from '@toolbox-web/grid/plugins/pinned-columns';",isUsed:n=>n==="left"||n==="right"}],Mn=[{property:"columnGroups",pluginName:"groupingColumns",level:"config",description:'the "columnGroups" config property',importHint:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';",isUsed:n=>Array.isArray(n)&&n.length>0}],Nn={editing:"import { EditingPlugin } from '@toolbox-web/grid/plugins/editing';",selection:"import { SelectionPlugin } from '@toolbox-web/grid/plugins/selection';",reorder:"import { ReorderPlugin } from '@toolbox-web/grid/plugins/reorder';",clipboard:"import { ClipboardPlugin } from '@toolbox-web/grid/plugins/clipboard';",filtering:"import { FilteringPlugin } from '@toolbox-web/grid/plugins/filtering';",multiSort:"import { MultiSortPlugin } from '@toolbox-web/grid/plugins/multi-sort';",groupingRows:"import { GroupingRowsPlugin } from '@toolbox-web/grid/plugins/grouping-rows';",groupingColumns:"import { GroupingColumnsPlugin } from '@toolbox-web/grid/plugins/grouping-columns';",tree:"import { TreePlugin } from '@toolbox-web/grid/plugins/tree';",masterDetail:"import { MasterDetailPlugin } from '@toolbox-web/grid/plugins/master-detail';",pinnedColumns:"import { PinnedColumnsPlugin } from '@toolbox-web/grid/plugins/pinned-columns';",pinnedRows:"import { PinnedRowsPlugin } from '@toolbox-web/grid/plugins/pinned-rows';",visibility:"import { VisibilityPlugin } from '@toolbox-web/grid/plugins/visibility';",undoRedo:"import { UndoRedoPlugin } from '@toolbox-web/grid/plugins/undo-redo';",export:"import { ExportPlugin } from '@toolbox-web/grid/plugins/export';",contextMenu:"import { ContextMenuPlugin } from '@toolbox-web/grid/plugins/context-menu';",pivot:"import { PivotPlugin } from '@toolbox-web/grid/plugins/pivot';",serverSide:"import { ServerSidePlugin } from '@toolbox-web/grid/plugins/server-side';",columnVirtualization:"import { ColumnVirtualizationPlugin } from '@toolbox-web/grid/plugins/column-virtualization';"};function Fe(n){return Nn[n]??`import { ${B(n)}Plugin } from '@toolbox-web/grid/plugins/${n}';`}function Bt(){if(typeof window<"u"&&window.location){const n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1"||n==="::1")return!0}return typeof process<"u"&&process.env?.NODE_ENV!=="production"}function B(n){return n.charAt(0).toUpperCase()+n.slice(1)}function $t(n,e){return n.some(t=>t.name===e)}function zn(n,e){const t=In,i=Mn,o=new Map;function r(l,a,d,c,u=!1){o.has(l)||o.set(l,{description:a,importHint:d,fields:[],isConfigProperty:u});const h=o.get(l);h.fields.includes(c)||h.fields.push(c)}for(const l of i){const a=n[l.property];(l.isUsed?l.isUsed(a):a!==void 0)&&!$t(e,l.pluginName)&&r(l.pluginName,l.description,l.importHint??Fe(l.pluginName),l.property,!0)}const s=n.columns;if(s&&s.length>0)for(const l of s)for(const a of t){const d=l[a.property];if((a.isUsed?a.isUsed(d):d!==void 0)&&!$t(e,a.pluginName)){const u=l.field||"<unknown>";r(a.pluginName,a.description,a.importHint??Fe(a.pluginName),u)}}if(o.size>0){const l=[];for(const[a,{description:d,importHint:c,fields:u,isConfigProperty:h}]of o)if(h)l.push(`Config uses ${d}, but the required plugin is not loaded.
28
28
  → Add the plugin to your gridConfig.plugins array:
29
29
  ${c}
30
30
  plugins: [new ${a.charAt(0).toUpperCase()+a.slice(1)}Plugin(), ...]`);else{const f=u.slice(0,3).join(", ")+(u.length>3?`, ... (${u.length} total)`:"");l.push(`Column(s) [${f}] use ${d}, but the required plugin is not loaded.
@@ -36,7 +36,7 @@ ${l.join(`
36
36
 
37
37
  `)}
38
38
 
39
- This validation helps catch misconfigurations early. The properties listed above require their respective plugins to function.`)}}function zn(n){const e=[],t=[];for(const i of n){const r=i.constructor.manifest;if(r?.configRules)for(const s of r.configRules){const l=i.config;if(s.check(l)){const d=`${`[tbw-grid:${B(i.name)}Plugin]`} Configuration warning: ${s.message}`;s.severity==="error"?e.push(d):t.push(d)}}}if(t.length>0&&Bt())for(const i of t)console.warn(i);if(e.length>0)throw new Error(`[tbw-grid] Configuration error:
39
+ This validation helps catch misconfigurations early. The properties listed above require their respective plugins to function.`)}}function On(n){const e=[],t=[];for(const i of n){const r=i.constructor.manifest;if(r?.configRules)for(const s of r.configRules){const l=i.config;if(s.check(l)){const d=`${`[tbw-grid:${B(i.name)}Plugin]`} Configuration warning: ${s.message}`;s.severity==="error"?e.push(d):t.push(d)}}}if(t.length>0&&Bt())for(const i of t)console.warn(i);if(e.length>0)throw new Error(`[tbw-grid] Configuration error:
40
40
 
41
41
  ${e.join(`
42
42
 
@@ -52,17 +52,17 @@ ${B(i.name)}Plugin and ${B(s.name)}Plugin are both loaded, but they are currentl
52
52
 
53
53
  → ${s.reason}
54
54
 
55
- Consider removing one of these plugins to avoid unexpected behavior.`)}}}}class Vt{constructor(e){this.grid=e}plugins=[];getPlugins(){return this.plugins}pluginMap=new Map;cellRenderers=new Map;headerRenderers=new Map;cellEditors=new Map;attachAll(e){for(const t of e)this.attach(t)}attach(e){if(Fn(e,this.plugins),this.pluginMap.set(e.constructor,e),this.plugins.push(e),e.cellRenderers)for(const[t,i]of Object.entries(e.cellRenderers))this.cellRenderers.set(t,i);if(e.headerRenderers)for(const[t,i]of Object.entries(e.headerRenderers))this.headerRenderers.set(t,i);if(e.cellEditors)for(const[t,i]of Object.entries(e.cellEditors))this.cellEditors.set(t,i);e.attach(this.grid);for(const t of this.plugins)t!==e&&t.onPluginAttached&&t.onPluginAttached(e.name,e)}detachAll(){for(const e of this.plugins)for(const t of this.plugins)t!==e&&t.onPluginDetached&&t.onPluginDetached(e.name);for(let e=this.plugins.length-1;e>=0;e--)this.plugins[e].detach();this.plugins=[],this.pluginMap.clear(),this.cellRenderers.clear(),this.headerRenderers.clear(),this.cellEditors.clear()}getPlugin(e){return this.pluginMap.get(e)}getPluginByName(e){return this.plugins.find(t=>t.name===e)}hasPlugin(e){return this.pluginMap.has(e)}getAll(){return this.plugins}getRegisteredPluginNames(){return this.plugins.map(e=>e.name)}getCellRenderer(e){return this.cellRenderers.get(e)}getHeaderRenderer(e){return this.headerRenderers.get(e)}getCellEditor(e){return this.cellEditors.get(e)}getPluginStyles(){return this.plugins.filter(e=>e.styles).map(e=>({name:e.name,styles:e.styles}))}processRows(e){let t=[...e];for(const i of this.plugins)i.processRows&&(t=i.processRows(t));return t}processColumns(e){let t=[...e];for(const i of this.plugins)i.processColumns&&(t=i.processColumns(t));return t}beforeRender(){for(const e of this.plugins)e.beforeRender?.()}afterRender(){for(const e of this.plugins)e.afterRender?.()}afterCellRender(e){for(const t of this.plugins)t.afterCellRender?.(e)}hasAfterCellRenderHook(){return this.plugins.some(e=>typeof e.afterCellRender=="function")}afterRowRender(e){for(const t of this.plugins)t.afterRowRender?.(e)}hasAfterRowRenderHook(){return this.plugins.some(e=>typeof e.afterRowRender=="function")}onScrollRender(){for(const e of this.plugins)e.onScrollRender?.()}getExtraHeight(){let e=0;for(const t of this.plugins)typeof t.getExtraHeight=="function"&&(e+=t.getExtraHeight());return e}hasExtraHeight(){for(const e of this.plugins)if(typeof e.getExtraHeight=="function"&&e.getExtraHeight()>0)return!0;return!1}getExtraHeightBefore(e){let t=0;for(const i of this.plugins)typeof i.getExtraHeightBefore=="function"&&(t+=i.getExtraHeightBefore(e));return t}adjustVirtualStart(e,t,i){let o=e;for(const r of this.plugins)if(typeof r.adjustVirtualStart=="function"){const s=r.adjustVirtualStart(e,t,i);s<o&&(o=s)}return o}renderRow(e,t,i){for(const o of this.plugins)if(o.renderRow?.(e,t,i))return!0;return!1}queryPlugins(e){const t=[];for(const i of this.plugins){const o=i.onPluginQuery?.(e);o!==void 0&&t.push(o)}return t}onKeyDown(e){for(const t of this.plugins)if(t.onKeyDown?.(e))return!0;return!1}onCellClick(e){for(const t of this.plugins)if(t.onCellClick?.(e))return!0;return!1}onRowClick(e){for(const t of this.plugins)if(t.onRowClick?.(e))return!0;return!1}onHeaderClick(e){for(const t of this.plugins)if(t.onHeaderClick?.(e))return!0;return!1}onScroll(e){for(const t of this.plugins)t.onScroll?.(e)}onCellMouseDown(e){for(const t of this.plugins)if(t.onCellMouseDown?.(e))return!0;return!1}onCellMouseMove(e){for(const t of this.plugins)if(t.onCellMouseMove?.(e))return!0;return!1}onCellMouseUp(e){for(const t of this.plugins)if(t.onCellMouseUp?.(e))return!0;return!1}getHorizontalScrollOffsets(e,t){let i=0,o=0,r=!1;for(const s of this.plugins){const l=s.getHorizontalScrollOffsets?.(e,t);l&&(i+=l.left,o+=l.right,l.skipScroll&&(r=!0))}return{left:i,right:o,skipScroll:r}}getToolPanels(){const e=[];for(const t of this.plugins){const i=t.getToolPanel?.();i&&e.push({plugin:t,panel:i})}return e.sort((t,i)=>(t.panel.order??0)-(i.panel.order??0))}getHeaderContents(){const e=[];for(const t of this.plugins){const i=t.getHeaderContent?.();i&&e.push({plugin:t,content:i})}return e.sort((t,i)=>(t.content.order??0)-(i.content.order??0))}}class M extends HTMLElement{static tagName="tbw-grid";static version=typeof __GRID_VERSION__<"u"?__GRID_VERSION__:"dev";static#t=0;static adapters=[];static registerAdapter(e){this.adapters.push(e)}static getAdapters(){return this.adapters}static clearAdapters(){this.adapters=[]}static get observedAttributes(){return["rows","columns","grid-config","fit-mode"]}get#e(){return this}#u=!1;#d;#s;#l=[];get#n(){return this.#o?.effective??{}}#h=!1;#g=!1;#f={rows:!1,columns:!1,gridConfig:!1,fitMode:!1};#c;#m=0;#a=null;#w=!1;#y;#C=An();#b;#E;#R;#v;#z={scrollTop:0,scrollLeft:0,scrollHeight:0,scrollWidth:0,clientHeight:0,clientWidth:0};#r;#x;#_=!1;#P;#L;#o;#i=vn();#p;#H;#D=new Map;_rows=[];#F=[];get _columns(){return this.#n.columns??[]}set _columns(e){this.#n.columns=e}get _visibleColumns(){return this._columns.filter(e=>!e.hidden)}_headerRowEl;_bodyEl;_rowPool=[];_resizeController;_virtualization={enabled:!0,rowHeight:28,bypassThreshold:24,start:0,end:0,container:null,viewportEl:null,totalHeightEl:null};_focusRow=0;_focusCol=0;_restoreFocusAfterRender=!1;_sortState=null;_gridTemplate="";__rowRenderEpoch=0;__didInitialAutoSize=!1;get __lightDomColumnsCache(){return this.#o?.lightDomColumnsCache}set __lightDomColumnsCache(e){this.#o&&(this.#o.lightDomColumnsCache=e)}get __originalColumnNodes(){return this.#o?.originalColumnNodes}set __originalColumnNodes(e){this.#o&&(this.#o.originalColumnNodes=e)}__originalOrder=[];__frameworkAdapter;__rowsBodyEl=null;get rows(){return this._rows}set rows(e){const t=this.#l;this.#l=e,t!==e&&this.#O("rows")}get sourceRows(){return this.#l}get columns(){return[...this._columns]}set columns(e){const t=this.#o?.getColumns();this.#o?.setColumns(e),t!==e&&this.#O("columns")}get gridConfig(){return this.#n}set gridConfig(e){const t=this.#o?.getGridConfig();this.#o?.setGridConfig(e),t!==e&&(this.#o.clearLightDomCache(),this.#O("gridConfig"))}get fitMode(){return this.#n.fitMode??"stretch"}set fitMode(e){const t=this.#o?.getFitMode();this.#o?.setFitMode(e),t!==e&&this.#O("fitMode")}get effectiveConfig(){return this.#n}get disconnectSignal(){return this.#b||(this.#b=new AbortController),this.#b.signal}constructor(){super(),this.#ce(),this.#d=new Promise(e=>this.#s=e),this.#c=new cn({mergeConfig:()=>{this.#o.parseLightDomColumns(this),this.#o.merge(),this.#Z(),On(this.#n,this.#r?.getPlugins()??[]),zn(this.#r?.getPlugins()??[]),qn(this.#r?.getPlugins()??[]),this.#Ee(),this.#F=[...this._columns]},processColumns:()=>this.#ye(),processRows:()=>this.#Ce(),renderHeader:()=>xe(this),updateTemplate:()=>le(this),renderVirtualWindow:()=>this.refreshVirtualWindow(!0,!0),afterRender:()=>{this.#r?.afterRender(),this.#n.fitMode==="fixed"&&!this.__didInitialAutoSize&&(this.__didInitialAutoSize=!0,ht(this)),this._restoreFocusAfterRender&&(this._restoreFocusAfterRender=!1,F(this)),this._virtualization.enabled&&!this.#N&&this.#he()},isConnected:()=>this.isConnected&&this.#h}),this.#c.setInitialReadyResolver(()=>this.#s?.()),this.#p=Rn(this.#i,{getShadow:()=>this.#e,getShellConfig:()=>this.#n?.shell,getAccordionIcons:()=>({expand:this.#n?.icons?.expand??G.expand,collapse:this.#n?.icons?.collapse??G.collapse}),emit:(e,t)=>this.#T(e,t),refreshShellHeader:()=>this.refreshShellHeader()}),this.#o=new ji({getRows:()=>this.#l,getSortState:()=>this._sortState,setSortState:e=>{this._sortState=e},onConfigChange:()=>{this.#c.requestPhase(I.FULL,"configChange")},emit:(e,t)=>this.#T(e,t),clearRowPool:()=>{this._rowPool.length=0,this._bodyEl&&(this._bodyEl.innerHTML=""),this.__rowRenderEpoch++},setup:()=>this.#k(),renderHeader:()=>xe(this),updateTemplate:()=>le(this),refreshVirtualWindow:()=>this.#c.requestPhase(I.VIRTUALIZATION,"configManager"),getVirtualization:()=>this._virtualization,setRowHeight:e=>{this._virtualization.rowHeight=e},applyAnimationConfig:e=>this.#xe(e),getShellLightDomTitle:()=>this.#i.lightDomTitle,getShellToolPanels:()=>this.#i.toolPanels,getShellHeaderContents:()=>this.#i.headerContents,getShellToolbarContents:()=>this.#i.toolbarContents,getShellLightDomHeaderContent:()=>this.#i.lightDomHeaderContent,getShellHasToolButtonsContainer:()=>this.#i.hasToolButtonsContainer})}static#Y="tbw-grid-styles";static#I="";static#q=new Map;static#de(){let e=document.getElementById(this.#Y);return e||(e=document.createElement("style"),e.id=this.#Y,e.setAttribute("data-tbw-grid","true"),document.head.appendChild(e)),e}static#G(){const e=this.#de(),t=Array.from(this.#q.values()).join(`
56
- `);e.textContent=`${this.#I}
55
+ Consider removing one of these plugins to avoid unexpected behavior.`)}}}}class Kt{constructor(e){this.grid=e}plugins=[];getPlugins(){return this.plugins}pluginMap=new Map;cellRenderers=new Map;headerRenderers=new Map;cellEditors=new Map;attachAll(e){for(const t of e)this.attach(t)}attach(e){if(Fn(e,this.plugins),this.pluginMap.set(e.constructor,e),this.plugins.push(e),e.cellRenderers)for(const[t,i]of Object.entries(e.cellRenderers))this.cellRenderers.set(t,i);if(e.headerRenderers)for(const[t,i]of Object.entries(e.headerRenderers))this.headerRenderers.set(t,i);if(e.cellEditors)for(const[t,i]of Object.entries(e.cellEditors))this.cellEditors.set(t,i);e.attach(this.grid);for(const t of this.plugins)t!==e&&t.onPluginAttached&&t.onPluginAttached(e.name,e)}detachAll(){for(const e of this.plugins)for(const t of this.plugins)t!==e&&t.onPluginDetached&&t.onPluginDetached(e.name);for(let e=this.plugins.length-1;e>=0;e--)this.plugins[e].detach();this.plugins=[],this.pluginMap.clear(),this.cellRenderers.clear(),this.headerRenderers.clear(),this.cellEditors.clear()}getPlugin(e){return this.pluginMap.get(e)}getPluginByName(e){return this.plugins.find(t=>t.name===e)}hasPlugin(e){return this.pluginMap.has(e)}getAll(){return this.plugins}getRegisteredPluginNames(){return this.plugins.map(e=>e.name)}getCellRenderer(e){return this.cellRenderers.get(e)}getHeaderRenderer(e){return this.headerRenderers.get(e)}getCellEditor(e){return this.cellEditors.get(e)}getPluginStyles(){return this.plugins.filter(e=>e.styles).map(e=>({name:e.name,styles:e.styles}))}processRows(e){let t=[...e];for(const i of this.plugins)i.processRows&&(t=i.processRows(t));return t}processColumns(e){let t=[...e];for(const i of this.plugins)i.processColumns&&(t=i.processColumns(t));return t}beforeRender(){for(const e of this.plugins)e.beforeRender?.()}afterRender(){for(const e of this.plugins)e.afterRender?.()}afterCellRender(e){for(const t of this.plugins)t.afterCellRender?.(e)}hasAfterCellRenderHook(){return this.plugins.some(e=>typeof e.afterCellRender=="function")}afterRowRender(e){for(const t of this.plugins)t.afterRowRender?.(e)}hasAfterRowRenderHook(){return this.plugins.some(e=>typeof e.afterRowRender=="function")}onScrollRender(){for(const e of this.plugins)e.onScrollRender?.()}getExtraHeight(){let e=0;for(const t of this.plugins)typeof t.getExtraHeight=="function"&&(e+=t.getExtraHeight());return e}hasExtraHeight(){for(const e of this.plugins)if(typeof e.getExtraHeight=="function"&&e.getExtraHeight()>0)return!0;return!1}getExtraHeightBefore(e){let t=0;for(const i of this.plugins)typeof i.getExtraHeightBefore=="function"&&(t+=i.getExtraHeightBefore(e));return t}adjustVirtualStart(e,t,i){let o=e;for(const r of this.plugins)if(typeof r.adjustVirtualStart=="function"){const s=r.adjustVirtualStart(e,t,i);s<o&&(o=s)}return o}renderRow(e,t,i){for(const o of this.plugins)if(o.renderRow?.(e,t,i))return!0;return!1}queryPlugins(e){const t=[];for(const i of this.plugins){const o=i.onPluginQuery?.(e);o!==void 0&&t.push(o)}return t}onKeyDown(e){for(const t of this.plugins)if(t.onKeyDown?.(e))return!0;return!1}onCellClick(e){for(const t of this.plugins)if(t.onCellClick?.(e))return!0;return!1}onRowClick(e){for(const t of this.plugins)if(t.onRowClick?.(e))return!0;return!1}onHeaderClick(e){for(const t of this.plugins)if(t.onHeaderClick?.(e))return!0;return!1}onScroll(e){for(const t of this.plugins)t.onScroll?.(e)}onCellMouseDown(e){for(const t of this.plugins)if(t.onCellMouseDown?.(e))return!0;return!1}onCellMouseMove(e){for(const t of this.plugins)if(t.onCellMouseMove?.(e))return!0;return!1}onCellMouseUp(e){for(const t of this.plugins)if(t.onCellMouseUp?.(e))return!0;return!1}getHorizontalScrollOffsets(e,t){let i=0,o=0,r=!1;for(const s of this.plugins){const l=s.getHorizontalScrollOffsets?.(e,t);l&&(i+=l.left,o+=l.right,l.skipScroll&&(r=!0))}return{left:i,right:o,skipScroll:r}}getToolPanels(){const e=[];for(const t of this.plugins){const i=t.getToolPanel?.();i&&e.push({plugin:t,panel:i})}return e.sort((t,i)=>(t.panel.order??0)-(i.panel.order??0))}getHeaderContents(){const e=[];for(const t of this.plugins){const i=t.getHeaderContent?.();i&&e.push({plugin:t,content:i})}return e.sort((t,i)=>(t.content.order??0)-(i.content.order??0))}}class M extends HTMLElement{static tagName="tbw-grid";static version=typeof __GRID_VERSION__<"u"?__GRID_VERSION__:"dev";static#t=0;static adapters=[];static registerAdapter(e){this.adapters.push(e)}static getAdapters(){return this.adapters}static clearAdapters(){this.adapters=[]}static get observedAttributes(){return["rows","columns","grid-config","fit-mode","loading"]}get#e(){return this}#u=!1;#d;#s;#l=[];get#n(){return this.#o?.effective??{}}#h=!1;#g=!1;#f={rows:!1,columns:!1,gridConfig:!1,fitMode:!1};#c;#m=0;#a=null;#w=!1;#y;#C=An();#b;#E;#R;#v;#B={scrollTop:0,scrollLeft:0,scrollHeight:0,scrollWidth:0,clientHeight:0,clientWidth:0};#r;#x;#A=!1;#H;#I;#o;#i=vn();#p;#M;#N=!1;#T=new Set;#k=new Map;#z;#S=new Map;_rows=[];#$=[];get _columns(){return this.#n.columns??[]}set _columns(e){this.#n.columns=e}get _visibleColumns(){return this._columns.filter(e=>!e.hidden)}_headerRowEl;_bodyEl;_rowPool=[];_resizeController;_virtualization={enabled:!0,rowHeight:28,bypassThreshold:24,start:0,end:0,container:null,viewportEl:null,totalHeightEl:null};_focusRow=0;_focusCol=0;_restoreFocusAfterRender=!1;_sortState=null;_gridTemplate="";__rowRenderEpoch=0;__didInitialAutoSize=!1;get __lightDomColumnsCache(){return this.#o?.lightDomColumnsCache}set __lightDomColumnsCache(e){this.#o&&(this.#o.lightDomColumnsCache=e)}get __originalColumnNodes(){return this.#o?.originalColumnNodes}set __originalColumnNodes(e){this.#o&&(this.#o.originalColumnNodes=e)}__originalOrder=[];__frameworkAdapter;__rowsBodyEl=null;get rows(){return this._rows}set rows(e){const t=this.#l;this.#l=e,t!==e&&this.#G("rows")}get sourceRows(){return this.#l}get columns(){return[...this._columns]}set columns(e){const t=this.#o?.getColumns();this.#o?.setColumns(e),t!==e&&this.#G("columns")}get gridConfig(){return this.#n}set gridConfig(e){const t=this.#o?.getGridConfig();this.#o?.setGridConfig(e),t!==e&&(this.#o.clearLightDomCache(),this.#G("gridConfig"))}get fitMode(){return this.#n.fitMode??"stretch"}set fitMode(e){const t=this.#o?.getFitMode();this.#o?.setFitMode(e),t!==e&&this.#G("fitMode")}get loading(){return this.#N}set loading(e){const t=this.#N;this.#N=e,e?this.setAttribute("loading",""):this.removeAttribute("loading"),t!==e&&this.#De()}setRowLoading(e,t){const i=this.#T.has(e);t?this.#T.add(e):this.#T.delete(e),i!==t&&this.#he(e,t)}setCellLoading(e,t,i){let o=this.#k.get(e);const r=o?.has(t)??!1;i?(o||(o=new Set,this.#k.set(e,o)),o.add(t)):(o?.delete(t),o?.size===0&&this.#k.delete(e)),r!==i&&this.#fe(e,t,i)}isRowLoading(e){return this.#T.has(e)}isCellLoading(e,t){return this.#k.get(e)?.has(t)??!1}clearAllLoading(){this.loading=!1;for(const e of this.#T)this.#he(e,!1);this.#T.clear();for(const[e,t]of this.#k)for(const i of t)this.#fe(e,i,!1);this.#k.clear()}get effectiveConfig(){return this.#n}get disconnectSignal(){return this.#b||(this.#b=new AbortController),this.#b.signal}constructor(){super(),this.#we(),this.#d=new Promise(e=>this.#s=e),this.#c=new cn({mergeConfig:()=>{this.#o.parseLightDomColumns(this),this.#o.merge(),this.#te(),zn(this.#n,this.#r?.getPlugins()??[]),On(this.#r?.getPlugins()??[]),qn(this.#r?.getPlugins()??[]),this.#ke(),this.#$=[...this._columns]},processColumns:()=>this.#_e(),processRows:()=>this.#Ae(),renderHeader:()=>xe(this),updateTemplate:()=>le(this),renderVirtualWindow:()=>this.refreshVirtualWindow(!0,!0),afterRender:()=>{this.#r?.afterRender(),this.#n.fitMode==="fixed"&&!this.__didInitialAutoSize&&(this.__didInitialAutoSize=!0,ht(this)),this._restoreFocusAfterRender&&(this._restoreFocusAfterRender=!1,F(this)),this._virtualization.enabled&&!this.#q&&this.#be()},isConnected:()=>this.isConnected&&this.#h}),this.#c.setInitialReadyResolver(()=>this.#s?.()),this.#p=Rn(this.#i,{getShadow:()=>this.#e,getShellConfig:()=>this.#n?.shell,getAccordionIcons:()=>({expand:this.#n?.icons?.expand??G.expand,collapse:this.#n?.icons?.collapse??G.collapse}),emit:(e,t)=>this.#P(e,t),refreshShellHeader:()=>this.refreshShellHeader()}),this.#o=new ji({getRows:()=>this.#l,getSortState:()=>this._sortState,setSortState:e=>{this._sortState=e},onConfigChange:()=>{this.#c.requestPhase(I.FULL,"configChange")},emit:(e,t)=>this.#P(e,t),clearRowPool:()=>{this._rowPool.length=0,this._bodyEl&&(this._bodyEl.innerHTML=""),this.__rowRenderEpoch++},setup:()=>this.#D(),renderHeader:()=>xe(this),updateTemplate:()=>le(this),refreshVirtualWindow:()=>this.#c.requestPhase(I.VIRTUALIZATION,"configManager"),getVirtualization:()=>this._virtualization,setRowHeight:e=>{this._virtualization.rowHeight=e},applyAnimationConfig:e=>this.#Te(e),getShellLightDomTitle:()=>this.#i.lightDomTitle,getShellToolPanels:()=>this.#i.toolPanels,getShellHeaderContents:()=>this.#i.headerContents,getShellToolbarContents:()=>this.#i.toolbarContents,getShellLightDomHeaderContent:()=>this.#i.lightDomHeaderContent,getShellHasToolButtonsContainer:()=>this.#i.hasToolButtonsContainer})}static#Q="tbw-grid-styles";static#O="";static#K=new Map;static#pe(){let e=document.getElementById(this.#Q);return e||(e=document.createElement("style"),e.id=this.#Q,e.setAttribute("data-tbw-grid","true"),document.head.appendChild(e)),e}static#V(){const e=this.#pe(),t=Array.from(this.#K.values()).join(`
56
+ `);e.textContent=`${this.#O}
57
57
 
58
58
  /* Plugin Styles */
59
- ${t}`}async#ce(){if(!M.#I){if(J.length>0){M.#I=J,M.#G();return}await new Promise(e=>setTimeout(e,50));try{let e="";for(const t of Array.from(document.styleSheets))try{const o=Array.from(t.cssRules||[]).map(r=>r.cssText).join(`
60
- `);if(o.includes(".tbw-grid-root")&&o.includes("tbw-grid")){e=o;break}}catch{continue}e?(M.#I=e,M.#G()):(typeof process>"u"||process.env?.NODE_ENV!=="test")&&console.warn("[tbw-grid] Could not find grid.css in document.styleSheets. Grid styling will not work.","Available stylesheets:",Array.from(document.styleSheets).map(t=>t.href||"(inline)"))}catch(e){console.warn("[tbw-grid] Failed to extract grid.css from document stylesheets:",e)}}}getPlugin(e){return this.#r?.getPlugin(e)}getPluginByName(e){return this.#r?.getPluginByName(e)}requestRender(){this.#c.requestPhase(I.ROWS,"plugin:requestRender")}requestRenderWithFocus(){this._restoreFocusAfterRender=!0,this.#c.requestPhase(I.ROWS,"plugin:requestRenderWithFocus")}updateTemplate(){le(this)}requestAfterRender(){this.#c.requestPhase(I.STYLE,"plugin:requestAfterRender")}#X(){this.#r=new Vt(this);const e=this.#n?.plugins,t=Array.isArray(e)?e:[];this.#r.attachAll(t)}#M(){const e=this.#r?.getPluginStyles()??[];let t=!1;for(const{name:i,styles:o}of e)M.#q.has(i)||(M.#q.set(i,o),t=!0);t&&M.#G()}#Z(){const e=this.#n?.plugins,t=Array.isArray(e)?e:[];if(this.#x!==t){if(this.#x&&this.#x.length===t.length&&this.#x.every((i,o)=>i===t[o])){this.#x=t;return}this.#r&&this.#r.detachAll();for(const i of this.#i.toolPanels.keys()){const o=this.#i.lightDomToolPanelIds.has(i),r=this.#i.apiToolPanelIds.has(i);if(!o&&!r){const s=this.#i.panelCleanups.get(i);s&&(s(),this.#i.panelCleanups.delete(i)),this.#i.toolPanels.delete(i)}}for(const i of this.#i.headerContents.keys()){const o=this.#i.headerContentCleanups.get(i);o&&(o(),this.#i.headerContentCleanups.delete(i)),this.#i.headerContents.delete(i)}this.#X(),this.#M(),this.#x=t,this.#J(),this.#w=this.#r?.getAll().some(i=>i.onScroll)??!1}}#ue(){this.#r?.detachAll()}#J(){if(!this.#r)return;const e=this.#r.getToolPanels();for(const{panel:i}of e)this.#i.toolPanels.has(i.id)||this.#i.toolPanels.set(i.id,i);const t=this.#r.getHeaderContents();for(const{content:i}of t)this.#i.headerContents.has(i.id)||this.#i.headerContents.set(i.id,i)}#A(){const e=M.getAdapters();if(e.length===0&&!this.__frameworkAdapter)return;const t=this.__frameworkAdapter;return i=>{if(t?.createToolPanelRenderer){const o=t.createToolPanelRenderer(i);if(o)return o}for(const o of e)if(o.createToolPanelRenderer){const r=o.createToolPanelRenderer(i);if(r)return r}}}connectedCallback(){this.hasAttribute("tabindex")||(this.tabIndex=0),this.hasAttribute("version")||this.setAttribute("version",M.version),this.id||(this.id=`tbw-grid-${++M.#t}`),this._rows=Array.isArray(this.#l)?[...this.#l]:[],this.#b&&(this.#b.abort(),this.#_=!1),this.#b=new AbortController,this.#v&&(kt(this.#v),this.#v=void 0),ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#A()),this.#o.parseLightDomColumns(this),this.#o.merge(),this.#X();const e=this.#n?.plugins;this.#x=Array.isArray(e)?e:[],this.#J(),this.#u||(this.#U(),this.#M(),this.#u=!0),this.#Q(),this.#v=dn(()=>{this.#Ae()},{timeout:100})}disconnectedCallback(){this.#v&&(kt(this.#v),this.#v=void 0),this.#ue(),En(this.#i),this.#p.setInitialized(!1),this.#H?.(),this.#H=void 0,Gt(this.#C),this.#b&&(this.#b.abort(),this.#b=void 0),this.#P?.abort(),this.#P=void 0,this.#_=!1,this._resizeController&&this._resizeController.dispose(),this.#E&&(this.#E.disconnect(),this.#E=void 0),this.#R&&(this.#R.disconnect(),this.#R=void 0,this.#N=!1),me(this),this.#S.clear(),this.#x=void 0;for(const e of this._rowPool)e.remove();this._rowPool.length=0,this.__rowsBodyEl=null,this.#h=!1}attributeChangedCallback(e,t,i){if(!(t===i||!i||i==="null"||i==="undefined"))if(e==="rows"||e==="columns"||e==="grid-config")try{const o=JSON.parse(i);e==="rows"?this.rows=o:e==="columns"?this.columns=o:e==="grid-config"&&(this.gridConfig=o)}catch{console.warn(`[tbw-grid] Invalid JSON for '${e}' attribute:`,i)}else e==="fit-mode"&&(this.fitMode=i)}#Q(){const t=this.#e.querySelector(".tbw-grid-content")??this.#e.querySelector(".tbw-grid-root");if(this._headerRowEl=t?.querySelector(".header-row"),this._virtualization.totalHeightEl=t?.querySelector(".faux-vscroll-spacer"),this._virtualization.viewportEl=t?.querySelector(".rows-viewport"),this._bodyEl=t?.querySelector(".rows"),this.__rowsBodyEl=t?.querySelector(".rows-body"),this.#p.isInitialized){Oe(this.#e,this.#i),zt(this.#e,this.#n?.shell,this.#i);const r=this.#n?.shell?.toolPanel?.defaultOpen;r&&this.#i.toolPanels.has(r)&&(this.openToolPanel(),this.#i.expandedSections.add(r))}if(this.setAttribute("data-upgraded",""),this.#h=!0,this._resizeController=Pt(this),this.#k(),this.#te(t),this.#_)return;this.#_=!0;const i=this.disconnectSignal;sn(this,this,this.#e,i);const o=this.#n.rowHeight;o&&o>0?this._virtualization.rowHeight=o:requestAnimationFrame(()=>this.#ee()),queueMicrotask(()=>this.#fe()),this.#c.requestPhase(I.FULL,"afterConnect")}#ee(){if(this.#r.hasExtraHeight())return;const e=this._bodyEl?.querySelector(".data-grid-row");if(!e)return;const t=e.querySelectorAll(".cell");let i=0;t.forEach(s=>{const l=s.offsetHeight;l>i&&(i=l)});const o=e.getBoundingClientRect(),r=Math.max(o.height,i);r>0&&Math.abs(r-this._virtualization.rowHeight)>1&&(this._virtualization.rowHeight=r,this.#c.requestPhase(I.VIRTUALIZATION,"measureRowHeight"))}#te(e){this.#P?.abort(),this.#P=new AbortController;const t=this.#P.signal,i=e?.querySelector(".faux-vscroll"),o=e?.querySelector(".rows");if(this._virtualization.container=i??this,this.#w=this.#r?.getAll().some(r=>r.onScroll)??!1,i&&o){i.addEventListener("scroll",()=>{if(!this._virtualization.enabled&&!this.#w)return;const l=i.scrollTop,a=this._virtualization.rowHeight;if(this._rows.length<=this._virtualization.bypassThreshold)o.style.transform=`translateY(${-l}px)`;else{const d=Math.floor(l/a),c=d-d%2,u=-(l-c*a);o.style.transform=`translateY(${u}px)`}this.#a=l,this.#m||(this.#m=requestAnimationFrame(()=>{this.#m=0,this.#a!==null&&(this.#Re(this.#a),this.#a=null)}))},{passive:!0,signal:t});const r=this.#e.querySelector(".tbw-grid-content"),s=this.#e.querySelector(".tbw-scroll-area");r&&(r.addEventListener("wheel",l=>{const a=l.shiftKey||Math.abs(l.deltaX)>Math.abs(l.deltaY);if(a&&s){const d=l.shiftKey?l.deltaY:l.deltaX,{scrollLeft:c,scrollWidth:u,clientWidth:h}=s;(d>0&&c<u-h||d<0&&c>0)&&(l.preventDefault(),s.scrollLeft+=d)}else if(!a){const{scrollTop:d,scrollHeight:c,clientHeight:u}=i;(l.deltaY>0&&d<c-u||l.deltaY<0&&d>0)&&(l.preventDefault(),i.scrollTop+=l.deltaY)}},{passive:!1,signal:t}),Hn(r,this.#C,{fauxScrollbar:i,scrollArea:s},t))}this._bodyEl&&rn(this,this._bodyEl,t),this.#E?.disconnect(),this._virtualization.viewportEl&&(this.#E=new ResizeObserver(()=>{this.#c.requestPhase(I.VIRTUALIZATION,"resize-observer")}),this.#E.observe(this._virtualization.viewportEl)),this.#e.addEventListener("focusin",()=>{this.dataset.hasFocus=""},{signal:t}),this.#e.addEventListener("focusout",r=>{const s=r.relatedTarget;(!s||!this.#e.contains(s))&&delete this.dataset.hasFocus},{signal:t})}#N=!1;#he(){if(this.#N)return;const e=this._bodyEl?.querySelector(".data-grid-row");e&&(this.#N=!0,this.#R?.disconnect(),this.#R=new ResizeObserver(()=>{this.#ee()}),this.#R.observe(e))}#T(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}#fe(){this._bodyEl?.querySelectorAll(".data-grid-row")?.forEach((t,i)=>{const o=i===this._focusRow;t.setAttribute("aria-selected",String(o)),t.querySelectorAll(".cell").forEach((r,s)=>{r.setAttribute("aria-selected",String(o&&s===this._focusCol))})})}#O(e){this.#f[e]=!0,!this.#g&&(this.#g=!0,queueMicrotask(()=>this.#ge()))}#ge(){if(!this.#g||!this.#h){this.#g=!1;return}const e=this.#f;if(this.#g=!1,this.#f={rows:!1,columns:!1,gridConfig:!1,fitMode:!1},e.gridConfig){this.#be(),e.rows&&this.#ie();return}e.columns&&this.#we(),e.rows&&this.#ie(),e.fitMode&&this.#me()}#ie(){this._rows=Array.isArray(this.#l)?[...this.#l]:[],this.#B(),this.#c.requestPhase(I.ROWS,"applyRowsUpdate")}#B(){this.#D.clear();const e=this.#n.getRowId;this._rows.forEach((t,i)=>{const o=this.#ne(t,e);o!==void 0&&this.#D.set(o,{row:t,index:i})})}#ne(e,t){if(t)return t(e);const i=e;if("id"in i&&i.id!=null)return String(i.id);if("_id"in i&&i._id!=null)return String(i._id)}#pe(e,t){const i=this.#ne(e,t);if(i===void 0)throw new Error('[tbw-grid] Cannot determine row ID. Configure getRowId in gridConfig or ensure rows have an "id" property.');return i}#we(){me(this),this.#o.merge(),this.#k()}#me(){this.#o.merge(),this.#n.fitMode==="fixed"?(this.__didInitialAutoSize=!1,ht(this)):(this._columns.forEach(t=>{!t.__userResized&&t.__autoSized&&delete t.width}),le(this))}#be(){ee(this,this.#i),te(this,this.#i);const e=!!this.#e.querySelector(".has-shell"),t=!!this.#e.querySelector(".tbw-tool-panel"),i=this.#e.querySelectorAll(".tbw-accordion-section").length;this.#o.parseLightDomColumns(this),this.#o.merge(),this.#Z(),ie(this,this.#i,this.#A()),this.#o.markSourcesChanged(),this.#o.merge();const o=Nt(this.#n?.shell),r=(this.#n?.shell?.toolPanels?.length??0)>0,s=(this.#n?.shell?.toolPanels?.length??0)!==i;if(e!==o||!e&&o||!t&&r||t&&s){this.#U(),this.#M(),this.#Q(),this.#B();return}e&&this.#ve(),this.#B(),this.#c.requestPhase(I.COLUMNS,"applyGridConfigUpdate")}#ve(){const e=this.#e.querySelector(".tbw-shell-header");if(!e)return;const t=this.#n.shell?.header?.title??this.#i.lightDomTitle;let i=e.querySelector(".tbw-shell-title");t?(i||(i=document.createElement("h2"),i.className="tbw-shell-title",i.setAttribute("part","shell-title"),e.insertBefore(i,e.firstChild)),i.textContent=t):i&&i.remove()}#ye(){if(this.#r){const e=this.#F.length>0?this.#F:this._columns,t=e.filter(r=>!r.hidden),i=e.filter(r=>r.hidden),o=this.#r.processColumns([...t]);if(o!==t){new Set(t.map(l=>l.field));const r=new Set(o.map(l=>l.field));!t.some(l=>r.has(l.field))&&o.length>0?this._columns=[...o,...i]:this._columns=[...o,...i]}else this._columns=[...e]}}#Ce(){me(this);const e=Array.isArray(this.#l)?[...this.#l]:[],t=this.#r?.processRows(e)??e;this._rows=t}#xe(e){const t={...at,...e.animation},i=t.mode??"reduced-motion";let o=1;i===!1||i==="off"?o=0:(i===!0||i==="on")&&(o=1),this.style.setProperty("--tbw-animation-duration",`${t.duration}ms`),this.style.setProperty("--tbw-animation-easing",t.easing??"ease-out"),this.style.setProperty("--tbw-animation-enabled",String(o)),this.dataset.animationMode=typeof i=="boolean"?i?"on":"off":i}#K(e,t,i=this.__rowRenderEpoch){this.#y||(this.#y=(o,r,s)=>this.#r?.renderRow(o,r,s)??!1),Ji(this,e,t,i,this.#y)}#V=-1;#oe=-1;#re(e,t){if(e===this.#V&&t===this.#oe)return;const i=this.#V;this.#V=e,this.#oe=t,this.__rowsBodyEl&&(this.__rowsBodyEl.setAttribute("aria-rowcount",String(e)),this.__rowsBodyEl.setAttribute("aria-colcount",String(t))),e!==i&&this._bodyEl&&(e>0?this._bodyEl.setAttribute("role","rowgroup"):this._bodyEl.removeAttribute("role"))}#se;#le;#Ee(){if(!this.__rowsBodyEl)return;const e=this.#n.gridAriaLabel,t=this.#n.shell?.header?.title??this.#i?.lightDomTitle??void 0,i=e??t;i!==this.#se&&(this.#se=i,i?this.__rowsBodyEl.setAttribute("aria-label",i):this.__rowsBodyEl.removeAttribute("aria-label"));const o=this.#n.gridAriaDescribedBy;o!==this.#le&&(this.#le=o,o?this.__rowsBodyEl.setAttribute("aria-describedby",o):this.__rowsBodyEl.removeAttribute("aria-describedby"))}#k(){if(this.isConnected&&!(!this._headerRowEl||!this._bodyEl)){if(this.#o.parseLightDomColumns(this),this.#L){const e=this.#L;this.#L=void 0,this.#o.merge();const t=this.#r?.getAll()??[];this.#o.applyState(e,t)}this._bodyEl&&(this._bodyEl.style.display="",this._bodyEl.style.gridTemplateColumns=""),this.#c.requestPhase(I.FULL,"setup")}}#Re(e){if(this.refreshVirtualWindow(!1),this.#r?.onScrollRender(),this.#w){const t=this._virtualization.container,i=this.#z;i.scrollTop=e,i.scrollLeft=t?.scrollLeft??0,i.scrollHeight=t?.scrollHeight??0,i.scrollWidth=t?.scrollWidth??0,i.clientHeight=t?.clientHeight??0,i.clientWidth=t?.clientWidth??0,this.#r?.onScroll(i)}}findHeaderRow(){return this.#e.querySelector(".header-row")}findRenderedRowElement(e){return Array.from(this._bodyEl.querySelectorAll(".data-grid-row")).find(t=>{const i=t.querySelector(".cell[data-row]");return i&&Number(i.getAttribute("data-row"))===e})||null}_dispatchCellClick(e,t,i,o){const r=this._rows[t],s=this._columns[i];if(!r||!s)return!1;const l=s.field,a=r[l],d=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,composed:!0,detail:{rowIndex:t,colIndex:i,field:l,value:a,row:r,cellEl:o,trigger:"pointer",originalEvent:e}});if(this.dispatchEvent(d),d.defaultPrevented)return!0;const c={row:r,rowIndex:t,colIndex:i,field:l,value:a,cellEl:o,originalEvent:e},u=this.#r?.onCellClick(c)??!1;return this.#T("cell-click",c),u}_dispatchRowClick(e,t,i,o){if(!i)return!1;const r={rowIndex:t,row:i,rowEl:o,originalEvent:e},s=this.#r?.onRowClick(r)??!1;return this.#T("row-click",r),s}_dispatchHeaderClick(e,t,i){const o=this._columns[t];if(!o)return!1;const r={colIndex:t,field:o.field,column:o,headerEl:i,originalEvent:e};return this.#r?.onHeaderClick(r)??!1}_dispatchKeyDown(e){return this.#r?.onKeyDown(e)??!1}_getHorizontalScrollOffsets(e,t){return this.#r?.getHorizontalScrollOffsets(e,t)??{left:0,right:0}}queryPlugins(e){return this.#r?.queryPlugins(e)??[]}_dispatchCellMouseDown(e){return this.#r?.onCellMouseDown(e)??!1}_dispatchCellMouseMove(e){this.#r?.onCellMouseMove(e)}_dispatchCellMouseUp(e){this.#r?.onCellMouseUp(e)}_afterCellRender(e){this.#r?.afterCellRender(e)}_hasAfterCellRenderHook(){return this.#r?.hasAfterCellRenderHook()??!1}_afterRowRender(e){this.#r?.afterRowRender(e)}_hasAfterRowRenderHook(){return this.#r?.hasAfterRowRenderHook()??!1}async ready(){return this.#d}async forceLayout(){return this.#c.requestPhase(I.FULL,"forceLayout"),this.#c.whenReady()}async getConfig(){return Object.freeze({...this.#n||{}})}getRowId(e){return this.#pe(e,this.#n.getRowId)}getRow(e){return this.#D.get(e)?.row}updateRow(e,t,i="api"){const o=this.#D.get(e);if(!o)throw new Error(`[tbw-grid] Row with ID "${e}" not found. Ensure the row exists and getRowId is correctly configured.`);const{row:r,index:s}=o,l=[];for(const[a,d]of Object.entries(t)){const c=r[a];c!==d&&(l.push({field:a,oldValue:c,newValue:d}),r[a]=d)}for(const{field:a,oldValue:d,newValue:c}of l)this.#T("cell-change",{row:r,rowId:e,rowIndex:s,field:a,oldValue:d,newValue:c,changes:t,source:i});l.length>0&&this.#c.requestPhase(I.ROWS,"updateRow")}updateRows(e,t="api"){let i=!1;for(const{id:o,changes:r}of e){const s=this.#D.get(o);if(!s)throw new Error(`[tbw-grid] Row with ID "${o}" not found. Ensure the row exists and getRowId is correctly configured.`);const{row:l,index:a}=s;for(const[d,c]of Object.entries(r)){const u=l[d];u!==c&&(i=!0,l[d]=c,this.#T("cell-change",{row:l,rowId:o,rowIndex:a,field:d,oldValue:u,newValue:c,changes:r,source:t}))}}i&&this.#c.requestPhase(I.ROWS,"updateRows")}animateRow(e,t){Ne(this,e,t)}animateRows(e,t){pn(this,e,t)}animateRowById(e,t){return wn(this,e,t)}setColumnVisible(e,t){const i=this.#o.setColumnVisible(e,t);return i&&this.requestStateChange(),i}toggleColumnVisibility(e){const t=this.#o.toggleColumnVisibility(e);return t&&this.requestStateChange(),t}isColumnVisible(e){return this.#o.isColumnVisible(e)}showAllColumns(){this.#o.showAllColumns(),this.requestStateChange()}getAllColumns(){return this.#o.getAllColumns()}setColumnOrder(e){this.#o.setColumnOrder(e),this.requestStateChange()}getColumnOrder(){return this.#o.getColumnOrder()}getColumnState(){const e=this.#r?.getAll()??[];return this.#o.collectState(e)}set columnState(e){e&&(this.#L=e,this.#o.initialColumnState=e,this.#u&&this.#Se(e))}get columnState(){return this.getColumnState()}#Se(e){const t=this.#r?.getAll()??[];this.#o.applyState(e,t),this.#k()}requestStateChange(){const e=this.#r?.getAll()??[];this.#o.requestStateChange(e)}resetColumnState(){this.#L=void 0,this.__originalOrder=[];const e=this.#r?.getAll()??[];this.#o.resetState(e),this.#o.merge(),this.#k()}get isToolPanelOpen(){return this.#p.isPanelOpen}get expandedToolPanelSections(){return this.#p.expandedSections}openToolPanel(){this.#p.openToolPanel()}closeToolPanel(){this.#p.closeToolPanel()}toggleToolPanel(){this.#p.toggleToolPanel()}toggleToolPanelSection(e){this.#p.toggleToolPanelSection(e)}getToolPanels(){return this.#p.getToolPanels()}registerToolPanel(e){this.#i.apiToolPanelIds.add(e.id),this.#p.registerToolPanel(e)}unregisterToolPanel(e){this.#i.apiToolPanelIds.delete(e),this.#p.unregisterToolPanel(e)}getHeaderContents(){return this.#p.getHeaderContents()}registerHeaderContent(e){this.#p.registerHeaderContent(e)}unregisterHeaderContent(e){this.#p.unregisterHeaderContent(e)}getToolbarContents(){return this.#p.getToolbarContents()}registerToolbarContent(e){this.#p.registerToolbarContent(e)}unregisterToolbarContent(e){this.#p.unregisterToolbarContent(e)}#$=!1;refreshShellHeader(){this.#$||(this.#$=!0,queueMicrotask(()=>{this.#$=!1,this.isConnected&&(ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#A()),this.#o.markSourcesChanged(),this.#o.merge(),this.#U(),this.#M(),this.#_e())}))}#_e(){const t=this.#e.querySelector(".tbw-grid-content")??this.#e.querySelector(".tbw-grid-root");if(this._headerRowEl=t?.querySelector(".header-row"),this._virtualization.totalHeightEl=t?.querySelector(".faux-vscroll-spacer"),this._virtualization.viewportEl=t?.querySelector(".rows-viewport"),this._bodyEl=t?.querySelector(".rows"),this.__rowsBodyEl=t?.querySelector(".rows-body"),this.#p.isInitialized){Oe(this.#e,this.#i),zt(this.#e,this.#n?.shell,this.#i);const i=this.#n?.shell?.toolPanel?.defaultOpen;i&&this.#i.toolPanels.has(i)&&(this.openToolPanel(),this.#i.expandedSections.add(i))}this._resizeController=Pt(this),this.#te(t),this.#c.requestPhase(I.COLUMNS,"shellRefresh")}#S=new Map;registerStyles(e,t){let i=this.#S.get(e);i||(i=new CSSStyleSheet,this.#S.set(e,i)),i.replaceSync(t),this.#ae()}unregisterStyles(e){this.#S.delete(e)&&this.#ae()}getRegisteredStyles(){return Array.from(this.#S.keys())}#ae(){const e=Array.from(this.#S.values()),t=document.adoptedStyleSheets.filter(i=>!Array.from(this.#S.values()).includes(i));document.adoptedStyleSheets=[...t,...e]}#Ae(){const e=()=>{const i=this.#i.lightDomTitle,o=this.#i.hasToolButtonsContainer;ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#A());const r=this.#i.lightDomTitle,s=this.#i.hasToolButtonsContainer;if(r&&!i||s&&!o){this.#o.markSourcesChanged(),this.#o.merge();const l=this.#e.querySelector(".tbw-shell-header");if(l){const a=Ot(this.#n.shell,this.#i,this.#n.icons?.toolPanel),d=document.createElement("div");d.innerHTML=a;const c=d.firstElementChild;c&&(l.replaceWith(c),this.#j())}}},t=()=>{this.__lightDomColumnsCache=void 0,this.#k()};this.#o.registerLightDomHandler("tbw-grid-header",e),this.#o.registerLightDomHandler("tbw-grid-tool-buttons",e),this.#o.registerLightDomHandler("tbw-grid-tool-panel",e),this.#o.registerLightDomHandler("tbw-grid-column",t),this.#o.registerLightDomHandler("tbw-grid-detail",t),this.#o.observeLightDOM(this)}refreshColumns(){this.__lightDomColumnsCache=void 0,me(this),this.#o.parseLightDomColumns(this);const e=this.#i.lightDomTitle,t=this.#i.hasToolButtonsContainer;ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#A());const i=this.#i.lightDomTitle,o=this.#i.hasToolButtonsContainer;if(i&&!e||o&&!t){this.#o.markSourcesChanged(),this.#o.merge();const s=this.#e.querySelector(".tbw-shell-header");if(s){const l=Ot(this.#n.shell,this.#i,this.#n.icons?.toolPanel),a=document.createElement("div");a.innerHTML=l;const d=a.firstElementChild;d&&(s.replaceWith(d),this.#j())}}this.#c.requestPhase(I.COLUMNS,"refreshColumns")}#W(e){const t=this._virtualization.rowHeight,i=this._virtualization.container??this,o=this._virtualization.viewportEl??i,r=i.clientHeight,s=o.clientHeight,a=this.shadowRoot?.querySelector(".tbw-scroll-area"),d=a?a.clientHeight:r,u=d-s,h=this.#r?.getExtraHeight()??0,f=Math.max(0,r-d);return e*t+u+h+f}refreshVirtualWindow(e=!1,t=!1){if(!this._bodyEl)return;const i=this._rows.length;if(!this._virtualization.enabled){this.#K(0,i),t||this.#r?.afterRender();return}if(this._rows.length<=this._virtualization.bypassThreshold){this._virtualization.start=0,this._virtualization.end=i,e&&(this._bodyEl.style.transform="translateY(0px)"),this.#K(0,i,e?++this.__rowRenderEpoch:this.__rowRenderEpoch),this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${this.#W(i)}px`),this.#re(i,this._visibleColumns.length),t||this.#r?.afterRender();return}const o=this._virtualization.container??this,r=this._virtualization.viewportEl??o,s=r.clientHeight,l=this._virtualization.rowHeight,a=o.scrollTop;let d=Math.floor(a/l),c=0;const u=10;for(;c<u;){const C=this.#r?.getExtraHeightBefore?.(d)??0,T=Math.floor((a-C)/l);if(T>=d||T<0)break;d=T,c++}d=d-d%2,d<0&&(d=0);const h=this.#r?.adjustVirtualStart(d,a,l);h!==void 0&&h<d&&(d=h,d=d-d%2,d<0&&(d=0));const f=Math.ceil(s/l)+3;let p=d+f;if(p>i&&(p=i),this._virtualization.start=d,this._virtualization.end=p,o.clientHeight===0&&s>0){this.#c.requestPhase(I.VIRTUALIZATION,"stale-refs-retry");return}const w=this.#W(i);this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${w}px`);const m=this.#r?.getExtraHeightBefore?.(d)??0,y=-(a-d*l-m);this._bodyEl.style.transform=`translateY(${y}px)`,this.#K(d,p,e?++this.__rowRenderEpoch:this.__rowRenderEpoch),this.#re(i,this._visibleColumns.length),e&&!t&&(this.#r?.afterRender(),queueMicrotask(()=>{const C=o.clientHeight,T=r.clientHeight;if(C===0&&T>0)return;const _=this.#W(i);this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${_}px`)}))}#U(){ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#A()),this.#o.markSourcesChanged(),this.#o.merge();const e=this.#n?.shell;_n(this.#e,e,{isPanelOpen:this.#i.isPanelOpen,expandedSections:this.#i.expandedSections},this.#n?.icons)&&(this.#j(),this.#p.setInitialized(!0))}#j(){yn(this.#e,this.#n?.shell,this.#i,{onPanelToggle:()=>this.toggleToolPanel(),onSectionToggle:e=>this.toggleToolPanelSection(e)}),this.#H?.(),this.#H=Cn(this.#e,this.#n?.shell,e=>{this.style.setProperty("--tbw-tool-panel-width",`${e}px`)})}}customElements.get(M.tagName)||customElements.define(M.tagName,M),globalThis.DataGridElement=M;const qe={CAN_MOVE_COLUMN:"canMoveColumn",GET_CONTEXT_MENU_ITEMS:"getContextMenuItems"};class H{static dependencies;static manifest;version=typeof __GRID_VERSION__<"u"?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#t;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}attach(e){this.#t?.abort(),this.#t=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#t?.abort(),this.#t=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const i=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(i),i.defaultPrevented}requestRender(){this.grid?.requestRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid}get disconnectSignal(){return this.#t?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...G,...e}}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(e===!1||e==="off")return!1;if(e===!0||e==="on")return!0;const t=this.gridElement;return t?getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()!=="0":!0}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),i=parseInt(t,10);if(!isNaN(i))return i}return 200}resolveIcon(e,t){return t!==void 0?t:this.gridIcons[e]}setIcon(e,t){typeof t=="string"?e.innerHTML=t:t instanceof HTMLElement&&(e.innerHTML="",e.appendChild(t.cloneNode(!0)))}warn(e){console.warn(`[tbw-grid:${this.name}] ${e}`)}}const N={ROOT:"tbw-grid-root",HEADER:"header",HEADER_ROW:"header-row",HEADER_CELL:"header-cell",ROWS_VIEWPORT:"rows-viewport",ROWS_SPACER:"rows-spacer",ROWS_CONTAINER:"rows",DATA_ROW:"data-row",GROUP_ROW:"group-row",DATA_CELL:"data-cell",SELECTED:"selected",FOCUSED:"focused",EDITING:"editing",EXPANDED:"expanded",COLLAPSED:"collapsed",DRAGGING:"dragging",RESIZING:"resizing",SORTABLE:"sortable",SORTED_ASC:"sorted-asc",SORTED_DESC:"sorted-desc",HIDDEN:"hidden",STICKY_LEFT:"sticky-left",STICKY_RIGHT:"sticky-right",PINNED_TOP:"pinned-top",PINNED_BOTTOM:"pinned-bottom",TREE_TOGGLE:"tree-toggle",TREE_INDENT:"tree-indent",GROUP_TOGGLE:"group-toggle",GROUP_LABEL:"group-label",GROUP_COUNT:"group-count",RANGE_SELECTION:"range-selection",SELECTION_OVERLAY:"selection-overlay"},ue={ROW_INDEX:"data-row-index",COL_INDEX:"data-col-index",FIELD:"data-field",GROUP_KEY:"data-group-key",TREE_LEVEL:"data-tree-level",STICKY:"data-sticky"},Gn={ROOT:`.${N.ROOT}`,HEADER:`.${N.HEADER}`,HEADER_ROW:`.${N.HEADER_ROW}`,HEADER_CELL:`.${N.HEADER_CELL}`,ROWS_VIEWPORT:`.${N.ROWS_VIEWPORT}`,ROWS_CONTAINER:`.${N.ROWS_CONTAINER}`,DATA_ROW:`.${N.DATA_ROW}`,DATA_CELL:`.${N.DATA_CELL}`,GROUP_ROW:`.${N.GROUP_ROW}`,ROW_BY_INDEX:n=>`.${N.DATA_ROW}[${ue.ROW_INDEX}="${n}"]`,CELL_BY_FIELD:n=>`.${N.DATA_CELL}[${ue.FIELD}="${n}"]`,CELL_AT:(n,e)=>`.${N.DATA_ROW}[${ue.ROW_INDEX}="${n}"] .${N.DATA_CELL}[${ue.COL_INDEX}="${e}"]`,SELECTED_ROWS:`.${N.DATA_ROW}.${N.SELECTED}`,EDITING_CELL:`.${N.DATA_CELL}.${N.EDITING}`},Bn={COLOR_BG:"--tbw-color-bg",COLOR_FG:"--tbw-color-fg",COLOR_FG_MUTED:"--tbw-color-fg-muted",COLOR_BORDER:"--tbw-color-border",COLOR_ACCENT:"--tbw-color-accent",COLOR_HEADER_BG:"--tbw-color-header-bg",COLOR_HEADER_FG:"--tbw-color-header-fg",COLOR_SELECTION:"--tbw-color-selection",COLOR_ROW_HOVER:"--tbw-color-row-hover",COLOR_ROW_ALT:"--tbw-color-row-alt",ROW_HEIGHT:"--tbw-row-height",HEADER_HEIGHT:"--tbw-header-height",CELL_PADDING:"--tbw-cell-padding",FONT_FAMILY:"--tbw-font-family",FONT_SIZE:"--tbw-font-size",BORDER_RADIUS:"--tbw-border-radius",FOCUS_OUTLINE:"--tbw-focus-outline"};function Kn(n){const e=document.createElement("tbw-grid");return n&&(e.gridConfig=n),e}function Vn(n,e=document){return e.querySelector(n)}const $n={CELL_CHANGE:"cell-change",CELL_COMMIT:"cell-commit",ROW_COMMIT:"row-commit",CHANGED_ROWS_RESET:"changed-rows-reset",MOUNT_EXTERNAL_VIEW:"mount-external-view",MOUNT_EXTERNAL_EDITOR:"mount-external-editor",SORT_CHANGE:"sort-change",COLUMN_RESIZE:"column-resize",ACTIVATE_CELL:"activate-cell",CELL_ACTIVATE:"cell-activate",GROUP_TOGGLE:"group-toggle",COLUMN_STATE_CHANGE:"column-state-change"},Wn={SELECTION_CHANGE:"selection-change",TREE_EXPAND:"tree-expand",FILTER_CHANGE:"filter-change",SORT_MODEL_CHANGE:"sort-model-change",EXPORT_START:"export-start",EXPORT_COMPLETE:"export-complete",CLIPBOARD_COPY:"clipboard-copy",CLIPBOARD_PASTE:"clipboard-paste",CONTEXT_MENU_OPEN:"context-menu-open",CONTEXT_MENU_CLOSE:"context-menu-close",HISTORY_CHANGE:"history-change",SERVER_LOADING:"server-loading",SERVER_ERROR:"server-error",COLUMN_VISIBILITY_CHANGE:"column-visibility-change",COLUMN_REORDER:"column-reorder",DETAIL_EXPAND:"detail-expand",GROUP_EXPAND:"group-expand"},$t="__tbw_expander",Un=32;function Ge(n){return n.field===$t}function $(n){return n.meta?.utility===!0}function jn(n){return n.find(Ge)}function Yn(n){return{field:$t,header:"",width:Un,resizable:!1,sortable:!1,filterable:!1,meta:{lockPosition:!0,suppressMovable:!0,expanderColumn:!0,expanderPlugin:n,utility:!0}}}async function Be(n){try{return await navigator.clipboard.writeText(n),!0}catch{const e=document.createElement("textarea");e.value=n,e.style.position="fixed",e.style.opacity="0",e.style.pointerEvents="none",document.body.appendChild(e),e.select();const t=document.execCommand("copy");return document.body.removeChild(e),t}}function Wt(n,e){const t=e.delimiter??" ",i=e.newline??`
59
+ ${t}`}async#we(){if(!M.#O){if(J.length>0){M.#O=J,M.#V();return}await new Promise(e=>setTimeout(e,50));try{let e="";for(const t of Array.from(document.styleSheets))try{const o=Array.from(t.cssRules||[]).map(r=>r.cssText).join(`
60
+ `);if(o.includes(".tbw-grid-root")&&o.includes("tbw-grid")){e=o;break}}catch{continue}e?(M.#O=e,M.#V()):(typeof process>"u"||process.env?.NODE_ENV!=="test")&&console.warn("[tbw-grid] Could not find grid.css in document.styleSheets. Grid styling will not work.","Available stylesheets:",Array.from(document.styleSheets).map(t=>t.href||"(inline)"))}catch(e){console.warn("[tbw-grid] Failed to extract grid.css from document stylesheets:",e)}}}getPlugin(e){return this.#r?.getPlugin(e)}getPluginByName(e){return this.#r?.getPluginByName(e)}requestRender(){this.#c.requestPhase(I.ROWS,"plugin:requestRender")}requestRenderWithFocus(){this._restoreFocusAfterRender=!0,this.#c.requestPhase(I.ROWS,"plugin:requestRenderWithFocus")}updateTemplate(){le(this)}requestAfterRender(){this.#c.requestPhase(I.STYLE,"plugin:requestAfterRender")}#ee(){this.#r=new Kt(this);const e=this.#n?.plugins,t=Array.isArray(e)?e:[];this.#r.attachAll(t)}#F(){const e=this.#r?.getPluginStyles()??[];let t=!1;for(const{name:i,styles:o}of e)M.#K.has(i)||(M.#K.set(i,o),t=!0);t&&M.#V()}#te(){const e=this.#n?.plugins,t=Array.isArray(e)?e:[];if(this.#x!==t){if(this.#x&&this.#x.length===t.length&&this.#x.every((i,o)=>i===t[o])){this.#x=t;return}this.#r&&this.#r.detachAll();for(const i of this.#i.toolPanels.keys()){const o=this.#i.lightDomToolPanelIds.has(i),r=this.#i.apiToolPanelIds.has(i);if(!o&&!r){const s=this.#i.panelCleanups.get(i);s&&(s(),this.#i.panelCleanups.delete(i)),this.#i.toolPanels.delete(i)}}for(const i of this.#i.headerContents.keys()){const o=this.#i.headerContentCleanups.get(i);o&&(o(),this.#i.headerContentCleanups.delete(i)),this.#i.headerContents.delete(i)}this.#ee(),this.#F(),this.#x=t,this.#ie(),this.#w=this.#r?.getAll().some(i=>i.onScroll)??!1}}#me(){this.#r?.detachAll()}#ie(){if(!this.#r)return;const e=this.#r.getToolPanels();for(const{panel:i}of e)this.#i.toolPanels.has(i.id)||this.#i.toolPanels.set(i.id,i);const t=this.#r.getHeaderContents();for(const{content:i}of t)this.#i.headerContents.has(i.id)||this.#i.headerContents.set(i.id,i)}#L(){const e=M.getAdapters();if(e.length===0&&!this.__frameworkAdapter)return;const t=this.__frameworkAdapter;return i=>{if(t?.createToolPanelRenderer){const o=t.createToolPanelRenderer(i);if(o)return o}for(const o of e)if(o.createToolPanelRenderer){const r=o.createToolPanelRenderer(i);if(r)return r}}}connectedCallback(){this.hasAttribute("tabindex")||(this.tabIndex=0),this.hasAttribute("version")||this.setAttribute("version",M.version),this.id||(this.id=`tbw-grid-${++M.#t}`),this._rows=Array.isArray(this.#l)?[...this.#l]:[],this.#b&&(this.#b.abort(),this.#A=!1),this.#b=new AbortController,this.#v&&(kt(this.#v),this.#v=void 0),ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#L()),this.#o.parseLightDomColumns(this),this.#o.merge(),this.#ee();const e=this.#n?.plugins;this.#x=Array.isArray(e)?e:[],this.#ie(),this.#u||(this.#Z(),this.#F(),this.#u=!0),this.#ne(),this.#v=dn(()=>{this.#Ne()},{timeout:100})}disconnectedCallback(){this.#v&&(kt(this.#v),this.#v=void 0),this.#me(),En(this.#i),this.#p.setInitialized(!1),this.#M?.(),this.#M=void 0,Gt(this.#C),this.#b&&(this.#b.abort(),this.#b=void 0),this.#H?.abort(),this.#H=void 0,this.#A=!1,this._resizeController&&this._resizeController.dispose(),this.#E&&(this.#E.disconnect(),this.#E=void 0),this.#R&&(this.#R.disconnect(),this.#R=void 0,this.#q=!1),me(this),this.#_.clear(),this.#x=void 0;for(const e of this._rowPool)e.remove();this._rowPool.length=0,this.__rowsBodyEl=null,this.#h=!1}attributeChangedCallback(e,t,i){if(e==="loading"){const o=i!==null&&i!=="false";this.loading!==o&&(this.loading=o);return}if(!(t===i||!i||i==="null"||i==="undefined"))if(e==="rows"||e==="columns"||e==="grid-config")try{const o=JSON.parse(i);e==="rows"?this.rows=o:e==="columns"?this.columns=o:e==="grid-config"&&(this.gridConfig=o)}catch{console.warn(`[tbw-grid] Invalid JSON for '${e}' attribute:`,i)}else e==="fit-mode"&&(this.fitMode=i)}#ne(){const t=this.#e.querySelector(".tbw-grid-content")??this.#e.querySelector(".tbw-grid-root");if(this._headerRowEl=t?.querySelector(".header-row"),this._virtualization.totalHeightEl=t?.querySelector(".faux-vscroll-spacer"),this._virtualization.viewportEl=t?.querySelector(".rows-viewport"),this._bodyEl=t?.querySelector(".rows"),this.__rowsBodyEl=t?.querySelector(".rows-body"),this.#p.isInitialized){ze(this.#e,this.#i),Ot(this.#e,this.#n?.shell,this.#i);const r=this.#n?.shell?.toolPanel?.defaultOpen;r&&this.#i.toolPanels.has(r)&&(this.openToolPanel(),this.#i.expandedSections.add(r))}if(this.setAttribute("data-upgraded",""),this.#h=!0,this._resizeController=Lt(this),this.#D(),this.#re(t),this.#A)return;this.#A=!0;const i=this.disconnectSignal;sn(this,this,this.#e,i);const o=this.#n.rowHeight;o&&o>0?this._virtualization.rowHeight=o:requestAnimationFrame(()=>this.#oe()),queueMicrotask(()=>this.#ve()),this.#c.requestPhase(I.FULL,"afterConnect")}#oe(){if(this.#r.hasExtraHeight())return;const e=this._bodyEl?.querySelector(".data-grid-row");if(!e)return;const t=e.querySelectorAll(".cell");let i=0;t.forEach(s=>{const l=s.offsetHeight;l>i&&(i=l)});const o=e.getBoundingClientRect(),r=Math.max(o.height,i);r>0&&Math.abs(r-this._virtualization.rowHeight)>1&&(this._virtualization.rowHeight=r,this.#c.requestPhase(I.VIRTUALIZATION,"measureRowHeight"))}#re(e){this.#H?.abort(),this.#H=new AbortController;const t=this.#H.signal,i=e?.querySelector(".faux-vscroll"),o=e?.querySelector(".rows");if(this._virtualization.container=i??this,this.#w=this.#r?.getAll().some(r=>r.onScroll)??!1,i&&o){i.addEventListener("scroll",()=>{if(!this._virtualization.enabled&&!this.#w)return;const l=i.scrollTop,a=this._virtualization.rowHeight;if(this._rows.length<=this._virtualization.bypassThreshold)o.style.transform=`translateY(${-l}px)`;else{const d=Math.floor(l/a),c=d-d%2,u=-(l-c*a);o.style.transform=`translateY(${u}px)`}this.#a=l,this.#m||(this.#m=requestAnimationFrame(()=>{this.#m=0,this.#a!==null&&(this.#He(this.#a),this.#a=null)}))},{passive:!0,signal:t});const r=this.#e.querySelector(".tbw-grid-content"),s=this.#e.querySelector(".tbw-scroll-area");r&&(r.addEventListener("wheel",l=>{const a=l.shiftKey||Math.abs(l.deltaX)>Math.abs(l.deltaY);if(a&&s){const d=l.shiftKey?l.deltaY:l.deltaX,{scrollLeft:c,scrollWidth:u,clientWidth:h}=s;(d>0&&c<u-h||d<0&&c>0)&&(l.preventDefault(),s.scrollLeft+=d)}else if(!a){const{scrollTop:d,scrollHeight:c,clientHeight:u}=i;(l.deltaY>0&&d<c-u||l.deltaY<0&&d>0)&&(l.preventDefault(),i.scrollTop+=l.deltaY)}},{passive:!1,signal:t}),Hn(r,this.#C,{fauxScrollbar:i,scrollArea:s},t))}this._bodyEl&&rn(this,this._bodyEl,t),this.#E?.disconnect(),this._virtualization.viewportEl&&(this.#E=new ResizeObserver(()=>{this.#c.requestPhase(I.VIRTUALIZATION,"resize-observer")}),this.#E.observe(this._virtualization.viewportEl)),this.#e.addEventListener("focusin",()=>{this.dataset.hasFocus=""},{signal:t}),this.#e.addEventListener("focusout",r=>{const s=r.relatedTarget;(!s||!this.#e.contains(s))&&delete this.dataset.hasFocus},{signal:t})}#q=!1;#be(){if(this.#q)return;const e=this._bodyEl?.querySelector(".data-grid-row");e&&(this.#q=!0,this.#R?.disconnect(),this.#R=new ResizeObserver(()=>{this.#oe()}),this.#R.observe(e))}#P(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}#ve(){this._bodyEl?.querySelectorAll(".data-grid-row")?.forEach((t,i)=>{const o=i===this._focusRow;t.setAttribute("aria-selected",String(o)),t.querySelectorAll(".cell").forEach((r,s)=>{r.setAttribute("aria-selected",String(o&&s===this._focusCol))})})}#G(e){this.#f[e]=!0,!this.#g&&(this.#g=!0,queueMicrotask(()=>this.#ye()))}#ye(){if(!this.#g||!this.#h){this.#g=!1;return}const e=this.#f;if(this.#g=!1,this.#f={rows:!1,columns:!1,gridConfig:!1,fitMode:!1},e.gridConfig){this.#Re(),e.rows&&this.#se();return}e.columns&&this.#xe(),e.rows&&this.#se(),e.fitMode&&this.#Ee()}#se(){this._rows=Array.isArray(this.#l)?[...this.#l]:[],this.#W(),this.#c.requestPhase(I.ROWS,"applyRowsUpdate")}#W(){this.#S.clear();const e=this.#n.getRowId;this._rows.forEach((t,i)=>{const o=this.#le(t,e);o!==void 0&&this.#S.set(o,{row:t,index:i})})}#le(e,t){if(t)return t(e);const i=e;if("id"in i&&i.id!=null)return String(i.id);if("_id"in i&&i._id!=null)return String(i._id)}#Ce(e,t){const i=this.#le(e,t);if(i===void 0)throw new Error('[tbw-grid] Cannot determine row ID. Configure getRowId in gridConfig or ensure rows have an "id" property.');return i}#xe(){me(this),this.#o.merge(),this.#D()}#Ee(){this.#o.merge(),this.#n.fitMode==="fixed"?(this.__didInitialAutoSize=!1,ht(this)):(this._columns.forEach(t=>{!t.__userResized&&t.__autoSized&&delete t.width}),le(this))}#Re(){ee(this,this.#i),te(this,this.#i);const e=!!this.#e.querySelector(".has-shell"),t=!!this.#e.querySelector(".tbw-tool-panel"),i=this.#e.querySelectorAll(".tbw-accordion-section").length;this.#o.parseLightDomColumns(this),this.#o.merge(),this.#te(),ie(this,this.#i,this.#L()),this.#o.markSourcesChanged(),this.#o.merge();const o=Nt(this.#n?.shell),r=(this.#n?.shell?.toolPanels?.length??0)>0,s=(this.#n?.shell?.toolPanels?.length??0)!==i;if(e!==o||!e&&o||!t&&r||t&&s){this.#Z(),this.#F(),this.#ne(),this.#W();return}e&&this.#Se(),this.#W(),this.#c.requestPhase(I.COLUMNS,"applyGridConfigUpdate")}#Se(){const e=this.#e.querySelector(".tbw-shell-header");if(!e)return;const t=this.#n.shell?.header?.title??this.#i.lightDomTitle;let i=e.querySelector(".tbw-shell-title");t?(i||(i=document.createElement("h2"),i.className="tbw-shell-title",i.setAttribute("part","shell-title"),e.insertBefore(i,e.firstChild)),i.textContent=t):i&&i.remove()}#_e(){if(this.#r){const e=this.#$.length>0?this.#$:this._columns,t=e.filter(r=>!r.hidden),i=e.filter(r=>r.hidden),o=this.#r.processColumns([...t]);if(o!==t){new Set(t.map(l=>l.field));const r=new Set(o.map(l=>l.field));!t.some(l=>r.has(l.field))&&o.length>0?this._columns=[...o,...i]:this._columns=[...o,...i]}else this._columns=[...e]}}#Ae(){me(this);const e=Array.isArray(this.#l)?[...this.#l]:[],t=this.#r?.processRows(e)??e;this._rows=t}#Te(e){const t={...at,...e.animation},i=t.mode??"reduced-motion";let o=1;i===!1||i==="off"?o=0:(i===!0||i==="on")&&(o=1),this.style.setProperty("--tbw-animation-duration",`${t.duration}ms`),this.style.setProperty("--tbw-animation-easing",t.easing??"ease-out"),this.style.setProperty("--tbw-animation-enabled",String(o)),this.dataset.animationMode=typeof i=="boolean"?i?"on":"off":i}#U(e,t,i=this.__rowRenderEpoch){this.#y||(this.#y=(o,r,s)=>this.#r?.renderRow(o,r,s)??!1),Ji(this,e,t,i,this.#y)}#j=-1;#ae=-1;#de(e,t){if(e===this.#j&&t===this.#ae)return;const i=this.#j;this.#j=e,this.#ae=t,this.__rowsBodyEl&&(this.__rowsBodyEl.setAttribute("aria-rowcount",String(e)),this.__rowsBodyEl.setAttribute("aria-colcount",String(t))),e!==i&&this._bodyEl&&(e>0?this._bodyEl.setAttribute("role","rowgroup"):this._bodyEl.removeAttribute("role"))}#ce;#ue;#ke(){if(!this.__rowsBodyEl)return;const e=this.#n.gridAriaLabel,t=this.#n.shell?.header?.title??this.#i?.lightDomTitle??void 0,i=e??t;i!==this.#ce&&(this.#ce=i,i?this.__rowsBodyEl.setAttribute("aria-label",i):this.__rowsBodyEl.removeAttribute("aria-label"));const o=this.#n.gridAriaDescribedBy;o!==this.#ue&&(this.#ue=o,o?this.__rowsBodyEl.setAttribute("aria-describedby",o):this.__rowsBodyEl.removeAttribute("aria-describedby"))}#Le(e){const t=document.createElement("div");return t.className=`tbw-spinner tbw-spinner--${e}`,t.setAttribute("role","progressbar"),t.setAttribute("aria-label","Loading"),t}#Pe(e){const t=this.#n?.loadingRenderer;if(t){const i=t({size:e});if(typeof i=="string"){const o=document.createElement("div");return o.innerHTML=i,o}return i}return this.#Le(e)}#De(){const e=this.querySelector(".tbw-grid-root");if(e)if(this.#N){if(!this.#z){const t=document.createElement("div");t.className="tbw-loading-overlay",t.setAttribute("role","status"),t.setAttribute("aria-live","polite"),t.appendChild(this.#Pe("large")),this.#z=t}e.appendChild(this.#z)}else this.#z?.remove()}#he(e,t){const i=this.#S.get(e);if(!i)return;const o=this.findRenderedRowElement?.(i.index);o&&(t?(o.classList.add("tbw-row-loading"),o.setAttribute("aria-busy","true")):(o.classList.remove("tbw-row-loading"),o.removeAttribute("aria-busy")))}#fe(e,t,i){const o=this.#S.get(e);if(!o)return;const r=this.findRenderedRowElement?.(o.index);if(!r)return;const s=this._visibleColumns.findIndex(a=>a.field===t);if(s<0)return;const l=r.children[s];l&&(i?(l.classList.add("tbw-cell-loading"),l.setAttribute("aria-busy","true")):(l.classList.remove("tbw-cell-loading"),l.removeAttribute("aria-busy")))}#D(){if(this.isConnected&&!(!this._headerRowEl||!this._bodyEl)){if(this.#o.parseLightDomColumns(this),this.#I){const e=this.#I;this.#I=void 0,this.#o.merge();const t=this.#r?.getAll()??[];this.#o.applyState(e,t)}this._bodyEl&&(this._bodyEl.style.display="",this._bodyEl.style.gridTemplateColumns=""),this.#c.requestPhase(I.FULL,"setup")}}#He(e){if(this.refreshVirtualWindow(!1),this.#r?.onScrollRender(),this.#w){const t=this._virtualization.container,i=this.#B;i.scrollTop=e,i.scrollLeft=t?.scrollLeft??0,i.scrollHeight=t?.scrollHeight??0,i.scrollWidth=t?.scrollWidth??0,i.clientHeight=t?.clientHeight??0,i.clientWidth=t?.clientWidth??0,this.#r?.onScroll(i)}}findHeaderRow(){return this.#e.querySelector(".header-row")}findRenderedRowElement(e){return Array.from(this._bodyEl.querySelectorAll(".data-grid-row")).find(t=>{const i=t.querySelector(".cell[data-row]");return i&&Number(i.getAttribute("data-row"))===e})||null}_dispatchCellClick(e,t,i,o){const r=this._rows[t],s=this._columns[i];if(!r||!s)return!1;const l=s.field,a=r[l],d=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,composed:!0,detail:{rowIndex:t,colIndex:i,field:l,value:a,row:r,cellEl:o,trigger:"pointer",originalEvent:e}});if(this.dispatchEvent(d),d.defaultPrevented)return!0;const c={row:r,rowIndex:t,colIndex:i,field:l,value:a,cellEl:o,originalEvent:e},u=this.#r?.onCellClick(c)??!1;return this.#P("cell-click",c),u}_dispatchRowClick(e,t,i,o){if(!i)return!1;const r={rowIndex:t,row:i,rowEl:o,originalEvent:e},s=this.#r?.onRowClick(r)??!1;return this.#P("row-click",r),s}_dispatchHeaderClick(e,t,i){const o=this._columns[t];if(!o)return!1;const r={colIndex:t,field:o.field,column:o,headerEl:i,originalEvent:e};return this.#r?.onHeaderClick(r)??!1}_dispatchKeyDown(e){return this.#r?.onKeyDown(e)??!1}_getHorizontalScrollOffsets(e,t){return this.#r?.getHorizontalScrollOffsets(e,t)??{left:0,right:0}}queryPlugins(e){return this.#r?.queryPlugins(e)??[]}_dispatchCellMouseDown(e){return this.#r?.onCellMouseDown(e)??!1}_dispatchCellMouseMove(e){this.#r?.onCellMouseMove(e)}_dispatchCellMouseUp(e){this.#r?.onCellMouseUp(e)}_afterCellRender(e){this.#r?.afterCellRender(e)}_hasAfterCellRenderHook(){return this.#r?.hasAfterCellRenderHook()??!1}_afterRowRender(e){this.#r?.afterRowRender(e)}_hasAfterRowRenderHook(){return this.#r?.hasAfterRowRenderHook()??!1}async ready(){return this.#d}async forceLayout(){return this.#c.requestPhase(I.FULL,"forceLayout"),this.#c.whenReady()}async getConfig(){return Object.freeze({...this.#n||{}})}getRowId(e){return this.#Ce(e,this.#n.getRowId)}getRow(e){return this.#S.get(e)?.row}updateRow(e,t,i="api"){const o=this.#S.get(e);if(!o)throw new Error(`[tbw-grid] Row with ID "${e}" not found. Ensure the row exists and getRowId is correctly configured.`);const{row:r,index:s}=o,l=[];for(const[a,d]of Object.entries(t)){const c=r[a];c!==d&&(l.push({field:a,oldValue:c,newValue:d}),r[a]=d)}for(const{field:a,oldValue:d,newValue:c}of l)this.#P("cell-change",{row:r,rowId:e,rowIndex:s,field:a,oldValue:d,newValue:c,changes:t,source:i});l.length>0&&this.#c.requestPhase(I.ROWS,"updateRow")}updateRows(e,t="api"){let i=!1;for(const{id:o,changes:r}of e){const s=this.#S.get(o);if(!s)throw new Error(`[tbw-grid] Row with ID "${o}" not found. Ensure the row exists and getRowId is correctly configured.`);const{row:l,index:a}=s;for(const[d,c]of Object.entries(r)){const u=l[d];u!==c&&(i=!0,l[d]=c,this.#P("cell-change",{row:l,rowId:o,rowIndex:a,field:d,oldValue:u,newValue:c,changes:r,source:t}))}}i&&this.#c.requestPhase(I.ROWS,"updateRows")}animateRow(e,t){Ne(this,e,t)}animateRows(e,t){pn(this,e,t)}animateRowById(e,t){return wn(this,e,t)}setColumnVisible(e,t){const i=this.#o.setColumnVisible(e,t);return i&&this.requestStateChange(),i}toggleColumnVisibility(e){const t=this.#o.toggleColumnVisibility(e);return t&&this.requestStateChange(),t}isColumnVisible(e){return this.#o.isColumnVisible(e)}showAllColumns(){this.#o.showAllColumns(),this.requestStateChange()}getAllColumns(){return this.#o.getAllColumns()}setColumnOrder(e){this.#o.setColumnOrder(e),this.requestStateChange()}getColumnOrder(){return this.#o.getColumnOrder()}getColumnState(){const e=this.#r?.getAll()??[];return this.#o.collectState(e)}set columnState(e){e&&(this.#I=e,this.#o.initialColumnState=e,this.#u&&this.#Ie(e))}get columnState(){return this.getColumnState()}#Ie(e){const t=this.#r?.getAll()??[];this.#o.applyState(e,t),this.#D()}requestStateChange(){const e=this.#r?.getAll()??[];this.#o.requestStateChange(e)}resetColumnState(){this.#I=void 0,this.__originalOrder=[];const e=this.#r?.getAll()??[];this.#o.resetState(e),this.#o.merge(),this.#D()}get isToolPanelOpen(){return this.#p.isPanelOpen}get expandedToolPanelSections(){return this.#p.expandedSections}openToolPanel(){this.#p.openToolPanel()}closeToolPanel(){this.#p.closeToolPanel()}toggleToolPanel(){this.#p.toggleToolPanel()}toggleToolPanelSection(e){this.#p.toggleToolPanelSection(e)}getToolPanels(){return this.#p.getToolPanels()}registerToolPanel(e){this.#i.apiToolPanelIds.add(e.id),this.#p.registerToolPanel(e)}unregisterToolPanel(e){this.#i.apiToolPanelIds.delete(e),this.#p.unregisterToolPanel(e)}getHeaderContents(){return this.#p.getHeaderContents()}registerHeaderContent(e){this.#p.registerHeaderContent(e)}unregisterHeaderContent(e){this.#p.unregisterHeaderContent(e)}getToolbarContents(){return this.#p.getToolbarContents()}registerToolbarContent(e){this.#p.registerToolbarContent(e)}unregisterToolbarContent(e){this.#p.unregisterToolbarContent(e)}#Y=!1;refreshShellHeader(){this.#Y||(this.#Y=!0,queueMicrotask(()=>{this.#Y=!1,this.isConnected&&(ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#L()),this.#o.markSourcesChanged(),this.#o.merge(),this.#Z(),this.#F(),this.#Me())}))}#Me(){const t=this.#e.querySelector(".tbw-grid-content")??this.#e.querySelector(".tbw-grid-root");if(this._headerRowEl=t?.querySelector(".header-row"),this._virtualization.totalHeightEl=t?.querySelector(".faux-vscroll-spacer"),this._virtualization.viewportEl=t?.querySelector(".rows-viewport"),this._bodyEl=t?.querySelector(".rows"),this.__rowsBodyEl=t?.querySelector(".rows-body"),this.#p.isInitialized){ze(this.#e,this.#i),Ot(this.#e,this.#n?.shell,this.#i);const i=this.#n?.shell?.toolPanel?.defaultOpen;i&&this.#i.toolPanels.has(i)&&(this.openToolPanel(),this.#i.expandedSections.add(i))}this._resizeController=Lt(this),this.#re(t),this.#c.requestPhase(I.COLUMNS,"shellRefresh")}#_=new Map;registerStyles(e,t){let i=this.#_.get(e);i||(i=new CSSStyleSheet,this.#_.set(e,i)),i.replaceSync(t),this.#ge()}unregisterStyles(e){this.#_.delete(e)&&this.#ge()}getRegisteredStyles(){return Array.from(this.#_.keys())}#ge(){const e=Array.from(this.#_.values()),t=document.adoptedStyleSheets.filter(i=>!Array.from(this.#_.values()).includes(i));document.adoptedStyleSheets=[...t,...e]}#Ne(){const e=()=>{const i=this.#i.lightDomTitle,o=this.#i.hasToolButtonsContainer;ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#L());const r=this.#i.lightDomTitle,s=this.#i.hasToolButtonsContainer;if(r&&!i||s&&!o){this.#o.markSourcesChanged(),this.#o.merge();const l=this.#e.querySelector(".tbw-shell-header");if(l){const a=zt(this.#n.shell,this.#i,this.#n.icons?.toolPanel),d=document.createElement("div");d.innerHTML=a;const c=d.firstElementChild;c&&(l.replaceWith(c),this.#J())}}},t=()=>{this.__lightDomColumnsCache=void 0,this.#D()};this.#o.registerLightDomHandler("tbw-grid-header",e),this.#o.registerLightDomHandler("tbw-grid-tool-buttons",e),this.#o.registerLightDomHandler("tbw-grid-tool-panel",e),this.#o.registerLightDomHandler("tbw-grid-column",t),this.#o.registerLightDomHandler("tbw-grid-detail",t),this.#o.observeLightDOM(this)}refreshColumns(){this.__lightDomColumnsCache=void 0,me(this),this.#o.parseLightDomColumns(this);const e=this.#i.lightDomTitle,t=this.#i.hasToolButtonsContainer;ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#L());const i=this.#i.lightDomTitle,o=this.#i.hasToolButtonsContainer;if(i&&!e||o&&!t){this.#o.markSourcesChanged(),this.#o.merge();const s=this.#e.querySelector(".tbw-shell-header");if(s){const l=zt(this.#n.shell,this.#i,this.#n.icons?.toolPanel),a=document.createElement("div");a.innerHTML=l;const d=a.firstElementChild;d&&(s.replaceWith(d),this.#J())}}this.#c.requestPhase(I.COLUMNS,"refreshColumns")}#X(e){const t=this._virtualization.rowHeight,i=this._virtualization.container??this,o=this._virtualization.viewportEl??i,r=i.clientHeight,s=o.clientHeight,a=this.shadowRoot?.querySelector(".tbw-scroll-area"),d=a?a.clientHeight:r,u=d-s,h=this.#r?.getExtraHeight()??0,f=Math.max(0,r-d);return e*t+u+h+f}refreshVirtualWindow(e=!1,t=!1){if(!this._bodyEl)return;const i=this._rows.length;if(!this._virtualization.enabled){this.#U(0,i),t||this.#r?.afterRender();return}if(this._rows.length<=this._virtualization.bypassThreshold){this._virtualization.start=0,this._virtualization.end=i,e&&(this._bodyEl.style.transform="translateY(0px)"),this.#U(0,i,e?++this.__rowRenderEpoch:this.__rowRenderEpoch),this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${this.#X(i)}px`),this.#de(i,this._visibleColumns.length),t||this.#r?.afterRender();return}const o=this._virtualization.container??this,r=this._virtualization.viewportEl??o,s=r.clientHeight,l=this._virtualization.rowHeight,a=o.scrollTop;let d=Math.floor(a/l),c=0;const u=10;for(;c<u;){const C=this.#r?.getExtraHeightBefore?.(d)??0,T=Math.floor((a-C)/l);if(T>=d||T<0)break;d=T,c++}d=d-d%2,d<0&&(d=0);const h=this.#r?.adjustVirtualStart(d,a,l);h!==void 0&&h<d&&(d=h,d=d-d%2,d<0&&(d=0));const f=Math.ceil(s/l)+3;let p=d+f;if(p>i&&(p=i),this._virtualization.start=d,this._virtualization.end=p,o.clientHeight===0&&s>0){this.#c.requestPhase(I.VIRTUALIZATION,"stale-refs-retry");return}const w=this.#X(i);this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${w}px`);const m=this.#r?.getExtraHeightBefore?.(d)??0,y=-(a-d*l-m);this._bodyEl.style.transform=`translateY(${y}px)`,this.#U(d,p,e?++this.__rowRenderEpoch:this.__rowRenderEpoch),this.#de(i,this._visibleColumns.length),e&&!t&&(this.#r?.afterRender(),queueMicrotask(()=>{const C=o.clientHeight,T=r.clientHeight;if(C===0&&T>0)return;const _=this.#X(i);this._virtualization.totalHeightEl&&(this._virtualization.totalHeightEl.style.height=`${_}px`)}))}#Z(){ee(this,this.#i),te(this,this.#i),ie(this,this.#i,this.#L()),this.#o.markSourcesChanged(),this.#o.merge();const e=this.#n?.shell;_n(this.#e,e,{isPanelOpen:this.#i.isPanelOpen,expandedSections:this.#i.expandedSections},this.#n?.icons)&&(this.#J(),this.#p.setInitialized(!0))}#J(){yn(this.#e,this.#n?.shell,this.#i,{onPanelToggle:()=>this.toggleToolPanel(),onSectionToggle:e=>this.toggleToolPanelSection(e)}),this.#M?.(),this.#M=Cn(this.#e,this.#n?.shell,e=>{this.style.setProperty("--tbw-tool-panel-width",`${e}px`)})}}customElements.get(M.tagName)||customElements.define(M.tagName,M),globalThis.DataGridElement=M;const qe={CAN_MOVE_COLUMN:"canMoveColumn",GET_CONTEXT_MENU_ITEMS:"getContextMenuItems"};class H{static dependencies;static manifest;version=typeof __GRID_VERSION__<"u"?__GRID_VERSION__:"dev";styles;cellRenderers;headerRenderers;cellEditors;grid;config;userConfig;#t;get defaultConfig(){return{}}constructor(e={}){this.userConfig=e}attach(e){this.#t?.abort(),this.#t=new AbortController,this.grid=e,this.config={...this.defaultConfig,...this.userConfig}}detach(){this.#t?.abort(),this.#t=void 0}getPlugin(e){return this.grid?.getPlugin(e)}emit(e,t){this.grid?.dispatchEvent?.(new CustomEvent(e,{detail:t,bubbles:!0}))}emitCancelable(e,t){const i=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return this.grid?.dispatchEvent?.(i),i.defaultPrevented}requestRender(){this.grid?.requestRender?.()}requestRenderWithFocus(){this.grid?.requestRenderWithFocus?.()}requestAfterRender(){this.grid?.requestAfterRender?.()}get rows(){return this.grid?.rows??[]}get sourceRows(){return this.grid?.sourceRows??[]}get columns(){return this.grid?.columns??[]}get visibleColumns(){return this.grid?._visibleColumns??[]}get gridElement(){return this.grid}get disconnectSignal(){return this.#t?.signal??this.grid?.disconnectSignal}get gridIcons(){const e=this.grid?.gridConfig?.icons??{};return{...G,...e}}get isAnimationEnabled(){const e=this.grid?.effectiveConfig?.animation?.mode??"reduced-motion";if(e===!1||e==="off")return!1;if(e===!0||e==="on")return!0;const t=this.gridElement;return t?getComputedStyle(t).getPropertyValue("--tbw-animation-enabled").trim()!=="0":!0}get animationDuration(){const e=this.gridElement;if(e){const t=getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(),i=parseInt(t,10);if(!isNaN(i))return i}return 200}resolveIcon(e,t){return t!==void 0?t:this.gridIcons[e]}setIcon(e,t){typeof t=="string"?e.innerHTML=t:t instanceof HTMLElement&&(e.innerHTML="",e.appendChild(t.cloneNode(!0)))}warn(e){console.warn(`[tbw-grid:${this.name}] ${e}`)}}const N={ROOT:"tbw-grid-root",HEADER:"header",HEADER_ROW:"header-row",HEADER_CELL:"header-cell",ROWS_VIEWPORT:"rows-viewport",ROWS_SPACER:"rows-spacer",ROWS_CONTAINER:"rows",DATA_ROW:"data-row",GROUP_ROW:"group-row",DATA_CELL:"data-cell",SELECTED:"selected",FOCUSED:"focused",EDITING:"editing",EXPANDED:"expanded",COLLAPSED:"collapsed",DRAGGING:"dragging",RESIZING:"resizing",SORTABLE:"sortable",SORTED_ASC:"sorted-asc",SORTED_DESC:"sorted-desc",HIDDEN:"hidden",STICKY_LEFT:"sticky-left",STICKY_RIGHT:"sticky-right",PINNED_TOP:"pinned-top",PINNED_BOTTOM:"pinned-bottom",TREE_TOGGLE:"tree-toggle",TREE_INDENT:"tree-indent",GROUP_TOGGLE:"group-toggle",GROUP_LABEL:"group-label",GROUP_COUNT:"group-count",RANGE_SELECTION:"range-selection",SELECTION_OVERLAY:"selection-overlay"},ue={ROW_INDEX:"data-row-index",COL_INDEX:"data-col-index",FIELD:"data-field",GROUP_KEY:"data-group-key",TREE_LEVEL:"data-tree-level",STICKY:"data-sticky"},Gn={ROOT:`.${N.ROOT}`,HEADER:`.${N.HEADER}`,HEADER_ROW:`.${N.HEADER_ROW}`,HEADER_CELL:`.${N.HEADER_CELL}`,ROWS_VIEWPORT:`.${N.ROWS_VIEWPORT}`,ROWS_CONTAINER:`.${N.ROWS_CONTAINER}`,DATA_ROW:`.${N.DATA_ROW}`,DATA_CELL:`.${N.DATA_CELL}`,GROUP_ROW:`.${N.GROUP_ROW}`,ROW_BY_INDEX:n=>`.${N.DATA_ROW}[${ue.ROW_INDEX}="${n}"]`,CELL_BY_FIELD:n=>`.${N.DATA_CELL}[${ue.FIELD}="${n}"]`,CELL_AT:(n,e)=>`.${N.DATA_ROW}[${ue.ROW_INDEX}="${n}"] .${N.DATA_CELL}[${ue.COL_INDEX}="${e}"]`,SELECTED_ROWS:`.${N.DATA_ROW}.${N.SELECTED}`,EDITING_CELL:`.${N.DATA_CELL}.${N.EDITING}`},Bn={COLOR_BG:"--tbw-color-bg",COLOR_FG:"--tbw-color-fg",COLOR_FG_MUTED:"--tbw-color-fg-muted",COLOR_BORDER:"--tbw-color-border",COLOR_ACCENT:"--tbw-color-accent",COLOR_HEADER_BG:"--tbw-color-header-bg",COLOR_HEADER_FG:"--tbw-color-header-fg",COLOR_SELECTION:"--tbw-color-selection",COLOR_ROW_HOVER:"--tbw-color-row-hover",COLOR_ROW_ALT:"--tbw-color-row-alt",ROW_HEIGHT:"--tbw-row-height",HEADER_HEIGHT:"--tbw-header-height",CELL_PADDING:"--tbw-cell-padding",FONT_FAMILY:"--tbw-font-family",FONT_SIZE:"--tbw-font-size",BORDER_RADIUS:"--tbw-border-radius",FOCUS_OUTLINE:"--tbw-focus-outline"};function $n(n){const e=document.createElement("tbw-grid");return n&&(e.gridConfig=n),e}function Kn(n,e=document){return e.querySelector(n)}const Vn={CELL_CHANGE:"cell-change",CELL_COMMIT:"cell-commit",ROW_COMMIT:"row-commit",CHANGED_ROWS_RESET:"changed-rows-reset",MOUNT_EXTERNAL_VIEW:"mount-external-view",MOUNT_EXTERNAL_EDITOR:"mount-external-editor",SORT_CHANGE:"sort-change",COLUMN_RESIZE:"column-resize",ACTIVATE_CELL:"activate-cell",CELL_ACTIVATE:"cell-activate",GROUP_TOGGLE:"group-toggle",COLUMN_STATE_CHANGE:"column-state-change"},Wn={SELECTION_CHANGE:"selection-change",TREE_EXPAND:"tree-expand",FILTER_CHANGE:"filter-change",SORT_MODEL_CHANGE:"sort-model-change",EXPORT_START:"export-start",EXPORT_COMPLETE:"export-complete",CLIPBOARD_COPY:"clipboard-copy",CLIPBOARD_PASTE:"clipboard-paste",CONTEXT_MENU_OPEN:"context-menu-open",CONTEXT_MENU_CLOSE:"context-menu-close",HISTORY_CHANGE:"history-change",SERVER_LOADING:"server-loading",SERVER_ERROR:"server-error",COLUMN_VISIBILITY_CHANGE:"column-visibility-change",COLUMN_REORDER:"column-reorder",DETAIL_EXPAND:"detail-expand",GROUP_EXPAND:"group-expand"},Vt="__tbw_expander",Un=32;function Ge(n){return n.field===Vt}function V(n){return n.meta?.utility===!0}function jn(n){return n.find(Ge)}function Yn(n){return{field:Vt,header:"",width:Un,resizable:!1,sortable:!1,filterable:!1,meta:{lockPosition:!0,suppressMovable:!0,expanderColumn:!0,expanderPlugin:n,utility:!0}}}async function Be(n){try{return await navigator.clipboard.writeText(n),!0}catch{const e=document.createElement("textarea");e.value=n,e.style.position="fixed",e.style.opacity="0",e.style.pointerEvents="none",document.body.appendChild(e),e.select();const t=document.execCommand("copy");return document.body.removeChild(e),t}}function Wt(n,e){const t=e.delimiter??" ",i=e.newline??`
61
61
  `,o=n.replace(/\r\n/g,`
62
62
  `).replace(/\r/g,`
63
63
  `),r=[];let s=[],l="",a=!1;for(let d=0;d<o.length;d++){const c=o[d];c==='"'&&!a?a=!0:c==='"'&&a?o[d+1]==='"'?(l+='"',d++):a=!1:c===t&&!a?(s.push(l),l=""):c===i&&!a?(s.push(l),l="",(s.length>1||s.some(u=>u.trim()!==""))&&r.push(s),s=[]):l+=c}return s.push(l),(s.length>1||s.some(d=>d.trim()!==""))&&r.push(s),r}async function Xn(){try{return await navigator.clipboard.readText()}catch{return""}}function Ut(n,e){const{rows:t,target:i,fields:o}=n;if(!i)return;const r=e.rows,s=e.effectiveConfig.columns??[],l=s.map(u=>u.field),a=new Map;s.forEach(u=>{a.set(u.field,u.editable===!0)});const d=[...r],c=i.bounds?i.bounds.endRow:1/0;t.forEach((u,h)=>{const f=i.row+h;if(!(f>c)){if(i.bounds){if(f>=d.length)return}else for(;f>=d.length;){const p={};l.forEach(g=>p[g]=""),d.push(p)}d[f]={...d[f]},u.forEach((p,g)=>{const w=o[g];w&&a.get(w)&&(d[f][w]=p)})}}),e.rows=d}class Zn extends H{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:" ",newline:`
64
64
  `,quoteStrings:!1}}lastCopied=null;attach(e){super.attach(e),e.addEventListener("paste",t=>this.#e(t),{signal:this.disconnectSignal})}detach(){this.lastCopied=null}onKeyDown(e){return(e.ctrlKey||e.metaKey)&&e.key==="c"?(this.#t(e.target),!0):!1}#t(e){const t=this.#d(),i=t?.getSelection(),o=this.columns.length-1,r=this.rows.length-1;let s;if(i&&i.ranges.length>0){const{mode:a,ranges:d}=i,c=d[d.length-1];a==="row"?s={startRow:c.from.row,startCol:0,endRow:c.to.row,endCol:o}:s={startRow:c.from.row,startCol:c.from.col,endRow:c.to.row,endCol:c.to.col}}else if(!t)s={startRow:0,startCol:0,endRow:r,endCol:o};else{const a=this.#l(e);if(!a)return;s={startRow:a.row,startCol:a.col,endRow:a.row,endCol:a.col}}const l=this.#s(s);Be(l.text).then(()=>{this.lastCopied={text:l.text,timestamp:Date.now()},this.emit("copy",{text:l.text,rowCount:l.rowCount,columnCount:l.columnCount})})}#e(e){const t=e.clipboardData?.getData("text/plain");if(!t)return;e.preventDefault();const i=Wt(t,this.config),r=this.#d()?.getSelection(),s=r?.ranges?.[0],l=s?.from.row??0,a=s?.from.col??0,c=s&&(r?.mode==="range"||r?.mode==="row")&&(s.from.row!==s.to.row||s.from.col!==s.to.col)?{endRow:s.to.row,endCol:s.to.col}:null,u=c?.endCol??this.columns.length-1,h=this.columns[a],f=h?{row:l,col:a,field:h.field,bounds:c}:null,p=[],g=i[0]?.length??0;for(let m=0;m<g&&a+m<=u;m++){const y=this.columns[a+m];y&&!y.hidden&&p.push(y.field)}const w={rows:i,text:t,target:f,fields:p};this.emit("paste",w),this.#u(w)}#u(e){if(!this.grid)return;const{pasteHandler:t}=this.config;if(t===null)return;(t??Ut)(e,this.grid)}#d(){try{const e=this.grid?.getPluginByName("selection");if(e)return e}catch{}}#s(e){const{startRow:t,startCol:i,endRow:o,endCol:r}=e,s=Math.min(t,o),l=Math.max(t,o),a=Math.min(i,r),d=Math.max(i,r),c=this.config.delimiter??" ",u=this.config.newline??`
65
- `,h=[],f=this.columns.slice(a,d+1).filter(p=>!$(p));if(this.config.includeHeaders){const p=f.map(g=>g.header||g.field);h.push(p.join(c))}for(let p=s;p<=l;p++){const g=this.rows[p];if(!g)continue;const w=f.map(m=>{const y=g[m.field];return y==null?"":y instanceof Date?y.toISOString():String(y)});h.push(w.join(c))}return{text:h.join(u),rowCount:l-s+1,columnCount:d-a+1}}#l(e){const t=e.closest("[data-field-cache]");if(!t)return null;const i=t.dataset.fieldCache,o=t.dataset.row;if(!i||!o)return null;const r=parseInt(o,10);if(isNaN(r))return null;const s=this.columns.findIndex(l=>l.field===i);return s===-1?null:{row:r,col:s}}async copy(){const t=this.#d()?.getSelection(),i=this.columns.length-1;let o={startRow:0,startCol:0,endRow:this.rows.length-1,endCol:i};if(t&&t.ranges.length>0){const s=t.ranges[t.ranges.length-1];t.mode==="row"?o={startRow:s.from.row,startCol:0,endRow:s.to.row,endCol:i}:o={startRow:s.from.row,startCol:s.from.col,endRow:s.to.row,endCol:s.to.col}}const r=this.#s(o);return await Be(r.text),this.lastCopied={text:r.text,timestamp:Date.now()},r.text}async copyRows(e){if(e.length===0)return"";const t=[...e].sort((s,l)=>s-l),i=this.columns.length-1,o={startRow:t[0],startCol:0,endRow:t[t.length-1],endCol:i},r=this.#s(o);return await Be(r.text),this.lastCopied={text:r.text,timestamp:Date.now()},r.text}async paste(){const e=await Xn();return e?Wt(e,this.config):null}getLastCopied(){return this.lastCopied}}const jt=100;function Ke(n){if(n==null)return jt;if(typeof n=="number")return n;const e=parseFloat(n);return isNaN(e)?jt:e}function Yt(n){return n.map(e=>Ke(e.width))}function Xt(n){const e=[];let t=0;for(const i of n)e.push(t),t+=Ke(i.width);return e}function Zt(n){return n.reduce((e,t)=>e+Ke(t.width),0)}function Jn(n,e,t,i,o){const r=t.length;if(r===0)return{startCol:0,endCol:0,visibleColumns:[]};let s=Qn(n,t,i);s=Math.max(0,s-o);const l=n+e;let a=s;for(let c=s;c<r;c++){if(t[c]>=l){a=c-1;break}a=c}a=Math.min(r-1,a+o);const d=[];for(let c=s;c<=a;c++)d.push(c);return{startCol:s,endCol:a,visibleColumns:d}}function Qn(n,e,t){let i=0,o=e.length-1;for(;i<o;){const r=Math.floor((i+o)/2);e[r]+t[r]<=n?i=r+1:o=r}return i}function eo(n,e,t){return t?n>e:!1}class to extends H{name="columnVirtualization";get defaultConfig(){return{autoEnable:!0,threshold:30,overscan:3}}isVirtualized=!1;startCol=0;endCol=0;scrollLeft=0;totalWidth=0;columnWidths=[];columnOffsets=[];attach(e){super.attach(e);const t=this.columns;this.columnWidths=Yt(t),this.columnOffsets=Xt(t),this.totalWidth=Zt(t),this.endCol=t.length-1}detach(){this.columnWidths=[],this.columnOffsets=[],this.isVirtualized=!1,this.startCol=0,this.endCol=0,this.scrollLeft=0,this.totalWidth=0}processColumns(e){const t=eo(e.length,this.config.threshold??30,this.config.autoEnable??!0);if(this.isVirtualized=t??!1,this.columnWidths=Yt(e),this.columnOffsets=Xt(e),this.totalWidth=Zt(e),!t)return this.startCol=0,this.endCol=e.length-1,[...e];const i=this.grid.clientWidth||800,o=Jn(this.scrollLeft,i,this.columnOffsets,this.columnWidths,this.config.overscan??3);return this.startCol=o.startCol,this.endCol=o.endCol,o.visibleColumns.map(r=>e[r])}afterRender(){if(!this.isVirtualized)return;const e=this.gridElement;if(!e)return;const t=this.columnOffsets[this.startCol]??0,i=e.querySelector(".header-row"),o=e.querySelectorAll(".data-grid-row");i&&(i.style.paddingLeft=`${t}px`),o.forEach(s=>{s.style.paddingLeft=`${t}px`});const r=e.querySelector(".rows-viewport .rows");r&&(r.style.width=`${this.totalWidth}px`)}onScroll(e){!this.isVirtualized||Math.abs(e.scrollLeft-this.scrollLeft)<1||(this.scrollLeft=e.scrollLeft,this.requestRender())}getIsVirtualized(){return this.isVirtualized}getVisibleColumnRange(){return{start:this.startCol,end:this.endCol}}scrollToColumn(e){const t=this.columnOffsets[e]??0,i=this.grid;i.scrollLeft=t}getColumnOffset(e){return this.columnOffsets[e]??0}getTotalWidth(){return this.totalWidth}}const Ve="@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:0 2px 10px var(--tbw-context-menu-shadow, 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{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 $e(n,e){return(typeof n=="function"?n(e):n).filter(i=>!(i.hidden===!0||typeof i.hidden=="function"&&i.hidden(e)))}function io(n,e){return n.disabled===!0?!0:typeof n.disabled=="function"?n.disabled(e):!1}function We(n,e,t,i=G.submenuArrow){const o=document.createElement("div");o.className="tbw-context-menu",o.setAttribute("role","menu");for(const r of n){if(r.separator){const d=document.createElement("div");d.className="tbw-context-menu-separator",d.setAttribute("role","separator"),o.appendChild(d);continue}const s=document.createElement("div");s.className="tbw-context-menu-item",r.cssClass&&s.classList.add(r.cssClass),s.setAttribute("role","menuitem"),s.setAttribute("data-id",r.id);const l=io(r,e);if(l&&(s.classList.add("disabled"),s.setAttribute("aria-disabled","true")),r.icon){const d=document.createElement("span");d.className="tbw-context-menu-icon",d.innerHTML=r.icon,s.appendChild(d)}const a=document.createElement("span");if(a.className="tbw-context-menu-label",a.textContent=r.name,s.appendChild(a),r.shortcut){const d=document.createElement("span");d.className="tbw-context-menu-shortcut",d.textContent=r.shortcut,s.appendChild(d)}if(r.subMenu?.length){const d=document.createElement("span");d.className="tbw-context-menu-arrow",typeof i=="string"?d.innerHTML=i:i instanceof HTMLElement&&d.appendChild(i.cloneNode(!0)),s.appendChild(d),s.addEventListener("mouseenter",()=>{if(s.querySelector(".tbw-context-menu")||!r.subMenu)return;const u=$e(r.subMenu,e),h=We(u,e,t,i);h.classList.add("tbw-context-submenu"),h.style.position="absolute",h.style.left="100%",h.style.top="0",s.style.position="relative",s.appendChild(h)}),s.addEventListener("mouseleave",()=>{const c=s.querySelector(".tbw-context-menu");c&&c.remove()})}!l&&r.action&&!r.subMenu&&s.addEventListener("click",d=>{d.stopPropagation(),t(r)}),o.appendChild(s)}return o}function Jt(n,e,t){n.style.position="fixed",n.style.left=`${e}px`,n.style.top=`${t}px`,n.style.visibility="hidden",n.style.zIndex="10000";const i=n.getBoundingClientRect(),o=window.innerWidth,r=window.innerHeight;let s=e,l=t;e+i.width>o&&(s=e-i.width),t+i.height>r&&(l=t-i.height),s=Math.max(0,s),l=Math.max(0,l),n.style.left=`${s}px`,n.style.top=`${l}px`,n.style.visibility="visible"}let ne=null,oe=null,W=null,Ue=0;const je=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:n=>{n.grid?.plugins?.clipboard?.copy?.()}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:n=>{n.grid?.plugins?.export?.exportCsv?.()}}];class Ye extends H{name="contextMenu";get defaultConfig(){return{items:je}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;attach(e){super.attach(e),this.installGlobalHandlers(),Ue++}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,this.uninstallGlobalHandlers()}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"];copyGridStyles(e){const t=this.gridElement;if(!t)return;const i=getComputedStyle(t),o=[];for(const r of Ye.CSS_VARS_TO_COPY){const s=i.getPropertyValue(r).trim();s&&o.push(`${r}: ${s}`)}if(o.length>0){const r=e.getAttribute("style")||"";e.setAttribute("style",r+o.join("; ")+";")}}installGlobalHandlers(){!W&&typeof document<"u"&&typeof Ve=="string"&&Ve&&(W=document.createElement("style"),W.id="tbw-context-menu-styles",W.textContent=Ve,document.head.appendChild(W)),ne||(ne=()=>{document.querySelectorAll(".tbw-context-menu").forEach(t=>t.remove())},document.addEventListener("click",ne)),oe||(oe=e=>{e.key==="Escape"&&document.querySelectorAll(".tbw-context-menu").forEach(i=>i.remove())},document.addEventListener("keydown",oe))}uninstallGlobalHandlers(){Ue--,!(Ue>0)&&(ne&&(document.removeEventListener("click",ne),ne=null),oe&&(document.removeEventListener("keydown",oe),oe=null),W&&(W.remove(),W=null))}afterRender(){const e=this.gridElement;if(!e)return;const t=e.children[0];t&&t.getAttribute("data-context-menu-bound")!=="true"&&(t.setAttribute("data-context-menu-bound","true"),t.addEventListener("contextmenu",i=>{const o=i;o.preventDefault();const r=o.target,s=r.closest("[data-row][data-col]"),l=r.closest(".header-cell");let a;if(s){const c=parseInt(s.getAttribute("data-row")??"-1",10),u=parseInt(s.getAttribute("data-col")??"-1",10),h=this.columns[u],f=this.rows[c];a={row:f,rowIndex:c,column:h,columnIndex:u,field:h?.field??"",value:f?.[h?.field]??null,isHeader:!1,event:o}}else if(l){const c=parseInt(l.getAttribute("data-col")??"-1",10),u=this.columns[c];a={row:null,rowIndex:-1,column:u,columnIndex:c,field:u?.field??"",value:null,isHeader:!0,event:o}}else return;this.params=a,this.position={x:o.clientX,y:o.clientY};const d=$e(this.config.items??je,a);d.length&&(this.menuElement&&this.menuElement.remove(),this.menuElement=We(d,a,c=>{c.action&&c.action(a),this.menuElement?.remove(),this.menuElement=null,this.isOpen=!1},this.gridIcons.submenuArrow),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),Jt(this.menuElement,o.clientX,o.clientY),this.isOpen=!0,this.emit("context-menu-open",{params:a,items:d}))}))}showMenu(e,t,i){const o={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")},r=$e(this.config.items??je,o);this.menuElement&&this.menuElement.remove(),this.menuElement=We(r,o,s=>{s.action&&s.action(o),this.menuElement?.remove(),this.menuElement=null,this.isOpen=!1},this.gridIcons.submenuArrow),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),Jt(this.menuElement,e,t),this.isOpen=!0}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null,this.isOpen=!1)}isMenuOpen(){return this.isOpen}}const no="@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}tbw-grid .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))}tbw-grid .data-grid-row>.cell.editing{overflow:hidden;padding:0;display:flex;min-height:calc(var(--tbw-row-height) + 2px);align-items:center;justify-content:center}tbw-grid .data-grid-row>.cell.editing input:not([type=checkbox]),tbw-grid .data-grid-row>.cell.editing select,tbw-grid .data-grid-row>.cell.editing textarea{width:100%;height:100%;flex:1 1 auto;min-width:0;border:var(--tbw-editing-border);padding:var(--tbw-padding-editing-input);font-size:var(--tbw-font-size-editor)}tbw-grid .tbw-editor-host{display:contents}}";function oo(n){const e=n.options;return e?typeof e=="function"?e():e:[]}function ro(n){return e=>{const t=n.editorParams,i=document.createElement("input");i.type="number",i.value=e.value!=null?String(e.value):"",t?.min!==void 0&&(i.min=String(t.min)),t?.max!==void 0&&(i.max=String(t.max)),t?.step!==void 0&&(i.step=String(t.step)),t?.placeholder&&(i.placeholder=t.placeholder);const o=()=>e.commit(i.value===""?null:Number(i.value));return i.addEventListener("blur",o),i.addEventListener("keydown",r=>{r.key==="Enter"&&o(),r.key==="Escape"&&e.cancel()}),i}}function so(){return n=>{const e=document.createElement("input");return e.type="checkbox",e.checked=!!n.value,e.addEventListener("change",()=>n.commit(e.checked)),e}}function lo(n){return e=>{const t=n.editorParams,i=document.createElement("input");return i.type="date",e.value instanceof Date&&(i.valueAsDate=e.value),t?.min&&(i.min=t.min),t?.max&&(i.max=t.max),t?.placeholder&&(i.placeholder=t.placeholder),i.addEventListener("change",()=>e.commit(i.valueAsDate)),i.addEventListener("keydown",o=>{o.key==="Escape"&&e.cancel()}),i}}function ao(n){return e=>{const t=n.editorParams,i=document.createElement("select");if(n.multi&&(i.multiple=!0),t?.includeEmpty){const s=document.createElement("option");s.value="",s.textContent=t.emptyLabel??"",i.appendChild(s)}oo(n).forEach(s=>{const l=document.createElement("option");l.value=String(s.value),l.textContent=s.label,(n.multi&&Array.isArray(e.value)&&e.value.includes(s.value)||!n.multi&&e.value===s.value)&&(l.selected=!0),i.appendChild(l)});const r=()=>{if(n.multi){const s=Array.from(i.selectedOptions).map(l=>l.value);e.commit(s)}else e.commit(i.value)};return i.addEventListener("change",r),i.addEventListener("blur",r),i.addEventListener("keydown",s=>{s.key==="Escape"&&e.cancel()}),i}}function co(n){return e=>{const t=n.editorParams,i=document.createElement("input");return i.type="text",i.value=e.value!=null?String(e.value):"",t?.maxLength!==void 0&&(i.maxLength=t.maxLength),t?.pattern&&(i.pattern=t.pattern),t?.placeholder&&(i.placeholder=t.placeholder),i.addEventListener("blur",()=>e.commit(i.value)),i.addEventListener("keydown",o=>{o.key==="Enter"&&e.commit(i.value),o.key==="Escape"&&e.cancel()}),i}}function Qt(n){switch(n.type){case"number":return ro(n);case"boolean":return so();case"date":return lo(n);case"select":return ao(n);default:return co(n)}}const Xe='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function uo(n,e){if(e.editor)return e.editor;if(e.__editorTemplate)return"template";if(!e.type)return;const i=n.effectiveConfig?.typeDefaults;if(i?.[e.type]?.editor)return i[e.type].editor;const o=n.__frameworkAdapter;if(o?.getTypeDefault){const r=o.getTypeDefault(e.type);if(r?.editor)return r.editor}}function he(n){return!(typeof n!="string"||n==="__proto__"||n==="constructor"||n==="prototype")}function ho(n){const e=(n.__editingCellCount??0)+1;n.__editingCellCount=e,n.setAttribute("data-has-editing","")}function fo(n){n.__editingCellCount=0,n.removeAttribute("data-has-editing")}function fe(n,e){return n instanceof HTMLInputElement?n.type==="checkbox"?n.checked:n.type==="number"?n.value===""?null:Number(n.value):n.type==="date"?n.valueAsDate:n.value:e?.type==="number"&&n.value!==""?Number(n.value):n.value}function ei(n){}function go(n,e,t){const i=n.querySelector("input,textarea,select");i&&(i.addEventListener("blur",()=>{t(fe(i,e))}),i instanceof HTMLInputElement&&i.type==="checkbox"?i.addEventListener("change",()=>t(i.checked)):i instanceof HTMLSelectElement&&i.addEventListener("change",()=>t(fe(i,e))))}class po extends H{static manifest={ownedProperties:[{property:"editable",level:"column",description:'the "editable" column property',isUsed:e=>e===!0},{property:"editor",level:"column",description:'the "editor" column property'},{property:"editorParams",level:"column",description:'the "editorParams" column property'}]};name="editing";styles=no;get defaultConfig(){return{editOn:"click"}}#t=-1;#e=-1;#u=new Map;#d=new Set;#s=new Set;#l=!1;attach(e){super.attach(e);const t=this.disconnectSignal,i=e;i._activeEditRows=-1,i._rowEditSnapshots=new Map,Object.defineProperty(e,"changedRows",{get:()=>this.changedRows,configurable:!0}),Object.defineProperty(e,"changedRowIds",{get:()=>this.changedRowIds,configurable:!0}),e.resetChangedRows=o=>this.resetChangedRows(o),e.beginBulkEdit=(o,r)=>{r&&this.beginCellEdit(o,r)},document.addEventListener("keydown",o=>{o.key==="Escape"&&this.#t!==-1&&this.#f(this.#t,!0)},{capture:!0,signal:t}),document.addEventListener("mousedown",o=>{if(this.#t===-1)return;const r=i.findRenderedRowElement?.(this.#t);!r||(o.composedPath&&o.composedPath()||[]).includes(r)||queueMicrotask(()=>{this.#t!==-1&&this.#f(this.#t,!1)})},{signal:t})}detach(){this.#t=-1,this.#e=-1,this.#u.clear(),this.#d.clear(),this.#s.clear(),super.detach()}onCellClick(e){const t=this.grid,i=this.config.editOn??t.effectiveConfig?.editOn;if(i===!1||i==="manual"||i!=="click"&&i!=="dblclick")return!1;const o=e.originalEvent.type==="dblclick";if(i==="click"&&o||i==="dblclick"&&!o)return!1;const{rowIndex:r}=e;return t._columns?.some(l=>l.editable)?(e.originalEvent.stopPropagation(),this.beginBulkEdit(r),!0):!1}onKeyDown(e){const t=this.grid;if(e.key==="Escape"&&this.#t!==-1)return this.#f(this.#t,!0),!0;if(e.key===" "||e.key==="Spacebar"){const i=t._focusRow,o=t._focusCol;if(i>=0&&o>=0){const r=t._visibleColumns[o],s=t._rows[i];if(r?.editable&&r.type==="boolean"&&s){const l=r.field;if(he(l)){const d=!s[l];return this.#c(i,r,d,s),e.preventDefault(),this.requestRender(),!0}}}return!1}if(e.key==="Enter"&&!e.shiftKey){if(this.#t!==-1)return!1;const i=this.config.editOn??t.effectiveConfig?.editOn;if(i===!1||i==="manual")return!1;const o=t._focusRow,r=t._focusCol;if(o>=0&&t._columns?.some(l=>l.editable)){const l=t._visibleColumns[r],a=t._rows[o],d=l?.field??"",c=d&&a?a[d]:void 0,u=this.gridElement.querySelector(`[data-row="${o}"][data-col="${r}"]`),h=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,detail:{rowIndex:o,colIndex:r,field:d,value:c,row:a,cellEl:u,trigger:"keyboard",originalEvent:e}});this.gridElement.dispatchEvent(h);const f=new CustomEvent("activate-cell",{cancelable:!0,bubbles:!0,detail:{row:o,col:r}});return this.gridElement.dispatchEvent(f),h.defaultPrevented||f.defaultPrevented?(e.preventDefault(),!0):(this.beginBulkEdit(o),!0)}return!1}return!1}processColumns(e){const t=this.grid,i=t.effectiveConfig?.typeDefaults,o=t.__frameworkAdapter;return!i&&!o?.getTypeDefault?e:e.map(r=>{if(!r.type)return r;let s;if(i?.[r.type]?.editorParams&&(s=i[r.type].editorParams),!s&&o?.getTypeDefault){const l=o.getTypeDefault(r.type);l?.editorParams&&(s=l.editorParams)}return s?{...r,editorParams:{...s,...r.editorParams}}:r})}afterRender(){const e=this.grid;if(this.#l&&(this.#l=!1,this.#w(e)),this.#s.size!==0)for(const t of this.#s){const[i,o]=t.split(":"),r=parseInt(i,10),s=parseInt(o,10),l=e.findRenderedRowElement?.(r);if(!l)continue;const a=l.querySelector(`.cell[data-col="${s}"]`);if(!a||a.classList.contains("editing"))continue;const d=e._rows[r],c=e._visibleColumns[s];d&&c&&this.#m(d,r,c,s,a,!0)}}onScrollRender(){this.afterRender()}get changedRows(){const e=[];for(const t of this.#d){const i=this.grid.getRow(t);i&&e.push(i)}return e}get changedRowIds(){return Array.from(this.#d)}get activeEditRow(){return this.#t}get activeEditCol(){return this.#e}isRowEditing(e){return this.#t===e}isCellEditing(e,t){return this.#s.has(`${e}:${t}`)}isRowChanged(e){const t=this.grid,i=t._rows[e];if(!i)return!1;try{const o=t.getRowId?.(i);return o?this.#d.has(o):!1}catch{return!1}}isRowChangedById(e){return this.#d.has(e)}resetChangedRows(e){const t=this.changedRows,i=this.changedRowIds;this.#d.clear(),this.#h(),e||this.emit("changed-rows-reset",{rows:t,ids:i}),this.grid._rowPool?.forEach(r=>r.classList.remove("changed"))}beginCellEdit(e,t){const i=this.grid,o=i._visibleColumns.findIndex(a=>a.field===t);if(o===-1||!i._visibleColumns[o]?.editable)return;const l=i.findRenderedRowElement?.(e)?.querySelector(`.cell[data-col="${o}"]`);l&&this.#n(e,o,l)}beginBulkEdit(e){const t=this.grid;if((this.config.editOn??t.effectiveConfig?.editOn)===!1||!t._columns?.some(l=>l.editable))return;const r=t.findRenderedRowElement?.(e);if(!r)return;const s=t._rows[e];this.#g(e,s),Array.from(r.children).forEach((l,a)=>{const d=t._visibleColumns[a];if(d?.editable){const c=l;c.classList.contains("editing")||this.#m(s,e,d,a,c,!0)}}),setTimeout(()=>{let l=r.querySelector(`.cell[data-col="${t._focusCol}"]`);if(l?.classList.contains("editing")||(l=r.querySelector(".cell.editing")),l?.classList.contains("editing")){const a=l.querySelector(Xe);try{a?.focus({preventScroll:!0})}catch{}}},0)}commitActiveRowEdit(){this.#t!==-1&&this.#f(this.#t,!1)}cancelActiveRowEdit(){this.#t!==-1&&this.#f(this.#t,!0)}#n(e,t,i){const o=this.grid,r=o._rows[e],s=o._visibleColumns[t];!r||!s?.editable||i.classList.contains("editing")||(this.#t!==e&&this.#g(e,r),this.#e=t,this.#m(r,e,s,t,i,!1))}#h(){const e=this.grid;e._activeEditRows=this.#t,e._rowEditSnapshots=this.#u}#g(e,t){this.#t!==e&&(this.#u.set(e,{...t}),this.#t=e,this.#h())}#f(e,t){if(this.#t!==e)return;const i=this.grid,o=this.#u.get(e),r=i._rows[e],s=i.findRenderedRowElement?.(e);let l;if(r)try{l=i.getRowId?.(r)}catch{}if(!t&&s&&r&&s.querySelectorAll(".cell.editing").forEach(d=>{const c=Number(d.getAttribute("data-col"));if(isNaN(c))return;const u=i._visibleColumns[c];if(!u)return;const h=d.querySelector("input,textarea,select");if(h){const f=fe(h,u);r[u.field]!==f&&this.#c(e,u,f,r)}}),t&&o&&r)Object.keys(o).forEach(a=>{r[a]=o[a]}),l&&this.#d.delete(l);else if(!t&&r){const a=l?this.#d.has(l):!1;this.emit("row-commit",{rowIndex:e,rowId:l??"",row:r,changed:a,changedRows:this.changedRows,changedRowIds:this.changedRowIds}),a&&this.isAnimationEnabled&&i.animateRow?.(e,"change")}this.#u.delete(e),this.#t=-1,this.#e=-1,this.#h();for(const a of this.#s)a.startsWith(`${e}:`)&&this.#s.delete(a);s&&(s.querySelectorAll(".cell.editing").forEach(a=>{a.classList.remove("editing"),fo(a.parentElement)}),this.requestRender()),this.#l=!0,s||(this.#w(i),this.#l=!1)}#c(e,t,i,o){const r=t.field;if(!he(r))return;const s=o[r];if(s===i)return;const l=this.grid;let a;try{a=this.grid.getRowId(o)}catch{}const d=a?!this.#d.has(a):!0,c=a?f=>this.grid.updateRow(a,f,"cascade"):ei;if(this.emitCancelable("cell-commit",{row:o,rowId:a??"",field:r,oldValue:s,value:i,rowIndex:e,changedRows:this.changedRows,changedRowIds:this.changedRowIds,firstTimeForRow:d,updateRow:c}))return;o[r]=i,a&&this.#d.add(a),this.#h();const h=l.findRenderedRowElement?.(e);h&&(h.classList.add("changed"),Lt(h,"change"))}#m(e,t,i,o,r,s){if(!i.editable||r.classList.contains("editing"))return;let l;try{l=this.grid.getRowId(e)}catch{}const a=l?C=>this.grid.updateRow(l,C,"cascade"):ei,d=he(i.field)?e[i.field]:void 0;r.classList.add("editing"),this.#s.add(`${t}:${o}`);const c=r.parentElement;c&&ho(c);let u=!1;const h=C=>{u||this.#t===-1||this.#c(t,i,C,e)},f=()=>{u=!0,he(i.field)&&(e[i.field]=d)},p=document.createElement("div");p.className="tbw-editor-host",r.innerHTML="",r.appendChild(p),p.addEventListener("keydown",C=>{C.key==="Enter"&&(C.stopPropagation(),C.preventDefault(),u=!0,this.#f(t,!1)),C.key==="Escape"&&(C.stopPropagation(),C.preventDefault(),f(),this.#f(t,!0))});const g=i,w=g.__editorTemplate,m=uo(this.grid,g)??Qt(i),y=d;if(m==="template"&&w)this.#a(p,g,e,d,h,f,s,t);else if(typeof m=="string"){const C=document.createElement(m);C.value=y,C.addEventListener("change",()=>h(C.value)),p.appendChild(C),s||queueMicrotask(()=>{p.querySelector(Xe)?.focus({preventScroll:!0})})}else if(typeof m=="function"){const C={row:e,rowId:l??"",value:y,field:i.field,column:i,commit:h,cancel:f,updateRow:a},T=m(C);typeof T=="string"?(p.innerHTML=T,go(p,i,h)):T instanceof Node&&p.appendChild(T),s||queueMicrotask(()=>{p.querySelector(Xe)?.focus({preventScroll:!0})})}else if(m&&typeof m=="object"){const C=document.createElement("div");C.setAttribute("data-external-editor",""),C.setAttribute("data-field",i.field),p.appendChild(C);const T={row:e,rowId:l??"",value:y,field:i.field,column:i,commit:h,cancel:f,updateRow:a};if(m.mount)try{m.mount({placeholder:C,context:T,spec:m})}catch(_){console.warn(`[tbw-grid] External editor mount error for column '${i.field}':`,_)}else this.grid.dispatchEvent(new CustomEvent("mount-external-editor",{detail:{placeholder:C,spec:m,context:T}}))}}#a(e,t,i,o,r,s,l,a){const d=t.__editorTemplate;if(!d)return;const c=d.cloneNode(!0),u=t.__compiledEditor;u?c.innerHTML=u({row:i,value:o,field:t.field,column:t,commit:r,cancel:s}):c.querySelectorAll("*").forEach(f=>{f.childNodes.length===1&&f.firstChild?.nodeType===Node.TEXT_NODE&&(f.textContent=f.textContent?.replace(/{{\s*value\s*}}/g,o==null?"":String(o)).replace(/{{\s*row\.([a-zA-Z0-9_]+)\s*}}/g,(p,g)=>{if(!he(g))return"";const w=i[g];return w==null?"":String(w)})||"")});const h=c.querySelector("input,textarea,select");if(h){h instanceof HTMLInputElement&&h.type==="checkbox"?h.checked=!!o:h.value=String(o??"");let f=!1;h.addEventListener("blur",()=>{f||r(fe(h,t))}),h.addEventListener("keydown",p=>{const g=p;g.key==="Enter"&&(g.stopPropagation(),g.preventDefault(),f=!0,r(fe(h,t)),this.#f(a,!1)),g.key==="Escape"&&(g.stopPropagation(),g.preventDefault(),s(),this.#f(a,!0))}),h instanceof HTMLInputElement&&h.type==="checkbox"&&h.addEventListener("change",()=>r(h.checked)),l||setTimeout(()=>h.focus({preventScroll:!0}),0)}e.appendChild(c)}#w(e){queueMicrotask(()=>{try{const t=e._focusRow,i=e._focusCol,o=e.findRenderedRowElement?.(t);if(o){Array.from(e._bodyEl.querySelectorAll(".cell-focus")).forEach(s=>s.classList.remove("cell-focus"));const r=o.querySelector(`.cell[data-row="${t}"][data-col="${i}"]`);r&&(r.classList.add("cell-focus"),r.setAttribute("aria-selected","true"),r.hasAttribute("tabindex")||r.setAttribute("tabindex","-1"),r.focus({preventScroll:!0}))}}catch{}})}}function ti(n,e=!0){if(n==null)return"";if(n instanceof Date)return n.toISOString();if(typeof n=="object")return JSON.stringify(n);const t=String(n);return e&&(t.includes(",")||t.includes('"')||t.includes(`
65
+ `,h=[],f=this.columns.slice(a,d+1).filter(p=>!V(p));if(this.config.includeHeaders){const p=f.map(g=>g.header||g.field);h.push(p.join(c))}for(let p=s;p<=l;p++){const g=this.rows[p];if(!g)continue;const w=f.map(m=>{const y=g[m.field];return y==null?"":y instanceof Date?y.toISOString():String(y)});h.push(w.join(c))}return{text:h.join(u),rowCount:l-s+1,columnCount:d-a+1}}#l(e){const t=e.closest("[data-field-cache]");if(!t)return null;const i=t.dataset.fieldCache,o=t.dataset.row;if(!i||!o)return null;const r=parseInt(o,10);if(isNaN(r))return null;const s=this.columns.findIndex(l=>l.field===i);return s===-1?null:{row:r,col:s}}async copy(){const t=this.#d()?.getSelection(),i=this.columns.length-1;let o={startRow:0,startCol:0,endRow:this.rows.length-1,endCol:i};if(t&&t.ranges.length>0){const s=t.ranges[t.ranges.length-1];t.mode==="row"?o={startRow:s.from.row,startCol:0,endRow:s.to.row,endCol:i}:o={startRow:s.from.row,startCol:s.from.col,endRow:s.to.row,endCol:s.to.col}}const r=this.#s(o);return await Be(r.text),this.lastCopied={text:r.text,timestamp:Date.now()},r.text}async copyRows(e){if(e.length===0)return"";const t=[...e].sort((s,l)=>s-l),i=this.columns.length-1,o={startRow:t[0],startCol:0,endRow:t[t.length-1],endCol:i},r=this.#s(o);return await Be(r.text),this.lastCopied={text:r.text,timestamp:Date.now()},r.text}async paste(){const e=await Xn();return e?Wt(e,this.config):null}getLastCopied(){return this.lastCopied}}const jt=100;function $e(n){if(n==null)return jt;if(typeof n=="number")return n;const e=parseFloat(n);return isNaN(e)?jt:e}function Yt(n){return n.map(e=>$e(e.width))}function Xt(n){const e=[];let t=0;for(const i of n)e.push(t),t+=$e(i.width);return e}function Zt(n){return n.reduce((e,t)=>e+$e(t.width),0)}function Jn(n,e,t,i,o){const r=t.length;if(r===0)return{startCol:0,endCol:0,visibleColumns:[]};let s=Qn(n,t,i);s=Math.max(0,s-o);const l=n+e;let a=s;for(let c=s;c<r;c++){if(t[c]>=l){a=c-1;break}a=c}a=Math.min(r-1,a+o);const d=[];for(let c=s;c<=a;c++)d.push(c);return{startCol:s,endCol:a,visibleColumns:d}}function Qn(n,e,t){let i=0,o=e.length-1;for(;i<o;){const r=Math.floor((i+o)/2);e[r]+t[r]<=n?i=r+1:o=r}return i}function eo(n,e,t){return t?n>e:!1}class to extends H{name="columnVirtualization";get defaultConfig(){return{autoEnable:!0,threshold:30,overscan:3}}isVirtualized=!1;startCol=0;endCol=0;scrollLeft=0;totalWidth=0;columnWidths=[];columnOffsets=[];attach(e){super.attach(e);const t=this.columns;this.columnWidths=Yt(t),this.columnOffsets=Xt(t),this.totalWidth=Zt(t),this.endCol=t.length-1}detach(){this.columnWidths=[],this.columnOffsets=[],this.isVirtualized=!1,this.startCol=0,this.endCol=0,this.scrollLeft=0,this.totalWidth=0}processColumns(e){const t=eo(e.length,this.config.threshold??30,this.config.autoEnable??!0);if(this.isVirtualized=t??!1,this.columnWidths=Yt(e),this.columnOffsets=Xt(e),this.totalWidth=Zt(e),!t)return this.startCol=0,this.endCol=e.length-1,[...e];const i=this.grid.clientWidth||800,o=Jn(this.scrollLeft,i,this.columnOffsets,this.columnWidths,this.config.overscan??3);return this.startCol=o.startCol,this.endCol=o.endCol,o.visibleColumns.map(r=>e[r])}afterRender(){if(!this.isVirtualized)return;const e=this.gridElement;if(!e)return;const t=this.columnOffsets[this.startCol]??0,i=e.querySelector(".header-row"),o=e.querySelectorAll(".data-grid-row");i&&(i.style.paddingLeft=`${t}px`),o.forEach(s=>{s.style.paddingLeft=`${t}px`});const r=e.querySelector(".rows-viewport .rows");r&&(r.style.width=`${this.totalWidth}px`)}onScroll(e){!this.isVirtualized||Math.abs(e.scrollLeft-this.scrollLeft)<1||(this.scrollLeft=e.scrollLeft,this.requestRender())}getIsVirtualized(){return this.isVirtualized}getVisibleColumnRange(){return{start:this.startCol,end:this.endCol}}scrollToColumn(e){const t=this.columnOffsets[e]??0,i=this.grid;i.scrollLeft=t}getColumnOffset(e){return this.columnOffsets[e]??0}getTotalWidth(){return this.totalWidth}}const Ke="@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{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 Ve(n,e){return(typeof n=="function"?n(e):n).filter(i=>!(i.hidden===!0||typeof i.hidden=="function"&&i.hidden(e)))}function io(n,e){return n.disabled===!0?!0:typeof n.disabled=="function"?n.disabled(e):!1}function We(n,e,t,i=G.submenuArrow){const o=document.createElement("div");o.className="tbw-context-menu",o.setAttribute("role","menu");for(const r of n){if(r.separator){const d=document.createElement("div");d.className="tbw-context-menu-separator",d.setAttribute("role","separator"),o.appendChild(d);continue}const s=document.createElement("div");s.className="tbw-context-menu-item",r.cssClass&&s.classList.add(r.cssClass),s.setAttribute("role","menuitem"),s.setAttribute("data-id",r.id);const l=io(r,e);if(l&&(s.classList.add("disabled"),s.setAttribute("aria-disabled","true")),r.icon){const d=document.createElement("span");d.className="tbw-context-menu-icon",d.innerHTML=r.icon,s.appendChild(d)}const a=document.createElement("span");if(a.className="tbw-context-menu-label",a.textContent=r.name,s.appendChild(a),r.shortcut){const d=document.createElement("span");d.className="tbw-context-menu-shortcut",d.textContent=r.shortcut,s.appendChild(d)}if(r.subMenu?.length){const d=document.createElement("span");d.className="tbw-context-menu-arrow",typeof i=="string"?d.innerHTML=i:i instanceof HTMLElement&&d.appendChild(i.cloneNode(!0)),s.appendChild(d),s.addEventListener("mouseenter",()=>{if(s.querySelector(".tbw-context-menu")||!r.subMenu)return;const u=Ve(r.subMenu,e),h=We(u,e,t,i);h.classList.add("tbw-context-submenu"),h.style.position="absolute",h.style.left="100%",h.style.top="0",s.style.position="relative",s.appendChild(h)}),s.addEventListener("mouseleave",()=>{const c=s.querySelector(".tbw-context-menu");c&&c.remove()})}!l&&r.action&&!r.subMenu&&s.addEventListener("click",d=>{d.stopPropagation(),t(r)}),o.appendChild(s)}return o}function Jt(n,e,t){n.style.position="fixed",n.style.left=`${e}px`,n.style.top=`${t}px`,n.style.visibility="hidden",n.style.zIndex="10000";const i=n.getBoundingClientRect(),o=window.innerWidth,r=window.innerHeight;let s=e,l=t;e+i.width>o&&(s=e-i.width),t+i.height>r&&(l=t-i.height),s=Math.max(0,s),l=Math.max(0,l),n.style.left=`${s}px`,n.style.top=`${l}px`,n.style.visibility="visible"}let ne=null,oe=null,W=null,Ue=0;const je=[{id:"copy",name:"Copy",shortcut:"Ctrl+C",action:n=>{n.grid?.plugins?.clipboard?.copy?.()}},{separator:!0,id:"sep1",name:""},{id:"export-csv",name:"Export CSV",action:n=>{n.grid?.plugins?.export?.exportCsv?.()}}];class Ye extends H{name="contextMenu";get defaultConfig(){return{items:je}}isOpen=!1;position={x:0,y:0};params=null;menuElement=null;attach(e){super.attach(e),this.installGlobalHandlers(),Ue++}detach(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null),this.isOpen=!1,this.params=null,this.uninstallGlobalHandlers()}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"];copyGridStyles(e){const t=this.gridElement;if(!t)return;const i=getComputedStyle(t),o=[],r=i.getPropertyValue("color-scheme").trim();r&&o.push(`color-scheme: ${r}`);for(const s of Ye.CSS_VARS_TO_COPY){const l=i.getPropertyValue(s).trim();l&&o.push(`${s}: ${l}`)}if(o.length>0){const s=e.getAttribute("style")||"";e.setAttribute("style",s+o.join("; ")+";")}}installGlobalHandlers(){!W&&typeof document<"u"&&typeof Ke=="string"&&Ke&&(W=document.createElement("style"),W.id="tbw-context-menu-styles",W.textContent=Ke,document.head.appendChild(W)),ne||(ne=()=>{document.querySelectorAll(".tbw-context-menu").forEach(t=>t.remove())},document.addEventListener("click",ne)),oe||(oe=e=>{e.key==="Escape"&&document.querySelectorAll(".tbw-context-menu").forEach(i=>i.remove())},document.addEventListener("keydown",oe))}uninstallGlobalHandlers(){Ue--,!(Ue>0)&&(ne&&(document.removeEventListener("click",ne),ne=null),oe&&(document.removeEventListener("keydown",oe),oe=null),W&&(W.remove(),W=null))}afterRender(){const e=this.gridElement;if(!e)return;const t=e.children[0];t&&t.getAttribute("data-context-menu-bound")!=="true"&&(t.setAttribute("data-context-menu-bound","true"),t.addEventListener("contextmenu",i=>{const o=i;o.preventDefault();const r=o.target,s=r.closest("[data-row][data-col]"),l=r.closest(".header-cell");let a;if(s){const c=parseInt(s.getAttribute("data-row")??"-1",10),u=parseInt(s.getAttribute("data-col")??"-1",10),h=this.columns[u],f=this.rows[c];a={row:f,rowIndex:c,column:h,columnIndex:u,field:h?.field??"",value:f?.[h?.field]??null,isHeader:!1,event:o}}else if(l){const c=parseInt(l.getAttribute("data-col")??"-1",10),u=this.columns[c];a={row:null,rowIndex:-1,column:u,columnIndex:c,field:u?.field??"",value:null,isHeader:!0,event:o}}else return;this.params=a,this.position={x:o.clientX,y:o.clientY};const d=Ve(this.config.items??je,a);d.length&&(this.menuElement&&this.menuElement.remove(),this.menuElement=We(d,a,c=>{c.action&&c.action(a),this.menuElement?.remove(),this.menuElement=null,this.isOpen=!1},this.gridIcons.submenuArrow),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),Jt(this.menuElement,o.clientX,o.clientY),this.isOpen=!0,this.emit("context-menu-open",{params:a,items:d}))}))}showMenu(e,t,i){const o={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")},r=Ve(this.config.items??je,o);this.menuElement&&this.menuElement.remove(),this.menuElement=We(r,o,s=>{s.action&&s.action(o),this.menuElement?.remove(),this.menuElement=null,this.isOpen=!1},this.gridIcons.submenuArrow),document.body.appendChild(this.menuElement),this.copyGridStyles(this.menuElement),Jt(this.menuElement,e,t),this.isOpen=!0}hideMenu(){this.menuElement&&(this.menuElement.remove(),this.menuElement=null,this.isOpen=!1)}isMenuOpen(){return this.isOpen}}const no="@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}tbw-grid .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))}tbw-grid .data-grid-row>.cell.editing{overflow:hidden;padding:0;display:flex;min-height:calc(var(--tbw-row-height) + 2px);align-items:center;justify-content:center}tbw-grid .data-grid-row>.cell.editing input:not([type=checkbox]),tbw-grid .data-grid-row>.cell.editing select,tbw-grid .data-grid-row>.cell.editing textarea{width:100%;height:100%;flex:1 1 auto;min-width:0;border:var(--tbw-editing-border);padding:var(--tbw-padding-editing-input);font-size:var(--tbw-font-size-editor)}tbw-grid .tbw-editor-host{display:contents}}";function oo(n){const e=n.options;return e?typeof e=="function"?e():e:[]}function ro(n){return e=>{const t=n.editorParams,i=document.createElement("input");i.type="number",i.value=e.value!=null?String(e.value):"",t?.min!==void 0&&(i.min=String(t.min)),t?.max!==void 0&&(i.max=String(t.max)),t?.step!==void 0&&(i.step=String(t.step)),t?.placeholder&&(i.placeholder=t.placeholder);const o=()=>e.commit(i.value===""?null:Number(i.value));return i.addEventListener("blur",o),i.addEventListener("keydown",r=>{r.key==="Enter"&&o(),r.key==="Escape"&&e.cancel()}),i}}function so(){return n=>{const e=document.createElement("input");return e.type="checkbox",e.checked=!!n.value,e.addEventListener("change",()=>n.commit(e.checked)),e}}function lo(n){return e=>{const t=n.editorParams,i=document.createElement("input");return i.type="date",e.value instanceof Date&&(i.valueAsDate=e.value),t?.min&&(i.min=t.min),t?.max&&(i.max=t.max),t?.placeholder&&(i.placeholder=t.placeholder),i.addEventListener("change",()=>e.commit(i.valueAsDate)),i.addEventListener("keydown",o=>{o.key==="Escape"&&e.cancel()}),i}}function ao(n){return e=>{const t=n.editorParams,i=document.createElement("select");if(n.multi&&(i.multiple=!0),t?.includeEmpty){const s=document.createElement("option");s.value="",s.textContent=t.emptyLabel??"",i.appendChild(s)}oo(n).forEach(s=>{const l=document.createElement("option");l.value=String(s.value),l.textContent=s.label,(n.multi&&Array.isArray(e.value)&&e.value.includes(s.value)||!n.multi&&e.value===s.value)&&(l.selected=!0),i.appendChild(l)});const r=()=>{if(n.multi){const s=Array.from(i.selectedOptions).map(l=>l.value);e.commit(s)}else e.commit(i.value)};return i.addEventListener("change",r),i.addEventListener("blur",r),i.addEventListener("keydown",s=>{s.key==="Escape"&&e.cancel()}),i}}function co(n){return e=>{const t=n.editorParams,i=document.createElement("input");return i.type="text",i.value=e.value!=null?String(e.value):"",t?.maxLength!==void 0&&(i.maxLength=t.maxLength),t?.pattern&&(i.pattern=t.pattern),t?.placeholder&&(i.placeholder=t.placeholder),i.addEventListener("blur",()=>e.commit(i.value)),i.addEventListener("keydown",o=>{o.key==="Enter"&&e.commit(i.value),o.key==="Escape"&&e.cancel()}),i}}function Qt(n){switch(n.type){case"number":return ro(n);case"boolean":return so();case"date":return lo(n);case"select":return ao(n);default:return co(n)}}const Xe='input,select,textarea,[contenteditable="true"],[contenteditable=""],[tabindex]:not([tabindex="-1"])';function uo(n,e){if(e.editor)return e.editor;if(e.__editorTemplate)return"template";if(!e.type)return;const i=n.effectiveConfig?.typeDefaults;if(i?.[e.type]?.editor)return i[e.type].editor;const o=n.__frameworkAdapter;if(o?.getTypeDefault){const r=o.getTypeDefault(e.type);if(r?.editor)return r.editor}}function he(n){return!(typeof n!="string"||n==="__proto__"||n==="constructor"||n==="prototype")}function ho(n){const e=(n.__editingCellCount??0)+1;n.__editingCellCount=e,n.setAttribute("data-has-editing","")}function fo(n){n.__editingCellCount=0,n.removeAttribute("data-has-editing")}function fe(n,e){return n instanceof HTMLInputElement?n.type==="checkbox"?n.checked:n.type==="number"?n.value===""?null:Number(n.value):n.type==="date"?n.valueAsDate:n.value:e?.type==="number"&&n.value!==""?Number(n.value):n.value}function ei(n){}function go(n,e,t){const i=n.querySelector("input,textarea,select");i&&(i.addEventListener("blur",()=>{t(fe(i,e))}),i instanceof HTMLInputElement&&i.type==="checkbox"?i.addEventListener("change",()=>t(i.checked)):i instanceof HTMLSelectElement&&i.addEventListener("change",()=>t(fe(i,e))))}class po extends H{static manifest={ownedProperties:[{property:"editable",level:"column",description:'the "editable" column property',isUsed:e=>e===!0},{property:"editor",level:"column",description:'the "editor" column property'},{property:"editorParams",level:"column",description:'the "editorParams" column property'}]};name="editing";styles=no;get defaultConfig(){return{editOn:"click"}}#t=-1;#e=-1;#u=new Map;#d=new Set;#s=new Set;#l=!1;attach(e){super.attach(e);const t=this.disconnectSignal,i=e;i._activeEditRows=-1,i._rowEditSnapshots=new Map,Object.defineProperty(e,"changedRows",{get:()=>this.changedRows,configurable:!0}),Object.defineProperty(e,"changedRowIds",{get:()=>this.changedRowIds,configurable:!0}),e.resetChangedRows=o=>this.resetChangedRows(o),e.beginBulkEdit=(o,r)=>{r&&this.beginCellEdit(o,r)},document.addEventListener("keydown",o=>{o.key==="Escape"&&this.#t!==-1&&this.#f(this.#t,!0)},{capture:!0,signal:t}),document.addEventListener("mousedown",o=>{if(this.#t===-1)return;const r=i.findRenderedRowElement?.(this.#t);!r||(o.composedPath&&o.composedPath()||[]).includes(r)||queueMicrotask(()=>{this.#t!==-1&&this.#f(this.#t,!1)})},{signal:t})}detach(){this.#t=-1,this.#e=-1,this.#u.clear(),this.#d.clear(),this.#s.clear(),super.detach()}onCellClick(e){const t=this.grid,i=this.config.editOn??t.effectiveConfig?.editOn;if(i===!1||i==="manual"||i!=="click"&&i!=="dblclick")return!1;const o=e.originalEvent.type==="dblclick";if(i==="click"&&o||i==="dblclick"&&!o)return!1;const{rowIndex:r}=e;return t._columns?.some(l=>l.editable)?(e.originalEvent.stopPropagation(),this.beginBulkEdit(r),!0):!1}onKeyDown(e){const t=this.grid;if(e.key==="Escape"&&this.#t!==-1)return this.#f(this.#t,!0),!0;if(e.key===" "||e.key==="Spacebar"){const i=t._focusRow,o=t._focusCol;if(i>=0&&o>=0){const r=t._visibleColumns[o],s=t._rows[i];if(r?.editable&&r.type==="boolean"&&s){const l=r.field;if(he(l)){const d=!s[l];return this.#c(i,r,d,s),e.preventDefault(),this.requestRender(),!0}}}return!1}if(e.key==="Enter"&&!e.shiftKey){if(this.#t!==-1)return!1;const i=this.config.editOn??t.effectiveConfig?.editOn;if(i===!1||i==="manual")return!1;const o=t._focusRow,r=t._focusCol;if(o>=0&&t._columns?.some(l=>l.editable)){const l=t._visibleColumns[r],a=t._rows[o],d=l?.field??"",c=d&&a?a[d]:void 0,u=this.gridElement.querySelector(`[data-row="${o}"][data-col="${r}"]`),h=new CustomEvent("cell-activate",{cancelable:!0,bubbles:!0,detail:{rowIndex:o,colIndex:r,field:d,value:c,row:a,cellEl:u,trigger:"keyboard",originalEvent:e}});this.gridElement.dispatchEvent(h);const f=new CustomEvent("activate-cell",{cancelable:!0,bubbles:!0,detail:{row:o,col:r}});return this.gridElement.dispatchEvent(f),h.defaultPrevented||f.defaultPrevented?(e.preventDefault(),!0):(this.beginBulkEdit(o),!0)}return!1}return!1}processColumns(e){const t=this.grid,i=t.effectiveConfig?.typeDefaults,o=t.__frameworkAdapter;return!i&&!o?.getTypeDefault?e:e.map(r=>{if(!r.type)return r;let s;if(i?.[r.type]?.editorParams&&(s=i[r.type].editorParams),!s&&o?.getTypeDefault){const l=o.getTypeDefault(r.type);l?.editorParams&&(s=l.editorParams)}return s?{...r,editorParams:{...s,...r.editorParams}}:r})}afterRender(){const e=this.grid;if(this.#l&&(this.#l=!1,this.#w(e)),this.#s.size!==0)for(const t of this.#s){const[i,o]=t.split(":"),r=parseInt(i,10),s=parseInt(o,10),l=e.findRenderedRowElement?.(r);if(!l)continue;const a=l.querySelector(`.cell[data-col="${s}"]`);if(!a||a.classList.contains("editing"))continue;const d=e._rows[r],c=e._visibleColumns[s];d&&c&&this.#m(d,r,c,s,a,!0)}}onScrollRender(){this.afterRender()}get changedRows(){const e=[];for(const t of this.#d){const i=this.grid.getRow(t);i&&e.push(i)}return e}get changedRowIds(){return Array.from(this.#d)}get activeEditRow(){return this.#t}get activeEditCol(){return this.#e}isRowEditing(e){return this.#t===e}isCellEditing(e,t){return this.#s.has(`${e}:${t}`)}isRowChanged(e){const t=this.grid,i=t._rows[e];if(!i)return!1;try{const o=t.getRowId?.(i);return o?this.#d.has(o):!1}catch{return!1}}isRowChangedById(e){return this.#d.has(e)}resetChangedRows(e){const t=this.changedRows,i=this.changedRowIds;this.#d.clear(),this.#h(),e||this.emit("changed-rows-reset",{rows:t,ids:i}),this.grid._rowPool?.forEach(r=>r.classList.remove("changed"))}beginCellEdit(e,t){const i=this.grid,o=i._visibleColumns.findIndex(a=>a.field===t);if(o===-1||!i._visibleColumns[o]?.editable)return;const l=i.findRenderedRowElement?.(e)?.querySelector(`.cell[data-col="${o}"]`);l&&this.#n(e,o,l)}beginBulkEdit(e){const t=this.grid;if((this.config.editOn??t.effectiveConfig?.editOn)===!1||!t._columns?.some(l=>l.editable))return;const r=t.findRenderedRowElement?.(e);if(!r)return;const s=t._rows[e];this.#g(e,s),Array.from(r.children).forEach((l,a)=>{const d=t._visibleColumns[a];if(d?.editable){const c=l;c.classList.contains("editing")||this.#m(s,e,d,a,c,!0)}}),setTimeout(()=>{let l=r.querySelector(`.cell[data-col="${t._focusCol}"]`);if(l?.classList.contains("editing")||(l=r.querySelector(".cell.editing")),l?.classList.contains("editing")){const a=l.querySelector(Xe);try{a?.focus({preventScroll:!0})}catch{}}},0)}commitActiveRowEdit(){this.#t!==-1&&this.#f(this.#t,!1)}cancelActiveRowEdit(){this.#t!==-1&&this.#f(this.#t,!0)}#n(e,t,i){const o=this.grid,r=o._rows[e],s=o._visibleColumns[t];!r||!s?.editable||i.classList.contains("editing")||(this.#t!==e&&this.#g(e,r),this.#e=t,this.#m(r,e,s,t,i,!1))}#h(){const e=this.grid;e._activeEditRows=this.#t,e._rowEditSnapshots=this.#u}#g(e,t){this.#t!==e&&(this.#u.set(e,{...t}),this.#t=e,this.#h())}#f(e,t){if(this.#t!==e)return;const i=this.grid,o=this.#u.get(e),r=i._rows[e],s=i.findRenderedRowElement?.(e);let l;if(r)try{l=i.getRowId?.(r)}catch{}if(!t&&s&&r&&s.querySelectorAll(".cell.editing").forEach(d=>{const c=Number(d.getAttribute("data-col"));if(isNaN(c))return;const u=i._visibleColumns[c];if(!u)return;const h=d.querySelector("input,textarea,select");if(h){const f=fe(h,u);r[u.field]!==f&&this.#c(e,u,f,r)}}),t&&o&&r)Object.keys(o).forEach(a=>{r[a]=o[a]}),l&&this.#d.delete(l);else if(!t&&r){const a=l?this.#d.has(l):!1;this.emit("row-commit",{rowIndex:e,rowId:l??"",row:r,changed:a,changedRows:this.changedRows,changedRowIds:this.changedRowIds}),a&&this.isAnimationEnabled&&i.animateRow?.(e,"change")}this.#u.delete(e),this.#t=-1,this.#e=-1,this.#h();for(const a of this.#s)a.startsWith(`${e}:`)&&this.#s.delete(a);s&&(s.querySelectorAll(".cell.editing").forEach(a=>{a.classList.remove("editing"),fo(a.parentElement)}),this.requestRender()),this.#l=!0,s||(this.#w(i),this.#l=!1)}#c(e,t,i,o){const r=t.field;if(!he(r))return;const s=o[r];if(s===i)return;const l=this.grid;let a;try{a=this.grid.getRowId(o)}catch{}const d=a?!this.#d.has(a):!0,c=a?f=>this.grid.updateRow(a,f,"cascade"):ei;if(this.emitCancelable("cell-commit",{row:o,rowId:a??"",field:r,oldValue:s,value:i,rowIndex:e,changedRows:this.changedRows,changedRowIds:this.changedRowIds,firstTimeForRow:d,updateRow:c}))return;o[r]=i,a&&this.#d.add(a),this.#h();const h=l.findRenderedRowElement?.(e);h&&(h.classList.add("changed"),Pt(h,"change"))}#m(e,t,i,o,r,s){if(!i.editable||r.classList.contains("editing"))return;let l;try{l=this.grid.getRowId(e)}catch{}const a=l?C=>this.grid.updateRow(l,C,"cascade"):ei,d=he(i.field)?e[i.field]:void 0;r.classList.add("editing"),this.#s.add(`${t}:${o}`);const c=r.parentElement;c&&ho(c);let u=!1;const h=C=>{u||this.#t===-1||this.#c(t,i,C,e)},f=()=>{u=!0,he(i.field)&&(e[i.field]=d)},p=document.createElement("div");p.className="tbw-editor-host",r.innerHTML="",r.appendChild(p),p.addEventListener("keydown",C=>{C.key==="Enter"&&(C.stopPropagation(),C.preventDefault(),u=!0,this.#f(t,!1)),C.key==="Escape"&&(C.stopPropagation(),C.preventDefault(),f(),this.#f(t,!0))});const g=i,w=g.__editorTemplate,m=uo(this.grid,g)??Qt(i),y=d;if(m==="template"&&w)this.#a(p,g,e,d,h,f,s,t);else if(typeof m=="string"){const C=document.createElement(m);C.value=y,C.addEventListener("change",()=>h(C.value)),p.appendChild(C),s||queueMicrotask(()=>{p.querySelector(Xe)?.focus({preventScroll:!0})})}else if(typeof m=="function"){const C={row:e,rowId:l??"",value:y,field:i.field,column:i,commit:h,cancel:f,updateRow:a},T=m(C);typeof T=="string"?(p.innerHTML=T,go(p,i,h)):T instanceof Node&&p.appendChild(T),s||queueMicrotask(()=>{p.querySelector(Xe)?.focus({preventScroll:!0})})}else if(m&&typeof m=="object"){const C=document.createElement("div");C.setAttribute("data-external-editor",""),C.setAttribute("data-field",i.field),p.appendChild(C);const T={row:e,rowId:l??"",value:y,field:i.field,column:i,commit:h,cancel:f,updateRow:a};if(m.mount)try{m.mount({placeholder:C,context:T,spec:m})}catch(_){console.warn(`[tbw-grid] External editor mount error for column '${i.field}':`,_)}else this.grid.dispatchEvent(new CustomEvent("mount-external-editor",{detail:{placeholder:C,spec:m,context:T}}))}}#a(e,t,i,o,r,s,l,a){const d=t.__editorTemplate;if(!d)return;const c=d.cloneNode(!0),u=t.__compiledEditor;u?c.innerHTML=u({row:i,value:o,field:t.field,column:t,commit:r,cancel:s}):c.querySelectorAll("*").forEach(f=>{f.childNodes.length===1&&f.firstChild?.nodeType===Node.TEXT_NODE&&(f.textContent=f.textContent?.replace(/{{\s*value\s*}}/g,o==null?"":String(o)).replace(/{{\s*row\.([a-zA-Z0-9_]+)\s*}}/g,(p,g)=>{if(!he(g))return"";const w=i[g];return w==null?"":String(w)})||"")});const h=c.querySelector("input,textarea,select");if(h){h instanceof HTMLInputElement&&h.type==="checkbox"?h.checked=!!o:h.value=String(o??"");let f=!1;h.addEventListener("blur",()=>{f||r(fe(h,t))}),h.addEventListener("keydown",p=>{const g=p;g.key==="Enter"&&(g.stopPropagation(),g.preventDefault(),f=!0,r(fe(h,t)),this.#f(a,!1)),g.key==="Escape"&&(g.stopPropagation(),g.preventDefault(),s(),this.#f(a,!0))}),h instanceof HTMLInputElement&&h.type==="checkbox"&&h.addEventListener("change",()=>r(h.checked)),l||setTimeout(()=>h.focus({preventScroll:!0}),0)}e.appendChild(c)}#w(e){queueMicrotask(()=>{try{const t=e._focusRow,i=e._focusCol,o=e.findRenderedRowElement?.(t);if(o){Array.from(e._bodyEl.querySelectorAll(".cell-focus")).forEach(s=>s.classList.remove("cell-focus"));const r=o.querySelector(`.cell[data-row="${t}"][data-col="${i}"]`);r&&(r.classList.add("cell-focus"),r.setAttribute("aria-selected","true"),r.hasAttribute("tabindex")||r.setAttribute("tabindex","-1"),r.focus({preventScroll:!0}))}}catch{}})}}function ti(n,e=!0){if(n==null)return"";if(n instanceof Date)return n.toISOString();if(typeof n=="object")return JSON.stringify(n);const t=String(n);return e&&(t.includes(",")||t.includes('"')||t.includes(`
66
66
  `)||t.includes("\r"))?`"${t.replace(/"/g,'""')}"`:t}function wo(n,e,t,i={}){const o=i.delimiter??",",r=i.newline??`
67
67
  `,s=[],l=i.bom?"\uFEFF":"";if(t.includeHeaders!==!1){const a=e.map(d=>{const c=d.header||d.field,u=t.processHeader?t.processHeader(c,d.field):c;return ti(u)});s.push(a.join(o))}for(const a of n){const d=e.map(c=>{let u=a[c.field];return t.processCell&&(u=t.processCell(u,c.field,a)),ti(u)});s.push(d.join(o))}return l+s.join(r)}function Ze(n,e){const t=URL.createObjectURL(n),i=document.createElement("a");i.href=t,i.download=e,i.style.display="none",document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(t)}function mo(n,e){const t=new Blob([n],{type:"text/csv;charset=utf-8;"});Ze(t,e)}function ii(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function bo(n,e,t){let i=`<?xml version="1.0" encoding="UTF-8"?>
68
68
  <?mso-application progid="Excel.Sheet"?>
@@ -74,10 +74,10 @@ ${t}`}async#ce(){if(!M.#I){if(J.length>0){M.#I=J,M.#G();return}await new Promise
74
74
  <Row>`;for(const r of e){let s=o[r.field];t.processCell&&(s=t.processCell(s,r.field,o));let l="String",a="";s==null?a="":typeof s=="number"&&!isNaN(s)?(l="Number",a=String(s)):s instanceof Date?(l="DateTime",a=s.toISOString()):a=ii(String(s)),i+=`<Cell><Data ss:Type="${l}">${a}</Data></Cell>`}i+="</Row>"}return i+=`
75
75
  </Table>
76
76
  </Worksheet>
77
- </Workbook>`,i}function vo(n,e){const t=e.endsWith(".xls")?e:`${e}.xls`,i=new Blob([n],{type:"application/vnd.ms-excel;charset=utf-8;"});Ze(i,t)}class yo extends H{name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;performExport(e,t){const i=this.config,o={format:e,fileName:t?.fileName??i.fileName??"export",includeHeaders:t?.includeHeaders??i.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,columns:t?.columns,rowIndices:t?.rowIndices};let r=[...this.columns];if(i.onlyVisible&&(r=r.filter(a=>!a.hidden&&!a.field.startsWith("__"))),t?.columns){const a=new Set(t.columns);r=r.filter(d=>a.has(d.field))}let s=[...this.rows];if(i.onlySelected){const a=this.getSelectionState();a?.selected?.size&&(s=[...a.selected].sort((c,u)=>c-u).map(c=>this.rows[c]).filter(Boolean))}t?.rowIndices&&(s=t.rowIndices.map(a=>this.rows[a]).filter(Boolean)),this.isExportingFlag=!0;let l=o.fileName;try{switch(e){case"csv":{const a=wo(s,r,o,{bom:!0});l=l.endsWith(".csv")?l:`${l}.csv`,mo(a,l);break}case"excel":{const a=bo(s,r,o);l=l.endsWith(".xls")?l:`${l}.xls`,vo(a,l);break}case"json":{const a=s.map(u=>{const h={};for(const f of r){let p=u[f.field];o.processCell&&(p=o.processCell(p,f.field,u)),h[f.field]=p}return h}),d=JSON.stringify(a,null,2);l=l.endsWith(".json")?l:`${l}.json`;const c=new Blob([d],{type:"application/json"});Ze(c,l);break}}this.lastExportInfo={format:e,timestamp:new Date},this.emit("export-complete",{format:e,fileName:l,rowCount:s.length,columnCount:r.length})}finally{this.isExportingFlag=!1}}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}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}}function Co(n){const{totalRows:e,viewportHeight:t,scrollTop:i,rowHeight:o,overscan:r}=n,s=Math.ceil(t/o);let l=Math.floor(i/o)-r;l<0&&(l=0);let a=l+s+r*2;return a>e&&(a=e),a===e&&l>0&&(l=Math.max(0,a-s-r*2)),{start:l,end:a,offsetY:l*o,totalHeight:e*o}}function xo(n,e){return n<=e}function Eo(n,e,t=!1){const i=n[e.field];if(e.operator==="blank")return i==null||i==="";if(e.operator==="notBlank")return i!=null&&i!=="";if(i==null)return!1;const o=String(i),r=t?o:o.toLowerCase(),s=t?String(e.value):String(e.value).toLowerCase();switch(e.operator){case"contains":return r.includes(s);case"notContains":return!r.includes(s);case"equals":return r===s;case"notEquals":return r!==s;case"startsWith":return r.startsWith(s);case"endsWith":return r.endsWith(s);case"lessThan":return Number(i)<Number(e.value);case"lessThanOrEqual":return Number(i)<=Number(e.value);case"greaterThan":return Number(i)>Number(e.value);case"greaterThanOrEqual":return Number(i)>=Number(e.value);case"between":return Number(i)>=Number(e.value)&&Number(i)<=Number(e.valueTo);case"in":return Array.isArray(e.value)&&e.value.includes(i);case"notIn":return Array.isArray(e.value)&&!e.value.includes(i);default:return!0}}function Ro(n,e,t=!1){return e.length?n.filter(i=>e.every(o=>Eo(i,o,t))):n}function So(n){return JSON.stringify(n.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo})))}function ni(n,e){const t=new Set;for(const i of n){const o=i[e];o!=null&&t.add(o)}return[...t].sort((i,o)=>typeof i=="number"&&typeof o=="number"?i-o:String(i).localeCompare(String(o)))}const _o='@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)}tbw-grid .tbw-quick-filter-input:focus{outline:none;border-color:var(--tbw-color-accent)}tbw-grid .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-grid .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}tbw-grid .tbw-filter-btn:hover,tbw-grid .tbw-filter-btn.active{opacity:1;visibility:visible;display:inline-flex}tbw-grid .tbw-filter-btn.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}tbw-grid .header-row .cell:hover .tbw-filter-btn,tbw-grid .header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}',Ao="@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);left:anchor(left);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-action-btn{background:transparent;border:none;color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));cursor:pointer;font-size:var(--tbw-font-size-xs, .75rem);padding:2px 0}.tbw-filter-action-btn:hover{text-decoration:underline}.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-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)}}";class V extends H{name="filtering";styles=_o;get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return this.grid.effectiveConfig?.filterable!==!1}isColumnFilterable(e){return this.isFilteringEnabled()?e.filterable!==!1:!1}filters=new Map;cachedResult=null;cacheKey=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=new Map;excludedValues=new Map;panelAbortController=null;globalStylesInjected=!1;static DEFAULT_LIST_ITEM_HEIGHT=28;static LIST_OVERSCAN=3;static LIST_BYPASS_THRESHOLD=50;getListItemHeight(){if(this.panelElement){const e=getComputedStyle(this.panelElement).getPropertyValue("--tbw-filter-item-height");if(e&&e.trim()){const t=parseFloat(e);if(!isNaN(t)&&t>0)return t}}return V.DEFAULT_LIST_ITEM_HEIGHT}syncExcludedValues(e,t){t?t.type==="set"&&t.operator==="notIn"&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):t.type==="set"&&this.excludedValues.delete(e):this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}processRows(e){const t=[...this.filters.values()];if(!t.length)return[...e];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:[...e];const i=So(t);if(this.cacheKey===i&&this.cachedResult)return this.cachedResult;const o=Ro([...e],t,this.config.caseSensitive);return this.cachedResult=o,this.cacheKey=i,o}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(i=>{const o=i.getAttribute("data-col");if(o===null)return;const r=this.visibleColumns[parseInt(o,10)];if(!r||!this.isColumnFilterable(r)||$(r))return;const s=r.field;if(!s)return;const l=this.filters.has(s);let a=i.querySelector(".tbw-filter-btn");if(a){const u=a.classList.contains("active");if(a.classList.toggle("active",l),i.classList.toggle("filtered",l),u!==l){const h=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(h))}return}a=document.createElement("button"),a.className="tbw-filter-btn",a.setAttribute("aria-label",`Filter ${r.header??s}`);const d=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(d)),l&&(a.classList.add("active"),i.classList.add("filtered")),a.addEventListener("click",u=>{u.stopPropagation(),this.toggleFilterPanel(s,r,a)});const c=i.querySelector(".resize-handle");c?i.insertBefore(a,c):i.appendChild(a)})}setFilter(e,t){if(t===null)this.filters.delete(e),this.syncExcludedValues(e,null);else{const i={...t,field:e};this.filters.set(e,i),this.syncExcludedValues(e,i)}this.cachedResult=null,this.cacheKey=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e){this.filters.clear(),this.excludedValues.clear();for(const t of e)this.filters.set(t.field,t),this.syncExcludedValues(t.field,t);this.cachedResult=null,this.cacheKey=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),this.requestRender()}clearAllFilters(){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal()}clearFieldFilter(e){this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal()}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){return ni(this.sourceRows,e)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const o of t.classList)o.startsWith("tbw-")||o==="selecting"||e.classList.add(o);const i=t.dataset.theme;i&&(e.dataset.theme=i)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles")){this.globalStylesInjected=!0;return}const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent=Ao,document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,i){if(this.openPanelField===e){this.closeFilterPanel();return}this.closeFilterPanel();const o=document.createElement("div");if(o.className="tbw-filter-panel",this.copyGridThemeContext(o),this.isAnimationEnabled&&o.classList.add("tbw-filter-panel-animated"),this.panelElement=o,this.openPanelField=e,this.config.valuesHandler){o.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(o),this.positionPanel(o,i),this.setupPanelCloseHandler(o,i),this.config.valuesHandler(e,t).then(s=>{this.openPanelField!==e||!this.panelElement||(o.innerHTML="",this.renderPanelContent(e,t,o,s))});return}const r=ni(this.sourceRows,e);document.body.appendChild(o),this.positionPanel(o,i),this.renderPanelContent(e,t,o,r),this.setupPanelCloseHandler(o,i)}renderPanelContent(e,t,i,o){let r=this.excludedValues.get(e);r||(r=new Set,this.excludedValues.set(e,r));const s=this.searchText.get(e)??"",l={field:e,column:t,uniqueValues:o,excludedValues:r,searchText:s,applySetFilter:d=>{this.applySetFilter(e,d),this.closeFilterPanel()},applyTextFilter:(d,c,u)=>{this.applyTextFilter(e,d,c,u),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 d=this.grid.effectiveConfig.typeDefaults?.[t.type];d?.filterPanelRenderer&&(d.filterPanelRenderer(i,l),a=i.children.length>0)}if(!a){const d=t.type;d==="number"?this.renderNumberFilterPanel(i,l,o):d==="date"?this.renderDateFilterPanel(i,l,o):this.renderDefaultFilterPanel(i,l,o,r)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController,setTimeout(()=>{document.addEventListener("click",i=>{!e.contains(i.target)&&i.target!==t&&this.closeFilterPanel()},{signal:this.panelAbortController?.signal})},0)}closeFilterPanel(){const e=this.panelElement;e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return V.supportsAnchorPositioning===null&&(V.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),V.supportsAnchorPositioning}positionPanel(e,t){const o=t.closest(".cell")??t;if(o.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=o,V.checkAnchorPositioningSupport()){requestAnimationFrame(()=>{const s=e.getBoundingClientRect(),l=o.getBoundingClientRect();s.top<l.top&&e.classList.add("tbw-filter-panel-above")});return}const r=o.getBoundingClientRect();e.style.position="fixed",e.style.top=`${r.bottom+4}px`,e.style.left=`${r.left}px`,requestAnimationFrame(()=>{const s=e.getBoundingClientRect();s.right>window.innerWidth-8&&(e.style.left=`${r.right-s.width}px`),s.bottom>window.innerHeight-8&&(e.style.top=`${r.top-s.height-4}px`,e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,t,i,o){const{field:r}=t,s=this.getListItemHeight(),l=document.createElement("div");l.className="tbw-filter-search";const a=document.createElement("input");a.type="text",a.placeholder="Search...",a.className="tbw-filter-search-input",a.value=this.searchText.get(r)??"",l.appendChild(a),e.appendChild(l);const d=document.createElement("div");d.className="tbw-filter-actions";const c=document.createElement("label");c.className="tbw-filter-value-item",c.style.padding="0",c.style.margin="0";const u=document.createElement("input");u.type="checkbox",u.className="tbw-filter-checkbox";const h=document.createElement("span");h.textContent="Select All",c.appendChild(u),c.appendChild(h),d.appendChild(c);const f=()=>{const S=[...m.values()],R=S.every(v=>v),k=S.every(v=>!v);u.checked=R,u.indeterminate=!R&&!k};u.addEventListener("change",()=>{const S=u.checked;for(const R of m.keys())m.set(R,S);f(),T()}),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-values";const g=document.createElement("div");g.className="tbw-filter-values-spacer",p.appendChild(g);const w=document.createElement("div");w.className="tbw-filter-values-content",p.appendChild(w);const m=new Map;i.forEach(S=>{const R=S==null?"__null__":String(S);m.set(R,!o.has(S))}),f();let y=[];const C=(S,R)=>{const k=S==null?"(Blank)":String(S),v=S==null?"__null__":String(S),A=document.createElement("label");A.className="tbw-filter-value-item",A.style.position="absolute",A.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${R})`,A.style.left="0",A.style.right="0",A.style.boxSizing="border-box";const O=document.createElement("input");O.type="checkbox",O.className="tbw-filter-checkbox",O.checked=m.get(v)??!0,O.dataset.value=v,O.addEventListener("change",()=>{m.set(v,O.checked),f()});const Z=document.createElement("span");return Z.textContent=k,A.appendChild(O),A.appendChild(Z),A},T=()=>{const S=y.length,R=p.clientHeight,k=p.scrollTop;if(g.style.height=`${S*s}px`,xo(S,V.LIST_BYPASS_THRESHOLD/3)){w.innerHTML="",w.style.transform="translateY(0px)",y.forEach((A,O)=>{w.appendChild(C(A,O))});return}const v=Co({totalRows:S,viewportHeight:R,scrollTop:k,rowHeight:s,overscan:V.LIST_OVERSCAN});w.style.transform=`translateY(${v.offsetY}px)`,w.innerHTML="";for(let A=v.start;A<v.end;A++)w.appendChild(C(y[A],A-v.start))},_=S=>{const R=this.config.caseSensitive??!1,k=R?S:S.toLowerCase();if(y=i.filter(v=>{const A=v==null?"(Blank)":String(v),O=R?A:A.toLowerCase();return!S||O.includes(k)}),y.length===0){g.style.height="0px",w.innerHTML="";const v=document.createElement("div");v.className="tbw-filter-no-match",v.textContent="No matching values",w.appendChild(v);return}T()};p.addEventListener("scroll",()=>{y.length>0&&T()},{passive:!0}),_(a.value),e.appendChild(p);let E;a.addEventListener("input",()=>{clearTimeout(E),E=setTimeout(()=>{this.searchText.set(r,a.value),_(a.value)},this.config.debounceMs??150)});const P=document.createElement("div");P.className="tbw-filter-buttons";const L=document.createElement("button");L.className="tbw-filter-apply-btn",L.textContent="Apply",L.addEventListener("click",()=>{const S=[];for(const[R,k]of m)if(!k)if(R==="__null__")S.push(null);else{const v=i.find(A=>String(A)===R);S.push(v!==void 0?v:R)}t.applySetFilter(S)}),P.appendChild(L);const b=document.createElement("button");b.className="tbw-filter-clear-btn",b.textContent="Clear Filter",b.addEventListener("click",()=>{t.clearFilter()}),P.appendChild(b),e.appendChild(P)}renderNumberFilterPanel(e,t,i){const{field:o,column:r}=t,s=r.filterParams,l=r.editorParams,a=(D,se)=>{if(typeof D=="number")return D;if(typeof D=="string"){const we=parseFloat(D);return isNaN(we)?se:we}return se},d=i.filter(D=>typeof D=="number"&&!isNaN(D)),c=d.length>0?Math.min(...d):0,u=d.length>0?Math.max(...d):100,h=a(s?.min??l?.min,c),f=a(s?.max??l?.max,u),p=s?.step??l?.step??1,g=this.filters.get(o);let w=h,m=f;g?.operator==="between"?(w=a(g.value,h),m=a(g.valueTo,f)):g?.operator==="greaterThanOrEqual"?w=a(g.value,h):g?.operator==="lessThanOrEqual"&&(m=a(g.value,f));const y=document.createElement("div");y.className="tbw-filter-range-inputs";const C=document.createElement("div");C.className="tbw-filter-range-group";const T=document.createElement("label");T.textContent="Min",T.className="tbw-filter-range-label";const _=document.createElement("input");_.type="number",_.className="tbw-filter-range-input",_.min=String(h),_.max=String(f),_.step=String(p),_.value=String(w),C.appendChild(T),C.appendChild(_),y.appendChild(C);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",y.appendChild(E);const P=document.createElement("div");P.className="tbw-filter-range-group";const L=document.createElement("label");L.textContent="Max",L.className="tbw-filter-range-label";const b=document.createElement("input");b.type="number",b.className="tbw-filter-range-input",b.min=String(h),b.max=String(f),b.step=String(p),b.value=String(m),P.appendChild(L),P.appendChild(b),y.appendChild(P),e.appendChild(y);const S=document.createElement("div");S.className="tbw-filter-range-slider";const R=document.createElement("div");R.className="tbw-filter-range-track";const k=document.createElement("div");k.className="tbw-filter-range-fill";const v=document.createElement("input");v.type="range",v.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",v.min=String(h),v.max=String(f),v.step=String(p),v.value=String(w);const A=document.createElement("input");A.type="range",A.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",A.min=String(h),A.max=String(f),A.step=String(p),A.value=String(m),S.appendChild(R),S.appendChild(k),S.appendChild(v),S.appendChild(A),e.appendChild(S);const O=()=>{const D=parseFloat(v.value),se=parseFloat(A.value),we=f-h,Di=(D-h)/we*100,rs=(se-h)/we*100;k.style.left=`${Di}%`,k.style.width=`${rs-Di}%`};v.addEventListener("input",()=>{const D=Math.min(parseFloat(v.value),parseFloat(A.value));v.value=String(D),_.value=String(D),O()}),A.addEventListener("input",()=>{const D=Math.max(parseFloat(A.value),parseFloat(v.value));A.value=String(D),b.value=String(D),O()}),_.addEventListener("input",()=>{let D=parseFloat(_.value)||h;D=Math.max(h,Math.min(D,parseFloat(b.value))),v.value=String(D),O()}),b.addEventListener("input",()=>{let D=parseFloat(b.value)||f;D=Math.min(f,Math.max(D,parseFloat(_.value))),A.value=String(D),O()}),O();const Z=document.createElement("div");Z.className="tbw-filter-buttons";const Ae=document.createElement("button");Ae.className="tbw-filter-apply-btn",Ae.textContent="Apply",Ae.addEventListener("click",()=>{const D=parseFloat(_.value),se=parseFloat(b.value);t.applyTextFilter("between",D,se)}),Z.appendChild(Ae);const Te=document.createElement("button");Te.className="tbw-filter-clear-btn",Te.textContent="Clear Filter",Te.addEventListener("click",()=>{t.clearFilter()}),Z.appendChild(Te),e.appendChild(Z)}renderDateFilterPanel(e,t,i){const{field:o,column:r}=t,s=r.filterParams,l=r.editorParams,a=i.filter(v=>v instanceof Date||typeof v=="string"&&!isNaN(Date.parse(v))).map(v=>v instanceof Date?v:new Date(v)).filter(v=>!isNaN(v.getTime())),d=a.length>0?new Date(Math.min(...a.map(v=>v.getTime()))):null,c=a.length>0?new Date(Math.max(...a.map(v=>v.getTime()))):null,u=v=>v?v.toISOString().split("T")[0]:"",h=v=>v?typeof v=="string"?v:typeof v=="number"?u(new Date(v)):"":"",f=h(s?.min)||h(l?.min)||u(d),p=h(s?.max)||h(l?.max)||u(c),g=this.filters.get(o);let w="",m="";g?.operator==="between"?(w=h(g.value)||"",m=h(g.valueTo)||""):g?.operator==="greaterThanOrEqual"?w=h(g.value)||"":g?.operator==="lessThanOrEqual"&&(m=h(g.value)||"");const y=document.createElement("div");y.className="tbw-filter-date-range";const C=document.createElement("div");C.className="tbw-filter-date-group";const T=document.createElement("label");T.textContent="From",T.className="tbw-filter-range-label";const _=document.createElement("input");_.type="date",_.className="tbw-filter-date-input",f&&(_.min=f),p&&(_.max=p),_.value=w,C.appendChild(T),C.appendChild(_),y.appendChild(C);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",y.appendChild(E);const P=document.createElement("div");P.className="tbw-filter-date-group";const L=document.createElement("label");L.textContent="To",L.className="tbw-filter-range-label";const b=document.createElement("input");b.type="date",b.className="tbw-filter-date-input",f&&(b.min=f),p&&(b.max=p),b.value=m,P.appendChild(L),P.appendChild(b),y.appendChild(P),e.appendChild(y);const S=document.createElement("div");S.className="tbw-filter-buttons";const R=document.createElement("button");R.className="tbw-filter-apply-btn",R.textContent="Apply",R.addEventListener("click",()=>{const v=_.value,A=b.value;v&&A?t.applyTextFilter("between",v,A):v?t.applyTextFilter("greaterThanOrEqual",v):A?t.applyTextFilter("lessThanOrEqual",A):t.clearFilter()}),S.appendChild(R);const k=document.createElement("button");k.className="tbw-filter-clear-btn",k.textContent="Clear Filter",k.addEventListener("click",()=>{t.clearFilter()}),S.appendChild(k),e.appendChild(S)}applySetFilter(e,t){this.excludedValues.set(e,new Set(t)),t.length===0?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t}),this.applyFiltersInternal()}applyTextFilter(e,t,i,o){this.filters.set(e,{field:e,type:"text",operator:t,value:i,valueTo:o}),this.applyFiltersInternal()}applyFiltersInternal(){this.cachedResult=null,this.cacheKey=null;const e=[...this.filters.values()];if(this.config.filterHandler){const t=this.grid;t.setAttribute("aria-busy","true");const i=this.config.filterHandler(e,this.sourceRows),o=r=>{t.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,this.emit("filter-change",{filters:e,filteredRowCount:r.length}),this.requestRender()};i&&typeof i.then=="function"?i.then(o):o(i);return}this.emit("filter-change",{filters:e,filteredRowCount:0}),this.requestRender()}getColumnState(e){const t=this.filters.get(e);if(t)return{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}}applyColumnState(e,t){if(!t.filter){this.filters.delete(e);return}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}}function oi(n){if(!n.length)return[];const e=new Map,t=[],i=(s,l)=>{if(!l.length)return;const a=t[t.length-1];if(a&&a.implicit&&a.firstIndex+a.columns.length===s){a.columns.push(...l);return}t.push({id:"__implicit__"+s,label:void 0,columns:l,firstIndex:s,implicit:!0})};let o=[],r=0;return n.forEach((s,l)=>{const a=s.group;if(!a){o.length===0&&(r=l),o.push(s);return}o.length&&(i(r,o.slice()),o=[]);const d=typeof a=="string"?a:a.id;let c=e.get(d);c||(c={id:d,label:typeof a=="string"?void 0:a.label,columns:[],firstIndex:l},e.set(d,c),t.push(c)),c.columns.push(s)}),o.length&&i(r,o),t.length===1&&t[0].implicit&&t[0].columns.length===n.length?[]:t}function To(n,e,t){if(!e.length||!n)return;const i=new Map;for(const r of e)for(const s of r.columns)s.field&&i.set(s.field,r.id);const o=Array.from(n.querySelectorAll(".cell[data-field]"));o.forEach(r=>{const s=r.getAttribute("data-field")||"",l=i.get(s);l&&(r.classList.add("grouped"),r.getAttribute("data-group")||r.setAttribute("data-group",l))});for(const r of e){const s=r.columns[r.columns.length-1],l=o.find(a=>a.getAttribute("data-field")===s.field);l&&l.classList.add("group-end")}}function ko(n,e){if(n.length===0)return null;const t=document.createElement("div");t.className="header-group-row",t.setAttribute("role","row");for(const i of n){const o=i.columns[0],r=o?e.findIndex(d=>d.field===o.field):-1;if(r===-1)continue;const s=String(i.id).startsWith("__implicit__"),l=s?"":i.label||i.id,a=document.createElement("div");a.className="cell header-group-cell",s&&a.classList.add("implicit-group"),a.setAttribute("data-group",String(i.id)),a.style.gridColumn=`${r+1} / span ${i.columns.length}`,a.textContent=l,t.appendChild(a)}return t}function Po(n){return n.some(e=>e.group!=null)}const Lo="@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;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)}}";class Do extends H{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}]};name="groupingColumns";styles=Lo;get defaultConfig(){return{showGroupBorders:!0}}groups=[];isActive=!1;detach(){this.groups=[],this.isActive=!1}static detect(e,t){if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const i=t?.columns;return Array.isArray(i)?Po(i):!1}processColumns(e){const t=this.grid?.gridConfig?.columnGroups;let i;if(t&&Array.isArray(t)&&t.length>0){const r=new Map;for(const s of t)for(const l of s.children)r.set(l,{id:s.id,label:s.header});i=e.map(s=>{const l=r.get(s.field);return l&&!s.group?{...s,group:l}:s})}else i=[...e];const o=oi(i);return o.length===0?(this.isActive=!1,this.groups=[],i):(this.isActive=!0,this.groups=o,i)}afterRender(){if(!this.isActive){const a=this.gridElement?.querySelector(".header")?.querySelector(".header-group-row");a&&a.remove();return}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const i=this.columns,o=oi(i);if(o.length===0)return;const r=ko(o,i);if(r){r.classList.toggle("no-borders",!this.config.showGroupBorders);const l=e.querySelector(".header-row");l?e.insertBefore(r,l):e.appendChild(r)}const s=e.querySelector(".header-row");s&&(s.classList.toggle("no-group-borders",!this.config.showGroupBorders),To(s,o)),this.#t(o)}#t(e){if(!this.config.showGroupBorders)return;const t=this.gridElement;if(!t)return;const i=new Set;for(const r of e){const s=r.columns[r.columns.length-1];s?.field&&i.add(s.field)}const o=t.querySelectorAll(".rows .cell[data-field]");for(const r of o){const s=r.getAttribute("data-field");s&&i.has(s)?r.classList.add("group-end"):r.classList.remove("group-end")}}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){const t=this.groups.find(i=>i.id===e);return t?t.columns:[]}refresh(){this.requestRender()}}const Je={sum:(n,e)=>n.reduce((t,i)=>t+(Number(i[e])||0),0),avg:(n,e)=>{const t=n.reduce((i,o)=>i+(Number(o[e])||0),0);return n.length?t/n.length:0},count:n=>n.length,min:(n,e)=>Math.min(...n.map(t=>Number(t[e])||1/0)),max:(n,e)=>Math.max(...n.map(t=>Number(t[e])||-1/0)),first:(n,e)=>n[0]?.[e],last:(n,e)=>n[n.length-1]?.[e]},ge=new Map,K={register(n,e){ge.set(n,e)},unregister(n){ge.delete(n)},get(n){if(n!==void 0)return typeof n=="function"?n:ge.get(n)??Je[n]},run(n,e,t,i){const o=this.get(n);return o?o(e,t,i):void 0},has(n){return ge.has(n)||n in Je},list(){return[...Object.keys(Je),...ge.keys()]}},ri={sum:n=>n.reduce((e,t)=>e+t,0),avg:n=>n.length?n.reduce((e,t)=>e+t,0)/n.length:0,count:n=>n.length,min:n=>n.length?Math.min(...n):0,max:n=>n.length?Math.max(...n):0,first:n=>n[0]??0,last:n=>n[n.length-1]??0};function Ho(n){return ri[n]??ri.sum}K.register.bind(K),K.unregister.bind(K);const si=K.get.bind(K),Qe=K.run.bind(K);K.list.bind(K);function li({rows:n,config:e,expanded:t,initialExpanded:i}){const o=e.groupOn;if(typeof o!="function")return[];const r={key:"__root__",value:null,depth:-1,rows:[],children:new Map};if(n.forEach(d=>{let c=o(d);c==null||c===!1?c=["__ungrouped__"]:Array.isArray(c)||(c=[c]);let u=r;c.forEach((h,f)=>{const p=h==null?"∅":String(h),g=u.key==="__root__"?p:u.key+"||"+p;let w=u.children.get(p);w||(w={key:g,value:h,depth:f,rows:[],children:new Map,parent:u},u.children.set(p,w)),u=w}),u.rows.push(d)}),r.children.size===1&&r.children.has("__ungrouped__")&&r.children.get("__ungrouped__").rows.length===n.length)return[];const s=new Set([...t,...i??[]]),l=[],a=d=>{if(d===r){d.children.forEach(u=>a(u));return}const c=s.has(d.key);l.push({kind:"group",key:d.key,value:d.value,depth:d.depth,rows:d.rows,expanded:c}),c&&(d.children.size?d.children.forEach(u=>a(u)):d.rows.forEach(u=>l.push({kind:"data",row:u,rowIndex:n.indexOf(u)})))};return a(r),l}function Io(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function Mo(n){const e=new Set;for(const t of n)t.kind==="group"&&e.add(t.key);return e}function No(){return new Set}function Oo(n,e){if(n===!0)return new Set(e);if(n===!1||n==null)return new Set;if(typeof n=="number"){const t=e[n];return t?new Set([t]):new Set}return typeof n=="string"?new Set([n]):Array.isArray(n)?new Set(n):new Set}function zo(n){return n.filter(e=>e.kind==="group").map(e=>e.key)}function Fo(n){return n.kind!=="group"?0:n.rows.length}const qo="@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)}.group-row:hover{background:var(--tbw-grouping-rows-bg-hover, var(--tbw-color-row-hover))}.group-toggle{cursor:pointer;-webkit-user-select:none;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}}}";class Go extends H{static manifest={configRules:[{id:"groupingRows/accordion-defaultExpanded",severity:"warn",message:`"accordion: true" and "defaultExpanded" (non-false) are used together.
77
+ </Workbook>`,i}function vo(n,e){const t=e.endsWith(".xls")?e:`${e}.xls`,i=new Blob([n],{type:"application/vnd.ms-excel;charset=utf-8;"});Ze(i,t)}class yo extends H{name="export";get defaultConfig(){return{fileName:"export",includeHeaders:!0,onlyVisible:!0,onlySelected:!1}}isExportingFlag=!1;lastExportInfo=null;performExport(e,t){const i=this.config,o={format:e,fileName:t?.fileName??i.fileName??"export",includeHeaders:t?.includeHeaders??i.includeHeaders,processCell:t?.processCell,processHeader:t?.processHeader,columns:t?.columns,rowIndices:t?.rowIndices};let r=[...this.columns];if(i.onlyVisible&&(r=r.filter(a=>!a.hidden&&!a.field.startsWith("__"))),t?.columns){const a=new Set(t.columns);r=r.filter(d=>a.has(d.field))}let s=[...this.rows];if(i.onlySelected){const a=this.getSelectionState();a?.selected?.size&&(s=[...a.selected].sort((c,u)=>c-u).map(c=>this.rows[c]).filter(Boolean))}t?.rowIndices&&(s=t.rowIndices.map(a=>this.rows[a]).filter(Boolean)),this.isExportingFlag=!0;let l=o.fileName;try{switch(e){case"csv":{const a=wo(s,r,o,{bom:!0});l=l.endsWith(".csv")?l:`${l}.csv`,mo(a,l);break}case"excel":{const a=bo(s,r,o);l=l.endsWith(".xls")?l:`${l}.xls`,vo(a,l);break}case"json":{const a=s.map(u=>{const h={};for(const f of r){let p=u[f.field];o.processCell&&(p=o.processCell(p,f.field,u)),h[f.field]=p}return h}),d=JSON.stringify(a,null,2);l=l.endsWith(".json")?l:`${l}.json`;const c=new Blob([d],{type:"application/json"});Ze(c,l);break}}this.lastExportInfo={format:e,timestamp:new Date},this.emit("export-complete",{format:e,fileName:l,rowCount:s.length,columnCount:r.length})}finally{this.isExportingFlag=!1}}getSelectionState(){try{return this.grid?.getPluginState?.("selection")??null}catch{return null}}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}}function Co(n){const{totalRows:e,viewportHeight:t,scrollTop:i,rowHeight:o,overscan:r}=n,s=Math.ceil(t/o);let l=Math.floor(i/o)-r;l<0&&(l=0);let a=l+s+r*2;return a>e&&(a=e),a===e&&l>0&&(l=Math.max(0,a-s-r*2)),{start:l,end:a,offsetY:l*o,totalHeight:e*o}}function xo(n,e){return n<=e}function Eo(n,e,t=!1){const i=n[e.field];if(e.operator==="blank")return i==null||i==="";if(e.operator==="notBlank")return i!=null&&i!=="";if(i==null)return!1;const o=String(i),r=t?o:o.toLowerCase(),s=t?String(e.value):String(e.value).toLowerCase();switch(e.operator){case"contains":return r.includes(s);case"notContains":return!r.includes(s);case"equals":return r===s;case"notEquals":return r!==s;case"startsWith":return r.startsWith(s);case"endsWith":return r.endsWith(s);case"lessThan":return Number(i)<Number(e.value);case"lessThanOrEqual":return Number(i)<=Number(e.value);case"greaterThan":return Number(i)>Number(e.value);case"greaterThanOrEqual":return Number(i)>=Number(e.value);case"between":return Number(i)>=Number(e.value)&&Number(i)<=Number(e.valueTo);case"in":return Array.isArray(e.value)&&e.value.includes(i);case"notIn":return Array.isArray(e.value)&&!e.value.includes(i);default:return!0}}function Ro(n,e,t=!1){return e.length?n.filter(i=>e.every(o=>Eo(i,o,t))):n}function So(n){return JSON.stringify(n.map(e=>({field:e.field,operator:e.operator,value:e.value,valueTo:e.valueTo})))}function ni(n,e){const t=new Set;for(const i of n){const o=i[e];o!=null&&t.add(o)}return[...t].sort((i,o)=>typeof i=="number"&&typeof o=="number"?i-o:String(i).localeCompare(String(o)))}const _o='@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)}tbw-grid .tbw-quick-filter-input:focus{outline:none;border-color:var(--tbw-color-accent)}tbw-grid .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-grid .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}tbw-grid .tbw-filter-btn:hover,tbw-grid .tbw-filter-btn.active{opacity:1;visibility:visible;display:inline-flex}tbw-grid .tbw-filter-btn.active{color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6))}tbw-grid .header-row .cell:hover .tbw-filter-btn,tbw-grid .header-row .cell.filtered .tbw-filter-btn{display:inline-flex;visibility:visible}}',Ao="@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);left:anchor(left);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-action-btn{background:transparent;border:none;color:var(--tbw-filter-accent, var(--tbw-color-accent, #3b82f6));cursor:pointer;font-size:var(--tbw-font-size-xs, .75rem);padding:2px 0}.tbw-filter-action-btn:hover{text-decoration:underline}.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-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)}}";class K extends H{name="filtering";styles=_o;get defaultConfig(){return{debounceMs:300,caseSensitive:!1,trimInput:!0,useWorker:!0}}isFilteringEnabled(){return this.grid.effectiveConfig?.filterable!==!1}isColumnFilterable(e){return this.isFilteringEnabled()?e.filterable!==!1:!1}filters=new Map;cachedResult=null;cacheKey=null;openPanelField=null;panelElement=null;panelAnchorElement=null;searchText=new Map;excludedValues=new Map;panelAbortController=null;globalStylesInjected=!1;static DEFAULT_LIST_ITEM_HEIGHT=28;static LIST_OVERSCAN=3;static LIST_BYPASS_THRESHOLD=50;getListItemHeight(){if(this.panelElement){const e=getComputedStyle(this.panelElement).getPropertyValue("--tbw-filter-item-height");if(e&&e.trim()){const t=parseFloat(e);if(!isNaN(t)&&t>0)return t}}return K.DEFAULT_LIST_ITEM_HEIGHT}syncExcludedValues(e,t){t?t.type==="set"&&t.operator==="notIn"&&Array.isArray(t.value)?this.excludedValues.set(e,new Set(t.value)):t.type==="set"&&this.excludedValues.delete(e):this.excludedValues.delete(e)}attach(e){super.attach(e),this.injectGlobalStyles()}detach(){this.filters.clear(),this.cachedResult=null,this.cacheKey=null,this.openPanelField=null,this.panelElement&&(this.panelElement.remove(),this.panelElement=null),this.searchText.clear(),this.excludedValues.clear(),this.panelAbortController?.abort(),this.panelAbortController=null}processRows(e){const t=[...this.filters.values()];if(!t.length)return[...e];if(this.config.filterHandler)return this.cachedResult?this.cachedResult:[...e];const i=So(t);if(this.cacheKey===i&&this.cachedResult)return this.cachedResult;const o=Ro([...e],t,this.config.caseSensitive);return this.cachedResult=o,this.cacheKey=i,o}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll('[part~="header-cell"]').forEach(i=>{const o=i.getAttribute("data-col");if(o===null)return;const r=this.visibleColumns[parseInt(o,10)];if(!r||!this.isColumnFilterable(r)||V(r))return;const s=r.field;if(!s)return;const l=this.filters.has(s);let a=i.querySelector(".tbw-filter-btn");if(a){const u=a.classList.contains("active");if(a.classList.toggle("active",l),i.classList.toggle("filtered",l),u!==l){const h=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(h))}return}a=document.createElement("button"),a.className="tbw-filter-btn",a.setAttribute("aria-label",`Filter ${r.header??s}`);const d=l?"filterActive":"filter";this.setIcon(a,this.resolveIcon(d)),l&&(a.classList.add("active"),i.classList.add("filtered")),a.addEventListener("click",u=>{u.stopPropagation(),this.toggleFilterPanel(s,r,a)});const c=i.querySelector(".resize-handle");c?i.insertBefore(a,c):i.appendChild(a)})}setFilter(e,t){if(t===null)this.filters.delete(e),this.syncExcludedValues(e,null);else{const i={...t,field:e};this.filters.set(e,i),this.syncExcludedValues(e,i)}this.cachedResult=null,this.cacheKey=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),this.requestRender()}getFilter(e){return this.filters.get(e)}getFilters(){return[...this.filters.values()]}getFilterModel(){return this.getFilters()}setFilterModel(e){this.filters.clear(),this.excludedValues.clear();for(const t of e)this.filters.set(t.field,t),this.syncExcludedValues(t.field,t);this.cachedResult=null,this.cacheKey=null,this.emit("filter-change",{filters:[...this.filters.values()],filteredRowCount:0}),this.requestRender()}clearAllFilters(){this.filters.clear(),this.excludedValues.clear(),this.searchText.clear(),this.applyFiltersInternal()}clearFieldFilter(e){this.filters.delete(e),this.excludedValues.delete(e),this.searchText.delete(e),this.applyFiltersInternal()}isFieldFiltered(e){return this.filters.has(e)}getFilteredRowCount(){return this.cachedResult?.length??this.rows.length}getActiveFilters(){return this.getFilters()}getUniqueValues(e){return ni(this.sourceRows,e)}copyGridThemeContext(e){const t=this.gridElement;if(!t)return;for(const o of t.classList)o.startsWith("tbw-")||o==="selecting"||e.classList.add(o);const i=t.dataset.theme;i&&(e.dataset.theme=i)}injectGlobalStyles(){if(this.globalStylesInjected)return;if(document.getElementById("tbw-filter-panel-styles")){this.globalStylesInjected=!0;return}const e=document.createElement("style");e.id="tbw-filter-panel-styles",e.textContent=Ao,document.head.appendChild(e),this.globalStylesInjected=!0}toggleFilterPanel(e,t,i){if(this.openPanelField===e){this.closeFilterPanel();return}this.closeFilterPanel();const o=document.createElement("div");if(o.className="tbw-filter-panel",this.copyGridThemeContext(o),this.isAnimationEnabled&&o.classList.add("tbw-filter-panel-animated"),this.panelElement=o,this.openPanelField=e,this.config.valuesHandler){o.innerHTML='<div class="tbw-filter-loading">Loading...</div>',document.body.appendChild(o),this.positionPanel(o,i),this.setupPanelCloseHandler(o,i),this.config.valuesHandler(e,t).then(s=>{this.openPanelField!==e||!this.panelElement||(o.innerHTML="",this.renderPanelContent(e,t,o,s))});return}const r=ni(this.sourceRows,e);document.body.appendChild(o),this.positionPanel(o,i),this.renderPanelContent(e,t,o,r),this.setupPanelCloseHandler(o,i)}renderPanelContent(e,t,i,o){let r=this.excludedValues.get(e);r||(r=new Set,this.excludedValues.set(e,r));const s=this.searchText.get(e)??"",l={field:e,column:t,uniqueValues:o,excludedValues:r,searchText:s,applySetFilter:d=>{this.applySetFilter(e,d),this.closeFilterPanel()},applyTextFilter:(d,c,u)=>{this.applyTextFilter(e,d,c,u),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 d=this.grid.effectiveConfig.typeDefaults?.[t.type];d?.filterPanelRenderer&&(d.filterPanelRenderer(i,l),a=i.children.length>0)}if(!a){const d=t.type;d==="number"?this.renderNumberFilterPanel(i,l,o):d==="date"?this.renderDateFilterPanel(i,l,o):this.renderDefaultFilterPanel(i,l,o,r)}}setupPanelCloseHandler(e,t){this.panelAbortController=new AbortController,setTimeout(()=>{document.addEventListener("click",i=>{!e.contains(i.target)&&i.target!==t&&this.closeFilterPanel()},{signal:this.panelAbortController?.signal})},0)}closeFilterPanel(){const e=this.panelElement;e&&(e.remove(),this.panelElement=null),this.panelAnchorElement&&(this.panelAnchorElement.style.anchorName="",this.panelAnchorElement=null),this.openPanelField=null,this.panelAbortController?.abort(),this.panelAbortController=null}static supportsAnchorPositioning=null;static checkAnchorPositioningSupport(){return K.supportsAnchorPositioning===null&&(K.supportsAnchorPositioning=CSS.supports("anchor-name","--test")),K.supportsAnchorPositioning}positionPanel(e,t){const o=t.closest(".cell")??t;if(o.style.anchorName="--tbw-filter-anchor",this.panelAnchorElement=o,K.checkAnchorPositioningSupport()){requestAnimationFrame(()=>{const s=e.getBoundingClientRect(),l=o.getBoundingClientRect();s.top<l.top&&e.classList.add("tbw-filter-panel-above")});return}const r=o.getBoundingClientRect();e.style.position="fixed",e.style.top=`${r.bottom+4}px`,e.style.left=`${r.left}px`,requestAnimationFrame(()=>{const s=e.getBoundingClientRect();s.right>window.innerWidth-8&&(e.style.left=`${r.right-s.width}px`),s.bottom>window.innerHeight-8&&(e.style.top=`${r.top-s.height-4}px`,e.classList.add("tbw-filter-panel-above"))})}renderDefaultFilterPanel(e,t,i,o){const{field:r}=t,s=this.getListItemHeight(),l=document.createElement("div");l.className="tbw-filter-search";const a=document.createElement("input");a.type="text",a.placeholder="Search...",a.className="tbw-filter-search-input",a.value=this.searchText.get(r)??"",l.appendChild(a),e.appendChild(l);const d=document.createElement("div");d.className="tbw-filter-actions";const c=document.createElement("label");c.className="tbw-filter-value-item",c.style.padding="0",c.style.margin="0";const u=document.createElement("input");u.type="checkbox",u.className="tbw-filter-checkbox";const h=document.createElement("span");h.textContent="Select All",c.appendChild(u),c.appendChild(h),d.appendChild(c);const f=()=>{const S=[...m.values()],R=S.every(v=>v),k=S.every(v=>!v);u.checked=R,u.indeterminate=!R&&!k};u.addEventListener("change",()=>{const S=u.checked;for(const R of m.keys())m.set(R,S);f(),T()}),e.appendChild(d);const p=document.createElement("div");p.className="tbw-filter-values";const g=document.createElement("div");g.className="tbw-filter-values-spacer",p.appendChild(g);const w=document.createElement("div");w.className="tbw-filter-values-content",p.appendChild(w);const m=new Map;i.forEach(S=>{const R=S==null?"__null__":String(S);m.set(R,!o.has(S))}),f();let y=[];const C=(S,R)=>{const k=S==null?"(Blank)":String(S),v=S==null?"__null__":String(S),A=document.createElement("label");A.className="tbw-filter-value-item",A.style.position="absolute",A.style.top=`calc(var(--tbw-filter-item-height, 28px) * ${R})`,A.style.left="0",A.style.right="0",A.style.boxSizing="border-box";const z=document.createElement("input");z.type="checkbox",z.className="tbw-filter-checkbox",z.checked=m.get(v)??!0,z.dataset.value=v,z.addEventListener("change",()=>{m.set(v,z.checked),f()});const Z=document.createElement("span");return Z.textContent=k,A.appendChild(z),A.appendChild(Z),A},T=()=>{const S=y.length,R=p.clientHeight,k=p.scrollTop;if(g.style.height=`${S*s}px`,xo(S,K.LIST_BYPASS_THRESHOLD/3)){w.innerHTML="",w.style.transform="translateY(0px)",y.forEach((A,z)=>{w.appendChild(C(A,z))});return}const v=Co({totalRows:S,viewportHeight:R,scrollTop:k,rowHeight:s,overscan:K.LIST_OVERSCAN});w.style.transform=`translateY(${v.offsetY}px)`,w.innerHTML="";for(let A=v.start;A<v.end;A++)w.appendChild(C(y[A],A-v.start))},_=S=>{const R=this.config.caseSensitive??!1,k=R?S:S.toLowerCase();if(y=i.filter(v=>{const A=v==null?"(Blank)":String(v),z=R?A:A.toLowerCase();return!S||z.includes(k)}),y.length===0){g.style.height="0px",w.innerHTML="";const v=document.createElement("div");v.className="tbw-filter-no-match",v.textContent="No matching values",w.appendChild(v);return}T()};p.addEventListener("scroll",()=>{y.length>0&&T()},{passive:!0}),_(a.value),e.appendChild(p);let E;a.addEventListener("input",()=>{clearTimeout(E),E=setTimeout(()=>{this.searchText.set(r,a.value),_(a.value)},this.config.debounceMs??150)});const L=document.createElement("div");L.className="tbw-filter-buttons";const P=document.createElement("button");P.className="tbw-filter-apply-btn",P.textContent="Apply",P.addEventListener("click",()=>{const S=[];for(const[R,k]of m)if(!k)if(R==="__null__")S.push(null);else{const v=i.find(A=>String(A)===R);S.push(v!==void 0?v:R)}t.applySetFilter(S)}),L.appendChild(P);const b=document.createElement("button");b.className="tbw-filter-clear-btn",b.textContent="Clear Filter",b.addEventListener("click",()=>{t.clearFilter()}),L.appendChild(b),e.appendChild(L)}renderNumberFilterPanel(e,t,i){const{field:o,column:r}=t,s=r.filterParams,l=r.editorParams,a=(D,se)=>{if(typeof D=="number")return D;if(typeof D=="string"){const we=parseFloat(D);return isNaN(we)?se:we}return se},d=i.filter(D=>typeof D=="number"&&!isNaN(D)),c=d.length>0?Math.min(...d):0,u=d.length>0?Math.max(...d):100,h=a(s?.min??l?.min,c),f=a(s?.max??l?.max,u),p=s?.step??l?.step??1,g=this.filters.get(o);let w=h,m=f;g?.operator==="between"?(w=a(g.value,h),m=a(g.valueTo,f)):g?.operator==="greaterThanOrEqual"?w=a(g.value,h):g?.operator==="lessThanOrEqual"&&(m=a(g.value,f));const y=document.createElement("div");y.className="tbw-filter-range-inputs";const C=document.createElement("div");C.className="tbw-filter-range-group";const T=document.createElement("label");T.textContent="Min",T.className="tbw-filter-range-label";const _=document.createElement("input");_.type="number",_.className="tbw-filter-range-input",_.min=String(h),_.max=String(f),_.step=String(p),_.value=String(w),C.appendChild(T),C.appendChild(_),y.appendChild(C);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",y.appendChild(E);const L=document.createElement("div");L.className="tbw-filter-range-group";const P=document.createElement("label");P.textContent="Max",P.className="tbw-filter-range-label";const b=document.createElement("input");b.type="number",b.className="tbw-filter-range-input",b.min=String(h),b.max=String(f),b.step=String(p),b.value=String(m),L.appendChild(P),L.appendChild(b),y.appendChild(L),e.appendChild(y);const S=document.createElement("div");S.className="tbw-filter-range-slider";const R=document.createElement("div");R.className="tbw-filter-range-track";const k=document.createElement("div");k.className="tbw-filter-range-fill";const v=document.createElement("input");v.type="range",v.className="tbw-filter-range-thumb tbw-filter-range-thumb-min",v.min=String(h),v.max=String(f),v.step=String(p),v.value=String(w);const A=document.createElement("input");A.type="range",A.className="tbw-filter-range-thumb tbw-filter-range-thumb-max",A.min=String(h),A.max=String(f),A.step=String(p),A.value=String(m),S.appendChild(R),S.appendChild(k),S.appendChild(v),S.appendChild(A),e.appendChild(S);const z=()=>{const D=parseFloat(v.value),se=parseFloat(A.value),we=f-h,Di=(D-h)/we*100,rs=(se-h)/we*100;k.style.left=`${Di}%`,k.style.width=`${rs-Di}%`};v.addEventListener("input",()=>{const D=Math.min(parseFloat(v.value),parseFloat(A.value));v.value=String(D),_.value=String(D),z()}),A.addEventListener("input",()=>{const D=Math.max(parseFloat(A.value),parseFloat(v.value));A.value=String(D),b.value=String(D),z()}),_.addEventListener("input",()=>{let D=parseFloat(_.value)||h;D=Math.max(h,Math.min(D,parseFloat(b.value))),v.value=String(D),z()}),b.addEventListener("input",()=>{let D=parseFloat(b.value)||f;D=Math.min(f,Math.max(D,parseFloat(_.value))),A.value=String(D),z()}),z();const Z=document.createElement("div");Z.className="tbw-filter-buttons";const Ae=document.createElement("button");Ae.className="tbw-filter-apply-btn",Ae.textContent="Apply",Ae.addEventListener("click",()=>{const D=parseFloat(_.value),se=parseFloat(b.value);t.applyTextFilter("between",D,se)}),Z.appendChild(Ae);const Te=document.createElement("button");Te.className="tbw-filter-clear-btn",Te.textContent="Clear Filter",Te.addEventListener("click",()=>{t.clearFilter()}),Z.appendChild(Te),e.appendChild(Z)}renderDateFilterPanel(e,t,i){const{field:o,column:r}=t,s=r.filterParams,l=r.editorParams,a=i.filter(v=>v instanceof Date||typeof v=="string"&&!isNaN(Date.parse(v))).map(v=>v instanceof Date?v:new Date(v)).filter(v=>!isNaN(v.getTime())),d=a.length>0?new Date(Math.min(...a.map(v=>v.getTime()))):null,c=a.length>0?new Date(Math.max(...a.map(v=>v.getTime()))):null,u=v=>v?v.toISOString().split("T")[0]:"",h=v=>v?typeof v=="string"?v:typeof v=="number"?u(new Date(v)):"":"",f=h(s?.min)||h(l?.min)||u(d),p=h(s?.max)||h(l?.max)||u(c),g=this.filters.get(o);let w="",m="";g?.operator==="between"?(w=h(g.value)||"",m=h(g.valueTo)||""):g?.operator==="greaterThanOrEqual"?w=h(g.value)||"":g?.operator==="lessThanOrEqual"&&(m=h(g.value)||"");const y=document.createElement("div");y.className="tbw-filter-date-range";const C=document.createElement("div");C.className="tbw-filter-date-group";const T=document.createElement("label");T.textContent="From",T.className="tbw-filter-range-label";const _=document.createElement("input");_.type="date",_.className="tbw-filter-date-input",f&&(_.min=f),p&&(_.max=p),_.value=w,C.appendChild(T),C.appendChild(_),y.appendChild(C);const E=document.createElement("span");E.className="tbw-filter-range-separator",E.textContent="–",y.appendChild(E);const L=document.createElement("div");L.className="tbw-filter-date-group";const P=document.createElement("label");P.textContent="To",P.className="tbw-filter-range-label";const b=document.createElement("input");b.type="date",b.className="tbw-filter-date-input",f&&(b.min=f),p&&(b.max=p),b.value=m,L.appendChild(P),L.appendChild(b),y.appendChild(L),e.appendChild(y);const S=document.createElement("div");S.className="tbw-filter-buttons";const R=document.createElement("button");R.className="tbw-filter-apply-btn",R.textContent="Apply",R.addEventListener("click",()=>{const v=_.value,A=b.value;v&&A?t.applyTextFilter("between",v,A):v?t.applyTextFilter("greaterThanOrEqual",v):A?t.applyTextFilter("lessThanOrEqual",A):t.clearFilter()}),S.appendChild(R);const k=document.createElement("button");k.className="tbw-filter-clear-btn",k.textContent="Clear Filter",k.addEventListener("click",()=>{t.clearFilter()}),S.appendChild(k),e.appendChild(S)}applySetFilter(e,t){this.excludedValues.set(e,new Set(t)),t.length===0?this.filters.delete(e):this.filters.set(e,{field:e,type:"set",operator:"notIn",value:t}),this.applyFiltersInternal()}applyTextFilter(e,t,i,o){this.filters.set(e,{field:e,type:"text",operator:t,value:i,valueTo:o}),this.applyFiltersInternal()}applyFiltersInternal(){this.cachedResult=null,this.cacheKey=null;const e=[...this.filters.values()];if(this.config.filterHandler){const t=this.grid;t.setAttribute("aria-busy","true");const i=this.config.filterHandler(e,this.sourceRows),o=r=>{t.removeAttribute("aria-busy"),this.cachedResult=r,this.grid.rows=r,this.emit("filter-change",{filters:e,filteredRowCount:r.length}),this.requestRender()};i&&typeof i.then=="function"?i.then(o):o(i);return}this.emit("filter-change",{filters:e,filteredRowCount:0}),this.requestRender()}getColumnState(e){const t=this.filters.get(e);if(t)return{filter:{type:t.type,operator:t.operator,value:t.value,valueTo:t.valueTo}}}applyColumnState(e,t){if(!t.filter){this.filters.delete(e);return}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}}function oi(n){if(!n.length)return[];const e=new Map,t=[],i=(s,l)=>{if(!l.length)return;const a=t[t.length-1];if(a&&a.implicit&&a.firstIndex+a.columns.length===s){a.columns.push(...l);return}t.push({id:"__implicit__"+s,label:void 0,columns:l,firstIndex:s,implicit:!0})};let o=[],r=0;return n.forEach((s,l)=>{const a=s.group;if(!a){o.length===0&&(r=l),o.push(s);return}o.length&&(i(r,o.slice()),o=[]);const d=typeof a=="string"?a:a.id;let c=e.get(d);c||(c={id:d,label:typeof a=="string"?void 0:a.label,columns:[],firstIndex:l},e.set(d,c),t.push(c)),c.columns.push(s)}),o.length&&i(r,o),t.length===1&&t[0].implicit&&t[0].columns.length===n.length?[]:t}function To(n,e,t){if(!e.length||!n)return;const i=new Map;for(const r of e)for(const s of r.columns)s.field&&i.set(s.field,r.id);const o=Array.from(n.querySelectorAll(".cell[data-field]"));o.forEach(r=>{const s=r.getAttribute("data-field")||"",l=i.get(s);l&&(r.classList.add("grouped"),r.getAttribute("data-group")||r.setAttribute("data-group",l))});for(const r of e){const s=r.columns[r.columns.length-1],l=o.find(a=>a.getAttribute("data-field")===s.field);l&&l.classList.add("group-end")}}function ko(n,e){if(n.length===0)return null;const t=document.createElement("div");t.className="header-group-row",t.setAttribute("role","row");for(const i of n){const o=i.columns[0],r=o?e.findIndex(d=>d.field===o.field):-1;if(r===-1)continue;const s=String(i.id).startsWith("__implicit__"),l=s?"":i.label||i.id,a=document.createElement("div");a.className="cell header-group-cell",s&&a.classList.add("implicit-group"),a.setAttribute("data-group",String(i.id)),a.style.gridColumn=`${r+1} / span ${i.columns.length}`,a.textContent=l,t.appendChild(a)}return t}function Lo(n){return n.some(e=>e.group!=null)}const Po="@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;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)}}";class Do extends H{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}]};name="groupingColumns";styles=Po;get defaultConfig(){return{showGroupBorders:!0}}groups=[];isActive=!1;detach(){this.groups=[],this.isActive=!1}static detect(e,t){if(t?.columnGroups&&Array.isArray(t.columnGroups)&&t.columnGroups.length>0)return!0;const i=t?.columns;return Array.isArray(i)?Lo(i):!1}processColumns(e){const t=this.grid?.gridConfig?.columnGroups;let i;if(t&&Array.isArray(t)&&t.length>0){const r=new Map;for(const s of t)for(const l of s.children)r.set(l,{id:s.id,label:s.header});i=e.map(s=>{const l=r.get(s.field);return l&&!s.group?{...s,group:l}:s})}else i=[...e];const o=oi(i);return o.length===0?(this.isActive=!1,this.groups=[],i):(this.isActive=!0,this.groups=o,i)}afterRender(){if(!this.isActive){const a=this.gridElement?.querySelector(".header")?.querySelector(".header-group-row");a&&a.remove();return}const e=this.gridElement?.querySelector(".header");if(!e)return;const t=e.querySelector(".header-group-row");t&&t.remove();const i=this.columns,o=oi(i);if(o.length===0)return;const r=ko(o,i);if(r){r.classList.toggle("no-borders",!this.config.showGroupBorders);const l=e.querySelector(".header-row");l?e.insertBefore(r,l):e.appendChild(r)}const s=e.querySelector(".header-row");s&&(s.classList.toggle("no-group-borders",!this.config.showGroupBorders),To(s,o)),this.#t(o)}#t(e){if(!this.config.showGroupBorders)return;const t=this.gridElement;if(!t)return;const i=new Set;for(const r of e){const s=r.columns[r.columns.length-1];s?.field&&i.add(s.field)}const o=t.querySelectorAll(".rows .cell[data-field]");for(const r of o){const s=r.getAttribute("data-field");s&&i.has(s)?r.classList.add("group-end"):r.classList.remove("group-end")}}isGroupingActive(){return this.isActive}getGroups(){return this.groups}getGroupColumns(e){const t=this.groups.find(i=>i.id===e);return t?t.columns:[]}refresh(){this.requestRender()}}const Je={sum:(n,e)=>n.reduce((t,i)=>t+(Number(i[e])||0),0),avg:(n,e)=>{const t=n.reduce((i,o)=>i+(Number(o[e])||0),0);return n.length?t/n.length:0},count:n=>n.length,min:(n,e)=>Math.min(...n.map(t=>Number(t[e])||1/0)),max:(n,e)=>Math.max(...n.map(t=>Number(t[e])||-1/0)),first:(n,e)=>n[0]?.[e],last:(n,e)=>n[n.length-1]?.[e]},ge=new Map,$={register(n,e){ge.set(n,e)},unregister(n){ge.delete(n)},get(n){if(n!==void 0)return typeof n=="function"?n:ge.get(n)??Je[n]},run(n,e,t,i){const o=this.get(n);return o?o(e,t,i):void 0},has(n){return ge.has(n)||n in Je},list(){return[...Object.keys(Je),...ge.keys()]}},ri={sum:n=>n.reduce((e,t)=>e+t,0),avg:n=>n.length?n.reduce((e,t)=>e+t,0)/n.length:0,count:n=>n.length,min:n=>n.length?Math.min(...n):0,max:n=>n.length?Math.max(...n):0,first:n=>n[0]??0,last:n=>n[n.length-1]??0};function Ho(n){return ri[n]??ri.sum}$.register.bind($),$.unregister.bind($);const si=$.get.bind($),Qe=$.run.bind($);$.list.bind($);function li({rows:n,config:e,expanded:t,initialExpanded:i}){const o=e.groupOn;if(typeof o!="function")return[];const r={key:"__root__",value:null,depth:-1,rows:[],children:new Map};if(n.forEach(d=>{let c=o(d);c==null||c===!1?c=["__ungrouped__"]:Array.isArray(c)||(c=[c]);let u=r;c.forEach((h,f)=>{const p=h==null?"∅":String(h),g=u.key==="__root__"?p:u.key+"||"+p;let w=u.children.get(p);w||(w={key:g,value:h,depth:f,rows:[],children:new Map,parent:u},u.children.set(p,w)),u=w}),u.rows.push(d)}),r.children.size===1&&r.children.has("__ungrouped__")&&r.children.get("__ungrouped__").rows.length===n.length)return[];const s=new Set([...t,...i??[]]),l=[],a=d=>{if(d===r){d.children.forEach(u=>a(u));return}const c=s.has(d.key);l.push({kind:"group",key:d.key,value:d.value,depth:d.depth,rows:d.rows,expanded:c}),c&&(d.children.size?d.children.forEach(u=>a(u)):d.rows.forEach(u=>l.push({kind:"data",row:u,rowIndex:n.indexOf(u)})))};return a(r),l}function Io(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function Mo(n){const e=new Set;for(const t of n)t.kind==="group"&&e.add(t.key);return e}function No(){return new Set}function zo(n,e){if(n===!0)return new Set(e);if(n===!1||n==null)return new Set;if(typeof n=="number"){const t=e[n];return t?new Set([t]):new Set}return typeof n=="string"?new Set([n]):Array.isArray(n)?new Set(n):new Set}function Oo(n){return n.filter(e=>e.kind==="group").map(e=>e.key)}function Fo(n){return n.kind!=="group"?0:n.rows.length}const qo="@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)}.group-row:hover{background:var(--tbw-grouping-rows-bg-hover, var(--tbw-color-row-hover))}.group-toggle{cursor:pointer;-webkit-user-select:none;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}}}";class Go extends H{static manifest={configRules:[{id:"groupingRows/accordion-defaultExpanded",severity:"warn",message:`"accordion: true" and "defaultExpanded" (non-false) are used together.
78
78
  → In accordion mode, only one group can be open at a time.
79
79
  → Using defaultExpanded with multiple groups will collapse to one on first toggle.
80
- → Consider using "defaultExpanded: false" or a single group key/index with accordion mode.`,check:e=>e.accordion===!0&&e.defaultExpanded!==!1&&e.defaultExpanded!==void 0&&typeof e.defaultExpanded!="number"&&typeof e.defaultExpanded!="string"&&(e.defaultExpanded===!0||Array.isArray(e.defaultExpanded)&&e.defaultExpanded.length>1)}]};name="groupingRows";styles=qo;get defaultConfig(){return{defaultExpanded:!1,showRowCount:!0,indentWidth:20,aggregators:{},animation:"slide",accordion:!1}}expandedKeys=new Set;flattenedRows=[];isActive=!1;previousVisibleKeys=new Set;keysToAnimate=new Set;hasAppliedDefaultExpanded=!1;get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}detach(){this.expandedKeys.clear(),this.flattenedRows=[],this.isActive=!1,this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.hasAppliedDefaultExpanded=!1}static detect(e,t){return typeof t?.groupOn=="function"||typeof t?.enableRowGrouping=="boolean"}processRows(e){const t=this.config;if(typeof t.groupOn!="function")return this.isActive=!1,this.flattenedRows=[],[...e];const i=li({rows:[...e],config:t,expanded:new Set});if(i.length===0)return this.isActive=!1,this.flattenedRows=[],[...e];let o;if(!this.hasAppliedDefaultExpanded&&this.expandedKeys.size===0&&t.defaultExpanded!==!1){const l=zo(i);o=Oo(t.defaultExpanded??!1,l),o.size>0&&(this.expandedKeys=new Set(o),this.hasAppliedDefaultExpanded=!0)}const r=li({rows:[...e],config:t,expanded:this.expandedKeys,initialExpanded:o});this.isActive=!0,this.flattenedRows=r,this.keysToAnimate.clear();const s=new Set;return r.forEach((l,a)=>{if(l.kind==="data"){const d=`data-${a}`;s.add(d),this.previousVisibleKeys.has(d)||this.keysToAnimate.add(d)}}),this.previousVisibleKeys=s,r.map(l=>l.kind==="group"?{__isGroupRow:!0,__groupKey:l.key,__groupValue:l.value,__groupDepth:l.depth,__groupRows:l.rows,__groupExpanded:l.expanded,__groupRowCount:Fo(l)}:l.row)}onCellClick(e){const t=e.row;if(t?.__isGroupRow&&e.originalEvent.target?.closest(".group-toggle"))return this.toggle(t.__groupKey),!0}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusRow,i=this.rows[t];if(i?.__isGroupRow)return e.preventDefault(),this.toggle(i.__groupKey),this.requestRenderWithFocus(),!0}renderRow(e,t,i){if(!e?.__isGroupRow)return!1;const o=this.config;if(o.groupRowRenderer){const l=()=>{this.toggle(e.__groupKey)},a=o.groupRowRenderer({key:e.__groupKey,value:e.__groupValue,depth:e.__groupDepth,rows:e.__groupRows,expanded:e.__groupExpanded,toggleExpand:l});if(a)return t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),typeof a=="string"?t.innerHTML=a:(t.innerHTML="",t.appendChild(a)),!0}const r=()=>{this.toggle(e.__groupKey)};return 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.style.setProperty("--tbw-group-depth",String(e.__groupDepth||0)),o.indentWidth!==void 0&&t.style.setProperty("--tbw-group-indent-width",`${o.indentWidth}px`),t.style.height="",t.innerHTML="",o.fullWidth!==!1?this.renderFullWidthGroupRow(e,t,r):this.renderPerColumnGroupRow(e,t,r),!0}afterRender(){const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-group-fade-in":"tbw-group-slide-in";for(const o of t.querySelectorAll(".data-grid-row:not(.group-row)")){const r=o.querySelector(".cell[data-row]"),s=r?parseInt(r.getAttribute("data-row")??"-1",10):-1,a=this.flattenedRows[s]?.kind==="data"?`data-${s}`:void 0;a&&this.keysToAnimate.has(a)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}createToggleButton(e,t){const i=document.createElement("button");return i.type="button",i.className=`group-toggle${e?" expanded":""}`,i.setAttribute("aria-label",e?"Collapse group":"Expand group"),this.setIcon(i,this.resolveIcon(e?"collapse":"expand")),i.addEventListener("click",o=>{o.stopPropagation(),t()}),i}getGroupLabelText(e,t,i){const o=this.config;return o.formatLabel?o.formatLabel(e,t,i):String(e)}renderFullWidthGroupRow(e,t,i){const o=this.config,r=o.aggregators??{},s=e.__groupRows??[],l=document.createElement("div");l.className="cell group-full",l.style.gridColumn="1 / -1",l.setAttribute("role","gridcell"),l.setAttribute("data-col","0"),l.appendChild(this.createToggleButton(e.__groupExpanded,i));const a=document.createElement("span");if(a.className="group-label",a.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey),l.appendChild(a),o.showRowCount!==!1){const c=document.createElement("span");c.className="group-count",c.textContent=`(${e.__groupRowCount??e.__groupRows?.length??0})`,l.appendChild(c)}const d=Object.entries(r);if(d.length>0){const c=document.createElement("span");c.className="group-aggregates";for(const[u,h]of d){const f=this.columns.find(g=>g.field===u),p=Qe(h,s,u,f);if(p!=null){const g=document.createElement("span");g.className="group-aggregate",g.setAttribute("data-field",u);const w=f?.header??u;g.textContent=`${w}: ${p}`,c.appendChild(g)}}c.children.length>0&&l.appendChild(c)}t.appendChild(l)}renderPerColumnGroupRow(e,t,i){const o=this.config,r=o.aggregators??{},s=this.columns,l=e.__groupRows??[],d=this.gridElement?.querySelector(".body")?.style.gridTemplateColumns||"";d&&(t.style.display="grid",t.style.gridTemplateColumns=d);let c=!1;s.forEach((u,h)=>{const f=document.createElement("div");if(f.className="cell group-cell",f.setAttribute("data-col",String(h)),f.setAttribute("role","gridcell"),Ge(u)){f.setAttribute("data-field",u.field),t.appendChild(f);return}if(c){const p=r[u.field];if(p){const g=Qe(p,l,u.field,u);f.textContent=g!=null?String(g):""}else f.textContent=""}else{c=!0,f.appendChild(this.createToggleButton(e.__groupExpanded,i));const p=document.createElement("span"),g=r[u.field];if(g){const w=Qe(g,l,u.field,u);p.textContent=w!=null?String(w):String(e.__groupValue)}else p.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey);if(f.appendChild(p),o.showRowCount!==!1){const w=document.createElement("span");w.className="group-count",w.textContent=` (${l.length})`,f.appendChild(w)}}t.appendChild(f)})}expandAll(){this.expandedKeys=Mo(this.flattenedRows),this.requestRender()}collapseAll(){this.expandedKeys=No(),this.requestRender()}toggle(e){const t=!this.expandedKeys.has(e),i=this.config,o=this.flattenedRows.find(r=>r.kind==="group"&&r.key===e);if(i.accordion&&t&&o){const r=new Set;for(const s of this.expandedKeys)if(e.startsWith(s+"||")||s.startsWith(e+"||"))e.startsWith(s+"||")&&r.add(s);else{const l=this.flattenedRows.find(a=>a.kind==="group"&&a.key===s);l&&l.depth!==o.depth&&r.add(s)}r.add(e),this.expandedKeys=r}else this.expandedKeys=Io(this.expandedKeys,e);this.emit("group-toggle",{key:e,expanded:this.expandedKeys.has(e),value:o?.value,depth:o?.depth??0}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}expand(e){this.expandedKeys.has(e)||(this.expandedKeys=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(t=>t.kind==="group");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()}}function ai(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function Bo(n,e){const t=new Set(n);return t.add(e),t}function Ko(n,e){const t=new Set(n);return t.delete(e),t}function Vo(n,e){return n.has(e)}function $o(n,e,t,i){const o=document.createElement("div");o.className="master-detail-row",o.setAttribute("data-detail-for",String(e)),o.setAttribute("role","row");const r=document.createElement("div");r.className="master-detail-cell",r.setAttribute("role","cell"),r.style.gridColumn=`1 / ${i+1}`;const s=t(n,e);return typeof s=="string"?r.innerHTML=s:s instanceof HTMLElement&&r.appendChild(s),o.appendChild(r),o}const Wo="@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:center}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}tbw-grid .master-detail-expander{display:flex;align-items:center;justify-content:center;width:100%;height:100%}tbw-grid .master-detail-toggle{cursor:pointer;opacity:.7;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center}tbw-grid .master-detail-toggle:hover{opacity:1}tbw-grid .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}tbw-grid .master-detail-cell{padding:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));overflow:auto}tbw-grid .master-detail-row.tbw-expanding{animation:tbw-detail-expand var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}tbw-grid .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}}}";class et extends H{name="masterDetail";styles=Wo;get defaultConfig(){return{detailHeight:"auto",expandOnRowClick:!1,collapseOnClickOutside:!1,animation:"slide"}}attach(e){super.attach(e),this.parseLightDomDetail()}parseLightDomDetail(){const e=this.grid;if(!e||typeof e.querySelector!="function")return;const t=e.querySelector("tbw-grid-detail");if(!t)return;const i=e;if(i.__frameworkAdapter?.parseDetailElement){const u=i.__frameworkAdapter.parseDetailElement(t);if(u){this.config={...this.config,detailRenderer:u};return}}const o=t.getAttribute("animation"),r=t.getAttribute("show-expand-column"),s=t.getAttribute("expand-on-row-click"),l=t.getAttribute("collapse-on-click-outside"),a=t.getAttribute("height"),d={};o!==null&&(d.animation=o==="false"?!1:o),r!==null&&(d.showExpandColumn=r!=="false"),s!==null&&(d.expandOnRowClick=s==="true"),l!==null&&(d.collapseOnClickOutside=l==="true"),a!==null&&(d.detailHeight=a==="auto"?"auto":parseInt(a,10));const c=t.innerHTML.trim();c&&!this.config.detailRenderer&&(d.detailRenderer=(u,h)=>{const f=ke(c,{value:u,row:u});return U(f)}),Object.keys(d).length>0&&(this.config={...this.config,...d})}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}animateExpand(e){!this.isAnimationEnabled||this.animationStyle===!1||(e.classList.add("tbw-expanding"),e.addEventListener("animationend",()=>{e.classList.remove("tbw-expanding")},{once:!0}))}animateCollapse(e,t){if(!this.isAnimationEnabled||this.animationStyle===!1){t();return}e.classList.add("tbw-collapsing");const i=()=>{e.classList.remove("tbw-collapsing"),t()};e.addEventListener("animationend",i,{once:!0}),setTimeout(i,this.animationDuration+50)}expandedRows=new Set;detailElements=new Map;static DEFAULT_DETAIL_HEIGHT=150;getDetailHeight(e){const t=this.detailElements.get(e);return t?t.offsetHeight:typeof this.config?.detailHeight=="number"?this.config.detailHeight:et.DEFAULT_DETAIL_HEIGHT}toggleAndEmit(e,t){this.expandedRows=ai(this.expandedRows,e),this.emit("detail-expand",{rowIndex:t,row:e,expanded:this.expandedRows.has(e)}),this.requestRender()}detach(){this.expandedRows.clear(),this.detailElements.clear()}processColumns(e){if(!(this.config.showExpandColumn===!0||this.config.showExpandColumn!==!1&&!!this.config.detailRenderer))return[...e];const i=[...e];if(jn(i))return i;const r=Yn(this.name);return r.viewRenderer=s=>{const{row:l}=s,a=this.expandedRows.has(l),d=document.createElement("span");d.className="master-detail-expander expander-cell";const c=document.createElement("span");return c.className=`master-detail-toggle${a?" expanded":""}`,this.setIcon(c,this.resolveIcon(a?"collapse":"expand")),c.setAttribute("role","button"),c.setAttribute("tabindex","0"),c.setAttribute("aria-expanded",String(a)),c.setAttribute("aria-label",a?"Collapse details":"Expand details"),d.appendChild(c),d},[r,...i]}onRowClick(e){if(!(!this.config.expandOnRowClick||!this.config.detailRenderer))return this.toggleAndEmit(e.row,e.rowIndex),!1}onCellClick(e){if(e.originalEvent?.target?.classList.contains("master-detail-toggle"))return this.toggleAndEmit(e.row,e.rowIndex),!0;this.expandedRows.size>0&&queueMicrotask(()=>this.#t())}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusCol,i=this.grid._focusRow,o=this.columns[t];if(!o||!Ge(o))return;const r=this.rows[i];if(r)return e.preventDefault(),this.toggleAndEmit(r,i),this.requestRenderWithFocus(),!0}afterRender(){this.#t()}onScrollRender(){!this.config.detailRenderer||this.expandedRows.size===0||this.#t()}#t(){if(!this.config.detailRenderer)return;const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=new Map,i=e.querySelectorAll(".data-grid-row"),o=this.columns.length;for(const s of i){const l=s.querySelector(".cell[data-row]"),a=l?parseInt(l.getAttribute("data-row")??"-1",10):-1;a>=0&&t.set(a,s)}const r=e.querySelectorAll(".master-detail-row");for(const s of r){const l=parseInt(s.getAttribute("data-detail-for")??"-1",10),a=l>=0?this.rows[l]:void 0,d=a&&this.expandedRows.has(a),c=t.has(l);(!d||!c)&&(s.remove(),a&&this.detailElements.delete(a))}for(const[s,l]of t){const a=this.rows[s];if(!a||!this.expandedRows.has(a))continue;const d=this.detailElements.get(a);if(d){d.previousElementSibling!==l&&l.after(d);continue}const c=$o(a,s,this.config.detailRenderer,o);typeof this.config.detailHeight=="number"&&(c.style.height=`${this.config.detailHeight}px`),l.after(c),this.detailElements.set(a,c),this.animateExpand(c)}}getExtraHeight(){let e=0;for(const t of this.expandedRows)e+=this.getDetailHeight(t);return e}getExtraHeightBefore(e){let t=0;for(const i of this.expandedRows){const o=this.rows.indexOf(i);o>=0&&o<e&&(t+=this.getDetailHeight(i))}return t}adjustVirtualStart(e,t,i){if(this.expandedRows.size===0)return e;const o=[];for(const l of this.expandedRows){const a=this.rows.indexOf(l);a>=0&&o.push({index:a,row:l})}o.sort((l,a)=>l.index-a.index);let r=e,s=0;for(const{index:l,row:a}of o){const d=l*i+s,c=this.getDetailHeight(a),u=d+i+c;s+=c,!(l>=e)&&u>t&&l<r&&(r=l)}return r}expand(e){const t=this.rows[e];t&&(this.expandedRows=Bo(this.expandedRows,t),this.requestRender())}collapse(e){const t=this.rows[e];t&&(this.expandedRows=Ko(this.expandedRows,t),this.requestRender())}toggle(e){const t=this.rows[e];t&&(this.expandedRows=ai(this.expandedRows,t),this.requestRender())}isExpanded(e){const t=this.rows[e];return t?Vo(this.expandedRows,t):!1}expandAll(){for(const e of this.rows)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}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 t=this.grid;typeof t.refreshColumns=="function"?t.refreshColumns():this.requestRender()}}}function Uo(n,e,t){return e.length?[...n].sort((i,o)=>{for(const r of e){const l=t.find(u=>u.field===r.field)?.sortComparator??jo,a=i[r.field],d=o[r.field],c=l(a,d,i,o);if(c!==0)return r.direction==="asc"?c:-c}return 0}):[...n]}function jo(n,e){return n==null&&e==null?0:n==null?1:e==null?-1:typeof n=="number"&&typeof e=="number"?n-e:n instanceof Date&&e instanceof Date?n.getTime()-e.getTime():typeof n=="boolean"&&typeof e=="boolean"?n===e?0:n?-1:1:String(n).localeCompare(String(e))}function Yo(n,e,t,i){const o=n.find(r=>r.field===e);return t?o?o.direction==="asc"?n.map(r=>r.field===e?{...r,direction:"desc"}:r):n.filter(r=>r.field!==e):n.length<i?[...n,{field:e,direction:"asc"}]:n:o?.direction==="asc"?[{field:e,direction:"desc"}]:o?.direction==="desc"?[]:[{field:e,direction:"asc"}]}function di(n,e){const t=n.findIndex(i=>i.field===e);return t>=0?t+1:void 0}function ci(n,e){return n.find(t=>t.field===e)?.direction}const Xo='@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}}';class Zo extends H{name="multiSort";styles=Xo;get defaultConfig(){return{maxSortColumns:3,showSortIndex:!0}}sortModel=[];detach(){this.sortModel=[]}processRows(e){return this.sortModel.length===0?[...e]:Uo([...e],this.sortModel,[...this.columns])}onHeaderClick(e){if(!this.columns.find(r=>r.field===e.field)?.sortable)return!1;const i=e.originalEvent.shiftKey,o=this.config.maxSortColumns??3;return this.sortModel=Yo(this.sortModel,e.field,i,o),this.emit("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),!0}afterRender(){const e=this.gridElement;if(!e)return;const t=this.config.showSortIndex!==!1;e.querySelectorAll(".header-row .cell[data-field]").forEach(o=>{const r=o.getAttribute("data-field");if(!r)return;const s=di(this.sortModel,r),l=ci(this.sortModel,r);if(o.querySelector(".sort-index")?.remove(),l){o.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove(),o.setAttribute("data-sort",l);const c=document.createElement("span");c.className="sort-indicator",this.setIcon(c,this.resolveIcon(l==="asc"?"sortAsc":"sortDesc"));const u=o.querySelector(".tbw-filter-btn"),h=o.querySelector(".resize-handle"),f=u??h;if(f?o.insertBefore(c,f):o.appendChild(c),t&&this.sortModel.length>1&&s!==void 0){const p=document.createElement("span");p.className="sort-index",p.textContent=String(s),c.nextSibling?o.insertBefore(p,c.nextSibling):o.appendChild(p)}}else o.removeAttribute("data-sort")})}getSortModel(){return[...this.sortModel]}setSortModel(e){this.sortModel=[...e],this.emit("sort-change",{sortModel:[...e]}),this.requestRender()}clearSort(){this.sortModel=[],this.emit("sort-change",{sortModel:[]}),this.requestRender()}getSortIndex(e){return di(this.sortModel,e)}getSortDirection(e){return ci(this.sortModel,e)}getColumnState(e){const t=this.sortModel.findIndex(o=>o.field===e);return t===-1?void 0:{sort:{direction:this.sortModel[t].direction,priority:t}}}applyColumnState(e,t){if(!t.sort){this.sortModel=this.sortModel.filter(r=>r.field!==e);return}const i=this.sortModel.findIndex(r=>r.field===e),o={field:e,direction:t.sort.direction};i!==-1?this.sortModel[i]=o:this.sortModel.splice(t.sort.priority,0,o)}}function Jo(n){return n.filter(e=>e.sticky==="left")}function Qo(n){return n.filter(e=>e.sticky==="right")}function tt(n){return n.some(e=>e.sticky==="left"||e.sticky==="right")}function ui(n,e){const t=Array.from(n.querySelectorAll(".header-row .cell"));if(!t.length)return;const i=new Map;e.forEach((s,l)=>{s.field&&i.set(s.field,l)});let o=0;for(const s of e)if(s.sticky==="left"){const l=i.get(s.field),a=t.find(d=>d.getAttribute("data-field")===s.field);a&&(a.classList.add("sticky-left"),a.style.position="sticky",a.style.left=o+"px",l!==void 0&&n.querySelectorAll(`.data-grid-row .cell[data-col="${l}"]`).forEach(d=>{d.classList.add("sticky-left"),d.style.position="sticky",d.style.left=o+"px"}),o+=a.offsetWidth)}let r=0;for(const s of[...e].reverse())if(s.sticky==="right"){const l=i.get(s.field),a=t.find(d=>d.getAttribute("data-field")===s.field);a&&(a.classList.add("sticky-right"),a.style.position="sticky",a.style.right=r+"px",l!==void 0&&n.querySelectorAll(`.data-grid-row .cell[data-col="${l}"]`).forEach(d=>{d.classList.add("sticky-right"),d.style.position="sticky",d.style.right=r+"px"}),r+=a.offsetWidth)}}function hi(n){n.querySelectorAll(".sticky-left, .sticky-right").forEach(t=>{t.classList.remove("sticky-left","sticky-right"),t.style.position="",t.style.left="",t.style.right=""})}class er extends H{static manifest={ownedProperties:[{property:"sticky",level:"column",description:'the "sticky" column property',isUsed:e=>e==="left"||e==="right"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=new Map;rightOffsets=new Map;detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1}static detect(e,t){const i=t?.columns;return Array.isArray(i)?tt(i):!1}processColumns(e){return this.isApplied=tt([...e]),[...e]}afterRender(){if(!this.isApplied)return;const e=this.grid,t=[...this.columns];if(!tt(t)){hi(e),this.isApplied=!1;return}queueMicrotask(()=>{ui(e,t)})}onPluginQuery(e){switch(e.type){case qe.CAN_MOVE_COLUMN:{const t=e.context,i=t.sticky;if(i==="left"||i==="right")return!1;const o=t.meta?.sticky;return o==="left"||o==="right"?!1:void 0}default:return}}refreshStickyOffsets(){const e=[...this.columns];ui(this.grid,e)}getLeftPinnedColumns(){const e=[...this.columns];return Jo(e)}getRightPinnedColumns(){const e=[...this.columns];return Qo(e)}clearStickyPositions(){hi(this.grid)}getHorizontalScrollOffsets(e,t){if(!this.isApplied)return;let i=0,o=0;if(e){const s=e.querySelectorAll(".sticky-left"),l=e.querySelectorAll(".sticky-right");s.forEach(a=>{i+=a.offsetWidth}),l.forEach(a=>{o+=a.offsetWidth})}else this.grid.querySelectorAll(".header-row .cell").forEach(a=>{a.classList.contains("sticky-left")?i+=a.offsetWidth:a.classList.contains("sticky-right")&&(o+=a.offsetWidth)});const r=t?.classList.contains("sticky-left")||t?.classList.contains("sticky-right");return{left:i,right:o,skipScroll:r}}}function tr(n){return typeof n=="object"&&n!==null&&"aggFunc"in n}function it(n,e){const t=document.createElement("div");t.className="tbw-pinned-rows",t.setAttribute("role","presentation"),t.setAttribute("aria-live","polite");const i=document.createElement("div");i.className="tbw-pinned-rows-left";const o=document.createElement("div");o.className="tbw-pinned-rows-center";const r=document.createElement("div");if(r.className="tbw-pinned-rows-right",n.showRowCount!==!1){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-row-count",s.textContent=`Total: ${e.totalRows} rows`,i.appendChild(s)}if(n.showFilteredCount&&e.filteredRows!==e.totalRows){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-filtered-count",s.textContent=`Filtered: ${e.filteredRows}`,i.appendChild(s)}if(n.showSelectedCount&&e.selectedRows>0){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-selected-count",s.textContent=`Selected: ${e.selectedRows}`,r.appendChild(s)}if(n.customPanels)for(const s of n.customPanels){const l=ir(s,e);switch(s.position){case"left":i.appendChild(l);break;case"center":o.appendChild(l);break;case"right":r.appendChild(l);break}}return t.appendChild(i),t.appendChild(o),t.appendChild(r),t}function fi(n){const e=document.createElement("div");return e.className=`tbw-aggregation-rows tbw-aggregation-rows-${n}`,e.setAttribute("role","presentation"),e}function gi(n,e,t,i){n.innerHTML="";for(const o of e){const r=document.createElement("div");if(r.className="tbw-aggregation-row",r.setAttribute("role","presentation"),o.id&&r.setAttribute("data-aggregation-id",o.id),o.fullWidth){const s=document.createElement("div");s.className="tbw-aggregation-cell tbw-aggregation-cell-full",s.style.gridColumn="1 / -1",s.textContent=o.label||"",r.appendChild(s)}else for(const s of t){const l=document.createElement("div");l.className="tbw-aggregation-cell",l.setAttribute("data-field",s.field);let a,d;const c=o.aggregators?.[s.field];if(c)if(tr(c)){const u=si(c.aggFunc);u&&(a=u(i,s.field,s)),d=c.formatter}else{const u=si(c);u&&(a=u(i,s.field,s))}else if(o.cells&&Object.prototype.hasOwnProperty.call(o.cells,s.field)){const u=o.cells[s.field];typeof u=="function"?a=u(i,s.field,s):a=u}a!=null?l.textContent=d?d(a,s.field,s):String(a):l.textContent="",r.appendChild(l)}n.appendChild(r)}}function ir(n,e){const t=document.createElement("div");t.className="tbw-status-panel tbw-status-panel-custom",t.id=`status-panel-${n.id}`;const i=n.render(e);return typeof i=="string"?t.innerHTML=i:t.appendChild(i),t}function pi(n,e,t,i,o){return{totalRows:n.length,filteredRows:o?.cachedResult?.length??n.length,selectedRows:i?.selected?.size??0,columns:e,rows:n,grid:t}}const nr="@layer tbw-plugins{.tbw-footer{flex-shrink:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-color-panel-bg)}.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;min-width:fit-content}.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)}.tbw-aggregation-cell{padding:var(--tbw-cell-padding, .125rem .5rem);min-height:var(--tbw-row-height, 1.75rem);display:block;align-items: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}}";class or extends H{name="pinnedRows";styles=nr;get defaultConfig(){return{position:"bottom",showRowCount:!0,showSelectedCount:!0,showFilteredCount:!0}}infoBarElement=null;topAggregationContainer=null;bottomAggregationContainer=null;footerWrapper=null;detach(){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)}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.children[0];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);const i=this.getSelectionState(),o=this.getFilterState(),r=pi(this.rows,this.columns,this.grid,i,o),s=this.config.aggregationRows||[],l=s.filter(h=>h.position==="top"),a=s.filter(h=>h.position!=="top");if(l.length>0){if(!this.topAggregationContainer){this.topAggregationContainer=fi("top");const h=e.querySelector(".header");h&&h.nextSibling?t.insertBefore(this.topAggregationContainer,h.nextSibling):t.appendChild(this.topAggregationContainer)}gi(this.topAggregationContainer,l,this.visibleColumns,this.rows)}else this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null);const d=this.config.showRowCount!==!1||this.config.showSelectedCount&&r.selectedRows>0||this.config.showFilteredCount&&r.filteredRows!==r.totalRows||this.config.customPanels&&this.config.customPanels.length>0,c=d&&this.config.position!=="top",u=a.length>0||c;if(d&&this.config.position==="top")if(!this.infoBarElement)this.infoBarElement=it(this.config,r),t.insertBefore(this.infoBarElement,t.firstChild);else{const h=it(this.config,r);this.infoBarElement.replaceWith(h),this.infoBarElement=h}else this.config.position==="top"&&this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null);u?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",t.appendChild(this.footerWrapper)),this.footerWrapper.innerHTML="",a.length>0&&(this.bottomAggregationContainer||(this.bottomAggregationContainer=fi("bottom")),this.footerWrapper.appendChild(this.bottomAggregationContainer),gi(this.bottomAggregationContainer,a,this.visibleColumns,this.rows)),c&&(this.infoBarElement=it(this.config,r),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)}cleanupFooter(){this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.infoBarElement&&this.config.position!=="top"&&(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 pi(this.rows,this.columns,this.grid,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())}}const rr=Ho;function sr(n){const e=[];return!n.rowGroupFields?.length&&!n.columnGroupFields?.length&&e.push("At least one row or column group field is required"),n.valueFields?.length||e.push("At least one value field is required"),e}function nt(n,e){return[...n,e].join("|")}function lr(n,e){const t=e.rowGroupFields??[],i=e.columnGroupFields??[],o=e.valueFields??[],r=ar(n,i),s=wi(n,t,i,r,o,0,""),l=cr(s,r,o),a=Object.values(l).reduce((d,c)=>d+c,0);return{rows:s,columnKeys:r,totals:l,grandTotal:a}}function ar(n,e){if(e.length===0)return["value"];const t=new Set;for(const i of n){const o=e.map(r=>String(i[r]??"")).join("|");t.add(o)}return[...t].sort()}function dr(n,e){const t=new Map;for(const i of n){const o=String(i[e]??""),r=t.get(o);r?r.push(i):t.set(o,[i])}return t}function wi(n,e,t,i,o,r,s){const l=[];if(e.length===0){const h=mi(n,t,i,o),f=bi(h);return l.push({rowKey:s||"all",rowLabel:s||"All",depth:r,values:h,total:f,isGroup:!1,rowCount:n.length}),l}const a=e[0],d=e.slice(1),c=d.length>0,u=dr(n,a);for(const[h,f]of u){const p=s?`${s}|${h}`:h,g=mi(f,t,i,o),w=bi(g);let m;c&&(m=wi(f,d,t,i,o,r+1,p)),l.push({rowKey:p,rowLabel:h||"(blank)",depth:r,values:g,total:w,isGroup:c,children:m,rowCount:f.length})}return l}function mi(n,e,t,i){const o={};for(const r of t)for(const s of i){const a=(e.length>0?n.filter(h=>e.map(f=>String(h[f]??"")).join("|")===r):n).map(h=>Number(h[s.field])||0),d=rr(s.aggFunc),c=a.length>0?d(a):null,u=nt([r],s.field);o[u]=c}return o}function bi(n){let e=0;for(const t of Object.values(n))e+=t??0;return e}function cr(n,e,t){const i={};function o(r){for(const s of r)if(!s.isGroup||!s.children?.length)for(const l of e)for(const a of t){const d=nt([l],a.field);i[d]=(i[d]??0)+(s.values[d]??0)}else s.children&&o(s.children)}return o(n),i}function ur(n,e,t=!0){const i=[];function o(r){i.push(r);const s=e?e.has(r.rowKey):t;if(r.children&&s)for(const l of r.children)o(l)}for(const r of n)o(r);return i}function hr(n){const e=[];function t(i){if(i.isGroup&&e.push(i.rowKey),i.children)for(const o of i.children)t(o)}for(const i of n)t(i);return e}const fr=["sum","avg","count","min","max","first","last"];function gr(n,e,t,i){const o=new AbortController,r={config:e,callbacks:i,signal:o.signal},s=document.createElement("div");return s.className="tbw-pivot-panel",s.appendChild(pe("Options",()=>vr(t,r))),s.appendChild(pe("Row Groups",()=>vi("rowGroups",r))),s.appendChild(pe("Column Groups",()=>vi("columnGroups",r))),s.appendChild(pe("Values",()=>wr(r))),s.appendChild(pe("Available Fields",()=>br(r))),n.appendChild(s),()=>{o.abort(),s.remove()}}function pe(n,e){const t=document.createElement("div");t.className="tbw-pivot-section";const i=document.createElement("div");i.className="tbw-pivot-section-header",i.textContent=n;const o=document.createElement("div");return o.className="tbw-pivot-section-content",o.appendChild(e()),t.appendChild(i),t.appendChild(o),t}function vi(n,e){const{config:t,callbacks:i,signal:o}=e,r=document.createElement("div");r.className="tbw-pivot-drop-zone",r.setAttribute("data-zone",n);const s=n==="rowGroups"?t.rowGroupFields??[]:t.columnGroupFields??[];if(s.length===0){const l=document.createElement("div");l.className="tbw-pivot-placeholder",l.textContent="Drag fields here or click to add",r.appendChild(l)}else for(const l of s)r.appendChild(pr(l,n,e));return r.addEventListener("dragover",l=>{l.preventDefault(),r.classList.add("drag-over")},{signal:o}),r.addEventListener("dragleave",()=>{r.classList.remove("drag-over")},{signal:o}),r.addEventListener("drop",l=>{l.preventDefault(),r.classList.remove("drag-over");const a=l.dataTransfer?.getData("text/plain");a&&i.onAddFieldToZone(a,n)},{signal:o}),r}function pr(n,e,t){const{callbacks:i,signal:o}=t,r=document.createElement("div");r.className="tbw-pivot-field-chip",r.draggable=!0;const s=i.getAvailableFields().find(d=>d.field===n),l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=s?.header??n;const a=document.createElement("button");return a.className="tbw-pivot-chip-remove",a.innerHTML="×",a.title="Remove field",a.addEventListener("click",d=>{d.stopPropagation(),i.onRemoveFieldFromZone(n,e)},{signal:o}),r.appendChild(l),r.appendChild(a),r.addEventListener("dragstart",d=>{d.dataTransfer?.setData("text/plain",n),d.dataTransfer?.setData("source-zone",e),r.classList.add("dragging")},{signal:o}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")},{signal:o}),r}function wr(n){const{config:e,callbacks:t,signal:i}=n,o=document.createElement("div");o.className="tbw-pivot-drop-zone tbw-pivot-values-zone",o.setAttribute("data-zone","values");const r=e.valueFields??[];if(r.length===0){const s=document.createElement("div");s.className="tbw-pivot-placeholder",s.textContent="Drag numeric fields here for aggregation",o.appendChild(s)}else for(const s of r)o.appendChild(mr(s,n));return o.addEventListener("dragover",s=>{s.preventDefault(),o.classList.add("drag-over")},{signal:i}),o.addEventListener("dragleave",()=>{o.classList.remove("drag-over")},{signal:i}),o.addEventListener("drop",s=>{s.preventDefault(),o.classList.remove("drag-over");const l=s.dataTransfer?.getData("text/plain");l&&t.onAddValueField(l,"sum")},{signal:i}),o}function mr(n,e){const{callbacks:t,signal:i}=e,o=document.createElement("div");o.className="tbw-pivot-field-chip tbw-pivot-value-chip";const r=t.getAvailableFields().find(c=>c.field===n.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=r?.header??n.field;const a=document.createElement("select");a.className="tbw-pivot-agg-select",a.title="Aggregation function";for(const c of fr){const u=document.createElement("option");u.value=c,u.textContent=c.toUpperCase(),u.selected=c===n.aggFunc,a.appendChild(u)}a.addEventListener("change",()=>{t.onUpdateValueAggFunc(n.field,a.value)},{signal:i});const d=document.createElement("button");return d.className="tbw-pivot-chip-remove",d.innerHTML="×",d.title="Remove value field",d.addEventListener("click",c=>{c.stopPropagation(),t.onRemoveValueField(n.field)},{signal:i}),s.appendChild(l),s.appendChild(a),o.appendChild(s),o.appendChild(d),o}function br(n){const{config:e,callbacks:t,signal:i}=n,o=document.createElement("div");o.className="tbw-pivot-available-fields";const r=t.getAvailableFields(),s=new Set([...e.rowGroupFields??[],...e.columnGroupFields??[],...e.valueFields?.map(a=>a.field)??[]]),l=r.filter(a=>!s.has(a.field));if(l.length===0){const a=document.createElement("div");a.className="tbw-pivot-placeholder",a.textContent="All fields are in use",o.appendChild(a)}else for(const a of l){const d=document.createElement("div");d.className="tbw-pivot-field-chip available",d.textContent=a.header,d.draggable=!0,d.title=`Drag to add "${a.field}" to a zone`,d.addEventListener("dragstart",c=>{c.dataTransfer?.setData("text/plain",a.field),d.classList.add("dragging")},{signal:i}),d.addEventListener("dragend",()=>{d.classList.remove("dragging")},{signal:i}),o.appendChild(d)}return o}function vr(n,e){const{config:t,callbacks:i,signal:o}=e,r=document.createElement("div");return r.className="tbw-pivot-options",r.appendChild(ot("Enable Pivot View",n,s=>{i.onTogglePivot(s)},o)),r.appendChild(ot("Show Row Totals",t.showTotals??!0,s=>{i.onOptionChange("showTotals",s)},o)),r.appendChild(ot("Show Grand Total",t.showGrandTotal??!0,s=>{i.onOptionChange("showGrandTotal",s)},o)),r}function ot(n,e,t,i){const o=document.createElement("label");o.className="tbw-pivot-checkbox";const r=document.createElement("input");r.type="checkbox",r.checked=e,r.addEventListener("change",()=>t(r.checked),{signal:i});const s=document.createElement("span");return s.textContent=n,o.appendChild(r),o.appendChild(s),o}function yr(n,e,t){return e.className="data-grid-row pivot-group-row",e.setAttribute("data-pivot-depth",String(n.__pivotDepth??0)),e.setAttribute("data-pivot-key",String(n.__pivotRowKey??"")),e.setAttribute("role","row"),e.innerHTML="",t.columns.forEach((i,o)=>{const r=document.createElement("div");if(r.className="cell",r.setAttribute("data-col",String(o)),r.setAttribute("data-row",String(t.rowIndex)),r.setAttribute("role","gridcell"),o===0){const s=Number(n.__pivotIndent)||0;r.style.paddingLeft=`${s}px`;const l=String(n.__pivotRowKey),a=document.createElement("button");a.type="button",a.className="pivot-toggle",a.setAttribute("aria-label",n.__pivotExpanded?"Collapse group":"Expand group"),t.setIcon(a,t.resolveIcon(n.__pivotExpanded?"collapse":"expand")),a.addEventListener("click",u=>{u.stopPropagation(),t.onToggle(l)}),r.appendChild(a);const d=document.createElement("span");d.className="pivot-label",d.textContent=String(n.__pivotLabel??""),r.appendChild(d);const c=document.createElement("span");c.className="pivot-count",c.textContent=` (${Number(n.__pivotRowCount)||0})`,r.appendChild(c)}else{const s=n[i.field];r.textContent=s!=null?String(s):""}e.appendChild(r)}),!0}function Cr(n,e,t,i){return e.className="data-grid-row pivot-leaf-row",e.setAttribute("data-pivot-depth",String(n.__pivotDepth??0)),e.setAttribute("data-pivot-key",String(n.__pivotRowKey??"")),e.innerHTML="",t.forEach((o,r)=>{const s=document.createElement("div");if(s.className="cell",s.setAttribute("data-col",String(r)),s.setAttribute("data-row",String(i)),s.setAttribute("role","gridcell"),r===0){const l=Number(n.__pivotIndent)||0;s.style.paddingLeft=`${l+20}px`;const a=document.createElement("span");a.className="pivot-label",a.textContent=String(n.__pivotLabel??""),s.appendChild(a)}else{const l=n[o.field];s.textContent=l!=null?String(l):""}e.appendChild(s)}),!0}function xr(n,e,t){return e.className="pivot-grand-total-row",e.setAttribute("role","presentation"),e.innerHTML="",t.forEach((i,o)=>{const r=document.createElement("div");if(r.className="cell",r.setAttribute("data-col",String(o)),o===0){const s=document.createElement("span");s.className="pivot-label",s.textContent="Grand Total",r.appendChild(s)}else{const s=n[i.field];r.textContent=s!=null?String(s):""}e.appendChild(r)}),!0}const Er='@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)}.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-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem);min-height:40px}.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}}}';class Y extends H{name="pivot";styles=Er;static PANEL_ID="pivot";get defaultConfig(){return{active:!0,showTotals:!0,showGrandTotal:!0,showToolPanel:!0,animation:"slide"}}isActive=!1;hasInitialized=!1;pivotResult=null;fieldHeaderMap=new Map;expandedKeys=new Set;defaultExpanded=!0;userHasToggledExpand=!1;originalColumns=[];panelContainer=null;grandTotalFooter=null;previousVisibleKeys=new Set;keysToAnimate=new Set;hasValidPivotConfig(){return(this.config.valueFields?.length??0)>0}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}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}getToolPanel(){if((this.config?.showToolPanel??this.userConfig?.showToolPanel??!0)!==!1)return{id:Y.PANEL_ID,title:"Pivot",icon:"⊞",tooltip:"Configure pivot table",order:90,render:t=>this.renderPanel(t)}}processRows(e){if(!this.hasInitialized&&this.config.active!==!1&&this.hasValidPivotConfig()&&(this.hasInitialized=!0,this.isActive=!0),!this.isActive)return[...e];const t=sr(this.config);if(t.length>0)return this.warn(`Config errors: ${t.join(", ")}`),[...e];this.buildFieldHeaderMap(),this.defaultExpanded=this.config.defaultExpanded??!0,this.pivotResult=lr(e,this.config),this.expandedKeys.size===0&&this.defaultExpanded&&!this.userHasToggledExpand&&this.expandAllKeys();const i=this.config.indentWidth??20,o=ur(this.pivotResult.rows,this.expandedKeys,this.defaultExpanded).map(s=>({__pivotRowKey:s.rowKey,__pivotLabel:s.rowLabel,__pivotDepth:s.depth,__pivotIsGroup:s.isGroup,__pivotHasChildren:!!s.children?.length,__pivotExpanded:this.expandedKeys.has(s.rowKey),__pivotRowCount:s.rowCount??0,__pivotIndent:s.depth*i,__pivotTotal:s.total,...s.values}));this.keysToAnimate.clear();const r=new Set;for(const s of o){const l=s.__pivotRowKey;r.add(l),!this.previousVisibleKeys.has(l)&&s.__pivotDepth>0&&this.keysToAnimate.add(l)}return this.previousVisibleKeys=r,o}processColumns(e){if(!this.isActive||!this.pivotResult)return[...e];const t=[],i=(this.config.rowGroupFields??[]).map(o=>this.fieldHeaderMap.get(o)??o).join(" / ");t.push({field:"__pivotLabel",header:i||"Group",width:200});for(const o of this.pivotResult.columnKeys)for(const r of this.config.valueFields??[]){const s=nt([o],r.field),l=r.header||this.fieldHeaderMap.get(r.field)||r.field;t.push({field:s,header:`${o} - ${l} (${r.aggFunc})`,width:120,type:"number"})}return this.config.showTotals&&t.push({field:"__pivotTotal",header:"Total",width:100,type:"number"}),t}renderRow(e,t,i){const o=e;return o.__pivotRowKey&&o.__pivotHasChildren?yr(o,t,{columns:this.gridColumns,rowIndex:i,onToggle:r=>this.toggle(r),resolveIcon:r=>this.resolveIcon(r),setIcon:(r,s)=>this.setIcon(r,s)}):o.__pivotRowKey!==void 0&&this.isActive?Cr(o,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!==" "||!this.isActive)return;const t=this.grid._focusRow,i=this.rows[t];if(!(!i?.__pivotIsGroup||!i.__pivotHasChildren))return e.preventDefault(),this.toggle(i.__pivotRowKey),this.requestRenderWithFocus(),!0}afterRender(){this.isActive&&this.config.showGrandTotal&&this.pivotResult?this.renderGrandTotalFooter():this.cleanupGrandTotalFooter();const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-pivot-fade-in":"tbw-pivot-slide-in";for(const o of t.querySelectorAll(".pivot-group-row, .pivot-leaf-row")){const r=o.dataset.pivotKey;r&&this.keysToAnimate.has(r)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}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.children[0];if(!t)return;this.grandTotalFooter||(this.grandTotalFooter=document.createElement("div"),this.grandTotalFooter.className="pivot-grand-total-footer",t.appendChild(this.grandTotalFooter));const i={__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals};xr(i,this.grandTotalFooter,this.gridColumns)}cleanupGrandTotalFooter(){this.grandTotalFooter&&(this.grandTotalFooter.remove(),this.grandTotalFooter=null)}toggle(e){this.userHasToggledExpand=!0,this.expandedKeys.has(e)?this.expandedKeys.delete(e):this.expandedKeys.add(e),this.requestRender()}expand(e){this.userHasToggledExpand=!0,this.expandedKeys.add(e),this.requestRender()}collapse(e){this.userHasToggledExpand=!0,this.expandedKeys.delete(e),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=hr(this.pivotResult.rows);for(const t of e)this.expandedKeys.add(t)}isExpanded(e){return this.expandedKeys.has(e)}enablePivot(){this.originalColumns.length===0&&this.captureOriginalColumns(),this.isActive=!0,this.requestRender()}disablePivot(){this.isActive=!1,this.pivotResult=null,this.requestRender()}isPivotActive(){return this.isActive}getPivotResult(){return this.pivotResult}setRowGroupFields(e){this.config.rowGroupFields=e,this.requestRender()}setColumnGroupFields(e){this.config.columnGroupFields=e,this.requestRender()}setValueFields(e){this.config.valueFields=e,this.requestRender()}refresh(){this.pivotResult=null,this.requestRender()}showPanel(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(Y.PANEL_ID)||this.grid.toggleToolPanelSection(Y.PANEL_ID)}hidePanel(){this.grid.closeToolPanel()}togglePanel(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(Y.PANEL_ID)}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(Y.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(t=>!t.field.startsWith("__pivot")).map(t=>({field:t.field,header:t.header??t.field})),this.originalColumns}catch{return[]}}renderPanel(e){this.panelContainer=e,this.originalColumns.length===0&&this.captureOriginalColumns();const t={onTogglePivot:i=>{i?this.enablePivot():this.disablePivot(),this.refreshPanel()},onAddFieldToZone:(i,o)=>this.addFieldToZone(i,o),onRemoveFieldFromZone:(i,o)=>this.removeFieldFromZone(i,o),onAddValueField:(i,o)=>this.addValueField(i,o),onRemoveValueField:i=>this.removeValueField(i),onUpdateValueAggFunc:(i,o)=>this.updateValueAggFunc(i,o),onOptionChange:(i,o)=>{this.config[i]=o,this.isActive&&this.refresh()},getAvailableFields:()=>this.getAvailableFields()};return gr(e,this.config,this.isActive,t)}refreshPanel(){this.panelContainer&&(this.panelContainer.innerHTML="",this.renderPanel(this.panelContainer))}addFieldToZone(e,t){if(t==="rowGroups"){const i=this.config.rowGroupFields??[];i.includes(e)||(this.config.rowGroupFields=[...i,e])}else{const i=this.config.columnGroupFields??[];i.includes(e)||(this.config.columnGroupFields=[...i,e])}this.removeFromOtherZones(e,t),this.refreshIfActive()}removeFieldFromZone(e,t){t==="rowGroups"?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(i=>i!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(i=>i!==e),this.refreshIfActive()}removeFromOtherZones(e,t){t!=="rowGroups"&&(this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(i=>i!==e)),t!=="columnGroups"&&(this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(i=>i!==e)),t!=="values"&&(this.config.valueFields=(this.config.valueFields??[]).filter(i=>i.field!==e))}addValueField(e,t){const i=this.config.valueFields??[];i.some(o=>o.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??[],o=i.findIndex(r=>r.field===e);o>=0&&(i[o]={...i[o],aggFunc:t},this.config.valueFields=[...i]),this.isActive&&this.refresh()}}const Re="tbw-print-isolation-style";function Rr(n,e){const t=document.createElement("style");return t.id=Re,t.textContent=`
80
+ → Consider using "defaultExpanded: false" or a single group key/index with accordion mode.`,check:e=>e.accordion===!0&&e.defaultExpanded!==!1&&e.defaultExpanded!==void 0&&typeof e.defaultExpanded!="number"&&typeof e.defaultExpanded!="string"&&(e.defaultExpanded===!0||Array.isArray(e.defaultExpanded)&&e.defaultExpanded.length>1)}]};name="groupingRows";styles=qo;get defaultConfig(){return{defaultExpanded:!1,showRowCount:!0,indentWidth:20,aggregators:{},animation:"slide",accordion:!1}}expandedKeys=new Set;flattenedRows=[];isActive=!1;previousVisibleKeys=new Set;keysToAnimate=new Set;hasAppliedDefaultExpanded=!1;get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}detach(){this.expandedKeys.clear(),this.flattenedRows=[],this.isActive=!1,this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.hasAppliedDefaultExpanded=!1}static detect(e,t){return typeof t?.groupOn=="function"||typeof t?.enableRowGrouping=="boolean"}processRows(e){const t=this.config;if(typeof t.groupOn!="function")return this.isActive=!1,this.flattenedRows=[],[...e];const i=li({rows:[...e],config:t,expanded:new Set});if(i.length===0)return this.isActive=!1,this.flattenedRows=[],[...e];let o;if(!this.hasAppliedDefaultExpanded&&this.expandedKeys.size===0&&t.defaultExpanded!==!1){const l=Oo(i);o=zo(t.defaultExpanded??!1,l),o.size>0&&(this.expandedKeys=new Set(o),this.hasAppliedDefaultExpanded=!0)}const r=li({rows:[...e],config:t,expanded:this.expandedKeys,initialExpanded:o});this.isActive=!0,this.flattenedRows=r,this.keysToAnimate.clear();const s=new Set;return r.forEach((l,a)=>{if(l.kind==="data"){const d=`data-${a}`;s.add(d),this.previousVisibleKeys.has(d)||this.keysToAnimate.add(d)}}),this.previousVisibleKeys=s,r.map(l=>l.kind==="group"?{__isGroupRow:!0,__groupKey:l.key,__groupValue:l.value,__groupDepth:l.depth,__groupRows:l.rows,__groupExpanded:l.expanded,__groupRowCount:Fo(l)}:l.row)}onCellClick(e){const t=e.row;if(t?.__isGroupRow&&e.originalEvent.target?.closest(".group-toggle"))return this.toggle(t.__groupKey),!0}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusRow,i=this.rows[t];if(i?.__isGroupRow)return e.preventDefault(),this.toggle(i.__groupKey),this.requestRenderWithFocus(),!0}renderRow(e,t,i){if(!e?.__isGroupRow)return!1;const o=this.config;if(o.groupRowRenderer){const l=()=>{this.toggle(e.__groupKey)},a=o.groupRowRenderer({key:e.__groupKey,value:e.__groupValue,depth:e.__groupDepth,rows:e.__groupRows,expanded:e.__groupExpanded,toggleExpand:l});if(a)return t.className="data-grid-row group-row",t.__isCustomRow=!0,t.setAttribute("data-group-depth",String(e.__groupDepth)),typeof a=="string"?t.innerHTML=a:(t.innerHTML="",t.appendChild(a)),!0}const r=()=>{this.toggle(e.__groupKey)};return 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.style.setProperty("--tbw-group-depth",String(e.__groupDepth||0)),o.indentWidth!==void 0&&t.style.setProperty("--tbw-group-indent-width",`${o.indentWidth}px`),t.style.height="",t.innerHTML="",o.fullWidth!==!1?this.renderFullWidthGroupRow(e,t,r):this.renderPerColumnGroupRow(e,t,r),!0}afterRender(){const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-group-fade-in":"tbw-group-slide-in";for(const o of t.querySelectorAll(".data-grid-row:not(.group-row)")){const r=o.querySelector(".cell[data-row]"),s=r?parseInt(r.getAttribute("data-row")??"-1",10):-1,a=this.flattenedRows[s]?.kind==="data"?`data-${s}`:void 0;a&&this.keysToAnimate.has(a)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}createToggleButton(e,t){const i=document.createElement("button");return i.type="button",i.className=`group-toggle${e?" expanded":""}`,i.setAttribute("aria-label",e?"Collapse group":"Expand group"),this.setIcon(i,this.resolveIcon(e?"collapse":"expand")),i.addEventListener("click",o=>{o.stopPropagation(),t()}),i}getGroupLabelText(e,t,i){const o=this.config;return o.formatLabel?o.formatLabel(e,t,i):String(e)}renderFullWidthGroupRow(e,t,i){const o=this.config,r=o.aggregators??{},s=e.__groupRows??[],l=document.createElement("div");l.className="cell group-full",l.style.gridColumn="1 / -1",l.setAttribute("role","gridcell"),l.setAttribute("data-col","0"),l.appendChild(this.createToggleButton(e.__groupExpanded,i));const a=document.createElement("span");if(a.className="group-label",a.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey),l.appendChild(a),o.showRowCount!==!1){const c=document.createElement("span");c.className="group-count",c.textContent=`(${e.__groupRowCount??e.__groupRows?.length??0})`,l.appendChild(c)}const d=Object.entries(r);if(d.length>0){const c=document.createElement("span");c.className="group-aggregates";for(const[u,h]of d){const f=this.columns.find(g=>g.field===u),p=Qe(h,s,u,f);if(p!=null){const g=document.createElement("span");g.className="group-aggregate",g.setAttribute("data-field",u);const w=f?.header??u;g.textContent=`${w}: ${p}`,c.appendChild(g)}}c.children.length>0&&l.appendChild(c)}t.appendChild(l)}renderPerColumnGroupRow(e,t,i){const o=this.config,r=o.aggregators??{},s=this.columns,l=e.__groupRows??[],d=this.gridElement?.querySelector(".body")?.style.gridTemplateColumns||"";d&&(t.style.display="grid",t.style.gridTemplateColumns=d);let c=!1;s.forEach((u,h)=>{const f=document.createElement("div");if(f.className="cell group-cell",f.setAttribute("data-col",String(h)),f.setAttribute("role","gridcell"),Ge(u)){f.setAttribute("data-field",u.field),t.appendChild(f);return}if(c){const p=r[u.field];if(p){const g=Qe(p,l,u.field,u);f.textContent=g!=null?String(g):""}else f.textContent=""}else{c=!0,f.appendChild(this.createToggleButton(e.__groupExpanded,i));const p=document.createElement("span"),g=r[u.field];if(g){const w=Qe(g,l,u.field,u);p.textContent=w!=null?String(w):String(e.__groupValue)}else p.textContent=this.getGroupLabelText(e.__groupValue,e.__groupDepth||0,e.__groupKey);if(f.appendChild(p),o.showRowCount!==!1){const w=document.createElement("span");w.className="group-count",w.textContent=` (${l.length})`,f.appendChild(w)}}t.appendChild(f)})}expandAll(){this.expandedKeys=Mo(this.flattenedRows),this.requestRender()}collapseAll(){this.expandedKeys=No(),this.requestRender()}toggle(e){const t=!this.expandedKeys.has(e),i=this.config,o=this.flattenedRows.find(r=>r.kind==="group"&&r.key===e);if(i.accordion&&t&&o){const r=new Set;for(const s of this.expandedKeys)if(e.startsWith(s+"||")||s.startsWith(e+"||"))e.startsWith(s+"||")&&r.add(s);else{const l=this.flattenedRows.find(a=>a.kind==="group"&&a.key===s);l&&l.depth!==o.depth&&r.add(s)}r.add(e),this.expandedKeys=r}else this.expandedKeys=Io(this.expandedKeys,e);this.emit("group-toggle",{key:e,expanded:this.expandedKeys.has(e),value:o?.value,depth:o?.depth??0}),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}expand(e){this.expandedKeys.has(e)||(this.expandedKeys=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(t=>t.kind==="group");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()}}function ai(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function Bo(n,e){const t=new Set(n);return t.add(e),t}function $o(n,e){const t=new Set(n);return t.delete(e),t}function Ko(n,e){return n.has(e)}function Vo(n,e,t,i){const o=document.createElement("div");o.className="master-detail-row",o.setAttribute("data-detail-for",String(e)),o.setAttribute("role","row");const r=document.createElement("div");r.className="master-detail-cell",r.setAttribute("role","cell"),r.style.gridColumn=`1 / ${i+1}`;const s=t(n,e);return typeof s=="string"?r.innerHTML=s:s instanceof HTMLElement&&r.appendChild(s),o.appendChild(r),o}const Wo="@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:center}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}tbw-grid .master-detail-expander{display:flex;align-items:center;justify-content:center;width:100%;height:100%}tbw-grid .master-detail-toggle{cursor:pointer;opacity:.7;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center}tbw-grid .master-detail-toggle:hover{opacity:1}tbw-grid .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}tbw-grid .master-detail-cell{padding:var(--tbw-detail-padding, var(--tbw-spacing-xl, 1rem));overflow:auto}tbw-grid .master-detail-row.tbw-expanding{animation:tbw-detail-expand var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}tbw-grid .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}}}";class et extends H{name="masterDetail";styles=Wo;get defaultConfig(){return{detailHeight:"auto",expandOnRowClick:!1,collapseOnClickOutside:!1,animation:"slide"}}attach(e){super.attach(e),this.parseLightDomDetail()}parseLightDomDetail(){const e=this.grid;if(!e||typeof e.querySelector!="function")return;const t=e.querySelector("tbw-grid-detail");if(!t)return;const i=e;if(i.__frameworkAdapter?.parseDetailElement){const u=i.__frameworkAdapter.parseDetailElement(t);if(u){this.config={...this.config,detailRenderer:u};return}}const o=t.getAttribute("animation"),r=t.getAttribute("show-expand-column"),s=t.getAttribute("expand-on-row-click"),l=t.getAttribute("collapse-on-click-outside"),a=t.getAttribute("height"),d={};o!==null&&(d.animation=o==="false"?!1:o),r!==null&&(d.showExpandColumn=r!=="false"),s!==null&&(d.expandOnRowClick=s==="true"),l!==null&&(d.collapseOnClickOutside=l==="true"),a!==null&&(d.detailHeight=a==="auto"?"auto":parseInt(a,10));const c=t.innerHTML.trim();c&&!this.config.detailRenderer&&(d.detailRenderer=(u,h)=>{const f=ke(c,{value:u,row:u});return U(f)}),Object.keys(d).length>0&&(this.config={...this.config,...d})}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}animateExpand(e){!this.isAnimationEnabled||this.animationStyle===!1||(e.classList.add("tbw-expanding"),e.addEventListener("animationend",()=>{e.classList.remove("tbw-expanding")},{once:!0}))}animateCollapse(e,t){if(!this.isAnimationEnabled||this.animationStyle===!1){t();return}e.classList.add("tbw-collapsing");const i=()=>{e.classList.remove("tbw-collapsing"),t()};e.addEventListener("animationend",i,{once:!0}),setTimeout(i,this.animationDuration+50)}expandedRows=new Set;detailElements=new Map;static DEFAULT_DETAIL_HEIGHT=150;getDetailHeight(e){const t=this.detailElements.get(e);return t?t.offsetHeight:typeof this.config?.detailHeight=="number"?this.config.detailHeight:et.DEFAULT_DETAIL_HEIGHT}toggleAndEmit(e,t){this.expandedRows=ai(this.expandedRows,e),this.emit("detail-expand",{rowIndex:t,row:e,expanded:this.expandedRows.has(e)}),this.requestRender()}detach(){this.expandedRows.clear(),this.detailElements.clear()}processColumns(e){if(!(this.config.showExpandColumn===!0||this.config.showExpandColumn!==!1&&!!this.config.detailRenderer))return[...e];const i=[...e];if(jn(i))return i;const r=Yn(this.name);return r.viewRenderer=s=>{const{row:l}=s,a=this.expandedRows.has(l),d=document.createElement("span");d.className="master-detail-expander expander-cell";const c=document.createElement("span");return c.className=`master-detail-toggle${a?" expanded":""}`,this.setIcon(c,this.resolveIcon(a?"collapse":"expand")),c.setAttribute("role","button"),c.setAttribute("tabindex","0"),c.setAttribute("aria-expanded",String(a)),c.setAttribute("aria-label",a?"Collapse details":"Expand details"),d.appendChild(c),d},[r,...i]}onRowClick(e){if(!(!this.config.expandOnRowClick||!this.config.detailRenderer))return this.toggleAndEmit(e.row,e.rowIndex),!1}onCellClick(e){if(e.originalEvent?.target?.classList.contains("master-detail-toggle"))return this.toggleAndEmit(e.row,e.rowIndex),!0;this.expandedRows.size>0&&queueMicrotask(()=>this.#t())}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusCol,i=this.grid._focusRow,o=this.columns[t];if(!o||!Ge(o))return;const r=this.rows[i];if(r)return e.preventDefault(),this.toggleAndEmit(r,i),this.requestRenderWithFocus(),!0}afterRender(){this.#t()}onScrollRender(){!this.config.detailRenderer||this.expandedRows.size===0||this.#t()}#t(){if(!this.config.detailRenderer)return;const e=this.gridElement?.querySelector(".rows");if(!e)return;const t=new Map,i=e.querySelectorAll(".data-grid-row"),o=this.columns.length;for(const s of i){const l=s.querySelector(".cell[data-row]"),a=l?parseInt(l.getAttribute("data-row")??"-1",10):-1;a>=0&&t.set(a,s)}const r=e.querySelectorAll(".master-detail-row");for(const s of r){const l=parseInt(s.getAttribute("data-detail-for")??"-1",10),a=l>=0?this.rows[l]:void 0,d=a&&this.expandedRows.has(a),c=t.has(l);(!d||!c)&&(s.remove(),a&&this.detailElements.delete(a))}for(const[s,l]of t){const a=this.rows[s];if(!a||!this.expandedRows.has(a))continue;const d=this.detailElements.get(a);if(d){d.previousElementSibling!==l&&l.after(d);continue}const c=Vo(a,s,this.config.detailRenderer,o);typeof this.config.detailHeight=="number"&&(c.style.height=`${this.config.detailHeight}px`),l.after(c),this.detailElements.set(a,c),this.animateExpand(c)}}getExtraHeight(){let e=0;for(const t of this.expandedRows)e+=this.getDetailHeight(t);return e}getExtraHeightBefore(e){let t=0;for(const i of this.expandedRows){const o=this.rows.indexOf(i);o>=0&&o<e&&(t+=this.getDetailHeight(i))}return t}adjustVirtualStart(e,t,i){if(this.expandedRows.size===0)return e;const o=[];for(const l of this.expandedRows){const a=this.rows.indexOf(l);a>=0&&o.push({index:a,row:l})}o.sort((l,a)=>l.index-a.index);let r=e,s=0;for(const{index:l,row:a}of o){const d=l*i+s,c=this.getDetailHeight(a),u=d+i+c;s+=c,!(l>=e)&&u>t&&l<r&&(r=l)}return r}expand(e){const t=this.rows[e];t&&(this.expandedRows=Bo(this.expandedRows,t),this.requestRender())}collapse(e){const t=this.rows[e];t&&(this.expandedRows=$o(this.expandedRows,t),this.requestRender())}toggle(e){const t=this.rows[e];t&&(this.expandedRows=ai(this.expandedRows,t),this.requestRender())}isExpanded(e){const t=this.rows[e];return t?Ko(this.expandedRows,t):!1}expandAll(){for(const e of this.rows)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}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 t=this.grid;typeof t.refreshColumns=="function"?t.refreshColumns():this.requestRender()}}}function Uo(n,e,t){return e.length?[...n].sort((i,o)=>{for(const r of e){const l=t.find(u=>u.field===r.field)?.sortComparator??jo,a=i[r.field],d=o[r.field],c=l(a,d,i,o);if(c!==0)return r.direction==="asc"?c:-c}return 0}):[...n]}function jo(n,e){return n==null&&e==null?0:n==null?1:e==null?-1:typeof n=="number"&&typeof e=="number"?n-e:n instanceof Date&&e instanceof Date?n.getTime()-e.getTime():typeof n=="boolean"&&typeof e=="boolean"?n===e?0:n?-1:1:String(n).localeCompare(String(e))}function Yo(n,e,t,i){const o=n.find(r=>r.field===e);return t?o?o.direction==="asc"?n.map(r=>r.field===e?{...r,direction:"desc"}:r):n.filter(r=>r.field!==e):n.length<i?[...n,{field:e,direction:"asc"}]:n:o?.direction==="asc"?[{field:e,direction:"desc"}]:o?.direction==="desc"?[]:[{field:e,direction:"asc"}]}function di(n,e){const t=n.findIndex(i=>i.field===e);return t>=0?t+1:void 0}function ci(n,e){return n.find(t=>t.field===e)?.direction}const Xo='@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}}';class Zo extends H{name="multiSort";styles=Xo;get defaultConfig(){return{maxSortColumns:3,showSortIndex:!0}}sortModel=[];detach(){this.sortModel=[]}processRows(e){return this.sortModel.length===0?[...e]:Uo([...e],this.sortModel,[...this.columns])}onHeaderClick(e){if(!this.columns.find(r=>r.field===e.field)?.sortable)return!1;const i=e.originalEvent.shiftKey,o=this.config.maxSortColumns??3;return this.sortModel=Yo(this.sortModel,e.field,i,o),this.emit("sort-change",{sortModel:[...this.sortModel]}),this.requestRender(),!0}afterRender(){const e=this.gridElement;if(!e)return;const t=this.config.showSortIndex!==!1;e.querySelectorAll(".header-row .cell[data-field]").forEach(o=>{const r=o.getAttribute("data-field");if(!r)return;const s=di(this.sortModel,r),l=ci(this.sortModel,r);if(o.querySelector(".sort-index")?.remove(),l){o.querySelector('[part~="sort-indicator"], .sort-indicator')?.remove(),o.setAttribute("data-sort",l);const c=document.createElement("span");c.className="sort-indicator",this.setIcon(c,this.resolveIcon(l==="asc"?"sortAsc":"sortDesc"));const u=o.querySelector(".tbw-filter-btn"),h=o.querySelector(".resize-handle"),f=u??h;if(f?o.insertBefore(c,f):o.appendChild(c),t&&this.sortModel.length>1&&s!==void 0){const p=document.createElement("span");p.className="sort-index",p.textContent=String(s),c.nextSibling?o.insertBefore(p,c.nextSibling):o.appendChild(p)}}else o.removeAttribute("data-sort")})}getSortModel(){return[...this.sortModel]}setSortModel(e){this.sortModel=[...e],this.emit("sort-change",{sortModel:[...e]}),this.requestRender()}clearSort(){this.sortModel=[],this.emit("sort-change",{sortModel:[]}),this.requestRender()}getSortIndex(e){return di(this.sortModel,e)}getSortDirection(e){return ci(this.sortModel,e)}getColumnState(e){const t=this.sortModel.findIndex(o=>o.field===e);return t===-1?void 0:{sort:{direction:this.sortModel[t].direction,priority:t}}}applyColumnState(e,t){if(!t.sort){this.sortModel=this.sortModel.filter(r=>r.field!==e);return}const i=this.sortModel.findIndex(r=>r.field===e),o={field:e,direction:t.sort.direction};i!==-1?this.sortModel[i]=o:this.sortModel.splice(t.sort.priority,0,o)}}function Jo(n){return n.filter(e=>e.sticky==="left")}function Qo(n){return n.filter(e=>e.sticky==="right")}function tt(n){return n.some(e=>e.sticky==="left"||e.sticky==="right")}function ui(n,e){const t=Array.from(n.querySelectorAll(".header-row .cell"));if(!t.length)return;const i=new Map;e.forEach((s,l)=>{s.field&&i.set(s.field,l)});let o=0;for(const s of e)if(s.sticky==="left"){const l=i.get(s.field),a=t.find(d=>d.getAttribute("data-field")===s.field);a&&(a.classList.add("sticky-left"),a.style.position="sticky",a.style.left=o+"px",l!==void 0&&n.querySelectorAll(`.data-grid-row .cell[data-col="${l}"]`).forEach(d=>{d.classList.add("sticky-left"),d.style.position="sticky",d.style.left=o+"px"}),o+=a.offsetWidth)}let r=0;for(const s of[...e].reverse())if(s.sticky==="right"){const l=i.get(s.field),a=t.find(d=>d.getAttribute("data-field")===s.field);a&&(a.classList.add("sticky-right"),a.style.position="sticky",a.style.right=r+"px",l!==void 0&&n.querySelectorAll(`.data-grid-row .cell[data-col="${l}"]`).forEach(d=>{d.classList.add("sticky-right"),d.style.position="sticky",d.style.right=r+"px"}),r+=a.offsetWidth)}}function hi(n){n.querySelectorAll(".sticky-left, .sticky-right").forEach(t=>{t.classList.remove("sticky-left","sticky-right"),t.style.position="",t.style.left="",t.style.right=""})}class er extends H{static manifest={ownedProperties:[{property:"sticky",level:"column",description:'the "sticky" column property',isUsed:e=>e==="left"||e==="right"}]};name="pinnedColumns";get defaultConfig(){return{}}isApplied=!1;leftOffsets=new Map;rightOffsets=new Map;detach(){this.leftOffsets.clear(),this.rightOffsets.clear(),this.isApplied=!1}static detect(e,t){const i=t?.columns;return Array.isArray(i)?tt(i):!1}processColumns(e){return this.isApplied=tt([...e]),[...e]}afterRender(){if(!this.isApplied)return;const e=this.grid,t=[...this.columns];if(!tt(t)){hi(e),this.isApplied=!1;return}queueMicrotask(()=>{ui(e,t)})}onPluginQuery(e){switch(e.type){case qe.CAN_MOVE_COLUMN:{const t=e.context,i=t.sticky;if(i==="left"||i==="right")return!1;const o=t.meta?.sticky;return o==="left"||o==="right"?!1:void 0}default:return}}refreshStickyOffsets(){const e=[...this.columns];ui(this.grid,e)}getLeftPinnedColumns(){const e=[...this.columns];return Jo(e)}getRightPinnedColumns(){const e=[...this.columns];return Qo(e)}clearStickyPositions(){hi(this.grid)}getHorizontalScrollOffsets(e,t){if(!this.isApplied)return;let i=0,o=0;if(e){const s=e.querySelectorAll(".sticky-left"),l=e.querySelectorAll(".sticky-right");s.forEach(a=>{i+=a.offsetWidth}),l.forEach(a=>{o+=a.offsetWidth})}else this.grid.querySelectorAll(".header-row .cell").forEach(a=>{a.classList.contains("sticky-left")?i+=a.offsetWidth:a.classList.contains("sticky-right")&&(o+=a.offsetWidth)});const r=t?.classList.contains("sticky-left")||t?.classList.contains("sticky-right");return{left:i,right:o,skipScroll:r}}}function tr(n){return typeof n=="object"&&n!==null&&"aggFunc"in n}function it(n,e){const t=document.createElement("div");t.className="tbw-pinned-rows",t.setAttribute("role","presentation"),t.setAttribute("aria-live","polite");const i=document.createElement("div");i.className="tbw-pinned-rows-left";const o=document.createElement("div");o.className="tbw-pinned-rows-center";const r=document.createElement("div");if(r.className="tbw-pinned-rows-right",n.showRowCount!==!1){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-row-count",s.textContent=`Total: ${e.totalRows} rows`,i.appendChild(s)}if(n.showFilteredCount&&e.filteredRows!==e.totalRows){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-filtered-count",s.textContent=`Filtered: ${e.filteredRows}`,i.appendChild(s)}if(n.showSelectedCount&&e.selectedRows>0){const s=document.createElement("span");s.className="tbw-status-panel tbw-status-panel-selected-count",s.textContent=`Selected: ${e.selectedRows}`,r.appendChild(s)}if(n.customPanels)for(const s of n.customPanels){const l=ir(s,e);switch(s.position){case"left":i.appendChild(l);break;case"center":o.appendChild(l);break;case"right":r.appendChild(l);break}}return t.appendChild(i),t.appendChild(o),t.appendChild(r),t}function fi(n){const e=document.createElement("div");return e.className=`tbw-aggregation-rows tbw-aggregation-rows-${n}`,e.setAttribute("role","presentation"),e}function gi(n,e,t,i){n.innerHTML="";for(const o of e){const r=document.createElement("div");if(r.className="tbw-aggregation-row",r.setAttribute("role","presentation"),o.id&&r.setAttribute("data-aggregation-id",o.id),o.fullWidth){const s=document.createElement("div");s.className="tbw-aggregation-cell tbw-aggregation-cell-full",s.style.gridColumn="1 / -1",s.textContent=o.label||"",r.appendChild(s)}else for(const s of t){const l=document.createElement("div");l.className="tbw-aggregation-cell",l.setAttribute("data-field",s.field);let a,d;const c=o.aggregators?.[s.field];if(c)if(tr(c)){const u=si(c.aggFunc);u&&(a=u(i,s.field,s)),d=c.formatter}else{const u=si(c);u&&(a=u(i,s.field,s))}else if(o.cells&&Object.prototype.hasOwnProperty.call(o.cells,s.field)){const u=o.cells[s.field];typeof u=="function"?a=u(i,s.field,s):a=u}a!=null?l.textContent=d?d(a,s.field,s):String(a):l.textContent="",r.appendChild(l)}n.appendChild(r)}}function ir(n,e){const t=document.createElement("div");t.className="tbw-status-panel tbw-status-panel-custom",t.id=`status-panel-${n.id}`;const i=n.render(e);return typeof i=="string"?t.innerHTML=i:t.appendChild(i),t}function pi(n,e,t,i,o){return{totalRows:n.length,filteredRows:o?.cachedResult?.length??n.length,selectedRows:i?.selected?.size??0,columns:e,rows:n,grid:t}}const nr="@layer tbw-plugins{.tbw-footer{flex-shrink:0;z-index:var(--tbw-z-layer-pinned-rows, 20);background:var(--tbw-color-panel-bg)}.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;min-width:fit-content}.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)}.tbw-aggregation-cell{padding:var(--tbw-cell-padding, .125rem .5rem);min-height:var(--tbw-row-height, 1.75rem);display:block;align-items: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}}";class or extends H{name="pinnedRows";styles=nr;get defaultConfig(){return{position:"bottom",showRowCount:!0,showSelectedCount:!0,showFilteredCount:!0}}infoBarElement=null;topAggregationContainer=null;bottomAggregationContainer=null;footerWrapper=null;detach(){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)}afterRender(){const e=this.gridElement;if(!e)return;const t=e.querySelector(".tbw-scroll-area")??e.querySelector(".tbw-grid-content")??e.children[0];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);const i=this.getSelectionState(),o=this.getFilterState(),r=pi(this.rows,this.columns,this.grid,i,o),s=this.config.aggregationRows||[],l=s.filter(h=>h.position==="top"),a=s.filter(h=>h.position!=="top");if(l.length>0){if(!this.topAggregationContainer){this.topAggregationContainer=fi("top");const h=e.querySelector(".header");h&&h.nextSibling?t.insertBefore(this.topAggregationContainer,h.nextSibling):t.appendChild(this.topAggregationContainer)}gi(this.topAggregationContainer,l,this.visibleColumns,this.rows)}else this.topAggregationContainer&&(this.topAggregationContainer.remove(),this.topAggregationContainer=null);const d=this.config.showRowCount!==!1||this.config.showSelectedCount&&r.selectedRows>0||this.config.showFilteredCount&&r.filteredRows!==r.totalRows||this.config.customPanels&&this.config.customPanels.length>0,c=d&&this.config.position!=="top",u=a.length>0||c;if(d&&this.config.position==="top")if(!this.infoBarElement)this.infoBarElement=it(this.config,r),t.insertBefore(this.infoBarElement,t.firstChild);else{const h=it(this.config,r);this.infoBarElement.replaceWith(h),this.infoBarElement=h}else this.config.position==="top"&&this.infoBarElement&&(this.infoBarElement.remove(),this.infoBarElement=null);u?(this.footerWrapper||(this.footerWrapper=document.createElement("div"),this.footerWrapper.className="tbw-footer",t.appendChild(this.footerWrapper)),this.footerWrapper.innerHTML="",a.length>0&&(this.bottomAggregationContainer||(this.bottomAggregationContainer=fi("bottom")),this.footerWrapper.appendChild(this.bottomAggregationContainer),gi(this.bottomAggregationContainer,a,this.visibleColumns,this.rows)),c&&(this.infoBarElement=it(this.config,r),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)}cleanupFooter(){this.footerWrapper&&(this.footerWrapper.remove(),this.footerWrapper=null),this.bottomAggregationContainer&&(this.bottomAggregationContainer.remove(),this.bottomAggregationContainer=null),this.infoBarElement&&this.config.position!=="top"&&(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 pi(this.rows,this.columns,this.grid,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())}}const rr=Ho;function sr(n){const e=[];return!n.rowGroupFields?.length&&!n.columnGroupFields?.length&&e.push("At least one row or column group field is required"),n.valueFields?.length||e.push("At least one value field is required"),e}function nt(n,e){return[...n,e].join("|")}function lr(n,e){const t=e.rowGroupFields??[],i=e.columnGroupFields??[],o=e.valueFields??[],r=ar(n,i),s=wi(n,t,i,r,o,0,""),l=cr(s,r,o),a=Object.values(l).reduce((d,c)=>d+c,0);return{rows:s,columnKeys:r,totals:l,grandTotal:a}}function ar(n,e){if(e.length===0)return["value"];const t=new Set;for(const i of n){const o=e.map(r=>String(i[r]??"")).join("|");t.add(o)}return[...t].sort()}function dr(n,e){const t=new Map;for(const i of n){const o=String(i[e]??""),r=t.get(o);r?r.push(i):t.set(o,[i])}return t}function wi(n,e,t,i,o,r,s){const l=[];if(e.length===0){const h=mi(n,t,i,o),f=bi(h);return l.push({rowKey:s||"all",rowLabel:s||"All",depth:r,values:h,total:f,isGroup:!1,rowCount:n.length}),l}const a=e[0],d=e.slice(1),c=d.length>0,u=dr(n,a);for(const[h,f]of u){const p=s?`${s}|${h}`:h,g=mi(f,t,i,o),w=bi(g);let m;c&&(m=wi(f,d,t,i,o,r+1,p)),l.push({rowKey:p,rowLabel:h||"(blank)",depth:r,values:g,total:w,isGroup:c,children:m,rowCount:f.length})}return l}function mi(n,e,t,i){const o={};for(const r of t)for(const s of i){const a=(e.length>0?n.filter(h=>e.map(f=>String(h[f]??"")).join("|")===r):n).map(h=>Number(h[s.field])||0),d=rr(s.aggFunc),c=a.length>0?d(a):null,u=nt([r],s.field);o[u]=c}return o}function bi(n){let e=0;for(const t of Object.values(n))e+=t??0;return e}function cr(n,e,t){const i={};function o(r){for(const s of r)if(!s.isGroup||!s.children?.length)for(const l of e)for(const a of t){const d=nt([l],a.field);i[d]=(i[d]??0)+(s.values[d]??0)}else s.children&&o(s.children)}return o(n),i}function ur(n,e,t=!0){const i=[];function o(r){i.push(r);const s=e?e.has(r.rowKey):t;if(r.children&&s)for(const l of r.children)o(l)}for(const r of n)o(r);return i}function hr(n){const e=[];function t(i){if(i.isGroup&&e.push(i.rowKey),i.children)for(const o of i.children)t(o)}for(const i of n)t(i);return e}const fr=["sum","avg","count","min","max","first","last"];function gr(n,e,t,i){const o=new AbortController,r={config:e,callbacks:i,signal:o.signal},s=document.createElement("div");return s.className="tbw-pivot-panel",s.appendChild(pe("Options",()=>vr(t,r))),s.appendChild(pe("Row Groups",()=>vi("rowGroups",r))),s.appendChild(pe("Column Groups",()=>vi("columnGroups",r))),s.appendChild(pe("Values",()=>wr(r))),s.appendChild(pe("Available Fields",()=>br(r))),n.appendChild(s),()=>{o.abort(),s.remove()}}function pe(n,e){const t=document.createElement("div");t.className="tbw-pivot-section";const i=document.createElement("div");i.className="tbw-pivot-section-header",i.textContent=n;const o=document.createElement("div");return o.className="tbw-pivot-section-content",o.appendChild(e()),t.appendChild(i),t.appendChild(o),t}function vi(n,e){const{config:t,callbacks:i,signal:o}=e,r=document.createElement("div");r.className="tbw-pivot-drop-zone",r.setAttribute("data-zone",n);const s=n==="rowGroups"?t.rowGroupFields??[]:t.columnGroupFields??[];if(s.length===0){const l=document.createElement("div");l.className="tbw-pivot-placeholder",l.textContent="Drag fields here or click to add",r.appendChild(l)}else for(const l of s)r.appendChild(pr(l,n,e));return r.addEventListener("dragover",l=>{l.preventDefault(),r.classList.add("drag-over")},{signal:o}),r.addEventListener("dragleave",()=>{r.classList.remove("drag-over")},{signal:o}),r.addEventListener("drop",l=>{l.preventDefault(),r.classList.remove("drag-over");const a=l.dataTransfer?.getData("text/plain");a&&i.onAddFieldToZone(a,n)},{signal:o}),r}function pr(n,e,t){const{callbacks:i,signal:o}=t,r=document.createElement("div");r.className="tbw-pivot-field-chip",r.draggable=!0;const s=i.getAvailableFields().find(d=>d.field===n),l=document.createElement("span");l.className="tbw-pivot-chip-label",l.textContent=s?.header??n;const a=document.createElement("button");return a.className="tbw-pivot-chip-remove",a.innerHTML="×",a.title="Remove field",a.addEventListener("click",d=>{d.stopPropagation(),i.onRemoveFieldFromZone(n,e)},{signal:o}),r.appendChild(l),r.appendChild(a),r.addEventListener("dragstart",d=>{d.dataTransfer?.setData("text/plain",n),d.dataTransfer?.setData("source-zone",e),r.classList.add("dragging")},{signal:o}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")},{signal:o}),r}function wr(n){const{config:e,callbacks:t,signal:i}=n,o=document.createElement("div");o.className="tbw-pivot-drop-zone tbw-pivot-values-zone",o.setAttribute("data-zone","values");const r=e.valueFields??[];if(r.length===0){const s=document.createElement("div");s.className="tbw-pivot-placeholder",s.textContent="Drag numeric fields here for aggregation",o.appendChild(s)}else for(const s of r)o.appendChild(mr(s,n));return o.addEventListener("dragover",s=>{s.preventDefault(),o.classList.add("drag-over")},{signal:i}),o.addEventListener("dragleave",()=>{o.classList.remove("drag-over")},{signal:i}),o.addEventListener("drop",s=>{s.preventDefault(),o.classList.remove("drag-over");const l=s.dataTransfer?.getData("text/plain");l&&t.onAddValueField(l,"sum")},{signal:i}),o}function mr(n,e){const{callbacks:t,signal:i}=e,o=document.createElement("div");o.className="tbw-pivot-field-chip tbw-pivot-value-chip";const r=t.getAvailableFields().find(c=>c.field===n.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=r?.header??n.field;const a=document.createElement("select");a.className="tbw-pivot-agg-select",a.title="Aggregation function";for(const c of fr){const u=document.createElement("option");u.value=c,u.textContent=c.toUpperCase(),u.selected=c===n.aggFunc,a.appendChild(u)}a.addEventListener("change",()=>{t.onUpdateValueAggFunc(n.field,a.value)},{signal:i});const d=document.createElement("button");return d.className="tbw-pivot-chip-remove",d.innerHTML="×",d.title="Remove value field",d.addEventListener("click",c=>{c.stopPropagation(),t.onRemoveValueField(n.field)},{signal:i}),s.appendChild(l),s.appendChild(a),o.appendChild(s),o.appendChild(d),o}function br(n){const{config:e,callbacks:t,signal:i}=n,o=document.createElement("div");o.className="tbw-pivot-available-fields";const r=t.getAvailableFields(),s=new Set([...e.rowGroupFields??[],...e.columnGroupFields??[],...e.valueFields?.map(a=>a.field)??[]]),l=r.filter(a=>!s.has(a.field));if(l.length===0){const a=document.createElement("div");a.className="tbw-pivot-placeholder",a.textContent="All fields are in use",o.appendChild(a)}else for(const a of l){const d=document.createElement("div");d.className="tbw-pivot-field-chip available",d.textContent=a.header,d.draggable=!0,d.title=`Drag to add "${a.field}" to a zone`,d.addEventListener("dragstart",c=>{c.dataTransfer?.setData("text/plain",a.field),d.classList.add("dragging")},{signal:i}),d.addEventListener("dragend",()=>{d.classList.remove("dragging")},{signal:i}),o.appendChild(d)}return o}function vr(n,e){const{config:t,callbacks:i,signal:o}=e,r=document.createElement("div");return r.className="tbw-pivot-options",r.appendChild(ot("Enable Pivot View",n,s=>{i.onTogglePivot(s)},o)),r.appendChild(ot("Show Row Totals",t.showTotals??!0,s=>{i.onOptionChange("showTotals",s)},o)),r.appendChild(ot("Show Grand Total",t.showGrandTotal??!0,s=>{i.onOptionChange("showGrandTotal",s)},o)),r}function ot(n,e,t,i){const o=document.createElement("label");o.className="tbw-pivot-checkbox";const r=document.createElement("input");r.type="checkbox",r.checked=e,r.addEventListener("change",()=>t(r.checked),{signal:i});const s=document.createElement("span");return s.textContent=n,o.appendChild(r),o.appendChild(s),o}function yr(n,e,t){return e.className="data-grid-row pivot-group-row",e.setAttribute("data-pivot-depth",String(n.__pivotDepth??0)),e.setAttribute("data-pivot-key",String(n.__pivotRowKey??"")),e.setAttribute("role","row"),e.innerHTML="",t.columns.forEach((i,o)=>{const r=document.createElement("div");if(r.className="cell",r.setAttribute("data-col",String(o)),r.setAttribute("data-row",String(t.rowIndex)),r.setAttribute("role","gridcell"),o===0){const s=Number(n.__pivotIndent)||0;r.style.paddingLeft=`${s}px`;const l=String(n.__pivotRowKey),a=document.createElement("button");a.type="button",a.className="pivot-toggle",a.setAttribute("aria-label",n.__pivotExpanded?"Collapse group":"Expand group"),t.setIcon(a,t.resolveIcon(n.__pivotExpanded?"collapse":"expand")),a.addEventListener("click",u=>{u.stopPropagation(),t.onToggle(l)}),r.appendChild(a);const d=document.createElement("span");d.className="pivot-label",d.textContent=String(n.__pivotLabel??""),r.appendChild(d);const c=document.createElement("span");c.className="pivot-count",c.textContent=` (${Number(n.__pivotRowCount)||0})`,r.appendChild(c)}else{const s=n[i.field];r.textContent=s!=null?String(s):""}e.appendChild(r)}),!0}function Cr(n,e,t,i){return e.className="data-grid-row pivot-leaf-row",e.setAttribute("data-pivot-depth",String(n.__pivotDepth??0)),e.setAttribute("data-pivot-key",String(n.__pivotRowKey??"")),e.innerHTML="",t.forEach((o,r)=>{const s=document.createElement("div");if(s.className="cell",s.setAttribute("data-col",String(r)),s.setAttribute("data-row",String(i)),s.setAttribute("role","gridcell"),r===0){const l=Number(n.__pivotIndent)||0;s.style.paddingLeft=`${l+20}px`;const a=document.createElement("span");a.className="pivot-label",a.textContent=String(n.__pivotLabel??""),s.appendChild(a)}else{const l=n[o.field];s.textContent=l!=null?String(l):""}e.appendChild(s)}),!0}function xr(n,e,t){return e.className="pivot-grand-total-row",e.setAttribute("role","presentation"),e.innerHTML="",t.forEach((i,o)=>{const r=document.createElement("div");if(r.className="cell",r.setAttribute("data-col",String(o)),o===0){const s=document.createElement("span");s.className="pivot-label",s.textContent="Grand Total",r.appendChild(s)}else{const s=n[i.field];r.textContent=s!=null?String(s):""}e.appendChild(r)}),!0}const Er='@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)}.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-wrap:wrap;gap:var(--tbw-spacing-sm, .375rem);min-height:40px}.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}}}';class Y extends H{name="pivot";styles=Er;static PANEL_ID="pivot";get defaultConfig(){return{active:!0,showTotals:!0,showGrandTotal:!0,showToolPanel:!0,animation:"slide"}}isActive=!1;hasInitialized=!1;pivotResult=null;fieldHeaderMap=new Map;expandedKeys=new Set;defaultExpanded=!0;userHasToggledExpand=!1;originalColumns=[];panelContainer=null;grandTotalFooter=null;previousVisibleKeys=new Set;keysToAnimate=new Set;hasValidPivotConfig(){return(this.config.valueFields?.length??0)>0}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}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}getToolPanel(){if((this.config?.showToolPanel??this.userConfig?.showToolPanel??!0)!==!1)return{id:Y.PANEL_ID,title:"Pivot",icon:"⊞",tooltip:"Configure pivot table",order:90,render:t=>this.renderPanel(t)}}processRows(e){if(!this.hasInitialized&&this.config.active!==!1&&this.hasValidPivotConfig()&&(this.hasInitialized=!0,this.isActive=!0),!this.isActive)return[...e];const t=sr(this.config);if(t.length>0)return this.warn(`Config errors: ${t.join(", ")}`),[...e];this.buildFieldHeaderMap(),this.defaultExpanded=this.config.defaultExpanded??!0,this.pivotResult=lr(e,this.config),this.expandedKeys.size===0&&this.defaultExpanded&&!this.userHasToggledExpand&&this.expandAllKeys();const i=this.config.indentWidth??20,o=ur(this.pivotResult.rows,this.expandedKeys,this.defaultExpanded).map(s=>({__pivotRowKey:s.rowKey,__pivotLabel:s.rowLabel,__pivotDepth:s.depth,__pivotIsGroup:s.isGroup,__pivotHasChildren:!!s.children?.length,__pivotExpanded:this.expandedKeys.has(s.rowKey),__pivotRowCount:s.rowCount??0,__pivotIndent:s.depth*i,__pivotTotal:s.total,...s.values}));this.keysToAnimate.clear();const r=new Set;for(const s of o){const l=s.__pivotRowKey;r.add(l),!this.previousVisibleKeys.has(l)&&s.__pivotDepth>0&&this.keysToAnimate.add(l)}return this.previousVisibleKeys=r,o}processColumns(e){if(!this.isActive||!this.pivotResult)return[...e];const t=[],i=(this.config.rowGroupFields??[]).map(o=>this.fieldHeaderMap.get(o)??o).join(" / ");t.push({field:"__pivotLabel",header:i||"Group",width:200});for(const o of this.pivotResult.columnKeys)for(const r of this.config.valueFields??[]){const s=nt([o],r.field),l=r.header||this.fieldHeaderMap.get(r.field)||r.field;t.push({field:s,header:`${o} - ${l} (${r.aggFunc})`,width:120,type:"number"})}return this.config.showTotals&&t.push({field:"__pivotTotal",header:"Total",width:100,type:"number"}),t}renderRow(e,t,i){const o=e;return o.__pivotRowKey&&o.__pivotHasChildren?yr(o,t,{columns:this.gridColumns,rowIndex:i,onToggle:r=>this.toggle(r),resolveIcon:r=>this.resolveIcon(r),setIcon:(r,s)=>this.setIcon(r,s)}):o.__pivotRowKey!==void 0&&this.isActive?Cr(o,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!==" "||!this.isActive)return;const t=this.grid._focusRow,i=this.rows[t];if(!(!i?.__pivotIsGroup||!i.__pivotHasChildren))return e.preventDefault(),this.toggle(i.__pivotRowKey),this.requestRenderWithFocus(),!0}afterRender(){this.isActive&&this.config.showGrandTotal&&this.pivotResult?this.renderGrandTotalFooter():this.cleanupGrandTotalFooter();const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-pivot-fade-in":"tbw-pivot-slide-in";for(const o of t.querySelectorAll(".pivot-group-row, .pivot-leaf-row")){const r=o.dataset.pivotKey;r&&this.keysToAnimate.has(r)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}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.children[0];if(!t)return;this.grandTotalFooter||(this.grandTotalFooter=document.createElement("div"),this.grandTotalFooter.className="pivot-grand-total-footer",t.appendChild(this.grandTotalFooter));const i={__pivotRowKey:"__grandTotal",__pivotLabel:"Grand Total",__pivotIsGrandTotal:!0,__pivotTotal:this.pivotResult.grandTotal,...this.pivotResult.totals};xr(i,this.grandTotalFooter,this.gridColumns)}cleanupGrandTotalFooter(){this.grandTotalFooter&&(this.grandTotalFooter.remove(),this.grandTotalFooter=null)}toggle(e){this.userHasToggledExpand=!0,this.expandedKeys.has(e)?this.expandedKeys.delete(e):this.expandedKeys.add(e),this.requestRender()}expand(e){this.userHasToggledExpand=!0,this.expandedKeys.add(e),this.requestRender()}collapse(e){this.userHasToggledExpand=!0,this.expandedKeys.delete(e),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=hr(this.pivotResult.rows);for(const t of e)this.expandedKeys.add(t)}isExpanded(e){return this.expandedKeys.has(e)}enablePivot(){this.originalColumns.length===0&&this.captureOriginalColumns(),this.isActive=!0,this.requestRender()}disablePivot(){this.isActive=!1,this.pivotResult=null,this.requestRender()}isPivotActive(){return this.isActive}getPivotResult(){return this.pivotResult}setRowGroupFields(e){this.config.rowGroupFields=e,this.requestRender()}setColumnGroupFields(e){this.config.columnGroupFields=e,this.requestRender()}setValueFields(e){this.config.valueFields=e,this.requestRender()}refresh(){this.pivotResult=null,this.requestRender()}showPanel(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(Y.PANEL_ID)||this.grid.toggleToolPanelSection(Y.PANEL_ID)}hidePanel(){this.grid.closeToolPanel()}togglePanel(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(Y.PANEL_ID)}isPanelVisible(){return this.grid.isToolPanelOpen&&this.grid.expandedToolPanelSections.includes(Y.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(t=>!t.field.startsWith("__pivot")).map(t=>({field:t.field,header:t.header??t.field})),this.originalColumns}catch{return[]}}renderPanel(e){this.panelContainer=e,this.originalColumns.length===0&&this.captureOriginalColumns();const t={onTogglePivot:i=>{i?this.enablePivot():this.disablePivot(),this.refreshPanel()},onAddFieldToZone:(i,o)=>this.addFieldToZone(i,o),onRemoveFieldFromZone:(i,o)=>this.removeFieldFromZone(i,o),onAddValueField:(i,o)=>this.addValueField(i,o),onRemoveValueField:i=>this.removeValueField(i),onUpdateValueAggFunc:(i,o)=>this.updateValueAggFunc(i,o),onOptionChange:(i,o)=>{this.config[i]=o,this.isActive&&this.refresh()},getAvailableFields:()=>this.getAvailableFields()};return gr(e,this.config,this.isActive,t)}refreshPanel(){this.panelContainer&&(this.panelContainer.innerHTML="",this.renderPanel(this.panelContainer))}addFieldToZone(e,t){if(t==="rowGroups"){const i=this.config.rowGroupFields??[];i.includes(e)||(this.config.rowGroupFields=[...i,e])}else{const i=this.config.columnGroupFields??[];i.includes(e)||(this.config.columnGroupFields=[...i,e])}this.removeFromOtherZones(e,t),this.refreshIfActive()}removeFieldFromZone(e,t){t==="rowGroups"?this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(i=>i!==e):this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(i=>i!==e),this.refreshIfActive()}removeFromOtherZones(e,t){t!=="rowGroups"&&(this.config.rowGroupFields=(this.config.rowGroupFields??[]).filter(i=>i!==e)),t!=="columnGroups"&&(this.config.columnGroupFields=(this.config.columnGroupFields??[]).filter(i=>i!==e)),t!=="values"&&(this.config.valueFields=(this.config.valueFields??[]).filter(i=>i.field!==e))}addValueField(e,t){const i=this.config.valueFields??[];i.some(o=>o.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??[],o=i.findIndex(r=>r.field===e);o>=0&&(i[o]={...i[o],aggFunc:t},this.config.valueFields=[...i]),this.isActive&&this.refresh()}}const Re="tbw-print-isolation-style";function Rr(n,e){const t=document.createElement("style");return t.id=Re,t.textContent=`
81
81
  /* Print isolation: hide everything except the target grid */
82
82
  @media print {
83
83
  /* Hide all body children by default */
@@ -151,7 +151,7 @@ ${t}`}async#ce(){if(!M.#I){if(J.length>0){M.#I=J,M.#G();return}await new Promise
151
151
 
152
152
  Note: 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.${d}
153
153
 
154
- Click OK to continue, or Cancel to abort.`))return}i.maxRows>0&&r>i.maxRows&&(s=i.maxRows,l=!0),this.#t=!0;const a=performance.now();this.emit("print-start",{rowCount:s,limitApplied:l,originalRowCount:r});try{const d=this.#h;this.#u={bypassThreshold:d._virtualization?.bypassThreshold??24},this.#a(),l&&(this.#d=this.sourceRows,this.grid.rows=this.sourceRows.slice(0,s),await new Promise(c=>setTimeout(c,50))),(i.includeTitle||i.includeTimestamp)&&this.#g(i),await this.#f(),await new Promise(c=>requestAnimationFrame(c)),await new Promise(c=>requestAnimationFrame(c)),t.classList.add(`print-${i.orientation}`),await new Promise(c=>requestAnimationFrame(c)),await new Promise(c=>requestAnimationFrame(c)),i.isolate?await this.#m(i):await this.#c(),this.emit("print-complete",{success:!0,rowCount:s,duration:Math.round(performance.now()-a)})}catch(d){console.error("[PrintPlugin] Print failed:",d),this.emit("print-complete",{success:!1,rowCount:0,duration:Math.round(performance.now()-a)})}finally{this.#y(),this.#t=!1}}#g(e){const t=this.gridElement;if(t){if(this.#s=document.createElement("div"),this.#s.className="tbw-print-header",e.includeTitle){const i=e.title||this.grid.effectiveConfig?.shell?.header?.title||"Grid Data",o=document.createElement("div");o.className="tbw-print-header-title",o.textContent=i,this.#s.appendChild(o)}if(e.includeTimestamp){const i=document.createElement("div");i.className="tbw-print-header-timestamp",i.textContent=`Printed: ${new Date().toLocaleString()}`,this.#s.appendChild(i)}t.insertBefore(this.#s,t.firstChild),this.#l=document.createElement("div"),this.#l.className="tbw-print-footer",this.#l.textContent=`Page generated from ${window.location.hostname}`,t.appendChild(this.#l)}}async#f(){const e=this.#h;if(!e._virtualization)return;const t=this.rows.length;e._virtualization.bypassThreshold=t+100,e.refreshVirtualWindow(!0),await new Promise(i=>setTimeout(i,100))}async#c(){return new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{window.removeEventListener("afterprint",t),e()},1e3)})}async#m(e){const t=this.gridElement;t&&await yi(t,{orientation:e.orientation})}#a(){const e=this.columns;if(e){this.#e=new Map;for(const t of e)t.printHidden&&t.field&&(this.#e.set(t.field,!t.hidden),this.grid.setColumnVisible(t.field,!1))}}#w(){if(this.#e){for(const[e,t]of this.#e)this.grid.setColumnVisible(e,t);this.#e=null}}#y(){const e=this.gridElement;if(!e)return;this.#w(),e.classList.remove("print-portrait","print-landscape"),this.#n!==null&&(e.style.transform="",e.style.transformOrigin="",e.style.width="",this.#n=null),this.#s&&(this.#s.remove(),this.#s=null),this.#l&&(this.#l.remove(),this.#l=null);const t=this.#h;this.#u&&t._virtualization&&(t._virtualization.bypassThreshold=this.#u.bypassThreshold,t.refreshVirtualWindow(!0),this.#u=null),this.#d!==null&&(this.grid.rows=this.#d,this.#d=null)}afterRender(){this.config?.button&&!this.#C&&(this.#b(),this.#C=!0)}#C=!1;#b(){this.#h.registerToolbarContent?.({id:"print-button",order:900,render:t=>{const i=document.createElement("button");i.className="tbw-toolbar-btn tbw-print-btn",i.title="Print grid",i.type="button";const o=this.resolveIcon("print")||"🖨️";this.setIcon(i,o),i.addEventListener("click",()=>{this.print()},{signal:this.disconnectSignal}),t.appendChild(i)}})}}function Tr(n){const e=n.meta??{};return e.lockPosition!==!0&&e.suppressMovable!==!0}function Ci(n,e,t){if(e===t||e<0||e>=n.length||t<0||t>n.length)return n;const i=[...n],[o]=i.splice(e,1);return i.splice(t,0,o),i}const kr='@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}}';class Pr extends H{name="reorder";styles=kr;get defaultConfig(){return{animation:"flip"}}get animationType(){return this.isAnimationEnabled?this.config.animation!==void 0?this.config.animation:"flip":!1}get animationDuration(){return this.config.animationDuration!==void 0?this.config.animationDuration:super.animationDuration}isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;canMoveColumnWithPlugins(e){return!e||!Tr(e)?!1:!this.grid.queryPlugins({type:qe.CAN_MOVE_COLUMN,context:e}).includes(!1)}clearDragClasses(){this.gridElement?.querySelectorAll(".header-row > .cell").forEach(e=>{e.classList.remove("dragging","drop-target","drop-before","drop-after")})}attach(e){super.attach(e),e.addEventListener("column-reorder-request",t=>{const i=t.detail;i?.field&&typeof i.toIndex=="number"&&this.moveColumn(i.field,i.toIndex)},{signal:this.disconnectSignal})}detach(){this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll(".header-row > .cell").forEach(i=>{const o=i,r=o.getAttribute("data-field");if(!r)return;const s=this.columns.find(l=>l.field===r);if(!this.canMoveColumnWithPlugins(s)){o.draggable=!1;return}o.draggable=!0,!o.getAttribute("data-dragstart-bound")&&(o.setAttribute("data-dragstart-bound","true"),o.addEventListener("dragstart",l=>{const d=this.getColumnOrder().indexOf(r);this.isDragging=!0,this.draggedField=r,this.draggedIndex=d,l.dataTransfer&&(l.dataTransfer.effectAllowed="move",l.dataTransfer.setData("text/plain",r)),o.classList.add("dragging")}),o.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses()}),o.addEventListener("dragover",l=>{if(l.preventDefault(),!this.isDragging||this.draggedField===r)return;const a=o.getBoundingClientRect(),d=a.left+a.width/2,u=this.getColumnOrder().indexOf(r);this.dropIndex=l.clientX<d?u:u+1,o.classList.add("drop-target"),o.classList.toggle("drop-before",l.clientX<d),o.classList.toggle("drop-after",l.clientX>=d)}),o.addEventListener("dragleave",()=>{o.classList.remove("drop-target","drop-before","drop-after")}),o.addEventListener("drop",l=>{l.preventDefault();const a=this.draggedField,d=this.draggedIndex,c=this.dropIndex;if(!this.isDragging||a===null||d===null||c===null)return;const u=c>d?c-1:c,h=this.getColumnOrder(),f=Ci(h,d,u),p={field:a,fromIndex:d,toIndex:u,columnOrder:f};this.emitCancelable("column-move",p)||this.updateColumnOrder(f)}))})}onKeyDown(e){if(!e.altKey||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;const t=this.grid,i=t._focusCol,o=t._visibleColumns;if(i<0||i>=o.length)return;const r=o[i];if(!this.canMoveColumnWithPlugins(r))return;const s=this.getColumnOrder(),l=s.indexOf(r.field);if(l===-1)return;const a=e.key==="ArrowLeft"?l-1:l+1;if(a<0||a>=s.length)return;const d=o.find(c=>c.field===s[a]);if(this.canMoveColumnWithPlugins(d))return this.moveColumn(r.field,a),t._focusCol=a,F(this.grid),e.preventDefault(),e.stopPropagation(),!0}getColumnOrder(){return this.grid.getColumnOrder()}moveColumn(e,t){const i=this.getColumnOrder(),o=i.indexOf(e);if(o===-1)return;const r=Ci(i,o,t);this.emitCancelable("column-move",{field:e,fromIndex:o,toIndex:t,columnOrder:r})||this.updateColumnOrder(r)}setColumnOrder(e){this.updateColumnOrder(e)}resetColumnOrder(){const e=this.columns.map(t=>t.field);this.updateColumnOrder(e)}captureHeaderPositions(){const e=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||e.size===0)return;const i=new Map;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(s=>{const l=s.getAttribute("data-field");if(!l)return;const a=e.get(l);if(a===void 0)return;const d=a-s.getBoundingClientRect().left;Math.abs(d)>1&&i.set(l,d)}),i.size===0)return;const o=[];if(t.querySelectorAll(".cell[data-field]").forEach(s=>{const l=i.get(s.getAttribute("data-field")??"");if(l!==void 0){const a=s;a.style.transform=`translateX(${l}px)`,o.push(a)}}),o.length===0)return;this.gridElement.offsetHeight;const r=this.animationDuration;requestAnimationFrame(()=>{o.forEach(s=>{s.classList.add("flip-animating"),s.style.transform=""}),setTimeout(()=>{o.forEach(s=>{s.style.transform="",s.classList.remove("flip-animating")})},r+50)})}animateFade(e){const t=this.gridElement;if(!t){e();return}const i=this.captureHeaderPositions();e();const o=new Set;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(l=>{const a=l.getAttribute("data-field");if(!a)return;const d=i.get(a);if(d===void 0)return;const c=l.getBoundingClientRect().left;Math.abs(d-c)>1&&o.add(a)}),o.size===0)return;const r=[];if(t.querySelectorAll(".cell[data-field]").forEach(l=>{const a=l.getAttribute("data-field");if(a&&o.has(a)){const d=l;d.classList.add("fade-animating"),r.push(d)}}),r.length===0)return;const s=this.animationDuration;setTimeout(()=>{r.forEach(l=>l.classList.remove("fade-animating"))},s+50)}updateColumnOrder(e){const t=this.animationType;if(t==="flip"&&this.gridElement){const i=this.captureHeaderPositions();this.grid.setColumnOrder(e),requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(i)})}else t==="fade"?this.animateFade(()=>this.grid.setColumnOrder(e)):this.grid.setColumnOrder(e);this.grid.requestStateChange?.()}}const Lr='tbw-grid[data-responsive-animate] .data-grid-row,tbw-grid[data-responsive-animate] .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}tbw-grid[data-responsive] .footer-row{display:none}tbw-grid[data-responsive] .tbw-scroll-area{overflow-x:hidden;min-width:0!important}tbw-grid[data-responsive] .rows-body-wrapper{min-width:0!important}tbw-grid[data-responsive] .data-grid-row:not(.group-row){display:block!important;grid-template-columns:none!important;padding:var(--tbw-cell-padding);padding-left: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}tbw-grid[data-responsive] .data-grid-row:not(.group-row):nth-child(2n){background:var(--tbw-color-row-alt)}tbw-grid[data-responsive] .data-grid-row:not(.group-row):hover{background:var(--tbw-color-row-hover)}tbw-grid[data-responsive] .data-grid-row:not(.group-row)[aria-selected=true]{background:var(--tbw-color-selection)}tbw-grid[data-responsive] .data-grid-row:not(.group-row)[aria-selected=true]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--tbw-color-accent)}tbw-grid[data-responsive] .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-right:none!important;background:transparent!important;white-space:normal!important;overflow:visible!important}tbw-grid[data-responsive] .data-grid-row:not(.group-row)>.cell:before{content:attr(data-header) ": ";font-weight:600;color:var(--tbw-color-header-fg);flex-shrink:0;margin-right:var(--tbw-spacing-md);min-width:100px}tbw-grid[data-responsive] .data-grid-row:not(.group-row)>.cell:after{content:none}tbw-grid[data-responsive] .cell[data-utility]{display:none!important}tbw-grid[data-responsive] .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .cell[data-responsive-value-only]{justify-content:flex-start!important;font-weight:500}tbw-grid[data-responsive] .cell[data-responsive-value-only]:before{display:none!important}tbw-grid:not([data-responsive]) .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .tbw-footer,tbw-grid[data-responsive] .tbw-pinned-rows,tbw-grid[data-responsive] .tbw-aggregation-rows{display:none!important}tbw-grid[data-responsive] .tbw-pinned-rows,tbw-grid[data-responsive] .tbw-aggregation-rows,tbw-grid[data-responsive] .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)}tbw-grid[data-responsive] .data-grid-row.responsive-card>*{width:100%}tbw-grid[data-responsive] .data-grid-row.responsive-card .cell:before{display:none}';class Dr extends H{name="responsive";version="1.0.0";styles=Lr;static manifest={incompatibleWith:[{name:"groupingRows",reason:"Responsive card layout does not yet support row grouping. The variable row heights (cards vs group headers) cause scroll calculation issues."}]};#t;#e=!1;#u;#d=!1;#s=0;#l=new Set;#n=new Set;#h=null;#g=[];isResponsive(){return this.#e}setResponsive(e){e!==this.#e&&(this.#e=e,this.#w(),this.emit("responsive-change",{isResponsive:e,width:this.#s,breakpoint:this.config.breakpoint??0}))}setBreakpoint(e){this.config.breakpoint=e,this.#c(this.#s)}setCardRenderer(e){this.config.cardRenderer=e,this.#e&&this.requestRender()}getWidth(){return this.#s}getActiveBreakpoint(){return this.#h}attach(e){super.attach(e),this.#f(this.config.hiddenColumns),this.config.breakpoints?.length&&(this.#g=[...this.config.breakpoints].sort((t,i)=>i.maxWidth-t.maxWidth)),this.#t=new ResizeObserver(t=>{const i=t[0]?.contentRect.width??0;this.#s=i,clearTimeout(this.#u),this.#u=setTimeout(()=>{this.#c(i)},this.config.debounceMs??100)}),this.#t.observe(this.gridElement)}#f(e){if(this.#l.clear(),this.#n.clear(),!!e)for(const t of e)typeof t=="string"?this.#l.add(t):t.showValue?this.#n.add(t.field):this.#l.add(t.field)}detach(){this.#t?.disconnect(),this.#t=void 0,clearTimeout(this.#u),this.#u=void 0,this.gridElement&&this.gridElement.removeAttribute("data-responsive"),super.detach()}afterRender(){if(this.#_(),!(this.#g.length>0?this.#h!==null:this.#e))return;const t=this.#l.size>0,i=this.#n.size>0;if(!t&&!i)return;const o=this.gridElement.querySelectorAll(".cell[data-field]");for(const r of o){const s=r.getAttribute("data-field");s&&(this.#l.has(s)?(r.setAttribute("data-responsive-hidden",""),r.removeAttribute("data-responsive-value-only")):this.#n.has(s)?(r.setAttribute("data-responsive-value-only",""),r.removeAttribute("data-responsive-hidden")):(r.removeAttribute("data-responsive-hidden"),r.removeAttribute("data-responsive-value-only")))}}#c(e){if(this.#g.length>0){this.#m(e);return}const t=this.config.breakpoint??0;t===0&&!this.#d&&(this.#d=!0,console.warn("[tbw-grid:ResponsivePlugin] 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.#e&&(this.#e=i,this.#w(),this.emit("responsive-change",{isResponsive:i,width:e,breakpoint:t}),this.requestRender())}#m(e){let t=null;for(const o of this.#g)e<=o.maxWidth&&(t=o);if(t!==this.#h){this.#h=t,t?.hiddenColumns?this.#f(t.hiddenColumns):this.#f(this.config.hiddenColumns);const o=t?.cardLayout===!0;o!==this.#e&&(this.#e=o,this.#w()),this.emit("responsive-change",{isResponsive:this.#e,width:e,breakpoint:t?.maxWidth??0}),this.requestRender()}}#a;#w(){this.gridElement.toggleAttribute("data-responsive",this.#e);const e=this.config.animate!==!1;this.gridElement.toggleAttribute("data-responsive-animate",e),this.config.animationDuration&&this.gridElement.style.setProperty("--tbw-responsive-duration",`${this.config.animationDuration}ms`);const t=this.grid;if(this.#e){t._virtualization&&(this.#a=t._virtualization.rowHeight);const i=this.gridElement.querySelector(".tbw-scroll-area");i&&(i.scrollLeft=0)}else{const i=this.gridElement.querySelectorAll(".data-grid-row");for(const o of i)o.style.height="",o.classList.remove("responsive-card");this.#a&&this.#a>0&&t._virtualization&&(t._virtualization.rowHeight=this.#a,this.#a=void 0),this.#y=void 0,this.#C=void 0,this.#b=void 0}}renderRow(e,t,i){if(!this.#e||!this.config.cardRenderer||e.__isGroupRow)return;t.replaceChildren();const o=this.config.cardRenderer(e,i);t.className="data-grid-row responsive-card";const r=this.config.cardRowHeight??"auto";return r!=="auto"?t.style.height=`${r}px`:t.style.height="auto",t.appendChild(o),!0}onKeyDown(e){if(!this.#e||this.config.cardRenderer&&["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(),F(this.grid),!0;if(this.grid._focusRow<t)return this.grid._focusRow+=1,this.grid._focusCol=0,e.preventDefault(),F(this.grid),!0;break;case"ArrowUp":if(this.grid._focusCol>0)return this.grid._focusCol-=1,e.preventDefault(),F(this.grid),!0;if(this.grid._focusRow>0)return this.grid._focusRow-=1,this.grid._focusCol=i,e.preventDefault(),F(this.grid),!0;break;case"ArrowRight":if(this.grid._focusRow<t)return this.grid._focusRow+=1,e.preventDefault(),F(this.grid),!0;break;case"ArrowLeft":if(this.grid._focusRow>0)return this.grid._focusRow-=1,e.preventDefault(),F(this.grid),!0;break}return!1}#y;#C;#b;#E(){if(this.#y&&this.#y>0)return this.#y;const e=this.config.cardRowHeight;return typeof e=="number"&&e>0?e:80}#R(){return this.#C&&this.#C>0?this.#C:this.#a??28}#v(){for(const e of this.rows)if(e.__isGroupRow)return!0;return!1}#z(){let e=0,t=0;for(const i of this.rows)i.__isGroupRow?e++:t++;return{groupCount:e,cardCount:t}}getExtraHeight(){if(!this.#e||!this.config.cardRenderer||!this.#v())return 0;const e=this.#a??28,t=this.#R(),i=this.#E(),{groupCount:o,cardCount:r}=this.#z(),s=o*Math.max(0,t-e),l=r*Math.max(0,i-e);return s+l}getExtraHeightBefore(e){if(!this.#e||!this.config.cardRenderer||!this.#v())return 0;const t=this.#a??28,i=this.#R(),o=this.#E(),r=Math.max(0,i-t),s=Math.max(0,o-t);let l=0,a=0;const d=this.rows,c=Math.min(e,d.length);for(let u=0;u<c;u++)d[u].__isGroupRow?l++:a++;return l*r+a*s}#r(){let e=0;for(const t of this.rows)t.__isGroupRow||e++;return e}#x=!1;#_(){if(!this.#e||!this.config.cardRenderer)return;let e=!1;const t=this.grid,i=this.#v(),o=this.#r();if(o!==this.#b&&(this.#b=o,e=!0),i){const s=this.gridElement.querySelector(".data-grid-row.group-row");if(s){const l=s.getBoundingClientRect().height;l>0&&l!==this.#C&&(this.#C=l,e=!0)}}const r=this.gridElement.querySelector(".data-grid-row.responsive-card");if(r){const s=r.getBoundingClientRect().height;s>0&&s!==this.#y&&(this.#y=s,e=!0,!i&&t._virtualization&&(t._virtualization.rowHeight=s))}e&&!this.#x&&(this.#x=!0,queueMicrotask(()=>{this.#x=!1,this.grid&&this.#e&&this.grid.refreshVirtualWindow?.(!0,!0)}))}}const Hr='@layer tbw-plugins{.dg-row-drag-handle{display:flex;align-items:center;justify-content:center;cursor:grab;-webkit-user-select:none;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}.dg-row-drag-handle:hover{color:var(--tbw-row-reorder-handle-hover, var(--tbw-color-fg))}.dg-row-drag-handle:active{cursor:grabbing}.data-grid-row.dragging{opacity:.6}.data-grid-row.drop-target{position:relative}.data-grid-row.drop-target.drop-before:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));z-index:10}.data-grid-row.drop-target.drop-after:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));z-index:10}.data-grid-row.keyboard-moving{background-color:var(--tbw-row-reorder-moving-bg, var(--tbw-focus-background));box-shadow:0 0 0 1px var(--tbw-row-reorder-moving-border, var(--tbw-color-accent)) inset}.data-grid-row.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}}',xi="__tbw_row_drag";class Ir extends H{name="rowReorder";styles=Hr;get defaultConfig(){return{enableKeyboard:!0,showDragHandle:!0,dragHandlePosition:"left",dragHandleWidth:40,debounceMs:150,animation:"flip"}}get animationType(){return this.isAnimationEnabled?this.config.animation!==void 0?this.config.animation:"flip":!1}isDragging=!1;draggedRowIndex=null;dropRowIndex=null;pendingMove=null;debounceTimer=null;lastFocusCol=0;detach(){this.clearDebounceTimer(),this.isDragging=!1,this.draggedRowIndex=null,this.dropRowIndex=null,this.pendingMove=null}processColumns(e){if(!this.config.showDragHandle)return[...e];const t={field:xi,header:"",width:this.config.dragHandleWidth??40,resizable:!1,sortable:!1,filterable:!1,meta:{lockPosition:!0,suppressMovable:!0,utility:!0},viewRenderer:()=>{const i=document.createElement("div");return i.className="dg-row-drag-handle",i.setAttribute("aria-label","Drag to reorder"),i.setAttribute("role","button"),i.setAttribute("tabindex","-1"),i.draggable=!0,this.setIcon(i,this.resolveIcon("dragHandle")),i}};return this.config.dragHandlePosition==="right"?[...e,t]:[t,...e]}afterRender(){if(!this.config.showDragHandle)return;const e=this.gridElement;if(!e)return;e.querySelectorAll(".dg-row-drag-handle").forEach(o=>{const r=o;if(r.getAttribute("data-drag-bound"))return;r.setAttribute("data-drag-bound","true");const s=r.closest(".data-grid-row");s&&this.setupHandleDragListeners(r,s)}),e.querySelectorAll(".data-grid-row").forEach(o=>{const r=o;r.getAttribute("data-drop-bound")||(r.setAttribute("data-drop-bound","true"),this.setupRowDropListeners(r))})}onKeyDown(e){if(!this.config.enableKeyboard||!e.ctrlKey||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;const t=this.grid,i=t._focusRow,o=t._rows??this.sourceRows;if(i<0||i>=o.length)return;const r=e.key==="ArrowUp"?"up":"down",s=r==="up"?i-1:i+1;if(s<0||s>=o.length)return;const l=o[i];if(!(this.config.canMove&&!this.config.canMove(l,i,s,r)))return this.handleKeyboardMove(l,i,s,r,t._focusCol),e.preventDefault(),e.stopPropagation(),!0}onCellClick(){this.flushPendingMove()}moveRow(e,t){const i=[...this.sourceRows];if(e<0||e>=i.length||t<0||t>=i.length||e===t)return;const o=t<e?"up":"down",r=i[e];this.config.canMove&&!this.config.canMove(r,e,t,o)||this.executeMove(r,e,t,"keyboard")}canMoveRow(e,t){const i=this.sourceRows;if(e<0||e>=i.length||t<0||t>=i.length||e===t)return!1;if(!this.config.canMove)return!0;const o=t<e?"up":"down";return this.config.canMove(i[e],e,t,o)}setupHandleDragListeners(e,t){e.addEventListener("dragstart",i=>{const o=this.getRowIndex(t);o<0||(this.isDragging=!0,this.draggedRowIndex=o,i.dataTransfer&&(i.dataTransfer.effectAllowed="move",i.dataTransfer.setData("text/plain",String(o))),t.classList.add("dragging"))}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedRowIndex=null,this.dropRowIndex=null,this.clearDragClasses()})}setupRowDropListeners(e){e.addEventListener("dragover",t=>{if(t.preventDefault(),!this.isDragging||this.draggedRowIndex===null)return;const i=this.getRowIndex(e);if(i<0||i===this.draggedRowIndex)return;const o=e.getBoundingClientRect(),r=o.top+o.height/2,s=t.clientY<r;this.dropRowIndex=s?i:i+1,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=>{t.preventDefault();const i=this.draggedRowIndex;let o=this.dropRowIndex;if(!(!this.isDragging||i===null||o===null)&&(o>i&&o--,i!==o)){const s=this.sourceRows[i],l=o<i?"up":"down";(!this.config.canMove||this.config.canMove(s,i,o,l))&&this.executeMove(s,i,o,"drag")}})}handleKeyboardMove(e,t,i,o,r){this.pendingMove?this.pendingMove.currentIndex=i:this.pendingMove={originalIndex:t,currentIndex:i,row:e},this.lastFocusCol=r;const s=this.grid,l=[...s._rows??this.sourceRows],[a]=l.splice(t,1);l.splice(i,0,a),s._rows=l,s._focusRow=i,s._focusCol=r,s.refreshVirtualWindow(!0),F(s),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 o={row:i,fromIndex:e,toIndex:t,rows:[...this.sourceRows],source:"keyboard"};if(this.emitCancelable("row-move",o)){const s=[...this.sourceRows],[l]=s.splice(t,1);s.splice(e,0,l);const a=this.grid;a._rows=s,a._focusRow=e,a._focusCol=this.lastFocusCol,a.refreshVirtualWindow(!0),F(a)}}executeMove(e,t,i,o){const r=[...this.sourceRows],[s]=r.splice(t,1);r.splice(i,0,s);const l={row:e,fromIndex:t,toIndex:i,rows:r,source:o};if(!this.emitCancelable("row-move",l))if(this.animationType==="flip"&&this.gridElement){const d=this.captureRowPositions();this.grid.rows=r,requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(d,t,i)})}else this.grid.rows=r}captureRowPositions(){const e=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 o=this.gridElement;if(!o||e.size===0)return;const r=Math.min(t,i),s=Math.max(t,i),l=[];if(o.querySelectorAll(".data-grid-row").forEach(d=>{const c=d,u=this.getRowIndex(c);if(u<0||u<r||u>s)return;let h;u===i?h=t:t<i?h=u+1:h=u-1;const f=e.get(h);if(f===void 0)return;const p=c.getBoundingClientRect().top,g=f-p;Math.abs(g)>1&&l.push({el:c,deltaY:g})}),l.length===0)return;l.forEach(({el:d,deltaY:c})=>{d.style.transform=`translateY(${c}px)`}),o.offsetHeight;const a=this.animationDuration;requestAnimationFrame(()=>{l.forEach(({el:d})=>{d.classList.add("flip-animating"),d.style.transform=""}),setTimeout(()=>{l.forEach(({el:d})=>{d.style.transform="",d.classList.remove("flip-animating")})},a+50)})}getRowIndex(e){const t=e.querySelector(".cell[data-row]");return t?parseInt(t.getAttribute("data-row")??"-1",10):-1}clearDragClasses(){this.gridElement?.querySelectorAll(".data-grid-row").forEach(e=>{e.classList.remove("dragging","drop-target","drop-before","drop-after")})}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}}function re(n){return{startRow:Math.min(n.startRow,n.endRow),startCol:Math.min(n.startCol,n.endCol),endRow:Math.max(n.startRow,n.endRow),endCol:Math.max(n.startCol,n.endCol)}}function Mr(n){const e=re(n);return{from:{row:e.startRow,col:e.startCol},to:{row:e.endRow,col:e.endCol}}}function Ei(n){return n.map(Mr)}function Nr(n,e,t){const i=re(t);return n>=i.startRow&&n<=i.endRow&&e>=i.startCol&&e<=i.endCol}function Ri(n,e,t){return t.some(i=>Nr(n,e,i))}function Or(n){const e=[],t=re(n);for(let i=t.startRow;i<=t.endRow;i++)for(let o=t.startCol;o<=t.endCol;o++)e.push({row:i,col:o});return e}function zr(n){const e=new Map;for(const t of n)for(const i of Or(t))e.set(`${i.row},${i.col}`,i);return[...e.values()]}function rt(n,e){return{startRow:n.row,startCol:n.col,endRow:e.row,endCol:e.col}}function Se(n,e){const t=re(n),i=re(e);return t.startRow===i.startRow&&t.startCol===i.startCol&&t.endRow===i.endRow&&t.endCol===i.endCol}const Fr="@layer tbw-plugins{tbw-grid.selecting .data-grid-row>.cell{-webkit-user-select:none;user-select:none}tbw-grid[data-has-focus] .data-grid-row.row-focus{background-color:var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%))}tbw-grid[data-selection-mode=row] .cell-focus{outline:none}tbw-grid .data-grid-row>.cell.selected{background-color:var(--tbw-range-selection-bg)}tbw-grid .data-grid-row>.cell.selected.top{border-top:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.bottom{border-bottom:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.first{border-left:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.last{border-right:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row[data-selectable=false]{cursor:not-allowed;opacity:.6}tbw-grid .data-grid-row[data-selectable=false].row-focus{background-color:var(--tbw-color-row-alt)}tbw-grid .data-grid-row>.cell[data-selectable=false]{cursor:not-allowed;opacity:.6}tbw-grid .data-grid-row>.cell[data-selectable=false].selected{background-color:var(--tbw-selection-warning-bg, rgba(from var(--tbw-color-error) r g b / 50%))}tbw-grid .tbw-selection-summary{font-size:var(--tbw-font-size-sm, .8125rem);color:var(--tbw-color-fg-muted);white-space:nowrap}}";function qr(n,e,t){if(n==="cell"&&e.selectedCell)return{mode:n,ranges:[{from:{row:e.selectedCell.row,col:e.selectedCell.col},to:{row:e.selectedCell.row,col:e.selectedCell.col}}]};if(n==="row"&&e.selected.size>0){const i=[...e.selected].map(o=>({from:{row:o,col:0},to:{row:o,col:t-1}}));return{mode:n,ranges:i}}return n==="range"&&e.ranges.length>0?{mode:n,ranges:Ei(e.ranges)}:{mode:n,ranges:[]}}class Gr extends H{static manifest={configRules:[{id:"selection/range-dblclick",severity:"warn",message:`"triggerOn: 'dblclick'" has no effect when mode is "range".
154
+ Click OK to continue, or Cancel to abort.`))return}i.maxRows>0&&r>i.maxRows&&(s=i.maxRows,l=!0),this.#t=!0;const a=performance.now();this.emit("print-start",{rowCount:s,limitApplied:l,originalRowCount:r});try{const d=this.#h;this.#u={bypassThreshold:d._virtualization?.bypassThreshold??24},this.#a(),l&&(this.#d=this.sourceRows,this.grid.rows=this.sourceRows.slice(0,s),await new Promise(c=>setTimeout(c,50))),(i.includeTitle||i.includeTimestamp)&&this.#g(i),await this.#f(),await new Promise(c=>requestAnimationFrame(c)),await new Promise(c=>requestAnimationFrame(c)),t.classList.add(`print-${i.orientation}`),await new Promise(c=>requestAnimationFrame(c)),await new Promise(c=>requestAnimationFrame(c)),i.isolate?await this.#m(i):await this.#c(),this.emit("print-complete",{success:!0,rowCount:s,duration:Math.round(performance.now()-a)})}catch(d){console.error("[PrintPlugin] Print failed:",d),this.emit("print-complete",{success:!1,rowCount:0,duration:Math.round(performance.now()-a)})}finally{this.#y(),this.#t=!1}}#g(e){const t=this.gridElement;if(t){if(this.#s=document.createElement("div"),this.#s.className="tbw-print-header",e.includeTitle){const i=e.title||this.grid.effectiveConfig?.shell?.header?.title||"Grid Data",o=document.createElement("div");o.className="tbw-print-header-title",o.textContent=i,this.#s.appendChild(o)}if(e.includeTimestamp){const i=document.createElement("div");i.className="tbw-print-header-timestamp",i.textContent=`Printed: ${new Date().toLocaleString()}`,this.#s.appendChild(i)}t.insertBefore(this.#s,t.firstChild),this.#l=document.createElement("div"),this.#l.className="tbw-print-footer",this.#l.textContent=`Page generated from ${window.location.hostname}`,t.appendChild(this.#l)}}async#f(){const e=this.#h;if(!e._virtualization)return;const t=this.rows.length;e._virtualization.bypassThreshold=t+100,e.refreshVirtualWindow(!0),await new Promise(i=>setTimeout(i,100))}async#c(){return new Promise(e=>{const t=()=>{window.removeEventListener("afterprint",t),e()};window.addEventListener("afterprint",t),window.print(),setTimeout(()=>{typeof window<"u"&&window.removeEventListener("afterprint",t),e()},1e3)})}async#m(e){const t=this.gridElement;t&&await yi(t,{orientation:e.orientation})}#a(){const e=this.columns;if(e){this.#e=new Map;for(const t of e)t.printHidden&&t.field&&(this.#e.set(t.field,!t.hidden),this.grid.setColumnVisible(t.field,!1))}}#w(){if(this.#e){for(const[e,t]of this.#e)this.grid.setColumnVisible(e,t);this.#e=null}}#y(){const e=this.gridElement;if(!e)return;this.#w(),e.classList.remove("print-portrait","print-landscape"),this.#n!==null&&(e.style.transform="",e.style.transformOrigin="",e.style.width="",this.#n=null),this.#s&&(this.#s.remove(),this.#s=null),this.#l&&(this.#l.remove(),this.#l=null);const t=this.#h;this.#u&&t._virtualization&&(t._virtualization.bypassThreshold=this.#u.bypassThreshold,t.refreshVirtualWindow(!0),this.#u=null),this.#d!==null&&(this.grid.rows=this.#d,this.#d=null)}afterRender(){this.config?.button&&!this.#C&&(this.#b(),this.#C=!0)}#C=!1;#b(){this.#h.registerToolbarContent?.({id:"print-button",order:900,render:t=>{const i=document.createElement("button");i.className="tbw-toolbar-btn tbw-print-btn",i.title="Print grid",i.type="button";const o=this.resolveIcon("print")||"🖨️";this.setIcon(i,o),i.addEventListener("click",()=>{this.print()},{signal:this.disconnectSignal}),t.appendChild(i)}})}}function Tr(n){const e=n.meta??{};return e.lockPosition!==!0&&e.suppressMovable!==!0}function Ci(n,e,t){if(e===t||e<0||e>=n.length||t<0||t>n.length)return n;const i=[...n],[o]=i.splice(e,1);return i.splice(t,0,o),i}const kr='@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}}';class Lr extends H{name="reorder";styles=kr;get defaultConfig(){return{animation:"flip"}}get animationType(){return this.isAnimationEnabled?this.config.animation!==void 0?this.config.animation:"flip":!1}get animationDuration(){return this.config.animationDuration!==void 0?this.config.animationDuration:super.animationDuration}isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;canMoveColumnWithPlugins(e){return!e||!Tr(e)?!1:!this.grid.queryPlugins({type:qe.CAN_MOVE_COLUMN,context:e}).includes(!1)}clearDragClasses(){this.gridElement?.querySelectorAll(".header-row > .cell").forEach(e=>{e.classList.remove("dragging","drop-target","drop-before","drop-after")})}attach(e){super.attach(e),e.addEventListener("column-reorder-request",t=>{const i=t.detail;i?.field&&typeof i.toIndex=="number"&&this.moveColumn(i.field,i.toIndex)},{signal:this.disconnectSignal})}detach(){this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}afterRender(){const e=this.gridElement;if(!e)return;e.querySelectorAll(".header-row > .cell").forEach(i=>{const o=i,r=o.getAttribute("data-field");if(!r)return;const s=this.columns.find(l=>l.field===r);if(!this.canMoveColumnWithPlugins(s)){o.draggable=!1;return}o.draggable=!0,!o.getAttribute("data-dragstart-bound")&&(o.setAttribute("data-dragstart-bound","true"),o.addEventListener("dragstart",l=>{const d=this.getColumnOrder().indexOf(r);this.isDragging=!0,this.draggedField=r,this.draggedIndex=d,l.dataTransfer&&(l.dataTransfer.effectAllowed="move",l.dataTransfer.setData("text/plain",r)),o.classList.add("dragging")}),o.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses()}),o.addEventListener("dragover",l=>{if(l.preventDefault(),!this.isDragging||this.draggedField===r)return;const a=o.getBoundingClientRect(),d=a.left+a.width/2,u=this.getColumnOrder().indexOf(r);this.dropIndex=l.clientX<d?u:u+1,o.classList.add("drop-target"),o.classList.toggle("drop-before",l.clientX<d),o.classList.toggle("drop-after",l.clientX>=d)}),o.addEventListener("dragleave",()=>{o.classList.remove("drop-target","drop-before","drop-after")}),o.addEventListener("drop",l=>{l.preventDefault();const a=this.draggedField,d=this.draggedIndex,c=this.dropIndex;if(!this.isDragging||a===null||d===null||c===null)return;const u=c>d?c-1:c,h=this.getColumnOrder(),f=Ci(h,d,u),p={field:a,fromIndex:d,toIndex:u,columnOrder:f};this.emitCancelable("column-move",p)||this.updateColumnOrder(f)}))})}onKeyDown(e){if(!e.altKey||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;const t=this.grid,i=t._focusCol,o=t._visibleColumns;if(i<0||i>=o.length)return;const r=o[i];if(!this.canMoveColumnWithPlugins(r))return;const s=this.getColumnOrder(),l=s.indexOf(r.field);if(l===-1)return;const a=e.key==="ArrowLeft"?l-1:l+1;if(a<0||a>=s.length)return;const d=o.find(c=>c.field===s[a]);if(this.canMoveColumnWithPlugins(d))return this.moveColumn(r.field,a),t._focusCol=a,F(this.grid),e.preventDefault(),e.stopPropagation(),!0}getColumnOrder(){return this.grid.getColumnOrder()}moveColumn(e,t){const i=this.getColumnOrder(),o=i.indexOf(e);if(o===-1)return;const r=Ci(i,o,t);this.emitCancelable("column-move",{field:e,fromIndex:o,toIndex:t,columnOrder:r})||this.updateColumnOrder(r)}setColumnOrder(e){this.updateColumnOrder(e)}resetColumnOrder(){const e=this.columns.map(t=>t.field);this.updateColumnOrder(e)}captureHeaderPositions(){const e=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||e.size===0)return;const i=new Map;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(s=>{const l=s.getAttribute("data-field");if(!l)return;const a=e.get(l);if(a===void 0)return;const d=a-s.getBoundingClientRect().left;Math.abs(d)>1&&i.set(l,d)}),i.size===0)return;const o=[];if(t.querySelectorAll(".cell[data-field]").forEach(s=>{const l=i.get(s.getAttribute("data-field")??"");if(l!==void 0){const a=s;a.style.transform=`translateX(${l}px)`,o.push(a)}}),o.length===0)return;this.gridElement.offsetHeight;const r=this.animationDuration;requestAnimationFrame(()=>{o.forEach(s=>{s.classList.add("flip-animating"),s.style.transform=""}),setTimeout(()=>{o.forEach(s=>{s.style.transform="",s.classList.remove("flip-animating")})},r+50)})}animateFade(e){const t=this.gridElement;if(!t){e();return}const i=this.captureHeaderPositions();e();const o=new Set;if(t.querySelectorAll(".header-row > .cell[data-field]").forEach(l=>{const a=l.getAttribute("data-field");if(!a)return;const d=i.get(a);if(d===void 0)return;const c=l.getBoundingClientRect().left;Math.abs(d-c)>1&&o.add(a)}),o.size===0)return;const r=[];if(t.querySelectorAll(".cell[data-field]").forEach(l=>{const a=l.getAttribute("data-field");if(a&&o.has(a)){const d=l;d.classList.add("fade-animating"),r.push(d)}}),r.length===0)return;const s=this.animationDuration;setTimeout(()=>{r.forEach(l=>l.classList.remove("fade-animating"))},s+50)}updateColumnOrder(e){const t=this.animationType;if(t==="flip"&&this.gridElement){const i=this.captureHeaderPositions();this.grid.setColumnOrder(e),requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(i)})}else t==="fade"?this.animateFade(()=>this.grid.setColumnOrder(e)):this.grid.setColumnOrder(e);this.grid.requestStateChange?.()}}const Pr='tbw-grid[data-responsive-animate] .data-grid-row,tbw-grid[data-responsive-animate] .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}tbw-grid[data-responsive] .footer-row{display:none}tbw-grid[data-responsive] .tbw-scroll-area{overflow-x:hidden;min-width:0!important}tbw-grid[data-responsive] .rows-body-wrapper{min-width:0!important}tbw-grid[data-responsive] .data-grid-row:not(.group-row){display:block!important;grid-template-columns:none!important;padding:var(--tbw-cell-padding);padding-left: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}tbw-grid[data-responsive] .data-grid-row:not(.group-row):nth-child(2n){background:var(--tbw-color-row-alt)}tbw-grid[data-responsive] .data-grid-row:not(.group-row):hover{background:var(--tbw-color-row-hover)}tbw-grid[data-responsive] .data-grid-row:not(.group-row)[aria-selected=true]{background:var(--tbw-color-selection)}tbw-grid[data-responsive] .data-grid-row:not(.group-row)[aria-selected=true]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--tbw-color-accent)}tbw-grid[data-responsive] .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-right:none!important;background:transparent!important;white-space:normal!important;overflow:visible!important}tbw-grid[data-responsive] .data-grid-row:not(.group-row)>.cell:before{content:attr(data-header) ": ";font-weight:600;color:var(--tbw-color-header-fg);flex-shrink:0;margin-right:var(--tbw-spacing-md);min-width:100px}tbw-grid[data-responsive] .data-grid-row:not(.group-row)>.cell:after{content:none}tbw-grid[data-responsive] .cell[data-utility]{display:none!important}tbw-grid[data-responsive] .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .cell[data-responsive-value-only]{justify-content:flex-start!important;font-weight:500}tbw-grid[data-responsive] .cell[data-responsive-value-only]:before{display:none!important}tbw-grid:not([data-responsive]) .cell[data-responsive-hidden]{display:none!important}tbw-grid[data-responsive] .tbw-footer,tbw-grid[data-responsive] .tbw-pinned-rows,tbw-grid[data-responsive] .tbw-aggregation-rows{display:none!important}tbw-grid[data-responsive] .tbw-pinned-rows,tbw-grid[data-responsive] .tbw-aggregation-rows,tbw-grid[data-responsive] .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)}tbw-grid[data-responsive] .data-grid-row.responsive-card>*{width:100%}tbw-grid[data-responsive] .data-grid-row.responsive-card .cell:before{display:none}';class Dr extends H{name="responsive";version="1.0.0";styles=Pr;static manifest={incompatibleWith:[{name:"groupingRows",reason:"Responsive card layout does not yet support row grouping. The variable row heights (cards vs group headers) cause scroll calculation issues."}]};#t;#e=!1;#u;#d=!1;#s=0;#l=new Set;#n=new Set;#h=null;#g=[];isResponsive(){return this.#e}setResponsive(e){e!==this.#e&&(this.#e=e,this.#w(),this.emit("responsive-change",{isResponsive:e,width:this.#s,breakpoint:this.config.breakpoint??0}))}setBreakpoint(e){this.config.breakpoint=e,this.#c(this.#s)}setCardRenderer(e){this.config.cardRenderer=e,this.#e&&this.requestRender()}getWidth(){return this.#s}getActiveBreakpoint(){return this.#h}attach(e){super.attach(e),this.#f(this.config.hiddenColumns),this.config.breakpoints?.length&&(this.#g=[...this.config.breakpoints].sort((t,i)=>i.maxWidth-t.maxWidth)),this.#t=new ResizeObserver(t=>{const i=t[0]?.contentRect.width??0;this.#s=i,clearTimeout(this.#u),this.#u=setTimeout(()=>{this.#c(i)},this.config.debounceMs??100)}),this.#t.observe(this.gridElement)}#f(e){if(this.#l.clear(),this.#n.clear(),!!e)for(const t of e)typeof t=="string"?this.#l.add(t):t.showValue?this.#n.add(t.field):this.#l.add(t.field)}detach(){this.#t?.disconnect(),this.#t=void 0,clearTimeout(this.#u),this.#u=void 0,this.gridElement&&this.gridElement.removeAttribute("data-responsive"),super.detach()}afterRender(){if(this.#A(),!(this.#g.length>0?this.#h!==null:this.#e))return;const t=this.#l.size>0,i=this.#n.size>0;if(!t&&!i)return;const o=this.gridElement.querySelectorAll(".cell[data-field]");for(const r of o){const s=r.getAttribute("data-field");s&&(this.#l.has(s)?(r.setAttribute("data-responsive-hidden",""),r.removeAttribute("data-responsive-value-only")):this.#n.has(s)?(r.setAttribute("data-responsive-value-only",""),r.removeAttribute("data-responsive-hidden")):(r.removeAttribute("data-responsive-hidden"),r.removeAttribute("data-responsive-value-only")))}}#c(e){if(this.#g.length>0){this.#m(e);return}const t=this.config.breakpoint??0;t===0&&!this.#d&&(this.#d=!0,console.warn("[tbw-grid:ResponsivePlugin] 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.#e&&(this.#e=i,this.#w(),this.emit("responsive-change",{isResponsive:i,width:e,breakpoint:t}),this.requestRender())}#m(e){let t=null;for(const o of this.#g)e<=o.maxWidth&&(t=o);if(t!==this.#h){this.#h=t,t?.hiddenColumns?this.#f(t.hiddenColumns):this.#f(this.config.hiddenColumns);const o=t?.cardLayout===!0;o!==this.#e&&(this.#e=o,this.#w()),this.emit("responsive-change",{isResponsive:this.#e,width:e,breakpoint:t?.maxWidth??0}),this.requestRender()}}#a;#w(){this.gridElement.toggleAttribute("data-responsive",this.#e);const e=this.config.animate!==!1;this.gridElement.toggleAttribute("data-responsive-animate",e),this.config.animationDuration&&this.gridElement.style.setProperty("--tbw-responsive-duration",`${this.config.animationDuration}ms`);const t=this.grid;if(this.#e){t._virtualization&&(this.#a=t._virtualization.rowHeight);const i=this.gridElement.querySelector(".tbw-scroll-area");i&&(i.scrollLeft=0)}else{const i=this.gridElement.querySelectorAll(".data-grid-row");for(const o of i)o.style.height="",o.classList.remove("responsive-card");this.#a&&this.#a>0&&t._virtualization&&(t._virtualization.rowHeight=this.#a,this.#a=void 0),this.#y=void 0,this.#C=void 0,this.#b=void 0}}renderRow(e,t,i){if(!this.#e||!this.config.cardRenderer||e.__isGroupRow)return;t.replaceChildren();const o=this.config.cardRenderer(e,i);t.className="data-grid-row responsive-card";const r=this.config.cardRowHeight??"auto";return r!=="auto"?t.style.height=`${r}px`:t.style.height="auto",t.appendChild(o),!0}onKeyDown(e){if(!this.#e||this.config.cardRenderer&&["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(),F(this.grid),!0;if(this.grid._focusRow<t)return this.grid._focusRow+=1,this.grid._focusCol=0,e.preventDefault(),F(this.grid),!0;break;case"ArrowUp":if(this.grid._focusCol>0)return this.grid._focusCol-=1,e.preventDefault(),F(this.grid),!0;if(this.grid._focusRow>0)return this.grid._focusRow-=1,this.grid._focusCol=i,e.preventDefault(),F(this.grid),!0;break;case"ArrowRight":if(this.grid._focusRow<t)return this.grid._focusRow+=1,e.preventDefault(),F(this.grid),!0;break;case"ArrowLeft":if(this.grid._focusRow>0)return this.grid._focusRow-=1,e.preventDefault(),F(this.grid),!0;break}return!1}#y;#C;#b;#E(){if(this.#y&&this.#y>0)return this.#y;const e=this.config.cardRowHeight;return typeof e=="number"&&e>0?e:80}#R(){return this.#C&&this.#C>0?this.#C:this.#a??28}#v(){for(const e of this.rows)if(e.__isGroupRow)return!0;return!1}#B(){let e=0,t=0;for(const i of this.rows)i.__isGroupRow?e++:t++;return{groupCount:e,cardCount:t}}getExtraHeight(){if(!this.#e||!this.config.cardRenderer||!this.#v())return 0;const e=this.#a??28,t=this.#R(),i=this.#E(),{groupCount:o,cardCount:r}=this.#B(),s=o*Math.max(0,t-e),l=r*Math.max(0,i-e);return s+l}getExtraHeightBefore(e){if(!this.#e||!this.config.cardRenderer||!this.#v())return 0;const t=this.#a??28,i=this.#R(),o=this.#E(),r=Math.max(0,i-t),s=Math.max(0,o-t);let l=0,a=0;const d=this.rows,c=Math.min(e,d.length);for(let u=0;u<c;u++)d[u].__isGroupRow?l++:a++;return l*r+a*s}#r(){let e=0;for(const t of this.rows)t.__isGroupRow||e++;return e}#x=!1;#A(){if(!this.#e||!this.config.cardRenderer)return;let e=!1;const t=this.grid,i=this.#v(),o=this.#r();if(o!==this.#b&&(this.#b=o,e=!0),i){const s=this.gridElement.querySelector(".data-grid-row.group-row");if(s){const l=s.getBoundingClientRect().height;l>0&&l!==this.#C&&(this.#C=l,e=!0)}}const r=this.gridElement.querySelector(".data-grid-row.responsive-card");if(r){const s=r.getBoundingClientRect().height;s>0&&s!==this.#y&&(this.#y=s,e=!0,!i&&t._virtualization&&(t._virtualization.rowHeight=s))}e&&!this.#x&&(this.#x=!0,queueMicrotask(()=>{this.#x=!1,this.grid&&this.#e&&this.grid.refreshVirtualWindow?.(!0,!0)}))}}const Hr='@layer tbw-plugins{.dg-row-drag-handle{display:flex;align-items:center;justify-content:center;cursor:grab;-webkit-user-select:none;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}.dg-row-drag-handle:hover{color:var(--tbw-row-reorder-handle-hover, var(--tbw-color-fg))}.dg-row-drag-handle:active{cursor:grabbing}.data-grid-row.dragging{opacity:.6}.data-grid-row.drop-target{position:relative}.data-grid-row.drop-target.drop-before:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background-color:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));z-index:10}.data-grid-row.drop-target.drop-after:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--tbw-row-reorder-indicator, var(--tbw-color-accent));z-index:10}.data-grid-row.keyboard-moving{background-color:var(--tbw-row-reorder-moving-bg, var(--tbw-focus-background));box-shadow:0 0 0 1px var(--tbw-row-reorder-moving-border, var(--tbw-color-accent)) inset}.data-grid-row.flip-animating{transition:transform var(--tbw-animation-duration, .2s) ease-out;will-change:transform;z-index:1}}',xi="__tbw_row_drag";class Ir extends H{name="rowReorder";styles=Hr;get defaultConfig(){return{enableKeyboard:!0,showDragHandle:!0,dragHandlePosition:"left",dragHandleWidth:40,debounceMs:150,animation:"flip"}}get animationType(){return this.isAnimationEnabled?this.config.animation!==void 0?this.config.animation:"flip":!1}isDragging=!1;draggedRowIndex=null;dropRowIndex=null;pendingMove=null;debounceTimer=null;lastFocusCol=0;detach(){this.clearDebounceTimer(),this.isDragging=!1,this.draggedRowIndex=null,this.dropRowIndex=null,this.pendingMove=null}processColumns(e){if(!this.config.showDragHandle)return[...e];const t={field:xi,header:"",width:this.config.dragHandleWidth??40,resizable:!1,sortable:!1,filterable:!1,meta:{lockPosition:!0,suppressMovable:!0,utility:!0},viewRenderer:()=>{const i=document.createElement("div");return i.className="dg-row-drag-handle",i.setAttribute("aria-label","Drag to reorder"),i.setAttribute("role","button"),i.setAttribute("tabindex","-1"),i.draggable=!0,this.setIcon(i,this.resolveIcon("dragHandle")),i}};return this.config.dragHandlePosition==="right"?[...e,t]:[t,...e]}afterRender(){if(!this.config.showDragHandle)return;const e=this.gridElement;if(!e)return;e.querySelectorAll(".dg-row-drag-handle").forEach(o=>{const r=o;if(r.getAttribute("data-drag-bound"))return;r.setAttribute("data-drag-bound","true");const s=r.closest(".data-grid-row");s&&this.setupHandleDragListeners(r,s)}),e.querySelectorAll(".data-grid-row").forEach(o=>{const r=o;r.getAttribute("data-drop-bound")||(r.setAttribute("data-drop-bound","true"),this.setupRowDropListeners(r))})}onKeyDown(e){if(!this.config.enableKeyboard||!e.ctrlKey||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;const t=this.grid,i=t._focusRow,o=t._rows??this.sourceRows;if(i<0||i>=o.length)return;const r=e.key==="ArrowUp"?"up":"down",s=r==="up"?i-1:i+1;if(s<0||s>=o.length)return;const l=o[i];if(!(this.config.canMove&&!this.config.canMove(l,i,s,r)))return this.handleKeyboardMove(l,i,s,r,t._focusCol),e.preventDefault(),e.stopPropagation(),!0}onCellClick(){this.flushPendingMove()}moveRow(e,t){const i=[...this.sourceRows];if(e<0||e>=i.length||t<0||t>=i.length||e===t)return;const o=t<e?"up":"down",r=i[e];this.config.canMove&&!this.config.canMove(r,e,t,o)||this.executeMove(r,e,t,"keyboard")}canMoveRow(e,t){const i=this.sourceRows;if(e<0||e>=i.length||t<0||t>=i.length||e===t)return!1;if(!this.config.canMove)return!0;const o=t<e?"up":"down";return this.config.canMove(i[e],e,t,o)}setupHandleDragListeners(e,t){e.addEventListener("dragstart",i=>{const o=this.getRowIndex(t);o<0||(this.isDragging=!0,this.draggedRowIndex=o,i.dataTransfer&&(i.dataTransfer.effectAllowed="move",i.dataTransfer.setData("text/plain",String(o))),t.classList.add("dragging"))}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedRowIndex=null,this.dropRowIndex=null,this.clearDragClasses()})}setupRowDropListeners(e){e.addEventListener("dragover",t=>{if(t.preventDefault(),!this.isDragging||this.draggedRowIndex===null)return;const i=this.getRowIndex(e);if(i<0||i===this.draggedRowIndex)return;const o=e.getBoundingClientRect(),r=o.top+o.height/2,s=t.clientY<r;this.dropRowIndex=s?i:i+1,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=>{t.preventDefault();const i=this.draggedRowIndex;let o=this.dropRowIndex;if(!(!this.isDragging||i===null||o===null)&&(o>i&&o--,i!==o)){const s=this.sourceRows[i],l=o<i?"up":"down";(!this.config.canMove||this.config.canMove(s,i,o,l))&&this.executeMove(s,i,o,"drag")}})}handleKeyboardMove(e,t,i,o,r){this.pendingMove?this.pendingMove.currentIndex=i:this.pendingMove={originalIndex:t,currentIndex:i,row:e},this.lastFocusCol=r;const s=this.grid,l=[...s._rows??this.sourceRows],[a]=l.splice(t,1);l.splice(i,0,a),s._rows=l,s._focusRow=i,s._focusCol=r,s.refreshVirtualWindow(!0),F(s),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 o={row:i,fromIndex:e,toIndex:t,rows:[...this.sourceRows],source:"keyboard"};if(this.emitCancelable("row-move",o)){const s=[...this.sourceRows],[l]=s.splice(t,1);s.splice(e,0,l);const a=this.grid;a._rows=s,a._focusRow=e,a._focusCol=this.lastFocusCol,a.refreshVirtualWindow(!0),F(a)}}executeMove(e,t,i,o){const r=[...this.sourceRows],[s]=r.splice(t,1);r.splice(i,0,s);const l={row:e,fromIndex:t,toIndex:i,rows:r,source:o};if(!this.emitCancelable("row-move",l))if(this.animationType==="flip"&&this.gridElement){const d=this.captureRowPositions();this.grid.rows=r,requestAnimationFrame(()=>{this.gridElement.offsetHeight,this.animateFLIP(d,t,i)})}else this.grid.rows=r}captureRowPositions(){const e=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 o=this.gridElement;if(!o||e.size===0)return;const r=Math.min(t,i),s=Math.max(t,i),l=[];if(o.querySelectorAll(".data-grid-row").forEach(d=>{const c=d,u=this.getRowIndex(c);if(u<0||u<r||u>s)return;let h;u===i?h=t:t<i?h=u+1:h=u-1;const f=e.get(h);if(f===void 0)return;const p=c.getBoundingClientRect().top,g=f-p;Math.abs(g)>1&&l.push({el:c,deltaY:g})}),l.length===0)return;l.forEach(({el:d,deltaY:c})=>{d.style.transform=`translateY(${c}px)`}),o.offsetHeight;const a=this.animationDuration;requestAnimationFrame(()=>{l.forEach(({el:d})=>{d.classList.add("flip-animating"),d.style.transform=""}),setTimeout(()=>{l.forEach(({el:d})=>{d.style.transform="",d.classList.remove("flip-animating")})},a+50)})}getRowIndex(e){const t=e.querySelector(".cell[data-row]");return t?parseInt(t.getAttribute("data-row")??"-1",10):-1}clearDragClasses(){this.gridElement?.querySelectorAll(".data-grid-row").forEach(e=>{e.classList.remove("dragging","drop-target","drop-before","drop-after")})}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}}function re(n){return{startRow:Math.min(n.startRow,n.endRow),startCol:Math.min(n.startCol,n.endCol),endRow:Math.max(n.startRow,n.endRow),endCol:Math.max(n.startCol,n.endCol)}}function Mr(n){const e=re(n);return{from:{row:e.startRow,col:e.startCol},to:{row:e.endRow,col:e.endCol}}}function Ei(n){return n.map(Mr)}function Nr(n,e,t){const i=re(t);return n>=i.startRow&&n<=i.endRow&&e>=i.startCol&&e<=i.endCol}function Ri(n,e,t){return t.some(i=>Nr(n,e,i))}function zr(n){const e=[],t=re(n);for(let i=t.startRow;i<=t.endRow;i++)for(let o=t.startCol;o<=t.endCol;o++)e.push({row:i,col:o});return e}function Or(n){const e=new Map;for(const t of n)for(const i of zr(t))e.set(`${i.row},${i.col}`,i);return[...e.values()]}function rt(n,e){return{startRow:n.row,startCol:n.col,endRow:e.row,endCol:e.col}}function Se(n,e){const t=re(n),i=re(e);return t.startRow===i.startRow&&t.startCol===i.startCol&&t.endRow===i.endRow&&t.endCol===i.endCol}const Fr="@layer tbw-plugins{tbw-grid.selecting .data-grid-row>.cell{-webkit-user-select:none;user-select:none}tbw-grid[data-has-focus] .data-grid-row.row-focus{background-color:var(--tbw-focus-background, rgba(from var(--tbw-color-accent) r g b / 12%))}tbw-grid[data-selection-mode=row] .cell-focus{outline:none}tbw-grid .data-grid-row>.cell.selected{background-color:var(--tbw-range-selection-bg)}tbw-grid .data-grid-row>.cell.selected.top{border-top:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.bottom{border-bottom:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.first{border-left:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row>.cell.selected.last{border-right:2px solid var(--tbw-range-border-color)}tbw-grid .data-grid-row[data-selectable=false]{cursor:not-allowed;opacity:.6}tbw-grid .data-grid-row[data-selectable=false].row-focus{background-color:var(--tbw-color-row-alt)}tbw-grid .data-grid-row>.cell[data-selectable=false]{cursor:not-allowed;opacity:.6}tbw-grid .data-grid-row>.cell[data-selectable=false].selected{background-color:var(--tbw-selection-warning-bg, rgba(from var(--tbw-color-error) r g b / 50%))}tbw-grid .tbw-selection-summary{font-size:var(--tbw-font-size-sm, .8125rem);color:var(--tbw-color-fg-muted);white-space:nowrap}}";function qr(n,e,t){if(n==="cell"&&e.selectedCell)return{mode:n,ranges:[{from:{row:e.selectedCell.row,col:e.selectedCell.col},to:{row:e.selectedCell.row,col:e.selectedCell.col}}]};if(n==="row"&&e.selected.size>0){const i=[...e.selected].map(o=>({from:{row:o,col:0},to:{row:o,col:t-1}}));return{mode:n,ranges:i}}return n==="range"&&e.ranges.length>0?{mode:n,ranges:Ei(e.ranges)}:{mode:n,ranges:[]}}class Gr extends H{static manifest={configRules:[{id:"selection/range-dblclick",severity:"warn",message:`"triggerOn: 'dblclick'" has no effect when mode is "range".
155
155
  → Range selection uses drag interaction (mousedown → mousemove), not click events.
156
- → The "triggerOn" option only affects "cell" and "row" selection modes.`,check:e=>e.mode==="range"&&e.triggerOn==="dblclick"}]};name="selection";styles=Fr;get defaultConfig(){return{mode:"cell",triggerOn:"click",enabled:!0}}selected=new Set;lastSelected=null;anchor=null;ranges=[];activeRange=null;cellAnchor=null;isDragging=!1;pendingKeyboardUpdate=null;selectedCell=null;isSelectionEnabled(){return this.config.enabled===!1?!1:this.grid.effectiveConfig?.selectable!==!1}checkSelectable(e,t){const{isSelectable:i}=this.config;if(!i)return!0;const o=this.rows[e];if(!o)return!1;const r=t!==void 0?this.columns[t]:void 0;return i(o,e,r,t)}isRowSelectable(e){return this.checkSelectable(e)}isCellSelectable(e,t){return this.checkSelectable(e,t)}detach(){this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.isDragging=!1,this.selectedCell=null,this.pendingKeyboardUpdate=null}onCellClick(e){if(!this.isSelectionEnabled())return!1;const{rowIndex:t,colIndex:i,originalEvent:o}=e,{mode:r,triggerOn:s="click"}=this.config;if(o.type!==s)return!1;const l=this.columns[i],a=l&&$(l);if(r==="cell"){if(a||!this.isCellSelectable(t,i))return!1;const d=this.selectedCell;return d&&d.row===t&&d.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#e()),this.requestAfterRender()),!1}if(r==="row")return!this.isRowSelectable(t)||this.selected.size===1&&this.selected.has(t)||(this.selected.clear(),this.selected.add(t),this.lastSelected=t,this.emit("selection-change",this.#e()),this.requestAfterRender()),!1;if(r==="range"){if(a||!this.isCellSelectable(t,i))return!1;const d=o.shiftKey,c=o.ctrlKey||o.metaKey;if(d&&this.cellAnchor){const u=rt(this.cellAnchor,{row:t,col:i}),h=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;if(h&&Se(h,u))return!1;c?this.ranges.length>0?this.ranges[this.ranges.length-1]=u:this.ranges.push(u):this.ranges=[u],this.activeRange=u}else if(c){const u={startRow:t,startCol:i,endRow:t,endCol:i};this.ranges.push(u),this.activeRange=u,this.cellAnchor={row:t,col:i}}else{const u={startRow:t,startCol:i,endRow:t,endCol:i};if(this.ranges.length===1&&Se(this.ranges[0],u))return!1;this.ranges=[u],this.activeRange=u,this.cellAnchor={row:t,col:i}}return this.emit("selection-change",this.#e()),this.requestAfterRender(),!1}return!1}onKeyDown(e){if(!this.isSelectionEnabled())return!1;const{mode:t}=this.config,o=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","Home","End","PageUp","PageDown"].includes(e.key);if(e.key==="Escape")return t==="cell"?this.selectedCell=null:t==="row"?(this.selected.clear(),this.anchor=null):t==="range"&&(this.ranges=[],this.activeRange=null,this.cellAnchor=null),this.emit("selection-change",this.#e()),this.requestAfterRender(),!0;if(t==="cell"&&o)return queueMicrotask(()=>{const r=this.grid._focusRow,s=this.grid._focusCol;this.isCellSelectable(r,s)?this.selectedCell={row:r,col:s}:this.selectedCell=null,this.emit("selection-change",this.#e()),this.requestAfterRender()}),!1;if(t==="row"&&(e.key==="ArrowUp"||e.key==="ArrowDown"))return queueMicrotask(()=>{const r=this.grid._focusRow;this.isRowSelectable(r)?(this.selected.clear(),this.selected.add(r),this.lastSelected=r):this.selected.clear(),this.emit("selection-change",this.#e()),this.requestAfterRender()}),!1;if(t==="range"&&o){const r=e.key==="Tab",s=e.shiftKey&&!r;return s&&!this.cellAnchor&&(this.cellAnchor={row:this.grid._focusRow,col:this.grid._focusCol}),this.pendingKeyboardUpdate={shiftKey:s},queueMicrotask(()=>this.requestAfterRender()),!1}if(t==="range"&&e.key==="a"&&(e.ctrlKey||e.metaKey)){const r=this.rows.length,s=this.columns.length;if(r>0&&s>0){e.preventDefault(),e.stopPropagation();const l={startRow:0,startCol:0,endRow:r-1,endCol:s-1};return this.ranges=[l],this.activeRange=l,this.emit("selection-change",this.#e()),this.requestAfterRender(),!0}}return!1}onCellMouseDown(e){if(!this.isSelectionEnabled()||this.config.mode!=="range"||e.rowIndex===void 0||e.colIndex===void 0||e.rowIndex<0)return;const t=this.columns[e.colIndex];if(t&&$(t)||!this.isCellSelectable(e.rowIndex,e.colIndex)||e.originalEvent.shiftKey&&this.cellAnchor)return;this.isDragging=!0;const i=e.rowIndex,o=e.colIndex,r=e.originalEvent.ctrlKey||e.originalEvent.metaKey,s={startRow:i,startCol:o,endRow:i,endCol:o};return!r&&this.ranges.length===1&&Se(this.ranges[0],s)?(this.cellAnchor={row:i,col:o},!0):(this.cellAnchor={row:i,col:o},r||(this.ranges=[]),this.ranges.push(s),this.activeRange=s,this.emit("selection-change",this.#e()),this.requestAfterRender(),!0)}onCellMouseMove(e){if(!this.isSelectionEnabled()||this.config.mode!=="range"||!this.isDragging||!this.cellAnchor||e.rowIndex===void 0||e.colIndex===void 0||e.rowIndex<0)return;let t=e.colIndex;const i=this.columns[t];if(i&&$(i)){const s=this.columns.findIndex(l=>!$(l));s>=0&&(t=s)}const o=rt(this.cellAnchor,{row:e.rowIndex,col:t}),r=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;return r&&Se(r,o)||(this.ranges.length>0?this.ranges[this.ranges.length-1]=o:this.ranges.push(o),this.activeRange=o,this.emit("selection-change",this.#e()),this.requestAfterRender()),!0}onCellMouseUp(e){if(this.isSelectionEnabled()&&this.config.mode==="range"&&this.isDragging)return this.isDragging=!1,!0}#t(){const e=this.gridElement;if(!e)return;const{mode:t}=this.config,i=!!this.config.isSelectable;e.querySelectorAll(".cell").forEach(s=>{s.classList.remove("selected","top","bottom","first","last"),i&&s.removeAttribute("data-selectable")});const r=e.querySelectorAll(".data-grid-row");if(r.forEach(s=>{s.classList.remove("selected","row-focus"),i&&s.removeAttribute("data-selectable")}),t==="row"&&(ae(e),r.forEach(s=>{const l=s.querySelector(".cell[data-row]"),a=Pe(l);a>=0&&(i&&!this.isRowSelectable(a)&&s.setAttribute("data-selectable","false"),this.selected.has(a)&&s.classList.add("selected","row-focus"))})),(t==="cell"||t==="range")&&i&&e.querySelectorAll(".cell[data-row][data-col]").forEach(l=>{const a=parseInt(l.getAttribute("data-row")??"-1",10),d=parseInt(l.getAttribute("data-col")??"-1",10);a>=0&&d>=0&&(this.isCellSelectable(a,d)||l.setAttribute("data-selectable","false"))}),t==="range"&&this.ranges.length>0){ae(e);const s=this.activeRange?re(this.activeRange):null,l=this.columns.findIndex(d=>!$(d));this.columns.length-1,e.querySelectorAll(".cell[data-row][data-col]").forEach(d=>{const c=parseInt(d.getAttribute("data-row")??"-1",10),u=parseInt(d.getAttribute("data-col")??"-1",10);if(c>=0&&u>=0){const h=this.columns[u];if(h&&$(h))return;if(Ri(c,u,this.ranges)&&(d.classList.add("selected"),s)){c===s.startRow&&d.classList.add("top"),c===s.endRow&&d.classList.add("bottom");const p=Math.max(s.startCol,l);u===p&&d.classList.add("first"),u===s.endCol&&d.classList.add("last")}}})}}afterRender(){if(!this.isSelectionEnabled())return;const e=this.gridElement;if(!e)return;const t=e.children[0],{mode:i}=this.config;if(this.pendingKeyboardUpdate&&i==="range"){const{shiftKey:o}=this.pendingKeyboardUpdate;this.pendingKeyboardUpdate=null;const r=this.grid._focusRow,s=this.grid._focusCol;if(o&&this.cellAnchor){const l=rt(this.cellAnchor,{row:r,col:s});this.ranges=[l],this.activeRange=l}else o||(this.ranges=[],this.activeRange=null,this.cellAnchor={row:r,col:s});this.emit("selection-change",this.#e())}this.grid.setAttribute("data-selection-mode",i),t&&t.classList.toggle("selecting",this.isDragging),this.#t()}onScrollRender(){this.isSelectionEnabled()&&this.#t()}getSelection(){return{mode:this.config.mode,ranges:this.#e().ranges,anchor:this.cellAnchor}}getSelectedCells(){return zr(this.ranges)}isCellSelected(e,t){return Ri(e,t,this.ranges)}clearSelection(){this.selectedCell=null,this.selected.clear(),this.anchor=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.emit("selection-change",{mode:this.config.mode,ranges:[]}),this.requestAfterRender()}setRanges(e){this.ranges=e.map(t=>({startRow:t.from.row,startCol:t.from.col,endRow:t.to.row,endCol:t.to.col})),this.activeRange=this.ranges.length>0?this.ranges[this.ranges.length-1]:null,this.emit("selection-change",{mode:this.config.mode,ranges:Ei(this.ranges)}),this.requestAfterRender()}#e(){return qr(this.config.mode,{selectedCell:this.selectedCell,selected:this.selected,ranges:this.ranges},this.columns.length)}}function _e(n,e){return Math.floor(n/e)}function Br(n,e){return{start:n*e,end:(n+1)*e}}function Kr(n,e,t){const i=_e(n,t),o=_e(e-1,t),r=[];for(let s=i;s<=o;s++)r.push(s);return r}async function Si(n,e,t,i){const o=Br(e,t);return n.getRows({startRow:o.start,endRow:o.end,sortModel:i.sortModel,filterModel:i.filterModel})}function Vr(n,e,t){const i=_e(n,e),o=t.get(i);if(!o)return;const r=n%e;return o[r]}const $r=100;class Wr extends H{name="serverSide";get defaultConfig(){return{pageSize:100,cacheBlockSize:100,maxConcurrentRequests:2}}dataSource=null;totalRowCount=0;loadedBlocks=new Map;loadingBlocks=new Set;lastRequestId=0;scrollDebounceTimer;detach(){this.dataSource=null,this.totalRowCount=0,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.lastRequestId=0,this.scrollDebounceTimer&&(clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=void 0)}loadRequiredBlocks(){if(!this.dataSource)return;const e=this.grid,t=this.config.cacheBlockSize??100,i={startRow:e._virtualization.start,endRow:e._virtualization.end},o=Kr(i.startRow,i.endRow,t);for(const r of o)if(!(this.loadedBlocks.has(r)||this.loadingBlocks.has(r))){if(this.loadingBlocks.size>=(this.config.maxConcurrentRequests??2))break;this.loadingBlocks.add(r),Si(this.dataSource,r,t,{}).then(s=>{this.loadedBlocks.set(r,s.rows),this.totalRowCount=s.totalRowCount,this.loadingBlocks.delete(r),this.requestRender(),this.loadRequiredBlocks()}).catch(()=>{this.loadingBlocks.delete(r)})}}processRows(e){if(!this.dataSource)return[...e];const t=[];for(let i=0;i<this.totalRowCount;i++){const o=Vr(i,this.config.cacheBlockSize??100,this.loadedBlocks);t.push(o??{__loading:!0,__index:i})}return t}onScroll(e){this.dataSource&&(this.loadRequiredBlocks(),this.scrollDebounceTimer&&clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=setTimeout(()=>{this.loadRequiredBlocks()},$r))}setDataSource(e){this.dataSource=e,this.loadedBlocks.clear(),this.loadingBlocks.clear();const t=this.config.cacheBlockSize??100;Si(e,0,t,{}).then(i=>{this.loadedBlocks.set(0,i.rows),this.totalRowCount=i.totalRowCount,this.requestRender()})}refresh(){this.dataSource&&(this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.requestRender())}purgeCache(){this.loadedBlocks.clear()}getTotalRowCount(){return this.totalRowCount}isRowLoaded(e){const t=this.config.cacheBlockSize??100,i=_e(e,t);return this.loadedBlocks.has(i)}getLoadedBlockCount(){return this.loadedBlocks.size}}function _i(n,e,t){return n.id!==void 0?String(n.id):t?`${t}-${e}`:String(e)}function st(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function lt(n,e,t=null,i=0){const o=e.childrenField??"children",r=new Set;for(let s=0;s<n.length;s++){const l=n[s],a=_i(l,s,t),d=l[o];if(Array.isArray(d)&&d.length>0){r.add(a);const c=lt(d,e,a,i+1);for(const u of c)r.add(u)}}return r}function Ur(){return new Set}function Ai(n,e,t,i=null,o=0){const r=t.childrenField??"children";for(let s=0;s<n.length;s++){const l=n[s],a=_i(l,s,i);if(a===e)return[a];const d=l[r];if(Array.isArray(d)&&d.length>0){const c=Ai(d,e,t,a,o+1);if(c)return[a,...c]}}return null}function jr(n,e,t,i){const o=Ai(n,e,t);if(!o)return i;const r=new Set(i);for(let s=0;s<o.length-1;s++)r.add(o[s]);return r}function Ti(n,e="children"){if(!Array.isArray(n)||n.length===0)return!1;for(const t of n){if(!t)continue;const i=t[e];if(Array.isArray(i)&&i.length>0)return!0}return!1}function Yr(n){if(!Array.isArray(n)||n.length===0)return null;const e=["children","items","nodes","subRows","nested"];for(const t of n)if(!(!t||typeof t!="object"))for(const i of e){const o=t[i];if(Array.isArray(o)&&o.length>0)return i}return null}const Xr="@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:flex-start}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}tbw-grid .tree-cell-wrapper{display:inline-flex;align-items:center;padding-left:calc(var(--tbw-tree-depth, 0) * var(--tbw-tree-indent-width, var(--tbw-tree-toggle-size, 1.25em)))}tbw-grid .tree-expander{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;box-sizing:border-box}tbw-grid .tree-toggle{cursor:pointer;-webkit-user-select:none;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}tbw-grid .tree-toggle:hover{color:var(--tbw-tree-accent, var(--tbw-color-accent))}tbw-grid .tree-spacer{width:var(--tbw-tree-toggle-size, 1.25em);display:inline-block;flex-shrink:0}tbw-grid .data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}tbw-grid .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}}}";class Zr extends H{name="tree";styles=Xr;get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=new Map;previousVisibleKeys=new Set;keysToAnimate=new Set;sortState=null;detach(){this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}detect(e){if(!this.config.autoDetect)return!1;const t=e,i=this.config.childrenField??Yr(t)??"children";return Ti(t,i)}processRows(e){const t=this.config.childrenField??"children",i=e;if(!Ti(i,t))return this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),[...e];let o=this.withStableKeys(i);this.sortState&&(o=this.sortTree(o,this.sortState.field,this.sortState.direction)),this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=lt(o,this.config),this.initialExpansionDone=!0),this.flattenedRows=this.flattenTree(o,this.expandedKeys),this.rowKeyMap.clear(),this.keysToAnimate.clear();const r=new Set;for(const s of this.flattenedRows)this.rowKeyMap.set(s.key,s),r.add(s.key),!this.previousVisibleKeys.has(s.key)&&s.depth>0&&this.keysToAnimate.add(s.key);return this.previousVisibleKeys=r,this.flattenedRows.map(s=>({...s.data,__treeKey:s.key,__treeDepth:s.depth,__treeHasChildren:s.hasChildren,__treeExpanded:s.isExpanded}))}withStableKeys(e,t=null){const i=this.config.childrenField??"children";return e.map((o,r)=>{const s=o.__stableKey,l=o.id!==void 0?String(o.id):s??(t?`${t}-${r}`:String(r)),a=o[i],d=Array.isArray(a)&&a.length>0;return{...o,__stableKey:l,...d?{[i]:this.withStableKeys(a,l)}:{}}})}flattenTree(e,t,i=0){const o=this.config.childrenField??"children",r=[];for(const s of e){const a=s.__stableKey??String(s.id??"?"),d=s[o],c=Array.isArray(d)&&d.length>0,u=t.has(a);r.push({key:a,data:s,depth:i,hasChildren:c,isExpanded:u,parentKey:i>0&&a.substring(0,a.lastIndexOf("-"))||null}),c&&u&&r.push(...this.flattenTree(d,t,i+1))}return r}sortTree(e,t,i){const o=this.config.childrenField??"children";return[...e].sort((s,l)=>{const a=s[t],d=l[t];return a==null&&d==null?0:a==null?-1:d==null?1:a>d?i:a<d?-i:0}).map(s=>{const l=s[o];return Array.isArray(l)&&l.length>0?{...s,[o]:this.sortTree(l,t,i)}:s})}processColumns(e){if(this.flattenedRows.length===0)return[...e];const t=[...e];if(t.length===0)return t;const i=t[0],o=i.viewRenderer,r=()=>this.config,s=this.setIcon.bind(this),l=this.resolveIcon.bind(this),a=d=>{const{row:c,value:u}=d,{showExpandIcons:h=!0,indentWidth:f}=r(),p=c,g=p.__treeDepth??0,w=document.createElement("span");if(w.className="tree-cell-wrapper",w.style.setProperty("--tbw-tree-depth",String(g)),f!==void 0&&w.style.setProperty("--tbw-tree-indent-width",`${f}px`),h)if(p.__treeHasChildren){const y=document.createElement("span");y.className=`tree-toggle${p.__treeExpanded?" expanded":""}`,s(y,l(p.__treeExpanded?"collapse":"expand")),y.setAttribute("data-tree-key",String(p.__treeKey??"")),w.appendChild(y)}else{const y=document.createElement("span");y.className="tree-spacer",w.appendChild(y)}const m=document.createElement("span");if(m.className="tree-content",o){const y=o(d);y instanceof Node?m.appendChild(y):typeof y=="string"&&(m.innerHTML=y)}else m.textContent=u!=null?String(u):"";return w.appendChild(m),w};return t[0]={...i,viewRenderer:a},t}onCellClick(e){const t=e.originalEvent?.target;if(!t?.classList.contains("tree-toggle"))return!1;const i=t.getAttribute("data-tree-key");if(!i)return!1;const o=this.rowKeyMap.get(i);return o?(this.expandedKeys=st(this.expandedKeys,i),this.emit("tree-expand",{key:i,row:o.data,expanded:this.expandedKeys.has(i),depth:o.depth}),this.requestRender(),!0):!1}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusRow,i=this.flattenedRows[t];if(i?.hasChildren)return e.preventDefault(),this.expandedKeys=st(this.expandedKeys,i.key),this.emit("tree-expand",{key:i.key,row:i.data,expanded:this.expandedKeys.has(i.key),depth:i.depth}),this.requestRenderWithFocus(),!0}onHeaderClick(e){if(this.flattenedRows.length===0||!e.column.sortable)return!1;const{field:t}=e.column;!this.sortState||this.sortState.field!==t?this.sortState={field:t,direction:1}:this.sortState.direction===1?this.sortState={field:t,direction:-1}:this.sortState=null;const i=this.grid;return i._sortState!==void 0&&(i._sortState=this.sortState?{...this.sortState}:null),this.emit("sort-change",{field:t,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const o of t.querySelectorAll(".data-grid-row")){const r=o.querySelector(".cell[data-row]"),s=r?parseInt(r.getAttribute("data-row")??"-1",10):-1,l=this.flattenedRows[s]?.key;l&&this.keysToAnimate.has(l)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=st(this.expandedKeys,e),this.requestRender()}expandAll(){this.expandedKeys=lt(this.rows,this.config),this.requestRender()}collapseAll(){this.expandedKeys=Ur(),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=jr(this.rows,e,this.config,this.expandedKeys),this.requestRender()}}function Jr(n,e,t){const i=[...n.undoStack,e];for(;i.length>t;)i.shift();return{undoStack:i,redoStack:[]}}function ki(n){if(n.undoStack.length===0)return{newState:n,action:null};const e=[...n.undoStack],t=e.pop();return t?{newState:{undoStack:e,redoStack:[...n.redoStack,t]},action:t}:{newState:n,action:null}}function Pi(n){if(n.redoStack.length===0)return{newState:n,action:null};const e=[...n.redoStack],t=e.pop();return t?{newState:{undoStack:[...n.undoStack,t],redoStack:e},action:t}:{newState:n,action:null}}function Qr(n){return n.undoStack.length>0}function es(n){return n.redoStack.length>0}function ts(){return{undoStack:[],redoStack:[]}}function is(n,e,t,i){return{type:"cell-edit",rowIndex:n,field:e,oldValue:t,newValue:i,timestamp:Date.now()}}class ns extends H{static dependencies=[{name:"editing",required:!0,reason:"UndoRedoPlugin tracks cell edit history"}];name="undoRedo";get defaultConfig(){return{maxHistorySize:100}}undoStack=[];redoStack=[];detach(){this.undoStack=[],this.redoStack=[]}onKeyDown(e){const t=(e.ctrlKey||e.metaKey)&&e.key==="z"&&!e.shiftKey,i=(e.ctrlKey||e.metaKey)&&(e.key==="y"||e.key==="z"&&e.shiftKey);if(t){const o=ki({undoStack:this.undoStack,redoStack:this.redoStack});if(o.action){const r=this.rows;r[o.action.rowIndex]&&(r[o.action.rowIndex][o.action.field]=o.action.oldValue),this.undoStack=o.newState.undoStack,this.redoStack=o.newState.redoStack,this.emit("undo",{action:o.action,type:"undo"}),this.requestRender()}return!0}if(i){const o=Pi({undoStack:this.undoStack,redoStack:this.redoStack});if(o.action){const r=this.rows;r[o.action.rowIndex]&&(r[o.action.rowIndex][o.action.field]=o.action.newValue),this.undoStack=o.newState.undoStack,this.redoStack=o.newState.redoStack,this.emit("redo",{action:o.action,type:"redo"}),this.requestRender()}return!0}return!1}recordEdit(e,t,i,o){const r=is(e,t,i,o),s=Jr({undoStack:this.undoStack,redoStack:this.redoStack},r,this.config.maxHistorySize??100);this.undoStack=s.undoStack,this.redoStack=s.redoStack}undo(){const e=ki({undoStack:this.undoStack,redoStack:this.redoStack});if(e.action){const t=this.rows;t[e.action.rowIndex]&&(t[e.action.rowIndex][e.action.field]=e.action.oldValue),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.requestRender()}return e.action}redo(){const e=Pi({undoStack:this.undoStack,redoStack:this.redoStack});if(e.action){const t=this.rows;t[e.action.rowIndex]&&(t[e.action.rowIndex][e.action.field]=e.action.newValue),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.requestRender()}return e.action}canUndo(){return Qr({undoStack:this.undoStack,redoStack:this.redoStack})}canRedo(){return es({undoStack:this.undoStack,redoStack:this.redoStack})}clearHistory(){const e=ts();this.undoStack=e.undoStack,this.redoStack=e.redoStack}getUndoStack(){return[...this.undoStack]}getRedoStack(){return[...this.redoStack]}}const os='@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;-webkit-user-select:none;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))}}';function Li(n){const e=n.meta??{};return e.lockPosition!==!0&&e.suppressMovable!==!0}class X extends H{static dependencies=[{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];name="visibility";static PANEL_ID="columns";styles=os;get defaultConfig(){return{allowHideAll:!1}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;clearDragClasses(e){e.querySelectorAll(".tbw-visibility-row").forEach(t=>{t.classList.remove("dragging","drop-target","drop-before","drop-after")})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}getToolPanel(){return{id:X.PANEL_ID,title:"Columns",icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}show(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(X.PANEL_ID)||this.grid.toggleToolPanelSection(X.PANEL_ID)}hide(){this.grid.closeToolPanel()}toggle(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(X.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(X.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 o=document.createElement("button");return o.className="tbw-visibility-show-all",o.textContent="Show All",o.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(o),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!!(e&&typeof e.moveColumn=="function")}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(o=>!o.utility);for(let o=0;o<i.length;o++){const r=i[o],s=r.header||r.field,l=document.createElement("div");l.className=r.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",l.setAttribute("data-field",r.field),l.setAttribute("data-index",String(o)),t&&Li(r)&&(l.draggable=!0,l.classList.add("reorderable"),this.setupDragListeners(l,r.field,o,e));const a=document.createElement("label");a.className="tbw-visibility-label";const d=document.createElement("input");d.type="checkbox",d.checked=r.visible,d.disabled=r.lockVisible??!1,d.addEventListener("change",()=>{this.grid.toggleColumnVisibility(r.field),setTimeout(()=>this.rebuildToggles(e),0)});const c=document.createElement("span");if(c.textContent=s,a.appendChild(d),a.appendChild(c),t&&Li(r)){const u=document.createElement("span");u.className="tbw-visibility-handle",this.setIcon(u,this.resolveIcon("dragHandle")),u.title="Drag to reorder",l.appendChild(u)}l.appendChild(a),e.appendChild(l)}}setupDragListeners(e,t,i,o){e.addEventListener("dragstart",r=>{this.isDragging=!0,this.draggedField=t,this.draggedIndex=i,r.dataTransfer&&(r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",t)),e.classList.add("dragging")}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),e.addEventListener("dragover",r=>{if(r.preventDefault(),!this.isDragging||this.draggedField===t)return;const s=e.getBoundingClientRect(),l=s.top+s.height/2;this.dropIndex=r.clientY<l?i:i+1,o.querySelectorAll(".tbw-visibility-row").forEach(a=>{a!==e&&a.classList.remove("drop-target","drop-before","drop-after")}),e.classList.add("drop-target"),e.classList.toggle("drop-before",r.clientY<l),e.classList.toggle("drop-after",r.clientY>=l)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",r=>{r.preventDefault();const s=this.draggedField,l=this.draggedIndex,a=this.dropIndex;if(!this.isDragging||s===null||l===null||a===null)return;const d=a>l?a-1:a;if(d!==l){const c=this.grid.getAllColumns(),h=c.filter(g=>!g.utility)[d]?.field,f=h?c.findIndex(g=>g.field===h):c.length,p={field:s,fromIndex:l,toIndex:f};this.emit("column-reorder-request",p),setTimeout(()=>{this.rebuildToggles(o)},0)}})}}x.BaseGridPlugin=H,x.ClipboardPlugin=Zn,x.ColumnVirtualizationPlugin=to,x.ContextMenuPlugin=Ye,x.DEFAULT_ANIMATION_CONFIG=at,x.DEFAULT_GRID_ICONS=G,x.DGEvents=$n,x.DataGridElement=M,x.EditingPlugin=po,x.ExportPlugin=yo,x.FilteringPlugin=V,x.FitModeEnum=Q,x.GridCSSVars=Bn,x.GridClasses=N,x.GridDataAttrs=ue,x.GridElement=M,x.GridSelectors=Gn,x.GroupingColumnsPlugin=Do,x.GroupingRowsPlugin=Go,x.MasterDetailPlugin=et,x.MultiSortPlugin=Zo,x.PLUGIN_QUERIES=qe,x.PinnedColumnsPlugin=er,x.PinnedRowsPlugin=or,x.PivotPlugin=Y,x.PluginEvents=Wn,x.PluginManager=Vt,x.PrintPlugin=Ar,x.ROW_DRAG_HANDLE_FIELD=xi,x.RenderPhase=I,x.ReorderPlugin=Pr,x.ResponsivePlugin=Dr,x.RowReorderPlugin=Ir,x.SelectionPlugin=Gr,x.ServerSidePlugin=Wr,x.TreePlugin=Zr,x.UndoRedoPlugin=ns,x.VisibilityPlugin=X,x.builtInSort=Rt,x.createGrid=Kn,x.defaultComparator=Et,x.defaultEditorFor=Qt,x.defaultPasteHandler=Ut,x.printGridIsolated=yi,x.queryGrid=Vn,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})}));
156
+ → The "triggerOn" option only affects "cell" and "row" selection modes.`,check:e=>e.mode==="range"&&e.triggerOn==="dblclick"}]};name="selection";styles=Fr;get defaultConfig(){return{mode:"cell",triggerOn:"click",enabled:!0}}selected=new Set;lastSelected=null;anchor=null;ranges=[];activeRange=null;cellAnchor=null;isDragging=!1;pendingKeyboardUpdate=null;selectedCell=null;isSelectionEnabled(){return this.config.enabled===!1?!1:this.grid.effectiveConfig?.selectable!==!1}checkSelectable(e,t){const{isSelectable:i}=this.config;if(!i)return!0;const o=this.rows[e];if(!o)return!1;const r=t!==void 0?this.columns[t]:void 0;return i(o,e,r,t)}isRowSelectable(e){return this.checkSelectable(e)}isCellSelectable(e,t){return this.checkSelectable(e,t)}detach(){this.selected.clear(),this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.isDragging=!1,this.selectedCell=null,this.pendingKeyboardUpdate=null}onCellClick(e){if(!this.isSelectionEnabled())return!1;const{rowIndex:t,colIndex:i,originalEvent:o}=e,{mode:r,triggerOn:s="click"}=this.config;if(o.type!==s)return!1;const l=this.columns[i],a=l&&V(l);if(r==="cell"){if(a||!this.isCellSelectable(t,i))return!1;const d=this.selectedCell;return d&&d.row===t&&d.col===i||(this.selectedCell={row:t,col:i},this.emit("selection-change",this.#e()),this.requestAfterRender()),!1}if(r==="row")return!this.isRowSelectable(t)||this.selected.size===1&&this.selected.has(t)||(this.selected.clear(),this.selected.add(t),this.lastSelected=t,this.emit("selection-change",this.#e()),this.requestAfterRender()),!1;if(r==="range"){if(a||!this.isCellSelectable(t,i))return!1;const d=o.shiftKey,c=o.ctrlKey||o.metaKey;if(d&&this.cellAnchor){const u=rt(this.cellAnchor,{row:t,col:i}),h=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;if(h&&Se(h,u))return!1;c?this.ranges.length>0?this.ranges[this.ranges.length-1]=u:this.ranges.push(u):this.ranges=[u],this.activeRange=u}else if(c){const u={startRow:t,startCol:i,endRow:t,endCol:i};this.ranges.push(u),this.activeRange=u,this.cellAnchor={row:t,col:i}}else{const u={startRow:t,startCol:i,endRow:t,endCol:i};if(this.ranges.length===1&&Se(this.ranges[0],u))return!1;this.ranges=[u],this.activeRange=u,this.cellAnchor={row:t,col:i}}return this.emit("selection-change",this.#e()),this.requestAfterRender(),!1}return!1}onKeyDown(e){if(!this.isSelectionEnabled())return!1;const{mode:t}=this.config,o=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","Home","End","PageUp","PageDown"].includes(e.key);if(e.key==="Escape")return t==="cell"?this.selectedCell=null:t==="row"?(this.selected.clear(),this.anchor=null):t==="range"&&(this.ranges=[],this.activeRange=null,this.cellAnchor=null),this.emit("selection-change",this.#e()),this.requestAfterRender(),!0;if(t==="cell"&&o)return queueMicrotask(()=>{const r=this.grid._focusRow,s=this.grid._focusCol;this.isCellSelectable(r,s)?this.selectedCell={row:r,col:s}:this.selectedCell=null,this.emit("selection-change",this.#e()),this.requestAfterRender()}),!1;if(t==="row"&&(e.key==="ArrowUp"||e.key==="ArrowDown"))return queueMicrotask(()=>{const r=this.grid._focusRow;this.isRowSelectable(r)?(this.selected.clear(),this.selected.add(r),this.lastSelected=r):this.selected.clear(),this.emit("selection-change",this.#e()),this.requestAfterRender()}),!1;if(t==="range"&&o){const r=e.key==="Tab",s=e.shiftKey&&!r;return s&&!this.cellAnchor&&(this.cellAnchor={row:this.grid._focusRow,col:this.grid._focusCol}),this.pendingKeyboardUpdate={shiftKey:s},queueMicrotask(()=>this.requestAfterRender()),!1}if(t==="range"&&e.key==="a"&&(e.ctrlKey||e.metaKey)){const r=this.rows.length,s=this.columns.length;if(r>0&&s>0){e.preventDefault(),e.stopPropagation();const l={startRow:0,startCol:0,endRow:r-1,endCol:s-1};return this.ranges=[l],this.activeRange=l,this.emit("selection-change",this.#e()),this.requestAfterRender(),!0}}return!1}onCellMouseDown(e){if(!this.isSelectionEnabled()||this.config.mode!=="range"||e.rowIndex===void 0||e.colIndex===void 0||e.rowIndex<0)return;const t=this.columns[e.colIndex];if(t&&V(t)||!this.isCellSelectable(e.rowIndex,e.colIndex)||e.originalEvent.shiftKey&&this.cellAnchor)return;this.isDragging=!0;const i=e.rowIndex,o=e.colIndex,r=e.originalEvent.ctrlKey||e.originalEvent.metaKey,s={startRow:i,startCol:o,endRow:i,endCol:o};return!r&&this.ranges.length===1&&Se(this.ranges[0],s)?(this.cellAnchor={row:i,col:o},!0):(this.cellAnchor={row:i,col:o},r||(this.ranges=[]),this.ranges.push(s),this.activeRange=s,this.emit("selection-change",this.#e()),this.requestAfterRender(),!0)}onCellMouseMove(e){if(!this.isSelectionEnabled()||this.config.mode!=="range"||!this.isDragging||!this.cellAnchor||e.rowIndex===void 0||e.colIndex===void 0||e.rowIndex<0)return;let t=e.colIndex;const i=this.columns[t];if(i&&V(i)){const s=this.columns.findIndex(l=>!V(l));s>=0&&(t=s)}const o=rt(this.cellAnchor,{row:e.rowIndex,col:t}),r=this.ranges.length>0?this.ranges[this.ranges.length-1]:null;return r&&Se(r,o)||(this.ranges.length>0?this.ranges[this.ranges.length-1]=o:this.ranges.push(o),this.activeRange=o,this.emit("selection-change",this.#e()),this.requestAfterRender()),!0}onCellMouseUp(e){if(this.isSelectionEnabled()&&this.config.mode==="range"&&this.isDragging)return this.isDragging=!1,!0}#t(){const e=this.gridElement;if(!e)return;const{mode:t}=this.config,i=!!this.config.isSelectable;e.querySelectorAll(".cell").forEach(s=>{s.classList.remove("selected","top","bottom","first","last"),i&&s.removeAttribute("data-selectable")});const r=e.querySelectorAll(".data-grid-row");if(r.forEach(s=>{s.classList.remove("selected","row-focus"),i&&s.removeAttribute("data-selectable")}),t==="row"&&(ae(e),r.forEach(s=>{const l=s.querySelector(".cell[data-row]"),a=Le(l);a>=0&&(i&&!this.isRowSelectable(a)&&s.setAttribute("data-selectable","false"),this.selected.has(a)&&s.classList.add("selected","row-focus"))})),(t==="cell"||t==="range")&&i&&e.querySelectorAll(".cell[data-row][data-col]").forEach(l=>{const a=parseInt(l.getAttribute("data-row")??"-1",10),d=parseInt(l.getAttribute("data-col")??"-1",10);a>=0&&d>=0&&(this.isCellSelectable(a,d)||l.setAttribute("data-selectable","false"))}),t==="range"&&this.ranges.length>0){ae(e);const s=this.activeRange?re(this.activeRange):null,l=this.columns.findIndex(d=>!V(d));this.columns.length-1,e.querySelectorAll(".cell[data-row][data-col]").forEach(d=>{const c=parseInt(d.getAttribute("data-row")??"-1",10),u=parseInt(d.getAttribute("data-col")??"-1",10);if(c>=0&&u>=0){const h=this.columns[u];if(h&&V(h))return;if(Ri(c,u,this.ranges)&&(d.classList.add("selected"),s)){c===s.startRow&&d.classList.add("top"),c===s.endRow&&d.classList.add("bottom");const p=Math.max(s.startCol,l);u===p&&d.classList.add("first"),u===s.endCol&&d.classList.add("last")}}})}}afterRender(){if(!this.isSelectionEnabled())return;const e=this.gridElement;if(!e)return;const t=e.children[0],{mode:i}=this.config;if(this.pendingKeyboardUpdate&&i==="range"){const{shiftKey:o}=this.pendingKeyboardUpdate;this.pendingKeyboardUpdate=null;const r=this.grid._focusRow,s=this.grid._focusCol;if(o&&this.cellAnchor){const l=rt(this.cellAnchor,{row:r,col:s});this.ranges=[l],this.activeRange=l}else o||(this.ranges=[],this.activeRange=null,this.cellAnchor={row:r,col:s});this.emit("selection-change",this.#e())}this.grid.setAttribute("data-selection-mode",i),t&&t.classList.toggle("selecting",this.isDragging),this.#t()}onScrollRender(){this.isSelectionEnabled()&&this.#t()}getSelection(){return{mode:this.config.mode,ranges:this.#e().ranges,anchor:this.cellAnchor}}getSelectedCells(){return Or(this.ranges)}isCellSelected(e,t){return Ri(e,t,this.ranges)}clearSelection(){this.selectedCell=null,this.selected.clear(),this.anchor=null,this.ranges=[],this.activeRange=null,this.cellAnchor=null,this.emit("selection-change",{mode:this.config.mode,ranges:[]}),this.requestAfterRender()}setRanges(e){this.ranges=e.map(t=>({startRow:t.from.row,startCol:t.from.col,endRow:t.to.row,endCol:t.to.col})),this.activeRange=this.ranges.length>0?this.ranges[this.ranges.length-1]:null,this.emit("selection-change",{mode:this.config.mode,ranges:Ei(this.ranges)}),this.requestAfterRender()}#e(){return qr(this.config.mode,{selectedCell:this.selectedCell,selected:this.selected,ranges:this.ranges},this.columns.length)}}function _e(n,e){return Math.floor(n/e)}function Br(n,e){return{start:n*e,end:(n+1)*e}}function $r(n,e,t){const i=_e(n,t),o=_e(e-1,t),r=[];for(let s=i;s<=o;s++)r.push(s);return r}async function Si(n,e,t,i){const o=Br(e,t);return n.getRows({startRow:o.start,endRow:o.end,sortModel:i.sortModel,filterModel:i.filterModel})}function Kr(n,e,t){const i=_e(n,e),o=t.get(i);if(!o)return;const r=n%e;return o[r]}const Vr=100;class Wr extends H{name="serverSide";get defaultConfig(){return{pageSize:100,cacheBlockSize:100,maxConcurrentRequests:2}}dataSource=null;totalRowCount=0;loadedBlocks=new Map;loadingBlocks=new Set;lastRequestId=0;scrollDebounceTimer;detach(){this.dataSource=null,this.totalRowCount=0,this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.lastRequestId=0,this.scrollDebounceTimer&&(clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=void 0)}loadRequiredBlocks(){if(!this.dataSource)return;const e=this.grid,t=this.config.cacheBlockSize??100,i={startRow:e._virtualization.start,endRow:e._virtualization.end},o=$r(i.startRow,i.endRow,t);for(const r of o)if(!(this.loadedBlocks.has(r)||this.loadingBlocks.has(r))){if(this.loadingBlocks.size>=(this.config.maxConcurrentRequests??2))break;this.loadingBlocks.add(r),Si(this.dataSource,r,t,{}).then(s=>{this.loadedBlocks.set(r,s.rows),this.totalRowCount=s.totalRowCount,this.loadingBlocks.delete(r),this.requestRender(),this.loadRequiredBlocks()}).catch(()=>{this.loadingBlocks.delete(r)})}}processRows(e){if(!this.dataSource)return[...e];const t=[];for(let i=0;i<this.totalRowCount;i++){const o=Kr(i,this.config.cacheBlockSize??100,this.loadedBlocks);t.push(o??{__loading:!0,__index:i})}return t}onScroll(e){this.dataSource&&(this.loadRequiredBlocks(),this.scrollDebounceTimer&&clearTimeout(this.scrollDebounceTimer),this.scrollDebounceTimer=setTimeout(()=>{this.loadRequiredBlocks()},Vr))}setDataSource(e){this.dataSource=e,this.loadedBlocks.clear(),this.loadingBlocks.clear();const t=this.config.cacheBlockSize??100;Si(e,0,t,{}).then(i=>{this.loadedBlocks.set(0,i.rows),this.totalRowCount=i.totalRowCount,this.requestRender()})}refresh(){this.dataSource&&(this.loadedBlocks.clear(),this.loadingBlocks.clear(),this.requestRender())}purgeCache(){this.loadedBlocks.clear()}getTotalRowCount(){return this.totalRowCount}isRowLoaded(e){const t=this.config.cacheBlockSize??100,i=_e(e,t);return this.loadedBlocks.has(i)}getLoadedBlockCount(){return this.loadedBlocks.size}}function _i(n,e,t){return n.id!==void 0?String(n.id):t?`${t}-${e}`:String(e)}function st(n,e){const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t}function lt(n,e,t=null,i=0){const o=e.childrenField??"children",r=new Set;for(let s=0;s<n.length;s++){const l=n[s],a=_i(l,s,t),d=l[o];if(Array.isArray(d)&&d.length>0){r.add(a);const c=lt(d,e,a,i+1);for(const u of c)r.add(u)}}return r}function Ur(){return new Set}function Ai(n,e,t,i=null,o=0){const r=t.childrenField??"children";for(let s=0;s<n.length;s++){const l=n[s],a=_i(l,s,i);if(a===e)return[a];const d=l[r];if(Array.isArray(d)&&d.length>0){const c=Ai(d,e,t,a,o+1);if(c)return[a,...c]}}return null}function jr(n,e,t,i){const o=Ai(n,e,t);if(!o)return i;const r=new Set(i);for(let s=0;s<o.length-1;s++)r.add(o[s]);return r}function Ti(n,e="children"){if(!Array.isArray(n)||n.length===0)return!1;for(const t of n){if(!t)continue;const i=t[e];if(Array.isArray(i)&&i.length>0)return!0}return!1}function Yr(n){if(!Array.isArray(n)||n.length===0)return null;const e=["children","items","nodes","subRows","nested"];for(const t of n)if(!(!t||typeof t!="object"))for(const i of e){const o=t[i];if(Array.isArray(o)&&o.length>0)return i}return null}const Xr="@layer tbw-plugins{tbw-grid .cell[data-field=__tbw_expander]{border-right:none!important;padding:0;display:flex;align-items:center;justify-content:flex-start}tbw-grid .header-row .cell[data-field=__tbw_expander]{display:none}tbw-grid .header-row .cell[data-field=__tbw_expander]+.cell{grid-column:1 / 3}tbw-grid .tree-cell-wrapper{display:inline-flex;align-items:center;padding-left:calc(var(--tbw-tree-depth, 0) * var(--tbw-tree-indent-width, var(--tbw-tree-toggle-size, 1.25em)))}tbw-grid .tree-expander{display:flex;align-items:center;justify-content:flex-start;width:100%;height:100%;box-sizing:border-box}tbw-grid .tree-toggle{cursor:pointer;-webkit-user-select:none;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}tbw-grid .tree-toggle:hover{color:var(--tbw-tree-accent, var(--tbw-color-accent))}tbw-grid .tree-spacer{width:var(--tbw-tree-toggle-size, 1.25em);display:inline-block;flex-shrink:0}tbw-grid .data-grid-row.tbw-tree-slide-in{animation:tbw-tree-slide-in var(--tbw-animation-duration, .2s) var(--tbw-animation-easing, ease-out) forwards}tbw-grid .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}}}";class Zr extends H{name="tree";styles=Xr;get defaultConfig(){return{childrenField:"children",autoDetect:!0,defaultExpanded:!1,indentWidth:20,showExpandIcons:!0,animation:"slide"}}expandedKeys=new Set;initialExpansionDone=!1;flattenedRows=[];rowKeyMap=new Map;previousVisibleKeys=new Set;keysToAnimate=new Set;sortState=null;detach(){this.expandedKeys.clear(),this.initialExpansionDone=!1,this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),this.keysToAnimate.clear(),this.sortState=null}get animationStyle(){return this.isAnimationEnabled?this.config.animation??"slide":!1}detect(e){if(!this.config.autoDetect)return!1;const t=e,i=this.config.childrenField??Yr(t)??"children";return Ti(t,i)}processRows(e){const t=this.config.childrenField??"children",i=e;if(!Ti(i,t))return this.flattenedRows=[],this.rowKeyMap.clear(),this.previousVisibleKeys.clear(),[...e];let o=this.withStableKeys(i);this.sortState&&(o=this.sortTree(o,this.sortState.field,this.sortState.direction)),this.config.defaultExpanded&&!this.initialExpansionDone&&(this.expandedKeys=lt(o,this.config),this.initialExpansionDone=!0),this.flattenedRows=this.flattenTree(o,this.expandedKeys),this.rowKeyMap.clear(),this.keysToAnimate.clear();const r=new Set;for(const s of this.flattenedRows)this.rowKeyMap.set(s.key,s),r.add(s.key),!this.previousVisibleKeys.has(s.key)&&s.depth>0&&this.keysToAnimate.add(s.key);return this.previousVisibleKeys=r,this.flattenedRows.map(s=>({...s.data,__treeKey:s.key,__treeDepth:s.depth,__treeHasChildren:s.hasChildren,__treeExpanded:s.isExpanded}))}withStableKeys(e,t=null){const i=this.config.childrenField??"children";return e.map((o,r)=>{const s=o.__stableKey,l=o.id!==void 0?String(o.id):s??(t?`${t}-${r}`:String(r)),a=o[i],d=Array.isArray(a)&&a.length>0;return{...o,__stableKey:l,...d?{[i]:this.withStableKeys(a,l)}:{}}})}flattenTree(e,t,i=0){const o=this.config.childrenField??"children",r=[];for(const s of e){const a=s.__stableKey??String(s.id??"?"),d=s[o],c=Array.isArray(d)&&d.length>0,u=t.has(a);r.push({key:a,data:s,depth:i,hasChildren:c,isExpanded:u,parentKey:i>0&&a.substring(0,a.lastIndexOf("-"))||null}),c&&u&&r.push(...this.flattenTree(d,t,i+1))}return r}sortTree(e,t,i){const o=this.config.childrenField??"children";return[...e].sort((s,l)=>{const a=s[t],d=l[t];return a==null&&d==null?0:a==null?-1:d==null?1:a>d?i:a<d?-i:0}).map(s=>{const l=s[o];return Array.isArray(l)&&l.length>0?{...s,[o]:this.sortTree(l,t,i)}:s})}processColumns(e){if(this.flattenedRows.length===0)return[...e];const t=[...e];if(t.length===0)return t;const i=t[0],o=i.viewRenderer,r=()=>this.config,s=this.setIcon.bind(this),l=this.resolveIcon.bind(this),a=d=>{const{row:c,value:u}=d,{showExpandIcons:h=!0,indentWidth:f}=r(),p=c,g=p.__treeDepth??0,w=document.createElement("span");if(w.className="tree-cell-wrapper",w.style.setProperty("--tbw-tree-depth",String(g)),f!==void 0&&w.style.setProperty("--tbw-tree-indent-width",`${f}px`),h)if(p.__treeHasChildren){const y=document.createElement("span");y.className=`tree-toggle${p.__treeExpanded?" expanded":""}`,s(y,l(p.__treeExpanded?"collapse":"expand")),y.setAttribute("data-tree-key",String(p.__treeKey??"")),w.appendChild(y)}else{const y=document.createElement("span");y.className="tree-spacer",w.appendChild(y)}const m=document.createElement("span");if(m.className="tree-content",o){const y=o(d);y instanceof Node?m.appendChild(y):typeof y=="string"&&(m.innerHTML=y)}else m.textContent=u!=null?String(u):"";return w.appendChild(m),w};return t[0]={...i,viewRenderer:a},t}onCellClick(e){const t=e.originalEvent?.target;if(!t?.classList.contains("tree-toggle"))return!1;const i=t.getAttribute("data-tree-key");if(!i)return!1;const o=this.rowKeyMap.get(i);return o?(this.expandedKeys=st(this.expandedKeys,i),this.emit("tree-expand",{key:i,row:o.data,expanded:this.expandedKeys.has(i),depth:o.depth}),this.requestRender(),!0):!1}onKeyDown(e){if(e.key!==" ")return;const t=this.grid._focusRow,i=this.flattenedRows[t];if(i?.hasChildren)return e.preventDefault(),this.expandedKeys=st(this.expandedKeys,i.key),this.emit("tree-expand",{key:i.key,row:i.data,expanded:this.expandedKeys.has(i.key),depth:i.depth}),this.requestRenderWithFocus(),!0}onHeaderClick(e){if(this.flattenedRows.length===0||!e.column.sortable)return!1;const{field:t}=e.column;!this.sortState||this.sortState.field!==t?this.sortState={field:t,direction:1}:this.sortState.direction===1?this.sortState={field:t,direction:-1}:this.sortState=null;const i=this.grid;return i._sortState!==void 0&&(i._sortState=this.sortState?{...this.sortState}:null),this.emit("sort-change",{field:t,direction:this.sortState?.direction??0}),this.requestRender(),!0}afterRender(){const e=this.animationStyle;if(e===!1||this.keysToAnimate.size===0)return;const t=this.gridElement?.querySelector(".rows");if(!t)return;const i=e==="fade"?"tbw-tree-fade-in":"tbw-tree-slide-in";for(const o of t.querySelectorAll(".data-grid-row")){const r=o.querySelector(".cell[data-row]"),s=r?parseInt(r.getAttribute("data-row")??"-1",10):-1,l=this.flattenedRows[s]?.key;l&&this.keysToAnimate.has(l)&&(o.classList.add(i),o.addEventListener("animationend",()=>o.classList.remove(i),{once:!0}))}this.keysToAnimate.clear()}expand(e){this.expandedKeys.add(e),this.requestRender()}collapse(e){this.expandedKeys.delete(e),this.requestRender()}toggle(e){this.expandedKeys=st(this.expandedKeys,e),this.requestRender()}expandAll(){this.expandedKeys=lt(this.rows,this.config),this.requestRender()}collapseAll(){this.expandedKeys=Ur(),this.requestRender()}isExpanded(e){return this.expandedKeys.has(e)}getExpandedKeys(){return[...this.expandedKeys]}getFlattenedRows(){return[...this.flattenedRows]}getRowByKey(e){return this.rowKeyMap.get(e)?.data}expandToKey(e){this.expandedKeys=jr(this.rows,e,this.config,this.expandedKeys),this.requestRender()}}function Jr(n,e,t){const i=[...n.undoStack,e];for(;i.length>t;)i.shift();return{undoStack:i,redoStack:[]}}function ki(n){if(n.undoStack.length===0)return{newState:n,action:null};const e=[...n.undoStack],t=e.pop();return t?{newState:{undoStack:e,redoStack:[...n.redoStack,t]},action:t}:{newState:n,action:null}}function Li(n){if(n.redoStack.length===0)return{newState:n,action:null};const e=[...n.redoStack],t=e.pop();return t?{newState:{undoStack:[...n.undoStack,t],redoStack:e},action:t}:{newState:n,action:null}}function Qr(n){return n.undoStack.length>0}function es(n){return n.redoStack.length>0}function ts(){return{undoStack:[],redoStack:[]}}function is(n,e,t,i){return{type:"cell-edit",rowIndex:n,field:e,oldValue:t,newValue:i,timestamp:Date.now()}}class ns extends H{static dependencies=[{name:"editing",required:!0,reason:"UndoRedoPlugin tracks cell edit history"}];name="undoRedo";get defaultConfig(){return{maxHistorySize:100}}undoStack=[];redoStack=[];detach(){this.undoStack=[],this.redoStack=[]}onKeyDown(e){const t=(e.ctrlKey||e.metaKey)&&e.key==="z"&&!e.shiftKey,i=(e.ctrlKey||e.metaKey)&&(e.key==="y"||e.key==="z"&&e.shiftKey);if(t){const o=ki({undoStack:this.undoStack,redoStack:this.redoStack});if(o.action){const r=this.rows;r[o.action.rowIndex]&&(r[o.action.rowIndex][o.action.field]=o.action.oldValue),this.undoStack=o.newState.undoStack,this.redoStack=o.newState.redoStack,this.emit("undo",{action:o.action,type:"undo"}),this.requestRender()}return!0}if(i){const o=Li({undoStack:this.undoStack,redoStack:this.redoStack});if(o.action){const r=this.rows;r[o.action.rowIndex]&&(r[o.action.rowIndex][o.action.field]=o.action.newValue),this.undoStack=o.newState.undoStack,this.redoStack=o.newState.redoStack,this.emit("redo",{action:o.action,type:"redo"}),this.requestRender()}return!0}return!1}recordEdit(e,t,i,o){const r=is(e,t,i,o),s=Jr({undoStack:this.undoStack,redoStack:this.redoStack},r,this.config.maxHistorySize??100);this.undoStack=s.undoStack,this.redoStack=s.redoStack}undo(){const e=ki({undoStack:this.undoStack,redoStack:this.redoStack});if(e.action){const t=this.rows;t[e.action.rowIndex]&&(t[e.action.rowIndex][e.action.field]=e.action.oldValue),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.requestRender()}return e.action}redo(){const e=Li({undoStack:this.undoStack,redoStack:this.redoStack});if(e.action){const t=this.rows;t[e.action.rowIndex]&&(t[e.action.rowIndex][e.action.field]=e.action.newValue),this.undoStack=e.newState.undoStack,this.redoStack=e.newState.redoStack,this.requestRender()}return e.action}canUndo(){return Qr({undoStack:this.undoStack,redoStack:this.redoStack})}canRedo(){return es({undoStack:this.undoStack,redoStack:this.redoStack})}clearHistory(){const e=ts();this.undoStack=e.undoStack,this.redoStack=e.redoStack}getUndoStack(){return[...this.undoStack]}getRedoStack(){return[...this.redoStack]}}const os='@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;-webkit-user-select:none;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))}}';function Pi(n){const e=n.meta??{};return e.lockPosition!==!0&&e.suppressMovable!==!0}class X extends H{static dependencies=[{name:"reorder",required:!1,reason:"Enables drag-to-reorder columns in visibility panel"}];name="visibility";static PANEL_ID="columns";styles=os;get defaultConfig(){return{allowHideAll:!1}}columnListElement=null;isDragging=!1;draggedField=null;draggedIndex=null;dropIndex=null;clearDragClasses(e){e.querySelectorAll(".tbw-visibility-row").forEach(t=>{t.classList.remove("dragging","drop-target","drop-before","drop-after")})}detach(){this.columnListElement=null,this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null}getToolPanel(){return{id:X.PANEL_ID,title:"Columns",icon:"☰",tooltip:"Column visibility",order:100,render:e=>this.renderPanelContent(e)}}show(){this.grid.openToolPanel(),this.grid.expandedToolPanelSections.includes(X.PANEL_ID)||this.grid.toggleToolPanelSection(X.PANEL_ID)}hide(){this.grid.closeToolPanel()}toggle(){this.grid.isToolPanelOpen||this.grid.openToolPanel(),this.grid.toggleToolPanelSection(X.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(X.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 o=document.createElement("button");return o.className="tbw-visibility-show-all",o.textContent="Show All",o.addEventListener("click",()=>{this.grid.showAllColumns(),this.rebuildToggles(i)}),t.appendChild(o),this.columnListElement=i,this.rebuildToggles(i),e.appendChild(t),()=>{this.columnListElement=null,t.remove()}}hasReorderPlugin(){const e=this.grid?.getPluginByName?.("reorder");return!!(e&&typeof e.moveColumn=="function")}rebuildToggles(e){const t=this.hasReorderPlugin();e.innerHTML="";const i=this.grid.getAllColumns().filter(o=>!o.utility);for(let o=0;o<i.length;o++){const r=i[o],s=r.header||r.field,l=document.createElement("div");l.className=r.lockVisible?"tbw-visibility-row locked":"tbw-visibility-row",l.setAttribute("data-field",r.field),l.setAttribute("data-index",String(o)),t&&Pi(r)&&(l.draggable=!0,l.classList.add("reorderable"),this.setupDragListeners(l,r.field,o,e));const a=document.createElement("label");a.className="tbw-visibility-label";const d=document.createElement("input");d.type="checkbox",d.checked=r.visible,d.disabled=r.lockVisible??!1,d.addEventListener("change",()=>{this.grid.toggleColumnVisibility(r.field),setTimeout(()=>this.rebuildToggles(e),0)});const c=document.createElement("span");if(c.textContent=s,a.appendChild(d),a.appendChild(c),t&&Pi(r)){const u=document.createElement("span");u.className="tbw-visibility-handle",this.setIcon(u,this.resolveIcon("dragHandle")),u.title="Drag to reorder",l.appendChild(u)}l.appendChild(a),e.appendChild(l)}}setupDragListeners(e,t,i,o){e.addEventListener("dragstart",r=>{this.isDragging=!0,this.draggedField=t,this.draggedIndex=i,r.dataTransfer&&(r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",t)),e.classList.add("dragging")}),e.addEventListener("dragend",()=>{this.isDragging=!1,this.draggedField=null,this.draggedIndex=null,this.dropIndex=null,this.clearDragClasses(o)}),e.addEventListener("dragover",r=>{if(r.preventDefault(),!this.isDragging||this.draggedField===t)return;const s=e.getBoundingClientRect(),l=s.top+s.height/2;this.dropIndex=r.clientY<l?i:i+1,o.querySelectorAll(".tbw-visibility-row").forEach(a=>{a!==e&&a.classList.remove("drop-target","drop-before","drop-after")}),e.classList.add("drop-target"),e.classList.toggle("drop-before",r.clientY<l),e.classList.toggle("drop-after",r.clientY>=l)}),e.addEventListener("dragleave",()=>{e.classList.remove("drop-target","drop-before","drop-after")}),e.addEventListener("drop",r=>{r.preventDefault();const s=this.draggedField,l=this.draggedIndex,a=this.dropIndex;if(!this.isDragging||s===null||l===null||a===null)return;const d=a>l?a-1:a;if(d!==l){const c=this.grid.getAllColumns(),h=c.filter(g=>!g.utility)[d]?.field,f=h?c.findIndex(g=>g.field===h):c.length,p={field:s,fromIndex:l,toIndex:f};this.emit("column-reorder-request",p),setTimeout(()=>{this.rebuildToggles(o)},0)}})}}x.BaseGridPlugin=H,x.ClipboardPlugin=Zn,x.ColumnVirtualizationPlugin=to,x.ContextMenuPlugin=Ye,x.DEFAULT_ANIMATION_CONFIG=at,x.DEFAULT_GRID_ICONS=G,x.DGEvents=Vn,x.DataGridElement=M,x.EditingPlugin=po,x.ExportPlugin=yo,x.FilteringPlugin=K,x.FitModeEnum=Q,x.GridCSSVars=Bn,x.GridClasses=N,x.GridDataAttrs=ue,x.GridElement=M,x.GridSelectors=Gn,x.GroupingColumnsPlugin=Do,x.GroupingRowsPlugin=Go,x.MasterDetailPlugin=et,x.MultiSortPlugin=Zo,x.PLUGIN_QUERIES=qe,x.PinnedColumnsPlugin=er,x.PinnedRowsPlugin=or,x.PivotPlugin=Y,x.PluginEvents=Wn,x.PluginManager=Kt,x.PrintPlugin=Ar,x.ROW_DRAG_HANDLE_FIELD=xi,x.RenderPhase=I,x.ReorderPlugin=Lr,x.ResponsivePlugin=Dr,x.RowReorderPlugin=Ir,x.SelectionPlugin=Gr,x.ServerSidePlugin=Wr,x.TreePlugin=Zr,x.UndoRedoPlugin=ns,x.VisibilityPlugin=X,x.builtInSort=Rt,x.createGrid=$n,x.defaultComparator=Et,x.defaultEditorFor=Qt,x.defaultPasteHandler=Ut,x.printGridIsolated=yi,x.queryGrid=Kn,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})}));
157
157
  //# sourceMappingURL=grid.all.umd.js.map