UNPKG

@zeix/ui-element

Version:

UIElement - a HTML-first library for reactive Web Components

4 lines (2 loc) 14.2 kB
var G=($)=>typeof $==="function",v=($,Z)=>Object.prototype.toString.call($)===`[object ${Z}]`,p=($)=>$ instanceof Error?$:Error(String($));class k extends Error{constructor($){super(`Circular dependency in ${$} detected`);return this}}var R,c=new Set,r=0,a=new Map,u,X4=()=>{u=void 0;let $=Array.from(a.values());a.clear();for(let Z of $)Z()},C4=()=>{if(u)cancelAnimationFrame(u);u=requestAnimationFrame(X4)};queueMicrotask(X4);var h=($)=>{let Z=new Set,B=$;return B.off=(J)=>{Z.add(J)},B.cleanup=()=>{for(let J of Z)J();Z.clear()},B},_=($)=>{if(R&&!$.has(R)){let Z=R;$.add(Z),R.off(()=>{$.delete(Z)})}},x=($)=>{for(let Z of $)if(r)c.add(Z);else Z()},i=()=>{while(c.size){let $=Array.from(c);c.clear();for(let Z of $)Z()}},Y4=($)=>{r++;try{$()}finally{i(),r--}},m=($,Z)=>{let B=R;R=Z;try{$()}finally{R=B}},w=($,Z)=>new Promise((B,J)=>{a.set(Z||Symbol(),()=>{try{B($())}catch(K){J(K)}}),C4()});var t="State",o=($)=>{let Z=new Set,B=$,J={[Symbol.toStringTag]:t,get:()=>{return _(Z),B},set:(K)=>{if(Object.is(B,K))return;if(B=K,x(Z),j===B)Z.clear()},update:(K)=>{J.set(K(B))}};return J},M=($)=>v($,t);var b="Computed",N=($)=>{let Z=new Set,B=j,J,K,W=!0,H=!1,I=!1,Y=(A)=>{if(!Object.is(A,B))B=A,H=!0;J=void 0,W=!1},Q=()=>{H=j!==B,B=j,J=void 0},X=(A)=>{let V=p(A);H=!J||V.name!==J.name||V.message!==J.message,B=j,J=V},q=(A)=>(V)=>{if(I=!1,K=void 0,A(V),H)x(Z)},F=h(()=>{if(W=!0,K?.abort("Aborted because source signal changed"),Z.size)x(Z);else F.cleanup()}),C=()=>m(()=>{if(I)throw new k("computed");if(H=!1,G($)&&$.constructor.name==="AsyncFunction"){if(K)return B;K=new AbortController,K.signal.addEventListener("abort",()=>{I=!1,K=void 0,C()},{once:!0})}let A;I=!0;try{A=K?$(K.signal):$()}catch(V){if(V instanceof DOMException&&V.name==="AbortError")Q();else X(V);I=!1;return}if(A instanceof Promise)A.then(q(Y),q(X));else if(A==null||j===A)Q();else Y(A);I=!1},F);return{[Symbol.toStringTag]:b,get:()=>{if(_(Z),i(),W)C();if(J)throw J;return B}}},E=($)=>v($,b),e=($)=>G($)&&$.length<2;var j=Symbol(),O=($)=>M($)||E($),T=($)=>O($)?$:e($)?N($):o($);function f($){let{signals:Z,ok:B,err:J=console.error,nil:K=()=>{}}=G($)?{signals:[],ok:$}:$,W=!1,H=h(()=>m(()=>{if(W)throw new k("effect");W=!0;let I=[],Y=!1,Q=Z.map((q)=>{try{let F=q.get();if(F===j)Y=!0;return F}catch(F){return I.push(p(F)),j}}),X=void 0;try{X=Y?K():I.length?J(...I):B(...Q)}catch(q){X=J(p(q))}finally{if(G(X))H.off(X)}W=!1},H));return H(),()=>H.cleanup()}var P=!1,G4="debug",P4="info",z4="warn",d="error",y4=($)=>$?`#${$}`:"",U4=($)=>$?.length?`.${Array.from($).join(".")}`:"",$4=($)=>!!$&&typeof $==="object",D=($)=>typeof $==="string",B4=($,Z)=>D(Z)&&(Z in $)&&G($[Z]),j4=($)=>$.nodeType===Node.ELEMENT_NODE,s=($)=>$.localName.includes("-");var z=($)=>$?`<${$.localName}${y4($.id)}${U4($.classList)}>`:"<unknown>",g=($)=>D($)?`"${$}"`:$4($)?JSON.stringify($):String($),n=($)=>{if($===null)return"null";if(typeof $!=="object")return typeof $;if(Array.isArray($))return"Array";if(Symbol.toStringTag in Object($))return $[Symbol.toStringTag];return $.constructor?.name||"Object"},L=($,Z,B=G4)=>{if(P||[d,z4].includes(B))console[B](Z,$);return $};class A4 extends Error{constructor($){super($);this.name="CircularMutationError"}}var V4=($)=>{let Z=new Set;if($.includes("."))Z.add("class");if($.includes("#"))Z.add("id");if($.includes("[")){let B=$.split("[");for(let J=1;J<B.length;J++){let K=B[J];if(!K.includes("]"))continue;let W=K.split("=")[0].trim().replace(/[^a-zA-Z0-9_-]/g,"");if(W)Z.add(W)}}return[...Z]},x4=($,Z)=>{if($.length!==Z.length)return!1;let B=new Set($);for(let J of Z)if(!B.has(J))return!1;return!0},M4=($,Z,B)=>(J)=>{let K=new Set,W=G($)?$(J):$,H=new Map,I,Y=()=>{for(let[Q,X]of Object.entries(B)){let q=(F)=>{let C=F.target;if(!C)return;let U=C.closest(Z);if(!U||!J.contains(U))return;F.stopPropagation();try{let A=X({event:F,host:J,target:U,value:W});if(A==null)return;if(!Object.is(A,W)){if(W=A,K.size>0)x(K);else if(I)I()}}catch(A){throw F.stopImmediatePropagation(),A}};H.set(Q,q),J.addEventListener(Q,q)}I=()=>{if(H.size){for(let[Q,X]of H)J.removeEventListener(Q,X);H.clear()}I=void 0}};return{[Symbol.toStringTag]:b,get(){if(_(K),K.size&&!H.size)Y();return W}}},Z4=($,Z,B)=>{let J=new MutationObserver(B),K={childList:!0,subtree:!0},W=V4(Z);if(W.length)K.attributes=!0,K.attributeFilter=W;return J.observe($,K),J},q4=($)=>(Z)=>{let B=new Set,J=()=>Array.from((Z.shadowRoot??Z).querySelectorAll($)),K=j,W,H=0,I=2,Y=()=>{K=J(),W=Z4(Z,$,()=>{if(!B.size){W?.disconnect(),W=void 0;return}if(H++,H>I)throw W?.disconnect(),W=void 0,H=0,new A4("Circular mutation in element selection detected");try{let Q=J();if(!x4(K,Q))K=Q,x(B)}finally{H--}})};return{[Symbol.toStringTag]:b,get(){if(_(B),!B.size)K=J();else if(!W)Y();return K}}},_4=($,Z,B,J)=>N(()=>q4(Z)($).get().reduce(B,J)),O4=($,Z,B)=>{if(!$)return()=>B;if(!s($))throw new TypeError("Target element must be a custom element");let J=N(async()=>{return await customElements.whenDefined($.localName),$.getSignal(Z)});return()=>{let K=J.get();return K===j?B:K.get()}},T4=($,Z)=>{let B=$.querySelector(Z);if(!B)throw new Error(`Component ${z($)} does not contain required <${Z}> element`);return B};var S=Symbol(),D4=new Set(["constructor","prototype"]),R4=new Set(["id","class","className","title","role","style","dataset","lang","dir","hidden","children","innerHTML","outerHTML","textContent","innerText"]),J4=($)=>G($)&&$.length>=2,F4=($)=>{if(D4.has($))return`Property name "${$}" is a reserved word`;if(R4.has($))return`Property name "${$}" conflicts with inherited HTMLElement property`;return null},K4=($,Z,B=Z)=>{let J=$.filter(G).map((K)=>K(Z,B));return()=>{J.filter(G).forEach((K)=>K()),J.length=0}},w4=()=>({first:($,...Z)=>(B)=>{let J=(B.shadowRoot||B).querySelector($);if(J)K4(Z,B,J)},all:($,...Z)=>(B)=>{let J=new Map,K=B.shadowRoot||B,W=(Q)=>{if(!J.has(Q))J.set(Q,K4(Z,B,Q))},H=(Q)=>{let X=J.get(Q);if(G(X))X();J.delete(Q)},I=(Q)=>(X)=>{if(j4(X)){if(X.matches($))Q(X);X.querySelectorAll($).forEach(Q)}},Y=Z4(K,$,(Q)=>{for(let X of Q)X.addedNodes.forEach(I(W)),X.removedNodes.forEach(I(H))});return K.querySelectorAll($).forEach(W),()=>{Y.disconnect(),J.forEach((Q)=>Q()),J.clear()}}}),N4=($,Z={},B)=>{for(let J of Object.keys(Z)){let K=F4(J);if(K)throw new TypeError(`${K} in component "${$}".`)}customElements.define($,class extends HTMLElement{debug;#$={};#B;static observedAttributes=Object.entries(Z)?.filter(([,J])=>J4(J)).map(([J])=>J)??[];constructor(){super();for(let[J,K]of Object.entries(Z)){if(K==null)continue;let W=J4(K)?K(this,null):G(K)?K(this):K;if(W!=null)this.setSignal(J,T(W))}}connectedCallback(){if(P){if(this.debug=this.hasAttribute("debug"),this.debug)L(this,"Connected")}let J=B(this,w4());if(!Array.isArray(J))throw new TypeError(`Expected array of functions as return value of setup function in ${z(this)}`);this.#B=K4(J,this)}disconnectedCallback(){if(G(this.#B))this.#B();if(P&&this.debug)L(this,"Disconnected")}attributeChangedCallback(J,K,W){if(W===K||E(this.#$[J]))return;let H=Z[J];if(!J4(H))return;let I=H(this,W,K);if(P&&this.debug)L(W,`Attribute "${J}" of ${z(this)} changed from ${g(K)} to ${g(W)}, parsed as <${n(I)}> ${g(I)}`);this[J]=I}getSignal(J){let K=this.#$[J];if(P&&this.debug)L(K,`Get ${n(K)} "${String(J)}" in ${z(this)}`);return K}setSignal(J,K){let W=F4(String(J));if(W)throw new TypeError(`${W} on ${z(this)}.`);if(!O(K))throw new TypeError(`Expected signal as value for property "${String(J)}" on ${z(this)}.`);let H=this.#$[J],I=M(K);if(this.#$[J]=K,Object.defineProperty(this,J,{get:K.get,set:I?K.set:void 0,enumerable:!0,configurable:I}),H&&M(H))H.set(j);if(P&&this.debug)L(K,`Set ${n(K)} "${String(J)} in ${z(this)}`)}})};var W4="context-request";class L4 extends Event{$;Z;B;constructor($,Z,B=!1){super(W4,{bubbles:!0,composed:!0});this.context=$;this.callback=Z;this.subscribe=B}}var S4=($)=>(Z)=>{let B=(J)=>{let{context:K,callback:W}=J;if($.includes(K)&&G(W))J.stopImmediatePropagation(),W(Z.getSignal(String(K)))};return Z.addEventListener(W4,B),()=>Z.removeEventListener(W4,B)},k4=($,Z)=>(B)=>{let J=T(Z);return B.dispatchEvent(new L4($,(K)=>{J=K})),J};var H4=($,Z)=>{if(Z==null)return;let B=$(Z);return Number.isFinite(B)?B:void 0},b4=()=>($,Z)=>Z!=null&&Z!=="false",E4=($=0)=>(Z,B)=>{if(B==null)return $;let J=B.trim();if(J.toLowerCase().startsWith("0x"))return H4((W)=>parseInt(W,16),J)??$;let K=H4(parseFloat,B);return K!=null?Math.trunc(K):$},f4=($=0)=>(Z,B)=>H4(parseFloat,B)??$,d4=($="")=>(Z,B)=>B??$,g4=($)=>(Z,B)=>{if(B==null)return $[0];let J=B.toLowerCase();return $.find((W)=>W.toLowerCase()===J)?B:$[0]},p4=($)=>(Z,B)=>{if((B??$)==null)throw new ReferenceError("Value and fallback are both null or undefined");if(B==null)return $;if(B==="")throw new SyntaxError("Empty string is not valid JSON");let J;try{J=JSON.parse(B)}catch(K){throw new SyntaxError(`Failed to parse JSON: ${String(K)}`,{cause:K})}return J??$};var l=Symbol("RESOLVE_ERROR"),Q4=($,Z,B,J)=>{try{return D($)?Z.getSignal($).get():O($)?$.get():G($)?$(B):S}catch(K){if(J)L(K,`Failed to resolve value of ${g($)}${J?` for ${J}`:""} in ${z(B)}${Z!==B?` in ${z(Z)}`:""}`,d);return l}},h4=($,Z="")=>{return{a:"attribute ",c:"class ",d:"dataset ",h:"inner HTML",m:"method call ",p:"property ",s:"style property ",t:"text content"}[$]+Z},m4=($,Z,B,J,K)=>{return{ok:(I)=>()=>{if(P&&$.debug)L(Z,`${I} ${B} of ${z(Z)} in ${z($)}`);J?.(Z)},err:(I)=>(Y)=>{L(Y,`Failed to ${I} ${B} of ${z(Z)} in ${z($)}`,d),K?.(Y)}}},I4=($,Z)=>{return Symbol(Z?`${$}:${Z}`:$)},v4=($,Z,B,J,K)=>{return f(()=>{let W=Q4($,Z,B,J);if(W===l)return;K(W)})},c4=($)=>{if(/^(mailto|tel):/i.test($))return!0;if($.includes("://"))try{let Z=new URL($,window.location.origin);return["http:","https:","ftp:"].includes(Z.protocol)}catch{return!1}return!0},u4=($,Z,B)=>{if(/^on/i.test(Z))throw new Error(`Unsafe attribute: ${Z}`);if(B=String(B).trim(),!c4(B))throw new Error(`Unsafe URL for ${Z}: ${B}`);$.setAttribute(Z,B)},y=($,Z)=>(B,J)=>{let{op:K,name:W="",read:H,update:I}=Z,Y=H(J),Q=h4(K,W);if(D($)&&D(Y)&&B[$]===S)B.attributeChangedCallback($,null,Y);let{ok:X,err:q}=m4(B,J,Q,Z.resolve,Z.reject);return f(()=>{let F=I4(K,W),C=Q4($,B,J,Q);if(C===l)return;let U=C===S?Y:C===j?Z.delete?null:Y:C;if(Z.delete&&U===null)w(()=>{return Z.delete(J),!0},F).then(X("Deleted")).catch(q("delete"));else if(U!=null){let A=H(J);if(Object.is(U,A))return;w(()=>{return I(J,U),!0},F).then(X("Updated")).catch(q("update"))}})},i4=($,Z)=>(B,J)=>{let K=(H)=>()=>{if(P&&B.debug)L(J,`${H} element in ${z(J)} in ${z(B)}`);if(G(Z?.resolve))Z.resolve(J);else{let I=O($)?$:D($)?B.getSignal($):void 0;if(M(I))I.set(0)}},W=(H)=>(I)=>{L(I,`Failed to ${H} element in ${z(J)} in ${z(B)}`,d),Z?.reject?.(I)};return f(()=>{let H=I4("i"),I=I4("r"),Y=Q4($,B,J,"insertion or deletion");if(Y===l)return;let Q=Y===S?0:Y;if(Q>0){if(!Z)throw new TypeError("No inserter provided");w(()=>{for(let X=0;X<Q;X++){let q=Z.create(J);if(!q)continue;J.insertAdjacentElement(Z.position??"beforeend",q)}return!0},H).then(K("Inserted")).catch(W("insert"))}else if(Q<0)w(()=>{if(Z&&(Z.position==="afterbegin"||Z.position==="beforeend"))for(let X=0;X>Q;X--)if(Z.position==="afterbegin")J.firstElementChild?.remove();else J.lastElementChild?.remove();else J.remove();return!0},I).then(K("Removed")).catch(W("remove"))})},o4=($)=>y($,{op:"t",read:(Z)=>Z.textContent,update:(Z,B)=>{Array.from(Z.childNodes).filter((J)=>J.nodeType!==Node.COMMENT_NODE).forEach((J)=>J.remove()),Z.append(document.createTextNode(B))}}),s4=($,Z=$)=>y(Z,{op:"p",name:String($),read:(B)=>($ in B)?B[$]:j,update:(B,J)=>{B[$]=J}}),n4=($)=>y($,{op:"p",name:"hidden",read:(Z)=>!Z.hidden,update:(Z,B)=>{Z.hidden=!B}});var l4=($)=>y($,{op:"m",name:"focus",read:(Z)=>Z===document.activeElement,update:(Z,B)=>{if(B&&B4(Z,"focus"))Z.focus()}}),r4=($,Z=$)=>y(Z,{op:"a",name:$,read:(B)=>B.getAttribute($),update:(B,J)=>{u4(B,$,J)},delete:(B)=>{B.removeAttribute($)}}),a4=($,Z=$)=>y(Z,{op:"a",name:$,read:(B)=>B.hasAttribute($),update:(B,J)=>{B.toggleAttribute($,J)}}),t4=($,Z=$)=>y(Z,{op:"c",name:$,read:(B)=>B.classList.contains($),update:(B,J)=>{B.classList.toggle($,J)}}),e4=($,Z=$)=>y(Z,{op:"s",name:$,read:(B)=>B.style.getPropertyValue($),update:(B,J)=>{B.style.setProperty($,J)},delete:(B)=>{B.style.removeProperty($)}}),$$=($,Z={})=>y($,{op:"h",read:(B)=>(B.shadowRoot||!Z.shadowRootMode?B:null)?.innerHTML??"",update:(B,J)=>{let{shadowRootMode:K,allowScripts:W}=Z;if(!J){if(B.shadowRoot)B.shadowRoot.innerHTML="<slot></slot>";return""}if(K&&!B.shadowRoot)B.attachShadow({mode:K});let H=B.shadowRoot||B;if(H.innerHTML=J,!W)return"";return H.querySelectorAll("script").forEach((I)=>{let Y=document.createElement("script");Y.appendChild(document.createTextNode(I.textContent??"")),H.appendChild(Y),I.remove()})," with scripts"}}),B$=($,Z,B=!1)=>(J,K)=>{if(!G(Z))throw new TypeError(`Invalid event listener provided for "${$} event on element ${z(K)}`);return K.addEventListener($,Z,B),()=>K.removeEventListener($,Z)},Z$=($,Z)=>(B,J)=>v4(Z,B,J,`custom event "${$}" detail`,(K)=>{if(K===S||K===j)return;J.dispatchEvent(new CustomEvent($,{detail:K,bubbles:!0}))}),J$=($)=>(Z,B)=>{if(!$4($))throw new TypeError("Reactives must be an object of passed signals");if(!s(B))throw new TypeError(`Target ${z(B)} is not a custom element`);customElements.whenDefined(B.localName).then(()=>{if(!B4(B,"setSignal"))throw new TypeError(`Target ${z(B)} is not a UIElement component`);for(let[J,K]of Object.entries($))B.setSignal(J,D(K)?Z.getSignal(K):T(K))}).catch((J)=>{throw new Error(`Failed to pass signals to ${z(B)}`,{cause:J})})};export{y as updateElement,t4 as toggleClass,a4 as toggleAttribute,T as toSignal,o as state,n4 as show,o4 as setText,e4 as setStyle,s4 as setProperty,r4 as setAttribute,T4 as requireDescendant,_4 as reduced,O4 as read,S4 as provideContexts,J$ as pass,B$ as on,L as log,M as isState,O as isSignal,E as isComputed,i4 as insertOrRemoveElement,q4 as fromSelector,M4 as fromEvents,k4 as fromContext,l4 as focus,w as enqueue,Z$ as emitEvent,f as effect,$$ as dangerouslySetInnerHTML,N as computed,N4 as component,Y4 as batch,d4 as asString,f4 as asNumber,p4 as asJSON,E4 as asInteger,g4 as asEnum,b4 as asBoolean,j as UNSET,S as RESET,z4 as LOG_WARN,P4 as LOG_INFO,d as LOG_ERROR,G4 as LOG_DEBUG}; //# debugId=72676F424DD60ECB64756E2164756E21