@vireo-ai/trellis-ui 0.1.56 → 0.1.57

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 (123) hide show
  1. package/package.json +1 -1
  2. package/packages/client/src/components/data-grid/styles.css +0 -16
  3. package/packages/client/src/components/panels/styles.css +2 -10
  4. package/packages/client/src/styles/components.css +1 -1
  5. package/packages/client/src/styles/generated/theme-fonts.css +1 -1
  6. package/packages/client/src/styles/generated/theme-palette.css +275 -59
  7. package/packages/client/src/styles/generated/theme-runtime.css +1007 -24
  8. package/packages/client/src/styles/generated-sources.css +1 -1
  9. package/packages/client/src/styles/recipes/selection.css +62 -12
  10. package/packages/client/src/styles/theme-support.css +23 -2
  11. package/packages/client/types/components/accordion/index.d.ts +3 -3
  12. package/packages/client/types/components/accordion/machine.d.ts +11 -7
  13. package/packages/client/types/components/app/contract.d.ts +5 -5
  14. package/packages/client/types/components/box/contract.d.ts +2 -2
  15. package/packages/client/types/components/card/contract.d.ts +2 -2
  16. package/packages/client/types/components/common.d.ts +3 -3
  17. package/packages/client/types/components/container/contract.d.ts +1 -1
  18. package/packages/client/types/components/date-picker/contract.d.ts +2 -2
  19. package/packages/client/types/components/date-picker/machine.d.ts +2 -2
  20. package/packages/client/types/components/flex/contract.d.ts +1 -1
  21. package/packages/client/types/components/frame/contract.d.ts +2 -2
  22. package/packages/client/types/components/grid/contract.d.ts +1 -1
  23. package/packages/client/types/components/layout.d.ts +2 -2
  24. package/packages/client/types/components/menu/contract.d.ts +4 -2
  25. package/packages/client/types/components/modal/contract.d.ts +2 -2
  26. package/packages/client/types/components/section/contract.d.ts +1 -1
  27. package/packages/client/types/components/select/contract.d.ts +2 -2
  28. package/packages/client/types/components/select/machine.d.ts +2 -2
  29. package/packages/client/types/components/sidebar/contract.d.ts +3 -3
  30. package/packages/client/types/components/stack/contract.d.ts +1 -1
  31. package/packages/client/types/components/tooltip/contract.d.ts +2 -2
  32. package/packages/client/types/runtime/engine/stream.d.ts +1 -0
  33. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +3278 -265
  34. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
  35. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +343 -342
  36. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
  37. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
  38. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-B7n3PcSH.js → capability-motion-BGVnZE_T.js} +2 -2
  39. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-B7n3PcSH.js.map → capability-motion-BGVnZE_T.js.map} +1 -1
  40. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BgPVyFfh.js → capability-sortable-ehmPfdn1.js} +2 -2
  41. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BgPVyFfh.js.map → capability-sortable-ehmPfdn1.js.map} +1 -1
  42. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/common-CBK89mIt.js +2 -0
  43. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/common-CBK89mIt.js.map +1 -0
  44. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-CYvnO__o.js → core-Ybm_WmKr.js} +2 -2
  45. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-CYvnO__o.js.map → core-Ybm_WmKr.js.map} +1 -1
  46. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BAghaHV-.js +2 -0
  47. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BAghaHV-.js.map +1 -0
  48. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D-2vjhTV.js → entry.generated-BREj4oHG.js} +2 -2
  49. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BREj4oHG.js.map +1 -0
  50. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DSWnCzSX.js → entry.generated-BZWdGtgg.js} +2 -2
  51. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DSWnCzSX.js.map → entry.generated-BZWdGtgg.js.map} +1 -1
  52. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CwuIK_Zx.js → entry.generated-COp9wMCd.js} +2 -2
  53. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CwuIK_Zx.js.map → entry.generated-COp9wMCd.js.map} +1 -1
  54. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dfm1775-.js → entry.generated-CVOYoh61.js} +2 -2
  55. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dfm1775-.js.map → entry.generated-CVOYoh61.js.map} +1 -1
  56. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-d1MxpnFh.js → entry.generated-CVWqQEed.js} +2 -2
  57. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-d1MxpnFh.js.map → entry.generated-CVWqQEed.js.map} +1 -1
  58. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BXvp4vUv.js → entry.generated-C_ObpRjR.js} +2 -2
  59. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BXvp4vUv.js.map → entry.generated-C_ObpRjR.js.map} +1 -1
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BLduYCHm.js → entry.generated-C_SxTqg5.js} +2 -2
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BLduYCHm.js.map → entry.generated-C_SxTqg5.js.map} +1 -1
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B4lDxzh9.js → entry.generated-Cb-VMAE1.js} +2 -2
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B4lDxzh9.js.map → entry.generated-Cb-VMAE1.js.map} +1 -1
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DaC7gw-h.js → entry.generated-CfYgsDun.js} +2 -2
  65. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DaC7gw-h.js.map → entry.generated-CfYgsDun.js.map} +1 -1
  66. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dcm3s3ey.js → entry.generated-D2es_Wi2.js} +2 -2
  67. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dcm3s3ey.js.map → entry.generated-D2es_Wi2.js.map} +1 -1
  68. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D6ai6meC.js +2 -0
  69. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D6ai6meC.js.map +1 -0
  70. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CheA8dXD.js → entry.generated-DYQxGle9.js} +2 -2
  71. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CheA8dXD.js.map → entry.generated-DYQxGle9.js.map} +1 -1
  72. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D_jeOgRf.js +2 -0
  73. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D_jeOgRf.js.map +1 -0
  74. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DuY9bHje.js → entry.generated-DqL-zI7j.js} +2 -2
  75. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DuY9bHje.js.map → entry.generated-DqL-zI7j.js.map} +1 -1
  76. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C3y5qBcc.js → entry.generated-EqHVGr1d.js} +2 -2
  77. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C3y5qBcc.js.map → entry.generated-EqHVGr1d.js.map} +1 -1
  78. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-z3EbXrD0.js +2 -0
  79. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-z3EbXrD0.js.map +1 -0
  80. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{flip-BGTjVnQy.js → flip-Bzn312Nc.js} +2 -2
  81. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{flip-BGTjVnQy.js.map → flip-Bzn312Nc.js.map} +1 -1
  82. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-fU4E5Q4w.js → motion-DI5H1Js0.js} +3 -3
  83. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-fU4E5Q4w.js.map → motion-DI5H1Js0.js.map} +1 -1
  84. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{styles-C9PrQrca.js → styles-CQDZhwd_.js} +2 -2
  85. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{styles-C9PrQrca.js.map → styles-CQDZhwd_.js.map} +1 -1
  86. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{ui-B3f-Nt9P.js → ui-CTQoglp3.js} +2 -2
  87. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CTQoglp3.js.map +1 -0
  88. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
  89. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/checkbox.js +1 -1
  90. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +1 -1
  91. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
  92. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
  93. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/field.js +1 -1
  94. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
  95. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/input.js +1 -1
  96. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
  97. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
  98. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/radio.js +1 -1
  99. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
  100. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
  101. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/slider.js +1 -1
  102. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/switch.js +1 -1
  103. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
  104. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
  105. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tooltip.js +1 -1
  106. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
  107. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
  108. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +129 -129
  109. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +5 -5
  110. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +5 -5
  111. package/packages/client/src/styles/layout-participation.css +0 -17
  112. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/common-De1R7Xh6.js +0 -2
  113. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/common-De1R7Xh6.js.map +0 -1
  114. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BlsLkwW8.js +0 -2
  115. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BlsLkwW8.js.map +0 -1
  116. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CC-C5gQn.js +0 -2
  117. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CC-C5gQn.js.map +0 -1
  118. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D-2vjhTV.js.map +0 -1
  119. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-QFVPoffg.js +0 -2
  120. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-QFVPoffg.js.map +0 -1
  121. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-pfUkaGe1.js +0 -2
  122. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-pfUkaGe1.js.map +0 -1
  123. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-B3f-Nt9P.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{i as e,t}from"./object-SRW-YaCA.js";import{t as n}from"./capability-motion-B7n3PcSH.js";import{c as r,f as i,l as a,n as o,o as s,s as c,u as l}from"./codecs-CQ7olTJL.js";import{n as ee}from"./dom-invalidation-Dw6clnS4.js";import{t as u}from"./fragment-9OT0mn7F.js";import{t as te}from"./cleanup-manager-D9QiZF_Q.js";import{n as d,t as ne}from"./alpine-data-Dvc_bXq6.js";import{a as re,i as f,n as ie,r as ae,t as oe}from"./cursor-data-source-Do0FfF4Z.js";import{t as p}from"./capability-sortable-BgPVyFfh.js";import{n as se,t as m}from"./capability-resizable-ByUbMIHF.js";import{R as h,y as g}from"./common-De1R7Xh6.js";var _=[`none`,`single`,`multiple`],v=[`compact`,`default`,`comfortable`],y=[`none`,`row`,`grid`],b=[`onChange`,`onEnd`],x=[``,`left`,`right`],S=[`none`,`ascending`,`descending`,`other`],C=[`start`,`center`,`end`],w={fetchUrl:i,cursor:o,query:c(null),totalRows:r.min(0).default(0),rowHeight:r.min(2**-52).default(36),bufferSize:r.min(1).default(50),overscan:r.min(0).default(0),initialIndex:r.min(0).default(0),startParam:i.default(`start`),countParam:i.default(`count`),totalParam:i.default(`total`),totalHeader:i.default(`X-Trellis-Total-Items`),assetsHeader:i.default(`X-Trellis-Assets`),metaSelector:i.default(`template[data-ui-virtualizer-meta]`),selection:a(_,`none`),selectionValue:c({mode:`ids`,ids:[]}),selectOnRowClick:o,rowKey:i.default(`id`),stickyHeader:o.default(!0),resizableColumns:o.default(!0),reorderableColumns:o.default(!0),sortableColumns:o.default(!0),minColumnWidth:r.min(0).default(60),defaultColumnWidth:r.min(2**-52).default(180),maxColumnWidth:c(null),resizeMode:a(b,`onChange`),color:a(h,`neutral`),interaction:a(g,`edge`),dragPreviewPosition:i.trim.default(`preserve`),density:a(v,`default`),border:a(y,`row`),empty:i.default(`No rows found.`),class:i,controlsClass:i,viewportClass:i,headerClass:i,rowClass:i,cellClass:i,footerClass:i,emptyClass:i};r.min(2**-52).default(180),r.min(0).default(60),c(null),a(x,``),a(S,`none`),o.default(!0),o.default(!0),a(C,`start`),c([]),c([]),r.min(0).default(0),i.default(`id`),i.default(`ui.data-grid.row`),i.default(`ui.data-grid.cell`),r.min(0).default(0),r.min(1).default(1),a(C,`start`);var T=(e,t,n)=>{let r=e.getAttribute(t);if(r===null||r.trim()===``)return n;let i=Number(r);return Number.isFinite(i)?i:n},E=(e,t,n)=>{let r=e.getAttribute(t);if(r===null||r.trim()===``)return n;let i=Number(r);return Number.isFinite(i)&&i>0?i:null},D=(e,t,n)=>{if(!e.hasAttribute(t))return n;let r=e.getAttribute(t)??``;return r===``||[`true`,`1`,`yes`,`on`].includes(r.toLowerCase())},ce=(e,t)=>{let n=new Set;return e.flatMap(e=>{let r=(e.dataset.column??``).trim();if(!r)throw Error(`Data Grid columns require a non-empty key.`);if(e.hasAttribute(`data-hidden`))return[];if(n.has(r))throw Error(`Data Grid column key "${r}" is duplicated.`);n.add(r);let i=Math.max(0,T(e,`data-min-width`,t.minWidth)),a=E(e,`data-max-width`,t.maxWidth),o=T(e,`data-width`,t.width),s=Math.min(a??1/0,Math.max(i,o)),c=e.dataset.pinned===`left`||e.dataset.pinned===`right`?e.dataset.pinned:null,l=[`ascending`,`descending`,`other`].includes(e.dataset.sort??``)?e.dataset.sort:`none`,ee=[`center`,`end`].includes(e.dataset.align??``)?e.dataset.align:`start`;return[{key:r,label:e.dataset.label??e.textContent?.trim()??r,width:s,minWidth:i,maxWidth:a,hidden:!1,pinned:c,sortable:D(e,`data-sortable`,!1),sort:l,resizable:D(e,`data-resizable`,t.resizable),reorderable:D(e,`data-reorderable`,t.reorderable),align:ee,cellClass:e.dataset.cellClass??``,element:e}]})},le=e=>e.map(({width:e})=>`${e}px`).join(` `),O=e=>e.map(({element:e,...t})=>t),k=e=>{let t=new Map,n=new Map,r=0;return e.forEach(e=>{e.pinned===`left`&&(t.set(e.key,r),r+=e.width)}),r=0,[...e].reverse().forEach(e=>{e.pinned===`right`&&(n.set(e.key,r),r+=e.width)}),{left:t,right:n}},A=e=>globalThis.CSS?.escape?globalThis.CSS.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,e=>`\\${e}`),ue=(e,t)=>{let n=k(t),r=`z-index:2;background-color:var(--ui-surface-color);`;return t.map((t,i)=>{let a=`[data-ui-data-grid-scope="${A(e)}"]`,o=`[data-column="${A(t.key)}"]`,s=`${a} [data-ui-data-grid-column-header]${o},${a} [data-ui-data-grid-cell]${o}`,c=t.pinned===`left`?`position:sticky;left:${n.left.get(t.key)??0}px;${r}`:t.pinned===`right`?`position:sticky;right:${n.right.get(t.key)??0}px;${r}`:``;return`${s}{grid-column:${i+1};${c}}`}).join(``)},j=(e,t)=>{if(t===`multiple`&&typeof e==`object`&&e&&e.mode===`query`){let t=e;if(typeof t.token==`string`&&Number.isFinite(t.total))return{mode:`query`,token:t.token,total:Math.max(0,Math.floor(t.total??0)),except:[...new Set(Array.isArray(t.except)?t.except.filter(e=>typeof e==`string`):[])]}}let n=typeof e==`object`&&e&&e.mode===`ids`&&Array.isArray(e.ids)?e.ids.filter(e=>typeof e==`string`):[],r=[...new Set(n)];return{mode:`ids`,ids:t===`single`?r.slice(0,1):t===`none`?[]:r}},de=(e,t)=>e.mode===`query`?!e.except.includes(t):e.ids.includes(t),fe=(e,t,n,r)=>{let i=j(e,n);if(n===`none`)return{selection:i,added:[],removed:[]};let a=de(i,t),o=r??!a;if(a===o)return{selection:i,added:[],removed:[]};if(i.mode===`query`){let e=o?i.except.filter(e=>e!==t):[...i.except,t];return{selection:{...i,except:e},added:o?[t]:[],removed:o?[]:[t]}}return{selection:{mode:`ids`,ids:n===`single`&&o?[t]:o?[...i.ids,t]:i.ids.filter(e=>e!==t)},added:o?[t]:[],removed:o?[]:[t]}},pe=(e,t,n)=>{let r=e.findIndex(e=>e.key===t);if(r<0||!e[r]?.reorderable)return null;let i=e[r]?.pinned??null;if(!e.flatMap((e,t)=>e.pinned===i?[t]:[]).includes(n))return null;let a=[...e],[o]=a.splice(r,1);return o?(a.splice(n,0,o),a):null},M=(e,t=0)=>Math.max(t,Math.floor(Number.isFinite(e)?e:t)),me=`a,button,input,select,textarea,[contenteditable],[role="button"],[role="link"]`,N=n=>{let r=null,i=null,a=null,o=null,c=null,d=null,p=[],m=[],h=0,g={mode:`ids`,ids:[]},_=``,v=null,y=0,b=!1,x=null,S=!1,C=null,T=null,E=null,D=[],k=null,A=null,N=null,P=!1,F=!1,I,L=null,R=new Map,he=new WeakMap,ge=new WeakMap,z=ae(f),B=(e,t)=>{r?.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t}))},V=(e,t,n)=>{let r=n.get(e)??[];r.length&&e.classList.remove(...r);let i=[...new Set(t.split(/\s+/).filter(Boolean))];i.length&&e.classList.add(...i),n.set(e,i)},_e=()=>({width:$.props.defaultColumnWidth,minWidth:$.props.minColumnWidth,maxWidth:$.props.maxColumnWidth,resizable:$.props.resizableColumns,reorderable:$.props.reorderableColumns}),H=()=>ce(Array.from(r?.querySelectorAll(`[data-ui-data-grid-column-header]`)??[]),_e()),ve=e=>{let t=e.element.querySelector(`[data-ui-data-grid-column-label]`),n=e.element.querySelector(`[data-ui-data-grid-sort-button]`);if(t){if(e.sortable&&!n){let n=document.createElement(`button`);n.type=`button`,n.setAttribute(`data-ui-data-grid-sort-button`,``),n.className=e.element.dataset.sortButtonClass??``;let r=document.createElement(`span`);r.setAttribute(`data-ui-data-grid-sort-indicator`,``),r.setAttribute(`aria-hidden`,`true`),t.replaceWith(n),n.append(t,r)}else!e.sortable&&n&&n.replaceWith(t)}},ye=()=>Array.from(r?.querySelectorAll(`[data-ui-data-grid-row]`)??[]),be=e=>{o?.style.setProperty(`width`,`${e.getBoundingClientRect().width}px`)},U=()=>{ye().forEach(e=>{let t=e.dataset.rowKey??``,n=$.props.selection!==`none`&&t!==``&&de(g,t);e.toggleAttribute(`data-selected`,n),$.props.selection===`none`?e.removeAttribute(`aria-selected`):e.setAttribute(`aria-selected`,String(n))})},W=()=>{if(!r||!d)return;r.style.setProperty(`--ui-data-grid-template`,le(p));let e=r.dataset.uiDataGridScope??``;d.textContent=ue(e,p);let t=r.querySelector(`[data-ui-data-grid-header-row]`);t&&be(t)},G=()=>{if(!r)return;let e=new Map(p.map((e,t)=>[e.key,{column:e,index:t}]));a?.setAttribute(`aria-colcount`,String(p.length));let t=r.querySelector(`[data-ui-data-grid-header-row]`),n=t?.querySelector(`[data-ui-data-grid-column-indicator]`);n&&t?.append(n);let i=ye();i.forEach(t=>{let n=Array.from(t.children).filter(e=>e instanceof HTMLElement&&e.hasAttribute(`data-ui-data-grid-cell`)),r=new Map(n.flatMap(e=>e instanceof HTMLElement&&e.hasAttribute(`data-ui-data-grid-cell`)?[[e.dataset.column??``,e]]:[]));p.forEach(({key:e})=>{let n=r.get(e);n&&(n.hidden=!1,t.append(n))}),n.forEach(n=>{e.has(n.dataset.column??``)||(n.hidden=!0,n.removeAttribute(`aria-colindex`),n.removeAttribute(`data-pinned`),t.append(n))})}),p.forEach((e,t)=>{ve(e),e.element.setAttribute(`aria-colindex`,String(t+1)),e.pinned?e.element.dataset.pinned=e.pinned:e.element.removeAttribute(`data-pinned`),e.sortable?e.element.setAttribute(`aria-sort`,e.sort):e.element.removeAttribute(`aria-sort`),e.element.dataset.disabled=String(!e.reorderable||!$.props.reorderableColumns);let n=e.element.querySelector(`[data-ui-data-grid-column-label-owned]`);n&&(n.textContent=e.label);let r=e.element.querySelector(`[data-ui-data-grid-column-preview-label]`);r&&(r.textContent=e.label);let i=e.element.querySelector(`[data-ui-data-grid-sort-indicator]`);i&&(i.textContent=e.sort===`ascending`?`↑`:e.sort===`descending`?`↓`:``),e.element.querySelector(`[data-ui-data-grid-resize-handle]`)?.setAttribute(`aria-label`,`Resize ${e.label||e.key} column`)}),i.forEach(e=>V(e,$.props.rowClass,he)),r.querySelectorAll(`[data-ui-data-grid-cell]`).forEach(t=>{let n=e.get(t.dataset.column??``);n&&(t.setAttribute(`aria-colindex`,String(n.index+1)),t.dataset.align=n.column.align,V(t,`${$.props.cellClass} ${n.column.cellClass}`,ge),n.column.pinned?t.dataset.pinned=n.column.pinned:t.removeAttribute(`data-pinned`))})},xe=(t,n)=>{let r=new Map(t.map(e=>[e.key,e])),i=new Map(n.map(e=>[e.key,e]));return{previous:t,columns:n,added:n.filter(({key:e})=>!r.has(e)).map(({key:e})=>e),removed:t.filter(({key:e})=>!i.has(e)).map(({key:e})=>e),changed:n.flatMap(t=>{let n=r.get(t.key);if(!n)return[];let i=Object.keys(t).filter(r=>r!==`key`&&!e(n[r],t[r]));return i.length?[{key:t.key,fields:i}]:[]})}},Se=()=>{if(P=!1,!r||b)return;let n=H(),i=O(n),a=!e(D,i),o=p.length!==n.length||p.some((e,t)=>e.element!==n[t]?.element),s=o||p.some((e,t)=>{let r=n[t];return!r||e.key!==r.key||e.resizable!==r.resizable||e.minWidth!==r.minWidth||e.maxWidth!==r.maxWidth});if(a||o||F){let e=D;p=n,D=i;let t=s||F;F=!1,G(),W(),t&&ke(),a&&B(`ui:data-grid-columns-change`,xe(e,i))}if($.props.totalRows!==h&&(J($.props.totalRows),C&&(r.dataset.totalItems=String(h))),C){let n=r.hasAttribute(`data-query`)?$.props.query:T;e(E,n)||(E=t(n),C.setQuery(n))}},K=()=>{P||(P=!0,queueMicrotask(Se))},q=()=>{r&&c&&(C||(r.toggleAttribute(`data-loading`,R.size>0),r.toggleAttribute(`data-empty`,h===0)),r.dataset.selection=$.props.selection,a?.setAttribute(`aria-rowcount`,String(h+1)),r.style.setProperty(`--ui-data-grid-row-height`,`${$.props.rowHeight}px`),r.style.setProperty(`--ui-data-grid-total-height`,`${Math.max(h*$.props.rowHeight,$.props.rowHeight)}px`),(!C||h>0)&&(c.style.height=`var(--ui-data-grid-total-height)`),U())},J=e=>{let t=M(e);t!==h&&(h=t,q(),B(`ui:data-grid-total-change`,{totalRows:h}))},Ce=e=>f.compute({axes:{y:{total:h,itemSize:$.props.rowHeight,viewportSize:$.props.bufferSize*$.props.rowHeight,scrollOffset:e*$.props.rowHeight,buffer:0}}}),we=e=>{if(h===0)return[];let t=M($.props.bufferSize,1),n=Math.min(h-1,Math.floor(Math.max(0,e)/$.props.rowHeight)),r=Math.floor(n/t)*t,i=Math.floor((h-1)/t)*t,a=[r-t,r,r+t].map(e=>Math.min(i,Math.max(0,e)));return r===0&&i>t?a.splice(0,3,0,t,Math.min(i,t*2)):r===i&&i>t&&a.splice(0,3,Math.max(0,i-t*2),i-t,i),[...new Set(a)].map(Ce)},Te=e=>{let t=e.axes.y;if(!t)throw Error(`Data Grid requires a vertical virtual window.`);let n=new URL($.props.fetchUrl,document.baseURI);return n.searchParams.set($.props.startParam,String(t.start)),n.searchParams.set($.props.countParam,String(t.count)),n.searchParams.set($.props.totalParam,String(t.total)),/^[a-z][a-z\d+.-]*:/i.test($.props.fetchUrl)||$.props.fetchUrl.startsWith(`//`)?n.href:`${n.pathname}${n.search}${n.hash}`},Ee=(e,t)=>{if(R.get(e)!==t||(R.delete(e),q(),R.size>0||v===null||b))return;let n=v;v=null,Y(n)},De=async(e,t,i)=>{let a=t.axes.y;if(!a)return;let o=new AbortController;R.set(e.key,o),q(),r?.removeAttribute(`data-error`),B(`ui:data-grid-load-start`,{window:t});try{let s=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${i.requestGeneration}`,c=await fetch(Te(t),{method:`GET`,headers:{Accept:`text/html`,"X-Trellis-Virtualizer":`true`,"X-Trellis-Request-ID":s},signal:o.signal});if(!c.ok&&c.status!==204){z.fail(i),r?.setAttribute(`data-error`,``),B(`ui:data-grid-error`,{window:t,status:c.status});return}let l=await re(c,$.props);if(z.pending(e.key)!==i||b||!await u(n,e.element,l.html,{assets:l.assets,shouldReplace:()=>z.pending(e.key)===i&&!b})||(l.totalItems!==null&&J(l.totalItems),!z.commit(i,t)))return;e.element.style.height=`${a.count*$.props.rowHeight}px`,e.element.style.transform=`translateY(${a.translateOffset}px)`,G(),U(),B(`ui:data-grid-load`,{window:t,start:a.start,count:a.count,end:a.start+a.count})}catch(e){if(o.signal.aborted)return;z.fail(i),r?.setAttribute(`data-error`,``),B(`ui:data-grid-error`,{window:t,status:0,error:e})}finally{Ee(e.key,o)}},Y=e=>{if(C||$.props.cursor)return;if(R.size>0){v=e;return}let t=we(e),r=Math.min(Math.max(0,h-1),Math.floor(Math.max(0,e)/$.props.rowHeight)),i=t.find(e=>{let t=e.axes.y;return t&&r>=t.start&&r<t.start+t.count})??t[0];if(i&&_!==i.key){_=i.key;let e=i.axes.y;B(`ui:data-grid-range`,{start:e.start,count:e.count,end:e.start+e.count,window:i})}if(t.length===0){m.forEach(e=>void u(n,e.element,``));return}let a=new Set;t.forEach(e=>{let t=m.find(t=>z.mounted(t.key)?.key===e.key);t&&a.add(t)});let o=m.filter(e=>!a.has(e));t.forEach(e=>{if(m.some(t=>z.mounted(t.key)?.key===e.key))return;let t=o.shift();if(!t)return;let n=z.begin(t.key,e);n&&De(t,e,n)})},X=()=>{R.forEach(e=>e.abort()),R.clear(),v=null,_=``,z.invalidate(),m.forEach(e=>{e.element.style.height=``,e.element.style.transform=``,u(n,e.element,``)}),q()},Z=(e,t)=>{g=j(e,$.props.selection),S=!0,$.props.selectionValue=g,r&&l({el:r,schema:w,key:`selectionValue`,value:g}),S=!1,U(),B(`ui:data-grid-selection-change`,{selection:g,added:t?.added??[],removed:t?.removed??[]})},Q=(e,t)=>{let n=fe(g,String(e),$.props.selection,t);(n.added.length!==0||n.removed.length!==0)&&Z(n.selection,n)},Oe=(e,t,n)=>{e.width=Math.min(e.maxWidth??1/0,Math.max(e.minWidth,t)),e.element.dataset.width=String(e.width),D=O(p),W(),B(`ui:data-grid-column-resize`,{column:e.key,width:e.width,phase:n})},ke=()=>{L?.run(),L=new te,I.addChild(L),p.forEach(e=>{let t=e.element.querySelector(`[data-ui-data-grid-resize-handle]`);if(!t)return;let n=e.resizable&&$.props.resizableColumns;if(t.hidden=!e.resizable,n?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`),t.tabIndex=n?0:-1,!n)return;let r=t=>Oe(e,t.previewWidth,t.phase);L?.add(se({element:e.element,handle:t,axis:`x`,min:e.minWidth,max:e.maxWidth,mode:$.props.resizeMode,disabled:()=>!$.props.resizableColumns||!e.resizable,onStart:r,onResize:r,onEnd:r}))})},$={get supportsSeek(){return C?.supportsSeek??!1},props:null,init(){I=ne(this),r=this.$el,b=!1;let e=globalThis.crypto?.randomUUID?.()??`grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;if(r.dataset.uiDataGridScope=e,r.querySelector(`[data-ui-data-grid-header-row]`)?.setAttribute(`data-sortable-scope`,e),this.props=s({el:r,schema:w,onChange:(e,t)=>{if(S)return;let n=t.map(({key:e})=>e);(n.includes(`selectionValue`)||n.includes(`selection`))&&(g=j(this.props.selectionValue,this.props.selection),U()),n.some(e=>[`resizableColumns`,`reorderableColumns`,`minColumnWidth`,`defaultColumnWidth`,`maxColumnWidth`].includes(e))&&(F=!0),n.some(e=>[`query`,`totalRows`,`resizableColumns`,`reorderableColumns`,`minColumnWidth`,`defaultColumnWidth`,`maxColumnWidth`].includes(e))&&K(),n.some(e=>[`fetchUrl`,`rowHeight`,`bufferSize`].includes(e))&&this.reload()}}),h=M(this.props.totalRows),g=j(this.props.selectionValue,this.props.selection),i=r.querySelector(`[data-ui-data-grid-viewport]`)??r.querySelector(`[data-ui-scroll-area-viewport]`),a=r.querySelector(`[data-ui-data-grid-inner]`),o=r.querySelector(`[data-ui-data-grid-body]`),c=r.querySelector(`[data-ui-data-grid-spacer]`),d=r.querySelector(`style[data-ui-data-grid-layout]`),m=Array.from(r.querySelectorAll(`[data-ui-data-grid-block]`)).slice(0,3).map((e,t)=>({element:e,key:`block-${t+1}`})),!i||!a||!o||!c||!d||m.length!==3)throw Error(`Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.`);i.setAttribute(`data-ui-data-grid-viewport`,``),p=H(),D=O(p),G(),W(),ke();let t=r.querySelector(`[data-ui-data-grid-header-row]`);t&&(typeof ResizeObserver<`u`&&(A=new ResizeObserver(()=>be(t)),A.observe(t)),k=new MutationObserver(K),k.observe(t,{attributes:!0,childList:!0,subtree:!0,attributeFilter:[`data-column`,`data-label`,`data-width`,`data-min-width`,`data-max-width`,`data-hidden`,`data-pinned`,`data-sortable`,`data-sort`,`data-resizable`,`data-reorderable`,`data-align`,`data-cell-class`,`hidden`]})),N=ee(r,{invalidateDom:K}),x=new AbortController,i.addEventListener(`scroll`,()=>{y||=requestAnimationFrame(()=>{y=0,i&&Y(i.scrollTop)})},{passive:!0,signal:x.signal}),r.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-ui-data-grid-sort-button]`);if(n&&this.props.sortableColumns){let t=n.closest(`[data-ui-data-grid-column-header]`),r=p.find(({key:e})=>e===t?.dataset.column);if(r?.sortable){let t=r.sort===`ascending`?`descending`:`ascending`;B(`ui:data-grid-sort`,{column:r.key,direction:t,additive:e.shiftKey})}return}let i=t.closest(`[data-ui-data-grid-row]`);if(!i||!r?.contains(i))return;let a=i.dataset.rowKey??``;this.props.selectOnRowClick&&!t.closest(me)&&Q(a),B(`ui:data-grid-row-activate`,{rowKey:a,row:i})},{signal:x.signal}),r.addEventListener(`dblclick`,e=>{let t=e.target.closest(`[data-ui-data-grid-cell]`),n=t?.closest(`[data-ui-data-grid-row]`);t&&n&&B(`ui:data-grid-cell-activate`,{rowKey:n.dataset.rowKey??``,column:t.dataset.column??``,cell:t})},{signal:x.signal}),r.addEventListener(`ui:sortable-drop`,(e=>{let t=e.detail?.source;if(t?.type!==`data-grid-column`)return;let n=Number(e.detail?.index??e.detail?.anchor?.index);Number.isInteger(n)&&this.reorderColumn(String(t.id),n)}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-total-change`,(e=>{C&&e.target===r&&J(Number(e.detail?.totalItems??0))}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-load-start`,(e=>{C&&e.target===r&&B(`ui:data-grid-load-start`,{mode:`cursor`})}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-load`,(e=>{C&&e.target===r&&(G(),U(),B(`ui:data-grid-load`,{...e.detail,mode:`cursor`}))}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-error`,(e=>{C&&e.target===r&&B(`ui:data-grid-error`,{...e.detail,mode:`cursor`})}),{signal:x.signal}),i.style.overscrollBehavior=`contain`,i.style.overflowAnchor=`none`,i.scrollTop=f.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:i.clientHeight,scrollOffset:0,buffer:this.props.bufferSize},{axis:`y`,index:this.props.initialIndex}),q(),this.props.cursor?this.useCursor(oe(()=>{if(!r)throw Error(`Data Grid is not mounted.`);return r})):Y(i.scrollTop)},destroy(){b=!0,y&&cancelAnimationFrame(y),x?.abort(),x=null,k?.disconnect(),k=null,A?.disconnect(),A=null,N?.(),N=null,L=null,C?.destroy(),C=null,X(),this.props.disconnect(),r=null,i=null,a=null,o=null,c=null,d=null,p=[],D=[],m=[]},scrollToIndex(e,t=`start`){if(C){C.scrollToIndex(e,t);return}i&&(i.scrollTop=f.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:i.clientHeight,scrollOffset:i.scrollTop,buffer:this.props.bufferSize},{axis:`y`,index:e,align:t}),Y(i.scrollTop))},setTotalRows(e){r&&l({el:r,schema:w,key:`totalRows`,value:M(e)})},setQuery(e){r&&l({el:r,schema:w,key:`query`,value:e})},useCursor(e){if(!r||!i||!c)return;C?.destroy(),C=null,X(),r.dataset.totalItems=String(h),r.dataset.itemSize=String(this.props.rowHeight),c.setAttribute(`data-ui-virtualizer-spacer`,``),m.forEach(({element:e})=>e.setAttribute(`data-ui-virtualizer-block`,``)),T=e.query;let a=r.hasAttribute(`data-query`)?this.props.query:T;E=t(a);let o=ie(n,{cursor:{...e,query:a}});C=o,Object.assign(o,{$el:r}),o.init()},setUrl(e,t={}){S=!0,this.props.fetchUrl=String(e),r&&l({el:r,schema:w,key:`fetchUrl`,value:String(e)}),S=!1,t.reset??!0?this.reset():this.reload()},reset(e={}){if(C){C.reset({scrollTop:e.scrollTop??0});return}this.reload({scrollTop:e.scrollTop??0})},reload(e={}){if(C){C.reload(e);return}let t=e.scrollTop??i?.scrollTop??0;X(),i&&(i.scrollTop=Math.max(0,t)),Y(t)},resizeColumn(e,t){let n=p.find(t=>t.key===e);n&&Oe(n,Number(t),`end`)},reorderColumn(e,t){let n=p.findIndex(t=>t.key===e),i=pe(p,e,M(t));if(!i)return;p=i,D=O(p);let a=r?.querySelector(`[data-ui-data-grid-header-row]`),o=a?.querySelector(`[data-ui-data-grid-column-indicator]`)??null;p.forEach(e=>a?.insertBefore(e.element,o)),G(),W(),B(`ui:data-grid-column-reorder`,{column:e,from:n,to:M(t),columns:p.map(({key:e})=>e)})},selectRow(e){Q(String(e),!0)},deselectRow(e){Q(String(e),!1)},toggleRow(e){Q(String(e))},setSelection(e){Z(e)},selectQuery(e,t,n=[]){Z({mode:`query`,token:String(e),total:M(t),except:n.map(String)})},clearSelection(){Z({mode:`ids`,ids:[]})}};return $},P=e=>{d(`UiDataGrid`,()=>N(e))(e)},F=new WeakSet,I=e=>{F.has(e)||(F.add(e),m(e),n(e),p(e),P(e))};export{N as n,I as t};
2
- //# sourceMappingURL=entry.generated-CwuIK_Zx.js.map
1
+ import{i as e,t}from"./object-SRW-YaCA.js";import{t as n}from"./capability-motion-BGVnZE_T.js";import{c as r,f as i,l as a,n as o,o as s,s as c,u as l}from"./codecs-CQ7olTJL.js";import{n as ee}from"./dom-invalidation-Dw6clnS4.js";import{t as u}from"./fragment-9OT0mn7F.js";import{t as te}from"./cleanup-manager-D9QiZF_Q.js";import{n as d,t as ne}from"./alpine-data-Dvc_bXq6.js";import{a as re,i as f,n as ie,r as ae,t as oe}from"./cursor-data-source-Do0FfF4Z.js";import{t as p}from"./capability-sortable-ehmPfdn1.js";import{n as se,t as m}from"./capability-resizable-ByUbMIHF.js";import{R as h,y as g}from"./common-CBK89mIt.js";var _=[`none`,`single`,`multiple`],v=[`compact`,`default`,`comfortable`],y=[`none`,`row`,`grid`],b=[`onChange`,`onEnd`],x=[``,`left`,`right`],S=[`none`,`ascending`,`descending`,`other`],C=[`start`,`center`,`end`],w={fetchUrl:i,cursor:o,query:c(null),totalRows:r.min(0).default(0),rowHeight:r.min(2**-52).default(36),bufferSize:r.min(1).default(50),overscan:r.min(0).default(0),initialIndex:r.min(0).default(0),startParam:i.default(`start`),countParam:i.default(`count`),totalParam:i.default(`total`),totalHeader:i.default(`X-Trellis-Total-Items`),assetsHeader:i.default(`X-Trellis-Assets`),metaSelector:i.default(`template[data-ui-virtualizer-meta]`),selection:a(_,`none`),selectionValue:c({mode:`ids`,ids:[]}),selectOnRowClick:o,rowKey:i.default(`id`),stickyHeader:o.default(!0),resizableColumns:o.default(!0),reorderableColumns:o.default(!0),sortableColumns:o.default(!0),minColumnWidth:r.min(0).default(60),defaultColumnWidth:r.min(2**-52).default(180),maxColumnWidth:c(null),resizeMode:a(b,`onChange`),color:a(h,`neutral`),interaction:a(g,`edge`),dragPreviewPosition:i.trim.default(`preserve`),density:a(v,`default`),border:a(y,`row`),empty:i.default(`No rows found.`),class:i,controlsClass:i,viewportClass:i,headerClass:i,rowClass:i,cellClass:i,footerClass:i,emptyClass:i};r.min(2**-52).default(180),r.min(0).default(60),c(null),a(x,``),a(S,`none`),o.default(!0),o.default(!0),a(C,`start`),c([]),c([]),r.min(0).default(0),i.default(`id`),i.default(`ui.data-grid.row`),i.default(`ui.data-grid.cell`),r.min(0).default(0),r.min(1).default(1),a(C,`start`);var T=(e,t,n)=>{let r=e.getAttribute(t);if(r===null||r.trim()===``)return n;let i=Number(r);return Number.isFinite(i)?i:n},E=(e,t,n)=>{let r=e.getAttribute(t);if(r===null||r.trim()===``)return n;let i=Number(r);return Number.isFinite(i)&&i>0?i:null},D=(e,t,n)=>{if(!e.hasAttribute(t))return n;let r=e.getAttribute(t)??``;return r===``||[`true`,`1`,`yes`,`on`].includes(r.toLowerCase())},ce=(e,t)=>{let n=new Set;return e.flatMap(e=>{let r=(e.dataset.column??``).trim();if(!r)throw Error(`Data Grid columns require a non-empty key.`);if(e.hasAttribute(`data-hidden`))return[];if(n.has(r))throw Error(`Data Grid column key "${r}" is duplicated.`);n.add(r);let i=Math.max(0,T(e,`data-min-width`,t.minWidth)),a=E(e,`data-max-width`,t.maxWidth),o=T(e,`data-width`,t.width),s=Math.min(a??1/0,Math.max(i,o)),c=e.dataset.pinned===`left`||e.dataset.pinned===`right`?e.dataset.pinned:null,l=[`ascending`,`descending`,`other`].includes(e.dataset.sort??``)?e.dataset.sort:`none`,ee=[`center`,`end`].includes(e.dataset.align??``)?e.dataset.align:`start`;return[{key:r,label:e.dataset.label??e.textContent?.trim()??r,width:s,minWidth:i,maxWidth:a,hidden:!1,pinned:c,sortable:D(e,`data-sortable`,!1),sort:l,resizable:D(e,`data-resizable`,t.resizable),reorderable:D(e,`data-reorderable`,t.reorderable),align:ee,cellClass:e.dataset.cellClass??``,element:e}]})},le=e=>e.map(({width:e})=>`${e}px`).join(` `),O=e=>e.map(({element:e,...t})=>t),k=e=>{let t=new Map,n=new Map,r=0;return e.forEach(e=>{e.pinned===`left`&&(t.set(e.key,r),r+=e.width)}),r=0,[...e].reverse().forEach(e=>{e.pinned===`right`&&(n.set(e.key,r),r+=e.width)}),{left:t,right:n}},A=e=>globalThis.CSS?.escape?globalThis.CSS.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,e=>`\\${e}`),ue=(e,t)=>{let n=k(t),r=`z-index:2;background-color:var(--ui-surface-color);`;return t.map((t,i)=>{let a=`[data-ui-data-grid-scope="${A(e)}"]`,o=`[data-column="${A(t.key)}"]`,s=`${a} [data-ui-data-grid-column-header]${o},${a} [data-ui-data-grid-cell]${o}`,c=t.pinned===`left`?`position:sticky;left:${n.left.get(t.key)??0}px;${r}`:t.pinned===`right`?`position:sticky;right:${n.right.get(t.key)??0}px;${r}`:``;return`${s}{grid-column:${i+1};${c}}`}).join(``)},j=(e,t)=>{if(t===`multiple`&&typeof e==`object`&&e&&e.mode===`query`){let t=e;if(typeof t.token==`string`&&Number.isFinite(t.total))return{mode:`query`,token:t.token,total:Math.max(0,Math.floor(t.total??0)),except:[...new Set(Array.isArray(t.except)?t.except.filter(e=>typeof e==`string`):[])]}}let n=typeof e==`object`&&e&&e.mode===`ids`&&Array.isArray(e.ids)?e.ids.filter(e=>typeof e==`string`):[],r=[...new Set(n)];return{mode:`ids`,ids:t===`single`?r.slice(0,1):t===`none`?[]:r}},de=(e,t)=>e.mode===`query`?!e.except.includes(t):e.ids.includes(t),fe=(e,t,n,r)=>{let i=j(e,n);if(n===`none`)return{selection:i,added:[],removed:[]};let a=de(i,t),o=r??!a;if(a===o)return{selection:i,added:[],removed:[]};if(i.mode===`query`){let e=o?i.except.filter(e=>e!==t):[...i.except,t];return{selection:{...i,except:e},added:o?[t]:[],removed:o?[]:[t]}}return{selection:{mode:`ids`,ids:n===`single`&&o?[t]:o?[...i.ids,t]:i.ids.filter(e=>e!==t)},added:o?[t]:[],removed:o?[]:[t]}},pe=(e,t,n)=>{let r=e.findIndex(e=>e.key===t);if(r<0||!e[r]?.reorderable)return null;let i=e[r]?.pinned??null;if(!e.flatMap((e,t)=>e.pinned===i?[t]:[]).includes(n))return null;let a=[...e],[o]=a.splice(r,1);return o?(a.splice(n,0,o),a):null},M=(e,t=0)=>Math.max(t,Math.floor(Number.isFinite(e)?e:t)),me=`a,button,input,select,textarea,[contenteditable],[role="button"],[role="link"]`,N=n=>{let r=null,i=null,a=null,o=null,c=null,d=null,p=[],m=[],h=0,g={mode:`ids`,ids:[]},_=``,v=null,y=0,b=!1,x=null,S=!1,C=null,T=null,E=null,D=[],k=null,A=null,N=null,P=!1,F=!1,I,L=null,R=new Map,he=new WeakMap,ge=new WeakMap,z=ae(f),B=(e,t)=>{r?.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t}))},V=(e,t,n)=>{let r=n.get(e)??[];r.length&&e.classList.remove(...r);let i=[...new Set(t.split(/\s+/).filter(Boolean))];i.length&&e.classList.add(...i),n.set(e,i)},_e=()=>({width:$.props.defaultColumnWidth,minWidth:$.props.minColumnWidth,maxWidth:$.props.maxColumnWidth,resizable:$.props.resizableColumns,reorderable:$.props.reorderableColumns}),H=()=>ce(Array.from(r?.querySelectorAll(`[data-ui-data-grid-column-header]`)??[]),_e()),ve=e=>{let t=e.element.querySelector(`[data-ui-data-grid-column-label]`),n=e.element.querySelector(`[data-ui-data-grid-sort-button]`);if(t){if(e.sortable&&!n){let n=document.createElement(`button`);n.type=`button`,n.setAttribute(`data-ui-data-grid-sort-button`,``),n.className=e.element.dataset.sortButtonClass??``;let r=document.createElement(`span`);r.setAttribute(`data-ui-data-grid-sort-indicator`,``),r.setAttribute(`aria-hidden`,`true`),t.replaceWith(n),n.append(t,r)}else!e.sortable&&n&&n.replaceWith(t)}},ye=()=>Array.from(r?.querySelectorAll(`[data-ui-data-grid-row]`)??[]),be=e=>{o?.style.setProperty(`width`,`${e.getBoundingClientRect().width}px`)},U=()=>{ye().forEach(e=>{let t=e.dataset.rowKey??``,n=$.props.selection!==`none`&&t!==``&&de(g,t);e.toggleAttribute(`data-selected`,n),$.props.selection===`none`?e.removeAttribute(`aria-selected`):e.setAttribute(`aria-selected`,String(n))})},W=()=>{if(!r||!d)return;r.style.setProperty(`--ui-data-grid-template`,le(p));let e=r.dataset.uiDataGridScope??``;d.textContent=ue(e,p);let t=r.querySelector(`[data-ui-data-grid-header-row]`);t&&be(t)},G=()=>{if(!r)return;let e=new Map(p.map((e,t)=>[e.key,{column:e,index:t}]));a?.setAttribute(`aria-colcount`,String(p.length));let t=r.querySelector(`[data-ui-data-grid-header-row]`),n=t?.querySelector(`[data-ui-data-grid-column-indicator]`);n&&t?.append(n);let i=ye();i.forEach(t=>{let n=Array.from(t.children).filter(e=>e instanceof HTMLElement&&e.hasAttribute(`data-ui-data-grid-cell`)),r=new Map(n.flatMap(e=>e instanceof HTMLElement&&e.hasAttribute(`data-ui-data-grid-cell`)?[[e.dataset.column??``,e]]:[]));p.forEach(({key:e})=>{let n=r.get(e);n&&(n.hidden=!1,t.append(n))}),n.forEach(n=>{e.has(n.dataset.column??``)||(n.hidden=!0,n.removeAttribute(`aria-colindex`),n.removeAttribute(`data-pinned`),t.append(n))})}),p.forEach((e,t)=>{ve(e),e.element.setAttribute(`aria-colindex`,String(t+1)),e.pinned?e.element.dataset.pinned=e.pinned:e.element.removeAttribute(`data-pinned`),e.sortable?e.element.setAttribute(`aria-sort`,e.sort):e.element.removeAttribute(`aria-sort`),e.element.dataset.disabled=String(!e.reorderable||!$.props.reorderableColumns);let n=e.element.querySelector(`[data-ui-data-grid-column-label-owned]`);n&&(n.textContent=e.label);let r=e.element.querySelector(`[data-ui-data-grid-column-preview-label]`);r&&(r.textContent=e.label);let i=e.element.querySelector(`[data-ui-data-grid-sort-indicator]`);i&&(i.textContent=e.sort===`ascending`?`↑`:e.sort===`descending`?`↓`:``),e.element.querySelector(`[data-ui-data-grid-resize-handle]`)?.setAttribute(`aria-label`,`Resize ${e.label||e.key} column`)}),i.forEach(e=>V(e,$.props.rowClass,he)),r.querySelectorAll(`[data-ui-data-grid-cell]`).forEach(t=>{let n=e.get(t.dataset.column??``);n&&(t.setAttribute(`aria-colindex`,String(n.index+1)),t.dataset.align=n.column.align,V(t,`${$.props.cellClass} ${n.column.cellClass}`,ge),n.column.pinned?t.dataset.pinned=n.column.pinned:t.removeAttribute(`data-pinned`))})},xe=(t,n)=>{let r=new Map(t.map(e=>[e.key,e])),i=new Map(n.map(e=>[e.key,e]));return{previous:t,columns:n,added:n.filter(({key:e})=>!r.has(e)).map(({key:e})=>e),removed:t.filter(({key:e})=>!i.has(e)).map(({key:e})=>e),changed:n.flatMap(t=>{let n=r.get(t.key);if(!n)return[];let i=Object.keys(t).filter(r=>r!==`key`&&!e(n[r],t[r]));return i.length?[{key:t.key,fields:i}]:[]})}},Se=()=>{if(P=!1,!r||b)return;let n=H(),i=O(n),a=!e(D,i),o=p.length!==n.length||p.some((e,t)=>e.element!==n[t]?.element),s=o||p.some((e,t)=>{let r=n[t];return!r||e.key!==r.key||e.resizable!==r.resizable||e.minWidth!==r.minWidth||e.maxWidth!==r.maxWidth});if(a||o||F){let e=D;p=n,D=i;let t=s||F;F=!1,G(),W(),t&&ke(),a&&B(`ui:data-grid-columns-change`,xe(e,i))}if($.props.totalRows!==h&&(J($.props.totalRows),C&&(r.dataset.totalItems=String(h))),C){let n=r.hasAttribute(`data-query`)?$.props.query:T;e(E,n)||(E=t(n),C.setQuery(n))}},K=()=>{P||(P=!0,queueMicrotask(Se))},q=()=>{r&&c&&(C||(r.toggleAttribute(`data-loading`,R.size>0),r.toggleAttribute(`data-empty`,h===0)),r.dataset.selection=$.props.selection,a?.setAttribute(`aria-rowcount`,String(h+1)),r.style.setProperty(`--ui-data-grid-row-height`,`${$.props.rowHeight}px`),r.style.setProperty(`--ui-data-grid-total-height`,`${Math.max(h*$.props.rowHeight,$.props.rowHeight)}px`),(!C||h>0)&&(c.style.height=`var(--ui-data-grid-total-height)`),U())},J=e=>{let t=M(e);t!==h&&(h=t,q(),B(`ui:data-grid-total-change`,{totalRows:h}))},Ce=e=>f.compute({axes:{y:{total:h,itemSize:$.props.rowHeight,viewportSize:$.props.bufferSize*$.props.rowHeight,scrollOffset:e*$.props.rowHeight,buffer:0}}}),we=e=>{if(h===0)return[];let t=M($.props.bufferSize,1),n=Math.min(h-1,Math.floor(Math.max(0,e)/$.props.rowHeight)),r=Math.floor(n/t)*t,i=Math.floor((h-1)/t)*t,a=[r-t,r,r+t].map(e=>Math.min(i,Math.max(0,e)));return r===0&&i>t?a.splice(0,3,0,t,Math.min(i,t*2)):r===i&&i>t&&a.splice(0,3,Math.max(0,i-t*2),i-t,i),[...new Set(a)].map(Ce)},Te=e=>{let t=e.axes.y;if(!t)throw Error(`Data Grid requires a vertical virtual window.`);let n=new URL($.props.fetchUrl,document.baseURI);return n.searchParams.set($.props.startParam,String(t.start)),n.searchParams.set($.props.countParam,String(t.count)),n.searchParams.set($.props.totalParam,String(t.total)),/^[a-z][a-z\d+.-]*:/i.test($.props.fetchUrl)||$.props.fetchUrl.startsWith(`//`)?n.href:`${n.pathname}${n.search}${n.hash}`},Ee=(e,t)=>{if(R.get(e)!==t||(R.delete(e),q(),R.size>0||v===null||b))return;let n=v;v=null,Y(n)},De=async(e,t,i)=>{let a=t.axes.y;if(!a)return;let o=new AbortController;R.set(e.key,o),q(),r?.removeAttribute(`data-error`),B(`ui:data-grid-load-start`,{window:t});try{let s=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${i.requestGeneration}`,c=await fetch(Te(t),{method:`GET`,headers:{Accept:`text/html`,"X-Trellis-Virtualizer":`true`,"X-Trellis-Request-ID":s},signal:o.signal});if(!c.ok&&c.status!==204){z.fail(i),r?.setAttribute(`data-error`,``),B(`ui:data-grid-error`,{window:t,status:c.status});return}let l=await re(c,$.props);if(z.pending(e.key)!==i||b||!await u(n,e.element,l.html,{assets:l.assets,shouldReplace:()=>z.pending(e.key)===i&&!b})||(l.totalItems!==null&&J(l.totalItems),!z.commit(i,t)))return;e.element.style.height=`${a.count*$.props.rowHeight}px`,e.element.style.transform=`translateY(${a.translateOffset}px)`,G(),U(),B(`ui:data-grid-load`,{window:t,start:a.start,count:a.count,end:a.start+a.count})}catch(e){if(o.signal.aborted)return;z.fail(i),r?.setAttribute(`data-error`,``),B(`ui:data-grid-error`,{window:t,status:0,error:e})}finally{Ee(e.key,o)}},Y=e=>{if(C||$.props.cursor)return;if(R.size>0){v=e;return}let t=we(e),r=Math.min(Math.max(0,h-1),Math.floor(Math.max(0,e)/$.props.rowHeight)),i=t.find(e=>{let t=e.axes.y;return t&&r>=t.start&&r<t.start+t.count})??t[0];if(i&&_!==i.key){_=i.key;let e=i.axes.y;B(`ui:data-grid-range`,{start:e.start,count:e.count,end:e.start+e.count,window:i})}if(t.length===0){m.forEach(e=>void u(n,e.element,``));return}let a=new Set;t.forEach(e=>{let t=m.find(t=>z.mounted(t.key)?.key===e.key);t&&a.add(t)});let o=m.filter(e=>!a.has(e));t.forEach(e=>{if(m.some(t=>z.mounted(t.key)?.key===e.key))return;let t=o.shift();if(!t)return;let n=z.begin(t.key,e);n&&De(t,e,n)})},X=()=>{R.forEach(e=>e.abort()),R.clear(),v=null,_=``,z.invalidate(),m.forEach(e=>{e.element.style.height=``,e.element.style.transform=``,u(n,e.element,``)}),q()},Z=(e,t)=>{g=j(e,$.props.selection),S=!0,$.props.selectionValue=g,r&&l({el:r,schema:w,key:`selectionValue`,value:g}),S=!1,U(),B(`ui:data-grid-selection-change`,{selection:g,added:t?.added??[],removed:t?.removed??[]})},Q=(e,t)=>{let n=fe(g,String(e),$.props.selection,t);(n.added.length!==0||n.removed.length!==0)&&Z(n.selection,n)},Oe=(e,t,n)=>{e.width=Math.min(e.maxWidth??1/0,Math.max(e.minWidth,t)),e.element.dataset.width=String(e.width),D=O(p),W(),B(`ui:data-grid-column-resize`,{column:e.key,width:e.width,phase:n})},ke=()=>{L?.run(),L=new te,I.addChild(L),p.forEach(e=>{let t=e.element.querySelector(`[data-ui-data-grid-resize-handle]`);if(!t)return;let n=e.resizable&&$.props.resizableColumns;if(t.hidden=!e.resizable,n?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`),t.tabIndex=n?0:-1,!n)return;let r=t=>Oe(e,t.previewWidth,t.phase);L?.add(se({element:e.element,handle:t,axis:`x`,min:e.minWidth,max:e.maxWidth,mode:$.props.resizeMode,disabled:()=>!$.props.resizableColumns||!e.resizable,onStart:r,onResize:r,onEnd:r}))})},$={get supportsSeek(){return C?.supportsSeek??!1},props:null,init(){I=ne(this),r=this.$el,b=!1;let e=globalThis.crypto?.randomUUID?.()??`grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;if(r.dataset.uiDataGridScope=e,r.querySelector(`[data-ui-data-grid-header-row]`)?.setAttribute(`data-sortable-scope`,e),this.props=s({el:r,schema:w,onChange:(e,t)=>{if(S)return;let n=t.map(({key:e})=>e);(n.includes(`selectionValue`)||n.includes(`selection`))&&(g=j(this.props.selectionValue,this.props.selection),U()),n.some(e=>[`resizableColumns`,`reorderableColumns`,`minColumnWidth`,`defaultColumnWidth`,`maxColumnWidth`].includes(e))&&(F=!0),n.some(e=>[`query`,`totalRows`,`resizableColumns`,`reorderableColumns`,`minColumnWidth`,`defaultColumnWidth`,`maxColumnWidth`].includes(e))&&K(),n.some(e=>[`fetchUrl`,`rowHeight`,`bufferSize`].includes(e))&&this.reload()}}),h=M(this.props.totalRows),g=j(this.props.selectionValue,this.props.selection),i=r.querySelector(`[data-ui-data-grid-viewport]`)??r.querySelector(`[data-ui-scroll-area-viewport]`),a=r.querySelector(`[data-ui-data-grid-inner]`),o=r.querySelector(`[data-ui-data-grid-body]`),c=r.querySelector(`[data-ui-data-grid-spacer]`),d=r.querySelector(`style[data-ui-data-grid-layout]`),m=Array.from(r.querySelectorAll(`[data-ui-data-grid-block]`)).slice(0,3).map((e,t)=>({element:e,key:`block-${t+1}`})),!i||!a||!o||!c||!d||m.length!==3)throw Error(`Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.`);i.setAttribute(`data-ui-data-grid-viewport`,``),p=H(),D=O(p),G(),W(),ke();let t=r.querySelector(`[data-ui-data-grid-header-row]`);t&&(typeof ResizeObserver<`u`&&(A=new ResizeObserver(()=>be(t)),A.observe(t)),k=new MutationObserver(K),k.observe(t,{attributes:!0,childList:!0,subtree:!0,attributeFilter:[`data-column`,`data-label`,`data-width`,`data-min-width`,`data-max-width`,`data-hidden`,`data-pinned`,`data-sortable`,`data-sort`,`data-resizable`,`data-reorderable`,`data-align`,`data-cell-class`,`hidden`]})),N=ee(r,{invalidateDom:K}),x=new AbortController,i.addEventListener(`scroll`,()=>{y||=requestAnimationFrame(()=>{y=0,i&&Y(i.scrollTop)})},{passive:!0,signal:x.signal}),r.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-ui-data-grid-sort-button]`);if(n&&this.props.sortableColumns){let t=n.closest(`[data-ui-data-grid-column-header]`),r=p.find(({key:e})=>e===t?.dataset.column);if(r?.sortable){let t=r.sort===`ascending`?`descending`:`ascending`;B(`ui:data-grid-sort`,{column:r.key,direction:t,additive:e.shiftKey})}return}let i=t.closest(`[data-ui-data-grid-row]`);if(!i||!r?.contains(i))return;let a=i.dataset.rowKey??``;this.props.selectOnRowClick&&!t.closest(me)&&Q(a),B(`ui:data-grid-row-activate`,{rowKey:a,row:i})},{signal:x.signal}),r.addEventListener(`dblclick`,e=>{let t=e.target.closest(`[data-ui-data-grid-cell]`),n=t?.closest(`[data-ui-data-grid-row]`);t&&n&&B(`ui:data-grid-cell-activate`,{rowKey:n.dataset.rowKey??``,column:t.dataset.column??``,cell:t})},{signal:x.signal}),r.addEventListener(`ui:sortable-drop`,(e=>{let t=e.detail?.source;if(t?.type!==`data-grid-column`)return;let n=Number(e.detail?.index??e.detail?.anchor?.index);Number.isInteger(n)&&this.reorderColumn(String(t.id),n)}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-total-change`,(e=>{C&&e.target===r&&J(Number(e.detail?.totalItems??0))}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-load-start`,(e=>{C&&e.target===r&&B(`ui:data-grid-load-start`,{mode:`cursor`})}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-load`,(e=>{C&&e.target===r&&(G(),U(),B(`ui:data-grid-load`,{...e.detail,mode:`cursor`}))}),{signal:x.signal}),r.addEventListener(`ui:virtualizer-error`,(e=>{C&&e.target===r&&B(`ui:data-grid-error`,{...e.detail,mode:`cursor`})}),{signal:x.signal}),i.style.overscrollBehavior=`contain`,i.style.overflowAnchor=`none`,i.scrollTop=f.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:i.clientHeight,scrollOffset:0,buffer:this.props.bufferSize},{axis:`y`,index:this.props.initialIndex}),q(),this.props.cursor?this.useCursor(oe(()=>{if(!r)throw Error(`Data Grid is not mounted.`);return r})):Y(i.scrollTop)},destroy(){b=!0,y&&cancelAnimationFrame(y),x?.abort(),x=null,k?.disconnect(),k=null,A?.disconnect(),A=null,N?.(),N=null,L=null,C?.destroy(),C=null,X(),this.props.disconnect(),r=null,i=null,a=null,o=null,c=null,d=null,p=[],D=[],m=[]},scrollToIndex(e,t=`start`){if(C){C.scrollToIndex(e,t);return}i&&(i.scrollTop=f.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:i.clientHeight,scrollOffset:i.scrollTop,buffer:this.props.bufferSize},{axis:`y`,index:e,align:t}),Y(i.scrollTop))},setTotalRows(e){r&&l({el:r,schema:w,key:`totalRows`,value:M(e)})},setQuery(e){r&&l({el:r,schema:w,key:`query`,value:e})},useCursor(e){if(!r||!i||!c)return;C?.destroy(),C=null,X(),r.dataset.totalItems=String(h),r.dataset.itemSize=String(this.props.rowHeight),c.setAttribute(`data-ui-virtualizer-spacer`,``),m.forEach(({element:e})=>e.setAttribute(`data-ui-virtualizer-block`,``)),T=e.query;let a=r.hasAttribute(`data-query`)?this.props.query:T;E=t(a);let o=ie(n,{cursor:{...e,query:a}});C=o,Object.assign(o,{$el:r}),o.init()},setUrl(e,t={}){S=!0,this.props.fetchUrl=String(e),r&&l({el:r,schema:w,key:`fetchUrl`,value:String(e)}),S=!1,t.reset??!0?this.reset():this.reload()},reset(e={}){if(C){C.reset({scrollTop:e.scrollTop??0});return}this.reload({scrollTop:e.scrollTop??0})},reload(e={}){if(C){C.reload(e);return}let t=e.scrollTop??i?.scrollTop??0;X(),i&&(i.scrollTop=Math.max(0,t)),Y(t)},resizeColumn(e,t){let n=p.find(t=>t.key===e);n&&Oe(n,Number(t),`end`)},reorderColumn(e,t){let n=p.findIndex(t=>t.key===e),i=pe(p,e,M(t));if(!i)return;p=i,D=O(p);let a=r?.querySelector(`[data-ui-data-grid-header-row]`),o=a?.querySelector(`[data-ui-data-grid-column-indicator]`)??null;p.forEach(e=>a?.insertBefore(e.element,o)),G(),W(),B(`ui:data-grid-column-reorder`,{column:e,from:n,to:M(t),columns:p.map(({key:e})=>e)})},selectRow(e){Q(String(e),!0)},deselectRow(e){Q(String(e),!1)},toggleRow(e){Q(String(e))},setSelection(e){Z(e)},selectQuery(e,t,n=[]){Z({mode:`query`,token:String(e),total:M(t),except:n.map(String)})},clearSelection(){Z({mode:`ids`,ids:[]})}};return $},P=e=>{d(`UiDataGrid`,()=>N(e))(e)},F=new WeakSet,I=e=>{F.has(e)||(F.add(e),m(e),n(e),p(e),P(e))};export{N as n,I as t};
2
+ //# sourceMappingURL=entry.generated-COp9wMCd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.generated-CwuIK_Zx.js","names":[],"sources":["../../../../../../../../client/src/components/data-grid/contract.ts","../../../../../../../../client/src/components/data-grid/model.ts","../../../../../../../../client/src/components/data-grid/index.ts","../../../../../../../../client/src/components/data-grid/entry.generated.ts"],"sourcesContent":["import {bool, json, number, oneOf, string, type SchemaToProps} from '../../runtime';\nimport {INTERACTION_TREATMENTS, SELECTION_COLORS} from '../common';\n\nconst DATA_GRID_SELECTIONS = ['none', 'single', 'multiple'] as const;\nconst DATA_GRID_DENSITIES = ['compact', 'default', 'comfortable'] as const;\nconst DATA_GRID_BORDERS = ['none', 'row', 'grid'] as const;\nconst DATA_GRID_RESIZE_MODES = ['onChange', 'onEnd'] as const;\nconst DATA_GRID_PINS = ['', 'left', 'right'] as const;\nconst DATA_GRID_SORTS = ['none', 'ascending', 'descending', 'other'] as const;\nconst DATA_GRID_ALIGNS = ['start', 'center', 'end'] as const;\n\ntype DataGridSelectionValue =\n | {mode: 'ids'; ids: string[]}\n | {mode: 'query'; token: string; total: number; except: string[]};\n\nconst dataGridSchema = {\n fetchUrl: string,\n cursor: bool,\n query: json<unknown>(null),\n totalRows: number.min(0).default(0),\n rowHeight: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n selection: oneOf(DATA_GRID_SELECTIONS, 'none'),\n selectionValue: json<DataGridSelectionValue>({mode: 'ids', ids: []}),\n selectOnRowClick: bool,\n rowKey: string.default('id'),\n stickyHeader: bool.default(true),\n resizableColumns: bool.default(true),\n reorderableColumns: bool.default(true),\n sortableColumns: bool.default(true),\n minColumnWidth: number.min(0).default(60),\n defaultColumnWidth: number.min(Number.EPSILON).default(180),\n maxColumnWidth: json<number | null>(null),\n resizeMode: oneOf(DATA_GRID_RESIZE_MODES, 'onChange'),\n color: oneOf(SELECTION_COLORS, 'neutral'),\n interaction: oneOf(INTERACTION_TREATMENTS, 'edge'),\n dragPreviewPosition: string.trim.default('preserve'),\n density: oneOf(DATA_GRID_DENSITIES, 'default'),\n border: oneOf(DATA_GRID_BORDERS, 'row'),\n empty: string.default('No rows found.'),\n class: string,\n controlsClass: string,\n viewportClass: string,\n headerClass: string,\n rowClass: string,\n cellClass: string,\n footerClass: string,\n emptyClass: string,\n};\n\nconst dataGridColumnSchema = {\n key: string,\n label: string,\n width: number.min(Number.EPSILON).default(180),\n minWidth: number.min(0).default(60),\n maxWidth: json<number | null>(null),\n hidden: bool,\n pinned: oneOf(DATA_GRID_PINS, ''),\n sortable: bool,\n sort: oneOf(DATA_GRID_SORTS, 'none'),\n resizable: bool.default(true),\n reorderable: bool.default(true),\n align: oneOf(DATA_GRID_ALIGNS, 'start'),\n class: string,\n headerClass: string,\n labelClass: string,\n resizeHandleClass: string,\n};\n\nconst dataGridRowsSchema = {\n rows: json<unknown[]>([]),\n columns: json<Array<Record<string, unknown>>>([]),\n startIndex: number.min(0).default(0),\n rowKey: string.default('id'),\n rowComponent: string.default('ui.data-grid.row'),\n cellComponent: string.default('ui.data-grid.cell'),\n class: string,\n};\nconst dataGridRowSchema = {key: string, index: number.min(0).default(0), class: string};\nconst dataGridCellSchema = {column: string, index: number.min(1).default(1), align: oneOf(DATA_GRID_ALIGNS, 'start'), class: string};\nconst dataGridEmptySchema = {class: string};\n\ntype DataGridProps = SchemaToProps<typeof dataGridSchema>;\ntype DataGridColumnProps = SchemaToProps<typeof dataGridColumnSchema>;\ntype DataGridRowsProps = SchemaToProps<typeof dataGridRowsSchema>;\ntype DataGridSelection = typeof DATA_GRID_SELECTIONS[number];\ntype DataGridPin = Exclude<typeof DATA_GRID_PINS[number], ''> | null;\ntype DataGridSort = typeof DATA_GRID_SORTS[number];\ntype DataGridAlign = typeof DATA_GRID_ALIGNS[number];\n\nexport {\n DATA_GRID_ALIGNS,\n DATA_GRID_BORDERS,\n DATA_GRID_DENSITIES,\n DATA_GRID_PINS,\n DATA_GRID_RESIZE_MODES,\n DATA_GRID_SELECTIONS,\n DATA_GRID_SORTS,\n dataGridCellSchema,\n dataGridColumnSchema,\n dataGridEmptySchema,\n dataGridRowSchema,\n dataGridRowsSchema,\n dataGridSchema,\n};\nexport type {\n DataGridAlign,\n DataGridColumnProps,\n DataGridPin,\n DataGridProps,\n DataGridRowsProps,\n DataGridSelection,\n DataGridSelectionValue,\n DataGridSort,\n};\n","import type {DataGridAlign, DataGridPin, DataGridSelection, DataGridSelectionValue, DataGridSort} from './contract';\n\ntype DataGridColumn = {\n key: string;\n label: string;\n width: number;\n minWidth: number;\n maxWidth: number | null;\n hidden: boolean;\n pinned: DataGridPin;\n sortable: boolean;\n sort: DataGridSort;\n resizable: boolean;\n reorderable: boolean;\n align: DataGridAlign;\n cellClass: string;\n element: HTMLElement;\n};\n\ntype DataGridColumnDefaults = {\n width: number;\n minWidth: number;\n maxWidth: number | null;\n resizable: boolean;\n reorderable: boolean;\n};\n\ntype DataGridColumnSnapshot = Omit<DataGridColumn, 'element'>;\n\ntype DataGridPinnedOffsets = {left: Map<string, number>; right: Map<string, number>};\ntype SelectionChange = {selection: DataGridSelectionValue; added: string[]; removed: string[]};\n\nconst numberAttribute = (element: HTMLElement, name: string, fallback: number): number => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst optionalNumberAttribute = (element: HTMLElement, name: string, fallback: number | null): number | null => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? value : null;\n};\n\nconst boolAttribute = (element: HTMLElement, name: string, fallback: boolean): boolean => {\n if (!element.hasAttribute(name)) return fallback;\n const raw = element.getAttribute(name) ?? '';\n return raw === '' || ['true', '1', 'yes', 'on'].includes(raw.toLowerCase());\n};\n\nconst normalizeDataGridColumns = (\n elements: readonly HTMLElement[],\n defaults: DataGridColumnDefaults,\n): DataGridColumn[] => {\n const seen = new Set<string>();\n return elements.flatMap((element) => {\n const key = (element.dataset.column ?? '').trim();\n if (!key) throw new Error('Data Grid columns require a non-empty key.');\n if (element.hasAttribute('data-hidden')) return [];\n if (seen.has(key)) throw new Error(`Data Grid column key \"${key}\" is duplicated.`);\n seen.add(key);\n const minWidth = Math.max(0, numberAttribute(element, 'data-min-width', defaults.minWidth));\n const maxWidth = optionalNumberAttribute(element, 'data-max-width', defaults.maxWidth);\n const unclamped = numberAttribute(element, 'data-width', defaults.width);\n const width = Math.min(maxWidth ?? Number.POSITIVE_INFINITY, Math.max(minWidth, unclamped));\n const pinned = element.dataset.pinned === 'left' || element.dataset.pinned === 'right'\n ? element.dataset.pinned\n : null;\n const sort = ['ascending', 'descending', 'other'].includes(element.dataset.sort ?? '')\n ? element.dataset.sort as DataGridSort\n : 'none';\n const align = ['center', 'end'].includes(element.dataset.align ?? '')\n ? element.dataset.align as DataGridAlign\n : 'start';\n return [{\n key,\n label: element.dataset.label ?? element.textContent?.trim() ?? key,\n width,\n minWidth,\n maxWidth,\n hidden: false,\n pinned,\n sortable: boolAttribute(element, 'data-sortable', false),\n sort,\n resizable: boolAttribute(element, 'data-resizable', defaults.resizable),\n reorderable: boolAttribute(element, 'data-reorderable', defaults.reorderable),\n align,\n cellClass: element.dataset.cellClass ?? '',\n element,\n }];\n });\n};\n\nconst columnTemplate = (columns: readonly DataGridColumn[]): string => (\n columns.map(({width}) => `${width}px`).join(' ')\n);\n\nconst dataGridColumnSnapshots = (columns: readonly DataGridColumn[]): DataGridColumnSnapshot[] => (\n columns.map(({element: _element, ...column}) => column)\n);\n\nconst pinnedOffsets = (columns: readonly DataGridColumn[]): DataGridPinnedOffsets => {\n const left = new Map<string, number>();\n const right = new Map<string, number>();\n let offset = 0;\n columns.forEach((column) => {\n if (column.pinned !== 'left') return;\n left.set(column.key, offset);\n offset += column.width;\n });\n offset = 0;\n [...columns].reverse().forEach((column) => {\n if (column.pinned !== 'right') return;\n right.set(column.key, offset);\n offset += column.width;\n });\n return {left, right};\n};\n\nconst cssEscape = (value: string): string => (\n globalThis.CSS?.escape ? globalThis.CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`)\n);\n\nconst dataGridLayoutCss = (scope: string, columns: readonly DataGridColumn[]): string => {\n const offsets = pinnedOffsets(columns);\n const pinnedPlane = 'z-index:2;background-color:var(--ui-surface-color);';\n return columns.map((column, index) => {\n const owner = `[data-ui-data-grid-scope=\"${cssEscape(scope)}\"]`;\n const columnSelector = `[data-column=\"${cssEscape(column.key)}\"]`;\n const selector = `${owner} [data-ui-data-grid-column-header]${columnSelector},${owner} [data-ui-data-grid-cell]${columnSelector}`;\n const pin = column.pinned === 'left'\n ? `position:sticky;left:${offsets.left.get(column.key) ?? 0}px;${pinnedPlane}`\n : column.pinned === 'right'\n ? `position:sticky;right:${offsets.right.get(column.key) ?? 0}px;${pinnedPlane}`\n : '';\n return `${selector}{grid-column:${index + 1};${pin}}`;\n }).join('');\n};\n\nconst normalizeSelection = (value: unknown, mode: DataGridSelection): DataGridSelectionValue => {\n if (mode === 'multiple' && typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'query') {\n const query = value as Partial<Extract<DataGridSelectionValue, {mode: 'query'}>>;\n if (typeof query.token === 'string' && Number.isFinite(query.total)) return {\n mode: 'query',\n token: query.token,\n total: Math.max(0, Math.floor(query.total ?? 0)),\n except: [...new Set(Array.isArray(query.except) ? query.except.filter((key): key is string => typeof key === 'string') : [])],\n };\n }\n const ids = typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'ids'\n && Array.isArray((value as {ids?: unknown}).ids)\n ? (value as {ids: unknown[]}).ids.filter((key): key is string => typeof key === 'string')\n : [];\n const unique = [...new Set(ids)];\n return {mode: 'ids', ids: mode === 'single' ? unique.slice(0, 1) : mode === 'none' ? [] : unique};\n};\n\nconst isRowSelected = (selection: DataGridSelectionValue, key: string): boolean => (\n selection.mode === 'query' ? !selection.except.includes(key) : selection.ids.includes(key)\n);\n\nconst toggleSelection = (\n current: DataGridSelectionValue,\n key: string,\n mode: DataGridSelection,\n selected?: boolean,\n): SelectionChange => {\n const normalized = normalizeSelection(current, mode);\n if (mode === 'none') return {selection: normalized, added: [], removed: []};\n const wasSelected = isRowSelected(normalized, key);\n const nextSelected = selected ?? !wasSelected;\n if (wasSelected === nextSelected) return {selection: normalized, added: [], removed: []};\n if (normalized.mode === 'query') {\n const except = nextSelected\n ? normalized.except.filter((value) => value !== key)\n : [...normalized.except, key];\n return {selection: {...normalized, except}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n }\n const ids = mode === 'single' && nextSelected\n ? [key]\n : nextSelected\n ? [...normalized.ids, key]\n : normalized.ids.filter((value) => value !== key);\n return {selection: {mode: 'ids', ids}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n};\n\nconst reorderColumns = (columns: readonly DataGridColumn[], key: string, toIndex: number): DataGridColumn[] | null => {\n const from = columns.findIndex((column) => column.key === key);\n if (from < 0 || !columns[from]?.reorderable) return null;\n const region = columns[from]?.pinned ?? null;\n const regionIndexes = columns.flatMap((column, index) => column.pinned === region ? [index] : []);\n if (!regionIndexes.includes(toIndex)) return null;\n const next = [...columns];\n const [column] = next.splice(from, 1);\n if (!column) return null;\n next.splice(toIndex, 0, column);\n return next;\n};\n\nexport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n pinnedOffsets,\n reorderColumns,\n toggleSelection,\n};\nexport type {DataGridColumn, DataGridColumnDefaults, DataGridColumnSnapshot, DataGridPinnedOffsets, SelectionChange};\n","import type Alpine from 'alpinejs';\n\nimport {\n createResizable,\n createVirtualWindowController,\n defineAlpineData,\n defineProps,\n fixedAxisWindowAdapter,\n parseVirtualizerFragmentResponse,\n registerDomInvalidationOwner,\n reflectSchemaProp,\n replaceFragmentChildren,\n type FixedAxisWindow,\n type PropState,\n type ResizeEvent,\n type TrellisAlpineComponent,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from '@client/runtime';\nimport {cleanupManagerFor} from '@client/runtime/alpine-data';\nimport {CleanupManager} from '@client/runtime/cleanup-manager';\nimport {\n UiVirtualizer,\n type CursorVirtualizerOptions,\n type UiVirtualizerApi,\n type VirtualizerData,\n} from '../../runtime/virtualizer';\nimport {serverCursorOptions} from '../../runtime/cursor-data-source';\nimport {cloneSerializable, isSerializableEqual} from '../../utils';\nimport {dataGridSchema, type DataGridSelectionValue} from './contract';\nimport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n reorderColumns,\n toggleSelection,\n type DataGridColumn,\n type DataGridColumnSnapshot,\n} from './model';\n\n/** Options for resetting an indexed or cursor-backed Data Grid. @public */\ninterface DataGridResetOptions {\n /** Scroll offset restored after the first page loads. */\n scrollTop?: number;\n}\n\n/** Options for replacing an indexed Data Grid endpoint. @public */\ninterface DataGridSetUrlOptions {\n /** Whether to discard loaded rows and reload immediately. */\n reset?: boolean;\n}\n\n/** Public Alpine API for `ui.data-grid`. @public */\ninterface UiDataGridApi {\n /** Whether the active cursor data source supports server-side index seeking. */\n readonly supportsSeek: boolean;\n /** Discard loaded rows and request the current indexed range or first cursor page again. */\n reload(options?: DataGridResetOptions): void;\n /** Return the grid to its initial indexed range or first cursor page. */\n reset(options?: DataGridResetOptions): void;\n /** Scroll to a row and seek through the server when its cursor page is not loaded. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replace the indexed endpoint, optionally resetting loaded rows. */\n setUrl(url: string, options?: DataGridSetUrlOptions): void;\n /** Reflect the authoritative total-row attribute without requesting or replacing rows. */\n setTotalRows(count: number): void;\n /** Reflect the authoritative query attribute; meaningful cursor-query changes reset to the first page. */\n setQuery<Query>(query: Query): void;\n /** Activate cursor mode; a rendered query attribute takes precedence over the option query. */\n useCursor<Query, Content>(options: CursorVirtualizerOptions<Query, Content>): void;\n /** Resize a column to a pixel width. */\n resizeColumn(key: string, width: number): void;\n /** Move a column to a new zero-based position. */\n reorderColumn(key: string, toIndex: number): void;\n /** Add a row key to the explicit selection. */\n selectRow(key: string): void;\n /** Remove a row key from the explicit selection. */\n deselectRow(key: string): void;\n /** Toggle a row key in the current selection. */\n toggleRow(key: string): void;\n /** Replace the complete row selection value. */\n setSelection(value: DataGridSelectionValue): void;\n /** Select all rows represented by a server-owned query token. */\n selectQuery(token: string, total: number, except?: string[]): void;\n /** Clear explicit and query-backed row selection. */\n clearSelection(): void;\n}\n\ntype DataGridData = UiDataGridApi & {\n props: PropState<typeof dataGridSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {key: string; element: HTMLElement};\ntype CursorDelegate = TrellisAlpineComponent<VirtualizerData<unknown>> & UiVirtualizerApi<unknown>;\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst interactiveSelector = 'a,button,input,select,textarea,[contenteditable],[role=\"button\"],[role=\"link\"]';\n\nconst UiDataGrid = (AlpineInstance: Alpine.Alpine): TrellisAlpineComponent<DataGridData> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let table: HTMLElement | null = null;\n let body: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let styleElement: HTMLStyleElement | null = null;\n let columns: DataGridColumn[] = [];\n let blocks: BlockRecord[] = [];\n let totalRows = 0;\n let selection: DataGridSelectionValue = {mode: 'ids', ids: []};\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let scrollFrame = 0;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let suppressPropChange = false;\n let cursorDelegate: CursorDelegate | null = null;\n let cursorOptionQuery: unknown = null;\n let appliedCursorQuery: unknown = null;\n let previousColumnSnapshots: DataGridColumnSnapshot[] = [];\n let columnObserver: MutationObserver | null = null;\n let headerSizeObserver: ResizeObserver | null = null;\n let unregisterColumnInvalidation: (() => void) | null = null;\n let declarativeFlushQueued = false;\n let forceColumnRefresh = false;\n let cleanup: CleanupManager;\n let resizeCleanup: CleanupManager | null = null;\n const requestAborters = new Map<string, AbortController>();\n const appliedRowClasses = new WeakMap<HTMLElement, string[]>();\n const appliedCellClasses = new WeakMap<HTMLElement, string[]>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncOwnedClasses = (element: HTMLElement, value: string, owned: WeakMap<HTMLElement, string[]>): void => {\n const previous = owned.get(element) ?? [];\n if (previous.length) element.classList.remove(...previous);\n const names = [...new Set(value.split(/\\s+/).filter(Boolean))];\n if (names.length) element.classList.add(...names);\n owned.set(element, names);\n };\n const columnDefaults = () => ({\n width: component.props.defaultColumnWidth,\n minWidth: component.props.minColumnWidth,\n maxWidth: component.props.maxColumnWidth,\n resizable: component.props.resizableColumns,\n reorderable: component.props.reorderableColumns,\n });\n const declaredColumns = (): DataGridColumn[] => normalizeDataGridColumns(\n Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-column-header]') ?? []),\n columnDefaults(),\n );\n const syncSortableHeader = (column: DataGridColumn): void => {\n const label = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label]');\n const currentButton = column.element.querySelector<HTMLButtonElement>('[data-ui-data-grid-sort-button]');\n if (!label) return;\n if (column.sortable && !currentButton) {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('data-ui-data-grid-sort-button', '');\n button.className = column.element.dataset.sortButtonClass ?? '';\n const indicator = document.createElement('span');\n indicator.setAttribute('data-ui-data-grid-sort-indicator', '');\n indicator.setAttribute('aria-hidden', 'true');\n label.replaceWith(button);\n button.append(label, indicator);\n } else if (!column.sortable && currentButton) {\n currentButton.replaceWith(label);\n }\n };\n const rows = (): HTMLElement[] => Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-row]') ?? []);\n const syncBodyWidth = (headerRow: HTMLElement): void => {\n body?.style.setProperty('width', `${headerRow.getBoundingClientRect().width}px`);\n };\n const reflectMountedSelection = (): void => {\n rows().forEach((row) => {\n const key = row.dataset.rowKey ?? '';\n const selected = component.props.selection !== 'none' && key !== '' && isRowSelected(selection, key);\n row.toggleAttribute('data-selected', selected);\n if (component.props.selection === 'none') row.removeAttribute('aria-selected');\n else row.setAttribute('aria-selected', String(selected));\n });\n };\n const syncColumnGeometry = (): void => {\n if (!root || !styleElement) return;\n root.style.setProperty('--ui-data-grid-template', columnTemplate(columns));\n const scope = root.dataset.uiDataGridScope ?? '';\n styleElement.textContent = dataGridLayoutCss(scope, columns);\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) syncBodyWidth(headerRow);\n };\n const reconcileColumnStructure = (): void => {\n if (!root) return;\n const columnsByKey = new Map(columns.map((column, index) => [column.key, {column, index}]));\n table?.setAttribute('aria-colcount', String(columns.length));\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]');\n if (indicator) headerRow?.append(indicator);\n const mountedRows = rows();\n mountedRows.forEach((row) => {\n const cells = Array.from(row.children).filter((element): element is HTMLElement => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ));\n const cellsByKey = new Map(cells.flatMap((element) => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ? [[element.dataset.column ?? '', element] as const]\n : []\n )));\n columns.forEach(({key}) => {\n const cell = cellsByKey.get(key);\n if (!cell) return;\n cell.hidden = false;\n row.append(cell);\n });\n cells.forEach((cell) => {\n if (columnsByKey.has(cell.dataset.column ?? '')) return;\n cell.hidden = true;\n cell.removeAttribute('aria-colindex');\n cell.removeAttribute('data-pinned');\n row.append(cell);\n });\n });\n columns.forEach((column, index) => {\n syncSortableHeader(column);\n column.element.setAttribute('aria-colindex', String(index + 1));\n if (column.pinned) column.element.dataset.pinned = column.pinned;\n else column.element.removeAttribute('data-pinned');\n if (column.sortable) column.element.setAttribute('aria-sort', column.sort);\n else column.element.removeAttribute('aria-sort');\n column.element.dataset.disabled = String(!column.reorderable || !component.props.reorderableColumns);\n const ownedLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label-owned]');\n if (ownedLabel) ownedLabel.textContent = column.label;\n const previewLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-preview-label]');\n if (previewLabel) previewLabel.textContent = column.label;\n const sortIndicator = column.element.querySelector<HTMLElement>('[data-ui-data-grid-sort-indicator]');\n if (sortIndicator) {\n sortIndicator.textContent = column.sort === 'ascending' ? '↑' : column.sort === 'descending' ? '↓' : '';\n }\n column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]')\n ?.setAttribute('aria-label', `Resize ${column.label || column.key} column`);\n });\n mountedRows.forEach((row) => syncOwnedClasses(row, component.props.rowClass, appliedRowClasses));\n root.querySelectorAll<HTMLElement>('[data-ui-data-grid-cell]').forEach((cell) => {\n const entry = columnsByKey.get(cell.dataset.column ?? '');\n if (!entry) return;\n cell.setAttribute('aria-colindex', String(entry.index + 1));\n cell.dataset.align = entry.column.align;\n syncOwnedClasses(cell, `${component.props.cellClass} ${entry.column.cellClass}`, appliedCellClasses);\n if (entry.column.pinned) cell.dataset.pinned = entry.column.pinned;\n else cell.removeAttribute('data-pinned');\n });\n };\n const columnChangeDetail = (\n previous: readonly DataGridColumnSnapshot[],\n next: readonly DataGridColumnSnapshot[],\n ): Record<string, unknown> => {\n const previousByKey = new Map(previous.map((column) => [column.key, column]));\n const nextByKey = new Map(next.map((column) => [column.key, column]));\n const added = next.filter(({key}) => !previousByKey.has(key)).map(({key}) => key);\n const removed = previous.filter(({key}) => !nextByKey.has(key)).map(({key}) => key);\n const changed = next.flatMap((column) => {\n const before = previousByKey.get(column.key);\n if (!before) return [];\n const fields = Object.keys(column).filter((field) => (\n field !== 'key'\n && !isSerializableEqual(before[field as keyof DataGridColumnSnapshot], column[field as keyof DataGridColumnSnapshot])\n ));\n return fields.length ? [{key: column.key, fields}] : [];\n });\n return {previous, columns: next, added, removed, changed};\n };\n const flushDeclarativeState = (): void => {\n declarativeFlushQueued = false;\n if (!root || destroyed) return;\n\n const nextColumns = declaredColumns();\n const nextSnapshots = dataGridColumnSnapshots(nextColumns);\n const semanticColumnChange = !isSerializableEqual(previousColumnSnapshots, nextSnapshots);\n const elementChange = columns.length !== nextColumns.length\n || columns.some((column, index) => column.element !== nextColumns[index]?.element);\n const resizeBoundaryChange = elementChange || columns.some((column, index) => {\n const next = nextColumns[index];\n return !next\n || column.key !== next.key\n || column.resizable !== next.resizable\n || column.minWidth !== next.minWidth\n || column.maxWidth !== next.maxWidth;\n });\n if (semanticColumnChange || elementChange || forceColumnRefresh) {\n const previous = previousColumnSnapshots;\n columns = nextColumns;\n previousColumnSnapshots = nextSnapshots;\n const refreshResizeHandles = resizeBoundaryChange || forceColumnRefresh;\n forceColumnRefresh = false;\n reconcileColumnStructure();\n syncColumnGeometry();\n if (refreshResizeHandles) registerResizeHandles();\n if (semanticColumnChange) {\n dispatch('ui:data-grid-columns-change', columnChangeDetail(previous, nextSnapshots));\n }\n }\n\n if (component.props.totalRows !== totalRows) {\n updateTotal(component.props.totalRows);\n if (cursorDelegate) root.dataset.totalItems = String(totalRows);\n }\n\n if (cursorDelegate) {\n const nextQuery = root.hasAttribute('data-query') ? component.props.query : cursorOptionQuery;\n if (!isSerializableEqual(appliedCursorQuery, nextQuery)) {\n appliedCursorQuery = cloneSerializable(nextQuery);\n cursorDelegate.setQuery(nextQuery);\n }\n }\n };\n const scheduleDeclarativeState = (): void => {\n if (declarativeFlushQueued) return;\n declarativeFlushQueued = true;\n queueMicrotask(flushDeclarativeState);\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n if (!cursorDelegate) {\n root.toggleAttribute('data-loading', requestAborters.size > 0);\n root.toggleAttribute('data-empty', totalRows === 0);\n }\n root.dataset.selection = component.props.selection;\n table?.setAttribute('aria-rowcount', String(totalRows + 1));\n root.style.setProperty('--ui-data-grid-row-height', `${component.props.rowHeight}px`);\n root.style.setProperty('--ui-data-grid-total-height', `${Math.max(totalRows * component.props.rowHeight, component.props.rowHeight)}px`);\n if (!cursorDelegate || totalRows > 0) spacer.style.height = `var(--ui-data-grid-total-height)`;\n reflectMountedSelection();\n };\n const updateTotal = (next: number): void => {\n const normalized = integer(next);\n if (normalized === totalRows) return;\n totalRows = normalized;\n syncState();\n dispatch('ui:data-grid-total-change', {totalRows});\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {y: {\n total: totalRows,\n itemSize: component.props.rowHeight,\n viewportSize: component.props.bufferSize * component.props.rowHeight,\n scrollOffset: start * component.props.rowHeight,\n buffer: 0,\n }}});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalRows === 0) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalRows - 1, Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalRows - 1) / size) * size;\n const starts = [center - size, center, center + size].map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Data Grid requires a vertical virtual window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const settle = (blockKey: string, aborter: AbortController): void => {\n if (requestAborters.get(blockKey) !== aborter) return;\n requestAborters.delete(blockKey);\n syncState();\n if (requestAborters.size > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n requestAborters.set(block.key, aborter);\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:data-grid-load-start', {window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {method: 'GET', headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n }, signal: aborter.signal});\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace: () => controller.pending(block.key) === request && !destroyed,\n });\n if (!replaced) return;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n block.element.style.height = `${axis.count * component.props.rowHeight}px`;\n block.element.style.transform = `translateY(${axis.translateOffset}px)`;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {window, start: axis.start, count: axis.count, end: axis.start + axis.count});\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: 0, error});\n } finally {\n settle(block.key, aborter);\n }\n };\n const reconcile = (scrollTop: number): void => {\n if (cursorDelegate || component.props.cursor) return;\n if (requestAborters.size > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const logicalIndex = Math.min(Math.max(0, totalRows - 1), Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:data-grid-range', {start: axis.start, count: axis.count, end: axis.start + axis.count, window: center});\n }\n if (desired.length === 0) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n requestAborters.forEach((aborter) => aborter.abort());\n requestAborters.clear();\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n const setSelection = (value: DataGridSelectionValue, detail?: {added: string[]; removed: string[]}): void => {\n selection = normalizeSelection(value, component.props.selection);\n suppressPropChange = true;\n component.props.selectionValue = selection;\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'selectionValue', value: selection});\n suppressPropChange = false;\n reflectMountedSelection();\n dispatch('ui:data-grid-selection-change', {selection, added: detail?.added ?? [], removed: detail?.removed ?? []});\n };\n const changeRow = (key: string, selected?: boolean): void => {\n const change = toggleSelection(selection, String(key), component.props.selection, selected);\n if (change.added.length === 0 && change.removed.length === 0) return;\n setSelection(change.selection, change);\n };\n const updateColumnWidth = (column: DataGridColumn, width: number, phase: 'start' | 'resize' | 'end'): void => {\n column.width = Math.min(column.maxWidth ?? Number.POSITIVE_INFINITY, Math.max(column.minWidth, width));\n column.element.dataset.width = String(column.width);\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n syncColumnGeometry();\n dispatch('ui:data-grid-column-resize', {column: column.key, width: column.width, phase});\n };\n const registerResizeHandles = (): void => {\n resizeCleanup?.run();\n resizeCleanup = new CleanupManager();\n cleanup.addChild(resizeCleanup);\n columns.forEach((column) => {\n const handle = column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]');\n if (!handle) return;\n const enabled = column.resizable && component.props.resizableColumns;\n handle.hidden = !column.resizable;\n if (enabled) handle.removeAttribute('aria-disabled');\n else handle.setAttribute('aria-disabled', 'true');\n handle.tabIndex = enabled ? 0 : -1;\n if (!enabled) return;\n const onResize = (event: ResizeEvent): void => updateColumnWidth(column, event.previewWidth, event.phase);\n resizeCleanup?.add(createResizable({\n element: column.element,\n handle,\n axis: 'x',\n min: column.minWidth,\n max: column.maxWidth,\n mode: component.props.resizeMode,\n disabled: () => !component.props.resizableColumns || !column.resizable,\n onStart: onResize,\n onResize,\n onEnd: onResize,\n }));\n });\n };\n\n const component: TrellisAlpineComponent<DataGridData> = {\n get supportsSeek(): boolean { return cursorDelegate?.supportsSeek ?? false; },\n props: null as unknown as PropState<typeof dataGridSchema>,\n init(): void {\n cleanup = cleanupManagerFor(this);\n root = this.$el;\n destroyed = false;\n const scope = globalThis.crypto?.randomUUID?.() ?? `grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n root.dataset.uiDataGridScope = scope;\n root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.setAttribute('data-sortable-scope', scope);\n this.props = defineProps({el: root, schema: dataGridSchema, onChange: (_state, changes) => {\n if (suppressPropChange) return;\n const keys = changes.map(({key}) => key);\n if (keys.includes('selectionValue') || keys.includes('selection')) {\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n reflectMountedSelection();\n }\n if (keys.some((key) => [\n 'resizableColumns', 'reorderableColumns', 'minColumnWidth', 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) forceColumnRefresh = true;\n if (keys.some((key) => [\n 'query', 'totalRows', 'resizableColumns', 'reorderableColumns', 'minColumnWidth',\n 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) scheduleDeclarativeState();\n if (keys.some((key) => ['fetchUrl', 'rowHeight', 'bufferSize'].includes(key))) this.reload();\n }});\n totalRows = integer(this.props.totalRows);\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n viewport = root.querySelector<HTMLElement>('[data-ui-data-grid-viewport]')\n ?? root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]');\n table = root.querySelector<HTMLElement>('[data-ui-data-grid-inner]');\n body = root.querySelector<HTMLElement>('[data-ui-data-grid-body]');\n spacer = root.querySelector<HTMLElement>('[data-ui-data-grid-spacer]');\n styleElement = root.querySelector<HTMLStyleElement>('style[data-ui-data-grid-layout]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-data-grid-block]')).slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!viewport || !table || !body || !spacer || !styleElement || blocks.length !== 3) {\n throw new Error('Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.');\n }\n viewport.setAttribute('data-ui-data-grid-viewport', '');\n columns = declaredColumns();\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n reconcileColumnStructure();\n syncColumnGeometry();\n registerResizeHandles();\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) {\n if (typeof ResizeObserver !== 'undefined') {\n headerSizeObserver = new ResizeObserver(() => syncBodyWidth(headerRow));\n headerSizeObserver.observe(headerRow);\n }\n columnObserver = new MutationObserver(scheduleDeclarativeState);\n columnObserver.observe(headerRow, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n 'data-column', 'data-label', 'data-width', 'data-min-width', 'data-max-width', 'data-hidden',\n 'data-pinned', 'data-sortable', 'data-sort', 'data-resizable', 'data-reorderable', 'data-align',\n 'data-cell-class', 'hidden',\n ],\n });\n }\n unregisterColumnInvalidation = registerDomInvalidationOwner(root, {invalidateDom: scheduleDeclarativeState});\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => {\n if (scrollFrame) return;\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = 0;\n if (viewport) reconcile(viewport.scrollTop);\n });\n }, {passive: true, signal: listenerAborter.signal});\n root.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const sortButton = target.closest<HTMLElement>('[data-ui-data-grid-sort-button]');\n if (sortButton && this.props.sortableColumns) {\n const header = sortButton.closest<HTMLElement>('[data-ui-data-grid-column-header]');\n const column = columns.find(({key}) => key === header?.dataset.column);\n if (column?.sortable) {\n const direction = column.sort === 'ascending' ? 'descending' : 'ascending';\n dispatch('ui:data-grid-sort', {column: column.key, direction, additive: event.shiftKey});\n }\n return;\n }\n const row = target.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (!row || !root?.contains(row)) return;\n const key = row.dataset.rowKey ?? '';\n if (this.props.selectOnRowClick && !target.closest(interactiveSelector)) changeRow(key);\n dispatch('ui:data-grid-row-activate', {rowKey: key, row});\n }, {signal: listenerAborter.signal});\n root.addEventListener('dblclick', (event) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>('[data-ui-data-grid-cell]');\n const row = cell?.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (cell && row) dispatch('ui:data-grid-cell-activate', {\n rowKey: row.dataset.rowKey ?? '', column: cell.dataset.column ?? '', cell,\n });\n }, {signal: listenerAborter.signal});\n root.addEventListener('ui:sortable-drop', ((event: CustomEvent) => {\n const source = event.detail?.source;\n if (source?.type !== 'data-grid-column') return;\n const to = Number(event.detail?.index ?? event.detail?.anchor?.index);\n if (Number.isInteger(to)) this.reorderColumn(String(source.id), to);\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-total-change', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n updateTotal(Number(event.detail?.totalItems ?? 0));\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load-start', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-load-start', {mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-error', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-error', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: this.props.rowHeight, viewportSize: viewport.clientHeight,\n scrollOffset: 0, buffer: this.props.bufferSize,\n }, {axis: 'y', index: this.props.initialIndex});\n syncState();\n if (this.props.cursor) this.useCursor(serverCursorOptions(() => {\n if (!root) throw new Error('Data Grid is not mounted.');\n return root;\n }));\n else reconcile(viewport.scrollTop);\n },\n destroy(): void {\n destroyed = true;\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n listenerAborter?.abort();\n listenerAborter = null;\n columnObserver?.disconnect();\n columnObserver = null;\n headerSizeObserver?.disconnect();\n headerSizeObserver = null;\n unregisterColumnInvalidation?.();\n unregisterColumnInvalidation = null;\n resizeCleanup = null;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n table = null;\n body = null;\n spacer = null;\n styleElement = null;\n columns = [];\n previousColumnSnapshots = [];\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (cursorDelegate) {\n cursorDelegate.scrollToIndex(index, align);\n return;\n }\n if (!viewport) return;\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: this.props.rowHeight, viewportSize: viewport.clientHeight,\n scrollOffset: viewport.scrollTop, buffer: this.props.bufferSize,\n }, {axis: 'y', index, align});\n reconcile(viewport.scrollTop);\n },\n setTotalRows(count): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'totalRows', value: integer(count)});\n },\n setQuery(query): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'query', value: query});\n },\n useCursor(options): void {\n if (!root || !viewport || !spacer) return;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n root.dataset.totalItems = String(totalRows);\n root.dataset.itemSize = String(this.props.rowHeight);\n spacer.setAttribute('data-ui-virtualizer-spacer', '');\n blocks.forEach(({element}) => element.setAttribute('data-ui-virtualizer-block', ''));\n cursorOptionQuery = options.query;\n const initialQuery = root.hasAttribute('data-query') ? this.props.query : cursorOptionQuery;\n appliedCursorQuery = cloneSerializable(initialQuery);\n const delegate = UiVirtualizer<unknown, unknown>(AlpineInstance, {\n cursor: {...options, query: initialQuery} as unknown as CursorVirtualizerOptions<unknown, unknown>,\n }) as CursorDelegate;\n cursorDelegate = delegate;\n Object.assign(delegate, {$el: root});\n delegate.init();\n },\n setUrl(url, options = {}): void {\n suppressPropChange = true;\n this.props.fetchUrl = String(url);\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'fetchUrl', value: String(url)});\n suppressPropChange = false;\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n reset(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reset({scrollTop: options.scrollTop ?? 0});\n return;\n }\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reload(options);\n return;\n }\n const scrollTop = options.scrollTop ?? viewport?.scrollTop ?? 0;\n invalidate();\n if (viewport) viewport.scrollTop = Math.max(0, scrollTop);\n reconcile(scrollTop);\n },\n resizeColumn(key, width): void {\n const column = columns.find((candidate) => candidate.key === key);\n if (column) updateColumnWidth(column, Number(width), 'end');\n },\n reorderColumn(key, toIndex): void {\n const from = columns.findIndex((column) => column.key === key);\n const next = reorderColumns(columns, key, integer(toIndex));\n if (!next) return;\n columns = next;\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n const headerRow = root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]') ?? null;\n columns.forEach((column) => headerRow?.insertBefore(column.element, indicator));\n reconcileColumnStructure();\n syncColumnGeometry();\n dispatch('ui:data-grid-column-reorder', {column: key, from, to: integer(toIndex), columns: columns.map(({key: columnKey}) => columnKey)});\n },\n selectRow(key): void { changeRow(String(key), true); },\n deselectRow(key): void { changeRow(String(key), false); },\n toggleRow(key): void { changeRow(String(key)); },\n setSelection(value): void { setSelection(value); },\n selectQuery(token, total, except = []): void {\n setSelection({mode: 'query', token: String(token), total: integer(total), except: except.map(String)});\n },\n clearSelection(): void { setSelection({mode: 'ids', ids: []}); },\n };\n return component;\n};\n\nconst registerDataGrid = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiDataGrid', () => UiDataGrid(AlpineInstance))(AlpineInstance);\n};\n\nexport {registerDataGrid, UiDataGrid};\nexport type {DataGridData, DataGridResetOptions, DataGridSetUrlOptions, UiDataGridApi};\n","// Generated by scripts/generate_component_entries.mjs from packages/client/component-entries.json.\n// Do not edit by hand.\nimport type {Alpine as AlpineType} from 'alpinejs';\nimport {registerResizableCapability} from '../../capabilities/resizable';\nimport {registerMotionCapability} from '../../capabilities/motion';\nimport {registerSortableCapability} from '../../capabilities/sortable';\nimport {registerDataGrid as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerDataGrid = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerResizableCapability(AlpineInstance);\n registerMotionCapability(AlpineInstance);\n registerSortableCapability(AlpineInstance);\n registerComponent(AlpineInstance);\n};\n\nexport {registerDataGrid};\nexport default registerDataGrid;\nexport * from './index';\n"],"mappings":"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"}
1
+ {"version":3,"file":"entry.generated-COp9wMCd.js","names":[],"sources":["../../../../../../../../client/src/components/data-grid/contract.ts","../../../../../../../../client/src/components/data-grid/model.ts","../../../../../../../../client/src/components/data-grid/index.ts","../../../../../../../../client/src/components/data-grid/entry.generated.ts"],"sourcesContent":["import {bool, json, number, oneOf, string, type SchemaToProps} from '../../runtime';\nimport {INTERACTION_TREATMENTS, SELECTION_COLORS} from '../common';\n\nconst DATA_GRID_SELECTIONS = ['none', 'single', 'multiple'] as const;\nconst DATA_GRID_DENSITIES = ['compact', 'default', 'comfortable'] as const;\nconst DATA_GRID_BORDERS = ['none', 'row', 'grid'] as const;\nconst DATA_GRID_RESIZE_MODES = ['onChange', 'onEnd'] as const;\nconst DATA_GRID_PINS = ['', 'left', 'right'] as const;\nconst DATA_GRID_SORTS = ['none', 'ascending', 'descending', 'other'] as const;\nconst DATA_GRID_ALIGNS = ['start', 'center', 'end'] as const;\n\ntype DataGridSelectionValue =\n | {mode: 'ids'; ids: string[]}\n | {mode: 'query'; token: string; total: number; except: string[]};\n\nconst dataGridSchema = {\n fetchUrl: string,\n cursor: bool,\n query: json<unknown>(null),\n totalRows: number.min(0).default(0),\n rowHeight: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n selection: oneOf(DATA_GRID_SELECTIONS, 'none'),\n selectionValue: json<DataGridSelectionValue>({mode: 'ids', ids: []}),\n selectOnRowClick: bool,\n rowKey: string.default('id'),\n stickyHeader: bool.default(true),\n resizableColumns: bool.default(true),\n reorderableColumns: bool.default(true),\n sortableColumns: bool.default(true),\n minColumnWidth: number.min(0).default(60),\n defaultColumnWidth: number.min(Number.EPSILON).default(180),\n maxColumnWidth: json<number | null>(null),\n resizeMode: oneOf(DATA_GRID_RESIZE_MODES, 'onChange'),\n color: oneOf(SELECTION_COLORS, 'neutral'),\n interaction: oneOf(INTERACTION_TREATMENTS, 'edge'),\n dragPreviewPosition: string.trim.default('preserve'),\n density: oneOf(DATA_GRID_DENSITIES, 'default'),\n border: oneOf(DATA_GRID_BORDERS, 'row'),\n empty: string.default('No rows found.'),\n class: string,\n controlsClass: string,\n viewportClass: string,\n headerClass: string,\n rowClass: string,\n cellClass: string,\n footerClass: string,\n emptyClass: string,\n};\n\nconst dataGridColumnSchema = {\n key: string,\n label: string,\n width: number.min(Number.EPSILON).default(180),\n minWidth: number.min(0).default(60),\n maxWidth: json<number | null>(null),\n hidden: bool,\n pinned: oneOf(DATA_GRID_PINS, ''),\n sortable: bool,\n sort: oneOf(DATA_GRID_SORTS, 'none'),\n resizable: bool.default(true),\n reorderable: bool.default(true),\n align: oneOf(DATA_GRID_ALIGNS, 'start'),\n class: string,\n headerClass: string,\n labelClass: string,\n resizeHandleClass: string,\n};\n\nconst dataGridRowsSchema = {\n rows: json<unknown[]>([]),\n columns: json<Array<Record<string, unknown>>>([]),\n startIndex: number.min(0).default(0),\n rowKey: string.default('id'),\n rowComponent: string.default('ui.data-grid.row'),\n cellComponent: string.default('ui.data-grid.cell'),\n class: string,\n};\nconst dataGridRowSchema = {key: string, index: number.min(0).default(0), class: string};\nconst dataGridCellSchema = {column: string, index: number.min(1).default(1), align: oneOf(DATA_GRID_ALIGNS, 'start'), class: string};\nconst dataGridEmptySchema = {class: string};\n\ntype DataGridProps = SchemaToProps<typeof dataGridSchema>;\ntype DataGridColumnProps = SchemaToProps<typeof dataGridColumnSchema>;\ntype DataGridRowsProps = SchemaToProps<typeof dataGridRowsSchema>;\ntype DataGridSelection = typeof DATA_GRID_SELECTIONS[number];\ntype DataGridPin = Exclude<typeof DATA_GRID_PINS[number], ''> | null;\ntype DataGridSort = typeof DATA_GRID_SORTS[number];\ntype DataGridAlign = typeof DATA_GRID_ALIGNS[number];\n\nexport {\n DATA_GRID_ALIGNS,\n DATA_GRID_BORDERS,\n DATA_GRID_DENSITIES,\n DATA_GRID_PINS,\n DATA_GRID_RESIZE_MODES,\n DATA_GRID_SELECTIONS,\n DATA_GRID_SORTS,\n dataGridCellSchema,\n dataGridColumnSchema,\n dataGridEmptySchema,\n dataGridRowSchema,\n dataGridRowsSchema,\n dataGridSchema,\n};\nexport type {\n DataGridAlign,\n DataGridColumnProps,\n DataGridPin,\n DataGridProps,\n DataGridRowsProps,\n DataGridSelection,\n DataGridSelectionValue,\n DataGridSort,\n};\n","import type {DataGridAlign, DataGridPin, DataGridSelection, DataGridSelectionValue, DataGridSort} from './contract';\n\ntype DataGridColumn = {\n key: string;\n label: string;\n width: number;\n minWidth: number;\n maxWidth: number | null;\n hidden: boolean;\n pinned: DataGridPin;\n sortable: boolean;\n sort: DataGridSort;\n resizable: boolean;\n reorderable: boolean;\n align: DataGridAlign;\n cellClass: string;\n element: HTMLElement;\n};\n\ntype DataGridColumnDefaults = {\n width: number;\n minWidth: number;\n maxWidth: number | null;\n resizable: boolean;\n reorderable: boolean;\n};\n\ntype DataGridColumnSnapshot = Omit<DataGridColumn, 'element'>;\n\ntype DataGridPinnedOffsets = {left: Map<string, number>; right: Map<string, number>};\ntype SelectionChange = {selection: DataGridSelectionValue; added: string[]; removed: string[]};\n\nconst numberAttribute = (element: HTMLElement, name: string, fallback: number): number => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst optionalNumberAttribute = (element: HTMLElement, name: string, fallback: number | null): number | null => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? value : null;\n};\n\nconst boolAttribute = (element: HTMLElement, name: string, fallback: boolean): boolean => {\n if (!element.hasAttribute(name)) return fallback;\n const raw = element.getAttribute(name) ?? '';\n return raw === '' || ['true', '1', 'yes', 'on'].includes(raw.toLowerCase());\n};\n\nconst normalizeDataGridColumns = (\n elements: readonly HTMLElement[],\n defaults: DataGridColumnDefaults,\n): DataGridColumn[] => {\n const seen = new Set<string>();\n return elements.flatMap((element) => {\n const key = (element.dataset.column ?? '').trim();\n if (!key) throw new Error('Data Grid columns require a non-empty key.');\n if (element.hasAttribute('data-hidden')) return [];\n if (seen.has(key)) throw new Error(`Data Grid column key \"${key}\" is duplicated.`);\n seen.add(key);\n const minWidth = Math.max(0, numberAttribute(element, 'data-min-width', defaults.minWidth));\n const maxWidth = optionalNumberAttribute(element, 'data-max-width', defaults.maxWidth);\n const unclamped = numberAttribute(element, 'data-width', defaults.width);\n const width = Math.min(maxWidth ?? Number.POSITIVE_INFINITY, Math.max(minWidth, unclamped));\n const pinned = element.dataset.pinned === 'left' || element.dataset.pinned === 'right'\n ? element.dataset.pinned\n : null;\n const sort = ['ascending', 'descending', 'other'].includes(element.dataset.sort ?? '')\n ? element.dataset.sort as DataGridSort\n : 'none';\n const align = ['center', 'end'].includes(element.dataset.align ?? '')\n ? element.dataset.align as DataGridAlign\n : 'start';\n return [{\n key,\n label: element.dataset.label ?? element.textContent?.trim() ?? key,\n width,\n minWidth,\n maxWidth,\n hidden: false,\n pinned,\n sortable: boolAttribute(element, 'data-sortable', false),\n sort,\n resizable: boolAttribute(element, 'data-resizable', defaults.resizable),\n reorderable: boolAttribute(element, 'data-reorderable', defaults.reorderable),\n align,\n cellClass: element.dataset.cellClass ?? '',\n element,\n }];\n });\n};\n\nconst columnTemplate = (columns: readonly DataGridColumn[]): string => (\n columns.map(({width}) => `${width}px`).join(' ')\n);\n\nconst dataGridColumnSnapshots = (columns: readonly DataGridColumn[]): DataGridColumnSnapshot[] => (\n columns.map(({element: _element, ...column}) => column)\n);\n\nconst pinnedOffsets = (columns: readonly DataGridColumn[]): DataGridPinnedOffsets => {\n const left = new Map<string, number>();\n const right = new Map<string, number>();\n let offset = 0;\n columns.forEach((column) => {\n if (column.pinned !== 'left') return;\n left.set(column.key, offset);\n offset += column.width;\n });\n offset = 0;\n [...columns].reverse().forEach((column) => {\n if (column.pinned !== 'right') return;\n right.set(column.key, offset);\n offset += column.width;\n });\n return {left, right};\n};\n\nconst cssEscape = (value: string): string => (\n globalThis.CSS?.escape ? globalThis.CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`)\n);\n\nconst dataGridLayoutCss = (scope: string, columns: readonly DataGridColumn[]): string => {\n const offsets = pinnedOffsets(columns);\n const pinnedPlane = 'z-index:2;background-color:var(--ui-surface-color);';\n return columns.map((column, index) => {\n const owner = `[data-ui-data-grid-scope=\"${cssEscape(scope)}\"]`;\n const columnSelector = `[data-column=\"${cssEscape(column.key)}\"]`;\n const selector = `${owner} [data-ui-data-grid-column-header]${columnSelector},${owner} [data-ui-data-grid-cell]${columnSelector}`;\n const pin = column.pinned === 'left'\n ? `position:sticky;left:${offsets.left.get(column.key) ?? 0}px;${pinnedPlane}`\n : column.pinned === 'right'\n ? `position:sticky;right:${offsets.right.get(column.key) ?? 0}px;${pinnedPlane}`\n : '';\n return `${selector}{grid-column:${index + 1};${pin}}`;\n }).join('');\n};\n\nconst normalizeSelection = (value: unknown, mode: DataGridSelection): DataGridSelectionValue => {\n if (mode === 'multiple' && typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'query') {\n const query = value as Partial<Extract<DataGridSelectionValue, {mode: 'query'}>>;\n if (typeof query.token === 'string' && Number.isFinite(query.total)) return {\n mode: 'query',\n token: query.token,\n total: Math.max(0, Math.floor(query.total ?? 0)),\n except: [...new Set(Array.isArray(query.except) ? query.except.filter((key): key is string => typeof key === 'string') : [])],\n };\n }\n const ids = typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'ids'\n && Array.isArray((value as {ids?: unknown}).ids)\n ? (value as {ids: unknown[]}).ids.filter((key): key is string => typeof key === 'string')\n : [];\n const unique = [...new Set(ids)];\n return {mode: 'ids', ids: mode === 'single' ? unique.slice(0, 1) : mode === 'none' ? [] : unique};\n};\n\nconst isRowSelected = (selection: DataGridSelectionValue, key: string): boolean => (\n selection.mode === 'query' ? !selection.except.includes(key) : selection.ids.includes(key)\n);\n\nconst toggleSelection = (\n current: DataGridSelectionValue,\n key: string,\n mode: DataGridSelection,\n selected?: boolean,\n): SelectionChange => {\n const normalized = normalizeSelection(current, mode);\n if (mode === 'none') return {selection: normalized, added: [], removed: []};\n const wasSelected = isRowSelected(normalized, key);\n const nextSelected = selected ?? !wasSelected;\n if (wasSelected === nextSelected) return {selection: normalized, added: [], removed: []};\n if (normalized.mode === 'query') {\n const except = nextSelected\n ? normalized.except.filter((value) => value !== key)\n : [...normalized.except, key];\n return {selection: {...normalized, except}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n }\n const ids = mode === 'single' && nextSelected\n ? [key]\n : nextSelected\n ? [...normalized.ids, key]\n : normalized.ids.filter((value) => value !== key);\n return {selection: {mode: 'ids', ids}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n};\n\nconst reorderColumns = (columns: readonly DataGridColumn[], key: string, toIndex: number): DataGridColumn[] | null => {\n const from = columns.findIndex((column) => column.key === key);\n if (from < 0 || !columns[from]?.reorderable) return null;\n const region = columns[from]?.pinned ?? null;\n const regionIndexes = columns.flatMap((column, index) => column.pinned === region ? [index] : []);\n if (!regionIndexes.includes(toIndex)) return null;\n const next = [...columns];\n const [column] = next.splice(from, 1);\n if (!column) return null;\n next.splice(toIndex, 0, column);\n return next;\n};\n\nexport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n pinnedOffsets,\n reorderColumns,\n toggleSelection,\n};\nexport type {DataGridColumn, DataGridColumnDefaults, DataGridColumnSnapshot, DataGridPinnedOffsets, SelectionChange};\n","import type Alpine from 'alpinejs';\n\nimport {\n createResizable,\n createVirtualWindowController,\n defineAlpineData,\n defineProps,\n fixedAxisWindowAdapter,\n parseVirtualizerFragmentResponse,\n registerDomInvalidationOwner,\n reflectSchemaProp,\n replaceFragmentChildren,\n type FixedAxisWindow,\n type PropState,\n type ResizeEvent,\n type TrellisAlpineComponent,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from '@client/runtime';\nimport {cleanupManagerFor} from '@client/runtime/alpine-data';\nimport {CleanupManager} from '@client/runtime/cleanup-manager';\nimport {\n UiVirtualizer,\n type CursorVirtualizerOptions,\n type UiVirtualizerApi,\n type VirtualizerData,\n} from '../../runtime/virtualizer';\nimport {serverCursorOptions} from '../../runtime/cursor-data-source';\nimport {cloneSerializable, isSerializableEqual} from '../../utils';\nimport {dataGridSchema, type DataGridSelectionValue} from './contract';\nimport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n reorderColumns,\n toggleSelection,\n type DataGridColumn,\n type DataGridColumnSnapshot,\n} from './model';\n\n/** Options for resetting an indexed or cursor-backed Data Grid. @public */\ninterface DataGridResetOptions {\n /** Scroll offset restored after the first page loads. */\n scrollTop?: number;\n}\n\n/** Options for replacing an indexed Data Grid endpoint. @public */\ninterface DataGridSetUrlOptions {\n /** Whether to discard loaded rows and reload immediately. */\n reset?: boolean;\n}\n\n/** Public Alpine API for `ui.data-grid`. @public */\ninterface UiDataGridApi {\n /** Whether the active cursor data source supports server-side index seeking. */\n readonly supportsSeek: boolean;\n /** Discard loaded rows and request the current indexed range or first cursor page again. */\n reload(options?: DataGridResetOptions): void;\n /** Return the grid to its initial indexed range or first cursor page. */\n reset(options?: DataGridResetOptions): void;\n /** Scroll to a row and seek through the server when its cursor page is not loaded. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replace the indexed endpoint, optionally resetting loaded rows. */\n setUrl(url: string, options?: DataGridSetUrlOptions): void;\n /** Reflect the authoritative total-row attribute without requesting or replacing rows. */\n setTotalRows(count: number): void;\n /** Reflect the authoritative query attribute; meaningful cursor-query changes reset to the first page. */\n setQuery<Query>(query: Query): void;\n /** Activate cursor mode; a rendered query attribute takes precedence over the option query. */\n useCursor<Query, Content>(options: CursorVirtualizerOptions<Query, Content>): void;\n /** Resize a column to a pixel width. */\n resizeColumn(key: string, width: number): void;\n /** Move a column to a new zero-based position. */\n reorderColumn(key: string, toIndex: number): void;\n /** Add a row key to the explicit selection. */\n selectRow(key: string): void;\n /** Remove a row key from the explicit selection. */\n deselectRow(key: string): void;\n /** Toggle a row key in the current selection. */\n toggleRow(key: string): void;\n /** Replace the complete row selection value. */\n setSelection(value: DataGridSelectionValue): void;\n /** Select all rows represented by a server-owned query token. */\n selectQuery(token: string, total: number, except?: string[]): void;\n /** Clear explicit and query-backed row selection. */\n clearSelection(): void;\n}\n\ntype DataGridData = UiDataGridApi & {\n props: PropState<typeof dataGridSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {key: string; element: HTMLElement};\ntype CursorDelegate = TrellisAlpineComponent<VirtualizerData<unknown>> & UiVirtualizerApi<unknown>;\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst interactiveSelector = 'a,button,input,select,textarea,[contenteditable],[role=\"button\"],[role=\"link\"]';\n\nconst UiDataGrid = (AlpineInstance: Alpine.Alpine): TrellisAlpineComponent<DataGridData> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let table: HTMLElement | null = null;\n let body: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let styleElement: HTMLStyleElement | null = null;\n let columns: DataGridColumn[] = [];\n let blocks: BlockRecord[] = [];\n let totalRows = 0;\n let selection: DataGridSelectionValue = {mode: 'ids', ids: []};\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let scrollFrame = 0;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let suppressPropChange = false;\n let cursorDelegate: CursorDelegate | null = null;\n let cursorOptionQuery: unknown = null;\n let appliedCursorQuery: unknown = null;\n let previousColumnSnapshots: DataGridColumnSnapshot[] = [];\n let columnObserver: MutationObserver | null = null;\n let headerSizeObserver: ResizeObserver | null = null;\n let unregisterColumnInvalidation: (() => void) | null = null;\n let declarativeFlushQueued = false;\n let forceColumnRefresh = false;\n let cleanup: CleanupManager;\n let resizeCleanup: CleanupManager | null = null;\n const requestAborters = new Map<string, AbortController>();\n const appliedRowClasses = new WeakMap<HTMLElement, string[]>();\n const appliedCellClasses = new WeakMap<HTMLElement, string[]>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncOwnedClasses = (element: HTMLElement, value: string, owned: WeakMap<HTMLElement, string[]>): void => {\n const previous = owned.get(element) ?? [];\n if (previous.length) element.classList.remove(...previous);\n const names = [...new Set(value.split(/\\s+/).filter(Boolean))];\n if (names.length) element.classList.add(...names);\n owned.set(element, names);\n };\n const columnDefaults = () => ({\n width: component.props.defaultColumnWidth,\n minWidth: component.props.minColumnWidth,\n maxWidth: component.props.maxColumnWidth,\n resizable: component.props.resizableColumns,\n reorderable: component.props.reorderableColumns,\n });\n const declaredColumns = (): DataGridColumn[] => normalizeDataGridColumns(\n Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-column-header]') ?? []),\n columnDefaults(),\n );\n const syncSortableHeader = (column: DataGridColumn): void => {\n const label = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label]');\n const currentButton = column.element.querySelector<HTMLButtonElement>('[data-ui-data-grid-sort-button]');\n if (!label) return;\n if (column.sortable && !currentButton) {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('data-ui-data-grid-sort-button', '');\n button.className = column.element.dataset.sortButtonClass ?? '';\n const indicator = document.createElement('span');\n indicator.setAttribute('data-ui-data-grid-sort-indicator', '');\n indicator.setAttribute('aria-hidden', 'true');\n label.replaceWith(button);\n button.append(label, indicator);\n } else if (!column.sortable && currentButton) {\n currentButton.replaceWith(label);\n }\n };\n const rows = (): HTMLElement[] => Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-row]') ?? []);\n const syncBodyWidth = (headerRow: HTMLElement): void => {\n body?.style.setProperty('width', `${headerRow.getBoundingClientRect().width}px`);\n };\n const reflectMountedSelection = (): void => {\n rows().forEach((row) => {\n const key = row.dataset.rowKey ?? '';\n const selected = component.props.selection !== 'none' && key !== '' && isRowSelected(selection, key);\n row.toggleAttribute('data-selected', selected);\n if (component.props.selection === 'none') row.removeAttribute('aria-selected');\n else row.setAttribute('aria-selected', String(selected));\n });\n };\n const syncColumnGeometry = (): void => {\n if (!root || !styleElement) return;\n root.style.setProperty('--ui-data-grid-template', columnTemplate(columns));\n const scope = root.dataset.uiDataGridScope ?? '';\n styleElement.textContent = dataGridLayoutCss(scope, columns);\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) syncBodyWidth(headerRow);\n };\n const reconcileColumnStructure = (): void => {\n if (!root) return;\n const columnsByKey = new Map(columns.map((column, index) => [column.key, {column, index}]));\n table?.setAttribute('aria-colcount', String(columns.length));\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]');\n if (indicator) headerRow?.append(indicator);\n const mountedRows = rows();\n mountedRows.forEach((row) => {\n const cells = Array.from(row.children).filter((element): element is HTMLElement => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ));\n const cellsByKey = new Map(cells.flatMap((element) => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ? [[element.dataset.column ?? '', element] as const]\n : []\n )));\n columns.forEach(({key}) => {\n const cell = cellsByKey.get(key);\n if (!cell) return;\n cell.hidden = false;\n row.append(cell);\n });\n cells.forEach((cell) => {\n if (columnsByKey.has(cell.dataset.column ?? '')) return;\n cell.hidden = true;\n cell.removeAttribute('aria-colindex');\n cell.removeAttribute('data-pinned');\n row.append(cell);\n });\n });\n columns.forEach((column, index) => {\n syncSortableHeader(column);\n column.element.setAttribute('aria-colindex', String(index + 1));\n if (column.pinned) column.element.dataset.pinned = column.pinned;\n else column.element.removeAttribute('data-pinned');\n if (column.sortable) column.element.setAttribute('aria-sort', column.sort);\n else column.element.removeAttribute('aria-sort');\n column.element.dataset.disabled = String(!column.reorderable || !component.props.reorderableColumns);\n const ownedLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label-owned]');\n if (ownedLabel) ownedLabel.textContent = column.label;\n const previewLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-preview-label]');\n if (previewLabel) previewLabel.textContent = column.label;\n const sortIndicator = column.element.querySelector<HTMLElement>('[data-ui-data-grid-sort-indicator]');\n if (sortIndicator) {\n sortIndicator.textContent = column.sort === 'ascending' ? '↑' : column.sort === 'descending' ? '↓' : '';\n }\n column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]')\n ?.setAttribute('aria-label', `Resize ${column.label || column.key} column`);\n });\n mountedRows.forEach((row) => syncOwnedClasses(row, component.props.rowClass, appliedRowClasses));\n root.querySelectorAll<HTMLElement>('[data-ui-data-grid-cell]').forEach((cell) => {\n const entry = columnsByKey.get(cell.dataset.column ?? '');\n if (!entry) return;\n cell.setAttribute('aria-colindex', String(entry.index + 1));\n cell.dataset.align = entry.column.align;\n syncOwnedClasses(cell, `${component.props.cellClass} ${entry.column.cellClass}`, appliedCellClasses);\n if (entry.column.pinned) cell.dataset.pinned = entry.column.pinned;\n else cell.removeAttribute('data-pinned');\n });\n };\n const columnChangeDetail = (\n previous: readonly DataGridColumnSnapshot[],\n next: readonly DataGridColumnSnapshot[],\n ): Record<string, unknown> => {\n const previousByKey = new Map(previous.map((column) => [column.key, column]));\n const nextByKey = new Map(next.map((column) => [column.key, column]));\n const added = next.filter(({key}) => !previousByKey.has(key)).map(({key}) => key);\n const removed = previous.filter(({key}) => !nextByKey.has(key)).map(({key}) => key);\n const changed = next.flatMap((column) => {\n const before = previousByKey.get(column.key);\n if (!before) return [];\n const fields = Object.keys(column).filter((field) => (\n field !== 'key'\n && !isSerializableEqual(before[field as keyof DataGridColumnSnapshot], column[field as keyof DataGridColumnSnapshot])\n ));\n return fields.length ? [{key: column.key, fields}] : [];\n });\n return {previous, columns: next, added, removed, changed};\n };\n const flushDeclarativeState = (): void => {\n declarativeFlushQueued = false;\n if (!root || destroyed) return;\n\n const nextColumns = declaredColumns();\n const nextSnapshots = dataGridColumnSnapshots(nextColumns);\n const semanticColumnChange = !isSerializableEqual(previousColumnSnapshots, nextSnapshots);\n const elementChange = columns.length !== nextColumns.length\n || columns.some((column, index) => column.element !== nextColumns[index]?.element);\n const resizeBoundaryChange = elementChange || columns.some((column, index) => {\n const next = nextColumns[index];\n return !next\n || column.key !== next.key\n || column.resizable !== next.resizable\n || column.minWidth !== next.minWidth\n || column.maxWidth !== next.maxWidth;\n });\n if (semanticColumnChange || elementChange || forceColumnRefresh) {\n const previous = previousColumnSnapshots;\n columns = nextColumns;\n previousColumnSnapshots = nextSnapshots;\n const refreshResizeHandles = resizeBoundaryChange || forceColumnRefresh;\n forceColumnRefresh = false;\n reconcileColumnStructure();\n syncColumnGeometry();\n if (refreshResizeHandles) registerResizeHandles();\n if (semanticColumnChange) {\n dispatch('ui:data-grid-columns-change', columnChangeDetail(previous, nextSnapshots));\n }\n }\n\n if (component.props.totalRows !== totalRows) {\n updateTotal(component.props.totalRows);\n if (cursorDelegate) root.dataset.totalItems = String(totalRows);\n }\n\n if (cursorDelegate) {\n const nextQuery = root.hasAttribute('data-query') ? component.props.query : cursorOptionQuery;\n if (!isSerializableEqual(appliedCursorQuery, nextQuery)) {\n appliedCursorQuery = cloneSerializable(nextQuery);\n cursorDelegate.setQuery(nextQuery);\n }\n }\n };\n const scheduleDeclarativeState = (): void => {\n if (declarativeFlushQueued) return;\n declarativeFlushQueued = true;\n queueMicrotask(flushDeclarativeState);\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n if (!cursorDelegate) {\n root.toggleAttribute('data-loading', requestAborters.size > 0);\n root.toggleAttribute('data-empty', totalRows === 0);\n }\n root.dataset.selection = component.props.selection;\n table?.setAttribute('aria-rowcount', String(totalRows + 1));\n root.style.setProperty('--ui-data-grid-row-height', `${component.props.rowHeight}px`);\n root.style.setProperty('--ui-data-grid-total-height', `${Math.max(totalRows * component.props.rowHeight, component.props.rowHeight)}px`);\n if (!cursorDelegate || totalRows > 0) spacer.style.height = `var(--ui-data-grid-total-height)`;\n reflectMountedSelection();\n };\n const updateTotal = (next: number): void => {\n const normalized = integer(next);\n if (normalized === totalRows) return;\n totalRows = normalized;\n syncState();\n dispatch('ui:data-grid-total-change', {totalRows});\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {y: {\n total: totalRows,\n itemSize: component.props.rowHeight,\n viewportSize: component.props.bufferSize * component.props.rowHeight,\n scrollOffset: start * component.props.rowHeight,\n buffer: 0,\n }}});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalRows === 0) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalRows - 1, Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalRows - 1) / size) * size;\n const starts = [center - size, center, center + size].map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Data Grid requires a vertical virtual window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const settle = (blockKey: string, aborter: AbortController): void => {\n if (requestAborters.get(blockKey) !== aborter) return;\n requestAborters.delete(blockKey);\n syncState();\n if (requestAborters.size > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n requestAborters.set(block.key, aborter);\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:data-grid-load-start', {window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {method: 'GET', headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n }, signal: aborter.signal});\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace: () => controller.pending(block.key) === request && !destroyed,\n });\n if (!replaced) return;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n block.element.style.height = `${axis.count * component.props.rowHeight}px`;\n block.element.style.transform = `translateY(${axis.translateOffset}px)`;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {window, start: axis.start, count: axis.count, end: axis.start + axis.count});\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: 0, error});\n } finally {\n settle(block.key, aborter);\n }\n };\n const reconcile = (scrollTop: number): void => {\n if (cursorDelegate || component.props.cursor) return;\n if (requestAborters.size > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const logicalIndex = Math.min(Math.max(0, totalRows - 1), Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:data-grid-range', {start: axis.start, count: axis.count, end: axis.start + axis.count, window: center});\n }\n if (desired.length === 0) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n requestAborters.forEach((aborter) => aborter.abort());\n requestAborters.clear();\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n const setSelection = (value: DataGridSelectionValue, detail?: {added: string[]; removed: string[]}): void => {\n selection = normalizeSelection(value, component.props.selection);\n suppressPropChange = true;\n component.props.selectionValue = selection;\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'selectionValue', value: selection});\n suppressPropChange = false;\n reflectMountedSelection();\n dispatch('ui:data-grid-selection-change', {selection, added: detail?.added ?? [], removed: detail?.removed ?? []});\n };\n const changeRow = (key: string, selected?: boolean): void => {\n const change = toggleSelection(selection, String(key), component.props.selection, selected);\n if (change.added.length === 0 && change.removed.length === 0) return;\n setSelection(change.selection, change);\n };\n const updateColumnWidth = (column: DataGridColumn, width: number, phase: 'start' | 'resize' | 'end'): void => {\n column.width = Math.min(column.maxWidth ?? Number.POSITIVE_INFINITY, Math.max(column.minWidth, width));\n column.element.dataset.width = String(column.width);\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n syncColumnGeometry();\n dispatch('ui:data-grid-column-resize', {column: column.key, width: column.width, phase});\n };\n const registerResizeHandles = (): void => {\n resizeCleanup?.run();\n resizeCleanup = new CleanupManager();\n cleanup.addChild(resizeCleanup);\n columns.forEach((column) => {\n const handle = column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]');\n if (!handle) return;\n const enabled = column.resizable && component.props.resizableColumns;\n handle.hidden = !column.resizable;\n if (enabled) handle.removeAttribute('aria-disabled');\n else handle.setAttribute('aria-disabled', 'true');\n handle.tabIndex = enabled ? 0 : -1;\n if (!enabled) return;\n const onResize = (event: ResizeEvent): void => updateColumnWidth(column, event.previewWidth, event.phase);\n resizeCleanup?.add(createResizable({\n element: column.element,\n handle,\n axis: 'x',\n min: column.minWidth,\n max: column.maxWidth,\n mode: component.props.resizeMode,\n disabled: () => !component.props.resizableColumns || !column.resizable,\n onStart: onResize,\n onResize,\n onEnd: onResize,\n }));\n });\n };\n\n const component: TrellisAlpineComponent<DataGridData> = {\n get supportsSeek(): boolean { return cursorDelegate?.supportsSeek ?? false; },\n props: null as unknown as PropState<typeof dataGridSchema>,\n init(): void {\n cleanup = cleanupManagerFor(this);\n root = this.$el;\n destroyed = false;\n const scope = globalThis.crypto?.randomUUID?.() ?? `grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n root.dataset.uiDataGridScope = scope;\n root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.setAttribute('data-sortable-scope', scope);\n this.props = defineProps({el: root, schema: dataGridSchema, onChange: (_state, changes) => {\n if (suppressPropChange) return;\n const keys = changes.map(({key}) => key);\n if (keys.includes('selectionValue') || keys.includes('selection')) {\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n reflectMountedSelection();\n }\n if (keys.some((key) => [\n 'resizableColumns', 'reorderableColumns', 'minColumnWidth', 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) forceColumnRefresh = true;\n if (keys.some((key) => [\n 'query', 'totalRows', 'resizableColumns', 'reorderableColumns', 'minColumnWidth',\n 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) scheduleDeclarativeState();\n if (keys.some((key) => ['fetchUrl', 'rowHeight', 'bufferSize'].includes(key))) this.reload();\n }});\n totalRows = integer(this.props.totalRows);\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n viewport = root.querySelector<HTMLElement>('[data-ui-data-grid-viewport]')\n ?? root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]');\n table = root.querySelector<HTMLElement>('[data-ui-data-grid-inner]');\n body = root.querySelector<HTMLElement>('[data-ui-data-grid-body]');\n spacer = root.querySelector<HTMLElement>('[data-ui-data-grid-spacer]');\n styleElement = root.querySelector<HTMLStyleElement>('style[data-ui-data-grid-layout]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-data-grid-block]')).slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!viewport || !table || !body || !spacer || !styleElement || blocks.length !== 3) {\n throw new Error('Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.');\n }\n viewport.setAttribute('data-ui-data-grid-viewport', '');\n columns = declaredColumns();\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n reconcileColumnStructure();\n syncColumnGeometry();\n registerResizeHandles();\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) {\n if (typeof ResizeObserver !== 'undefined') {\n headerSizeObserver = new ResizeObserver(() => syncBodyWidth(headerRow));\n headerSizeObserver.observe(headerRow);\n }\n columnObserver = new MutationObserver(scheduleDeclarativeState);\n columnObserver.observe(headerRow, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n 'data-column', 'data-label', 'data-width', 'data-min-width', 'data-max-width', 'data-hidden',\n 'data-pinned', 'data-sortable', 'data-sort', 'data-resizable', 'data-reorderable', 'data-align',\n 'data-cell-class', 'hidden',\n ],\n });\n }\n unregisterColumnInvalidation = registerDomInvalidationOwner(root, {invalidateDom: scheduleDeclarativeState});\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => {\n if (scrollFrame) return;\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = 0;\n if (viewport) reconcile(viewport.scrollTop);\n });\n }, {passive: true, signal: listenerAborter.signal});\n root.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const sortButton = target.closest<HTMLElement>('[data-ui-data-grid-sort-button]');\n if (sortButton && this.props.sortableColumns) {\n const header = sortButton.closest<HTMLElement>('[data-ui-data-grid-column-header]');\n const column = columns.find(({key}) => key === header?.dataset.column);\n if (column?.sortable) {\n const direction = column.sort === 'ascending' ? 'descending' : 'ascending';\n dispatch('ui:data-grid-sort', {column: column.key, direction, additive: event.shiftKey});\n }\n return;\n }\n const row = target.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (!row || !root?.contains(row)) return;\n const key = row.dataset.rowKey ?? '';\n if (this.props.selectOnRowClick && !target.closest(interactiveSelector)) changeRow(key);\n dispatch('ui:data-grid-row-activate', {rowKey: key, row});\n }, {signal: listenerAborter.signal});\n root.addEventListener('dblclick', (event) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>('[data-ui-data-grid-cell]');\n const row = cell?.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (cell && row) dispatch('ui:data-grid-cell-activate', {\n rowKey: row.dataset.rowKey ?? '', column: cell.dataset.column ?? '', cell,\n });\n }, {signal: listenerAborter.signal});\n root.addEventListener('ui:sortable-drop', ((event: CustomEvent) => {\n const source = event.detail?.source;\n if (source?.type !== 'data-grid-column') return;\n const to = Number(event.detail?.index ?? event.detail?.anchor?.index);\n if (Number.isInteger(to)) this.reorderColumn(String(source.id), to);\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-total-change', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n updateTotal(Number(event.detail?.totalItems ?? 0));\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load-start', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-load-start', {mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-error', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-error', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: this.props.rowHeight, viewportSize: viewport.clientHeight,\n scrollOffset: 0, buffer: this.props.bufferSize,\n }, {axis: 'y', index: this.props.initialIndex});\n syncState();\n if (this.props.cursor) this.useCursor(serverCursorOptions(() => {\n if (!root) throw new Error('Data Grid is not mounted.');\n return root;\n }));\n else reconcile(viewport.scrollTop);\n },\n destroy(): void {\n destroyed = true;\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n listenerAborter?.abort();\n listenerAborter = null;\n columnObserver?.disconnect();\n columnObserver = null;\n headerSizeObserver?.disconnect();\n headerSizeObserver = null;\n unregisterColumnInvalidation?.();\n unregisterColumnInvalidation = null;\n resizeCleanup = null;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n table = null;\n body = null;\n spacer = null;\n styleElement = null;\n columns = [];\n previousColumnSnapshots = [];\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (cursorDelegate) {\n cursorDelegate.scrollToIndex(index, align);\n return;\n }\n if (!viewport) return;\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: this.props.rowHeight, viewportSize: viewport.clientHeight,\n scrollOffset: viewport.scrollTop, buffer: this.props.bufferSize,\n }, {axis: 'y', index, align});\n reconcile(viewport.scrollTop);\n },\n setTotalRows(count): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'totalRows', value: integer(count)});\n },\n setQuery(query): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'query', value: query});\n },\n useCursor(options): void {\n if (!root || !viewport || !spacer) return;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n root.dataset.totalItems = String(totalRows);\n root.dataset.itemSize = String(this.props.rowHeight);\n spacer.setAttribute('data-ui-virtualizer-spacer', '');\n blocks.forEach(({element}) => element.setAttribute('data-ui-virtualizer-block', ''));\n cursorOptionQuery = options.query;\n const initialQuery = root.hasAttribute('data-query') ? this.props.query : cursorOptionQuery;\n appliedCursorQuery = cloneSerializable(initialQuery);\n const delegate = UiVirtualizer<unknown, unknown>(AlpineInstance, {\n cursor: {...options, query: initialQuery} as unknown as CursorVirtualizerOptions<unknown, unknown>,\n }) as CursorDelegate;\n cursorDelegate = delegate;\n Object.assign(delegate, {$el: root});\n delegate.init();\n },\n setUrl(url, options = {}): void {\n suppressPropChange = true;\n this.props.fetchUrl = String(url);\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'fetchUrl', value: String(url)});\n suppressPropChange = false;\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n reset(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reset({scrollTop: options.scrollTop ?? 0});\n return;\n }\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reload(options);\n return;\n }\n const scrollTop = options.scrollTop ?? viewport?.scrollTop ?? 0;\n invalidate();\n if (viewport) viewport.scrollTop = Math.max(0, scrollTop);\n reconcile(scrollTop);\n },\n resizeColumn(key, width): void {\n const column = columns.find((candidate) => candidate.key === key);\n if (column) updateColumnWidth(column, Number(width), 'end');\n },\n reorderColumn(key, toIndex): void {\n const from = columns.findIndex((column) => column.key === key);\n const next = reorderColumns(columns, key, integer(toIndex));\n if (!next) return;\n columns = next;\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n const headerRow = root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]') ?? null;\n columns.forEach((column) => headerRow?.insertBefore(column.element, indicator));\n reconcileColumnStructure();\n syncColumnGeometry();\n dispatch('ui:data-grid-column-reorder', {column: key, from, to: integer(toIndex), columns: columns.map(({key: columnKey}) => columnKey)});\n },\n selectRow(key): void { changeRow(String(key), true); },\n deselectRow(key): void { changeRow(String(key), false); },\n toggleRow(key): void { changeRow(String(key)); },\n setSelection(value): void { setSelection(value); },\n selectQuery(token, total, except = []): void {\n setSelection({mode: 'query', token: String(token), total: integer(total), except: except.map(String)});\n },\n clearSelection(): void { setSelection({mode: 'ids', ids: []}); },\n };\n return component;\n};\n\nconst registerDataGrid = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiDataGrid', () => UiDataGrid(AlpineInstance))(AlpineInstance);\n};\n\nexport {registerDataGrid, UiDataGrid};\nexport type {DataGridData, DataGridResetOptions, DataGridSetUrlOptions, UiDataGridApi};\n","// Generated by scripts/generate_component_entries.mjs from packages/client/component-entries.json.\n// Do not edit by hand.\nimport type {Alpine as AlpineType} from 'alpinejs';\nimport {registerResizableCapability} from '../../capabilities/resizable';\nimport {registerMotionCapability} from '../../capabilities/motion';\nimport {registerSortableCapability} from '../../capabilities/sortable';\nimport {registerDataGrid as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerDataGrid = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerResizableCapability(AlpineInstance);\n registerMotionCapability(AlpineInstance);\n registerSortableCapability(AlpineInstance);\n registerComponent(AlpineInstance);\n};\n\nexport {registerDataGrid};\nexport default registerDataGrid;\nexport * from './index';\n"],"mappings":"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"}