@vireo-ai/trellis-ui 0.1.51 → 0.1.52

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 (69) hide show
  1. package/package.json +6 -1
  2. package/packages/client/src/components/select/styles.css +19 -0
  3. package/packages/client/src/styles/theme-support.css +267 -0
  4. package/packages/client/src/styles/theme.css +1 -268
  5. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +11 -0
  6. package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
  7. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +252 -252
  8. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
  9. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
  10. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DRILCSFH.js → capability-motion-DQitxnHn.js} +2 -2
  11. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-DRILCSFH.js.map → capability-motion-DQitxnHn.js.map} +1 -1
  12. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CpSdQwYp.js → capability-sortable-Dzv1zWaL.js} +2 -2
  13. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CpSdQwYp.js.map → capability-sortable-Dzv1zWaL.js.map} +1 -1
  14. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DnQs1xY6.js → core-DMbnlSdM.js} +2 -2
  15. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-DnQs1xY6.js.map → core-DMbnlSdM.js.map} +1 -1
  16. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-DvHNTjt1.js +2 -0
  17. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-DvHNTjt1.js.map +1 -0
  18. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cnWgB3wz.js → entry.generated-CvcufWkj.js} +2 -2
  19. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-cnWgB3wz.js.map → entry.generated-CvcufWkj.js.map} +1 -1
  20. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BiyFgA-e.js → entry.generated-D3w3QaSO.js} +2 -2
  21. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BiyFgA-e.js.map → entry.generated-D3w3QaSO.js.map} +1 -1
  22. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CeD3bUBI.js → entry.generated-DCLIvEtJ.js} +2 -2
  23. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CeD3bUBI.js.map → entry.generated-DCLIvEtJ.js.map} +1 -1
  24. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-TbFjT_mY.js → entry.generated-DVQaci6w.js} +2 -2
  25. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-TbFjT_mY.js.map → entry.generated-DVQaci6w.js.map} +1 -1
  26. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D3am_GtI.js → entry.generated-DvvVMsQo.js} +2 -2
  27. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D3am_GtI.js.map → entry.generated-DvvVMsQo.js.map} +1 -1
  28. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-D7qa64eM.js → entry.generated-Rx9NofFi.js} +2 -2
  29. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-Rx9NofFi.js.map +1 -0
  30. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-oz1RCU1b.js +2 -0
  31. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-oz1RCU1b.js.map +1 -0
  32. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DbC4gkeV.js → entry.generated-payXlXhL.js} +2 -2
  33. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DbC4gkeV.js.map → entry.generated-payXlXhL.js.map} +1 -1
  34. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-BSal0xp9.js → entry2.generated-CpoK52gE.js} +2 -2
  35. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-BSal0xp9.js.map → entry2.generated-CpoK52gE.js.map} +1 -1
  36. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-JcxejQr4.js → entry2.generated-D1X0sDop.js} +2 -2
  37. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-JcxejQr4.js.map → entry2.generated-D1X0sDop.js.map} +1 -1
  38. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-DCbmWkHV.js → entry2.generated-DXDHgDsN.js} +2 -2
  39. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-DCbmWkHV.js.map → entry2.generated-DXDHgDsN.js.map} +1 -1
  40. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-D26Cigu5.js → entry2.generated-_UPpJlWp.js} +2 -2
  41. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-D26Cigu5.js.map → entry2.generated-_UPpJlWp.js.map} +1 -1
  42. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-B4uuk1JX.js → motion-BDQdr83d.js} +2 -2
  43. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-B4uuk1JX.js.map → motion-BDQdr83d.js.map} +1 -1
  44. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-SdoiMWig.js +4 -0
  45. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{ui-FOJhyz8V.js.map → ui-SdoiMWig.js.map} +1 -1
  46. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
  47. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +1 -1
  48. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
  49. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
  50. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
  51. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
  52. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
  53. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
  54. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
  55. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
  56. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
  57. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tooltip.js +1 -1
  58. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/virtualizer.js +1 -1
  59. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +91 -91
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +8 -8
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +8 -8
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-5pQvlhmK.js +0 -2
  65. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-5pQvlhmK.js.map +0 -1
  66. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CPzThz_M.js +0 -2
  67. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CPzThz_M.js.map +0 -1
  68. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D7qa64eM.js.map +0 -1
  69. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-FOJhyz8V.js +0 -4
@@ -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";var o=e=>Math.max(0,Math.floor(e)),s=e=>{if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.id==`string`&&typeof e.src==`string`):[]}catch{return[]}},c=async(e,t)=>{let n=e.status===204?``:await e.text(),r=document.createElement(`template`);r.innerHTML=n;let i=null,a=e.headers.get(t.totalHeader),c=a===null||a.trim()===``?NaN:Number(a);Number.isFinite(c)&&c>=0&&(i=o(c));let l=r.content.querySelector(t.metaSelector);if(l){if(i===null)try{let e=JSON.parse(l.innerHTML),t=Number(e.totalItems);Number.isFinite(t)&&t>=0&&(i=o(t))}catch{}l.remove()}let u=document.createElement(`div`);return u.append(r.content),{html:u.innerHTML,assets:s(e.headers.get(t.assetsHeader)),totalItems:i}},l=(e,t=0)=>Number.isFinite(e)?e:t,u=e=>Math.max(0,Math.floor(l(e))),d=(e,t=1)=>Math.max(2**-52,l(e,t)),f=(e,t,n)=>Math.min(n,Math.max(t,e)),p=(e,t)=>{let n=u(t.total),r=d(t.itemSize),i=Math.max(0,l(t.viewportSize)),a=u(t.buffer),o=Math.min(n,Math.max(1,Math.ceil(i/r))),s=Math.max(0,n-o),c=f(Math.max(0,l(t.scrollOffset)),0,Math.max(0,n*r-i)),p=f(Math.floor(c/r),0,s),m=Math.min(n,o+a*2),h=f(p-a,0,Math.max(0,n-m));return{axis:e,start:h,count:m,total:n,itemSize:r,viewportSize:i,scrollOffset:c,buffer:a,visibleStart:p,visibleCount:o,guardStart:Math.min(n,h+a),guardEnd:Math.max(0,h+m-a),translateOffset:h*r,spacerSize:n*r}},m={compute(e){let t={};return e.axes.x&&(t.x=p(`x`,e.axes.x)),e.axes.y&&(t.y=p(`y`,e.axes.y)),{kind:`fixed-axis`,key:[`x`,`y`].map(e=>{let n=t[e];return n?`${e}:${n.start}:${n.count}:${n.total}`:``}).filter(Boolean).join(`|`),axes:t}},covers(e,t){return[`x`,`y`].every(n=>{let r=t.axes[n];if(!r)return!0;let i=e.axes[n];if(!i||i.total!==r.total||i.itemSize!==r.itemSize)return!1;let a=r.visibleStart+r.visibleCount;return r.visibleStart>=i.guardStart&&a<=i.guardEnd})},serialize(e){let t={};return[`x`,`y`].forEach(n=>{let r=e.axes[n];r&&(t[n]={start:r.start,count:r.count,total:r.total})}),{window:JSON.stringify(t)}},spacerSize(e,t){return e.axes[t]?.spacerSize??0},translateOffset(e,t){return e.axes[t]?.translateOffset??0},setAxisTotal(e,t,n){let r=e.axes[t];return r?{...e,axes:{...e.axes,[t]:{...r,total:u(n)}}}:e},scrollTo(e,t){let n=u(e.total),r=d(e.itemSize),i=Math.max(0,l(e.viewportSize)),a=f(u(t.index),0,Math.max(0,n-1))*r,o=a+r,s=Math.max(0,n*r-i),c=a;if(t.align===`center`)c=a-(i-r)/2;else if(t.align===`end`)c=o-i;else if(t.align===`auto`){let t=Math.max(0,l(e.scrollOffset));if(a>=t&&o<=t+i)return f(t,0,s);c=a<t?a:o-i}return f(c,0,s)}},h=(e,t={})=>{let n=0,r=0,i=new Map,a=new Map,o=new Map,s=()=>({generation:n,mounted:new Map(i),pending:new Map(a),latestDesired:new Map(o)}),c=()=>t.onChange?.(s()),l=e=>{let t=a.get(e.block);return e.generation===n&&t?.requestGeneration===e.requestGeneration};return{computeWindow:t=>e.compute(t),shouldLoad:(t,n)=>!n||!e.covers(n,t),begin(e,t){if(o.set(e,t),a.has(e)||!this.shouldLoad(t,i.get(e)))return c(),null;let s={block:e,window:t,generation:n,requestGeneration:++r};return a.set(e,s),c(),s},commit(e,t=e.window){return l(e)?(a.delete(e.block),i.set(e.block,t),c(),!0):!1},fail(e){return l(e)?(a.delete(e.block),c(),!0):!1},next(t){if(a.has(t))return null;let n=o.get(t);if(!n)return null;let r=i.get(t);return r&&e.covers(r,n)?null:n},mounted:e=>i.get(e)??null,pending:e=>a.get(e)??null,invalidate(){n+=1,i.clear(),a.clear(),o.clear(),c()},snapshot:s}},ee={fetchUrl:t,cursor:r,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},g=(e,t=0)=>Math.max(t,Math.floor(Number.isFinite(e)?e:t)),_=(e,t={})=>{let n=null,r=null,o=null,s=[],l=0,u=``,d=null,f=0,p=0,_=!1,v=null,y=!1,b=new Map,x=h(m),S=t.cursor,C=S?.query,w=0,te=0,T=!1,E=!1,D=null,O=0,k=null,A=null,j=null,M=new Map,N=new Map,P=(e,t)=>{n?.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t}))},F=()=>{if(!n||!o)return;let e=N.size===0?0:Math.max(...[...N.values()].map(({startIndex:e,count:t})=>e+t)),t=[...N.values()].some(({page:t,startIndex:n,count:r})=>n+r===e&&t.hasNext),r=S&&l===0?e+(t?g($.props.bufferSize,1):0):l;n.toggleAttribute(`data-loading`,p>0),n.toggleAttribute(`data-empty`,S?N.size===0&&p===0:l===0),o.style.height=`${Math.max(r*$.props.itemSize,$.props.itemSize)}px`},I=e=>{let t=g(e);t!==l&&(l=t,F(),P(`ui:virtualizer-total-change`,{totalItems:l}),P(`ui:virtualizer-axis-total-change`,{axis:`y`,total:l,window:null}))},L=e=>m.compute({axes:{y:{total:l,itemSize:$.props.itemSize,viewportSize:$.props.bufferSize*$.props.itemSize,scrollOffset:e*$.props.itemSize,buffer:0}}}),R=e=>{if(l===0)return[];let t=g($.props.bufferSize,1),n=Math.min(l-1,Math.floor(Math.max(0,e)/$.props.itemSize)),r=Math.floor(n/t)*t,i=Math.floor((l-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(L)},ne=e=>{let t=e.axes.y;if(!t)throw Error(`Vertical virtualizer requires a y 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}`},z=async(t,n,i)=>{let o=t.element.contains(document.activeElement),s=await a(e,t.element,n.html,{assets:n.assets,shouldReplace:i});return s&&o&&r?.focus({preventScroll:!0}),s},B=(e,t,n)=>{e.element.style.height=`${n*$.props.itemSize}px`,e.element.style.transform=`translateY(${t*$.props.itemSize}px)`},re=()=>{if(p=Math.max(0,p-1),F(),p>0||d===null||_)return;let e=d;d=null,Z(e)},ie=async(e,t,r)=>{let i=t.axes.y;if(!i)return;let a=new AbortController;b.set(e.key,a),p+=1,F(),n?.removeAttribute(`data-error`),P(`ui:virtualizer-load-start`,{block:e.key,window:t});try{let o=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${r.requestGeneration}`,s=await fetch(ne(t),{method:`GET`,headers:{Accept:`text/html`,"X-Trellis-Virtualizer":`true`,"X-Trellis-Request-ID":o},signal:a.signal});if(!s.ok&&s.status!==204){x.fail(r),n?.setAttribute(`data-error`,``),P(`ui:virtualizer-error`,{block:e.key,window:t,status:s.status});return}let l=await c(s,$.props);if(x.pending(e.key)!==r||_||!await z(e,l,()=>x.pending(e.key)===r&&!_)||(l.totalItems!==null&&I(l.totalItems),!x.commit(r,t)))return;B(e,i.start,i.count),P(`ui:virtualizer-load`,{block:e.key,window:t})}catch(i){if(a.signal.aborted)return;x.fail(r),n?.setAttribute(`data-error`,``),P(`ui:virtualizer-error`,{block:e.key,window:t,status:0,error:i})}finally{b.get(e.key)===a&&b.delete(e.key),re()}},V=()=>g($.props.bufferSize,1),H=()=>[...N.values()].sort((e,t)=>e.startIndex-t.startIndex),U=(e,t)=>!_&&t.generation===w&&M.get(e.key)?.id===t.id,W=async(e,t,r,i,a=`page`)=>{if(!S||M.has(e.key))return null;let o=i??new AbortController,s={generation:w,id:++te,aborter:o};M.set(e.key,s),p+=1,F(),n?.removeAttribute(`data-error`),P(`ui:virtualizer-load-start`,{block:e.key,mode:`cursor`});try{let n=await t(o.signal);if(!U(e,s))return null;if(n.hasNext&&n.endCursor===null)throw Error(`Cursor page hasNext requires a non-null endCursor.`);if(n.hasPrevious&&n.startCursor===null)throw Error(`Cursor page hasPrevious requires a non-null startCursor.`);if(a===`seek`&&n.startIndex===void 0)throw Error(`Cursor seek response requires startIndex.`);let i=await S.responseAdapter(n.content,n);if(!U(e,s))return null;let c=n.startIndex===void 0?g(r):g(n.startIndex),u=i.totalItems??l,d=i.itemCount===void 0?V():g(i.itemCount),f=u>0?Math.min(V(),Math.max(0,u-c)):d;if(!await z(e,i,()=>U(e,s))||!U(e,s))return null;i.totalItems===null?n.hasNext||I(c+f):I(i.totalItems);let p={block:e,page:n,startIndex:c,count:f};return N.set(e.key,p),B(e,c,f),P(`ui:virtualizer-load`,{block:e.key,mode:`cursor`,page:{...n,content:void 0},startIndex:c}),p}catch(t){return o.signal.aborted||!U(e,s)?null:(E=!0,n?.setAttribute(`data-error`,``),P(`ui:virtualizer-error`,{block:e.key,mode:`cursor`,status:0,error:t}),null)}finally{M.get(e.key)===s&&M.delete(e.key),p=Math.max(0,p-1),F()}},G=()=>{T=!1;let e=D??r?.scrollTop??0;D=null,X(e)},ae=async()=>{if(!S||T||E||N.size>0)return;T=!0;let e=w;try{let t=await W(s[0],e=>S.dataSource.first({limit:V(),query:C,signal:e}),0);if(!t||e!==w)return;let n=t;for(let t of s.slice(1)){if(!n.page.hasNext||n.page.endCursor===null)break;let r=n.page.endCursor,i=await W(t,e=>S.dataSource.next({cursor:r,limit:V(),query:C,signal:e}),n.startIndex+n.count);if(!i||e!==w)break;n=i}}finally{e===w&&G()}},K=async()=>{if(!S||T)return;let e=H(),t=e.at(-1);if(!t?.page.hasNext||t.page.endCursor===null)return;let n=e[0]?.block;if(!n)return;T=!0;let r=w,i=t.page.endCursor;try{await W(n,e=>S.dataSource.next({cursor:i,limit:V(),query:C,signal:e}),t.startIndex+t.count)}finally{r===w&&G()}},q=async()=>{if(!S||T)return;let e=H(),t=e[0];if(!t?.page.hasPrevious||t.page.startCursor===null)return;let n=e.at(-1)?.block;if(!n)return;T=!0;let r=w,i=t.page.startCursor;try{await W(n,e=>S.dataSource.previous({cursor:i,limit:V(),query:C,signal:e}),Math.max(0,t.startIndex-V()))}finally{r===w&&G()}},J=()=>{O&&window.clearTimeout(O),O=0,k=null},oe=async t=>{let n=S?.dataSource.seek;if(!S||!n)return;j?.abort(),M.forEach(({aborter:e})=>e.abort()),M.clear(),T=!0;let r=w,i=new AbortController;j=i,A=t;let o=s[1];N.clear(),s.forEach(t=>{t!==o&&a(e,t.element,``)});try{let e=await W(o,e=>n({index:t,limit:V(),query:C,signal:e}),t,i,`seek`);if(!e||r!==w||j!==i)return;let a=[];if(e.page.hasPrevious&&e.page.startCursor!==null){let t=e.page.startCursor;a.push(W(s[0],e=>S.dataSource.previous({cursor:t,limit:V(),query:C,signal:e}),Math.max(0,e.startIndex-V())))}if(e.page.hasNext&&e.page.endCursor!==null){let t=e.page.endCursor;a.push(W(s[2],e=>S.dataSource.next({cursor:t,limit:V(),query:C,signal:e}),e.startIndex+e.count))}await Promise.all(a)}finally{j===i&&(j=null,A=null,r===w&&G())}},Y=e=>{if(!S?.dataSource.seek)return;let t=l>0?Math.min(Math.max(0,l-1),g(e)):g(e);H().some(e=>t>=e.startIndex&&t<e.startIndex+e.count)||k===t||A===t||(J(),k=t,O=window.setTimeout(()=>{O=0,k=null,oe(t)},g(S.seekDebounce??100)))},X=e=>{if(!S)return;let t=l>0?Math.min(l-1,Math.floor(Math.max(0,e)/$.props.itemSize)):Math.floor(Math.max(0,e)/$.props.itemSize);if(j&&S.dataSource.seek&&A!==t){D=e,Y(t);return}if(T||p>0){D=e;return}let n=H();if(n.length===0){ae();return}let r=n.find(e=>t>=e.startIndex&&t<e.startIndex+e.count);if(r){J(),r===n[0]&&r.page.hasPrevious?q():r===n.at(-1)&&r.page.hasNext&&K();return}if(S.dataSource.seek){Y(t);return}t<n[0].startIndex?q():K()},Z=t=>{if(S){X(t);return}if(p>0){d=t;return}let n=R(t),r=n.map(e=>e.key).join(`,`),i=Math.min(Math.max(0,l-1),Math.floor(Math.max(0,t)/$.props.itemSize)),o=n.find(e=>{let t=e.axes.y;return t&&i>=t.start&&i<t.start+t.count})??n[0];if(o&&u!==o.key){u=o.key;let e=o.axes.y;P(`ui:virtualizer-window`,{window:o}),P(`ui:virtualizer-range`,{start:e.start,count:e.count,end:e.start+e.count,window:o})}if(!r){s.forEach(t=>void a(e,t.element,``));return}let c=new Set;n.forEach(e=>{let t=s.find(t=>x.mounted(t.key)?.key===e.key);t&&c.add(t)});let f=s.filter(e=>!c.has(e));n.forEach(e=>{if(s.some(t=>x.mounted(t.key)?.key===e.key))return;let t=f.shift();if(!t)return;let n=x.begin(t.key,e);n&&ie(t,e,n)})},Q=()=>{b.forEach(e=>e.abort()),b.clear(),p=0,d=null,u=``,x.invalidate(),w+=1,J(),j?.abort(),j=null,A=null,M.forEach(({aborter:e})=>e.abort()),M.clear(),N.clear(),T=!1,E=!1,D=null,s.forEach(t=>{t.element.style.height=``,t.element.style.transform=``,a(e,t.element,``)}),F()},$={supportsSeek:!!S?.dataSource.seek,props:null,init(){if(n=this.$el,_=!1,this.props=i({el:n,schema:ee,onChange:(e,t)=>{y||(t.some(({key:e})=>e===`totalItems`)?(I(this.props.totalItems),S||this.reload()):t.some(({key:e})=>[`fetchUrl`,`itemSize`,`bufferSize`].includes(e))&&this.reload())}}),l=g(this.props.totalItems),r=n.querySelector(`[data-ui-scroll-area-viewport]`)??n,o=n.querySelector(`[data-ui-virtualizer-spacer]`),s=Array.from(n.querySelectorAll(`[data-ui-virtualizer-block]`)).slice(0,3).map((e,t)=>({element:e,key:`block-${t+1}`})),!o||s.length!==3)throw Error(`Virtualizer requires one spacer and three block containers.`);r.style.overscrollBehavior=`contain`,r.style.overflowAnchor=`none`,v=new AbortController,r.addEventListener(`scroll`,()=>{f||=requestAnimationFrame(()=>{f=0,r&&Z(r.scrollTop)})},{passive:!0,signal:v.signal}),r.scrollTop=m.scrollTo({total:l,itemSize:this.props.itemSize,viewportSize:r.clientHeight,scrollOffset:0,buffer:this.props.bufferSize},{axis:`y`,index:this.props.initialIndex}),F(),Z(r.scrollTop)},destroy(){_=!0,f&&cancelAnimationFrame(f),v?.abort(),v=null,Q(),this.props.disconnect(),n=null,r=null,o=null,s=[]},scrollToIndex(e,t=`start`){r&&(r.scrollTop=m.scrollTo({total:l,itemSize:this.props.itemSize,viewportSize:r.clientHeight,scrollOffset:r.scrollTop,buffer:this.props.bufferSize},{axis:`y`,index:e,align:t}),Z(r.scrollTop))},setTotalItems(e){if(I(e),S){r&&X(r.scrollTop);return}let t=r?.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()},setQuery(e){S&&(C=e,this.reset())},reset(e={}){this.reload({scrollTop:e.scrollTop??0})},reload(e={}){let t=e.scrollTop??r?.scrollTop??0;Q(),r&&(r.scrollTop=Math.max(0,t)),Z(t)}};return $},v=e=>{let t=async({cursor:t,direction:n,limit:r,signal:i,index:a})=>{let o=e().dataset.fetchUrl??``,s=new URL(o,document.baseURI);s.searchParams.set(`cursor`,t??``),s.searchParams.set(`direction`,n),s.searchParams.set(`limit`,String(r)),a!==void 0&&s.searchParams.set(`index`,String(a));let c=/^[a-z][a-z\d+.-]*:/i.test(o)||o.startsWith(`//`)?s.href:`${s.pathname}${s.search}${s.hash}`,l=await fetch(c,{signal:i});if(!l.ok)throw Error(`Cursor request failed (${l.status}).`);let u=await l.json();return{...u,content:u}};return{query:null,dataSource:{first:({limit:e,signal:n})=>t({cursor:null,direction:`forward`,limit:e,signal:n}),next:({cursor:e,limit:n,signal:r})=>t({cursor:e,direction:`forward`,limit:n,signal:r}),previous:({cursor:e,limit:n,signal:r})=>t({cursor:e,direction:`backward`,limit:n,signal:r}),seek:({index:e,limit:n,signal:r})=>t({cursor:null,direction:`forward`,index:e,limit:n,signal:r}).then(e=>{if(e.startIndex===void 0)throw Error(`Cursor seek response is missing startIndex.`);return{...e,startIndex:e.startIndex}})},responseAdapter:e=>({html:e.content,assets:e.assets??[],totalItems:e.total??null,...e.count===void 0?{}:{itemCount:e.count}})}};export{c as a,m as i,_ as n,h as r,v as t};
2
- //# sourceMappingURL=cursor-data-source-5pQvlhmK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor-data-source-5pQvlhmK.js","names":[],"sources":["../../../../../../../../client/src/runtime/virtualizer-fragment.ts","../../../../../../../../client/src/runtime/virtual-window.ts","../../../../../../../../client/src/runtime/virtualizer-schema.ts","../../../../../../../../client/src/runtime/virtualizer.ts","../../../../../../../../client/src/runtime/cursor-data-source.ts"],"sourcesContent":["import type {AssetDescriptor} from '../assets/bridge';\n\ntype VirtualizerFragmentOptions = {\n totalHeader: string;\n assetsHeader: string;\n metaSelector: string;\n};\n\ntype VirtualizerFragmentPayload = {\n html: string;\n assets: AssetDescriptor[];\n totalItems: number | null;\n};\n\nconst integer = (value: number): number => Math.max(0, Math.floor(value));\n\nconst parseAssets = (raw: string | null): AssetDescriptor[] => {\n if (!raw) return [];\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((value): value is AssetDescriptor => (\n typeof value === 'object'\n && value !== null\n && typeof (value as Partial<AssetDescriptor>).id === 'string'\n && typeof (value as Partial<AssetDescriptor>).src === 'string'\n ));\n } catch {\n return [];\n }\n};\n\nconst parseVirtualizerFragmentResponse = async (\n response: Response,\n options: VirtualizerFragmentOptions,\n): Promise<VirtualizerFragmentPayload> => {\n const html = response.status === 204 ? '' : await response.text();\n const template = document.createElement('template');\n template.innerHTML = html;\n let totalItems: number | null = null;\n const rawHeaderTotal = response.headers.get(options.totalHeader);\n const headerTotal = rawHeaderTotal === null || rawHeaderTotal.trim() === ''\n ? Number.NaN\n : Number(rawHeaderTotal);\n if (Number.isFinite(headerTotal) && headerTotal >= 0) totalItems = integer(headerTotal);\n\n const meta = template.content.querySelector<HTMLTemplateElement>(options.metaSelector);\n if (meta) {\n if (totalItems === null) {\n try {\n const parsed = JSON.parse(meta.innerHTML) as {totalItems?: unknown};\n const inlineTotal = Number(parsed.totalItems);\n if (Number.isFinite(inlineTotal) && inlineTotal >= 0) totalItems = integer(inlineTotal);\n } catch {\n // Invalid optional metadata does not invalidate otherwise usable fragment HTML.\n }\n }\n meta.remove();\n }\n\n const container = document.createElement('div');\n container.append(template.content);\n return {\n html: container.innerHTML,\n assets: parseAssets(response.headers.get(options.assetsHeader)),\n totalItems,\n };\n};\n\nexport {parseVirtualizerFragmentResponse};\nexport type {VirtualizerFragmentOptions, VirtualizerFragmentPayload};\n","type VirtualWindowKind = string;\n\ntype VirtualWindowBase = {\n kind: VirtualWindowKind;\n key: string;\n};\n\ntype VirtualWindowAdapter<Input, Window extends VirtualWindowBase> = {\n compute(input: Input): Window;\n covers(mounted: Window, desired: Window): boolean;\n serialize(window: Window): Record<string, string>;\n};\n\ntype VirtualAxis = 'x' | 'y';\ntype VirtualScrollAlign = 'start' | 'center' | 'end' | 'auto';\n\ntype FixedAxisInputDetail = {\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n overscan?: number;\n};\n\ntype FixedAxisWindowInput = {\n axes: Partial<Record<VirtualAxis, FixedAxisInputDetail>>;\n};\n\ntype VirtualAxisWindow = {\n axis: VirtualAxis;\n start: number;\n count: number;\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n visibleStart: number;\n visibleCount: number;\n guardStart: number;\n guardEnd: number;\n translateOffset: number;\n spacerSize: number;\n};\n\ntype FixedAxisWindow = VirtualWindowBase & {\n kind: 'fixed-axis';\n axes: Partial<Record<VirtualAxis, VirtualAxisWindow>>;\n};\n\ntype FixedAxisScrollTarget = {\n axis: VirtualAxis;\n index: number;\n align?: VirtualScrollAlign;\n};\n\ntype FixedAxisWindowAdapter = VirtualWindowAdapter<FixedAxisWindowInput, FixedAxisWindow> & {\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number;\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number;\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput;\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number;\n};\n\ntype VirtualWindowRequest<Window extends VirtualWindowBase> = {\n block: string;\n window: Window;\n generation: number;\n requestGeneration: number;\n};\n\ntype VirtualWindowSnapshot<Window extends VirtualWindowBase> = {\n generation: number;\n mounted: ReadonlyMap<string, Window>;\n pending: ReadonlyMap<string, VirtualWindowRequest<Window>>;\n latestDesired: ReadonlyMap<string, Window>;\n};\n\ntype VirtualWindowControllerOptions<Window extends VirtualWindowBase> = {\n onChange?(snapshot: VirtualWindowSnapshot<Window>): void;\n};\n\ntype VirtualWindowController<Input, Window extends VirtualWindowBase> = {\n computeWindow(input: Input): Window;\n shouldLoad(desired: Window, mounted?: Window | null): boolean;\n begin(block: string, desired: Window): VirtualWindowRequest<Window> | null;\n commit(request: VirtualWindowRequest<Window>, mounted?: Window): boolean;\n fail(request: VirtualWindowRequest<Window>): boolean;\n next(block: string): Window | null;\n mounted(block: string): Window | null;\n pending(block: string): VirtualWindowRequest<Window> | null;\n invalidate(): void;\n snapshot(): VirtualWindowSnapshot<Window>;\n};\n\nconst finite = (value: number, fallback = 0): number => (\n Number.isFinite(value) ? value : fallback\n);\n\nconst nonNegativeInteger = (value: number): number => (\n Math.max(0, Math.floor(finite(value)))\n);\n\nconst positive = (value: number, fallback = 1): number => (\n Math.max(Number.EPSILON, finite(value, fallback))\n);\n\nconst clamp = (value: number, minimum: number, maximum: number): number => (\n Math.min(maximum, Math.max(minimum, value))\n);\n\nconst computeAxis = (axis: VirtualAxis, input: FixedAxisInputDetail): VirtualAxisWindow => {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const buffer = nonNegativeInteger(input.buffer);\n const visibleCount = Math.min(total, Math.max(1, Math.ceil(viewportSize / itemSize)));\n const maximumVisibleStart = Math.max(0, total - visibleCount);\n const scrollOffset = clamp(\n Math.max(0, finite(input.scrollOffset)),\n 0,\n Math.max(0, total * itemSize - viewportSize),\n );\n const visibleStart = clamp(Math.floor(scrollOffset / itemSize), 0, maximumVisibleStart);\n const count = Math.min(total, visibleCount + (buffer * 2));\n const start = clamp(visibleStart - buffer, 0, Math.max(0, total - count));\n\n return {\n axis,\n start,\n count,\n total,\n itemSize,\n viewportSize,\n scrollOffset,\n buffer,\n visibleStart,\n visibleCount,\n guardStart: Math.min(total, start + buffer),\n guardEnd: Math.max(0, start + count - buffer),\n translateOffset: start * itemSize,\n spacerSize: total * itemSize,\n };\n};\n\nconst fixedAxisWindowAdapter: FixedAxisWindowAdapter = {\n compute(input: FixedAxisWindowInput): FixedAxisWindow {\n const axes: FixedAxisWindow['axes'] = {};\n if (input.axes.x) axes.x = computeAxis('x', input.axes.x);\n if (input.axes.y) axes.y = computeAxis('y', input.axes.y);\n const key = (['x', 'y'] as const)\n .map((axis) => {\n const detail = axes[axis];\n return detail ? `${axis}:${detail.start}:${detail.count}:${detail.total}` : '';\n })\n .filter(Boolean)\n .join('|');\n return {kind: 'fixed-axis', key, axes};\n },\n\n covers(mounted: FixedAxisWindow, desired: FixedAxisWindow): boolean {\n return (['x', 'y'] as const).every((axis) => {\n const wanted = desired.axes[axis];\n if (!wanted) return true;\n const current = mounted.axes[axis];\n if (!current || current.total !== wanted.total || current.itemSize !== wanted.itemSize) return false;\n const desiredEnd = wanted.visibleStart + wanted.visibleCount;\n return wanted.visibleStart >= current.guardStart && desiredEnd <= current.guardEnd;\n });\n },\n\n serialize(window: FixedAxisWindow): Record<string, string> {\n const axes: Record<string, {start: number; count: number; total: number}> = {};\n (['x', 'y'] as const).forEach((axis) => {\n const detail = window.axes[axis];\n if (detail) axes[axis] = {start: detail.start, count: detail.count, total: detail.total};\n });\n return {window: JSON.stringify(axes)};\n },\n\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.spacerSize ?? 0;\n },\n\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.translateOffset ?? 0;\n },\n\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput {\n const current = input.axes[axis];\n if (!current) return input;\n return {...input, axes: {...input.axes, [axis]: {...current, total: nonNegativeInteger(total)}}};\n },\n\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const index = clamp(nonNegativeInteger(target.index), 0, Math.max(0, total - 1));\n const itemStart = index * itemSize;\n const itemEnd = itemStart + itemSize;\n const maximum = Math.max(0, total * itemSize - viewportSize);\n let offset = itemStart;\n if (target.align === 'center') offset = itemStart - ((viewportSize - itemSize) / 2);\n else if (target.align === 'end') offset = itemEnd - viewportSize;\n else if (target.align === 'auto') {\n const current = Math.max(0, finite(input.scrollOffset));\n if (itemStart >= current && itemEnd <= current + viewportSize) return clamp(current, 0, maximum);\n offset = itemStart < current ? itemStart : itemEnd - viewportSize;\n }\n return clamp(offset, 0, maximum);\n },\n};\n\nconst createVirtualWindowController = <Input, Window extends VirtualWindowBase>(\n adapter: VirtualWindowAdapter<Input, Window>,\n options: VirtualWindowControllerOptions<Window> = {},\n): VirtualWindowController<Input, Window> => {\n let generation = 0;\n let requestGeneration = 0;\n const mountedWindows = new Map<string, Window>();\n const pendingWindows = new Map<string, VirtualWindowRequest<Window>>();\n const latestDesired = new Map<string, Window>();\n\n const snapshot = (): VirtualWindowSnapshot<Window> => ({\n generation,\n mounted: new Map(mountedWindows),\n pending: new Map(pendingWindows),\n latestDesired: new Map(latestDesired),\n });\n const notify = (): void => options.onChange?.(snapshot());\n const isCurrent = (request: VirtualWindowRequest<Window>): boolean => {\n const pending = pendingWindows.get(request.block);\n return request.generation === generation\n && pending?.requestGeneration === request.requestGeneration;\n };\n\n return {\n computeWindow: (input) => adapter.compute(input),\n shouldLoad: (desired, mounted) => !mounted || !adapter.covers(mounted, desired),\n begin(block, desired) {\n latestDesired.set(block, desired);\n if (pendingWindows.has(block) || !this.shouldLoad(desired, mountedWindows.get(block))) {\n notify();\n return null;\n }\n const request = {\n block,\n window: desired,\n generation,\n requestGeneration: ++requestGeneration,\n };\n pendingWindows.set(block, request);\n notify();\n return request;\n },\n commit(request, mounted = request.window) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n mountedWindows.set(request.block, mounted);\n notify();\n return true;\n },\n fail(request) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n notify();\n return true;\n },\n next(block) {\n if (pendingWindows.has(block)) return null;\n const desired = latestDesired.get(block);\n if (!desired) return null;\n const mounted = mountedWindows.get(block);\n if (mounted && adapter.covers(mounted, desired)) return null;\n return desired;\n },\n mounted: (block) => mountedWindows.get(block) ?? null,\n pending: (block) => pendingWindows.get(block) ?? null,\n invalidate() {\n generation += 1;\n mountedWindows.clear();\n pendingWindows.clear();\n latestDesired.clear();\n notify();\n },\n snapshot,\n };\n};\n\nexport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n};\nexport type {\n FixedAxisInputDetail,\n FixedAxisScrollTarget,\n FixedAxisWindowAdapter,\n FixedAxisWindow,\n FixedAxisWindowInput,\n VirtualAxis,\n VirtualAxisWindow,\n VirtualScrollAlign,\n VirtualWindowAdapter,\n VirtualWindowBase,\n VirtualWindowController,\n VirtualWindowControllerOptions,\n VirtualWindowKind,\n VirtualWindowRequest,\n VirtualWindowSnapshot,\n};\n","import {bool, number, oneOf, string, type SchemaToProps} from './codecs';\n\nconst VIRTUALIZER_AXES = ['vertical'] as const;\ntype VirtualizerAxis = typeof VIRTUALIZER_AXES[number];\n\nconst virtualizerSchema = {\n fetchUrl: string,\n cursor: bool,\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 {defineProps, type PropState} from './codecs';\nimport {replaceFragmentChildren} from './engine/fragment';\nimport type {TrellisAlpineComponent} from './index';\nimport {\n parseVirtualizerFragmentResponse,\n type VirtualizerFragmentPayload,\n} from './virtualizer-fragment';\nimport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n type FixedAxisWindow,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from './virtual-window';\nimport {virtualizerSchema} from './virtualizer-schema';\nimport type {\n CursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\n\ntype ResetOptions = {scrollTop?: number};\ntype SetUrlOptions = {reset?: boolean};\n\n/** Public Alpine API for `ui.virtualizer`. @public */\ninterface UiVirtualizerApi<Query = unknown> {\n /** Whether the configured cursor data source supports arbitrary index seeks. */\n readonly supportsSeek: boolean;\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 /** Replaces cursor-mode query state and resets to the first cursor. */\n setQuery(query: Query): 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<Query = unknown> = UiVirtualizerApi<Query> & {\n props: PropState<typeof virtualizerSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {\n key: string;\n element: HTMLElement;\n};\n\ntype VirtualizerOptions<Query, Content> = {\n cursor?: CursorVirtualizerOptions<Query, Content>;\n};\n\ntype CursorMounted<Content> = {\n block: BlockRecord;\n page: CursorPage<Content>;\n startIndex: number;\n count: number;\n};\n\ntype CursorRequest = {\n generation: number;\n id: number;\n aborter: AbortController;\n};\n\ntype CursorPageKind = 'page' | 'seek';\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst UiVirtualizer = <Query = unknown, Content = unknown>(\n AlpineInstance: Alpine.Alpine,\n options: VirtualizerOptions<Query, Content> = {},\n): TrellisAlpineComponent<VirtualizerData<Query>> => {\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 const cursor = options.cursor;\n let cursorQuery = cursor?.query;\n let cursorGeneration = 0;\n let cursorRequestId = 0;\n let cursorPaging = false;\n let cursorFailed = false;\n let cursorLatestScrollTop: number | null = null;\n let cursorSeekTimer = 0;\n let cursorSeekIndex: number | null = null;\n let cursorActiveSeekIndex: number | null = null;\n let cursorSeekAborter: AbortController | null = null;\n const cursorRequests = new Map<string, CursorRequest>();\n const cursorMounted = new Map<string, CursorMounted<Content>>();\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 const cursorExtent = cursorMounted.size === 0\n ? 0\n : Math.max(...[...cursorMounted.values()].map(({startIndex, count}) => startIndex + count));\n const cursorHasNext = [...cursorMounted.values()].some(({page, startIndex, count}) => (\n startIndex + count === cursorExtent && page.hasNext\n ));\n const spacerItems = cursor && totalItems === 0\n ? cursorExtent + (cursorHasNext ? integer(component.props.bufferSize, 1) : 0)\n : totalItems;\n root.toggleAttribute('data-loading', loading > 0);\n root.toggleAttribute('data-empty', cursor ? cursorMounted.size === 0 && loading === 0 : totalItems === 0);\n spacer.style.height = `${Math.max(spacerItems * 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 replaceBlock = async (\n block: BlockRecord,\n payload: VirtualizerFragmentPayload,\n shouldReplace: () => boolean,\n ): Promise<boolean> => {\n const hadFocus = block.element.contains(document.activeElement);\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace,\n });\n if (replaced && hadFocus) viewport?.focus({preventScroll: true});\n return replaced;\n };\n const positionBlock = (block: BlockRecord, startIndex: number, count: number): void => {\n block.element.style.height = `${count * component.props.itemSize}px`;\n block.element.style.transform = `translateY(${startIndex * component.props.itemSize}px)`;\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 replaced = await replaceBlock(\n block,\n payload,\n () => controller.pending(block.key) === request && !destroyed,\n );\n if (!replaced) return;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n positionBlock(block, axis.start, axis.count);\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 cursorLimit = (): number => integer(component.props.bufferSize, 1);\n const cursorRecords = (): CursorMounted<Content>[] => (\n [...cursorMounted.values()].sort((left, right) => left.startIndex - right.startIndex)\n );\n const cursorRequestIsCurrent = (block: BlockRecord, request: CursorRequest): boolean => (\n !destroyed\n && request.generation === cursorGeneration\n && cursorRequests.get(block.key)?.id === request.id\n );\n const loadCursorPage = async (\n block: BlockRecord,\n getPage: (signal: AbortSignal) => Promise<CursorPage<Content>>,\n fallbackStartIndex: number,\n suppliedAborter?: AbortController,\n kind: CursorPageKind = 'page',\n ): Promise<CursorMounted<Content> | null> => {\n if (!cursor || cursorRequests.has(block.key)) return null;\n const aborter = suppliedAborter ?? new AbortController();\n const request: CursorRequest = {\n generation: cursorGeneration,\n id: ++cursorRequestId,\n aborter,\n };\n cursorRequests.set(block.key, request);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, mode: 'cursor'});\n try {\n const page = await getPage(aborter.signal);\n if (!cursorRequestIsCurrent(block, request)) return null;\n if (page.hasNext && page.endCursor === null) {\n throw new Error('Cursor page hasNext requires a non-null endCursor.');\n }\n if (page.hasPrevious && page.startCursor === null) {\n throw new Error('Cursor page hasPrevious requires a non-null startCursor.');\n }\n if (kind === 'seek' && page.startIndex === undefined) {\n throw new Error('Cursor seek response requires startIndex.');\n }\n const payload = await cursor.responseAdapter(page.content, page);\n if (!cursorRequestIsCurrent(block, request)) return null;\n const startIndex = page.startIndex === undefined\n ? integer(fallbackStartIndex)\n : integer(page.startIndex);\n const pageTotal = payload.totalItems ?? totalItems;\n const returnedCount = payload.itemCount === undefined\n ? cursorLimit()\n : integer(payload.itemCount);\n const count = pageTotal > 0\n ? Math.min(cursorLimit(), Math.max(0, pageTotal - startIndex))\n : returnedCount;\n const replaced = await replaceBlock(\n block,\n payload,\n () => cursorRequestIsCurrent(block, request),\n );\n if (!replaced || !cursorRequestIsCurrent(block, request)) return null;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n else if (!page.hasNext) updateTotal(startIndex + count);\n const mounted = {block, page, startIndex, count};\n cursorMounted.set(block.key, mounted);\n positionBlock(block, startIndex, count);\n dispatch('ui:virtualizer-load', {\n block: block.key,\n mode: 'cursor',\n page: {...page, content: undefined},\n startIndex,\n });\n return mounted;\n } catch (error) {\n if (aborter.signal.aborted || !cursorRequestIsCurrent(block, request)) return null;\n cursorFailed = true;\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, mode: 'cursor', status: 0, error});\n return null;\n } finally {\n if (cursorRequests.get(block.key) === request) cursorRequests.delete(block.key);\n loading = Math.max(0, loading - 1);\n syncState();\n }\n };\n const finishCursorPaging = (): void => {\n cursorPaging = false;\n const scrollTop = cursorLatestScrollTop ?? viewport?.scrollTop ?? 0;\n cursorLatestScrollTop = null;\n reconcileCursor(scrollTop);\n };\n const loadInitialCursorPages = async (): Promise<void> => {\n if (!cursor || cursorPaging || cursorFailed || cursorMounted.size > 0) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n try {\n const first = await loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.first({limit: cursorLimit(), query: cursorQuery as Query, signal}),\n 0,\n );\n if (!first || generation !== cursorGeneration) return;\n let current = first;\n for (const block of blocks.slice(1)) {\n if (!current.page.hasNext || current.page.endCursor === null) break;\n const nextCursor = current.page.endCursor;\n const next = await loadCursorPage(\n block,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n current.startIndex + current.count,\n );\n if (!next || generation !== cursorGeneration) break;\n current = next;\n }\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadNextCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const last = records.at(-1);\n if (!last?.page.hasNext || last.page.endCursor === null) return;\n const recycled = records[0]?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const endCursor = last.page.endCursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.next({\n cursor: endCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n last.startIndex + last.count,\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadPreviousCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const first = records[0];\n if (!first?.page.hasPrevious || first.page.startCursor === null) return;\n const recycled = records.at(-1)?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const startCursor = first.page.startCursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.previous({\n cursor: startCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, first.startIndex - cursorLimit()),\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const clearCursorSeekTimer = (): void => {\n if (cursorSeekTimer) window.clearTimeout(cursorSeekTimer);\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n };\n const performCursorSeek = async (index: number): Promise<void> => {\n const seek = cursor?.dataSource.seek;\n if (!cursor || !seek) return;\n cursorSeekAborter?.abort();\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorPaging = true;\n const generation = cursorGeneration;\n const aborter = new AbortController();\n cursorSeekAborter = aborter;\n cursorActiveSeekIndex = index;\n const middle = blocks[1]!;\n cursorMounted.clear();\n blocks.forEach((block) => {\n if (block !== middle) void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n try {\n const resolved = await loadCursorPage(\n middle,\n (signal) => seek({index, limit: cursorLimit(), query: cursorQuery as Query, signal}),\n index,\n aborter,\n 'seek',\n );\n if (!resolved || generation !== cursorGeneration || cursorSeekAborter !== aborter) return;\n const adjacent: Array<Promise<CursorMounted<Content> | null>> = [];\n if (resolved.page.hasPrevious && resolved.page.startCursor !== null) {\n const startCursor = resolved.page.startCursor;\n adjacent.push(loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.previous({\n cursor: startCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, resolved.startIndex - cursorLimit()),\n ));\n }\n if (resolved.page.hasNext && resolved.page.endCursor !== null) {\n const endCursor = resolved.page.endCursor;\n adjacent.push(loadCursorPage(\n blocks[2]!,\n (signal) => cursor.dataSource.next({\n cursor: endCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n resolved.startIndex + resolved.count,\n ));\n }\n await Promise.all(adjacent);\n } finally {\n if (cursorSeekAborter === aborter) {\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n if (generation === cursorGeneration) finishCursorPaging();\n }\n }\n };\n const scheduleCursorSeek = (index: number): void => {\n if (!cursor?.dataSource.seek) return;\n const clamped = totalItems > 0 ? Math.min(Math.max(0, totalItems - 1), integer(index)) : integer(index);\n if (cursorRecords().some((record) => (\n clamped >= record.startIndex && clamped < record.startIndex + record.count\n ))) return;\n if (cursorSeekIndex === clamped || cursorActiveSeekIndex === clamped) return;\n clearCursorSeekTimer();\n cursorSeekIndex = clamped;\n cursorSeekTimer = window.setTimeout(() => {\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n void performCursorSeek(clamped);\n }, integer(cursor.seekDebounce ?? 100));\n };\n const reconcileCursor = (scrollTop: number): void => {\n if (!cursor) return;\n const index = totalItems > 0\n ? Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize))\n : Math.floor(Math.max(0, scrollTop) / component.props.itemSize);\n if (cursorSeekAborter && cursor.dataSource.seek && cursorActiveSeekIndex !== index) {\n cursorLatestScrollTop = scrollTop;\n scheduleCursorSeek(index);\n return;\n }\n if (cursorPaging || loading > 0) {\n cursorLatestScrollTop = scrollTop;\n return;\n }\n const records = cursorRecords();\n if (records.length === 0) {\n void loadInitialCursorPages();\n return;\n }\n const covered = records.find((record) => (\n index >= record.startIndex && index < record.startIndex + record.count\n ));\n if (covered) {\n clearCursorSeekTimer();\n if (covered === records[0] && covered.page.hasPrevious) void loadPreviousCursorPage();\n else if (covered === records.at(-1) && covered.page.hasNext) void loadNextCursorPage();\n return;\n }\n if (cursor.dataSource.seek) {\n scheduleCursorSeek(index);\n return;\n }\n if (index < records[0]!.startIndex) void loadPreviousCursorPage();\n else void loadNextCursorPage();\n };\n const reconcile = (scrollTop: number): void => {\n if (cursor) {\n reconcileCursor(scrollTop);\n return;\n }\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 cursorGeneration += 1;\n clearCursorSeekTimer();\n cursorSeekAborter?.abort();\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorMounted.clear();\n cursorPaging = false;\n cursorFailed = false;\n cursorLatestScrollTop = null;\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<Query>> = {\n supportsSeek: Boolean(cursor?.dataSource.seek),\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 if (!cursor) 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 if (cursor) {\n if (viewport) reconcileCursor(viewport.scrollTop);\n return;\n }\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 setQuery(query): void {\n if (!cursor) return;\n cursorQuery = query;\n this.reset();\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\nexport {UiVirtualizer};\nexport type {\n CursorDataSource,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\nexport type {\n ResetOptions,\n SetUrlOptions,\n UiVirtualizerApi,\n VirtualizerOptions,\n VirtualizerData,\n VirtualScrollAlign,\n};\n","type CursorPage<Content> = {\n content: Content;\n startCursor: string | null;\n endCursor: string | null;\n hasNext: boolean;\n hasPrevious: boolean;\n startIndex?: number;\n};\n\ntype CursorRenderPayload = {\n html: string;\n assets: Array<{id: string; src: string; preloads?: string[]}>;\n totalItems: number | null;\n itemCount?: number;\n};\n\ntype SoughtCursorPage<Content> = CursorPage<Content> & {\n startIndex: number;\n};\n\ntype CursorFirstArgs<Query> = {\n limit: number;\n query: Query;\n signal: AbortSignal;\n};\n\ntype CursorMoveArgs<Query> = CursorFirstArgs<Query> & {\n cursor: string;\n};\n\ntype CursorSeekArgs<Query> = CursorFirstArgs<Query> & {\n index: number;\n};\n\ntype CursorDataSource<Query, Content> = {\n first(args: CursorFirstArgs<Query>): Promise<CursorPage<Content>>;\n next(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n previous(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n seek?(args: CursorSeekArgs<Query>): Promise<SoughtCursorPage<Content>>;\n};\n\ntype CursorResponseAdapter<Content> = (\n content: Content,\n page: CursorPage<Content>,\n) => CursorRenderPayload | Promise<CursorRenderPayload>;\n\ntype CursorVirtualizerOptions<Query, Content> = {\n dataSource: CursorDataSource<Query, Content>;\n query: Query;\n responseAdapter: CursorResponseAdapter<Content>;\n seekDebounce?: number;\n};\n\ntype ServerCursorResponse = {\n content: string;\n assets?: Array<{id: string; src: string; preloads?: string[]}>;\n startCursor: string | null;\n endCursor: string | null;\n hasNext: boolean;\n hasPrevious: boolean;\n startIndex?: number;\n total?: number;\n count?: number;\n};\n\nconst serverCursorOptions = (\n element: () => HTMLElement,\n): CursorVirtualizerOptions<null, ServerCursorResponse> => {\n const requestPage = async ({\n cursor,\n direction,\n limit,\n signal,\n index,\n }: {\n cursor: string | null;\n direction: 'forward' | 'backward';\n limit: number;\n signal: AbortSignal;\n index?: number;\n }): Promise<CursorPage<ServerCursorResponse>> => {\n const fetchUrl = element().dataset.fetchUrl ?? '';\n const url = new URL(fetchUrl, document.baseURI);\n url.searchParams.set('cursor', cursor ?? '');\n url.searchParams.set('direction', direction);\n url.searchParams.set('limit', String(limit));\n if (index !== undefined) url.searchParams.set('index', String(index));\n const href = /^[a-z][a-z\\d+.-]*:/i.test(fetchUrl) || fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n const response = await fetch(href, {signal});\n if (!response.ok) throw new Error(`Cursor request failed (${response.status}).`);\n const page = await response.json() as ServerCursorResponse;\n return {...page, content: page};\n };\n return {\n query: null,\n dataSource: {\n first: ({limit, signal}) => requestPage({cursor: null, direction: 'forward', limit, signal}),\n next: ({cursor, limit, signal}) => requestPage({cursor, direction: 'forward', limit, signal}),\n previous: ({cursor, limit, signal}) => requestPage({cursor, direction: 'backward', limit, signal}),\n seek: ({index, limit, signal}) => requestPage({\n cursor: null, direction: 'forward', index, limit, signal,\n }).then((page) => {\n if (page.startIndex === undefined) throw new Error('Cursor seek response is missing startIndex.');\n return {...page, startIndex: page.startIndex};\n }),\n },\n responseAdapter: (page) => ({\n html: page.content,\n assets: page.assets ?? [],\n totalItems: page.total ?? null,\n ...(page.count === undefined ? {} : {itemCount: page.count}),\n }),\n };\n};\n\nexport {serverCursorOptions};\n\nexport type {\n CursorDataSource,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n ServerCursorResponse,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n};\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./morph-Cq3V_23_.js";import{t}from"./capability-motion-DRILCSFH.js";import{c as n,f as r,l as i,n as a,s as o,u as s}from"./codecs-Cb1ns_47.js";import{n as c,r as l,s as u,t as d}from"./dom-qAeVl7dc.js";import{i as f,t as ee}from"./alpine-machine-BTDXpEr6.js";import{t as p}from"./alpine-data-CytyCyfk.js";import{t as m}from"./anchored-popover-BXEMsLrA.js";import{n as h,t as te}from"./styles-TfvwVPGw.js";import{t as ne}from"./merge-bindings-C8ewA_FD.js";import{t as re}from"./machine-Dqut4h89.js";import{n as g,t as _}from"./props-change-2xfsIAEN.js";import{t as ie}from"./dismissable-layer-BROE-Ln2.js";import{i as ae,n as oe,r as se,t as ce}from"./form-control-DjbUb602.js";import{o as le}from"./focus-scope-DtaPVNl5.js";import{t as ue}from"./semantic-observer-CdRbZHir.js";import{n as v,t as y}from"./scroll-lock-DOw7dmi1.js";import{F as b,I as x,M as S,N as C,R as de,_ as w,a as fe,c as T,d as E,f as D,h as pe,i as O,j as k,m as me,n as A,o as j,p as he,r as M,t as N}from"./common-Dfj6NCjU.js";import{a as ge}from"./styles-CpTCQjY5.js";import{r as _e}from"./focus-handoff-BE3g0swK.js";var P=e=>e.trim().toLowerCase(),ve=e=>{if(e)try{return JSON.parse(e)}catch{return}},ye=(e,t)=>{if(!(!t||e==null))return t.split(`.`).reduce((e,t)=>{if(!(typeof e!=`object`||!e))return e[t]},e)},F=[`soft`,`surface`,`outline`,`solid`],I=[`neutral`,`accent`,`success`,`warning`,`danger`],L=j,be=[`span`,`button`],R=A,z=w,B=M;i(F,`soft`),i(I,`neutral`),i(L,`sm`),i(B,`sm`),i(be,`span`),i(R,`button`),i(z,`mini`),i(R,`button`),r.default(`close`),i(z,`mini`),i(L,`sm`),r.default(`Remove`);var V=[`listbox`,`combobox`,`pillbox`,`native`],H=T,xe=j,Se=M,Ce=x,we=N,Te=w,U=[`stay`,`close`],Ee=[`check`,`checkbox`,`none`],De=de,Oe=E,W={name:r,optionsId:r,value:r,values:o.array([]),placeholder:r,mode:i(V,`listbox`),multiple:a,searchable:a,searchMinItems:n.min(0).default(5),virtualized:a,optionsFetchUrl:r,optionsTotalItems:n.min(0).default(0),optionItemSize:n.min(2**-52).default(36),optionBufferSize:n.min(1).default(50),optionOverscan:n.min(0).default(0),optionSearchParam:r.default(`q`),optionSearchDebounce:n.min(0).default(150),selectedLabelMap:o.object({}),creatable:a,filter:a.default(!0),clearable:a,clear:i(U,`stay`),suffix:r.default(`selected`),mark:i(Ee,`check`),open:a,disabled:a,readonly:a,required:a,invalid:a,autoHighlight:a.default(!0),loop:a.default(!0),path:r,size:i(xe,`lg`),variant:i(H,`outline`),radius:i(Se,`md`),surface:i(De,`+2`),elevation:i(Oe,`3`),side:i(Ce,`bottom`),align:i(we,`start`),offset:n.clamp(-100,100).default(0),gap:n.clamp(0,50).default(4),empty:r.default(`No results found.`),icon:r,iconTrailing:r.default(`chevron__down`),iconVariant:i(Te,`outline`),buttonClass:r,inputClass:r,listboxClass:r,optionClass:r,chipVariant:i(F,`soft`),chipColor:i(I,`neutral`),chipClass:r,class:r};i(Te,`outline`),n.clamp(0,100).default(0);var ke=[f({name:`opening`,state:`disclosure.opening`,project:()=>({}),onDone:`OPENING_DONE`,onError:`OPENING_ERROR`,sends:{close:()=>({type:`CLOSE`})}}),f({name:`closing`,state:`disclosure.closing`,project:()=>({}),onDone:`CLOSING_DONE`,onError:`CLOSING_ERROR`,sends:{open:()=>({type:`OPEN`})}}),f({name:`searching`,state:`feature.searching`,project:e=>({query:e.context.search.query,optionsId:e.context.search.optionsId}),onDone:`SEARCHING_DONE`,onError:`SEARCHING_ERROR`,sends:{search:e=>({type:`SEARCH`,query:e}),close:()=>({type:`CLOSE`})}}),f({name:`creating`,state:`feature.creating`,project:e=>({query:e.context.search.query,value:e.context.creation.value}),onDone:`CREATING_DONE`,onError:`CREATING_ERROR`,sends:{close:()=>({type:`CLOSE`})}})],G=e=>g(e)?.props??null,Ae=e=>e.disabled||e.readonly,je=({event:e})=>{let t=G(e);return!t||Ae(t)||!t.open?!1:_(e,`open`,`disabled`,`readonly`)},Me=({event:e})=>{let t=G(e);return t?_(e,`open`)&&!t.open||_(e,`disabled`)&&t.disabled||_(e,`readonly`)&&t.readonly:!1},Ne=({event:e})=>{let t=G(e);return!!(t&&(_(e,`disabled`)&&t.disabled||_(e,`readonly`)&&t.readonly||_(e,`searchable`)&&!t.searchable))},K=e=>!Array.isArray(e.values)||!Array.isArray(e.labels)?null:{values:e.values.filter(e=>typeof e==`string`),labels:e.labels.filter(e=>typeof e==`string`)},Pe=({props:e,context:t,effects:n})=>re({type:`parallel`,on:{DOM_INVALIDATED:{effects:`syncDom`}},states:{disclosure:{initial:`closed`,states:{closed:{tags:[`closed`],on:{OPEN:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},TOGGLE:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},SEARCH:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},PROPS_CHANGED:{target:`opening`,guard:je,effects:`prepareOpen`}}},opening:{tags:[`visible`,`expanded`,`interactive`,`transitioning`],on:{OPENING_DONE:{target:`open`,effects:`finishOpen`},OPENING_ERROR:{target:`open`,effects:`finishOpen`},CLOSE:{target:`closing`,effects:`prepareClose`},TOGGLE:{target:`closing`,effects:`prepareClose`},CREATE:{target:`closing`,effects:`prepareClose`},SELECT:{target:`closing`,guard:`single`,effects:`prepareClose`},CLEAR:{target:`closing`,guard:`clearCloses`,effects:`prepareClose`},PROPS_CHANGED:{target:`closing`,guard:Me,effects:`prepareClose`}}},open:{tags:[`visible`,`expanded`,`interactive`,`open`],on:{CLOSE:{target:`closing`,effects:`prepareClose`},TOGGLE:{target:`closing`,effects:`prepareClose`},CREATE:{target:`closing`,effects:`prepareClose`},SELECT:{target:`closing`,guard:`single`,effects:`prepareClose`},CLEAR:{target:`closing`,guard:`clearCloses`,effects:`prepareClose`},PROPS_CHANGED:{target:`closing`,guard:Me,effects:`prepareClose`}}},closing:{tags:[`visible`,`transitioning`],on:{CLOSING_DONE:{target:`closed`,effects:`finishClose`},CLOSING_ERROR:{target:`closed`,effects:`finishClose`},OPEN:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},TOGGLE:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},SEARCH:{target:`opening`,guard:`canOpen`,effects:`prepareOpen`},PROPS_CHANGED:{target:`opening`,guard:je,effects:`prepareOpen`}}}}},feature:{initial:`idle`,on:{SELECT:{reduce:`replaceSelection`,effects:`commitSelection`},DESELECT:{reduce:`replaceSelection`,effects:`commitSelection`},SELECT_ALL:{reduce:`replaceSelection`,effects:`commitSelection`},RECONCILE_SELECTION:{reduce:`replaceSelection`,effects:`syncActive`},CLEAR:{reduce:`clear`,effects:`commitSelection`},ACTIVE:{reduce:`setActive`,effects:`syncActive`},OPTIONS_CHANGED:{effects:`syncOptions`},CLOSING_DONE:{reduce:`resetTransient`,effects:`syncActive`},CLOSING_ERROR:{reduce:`resetTransient`,effects:`syncActive`}},states:{idle:{on:{CLOSE:{},SEARCH:{target:`searching`,reduce:`setSearch`,effects:`commitSearch`},CREATE:{target:`creating`,reduce:`setCreation`,effects:`prepareCreate`},PROPS_CHANGED:{reduce:`replaceProps`,effects:`syncProps`}}},searching:{tags:[`searching`],on:{SEARCH:{target:`searching`,reduce:`setSearch`,effects:`commitSearch`},CREATE:{target:`creating`,reduce:`setCreation`,effects:`prepareCreate`},CLOSE:{target:`idle`},SEARCHING_DONE:`idle`,SEARCHING_ERROR:`idle`,PROPS_CHANGED:[{target:`idle`,guard:Ne,reduce:`replaceProps`,effects:`syncProps`},{reduce:`replaceProps`,effects:`syncProps`}]}},creating:{tags:[`creating`],on:{SEARCH:{target:`searching`,reduce:`setSearch`,effects:`commitSearch`},CREATE:{target:`creating`,reduce:`setCreation`,effects:`prepareCreate`},CLOSE:{target:`idle`},CREATING_DONE:{target:`idle`},CREATING_ERROR:{target:`idle`},PROPS_CHANGED:[{target:`idle`,guard:Ne,reduce:`replaceProps`,effects:`syncProps`},{reduce:`replaceProps`,effects:`syncProps`}]}}}}}},{context:t,props:e,reducers:{replaceProps:({event:e})=>{let t=G(e);return t?{props:t}:void 0},replaceSelection:({context:e,event:t})=>{let n=K(t);if(n)return{context:{...e,selection:n}}},clear:({context:e})=>({context:{...e,selection:{values:[],labels:[]},search:{...e.search,query:``},navigation:{activeValue:``}}}),setSearch:({context:e,event:t})=>({context:{...e,search:{query:typeof t.query==`string`?t.query:``,optionsId:typeof t.optionsId==`string`?t.optionsId:e.search.optionsId},navigation:{activeValue:typeof t.activeValue==`string`?t.activeValue:e.navigation.activeValue}}}),setActive:({context:e,event:t})=>({context:{...e,navigation:{activeValue:typeof t.value==`string`?t.value:``}}}),setCreation:({context:e,event:t})=>({context:{...e,creation:{value:typeof t.value==`string`?t.value:e.search.query}}}),resetTransient:({context:e})=>({context:{...e,search:{...e.search,query:``},navigation:{activeValue:``},creation:{value:``}}})},guards:{canOpen:({props:e})=>!Ae(e),single:({props:e})=>!e.multiple,clearCloses:({props:e})=>e.clear===`close`},effects:{prepareOpen:n.prepareOpen,finishOpen:n.finishOpen,prepareClose:n.prepareClose,finishClose:n.finishClose,commitSelection:n.commitSelection,commitSearch:n.commitSearch,prepareCreate:n.prepareCreate,syncProps:n.syncProps,syncOptions:n.syncOptions,syncActive:n.syncActive,syncDom:n.syncDom}}),Fe=640,Ie=256,Le=520,Re=.72,ze=12,Be=16,q=720,J=720,Ve=({viewportWidth:e,viewportHeight:t,layoutViewportHeight:n,referenceTop:r,referenceBottom:i,touch:a})=>{if(e<=Fe)return`fullscreen`;let o=t<Le||t<n*Re;if(a&&o)return`fullscreen`;if(a)return`dialog`;let s=Math.max(0,r),c=Math.max(0,t-i);return Math.max(s,c)<Ie?`dialog`:`anchored`},Y=()=>{let e=window.visualViewport;return e?{width:e.width,height:e.height,offsetTop:e.offsetTop,offsetLeft:e.offsetLeft}:{width:window.innerWidth,height:window.innerHeight,offsetTop:0,offsetLeft:0}},He=()=>window.matchMedia?.(`(any-pointer: coarse)`).matches===!0||navigator.maxTouchPoints>0,Ue=e=>{let t=m(e),n=!1,r=`anchored`,i=!1,a=null,o=()=>e.floating(),s=e=>{e!==i&&(i=e,e?y():v())},c=e=>{e.style.removeProperty(`border-radius`),e.style.removeProperty(`height`),e.style.removeProperty(`inset`),e.style.removeProperty(`max-height`),e.style.removeProperty(`max-width`),e.style.removeProperty(`position`),e.style.removeProperty(`transform-origin`),e.style.removeProperty(`width`)},l=(e,t)=>{let n=Y(),r=t===`dialog`?Be:ze,i=t===`dialog`?q:1/0,a=t===`dialog`?J:1/0,o=Math.min(i,Math.max(0,n.width-r*2)),s=Math.min(a,Math.max(0,n.height-r*2)),c=n.offsetLeft+(n.width-o)/2,l=n.offsetTop+(n.height-s)/2;Object.assign(e.style,{borderRadius:`var(--radius-overlay-md)`,position:`fixed`,inset:`${l}px auto auto ${c}px`,width:`${o}px`,height:`${s}px`,maxWidth:`none`,maxHeight:`none`,transformOrigin:`center`})},u=()=>{let t=Y(),n=e.reference().getBoundingClientRect();return Ve({viewportWidth:t.width,viewportHeight:t.height,layoutViewportHeight:window.innerHeight,referenceTop:n.top-t.offsetTop,referenceBottom:n.bottom-t.offsetTop,touch:He()})},d=()=>{if(!n)return;let i=o(),a=u();r=a,i.dataset.presentation=a;let d=i.querySelector(`[data-ui-select-sheet-heading]`);if(d&&(d.style.display=a===`anchored`?`none`:`flex`),a===`anchored`){i.removeAttribute(`aria-modal`),i.removeAttribute(`aria-labelledby`),i.removeAttribute(`role`),s(!1),c(i),t.mount();return}t.unmount(),i.setAttribute(`role`,`dialog`),i.setAttribute(`aria-modal`,`true`),i.setAttribute(`aria-labelledby`,e.labelId()),s(!0),l(i,a)},f=()=>{let e=()=>d(),t=window.visualViewport,n=window.matchMedia?.(`(any-pointer: coarse)`);return window.addEventListener(`resize`,e),window.addEventListener(`orientationchange`,e),t?.addEventListener(`resize`,e),t?.addEventListener(`scroll`,e),n?.addEventListener(`change`,e),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`orientationchange`,e),t?.removeEventListener(`resize`,e),t?.removeEventListener(`scroll`,e),n?.removeEventListener(`change`,e)}},ee=()=>{if(!n){n=!0;try{o().showPopover()}catch{}d(),a=f()}},p=()=>{if(n){n=!1,a?.(),a=null,t.unmount(),s(!1);try{o().hidePopover()}catch{}}};return{opened:()=>n,open:ee,close:p,sync:d,destroy:p,presentation:()=>r}},X=te({definition:{component:`ui.select`,parts:{root:{base:`relative inline-grid w-full min-w-0`},control:{base:pe,variants:{size:O,radius:fe,variant:{outline:``,filled:``,plain:``},mode:{listbox:``,combobox:``,pillbox:`flex-wrap gap-1 py-0.5`,native:``},empty:{true:``,false:``}},compounds:[{when:{mode:`pillbox`,empty:!1},class:`!pl-1.5`}],defaults:{size:`lg`,variant:`outline`,radius:`md`,mode:`listbox`,empty:!1}},button:{base:[`flex min-w-0 flex-1 items-center gap-2 border-0 bg-transparent p-0 text-left text-inherit outline-none`]},pillboxTrigger:{base:`min-w-16 self-stretch`},value:{base:`min-w-0 flex-1`},placeholder:{base:`min-w-0 flex-1 text-surface-ink-muted`},input:{base:[`w-full min-w-16 flex-1`,he]},search:{base:[`flex min-h-control-xlg shrink-0 items-center gap-2 px-3`,`text-sm`]},searchInput:{base:[`min-w-0 flex-1 text-sm`,he]},sheetHeader:{base:``},sheetHeading:{base:`min-w-0 items-center gap-3 px-4 pt-4`},sheetTitle:{base:`min-w-0 flex-1 truncate text-base font-medium`},sheetClose:{base:[`inline-flex size-control-md shrink-0 items-center justify-center rounded-control-sm border-0 bg-transparent`,`text-surface-ink-muted outline-none focus-visible:ui-focus-ring`]},chips:{base:`flex min-w-0 flex-wrap items-center gap-1`},chip:{base:[`max-w-64`]},chipLabel:{base:`block min-w-0 flex-1 truncate`},chipRemove:{base:``},icon:{base:`size-icon shrink-0 fill-current text-surface-ink-muted`,variants:{position:{leading:``,trailing:``}},defaults:{position:`leading`}},action:{base:D},popover:{base:[b,`overflow-hidden rounded-overlay-sm`]},listbox:{base:`min-h-0 outline-none`},viewport:{base:`min-h-0`},options:{base:`grid auto-rows-min content-start gap-1 p-popover-padding`},virtualOptions:{base:`grid auto-rows-min content-start gap-1 px-popover-padding`},create:{base:`shrink-0 p-popover-padding`},option:{base:[C,`[&:has([data-ui-select-option-label]>*+*)]:h-auto`,`[&:has([data-ui-select-option-label]>*+*)]:items-start`,`[&:has([data-ui-select-option-label]>*+*)]:py-2`]},optionLabel:{base:`min-w-0 flex-1 truncate`},optionMeta:{base:`ml-auto text-current opacity-70`},optionIcon:{base:k,variants:{position:{leading:``,trailing:`ml-auto`}},defaults:{position:`leading`}},optionIndicator:{base:S},group:{base:`grid auto-rows-min content-start gap-1`},label:{base:`px-menu-item-padding-inline py-1`},empty:{base:`px-menu-item-padding-inline py-2 text-sm text-surface-ink-muted`},separatorRoot:{base:`-mx-popover my-popover h-[var(--border-width-edge-separator)]`},separatorRule:{base:`h-[var(--border-width-edge-separator)] w-full border-0`},nativeWrapper:{base:`relative w-full min-w-0`},native:{base:[me,`appearance-none pe-10`],variants:{size:O,radius:fe},defaults:{size:`lg`,radius:`md`}},nativeIcon:{base:`pointer-events-none absolute right-3 top-1/2 size-icon -translate-y-1/2 fill-current text-icon`}}}}),Z=`[data-ui-select-option], [data-ui-select-option-create]`,We=`template[data-ui-select-option-selected-template]`,Q=e=>{if(!(e instanceof Element)){e.childNodes.forEach(Q);return}Array.from(e.attributes).forEach(t=>{let n=t.name;(n===`id`||n===`role`||n===`tabindex`||n.startsWith(`aria-selected`)||n.startsWith(`aria-disabled`)||n.startsWith(`data-ui-select-option`)||n.startsWith(`data-selected`)||n.startsWith(`data-highlighted`)||n.startsWith(`data-disabled`)||n.startsWith(`x-`)||n.startsWith(`@`)||n.startsWith(`:`)||n.startsWith(`on`))&&e.removeAttribute(n)}),e.childNodes.forEach(Q),e.setAttribute(`x-ignore`,`true`)},Ge=e=>{let t=document.createDocumentFragment();return Array.from(e).forEach(e=>{if(e instanceof HTMLTemplateElement&&e.matches(We))return;let n=e.cloneNode(!0);Q(n),t.append(n)}),t},Ke=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]),qe=()=>{let t=null,n=!1,r=``,i=``,a=``,o=``,f=null,p=null,m=[],te=``,re=``,g=!1,_=!1,v=null,y=``,b=0,x=0,S=0,C=0,de=new Map,w=()=>{if(!t)throw Error(`Select has not been initialized.`);return t},fe=()=>{let e=w().querySelector(`[data-ui-select-control]`);if(!e)throw Error(`Select requires a control element.`);return e},T=()=>{let e=w().querySelector(`[data-ui-select-trigger], [data-ui-select-button], [data-ui-select-input]`);if(!e)throw Error(`Select requires a trigger element.`);return e},E=()=>w().querySelector(`[data-ui-select-input]`),D=()=>w().querySelector(`[data-ui-select-search-input]`),pe=()=>{let e=w().querySelector(`[data-ui-select-sheet-title]`);if(!e)throw Error(`Select requires an adaptive picker title.`);return e},O=()=>{let e=w().querySelector(`[data-ui-select-popover]`);if(!e)throw Error(`Select requires a popover element.`);return e},k=()=>{let e=w().querySelector(`[data-ui-select-listbox]`);if(!e)throw Error(`Select requires a listbox element.`);return e},me=()=>{let e=w().querySelector(`[data-ui-select-options]`);if(!e)throw Error(`Select requires an options element.`);return e},A=()=>w().querySelector(`[data-ui-select-virtualizer]`),j=()=>A()?._x_dataStack?.find(e=>typeof e.setUrl==`function`&&typeof e.setTotalItems==`function`)??null,he=()=>w().querySelector(`[data-ui-select-chips]`),M=()=>w().querySelector(`[data-ui-select-hidden-inputs]`),N=()=>q.getCommittedSnapshot().props,F=()=>q.getCommittedSnapshot().context,I=()=>q.hasTag(`expanded`),L=()=>q.hasTag(`visible`),be=(e,t)=>{let n=e.dataset.label||e.getAttribute(`aria-label`)||``;if(n)return n;if(e.dataset.textValue)return e.dataset.textValue;let r=ye(ve(e.dataset.item),t.path);return r==null?(e.querySelector(`[data-ui-select-option-label]`)?.textContent??e.textContent??``).trim():String(r)},R=({props:e,query:t,selectedValues:n})=>{let r=P(t),i=Array.from(w().querySelectorAll(Z)).map((i,o)=>{let s=be(i,e),l=i.dataset.value||s,u=i.hasAttribute(`data-ui-select-option-create`),d=r!==``&&P(s)===r,f=!e.filter||r===``||P(`${s} ${i.dataset.suffix??``}`).includes(r),ee=Number(i.dataset.minLength??`0`);return{el:i,id:i.id||`${a}-option-${o}`,value:u?i.dataset.value||t:l,label:s,selectedLabel:i.dataset.selectedLabel||s,disabled:c({value:i.dataset.disabled}),selected:n.includes(l),visible:u?t.length>=ee&&!d:f,create:u}});return i.forEach(e=>{e.create||de.set(e.value,e.selectedLabel)}),i.some(e=>!e.create&&P(e.label)===r)?i.map(e=>e.create?{...e,visible:!1}:e):i},z=(e=F().search.query)=>R({props:N(),query:e,selectedValues:F().selection.values}),B=(e=F().search.query)=>z(e).filter(e=>e.visible&&!e.disabled&&!e.create),V=()=>{let e=N();if(!D())return!1;if(e.mode===`combobox`)return!0;let t=z(``).filter(e=>!e.create).length;return(e.virtualized?Math.max(t,e.optionsTotalItems,C):t)>=e.searchMinItems},H=(e,t=N())=>{let n=Array.from(new Set(e.filter(Boolean))),r=t.multiple?n:n.slice(0,1),i=R({props:t,query:``,selectedValues:r});return{values:r,labels:r.map(e=>i.find(t=>t.value===e)?.selectedLabel??de.get(e)??(typeof t.selectedLabelMap[e]==`string`?t.selectedLabelMap[e]:void 0)??e)}},xe=e=>e.multiple?Array.from(new Set([...e.values,...e.value?[e.value]:[]])):e.value?[e.value]:e.values.slice(0,1),Se=e=>{let t=xe(e),n=R({props:e,query:``,selectedValues:[]}).filter(e=>c({value:e.el.dataset.selected})).map(e=>e.value);return{selection:H(t.length>0?t:n,e),search:{query:``,optionsId:``},navigation:{activeValue:``},creation:{value:``}}},Ce=()=>{let{selection:e}=F(),t=N();return e.values.length===0||t.mode===`pillbox`&&t.multiple?``:t.multiple&&e.values.length>1?`${e.values.length} ${t.suffix}`:e.labels[0]??e.values[0]??``},we=e=>{let t=e.el.querySelector(We);if(t)return Ge(t.content.childNodes);let n=e.el.querySelector(`[data-ui-select-option-selected-content]`)??e.el.querySelector(`[data-ui-select-option-label]`);if(n)return Ge(n.childNodes);let r=document.createDocumentFragment();return r.append(document.createTextNode(e.selectedLabel)),r},Te=()=>{let e=N();if(n){let t=F().selection.values;(I()||!e.open||!e.disabled&&!e.readonly)&&s({el:w(),schema:W,key:`open`,value:I()}),s({el:w(),schema:W,key:`value`,value:e.multiple?``:t[0]??``}),s({el:w(),schema:W,key:`values`,value:e.multiple?[...t]:[]})}w().dataset.state=I()?`open`:`closed`,w().dataset.mark=e.mark,oe({el:w(),state:{disabled:e.disabled,required:e.required,invalid:e.invalid},value:`true`})},U=()=>N().mode===`pillbox`&&N().multiple,Ee=()=>{let e=N(),t=U()&&F().selection.values.length===0,n=fe();n.className=h({part:X.parts.control,props:{...e,mode:U()?`pillbox`:e.mode===`combobox`?`combobox`:`listbox`,empty:t}}),n.dataset.state=I()?`open`:`closed`,n.dataset.mode=U()?`pillbox`:e.mode,u({el:n,attr:`data-ui-select-pillbox-control`,present:U(),value:``}),u({el:n,attr:`data-empty`,present:t,value:`true`}),oe({el:n,state:{disabled:e.disabled,invalid:e.invalid},value:`true`})},De=()=>{let e=N(),t=T();t.id||=r,t.dataset.state=I()?`open`:`closed`,t.setAttribute(`aria-haspopup`,`listbox`),t.setAttribute(`aria-expanded`,I()?`true`:`false`),t.setAttribute(`aria-controls`,a),u({el:t,attr:`aria-invalid`,present:e.invalid,value:`true`}),t instanceof HTMLButtonElement&&(t.disabled=e.disabled);let n=Ce(),i=w().querySelector(`[data-ui-select-button-value]`),o=w().querySelector(`[data-ui-select-button-placeholder]`);if(i){i.replaceChildren();let e=F().selection.values.length===1&&n?z(``).find(e=>e.value===F().selection.values[0]):void 0;e?i.append(we(e)):i.textContent=n,i.hidden=n===``}o&&(o.hidden=U()?F().selection.values.length>0:n!==``),w().querySelectorAll(`[data-ui-select-clear], [data-ui-select-button-clear]`).forEach(t=>{t.hidden=e.disabled||!e.clearable||F().selection.values.length===0,t instanceof HTMLButtonElement&&(t.disabled=e.disabled)}),w().querySelectorAll(`[data-ui-select-search-clear]`).forEach(t=>{t.hidden=e.disabled||!F().search.query,t instanceof HTMLButtonElement&&(t.disabled=e.disabled)})},Oe=()=>{let e=N(),t=F(),n=E();n&&(n.id||=i,n.className=h({part:X.parts.input,className:e.inputClass}),n.value=U()||I()&&g?t.search.query:Ce(),n.placeholder=U()&&t.selection.values.length>0?``:e.placeholder,n.setAttribute(`role`,`combobox`),n.setAttribute(`autocomplete`,`off`),n.setAttribute(`aria-autocomplete`,`list`),n.setAttribute(`aria-expanded`,I()?`true`:`false`),n.setAttribute(`aria-controls`,a),se({input:n,state:{disabled:e.disabled,readonly:e.readonly,required:e.required,nativeRequired:!1,invalid:e.invalid,ariaRequired:e.required}}));let r=D();if(r){let n=r.closest(`[data-ui-select-search]`);n&&(n.hidden=!V()),r.value=t.search.query,r.disabled=e.disabled,r.readOnly=e.readonly}let o=z().find(e=>e.value===t.navigation.activeValue);[T(),n,r,k()].forEach(e=>{o?.id?e?.setAttribute(`aria-activedescendant`,o.id):e?.removeAttribute(`aria-activedescendant`)})},G=()=>{let e=N(),t=O(),n=k();t.id=`${a}-popover`,t.className=h({part:X.parts.popover,props:e,className:e.listboxClass}),t.dataset.uiSurface=e.surface,t.dataset.uiElevation=e.elevation,t.setAttribute(`popover`,`manual`),t.dataset.state=I()?`open`:`closed`,t.hidden=!L(),n.id=a,n.setAttribute(`role`,`listbox`),n.tabIndex=-1,n.setAttribute(`aria-labelledby`,T().id),u({el:n,attr:`aria-multiselectable`,present:e.multiple,value:`true`})},Ae=()=>{let e=N(),t=F();w().querySelectorAll(`[data-ui-select-create-query]`).forEach(e=>{e.textContent=t.search.query});let n=z();n.forEach(e=>{e.el.id=e.id,e.el.hidden=!e.visible,e.el.setAttribute(`role`,`option`),e.el.setAttribute(`aria-selected`,e.selected?`true`:`false`),e.create||(e.el.dataset.value=e.value),e.create||(e.el.dataset.label=e.label),u({el:e.el,attr:`data-selected`,present:e.selected,value:`true`}),u({el:e.el,attr:`data-highlighted`,present:e.value===t.navigation.activeValue,value:`true`}),u({el:e.el,attr:`data-disabled`,present:e.disabled,value:`true`}),u({el:e.el,attr:`aria-disabled`,present:e.disabled,value:`true`}),e.el.querySelectorAll(`[data-ui-select-option-indicator]`).forEach(t=>{u({el:t,attr:`data-selected`,present:e.selected,value:`true`})})});let r=w().querySelector(`[data-ui-select-option-empty]`);r&&(r.hidden=e.virtualized&&e.optionsFetchUrl?S!==0:n.some(e=>e.visible&&!e.create))},je=()=>JSON.stringify(Array.from(w().querySelectorAll(Z)).map(e=>({create:e.hasAttribute(`data-ui-select-option-create`),value:e.dataset.value??``,label:e.hasAttribute(`data-ui-select-option-create`)?e.textContent?.trim()??``:e.dataset.label??e.textContent?.trim()??``,disabled:e.dataset.disabled??``,selected:e.dataset.selected??``}))),Me=()=>{let e=he();if(!e)return;let t=N(),n=F(),r=z(``),i=n.selection.values.map((e,t)=>({value:e,label:n.selection.labels[t]??e,disabled:r.find(t=>t.value===e)?.disabled??!1})),a=JSON.stringify({chips:i,pillbox:U(),disabled:t.disabled,readonly:t.readonly,variant:t.chipVariant,color:t.chipColor,className:t.chipClass});if(a===re||(re=a,e.replaceChildren(),e.hidden=!U()||i.length===0,e.hidden))return;let o=h({part:ge.parts.root,props:{variant:t.chipVariant,color:t.chipColor,size:`sm`,radius:`sm`},className:h({part:X.parts.chip,props:{},className:t.chipClass})}),s=h({part:X.parts.chipLabel}),c=h({part:ge.parts.close,props:{size:`sm`},className:h({part:X.parts.chipRemove})});i.forEach(n=>{let r=document.createElement(`span`);r.className=o,r.setAttribute(`data-ui-badge`,``),r.setAttribute(`data-ui-action-recipe`,`badge`),r.setAttribute(`data-ui-select-chip`,``),r.dataset.value=n.value,r.dataset.variant=t.chipVariant,r.dataset.color=t.chipColor,r.dataset.size=`sm`,r.dataset.radius=`sm`;let i=document.createElement(`span`);i.className=s,i.setAttribute(`data-ui-select-chip-label`,``),i.textContent=n.label,r.append(i);let a=document.createElement(`button`);a.type=`button`,a.className=c,a.setAttribute(`data-ui-badge-close`,``),a.setAttribute(`data-ui-select-chip-remove`,``),a.dataset.value=n.value,a.setAttribute(`aria-label`,`Remove ${n.label}`),a.disabled=t.disabled||t.readonly||n.disabled;let l=w().querySelector(`[data-ui-select-chip-remove-icon]`);l?a.append(l.content.cloneNode(!0)):a.textContent=`x`,r.append(a),e.append(r)})},Ne=()=>{let e=M();if(!e)return;let t=N();te=ae({container:e,state:{name:t.name,required:t.required,values:t.disabled?[]:[...F().selection.values],form:w().dataset.form??``,marker:`data-ui-select-hidden-input`},currentKey:te})},K=()=>{Te(),Ee(),De(),Oe(),G(),Ae(),Me(),Ne()},Fe=()=>{if(!t||!q.hasTag(`interactive`))return;let e=N();f?.presentation()===`anchored`?e.mode===`combobox`?E()?.focus({preventScroll:!0}):V()?D()?.focus({preventScroll:!0}):T().focus({preventScroll:!0}):((V()?D():null)??w().querySelector(`[data-ui-select-sheet-close]`)??k()).focus({preventScroll:!0})},Ie=()=>{if(F().navigation.activeValue)return;let e=B(),t=F().selection.values.map(t=>e.find(e=>e.value===t)).find(e=>e!==void 0);t&&Y(t.value)},Le=()=>{let e=F(),t=H(e.selection.values);Ke(t.labels,e.selection.labels)||q.send({type:`RECONCILE_SELECTION`,...t});let n=B();e.navigation.activeValue&&!n.some(t=>t.value===e.navigation.activeValue)&&q.send({type:`ACTIVE`,value:N().autoHighlight?n[0]?.value??``:``}),K()},Re=e=>{let t=(Array.isArray(e.changes)?e.changes:[]).flatMap(e=>e&&typeof e==`object`&&`key`in e?[String(e.key)]:[]);if(t.some(e=>e===`value`||e===`values`||e===`multiple`||e===`selectedLabelMap`)){let e=H(xe(N()));q.send({type:`RECONCILE_SELECTION`,...e})}t.includes(`optionsTotalItems`)&&(S=N().optionsTotalItems,C=S,j()?.setTotalItems(S)),K()},ze=e=>{let t=N(),n=new URL(t.optionsFetchUrl,document.baseURI);return e?n.searchParams.set(t.optionSearchParam,e):n.searchParams.delete(t.optionSearchParam),/^[a-z][a-z\d+.-]*:/i.test(t.optionsFetchUrl)||t.optionsFetchUrl.startsWith(`//`)?n.href:`${n.pathname}${n.search}${n.hash}`},Be=()=>{window.clearTimeout(x);let e=N();!e.virtualized||!e.optionsFetchUrl||!e.searchable&&e.mode!==`combobox`||(x=window.setTimeout(()=>{let t=j();t&&(t.setUrl(ze(F().search.query),{reset:!0}),S===0&&e.optionsTotalItems>0&&(S=e.optionsTotalItems,t.setTotalItems(S)))},e.optionSearchDebounce))},q=ee({schema:W,hooks:ke,createMachine:({props:t})=>Pe({props:t,context:Se(t),effects:{prepareOpen:()=>{_=!1,f?.open(),Ie(),K(),queueMicrotask(Fe)},finishOpen:()=>{K(),l({el:w(),name:`ui:open`})},prepareClose:({event:e})=>{g=!1,_=e.restoreFocus===!0||e.type===`SELECT`||e.type===`CREATE`,_&&T().focus({preventScroll:!0}),K()},finishClose:()=>{f?.close(),K(),_&&T().focus({preventScroll:!0}),_=!1,l({el:w(),name:`ui:close`})},commitSelection:({event:t})=>{K(),e(w(),`data-value`,`data-values`),ce({container:M(),fallback:w(),marker:`data-ui-select-hidden-input`});let{selection:n}=F();t.type===`CLEAR`&&l({el:w(),name:`ui:clear`}),l({el:w(),name:`ui:change`,detail:{value:n.values[0]??``,values:[...n.values],label:n.labels[0]??``,labels:[...n.labels],option:v}}),v=null},commitSearch:()=>{K(),l({el:w(),name:`ui:search`,detail:{search:F().search.query}}),Be()},prepareCreate:({event:e})=>{K(),l({el:w(),name:`ui:create`,detail:{search:F().search.query,value:F().creation.value,modal:typeof e.modal==`string`?e.modal:``}})},syncProps:({event:e})=>Re(e),syncOptions:Le,syncActive:K,syncDom:K}})}),J=(e,t)=>q.send({type:e,...t}),Ve=(e,t)=>{t?.preventDefault();let n=N();if(!(n.disabled||n.readonly||e.disabled)){if(e.create){q.send({type:`CREATE`,value:e.value||F().search.query,modal:e.el.dataset.modal??``});return}v=e.el,g=!1,J(`SELECT`,H(n.multiple?F().selection.values.includes(e.value)?F().selection.values.filter(t=>t!==e.value):[...F().selection.values,e.value]:[e.value]))}},Y=e=>{if(e===F().navigation.activeValue)return;q.send({type:`ACTIVE`,value:e});let t=z().find(t=>t.value===e);l({el:w(),name:`ui:highlight`,detail:{value:e,option:t?.el??null}})},He=e=>{let t=B();if(t.length===0)return;let n=t.findIndex(e=>e.value===F().navigation.activeValue),r=n<0?e>0?0:t.length-1:n+e;r>=t.length&&(r=N().loop?0:t.length-1),r<0&&(r=N().loop?t.length-1:0),Y(t[r]?.value??``)},Q=e=>{let t=N();if(t.disabled||t.readonly)return;g=!0;let n=t.autoHighlight?B(e)[0]?.value??``:``;q.send({type:`SEARCH`,query:e,optionsId:o,activeValue:n})},qe=e=>{if(e.key===`Tab`&&f?.presentation()!==`anchored`){le(e,O());return}let t=e.target instanceof HTMLInputElement;if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault(),I()||q.send({type:`OPEN`}),He(e.key===`ArrowDown`?1:-1);return}if(!t&&I()&&(e.key===`Home`||e.key===`End`)){e.preventDefault();let t=B();Y(e.key===`Home`?t[0]?.value??``:t.at(-1)?.value??``);return}if(I()&&(e.key===`Enter`||!t&&e.key===` `)){let t=z().find(e=>e.value===F().navigation.activeValue);t&&Ve(t,e);return}if((e.key===`Backspace`||e.key===`Delete`)&&U()&&!F().search.query){let t=E();if(t&&(t.selectionStart!==0||t.selectionEnd!==0))return;let n=[...F().selection.values].reverse().find(e=>!z(``).find(t=>t.value===e)?.disabled);n&&(e.preventDefault(),$.deselect(n,e));return}if(e.key===`Escape`&&L()){e.preventDefault(),e.stopPropagation(),q.send({type:`CLOSE`,restoreFocus:!0});return}if(!t&&!V()&&e.key.length===1&&!e.metaKey&&!e.ctrlKey&&!e.altKey){y+=e.key.toLowerCase(),window.clearTimeout(b),b=window.setTimeout(()=>{y=``},500);let t=B().find(e=>P(e.label).startsWith(y));t&&Y(t.value)}},Je=()=>{let e=w(),t=(e,t)=>t.closest(`[data-ui-select-trigger], [data-ui-select-icon="trailing"], [data-ui-select-control]`)?(e.preventDefault(),e instanceof PointerEvent||e instanceof MouseEvent&&e.detail>0?_e(T()):T().focus({preventScroll:!0}),T()instanceof HTMLInputElement?I()||q.send({type:`OPEN`}):$.toggle(e),!0):!1;d({target:e,event:`click`,cleanup:m,handler:e=>{let n=e.target;if(!(n instanceof Element))return;if(n.closest(`[data-ui-select-sheet-close]`)){$.close(e);return}if(n.closest(`[data-ui-select-search-clear]`)){e.preventDefault(),Q(``);return}if(n.closest(`[data-ui-select-clear], [data-ui-select-button-clear]`)){$.clear(e);return}let r=n.closest(`[data-ui-select-chip-remove]`);if(r){$.deselect(r.dataset.value??``,e);return}let i=n.closest(Z);if(i){let t=z().find(e=>e.el===i);t&&Ve(t,e);return}(!(e instanceof MouseEvent)||e.detail===0)&&t(e,n)}}),d({target:e,event:`input`,cleanup:m,handler:e=>{let t=e.target;t instanceof HTMLInputElement&&t.matches(`[data-ui-select-input], [data-ui-select-search-input]`)&&Q(t.value)}}),d({target:e,event:`keydown`,cleanup:m,handler:e=>{e instanceof KeyboardEvent&&qe(e)}}),d({target:e,event:`pointerdown`,cleanup:m,handler:e=>{let n=e.target;if(n instanceof Element){if(n.closest(Z)||n.closest(`[data-ui-select-search-clear]`)||n.closest(`[data-ui-select-clear], [data-ui-select-button-clear], [data-ui-select-chip-remove]`)){e.preventDefault();return}t(e,n)}}}),d({target:e,event:`pointerover`,cleanup:m,handler:e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest(Z),r=n?z().find(e=>e.el===n):void 0;r&&r.visible&&!r.disabled&&Y(r.value)}}),d({target:e,event:`focusout`,cleanup:m,handler:t=>{if(!(t instanceof FocusEvent))return;let n=t.relatedTarget;n instanceof Node&&e.contains(n)||L()&&q.send({type:`CLOSE`})}}),d({target:e,event:`ui:virtualizer-total-change`,cleanup:m,handler:e=>{if(!(e instanceof CustomEvent)||!A()?.contains(e.target))return;let t=Number(e.detail?.totalItems);Number.isFinite(t)&&t>=0&&(S=Math.floor(t),C=Math.max(C,S)),q.send({type:`OPTIONS_CHANGED`})}}),d({target:e,event:`ui:virtualizer-load`,cleanup:m,handler:e=>{A()?.contains(e.target)&&q.send({type:`OPTIONS_CHANGED`})}}),d({target:O(),event:`toggle`,cleanup:m,handler:e=>{!(`newState`in e)||e.newState!==`closed`||!L()||q.send({type:`CLOSE`})}}),m.push(ie({isEnabled:()=>q.hasTag(`interactive`),roots:()=>[w(),O()],onDismiss:()=>q.send({type:`CLOSE`})})),p=ue({targets:k(),read:je,onChange:()=>q.send({type:`OPTIONS_CHANGED`}),observer:{childList:!0,subtree:!0}})},$;return $={...q,get isOpen(){return this.snapshot.current?.tags.includes(`expanded`)??!1},get isSearching(){return this.snapshot.current?.tags.includes(`searching`)??!1},get value(){return this.snapshot.current?.context.selection.values[0]??``},get values(){return[...this.snapshot.current?.context.selection.values??[]]},get selectedLabels(){return[...this.snapshot.current?.context.selection.labels??[]]},get search(){return this.snapshot.current?.context.search.query??``},get activeValue(){return this.snapshot.current?.context.navigation.activeValue??``},init(){t=this.$el,r=this.$id(`select-button`),i=this.$id(`select-input`),a=this.$id(`select-listbox`),o=me().id||w().dataset.optionsId||this.$id(`select-options`),me().id=o,q.connect(this.$el,this.snapshot),S=N().optionsTotalItems,C=S,pe().id||=`${a}-title`,f=Ue({reference:fe,floating:O,labelId:()=>pe().id,position:()=>N().side,align:()=>N().align,gap:()=>N().gap,offset:()=>N().offset,matchReferenceWidth:!0}),Je(),K(),n=!0,N().open&&!N().disabled&&!N().readonly&&queueMicrotask(()=>q.send({type:`OPEN`}))},destroy(){window.clearTimeout(b),window.clearTimeout(x),p?.(),p=null,m.forEach(e=>e()),m=[],f?.destroy(),f=null,q.disconnect(),t=null},get root(){let e=this.snapshot.current?.props??N();return ne({inputs:[h({part:X.parts.root,props:e,className:e.class}),{"data-ui-select":``,":data-state":()=>q.hasTag(`expanded`)?`open`:`closed`}]})},open(e){e?.preventDefault(),!(N().disabled||N().readonly)&&q.send({type:`OPEN`})},close(e){e?.preventDefault(),q.send({type:`CLOSE`,restoreFocus:e instanceof KeyboardEvent})},toggle(e){e?.preventDefault(),!(N().disabled||N().readonly)&&q.send({type:`TOGGLE`})},select(e,t){let n=z(``).find(t=>!t.create&&t.value===e);n&&Ve(n,t)},deselect(e,t){t?.preventDefault(),!(N().disabled||N().readonly)&&(z(``).find(t=>t.value===e)?.disabled||J(`DESELECT`,H(F().selection.values.filter(t=>t!==e))))},selectAll(e){if(e?.preventDefault(),!N().multiple||N().disabled||N().readonly)return;let t=B();J(`SELECT_ALL`,{values:t.map(e=>e.value),labels:t.map(e=>e.selectedLabel)})},clear(e){if(e?.preventDefault(),e?.stopPropagation(),N().disabled||N().readonly)return;g=!1;let t=F().search.query!==``;q.send({type:`CLEAR`}),t&&Be()},setSearch:Q},$},Je=p(`UiSelect`,qe),$=new WeakSet,Ye=e=>{$.has(e)||($.add(e),t(e),Je(e))};export{qe as n,Ye as t};
2
- //# sourceMappingURL=entry.generated-CPzThz_M.js.map