@vireo-ai/trellis-ui 0.1.47 → 0.1.49

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 (129) hide show
  1. package/package.json +5 -5
  2. package/packages/client/src/components/checkbox/styles.css +5 -0
  3. package/packages/client/src/components/sidebar/styles.css +8 -0
  4. package/packages/client/src/styles/generated/theme-fonts.css +1 -1
  5. package/packages/client/src/styles/generated/theme-palette.css +1 -1
  6. package/packages/client/src/styles/generated/theme-runtime.css +49 -49
  7. package/packages/client/src/styles/generated-sources.css +1 -1
  8. package/packages/client/src/styles/recipes/selection.css +0 -4
  9. package/packages/client/types/component-api.d.ts +3 -1
  10. package/packages/client/types/components/data-grid/contract.d.ts +1 -0
  11. package/packages/client/types/components/data-grid/index.d.ts +28 -4
  12. package/packages/client/types/components/runtime.d.ts +1 -1
  13. package/packages/client/types/components/sidebar/machine.d.ts +3 -3
  14. package/packages/client/types/components/virtualizer/contract.d.ts +1 -29
  15. package/packages/client/types/components/virtualizer/cursor.d.ts +1 -0
  16. package/packages/client/types/components/virtualizer/index.d.ts +2 -28
  17. package/packages/client/types/motion/flip.d.ts +2 -2
  18. package/packages/client/types/runtime/cursor-data-source.d.ts +45 -0
  19. package/packages/client/types/runtime/focus-handoff.d.ts +11 -0
  20. package/packages/client/types/runtime/virtualizer-schema.d.ts +29 -0
  21. package/packages/client/types/runtime/virtualizer.d.ts +41 -0
  22. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +55 -54
  23. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
  24. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +332 -315
  25. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
  26. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/shortcut.js +1 -1
  27. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
  28. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DCacA4wj.js → capability-motion-DoZROkFD.js} +2 -2
  29. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DCacA4wj.js.map → capability-motion-DoZROkFD.js.map} +1 -1
  30. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-shortcut-BoDF_wQX.js +2 -0
  31. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-shortcut-BoDF_wQX.js.map +1 -0
  32. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BnB9Wz0E.js → capability-sortable-DtSghTO8.js} +2 -2
  33. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-BnB9Wz0E.js.map → capability-sortable-DtSghTO8.js.map} +1 -1
  34. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{controller-BOf7dxV2.js → controller-qWtZCkAC.js} +2 -2
  35. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{controller-BOf7dxV2.js.map → controller-qWtZCkAC.js.map} +1 -1
  36. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DBX5qDXb.js → core-BgbZXaDN.js} +2 -2
  37. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DBX5qDXb.js.map → core-BgbZXaDN.js.map} +1 -1
  38. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-1meMFJbq.js +2 -0
  39. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-1meMFJbq.js.map +1 -0
  40. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dqyot6vM.js → entry.generated-B-wVMxe6.js} +2 -2
  41. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Dqyot6vM.js.map → entry.generated-B-wVMxe6.js.map} +1 -1
  42. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BdiyPh0p.js → entry.generated-BYDBzadH.js} +2 -2
  43. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BdiyPh0p.js.map → entry.generated-BYDBzadH.js.map} +1 -1
  44. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-F2czAXCg.js → entry.generated-B_q7LVNv.js} +2 -2
  45. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-F2czAXCg.js.map → entry.generated-B_q7LVNv.js.map} +1 -1
  46. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C0S3uZrm.js → entry.generated-BhtgeSTa.js} +2 -2
  47. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C0S3uZrm.js.map → entry.generated-BhtgeSTa.js.map} +1 -1
  48. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-By9j8PrV.js → entry.generated-CJuVLJw9.js} +2 -2
  49. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-By9j8PrV.js.map → entry.generated-CJuVLJw9.js.map} +1 -1
  50. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CQGhCt9y.js +2 -0
  51. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CQGhCt9y.js.map +1 -0
  52. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-EAAmcnsg.js → entry.generated-CRhvZ0DI.js} +2 -2
  53. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-EAAmcnsg.js.map → entry.generated-CRhvZ0DI.js.map} +1 -1
  54. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CZWpqP88.js +2 -0
  55. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CZWpqP88.js.map +1 -0
  56. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C5kjUnFe.js → entry.generated-CkBblBv9.js} +2 -2
  57. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C5kjUnFe.js.map → entry.generated-CkBblBv9.js.map} +1 -1
  58. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D6qaa8bk.js +2 -0
  59. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D6qaa8bk.js.map +1 -0
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DeXEkXMW.js → entry.generated-Des-gEaR.js} +2 -2
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-Des-gEaR.js.map +1 -0
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BV49EHah.js → entry.generated-OqzkZfIu.js} +2 -2
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BV49EHah.js.map → entry.generated-OqzkZfIu.js.map} +1 -1
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-ZcYuKSSI.js +2 -0
  65. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-ZcYuKSSI.js.map +1 -0
  66. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-dyQ_HJ8D.js +2 -0
  67. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-dyQ_HJ8D.js.map +1 -0
  68. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DcXzHGIV.js → entry.generated-u0Ueamvw.js} +2 -2
  69. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DcXzHGIV.js.map → entry.generated-u0Ueamvw.js.map} +1 -1
  70. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CPbvsglm.js → entry2.generated-CPbvsglm.js} +1 -1
  71. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-CPbvsglm.js.map +1 -0
  72. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Dzq4GSqn.js +2 -0
  73. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Dzq4GSqn.js.map +1 -0
  74. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/focus-handoff-DzEyK-Fp.js +2 -0
  75. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/focus-handoff-DzEyK-Fp.js.map +1 -0
  76. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-BQk-uLaI.js +3 -0
  77. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-DT-Hq9qe.js.map → motion-BQk-uLaI.js.map} +1 -1
  78. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-DuGUQhxd.js +4 -0
  79. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{ui-CfByjNaO.js.map → ui-DuGUQhxd.js.map} +1 -1
  80. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/virtualizer-CSk2RJEN.js +2 -0
  81. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/virtualizer-CSk2RJEN.js.map +1 -0
  82. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
  83. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/checkbox.js +1 -1
  84. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +1 -1
  85. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
  86. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/direct-upload.js +1 -1
  87. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
  88. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/file-upload.js +1 -1
  89. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
  90. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js.map +1 -1
  91. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/keybinding.js +1 -1
  92. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
  93. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
  94. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/radio.js +1 -1
  95. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/scroll-area.js +1 -1
  96. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
  97. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
  98. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
  99. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
  100. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tooltip.js +1 -1
  101. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/virtualizer.js +1 -1
  102. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
  103. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
  104. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js.map +1 -1
  105. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +124 -118
  106. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +9 -9
  107. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +9 -9
  108. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-shortcut-Z-__iteD.js +0 -2
  109. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-shortcut-Z-__iteD.js.map +0 -1
  110. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B2rTvkxi.js +0 -2
  111. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B2rTvkxi.js.map +0 -1
  112. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B8aXTJK6.js +0 -2
  113. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B8aXTJK6.js.map +0 -1
  114. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BEjAV5NT.js +0 -2
  115. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BEjAV5NT.js.map +0 -1
  116. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BUbxiHwA.js +0 -2
  117. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BUbxiHwA.js.map +0 -1
  118. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B_xTkYSB.js +0 -2
  119. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B_xTkYSB.js.map +0 -1
  120. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CPbvsglm.js.map +0 -1
  121. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CSgqcIg6.js +0 -2
  122. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CSgqcIg6.js.map +0 -1
  123. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DeXEkXMW.js.map +0 -1
  124. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-a2NebZsn.js +0 -2
  125. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-a2NebZsn.js.map +0 -1
  126. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-DT-Hq9qe.js +0 -3
  127. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CfByjNaO.js +0 -4
  128. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/virtual-window-BHdOw3Pi.js +0 -2
  129. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/virtual-window-BHdOw3Pi.js.map +0 -1
@@ -1,2 +0,0 @@
1
- var e=new Set([`alt`,`cmd`,`ctrl`,`meta`,`mod`,`shift`,`super`]),t=new Set([`arrow-down`,`arrow-left`,`arrow-right`,`arrow-up`,`backspace`,`caps-lock`,`delete`,`end`,`enter`,`escape`,`home`,`insert`,`page-down`,`page-up`,`pause`,`scroll-lock`,`space`,`tab`]),n={" ":`space`,"/":`slash`,"?":`slash`,Alt:`alt`,ArrowDown:`arrow-down`,ArrowLeft:`arrow-left`,ArrowRight:`arrow-right`,ArrowUp:`arrow-up`,CapsLock:`caps-lock`,Control:`ctrl`,Meta:`meta`,PageDown:`page-down`,PageUp:`page-up`,ScrollLock:`scroll-lock`,Shift:`shift`},r={alt:`Alt`,backspace:`Backspace`,cmd:`Command`,ctrl:`Ctrl`,delete:`Delete`,end:`End`,enter:`Enter`,escape:`Escape`,home:`Home`,insert:`Insert`,meta:`Meta`,"page-down":`Page Down`,"page-up":`Page Up`,pause:`Pause`,"scroll-lock":`Scroll Lock`,shift:`⇧`,slash:`/`,space:`Space`,super:`Super`,tab:`Tab`,"arrow-down":`↓`,"arrow-left":`←`,"arrow-right":`→`,"arrow-up":`↑`},i=[`document`,`window`,`keyup`,`repeat`,`editable`],a=()=>{if(typeof navigator>`u`)return!1;let e=navigator.platform||navigator.userAgent;return/Mac|iPhone|iPad|iPod/i.test(e)},o=e=>n[e]||e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/_/g,`-`).toLowerCase(),s=e=>e===`slash`||e.length===1||t.has(e)||/^f(?:[1-9]|1\d|2[0-4])$/.test(e),c=(e,t)=>{let n=e.some(e=>e===`meta`||e===`cmd`||e===`super`)||t&&e.includes(`mod`),r=e.includes(`ctrl`)||!t&&e.includes(`mod`);return{altKey:e.includes(`alt`),ctrlKey:r,metaKey:n,shiftKey:e.includes(`shift`)}},l=e=>e.trim().toLowerCase().split(`.`).map(e=>e.trim()).filter(Boolean),u=(t,n={})=>{let r=l(t);if(r.length===0)return null;let i=n.apple??a(),o=r.filter(t=>e.has(t)),u=r.filter(t=>!e.has(t));if(u.length===0||u.some(e=>!s(e))||u.length>1&&o.length>0)return null;let d=c(o,i),f=u.map((e,t)=>({key:e,...t===0?d:c([],i)}));return{normalized:r.join(`.`),steps:f}},d=e=>e.split(`-`).map(e=>e?`${e[0].toUpperCase()}${e.slice(1)}`:``).join(` `),f={alt:`⌥`,cmd:`⌘`,ctrl:`⌃`,meta:`⌘`,mod:`⌘`,shift:`⇧`,super:`⌘`},p=(e,t)=>t?f[e]??d(e):e===`mod`?`Ctrl`:r[e]??d(e),m=(e,t)=>e===`mod`?t?`meta`:`ctrl`:e===`cmd`||e===`super`?`meta`:e,h=(e,t)=>e===`slash`&&t.includes(`shift`)?`?`:r[e]??d(e),g=(t,n={})=>{let r=l(t);if(r.length===0)return[];let i=n.apple??a(),o=r.filter(t=>e.has(t)),s=r.filter(t=>!e.has(t)),c=o.map(e=>({label:p(e,i),token:m(e,i)}));return s.length===0?[c]:s.length>1&&o.length===0?s.map(e=>[{label:h(e,r),token:e}]):[[...c,...s.map(e=>({label:h(e,r),token:e}))]]},_=(e,t={})=>g(e,t).map(e=>e.map(({label:e})=>e)),v=new WeakMap,y=(e,t)=>{let n=v.get(e);if(!n){let t=new Set,r=new Set,i=()=>r.forEach(e=>e(new Set(t))),a=()=>{t.size!==0&&(t.clear(),i())},s=e=>{let n=[...t].sort().join(` `),r=o(e.key);e.type===`keydown`?t.add(r):t.delete(r),e.type===`keyup`&&r===`meta`&&t.clear(),[[`alt`,e.altKey],[`ctrl`,e.ctrlKey],[`meta`,e.metaKey],[`shift`,e.shiftKey]].forEach(([e,n])=>{n?t.add(e):t.delete(e)}),[...t].sort().join(` `)!==n&&i()},c=e=>{e instanceof KeyboardEvent&&s(e)},l=()=>{e.visibilityState===`hidden`&&a()};e.addEventListener(`keydown`,c,!0),e.addEventListener(`keyup`,c,!0),e.addEventListener(`visibilitychange`,l),e.defaultView?.addEventListener(`blur`,a),n={keys:t,listeners:r,destroy:()=>{e.removeEventListener(`keydown`,c,!0),e.removeEventListener(`keyup`,c,!0),e.removeEventListener(`visibilitychange`,l),e.defaultView?.removeEventListener(`blur`,a)}},v.set(e,n)}return n.listeners.add(t),t(new Set(n.keys)),()=>{n?.listeners.delete(t),n?.listeners.size===0&&(n.destroy(),v.delete(e))}},b=(e,t)=>o(e.key)===t.key&&e.altKey===t.altKey&&e.ctrlKey===t.ctrlKey&&e.metaKey===t.metaKey&&e.shiftKey===t.shiftKey,x=(e,t={})=>{let n=u(e,t);if(!n)return null;let r=Math.max(250,Math.min(5e3,t.timeout??1e3)),i=0,a=0,o=()=>{i=0,a=0};return{shortcut:n,reset:o,match(e,t=performance.now()){i>0&&t-a>r&&o();let s=n.steps[i];if(!s||!b(e,s)){o();let r=n.steps[0];return!r||!b(e,r)?`none`:n.steps.length===1?`complete`:(i=1,a=t,`partial`)}return i===n.steps.length-1?(o(),`complete`):(i+=1,a=t,`partial`)}}},S=e=>e instanceof Element?e.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"])`)!==null:!1,C=e=>e.isConnected&&!e.closest(`[inert], [hidden]`)&&e.getAttribute(`aria-hidden`)!==`true`,w=()=>{let e=[`x-ui-shortcut`],t=(n,r)=>{r.forEach((i,a)=>{let o=[...n,i];e.push(`x-ui-shortcut.${o.join(`.`)}`),t(o,r.filter((e,t)=>t!==a))})};return t([],i),e.map(e=>`[${e.replaceAll(`.`,`\\.`)} ]`.replace(` ]`,`]`)).join(`, `)},T=new WeakSet,E=e=>{T.has(e)||(T.add(e),e.addInitSelector(()=>w()),e.directive(`ui-shortcut`,e.skipDuringClone((e,{expression:t,modifiers:n},r)=>{if(!(e instanceof HTMLElement))return;let i=r.evaluateLater(t),a=Number(e.dataset.uiShortcutTimeout),o=Number.isFinite(a)?a:void 0,s=null;r.effect(()=>i(e=>{s=typeof e==`string`&&e.trim()?x(e,o===void 0?{}:{timeout:o}):null}));let c=n.includes(`window`)?window:n.includes(`document`)?document:e,l=n.includes(`keyup`)?`keyup`:`keydown`,u=t=>{if(!(t instanceof KeyboardEvent)||!s||!C(e)||t.repeat&&!n.includes(`repeat`)||S(t.target)&&!n.includes(`editable`)||s.match(t)!==`complete`)return;let r=new CustomEvent(`ui:shortcut`,{bubbles:!0,cancelable:!0,composed:!0,detail:{shortcut:s.shortcut.normalized,keyboardEvent:t,owner:e,sequence:s.shortcut.steps.length>1}}),i=!1,a=r.stopPropagation.bind(r),o=r.stopImmediatePropagation.bind(r);r.stopPropagation=()=>{i=!0,a()},r.stopImmediatePropagation=()=>{i=!0,o()},e.dispatchEvent(r),r.defaultPrevented&&t.preventDefault(),i&&t.stopPropagation()};c.addEventListener(l,u),r.cleanup(()=>c.removeEventListener(l,u))})))};export{u as a,y as i,_ as n,E as o,g as r,x as t};
2
- //# sourceMappingURL=capability-shortcut-Z-__iteD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capability-shortcut-Z-__iteD.js","names":[],"sources":["../../../../../../../../client/src/capabilities/shortcut.ts"],"sourcesContent":["import type Alpine from 'alpinejs';\n\ntype ShortcutPlatform = {apple?: boolean};\ntype ShortcutOptions = ShortcutPlatform & {timeout?: number};\ntype ShortcutMatch = 'none' | 'partial' | 'complete';\ntype ShortcutDisplayKey = {label: string; token: string};\ntype ShortcutPressedListener = (keys: ReadonlySet<string>) => void;\n\ntype ShortcutStep = {\n key: string;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n};\n\ntype ParsedShortcut = {\n normalized: string;\n steps: ShortcutStep[];\n};\n\ntype ShortcutEventDetail = {\n shortcut: string;\n keyboardEvent: KeyboardEvent;\n owner: HTMLElement;\n sequence: boolean;\n};\n\ntype ShortcutMatcher = {\n readonly shortcut: ParsedShortcut;\n match(event: KeyboardEvent, timestamp?: number): ShortcutMatch;\n reset(): void;\n};\n\nconst MODIFIER_TOKENS = new Set(['alt', 'cmd', 'ctrl', 'meta', 'mod', 'shift', 'super']);\nconst NAMED_KEYS = new Set([\n 'arrow-down', 'arrow-left', 'arrow-right', 'arrow-up',\n 'backspace', 'caps-lock', 'delete', 'end', 'enter', 'escape', 'home', 'insert',\n 'page-down', 'page-up', 'pause', 'scroll-lock', 'space', 'tab',\n]);\nconst KEY_ALIASES: Record<string, string> = {\n ' ': 'space',\n '/': 'slash',\n '?': 'slash',\n Alt: 'alt',\n ArrowDown: 'arrow-down',\n ArrowLeft: 'arrow-left',\n ArrowRight: 'arrow-right',\n ArrowUp: 'arrow-up',\n CapsLock: 'caps-lock',\n Control: 'ctrl',\n Meta: 'meta',\n PageDown: 'page-down',\n PageUp: 'page-up',\n ScrollLock: 'scroll-lock',\n Shift: 'shift',\n};\nconst KEY_LABELS: Record<string, string> = {\n alt: 'Alt',\n backspace: 'Backspace',\n cmd: 'Command',\n ctrl: 'Ctrl',\n delete: 'Delete',\n end: 'End',\n enter: 'Enter',\n escape: 'Escape',\n home: 'Home',\n insert: 'Insert',\n meta: 'Meta',\n 'page-down': 'Page Down',\n 'page-up': 'Page Up',\n pause: 'Pause',\n 'scroll-lock': 'Scroll Lock',\n shift: '⇧',\n slash: '/',\n space: 'Space',\n super: 'Super',\n tab: 'Tab',\n 'arrow-down': '↓',\n 'arrow-left': '←',\n 'arrow-right': '→',\n 'arrow-up': '↑',\n};\nconst DIRECTIVE_MODIFIERS = ['document', 'window', 'keyup', 'repeat', 'editable'] as const;\n\nconst isApplePlatform = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n const platform = navigator.platform || navigator.userAgent;\n return /Mac|iPhone|iPad|iPod/i.test(platform);\n};\n\nconst normalizeKey = (key: string): string => {\n const alias = KEY_ALIASES[key];\n if (alias) return alias;\n return key\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/_/g, '-')\n .toLowerCase();\n};\n\nconst isKnownKey = (key: string): boolean => (\n key === 'slash'\n || key.length === 1\n || NAMED_KEYS.has(key)\n || /^f(?:[1-9]|1\\d|2[0-4])$/.test(key)\n);\n\nconst modifierStep = (tokens: string[], apple: boolean): Omit<ShortcutStep, 'key'> => {\n const metaKey = tokens.some((token) => token === 'meta' || token === 'cmd' || token === 'super')\n || (apple && tokens.includes('mod'));\n const ctrlKey = tokens.includes('ctrl') || (!apple && tokens.includes('mod'));\n return {\n altKey: tokens.includes('alt'),\n ctrlKey,\n metaKey,\n shiftKey: tokens.includes('shift'),\n };\n};\n\nconst tokenize = (value: string): string[] => value\n .trim()\n .toLowerCase()\n .split('.')\n .map((token) => token.trim())\n .filter(Boolean);\n\nconst parseShortcut = (value: string, options: ShortcutPlatform = {}): ParsedShortcut | null => {\n const tokens = tokenize(value);\n if (tokens.length === 0) return null;\n const apple = options.apple ?? isApplePlatform();\n const modifierTokens = tokens.filter((token) => MODIFIER_TOKENS.has(token));\n const keyTokens = tokens.filter((token) => !MODIFIER_TOKENS.has(token));\n if (keyTokens.length === 0 || keyTokens.some((token) => !isKnownKey(token))) return null;\n if (keyTokens.length > 1 && modifierTokens.length > 0) return null;\n\n const modifiers = modifierStep(modifierTokens, apple);\n const steps = keyTokens.map((key, index) => ({\n key,\n ...(index === 0 ? modifiers : modifierStep([], apple)),\n }));\n return {normalized: tokens.join('.'), steps};\n};\n\nconst titleCase = (token: string): string => token\n .split('-')\n .map((part) => part ? `${part[0]!.toUpperCase()}${part.slice(1)}` : '')\n .join(' ');\n\nconst APPLE_MODIFIER_LABELS: Readonly<Record<string, string>> = {\n alt: '⌥',\n cmd: '⌘',\n ctrl: '⌃',\n meta: '⌘',\n mod: '⌘',\n shift: '⇧',\n super: '⌘',\n};\n\nconst modifierLabel = (token: string, apple: boolean): string => {\n if (apple) return APPLE_MODIFIER_LABELS[token] ?? titleCase(token);\n if (token === 'mod') return 'Ctrl';\n return KEY_LABELS[token] ?? titleCase(token);\n};\n\nconst modifierKey = (token: string, apple: boolean): string => {\n if (token === 'mod') return apple ? 'meta' : 'ctrl';\n if (token === 'cmd' || token === 'super') return 'meta';\n return token;\n};\n\nconst keyLabel = (token: string, tokens: string[]): string => {\n if (token === 'slash' && tokens.includes('shift')) return '?';\n return KEY_LABELS[token] ?? titleCase(token);\n};\n\nconst formatShortcutKeys = (value: string, options: ShortcutPlatform = {}): ShortcutDisplayKey[][] => {\n const tokens = tokenize(value);\n if (tokens.length === 0) return [];\n const apple = options.apple ?? isApplePlatform();\n const modifiers = tokens.filter((token) => MODIFIER_TOKENS.has(token));\n const keys = tokens.filter((token) => !MODIFIER_TOKENS.has(token));\n const displayModifiers = modifiers.map((token) => ({\n label: modifierLabel(token, apple),\n token: modifierKey(token, apple),\n }));\n if (keys.length === 0) return [displayModifiers];\n if (keys.length > 1 && modifiers.length === 0) {\n return keys.map((token) => [{label: keyLabel(token, tokens), token}]);\n }\n return [[\n ...displayModifiers,\n ...keys.map((token) => ({label: keyLabel(token, tokens), token})),\n ]];\n};\n\nconst formatShortcut = (value: string, options: ShortcutPlatform = {}): string[][] => (\n formatShortcutKeys(value, options).map((step) => step.map(({label}) => label))\n);\n\ntype PressedShortcutStore = {\n keys: Set<string>;\n listeners: Set<ShortcutPressedListener>;\n destroy: () => void;\n};\n\nconst pressedShortcutStores = new WeakMap<Document, PressedShortcutStore>();\n\nconst observePressedShortcutKeys = (\n document: Document,\n listener: ShortcutPressedListener,\n): (() => void) => {\n let store = pressedShortcutStores.get(document);\n if (!store) {\n const keys = new Set<string>();\n const listeners = new Set<ShortcutPressedListener>();\n const notify = (): void => listeners.forEach((subscriber) => subscriber(new Set(keys)));\n const clear = (): void => {\n if (keys.size === 0) return;\n keys.clear();\n notify();\n };\n const sync = (event: KeyboardEvent): void => {\n const previous = [...keys].sort().join(' ');\n const token = normalizeKey(event.key);\n if (event.type === 'keydown') keys.add(token);\n else keys.delete(token);\n\n // macOS can suppress non-modifier keyup events while Command is held.\n if (event.type === 'keyup' && token === 'meta') keys.clear();\n ([\n ['alt', event.altKey],\n ['ctrl', event.ctrlKey],\n ['meta', event.metaKey],\n ['shift', event.shiftKey],\n ] as const).forEach(([modifier, pressed]) => {\n if (pressed) keys.add(modifier);\n else keys.delete(modifier);\n });\n if ([...keys].sort().join(' ') !== previous) notify();\n };\n const onKey = (event: Event): void => {\n if (event instanceof KeyboardEvent) sync(event);\n };\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') clear();\n };\n document.addEventListener('keydown', onKey, true);\n document.addEventListener('keyup', onKey, true);\n document.addEventListener('visibilitychange', onVisibility);\n document.defaultView?.addEventListener('blur', clear);\n store = {\n keys,\n listeners,\n destroy: () => {\n document.removeEventListener('keydown', onKey, true);\n document.removeEventListener('keyup', onKey, true);\n document.removeEventListener('visibilitychange', onVisibility);\n document.defaultView?.removeEventListener('blur', clear);\n },\n };\n pressedShortcutStores.set(document, store);\n }\n store.listeners.add(listener);\n listener(new Set(store.keys));\n return () => {\n store?.listeners.delete(listener);\n if (store?.listeners.size === 0) {\n store.destroy();\n pressedShortcutStores.delete(document);\n }\n };\n};\n\nconst eventMatchesStep = (event: KeyboardEvent, step: ShortcutStep): boolean => (\n normalizeKey(event.key) === step.key\n && event.altKey === step.altKey\n && event.ctrlKey === step.ctrlKey\n && event.metaKey === step.metaKey\n && event.shiftKey === step.shiftKey\n);\n\nconst createShortcutMatcher = (value: string, options: ShortcutOptions = {}): ShortcutMatcher | null => {\n const shortcut = parseShortcut(value, options);\n if (!shortcut) return null;\n const timeout = Math.max(250, Math.min(5000, options.timeout ?? 1000));\n let index = 0;\n let previousAt = 0;\n\n const reset = (): void => {\n index = 0;\n previousAt = 0;\n };\n\n return {\n shortcut,\n reset,\n match(event, timestamp = performance.now()): ShortcutMatch {\n if (index > 0 && timestamp - previousAt > timeout) reset();\n const step = shortcut.steps[index];\n if (!step || !eventMatchesStep(event, step)) {\n reset();\n const first = shortcut.steps[0];\n if (!first || !eventMatchesStep(event, first)) return 'none';\n if (shortcut.steps.length === 1) return 'complete';\n index = 1;\n previousAt = timestamp;\n return 'partial';\n }\n if (index === shortcut.steps.length - 1) {\n reset();\n return 'complete';\n }\n index += 1;\n previousAt = timestamp;\n return 'partial';\n },\n };\n};\n\nconst isEditableTarget = (target: EventTarget | null): boolean => {\n if (!(target instanceof Element)) return false;\n return target.closest('input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])') !== null;\n};\n\nconst isEligibleOwner = (owner: HTMLElement): boolean => (\n owner.isConnected\n && !owner.closest('[inert], [hidden]')\n && owner.getAttribute('aria-hidden') !== 'true'\n);\n\nconst directiveSelectors = (): string => {\n const names = ['x-ui-shortcut'];\n const visit = (prefix: string[], remaining: readonly string[]): void => {\n remaining.forEach((modifier, index) => {\n const next = [...prefix, modifier];\n names.push(`x-ui-shortcut.${next.join('.')}`);\n visit(next, remaining.filter((_, remainingIndex) => remainingIndex !== index));\n });\n };\n visit([], DIRECTIVE_MODIFIERS);\n return names.map((name) => `[${name.replaceAll('.', '\\\\.')} ]`.replace(' ]', ']')).join(', ');\n};\n\nconst registered = new WeakSet<Alpine.Alpine>();\n\nconst registerShortcutCapability = (AlpineInstance: Alpine.Alpine): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n AlpineInstance.addInitSelector(() => directiveSelectors());\n AlpineInstance.directive('ui-shortcut', AlpineInstance.skipDuringClone((el, {expression, modifiers}, utilities) => {\n if (!(el instanceof HTMLElement)) return;\n const evaluator = utilities.evaluateLater(expression);\n const timeoutValue = Number(el.dataset.uiShortcutTimeout);\n const timeout = Number.isFinite(timeoutValue) ? timeoutValue : undefined;\n let matcher: ShortcutMatcher | null = null;\n\n utilities.effect(() => evaluator((value) => {\n matcher = typeof value === 'string' && value.trim()\n ? createShortcutMatcher(value, timeout === undefined ? {} : {timeout})\n : null;\n }));\n\n const target: EventTarget = modifiers.includes('window')\n ? window\n : modifiers.includes('document') ? document : el;\n const eventName = modifiers.includes('keyup') ? 'keyup' : 'keydown';\n const listener = (event: Event): void => {\n if (!(event instanceof KeyboardEvent) || !matcher || !isEligibleOwner(el)) return;\n if (event.repeat && !modifiers.includes('repeat')) return;\n if (isEditableTarget(event.target) && !modifiers.includes('editable')) return;\n const result = matcher.match(event);\n if (result !== 'complete') return;\n\n const shortcutEvent = new CustomEvent<ShortcutEventDetail>('ui:shortcut', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: {\n shortcut: matcher.shortcut.normalized,\n keyboardEvent: event,\n owner: el,\n sequence: matcher.shortcut.steps.length > 1,\n },\n });\n let propagationStopped = false;\n const stopPropagation = shortcutEvent.stopPropagation.bind(shortcutEvent);\n const stopImmediatePropagation = shortcutEvent.stopImmediatePropagation.bind(shortcutEvent);\n shortcutEvent.stopPropagation = (): void => {\n propagationStopped = true;\n stopPropagation();\n };\n shortcutEvent.stopImmediatePropagation = (): void => {\n propagationStopped = true;\n stopImmediatePropagation();\n };\n el.dispatchEvent(shortcutEvent);\n if (shortcutEvent.defaultPrevented) event.preventDefault();\n if (propagationStopped) event.stopPropagation();\n };\n target.addEventListener(eventName, listener);\n utilities.cleanup(() => target.removeEventListener(eventName, listener));\n }));\n};\n\nexport {\n createShortcutMatcher,\n formatShortcut,\n formatShortcutKeys,\n observePressedShortcutKeys,\n parseShortcut,\n registerShortcutCapability,\n};\nexport type {\n ParsedShortcut,\n ShortcutEventDetail,\n ShortcutDisplayKey,\n ShortcutMatch,\n ShortcutMatcher,\n ShortcutOptions,\n ShortcutPlatform,\n ShortcutStep,\n};\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{c as e,f as t,l as n,n as r,o as i}from"./codecs-Cb1ns_47.js";import{t as a}from"./fragment-Bl3Rq38L.js";import{t as o}from"./alpine-data-CytyCyfk.js";import{n as s,r as c,t as l}from"./virtual-window-BHdOw3Pi.js";var u={fetchUrl:t,totalItems:e.min(0).default(0),itemSize:e.min(2**-52).default(36),bufferSize:e.min(1).default(50),overscan:e.min(0).default(0),axis:n([`vertical`],`vertical`),initialIndex:e.min(0).default(0),startParam:t.default(`start`),countParam:t.default(`count`),totalParam:t.default(`total`),windowParam:t.default(`window`),totalHeader:t.default(`X-Trellis-Total-Items`),assetsHeader:t.default(`X-Trellis-Assets`),metaSelector:t.default(`template[data-ui-virtualizer-meta]`),scrollArea:r.default(!0),fill:r.default(!0),class:t,scrollAreaClass:t,viewportClass:t,spacerClass:t,blockClass:t},d=(e,t=0)=>Math.max(t,Math.floor(Number.isFinite(e)?e:t)),f=e=>{let t=null,n=null,r=null,o=[],f=0,p=``,m=null,h=0,g=0,_=!1,v=null,y=!1,b=new Map,x=l(s),S=(e,n)=>{t?.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:n}))},C=()=>{!t||!r||(t.toggleAttribute(`data-loading`,g>0),t.toggleAttribute(`data-empty`,f===0),r.style.height=`${Math.max(f*M.props.itemSize,M.props.itemSize)}px`)},w=e=>{let t=d(e);t!==f&&(f=t,C(),S(`ui:virtualizer-total-change`,{totalItems:f}),S(`ui:virtualizer-axis-total-change`,{axis:`y`,total:f,window:null}))},T=e=>s.compute({axes:{y:{total:f,itemSize:M.props.itemSize,viewportSize:M.props.bufferSize*M.props.itemSize,scrollOffset:e*M.props.itemSize,buffer:0}}}),E=e=>{if(f===0)return[];let t=d(M.props.bufferSize,1),n=Math.min(f-1,Math.floor(Math.max(0,e)/M.props.itemSize)),r=Math.floor(n/t)*t,i=Math.floor((f-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(T)},D=e=>{let t=e.axes.y;if(!t)throw Error(`Vertical virtualizer requires a y window.`);let n=new URL(M.props.fetchUrl,document.baseURI);return n.searchParams.set(M.props.startParam,String(t.start)),n.searchParams.set(M.props.countParam,String(t.count)),n.searchParams.set(M.props.totalParam,String(t.total)),/^[a-z][a-z\d+.-]*:/i.test(M.props.fetchUrl)||M.props.fetchUrl.startsWith(`//`)?n.href:`${n.pathname}${n.search}${n.hash}`},O=()=>{if(g=Math.max(0,g-1),C(),g>0||m===null||_)return;let e=m;m=null,A(e)},k=async(r,i,o)=>{let s=i.axes.y;if(!s)return;let l=new AbortController;b.set(r.key,l),g+=1,C(),t?.removeAttribute(`data-error`),S(`ui:virtualizer-load-start`,{block:r.key,window:i});try{let u=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${o.requestGeneration}`,d=await fetch(D(i),{method:`GET`,headers:{Accept:`text/html`,"X-Trellis-Virtualizer":`true`,"X-Trellis-Request-ID":u},signal:l.signal});if(!d.ok&&d.status!==204){x.fail(o),t?.setAttribute(`data-error`,``),S(`ui:virtualizer-error`,{block:r.key,window:i,status:d.status});return}let f=await c(d,M.props);if(x.pending(r.key)!==o||_)return;let p=r.element.contains(document.activeElement);if(!await a(e,r.element,f.html,{assets:f.assets,shouldReplace:()=>x.pending(r.key)===o&&!_})||(p&&n?.focus({preventScroll:!0}),f.totalItems!==null&&w(f.totalItems),!x.commit(o,i)))return;r.element.style.height=`${s.count*M.props.itemSize}px`,r.element.style.transform=`translateY(${s.translateOffset}px)`,S(`ui:virtualizer-load`,{block:r.key,window:i})}catch(e){if(l.signal.aborted)return;x.fail(o),t?.setAttribute(`data-error`,``),S(`ui:virtualizer-error`,{block:r.key,window:i,status:0,error:e})}finally{b.get(r.key)===l&&b.delete(r.key),O()}},A=t=>{if(g>0){m=t;return}let n=E(t),r=n.map(e=>e.key).join(`,`),i=Math.min(Math.max(0,f-1),Math.floor(Math.max(0,t)/M.props.itemSize)),s=n.find(e=>{let t=e.axes.y;return t&&i>=t.start&&i<t.start+t.count})??n[0];if(s&&p!==s.key){p=s.key;let e=s.axes.y;S(`ui:virtualizer-window`,{window:s}),S(`ui:virtualizer-range`,{start:e.start,count:e.count,end:e.start+e.count,window:s})}if(!r){o.forEach(t=>void a(e,t.element,``));return}let c=new Set;n.forEach(e=>{let t=o.find(t=>x.mounted(t.key)?.key===e.key);t&&c.add(t)});let l=o.filter(e=>!c.has(e));n.forEach(e=>{if(o.some(t=>x.mounted(t.key)?.key===e.key))return;let t=l.shift();if(!t)return;let n=x.begin(t.key,e);n&&k(t,e,n)})},j=()=>{b.forEach(e=>e.abort()),b.clear(),g=0,m=null,p=``,x.invalidate(),o.forEach(t=>{t.element.style.height=``,t.element.style.transform=``,a(e,t.element,``)}),C()},M={props:null,init(){if(t=this.$el,_=!1,this.props=i({el:t,schema:u,onChange:(e,t)=>{y||(t.some(({key:e})=>e===`totalItems`)?(w(this.props.totalItems),this.reload()):t.some(({key:e})=>[`fetchUrl`,`itemSize`,`bufferSize`].includes(e))&&this.reload())}}),f=d(this.props.totalItems),n=t.querySelector(`[data-ui-scroll-area-viewport]`)??t,r=t.querySelector(`[data-ui-virtualizer-spacer]`),o=Array.from(t.querySelectorAll(`[data-ui-virtualizer-block]`)).slice(0,3).map((e,t)=>({element:e,key:`block-${t+1}`})),!r||o.length!==3)throw Error(`Virtualizer requires one spacer and three block containers.`);n.style.overscrollBehavior=`contain`,n.style.overflowAnchor=`none`,v=new AbortController,n.addEventListener(`scroll`,()=>{h||=requestAnimationFrame(()=>{h=0,n&&A(n.scrollTop)})},{passive:!0,signal:v.signal}),n.scrollTop=s.scrollTo({total:f,itemSize:this.props.itemSize,viewportSize:n.clientHeight,scrollOffset:0,buffer:this.props.bufferSize},{axis:`y`,index:this.props.initialIndex}),C(),A(n.scrollTop)},destroy(){_=!0,h&&cancelAnimationFrame(h),v?.abort(),v=null,j(),this.props.disconnect(),t=null,n=null,r=null,o=[]},scrollToIndex(e,t=`start`){n&&(n.scrollTop=s.scrollTo({total:f,itemSize:this.props.itemSize,viewportSize:n.clientHeight,scrollOffset:n.scrollTop,buffer:this.props.bufferSize},{axis:`y`,index:e,align:t}),A(n.scrollTop))},setTotalItems(e){w(e);let t=n?.scrollTop;this.reload(t===void 0?{}:{scrollTop:t})},setUrl(e,t={}){y=!0,this.props.fetchUrl=String(e),y=!1,t.reset??!0?this.reset():this.reload()},reset(e={}){this.reload({scrollTop:e.scrollTop??0})},reload(e={}){let t=e.scrollTop??n?.scrollTop??0;j(),n&&(n.scrollTop=Math.max(0,t)),A(t)}};return M},p=e=>{o(`UiVirtualizer`,()=>f(e))(e)},m=new WeakSet,h=e=>{m.has(e)||(m.add(e),p(e))};export{f as n,h as t};
2
- //# sourceMappingURL=entry.generated-B2rTvkxi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entry.generated-B2rTvkxi.js","names":[],"sources":["../../../../../../../../client/src/components/virtualizer/contract.ts","../../../../../../../../client/src/components/virtualizer/index.ts","../../../../../../../../client/src/components/virtualizer/entry.generated.ts"],"sourcesContent":["import {bool, number, oneOf, string, type SchemaToProps} from '../../runtime';\n\nconst VIRTUALIZER_AXES = ['vertical'] as const;\ntype VirtualizerAxis = typeof VIRTUALIZER_AXES[number];\n\nconst virtualizerSchema = {\n fetchUrl: string,\n totalItems: number.min(0).default(0),\n itemSize: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n axis: oneOf(VIRTUALIZER_AXES, 'vertical' as VirtualizerAxis),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n windowParam: string.default('window'),\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 scrollArea: bool.default(true),\n fill: bool.default(true),\n class: string,\n scrollAreaClass: string,\n viewportClass: string,\n spacerClass: string,\n blockClass: string,\n};\n\ntype VirtualizerProps = SchemaToProps<typeof virtualizerSchema>;\n\nexport {VIRTUALIZER_AXES, virtualizerSchema};\nexport type {VirtualizerAxis, VirtualizerProps};\n","import type Alpine from 'alpinejs';\n\nimport {\n createVirtualWindowController,\n defineAlpineData,\n defineProps,\n fixedAxisWindowAdapter,\n parseVirtualizerFragmentResponse,\n replaceFragmentChildren,\n type FixedAxisWindow,\n type PropState,\n type TrellisAlpineComponent,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from '@client/runtime';\nimport {virtualizerSchema} from './contract';\n\ntype ResetOptions = {scrollTop?: number};\ntype SetUrlOptions = {reset?: boolean};\n\n/** Public Alpine API for `ui.virtualizer`. @public */\ninterface UiVirtualizerApi {\n /** Scrolls a logical item into the requested vertical alignment. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replaces the known logical item count and reloads mounted ranges. */\n setTotalItems(count: number): void;\n /** Replaces the fragment endpoint and optionally resets to the top. */\n setUrl(url: string, options?: SetUrlOptions): void;\n /** Invalidates all blocks and reloads them around a scroll position. */\n reset(options?: ResetOptions): void;\n /** Reloads all blocks without changing the fragment endpoint. */\n reload(options?: ResetOptions): void;\n}\n\ntype VirtualizerData = UiVirtualizerApi & {\n props: PropState<typeof virtualizerSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {\n key: string;\n element: HTMLElement;\n};\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst UiVirtualizer = (AlpineInstance: Alpine.Alpine): TrellisAlpineComponent<VirtualizerData> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let blocks: BlockRecord[] = [];\n let totalItems = 0;\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let scrollFrame = 0;\n let loading = 0;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let suppressPropReload = false;\n const aborters = new Map<string, AbortController>();\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 syncState = (): void => {\n if (!root || !spacer) return;\n root.toggleAttribute('data-loading', loading > 0);\n root.toggleAttribute('data-empty', totalItems === 0);\n spacer.style.height = `${Math.max(totalItems * component.props.itemSize, component.props.itemSize)}px`;\n };\n const updateTotal = (next: number): void => {\n const normalized = integer(next);\n if (normalized === totalItems) return;\n totalItems = normalized;\n syncState();\n dispatch('ui:virtualizer-total-change', {totalItems});\n dispatch('ui:virtualizer-axis-total-change', {axis: 'y', total: totalItems, window: null});\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {\n y: {\n total: totalItems,\n itemSize: component.props.itemSize,\n viewportSize: component.props.bufferSize * component.props.itemSize,\n scrollOffset: start * component.props.itemSize,\n buffer: 0,\n },\n }});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalItems === 0) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalItems - 1) / size) * size;\n const starts = [center - size, center, center + size]\n .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('Vertical virtualizer requires a y 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 = (): void => {\n loading = Math.max(0, loading - 1);\n syncState();\n if (loading > 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 aborters.set(block.key, aborter);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {\n method: 'GET',\n headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n },\n signal: aborter.signal,\n });\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, 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 hadFocus = block.element.contains(document.activeElement);\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 (hadFocus) viewport?.focus({preventScroll: true});\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n block.element.style.height = `${axis.count * component.props.itemSize}px`;\n block.element.style.transform = `translateY(${axis.translateOffset}px)`;\n dispatch('ui:virtualizer-load', {block: block.key, window});\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, window, status: 0, error});\n } finally {\n if (aborters.get(block.key) === aborter) aborters.delete(block.key);\n settle();\n }\n };\n const reconcile = (scrollTop: number): void => {\n if (loading > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const signature = desired.map((window) => window.key).join(',');\n const logicalIndex = Math.min(\n Math.max(0, totalItems - 1),\n Math.floor(Math.max(0, scrollTop) / component.props.itemSize),\n );\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:virtualizer-window', {window: center});\n dispatch('ui:virtualizer-range', {\n start: axis.start,\n count: axis.count,\n end: axis.start + axis.count,\n window: center,\n });\n }\n if (!signature) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\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 aborters.forEach((aborter) => aborter.abort());\n aborters.clear();\n loading = 0;\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\n const component: TrellisAlpineComponent<VirtualizerData> = {\n props: null as unknown as PropState<typeof virtualizerSchema>,\n init(): void {\n root = this.$el;\n destroyed = false;\n this.props = defineProps({\n el: root,\n schema: virtualizerSchema,\n onChange: (_state, changes) => {\n if (suppressPropReload) return;\n if (changes.some(({key}) => key === 'totalItems')) {\n updateTotal(this.props.totalItems);\n this.reload();\n } else if (changes.some(({key}) => ['fetchUrl', 'itemSize', 'bufferSize'].includes(key))) {\n this.reload();\n }\n },\n });\n totalItems = integer(this.props.totalItems);\n viewport = root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]') ?? root;\n spacer = root.querySelector<HTMLElement>('[data-ui-virtualizer-spacer]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-virtualizer-block]'))\n .slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!spacer || blocks.length !== 3) throw new Error('Virtualizer requires one spacer and three block containers.');\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\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 viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: 0,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index: this.props.initialIndex});\n syncState();\n reconcile(viewport.scrollTop);\n },\n destroy(): void {\n destroyed = true;\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n listenerAborter?.abort();\n listenerAborter = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n spacer = null;\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (!viewport) return;\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: viewport.scrollTop,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index, align});\n reconcile(viewport.scrollTop);\n },\n setTotalItems(count): void {\n updateTotal(count);\n const scrollTop = viewport?.scrollTop;\n this.reload(scrollTop === undefined ? {} : {scrollTop});\n },\n setUrl(url, options = {}): void {\n suppressPropReload = true;\n this.props.fetchUrl = String(url);\n suppressPropReload = false;\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n reset(options = {}): void {\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n const scrollTop = options.scrollTop ?? viewport?.scrollTop ?? 0;\n invalidate();\n if (viewport) viewport.scrollTop = Math.max(0, scrollTop);\n reconcile(scrollTop);\n },\n };\n return component;\n};\n\nconst registerVirtualizer = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiVirtualizer', () => UiVirtualizer(AlpineInstance))(AlpineInstance);\n};\n\nexport {registerVirtualizer, UiVirtualizer};\nexport type {\n ResetOptions,\n SetUrlOptions,\n UiVirtualizerApi,\n VirtualizerData,\n VirtualScrollAlign,\n};\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';\n\nimport {registerVirtualizer as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerVirtualizer = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n\n registerComponent(AlpineInstance);\n};\n\nexport {registerVirtualizer};\nexport default registerVirtualizer;\nexport * from './index';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{f as e,l as t,n,t as r}from"./codecs-Cb1ns_47.js";import{o as i,s as a,t as o}from"./dom-qAeVl7dc.js";import{t as s}from"./alpine-machine-BS13dbK4.js";import{t as c}from"./alpine-data-CytyCyfk.js";import{n as l,t as u}from"./styles-TfvwVPGw.js";import{t as d}from"./machine-Dqut4h89.js";import{n as f,t as p}from"./props-change-2xfsIAEN.js";import{n as m,r as h}from"./form-control-BkVb2Qed.js";import{L as g,M as _,N as v,P as y,b,o as x,s as ee,v as te,y as S}from"./common-Dfj6NCjU.js";import{i as C,n as w,r as T}from"./styles-CpTCQjY5.js";var E=y,D=[`default`,`cards`,`pills`,`menu`],O=te,k=x,A=[`default`,`cards`,`pills`,`menu`],j=g,M=S,ne={name:e,value:r(e,`prop-value`),orientation:t(E,`vertical`),variant:t(D,`default`),color:t(j,`neutral`),interaction:t(M,`tonal`),indicator:n.default(!0),placement:t(O,`leading`),disabled:r(n,`prop-disabled`),required:r(n,`prop-required`),invalid:r(n,`prop-invalid`),loop:n.default(!0),class:e},re={value:e,name:e,label:e,description:e,checked:r(n,`prop-checked`),disabled:r(n,`prop-disabled`),required:r(n,`prop-required`),invalid:r(n,`prop-invalid`),indicator:n.default(!0),placement:t(O,`leading`),icon:e,variant:t(A,`default`),color:t(j,`neutral`),interaction:t(M,`tonal`),size:t(k,`md`),inputClass:e,indicatorClass:e,iconClass:e,contentClass:e,labelClass:e,descriptionClass:e,class:e};t(k,`md`);var N=[],P=[],F=e=>typeof e.value==`string`?e.value:``,I=e=>{let t=e.item;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.id!=`string`||typeof n.value!=`string`?null:{id:n.id,value:n.value,disabled:n.disabled===!0,checked:n.checked===!0}},L=e=>{let{context:t,event:n}=e;if(e.props.disabled)return!1;let r=F(n);return r?t.collection.items.some(e=>e.value===r&&!e.disabled):!e.props.required},R=e=>({event:t})=>!!F(t)===e,z=({event:e})=>p(e,`value`),B=e=>{let t=f(e.event)?.props;return!z(e)||!t?e.context.selection.value:t.value||e.context.collection.items.find(e=>e.checked)?.value||``},V=e=>t=>z(t)&&!!B(t)===e,H=e=>({context:{...e.context,selection:{value:F(e.event)}}}),U=e=>{let t=f(e.event)?.props;if(t)return{props:t,context:z(e)?{...e.context,selection:{value:B(e)}}:e.context}},W=e=>{let t=I(e.event);if(!t)return;let n=[...e.context.collection.items.filter(e=>e.id!==t.id),t];if(n.some(e=>e.id!==t.id&&e.value&&e.value===t.value))throw Error(`Radio group values must be unique: ${t.value}`);return{context:{selection:{value:e.props.value||e.context.selection.value||(t.checked?t.value:``)},collection:{items:n}}}},G=e=>{let t=typeof e.event.id==`string`?e.event.id:``,n=e.context.collection.items.find(e=>e.id===t),r=e.context.collection.items.filter(e=>e.id!==t);return{context:{selection:{value:n?.value===e.context.selection.value?``:e.context.selection.value},collection:{items:r}}}},K=e=>{let t=I(e.event);if(!t)return;let n=e.context.collection.items.find(e=>e.id===t.id),r=e.context.collection.items.map(e=>e.id===t.id?t:e);if(r.some(e=>e.id!==t.id&&e.value&&e.value===t.value))throw Error(`Radio group values must be unique: ${t.value}`);let i=e.context.selection.value;return!e.props.value&&t.checked?i=t.value:!e.props.value&&n?.checked&&!t.checked&&n.value===i?i=``:n?.value===i&&t.value!==n.value&&(i=t.value),{context:{selection:{value:i},collection:{items:r}}}},q=({props:e,effects:t})=>d({initial:e.value?`selected`:`empty`,on:{NATIVE_SELECTED:{target:`selected`,guard:L,reduce:`select`,effects:`sync`},SET_VALUE:[{target:`selected`,guard:e=>L(e)&&R(!0)(e),reduce:`select`,effects:[`sync`,`emitInput`,`emitChange`]},{target:`empty`,guard:e=>L(e)&&R(!1)(e),reduce:`select`,effects:`sync`}],NAVIGATE:{target:`selected`,guard:L,reduce:`select`,effects:[`sync`,`emitInput`,`emitChange`,`focus`]},ITEM_REGISTERED:{reduce:`registerItem`,effects:`sync`},ITEM_UPDATED:{reduce:`updateItem`,effects:`sync`},ITEM_UNREGISTERED:{reduce:`unregisterItem`,effects:`sync`},PROPS_CHANGED:[{target:`selected`,guard:V(!0),reduce:`reconcileProps`,effects:`sync`},{target:`empty`,guard:V(!1),reduce:`reconcileProps`,effects:`sync`},{reduce:`reconcileProps`,effects:`sync`}]},states:{empty:{tags:[`empty`]},selected:{tags:[`selected`]}}},{context:{selection:{value:e.value},collection:{items:[]}},props:e,reducers:{select:H,reconcileProps:U,registerItem:W,unregisterItem:G,updateItem:K},effects:t}),J=({props:e,effects:t})=>d({initial:`ready`,states:{ready:{on:{NATIVE_SELECTED:{reduce:`select`,effects:`sync`},PROPS_CHANGED:{reduce:`reconcileProps`,effects:`sync`}}}}},{context:{checked:e.checked},props:e,reducers:{select:e=>({context:{...e.context,checked:!0}}),reconcileProps:e=>{let t=f(e.event);if(!t)return;let n=t.changes.some(({key:e})=>e===`checked`);return{props:t.props,context:n?{...e.context,checked:t.props.checked}:e.context}}},effects:t}),Y=u({definition:{component:`ui.radio`,parts:{group:{base:`w-full min-w-0`,variants:{orientation:{vertical:``,horizontal:``},variant:{default:``,cards:``,pills:``,menu:`contents`}},compounds:[{when:{variant:`default`,orientation:`vertical`},class:`grid gap-2`},{when:{variant:`default`,orientation:`horizontal`},class:`flex flex-wrap items-start gap-3`},{when:{variant:`cards`,orientation:`vertical`},class:`grid gap-3`},{when:{variant:`cards`,orientation:`horizontal`},class:`flex flex-wrap items-stretch gap-3`},{when:{variant:`pills`,orientation:`vertical`},class:`inline-grid gap-2`},{when:{variant:`pills`,orientation:`horizontal`},class:`flex flex-wrap items-center gap-2`}],defaults:{orientation:`vertical`,variant:`default`}},radio:{base:[`relative flex min-w-0 cursor-pointer items-start gap-2 rounded-control-md outline-none`,`text-inherit`],variants:{variant:{default:[`w-full py-0.5`,b],cards:`w-auto flex-1 cursor-pointer items-start gap-3`,pills:[w,C.soft,T.md,`w-auto flex-none rounded-full`],menu:[v,`!items-center`]},size:ee},defaults:{variant:`default`,size:`md`}},input:{base:`sr-only`},indicator:{base:[`mt-0.5 flex shrink-0 items-center justify-center rounded-full border-0`],variants:{variant:{default:``,cards:``,pills:``,menu:`order-10 !mt-0 ml-auto`},size:{xs:`size-radio-indicator-xs`,sm:`size-radio-indicator-sm`,md:`size-radio-indicator-md`,lg:`size-radio-indicator-lg`,xlg:`size-radio-indicator-xlg`}},defaults:{variant:`default`,size:`md`}},indicatorDot:{base:`rounded-full bg-current opacity-0 data-checked:opacity-100`,variants:{size:{xs:`size-radio-dot-xs`,sm:`size-radio-dot-sm`,md:`size-radio-dot-md`,lg:`size-radio-dot-lg`,xlg:`size-radio-dot-xlg`}},defaults:{size:`md`}},menuIndicator:{base:[`order-10 flex`,_]},menuIndicatorIcon:{base:`size-icon shrink-0 fill-current`},content:{base:`grid min-w-0 gap-0.5`},icon:{base:`mt-0.5 size-icon shrink-0 fill-current text-current opacity-75`},label:{base:``},description:{base:`text-surface-ink-muted`}}}}),X=new WeakMap,ie=0,ae=e=>{let t=e.parentElement?.closest(`[data-ui-radio-group]`)??null;return t?X.get(t)??null:null},Z=()=>{let e=`ui-radio-${++ie}`,t=null,n=null,r=[],c=null,u=null,d=!1,f=()=>{if(!t)throw Error(`Radio has not been initialized.`);return t},p=()=>{if(!n)throw Error(`Radio requires a native radio input.`);return n},g=()=>y.getCommittedSnapshot(),_=()=>({id:e,value:g().props.value||p().value||``,disabled:g().props.disabled,checked:g().props.checked}),v=e=>{let t=g().props,n=p(),r=e?.checked??g().context.checked,o=t.name||e?.name||``,s=t.disabled||e?.disabled===!0,c=t.required||e?.required===!0,u=t.invalid||e?.invalid===!0,d=t.variant===`menu`||e?.variant===`menu`;n.checked=r,o||n.removeAttribute(`name`),h({input:n,state:{name:o,value:t.value,disabled:s,required:c,invalid:u}}),i({el:f(),attr:`data-state`,value:r?`checked`:`unchecked`}),a({el:f(),attr:`data-checked`,present:r}),m({el:f(),state:{disabled:s,required:c,invalid:u}}),a({el:n,attr:`data-checked`,present:r}),f().className=l({part:Y.parts.radio,props:{...t,variant:d?`menu`:t.variant},className:f().dataset.class}),a({el:f(),attr:`data-ui-menu-item`,present:d}),a({el:f(),attr:`data-ui-option-recipe`,present:d}),a({el:f(),attr:`data-keep-open`,present:d,value:`true`}),a({el:f(),attr:`data-selected`,present:d&&r}),d?(f().setAttribute(`role`,`menuitemradio`),f().setAttribute(`aria-checked`,r?`true`:`false`),f().tabIndex=-1,n.tabIndex=-1,n.setAttribute(`aria-hidden`,`true`)):(f().removeAttribute(`role`),f().removeAttribute(`aria-checked`),f().removeAttribute(`tabindex`),n.removeAttribute(`aria-hidden`));let _=f().querySelector(`[data-ui-radio-indicator]`);_&&(_.hidden=d,_.className=l({part:Y.parts.indicator,props:{...t,variant:d?`menu`:t.variant},className:_.dataset.class}),a({el:_,attr:`data-checked`,present:r}),a({el:_,attr:`data-disabled`,present:s}),a({el:_,attr:`data-invalid`,present:u}));let v=f().querySelector(`[data-ui-radio-indicator-dot]`);v&&a({el:v,attr:`data-checked`,present:r});let y=f().querySelector(`[data-ui-radio-menu-indicator]`);y&&(y.hidden=!d,a({el:y,attr:`data-selected`,present:r}))},y=s({schema:re,hooks:P,createMachine:({props:e})=>J({props:e,effects:{sync:()=>{c?.update(b),c||v()}}})}),b={record:_,input:p,sync:v,emit(e){d=!0;try{p().dispatchEvent(new Event(e,{bubbles:!0}))}finally{d=!1}},focus:()=>p().focus({preventScroll:!0})};return{...y,init(){if(t=this.$el,n=f().querySelector(`[data-ui-radio-input]`),!n)throw Error(`Radio requires a native radio input.`);y.connect(t,this.snapshot),c=ae(f()),c&&(u=c.register(b)),o({target:n,event:`change`,handler:()=>{d||!p().checked||(c?c.nativeSelected(b):y.send(`NATIVE_SELECTED`))},cleanup:r}),o({target:n,event:`keydown`,handler:e=>{if(!c||!(e instanceof KeyboardEvent))return;let t=e.key===`ArrowUp`||e.key===`ArrowLeft`,n=e.key===`ArrowDown`||e.key===`ArrowRight`;!t&&!n||(e.preventDefault(),c.navigate(b,t?-1:1))},cleanup:r}),c||v()},destroy(){u?.(),u=null,c=null,r.splice(0).reverse().forEach(e=>e()),y.disconnect(),t=null,n=null}}},Q=()=>{let e=null,t=new Map,n=()=>{if(!e)throw Error(`Radio group has not been initialized.`);return e},r=()=>l.getCommittedSnapshot(),o=()=>{let e=r(),o=e.props,s=e.context.selection.value;i({el:n(),attr:`data-orientation`,value:o.orientation}),i({el:n(),attr:`data-variant`,value:o.variant}),i({el:n(),attr:`data-placement`,value:o.placement}),i({el:n(),attr:`aria-orientation`,value:o.orientation}),a({el:n(),attr:`data-indicator`,present:!o.indicator,value:`false`}),i({el:n(),attr:`role`,value:o.variant===`menu`?`group`:`radiogroup`}),m({el:n(),state:o});let c=e.context.collection.items.filter(e=>!e.disabled)[0]?.id??``;e.context.collection.items.forEach(e=>{let n=t.get(e.id);if(!n)return;let r=e.value===s;n.sync({checked:r,name:o.name,disabled:o.disabled,required:o.required,invalid:o.invalid,variant:o.variant}),n.input().tabIndex=o.variant===`menu`||e.disabled?-1:r||!s&&e.id===c?0:-1})},c=(e,n)=>{let r=typeof n==`string`?n:e.context.selection.value,i=e.context.collection.items.find(e=>e.value===r);return i?t.get(i.id)??null:null},l=s({schema:ne,hooks:N,createMachine:({props:e})=>q({props:e,effects:{sync:o,emitInput:e=>c(e.snapshot,e.event.value)?.emit(`input`),emitChange:e=>c(e.snapshot,e.event.value)?.emit(`change`),focus:e=>c(e.snapshot,e.event.value)?.focus()}})}),u={register(e){let n=e.record();return t.set(n.id,e),l.send({type:`ITEM_REGISTERED`,item:n}),()=>{t.delete(n.id),l.send({type:`ITEM_UNREGISTERED`,id:n.id})}},update(e){l.send({type:`ITEM_UPDATED`,item:e.record()})},nativeSelected(e){l.send({type:`NATIVE_SELECTED`,value:e.record().value})},navigate(e,t){let n=l.getCommittedSnapshot(),r=n.context.collection.items.filter(e=>!e.disabled),i=r.findIndex(t=>t.id===e.record().id);if(i<0||r.length===0)return;let a=i+t;if(a<0||a>=r.length){if(!n.props.loop)return;a=a<0?r.length-1:0}let o=r[a];o&&l.send({type:`NAVIGATE`,value:o.value})}};return{...l,init(){e=this.$el,l.connect(e,this.snapshot),X.set(n(),u),o()},destroy(){X.delete(n()),t.clear(),l.disconnect(),e=null},get value(){return l.getCommittedSnapshot().context.selection.value},setValue(e){e!==l.getCommittedSnapshot().context.selection.value&&l.send({type:`SET_VALUE`,value:e})}}},oe=e=>{c(`UiRadio`,Z)(e),c(`UiRadioGroup`,Q)(e)},$=new WeakSet,se=e=>{$.has(e)||($.add(e),oe(e))};export{Z as n,Q as r,se as t};
2
- //# sourceMappingURL=entry.generated-B8aXTJK6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entry.generated-B8aXTJK6.js","names":[],"sources":["../../../../../../../../client/src/components/radio/contract.ts","../../../../../../../../client/src/components/radio/machine.ts","../../../../../../../../client/src/components/radio/styles.ts","../../../../../../../../client/src/components/radio/index.ts","../../../../../../../../client/src/components/radio/entry.generated.ts"],"sourcesContent":["import {attribute, bool, oneOf, string, type SchemaToProps} from '../../runtime';\nimport {\n CONTROL_SIZES,\n INDICATOR_PLACEMENTS,\n INTERACTION_TREATMENTS,\n ORIENTATIONS,\n SELECTION_COLORS,\n type ControlSize,\n type IndicatorPlacement,\n type Orientation,\n} from '../common';\n\nconst RADIO_GROUP_ORIENTATIONS = ORIENTATIONS;\nconst RADIO_GROUP_VARIANTS = ['default', 'cards', 'pills', 'menu'] as const;\nconst RADIO_PLACEMENTS = INDICATOR_PLACEMENTS;\nconst RADIO_SIZES = CONTROL_SIZES;\nconst RADIO_VARIANTS = ['default', 'cards', 'pills', 'menu'] as const;\nconst RADIO_COLORS = SELECTION_COLORS;\nconst RADIO_INTERACTIONS = INTERACTION_TREATMENTS;\n\ntype RadioGroupOrientation = Orientation;\ntype RadioGroupVariant = typeof RADIO_GROUP_VARIANTS[number];\ntype RadioPlacement = IndicatorPlacement;\ntype RadioSize = ControlSize;\ntype RadioVariant = typeof RADIO_VARIANTS[number];\ntype RadioColor = typeof RADIO_COLORS[number];\ntype RadioInteraction = typeof RADIO_INTERACTIONS[number];\n\nconst radioGroupSchema = {\n name: string,\n value: attribute(string, 'prop-value'),\n orientation: oneOf(RADIO_GROUP_ORIENTATIONS, 'vertical' as RadioGroupOrientation),\n variant: oneOf(RADIO_GROUP_VARIANTS, 'default' as RadioGroupVariant),\n color: oneOf(RADIO_COLORS, 'neutral' as RadioColor),\n interaction: oneOf(RADIO_INTERACTIONS, 'tonal' as RadioInteraction),\n indicator: bool.default(true),\n placement: oneOf(RADIO_PLACEMENTS, 'leading' as RadioPlacement),\n disabled: attribute(bool, 'prop-disabled'),\n required: attribute(bool, 'prop-required'),\n invalid: attribute(bool, 'prop-invalid'),\n loop: bool.default(true),\n class: string,\n};\n\nconst radioSchema = {\n value: string,\n name: string,\n label: string,\n description: string,\n checked: attribute(bool, 'prop-checked'),\n disabled: attribute(bool, 'prop-disabled'),\n required: attribute(bool, 'prop-required'),\n invalid: attribute(bool, 'prop-invalid'),\n indicator: bool.default(true),\n placement: oneOf(RADIO_PLACEMENTS, 'leading' as RadioPlacement),\n icon: string,\n variant: oneOf(RADIO_VARIANTS, 'default' as RadioVariant),\n color: oneOf(RADIO_COLORS, 'neutral' as RadioColor),\n interaction: oneOf(RADIO_INTERACTIONS, 'tonal' as RadioInteraction),\n size: oneOf(RADIO_SIZES, 'md' as RadioSize),\n inputClass: string,\n indicatorClass: string,\n iconClass: string,\n contentClass: string,\n labelClass: string,\n descriptionClass: string,\n class: string,\n};\n\nconst radioIndicatorSchema = {\n size: oneOf(RADIO_SIZES, 'md' as RadioSize),\n class: string,\n};\n\ntype RadioGroupProps = SchemaToProps<typeof radioGroupSchema>;\ntype RadioProps = SchemaToProps<typeof radioSchema>;\n\nexport {\n RADIO_GROUP_ORIENTATIONS,\n RADIO_GROUP_VARIANTS,\n RADIO_COLORS,\n RADIO_INTERACTIONS,\n RADIO_PLACEMENTS,\n RADIO_SIZES,\n RADIO_VARIANTS,\n radioGroupSchema,\n radioIndicatorSchema,\n radioSchema,\n};\nexport type {\n RadioColor,\n RadioGroupOrientation,\n RadioGroupProps,\n RadioGroupVariant,\n RadioInteraction,\n RadioPlacement,\n RadioProps,\n RadioSize,\n RadioVariant,\n};\n","import {createMachine, propsChanged, propsChangedEvent, type Machine, type MachineEventObject, type MachineScope} from '../../runtime/state-machine';\nimport type {RadioGroupProps, RadioProps} from './contract';\n\ntype RadioItemRecord = {id: string; value: string; disabled: boolean; checked: boolean};\ntype RadioGroupContext = {\n selection: {value: string};\n collection: {items: RadioItemRecord[]};\n};\ntype RadioItemContext = {checked: boolean};\n\ntype RadioGroupEffects = {\n sync(scope: MachineScope<RadioGroupContext, RadioGroupProps>): void;\n emitInput(scope: MachineScope<RadioGroupContext, RadioGroupProps>): void;\n emitChange(scope: MachineScope<RadioGroupContext, RadioGroupProps>): void;\n focus(scope: MachineScope<RadioGroupContext, RadioGroupProps>): void;\n};\ntype RadioItemEffects = {sync(scope: MachineScope<RadioItemContext, RadioProps>): void};\n\nconst radioGroupHooks = [] as const;\nconst radioItemHooks = [] as const;\nconst eventValue = (event: MachineEventObject): string => typeof event.value === 'string' ? event.value : '';\nconst eventItem = (event: MachineEventObject): RadioItemRecord | null => {\n const item = event.item;\n if (!item || typeof item !== 'object') return null;\n const candidate = item as Partial<RadioItemRecord>;\n if (typeof candidate.id !== 'string' || typeof candidate.value !== 'string') return null;\n return {\n id: candidate.id,\n value: candidate.value,\n disabled: candidate.disabled === true,\n checked: candidate.checked === true,\n };\n};\nconst isSelectable = (scope: MachineScope<RadioGroupContext, RadioGroupProps>): boolean => {\n const {context, event} = scope;\n if (scope.props.disabled) return false;\n const value = eventValue(event);\n if (!value) return !scope.props.required;\n return context.collection.items.some((item) => item.value === value && !item.disabled);\n};\nconst hasValue = (value: boolean) => ({event}: MachineScope<RadioGroupContext, RadioGroupProps>): boolean => (\n Boolean(eventValue(event)) === value\n);\nconst changedGroupValue = ({event}: MachineScope<RadioGroupContext, RadioGroupProps>): boolean => (\n propsChanged<RadioGroupProps>(event, 'value')\n);\nconst nextGroupSelection = (scope: MachineScope<RadioGroupContext, RadioGroupProps>): string => {\n const next = propsChangedEvent<RadioGroupProps>(scope.event)?.props;\n if (!changedGroupValue(scope) || !next) return scope.context.selection.value;\n return next.value || scope.context.collection.items.find((item) => item.checked)?.value || '';\n};\nconst nextGroupHasValue = (value: boolean) => (scope: MachineScope<RadioGroupContext, RadioGroupProps>): boolean => {\n return changedGroupValue(scope) && Boolean(nextGroupSelection(scope)) === value;\n};\n\nconst select = (scope: MachineScope<RadioGroupContext, RadioGroupProps>) => ({\n context: {...scope.context, selection: {value: eventValue(scope.event)}},\n});\nconst reconcileProps = (scope: MachineScope<RadioGroupContext, RadioGroupProps>) => {\n const next = propsChangedEvent<RadioGroupProps>(scope.event)?.props;\n if (!next) return;\n return {\n props: next,\n context: changedGroupValue(scope)\n ? {...scope.context, selection: {value: nextGroupSelection(scope)}}\n : scope.context,\n };\n};\nconst registerItem = (scope: MachineScope<RadioGroupContext, RadioGroupProps>) => {\n const item = eventItem(scope.event);\n if (!item) return;\n const items = [...scope.context.collection.items.filter((candidate) => candidate.id !== item.id), item];\n const duplicate = items.some((candidate) => candidate.id !== item.id && candidate.value && candidate.value === item.value);\n if (duplicate) throw new Error(`Radio group values must be unique: ${item.value}`);\n const selected = scope.props.value || scope.context.selection.value || (item.checked ? item.value : '');\n return {context: {selection: {value: selected}, collection: {items}}};\n};\nconst unregisterItem = (scope: MachineScope<RadioGroupContext, RadioGroupProps>) => {\n const id = typeof scope.event.id === 'string' ? scope.event.id : '';\n const removed = scope.context.collection.items.find((item) => item.id === id);\n const items = scope.context.collection.items.filter((item) => item.id !== id);\n const value = removed?.value === scope.context.selection.value ? '' : scope.context.selection.value;\n return {context: {selection: {value}, collection: {items}}};\n};\nconst updateItem = (scope: MachineScope<RadioGroupContext, RadioGroupProps>) => {\n const item = eventItem(scope.event);\n if (!item) return;\n const previous = scope.context.collection.items.find((candidate) => candidate.id === item.id);\n const items = scope.context.collection.items.map((candidate) => candidate.id === item.id ? item : candidate);\n const duplicate = items.some((candidate) => candidate.id !== item.id && candidate.value && candidate.value === item.value);\n if (duplicate) throw new Error(`Radio group values must be unique: ${item.value}`);\n let value = scope.context.selection.value;\n if (!scope.props.value && item.checked) value = item.value;\n else if (!scope.props.value && previous?.checked && !item.checked && previous.value === value) value = '';\n else if (previous?.value === value && item.value !== previous.value) value = item.value;\n return {context: {selection: {value}, collection: {items}}};\n};\n\nconst createRadioGroupMachine = ({props, effects}: {props: RadioGroupProps; effects: RadioGroupEffects}): Machine<RadioGroupContext, RadioGroupProps> => createMachine<RadioGroupContext, RadioGroupProps>({\n initial: props.value ? 'selected' : 'empty',\n on: {\n NATIVE_SELECTED: {target: 'selected', guard: isSelectable, reduce: 'select', effects: 'sync'},\n SET_VALUE: [\n {target: 'selected', guard: (scope) => isSelectable(scope) && hasValue(true)(scope), reduce: 'select', effects: ['sync', 'emitInput', 'emitChange']},\n {target: 'empty', guard: (scope) => isSelectable(scope) && hasValue(false)(scope), reduce: 'select', effects: 'sync'},\n ],\n NAVIGATE: {target: 'selected', guard: isSelectable, reduce: 'select', effects: ['sync', 'emitInput', 'emitChange', 'focus']},\n ITEM_REGISTERED: {reduce: 'registerItem', effects: 'sync'},\n ITEM_UPDATED: {reduce: 'updateItem', effects: 'sync'},\n ITEM_UNREGISTERED: {reduce: 'unregisterItem', effects: 'sync'},\n PROPS_CHANGED: [\n {target: 'selected', guard: nextGroupHasValue(true), reduce: 'reconcileProps', effects: 'sync'},\n {target: 'empty', guard: nextGroupHasValue(false), reduce: 'reconcileProps', effects: 'sync'},\n {reduce: 'reconcileProps', effects: 'sync'},\n ],\n },\n states: {empty: {tags: ['empty']}, selected: {tags: ['selected']}},\n}, {\n context: {selection: {value: props.value}, collection: {items: []}},\n props,\n reducers: {select, reconcileProps, registerItem, unregisterItem, updateItem},\n effects,\n});\n\nconst createRadioItemMachine = ({props, effects}: {props: RadioProps; effects: RadioItemEffects}): Machine<RadioItemContext, RadioProps> => createMachine<RadioItemContext, RadioProps>({\n initial: 'ready',\n states: {ready: {on: {\n NATIVE_SELECTED: {reduce: 'select', effects: 'sync'},\n PROPS_CHANGED: {reduce: 'reconcileProps', effects: 'sync'},\n }}},\n}, {\n context: {checked: props.checked},\n props,\n reducers: {\n select: (scope) => ({context: {...scope.context, checked: true}}),\n reconcileProps: (scope) => {\n const event = propsChangedEvent<RadioProps>(scope.event);\n if (!event) return;\n const checkedChanged = event.changes.some(({key}) => key === 'checked');\n return {\n props: event.props,\n context: checkedChanged ? {...scope.context, checked: event.props.checked} : scope.context,\n };\n },\n },\n effects,\n});\n\nexport {createRadioGroupMachine, createRadioItemMachine, radioGroupHooks, radioItemHooks};\nexport type {RadioGroupContext, RadioGroupEffects, RadioItemContext, RadioItemEffects, RadioItemRecord};\n","import {defineStyles} from '../../runtime';\nimport {BADGE_ROOT_BASE_CLASSES, BADGE_SIZE_CLASSES, BADGE_VARIANT_CLASSES} from '../badge/styles';\nimport {\n CONTROL_TYPOGRAPHY_CLASSES,\n INTERACTIVE_ITEM_CLASSES,\n OPTION_INDICATOR_CLASSES,\n OPTION_ITEM_CLASSES,\n} from '../common';\n\nconst radioStyles = defineStyles({definition: {\n component: 'ui.radio',\n parts: {\n group: {\n base: 'w-full min-w-0',\n variants: {\n orientation: {\n vertical: '',\n horizontal: '',\n },\n variant: {\n default: '',\n cards: '',\n pills: '',\n menu: 'contents',\n },\n },\n compounds: [\n {when: {variant: 'default', orientation: 'vertical'}, class: 'grid gap-2'},\n {when: {variant: 'default', orientation: 'horizontal'}, class: 'flex flex-wrap items-start gap-3'},\n {when: {variant: 'cards', orientation: 'vertical'}, class: 'grid gap-3'},\n {when: {variant: 'cards', orientation: 'horizontal'}, class: 'flex flex-wrap items-stretch gap-3'},\n {when: {variant: 'pills', orientation: 'vertical'}, class: 'inline-grid gap-2'},\n {when: {variant: 'pills', orientation: 'horizontal'}, class: 'flex flex-wrap items-center gap-2'},\n ],\n defaults: {\n orientation: 'vertical',\n variant: 'default',\n },\n },\n radio: {\n base: [\n 'relative flex min-w-0 cursor-pointer items-start gap-2 rounded-control-md outline-none',\n 'text-inherit',\n ],\n variants: {\n variant: {\n default: ['w-full py-0.5', INTERACTIVE_ITEM_CLASSES],\n cards: 'w-auto flex-1 cursor-pointer items-start gap-3',\n pills: [\n BADGE_ROOT_BASE_CLASSES,\n BADGE_VARIANT_CLASSES.soft,\n BADGE_SIZE_CLASSES.md,\n 'w-auto flex-none rounded-full',\n ],\n menu: [OPTION_ITEM_CLASSES, '!items-center'],\n },\n size: CONTROL_TYPOGRAPHY_CLASSES,\n },\n defaults: {\n variant: 'default',\n size: 'md',\n },\n },\n input: {\n base: 'sr-only',\n },\n indicator: {\n base: [\n 'mt-0.5 flex shrink-0 items-center justify-center rounded-full border-0',\n ],\n variants: {\n variant: {\n default: '',\n cards: '',\n pills: '',\n menu: 'order-10 !mt-0 ml-auto',\n },\n size: {\n xs: 'size-radio-indicator-xs',\n sm: 'size-radio-indicator-sm',\n md: 'size-radio-indicator-md',\n lg: 'size-radio-indicator-lg',\n xlg: 'size-radio-indicator-xlg',\n },\n },\n defaults: {\n variant: 'default',\n size: 'md',\n },\n },\n indicatorDot: {\n base: 'rounded-full bg-current opacity-0 data-checked:opacity-100',\n variants: {\n size: {\n xs: 'size-radio-dot-xs',\n sm: 'size-radio-dot-sm',\n md: 'size-radio-dot-md',\n lg: 'size-radio-dot-lg',\n xlg: 'size-radio-dot-xlg',\n },\n },\n defaults: {\n size: 'md',\n },\n },\n menuIndicator: {\n base: ['order-10 flex', OPTION_INDICATOR_CLASSES],\n },\n menuIndicatorIcon: {\n base: 'size-icon shrink-0 fill-current',\n },\n content: {\n base: 'grid min-w-0 gap-0.5',\n },\n icon: {\n base: 'mt-0.5 size-icon shrink-0 fill-current text-current opacity-75',\n },\n label: {\n base: '',\n },\n description: {\n base: 'text-surface-ink-muted',\n },\n },\n}});\n\nexport {radioStyles};\n","import type Alpine from 'alpinejs';\n\nimport {type AlpineMachine, createAlpineMachine, defineAlpineData, type MachineSnapshot, type TrellisAlpineComponent} from '@client/runtime';\nimport {syncControlPresence, syncNativeControl} from '@client/runtime/form-control';\nimport {resolveStyle} from '@client/runtime/styles';\nimport {addListener, setAttribute, setPresence, type CleanupStack} from '@client/utils';\nimport {radioGroupSchema, radioSchema, type RadioGroupProps, type RadioProps} from './contract';\nimport {\n createRadioGroupMachine,\n createRadioItemMachine,\n radioGroupHooks,\n radioItemHooks,\n type RadioGroupContext,\n type RadioItemContext,\n type RadioItemRecord,\n} from './machine';\nimport {radioStyles} from './styles';\n\n/** Public Alpine API for `ui.radio.group`. @public */\ninterface UiRadioGroupApi {\n /** Current selected value, or an empty string when the group has no selection. */\n readonly value: string;\n /** Select a registered enabled value, or clear an optional group with an empty string. */\n setValue(value: string): void;\n}\n\ntype RadioGroupData = AlpineMachine<RadioGroupContext, RadioGroupProps, typeof radioGroupHooks> & UiRadioGroupApi & {\n init(): void;\n destroy(): void;\n};\ntype RadioData = AlpineMachine<RadioItemContext, RadioProps, typeof radioItemHooks> & {\n init(): void;\n destroy(): void;\n};\n\ntype ItemDomState = {\n checked: boolean;\n name: string;\n disabled: boolean;\n required: boolean;\n invalid: boolean;\n variant: RadioGroupProps['variant'];\n};\ntype RadioItemOwner = {\n record(): RadioItemRecord;\n input(): HTMLInputElement;\n sync(state: ItemDomState): void;\n emit(type: 'input' | 'change'): void;\n focus(): void;\n};\ntype RadioGroupOwner = {\n register(item: RadioItemOwner): () => void;\n update(item: RadioItemOwner): void;\n nativeSelected(item: RadioItemOwner): void;\n navigate(item: RadioItemOwner, delta: 1 | -1): void;\n};\n\nconst groupOwners = new WeakMap<HTMLElement, RadioGroupOwner>();\nlet radioItemId = 0;\n\nconst closestGroupOwner = (element: HTMLElement): RadioGroupOwner | null => {\n const group = element.parentElement?.closest<HTMLElement>('[data-ui-radio-group]') ?? null;\n return group ? groupOwners.get(group) ?? null : null;\n};\n\nconst UiRadio = (): TrellisAlpineComponent<RadioData> => {\n const id = `ui-radio-${++radioItemId}`;\n let rootEl: (HTMLElement & Alpine.ElementWithXAttributes) | null = null;\n let inputEl: HTMLInputElement | null = null;\n let listeners: CleanupStack = [];\n let group: RadioGroupOwner | null = null;\n let unregister: (() => void) | null = null;\n let dispatching = false;\n\n const root = (): HTMLElement => {\n if (!rootEl) throw new Error('Radio has not been initialized.');\n return rootEl;\n };\n const input = (): HTMLInputElement => {\n if (!inputEl) throw new Error('Radio requires a native radio input.');\n return inputEl;\n };\n const snapshot = (): MachineSnapshot<RadioItemContext, RadioProps> => bridge.getCommittedSnapshot();\n const record = (): RadioItemRecord => ({\n id,\n value: snapshot().props.value || input().value || '',\n disabled: snapshot().props.disabled,\n checked: snapshot().props.checked,\n });\n const applyState = (state?: ItemDomState): void => {\n const props = snapshot().props;\n const native = input();\n const checked = state?.checked ?? snapshot().context.checked;\n const name = props.name || state?.name || '';\n const disabled = props.disabled || state?.disabled === true;\n const required = props.required || state?.required === true;\n const invalid = props.invalid || state?.invalid === true;\n const menu = props.variant === 'menu' || state?.variant === 'menu';\n\n native.checked = checked;\n if (!name) native.removeAttribute('name');\n syncNativeControl({input: native, state: {name, value: props.value, disabled, required, invalid}});\n setAttribute({el: root(), attr: 'data-state', value: checked ? 'checked' : 'unchecked'});\n setPresence({el: root(), attr: 'data-checked', present: checked});\n syncControlPresence({el: root(), state: {disabled, required, invalid}});\n setPresence({el: native, attr: 'data-checked', present: checked});\n root().className = resolveStyle({\n part: radioStyles.parts.radio,\n props: {...props, variant: menu ? 'menu' : props.variant},\n className: root().dataset.class,\n });\n setPresence({el: root(), attr: 'data-ui-menu-item', present: menu});\n setPresence({el: root(), attr: 'data-ui-option-recipe', present: menu});\n setPresence({el: root(), attr: 'data-keep-open', present: menu, value: 'true'});\n setPresence({el: root(), attr: 'data-selected', present: menu && checked});\n if (menu) {\n root().setAttribute('role', 'menuitemradio');\n root().setAttribute('aria-checked', checked ? 'true' : 'false');\n root().tabIndex = -1;\n native.tabIndex = -1;\n native.setAttribute('aria-hidden', 'true');\n } else {\n root().removeAttribute('role');\n root().removeAttribute('aria-checked');\n root().removeAttribute('tabindex');\n native.removeAttribute('aria-hidden');\n }\n const indicator = root().querySelector<HTMLElement>('[data-ui-radio-indicator]');\n if (indicator) {\n indicator.hidden = menu;\n indicator.className = resolveStyle({\n part: radioStyles.parts.indicator,\n props: {...props, variant: menu ? 'menu' : props.variant},\n className: indicator.dataset.class,\n });\n setPresence({el: indicator, attr: 'data-checked', present: checked});\n setPresence({el: indicator, attr: 'data-disabled', present: disabled});\n setPresence({el: indicator, attr: 'data-invalid', present: invalid});\n }\n const dot = root().querySelector<HTMLElement>('[data-ui-radio-indicator-dot]');\n if (dot) setPresence({el: dot, attr: 'data-checked', present: checked});\n const menuIndicator = root().querySelector<HTMLElement>('[data-ui-radio-menu-indicator]');\n if (menuIndicator) {\n menuIndicator.hidden = !menu;\n setPresence({el: menuIndicator, attr: 'data-selected', present: checked});\n }\n };\n const bridge = createAlpineMachine({\n schema: radioSchema,\n hooks: radioItemHooks,\n createMachine: ({props}) => createRadioItemMachine({props, effects: {sync: () => {\n group?.update(owner);\n if (!group) applyState();\n }}}),\n });\n const owner: RadioItemOwner = {\n record,\n input,\n sync: applyState,\n emit(type): void {\n dispatching = true;\n try { input().dispatchEvent(new Event(type, {bubbles: true})); } finally { dispatching = false; }\n },\n focus: () => input().focus({preventScroll: true}),\n };\n\n return {\n ...bridge,\n init(): void {\n rootEl = this.$el;\n inputEl = root().querySelector<HTMLInputElement>('[data-ui-radio-input]');\n if (!inputEl) throw new Error('Radio requires a native radio input.');\n bridge.connect(rootEl, this.snapshot);\n group = closestGroupOwner(root());\n if (group) unregister = group.register(owner);\n addListener({target: inputEl, event: 'change', handler: () => {\n if (dispatching || !input().checked) return;\n if (group) group.nativeSelected(owner);\n else bridge.send('NATIVE_SELECTED');\n }, cleanup: listeners});\n addListener({target: inputEl, event: 'keydown', handler: (event) => {\n if (!group || !(event instanceof KeyboardEvent)) return;\n const previous = event.key === 'ArrowUp' || event.key === 'ArrowLeft';\n const next = event.key === 'ArrowDown' || event.key === 'ArrowRight';\n if (!previous && !next) return;\n event.preventDefault();\n group.navigate(owner, previous ? -1 : 1);\n }, cleanup: listeners});\n if (!group) applyState();\n },\n destroy(): void {\n unregister?.();\n unregister = null;\n group = null;\n listeners.splice(0).reverse().forEach((cleanup) => cleanup());\n bridge.disconnect();\n rootEl = null;\n inputEl = null;\n },\n };\n\n function standaloneState(): ItemDomState {\n const props = snapshot().props;\n return {checked: snapshot().context.checked, name: props.name, disabled: props.disabled, required: props.required, invalid: props.invalid, variant: props.variant};\n }\n};\n\nconst UiRadioGroup = (): TrellisAlpineComponent<RadioGroupData> => {\n let rootEl: (HTMLElement & Alpine.ElementWithXAttributes) | null = null;\n const members = new Map<string, RadioItemOwner>();\n\n const root = (): HTMLElement => {\n if (!rootEl) throw new Error('Radio group has not been initialized.');\n return rootEl;\n };\n const snapshot = (): MachineSnapshot<RadioGroupContext, RadioGroupProps> => bridge.getCommittedSnapshot();\n const syncDom = (): void => {\n const current = snapshot();\n const props = current.props;\n const selected = current.context.selection.value;\n setAttribute({el: root(), attr: 'data-orientation', value: props.orientation});\n setAttribute({el: root(), attr: 'data-variant', value: props.variant});\n setAttribute({el: root(), attr: 'data-placement', value: props.placement});\n setAttribute({el: root(), attr: 'aria-orientation', value: props.orientation});\n setPresence({el: root(), attr: 'data-indicator', present: !props.indicator, value: 'false'});\n setAttribute({el: root(), attr: 'role', value: props.variant === 'menu' ? 'group' : 'radiogroup'});\n syncControlPresence({el: root(), state: props});\n\n const enabled = current.context.collection.items.filter((item) => !item.disabled);\n const firstEnabled = enabled[0]?.id ?? '';\n current.context.collection.items.forEach((item) => {\n const owner = members.get(item.id);\n if (!owner) return;\n const checked = item.value === selected;\n owner.sync({\n checked,\n name: props.name,\n disabled: props.disabled,\n required: props.required,\n invalid: props.invalid,\n variant: props.variant,\n });\n owner.input().tabIndex = props.variant === 'menu'\n ? -1\n : item.disabled ? -1 : checked || (!selected && item.id === firstEnabled) ? 0 : -1;\n });\n };\n const eventOwner = (current: MachineSnapshot<RadioGroupContext, RadioGroupProps>, eventValue?: unknown): RadioItemOwner | null => {\n const value = typeof eventValue === 'string' ? eventValue : current.context.selection.value;\n const item = current.context.collection.items.find((candidate) => candidate.value === value);\n return item ? members.get(item.id) ?? null : null;\n };\n const bridge = createAlpineMachine({\n schema: radioGroupSchema,\n hooks: radioGroupHooks,\n createMachine: ({props}) => createRadioGroupMachine({props, effects: {\n sync: syncDom,\n emitInput: (scope) => eventOwner(scope.snapshot, scope.event.value)?.emit('input'),\n emitChange: (scope) => eventOwner(scope.snapshot, scope.event.value)?.emit('change'),\n focus: (scope) => eventOwner(scope.snapshot, scope.event.value)?.focus(),\n }}),\n });\n const owner: RadioGroupOwner = {\n register(item): () => void {\n const record = item.record();\n members.set(record.id, item);\n bridge.send({type: 'ITEM_REGISTERED', item: record});\n return () => {\n members.delete(record.id);\n bridge.send({type: 'ITEM_UNREGISTERED', id: record.id});\n };\n },\n update(item): void {\n bridge.send({type: 'ITEM_UPDATED', item: item.record()});\n },\n nativeSelected(item): void {\n bridge.send({type: 'NATIVE_SELECTED', value: item.record().value});\n },\n navigate(item, delta): void {\n const current = bridge.getCommittedSnapshot();\n const enabled = current.context.collection.items.filter((candidate) => !candidate.disabled);\n const index = enabled.findIndex((candidate) => candidate.id === item.record().id);\n if (index < 0 || enabled.length === 0) return;\n let next = index + delta;\n if (next < 0 || next >= enabled.length) {\n if (!current.props.loop) return;\n next = next < 0 ? enabled.length - 1 : 0;\n }\n const target = enabled[next];\n if (target) bridge.send({type: 'NAVIGATE', value: target.value});\n },\n };\n\n return {\n ...bridge,\n init(): void {\n rootEl = this.$el;\n bridge.connect(rootEl, this.snapshot);\n groupOwners.set(root(), owner);\n syncDom();\n },\n destroy(): void {\n groupOwners.delete(root());\n members.clear();\n bridge.disconnect();\n rootEl = null;\n },\n get value(): string {\n return bridge.getCommittedSnapshot().context.selection.value;\n },\n setValue(value: string): void {\n if (value === bridge.getCommittedSnapshot().context.selection.value) return;\n bridge.send({type: 'SET_VALUE', value});\n },\n };\n};\n\nconst registerRadio = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiRadio', UiRadio)(AlpineInstance);\n defineAlpineData('UiRadioGroup', UiRadioGroup)(AlpineInstance);\n};\n\nexport {registerRadio, UiRadio, UiRadioGroup};\nexport type {RadioData, RadioGroupData, UiRadioGroupApi};\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';\n\nimport {registerRadio as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerRadio = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n\n registerComponent(AlpineInstance);\n};\n\nexport {registerRadio};\nexport default registerRadio;\nexport * from './index';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{c as e}from"./motion-DT-Hq9qe.js";import{g as t}from"./ui-CfByjNaO.js";import{t as n}from"./capability-motion-DCacA4wj.js";import{f as r,l as i,n as a,o,u as s}from"./codecs-Cb1ns_47.js";import{r as c,t as l}from"./dom-qAeVl7dc.js";import{i as u,t as d}from"./alpine-machine-BS13dbK4.js";import{t as f}from"./alpine-data-CytyCyfk.js";import{n as p,t as m}from"./styles-TfvwVPGw.js";import{t as h}from"./merge-bindings-C8ewA_FD.js";import{t as g}from"./machine-Dqut4h89.js";import{t as ee}from"./dismissable-layer-BROE-Ln2.js";import{a as te,i as _,n as v,o as ne,t as y}from"./focus-scope-DtaPVNl5.js";import{n as b,t as re}from"./scroll-lock-DOw7dmi1.js";import{R as x,d as S,g as C,u as w}from"./common-Dfj6NCjU.js";import{t as T}from"./controlled-open-Hy4-OT-6.js";var E=[`modal`,`sheet`],D=w,O=[`sm`,`md`,`lg`,`xl`,`full`],k=x,A=S,j=C,M={name:r,open:a,mode:i(E,`modal`),side:i(D,`right`),size:i(O,`md`),surface:i(k,`1`),elevation:i(A,`5`),dismissible:a.default(!0),closable:a.default(!0),disabled:a,autofocusTitle:a,label:r,descriptionId:r,panelClass:r,overlayClass:r,class:r},N={name:r,disabled:a,class:r};r.default(`ui-modal-root`),i(j,`h2`),r.default(`Close`);var ie=[u({name:`opening`,state:`opening`,project:()=>({}),onDone:`OPENING_DONE`,onError:`OPENING_ERROR`}),u({name:`closing`,state:`closing`,project:()=>({}),onDone:`CLOSING_DONE`,onError:`CLOSING_ERROR`})],P=T(),ae=({props:e,effects:t})=>g({initial:`closed`,states:{closed:{tags:[`closed`],on:{OPEN:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},PROPS_CHANGED:[{target:`opening`,guard:P.shouldOpen,reduce:`replaceProps`,effects:[`syncProps`,`prepareOpen`]},{reduce:`replaceProps`,effects:`syncProps`}]}},opening:{tags:[`visible`,`interactive`,`transitioning`],on:{OPENING_DONE:{target:`open`,effects:`finishOpen`},OPENING_ERROR:{target:`open`,effects:`finishOpen`},CLOSE:{target:`closing`,effects:`prepareClose`},CANCEL:{target:`closing`,guard:`canDismiss`,effects:[`emitCancel`,`prepareClose`]},PROPS_CHANGED:[{target:`closing`,guard:P.shouldClose,reduce:`replaceProps`,effects:[`syncProps`,`prepareClose`]},{reduce:`replaceProps`,effects:`syncProps`}]}},open:{tags:[`visible`,`interactive`,`open`],on:{CLOSE:{target:`closing`,effects:`prepareClose`},CANCEL:{target:`closing`,guard:`canDismiss`,effects:[`emitCancel`,`prepareClose`]},PROPS_CHANGED:[{target:`closing`,guard:P.shouldClose,reduce:`replaceProps`,effects:[`syncProps`,`prepareClose`]},{reduce:`replaceProps`,effects:`syncProps`}]}},closing:{tags:[`visible`,`transitioning`],on:{CLOSING_DONE:{target:`closed`,effects:`finishClose`},CLOSING_ERROR:{target:`closed`,effects:`finishClose`},OPEN:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},PROPS_CHANGED:[{target:`opening`,guard:P.shouldOpen,reduce:`replaceProps`,effects:[`syncProps`,`prepareOpen`]},{reduce:`replaceProps`,effects:`syncProps`}]}}}},{context:{},props:e,reducers:{replaceProps:P.replace},guards:{canOpen:({props:e})=>!e.disabled,canDismiss:({props:e})=>e.dismissible},effects:{prepareOpen:t.prepareOpen,finishOpen:t.finishOpen,prepareClose:t.prepareClose,finishClose:t.finishClose,syncProps:t.syncProps,emitCancel:({event:e})=>{(e.reason===`escape`||e.reason===`outside`)&&t.emitCancel(e.reason)}}}),F=[`grid-rows-[auto_auto_minmax(0,1fr)_auto]`,`[&>[data-ui-modal-body]]:-mx-1 [&>[data-ui-modal-body]]:min-h-0 [&>[data-ui-modal-body]]:content-start`,`[&>[data-ui-modal-body]]:overflow-x-hidden [&>[data-ui-modal-body]]:overflow-y-auto [&>[data-ui-modal-body]]:px-1`,`[&>[data-ui-modal-footer]]:self-end`],I=m({definition:{component:`ui.modal`,parts:{instance:{base:`contents`},root:{base:[`fixed inset-0 z-dialog m-0 h-auto max-h-none w-auto max-w-none overflow-visible border-0 bg-transparent p-0 text-surface-ink`,`backdrop:bg-transparent`]},viewport:{base:`fixed inset-0 z-dialog flex min-h-dvh`,variants:{mode:{modal:`items-center justify-center overflow-y-auto p-4`,sheet:``},side:{top:``,right:``,bottom:``,left:``}},compounds:[{when:{mode:`sheet`,side:`top`},class:`items-start justify-center`},{when:{mode:`sheet`,side:`right`},class:`items-center justify-end overflow-hidden`},{when:{mode:`sheet`,side:`bottom`},class:`items-end justify-center`},{when:{mode:`sheet`,side:`left`},class:`items-center justify-start overflow-hidden`}],defaults:{mode:`modal`,side:`right`}},overlay:{base:`fixed inset-0 bg-scrim`},panel:{base:[`relative z-dialog grid w-full min-w-0 gap-4 overflow-auto p-5 outline-none`,`max-h-full`],variants:{mode:{modal:`rounded-overlay-md`,sheet:``},side:{top:``,right:``,bottom:``,left:``},size:{sm:`max-w-modal-sm`,md:`max-w-modal-md`,lg:`max-w-modal-lg`,xl:`max-w-modal-xl`,full:`max-w-full`}},compounds:[{when:{mode:`sheet`,side:`right`},class:[`min-h-dvh rounded-l-overlay-md`,F]},{when:{mode:`sheet`,side:`left`},class:[`min-h-dvh rounded-r-overlay-md`,F]},{when:{mode:`sheet`,side:`top`},class:`max-w-full rounded-b-overlay-md`},{when:{mode:`sheet`,side:`bottom`},class:`max-w-full rounded-t-overlay-md`}],defaults:{mode:`modal`,side:`right`,size:`md`}},trigger:{base:`contents`},outlet:{base:``},title:{base:`pr-8`},description:{base:`-mt-3 pr-8 text-surface-ink-muted`},body:{base:`grid min-w-0 gap-3 text-sm`},footer:{base:`flex min-w-0 items-center justify-end gap-2 pt-1`},close:{base:[`absolute right-3 top-3 inline-flex size-control-md items-center justify-center rounded-full border border-transparent text-surface-ink-muted outline-none`,`hover:bg-interaction-hover focus-visible:ui-focus-ring`]},closeIcon:{base:`size-icon fill-current`}}}}),L=new Set,R=new Set,z=e=>e?`open`:`closed`,B=e=>e===`opening`||e===`open`,V=e=>Array.from(L).find(t=>t.name===e)??null,H=(e,t)=>{e.setAttribute(`data-state`,z(t)),e.setAttribute(`aria-expanded`,t?`true`:`false`)},U=()=>{let n=null,r=``,i=null,a=!1,o=!1,u=!1,f=[],m=[],g=null,x=null,S=()=>{if(!n)throw Error(`Modal has not been initialized.`);return n},C=()=>{let e=S().querySelector(`[data-ui-modal]`);if(!(e instanceof HTMLDialogElement))throw Error(`Modal requires a dialog element.`);return e},w=()=>{let e=S().querySelector(`[data-ui-modal-viewport]`);if(!e)throw Error(`Modal requires a viewport element.`);return e},T=()=>{let e=S().querySelector(`[data-ui-modal-overlay]`);if(!e)throw Error(`Modal requires an overlay element.`);return e},E=()=>{let e=S().querySelector(`[data-ui-modal-panel]`);if(!e)throw Error(`Modal requires a panel element.`);return e},D=()=>S().querySelector(`[data-ui-modal-title]`),O=()=>S().querySelector(`[data-ui-modal-description]`),k=()=>{let e=P();C().className=p({part:I.parts.root,props:e,className:e.class}),w().className=p({part:I.parts.viewport,props:e}),T().className=p({part:I.parts.overlay,props:e,className:e.overlayClass}),E().className=p({part:I.parts.panel,props:e,className:e.panelClass})},A=()=>{let e=P(),t=g===e.mode&&e.open&&C().open&&J.matches(`open`);x?.update(k,{animate:t,key:`${e.mode}:${e.size}`}),g=e.mode},j=()=>Array.from(S().children).find(e=>e instanceof HTMLElement&&e.matches(`[data-ui-modal-trigger]`))??null,N=()=>_(E()),P=()=>J.getCommittedSnapshot().props,F=()=>J.matches(`opening`)||J.matches(`open`),V=(e,t)=>{if(H(e,F()),e.setAttribute(`aria-controls`,r),e.setAttribute(`data-ui-modal-trigger-target`,r),t||P().disabled){e.setAttribute(`aria-disabled`,`true`),e.setAttribute(`data-disabled`,``),e instanceof HTMLButtonElement&&(e.disabled=!0),e.matches(y)||(e.tabIndex=-1);return}e.removeAttribute(`aria-disabled`),e.removeAttribute(`data-disabled`),e instanceof HTMLButtonElement&&(e.disabled=!1),e.matches(y)||(e.tabIndex=0)},U=()=>{let e=j();e&&V(v(e),P().disabled),R.forEach(e=>e.sync())},W=()=>{let e=P(),t=C(),n=E(),i=D(),a=O();t.id=r,t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-modal`,`true`),n.id||=`${r}-panel`,n.tabIndex=-1,i?(i.id||=`${r}-title`,t.setAttribute(`aria-labelledby`,i.id),t.removeAttribute(`aria-label`),e.autofocusTitle?i.tabIndex=-1:i.removeAttribute(`tabindex`)):(t.removeAttribute(`aria-labelledby`),e.label?t.setAttribute(`aria-label`,e.label):t.removeAttribute(`aria-label`)),a&&(a.id||=`${r}-description`),e.descriptionId===`none`?t.removeAttribute(`aria-describedby`):e.descriptionId?t.setAttribute(`aria-describedby`,e.descriptionId):a?t.setAttribute(`aria-describedby`,a.id):t.removeAttribute(`aria-describedby`)},G=({syncOpen:e=!0}={})=>{let t=F(),n=z(t);e&&s({el:S(),schema:M,key:`open`,value:t}),[C(),w(),T(),E()].forEach(e=>{e.setAttribute(`data-state`,n)}),U()},K=()=>{let e=E().querySelector(`[autofocus]`);if(e&&te(e)){e.focus({preventScroll:!0});return}let t=D();if(P().autofocusTitle&&t){t.focus({preventScroll:!0});return}let n=N()[0];if(n){n.focus({preventScroll:!0});return}E().focus({preventScroll:!0})},q=()=>{!i||!document.contains(i)||i.focus({preventScroll:!0})},oe=e=>{J.hasTag(`interactive`)&&ne(e,E())},se=()=>{x?.refresh({animate:!1});let e=C();typeof e.showModal==`function`&&!a?(e.open&&e.removeAttribute(`open`),e.showModal(),a=!0):e.open||e.setAttribute(`open`,``),o||=(re(),!0),W(),G(),queueMicrotask(K)},ce=()=>{x?.refresh({animate:!1});let e=E();e.style.removeProperty(`transform`),e.style.removeProperty(`translate`),e.style.removeProperty(`scale`),e.style.removeProperty(`rotate`),g=P().mode,G(),c({el:C(),name:`ui:open`})},le=()=>{x?.refresh({animate:!1}),G()},ue=()=>{x?.refresh({animate:!1});let e=C();e.open&&e.close(),a=!1,o&&=(b(),!1),G(),g=null,q(),c({el:e,name:`ui:close`})},de=()=>{A(),W(),U()},J=d({schema:M,hooks:ie,createMachine:({props:e})=>ae({props:e,effects:{prepareOpen:se,finishOpen:ce,prepareClose:le,finishClose:ue,syncProps:de,emitCancel:e=>{c({el:C(),name:`ui:cancel`,detail:{reason:e}})}}})}),Y=e=>{P().disabled||(i=e,J.send(`OPEN`))},X=(e,t)=>{t?.preventDefault(),J.send({type:`CANCEL`,reason:e})},Z=()=>{m.forEach(e=>e()),m=[]},fe=e=>{let t=v(e);Z(),V(t,P().disabled),l({target:t,event:`click`,handler:()=>Y(t),cleanup:m}),l({target:t,event:`keydown`,handler:e=>{e instanceof KeyboardEvent&&(t instanceof HTMLButtonElement||t instanceof HTMLAnchorElement||e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),Y(t)))},cleanup:m})},pe=()=>{let e=C(),t=e.querySelector(`[data-ui-modal-trigger]`);!t||t.dataset.name||(S().insertBefore(t,e),fe(t))},me=()=>{let e=C();l({target:e,event:`cancel`,handler:t=>{t.target===e&&X(`escape`,t)},cleanup:f}),l({target:e,event:`close`,handler:()=>{J.hasTag(`visible`)&&J.send(`CLOSE`)},cleanup:f}),l({target:e,event:`keydown`,handler:e=>{e instanceof KeyboardEvent&&oe(e)},cleanup:f}),l({target:e,event:`click`,handler:e=>{let t=e.target;!(t instanceof Element)||!t.closest(`[data-ui-modal-close]`)||(e.preventDefault(),J.send(`CLOSE`))},cleanup:f}),l({target:document,event:`ui:modal-close`,handler:e=>{let t=e.detail;!t?.name||t.name!==P().name||J.send(`CLOSE`)},cleanup:f}),f.push(ee({isEnabled:()=>J.hasTag(`interactive`),roots:()=>[E(),i,j()],onDismiss:e=>X(`outside`,e)}))},Q,$={get name(){return P().name},get isOpen(){return J.matches(`open`)},get dialogId(){return r},openFrom:Y,close(e){e?.preventDefault(),J.send(`CLOSE`)},syncExternalTrigger:V};return Q={...J,get name(){return this.snapshot.current?.props.name??``},get isOpen(){return this.snapshot.current?.value===`open`},get isVisible(){return this.snapshot.current?.tags.includes(`visible`)??!1},get dialogId(){return r},init(){n=this.$el,J.connect(this.$el,this.snapshot);let i=P();k(),x=e(E(),{properties:[`height`,`maxWidth`]}),r=C().id||this.$id(`modal${i.name?`-${i.name}`:``}`),t(C(),`open`),W(),L.add($),u=!0,pe(),me(),G({syncOpen:!1}),i.open&&queueMicrotask(()=>J.send(`OPEN`))},destroy(){x?.destroy(),x=null,f.forEach(e=>e()),f=[],Z(),u&&=(L.delete($),!1),J.disconnect();let e=n?.querySelector(`[data-ui-modal]`);e?.open&&e.close(),o&&=(b(),!1),R.forEach(e=>e.sync()),n=null},get root(){return h({inputs:[p({part:I.parts.instance,props:{},className:``}),{"data-ui-modal-instance":``}]})},get dialog(){let e=this.snapshot,t=e.current?.props??P();return h({inputs:[p({part:I.parts.root,props:t,className:t.class}),{id:r,role:`dialog`,"aria-modal":`true`,":data-state":()=>z(B(e.current?.value)),":data-mode":()=>e.current?.props.mode,":data-side":()=>e.current?.props.side,":data-size":()=>e.current?.props.size}]})},get viewport(){let e=this.snapshot,t=e.current?.props??P();return h({inputs:[p({part:I.parts.viewport,props:t}),{":data-state":()=>z(B(e.current?.value)),":data-mode":()=>e.current?.props.mode,":data-side":()=>e.current?.props.side}]})},get overlay(){let e=this.snapshot,t=e.current?.props??P();return h({inputs:[p({part:I.parts.overlay,props:t,className:t.overlayClass}),{":data-state":()=>z(B(e.current?.value))}]})},get panel(){let e=this.snapshot,t=e.current?.props??P();return h({inputs:[p({part:I.parts.panel,props:t,className:t.panelClass}),{tabindex:-1,":data-state":()=>z(B(e.current?.value)),":data-mode":()=>e.current?.props.mode,":data-side":()=>e.current?.props.side,":data-size":()=>e.current?.props.size,":data-ui-surface":()=>e.current?.props.surface,":data-ui-elevation":()=>e.current?.props.elevation}]})},open(e){if(e?.preventDefault(),P().disabled)return;let t=j();t&&(i=v(t)),J.send(`OPEN`)},close(e){e?.preventDefault(),J.send(`CLOSE`)}},Q},W=()=>{let e=null,t=null,n=[],r=!1,i=()=>{if(!e)throw Error(`Modal trigger has not been initialized.`);return e},a=()=>{if(!t)throw Error(`Modal trigger has not been initialized.`);return t},s=()=>{let e=i().name;return e?V(e):null},c=()=>{let e=i(),t=a(),n=s();if(n){n.syncExternalTrigger(t,e.disabled);return}H(t,!1),e.disabled?(t.setAttribute(`aria-disabled`,`true`),t.setAttribute(`data-disabled`,``)):(t.removeAttribute(`aria-disabled`),t.removeAttribute(`data-disabled`))},u={get name(){return i().name},get target(){return a()},sync:c};return{init(){e=o({el:this.$el,schema:N,onChange:()=>{e?.name&&c()}}),t=v(this.$el),e.name&&(R.add(u),r=!0,c(),l({target:t,event:`click`,handler:e=>this.open(e),cleanup:n}),l({target:t,event:`keydown`,handler:e=>{e instanceof KeyboardEvent&&(t instanceof HTMLButtonElement||t instanceof HTMLAnchorElement||e.key!==`Enter`&&e.key!==` `||this.open(e))},cleanup:n}))},destroy(){e?.disconnect(),r&&R.delete(u),n.forEach(e=>e()),n=[],r=!1,e=null,t=null},get root(){let t=i();return h({inputs:[p({part:I.parts.trigger,props:{},className:t.class}),{"data-ui-modal-trigger":``,":data-name":()=>e?.name||void 0,":data-disabled":()=>e?.disabled?``:void 0}]})},open(e){e?.preventDefault(),!i().disabled&&s()?.openFrom(a())}}},G=e=>{f(`UiModal`,U)(e),f(`UiModalTrigger`,W)(e)},K=new WeakSet,q=e=>{K.has(e)||(K.add(e),n(e),G(e))};export{U as n,W as r,q as t};
2
- //# sourceMappingURL=entry.generated-BEjAV5NT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entry.generated-BEjAV5NT.js","names":[],"sources":["../../../../../../../../client/src/components/modal/contract.ts","../../../../../../../../client/src/components/modal/machine.ts","../../../../../../../../client/src/components/modal/styles.ts","../../../../../../../../client/src/components/modal/index.ts","../../../../../../../../client/src/components/modal/entry.generated.ts"],"sourcesContent":["import {bool, oneOf, string, type PropState, type SchemaToProps} from '../../runtime';\nimport {\n EDGE_POSITIONS,\n ELEVATION_REFERENCES,\n HEADING_LEVELS,\n SURFACE_REFERENCES,\n type EdgePosition,\n type ElevationReference,\n type HeadingLevel,\n type SurfaceReference,\n} from '../common';\n\nconst MODAL_MODES = ['modal', 'sheet'] as const;\nconst MODAL_SIDES = EDGE_POSITIONS;\nconst MODAL_SIZES = ['sm', 'md', 'lg', 'xl', 'full'] as const;\nconst MODAL_SURFACES = SURFACE_REFERENCES;\nconst MODAL_ELEVATIONS = ELEVATION_REFERENCES;\nconst MODAL_TITLE_AS_VALUES = HEADING_LEVELS;\n\ntype ModalMode = typeof MODAL_MODES[number];\ntype ModalSide = EdgePosition;\ntype ModalSize = typeof MODAL_SIZES[number];\ntype ModalSurface = SurfaceReference;\ntype ModalElevation = ElevationReference;\ntype ModalTitleAs = HeadingLevel;\n\nconst modalSchema = {\n name: string,\n open: bool,\n mode: oneOf(MODAL_MODES, 'modal'),\n side: oneOf(MODAL_SIDES, 'right'),\n size: oneOf(MODAL_SIZES, 'md'),\n surface: oneOf(MODAL_SURFACES, '1' as ModalSurface),\n elevation: oneOf(MODAL_ELEVATIONS, '5' as ModalElevation),\n dismissible: bool.default(true),\n closable: bool.default(true),\n disabled: bool,\n autofocusTitle: bool,\n label: string,\n descriptionId: string,\n panelClass: string,\n overlayClass: string,\n class: string,\n};\n\nconst modalTriggerSchema = {\n name: string,\n disabled: bool,\n class: string,\n};\n\nconst modalOutletSchema = {\n id: string.default('ui-modal-root'),\n class: string,\n};\n\nconst modalTitleSchema = {\n as: oneOf(MODAL_TITLE_AS_VALUES, 'h2'),\n class: string,\n};\n\nconst modalDescriptionSchema = {\n class: string,\n};\n\nconst modalBodySchema = {\n class: string,\n};\n\nconst modalFooterSchema = {\n class: string,\n};\n\nconst modalCloseSchema = {\n label: string.default('Close'),\n class: string,\n};\n\ntype ModalProps = SchemaToProps<typeof modalSchema>;\ntype ModalTriggerProps = PropState<typeof modalTriggerSchema>;\n\nexport {\n MODAL_SIDES,\n MODAL_SIZES,\n MODAL_ELEVATIONS,\n MODAL_SURFACES,\n MODAL_TITLE_AS_VALUES,\n MODAL_MODES,\n modalBodySchema,\n modalCloseSchema,\n modalDescriptionSchema,\n modalFooterSchema,\n modalOutletSchema,\n modalSchema,\n modalTitleSchema,\n modalTriggerSchema,\n};\nexport type {\n ModalSide,\n ModalProps,\n ModalSize,\n ModalSurface,\n ModalElevation,\n ModalTitleAs,\n ModalTriggerProps,\n ModalMode,\n};\n","import {\n createMachine,\n type Machine,\n} from '../../runtime/state-machine';\nimport {defineHook, type TransitionHookDefinition} from '../../runtime/transition-coordinator';\nimport {defineControlledOpenProps} from '../shared/controlled-open';\nimport type {ModalProps} from './contract';\n\ntype ModalContext = Record<string, never>;\n\ntype ModalMachineEffects = {\n prepareOpen(): void;\n finishOpen(): void;\n prepareClose(): void;\n finishClose(): void;\n syncProps(): void;\n emitCancel(reason: 'escape' | 'outside'): void;\n};\n\ntype CreateModalMachineOptions = {\n props: ModalProps;\n effects: ModalMachineEffects;\n};\n\nconst openingHook = defineHook({\n name: 'opening',\n state: 'opening',\n project: () => ({}),\n onDone: 'OPENING_DONE',\n onError: 'OPENING_ERROR',\n} satisfies TransitionHookDefinition<ModalContext, ModalProps, Record<string, never>, 'opening'>);\n\nconst closingHook = defineHook({\n name: 'closing',\n state: 'closing',\n project: () => ({}),\n onDone: 'CLOSING_DONE',\n onError: 'CLOSING_ERROR',\n} satisfies TransitionHookDefinition<ModalContext, ModalProps, Record<string, never>, 'closing'>);\n\nconst modalHooks = [openingHook, closingHook] as const;\nconst controlledOpenProps = defineControlledOpenProps<ModalContext, ModalProps>();\n\nconst createModalMachine = ({\n props,\n effects,\n}: CreateModalMachineOptions): Machine<ModalContext, ModalProps> => createMachine<ModalContext, ModalProps>({\n initial: 'closed',\n states: {\n closed: {\n tags: ['closed'],\n on: {\n OPEN: {target: 'opening', guard: 'canOpen', effects: 'prepareOpen'},\n PROPS_CHANGED: [\n {\n target: 'opening',\n guard: controlledOpenProps.shouldOpen,\n reduce: 'replaceProps',\n effects: ['syncProps', 'prepareOpen'],\n },\n {reduce: 'replaceProps', effects: 'syncProps'},\n ],\n },\n },\n opening: {\n tags: ['visible', 'interactive', 'transitioning'],\n on: {\n OPENING_DONE: {target: 'open', effects: 'finishOpen'},\n OPENING_ERROR: {target: 'open', effects: 'finishOpen'},\n CLOSE: {target: 'closing', effects: 'prepareClose'},\n CANCEL: {target: 'closing', guard: 'canDismiss', effects: ['emitCancel', 'prepareClose']},\n PROPS_CHANGED: [\n {\n target: 'closing',\n guard: controlledOpenProps.shouldClose,\n reduce: 'replaceProps',\n effects: ['syncProps', 'prepareClose'],\n },\n {reduce: 'replaceProps', effects: 'syncProps'},\n ],\n },\n },\n open: {\n tags: ['visible', 'interactive', 'open'],\n on: {\n CLOSE: {target: 'closing', effects: 'prepareClose'},\n CANCEL: {target: 'closing', guard: 'canDismiss', effects: ['emitCancel', 'prepareClose']},\n PROPS_CHANGED: [\n {\n target: 'closing',\n guard: controlledOpenProps.shouldClose,\n reduce: 'replaceProps',\n effects: ['syncProps', 'prepareClose'],\n },\n {reduce: 'replaceProps', effects: 'syncProps'},\n ],\n },\n },\n closing: {\n tags: ['visible', 'transitioning'],\n on: {\n CLOSING_DONE: {target: 'closed', effects: 'finishClose'},\n CLOSING_ERROR: {target: 'closed', effects: 'finishClose'},\n OPEN: {target: 'opening', guard: 'canOpen', effects: 'prepareOpen'},\n PROPS_CHANGED: [\n {\n target: 'opening',\n guard: controlledOpenProps.shouldOpen,\n reduce: 'replaceProps',\n effects: ['syncProps', 'prepareOpen'],\n },\n {reduce: 'replaceProps', effects: 'syncProps'},\n ],\n },\n },\n },\n}, {\n context: {},\n props,\n reducers: {\n replaceProps: controlledOpenProps.replace,\n },\n guards: {\n canOpen: ({props: currentProps}) => !currentProps.disabled,\n canDismiss: ({props: currentProps}) => currentProps.dismissible,\n },\n effects: {\n prepareOpen: effects.prepareOpen,\n finishOpen: effects.finishOpen,\n prepareClose: effects.prepareClose,\n finishClose: effects.finishClose,\n syncProps: effects.syncProps,\n emitCancel: ({event}) => {\n if (event.reason === 'escape' || event.reason === 'outside') effects.emitCancel(event.reason);\n },\n },\n});\n\nexport {createModalMachine, modalHooks};\nexport type {CreateModalMachineOptions, ModalContext, ModalMachineEffects};\n","import {defineStyles} from '../../runtime';\n\nconst EDGE_PANEL_LAYOUT_CLASSES = [\n 'grid-rows-[auto_auto_minmax(0,1fr)_auto]',\n '[&>[data-ui-modal-body]]:-mx-1 [&>[data-ui-modal-body]]:min-h-0 [&>[data-ui-modal-body]]:content-start',\n '[&>[data-ui-modal-body]]:overflow-x-hidden [&>[data-ui-modal-body]]:overflow-y-auto [&>[data-ui-modal-body]]:px-1',\n '[&>[data-ui-modal-footer]]:self-end',\n] as const;\n\nconst modalStyles = defineStyles({definition: {\n component: 'ui.modal',\n parts: {\n instance: {\n base: 'contents',\n },\n root: {\n base: [\n 'fixed inset-0 z-dialog m-0 h-auto max-h-none w-auto max-w-none overflow-visible border-0 bg-transparent p-0 text-surface-ink',\n 'backdrop:bg-transparent',\n ],\n },\n viewport: {\n base: 'fixed inset-0 z-dialog flex min-h-dvh',\n variants: {\n mode: {\n modal: 'items-center justify-center overflow-y-auto p-4',\n sheet: '',\n },\n side: {\n top: '',\n right: '',\n bottom: '',\n left: '',\n },\n },\n compounds: [\n {when: {mode: 'sheet', side: 'top'}, class: 'items-start justify-center'},\n {when: {mode: 'sheet', side: 'right'}, class: 'items-center justify-end overflow-hidden'},\n {when: {mode: 'sheet', side: 'bottom'}, class: 'items-end justify-center'},\n {when: {mode: 'sheet', side: 'left'}, class: 'items-center justify-start overflow-hidden'},\n ],\n defaults: {\n mode: 'modal',\n side: 'right',\n },\n },\n overlay: {\n base: 'fixed inset-0 bg-scrim',\n },\n panel: {\n base: [\n 'relative z-dialog grid w-full min-w-0 gap-4 overflow-auto p-5 outline-none',\n 'max-h-full',\n ],\n variants: {\n mode: {\n modal: 'rounded-overlay-md',\n sheet: '',\n },\n side: {\n top: '',\n right: '',\n bottom: '',\n left: '',\n },\n size: {\n sm: 'max-w-modal-sm',\n md: 'max-w-modal-md',\n lg: 'max-w-modal-lg',\n xl: 'max-w-modal-xl',\n full: 'max-w-full',\n },\n },\n compounds: [\n {when: {mode: 'sheet', side: 'right'}, class: ['min-h-dvh rounded-l-overlay-md', EDGE_PANEL_LAYOUT_CLASSES]},\n {when: {mode: 'sheet', side: 'left'}, class: ['min-h-dvh rounded-r-overlay-md', EDGE_PANEL_LAYOUT_CLASSES]},\n {when: {mode: 'sheet', side: 'top'}, class: 'max-w-full rounded-b-overlay-md'},\n {when: {mode: 'sheet', side: 'bottom'}, class: 'max-w-full rounded-t-overlay-md'},\n ],\n defaults: {\n mode: 'modal',\n side: 'right',\n size: 'md',\n },\n },\n trigger: {\n base: 'contents',\n },\n outlet: {\n base: '',\n },\n title: {\n base: 'pr-8',\n },\n description: {\n base: '-mt-3 pr-8 text-surface-ink-muted',\n },\n body: {\n base: 'grid min-w-0 gap-3 text-sm',\n },\n footer: {\n base: 'flex min-w-0 items-center justify-end gap-2 pt-1',\n },\n close: {\n base: [\n 'absolute right-3 top-3 inline-flex size-control-md items-center justify-center rounded-full border border-transparent text-surface-ink-muted outline-none',\n 'hover:bg-interaction-hover focus-visible:ui-focus-ring',\n ],\n },\n closeIcon: {\n base: 'size-icon fill-current',\n },\n },\n}});\n\nexport {modalStyles};\n","import type Alpine from 'alpinejs';\n\nimport {createBoundsMotion, type BoundsMotion} from '@client/motion';\nimport {\n type AlpineMachine,\n createAlpineMachine,\n defineAlpineData,\n reflectSchemaProp,\n type TransitionForHook,\n type TrellisAlpineComponent,\n} from '@client/runtime';\nimport {defineProps} from '@client/runtime/codecs';\nimport {addDismissableLayer} from '@client/runtime/dismissable-layer';\nimport {FOCUSABLE_SELECTOR, closestFocusable, focusableElements, isFocusable, trapFocus as trapFocusWithin} from '@client/runtime/focus-scope';\nimport {mergeBindings, type BindingObject} from '@client/runtime/merge-bindings';\nimport {declareMorphAttributes} from '@client/runtime/morph';\nimport {lockDocumentScroll, unlockDocumentScroll} from '@client/runtime/scroll-lock';\nimport {resolveStyle} from '@client/runtime/styles';\nimport {addListener, dispatch, type CleanupStack} from '@client/utils';\nimport {\n modalSchema,\n modalTriggerSchema,\n type ModalProps,\n type ModalTriggerProps,\n} from './contract';\nimport {createModalMachine, modalHooks, type ModalContext} from './machine';\nimport {modalStyles} from './styles';\n\ntype ModalTransitionName = (typeof modalHooks)[number]['name'];\ntype ModalTransition<TName extends ModalTransitionName = ModalTransitionName> = TransitionForHook<\n Extract<(typeof modalHooks)[number], {name: TName}>,\n HTMLElement\n>;\n\ntype CancelReason = 'escape' | 'outside';\n\ntype ModalCancelDetail = {\n reason: CancelReason;\n};\n\ntype ModalCloseEventDetail = {\n name?: string;\n};\n\ntype ModalController = {\n readonly name: string;\n readonly isOpen: boolean;\n readonly dialogId: string;\n openFrom(trigger: HTMLElement): void;\n close(event?: Event): void;\n syncExternalTrigger(trigger: HTMLElement, disabled: boolean): void;\n};\n\ntype ModalTriggerController = {\n readonly name: string;\n readonly target: HTMLElement;\n sync(): void;\n};\n\n/**\n * Public Alpine API for `ui.modal`.\n *\n * @public\n */\ninterface UiModalApi {\n /** Whether the modal has completed its opening transition. */\n readonly isOpen: boolean;\n\n /** Whether the modal is opening, open, or closing. */\n readonly isVisible: boolean;\n\n /** Opens the modal unless it is disabled. */\n open(event?: Event): void;\n\n /** Closes the modal. */\n close(event?: Event): void;\n}\n\n/**\n * Public Alpine API for `ui.modal.trigger`.\n *\n * @public\n */\ninterface UiModalTriggerApi {\n /** Opens the named modal unless the trigger or modal is disabled. */\n open(event?: Event): void;\n}\n\ntype ModalData = AlpineMachine<ModalContext, ModalProps, typeof modalHooks> & UiModalApi & {\n readonly name: string;\n readonly dialogId: string;\n readonly root: BindingObject;\n readonly dialog: BindingObject;\n readonly viewport: BindingObject;\n readonly overlay: BindingObject;\n readonly panel: BindingObject;\n init(): void;\n destroy(): void;\n};\n\ntype ModalTriggerData = UiModalTriggerApi & {\n readonly root: BindingObject;\n init(): void;\n destroy(): void;\n};\n\nconst modalControllers = new Set<ModalController>();\nconst modalTriggerControllers = new Set<ModalTriggerController>();\n\nconst stateFor = (open: boolean): 'open' | 'closed' => (open ? 'open' : 'closed');\nconst isExpandedState = (state: unknown): boolean => state === 'opening' || state === 'open';\n\nconst findNamedModal = (name: string): ModalController | null => (\n Array.from(modalControllers).find((controller) => controller.name === name) ?? null\n);\n\nconst setOpenAttributes = (el: HTMLElement, open: boolean): void => {\n el.setAttribute('data-state', stateFor(open));\n el.setAttribute('aria-expanded', open ? 'true' : 'false');\n};\n\nconst UiModal = (): TrellisAlpineComponent<ModalData> => {\n let rootEl: (HTMLElement & Alpine.ElementWithXAttributes) | null = null;\n let dialogId = '';\n let activeTrigger: HTMLElement | null = null;\n let didShowModal = false;\n let hasScrollLock = false;\n let isRegistered = false;\n let cleanup: CleanupStack = [];\n let localTriggerCleanup: CleanupStack = [];\n let settledMode: ModalProps['mode'] | null = null;\n let boundsMotion: BoundsMotion | null = null;\n\n const root = (): HTMLElement => {\n if (!rootEl) throw new Error('Modal has not been initialized.');\n return rootEl;\n };\n\n const dialogEl = (): HTMLDialogElement => {\n const dialog = root().querySelector<HTMLDialogElement>('[data-ui-modal]');\n if (!(dialog instanceof HTMLDialogElement)) throw new Error('Modal requires a dialog element.');\n return dialog;\n };\n\n const viewportEl = (): HTMLElement => {\n const viewport = root().querySelector<HTMLElement>('[data-ui-modal-viewport]');\n if (!viewport) throw new Error('Modal requires a viewport element.');\n return viewport;\n };\n\n const overlayEl = (): HTMLElement => {\n const overlay = root().querySelector<HTMLElement>('[data-ui-modal-overlay]');\n if (!overlay) throw new Error('Modal requires an overlay element.');\n return overlay;\n };\n\n const panelEl = (): HTMLElement => {\n const panel = root().querySelector<HTMLElement>('[data-ui-modal-panel]');\n if (!panel) throw new Error('Modal requires a panel element.');\n return panel;\n };\n\n const titleEl = (): HTMLElement | null => root().querySelector<HTMLElement>('[data-ui-modal-title]');\n const descriptionEl = (): HTMLElement | null => root().querySelector<HTMLElement>('[data-ui-modal-description]');\n\n const syncPresentation = (): void => {\n const props = currentProps();\n dialogEl().className = resolveStyle({part: modalStyles.parts.root, props, className: props.class});\n viewportEl().className = resolveStyle({part: modalStyles.parts.viewport, props});\n overlayEl().className = resolveStyle({\n part: modalStyles.parts.overlay,\n props,\n className: props.overlayClass,\n });\n panelEl().className = resolveStyle({\n part: modalStyles.parts.panel,\n props,\n className: props.panelClass,\n });\n };\n\n const syncPresentationWithBoundsMotion = (): void => {\n const props = currentProps();\n const shouldAnimate = (\n settledMode === props.mode\n && props.open\n && dialogEl().open\n && bridge.matches('open')\n );\n boundsMotion?.update(syncPresentation, {\n animate: shouldAnimate,\n key: `${props.mode}:${props.size}`,\n });\n settledMode = props.mode;\n };\n\n const localTriggerEl = (): HTMLElement | null => (\n Array.from(root().children)\n .find((child) => child instanceof HTMLElement && child.matches('[data-ui-modal-trigger]')) as HTMLElement | undefined\n ?? null\n );\n\n const focusableEls = (): HTMLElement[] => focusableElements(panelEl());\n\n const currentProps = (): Readonly<ModalProps> => bridge.getCommittedSnapshot().props;\n const isExpanded = (): boolean => bridge.matches('opening') || bridge.matches('open');\n\n const syncExternalTrigger = (trigger: HTMLElement, disabled: boolean): void => {\n const expanded = isExpanded();\n setOpenAttributes(trigger, expanded);\n trigger.setAttribute('aria-controls', dialogId);\n trigger.setAttribute('data-ui-modal-trigger-target', dialogId);\n\n if (disabled || currentProps().disabled) {\n trigger.setAttribute('aria-disabled', 'true');\n trigger.setAttribute('data-disabled', '');\n if (trigger instanceof HTMLButtonElement) trigger.disabled = true;\n if (!trigger.matches(FOCUSABLE_SELECTOR)) trigger.tabIndex = -1;\n return;\n }\n\n trigger.removeAttribute('aria-disabled');\n trigger.removeAttribute('data-disabled');\n if (trigger instanceof HTMLButtonElement) trigger.disabled = false;\n if (!trigger.matches(FOCUSABLE_SELECTOR)) trigger.tabIndex = 0;\n };\n\n const syncTriggers = (): void => {\n const local = localTriggerEl();\n if (local) syncExternalTrigger(closestFocusable(local), currentProps().disabled);\n modalTriggerControllers.forEach((trigger) => trigger.sync());\n };\n\n const syncAccessibility = (): void => {\n const props = currentProps();\n const dialog = dialogEl();\n const panel = panelEl();\n const title = titleEl();\n const description = descriptionEl();\n\n dialog.id = dialogId;\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n panel.id ||= `${dialogId}-panel`;\n panel.tabIndex = -1;\n\n if (title) {\n title.id ||= `${dialogId}-title`;\n dialog.setAttribute('aria-labelledby', title.id);\n dialog.removeAttribute('aria-label');\n if (props.autofocusTitle) title.tabIndex = -1;\n else title.removeAttribute('tabindex');\n } else {\n dialog.removeAttribute('aria-labelledby');\n if (props.label) dialog.setAttribute('aria-label', props.label);\n else dialog.removeAttribute('aria-label');\n }\n\n if (description) description.id ||= `${dialogId}-description`;\n if (props.descriptionId === 'none') dialog.removeAttribute('aria-describedby');\n else if (props.descriptionId) dialog.setAttribute('aria-describedby', props.descriptionId);\n else if (description) dialog.setAttribute('aria-describedby', description.id);\n else dialog.removeAttribute('aria-describedby');\n };\n\n const syncStateAttributes = ({syncOpen = true}: {syncOpen?: boolean} = {}): void => {\n const expanded = isExpanded();\n const state = stateFor(expanded);\n if (syncOpen) {\n reflectSchemaProp({el: root(), schema: modalSchema, key: 'open', value: expanded});\n }\n [dialogEl(), viewportEl(), overlayEl(), panelEl()].forEach((element) => {\n element.setAttribute('data-state', state);\n });\n syncTriggers();\n };\n\n const focusInitial = (): void => {\n const autofocus = panelEl().querySelector<HTMLElement>('[autofocus]');\n if (autofocus && isFocusable(autofocus)) {\n autofocus.focus({preventScroll: true});\n return;\n }\n\n const title = titleEl();\n if (currentProps().autofocusTitle && title) {\n title.focus({preventScroll: true});\n return;\n }\n\n const firstFocusable = focusableEls()[0];\n if (firstFocusable) {\n firstFocusable.focus({preventScroll: true});\n return;\n }\n\n panelEl().focus({preventScroll: true});\n };\n\n const restoreFocus = (): void => {\n if (!activeTrigger || !document.contains(activeTrigger)) return;\n activeTrigger.focus({preventScroll: true});\n };\n\n const trapFocus = (event: KeyboardEvent): void => {\n if (!bridge.hasTag('interactive')) return;\n trapFocusWithin(event, panelEl());\n };\n\n const prepareOpen = (): void => {\n boundsMotion?.refresh({animate: false});\n const dialog = dialogEl();\n if (typeof dialog.showModal === 'function' && !didShowModal) {\n if (dialog.open) dialog.removeAttribute('open');\n dialog.showModal();\n didShowModal = true;\n } else if (!dialog.open) {\n dialog.setAttribute('open', '');\n }\n\n if (!hasScrollLock) {\n lockDocumentScroll();\n hasScrollLock = true;\n }\n syncAccessibility();\n syncStateAttributes();\n queueMicrotask(focusInitial);\n };\n\n const finishOpen = (): void => {\n boundsMotion?.refresh({animate: false});\n const panel = panelEl();\n panel.style.removeProperty('transform');\n panel.style.removeProperty('translate');\n panel.style.removeProperty('scale');\n panel.style.removeProperty('rotate');\n settledMode = currentProps().mode;\n syncStateAttributes();\n dispatch({el: dialogEl(), name: 'ui:open'});\n };\n\n const prepareClose = (): void => {\n boundsMotion?.refresh({animate: false});\n syncStateAttributes();\n };\n\n const finishClose = (): void => {\n boundsMotion?.refresh({animate: false});\n const dialog = dialogEl();\n if (dialog.open) dialog.close();\n didShowModal = false;\n if (hasScrollLock) {\n unlockDocumentScroll();\n hasScrollLock = false;\n }\n syncStateAttributes();\n settledMode = null;\n restoreFocus();\n dispatch({el: dialog, name: 'ui:close'});\n };\n\n const syncProps = (): void => {\n syncPresentationWithBoundsMotion();\n syncAccessibility();\n syncTriggers();\n };\n\n const bridge = createAlpineMachine({\n schema: modalSchema,\n hooks: modalHooks,\n createMachine: ({props}) => createModalMachine({\n props,\n effects: {\n prepareOpen,\n finishOpen,\n prepareClose,\n finishClose,\n syncProps,\n emitCancel: (reason) => {\n dispatch<ModalCancelDetail>({el: dialogEl(), name: 'ui:cancel', detail: {reason}});\n },\n },\n }),\n });\n\n const openFrom = (trigger: HTMLElement): void => {\n if (currentProps().disabled) return;\n activeTrigger = trigger;\n bridge.send('OPEN');\n };\n\n const cancel = (reason: CancelReason, event?: Event): void => {\n event?.preventDefault();\n bridge.send({type: 'CANCEL', reason});\n };\n\n const teardownLocalTrigger = (): void => {\n localTriggerCleanup.forEach((dispose) => dispose());\n localTriggerCleanup = [];\n };\n\n const setupLocalTrigger = (trigger: HTMLElement): void => {\n const target = closestFocusable(trigger);\n teardownLocalTrigger();\n syncExternalTrigger(target, currentProps().disabled);\n addListener({target, event: 'click', handler: () => openFrom(target), cleanup: localTriggerCleanup});\n addListener({target, event: 'keydown', handler: (event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (target instanceof HTMLButtonElement || target instanceof HTMLAnchorElement) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n openFrom(target);\n }, cleanup: localTriggerCleanup});\n };\n\n const mountLocalTrigger = (): void => {\n const dialog = dialogEl();\n const inlineTrigger = dialog.querySelector<HTMLElement>('[data-ui-modal-trigger]');\n if (!inlineTrigger || inlineTrigger.dataset.name) return;\n root().insertBefore(inlineTrigger, dialog);\n setupLocalTrigger(inlineTrigger);\n };\n\n const setupEvents = (): void => {\n const dialog = dialogEl();\n addListener({target: dialog, event: 'cancel', handler: (event) => {\n if (event.target !== dialog) return;\n cancel('escape', event);\n }, cleanup});\n addListener({target: dialog, event: 'close', handler: () => {\n if (bridge.hasTag('visible')) bridge.send('CLOSE');\n }, cleanup});\n addListener({target: dialog, event: 'keydown', handler: (event) => {\n if (event instanceof KeyboardEvent) trapFocus(event);\n }, cleanup});\n addListener({target: dialog, event: 'click', handler: (event) => {\n const target = event.target;\n if (!(target instanceof Element) || !target.closest('[data-ui-modal-close]')) return;\n event.preventDefault();\n bridge.send('CLOSE');\n }, cleanup});\n addListener({target: document, event: 'ui:modal-close', handler: (event) => {\n const detail = (event as CustomEvent<ModalCloseEventDetail>).detail;\n if (!detail?.name || detail.name !== currentProps().name) return;\n bridge.send('CLOSE');\n }, cleanup});\n cleanup.push(addDismissableLayer({\n isEnabled: () => bridge.hasTag('interactive'),\n roots: () => [panelEl(), activeTrigger, localTriggerEl()],\n onDismiss: (event) => cancel('outside', event),\n }));\n };\n\n let component!: TrellisAlpineComponent<ModalData>;\n const controller: ModalController = {\n get name() {\n return currentProps().name;\n },\n get isOpen() {\n return bridge.matches('open');\n },\n get dialogId() {\n return dialogId;\n },\n openFrom,\n close(event?: Event) {\n event?.preventDefault();\n bridge.send('CLOSE');\n },\n syncExternalTrigger,\n };\n\n component = {\n ...bridge,\n get name(): string {\n return this.snapshot.current?.props.name ?? '';\n },\n get isOpen(): boolean {\n return this.snapshot.current?.value === 'open';\n },\n get isVisible(): boolean {\n return this.snapshot.current?.tags.includes('visible') ?? false;\n },\n get dialogId(): string {\n return dialogId;\n },\n init(): void {\n rootEl = this.$el;\n bridge.connect(this.$el, this.snapshot);\n const props = currentProps();\n syncPresentation();\n boundsMotion = createBoundsMotion(panelEl(), {properties: ['height', 'maxWidth']});\n dialogId = dialogEl().id || this.$id(`modal${props.name ? `-${props.name}` : ''}`);\n declareMorphAttributes(dialogEl(), 'open');\n syncAccessibility();\n modalControllers.add(controller);\n isRegistered = true;\n mountLocalTrigger();\n setupEvents();\n syncStateAttributes({syncOpen: false});\n if (props.open) queueMicrotask(() => bridge.send('OPEN'));\n },\n destroy(): void {\n boundsMotion?.destroy();\n boundsMotion = null;\n cleanup.forEach((dispose) => dispose());\n cleanup = [];\n teardownLocalTrigger();\n if (isRegistered) {\n modalControllers.delete(controller);\n isRegistered = false;\n }\n bridge.disconnect();\n const dialog = rootEl?.querySelector<HTMLDialogElement>('[data-ui-modal]');\n if (dialog?.open) dialog.close();\n if (hasScrollLock) {\n unlockDocumentScroll();\n hasScrollLock = false;\n }\n modalTriggerControllers.forEach((trigger) => trigger.sync());\n rootEl = null;\n },\n get root(): BindingObject {\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.instance, props: {}, className: ''}),\n {'data-ui-modal-instance': ''},\n ]});\n },\n get dialog(): BindingObject {\n const snapshot = this.snapshot;\n const props = snapshot.current?.props ?? currentProps();\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.root, props, className: props.class}),\n {\n id: dialogId,\n role: 'dialog',\n 'aria-modal': 'true',\n ':data-state': () => stateFor(isExpandedState(snapshot.current?.value)),\n ':data-mode': () => snapshot.current?.props.mode,\n ':data-side': () => snapshot.current?.props.side,\n ':data-size': () => snapshot.current?.props.size,\n },\n ]});\n },\n get viewport(): BindingObject {\n const snapshot = this.snapshot;\n const props = snapshot.current?.props ?? currentProps();\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.viewport, props}),\n {\n ':data-state': () => stateFor(isExpandedState(snapshot.current?.value)),\n ':data-mode': () => snapshot.current?.props.mode,\n ':data-side': () => snapshot.current?.props.side,\n },\n ]});\n },\n get overlay(): BindingObject {\n const snapshot = this.snapshot;\n const props = snapshot.current?.props ?? currentProps();\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.overlay, props, className: props.overlayClass}),\n {':data-state': () => stateFor(isExpandedState(snapshot.current?.value))},\n ]});\n },\n get panel(): BindingObject {\n const snapshot = this.snapshot;\n const props = snapshot.current?.props ?? currentProps();\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.panel, props, className: props.panelClass}),\n {\n tabindex: -1,\n ':data-state': () => stateFor(isExpandedState(snapshot.current?.value)),\n ':data-mode': () => snapshot.current?.props.mode,\n ':data-side': () => snapshot.current?.props.side,\n ':data-size': () => snapshot.current?.props.size,\n ':data-ui-surface': () => snapshot.current?.props.surface,\n ':data-ui-elevation': () => snapshot.current?.props.elevation,\n },\n ]});\n },\n open(event?: Event): void {\n event?.preventDefault();\n if (currentProps().disabled) return;\n const local = localTriggerEl();\n if (local) activeTrigger = closestFocusable(local);\n bridge.send('OPEN');\n },\n close(event?: Event): void {\n event?.preventDefault();\n bridge.send('CLOSE');\n },\n };\n\n return component;\n};\n\nconst UiModalTrigger = (): TrellisAlpineComponent<ModalTriggerData> => {\n let props: ModalTriggerProps | null = null;\n let target: HTMLElement | null = null;\n let cleanup: CleanupStack = [];\n let isRegistered = false;\n\n const currentProps = (): ModalTriggerProps => {\n if (!props) throw new Error('Modal trigger has not been initialized.');\n return props;\n };\n\n const targetEl = (): HTMLElement => {\n if (!target) throw new Error('Modal trigger has not been initialized.');\n return target;\n };\n\n const modal = (): ModalController | null => {\n const name = currentProps().name;\n return name ? findNamedModal(name) : null;\n };\n\n const sync = (): void => {\n const triggerProps = currentProps();\n const trigger = targetEl();\n const modalController = modal();\n if (modalController) {\n modalController.syncExternalTrigger(trigger, triggerProps.disabled);\n return;\n }\n\n setOpenAttributes(trigger, false);\n if (triggerProps.disabled) {\n trigger.setAttribute('aria-disabled', 'true');\n trigger.setAttribute('data-disabled', '');\n } else {\n trigger.removeAttribute('aria-disabled');\n trigger.removeAttribute('data-disabled');\n }\n };\n\n const controller: ModalTriggerController = {\n get name() {\n return currentProps().name;\n },\n get target() {\n return targetEl();\n },\n sync,\n };\n\n return {\n init(): void {\n props = defineProps({\n el: this.$el,\n schema: modalTriggerSchema,\n onChange: () => {\n if (props?.name) sync();\n },\n });\n target = closestFocusable(this.$el);\n if (!props.name) return;\n modalTriggerControllers.add(controller);\n isRegistered = true;\n sync();\n\n addListener({target, event: 'click', handler: (event) => this.open(event), cleanup});\n addListener({target, event: 'keydown', handler: (event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (target instanceof HTMLButtonElement || target instanceof HTMLAnchorElement) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n this.open(event);\n }, cleanup});\n },\n destroy(): void {\n props?.disconnect();\n if (isRegistered) modalTriggerControllers.delete(controller);\n cleanup.forEach((dispose) => dispose());\n cleanup = [];\n isRegistered = false;\n props = null;\n target = null;\n },\n get root(): BindingObject {\n const triggerProps = currentProps();\n return mergeBindings({inputs: [\n resolveStyle({part: modalStyles.parts.trigger, props: {}, className: triggerProps.class}),\n {\n 'data-ui-modal-trigger': '',\n ':data-name': () => props?.name || undefined,\n ':data-disabled': () => (props?.disabled ? '' : undefined),\n },\n ]});\n },\n open(event?: Event): void {\n event?.preventDefault();\n if (currentProps().disabled) return;\n modal()?.openFrom(targetEl());\n },\n };\n};\n\nconst registerModal = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiModal', UiModal)(AlpineInstance);\n defineAlpineData('UiModalTrigger', UiModalTrigger)(AlpineInstance);\n};\n\nexport {registerModal, UiModal, UiModalTrigger};\nexport type {ModalCancelDetail, ModalTransition, UiModalApi, UiModalTriggerApi};\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 {registerMotionCapability} from '../../capabilities/motion';\nimport {registerModal as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerModal = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerMotionCapability(AlpineInstance);\n registerComponent(AlpineInstance);\n};\n\nexport {registerModal};\nexport default registerModal;\nexport * from './index';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./capability-motion-DCacA4wj.js";import{c as t,f as n,l as r,n as i,o as a,s as o,u as s}from"./codecs-Cb1ns_47.js";import{t as c}from"./fragment-Bl3Rq38L.js";import{t as l}from"./alpine-data-CytyCyfk.js";import{n as u,r as d,t as f}from"./virtual-window-BHdOw3Pi.js";import{t as p}from"./drag-and-drop-DHq3udf7.js";import{t as m}from"./capability-sortable-BnB9Wz0E.js";import{L as h,y as g}from"./common-Dfj6NCjU.js";import{t as _}from"./capability-resizable-Bga8TngJ.js";var v=[`none`,`single`,`multiple`],y=[`compact`,`default`,`comfortable`],b=[`none`,`row`,`grid`],x=[`onChange`,`onEnd`],S=[``,`left`,`right`],C=[`none`,`ascending`,`descending`,`other`],w=[`start`,`center`,`end`],T={fetchUrl:n,totalRows:t.min(0).default(0),rowHeight:t.min(2**-52).default(36),bufferSize:t.min(1).default(50),overscan:t.min(0).default(0),initialIndex:t.min(0).default(0),startParam:n.default(`start`),countParam:n.default(`count`),totalParam:n.default(`total`),totalHeader:n.default(`X-Trellis-Total-Items`),assetsHeader:n.default(`X-Trellis-Assets`),metaSelector:n.default(`template[data-ui-virtualizer-meta]`),selection:r(v,`none`),selectionValue:o({mode:`ids`,ids:[]}),selectOnRowClick:i,rowKey:n.default(`id`),stickyHeader:i.default(!0),resizableColumns:i.default(!0),reorderableColumns:i.default(!0),sortableColumns:i.default(!0),minColumnWidth:t.min(0).default(60),defaultColumnWidth:t.min(2**-52).default(180),maxColumnWidth:o(null),resizeMode:r(x,`onChange`),color:r(h,`neutral`),interaction:r(g,`edge`),dragPreviewPosition:n.trim.default(`preserve`),density:r(y,`default`),border:r(b,`row`),empty:n.default(`No rows found.`),class:n,controlsClass:n,viewportClass:n,headerClass:n,rowClass:n,cellClass:n,footerClass:n,emptyClass:n};t.min(2**-52).default(180),t.min(0).default(60),o(null),r(S,``),r(C,`none`),i.default(!0),i.default(!0),r(w,`start`),o([]),o([]),t.min(0).default(0),n.default(`id`),n.default(`ui.data-grid.row`),n.default(`ui.data-grid.cell`),t.min(0).default(0),t.min(1).default(1),r(w,`start`);var 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:n},D=(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},O=(e,t,n)=>{if(!e.hasAttribute(t))return n;let r=e.getAttribute(t)??``;return r===``||[`true`,`1`,`yes`,`on`].includes(r.toLowerCase())},ee=(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,E(e,`data-min-width`,t.minWidth)),a=D(e,`data-max-width`,t.maxWidth),o=E(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`,u=[`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:O(e,`data-sortable`,!1),sort:l,resizable:O(e,`data-resizable`,t.resizable),reorderable:O(e,`data-reorderable`,t.reorderable),align:u,cellClass:e.dataset.cellClass??``,element:e}]})},te=e=>e.map(({width:e})=>`${e}px`).join(` `),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}`),j=(e,t)=>{let n=k(t);return t.map((t,r)=>{let i=`[data-ui-data-grid-scope="${A(e)}"]`,a=`[data-column="${A(t.key)}"]`,o=`${i} [data-ui-data-grid-column-header]${a},${i} [data-ui-data-grid-cell]${a}`,s=t.pinned===`left`?`position:sticky;left:${n.left.get(t.key)??0}px;z-index:2;`:t.pinned===`right`?`position:sticky;right:${n.right.get(t.key)??0}px;z-index:2;`:``;return`${o}{grid-column:${r+1};${s}}`}).join(``)},M=(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}},N=(e,t)=>e.mode===`query`?!e.except.includes(t):e.ids.includes(t),P=(e,t,n,r)=>{let i=M(e,n);if(n===`none`)return{selection:i,added:[],removed:[]};let a=N(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]}},F=(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},I=(e,t=0)=>Math.max(t,Math.floor(Number.isFinite(e)?e:t)),L=`a,button,input,select,textarea,[contenteditable],[role="button"],[role="link"]`,R=e=>{let t=null,n=null,r=null,i=null,o=null,l=[],m=[],h=0,g={mode:`ids`,ids:[]},_=``,v=null,y=0,b=0,x=!1,S=null,C=!1,w=new Map,E=[],D=f(u),O=(e,n)=>{t?.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:n}))},k=(e,t)=>{let n=t.split(/\s+/).filter(Boolean);n.length&&e.classList.add(...n)},A=()=>Array.from(t?.querySelectorAll(`[data-ui-data-grid-row]`)??[]),R=()=>{A().forEach(e=>{let t=e.dataset.rowKey??``,n=$.props.selection!==`none`&&t!==``&&N(g,t);e.toggleAttribute(`data-selected`,n),$.props.selection===`none`?e.removeAttribute(`aria-selected`):e.setAttribute(`aria-selected`,String(n))})},z=()=>{if(!t||!o)return;t.style.setProperty(`--ui-data-grid-template`,te(l));let e=t.dataset.uiDataGridScope??``;o.textContent=j(e,l),r?.setAttribute(`aria-colcount`,String(l.length));let n=t.querySelector(`[data-ui-data-grid-header-row]`);l.forEach(e=>n?.append(e.element));let i=n?.querySelector(`[data-ui-data-grid-column-indicator]`);i&&n?.append(i),A().forEach(e=>{let t=new Map(Array.from(e.children).flatMap(e=>e instanceof HTMLElement&&e.hasAttribute(`data-ui-data-grid-cell`)?[[e.dataset.column??``,e]]:[]));l.forEach(({key:n})=>{let r=t.get(n);r&&e.append(r)})}),l.forEach((e,t)=>{e.element.setAttribute(`aria-colindex`,String(t+1)),e.element.dataset.pinned=e.pinned??``,e.element.toggleAttribute(`data-pinned`,e.pinned!==null)}),A().forEach(e=>k(e,$.props.rowClass)),t.querySelectorAll(`[data-ui-data-grid-cell]`).forEach(e=>{let t=l.findIndex(({key:t})=>t===e.dataset.column);if(t>=0){let n=l[t];e.setAttribute(`aria-colindex`,String(t+1)),k(e,$.props.cellClass),k(e,n.cellClass),n.pinned?e.dataset.pinned=n.pinned:e.removeAttribute(`data-pinned`)}})},B=()=>{!t||!i||(t.toggleAttribute(`data-loading`,b>0),t.toggleAttribute(`data-empty`,h===0),t.dataset.selection=$.props.selection,r?.setAttribute(`aria-rowcount`,String(h+1)),t.style.setProperty(`--ui-data-grid-row-height`,`${$.props.rowHeight}px`),t.style.setProperty(`--ui-data-grid-total-height`,`${Math.max(h*$.props.rowHeight,$.props.rowHeight)}px`),i.style.height=`var(--ui-data-grid-total-height)`,R())},V=e=>{let t=I(e);t!==h&&(h=t,B(),O(`ui:data-grid-total-change`,{totalRows:h}))},H=e=>u.compute({axes:{y:{total:h,itemSize:$.props.rowHeight,viewportSize:$.props.bufferSize*$.props.rowHeight,scrollOffset:e*$.props.rowHeight,buffer:0}}}),U=e=>{if(h===0)return[];let t=I($.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(H)},W=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}`},G=()=>{if(b=Math.max(0,b-1),B(),b>0||v===null||x)return;let e=v;v=null,q(e)},K=async(n,r,i)=>{let a=r.axes.y;if(!a)return;let o=new AbortController;w.set(n.key,o),b+=1,B(),t?.removeAttribute(`data-error`),O(`ui:data-grid-load-start`,{window:r});try{let s=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${i.requestGeneration}`,l=await fetch(W(r),{method:`GET`,headers:{Accept:`text/html`,"X-Trellis-Virtualizer":`true`,"X-Trellis-Request-ID":s},signal:o.signal});if(!l.ok&&l.status!==204){D.fail(i),t?.setAttribute(`data-error`,``),O(`ui:data-grid-error`,{window:r,status:l.status});return}let u=await d(l,$.props);if(D.pending(n.key)!==i||x||!await c(e,n.element,u.html,{assets:u.assets,shouldReplace:()=>D.pending(n.key)===i&&!x})||(u.totalItems!==null&&V(u.totalItems),!D.commit(i,r)))return;n.element.style.height=`${a.count*$.props.rowHeight}px`,n.element.style.transform=`translateY(${a.translateOffset}px)`,z(),R(),O(`ui:data-grid-load`,{window:r,start:a.start,count:a.count,end:a.start+a.count})}catch(e){if(o.signal.aborted)return;D.fail(i),t?.setAttribute(`data-error`,``),O(`ui:data-grid-error`,{window:r,status:0,error:e})}finally{w.get(n.key)===o&&w.delete(n.key),G()}},q=t=>{if(b>0){v=t;return}let n=U(t),r=Math.min(Math.max(0,h-1),Math.floor(Math.max(0,t)/$.props.rowHeight)),i=n.find(e=>{let t=e.axes.y;return t&&r>=t.start&&r<t.start+t.count})??n[0];if(i&&_!==i.key){_=i.key;let e=i.axes.y;O(`ui:data-grid-range`,{start:e.start,count:e.count,end:e.start+e.count,window:i})}if(n.length===0){m.forEach(t=>void c(e,t.element,``));return}let a=new Set;n.forEach(e=>{let t=m.find(t=>D.mounted(t.key)?.key===e.key);t&&a.add(t)});let o=m.filter(e=>!a.has(e));n.forEach(e=>{if(m.some(t=>D.mounted(t.key)?.key===e.key))return;let t=o.shift();if(!t)return;let n=D.begin(t.key,e);n&&K(t,e,n)})},J=()=>{w.forEach(e=>e.abort()),w.clear(),b=0,v=null,_=``,D.invalidate(),m.forEach(t=>{t.element.style.height=``,t.element.style.transform=``,c(e,t.element,``)}),B()},Y=(e,n)=>{g=M(e,$.props.selection),C=!0,$.props.selectionValue=g,t&&s({el:t,schema:T,key:`selectionValue`,value:g}),C=!1,R(),O(`ui:data-grid-selection-change`,{selection:g,added:n?.added??[],removed:n?.removed??[]})},X=(e,t)=>{let n=P(g,String(e),$.props.selection,t);n.added.length===0&&n.removed.length===0||Y(n.selection,n)},Z=(e,t,n)=>{e.width=Math.min(e.maxWidth??1/0,Math.max(e.minWidth,t)),z(),O(`ui:data-grid-column-resize`,{column:e.key,width:e.width,phase:n})},Q=()=>{E.splice(0).forEach(e=>e()),l.forEach(e=>{let t=e.element.querySelector(`[data-ui-data-grid-resize-handle]`);if(!t)return;let n=e.resizable&&$.props.resizableColumns;if(n?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`),t.tabIndex=n?0:-1,!n)return;let r=t=>Z(e,t.previewWidth,t.phase);E.push(p({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}))})},$={props:null,init(){t=this.$el,x=!1;let e=globalThis.crypto?.randomUUID?.()??`grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;if(t.dataset.uiDataGridScope=e,t.querySelector(`[data-ui-data-grid-header-row]`)?.setAttribute(`data-sortable-scope`,e),this.props=a({el:t,schema:T,onChange:(e,t)=>{if(C)return;let n=t.map(({key:e})=>e);(n.includes(`selectionValue`)||n.includes(`selection`))&&(g=M(this.props.selectionValue,this.props.selection),R()),n.includes(`resizableColumns`)&&Q(),n.includes(`totalRows`)?(V(this.props.totalRows),this.reload()):n.some(e=>[`fetchUrl`,`rowHeight`,`bufferSize`].includes(e))&&this.reload()}}),h=I(this.props.totalRows),g=M(this.props.selectionValue,this.props.selection),n=t.querySelector(`[data-ui-data-grid-viewport]`)??t.querySelector(`[data-ui-scroll-area-viewport]`),r=t.querySelector(`[data-ui-data-grid-inner]`),i=t.querySelector(`[data-ui-data-grid-spacer]`),o=t.querySelector(`style[data-ui-data-grid-layout]`),m=Array.from(t.querySelectorAll(`[data-ui-data-grid-block]`)).slice(0,3).map((e,t)=>({element:e,key:`block-${t+1}`})),!n||!r||!i||!o||m.length!==3)throw Error(`Data Grid requires one viewport, table owner, spacer, layout style, and three row blocks.`);n.setAttribute(`data-ui-data-grid-viewport`,``),l=ee(Array.from(t.querySelectorAll(`[data-ui-data-grid-column-header]`)),{width:this.props.defaultColumnWidth,minWidth:this.props.minColumnWidth,maxWidth:this.props.maxColumnWidth,resizable:this.props.resizableColumns,reorderable:this.props.reorderableColumns}),z(),Q(),S=new AbortController,n.addEventListener(`scroll`,()=>{y||=requestAnimationFrame(()=>{y=0,n&&q(n.scrollTop)})},{passive:!0,signal:S.signal}),t.addEventListener(`click`,e=>{let n=e.target,r=n.closest(`[data-ui-data-grid-sort-button]`);if(r&&this.props.sortableColumns){let t=r.closest(`[data-ui-data-grid-column-header]`),n=l.find(({key:e})=>e===t?.dataset.column);if(n?.sortable){let t=n.sort===`ascending`?`descending`:`ascending`;O(`ui:data-grid-sort`,{column:n.key,direction:t,additive:e.shiftKey})}return}let i=n.closest(`[data-ui-data-grid-row]`);if(!i||!t?.contains(i))return;let a=i.dataset.rowKey??``;this.props.selectOnRowClick&&!n.closest(L)&&X(a),O(`ui:data-grid-row-activate`,{rowKey:a,row:i})},{signal:S.signal}),t.addEventListener(`dblclick`,e=>{let t=e.target.closest(`[data-ui-data-grid-cell]`),n=t?.closest(`[data-ui-data-grid-row]`);t&&n&&O(`ui:data-grid-cell-activate`,{rowKey:n.dataset.rowKey??``,column:t.dataset.column??``,cell:t})},{signal:S.signal}),t.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:S.signal}),n.style.overscrollBehavior=`contain`,n.style.overflowAnchor=`none`,n.scrollTop=u.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:n.clientHeight,scrollOffset:0,buffer:this.props.bufferSize},{axis:`y`,index:this.props.initialIndex}),B(),q(n.scrollTop)},destroy(){x=!0,y&&cancelAnimationFrame(y),S?.abort(),S=null,E.splice(0).forEach(e=>e()),J(),this.props.disconnect(),t=null,n=null,r=null,i=null,o=null,l=[],m=[]},scrollToIndex(e,t=`start`){n&&(n.scrollTop=u.scrollTo({total:h,itemSize:this.props.rowHeight,viewportSize:n.clientHeight,scrollOffset:n.scrollTop,buffer:this.props.bufferSize},{axis:`y`,index:e,align:t}),q(n.scrollTop))},setTotalRows(e){V(e),this.reload({scrollTop:n?.scrollTop??0})},setUrl(e,n={}){C=!0,this.props.fetchUrl=String(e),t&&s({el:t,schema:T,key:`fetchUrl`,value:String(e)}),C=!1,n.reset??!0?this.reset():this.reload()},reset(e={}){this.reload({scrollTop:e.scrollTop??0})},reload(e={}){let t=e.scrollTop??n?.scrollTop??0;J(),n&&(n.scrollTop=Math.max(0,t)),q(t)},resizeColumn(e,t){let n=l.find(t=>t.key===e);n&&Z(n,Number(t),`end`)},reorderColumn(e,t){let n=l.findIndex(t=>t.key===e),r=F(l,e,I(t));r&&(l=r,z(),O(`ui:data-grid-column-reorder`,{column:e,from:n,to:I(t),columns:l.map(({key:e})=>e)}))},selectRow(e){X(String(e),!0)},deselectRow(e){X(String(e),!1)},toggleRow(e){X(String(e))},setSelection(e){Y(e)},selectQuery(e,t,n=[]){Y({mode:`query`,token:String(e),total:I(t),except:n.map(String)})},clearSelection(){Y({mode:`ids`,ids:[]})}};return $},z=e=>{l(`UiDataGrid`,()=>R(e))(e)},B=new WeakSet,V=t=>{B.has(t)||(B.add(t),_(t),e(t),m(t),z(t))};export{R as n,V as t};
2
- //# sourceMappingURL=entry.generated-BUbxiHwA.js.map