@vireo-ai/trellis-ui 0.1.37 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/client/src/styles/generated-sources.css +1 -1
- package/packages/client/types/assets/full-runtime.generated.d.ts +1 -1
- package/packages/client/types/component-api.d.ts +1 -0
- package/packages/client/types/components/entry.generated.d.ts +1 -0
- package/packages/client/types/components/runtime.d.ts +2 -0
- package/packages/client/types/components/virtualizer/contract.d.ts +29 -0
- package/packages/client/types/components/virtualizer/entry.generated.d.ts +5 -0
- package/packages/client/types/components/virtualizer/index.d.ts +31 -0
- package/packages/client/types/components/virtualizer/runtime-docs.d.ts +2 -0
- package/packages/client/types/runtime/engine/fragment.d.ts +11 -0
- package/packages/client/types/runtime/engine/request.d.ts +1 -5
- package/packages/client/types/runtime/engine/stream.d.ts +3 -1
- package/packages/client/types/runtime/index.d.ts +2 -0
- package/packages/client/types/runtime/virtual-window.d.ts +85 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +3 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +261 -222
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-CHT-6DKB.js → capability-motion-VFYcNVM5.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-motion-CHT-6DKB.js.map → capability-motion-VFYcNVM5.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CIC0ACle.js → capability-sortable-l7SPMutG.js} +3 -3
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-CIC0ACle.js.map → capability-sortable-l7SPMutG.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-LsAXy99P.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-LsAXy99P.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DeIdrz3R.js → entry.generated-2VgVfygk.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DeIdrz3R.js.map → entry.generated-2VgVfygk.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CaapC7Ct.js → entry.generated-BVBXXN6t.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CaapC7Ct.js.map → entry.generated-BVBXXN6t.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Cj3Cx01k.js → entry.generated-Bsennsyl.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Cj3Cx01k.js.map → entry.generated-Bsennsyl.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated--6MGmLYe.js → entry.generated-D91HRlIV.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated--6MGmLYe.js.map → entry.generated-D91HRlIV.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-GsY6gpiw.js → entry.generated-DI48yD0K.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-GsY6gpiw.js.map → entry.generated-DI48yD0K.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DuNS3MYH.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DuNS3MYH.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CMEyTYos.js → entry.generated-DvAia1Wz.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CMEyTYos.js.map → entry.generated-DvAia1Wz.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B-DK_TD9.js → entry.generated-LUzMUcng.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B-DK_TD9.js.map → entry.generated-LUzMUcng.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-1CSz8kEV.js → entry.generated-UHQD4FyC.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-1CSz8kEV.js.map → entry.generated-UHQD4FyC.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-IfKkAqoN.js → entry.generated-bERshNT6.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-IfKkAqoN.js.map → entry.generated-bERshNT6.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BhPEF6oz.js → entry2.generated-BhPEF6oz.js} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-BhPEF6oz.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/fragment-Bl3Rq38L.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/fragment-Bl3Rq38L.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-Dmm9SoIv.js → motion-D44EkjK3.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{motion-Dmm9SoIv.js.map → motion-D44EkjK3.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-BWVDkV-D.js +4 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-BWVDkV-D.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/table.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/virtualizer.js +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +100 -74
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +9 -9
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +9 -9
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-D8VKfoWC.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-D8VKfoWC.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BhPEF6oz.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-DQwcal8k.js +0 -4
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-DQwcal8k.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,d as t,f as n,h as r,l as i,o as a,s as o,t as s,u as c,v as l}from"./ui-DQwcal8k.js";import{d as u}from"./codecs-Cb1ns_47.js";import{n as d}from"./alpine-machine-BS13dbK4.js";var f=`Are you sure?`,p=null,m=new WeakSet,h=e=>e instanceof HTMLButtonElement||e instanceof HTMLInputElement,g=({form:e,submitter:t})=>{let n=t?.dataset.uiConfirm;if(n!==void 0)return n||f;let r=e.dataset.uiConfirm;return r===void 0?null:r||f},_=({form:e,submitter:t})=>{window.setTimeout(()=>{if(!(!e.isConnected||t&&t.form!==e)){m.add(e);try{e.requestSubmit(t??void 0)}finally{m.delete(e)}}},0)},v=e=>{let t=e.target;if(!(t instanceof HTMLFormElement))return;if(m.has(t)){m.delete(t);return}let n=h(e.submitter)?e.submitter:null,r=g({form:t,submitter:n});if(r===null)return;e.preventDefault();let i=!1,a=()=>{i||(i=!0,_({form:t,submitter:n}))},o=()=>{i=!0},s=new CustomEvent(`ui:confirm`,{bubbles:!0,cancelable:!0,detail:{form:t,message:r,submitter:n,triggeringEvent:e,proceed:a,cancel:o}});t.dispatchEvent(s),!s.defaultPrevented&&(window.confirm(r)?a():o())},y=({root:e=document}={})=>{p||=(e.addEventListener(`submit`,v,{capture:!0}),()=>e.removeEventListener(`submit`,v,{capture:!0}))},ee=e=>e.replace(/([A-Z])/g,`_$1`).toLowerCase(),b=({manifest:e})=>Object.freeze(e),x=({schema:e,details:t})=>Object.fromEntries(Object.entries(e).map(([e,n])=>{let r=t[e]??{},i=n.meta,a={type:i.type,default:i.default};return i.values&&(a.values=i.values),r.description&&(a.description=r.description),r.initialOnly&&(a.initialOnly=!0),[r.name??ee(e),a]})),S=[`light`,`dark`,`system`],C=e=>typeof e==`string`&&S.includes(e),w=e=>C(e)?e:`system`,T=()=>document.documentElement.dataset.themeStorageKey||`trellis-ui-theme`,E=()=>w(document.documentElement.dataset.theme),te=()=>{try{return w(window.localStorage.getItem(T())||E())}catch{return E()}},ne=e=>{try{window.localStorage.setItem(T(),e)}catch{}},re=()=>window.matchMedia(`(prefers-color-scheme: dark)`).matches,ie=e=>e===`dark`||e===`system`&&re(),D=e=>{let t=ie(e),n=t?`dark`:`light`,r=document.documentElement;return r.classList.toggle(`dark`,t),r.dataset.theme=e,r.dataset.resolvedTheme=n,r.dispatchEvent(new CustomEvent(`ui:theme-change`,{detail:{mode:e,resolved:n,dark:t,on:t},bubbles:!0})),{mode:e,resolved:n,dark:t,on:t}},ae=()=>{let e=D(te());return{mode:e.mode,resolved:e.resolved,dark:e.dark,on:e.on,set(e){let t=w(e);ne(t);let n=D(t);this.mode=n.mode,this.resolved=n.resolved,this.dark=n.dark,this.on=n.on},toggle(){this.set(this.dark?`light`:`dark`)}}},oe=e=>{if(typeof e.store!=`function`)return;let t=e.store(`theme`)??ae();e.store(`theme`,t),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{if(t.mode!==`system`)return;let e=D(`system`);t.mode=e.mode,t.resolved=e.resolved,t.dark=e.dark,t.on=e.on})},se=(e,t)=>{if(!(!e||typeof t.evaluate!=`function`))return t.evaluate(e)},ce=e=>{if(typeof e==`string`)return{key:e};if(typeof e==`object`&&e){let t=e.key??e.id;return t?{key:t}:{}}return{}},le=e=>{e.directive(`ui-layout`,(e,{expression:t},n)=>{if(!(e instanceof Element))return;let r=l(e,ce(se(t,n)));n.cleanup?.(()=>{r()})})},O=[`altKey`,`ctrlKey`,`metaKey`,`shiftKey`],k=new WeakSet,A=(e,{expression:t},n)=>c(n,e,t??``),j=e=>e.submitter instanceof HTMLElement?e.submitter:null,M=(e,t,n)=>t.defaultPrevented||(n?.getAttribute(`formmethod`)||e.getAttribute(`method`))?.toLowerCase()===`dialog`||e.getAttribute(`target`)||n?.getAttribute(`formtarget`)?!1:!e.noValidate&&!e.checkValidity()?(e.reportValidity(),!1):!0,N=e=>e.hash!==``&&e.origin===window.location.origin&&e.pathname===window.location.pathname&&e.search===window.location.search,P=(e,t,n)=>{if(t.defaultPrevented||t.button!==0||n&&O.some(e=>t[e])||e.hasAttribute(`download`)||e.getAttribute(`target`))return!1;let r=new URL(e.href,document.baseURI);return r.origin===window.location.origin?!N(r):!1},F=(t,i,a,o,s)=>{let c=c=>{if(k.delete(i))return;let l=j(c);if(!M(i,c,l))return;let u=A(i,a,o.Alpine);if(u){if(c.preventDefault(),s.navigate){e(t,i.action,i,{...u,source:i,submitter:l});return}n(t,void 0,{...u,source:i,submitter:l}).then(e=>{e.type===`unavailable`&&(k.add(i),i.requestSubmit(l??void 0))}).catch(e=>r(`x-ui-request: request failed`,e))}};i.addEventListener(`submit`,c),o.cleanup?.(()=>i.removeEventListener(`submit`,c))},I=(t,i,a,o,s)=>{let c=c=>{if(!P(i,c,s.navigate))return;let l=A(i,a,o.Alpine);if(l){if(c.preventDefault(),s.navigate){e(t,i.href,i,l);return}n(t,i.href,{...l,method:l.method??`GET`,source:i}).then(e=>{e.type===`unavailable`&&window.location.assign(i.href)}).catch(e=>r(`x-ui-request: request failed`,e))}};i.addEventListener(`click`,c),o.cleanup?.(()=>i.removeEventListener(`click`,c))},L=e=>{e.addRootSelector(()=>i),t(e),a(e),e.directive(`ui-request`,(t,{expression:n,modifiers:i},a)=>{let o={expression:n};if(t instanceof HTMLFormElement){F(e,t,o,a,{navigate:i.includes(`navigate`)});return}if(t instanceof HTMLAnchorElement){I(e,t,o,a,{navigate:i.includes(`navigate`)});return}r(`x-ui-request: directive only supports forms and anchors`,t)})},R=(e,t)=>{let n=!0,r=!1,i,a,o=new Promise(e=>{a=e});return e(e=>{if(n){r=!0,i=e;return}a(e)},{scope:{$transition:t}}),n=!1,r?i:o},z=e=>{e.directive(`ui-transition`,e.skipDuringClone((t,{value:n,expression:i},a)=>{if(!n){r(`x-ui-transition requires a transition name`,t);return}let o=d(e,t);if(!o){r(`x-ui-transition:${n} requires an owning Trellis machine`,t);return}let s=i?.trim()?a.evaluateLater(i):null,c=o.onTransition(n,e=>s?R(s,e):void 0,t);a.cleanup(c)}))},B=()=>{},V,H=class{startComment;endComment;constructor(e,t){this.startComment=e,this.endComment=t}get children(){let e=[],t=this.startComment.nextSibling;for(;t&&t!==this.endComment;)t instanceof Element&&e.push(t),t=t.nextSibling;return e}get firstChild(){let e=this.startComment.nextSibling;return e===this.endComment?null:e}appendChild(e){return this.endComment.before(e),e}insertBefore(e,t){return(t??this.endComment).before(e),e}nextNode(e){let t=e.nextSibling;return t===this.endComment?null:t}},U=(e,t)=>e instanceof H?e.nextNode(t):t.nextSibling,ue=e=>{let t=document.createElement(`template`);t.innerHTML=e;let n=t.content.firstElementChild;if(!n)throw Error(`Morph HTML must contain a root element.`);return n},de=(e,t)=>{t.namespaceURI?e.setAttributeNodeNS(t.cloneNode()):t.name.includes(`@`)?e.setAttributeNode(t.cloneNode()):e.setAttribute(t.name,t.value)},W=(e,t)=>{let n=!1;return e(t,()=>{n=!0}),n},G=e=>e?.nodeType===Node.COMMENT_NODE&&e.textContent===`[if BLOCK]><![endif]`,K=e=>e?.nodeType===Node.COMMENT_NODE&&e.textContent===`[if ENDBLOCK]><![endif]`,q=(e,t)=>{let n=0,r=t;for(;r=U(e,r);)if(G(r))n+=1;else if(K(r)&&n>0)--n;else if(K(r))return r;throw Error(`Unclosed conditional morph block.`)},J=e=>{let t=e;if(e._x_lastRenderedEl)t=e._x_lastRenderedEl;else if(e._x_currentIfEl)t=J(e._x_currentIfEl).end;else if(e._x_lookup?.size){let n=new Set(e._x_lookup.values()),r=e.nextSibling;for(;r&&n.has(r);)t=J(r).end,r=t.nextSibling}return{start:e,end:t}},Y=(e,t)=>U(e,t.end),X=(e,t)=>{if(e.nodeType!==t.nodeType||e.nodeName!==t.nodeName)return!1;if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.COMMENT_NODE)return e.nodeValue===t.nodeValue;if(e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement){let n=e,r=t;if(n._x_teleport){let e=r._x_teleport??t.content.firstElementChild;return!!(e&&X(n._x_teleport,e))}return e.isEqualNode(t)}if(e instanceof Element&&t instanceof Element){if(e.attributes.length!==t.attributes.length)return!1;for(let{name:n,value:r}of e.attributes)if(t.getAttribute(n)!==r)return!1}let n=e.firstChild,r=t.firstChild;for(;n&&r;){if(!X(n,r))return!1;n=J(n).end.nextSibling,r=r.nextSibling}return n===null&&r===null},fe=(e,t,n)=>{if(t.start===n||Y(e,t)===n)return;let r=t.start;for(;r;){let i=r.nextSibling;if(e.insertBefore(r,n),r===t.end)break;r=i}},pe=(e,t)=>{let n=t?._x_bindings?.id;!n||!(e instanceof Element)||(e.setAttribute(`id`,n),e.id=n)},me=(e,t,n)=>{let r=new WeakMap,i=e.map(n).filter(Boolean),a=t.map(n).filter(Boolean);if(!(i.length>=2&&i.length===a.length&&new Set(i).size===i.length&&i.some((e,t)=>e!==a[t])&&i.every(e=>a.includes(e))))return r;let o=e=>{let t=new Map,n=e=>{e.id&&t.set(e.id,(t.get(e.id)??0)+1)};for(let t of e)n(t),t.querySelectorAll(`[id]`).forEach(n);return t},s=o(e),c=o(t),l=new Map;for(let[e,t]of s)t===1&&c.get(e)===1&&l.set(e,Symbol(e));let u=e=>{if(!n(e))for(let t of e.querySelectorAll(`[id]`)){let n=l.get(t.id);if(n){r.set(e,n);return}}};return e.forEach(u),t.forEach(u),r},Z=(e={})=>{let t={key:e.key??(e=>e.getAttribute(`key`)),lookahead:e.lookahead??!1,updating:e.updating??B,updated:e.updated??B,removing:e.removing??B,removed:e.removed??B,adding:e.adding??B,added:e.added??B,skipUntilCondition:null},n=e=>e instanceof Element?t.key(e):null,r=(e,t)=>e.nodeType!==t.nodeType||e.nodeName!==t.nodeName||n(e)!==n(t),i=(e,n,r)=>{if(W(t.adding,n))return{inserted:!1,node:null};let i=n.cloneNode(!0);return e.insertBefore(i,r),t.added(i),{inserted:!0,node:i}},a=e=>W(t.removing,e)?!1:(e.parentNode?.removeChild(e),t.removed(e),!0),o=e=>W(t.removing,e.start)?!1:(e.start.parentNode?.removeChild(e.start),t.removed(e.start),!0),s=(e,n)=>{if(W(t.removing,e))return!1;let r=n.cloneNode(!0);return W(t.adding,r)?!1:(e.parentNode?.replaceChild(r,e),t.removed(e),t.added(r),!0)},c=(e,t)=>{if(e._x_transitioning||e._x_isShown&&!t._x_isShown||!e._x_isShown&&t._x_isShown)return!1;let n=!1,r=Array.from(e.attributes);for(let i=r.length-1;i>=0;--i){let a=r[i].name;t.hasAttribute(a)||(a===`open`&&e instanceof HTMLDialogElement&&e.open?e.close():e.removeAttribute(a),n=!0)}let i=Array.from(t.attributes);for(let t=i.length-1;t>=0;--t){let r=i[t],{name:a,value:o}=r;e.getAttribute(a)!==o&&(de(e,r),n=!0)}return n},l,u=(e,n,i)=>{if(e instanceof Element&&e.hasAttribute(`data-ui-ignore-morph`))return!1;if(r(e,n))return s(e,n);if(i===`before-descendant-hook`&&e.nodeType!==Node.COMMENT_NODE&&X(e,n))return!1;let a=!1,o=!1,u=!1;if(t.updating(e,n,()=>{a=!0},()=>{u=!0},()=>{o=!0},e=>{t.skipUntilCondition=e}),u||X(e,n))return!1;let f=!1;return e.nodeType===Node.ELEMENT_NODE&&V&&(V.cloneNode(e,n),e._x_teleport&&n._x_teleport&&(f=d(e._x_teleport,n._x_teleport)||f)),n.nodeType===Node.TEXT_NODE||n.nodeType===Node.COMMENT_NODE?e.nodeValue===n.nodeValue?!1:(e.nodeValue=n.nodeValue,t.updated(e,n),!0):(a||(f=c(e,n)||f),o||(f=l(e,n)||f),f&&t.updated(e,n),f)},d=(e,t)=>u(e,t,`before-descendant-hook`);return l=(e,r)=>{let s=Array.from(e.children),c=me(s,Array.from(r.children),n),u=e=>e?n(e)||c.get(e):null,f=new Map;for(let e of s){let t=u(e);t&&f.set(t,e)}let p=!1,m=e.firstChild,h=r.firstChild;incoming:for(;h;){if(pe(h,m),t.skipUntilCondition){let n=!m||t.skipUntilCondition(m),i=t.skipUntilCondition(h);if(n&&i)t.skipUntilCondition=null;else{!n&&m&&(m=Y(e,J(m))),i||(h=U(r,h));continue}}if(!m){p=i(e,h,null).inserted||p,h=U(r,h);continue}if(G(m)&&G(h)){let t=q(e,m),n=q(r,h);p=l(new H(m,t),new H(h,n))||p,m=U(e,t),h=U(r,n);continue}else{if(t.lookahead&&m instanceof Element&&!m.isEqualNode(h)){let t=U(r,h);for(;t;){if(t instanceof Element&&m.isEqualNode(t)){let t=i(e,h,m);if(!t.inserted){h=U(r,h);continue incoming}m=t.node,p=!0;break}t=U(r,t)}}let n=u(h),a=u(m);if(n!==a){let t=n?f.get(n):void 0;if(t)fe(e,J(t),m),m=t,p=!0;else if(n||a){let t=i(e,h,m);if(!t.inserted){h=U(r,h);continue}m=t.node,p=!0}}let o=Y(e,J(m));p=d(m,h)||p,m=o}h=U(r,h)}for(;m;){let t=J(m),n=Y(e,t);p=(t.end===t.start?a(m):o(t))||p,m=n}return p},{patchChildren:l,patchRoot:(e,t)=>u(e,t,`after-root-hook`)}},Q=(e,t,n={})=>{let r=typeof t==`string`?ue(t):t,i=e;return V?.closestDataStack&&!i._x_dataStack&&(r._x_dataStack=V.closestDataStack(i),r._x_dataStack&&V.cloneNode(i,r)),Z(n).patchRoot(i,r),e},he=(e,t,n,r={})=>{let i=e.parentNode,a=typeof n==`string`?(()=>{let e=document.createElement(`div`);return e.insertAdjacentHTML(`beforeend`,n),e})():n,o=document.createComment(`[morph-start]`),s=document.createComment(`[morph-end]`);a.insertBefore(o,a.firstChild),a.appendChild(s),V?.closestDataStack&&(a._x_dataStack=V.closestDataStack(i),a._x_dataStack&&V.cloneNode(i,a)),Z(r).patchChildren(new H(e,t),new H(o,s))},ge=e=>{let t=e;V=t,t.morph=Q,t.morphBetween=he},$=new WeakSet,_e=e=>{$.has(e)||($.add(e),u(e.reactive),e.plugin(ge),le(e),s(e),z(e),oe(e),y(),L(e),o(e))};export{x as i,z as n,b as r,_e as t};
|
|
2
|
-
//# sourceMappingURL=core-D8VKfoWC.js.map
|
package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-D8VKfoWC.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core-D8VKfoWC.js","names":[],"sources":["../../../../../../../../client/src/runtime/confirm.ts","../../../../../../../../client/src/runtime/manifest.ts","../../../../../../../../client/src/runtime/theme.ts","../../../../../../../../client/src/directives/layout.ts","../../../../../../../../client/src/directives/request.ts","../../../../../../../../client/src/directives/transition.ts","../../../../../../../../client/src/runtime/morph-engine.ts","../../../../../../../../client/src/core.ts"],"sourcesContent":["type SubmitterElement = HTMLButtonElement | HTMLInputElement;\n\ntype ConfirmProceed = () => void;\ntype ConfirmCancel = () => void;\n\ntype ConfirmEventDetail = {\n form: HTMLFormElement;\n message: string;\n submitter: SubmitterElement | null;\n triggeringEvent: SubmitEvent;\n proceed: ConfirmProceed;\n cancel: ConfirmCancel;\n};\n\ntype ConfirmRuntimeOptions = {\n root?: Document;\n};\n\nconst DEFAULT_CONFIRM_MESSAGE = 'Are you sure?';\n\nlet removeSubmitListener: (() => void) | null = null;\nconst bypassedForms = new WeakSet<HTMLFormElement>();\n\nconst isSubmitterElement = (value: unknown): value is SubmitterElement => (\n value instanceof HTMLButtonElement || value instanceof HTMLInputElement\n);\n\nconst confirmMessageFor = ({form, submitter}: {\n form: HTMLFormElement;\n submitter: SubmitterElement | null;\n}): string | null => {\n const submitterMessage = submitter?.dataset.uiConfirm;\n if (submitterMessage !== undefined) return submitterMessage || DEFAULT_CONFIRM_MESSAGE;\n\n const formMessage = form.dataset.uiConfirm;\n if (formMessage !== undefined) return formMessage || DEFAULT_CONFIRM_MESSAGE;\n\n return null;\n};\n\nconst queueConfirmedSubmit = ({form, submitter}: {\n form: HTMLFormElement;\n submitter: SubmitterElement | null;\n}): void => {\n // Chromium can retain the form's submission guard through the current microtask checkpoint.\n window.setTimeout(() => {\n if (!form.isConnected || (submitter && submitter.form !== form)) return;\n\n bypassedForms.add(form);\n try {\n form.requestSubmit(submitter ?? undefined);\n } finally {\n bypassedForms.delete(form);\n }\n }, 0);\n};\n\nconst handleSubmit = (event: SubmitEvent): void => {\n const form = event.target;\n if (!(form instanceof HTMLFormElement)) return;\n\n if (bypassedForms.has(form)) {\n bypassedForms.delete(form);\n return;\n }\n\n const submitter = isSubmitterElement(event.submitter) ? event.submitter : null;\n const message = confirmMessageFor({form, submitter});\n if (message === null) return;\n\n event.preventDefault();\n\n let settled = false;\n const proceed = (): void => {\n if (settled) return;\n settled = true;\n queueConfirmedSubmit({form, submitter});\n };\n const cancel = (): void => {\n settled = true;\n };\n const confirmEvent = new CustomEvent<ConfirmEventDetail>('ui:confirm', {\n bubbles: true,\n cancelable: true,\n detail: {\n form,\n message,\n submitter,\n triggeringEvent: event,\n proceed,\n cancel,\n },\n });\n\n form.dispatchEvent(confirmEvent);\n if (confirmEvent.defaultPrevented) return;\n\n if (window.confirm(message)) {\n proceed();\n } else {\n cancel();\n }\n};\n\nconst registerConfirm = ({root = document}: ConfirmRuntimeOptions = {}): void => {\n if (removeSubmitListener) return;\n\n root.addEventListener('submit', handleSubmit as EventListener, {capture: true});\n removeSubmitListener = (): void => root.removeEventListener('submit', handleSubmit as EventListener, {capture: true});\n};\n\nconst unregisterConfirm = (): void => {\n removeSubmitListener?.();\n removeSubmitListener = null;\n};\n\nexport {registerConfirm, unregisterConfirm};\nexport type {ConfirmCancel, ConfirmEventDetail, ConfirmProceed, ConfirmRuntimeOptions};\n","import type {CodecFn} from './codecs';\n\ntype PropKind = 'string' | 'number' | 'boolean' | 'enum' | 'json';\n\ntype ManifestProp = {\n type: PropKind;\n default?: unknown;\n values?: readonly string[];\n description?: string;\n initialOnly?: boolean;\n};\n\ntype ManifestPart = {\n selector: string;\n description: string;\n};\n\ntype ManifestToken = {\n name: string;\n description: string;\n};\n\ntype ManifestAcceptedEvent = {\n description: string;\n detail?: Record<string, string>;\n};\n\ntype ComponentManifestMeta = {\n group?: string;\n};\n\ntype ComponentManifest = {\n name: string;\n title: string;\n description: string;\n meta?: ComponentManifestMeta;\n props?: Record<string, ManifestProp>;\n propSchema?: Record<string, CodecFn<unknown>>;\n slots?: Record<string, string>;\n events?: Record<string, string>;\n acceptedEvents?: Record<string, ManifestAcceptedEvent>;\n parts?: Record<string, ManifestPart>;\n tokens?: readonly ManifestToken[];\n};\n\ntype ManifestPropDetails = Pick<ManifestProp, 'description'> & {\n name?: string;\n initialOnly?: boolean;\n};\n\ntype SchemaPropDetails<T extends Record<string, CodecFn<unknown>>> = {\n [K in keyof T]?: ManifestPropDetails;\n};\n\ntype DefineManifestOptions<T extends ComponentManifest> = {\n manifest: T;\n};\n\ntype PropsFromSchemaOptions<T extends Record<string, CodecFn<unknown>>> = {\n schema: T;\n details: SchemaPropDetails<T>;\n};\n\nconst toSnake = (value: string): string => value.replace(/([A-Z])/g, '_$1').toLowerCase();\n\nconst defineManifest = <const T extends ComponentManifest>({manifest}: DefineManifestOptions<T>): Readonly<T> => Object.freeze(manifest);\n\nconst propsFromSchema = <const T extends Record<string, CodecFn<unknown>>>({\n schema,\n details,\n}: PropsFromSchemaOptions<T>): Record<string, ManifestProp> => Object.fromEntries(\n Object.entries(schema).map(([schemaKey, codec]) => {\n const propDetails = details[schemaKey as keyof T] ?? {};\n const meta = codec.meta;\n const prop: ManifestProp = {\n type: meta.type,\n default: meta.default,\n };\n\n if (meta.values) prop.values = meta.values;\n if (propDetails.description) prop.description = propDetails.description;\n if (propDetails.initialOnly) prop.initialOnly = true;\n\n return [propDetails.name ?? toSnake(schemaKey), prop];\n }),\n );\n\nexport {defineManifest, propsFromSchema};\nexport type {\n ComponentManifest,\n DefineManifestOptions,\n ManifestPart,\n ManifestProp,\n ManifestPropDetails,\n ManifestAcceptedEvent,\n ComponentManifestMeta,\n ManifestToken,\n PropsFromSchemaOptions,\n PropKind,\n SchemaPropDetails,\n};\n","import type {Alpine as AlpineType} from 'alpinejs';\n\nconst THEME_VALUES = ['light', 'dark', 'system'] as const;\ntype ThemeMode = typeof THEME_VALUES[number];\ntype ResolvedThemeMode = Exclude<ThemeMode, 'system'>;\n\ntype ThemeChangeDetail = {\n mode: ThemeMode;\n resolved: ResolvedThemeMode;\n dark: boolean;\n on: boolean;\n};\n\ntype ThemeStore = {\n mode: ThemeMode;\n resolved: ResolvedThemeMode;\n dark: boolean;\n on: boolean;\n set: (mode: ThemeMode) => void;\n toggle: () => void;\n};\n\nconst isThemeMode = (value: unknown): value is ThemeMode => (\n typeof value === 'string' && THEME_VALUES.includes(value as ThemeMode)\n);\n\nconst normalizeThemeMode = (value: unknown): ThemeMode => (\n isThemeMode(value) ? value : 'system'\n);\n\nconst storageKey = (): string => (\n document.documentElement.dataset.themeStorageKey || 'trellis-ui-theme'\n);\n\nconst fallbackMode = (): ThemeMode => normalizeThemeMode(document.documentElement.dataset.theme);\n\nconst storedMode = (): ThemeMode => {\n try {\n return normalizeThemeMode(window.localStorage.getItem(storageKey()) || fallbackMode());\n } catch {\n return fallbackMode();\n }\n};\n\nconst persistMode = (mode: ThemeMode): void => {\n try {\n window.localStorage.setItem(storageKey(), mode);\n } catch {\n // Keep theme controls usable in private or restricted browsing contexts.\n }\n};\n\nconst prefersDark = (): boolean => (\n window.matchMedia('(prefers-color-scheme: dark)').matches\n);\n\nconst resolveDark = (mode: ThemeMode): boolean => (\n mode === 'dark' || (mode === 'system' && prefersDark())\n);\n\nconst applyThemeMode = (mode: ThemeMode): ThemeChangeDetail => {\n const dark = resolveDark(mode);\n const resolved: ResolvedThemeMode = dark ? 'dark' : 'light';\n const root = document.documentElement;\n\n root.classList.toggle('dark', dark);\n root.dataset.theme = mode;\n root.dataset.resolvedTheme = resolved;\n root.dispatchEvent(new CustomEvent<ThemeChangeDetail>('ui:theme-change', {\n detail: {mode, resolved, dark, on: dark},\n bubbles: true,\n }));\n\n return {mode, resolved, dark, on: dark};\n};\n\nconst createThemeStore = (): ThemeStore => {\n const initial = applyThemeMode(storedMode());\n\n return {\n mode: initial.mode,\n resolved: initial.resolved,\n dark: initial.dark,\n on: initial.on,\n set(mode: ThemeMode): void {\n const nextMode = normalizeThemeMode(mode);\n persistMode(nextMode);\n const next = applyThemeMode(nextMode);\n this.mode = next.mode;\n this.resolved = next.resolved;\n this.dark = next.dark;\n this.on = next.on;\n },\n toggle(): void {\n this.set(this.dark ? 'light' : 'dark');\n },\n };\n};\n\nconst registerThemeStore = (AlpineInstance: AlpineType): void => {\n if (typeof AlpineInstance.store !== 'function') return;\n\n const existingStore = AlpineInstance.store('theme') as ThemeStore | undefined;\n const store = existingStore ?? createThemeStore();\n\n AlpineInstance.store('theme', store);\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n if (store.mode !== 'system') return;\n const next = applyThemeMode('system');\n store.mode = next.mode;\n store.resolved = next.resolved;\n store.dark = next.dark;\n store.on = next.on;\n });\n};\n\nexport {\n applyThemeMode,\n createThemeStore,\n registerThemeStore,\n type ResolvedThemeMode,\n type ThemeChangeDetail,\n type ThemeStore,\n type ThemeMode,\n};\n","import type Alpine from 'alpinejs';\nimport {markLayoutParticipant} from '@client/runtime/layout-participant';\n\ntype LayoutDirectiveValue = string | {\n id?: string;\n key?: string;\n};\n\nconst readExpression = <T>(expression: string | undefined, utilities: Alpine.DirectiveUtilities): T | undefined => {\n if (!expression || typeof utilities.evaluate !== 'function') return undefined;\n return utilities.evaluate(expression) as T;\n};\n\nconst layoutOptions = (value: LayoutDirectiveValue | undefined): {key?: string} => {\n if (typeof value === 'string') return {key: value};\n if (typeof value === 'object' && value) {\n const key = value.key ?? value.id;\n return key ? {key} : {};\n }\n return {};\n};\n\nconst registerLayoutDirective = (Alpine: Alpine.Alpine): void => {\n Alpine.directive('ui-layout', (el, {expression}, utilities) => {\n if (!(el instanceof Element)) return;\n\n const value = readExpression<LayoutDirectiveValue>(expression, utilities);\n const cleanup = markLayoutParticipant(el, layoutOptions(value));\n\n utilities.cleanup?.(() => {\n cleanup();\n });\n });\n};\n\nexport {registerLayoutDirective};\n","import type Alpine from 'alpinejs';\nimport {\n evaluateRequestOptions,\n registerRequestRuntime,\n requestWithAlpine,\n REQUEST_ROOT_SELECTOR,\n type RequestOptions,\n} from '@client/runtime/engine/request';\nimport {\n navigateWithAlpine,\n registerNavigationRuntime,\n type NavigationOptions,\n} from '@client/runtime/engine/navigation';\nimport {warn} from '../utils';\n\ntype RequestDirectiveContext = Pick<Alpine.DirectiveData, 'expression'>;\ntype RequestDirectiveOptions = NavigationOptions & Record<string, unknown>;\n\nconst CLICK_MODIFIER_KEYS: Array<keyof MouseEvent> = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];\nconst nativeFormSubmissions = new WeakSet<HTMLFormElement>();\n\nconst readOptions = (\n el: Element,\n {expression}: RequestDirectiveContext,\n AlpineInstance: Pick<Alpine.Alpine, 'evaluate'>,\n): RequestDirectiveOptions | null => {\n return evaluateRequestOptions(AlpineInstance, el, expression ?? '') as RequestDirectiveOptions | null;\n};\n\nconst submitterFrom = (event: SubmitEvent): HTMLElement | null => (\n event.submitter instanceof HTMLElement ? event.submitter : null\n);\n\nconst shouldEnhanceFormSubmit = (form: HTMLFormElement, event: SubmitEvent, submitter: HTMLElement | null): boolean => {\n if (event.defaultPrevented) return false;\n if ((submitter?.getAttribute('formmethod') || form.getAttribute('method'))?.toLowerCase() === 'dialog') return false;\n if (form.getAttribute('target')) return false;\n if (submitter?.getAttribute('formtarget')) return false;\n\n if (!form.noValidate && !form.checkValidity()) {\n form.reportValidity();\n return false;\n }\n\n return true;\n};\n\nconst samePageHashOnly = (url: URL): boolean => (\n url.hash !== ''\n && url.origin === window.location.origin\n && url.pathname === window.location.pathname\n && url.search === window.location.search\n);\n\nconst shouldEnhanceAnchorClick = (anchor: HTMLAnchorElement, event: MouseEvent, navigate: boolean): boolean => {\n if (event.defaultPrevented) return false;\n if (event.button !== 0) return false;\n if (navigate && CLICK_MODIFIER_KEYS.some((key) => event[key])) return false;\n if (anchor.hasAttribute('download')) return false;\n if (anchor.getAttribute('target')) return false;\n\n const url = new URL(anchor.href, document.baseURI);\n if (url.origin !== window.location.origin) return false;\n return !samePageHashOnly(url);\n};\n\nconst registerFormDirective = (\n AlpineInstance: Alpine.Alpine,\n form: HTMLFormElement,\n directive: RequestDirectiveContext,\n utilities: Alpine.DirectiveUtilities,\n behavior: {navigate: boolean},\n): void => {\n const onSubmit = (event: SubmitEvent): void => {\n if (nativeFormSubmissions.delete(form)) return;\n const submitter = submitterFrom(event);\n if (!shouldEnhanceFormSubmit(form, event, submitter)) return;\n\n const options = readOptions(form, directive, utilities.Alpine);\n if (!options) return;\n\n event.preventDefault();\n if (behavior.navigate) {\n navigateWithAlpine(AlpineInstance, form.action, form, {\n ...options,\n source: form,\n submitter,\n });\n return;\n }\n void requestWithAlpine(AlpineInstance, undefined, {\n ...options,\n source: form,\n submitter,\n }).then((result) => {\n if (result.type !== 'unavailable') return;\n nativeFormSubmissions.add(form);\n form.requestSubmit(submitter ?? undefined);\n }).catch((error: unknown) => warn('x-ui-request: request failed', error));\n };\n\n form.addEventListener('submit', onSubmit);\n utilities.cleanup?.(() => form.removeEventListener('submit', onSubmit));\n};\n\nconst registerAnchorDirective = (\n AlpineInstance: Alpine.Alpine,\n anchor: HTMLAnchorElement,\n directive: RequestDirectiveContext,\n utilities: Alpine.DirectiveUtilities,\n behavior: {navigate: boolean},\n): void => {\n const onClick = (event: MouseEvent): void => {\n if (!shouldEnhanceAnchorClick(anchor, event, behavior.navigate)) return;\n\n const options = readOptions(anchor, directive, utilities.Alpine);\n if (!options) return;\n\n event.preventDefault();\n if (behavior.navigate) {\n navigateWithAlpine(AlpineInstance, anchor.href, anchor, options);\n return;\n }\n void requestWithAlpine(AlpineInstance, anchor.href, {\n ...options,\n method: options.method ?? 'GET',\n source: anchor,\n }).then((result) => {\n if (result.type === 'unavailable') window.location.assign(anchor.href);\n }).catch((error: unknown) => warn('x-ui-request: request failed', error));\n };\n\n anchor.addEventListener('click', onClick);\n utilities.cleanup?.(() => anchor.removeEventListener('click', onClick));\n};\n\nconst registerRequestDirective = (AlpineInstance: Alpine.Alpine): void => {\n AlpineInstance.addRootSelector(() => REQUEST_ROOT_SELECTOR);\n registerRequestRuntime(AlpineInstance);\n registerNavigationRuntime(AlpineInstance);\n\n AlpineInstance.directive('ui-request', (el, {expression, modifiers}, utilities) => {\n const directive = {expression};\n\n if (el instanceof HTMLFormElement) {\n registerFormDirective(AlpineInstance, el, directive, utilities, {\n navigate: modifiers.includes('navigate'),\n });\n return;\n }\n\n if (el instanceof HTMLAnchorElement) {\n registerAnchorDirective(AlpineInstance, el, directive, utilities, {\n navigate: modifiers.includes('navigate'),\n });\n return;\n }\n\n warn('x-ui-request: directive only supports forms and anchors', el);\n });\n};\n\nexport {registerRequestDirective};\n","import type Alpine from 'alpinejs';\nimport {\n findAlpineMachineOwner,\n type AlpineMachineOwner,\n} from '@client/runtime/alpine-machine';\nimport type {TransitionContext} from '@client/runtime/transition-coordinator';\nimport {warn} from '@client/utils';\n\ntype TransitionEvaluator = ReturnType<Alpine.DirectiveUtilities['evaluateLater']>;\n\nconst evaluateTransition = <TProps, TData, TElement>(\n evaluator: TransitionEvaluator,\n transition: TransitionContext<TProps, TData, TElement>,\n): unknown => {\n let synchronous = true;\n let completedSynchronously = false;\n let result: unknown;\n let resolve!: (value: unknown) => void;\n const pending = new Promise<unknown>((resolvePromise) => {\n resolve = resolvePromise;\n });\n\n evaluator((value) => {\n if (synchronous) {\n completedSynchronously = true;\n result = value;\n return;\n }\n resolve(value);\n }, {scope: {$transition: transition}});\n synchronous = false;\n\n return completedSynchronously ? result : pending;\n};\n\nconst registerTransitionDirective = (AlpineInstance: Alpine.Alpine): void => {\n AlpineInstance.directive(\n 'ui-transition',\n AlpineInstance.skipDuringClone((el, {value: name, expression}, utilities) => {\n if (!name) {\n warn('x-ui-transition requires a transition name', el);\n return;\n }\n\n const owner = findAlpineMachineOwner(AlpineInstance, el);\n if (!owner) {\n warn(`x-ui-transition:${name} requires an owning Trellis machine`, el);\n return;\n }\n\n const evaluator = expression?.trim() ? utilities.evaluateLater(expression) : null;\n const unregister = owner.onTransition(name, (transition) => (\n evaluator ? evaluateTransition(evaluator, transition) : undefined\n ), el as Parameters<AlpineMachineOwner['onTransition']>[2]);\n utilities.cleanup(unregister);\n }),\n );\n};\n\nexport {registerTransitionDirective};\n","import type Alpine from 'alpinejs';\n\n// This engine adapts behavior and matching ideas from Alpine Morph, Morphlex, Idiomorph, and Datastar.\n// See THIRD_PARTY_NOTICES.md for provenance and license notices.\n\ntype Skip = () => void;\ntype ChildrenOnly = () => void;\ntype SkipChildren = () => void;\ntype SkipUntil = (predicate: (node: Node) => boolean) => void;\ntype UpdatingHook = (\n from: Node,\n to: Node,\n childrenOnly: ChildrenOnly,\n skip: Skip,\n skipChildren: SkipChildren,\n skipUntil: SkipUntil,\n) => void;\ntype SkippableNodeHook = (node: Node, skip: Skip) => void;\ntype PruningPolicy = 'after-root-hook' | 'before-descendant-hook';\n\ntype MorphOptions = {\n key?: (element: Element) => unknown;\n lookahead?: boolean;\n updating?: UpdatingHook;\n updated?: (from: Node, to: Node) => void;\n removing?: SkippableNodeHook;\n removed?: (node: Node) => void;\n adding?: SkippableNodeHook;\n added?: (node: Node) => void;\n};\n\ntype MorphAlpine = Omit<Alpine.Alpine, 'cloneNode' | 'closestDataStack'> & {\n cloneNode(from: Element, to: Element): void;\n closestDataStack(node: Node): unknown;\n morph(from: Element, toHtml: Element | string, options?: MorphOptions): Element;\n morphBetween(\n startMarker: Comment,\n endMarker: Comment,\n toHtml: Element | string,\n options?: MorphOptions,\n ): void;\n};\n\ntype AlpineNode = Node & {\n _x_bindings?: {id?: string};\n _x_dataStack?: unknown;\n _x_currentIfEl?: AlpineNode;\n _x_lastRenderedEl?: AlpineNode;\n _x_lookup?: Map<unknown, AlpineNode>;\n _x_teleport?: AlpineNode;\n _x_transitioning?: unknown;\n _x_isShown?: boolean;\n};\n\ntype Parent = Node & {\n children: Iterable<Element>;\n firstChild: ChildNode | null;\n insertBefore(node: Node, before: Node | null): Node;\n};\n\nconst noop = (): void => {};\nlet alpineInstance: MorphAlpine | undefined;\n\nclass Block {\n constructor(\n readonly startComment: Comment,\n readonly endComment: Comment,\n ) {}\n\n get children(): Element[] {\n const children: Element[] = [];\n let node = this.startComment.nextSibling;\n while (node && node !== this.endComment) {\n if (node instanceof Element) children.push(node);\n node = node.nextSibling;\n }\n return children;\n }\n\n get firstChild(): ChildNode | null {\n const first = this.startComment.nextSibling;\n return first === this.endComment ? null : first;\n }\n\n appendChild(node: Node): Node {\n this.endComment.before(node);\n return node;\n }\n\n insertBefore(node: Node, reference: Node | null): Node {\n ((reference ?? this.endComment) as ChildNode).before(node);\n return node;\n }\n\n nextNode(reference: Node): ChildNode | null {\n const next = reference.nextSibling;\n return next === this.endComment ? null : next;\n }\n}\n\nconst nextSibling = (parent: Parent | Block, node: Node): ChildNode | null => (\n parent instanceof Block ? parent.nextNode(node) : node.nextSibling\n);\n\nconst createElement = (html: string): Element => {\n const template = document.createElement('template');\n template.innerHTML = html;\n const element = template.content.firstElementChild;\n if (!element) throw new Error('Morph HTML must contain a root element.');\n return element;\n};\n\nconst setIncomingAttribute = (target: Element, incoming: Attr): void => {\n if (incoming.namespaceURI) {\n target.setAttributeNodeNS(incoming.cloneNode() as Attr);\n } else if (incoming.name.includes('@')) {\n target.setAttributeNode(incoming.cloneNode() as Attr);\n } else {\n target.setAttribute(incoming.name, incoming.value);\n }\n};\n\nconst shouldSkip = (hook: SkippableNodeHook, node: Node): boolean => {\n let skip = false;\n hook(node, () => { skip = true; });\n return skip;\n};\n\nconst isConditionalStart = (node: Node | null): boolean => (\n node?.nodeType === Node.COMMENT_NODE && node.textContent === '[if BLOCK]><![endif]'\n);\n\nconst isConditionalEnd = (node: Node | null): boolean => (\n node?.nodeType === Node.COMMENT_NODE && node.textContent === '[if ENDBLOCK]><![endif]'\n);\n\nconst conditionalEnd = (parent: Parent | Block, start: Node): Comment => {\n let depth = 0;\n let node: Node | null = start;\n while ((node = nextSibling(parent, node))) {\n if (isConditionalStart(node)) depth += 1;\n else if (isConditionalEnd(node) && depth > 0) depth -= 1;\n else if (isConditionalEnd(node)) return node as Comment;\n }\n throw new Error('Unclosed conditional morph block.');\n};\n\ntype OwnedRange = {\n start: AlpineNode;\n end: AlpineNode;\n};\n\nconst ownedRange = (start: AlpineNode): OwnedRange => {\n let end = start;\n if (start._x_lastRenderedEl) end = start._x_lastRenderedEl;\n else if (start._x_currentIfEl) end = ownedRange(start._x_currentIfEl).end;\n else if (start._x_lookup?.size) {\n const owned = new Set(start._x_lookup.values());\n let sibling = start.nextSibling as AlpineNode | null;\n while (sibling && owned.has(sibling)) {\n end = ownedRange(sibling).end;\n sibling = end.nextSibling as AlpineNode | null;\n }\n }\n return {start, end};\n};\n\nconst afterOwnedRange = (parent: Parent | Block, range: OwnedRange): AlpineNode | null => (\n nextSibling(parent, range.end) as AlpineNode | null\n);\n\nconst isServerEqual = (from: AlpineNode, to: AlpineNode): boolean => {\n if (from.nodeType !== to.nodeType || from.nodeName !== to.nodeName) return false;\n if (from.nodeType === Node.TEXT_NODE || from.nodeType === Node.COMMENT_NODE) {\n return from.nodeValue === to.nodeValue;\n }\n if (from instanceof HTMLTemplateElement && to instanceof HTMLTemplateElement) {\n const fromTemplate = from as HTMLTemplateElement & AlpineNode;\n const toTemplate = to as HTMLTemplateElement & AlpineNode;\n if (fromTemplate._x_teleport) {\n const incomingTeleport = toTemplate._x_teleport ?? to.content.firstElementChild;\n return Boolean(incomingTeleport && isServerEqual(fromTemplate._x_teleport, incomingTeleport as AlpineNode));\n }\n return from.isEqualNode(to);\n }\n if (from instanceof Element && to instanceof Element) {\n if (from.attributes.length !== to.attributes.length) return false;\n for (const {name, value} of from.attributes) {\n if (to.getAttribute(name) !== value) return false;\n }\n }\n\n let fromChild = from.firstChild as AlpineNode | null;\n let toChild = to.firstChild as AlpineNode | null;\n while (fromChild && toChild) {\n if (!isServerEqual(fromChild, toChild)) return false;\n fromChild = ownedRange(fromChild).end.nextSibling as AlpineNode | null;\n toChild = toChild.nextSibling as AlpineNode | null;\n }\n return fromChild === null && toChild === null;\n};\n\nconst moveOwnedRangeBefore = (parent: Parent | Block, range: OwnedRange, before: Node | null): void => {\n if (range.start === before || afterOwnedRange(parent, range) === before) return;\n let node: Node | null = range.start;\n while (node) {\n const next: ChildNode | null = node.nextSibling;\n parent.insertBefore(node, before);\n if (node === range.end) break;\n node = next;\n }\n};\n\nconst seedDynamicId = (to: AlpineNode, from: AlpineNode | null): void => {\n const id = from?._x_bindings?.id;\n if (!id || !(to instanceof Element)) return;\n to.setAttribute('id', id);\n (to as HTMLElement).id = id;\n};\n\nconst buildDescendantCorrespondence = (\n fromElements: Element[],\n toElements: Element[],\n getKey: (node: Node | null) => unknown,\n): WeakMap<Node, symbol> => {\n const correspondence = new WeakMap<Node, symbol>();\n const fromDirectKeys = fromElements.map(getKey).filter(Boolean);\n const toDirectKeys = toElements.map(getKey).filter(Boolean);\n const directKeysReordered = fromDirectKeys.length >= 2\n && fromDirectKeys.length === toDirectKeys.length\n && new Set(fromDirectKeys).size === fromDirectKeys.length\n && fromDirectKeys.some((key, index) => key !== toDirectKeys[index])\n && fromDirectKeys.every((key) => toDirectKeys.includes(key));\n if (!directKeysReordered) return correspondence;\n\n const idCounts = (elements: Element[]): Map<string, number> => {\n const counts = new Map<string, number>();\n const count = (element: Element): void => {\n if (element.id) counts.set(element.id, (counts.get(element.id) ?? 0) + 1);\n };\n for (const element of elements) {\n count(element);\n element.querySelectorAll('[id]').forEach(count);\n }\n return counts;\n };\n const fromIdCounts = idCounts(fromElements);\n const toIdCounts = idCounts(toElements);\n const tokens = new Map<string, symbol>();\n for (const [id, count] of fromIdCounts) {\n if (count === 1 && toIdCounts.get(id) === 1) tokens.set(id, Symbol(id));\n }\n\n const indexDescendant = (element: Element): void => {\n if (getKey(element)) return;\n for (const descendant of element.querySelectorAll('[id]')) {\n const token = tokens.get(descendant.id);\n if (!token) continue;\n correspondence.set(element, token);\n return;\n }\n };\n fromElements.forEach(indexDescendant);\n toElements.forEach(indexDescendant);\n return correspondence;\n};\n\nconst createContext = (options: MorphOptions = {}) => {\n const context = {\n key: options.key ?? ((element: Element) => element.getAttribute('key')),\n lookahead: options.lookahead ?? false,\n updating: options.updating ?? noop,\n updated: options.updated ?? noop,\n removing: options.removing ?? noop,\n removed: options.removed ?? noop,\n adding: options.adding ?? noop,\n added: options.added ?? noop,\n skipUntilCondition: null as ((node: Node) => boolean) | null,\n };\n\n const getKey = (node: Node | null): unknown => (\n node instanceof Element ? context.key(node) : null\n );\n\n const requiresReplacement = (from: Node, to: Node): boolean => (\n from.nodeType !== to.nodeType\n || from.nodeName !== to.nodeName\n || getKey(from) !== getKey(to)\n );\n\n const insertNodeBefore = (\n parent: Parent | Block,\n source: Node,\n before: Node | null,\n ): {inserted: false; node: null} | {inserted: true; node: AlpineNode} => {\n if (shouldSkip(context.adding, source)) return {inserted: false, node: null};\n const clone = source.cloneNode(true);\n parent.insertBefore(clone, before);\n context.added(clone);\n return {inserted: true, node: clone as AlpineNode};\n };\n\n const removeNode = (node: Node): boolean => {\n if (shouldSkip(context.removing, node)) return false;\n node.parentNode?.removeChild(node);\n context.removed(node);\n return true;\n };\n\n const removeOwnedRange = (range: OwnedRange): boolean => {\n if (shouldSkip(context.removing, range.start)) return false;\n range.start.parentNode?.removeChild(range.start);\n context.removed(range.start);\n return true;\n };\n\n const replaceNode = (from: Node, to: Node): boolean => {\n if (shouldSkip(context.removing, from)) return false;\n const clone = to.cloneNode(true);\n if (shouldSkip(context.adding, clone)) return false;\n from.parentNode?.replaceChild(clone, from);\n context.removed(from);\n context.added(clone);\n return true;\n };\n\n const patchAttributes = (from: AlpineNode & Element, to: Element): boolean => {\n if (from._x_transitioning) return false;\n if ((from._x_isShown && !(to as AlpineNode)._x_isShown)\n || (!from._x_isShown && (to as AlpineNode)._x_isShown)) return false;\n\n let changed = false;\n const existing = Array.from(from.attributes);\n for (let index = existing.length - 1; index >= 0; index -= 1) {\n const name = existing[index]!.name;\n if (to.hasAttribute(name)) continue;\n if (name === 'open' && from instanceof HTMLDialogElement && from.open) from.close();\n else from.removeAttribute(name);\n changed = true;\n }\n const incoming = Array.from(to.attributes);\n for (let index = incoming.length - 1; index >= 0; index -= 1) {\n const attribute = incoming[index]!;\n const {name, value} = attribute;\n if (from.getAttribute(name) === value) continue;\n setIncomingAttribute(from, attribute);\n changed = true;\n }\n return changed;\n };\n\n let patchChildren: (from: Parent | Block, to: Parent | Block) => boolean;\n\n const patchNode = (from: AlpineNode, to: AlpineNode, pruning: PruningPolicy): boolean => {\n if (from instanceof Element && from.hasAttribute('data-ui-ignore-morph')) return false;\n if (requiresReplacement(from, to)) return replaceNode(from, to);\n if (pruning === 'before-descendant-hook'\n && from.nodeType !== Node.COMMENT_NODE\n && isServerEqual(from, to)) return false;\n\n let childrenOnly = false;\n let skipChildren = false;\n let skip = false;\n const skipUntil = (predicate: (node: Node) => boolean): void => {\n context.skipUntilCondition = predicate;\n };\n context.updating(\n from,\n to,\n () => { childrenOnly = true; },\n () => { skip = true; },\n () => { skipChildren = true; },\n skipUntil,\n );\n if (skip) return false;\n\n // Descendants that are server-identical are opaque. The root is checked only\n // after its hook has had the opportunity to mutate the incoming tree.\n if (isServerEqual(from, to)) return false;\n\n let changed = false;\n if (from.nodeType === Node.ELEMENT_NODE && alpineInstance) {\n alpineInstance.cloneNode(from as Element, to as Element);\n if (from._x_teleport && to._x_teleport) {\n changed = patch(from._x_teleport, to._x_teleport) || changed;\n }\n }\n\n if (to.nodeType === Node.TEXT_NODE || to.nodeType === Node.COMMENT_NODE) {\n if (from.nodeValue === to.nodeValue) return false;\n from.nodeValue = to.nodeValue;\n context.updated(from, to);\n return true;\n }\n\n if (!childrenOnly) changed = patchAttributes(from as AlpineNode & Element, to as Element) || changed;\n if (!skipChildren) changed = patchChildren(from as unknown as Parent, to as unknown as Parent) || changed;\n if (changed) context.updated(from, to);\n return changed;\n };\n\n const patch = (from: AlpineNode, to: AlpineNode): boolean => (\n patchNode(from, to, 'before-descendant-hook')\n );\n const patchRoot = (from: AlpineNode, to: AlpineNode): boolean => (\n patchNode(from, to, 'after-root-hook')\n );\n\n patchChildren = (from: Parent | Block, to: Parent | Block): boolean => {\n const fromElements = Array.from(from.children);\n const toElements = Array.from(to.children);\n const correspondence = buildDescendantCorrespondence(fromElements, toElements, getKey);\n\n const childKey = (node: Node | null): unknown => (\n node ? getKey(node) || correspondence.get(node) : null\n );\n const keyed = new Map<unknown, AlpineNode>();\n for (const element of fromElements) {\n const key = childKey(element);\n if (key) keyed.set(key, element as AlpineNode);\n }\n\n let changed = false;\n let currentFrom = from.firstChild as AlpineNode | null;\n let currentTo = to.firstChild as AlpineNode | null;\n\n incoming: while (currentTo) {\n seedDynamicId(currentTo, currentFrom);\n\n if (context.skipUntilCondition) {\n const fromDone = !currentFrom || context.skipUntilCondition(currentFrom);\n const toDone = context.skipUntilCondition(currentTo);\n if (fromDone && toDone) context.skipUntilCondition = null;\n else {\n if (!fromDone && currentFrom) currentFrom = afterOwnedRange(from, ownedRange(currentFrom));\n if (!toDone) currentTo = nextSibling(to, currentTo) as AlpineNode | null;\n continue;\n }\n }\n\n if (!currentFrom) {\n const addition = insertNodeBefore(from, currentTo, null);\n changed = addition.inserted || changed;\n currentTo = nextSibling(to, currentTo) as AlpineNode | null;\n continue;\n }\n\n if (isConditionalStart(currentFrom) && isConditionalStart(currentTo)) {\n const fromEnd = conditionalEnd(from, currentFrom);\n const toEnd = conditionalEnd(to, currentTo);\n changed = patchChildren(new Block(currentFrom as Comment, fromEnd), new Block(currentTo as Comment, toEnd)) || changed;\n currentFrom = nextSibling(from, fromEnd) as AlpineNode | null;\n currentTo = nextSibling(to, toEnd) as AlpineNode | null;\n continue;\n } else {\n if (context.lookahead\n && currentFrom instanceof Element\n && !currentFrom.isEqualNode(currentTo)) {\n let lookahead = nextSibling(to, currentTo) as AlpineNode | null;\n while (lookahead) {\n if (lookahead instanceof Element && currentFrom.isEqualNode(lookahead)) {\n const addition = insertNodeBefore(from, currentTo, currentFrom);\n if (!addition.inserted) {\n currentTo = nextSibling(to, currentTo) as AlpineNode | null;\n continue incoming;\n }\n currentFrom = addition.node;\n changed = true;\n break;\n }\n lookahead = nextSibling(to, lookahead) as AlpineNode | null;\n }\n }\n\n const toKey = childKey(currentTo);\n const fromKey = childKey(currentFrom);\n if (toKey !== fromKey) {\n const keyedMatch = toKey ? keyed.get(toKey) : undefined;\n if (keyedMatch) {\n moveOwnedRangeBefore(from, ownedRange(keyedMatch), currentFrom);\n currentFrom = keyedMatch;\n changed = true;\n } else if (toKey || fromKey) {\n const addition = insertNodeBefore(from, currentTo, currentFrom);\n if (!addition.inserted) {\n currentTo = nextSibling(to, currentTo) as AlpineNode | null;\n continue;\n }\n currentFrom = addition.node;\n changed = true;\n }\n }\n\n const afterFrom = afterOwnedRange(from, ownedRange(currentFrom));\n changed = patch(currentFrom, currentTo) || changed;\n currentFrom = afterFrom;\n }\n\n currentTo = nextSibling(to, currentTo) as AlpineNode | null;\n }\n\n while (currentFrom) {\n const range = ownedRange(currentFrom);\n const after = afterOwnedRange(from, range);\n changed = (range.end === range.start ? removeNode(currentFrom) : removeOwnedRange(range)) || changed;\n currentFrom = after;\n }\n return changed;\n };\n\n return {patchChildren, patchRoot};\n};\n\nconst morph = (from: Element, toHtml: Element | string, options: MorphOptions = {}): Element => {\n const to = (typeof toHtml === 'string' ? createElement(toHtml) : toHtml) as AlpineNode & Element;\n const source = from as AlpineNode & Element;\n if (alpineInstance?.closestDataStack && !source._x_dataStack) {\n to._x_dataStack = alpineInstance.closestDataStack(source);\n if (to._x_dataStack) alpineInstance.cloneNode(source, to);\n }\n createContext(options).patchRoot(source, to);\n return from;\n};\n\nconst morphBetween = (\n startMarker: Comment,\n endMarker: Comment,\n toHtml: Element | string,\n options: MorphOptions = {},\n): void => {\n const fromContainer = startMarker.parentNode as AlpineNode & Parent;\n const toContainer = typeof toHtml === 'string'\n ? (() => {\n const container = document.createElement('div');\n container.insertAdjacentHTML('beforeend', toHtml);\n return container;\n })()\n : toHtml;\n const toStart = document.createComment('[morph-start]');\n const toEnd = document.createComment('[morph-end]');\n toContainer.insertBefore(toStart, toContainer.firstChild);\n toContainer.appendChild(toEnd);\n if (alpineInstance?.closestDataStack) {\n (toContainer as AlpineNode)._x_dataStack = alpineInstance.closestDataStack(fromContainer);\n if ((toContainer as AlpineNode)._x_dataStack) alpineInstance.cloneNode(fromContainer as unknown as Element, toContainer);\n }\n createContext(options).patchChildren(\n new Block(startMarker, endMarker),\n new Block(toStart, toEnd),\n );\n};\n\nconst trellisMorph = (AlpineInstance: Alpine.Alpine): void => {\n const instance = AlpineInstance as MorphAlpine;\n alpineInstance = instance;\n instance.morph = morph;\n instance.morphBetween = morphBetween;\n};\n\nexport {morph, morphBetween};\nexport default trellisMorph;\n","import type {Alpine as AlpineType} from 'alpinejs';\n\nimport {registerLayoutDirective} from './directives/layout';\nimport {registerRequestDirective} from './directives/request';\nimport {registerTransitionDirective} from './directives/transition';\nimport morph from './runtime/morph-engine';\nimport {setPropReactivity} from './runtime/codecs';\nimport {registerConfirm} from './runtime/confirm';\nimport {registerStream} from './runtime/engine/stream';\nimport {registerThemeStore} from './runtime/theme';\nimport {registerUiMagic, ui} from './runtime/ui';\n\ntype CoreRuntimePlugin = (AlpineInstance: AlpineType) => void;\nconst registered = new WeakSet<AlpineType>();\n\nconst coreRuntime: CoreRuntimePlugin = (AlpineInstance): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n setPropReactivity(AlpineInstance.reactive);\n AlpineInstance.plugin(morph);\n registerLayoutDirective(AlpineInstance);\n registerUiMagic(AlpineInstance);\n registerTransitionDirective(AlpineInstance);\n registerThemeStore(AlpineInstance);\n registerConfirm();\n registerRequestDirective(AlpineInstance);\n registerStream(AlpineInstance);\n};\n\nexport {coreRuntime, ui};\nexport default coreRuntime;\nexport type {CoreRuntimePlugin};\nexport {\n bool,\n createAlpineMachine,\n createMachine,\n decodeProps,\n defineAlpineData,\n defineManifest,\n defineProps,\n defineStyles,\n json,\n mergeBindings,\n number,\n oneOf,\n propsFromSchema,\n resolveStyle,\n string,\n createTransitionCoordinator,\n defineHook,\n} from './runtime';\nexport type {\n AlpineMachine,\n AlpineMachineOwner,\n AlpinePropsChangedEvent,\n AlpineDataFactory,\n AlpineDataRegistrar,\n CodecFn,\n ComponentManifest,\n CreateAlpineMachineOptions,\n DecodePropsOptions,\n Machine,\n MachineConfig,\n MachineEffect,\n MachineEffectList,\n MachineEffectRef,\n MachineEntry,\n MachineEvent,\n MachineEventObject,\n MachineGuard,\n MachineOptions,\n MachineReducer,\n MachineReducerList,\n MachineReducerRef,\n MachineScope,\n MachineSnapshot,\n MachineStateConfig,\n MachineStateValue,\n MachineTransition,\n MachineTransitionDefinition,\n MachineUpdate,\n DefineManifestOptions,\n DefineStylesOptions,\n ManifestPart,\n ManifestProp,\n ManifestPropDetails,\n ManifestToken,\n MachineFactoryScope,\n BindingInput,\n PropState,\n PropsFromSchemaOptions,\n MergeBindingsOptions,\n ResolveStyleOptions,\n SchemaPropDetails,\n SchemaToProps,\n StyleDefinition,\n StylePart,\n StyleProps,\n TrellisAlpineComponent,\n AnyTransitionHook,\n TransitionCallback,\n TransitionContext,\n TransitionCoordinator,\n TransitionCoordinatorOptions,\n TransitionEventCreator,\n TransitionForHook,\n TransitionHookDefinition,\n UiGetOptions,\n UiRequestOptions,\n UiRuntime,\n} from './runtime';\nexport {registerTransitionDirective} from './directives/transition';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entry.generated-BhPEF6oz.js","names":[],"sources":["../../../../../../../../client/src/components/table/contract.ts","../../../../../../../../client/src/components/table/entry.generated.ts"],"sourcesContent":["import {bool, oneOf, string, type SchemaToProps} from '../../runtime';\n\nconst TABLE_LAYOUTS = ['auto', 'fixed'] as const;\nconst TABLE_DENSITIES = ['compact', 'default', 'comfortable'] as const;\nconst TABLE_VARIANTS = ['ghost', 'surface'] as const;\nconst TABLE_BORDERS = ['none', 'row', 'grid'] as const;\nconst TABLE_WIDTHS = ['auto', 'full'] as const;\nconst TABLE_ALIGNS = ['start', 'center', 'end'] as const;\nconst TABLE_VALIGNS = ['top', 'middle', 'bottom', 'baseline'] as const;\nconst TABLE_SORTS = ['none', 'ascending', 'descending', 'other'] as const;\nconst TABLE_COLUMN_SCOPES = ['col', 'colgroup'] as const;\nconst TABLE_ROW_HEADER_SCOPES = ['row', 'rowgroup'] as const;\nconst TABLE_FILTER_AS_VALUES = ['div', 'form'] as const;\n\nconst tableSchema = {\n layout: oneOf(TABLE_LAYOUTS, 'auto'),\n density: oneOf(TABLE_DENSITIES, 'default'),\n variant: oneOf(TABLE_VARIANTS, 'ghost'),\n border: oneOf(TABLE_BORDERS, 'none'),\n flush: bool,\n zebra: bool,\n hover: bool.default(true),\n stickyHeader: bool,\n nowrap: bool.default(true),\n width: oneOf(TABLE_WIDTHS, 'full'),\n class: string,\n tableClass: string,\n};\n\nconst tableCaptionSchema = {\n side: oneOf(['top', 'bottom'] as const, 'bottom'),\n class: string,\n};\n\nconst tableSectionSchema = {\n class: string,\n};\n\nconst tableRowSchema = {\n selected: bool,\n current: bool,\n disabled: bool,\n interactive: bool,\n class: string,\n};\n\nconst tableColumnSchema = {\n align: oneOf(TABLE_ALIGNS, 'start'),\n valign: oneOf(TABLE_VALIGNS, 'middle'),\n key: string,\n target: string,\n width: string,\n resizable: bool,\n minWidth: string.default('4rem'),\n maxWidth: string,\n sortable: bool,\n sort: oneOf(TABLE_SORTS, 'none'),\n abbr: string,\n scope: oneOf(TABLE_COLUMN_SCOPES, 'col'),\n class: string,\n contentClass: string,\n resizeHandleClass: string,\n};\n\nconst tableColumnFilterSchema = {\n as: oneOf(TABLE_FILTER_AS_VALUES, 'div'),\n id: string,\n class: string,\n};\n\nconst tableRowHeaderSchema = {\n align: oneOf(TABLE_ALIGNS, 'start'),\n valign: oneOf(TABLE_VALIGNS, 'middle'),\n scope: oneOf(TABLE_ROW_HEADER_SCOPES, 'row'),\n class: string,\n};\n\nconst tableCellSchema = {\n align: oneOf(TABLE_ALIGNS, 'start'),\n valign: oneOf(TABLE_VALIGNS, 'middle'),\n class: string,\n};\n\nconst tableEmptySchema = {\n colspan: string.default('1'),\n class: string,\n cellClass: string,\n};\n\ntype TableLayout = typeof TABLE_LAYOUTS[number];\ntype TableDensity = typeof TABLE_DENSITIES[number];\ntype TableVariant = typeof TABLE_VARIANTS[number];\ntype TableBorder = typeof TABLE_BORDERS[number];\ntype TableWidth = typeof TABLE_WIDTHS[number];\ntype TableAlign = typeof TABLE_ALIGNS[number];\ntype TableValign = typeof TABLE_VALIGNS[number];\ntype TableSort = typeof TABLE_SORTS[number];\ntype TableColumnScope = typeof TABLE_COLUMN_SCOPES[number];\ntype TableRowHeaderScope = typeof TABLE_ROW_HEADER_SCOPES[number];\ntype TableFilterAs = typeof TABLE_FILTER_AS_VALUES[number];\ntype TableProps = SchemaToProps<typeof tableSchema>;\ntype TableCaptionProps = SchemaToProps<typeof tableCaptionSchema>;\ntype TableSectionProps = SchemaToProps<typeof tableSectionSchema>;\ntype TableRowProps = SchemaToProps<typeof tableRowSchema>;\ntype TableColumnProps = SchemaToProps<typeof tableColumnSchema>;\ntype TableColumnFilterProps = SchemaToProps<typeof tableColumnFilterSchema>;\ntype TableRowHeaderProps = SchemaToProps<typeof tableRowHeaderSchema>;\ntype TableCellProps = SchemaToProps<typeof tableCellSchema>;\ntype TableEmptyProps = SchemaToProps<typeof tableEmptySchema>;\n\nexport {\n TABLE_ALIGNS,\n TABLE_BORDERS,\n TABLE_COLUMN_SCOPES,\n TABLE_DENSITIES,\n TABLE_FILTER_AS_VALUES,\n TABLE_LAYOUTS,\n TABLE_ROW_HEADER_SCOPES,\n TABLE_SORTS,\n TABLE_VALIGNS,\n TABLE_VARIANTS,\n TABLE_WIDTHS,\n tableCaptionSchema,\n tableCellSchema,\n tableColumnFilterSchema,\n tableColumnSchema,\n tableEmptySchema,\n tableRowHeaderSchema,\n tableRowSchema,\n tableSchema,\n tableSectionSchema,\n};\nexport type {\n TableAlign,\n TableBorder,\n TableCaptionProps,\n TableCellProps,\n TableColumnFilterProps,\n TableColumnProps,\n TableColumnScope,\n TableDensity,\n TableEmptyProps,\n TableFilterAs,\n TableLayout,\n TableProps,\n TableRowHeaderProps,\n TableRowHeaderScope,\n TableRowProps,\n TableSectionProps,\n TableSort,\n TableValign,\n TableVariant,\n TableWidth,\n};\n","// Generated by scripts/generate_component_entries.mjs from packages/client/component-entries.json.\n// Do not edit by hand.\nimport type {Alpine as AlpineType} from 'alpinejs';\nimport {registerResizableCapability} from '../../capabilities/resizable';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerTable = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerResizableCapability(AlpineInstance);\n\n};\n\nexport {registerTable};\nexport default registerTable;\nexport * from './index';\n"],"mappings":"yGAEA,IAAM,EAAgB,CAAC,OAAQ,OAAO,EAChC,EAAkB,CAAC,UAAW,UAAW,aAAa,EACtD,EAAiB,CAAC,QAAS,SAAS,EACpC,EAAgB,CAAC,OAAQ,MAAO,MAAM,EACtC,EAAe,CAAC,OAAQ,MAAM,EAC9B,EAAe,CAAC,QAAS,SAAU,KAAK,EACxC,EAAgB,CAAC,MAAO,SAAU,SAAU,UAAU,EACtD,EAAc,CAAC,OAAQ,YAAa,aAAc,OAAO,EACzD,EAAsB,CAAC,MAAO,UAAU,EACxC,EAA0B,CAAC,MAAO,UAAU,EAC5C,EAAyB,CAAC,MAAO,MAAM,EAEvC,EAAc,CAChB,OAAQ,EAAM,EAAe,MAAM,EACnC,QAAS,EAAM,EAAiB,SAAS,EACzC,QAAS,EAAM,EAAgB,OAAO,EACtC,OAAQ,EAAM,EAAe,MAAM,EACnC,MAAO,EACP,MAAO,EACP,MAAO,EAAK,QAAQ,EAAI,EACxB,aAAc,EACd,OAAQ,EAAK,QAAQ,EAAI,EACzB,MAAO,EAAM,EAAc,MAAM,EACjC,MAAO,EACP,WAAY,CAChB,EAEM,EAAqB,CACvB,KAAM,EAAM,CAAC,MAAO,QAAQ,EAAY,QAAQ,EAChD,MAAO,CACX,EAEM,EAAqB,CACvB,MAAO,CACX,EAEM,EAAiB,CACnB,SAAU,EACV,QAAS,EACT,SAAU,EACV,YAAa,EACb,MAAO,CACX,EAEM,EAAoB,CACtB,MAAO,EAAM,EAAc,OAAO,EAClC,OAAQ,EAAM,EAAe,QAAQ,EACrC,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,SAAU,EAAO,QAAQ,MAAM,EAC/B,SAAU,EACV,SAAU,EACV,KAAM,EAAM,EAAa,MAAM,EAC/B,KAAM,EACN,MAAO,EAAM,EAAqB,KAAK,EACvC,MAAO,EACP,aAAc,EACd,kBAAmB,CACvB,EAEM,EAA0B,CAC5B,GAAI,EAAM,EAAwB,KAAK,EACvC,GAAI,EACJ,MAAO,CACX,EAEM,EAAuB,CACzB,MAAO,EAAM,EAAc,OAAO,EAClC,OAAQ,EAAM,EAAe,QAAQ,EACrC,MAAO,EAAM,EAAyB,KAAK,EAC3C,MAAO,CACX,EAEM,EAAkB,CACpB,MAAO,EAAM,EAAc,OAAO,EAClC,OAAQ,EAAM,EAAe,QAAQ,EACrC,MAAO,CACX,EAEM,EAAmB,CACrB,QAAS,EAAO,QAAQ,GAAG,EAC3B,MAAO,EACP,UAAW,CACf,EClFM,EAAa,IAAI,QAEjB,EAAiB,GAAqC,CACpD,EAAW,IAAI,CAAc,IACjC,EAAW,IAAI,CAAc,EAC7B,EAA4B,CAAc,EAE9C"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./bridge-B4S_D6hV.js";import{a as t,n}from"./alpine-machine-BS13dbK4.js";var r=(e,t)=>typeof t==`string`&&t?t:e.getAttribute(`data-ui-key`)||e.id||null,i=`data-ui-motion-key`,a=`data-ui-motion-layout`,o=e=>typeof e==`object`&&!!e&&Symbol.iterator in e,s=(e=document)=>typeof e==`string`?Array.from(document.querySelectorAll(e)):e instanceof Document||e instanceof Element?[e]:o(e)?Array.from(e):[document],c=(e=document,t={})=>{let n=s(e).filter(e=>e instanceof Element),o=[],c=(e,t,n)=>{o.push({element:e,attr:t,previous:e.getAttribute(t)}),e.setAttribute(t,n)};return n.forEach(e=>{(t.layout??!0)&&c(e,a,``);let n=r(e,t.key);n&&!e.hasAttribute(`data-ui-motion-key`)&&c(e,i,n)}),()=>{o.reverse().forEach(({element:e,attr:t,previous:n})=>{if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)})}},l=(e,...t)=>{typeof console<`u`&&console.warn(e,...t)},u=new WeakMap,d=(e,t)=>{let n=u.get(e)??new Set;return n.add(t),u.set(e,n),()=>{n.delete(t),n.size===0&&u.delete(e)}},f=e=>{let t=e;for(;t;){let e=u.get(t);if(e?.size)return Array.from(e);t=t.parentElement}return[]},p=`data-ui-preserve-attr`,ee=(e,...t)=>{let n=new Set((e.getAttribute(`data-ui-preserve-attr`)??``).split(/\s+/).filter(Boolean));t.filter(Boolean).forEach(e=>n.add(e)),n.size>0&&e.setAttribute(p,Array.from(n).join(` `))},m=(e,t)=>{if(!(e instanceof Element)||!(t instanceof Element))return;let n=new Set([...(e.getAttribute(`data-ui-preserve-attr`)??``).split(/\s+/),...(t.getAttribute(`data-ui-preserve-attr`)??``).split(/\s+/)].filter(Boolean));if(n.size!==0){t.setAttribute(p,Array.from(n).join(` `));for(let r of n)e.hasAttribute(r)?t.setAttribute(r,e.getAttribute(r)??``):t.removeAttribute(r)}},h=`X-Trellis-UI-Request`,g=`X-Trellis-Client`,_=`X-Trellis-Request-ID`,v=`X-Trellis-Navigate`,y=`X-Trellis-Navigate-History`,b=`[data-ui-stream][data-ui-stream-client]`,te=`ui:stream:open`,x=`ui:stream:error`,S=`ui:stream:disconnected`,ne=`ui:stream:refresh`,C=`meta[name="csrf-token"]`,w=`text/event-stream`,re=`data-ui-request-pending`,T=`application/x-www-form-urlencoded`,ie=`multipart/form-data`,E=`[x-ui-request], [x-ui-request\\.navigate]`,ae=new Set([`data`,`extra`,`headers`,`history`,`method`]),oe=new Set([`GET`]),D=null,se=null,ce=e=>{let t=(e||`GET`).toUpperCase();return t===`POST`||t===`PUT`||t===`PATCH`||t===`DELETE`?t:`GET`},le=(e,t,n)=>{if(e instanceof FormData){e.append(t,n);return}e.append(t,n instanceof File?n.name:String(n))},ue=(e,t,n)=>{if(Array.isArray(n)){n.forEach(n=>ue(e,t,n));return}n!=null&&le(e,t,n instanceof Blob?n:String(n))},de=(e,t)=>{Object.entries(t).forEach(([t,n])=>ue(e,t,n))},fe=(e,t)=>{if(t){if(t instanceof FormData||t instanceof URLSearchParams){for(let[n,r]of t.entries())le(e,n,r);return}de(e,t)}},pe=(e,t)=>{let n=new Headers(e);n.set(h,`true`);let r=document.querySelector(C)?.content;return r&&n.set(`X-CSRFToken`,r),t instanceof URLSearchParams&&!n.has(`Content-Type`)&&n.set(`Content-Type`,T),n},me=(e,t,n)=>{if(e)return new URL(e,document.baseURI);if(t instanceof HTMLFormElement){let e=n?.getAttribute(`formaction`)||t.getAttribute(`action`)||window.location.href;return new URL(e,document.baseURI)}return t instanceof HTMLAnchorElement?new URL(t.href,document.baseURI):new URL(window.location.href)},he=(e,t)=>t?.getAttribute(`formenctype`)||e.enctype||T,ge=e=>{if(!(e instanceof HTMLButtonElement||e instanceof HTMLInputElement))return null;let t=e.getAttribute(`name`);return t?[t,e.value]:null},_e=(e,t)=>{let n=new FormData(e),r=ge(t);return r&&n.append(...r),n},ve=e=>e.getAttribute(`x-ui-request`)??e.getAttribute(`x-ui-request.navigate`)??``,ye=(e,n,r,i=!1)=>{if(!r.trim())return{};let a=e.evaluate(n,r);if(!t(a)){if(i)throw TypeError(`x-ui-request: expression must evaluate to an object`);return l(`x-ui-request: expression must evaluate to an object`),null}return Object.keys(a).forEach(e=>{ae.has(e)||l(`x-ui-request: unknown option key`,e)}),a},O=(e,t,n)=>{if(Array.isArray(n)){n.forEach(n=>O(e,t,n));return}if(n!=null){if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`){e.append(t,String(n));return}throw TypeError(`x-ui-request: document state "${t}" must be a URL-serializable scalar or array`)}},be=(e,t)=>{let n=new FormData(t);Array.from(t.elements).forEach(e=>{e instanceof HTMLInputElement&&(e.type===`file`||e.type===`password`||e.name===`csrfmiddlewaretoken`)&&n.delete(e.name)});for(let[t,r]of n.entries())typeof r==`string`&&e.append(t,r)},xe=(e,n,r=`data`)=>{if(n==null)return;if(n instanceof HTMLFormElement){be(e,n);return}if(n instanceof URLSearchParams){n.forEach((t,n)=>e.append(n,t));return}if(n instanceof FormData){for(let[t,r]of n.entries())O(e,t,r);return}let i=typeof n==`object`&&n?Object.getPrototypeOf(n):null;if(t(n)&&!Array.isArray(n)&&(i===Object.prototype||i===null)){Object.entries(n).forEach(([t,n])=>O(e,t,n));return}O(e,r,n)},Se=(e,t)=>e instanceof HTMLFormElement?new URL(e.getAttribute(`action`)||t.href,document.baseURI):e instanceof HTMLAnchorElement?new URL(e.href,document.baseURI):null,Ce=(e,t=new URL(window.location.href))=>{let n=new URLSearchParams;return Array.from(document.forms).forEach(e=>be(n,e)),document.querySelectorAll(E).forEach(r=>{let i=Se(r,t);if(!i||i.origin!==t.origin||i.pathname!==t.pathname)return;let a=ye(e,r,ve(r),!0);a&&(xe(n,a.data),xe(n,a.extra))}),n},we=e=>{let t=new URLSearchParams;for(let[n,r]of e.entries())r instanceof File?t.append(n,r.name):t.append(n,r);return t},Te=(e,t)=>{if(e===void 0)return{payload:t,explicit:!1};if(e instanceof HTMLFormElement)return{payload:new FormData(e),explicit:!0};if(e instanceof FormData||e instanceof URLSearchParams||typeof e==`string`||e instanceof Blob||e instanceof ArrayBuffer)return{payload:e,explicit:!0};let n=new URLSearchParams;return de(n,e),{payload:n,explicit:!0}},Ee=(e,t)=>{if(!t)return e;if(e instanceof FormData||e instanceof URLSearchParams)return fe(e,t),e;let n=new URLSearchParams;return typeof e==`string`&&n.append(`data`,e),fe(n,t),n},De=(e,t)=>e instanceof HTMLFormElement?{payload:_e(e,t),enctype:he(e,t)}:{payload:new URLSearchParams,enctype:T},Oe=(e,t,n)=>t?ce(t):e instanceof HTMLFormElement?ce(n?.getAttribute(`formmethod`)||e.getAttribute(`method`)):`GET`,ke=(e,t={})=>{let n=t.source,r=t.submitter??null,i=Oe(n,t.method,r),a=me(e,n,r),o=De(n,r),s=Te(t.data,o.payload),c=Ee(s.payload,t.extra),l={method:i,...t.cache?{cache:t.cache}:{}},u=null;return oe.has(i)?c instanceof FormData||c instanceof URLSearchParams?we(c).forEach((e,t)=>a.searchParams.append(t,e)):typeof c==`string`&&a.searchParams.append(`data`,c):u=c instanceof FormData&&(s.explicit||o.enctype===ie)?c:c instanceof FormData?we(c):c,l.headers=pe(t.headers,u),u!=null&&(l.body=u),{url:a,method:i,init:l}},Ae=e=>e?.isConnected?e:document,je=(e,t,n={})=>new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:n.cancelable??!1,detail:t}),k=(e,t,n,r)=>Ae(t).dispatchEvent(je(e,n,r)),A=new WeakMap,Me=e=>{if(!e)return;let t=A.get(e)??0;A.set(e,t+1),e.setAttribute(`aria-busy`,`true`),e.setAttribute(re,`true`)},Ne=e=>{if(!e)return;let t=(A.get(e)??1)-1;if(t>0){A.set(e,t);return}A.delete(e),e.removeAttribute(`aria-busy`),e.removeAttribute(re)},Pe=e=>e.headers.get(`Content-Type`)?.toLowerCase().includes(w)??!1,Fe=async e=>{let t=e.headers.get(v);if(t){let n=e.headers.get(y)??`auto`;return n!==`auto`&&n!==`push`&&n!==`replace`?(l(`x-ui-request: invalid navigation history`,n),{response:e,type:`other`,url:e.url}):{response:e,type:`navigate`,url:e.url,navigation:{history:n,url:t}}}return e.status===204||e.body===null||e.headers.get(`X-Trellis-UI-Response`)===`empty`?{response:e,type:`empty`,url:e.url}:e.redirected&&!Pe(e)?(window.location.assign(e.url),{response:e,type:`redirect`,url:e.url}):(l(`x-ui-request: expected an empty response`,e),{response:e,type:`other`,url:e.url})},Ie=new WeakMap,j=e=>{let t=e.dataset.uiStreamClient,n=Number(e.dataset.uiStreamClientExpires);return!t||Number.isFinite(n)&&n>0&&n<=Date.now()?null:t},Le=()=>{let e=document.querySelector(b),t=e?j(e):null;return!e||!t||e.dataset.uiStreamState!==`open`?null:{token:t}},Re=e=>{let t=Number(e.dataset.uiStreamTimeout);return Number.isFinite(t)&&t>=0?t:5e3},ze=e=>{let t=document.querySelector(b),n=t?j(t):null;if(!t)return Promise.resolve(null);if(n&&t.dataset.uiStreamState===`open`)return Promise.resolve({token:n});if(t.dataset.uiStreamState===`error`||t.dataset.uiStreamState===`disconnected`||e.aborted)return Promise.resolve(null);let r=Ie.get(t),i=r??new Promise(e=>{let n=n=>{window.clearTimeout(a),t.removeEventListener(te,r),t.removeEventListener(x,i),t.removeEventListener(S,i),e(n)},r=()=>{let e=j(t);n(e?{token:e}:null)},i=()=>n(null),a=window.setTimeout(i,Re(t));t.addEventListener(te,r,{once:!0}),t.addEventListener(x,i,{once:!0}),t.addEventListener(S,i,{once:!0})}).finally(()=>{Ie.delete(t)});return r||Ie.set(t,i),new Promise(t=>{let n=()=>t(null);e.addEventListener(`abort`,n,{once:!0}),i.then(r=>{e.removeEventListener(`abort`,n),t(r)})})},Be=async e=>{let t=Le();if(t)return t;let n=document.querySelector(b);if(!n)return null;if(!j(n)){n.dispatchEvent(new CustomEvent(ne));let e=Le();if(e)return e}return ze(e)},Ve=(e,t)=>{if(!t)return{signal:e.signal,cleanup:()=>void 0};let n=()=>e.abort(t.reason);return t.aborted?n():t.addEventListener(`abort`,n,{once:!0}),{signal:e.signal,cleanup:()=>t.removeEventListener(`abort`,n)}},He=(e,t)=>t.aborted||e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`,M=async(e,t,n={})=>{let r=n.source,i=new AbortController,a=n.requestId??crypto.randomUUID(),o=ke(t,n),s=Ve(i,n.signal),c=s.signal;o.init.signal=c,o.init.headers.set(_,a);let l=Le()??await Be(c);if(c.aborted)return s.cleanup(),{requestId:a,response:null,type:`aborted`,url:o.url.toString()};if(!l)return s.cleanup(),{requestId:a,response:null,type:c.aborted?`aborted`:`unavailable`,url:o.url.toString()};o.init.headers.set(g,l.token);let u={source:r??document,url:o.url.toString(),method:o.method,requestInit:o.init,requestId:a,controller:i,signal:c};if(!k(`ui:request:before`,r,u,{cancelable:!0}))return s.cleanup(),{requestId:a,response:null,type:`cancelled`,url:o.url.toString()};Me(r),k(`ui:request:start`,r,u);try{let e=await fetch(o.url.toString(),o.init),t=await Fe(e);u.response=e,u.responseType=t.type,e.ok&&t.type!==`other`||t.type===`redirect`?k(`ui:request:success`,r,u):k(`ui:request:error`,r,u);let n={...t,requestId:a};return n.navigation&&se?.(n),n}catch(e){if(He(e,c))return u.responseType=`aborted`,{requestId:a,response:null,type:`aborted`,url:o.url.toString()};throw u.error=e,k(`ui:request:error`,r,u),e}finally{s.cleanup(),Ne(r),k(`ui:request:finish`,r,u)}},Ue=()=>{if(!D)throw Error(`Trellis request runtime has not been registered with Alpine.`);return D},N=(e,t={})=>M(Ue(),e,t),We=(e,t={})=>N(e,{...t,method:`GET`}),Ge=(e,t={})=>N(e,{...t,method:`POST`}),Ke=(e,t={})=>N(e,{...t,method:`PUT`}),qe=(e,t={})=>N(e,{...t,method:`DELETE`}),Je=e=>{D=e},Ye=e=>{se=e},P=new Set,Xe=!1,F=null,Ze=null,Qe=null,$e=Promise.resolve(),et=0,tt=e=>{for(let t of e)P.add(t);Xe||P.size===0||(Xe=!0,queueMicrotask(()=>{Xe=!1;let e=Array.from(P);P.clear(),e.forEach(e=>e.invalidateDom())}))},nt=e=>{let t=document.createElement(`template`);return t.innerHTML=e,t},rt=e=>Array.from(nt(e).content.children).filter(e=>e instanceof HTMLElement),I=(e,t)=>{t.forEach(t=>e.initTree(t))},it=(e,t)=>t||e.getAttribute(`x-merge`)||`replace`,at=e=>{if(e.selector)return document.querySelector(e.selector);if(!e.target)return null;let t=e.target.startsWith(`#`)?e.target.slice(1):e.target;return document.getElementById(t)},ot=(e,t,i)=>{let a=it(t,i.mode);if(a===`remove`){t.remove();return}if(!i.html){l(`x-ui-stream: received patch with no html`);return}if(a===`morph`||a===`outer`){if(typeof e.morph==`function`){let a=new Set;e.morph(t,i.html,{key(e){return r(e)},updating(e,t,n,r){if(e instanceof Element&&Ze?.(i.requestId??null,e)){r?.();return}m(e,t)},updated(t){if(!(t instanceof Element))return;let r=n(e,t);r&&a.add(r),f(t).forEach(e=>{a.add(e)})}}),tt(a);return}l(`x-ui-stream: morph mode requires an Alpine morph implementation; falling back to replace`)}if(a===`replace`||a===`morph`||a===`outer`){let[n]=rt(i.html);if(!n){l(`x-ui-stream: replace mode produced no element`);return}t.replaceWith(n),e.initTree(n);return}if(a===`update`){let n=rt(i.html);t.innerHTML=i.html,I(e,Array.from(t.children).filter(e=>e instanceof HTMLElement)),n.length===0&&i.html.trim()&&e.initTree(t);return}let o=nt(i.html),s=Array.from(o.content.children).filter(e=>e instanceof HTMLElement);if(a===`append`){t.append(o.content),I(e,s);return}if(a===`prepend`){t.prepend(o.content),I(e,s);return}if(a===`before`){t.before(o.content),I(e,s);return}a===`after`&&(t.after(o.content),I(e,s))},st=(e,t)=>{let n=at(t);if(n){ot(e,n,t);return}if(t.selector||t.target){l(`x-ui-stream: target not found`,t.selector??t.target);return}if(!t.html){l(`x-ui-stream: received patch with no html`);return}rt(t.html).forEach(n=>{if(!n.id){l(`x-ui-stream: top-level element has no id, skipping`,n);return}let r=document.getElementById(n.id);r&&ot(e,r,{...t,html:n.outerHTML})})},ct=(t,n)=>{let r=Array.isArray(n)?n:[n],i=()=>{r.forEach(e=>st(t,e))},a=()=>{let e=r.filter(e=>e.viewTransition===!0);if(e.length===0){i();return}Qe?Qe(t,e,i):i()},o=r.flatMap(e=>e.assets??[]);if(o.length===0&&et===0){a();return}et+=1;let s=async()=>{o.length>0&&await e(o,t),a()};$e=$e.then(s,s).catch(()=>void 0).finally(()=>{--et})},lt=e=>{Qe=e},ut=e=>{document.dispatchEvent(new CustomEvent(e.event,{detail:e.detail??{},bubbles:!0,composed:!0}))},dt=e=>{let t=new Map;for(let n of e.data.split(`
|
|
2
|
-
`)){let e=n.indexOf(` `),r=e>0,i=r?n.slice(0,e):n;if(!r&&i!==`html`)return l(`x-ui-stream: invalid SSE command line`,i),null;let a=r?n.slice(e+1):``,o=t.get(i);o?o.push(a):t.set(i,[a])}return t},L=(e,t)=>{let n=e.get(t);if(n?.length)return n.length>1&&l(`x-ui-stream: duplicate SSE command, using last value`,t),n.at(-1)},ft=(e,t)=>{let n=dt(t);if(!n||n.size===0)return;let r=L(n,`request-id`);if(F&&!F(r??null))return;let i,a=L(n,`assets`);if(a)try{let e=JSON.parse(a);if(!Array.isArray(e))throw TypeError(`assets must be an array`);i=e}catch{l(`x-ui-stream: invalid patch assets JSON`,a);return}ct(e,{mode:L(n,`mode`)??`replace`,target:L(n,`target`)??null,selector:L(n,`selector`)??null,html:n.get(`html`)?.join(`
|
|
3
|
-
`)??null,requestId:r??null,viewTransition:L(n,`view-transition`)===`true`,...i?{assets:i}:{}})},pt=e=>{let n=dt(e);if(!n)return;let r=L(n,`request-id`);if(F&&!F(r??null))return;let i=L(n,`event`);if(!i){l(`x-ui-stream: dispatch SSE frame missing event`);return}let a=L(n,`detail`),o={};if(a)try{let e=JSON.parse(a);t(e)&&(o=e)}catch{l(`x-ui-stream: invalid dispatch detail JSON`,a);return}ut({event:i,detail:o})},mt={"trellis-ui-patch":ft,"trellis-ui-dispatch":(e,t)=>pt(t)},ht=`trellis-ui-`,gt=(e,t)=>{let n=mt[t.event];if(!n){t.event.startsWith(ht)&&l(`x-ui-stream: unsupported SSE event`,t.event);return}n(e,t)},_t=(e,t=``,n=``)=>{let r=new URL(e,document.baseURI),i=[...new Set(t.split(/\s+/).filter(Boolean))];return n&&r.searchParams.set(`client`,n),i.length>0&&(r.searchParams.delete(`channel`),i.forEach(e=>r.searchParams.append(`channel`,e))),/^[a-z][a-z\d+.-]*:/i.test(e)||e.startsWith(`//`)?r.href:`${r.pathname}${r.search}${r.hash}`},vt=(e,t,n=``,r=``,i={})=>{let a=new EventSource(_t(t,n,r)),o=!0;return Object.keys(mt).forEach(t=>{a.addEventListener(t,t=>{!o||!(t instanceof MessageEvent)||gt(e,{event:t.type,data:String(t.data)})})}),a.addEventListener(`stream-open`,()=>{o&&i.open?.()}),a.addEventListener(`stream-reset`,e=>{o&&i.reset?.(e instanceof MessageEvent?String(e.data):``)}),a.addEventListener(`stream-error`,e=>{o&&(o=!1,a.close(),i.error?.(e instanceof MessageEvent?String(e.data):``))}),a.addEventListener(`error`,()=>{o&&(o=!1,a.close(),i.disconnected?.())}),{abort(){o=!1,a.close()}}},R=new Map,yt=new Set,bt=e=>e instanceof HTMLElement&&e.id?e.id:e,xt=6e4,St=1e3,Ct=2e3,wt=1e3,Tt=3e4,z=(e,t,n={})=>{t!==`reset`&&(e.dataset.uiStreamState=t),e.dispatchEvent(new CustomEvent(`ui:stream:${t}`,{bubbles:!0,composed:!0,detail:{source:e,...n}}))},Et=(e,t)=>_t(t,e.dataset.uiStreamScopes,e.dataset.uiStreamClient),Dt=e=>e.dataset.uiStreamOpenWhenHidden===`true`,B=(e,t)=>JSON.stringify({openWhenHidden:Dt(e),url:Et(e,t)}),Ot=e=>!!e.dataset.uiStreamScopes?.trim(),kt=e=>{if(!(e instanceof CustomEvent))return null;let t=e.detail;return!t||typeof t.requestId!=`string`||typeof t.method!=`string`||!(t.controller instanceof AbortController)?null:t},At=(e,t,n)=>{let r=B(t,n),i=null,a,o=null,s,c,u=!1,d=0,f=0,p=!1,m=!1,h=new Map,g=new Set,_=Dt(t),v=()=>!p&&(_||document.visibilityState===`visible`),y=()=>{window.clearTimeout(s),s=void 0},b=()=>{t.dispatchEvent(new CustomEvent(`ui:stream:resumed`,{bubbles:!0,composed:!0}))},te=async n=>{Ot(t)&&await M(e,window.location.href,{method:`GET`,cache:`no-store`,data:Ce(e)}).catch(e=>(l(`x-ui-stream: could not revalidate resumed document`,e),null)),!(m||n!==d||t.dataset.uiStreamState!==`open`)&&b()},x=a=>{i?.abort(),y();let o=++d;r=B(t,n),z(t,`connecting`),i=vt(e,n,t.dataset.uiStreamScopes,a,{open:()=>{if(o!==d)return;let e=u;u=!0,f=0,z(t,`open`),e&&te(o)},disconnected:()=>{if(o!==d||m||(i=null,D.controller=null,z(t,`disconnected`),!v()))return;let e=Math.min(wt*2**f,Tt);f+=1;let n=Math.floor(Math.random()*e);s=window.setTimeout(()=>{s=void 0,w()},n)},reset:e=>z(t,`reset`,{data:e}),error:e=>{o!==d||m||(p=!0,i=null,D.controller=null,y(),z(t,`error`,{data:e}))}}),D.controller=i,D.configuration=r,S()},S=()=>{if(window.clearTimeout(a),a=void 0,!v())return;let e=Number(t.dataset.uiStreamClientExpires);if(!Number.isFinite(e)||e<=0)return;let n=e-Date.now()-xt;if(n<=0){C();return}a=window.setTimeout(()=>void C(),n)},ne=()=>{if(m)return Promise.resolve(null);if(o)return o;let e=t.dataset.uiStreamClientRefresh;return e?(o=fetch(e,{headers:{Accept:`application/json`,"X-Trellis-Client":t.dataset.uiStreamClient??``}}).then(async e=>{if(!e.ok)throw Error(`ClientSession refresh failed (${e.status})`);let n=await e.json();if(typeof n.token!=`string`||typeof n.expiresAt!=`number`)throw Error(`ClientSession refresh returned an invalid payload`);return m?null:(t.dataset.uiStreamClient=n.token,t.dataset.uiStreamClientExpires=String(n.expiresAt),n.token)}).catch(e=>{l(`x-ui-stream: could not refresh ClientSession`,e);let n=Number(t.dataset.uiStreamClientExpires);return!Number.isFinite(n)||n<=Date.now()?(z(t,`error`,{error:e}),null):(v()&&(a=window.setTimeout(()=>void C(),5e3)),t.dataset.uiStreamClient??null)}).finally(()=>{o=null}),o):(z(t,`error`,{reason:`missing-refresh-url`}),Promise.resolve(null))},C=async()=>{if(!v())return;let e=await ne();e&&v()&&!m&&x(e)},w=async()=>{if(m||!v()||i)return;let e=Number(t.dataset.uiStreamClientExpires),n=t.dataset.uiStreamClient??``,r=Number.isFinite(e)&&e>0&&e-Date.now()<=xt?await ne():n;r&&v()&&!m&&!i&&x(r)},re=()=>{c=void 0,!(m||_||document.visibilityState!==`hidden`)&&(g.size>0||(h.forEach(e=>e.abort(`Document suspended`)),h.clear(),window.clearTimeout(a),a=void 0,y(),i?.abort(),i=null,z(t,`suspended`),D.controller=null))},T=e=>{window.clearTimeout(c),c=void 0,!(_||document.visibilityState!==`hidden`)&&(c=window.setTimeout(re,e))},ie=()=>{p||C()},E=e=>{let t=kt(e);if(t){if(t.method===`GET`){h.set(t.requestId,t.controller);return}g.add(t.requestId),document.visibilityState===`hidden`&&!_&&(window.clearTimeout(c),c=void 0)}},ae=e=>{let t=kt(e);if(t){if(t.method===`GET`){h.delete(t.requestId);return}g.delete(t.requestId),document.visibilityState===`hidden`&&!_&&g.size===0&&T(Ct)}},oe=()=>{if(!(_||p)){if(document.visibilityState===`hidden`){if(g.size>0)return;T(St);return}window.clearTimeout(c),c=void 0,i||w()}},D={configuration:r,controller:null,element:t,dispose(){m||(m=!0,window.clearTimeout(a),window.clearTimeout(c),y(),t.removeEventListener(`ui:stream:refresh`,ie),document.removeEventListener(`visibilitychange`,oe),document.removeEventListener(`ui:request:start`,E),document.removeEventListener(`ui:request:finish`,ae),i?.abort())},rescheduleRefresh:S};return ee(t,`data-ui-stream-state`),t.addEventListener(`ui:stream:refresh`,ie),document.addEventListener(`visibilitychange`,oe),document.addEventListener(`ui:request:start`,E),document.addEventListener(`ui:request:finish`,ae),v()?w():z(t,`suspended`),D},jt=e=>{typeof e.directive==`function`&&e.directive(`ui-stream`,(t,{expression:n},{cleanup:r})=>{if(!n)return;let i=t instanceof HTMLElement?t.dataset.uiStreamClient:``;if(!(t instanceof HTMLElement)||!i){l(`x-ui-stream: missing signed ClientSession capability`);return}let a=bt(t),o=R.get(a),s=B(t,n);if(o?.configuration===s){t.dataset.uiStreamState=o.element.dataset.uiStreamState??`connecting`,ee(t,`data-ui-stream-state`),queueMicrotask(()=>o.rescheduleRefresh());return}if(!t.isConnected&&typeof a==`string`){yt.has(a)||(yt.add(a),queueMicrotask(()=>{yt.delete(a);let t=document.getElementById(a);if(!t)return;let r=R.get(a),i=B(t,n);if(r?.configuration===i){r.rescheduleRefresh();return}r?.dispose(),R.set(a,At(e,t,n))}));return}o?.dispose(),R.set(a,At(e,t,n)),r(()=>{let e=R.get(a);e?.element===t&&(e.dispose(),R.delete(a))})})},Mt=e=>{F=e},Nt=e=>{Ze=e},Pt=`__trellis`,Ft=`[data-ui-scroll-restoration]`,It=20,Lt=100,Rt=!1,V=null,H=0,zt=!1,U=null,W=new Map,G=new Set,K=new Map,q=()=>crypto.randomUUID(),Bt=()=>({containers:{},window:{x:0,y:0}}),Vt=e=>e.getAttribute(`data-ui-scroll-restoration`)?.trim()||e.id||null,Ht=()=>{let e={};return document.querySelectorAll(Ft).forEach(t=>{let n=Vt(t);n&&(e[n]={x:t.scrollLeft,y:t.scrollTop})}),{containers:e,window:{x:window.scrollX,y:window.scrollY}}},J=e=>{if(!t(e))return null;let n=e[Pt];if(!t(n))return null;let r=n.navigate;return!t(r)||typeof r.id!=`string`||typeof r.index!=`number`||typeof r.url!=`string`||!t(r.scroll)?null:r},Ut=e=>{let n=t(window.history.state)?window.history.state:{},r=t(n.__trellis)?n[Pt]:{};return{...n,[Pt]:{...r,navigate:e}}},Y=(e,t=e.url)=>{window.history.replaceState(Ut(e),``,t)},Wt=()=>{let e=J(window.history.state);if(!e)return;let t=Ht();W.set(e.id,t),Y({...e,scroll:t})},Gt=()=>{U!==null&&(cancelAnimationFrame(U),U=null),Wt()},Kt=()=>{let e=J(window.history.state);e&&(W.set(e.id,Ht()),U===null&&(U=requestAnimationFrame(()=>{U=null;let e=J(window.history.state);if(!e)return;let t=W.get(e.id);t&&Y({...e,scroll:t})})))},qt=e=>{requestAnimationFrame(()=>{window.scrollTo({left:e.window.x,top:e.window.y,behavior:`instant`}),document.querySelectorAll(Ft).forEach(t=>{let n=Vt(t),r=n?e.containers[n]:void 0;t.scrollTo({left:r?.x??0,top:r?.y??0,behavior:`instant`})})})},X=(e,t,n=!1)=>{let r=t.source?.isConnected?t.source:document;return r.dispatchEvent(new CustomEvent(e,{bubbles:!0,cancelable:n,composed:!0,detail:{history:t.history,source:r,url:t.destination}}))},Jt=e=>{for(K.set(e.requestId,e);K.size>It;){let e=K.keys().next().value;if(!e)break;K.delete(e)}},Yt=e=>{for(G.add(e);G.size>Lt;){let e=G.values().next().value;if(!e)break;G.delete(e)}},Xt=()=>{V&&=(Yt(V.requestId),V.controller.abort(`Superseded by a newer Trellis navigation`),null)},Zt=()=>{Xt(),K.forEach(e=>Yt(e.requestId)),K.clear()},Z=e=>{window.location.assign(e.href)},Qt=e=>{let t=new URL(e,document.baseURI);return t.origin===window.location.origin?t:null},$t=e=>{Gt();let t={id:q(),index:H+1,scroll:Bt(),url:e.destination.href};return H=t.index,window.history.pushState(Ut(t),``,e.destination),e.entryId=t.id,t},en=e=>{let t={id:q(),index:H,scroll:Bt(),url:e.destination.href};return Y(t,e.destination),e.entryId=t.id,t},tn=e=>{if(e.disposition===`replace`)return!0;if(e.disposition===`push`)return!1;let t=new URL(window.location.href);return t.origin===e.destination.origin&&t.pathname===e.destination.pathname},nn=(e,t)=>{t?.type===`aborted`||t?.type===`cancelled`||t?.type===`redirect`||Z(e.destination)},rn=(e,t,n)=>{if(G.has(e.requestId))return;if(t.type!==`empty`){nn(e,t);return}let r=n??(tn(e)?en(e):$t(e));if(n&&e.destination.href!==n.url){let t={...n,url:e.destination.href};Y(t,e.destination),e.entryId=t.id}qt(r.scroll),X(`ui:navigated`,e)},an=(e,t,n)=>{let r={controller:new AbortController,destination:t,entryId:n.restoredState?.id??null,history:n.history,disposition:n.disposition??`auto`,requestId:q(),...n.requestOptions?{requestOptions:n.requestOptions}:{},...n.source?{source:n.source}:{}};if(n.preflight!==!1&&!X(`ui:navigate`,r,!0))return Promise.resolve();Zt(),V=r,X(`ui:navigating`,r);let i=new Headers(r.requestOptions?.headers);i.set(`X-Trellis-Navigation`,r.history?`restore`:`navigate`);let a=!0,o=async()=>{let t=a?r.requestOptions:void 0,n=a?r.source:void 0;a=!1;let s=await M(e,r.destination,{...t,headers:i,method:`GET`,requestId:r.requestId,signal:r.controller.signal,...n?{source:n}:{}});if(r.destination=new URL(s.url,document.baseURI),!s.navigation)return s;let c=Qt(s.navigation.url);return c?(r.destination=c,s.navigation.history!==`auto`&&(r.disposition=s.navigation.history),o()):(Z(new URL(s.navigation.url,document.baseURI)),{...s,type:`redirect`})};return o().then(e=>{V?.requestId!==r.requestId&&!K.has(r.requestId)||rn(r,e,n.restoredState)}).catch(e=>{r.controller.signal.aborted||(l(`x-ui-request.navigate: restoration failed`,e),nn(r))}).finally(()=>{V?.requestId===r.requestId&&(V=null),G.has(r.requestId)||Jt(r)})},on=()=>{let e=J(window.history.state);e?H=e.index:Y({id:q(),index:0,scroll:Ht(),url:window.location.href}),`scrollRestoration`in window.history&&(window.history.scrollRestoration=`manual`)},sn=e=>{Rt||(Rt=!0,on(),Mt(e=>!e||!G.has(e)),Nt((e,t)=>t.matches(`[data-ui-stream]`)&&!!(e&&(V?.requestId===e||K.has(e)))),Ye(t=>{if(!t.navigation)return!1;if(G.has(t.requestId)||V?.requestId===t.requestId)return!0;let n=Qt(t.navigation.url);return n?(an(e,n,{history:!1,disposition:t.navigation.history}),!0):(Z(new URL(t.navigation.url,document.baseURI)),!0)}),window.addEventListener(`scroll`,Kt,{passive:!0}),document.addEventListener(`scroll`,Kt,{capture:!0,passive:!0}),window.addEventListener(`pagehide`,Gt),window.addEventListener(`popstate`,t=>{if(zt){zt=!1;return}let n=J(t.state);if(!n){Z(new URL(window.location.href));return}let r=W.get(n.id),i=r?{...n,scroll:r}:n,a=Qt(n.url);if(!a||a.href!==window.location.href){Z(new URL(window.location.href));return}let o=H;if(H=n.index,!X(`ui:navigate`,{controller:new AbortController,destination:a,entryId:n.id,history:!0,disposition:`replace`,requestId:q()},!0)){zt=!0,window.history.go(o-n.index),H=o;return}an(e,a,{history:!0,preflight:!1,restoredState:i})}))},cn=(e,t,n,r)=>{let{history:i=`auto`,...a}=r??{};return an(e,new URL(t,document.baseURI),{history:!1,disposition:i,requestOptions:a,...n?{source:n}:{}})},Q={activeRequests:0},ln=!1,un=!1,$={},dn=null,fn=(e,t={})=>{let{history:n,navigate:r=!1,...i}=t;if(!r)return We(e,i);if(!dn)throw Error(`Trellis UI runtime has not been registered with Alpine.`);let{source:a,...o}=i;return cn(dn,e,a,{...o,...n?{history:n}:{}})},pn=(e,t)=>(n,r={})=>{let{navigate:i=!1,...a}=r;return i&&l(`$ui.${e}: navigate is only supported for GET requests`),t(n,a)},mn={get:fn,post:pn(`post`,Ge),put:pn(`put`,Ke),delete:pn(`delete`,qe),get motion(){if(!$.motion)throw Error(`Trellis Motion capability is not registered.`);return $.motion},get sortable(){if(!$.sortable)throw Error(`Trellis Sortable capability is not registered.`);return $.sortable},get isFetching(){return Q.activeRequests>0}},hn=()=>{un||(un=!0,document.addEventListener(`ui:request:start`,()=>{Q.activeRequests+=1}),document.addEventListener(`ui:request:finish`,()=>{Q.activeRequests=Math.max(0,Q.activeRequests-1)}))},gn=e=>{dn=e,ln||=(Q=e.reactive(Q),!0),hn(),e.magic(`ui`,()=>mn)},_n=e=>{$.motion=e},vn=e=>{$.sortable=e};export{a as _,cn as a,lt as c,Je as d,M as f,i as g,l as h,mn as i,E as l,d as m,_n as n,sn as o,ee as p,vn as r,jt as s,gn as t,ye as u,c as v};
|
|
4
|
-
//# sourceMappingURL=ui-DQwcal8k.js.map
|
package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-DQwcal8k.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui-DQwcal8k.js","names":[],"sources":["../../../../../../../../client/src/runtime/identity.ts","../../../../../../../../client/src/runtime/layout-participant.ts","../../../../../../../../client/src/utils/warn.ts","../../../../../../../../client/src/runtime/dom-invalidation.ts","../../../../../../../../client/src/runtime/morph.ts","../../../../../../../../client/src/runtime/engine/request.ts","../../../../../../../../client/src/runtime/engine/stream.ts","../../../../../../../../client/src/runtime/engine/navigation.ts","../../../../../../../../client/src/runtime/ui.ts"],"sourcesContent":["const STABLE_KEY_ATTR = 'data-ui-key';\n\nconst stableIdentity = (element: Element, explicit?: unknown): string | null => {\n if (typeof explicit === 'string' && explicit) return explicit;\n return element.getAttribute(STABLE_KEY_ATTR) || element.id || null;\n};\n\nexport {STABLE_KEY_ATTR, stableIdentity};\n","import {stableIdentity} from './identity';\n\ntype LayoutScope = Element | Document | string | Iterable<Element>;\n\nconst MOTION_KEY_ATTR = 'data-ui-motion-key';\nconst MOTION_LAYOUT_ATTR = 'data-ui-motion-layout';\n\nconst isIterable = (value: unknown): value is Iterable<Element> => (\n typeof value === 'object'\n && value !== null\n && Symbol.iterator in value\n);\n\nconst scopeRoots = (scope: LayoutScope = document): Array<Element | Document> => {\n if (typeof scope === 'string') return Array.from(document.querySelectorAll(scope));\n if (scope instanceof Document || scope instanceof Element) return [scope];\n if (isIterable(scope)) return Array.from(scope);\n return [document];\n};\n\nconst markLayoutParticipant = (\n scope: LayoutScope = document,\n options: {key?: string; layout?: boolean} = {},\n): (() => void) => {\n const elements = scopeRoots(scope).filter((root): root is Element => root instanceof Element);\n const changed: Array<{element: Element; attr: string; previous: string | null}> = [];\n const setTemporaryAttr = (element: Element, attr: string, value: string): void => {\n changed.push({element, attr, previous: element.getAttribute(attr)});\n element.setAttribute(attr, value);\n };\n\n elements.forEach((element) => {\n if (options.layout ?? true) setTemporaryAttr(element, MOTION_LAYOUT_ATTR, '');\n const identity = stableIdentity(element, options.key);\n if (identity && !element.hasAttribute(MOTION_KEY_ATTR)) {\n setTemporaryAttr(element, MOTION_KEY_ATTR, identity);\n }\n });\n\n return () => {\n changed.reverse().forEach(({element, attr, previous}) => {\n if (previous === null) {\n element.removeAttribute(attr);\n return;\n }\n element.setAttribute(attr, previous);\n });\n };\n};\n\nexport {MOTION_KEY_ATTR, MOTION_LAYOUT_ATTR, markLayoutParticipant};\nexport type {LayoutScope};\n","const warn = (message: string, ...args: unknown[]): void => {\n if (typeof console !== 'undefined') console.warn(message, ...args);\n};\n\nexport {warn};\n","type DomInvalidationOwner = Readonly<{\n invalidateDom(): void;\n}>;\n\nconst owners = new WeakMap<Element, Set<DomInvalidationOwner>>();\n\nconst registerDomInvalidationOwner = (\n element: Element,\n owner: DomInvalidationOwner,\n): (() => void) => {\n const elementOwners = owners.get(element) ?? new Set<DomInvalidationOwner>();\n elementOwners.add(owner);\n owners.set(element, elementOwners);\n return () => {\n elementOwners.delete(owner);\n if (elementOwners.size === 0) owners.delete(element);\n };\n};\n\nconst findClosestDomInvalidationOwners = (element: Element): readonly DomInvalidationOwner[] => {\n let current: Element | null = element;\n while (current) {\n const elementOwners = owners.get(current);\n if (elementOwners?.size) return Array.from(elementOwners);\n current = current.parentElement;\n }\n return [];\n};\n\nexport {findClosestDomInvalidationOwners, registerDomInvalidationOwner};\nexport type {DomInvalidationOwner};\n","const PRESERVE_MORPH_ATTRIBUTES = 'data-ui-preserve-attr';\n\nconst declareMorphAttributes = (element: Element, ...names: string[]): void => {\n const declared = new Set(\n (element.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '')\n .split(/\\s+/)\n .filter(Boolean),\n );\n names.filter(Boolean).forEach((name) => declared.add(name));\n if (declared.size > 0) {\n element.setAttribute(PRESERVE_MORPH_ATTRIBUTES, Array.from(declared).join(' '));\n }\n};\n\nconst preserveDeclaredMorphAttributes = (from: Node, to: Node): void => {\n if (!(from instanceof Element) || !(to instanceof Element)) return;\n const preserved = new Set([\n ...(from.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '').split(/\\s+/),\n ...(to.getAttribute(PRESERVE_MORPH_ATTRIBUTES) ?? '').split(/\\s+/),\n ].filter(Boolean));\n if (preserved.size === 0) return;\n to.setAttribute(PRESERVE_MORPH_ATTRIBUTES, Array.from(preserved).join(' '));\n\n for (const name of preserved) {\n if (from.hasAttribute(name)) {\n to.setAttribute(name, from.getAttribute(name) ?? '');\n } else {\n to.removeAttribute(name);\n }\n }\n};\n\nexport {\n PRESERVE_MORPH_ATTRIBUTES,\n declareMorphAttributes,\n preserveDeclaredMorphAttributes,\n};\n","import type Alpine from 'alpinejs';\nimport type {StreamAlpine} from './stream';\nimport {isRecord, warn} from '../../utils';\n\ntype RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype RequestData = FormData | URLSearchParams | HTMLFormElement | Record<string, unknown> | string | Blob | ArrayBuffer;\ntype RequestExtra = Record<string, unknown> | FormData | URLSearchParams;\ntype RequestSource = Element;\ntype NavigationHistory = 'auto' | 'push' | 'replace';\n\ntype RequestOptions = {\n method?: RequestMethod | Lowercase<RequestMethod>;\n cache?: RequestCache;\n data?: RequestData;\n extra?: RequestExtra;\n headers?: HeadersInit;\n requestId?: string;\n signal?: AbortSignal;\n source?: RequestSource;\n submitter?: HTMLElement | null;\n};\n\ntype PreparedRequest = {\n url: URL;\n method: RequestMethod;\n init: RequestInit;\n};\n\ntype RequestResult = {\n requestId: string;\n response: Response | null;\n type: 'empty' | 'navigate' | 'redirect' | 'other' | 'aborted' | 'cancelled' | 'unavailable';\n url: string;\n navigation?: {history: NavigationHistory; url: string};\n};\n\ntype RequestLifecycleDetail = {\n source: Element | Document;\n url: string;\n method: RequestMethod;\n requestInit: RequestInit;\n requestId: string;\n response?: Response | null;\n responseType?: RequestResult['type'];\n error?: unknown;\n controller: AbortController;\n signal: AbortSignal;\n};\n\ntype BoundAbortSignal = {\n signal: AbortSignal;\n cleanup(): void;\n};\ntype RequestEvaluator = Pick<Alpine.Alpine, 'evaluate'>;\n\nconst REQUEST_HEADER = 'X-Trellis-UI-Request';\nconst CLIENT_SESSION_HEADER = 'X-Trellis-Client';\nconst REQUEST_ID_HEADER = 'X-Trellis-Request-ID';\nconst NAVIGATE_HEADER = 'X-Trellis-Navigate';\nconst NAVIGATE_HISTORY_HEADER = 'X-Trellis-Navigate-History';\nconst CLIENT_STREAM_SELECTOR = '[data-ui-stream][data-ui-stream-client]';\nconst CLIENT_STREAM_OPEN_EVENT = 'ui:stream:open';\nconst CLIENT_STREAM_ERROR_EVENT = 'ui:stream:error';\nconst CLIENT_STREAM_DISCONNECTED_EVENT = 'ui:stream:disconnected';\nconst CLIENT_STREAM_REFRESH_EVENT = 'ui:stream:refresh';\nconst CSRF_META_SELECTOR = 'meta[name=\"csrf-token\"]';\nconst SSE_CONTENT_TYPE = 'text/event-stream';\nconst PENDING_ATTRIBUTE = 'data-ui-request-pending';\nconst FORM_URL_ENCODED = 'application/x-www-form-urlencoded';\nconst FORM_MULTIPART = 'multipart/form-data';\nconst REQUEST_ROOT_SELECTOR = '[x-ui-request], [x-ui-request\\\\.navigate]';\nconst REQUEST_OPTION_KEYS = new Set(['data', 'extra', 'headers', 'history', 'method']);\n// GET is the only bodyless helper. DELETE remains body-capable for API symmetry;\n// Django apps may still prefer POST intents or URL-specific delete routes.\nconst METHODS_WITHOUT_BODY = new Set<RequestMethod>(['GET']);\n\nlet AlpineRuntime: StreamAlpine | null = null;\nlet navigateResponseHandler: ((result: RequestResult) => boolean) | null = null;\n\nconst normalizeMethod = (method: string | null | undefined): RequestMethod => {\n const value = (method || 'GET').toUpperCase();\n if (value === 'POST' || value === 'PUT' || value === 'PATCH' || value === 'DELETE') return value;\n return 'GET';\n};\n\nconst appendEntry = (target: FormData | URLSearchParams, key: string, value: string | Blob): void => {\n if (target instanceof FormData) {\n target.append(key, value);\n return;\n }\n target.append(key, value instanceof File ? value.name : String(value));\n};\n\nconst addValue = (target: FormData | URLSearchParams, key: string, value: unknown): void => {\n if (Array.isArray(value)) {\n value.forEach((item) => addValue(target, key, item));\n return;\n }\n if (value === undefined || value === null) return;\n appendEntry(target, key, value instanceof Blob ? value : String(value));\n};\n\nconst appendRecord = (target: FormData | URLSearchParams, record: Record<string, unknown>): void => {\n Object.entries(record).forEach(([key, value]) => addValue(target, key, value));\n};\n\nconst appendExtra = (target: FormData | URLSearchParams, extra: RequestExtra | undefined): void => {\n if (!extra) return;\n if (extra instanceof FormData || extra instanceof URLSearchParams) {\n for (const [key, value] of extra.entries()) appendEntry(target, key, value);\n return;\n }\n appendRecord(target, extra);\n};\n\nconst headersWithDefaults = (headersInit: HeadersInit | undefined, body: BodyInit | null): Headers => {\n const headers = new Headers(headersInit);\n headers.set(REQUEST_HEADER, 'true');\n\n const csrf = document.querySelector<HTMLMetaElement>(CSRF_META_SELECTOR)?.content;\n if (csrf) headers.set('X-CSRFToken', csrf);\n\n if (body instanceof URLSearchParams && !headers.has('Content-Type')) {\n headers.set('Content-Type', FORM_URL_ENCODED);\n }\n\n return headers;\n};\n\nconst urlFor = (url: string | URL | undefined, source: RequestSource | undefined, submitter: HTMLElement | null): URL => {\n if (url) return new URL(url, document.baseURI);\n\n if (source instanceof HTMLFormElement) {\n const action = submitter?.getAttribute('formaction') || source.getAttribute('action') || window.location.href;\n return new URL(action, document.baseURI);\n }\n\n if (source instanceof HTMLAnchorElement) return new URL(source.href, document.baseURI);\n\n return new URL(window.location.href);\n};\n\nconst formEnctype = (form: HTMLFormElement, submitter: HTMLElement | null): string => (\n submitter?.getAttribute('formenctype') || form.enctype || FORM_URL_ENCODED\n);\n\nconst submitterNameValue = (submitter: HTMLElement | null): [string, string] | null => {\n if (!(submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement)) return null;\n const name = submitter.getAttribute('name');\n if (!name) return null;\n return [name, submitter.value];\n};\n\nconst formPayload = (form: HTMLFormElement, submitter: HTMLElement | null): FormData => {\n const payload = new FormData(form);\n const pair = submitterNameValue(submitter);\n if (pair) payload.append(...pair);\n return payload;\n};\n\nconst requestExpression = (el: Element): string => (\n el.getAttribute('x-ui-request')\n ?? el.getAttribute('x-ui-request.navigate')\n ?? ''\n);\n\nconst evaluateRequestOptions = (\n AlpineInstance: RequestEvaluator,\n el: Element,\n expression: string,\n strict = false,\n): Record<string, unknown> | null => {\n if (!expression.trim()) return {};\n const evaluated = AlpineInstance.evaluate(el, expression);\n if (!isRecord(evaluated)) {\n if (strict) throw new TypeError('x-ui-request: expression must evaluate to an object');\n warn('x-ui-request: expression must evaluate to an object');\n return null;\n }\n Object.keys(evaluated).forEach((key) => {\n if (!REQUEST_OPTION_KEYS.has(key)) warn('x-ui-request: unknown option key', key);\n });\n return evaluated;\n};\n\nconst appendDocumentValue = (params: URLSearchParams, key: string, value: unknown): void => {\n if (Array.isArray(value)) {\n value.forEach((item) => appendDocumentValue(params, key, item));\n return;\n }\n if (value === undefined || value === null) return;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n params.append(key, String(value));\n return;\n }\n throw new TypeError(\n `x-ui-request: document state \"${key}\" must be a URL-serializable scalar or array`,\n );\n};\n\nconst appendFormDocumentData = (params: URLSearchParams, form: HTMLFormElement): void => {\n const data = new FormData(form);\n Array.from(form.elements).forEach((control) => {\n if (!(control instanceof HTMLInputElement)) return;\n if (\n control.type === 'file'\n || control.type === 'password'\n || control.name === 'csrfmiddlewaretoken'\n ) data.delete(control.name);\n });\n for (const [key, value] of data.entries()) {\n if (typeof value === 'string') params.append(key, value);\n }\n};\n\nconst appendDocumentData = (params: URLSearchParams, value: unknown, fallbackKey = 'data'): void => {\n if (value === undefined || value === null) return;\n if (value instanceof HTMLFormElement) {\n appendFormDocumentData(params, value);\n return;\n }\n if (value instanceof URLSearchParams) {\n value.forEach((entry, key) => params.append(key, entry));\n return;\n }\n if (value instanceof FormData) {\n for (const [key, entry] of value.entries()) appendDocumentValue(params, key, entry);\n return;\n }\n const prototype = typeof value === 'object' && value !== null\n ? Object.getPrototypeOf(value) as unknown\n : null;\n if (\n isRecord(value)\n && !Array.isArray(value)\n && (prototype === Object.prototype || prototype === null)\n ) {\n Object.entries(value).forEach(([key, entry]) => appendDocumentValue(params, key, entry));\n return;\n }\n appendDocumentValue(params, fallbackKey, value);\n};\n\nconst requestTarget = (el: Element, current: URL): URL | null => {\n if (el instanceof HTMLFormElement) {\n return new URL(el.getAttribute('action') || current.href, document.baseURI);\n }\n if (el instanceof HTMLAnchorElement) return new URL(el.href, document.baseURI);\n return null;\n};\n\nconst collectDocumentRequestData = (\n AlpineInstance: RequestEvaluator,\n current = new URL(window.location.href),\n): URLSearchParams => {\n const params = new URLSearchParams();\n Array.from(document.forms).forEach((form) => appendFormDocumentData(params, form));\n\n document.querySelectorAll(REQUEST_ROOT_SELECTOR).forEach((el) => {\n const target = requestTarget(el, current);\n if (!target || target.origin !== current.origin || target.pathname !== current.pathname) return;\n const options = evaluateRequestOptions(AlpineInstance, el, requestExpression(el), true);\n if (!options) return;\n appendDocumentData(params, options.data);\n appendDocumentData(params, options.extra);\n });\n return params;\n};\n\nconst paramsFrom = (payload: FormData | URLSearchParams): URLSearchParams => {\n const params = new URLSearchParams();\n for (const [key, value] of payload.entries()) {\n if (value instanceof File) {\n params.append(key, value.name);\n } else {\n params.append(key, value);\n }\n }\n return params;\n};\n\nconst payloadFromData = (data: RequestData | undefined, natural: FormData | URLSearchParams): {payload: FormData | URLSearchParams | BodyInit | null; explicit: boolean} => {\n if (data === undefined) return {payload: natural, explicit: false};\n if (data instanceof HTMLFormElement) return {payload: new FormData(data), explicit: true};\n if (data instanceof FormData || data instanceof URLSearchParams || typeof data === 'string' || data instanceof Blob || data instanceof ArrayBuffer) {\n return {payload: data, explicit: true};\n }\n const params = new URLSearchParams();\n appendRecord(params, data);\n return {payload: params, explicit: true};\n};\n\nconst mergePayload = (\n payload: FormData | URLSearchParams | BodyInit | null,\n extra: RequestExtra | undefined,\n): FormData | URLSearchParams | BodyInit | null => {\n if (!extra) return payload;\n\n if (payload instanceof FormData || payload instanceof URLSearchParams) {\n appendExtra(payload, extra);\n return payload;\n }\n\n const params = new URLSearchParams();\n if (typeof payload === 'string') params.append('data', payload);\n appendExtra(params, extra);\n return params;\n};\n\nconst naturalPayload = (\n source: RequestSource | undefined,\n submitter: HTMLElement | null,\n): {payload: FormData | URLSearchParams; enctype: string} => {\n if (source instanceof HTMLFormElement) {\n return {\n payload: formPayload(source, submitter),\n enctype: formEnctype(source, submitter),\n };\n }\n return {payload: new URLSearchParams(), enctype: FORM_URL_ENCODED};\n};\n\nconst resolveMethod = (source: RequestSource | undefined, optionMethod: string | undefined, submitter: HTMLElement | null): RequestMethod => {\n if (optionMethod) return normalizeMethod(optionMethod);\n if (source instanceof HTMLFormElement) {\n return normalizeMethod(submitter?.getAttribute('formmethod') || source.getAttribute('method'));\n }\n return 'GET';\n};\n\nconst prepareRequest = (url: string | URL | undefined, options: RequestOptions = {}): PreparedRequest => {\n const source = options.source;\n const submitter = options.submitter ?? null;\n const method = resolveMethod(source, options.method, submitter);\n const resolvedUrl = urlFor(url, source, submitter);\n const natural = naturalPayload(source, submitter);\n const basePayload = payloadFromData(options.data, natural.payload);\n const payload = mergePayload(basePayload.payload, options.extra);\n\n const init: RequestInit = {\n method,\n ...(options.cache ? {cache: options.cache} : {}),\n };\n let body: BodyInit | null = null;\n\n if (METHODS_WITHOUT_BODY.has(method)) {\n if (payload instanceof FormData || payload instanceof URLSearchParams) {\n paramsFrom(payload).forEach((value, key) => resolvedUrl.searchParams.append(key, value));\n } else if (typeof payload === 'string') {\n resolvedUrl.searchParams.append('data', payload);\n }\n } else if (payload instanceof FormData && (basePayload.explicit || natural.enctype === FORM_MULTIPART)) {\n body = payload;\n } else if (payload instanceof FormData) {\n body = paramsFrom(payload);\n } else {\n body = payload;\n }\n\n init.headers = headersWithDefaults(options.headers, body);\n if (body !== null && body !== undefined) init.body = body;\n\n return {url: resolvedUrl, method, init};\n};\n\nconst eventTargetFor = (source: Element | undefined): Element | Document => (\n source?.isConnected ? source : document\n);\n\nconst lifecycleEvent = (\n name: string,\n detail: RequestLifecycleDetail,\n options: {cancelable?: boolean} = {},\n): CustomEvent<RequestLifecycleDetail> => new CustomEvent<RequestLifecycleDetail>(name, {\n bubbles: true,\n composed: true,\n cancelable: options.cancelable ?? false,\n detail,\n});\n\nconst dispatchLifecycle = (name: string, source: Element | undefined, detail: RequestLifecycleDetail, options?: {cancelable?: boolean}): boolean => (\n eventTargetFor(source).dispatchEvent(lifecycleEvent(name, detail, options))\n);\n\nconst pendingCounts = new WeakMap<Element, number>();\n\nconst setPending = (source: Element | undefined): void => {\n if (!source) return;\n const count = pendingCounts.get(source) ?? 0;\n pendingCounts.set(source, count + 1);\n source.setAttribute('aria-busy', 'true');\n source.setAttribute(PENDING_ATTRIBUTE, 'true');\n};\n\nconst clearPending = (source: Element | undefined): void => {\n if (!source) return;\n const nextCount = (pendingCounts.get(source) ?? 1) - 1;\n if (nextCount > 0) {\n pendingCounts.set(source, nextCount);\n return;\n }\n pendingCounts.delete(source);\n source.removeAttribute('aria-busy');\n source.removeAttribute(PENDING_ATTRIBUTE);\n};\n\nconst isSseResponse = (response: Response): boolean => (\n response.headers.get('Content-Type')?.toLowerCase().includes(SSE_CONTENT_TYPE) ?? false\n);\n\nconst handleResponse = async (response: Response): Promise<Omit<RequestResult, 'requestId'>> => {\n const navigate = response.headers.get(NAVIGATE_HEADER);\n if (navigate) {\n const history = response.headers.get(NAVIGATE_HISTORY_HEADER) ?? 'auto';\n if (history !== 'auto' && history !== 'push' && history !== 'replace') {\n warn('x-ui-request: invalid navigation history', history);\n return {response, type: 'other', url: response.url};\n }\n return {response, type: 'navigate', url: response.url, navigation: {history, url: navigate}};\n }\n if (\n response.status === 204\n || response.body === null\n || response.headers.get('X-Trellis-UI-Response') === 'empty'\n ) return {response, type: 'empty', url: response.url};\n\n if (response.redirected && !isSseResponse(response)) {\n window.location.assign(response.url);\n return {response, type: 'redirect', url: response.url};\n }\n\n warn('x-ui-request: expected an empty response', response);\n return {response, type: 'other', url: response.url};\n};\n\ntype ClientStreamReady = {token: string} | null;\nconst streamReadiness = new WeakMap<HTMLElement, Promise<ClientStreamReady>>();\n\nconst streamClientToken = (stream: HTMLElement): string | null => {\n const token = stream.dataset.uiStreamClient;\n const expiresAt = Number(stream.dataset.uiStreamClientExpires);\n if (!token) return null;\n if (Number.isFinite(expiresAt) && expiresAt > 0 && expiresAt <= Date.now()) return null;\n return token;\n};\n\nconst readyClientStream = (): ClientStreamReady => {\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n const token = stream ? streamClientToken(stream) : null;\n if (!stream || !token || stream.dataset.uiStreamState !== 'open') return null;\n return {token};\n};\n\nconst streamTimeout = (stream: HTMLElement): number => {\n const configured = Number(stream.dataset.uiStreamTimeout);\n return Number.isFinite(configured) && configured >= 0 ? configured : 5000;\n};\n\nconst waitForClientStream = (signal: AbortSignal): Promise<ClientStreamReady> => {\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n const token = stream ? streamClientToken(stream) : null;\n if (!stream) return Promise.resolve(null);\n if (token && stream.dataset.uiStreamState === 'open') return Promise.resolve({token});\n if (\n stream.dataset.uiStreamState === 'error'\n || stream.dataset.uiStreamState === 'disconnected'\n || signal.aborted\n ) return Promise.resolve(null);\n\n const existingReadiness = streamReadiness.get(stream);\n const readiness: Promise<ClientStreamReady> = existingReadiness ?? new Promise<ClientStreamReady>((resolve) => {\n const finish = (value: ClientStreamReady): void => {\n window.clearTimeout(timeoutId);\n stream.removeEventListener(CLIENT_STREAM_OPEN_EVENT, onOpen);\n stream.removeEventListener(CLIENT_STREAM_ERROR_EVENT, onError);\n stream.removeEventListener(CLIENT_STREAM_DISCONNECTED_EVENT, onError);\n resolve(value);\n };\n const onOpen = (): void => {\n const currentToken = streamClientToken(stream);\n finish(currentToken ? {token: currentToken} : null);\n };\n const onError = (): void => finish(null);\n const timeoutId = window.setTimeout(onError, streamTimeout(stream));\n\n stream.addEventListener(CLIENT_STREAM_OPEN_EVENT, onOpen, {once: true});\n stream.addEventListener(CLIENT_STREAM_ERROR_EVENT, onError, {once: true});\n stream.addEventListener(CLIENT_STREAM_DISCONNECTED_EVENT, onError, {once: true});\n }).finally(() => {\n streamReadiness.delete(stream);\n });\n if (!existingReadiness) streamReadiness.set(stream, readiness);\n\n return new Promise((resolve) => {\n const onAbort = (): void => resolve(null);\n signal.addEventListener('abort', onAbort, {once: true});\n void readiness.then((result) => {\n signal.removeEventListener('abort', onAbort);\n resolve(result);\n });\n });\n};\n\nconst prepareClientStream = async (signal: AbortSignal): Promise<ClientStreamReady> => {\n const ready = readyClientStream();\n if (ready) return ready;\n\n const stream = document.querySelector<HTMLElement>(CLIENT_STREAM_SELECTOR);\n if (!stream) return null;\n if (!streamClientToken(stream)) {\n stream.dispatchEvent(new CustomEvent(CLIENT_STREAM_REFRESH_EVENT));\n const refreshed = readyClientStream();\n if (refreshed) return refreshed;\n }\n return waitForClientStream(signal);\n};\n\nconst bindExternalAbort = (controller: AbortController, externalSignal: AbortSignal | undefined): BoundAbortSignal => {\n if (!externalSignal) {\n return {\n signal: controller.signal,\n cleanup: () => undefined,\n };\n }\n\n const abort = (): void => controller.abort(externalSignal.reason);\n if (externalSignal.aborted) {\n abort();\n } else {\n externalSignal.addEventListener('abort', abort, {once: true});\n }\n\n return {\n signal: controller.signal,\n cleanup: () => externalSignal.removeEventListener('abort', abort),\n };\n};\n\nconst isAbortError = (error: unknown, signal: AbortSignal): boolean => (\n signal.aborted\n || (error instanceof DOMException && error.name === 'AbortError')\n || (error instanceof Error && error.name === 'AbortError')\n);\n\nconst requestWithAlpine = async (\n AlpineInstance: StreamAlpine,\n url: string | URL | undefined,\n options: RequestOptions = {},\n): Promise<RequestResult> => {\n const source = options.source;\n const controller = new AbortController();\n const requestId = options.requestId ?? crypto.randomUUID();\n const prepared = prepareRequest(url, options);\n const boundAbort = bindExternalAbort(controller, options.signal);\n const signal = boundAbort.signal;\n prepared.init.signal = signal;\n (prepared.init.headers as Headers).set(REQUEST_ID_HEADER, requestId);\n const clientStream = readyClientStream() ?? await prepareClientStream(signal);\n if (signal.aborted) {\n boundAbort.cleanup();\n return {requestId, response: null, type: 'aborted', url: prepared.url.toString()};\n }\n if (!clientStream) {\n boundAbort.cleanup();\n return {requestId, response: null, type: signal.aborted ? 'aborted' : 'unavailable', url: prepared.url.toString()};\n }\n (prepared.init.headers as Headers).set(CLIENT_SESSION_HEADER, clientStream.token);\n\n const detail: RequestLifecycleDetail = {\n source: source ?? document,\n url: prepared.url.toString(),\n method: prepared.method,\n requestInit: prepared.init,\n requestId,\n controller,\n signal,\n };\n\n if (!dispatchLifecycle('ui:request:before', source, detail, {cancelable: true})) {\n boundAbort.cleanup();\n return {requestId, response: null, type: 'cancelled', url: prepared.url.toString()};\n }\n\n setPending(source);\n dispatchLifecycle('ui:request:start', source, detail);\n\n try {\n const response = await fetch(prepared.url.toString(), prepared.init);\n const result = await handleResponse(response);\n detail.response = response;\n detail.responseType = result.type;\n\n if ((response.ok && result.type !== 'other') || result.type === 'redirect') {\n dispatchLifecycle('ui:request:success', source, detail);\n } else {\n dispatchLifecycle('ui:request:error', source, detail);\n }\n\n const requestResult = {...result, requestId};\n if (requestResult.navigation) navigateResponseHandler?.(requestResult);\n return requestResult;\n } catch (error) {\n if (isAbortError(error, signal)) {\n detail.responseType = 'aborted';\n return {requestId, response: null, type: 'aborted', url: prepared.url.toString()};\n }\n\n detail.error = error;\n dispatchLifecycle('ui:request:error', source, detail);\n throw error;\n } finally {\n boundAbort.cleanup();\n clearPending(source);\n dispatchLifecycle('ui:request:finish', source, detail);\n }\n};\n\nconst requireAlpine = (): StreamAlpine => {\n if (!AlpineRuntime) {\n throw new Error('Trellis request runtime has not been registered with Alpine.');\n }\n return AlpineRuntime;\n};\n\nconst request = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n requestWithAlpine(requireAlpine(), url, options)\n);\n\nconst get = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'GET'})\n);\n\nconst post = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'POST'})\n);\n\nconst put = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'PUT'})\n);\n\nconst del = (url: string | URL, options: RequestOptions = {}): Promise<RequestResult> => (\n request(url, {...options, method: 'DELETE'})\n);\n\nconst registerRequestRuntime = (AlpineInstance: Alpine.Alpine | StreamAlpine): void => {\n AlpineRuntime = AlpineInstance as StreamAlpine;\n};\n\nconst setNavigateResponseHandler = (handler: ((result: RequestResult) => boolean) | null): void => {\n navigateResponseHandler = handler;\n};\n\nexport {\n collectDocumentRequestData,\n del,\n evaluateRequestOptions,\n get,\n post,\n put,\n registerRequestRuntime,\n request,\n requestWithAlpine,\n REQUEST_ROOT_SELECTOR,\n setNavigateResponseHandler,\n};\nexport type {NavigationHistory, RequestLifecycleDetail, RequestMethod, RequestOptions, RequestResult};\n","import type Alpine from 'alpinejs';\nimport {\n findAlpineMachineOwner,\n} from '../alpine-machine';\nimport {\n findClosestDomInvalidationOwners,\n type DomInvalidationOwner,\n} from '../dom-invalidation';\nimport {stableIdentity} from '../identity';\nimport {declareMorphAttributes, preserveDeclaredMorphAttributes} from '../morph';\nimport {isRecord, warn} from '../../utils';\nimport {loadAssets, type AssetDescriptor} from '../../assets/bridge';\nimport {\n collectDocumentRequestData,\n requestWithAlpine,\n type RequestLifecycleDetail,\n} from './request';\n\ntype PatchMode = 'morph' | 'outer' | 'replace' | 'update' | 'append' | 'prepend' | 'before' | 'after' | 'remove';\n\ntype StreamPatchPayload = {\n html?: string | null;\n target?: string | null;\n selector?: string | null;\n mode?: PatchMode | null;\n requestId?: string | null;\n viewTransition?: boolean;\n assets?: AssetDescriptor[];\n};\n\ntype StreamEventPayload = {\n event: string;\n detail?: Record<string, unknown>;\n};\n\ntype UiEffectPayload =\n | ({type: 'patch'} & StreamPatchPayload)\n | ({type: 'dispatch'} & StreamEventPayload);\n\ntype SseFrame = {\n event: string;\n data: string;\n};\n\ntype StreamController = {\n abort(reason?: string): void;\n};\n\ntype StreamLifecycle = {\n open?(): void;\n disconnected?(): void;\n reset?(data: string): void;\n error?(data: string): void;\n};\ntype StreamPatchAnimator = (\n AlpineInstance: StreamAlpine,\n patches: StreamPatchPayload[],\n update: () => void,\n) => void;\n\ntype MorphOptions = {\n key?(el: HTMLElement): string | null;\n updating?(\n from: Node,\n to: Node,\n childrenOnly?: () => void,\n skip?: () => void,\n skipChildren?: () => void,\n skipUntil?: (predicate: (node: Node) => boolean) => void,\n ): void;\n updated?(from: Node, to: Node): void;\n};\n\ntype StreamAlpine = Pick<Alpine.Alpine, 'initTree'> & Partial<Pick<Alpine.Alpine, 'findClosest'>> & {\n morph?: (\n target: HTMLElement,\n html: string,\n options?: MorphOptions,\n ) => void;\n};\n\nconst pendingDomInvalidations = new Set<DomInvalidationOwner>();\nlet domInvalidationQueued = false;\nlet effectRequestFilter: ((requestId: string | null) => boolean) | null = null;\nlet morphExclusionFilter: ((requestId: string | null, element: Element) => boolean) | null = null;\nlet streamPatchAnimator: StreamPatchAnimator | null = null;\nlet patchQueue = Promise.resolve();\nlet queuedPatches = 0;\n\nconst queueDomInvalidation = (owners: Iterable<DomInvalidationOwner>): void => {\n for (const owner of owners) pendingDomInvalidations.add(owner);\n if (domInvalidationQueued || pendingDomInvalidations.size === 0) return;\n domInvalidationQueued = true;\n queueMicrotask(() => {\n domInvalidationQueued = false;\n const queued = Array.from(pendingDomInvalidations);\n pendingDomInvalidations.clear();\n queued.forEach((owner) => owner.invalidateDom());\n });\n};\n\nconst parseHtml = (html: string): HTMLTemplateElement => {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template;\n};\n\nconst elementsFromHtml = (html: string): HTMLElement[] => (\n Array.from(parseHtml(html).content.children)\n .filter((child): child is HTMLElement => child instanceof HTMLElement)\n);\n\nconst initInserted = (AlpineInstance: StreamAlpine, elements: HTMLElement[]): void => {\n elements.forEach((element) => AlpineInstance.initTree(element));\n};\n\nconst resolvedMode = (target: Element, payloadMode?: PatchMode | null): PatchMode => {\n if (payloadMode) return payloadMode;\n const merge = target.getAttribute('x-merge');\n if (merge) return merge as PatchMode;\n return 'replace';\n};\n\nconst targetFromPayload = (payload: StreamPatchPayload): Element | null => {\n if (payload.selector) return document.querySelector(payload.selector);\n if (!payload.target) return null;\n\n const id = payload.target.startsWith('#') ? payload.target.slice(1) : payload.target;\n return document.getElementById(id);\n};\n\nconst applyPatchToTarget = (\n AlpineInstance: StreamAlpine,\n target: Element,\n payload: StreamPatchPayload,\n): void => {\n const mode = resolvedMode(target, payload.mode);\n\n if (mode === 'remove') {\n target.remove();\n return;\n }\n\n if (!payload.html) {\n warn('x-ui-stream: received patch with no html');\n return;\n }\n\n if (mode === 'morph' || mode === 'outer') {\n if (typeof AlpineInstance.morph === 'function') {\n const affectedOwners = new Set<DomInvalidationOwner>();\n AlpineInstance.morph(target as HTMLElement, payload.html, {\n key(el: HTMLElement): string | null {\n return stableIdentity(el);\n },\n updating(from: Node, to: Node, _childrenOnly?: () => void, skip?: () => void): void {\n if (\n from instanceof Element\n && morphExclusionFilter?.(payload.requestId ?? null, from)\n ) {\n skip?.();\n return;\n }\n preserveDeclaredMorphAttributes(from, to);\n },\n updated(from: Node): void {\n if (!(from instanceof Element)) return;\n const owner = findAlpineMachineOwner(AlpineInstance as Alpine.Alpine, from);\n if (owner) affectedOwners.add(owner);\n findClosestDomInvalidationOwners(from).forEach((candidate) => {\n affectedOwners.add(candidate);\n });\n },\n });\n queueDomInvalidation(affectedOwners);\n return;\n }\n\n warn('x-ui-stream: morph mode requires an Alpine morph implementation; falling back to replace');\n }\n\n if (mode === 'replace' || mode === 'morph' || mode === 'outer') {\n const [newEl] = elementsFromHtml(payload.html);\n if (!newEl) {\n warn('x-ui-stream: replace mode produced no element');\n return;\n }\n target.replaceWith(newEl);\n AlpineInstance.initTree(newEl);\n return;\n }\n\n if (mode === 'update') {\n const elements = elementsFromHtml(payload.html);\n target.innerHTML = payload.html;\n initInserted(AlpineInstance, Array.from(target.children).filter((child): child is HTMLElement => child instanceof HTMLElement));\n if (elements.length === 0 && payload.html.trim()) AlpineInstance.initTree(target as HTMLElement);\n return;\n }\n\n const template = parseHtml(payload.html);\n const inserted = Array.from(template.content.children)\n .filter((child): child is HTMLElement => child instanceof HTMLElement);\n\n if (mode === 'append') {\n target.append(template.content);\n initInserted(AlpineInstance, inserted);\n return;\n }\n\n if (mode === 'prepend') {\n target.prepend(template.content);\n initInserted(AlpineInstance, inserted);\n return;\n }\n\n if (mode === 'before') {\n target.before(template.content);\n initInserted(AlpineInstance, inserted);\n return;\n }\n\n if (mode === 'after') {\n target.after(template.content);\n initInserted(AlpineInstance, inserted);\n }\n};\n\nconst applyStreamPatchNow = (AlpineInstance: StreamAlpine, payload: StreamPatchPayload): void => {\n const target = targetFromPayload(payload);\n\n if (target) {\n applyPatchToTarget(AlpineInstance, target, payload);\n return;\n }\n\n if (payload.selector || payload.target) {\n warn('x-ui-stream: target not found', payload.selector ?? payload.target);\n return;\n }\n\n if (!payload.html) {\n warn('x-ui-stream: received patch with no html');\n return;\n }\n\n elementsFromHtml(payload.html).forEach((child) => {\n if (!child.id) {\n warn('x-ui-stream: top-level element has no id, skipping', child);\n return;\n }\n\n const inferredTarget = document.getElementById(child.id);\n if (!inferredTarget) return;\n applyPatchToTarget(AlpineInstance, inferredTarget, {...payload, html: child.outerHTML});\n });\n};\n\nconst applyStreamPatches = (AlpineInstance: StreamAlpine, payload: StreamPatchPayload | StreamPatchPayload[]): void => {\n const patches = Array.isArray(payload) ? payload : [payload];\n const apply = (): void => {\n patches.forEach((patch) => applyStreamPatchNow(AlpineInstance, patch));\n };\n\n const applyWithAnimation = (): void => {\n const animatedPatches = patches.filter((patch) => patch.viewTransition === true);\n if (animatedPatches.length === 0) {\n apply();\n return;\n }\n if (streamPatchAnimator) streamPatchAnimator(AlpineInstance, animatedPatches, apply);\n else apply();\n };\n const assets = patches.flatMap((patch) => patch.assets ?? []);\n\n if (assets.length === 0 && queuedPatches === 0) {\n applyWithAnimation();\n return;\n }\n\n queuedPatches += 1;\n const run = async (): Promise<void> => {\n if (assets.length > 0) {\n await loadAssets(assets, AlpineInstance as Alpine.Alpine);\n }\n applyWithAnimation();\n };\n const task = patchQueue.then(run, run);\n patchQueue = task\n .catch(() => undefined)\n .finally(() => {\n queuedPatches -= 1;\n });\n};\n\nconst registerStreamPatchAnimator = (animator: StreamPatchAnimator): void => {\n streamPatchAnimator = animator;\n};\n\nconst applyStreamPatch = (AlpineInstance: StreamAlpine, payload: StreamPatchPayload): void => {\n applyStreamPatchNow(AlpineInstance, payload);\n};\n\nconst dispatchStreamEvent = (payload: StreamEventPayload): void => {\n document.dispatchEvent(new CustomEvent(payload.event, {\n detail: payload.detail ?? {},\n bubbles: true,\n composed: true,\n }));\n};\n\nconst applyUiEffect = (AlpineInstance: StreamAlpine, effect: UiEffectPayload): void => {\n if (effect.type === 'patch') {\n const {type: _type, ...payload} = effect;\n applyStreamPatches(AlpineInstance, payload);\n return;\n }\n\n if (effect.type === 'dispatch') {\n const {type: _type, ...payload} = effect;\n dispatchStreamEvent(payload);\n return;\n }\n\n warn('x-ui-stream: unknown UI effect', effect);\n};\n\nconst applyUiEffects = (AlpineInstance: StreamAlpine, effects: UiEffectPayload | UiEffectPayload[]): void => {\n const events = Array.isArray(effects) ? effects : [effects];\n\n events.forEach((effect) => applyUiEffect(AlpineInstance, effect));\n};\n\nconst commandLines = (frame: SseFrame): Map<string, string[]> | null => {\n const commands = new Map<string, string[]>();\n for (const line of frame.data.split('\\n')) {\n const space = line.indexOf(' ');\n const hasValue = space > 0;\n const key = hasValue ? line.slice(0, space) : line;\n\n if (!hasValue && key !== 'html') {\n warn('x-ui-stream: invalid SSE command line', key);\n return null;\n }\n\n const value = hasValue ? line.slice(space + 1) : '';\n const values = commands.get(key);\n if (values) values.push(value);\n else commands.set(key, [value]);\n }\n\n return commands;\n};\n\nconst scalarCommand = (commands: Map<string, string[]>, key: string): string | undefined => {\n const values = commands.get(key);\n if (!values?.length) return undefined;\n if (values.length > 1) warn('x-ui-stream: duplicate SSE command, using last value', key);\n return values.at(-1);\n};\n\nconst applyPatchFrame = (AlpineInstance: StreamAlpine, frame: SseFrame): void => {\n const commands = commandLines(frame);\n if (!commands || commands.size === 0) return;\n const requestId = scalarCommand(commands, 'request-id');\n if (effectRequestFilter && !effectRequestFilter(requestId ?? null)) return;\n\n let assets: AssetDescriptor[] | undefined;\n const rawAssets = scalarCommand(commands, 'assets');\n if (rawAssets) {\n try {\n const parsed: unknown = JSON.parse(rawAssets);\n if (!Array.isArray(parsed)) throw new TypeError('assets must be an array');\n assets = parsed as AssetDescriptor[];\n } catch {\n warn('x-ui-stream: invalid patch assets JSON', rawAssets);\n return;\n }\n }\n\n const payload: StreamPatchPayload = {\n mode: (scalarCommand(commands, 'mode') ?? 'replace') as PatchMode,\n target: scalarCommand(commands, 'target') ?? null,\n selector: scalarCommand(commands, 'selector') ?? null,\n html: commands.get('html')?.join('\\n') ?? null,\n requestId: requestId ?? null,\n viewTransition: scalarCommand(commands, 'view-transition') === 'true',\n ...(assets ? {assets} : {}),\n };\n\n applyStreamPatches(AlpineInstance, payload);\n};\n\nconst applyDispatchFrame = (frame: SseFrame): void => {\n const commands = commandLines(frame);\n if (!commands) return;\n const requestId = scalarCommand(commands, 'request-id');\n if (effectRequestFilter && !effectRequestFilter(requestId ?? null)) return;\n const event = scalarCommand(commands, 'event');\n if (!event) {\n warn('x-ui-stream: dispatch SSE frame missing event');\n return;\n }\n\n const rawDetail = scalarCommand(commands, 'detail');\n let detail: Record<string, unknown> = {};\n if (rawDetail) {\n try {\n const parsed: unknown = JSON.parse(rawDetail);\n if (isRecord(parsed)) detail = parsed;\n } catch {\n warn('x-ui-stream: invalid dispatch detail JSON', rawDetail);\n return;\n }\n }\n\n dispatchStreamEvent({event, detail});\n};\n\nconst SSE_FRAME_HANDLERS: Record<string, (AlpineInstance: StreamAlpine, frame: SseFrame) => void> = {\n 'trellis-ui-patch': applyPatchFrame,\n 'trellis-ui-dispatch': (_AlpineInstance, frame) => applyDispatchFrame(frame),\n};\n\nconst TRELLIS_SSE_EVENT_PREFIX = 'trellis-ui-';\n\nconst applySseFrame = (AlpineInstance: StreamAlpine, frame: SseFrame): void => {\n const handler = SSE_FRAME_HANDLERS[frame.event];\n if (!handler) {\n if (frame.event.startsWith(TRELLIS_SSE_EVENT_PREFIX)) {\n warn('x-ui-stream: unsupported SSE event', frame.event);\n }\n return;\n }\n handler(AlpineInstance, frame);\n};\n\nconst streamUrl = (url: string, scopes = '', client = ''): string => {\n const parsed = new URL(url, document.baseURI);\n const normalizedScopes = [...new Set(scopes.split(/\\s+/).filter(Boolean))];\n if (client) parsed.searchParams.set('client', client);\n if (normalizedScopes.length > 0) {\n parsed.searchParams.delete('channel');\n normalizedScopes.forEach((scope) => parsed.searchParams.append('channel', scope));\n }\n\n return /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//')\n ? parsed.href\n : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n};\n\nconst connectStream = (\n AlpineInstance: StreamAlpine,\n url: string,\n scopes = '',\n client = '',\n lifecycle: StreamLifecycle = {},\n): StreamController => {\n const source = new EventSource(streamUrl(url, scopes, client));\n let active = true;\n Object.keys(SSE_FRAME_HANDLERS).forEach((eventName) => {\n source.addEventListener(eventName, (event) => {\n if (!active || !(event instanceof MessageEvent)) return;\n applySseFrame(AlpineInstance, {\n event: event.type,\n data: String(event.data),\n });\n });\n });\n source.addEventListener('stream-open', () => {\n if (!active) return;\n lifecycle.open?.();\n });\n source.addEventListener('stream-reset', (event) => {\n if (!active) return;\n lifecycle.reset?.(event instanceof MessageEvent ? String(event.data) : '');\n });\n source.addEventListener('stream-error', (event) => {\n if (!active) return;\n active = false;\n source.close();\n lifecycle.error?.(event instanceof MessageEvent ? String(event.data) : '');\n });\n source.addEventListener('error', () => {\n if (!active) return;\n active = false;\n source.close();\n lifecycle.disconnected?.();\n });\n\n return {\n abort() {\n active = false;\n source.close();\n },\n };\n};\n\ntype StreamControllerKey = Element | string;\n\ntype ManagedStream = {\n configuration: string;\n controller: StreamController | null;\n element: HTMLElement;\n dispose(): void;\n rescheduleRefresh(): void;\n};\n\nconst streamControllers = new Map<StreamControllerKey, ManagedStream>();\nconst pendingStreamReconciliations = new Set<StreamControllerKey>();\n\nconst streamControllerKey = (el: Element): StreamControllerKey => (\n el instanceof HTMLElement && el.id ? el.id : el\n);\n\ntype StreamLifecycleName = 'connecting' | 'open' | 'disconnected' | 'suspended' | 'reset' | 'error';\ntype ClientSessionRefresh = {token: string; expiresAt: number};\n\nconst CLIENT_SESSION_REFRESH_LEAD_MS = 60_000;\nconst STREAM_IDLE_SUSPEND_DELAY_MS = 1_000;\nconst STREAM_MUTATION_DELIVERY_TAIL_MS = 2_000;\nconst STREAM_RETRY_BASE_MS = 1_000;\nconst STREAM_RETRY_MAX_MS = 30_000;\n\nconst dispatchStreamLifecycle = (\n el: HTMLElement,\n name: StreamLifecycleName,\n detail: Record<string, unknown> = {},\n): void => {\n if (name !== 'reset') el.dataset.uiStreamState = name;\n el.dispatchEvent(new CustomEvent(`ui:stream:${name}`, {\n bubbles: true,\n composed: true,\n detail: {source: el, ...detail},\n }));\n};\n\nconst configuredStreamUrl = (el: HTMLElement, expression: string): string => (\n streamUrl(expression, el.dataset.uiStreamScopes, el.dataset.uiStreamClient)\n);\n\nconst streamOpenWhenHidden = (el: HTMLElement): boolean => (\n el.dataset.uiStreamOpenWhenHidden === 'true'\n);\n\nconst configuredStream = (el: HTMLElement, expression: string): string => (\n JSON.stringify({\n openWhenHidden: streamOpenWhenHidden(el),\n url: configuredStreamUrl(el, expression),\n })\n);\n\nconst hasNamedStreamScopes = (el: HTMLElement): boolean => (\n Boolean(el.dataset.uiStreamScopes?.trim())\n);\n\nconst requestLifecycleDetail = (event: Event): RequestLifecycleDetail | null => {\n if (!(event instanceof CustomEvent)) return null;\n const detail = event.detail as Partial<RequestLifecycleDetail> | null;\n if (\n !detail\n || typeof detail.requestId !== 'string'\n || typeof detail.method !== 'string'\n || !(detail.controller instanceof AbortController)\n ) return null;\n return detail as RequestLifecycleDetail;\n};\n\nconst createManagedStream = (\n AlpineInstance: Alpine.Alpine,\n el: HTMLElement,\n expression: string,\n): ManagedStream => {\n let configuration = configuredStream(el, expression);\n let controller: StreamController | null = null;\n let refreshTimer: number | undefined;\n let refreshPromise: Promise<string | null> | null = null;\n let reconnectTimer: number | undefined;\n let suspendTimer: number | undefined;\n let connectedOnce = false;\n let connectionGeneration = 0;\n let reconnectAttempts = 0;\n let terminal = false;\n let disposed = false;\n const activeGets = new Map<string, AbortController>();\n const activeMutations = new Set<string>();\n const openWhenHidden = streamOpenWhenHidden(el);\n\n const shouldBeConnected = (): boolean => (\n !terminal && (openWhenHidden || document.visibilityState === 'visible')\n );\n\n const clearReconnectTimer = (): void => {\n window.clearTimeout(reconnectTimer);\n reconnectTimer = undefined;\n };\n\n const dispatchResumed = (): void => {\n el.dispatchEvent(new CustomEvent('ui:stream:resumed', {\n bubbles: true,\n composed: true,\n }));\n };\n\n const finishResume = async (generation: number): Promise<void> => {\n if (hasNamedStreamScopes(el)) {\n await requestWithAlpine(\n AlpineInstance,\n window.location.href,\n {\n method: 'GET',\n cache: 'no-store',\n data: collectDocumentRequestData(AlpineInstance),\n },\n ).catch((error: unknown) => {\n warn('x-ui-stream: could not revalidate resumed document', error);\n return null;\n });\n }\n\n if (\n disposed\n || generation !== connectionGeneration\n || el.dataset.uiStreamState !== 'open'\n ) return;\n dispatchResumed();\n };\n\n const connect = (token: string): void => {\n controller?.abort();\n clearReconnectTimer();\n const generation = ++connectionGeneration;\n configuration = configuredStream(el, expression);\n dispatchStreamLifecycle(el, 'connecting');\n controller = connectStream(\n AlpineInstance,\n expression,\n el.dataset.uiStreamScopes,\n token,\n {\n open: () => {\n if (generation !== connectionGeneration) return;\n const resumed = connectedOnce;\n connectedOnce = true;\n reconnectAttempts = 0;\n dispatchStreamLifecycle(el, 'open');\n if (resumed) void finishResume(generation);\n },\n disconnected: () => {\n if (generation !== connectionGeneration || disposed) return;\n controller = null;\n managed.controller = null;\n dispatchStreamLifecycle(el, 'disconnected');\n if (!shouldBeConnected()) return;\n const ceiling = Math.min(\n STREAM_RETRY_BASE_MS * (2 ** reconnectAttempts),\n STREAM_RETRY_MAX_MS,\n );\n reconnectAttempts += 1;\n const delay = Math.floor(Math.random() * ceiling);\n reconnectTimer = window.setTimeout(() => {\n reconnectTimer = undefined;\n void ensureConnected();\n }, delay);\n },\n reset: (data) => dispatchStreamLifecycle(el, 'reset', {data}),\n error: (data) => {\n if (generation !== connectionGeneration || disposed) return;\n terminal = true;\n controller = null;\n managed.controller = null;\n clearReconnectTimer();\n dispatchStreamLifecycle(el, 'error', {data});\n },\n },\n );\n managed.controller = controller;\n managed.configuration = configuration;\n scheduleRefresh();\n };\n\n const scheduleRefresh = (): void => {\n window.clearTimeout(refreshTimer);\n refreshTimer = undefined;\n if (!shouldBeConnected()) return;\n const expiresAt = Number(el.dataset.uiStreamClientExpires);\n if (!Number.isFinite(expiresAt) || expiresAt <= 0) return;\n const delay = expiresAt - Date.now() - CLIENT_SESSION_REFRESH_LEAD_MS;\n if (delay <= 0) {\n void rotateCapability();\n return;\n }\n refreshTimer = window.setTimeout(() => void rotateCapability(), delay);\n };\n\n const refreshCapability = (): Promise<string | null> => {\n if (disposed) return Promise.resolve(null);\n if (refreshPromise) return refreshPromise;\n const refreshUrl = el.dataset.uiStreamClientRefresh;\n if (!refreshUrl) {\n dispatchStreamLifecycle(el, 'error', {reason: 'missing-refresh-url'});\n return Promise.resolve(null);\n }\n\n refreshPromise = fetch(refreshUrl, {\n headers: {\n Accept: 'application/json',\n 'X-Trellis-Client': el.dataset.uiStreamClient ?? '',\n },\n }).then(async (response) => {\n if (!response.ok) throw new Error(`ClientSession refresh failed (${response.status})`);\n const payload = await response.json() as Partial<ClientSessionRefresh>;\n if (typeof payload.token !== 'string' || typeof payload.expiresAt !== 'number') {\n throw new Error('ClientSession refresh returned an invalid payload');\n }\n if (disposed) return null;\n el.dataset.uiStreamClient = payload.token;\n el.dataset.uiStreamClientExpires = String(payload.expiresAt);\n return payload.token;\n }).catch((error: unknown) => {\n warn('x-ui-stream: could not refresh ClientSession', error);\n const expiresAt = Number(el.dataset.uiStreamClientExpires);\n if (!Number.isFinite(expiresAt) || expiresAt <= Date.now()) {\n dispatchStreamLifecycle(el, 'error', {error});\n return null;\n }\n if (shouldBeConnected()) {\n refreshTimer = window.setTimeout(() => void rotateCapability(), 5000);\n }\n return el.dataset.uiStreamClient ?? null;\n }).finally(() => {\n refreshPromise = null;\n });\n return refreshPromise;\n };\n\n const rotateCapability = async (): Promise<void> => {\n if (!shouldBeConnected()) return;\n const token = await refreshCapability();\n if (token && shouldBeConnected() && !disposed) connect(token);\n };\n\n const ensureConnected = async (): Promise<void> => {\n if (disposed || !shouldBeConnected() || controller) return;\n const expiresAt = Number(el.dataset.uiStreamClientExpires);\n const currentToken = el.dataset.uiStreamClient ?? '';\n const needsRefresh = Number.isFinite(expiresAt)\n && expiresAt > 0\n && expiresAt - Date.now() <= CLIENT_SESSION_REFRESH_LEAD_MS;\n const token = needsRefresh\n ? await refreshCapability()\n : currentToken;\n if (token && shouldBeConnected() && !disposed && !controller) connect(token);\n };\n\n const suspend = (): void => {\n suspendTimer = undefined;\n if (disposed || openWhenHidden || document.visibilityState !== 'hidden') return;\n if (activeMutations.size > 0) return;\n activeGets.forEach((requestController) => requestController.abort('Document suspended'));\n activeGets.clear();\n window.clearTimeout(refreshTimer);\n refreshTimer = undefined;\n clearReconnectTimer();\n controller?.abort();\n controller = null;\n dispatchStreamLifecycle(el, 'suspended');\n managed.controller = null;\n };\n\n const scheduleSuspend = (delay: number): void => {\n window.clearTimeout(suspendTimer);\n suspendTimer = undefined;\n if (openWhenHidden || document.visibilityState !== 'hidden') return;\n suspendTimer = window.setTimeout(suspend, delay);\n };\n\n const onRefresh = (): void => {\n if (terminal) return;\n void rotateCapability();\n };\n\n const onRequestStart = (event: Event): void => {\n const detail = requestLifecycleDetail(event);\n if (!detail) return;\n if (detail.method === 'GET') {\n activeGets.set(detail.requestId, detail.controller);\n return;\n }\n activeMutations.add(detail.requestId);\n if (document.visibilityState === 'hidden' && !openWhenHidden) {\n window.clearTimeout(suspendTimer);\n suspendTimer = undefined;\n }\n };\n\n const onRequestFinish = (event: Event): void => {\n const detail = requestLifecycleDetail(event);\n if (!detail) return;\n if (detail.method === 'GET') {\n activeGets.delete(detail.requestId);\n return;\n }\n activeMutations.delete(detail.requestId);\n if (document.visibilityState === 'hidden' && !openWhenHidden) {\n if (activeMutations.size === 0) {\n scheduleSuspend(STREAM_MUTATION_DELIVERY_TAIL_MS);\n }\n }\n };\n\n const onVisibilityChange = (): void => {\n if (openWhenHidden || terminal) return;\n if (document.visibilityState === 'hidden') {\n if (activeMutations.size > 0) {\n return;\n }\n scheduleSuspend(STREAM_IDLE_SUSPEND_DELAY_MS);\n return;\n }\n window.clearTimeout(suspendTimer);\n suspendTimer = undefined;\n if (!controller) void ensureConnected();\n };\n\n const managed: ManagedStream = {\n configuration,\n controller: null,\n element: el,\n dispose(): void {\n if (disposed) return;\n disposed = true;\n window.clearTimeout(refreshTimer);\n window.clearTimeout(suspendTimer);\n clearReconnectTimer();\n el.removeEventListener('ui:stream:refresh', onRefresh);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n document.removeEventListener('ui:request:start', onRequestStart);\n document.removeEventListener('ui:request:finish', onRequestFinish);\n controller?.abort();\n },\n rescheduleRefresh: scheduleRefresh,\n };\n\n declareMorphAttributes(el, 'data-ui-stream-state');\n el.addEventListener('ui:stream:refresh', onRefresh);\n document.addEventListener('visibilitychange', onVisibilityChange);\n document.addEventListener('ui:request:start', onRequestStart);\n document.addEventListener('ui:request:finish', onRequestFinish);\n if (shouldBeConnected()) {\n void ensureConnected();\n } else {\n dispatchStreamLifecycle(el, 'suspended');\n }\n return managed;\n};\n\nconst registerStream = (AlpineInstance: Alpine.Alpine): void => {\n if (typeof AlpineInstance.directive !== 'function') return;\n\n AlpineInstance.directive('ui-stream', (el, {expression}, {cleanup}) => {\n if (!expression) return;\n\n const client = el instanceof HTMLElement ? el.dataset.uiStreamClient : '';\n if (!(el instanceof HTMLElement) || !client) {\n warn('x-ui-stream: missing signed ClientSession capability');\n return;\n }\n const key = streamControllerKey(el);\n const existing = streamControllers.get(key);\n const configuration = configuredStream(el, expression);\n if (existing?.configuration === configuration) {\n el.dataset.uiStreamState = existing.element.dataset.uiStreamState ?? 'connecting';\n declareMorphAttributes(el, 'data-ui-stream-state');\n queueMicrotask(() => existing.rescheduleRefresh());\n return;\n }\n\n if (!el.isConnected && typeof key === 'string') {\n if (!pendingStreamReconciliations.has(key)) {\n pendingStreamReconciliations.add(key);\n queueMicrotask(() => {\n pendingStreamReconciliations.delete(key);\n const live = document.getElementById(key);\n if (!live) return;\n const current = streamControllers.get(key);\n const liveConfiguration = configuredStream(live, expression);\n if (current?.configuration === liveConfiguration) {\n current.rescheduleRefresh();\n return;\n }\n current?.dispose();\n streamControllers.set(key, createManagedStream(AlpineInstance, live, expression));\n });\n }\n return;\n }\n\n existing?.dispose();\n streamControllers.set(key, createManagedStream(AlpineInstance, el, expression));\n\n cleanup(() => {\n const current = streamControllers.get(key);\n if (current?.element !== el) return;\n current.dispose();\n streamControllers.delete(key);\n });\n });\n};\n\nconst setEffectRequestFilter = (filter: ((requestId: string | null) => boolean) | null): void => {\n effectRequestFilter = filter;\n};\n\nconst setMorphExclusionFilter = (\n filter: ((requestId: string | null, element: Element) => boolean) | null,\n): void => {\n morphExclusionFilter = filter;\n};\n\nexport {\n applyUiEffect,\n applyUiEffects,\n applyStreamPatch,\n applyStreamPatchNow,\n applyStreamPatches,\n applySseFrame,\n connectStream,\n dispatchStreamEvent,\n registerStream,\n registerStreamPatchAnimator,\n setEffectRequestFilter,\n setMorphExclusionFilter,\n streamUrl,\n};\nexport type {\n PatchMode,\n SseFrame,\n StreamAlpine,\n StreamEventPayload,\n StreamPatchAnimator,\n StreamPatchPayload,\n UiEffectPayload,\n};\n","import type Alpine from 'alpinejs';\nimport {\n requestWithAlpine,\n setNavigateResponseHandler,\n type NavigationHistory,\n type RequestOptions,\n type RequestResult,\n} from './request';\nimport {\n setEffectRequestFilter,\n setMorphExclusionFilter,\n type StreamAlpine,\n} from './stream';\nimport {isRecord, warn} from '../../utils';\n\ntype ScrollPosition = {x: number; y: number};\ntype NavigationOptions = RequestOptions & {history?: NavigationHistory};\ntype ScrollState = {\n containers: Record<string, ScrollPosition>;\n window: ScrollPosition;\n};\ntype NavigateHistoryState = {\n id: string;\n index: number;\n scroll: ScrollState;\n url: string;\n};\ntype TrellisHistoryState = {\n navigate: NavigateHistoryState;\n};\ntype NavigationDetail = {\n history: boolean;\n source: Element | Document;\n url: URL;\n};\ntype NavigationSession = {\n controller: AbortController;\n destination: URL;\n entryId: string | null;\n history: boolean;\n disposition: NavigationHistory;\n requestId: string;\n requestOptions?: RequestOptions;\n source?: Element;\n};\n\nconst HISTORY_NAMESPACE = '__trellis';\nconst SCROLL_CONTAINER_SELECTOR = '[data-ui-scroll-restoration]';\nconst COMPLETED_SESSION_LIMIT = 20;\nconst CANCELLED_REQUEST_LIMIT = 100;\n\nlet registered = false;\nlet activeSession: NavigationSession | null = null;\nlet currentIndex = 0;\nlet ignoreNextPopstate = false;\nlet scrollSaveFrame: number | null = null;\nconst scrollSnapshots = new Map<string, ScrollState>();\nconst cancelledRequestIds = new Set<string>();\nconst completedSessions = new Map<string, NavigationSession>();\n\nconst navigationId = (): string => crypto.randomUUID();\n\nconst emptyScrollState = (): ScrollState => ({\n containers: {},\n window: {x: 0, y: 0},\n});\n\nconst scrollContainerKey = (element: Element): string | null => {\n const declared = element.getAttribute('data-ui-scroll-restoration')?.trim();\n if (declared) return declared;\n return element.id || null;\n};\n\nconst captureScroll = (): ScrollState => {\n const containers: Record<string, ScrollPosition> = {};\n document.querySelectorAll<HTMLElement>(SCROLL_CONTAINER_SELECTOR).forEach((element) => {\n const key = scrollContainerKey(element);\n if (!key) return;\n containers[key] = {x: element.scrollLeft, y: element.scrollTop};\n });\n return {\n containers,\n window: {x: window.scrollX, y: window.scrollY},\n };\n};\n\nconst navigateStateFrom = (state: unknown): NavigateHistoryState | null => {\n if (!isRecord(state)) return null;\n const trellis = state[HISTORY_NAMESPACE];\n if (!isRecord(trellis)) return null;\n const navigate = trellis.navigate;\n if (!isRecord(navigate)) return null;\n if (\n typeof navigate.id !== 'string'\n || typeof navigate.index !== 'number'\n || typeof navigate.url !== 'string'\n || !isRecord(navigate.scroll)\n ) return null;\n return navigate as NavigateHistoryState;\n};\n\nconst mergedHistoryState = (navigate: NavigateHistoryState): Record<string, unknown> => {\n const state = isRecord(window.history.state) ? window.history.state : {};\n const namespace = isRecord(state[HISTORY_NAMESPACE])\n ? state[HISTORY_NAMESPACE] as Record<string, unknown>\n : {};\n return {\n ...state,\n [HISTORY_NAMESPACE]: {\n ...namespace,\n navigate,\n } satisfies TrellisHistoryState,\n };\n};\n\nconst replaceEntry = (navigate: NavigateHistoryState, url: string | URL = navigate.url): void => {\n window.history.replaceState(mergedHistoryState(navigate), '', url);\n};\n\nconst saveCurrentScroll = (): void => {\n const navigate = navigateStateFrom(window.history.state);\n if (!navigate) return;\n const scroll = captureScroll();\n scrollSnapshots.set(navigate.id, scroll);\n replaceEntry({...navigate, scroll});\n};\n\nconst flushCurrentScroll = (): void => {\n if (scrollSaveFrame !== null) {\n cancelAnimationFrame(scrollSaveFrame);\n scrollSaveFrame = null;\n }\n saveCurrentScroll();\n};\n\nconst scheduleCurrentScroll = (): void => {\n const navigate = navigateStateFrom(window.history.state);\n if (!navigate) return;\n scrollSnapshots.set(navigate.id, captureScroll());\n if (scrollSaveFrame !== null) return;\n scrollSaveFrame = requestAnimationFrame(() => {\n scrollSaveFrame = null;\n const current = navigateStateFrom(window.history.state);\n if (!current) return;\n const scroll = scrollSnapshots.get(current.id);\n if (scroll) replaceEntry({...current, scroll});\n });\n};\n\nconst restoreScroll = (scroll: ScrollState): void => {\n requestAnimationFrame(() => {\n window.scrollTo({left: scroll.window.x, top: scroll.window.y, behavior: 'instant'});\n document.querySelectorAll<HTMLElement>(SCROLL_CONTAINER_SELECTOR).forEach((element) => {\n const key = scrollContainerKey(element);\n const position = key ? scroll.containers[key] : undefined;\n element.scrollTo({\n left: position?.x ?? 0,\n top: position?.y ?? 0,\n behavior: 'instant',\n });\n });\n });\n};\n\nconst dispatchNavigation = (\n name: string,\n session: Pick<NavigationSession, 'destination' | 'history' | 'source'>,\n cancelable = false,\n): boolean => {\n const source = session.source?.isConnected ? session.source : document;\n return source.dispatchEvent(new CustomEvent<NavigationDetail>(name, {\n bubbles: true,\n cancelable,\n composed: true,\n detail: {\n history: session.history,\n source,\n url: session.destination,\n },\n }));\n};\n\nconst rememberCompleted = (session: NavigationSession): void => {\n completedSessions.set(session.requestId, session);\n while (completedSessions.size > COMPLETED_SESSION_LIMIT) {\n const oldest = completedSessions.keys().next().value as string | undefined;\n if (!oldest) break;\n completedSessions.delete(oldest);\n }\n};\n\nconst rejectRequestId = (requestId: string): void => {\n cancelledRequestIds.add(requestId);\n while (cancelledRequestIds.size > CANCELLED_REQUEST_LIMIT) {\n const oldest = cancelledRequestIds.values().next().value as string | undefined;\n if (!oldest) break;\n cancelledRequestIds.delete(oldest);\n }\n};\n\nconst cancelActive = (): void => {\n if (!activeSession) return;\n rejectRequestId(activeSession.requestId);\n activeSession.controller.abort('Superseded by a newer Trellis navigation');\n activeSession = null;\n};\n\nconst supersedePriorNavigations = (): void => {\n cancelActive();\n completedSessions.forEach((session) => rejectRequestId(session.requestId));\n completedSessions.clear();\n};\n\nconst nativeNavigate = (url: URL): void => {\n window.location.assign(url.href);\n};\n\nconst internalUrl = (value: string): URL | null => {\n const url = new URL(value, document.baseURI);\n return url.origin === window.location.origin ? url : null;\n};\n\nconst pushDestination = (session: NavigationSession): NavigateHistoryState => {\n flushCurrentScroll();\n const navigate: NavigateHistoryState = {\n id: navigationId(),\n index: currentIndex + 1,\n scroll: emptyScrollState(),\n url: session.destination.href,\n };\n currentIndex = navigate.index;\n window.history.pushState(mergedHistoryState(navigate), '', session.destination);\n session.entryId = navigate.id;\n return navigate;\n};\n\nconst replaceDestination = (session: NavigationSession): NavigateHistoryState => {\n const navigate: NavigateHistoryState = {\n id: navigationId(),\n index: currentIndex,\n scroll: emptyScrollState(),\n url: session.destination.href,\n };\n replaceEntry(navigate, session.destination);\n session.entryId = navigate.id;\n return navigate;\n};\n\nconst commitsWithReplace = (session: NavigationSession): boolean => {\n if (session.disposition === 'replace') return true;\n if (session.disposition === 'push') return false;\n const current = new URL(window.location.href);\n return current.origin === session.destination.origin && current.pathname === session.destination.pathname;\n};\n\nconst fallbackFor = (session: NavigationSession, result?: RequestResult): void => {\n if (\n result?.type === 'aborted'\n || result?.type === 'cancelled'\n || result?.type === 'redirect'\n ) return;\n nativeNavigate(session.destination);\n};\n\nconst finishSession = (\n session: NavigationSession,\n result: RequestResult,\n restoredState?: NavigateHistoryState,\n): void => {\n if (cancelledRequestIds.has(session.requestId)) return;\n if (result.type !== 'empty') {\n fallbackFor(session, result);\n return;\n }\n\n const destinationState = restoredState ?? (\n commitsWithReplace(session) ? replaceDestination(session) : pushDestination(session)\n );\n if (restoredState && session.destination.href !== restoredState.url) {\n const redirected = {...restoredState, url: session.destination.href};\n replaceEntry(redirected, session.destination);\n session.entryId = redirected.id;\n }\n restoreScroll(destinationState.scroll);\n dispatchNavigation('ui:navigated', session);\n};\n\nconst performNavigation = (\n AlpineInstance: StreamAlpine,\n destination: URL,\n options: {\n history: boolean;\n disposition?: NavigationHistory;\n preflight?: boolean;\n requestOptions?: RequestOptions;\n source?: Element;\n restoredState?: NavigateHistoryState;\n },\n): Promise<void> => {\n const session: NavigationSession = {\n controller: new AbortController(),\n destination,\n entryId: options.restoredState?.id ?? null,\n history: options.history,\n disposition: options.disposition ?? 'auto',\n requestId: navigationId(),\n ...(options.requestOptions ? {requestOptions: options.requestOptions} : {}),\n ...(options.source ? {source: options.source} : {}),\n };\n\n if (options.preflight !== false && !dispatchNavigation('ui:navigate', session, true)) return Promise.resolve();\n supersedePriorNavigations();\n activeSession = session;\n dispatchNavigation('ui:navigating', session);\n\n const headers = new Headers(session.requestOptions?.headers);\n headers.set('X-Trellis-Navigation', session.history ? 'restore' : 'navigate');\n let initialRequest = true;\n const requestDestination = async (): Promise<RequestResult> => {\n const requestOptions = initialRequest ? session.requestOptions : undefined;\n const source = initialRequest ? session.source : undefined;\n initialRequest = false;\n const result = await requestWithAlpine(AlpineInstance, session.destination, {\n ...requestOptions,\n headers,\n method: 'GET',\n requestId: session.requestId,\n signal: session.controller.signal,\n ...(source ? {source} : {}),\n });\n session.destination = new URL(result.url, document.baseURI);\n if (!result.navigation) return result;\n\n const redirected = internalUrl(result.navigation.url);\n if (!redirected) {\n nativeNavigate(new URL(result.navigation.url, document.baseURI));\n return {...result, type: 'redirect'};\n }\n session.destination = redirected;\n if (result.navigation.history !== 'auto') session.disposition = result.navigation.history;\n return requestDestination();\n };\n\n return requestDestination().then((result) => {\n if (activeSession?.requestId !== session.requestId && !completedSessions.has(session.requestId)) return;\n finishSession(session, result, options.restoredState);\n }).catch((error: unknown) => {\n if (!session.controller.signal.aborted) {\n warn('x-ui-request.navigate: restoration failed', error);\n fallbackFor(session);\n }\n }).finally(() => {\n if (activeSession?.requestId === session.requestId) activeSession = null;\n if (!cancelledRequestIds.has(session.requestId)) rememberCompleted(session);\n });\n};\n\nconst initializeHistory = (): void => {\n const existing = navigateStateFrom(window.history.state);\n if (existing) {\n currentIndex = existing.index;\n } else {\n const navigate: NavigateHistoryState = {\n id: navigationId(),\n index: 0,\n scroll: captureScroll(),\n url: window.location.href,\n };\n replaceEntry(navigate);\n }\n if ('scrollRestoration' in window.history) window.history.scrollRestoration = 'manual';\n};\n\nconst registerNavigationRuntime = (AlpineInstance: Alpine.Alpine | StreamAlpine): void => {\n if (registered) return;\n registered = true;\n initializeHistory();\n setEffectRequestFilter((requestId) => !requestId || !cancelledRequestIds.has(requestId));\n setMorphExclusionFilter((requestId, element) => (\n element.matches('[data-ui-stream]')\n && Boolean(\n requestId\n && (\n activeSession?.requestId === requestId\n || completedSessions.has(requestId)\n )\n )\n ));\n setNavigateResponseHandler((result) => {\n if (!result.navigation) return false;\n if (cancelledRequestIds.has(result.requestId)) return true;\n if (activeSession?.requestId === result.requestId) return true;\n const destination = internalUrl(result.navigation.url);\n if (!destination) {\n nativeNavigate(new URL(result.navigation.url, document.baseURI));\n return true;\n }\n performNavigation(AlpineInstance as StreamAlpine, destination, {\n history: false,\n disposition: result.navigation.history,\n });\n return true;\n });\n\n window.addEventListener('scroll', scheduleCurrentScroll, {passive: true});\n document.addEventListener('scroll', scheduleCurrentScroll, {capture: true, passive: true});\n window.addEventListener('pagehide', flushCurrentScroll);\n window.addEventListener('popstate', (event) => {\n if (ignoreNextPopstate) {\n ignoreNextPopstate = false;\n return;\n }\n const restoredState = navigateStateFrom(event.state);\n if (!restoredState) {\n nativeNavigate(new URL(window.location.href));\n return;\n }\n const restoredScroll = scrollSnapshots.get(restoredState.id);\n const effectiveState = restoredScroll\n ? {...restoredState, scroll: restoredScroll}\n : restoredState;\n const destination = internalUrl(restoredState.url);\n if (!destination || destination.href !== window.location.href) {\n nativeNavigate(new URL(window.location.href));\n return;\n }\n\n const previousIndex = currentIndex;\n currentIndex = restoredState.index;\n const probe: NavigationSession = {\n controller: new AbortController(),\n destination,\n entryId: restoredState.id,\n history: true,\n disposition: 'replace',\n requestId: navigationId(),\n };\n if (!dispatchNavigation('ui:navigate', probe, true)) {\n ignoreNextPopstate = true;\n window.history.go(previousIndex - restoredState.index);\n currentIndex = previousIndex;\n return;\n }\n performNavigation(AlpineInstance as StreamAlpine, destination, {\n history: true,\n preflight: false,\n restoredState: effectiveState,\n });\n });\n};\n\nconst navigateWithAlpine = (\n AlpineInstance: Alpine.Alpine | StreamAlpine,\n url: string | URL,\n source?: Element,\n options?: NavigationOptions,\n): Promise<void> => {\n const {history = 'auto', ...requestOptions} = options ?? {};\n return performNavigation(AlpineInstance as StreamAlpine, new URL(url, document.baseURI), {\n history: false,\n disposition: history,\n requestOptions,\n ...(source ? {source} : {}),\n });\n};\n\nexport {\n HISTORY_NAMESPACE,\n SCROLL_CONTAINER_SELECTOR,\n navigateWithAlpine,\n registerNavigationRuntime,\n};\nexport type {NavigationOptions};\n","import type Alpine from 'alpinejs';\nimport type {motion} from '../motion';\nimport {\n del as requestDelete,\n get as requestGet,\n post as requestPost,\n put as requestPut,\n type NavigationHistory,\n type RequestOptions,\n type RequestResult,\n} from './engine/request';\nimport {navigateWithAlpine} from './engine/navigation';\nimport type {sortable, UiSortableService} from './drag-and-drop/sortable';\nimport {warn} from '../utils';\n\ntype UiState = {\n activeRequests: number;\n};\n\ntype UiRequestOptions = RequestOptions & {\n navigate?: boolean;\n};\ntype UiGetOptions = UiRequestOptions & {\n history?: NavigationHistory;\n};\ntype UiGet = (url: string | URL, options?: UiGetOptions) => Promise<RequestResult | void>;\ntype UiMutation = (url: string | URL, options?: UiRequestOptions) => Promise<RequestResult>;\n\ntype UiRuntime = {\n readonly delete: UiMutation;\n readonly get: UiGet;\n readonly post: UiMutation;\n readonly put: UiMutation;\n readonly isFetching: boolean;\n readonly motion: typeof motion;\n readonly sortable: UiSortableService;\n};\ntype UiCapabilities = {\n motion?: typeof motion;\n sortable?: typeof sortable;\n};\n\nlet state: UiState = {activeRequests: 0};\nlet reactive = false;\nlet listening = false;\nlet capabilities: UiCapabilities = {};\nlet AlpineRuntime: Alpine.Alpine | null = null;\n\nconst get: UiGet = (url, options = {}) => {\n const {history, navigate = false, ...requestOptions} = options;\n if (!navigate) return requestGet(url, requestOptions);\n if (!AlpineRuntime) throw new Error('Trellis UI runtime has not been registered with Alpine.');\n const {source, ...navigationOptions} = requestOptions;\n\n return navigateWithAlpine(AlpineRuntime, url, source, {\n ...navigationOptions,\n ...(history ? {history} : {}),\n });\n};\n\nconst mutationMethod = (\n name: 'delete' | 'post' | 'put',\n request: (url: string | URL, options?: RequestOptions) => Promise<RequestResult>,\n): UiMutation => (url, options = {}) => {\n const {navigate = false, ...requestOptions} = options;\n if (navigate) warn(`$ui.${name}: navigate is only supported for GET requests`);\n return request(url, requestOptions);\n};\n\nconst post = mutationMethod('post', requestPost);\nconst put = mutationMethod('put', requestPut);\nconst del = mutationMethod('delete', requestDelete);\n\nconst ui: UiRuntime = {\n get,\n post,\n put,\n delete: del,\n get motion(): typeof motion {\n if (!capabilities.motion) throw new Error('Trellis Motion capability is not registered.');\n return capabilities.motion;\n },\n get sortable(): UiSortableService {\n if (!capabilities.sortable) throw new Error('Trellis Sortable capability is not registered.');\n return capabilities.sortable;\n },\n get isFetching(): boolean {\n return state.activeRequests > 0;\n },\n};\n\nconst registerRequestState = (): void => {\n if (listening) return;\n listening = true;\n\n document.addEventListener('ui:request:start', () => {\n state.activeRequests += 1;\n });\n document.addEventListener('ui:request:finish', () => {\n state.activeRequests = Math.max(0, state.activeRequests - 1);\n });\n};\n\nconst registerUiMagic = (AlpineInstance: Alpine.Alpine): void => {\n AlpineRuntime = AlpineInstance;\n if (!reactive) {\n state = AlpineInstance.reactive(state);\n reactive = true;\n }\n registerRequestState();\n AlpineInstance.magic('ui', () => ui);\n};\nconst registerUiMotion = (value: typeof motion): void => {\n capabilities.motion = value;\n};\nconst registerUiSortable = (value: typeof sortable): void => {\n capabilities.sortable = value;\n};\n\nexport {registerUiMagic, registerUiMotion, registerUiSortable, ui};\nexport type {UiCapabilities, UiGetOptions, UiRequestOptions, UiRuntime};\n"],"mappings":"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"}
|