lego-dom 2.1.3 → 2.1.5
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/README.md +1 -1
- package/dist/lego.min.js +2 -2
- package/dist/lego.mjs +2 -2
- package/dist/main.js +2 -2
- package/package.json +2 -2
- package/src/core/lifecycle.js +28 -28
- package/src/core/parser.js +2 -1
- package/src/core/reactive.js +14 -8
- package/src/core/registry.js +1 -0
- package/src/core/renderer.js +33 -10
- package/src/core/stylesheets.js +2 -1
- package/src/directives/b-enter.js +2 -2
- package/src/directives/b-for.js +29 -9
- package/src/directives/b-html.js +20 -1
- package/src/directives/b-if.js +6 -0
- package/src/directives/b-init.js +2 -2
- package/src/directives/b-leave.js +3 -2
- package/src/directives/b-sync.js +20 -5
- package/src/directives/b-text.js +6 -2
- package/src/features/error.js +17 -14
- package/src/index.js +236 -49
- package/src/lego.d.ts +95 -0
- package/src/utils/dom.js +5 -0
- package/src/utils/parser-utils.js +10 -3
- package/src/utils/safe-eval.js +7 -4
- package/vite-plugin.js +14 -3
package/README.md
CHANGED
package/dist/lego.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
(()=>{var w={},
|
|
1
|
+
(()=>{var w={},G=new WeakMap,W=new WeakMap,P=new WeakMap,re=new WeakMap,T=new Set,J=new Set,I=new Map,oe=new Map;var R={locked:!1},A=e=>(W.has(e)||W.set(e,{snapped:!1,bindings:null,bound:!1,rendering:!1,anchor:null}),W.get(e));var _={},we=e=>{_=e};var se=class{constructor(t=1e3){this.limit=t,this.cache=new Map}get(t){if(!this.cache.has(t))return;let o=this.cache.get(t);return this.cache.delete(t),this.cache.set(t,o),o}set(t,o){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.limit){let s=this.cache.keys().next().value;this.cache.delete(s)}this.cache.set(t,o)}get size(){return this.cache.size}clear(){this.cache.clear()}};var q=(e,t)=>{if(!e)return;let o=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;o;){let s=o.tagName?o.tagName.toLowerCase():"";if(s&&(t==="*"&&w[s]||s===t.toLowerCase()))return o;o=o.parentElement||o.getRootNode&&o.getRootNode().host}},xe=(e,t)=>{if(typeof e=="function"){let s=Array.from(document.querySelectorAll("*")).filter(r=>r.tagName.includes("-"));return[].concat(e(s))}if(e.startsWith("#")){let s=document.getElementById(e.slice(1));return s?[s]:[]}let o=t?.querySelectorAll(e)||[];return o.length>0?[...o]:[...document.querySelectorAll(e)]},F=e=>e.attributes?[...e.attributes].find(t=>t.name==="b-sync"||t.name.startsWith("b-sync.")):null,V=(e,t)=>{if(e.type==="checkbox")e.checked!==!!t&&(e.checked=!!t);else{let o=t==null?"":String(t);e.value!==o&&(e.value=o)}};var g={onError:(e,t,o)=>{console.error(`[Lego Error] [${t}]`,e,o)},metrics:{},debug:!1,syntax:"brackets"},z=(e,t)=>{!e||!t||Object.getOwnPropertyNames(e).forEach(o=>{let s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s)})},X=()=>g.syntax==="brackets"?["[[","]]"]:["{{","}}"],fe=new Map,Q=()=>{let[e,t]=X(),o=e+t;if(fe.has(o))return fe.get(o);let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`${s}(.*?)${r}`,"g");return fe.set(o,n),n},Se=e=>{let o=e.split("/").pop().replace(/\.lego$/,"").replace(/_/g,"-").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();if(!o.includes("-"))throw new Error(`[Lego] Invalid block definition: "${e}". Block names must contain a hyphen (e.g. user-card.lego or UserCard.lego).`);return o},C=(e,t)=>{if(!e)return"";let o=e.trim().split("."),s=t;for(let r of o){if(s==null)return"";s=s[r]}return s??""},de=e=>typeof Node<"u"&&e instanceof Node,B=(e,t,o)=>{if(t.nodeType!==Node.ELEMENT_NODE)return;let s=[...t.attributes].find(n=>n.name===e||n.name.startsWith(`${e}.`));if(!s)return;let r={};return o&&(r=o(s,t)),{type:e,node:t,expr:s.value,modifiers:s.name.split(".").slice(1),...r}};var ue=null,ve=e=>{ue=e},Z=[],pe=e=>{let t=Z.find(r=>r.regex.test(e));if(!t)return null;let o=e.match(t.regex).slice(1),s=t.paramNames?Object.fromEntries(t.paramNames.map((r,n)=>[r,o[n]])):{};return{match:t,params:s}},ne=async(e=null,t=null)=>{if(typeof window>"u")return;let o=window.location.pathname,s=pe(o);if(g.debug&&console.log("[Lego Trace] Matching route",o,s?.match),!s)return;let{match:r,params:n}=s;if(r.middleware&&!await r.middleware({path:o,params:n}))return;let a=e&&e.length?e:["lego-router"],i=t||document;r.tagName&&a.flatMap(f=>xe(f,i)).forEach(f=>{f&&(f.innerHTML=`<${r.tagName}></${r.tagName}>`,ue&&ue(f.firstElementChild))})},ae=(e,...t)=>o=>{let s=async(r,n=null,a=!0,i={})=>{if(a&&typeof history<"u"){let f={legoTargets:t.filter(d=>typeof d=="string"),method:r,body:n};history.pushState(f,"",e)}await ne(t.length?t:null,o)};return{get:(r=!0,n={})=>s("GET",null,r,n),post:(r,n=!0,a={})=>s("POST",r,n,a),put:(r,n=!0,a={})=>s("PUT",r,n,a),patch:(r,n=!0,a={})=>s("PATCH",r,n,a),delete:(r=!0,n={})=>s("DELETE",null,r,n)}};var _e=new se(1e3),N=(e,t,o=!0)=>{if(/\b(function|eval|import|class|module|deploy|constructor|__proto__|prototype)\b/.test(e)||/\[\s*['"`].*\+|\+.*['"`]\s*\]/.test(e)){console.warn(`[Lego] Security Warning: Blocked dangerous expression "${e}"`);return}try{let s=t.state||{},r=_e.get(e);r||(r=new Function("global","self","event","helpers",`
|
|
2
2
|
with(this) {
|
|
3
3
|
with(helpers) {
|
|
4
4
|
return ${e}
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
`),we.set(e,s));let n={$ancestors:a=>F(r.self,a),$registry:a=>Z.get(a.toLowerCase()),$element:r.self,$route:x.$route,$go:(a,...c)=>re(a,...c)(r.self),$db:x.$db,$emit:(a,c)=>{r.self.dispatchEvent(new CustomEvent(a,{detail:c,bubbles:!0,composed:!0}))}},i=s.call(o,r.global,r.self,r.event,n);return typeof i=="function"?i.call(o,r.event):i}catch(o){if(t)throw o;f.onError(o,"render-error",r.self);return}},le=(e,r={})=>{if(!e||e.trim()==="{}")return{};let t=o=>new Function("scope","global",`with(global) { with(scope) { return (${o}); } }`)(r,x);try{return t(e)}catch(o){let s=e.trim();if(!s.startsWith("{")&&s.includes(":"))try{return t(`{${e}}`)}catch{}return console.error(`[Lego] Error parsing b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,o),{}}};var Ne={name:"b-if",scan:(e,{checkGlobal:r,getPrivateData:t})=>k("b-if",e,(o,s)=>{r(o.value);let n=document.createComment(`b-if: ${o.value}`),i=t(s);return i.anchor=n,{anchor:n}}),execute({binding:e,state:r,global:t}){let{node:o,anchor:s,expr:n}=e,i=!!N(n,{state:r,global:t,self:o}),a=!!o.parentNode;i&&!a?s.parentNode&&s.parentNode.replaceChild(o,s):!i&&a&&o.parentNode.replaceChild(s,o)}};var xe={name:"b-show",scan(e,{checkGlobal:r}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let t=e.getAttribute("b-show");return r(t),{type:"b-show",node:e,expr:t}}},execute({binding:e,state:r,global:t}){let{node:o,expr:s}=e;o.style.display=N(s,{state:r,global:t,self:o})?"":"none"}};var ve={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:r}){let{node:t,path:o}=e;t.textContent=C(o,r)}};var Se={name:"b-html",scan:e=>k("b-html",e),execute:({binding:e,state:r,global:t})=>{let{node:o,expr:s}=e;o.innerHTML=N(s,{state:r,global:t,self:o})||""}};var Le={name:"b-sync",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-sync"))return{type:"b-sync",node:e}},execute({binding:e,state:r}){let{node:t}=e;ee(t,C(t.getAttribute("b-sync"),r))}};var $e={name:"b-for",scan(e,{checkGlobal:r,pendingOperations:t}){if(e.nodeType!==Node.ELEMENT_NODE)return;let o=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(o){r(o[2]);let s=document.createComment(`b-for: ${o[1]} in ${o[2].trim()}`);return t.push(()=>{e.parentNode&&(e.parentNode.insertBefore(s,e),e.remove())}),{type:"b-for",anchor:s,itemName:o[1],listName:o[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0)}}},execute({binding:e,state:r,global:t,helpers:o}){let{bind:s,updateNodeBindings:n}=o;if(!s||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:i,listName:a,itemName:c,keyPath:l,template:m}=e,{contextEl:g}=o,d=N(a,{state:r,global:t,self:g})||[];M.has(i)||M.set(i,new Map);let p=M.get(i),b=new Set,h=[];d.forEach((u,v)=>{let y;l?(y=C(l,u),y===void 0&&console.warn(`[Lego] b-key="${l}" resolved to undefined for item at index ${v}. Check for typos.`)):u&&typeof u=="object"?(y=u.id||u._id||u.uuid||u.key,y===void 0&&(Q.has(u)||Q.set(u,Math.random()),y=Q.get(u))):y=`${v}-${u}`,b.add(y);let A=p.get(y);A||(A=m.cloneNode(!0),A.removeAttribute("b-for"),A.removeAttribute("b-key"),p.set(y,A),s(A,g,{name:c,listName:a,index:v}));let Ie=Object.assign(Object.create(r),{[c]:u,$index:v});n(A,Ie),A.querySelectorAll("[b-sync]").forEach(me=>{let ge=me.getAttribute("b-sync");if(ge.startsWith(`${c}.`)){let qe=N(a,{state:r,global:t,self:g});ee(me,C(ge.split(".").slice(1).join("."),qe[v]))}}),h.push(A)});let E=i.nextSibling;h.forEach(u=>{u!==E?i.parentNode.insertBefore(u,E):E=E.nextSibling});for(let[u,v]of p.entries())b.has(u)||(v.remove(),p.delete(u))}};var _e={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:r})=>{e.initialized||(e.initialized=!0,N(e.expr,{state:r}))}};var Te={name:"b-enter",scan:e=>k("b-enter",e,(r,t)=>({modifiers:r.name.split(".").slice(1)})),execute:({binding:e,state:r})=>{if(e.observer||e.done)return;let t=new IntersectionObserver((o,s)=>{o[0].isIntersecting&&(N(e.expr,{state:r}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});t.observe(e.node),e.observer=t},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Ae={scan:e=>k("b-leave",e),execute:({binding:e,state:r})=>{if(e.observer||e.done)return;let t=new IntersectionObserver((o,s)=>{let n=o[0];n.isIntersecting&&(e.activated=!0),!n.isIntersecting&&e.activated&&(N(e.expr,{state:r}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});t.observe(e.node),e.observer=t},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var J={"b-if":Ne,"b-show":xe,"b-text":ve,"b-html":Se,"b-sync":Le,"b-for":$e,"b-init":_e,"b-enter":Te,"b-leave":Ae};var Ke=(e=null)=>{let r=!1,t=new Set,o=!1,s=e,n=new Set,i=null,a=new Set,c=d=>{s=d},l=()=>{i&&clearTimeout(i),i=setTimeout(()=>{a.forEach(d=>{let p=d._studs;if(p&&typeof p.updated=="function")try{p.updated.call(p)}catch(b){console.error("[Lego] Error in updated hook:",b)}}),a.clear(),i=null},50)},m=()=>{n.size>0&&(n.forEach(d=>t.add(d)),n.clear(),!r&&t.size>0&&(r=!0,requestAnimationFrame(g)))},g=()=>{o=!0;let d=Array.from(t);t.clear(),r=!1,d.forEach(p=>{p.isConnected&&s&&s(p)}),d.forEach(p=>a.add(p)),l(),o=!1,m()};return{add:d=>{if(d){if(o){n.add(d);return}t.add(d),!r&&(r=!0,requestAnimationFrame(g))}},setHandler:c}},oe=Ke();var $=new Map,se=new Map,V=new WeakMap,X=new Map,Ue=e=>{let r=Array.from(X.entries()).filter(([s])=>s.startsWith("lego:")).sort((s,n)=>s[1].timestamp-n[1].timestamp),t=0,o=[];for(let[s,n]of r){if(t>=e)break;try{localStorage.removeItem(s),t+=n.size,o.push(s),X.delete(s)}catch(i){console.error(`[Lego] Failed to evict ${s}:`,i)}}return o},Me=(e,r,t)=>{f.debug&&console.log("[Lego Trace] scheduleSave",e,r,t),se.has(e)&&clearTimeout(se.get(e));let o=()=>{try{let s=JSON.stringify(r),n=new Blob([s]).size;localStorage.setItem(e,s);let i=e.startsWith("lego:")?e:`lego:${e}`;X.set(i,{timestamp:Date.now(),size:n}),se.delete(e)}catch(s){if(s.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(r),i=new Blob([n]).size,a=Ue(i*2);if(a.length>0){f.debug&&console.log(`[Lego] Evicted ${a.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;X.set(c,{timestamp:Date.now(),size:i})}else f.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{f.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,s)}};t>0?se.set(e,setTimeout(o,t)):o()},ue=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(t){return this._default=t,this},debounce(t){return this._debounce=t,this},set(t,o=0){return Me(e,t,o),$.has(e)&&$.get(e).forEach(({target:s,prop:n,el:i,batcher:a})=>{s[n]=t,i&&a&&a.add(i)}),t},get(){try{let t=localStorage.getItem(e);return t!==null?JSON.parse(t):null}catch(t){return console.warn(`[Lego] Failed to get localStorage value for key "${e}":`,t),null}},delete(){try{return localStorage.removeItem(e),X.delete(e.startsWith("lego:")?e:`lego:${e}`),$.has(e)&&$.get(e).forEach(({target:t,prop:o,el:s,batcher:n})=>{t[o]=null,s&&n&&n.add(s)}),!0}catch(t){return console.error(`[Lego] Failed to delete localStorage key "${e}":`,t),!1}}}),ke=e=>e&&e.__type==="lego-db",Ce=(e,r,t,o,s)=>{f.debug&&console.log("[Lego Trace] Reactive DB Init:",r,t);let n=t._default;try{let i=localStorage.getItem(t.key);i!==null&&(n=JSON.parse(i))}catch(i){console.warn(`[Lego] Failed to parse localStorage value for key "${t.key}":`,i)}e[r]=n,V.has(e)||V.set(e,{}),V.get(e)[r]={key:t.key,debounce:t._debounce},f.debug&&console.log("[Lego Trace] DB Metadata Set:",r,V.get(e)[r]),$.has(t.key)||$.set(t.key,new Set),$.get(t.key).add({target:e,prop:r,el:o,batcher:s})},Oe=(e,r,t)=>{let o=V.get(e);if(o&&o[r]){let s=o[r].key;Me(s,t,o[r].debounce),$.has(s)&&$.get(s).forEach(({target:n,prop:i,el:a,batcher:c})=>{n!==e&&(n[i]=t,a&&c&&c.add(a))})}},De=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!$.has(e.key)))try{let r=JSON.parse(e.newValue);$.get(e.key).forEach(({target:t,prop:o,el:s,batcher:n})=>{t[o]=r,s&&n&&n.add(s)})}catch(r){console.warn("[Lego] Cross-tab sync error:",r)}})};var z=(e,r,t=oe)=>{if(e===null||typeof e!="object"||ae(e))return e;if(q.has(e))return q.get(e);for(let n in e){let i=Object.getOwnPropertyDescriptor(e,n);if(i&&i.get)continue;let a=e[n];ke(a)&&Ce(e,n,a,r,t)}let o={get:(n,i)=>{let a=Reflect.get(n,i);return a!==null&&typeof a=="object"&&!ae(a)?z(a,r,t):a},set:(n,i,a,c)=>{let l=n[i];f.debug&&l!==a&&console.log("[Lego Trace] Reactive SET:",i,"Old:",l,"New:",a,"Target:",n);let m=Reflect.set(n,i,a,c);return c===q.get(n)&&l!==a&&(t.add(r),Oe(n,i,a)),m},deleteProperty:(n,i)=>{let a=Reflect.deleteProperty(n,i);return t.add(r),a}},s=new Proxy(e,o);return q.set(e,s),s};var je=e=>{let r=e;for(;r;){let t=r.getAttribute&&r.getAttribute("b-error");if(t)return{errorTag:t,targetElement:r};let o=r.tagName?r.tagName.toLowerCase():"",s=w[o];if(s){let n=s.getAttribute("b-error");if(n)return{errorTag:n,targetElement:r}}r=r.parentElement||r.getRootNode&&r.getRootNode().host}return null},de=null,fe=null,Be=(e,r)=>{de=e,fe=r},Ge=(e,r,t)=>{if(!de||!fe){console.error("[Lego] Error boundary dependencies not loaded",t);return}try{r.shadowRoot?r.shadowRoot.innerHTML="":r.innerHTML="";let o=document.createElement(e);(r.shadowRoot||r).appendChild(o),de(o),o._studs&&(o._studs.$error={message:t.message,stack:t.stack,component:r.tagName.toLowerCase()},fe(o))}catch(o){console.error("[Lego] Error boundary failed to render:",o),console.error("[Lego] Original error:",t)}},W=(e,r,t)=>{let o=je(r);o?Ge(o.errorTag,o.targetElement,e):f.onError(e,t,r)};var H=(e,r,t=null)=>{let o=r._studs,s=a=>{let c=_(a);if(!c.bound){if(a.hasAttributes()){let l=a.attributes;for(let m=0;m<l.length;m++){let g=l[m];if(g.name.startsWith("@")){let d=g.name.slice(1).split("."),p=d[0],b=d.slice(1);a.addEventListener(p,h=>{if(b.includes("prevent")&&h.preventDefault(),b.includes("stop")&&h.stopPropagation(),!(b.includes("self")&&h.target!==h.currentTarget)){if(typeof KeyboardEvent<"u"&&h instanceof KeyboardEvent){if(b.includes("ctrl")&&!h.ctrlKey||b.includes("alt")&&!h.altKey||b.includes("shift")&&!h.shiftKey||b.includes("meta")&&!h.metaKey)return;let E=b.filter(u=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(u));if(E.length>0){let u=h.key.toLowerCase();if(!E.some(y=>y==="enter"?u==="enter":y==="esc"||y==="escape"?u==="escape":y==="space"?u===" ":y==="tab"?u==="tab":y==="delete"?u==="delete":y==="backspace"?u==="backspace":y==="up"?u==="arrowup":y==="down"?u==="arrowdown":y==="left"?u==="arrowleft":y==="right"?u==="arrowright":y==="alpha"?/^[a-z]$/.test(u):y==="numbers"?/^[0-9]$/.test(u):y===u))return}}try{let E=o;if(t){let v=N(t.listName,{state:o,global:x,self:r})[t.index];E=Object.assign(Object.create(o),{[t.name]:v})}N(g.value,{state:E,global:x,self:a,event:h,$event:h},!0)}catch(E){W(E,r,"event-handler")}}})}}if(a.hasAttribute("b-sync")){let m=a.getAttribute("b-sync"),g=()=>{try{let d,p;if(t&&m.startsWith(`${t.name}.`)){let E=N(t.listName,{state:o,global:x,self:r})[t.index];if(!E)return;let u=m.split(".").slice(1);p=u.pop(),d=u.reduce((v,y)=>v[y],E)}else{let h=m.split(".");p=h.pop(),d=h.reduce((E,u)=>E[u],o)}let b=a.type==="checkbox"?a.checked:a.value;d&&d[p]!==b&&(d[p]=b)}catch(d){f.onError(d,"sync-update",a)}};a.addEventListener("input",g),a.addEventListener("change",g)}if(a.hasAttribute("b-var")){let m=a.getAttribute("b-var");o.$vars&&(o.$vars[m]=a)}}c.bound=!0}};e instanceof Element&&s(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),i;for(;i=n.nextNode();)s(i)},Je=e=>{let r=[],t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),o,s=[];for(;o=t.nextNode();){let n=o;if((c=>{let l=c.parentNode;for(;l&&l!==e;){if(l.hasAttribute&&l.hasAttribute("b-for"))return!0;l=l.parentNode}return!1})(o))continue;let a=c=>{if(/\bglobal\b/.test(c)){let l=e.host||e;K.add(l)}};if(o.nodeType===Node.ELEMENT_NODE){for(let[l,m]of Object.entries(J))if(m.scan){let g=m.scan(o,{checkGlobal:a,getPrivateData:_,pendingOperations:s,current:n});g&&r.push(g)}let[c]=U();[...o.attributes].forEach(l=>{l.value.includes(c)&&(a(l.value),r.push({type:"attr",node:o,attrName:l.name,template:l.value}))})}else if(o.nodeType===Node.TEXT_NODE){let[c]=U();o.textContent.includes(c)&&(a(o.textContent),r.push({type:"text",node:o,template:o.textContent}))}}return s.forEach(n=>n()),r},Ve=(e,r)=>{let t=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let i=n._tpl.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:n})??"");n.textContent!==i&&(n.textContent=i)}else if(n.nodeType===Node.ELEMENT_NODE){let[i]=U();[...n.attributes].forEach(a=>{if(a._tpl===void 0&&(a._tpl=a.value),a._tpl.includes(i)){let c=a._tpl.replace(j(),(l,m)=>N(m.trim(),{state:r,global:x,self:n})??"");a.value!==c&&(a.value=c,a.name==="class"&&(n.className=c))}})}};t(e);let o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s;for(;s=o.nextNode();)t(s)},O=e=>{f.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let r=e._studs;if(!r)return;let t=_(e);if(!t.rendering){t.rendering=!0,f.metrics&&f.metrics.onRenderStart&&f.metrics.onRenderStart(e);try{let o=e.shadowRoot||e;t.bindings||(t.bindings=Je(o)),t.bindings.forEach(s=>{let n=J[s.type];if(n){n.execute({binding:s,state:r,global:x,helpers:{bind:H,updateNodeBindings:Ve,contextEl:e}});return}if(s.type==="text"){let i=s.template.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:s.node})??"");s.node.textContent!==i&&(s.node.textContent=i)}if(s.type==="attr"){let i=s.template.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:s.node})??"");s.node.getAttribute(s.attrName)!==i&&(s.node.setAttribute(s.attrName,i),s.attrName==="class"&&(s.node.className=i))}}),r===x&&K.forEach(s=>O(s))}catch(o){W(o,e,"render")}finally{f.metrics&&f.metrics.onRenderEnd&&f.metrics.onRenderEnd(e),t.rendering=!1}}};var Re=new Map,Pe={},Fe=e=>{Pe=e},ze=async()=>{let e=Object.entries(Pe).map(async([r,t])=>{let o=await Promise.all(t.map(async s=>{try{if(s instanceof CSSStyleSheet)return s;let n=await fetch(s);if(!n.ok)throw new Error(`Status ${n.status}`);let i=await n.text(),a=new CSSStyleSheet;return await a.replace(i),a}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${s}`,n),null}}));Re.set(r,o.filter(s=>s!==null))});await Promise.all(e),f.debug&&console.log("[Lego Debug] Re-applying stylesheets to",L.size,"blocks"),L.forEach(r=>{pe(r)})},pe=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let r=e.shadowRoot||e._legoShadow,t=e.tagName.toLowerCase(),o=w[t],s=(o&&o.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),i=[],a=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;a;){let g=(a.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);g.length&&i.push(...g);let d=a.tagName?a.tagName.toLowerCase():"";if(w[d]){let p=(w[d].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);p.length&&i.push(...p)}a=a.parentElement||a.getRootNode&&a.getRootNode().host}let c=[...new Set([...s,...n])],l=[...new Set(i)],m=[...new Set([...l,...c])];if(m.length>0){let g=m.flatMap(d=>Re.get(d)||[]);g.length>0&&f.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",m,"- Sheets:",g.length),g.length>0&&(r.adoptedStyleSheets=[...g])}e._studsMeta={stylesheets:{explicit:c,inherited:l,applied:m}}};var S=e=>{if(f.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let r=_(e),t=e.tagName.toLowerCase(),o=w[t];if(o&&!r.snapped){r.snapped=!0;let n=o.content.cloneNode(!0),i=e.shadowRoot;i?i.innerHTML="":i=e.attachShadow({mode:"open"}),pe(e);let a=F(e,"*")||F(e.getRootNode().host,"*"),c=a&&a.state?a.state:{},l=R.get(t)||{},m=le(o.getAttribute("b-logic")||"{}"),g=le(e.getAttribute("b-logic")||"{}",c),d={$vars:{},$element:e,get $parent(){return F(e,"*")},$emit:(h,E)=>{e.dispatchEvent(new CustomEvent(h,{detail:E,bubbles:!0,composed:!0}))},get $route(){return x.$route},get $go(){return x.$go}};P(l,d),P(m,d),P(g,d),e._studs=z(d,e),Object.defineProperty(e,"state",{get(){return this._studs},set(h){Object.assign(this._studs,h)},configurable:!0,enumerable:!1}),i.appendChild(n);let p=i.querySelector("style");p&&(p.textContent=p.textContent.replace(/\bself\b/g,":host")),H(i,e),L.add(e),O(e),e.setAttribute("b-id",t);let b=i.querySelectorAll("*");if(f.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",b.length),b.forEach(h=>{let E=h.tagName.toLowerCase(),u=!!w[E];u&&f.debug&&console.log("[Lego Debug] Checking",E,"- Registered:",u),u&&S(h)}),e._legoShadow||(e._legoShadow=i),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(h){W(h,e,"mounted")}}let s=e.parentElement;for(;s&&!s._studs;)s=s.parentElement;s&&s._studs&&H(e,s),[...e.children].forEach(S)},I=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(t){W(t,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(I),L.delete(e),K.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(t=>{e._studs.$vars[t]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let r=B.get(e);if(r&&(r.bindings&&(r.bindings.forEach(t=>{let o=J[t.type];if(o&&o.destroy)try{o.destroy({binding:t})}catch(s){console.error(`[Lego] Error in directive cleanup (${t.type}):`,s)}t.node=null,t.anchor=null}),r.bindings=null),r.anchor=null,B.delete(e)),M.has(e)){let t=M.get(e);t.forEach((o,s)=>{o&&o._studs&&(o._studs=null)}),t.clear(),M.delete(e)}[...e.children].forEach(I)};function We(e,r="block.lego"){let t={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:be(r)},o=e,s=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;o;){let n=o.match(s);if(!n)break;let i=n[1].toLowerCase(),a=n[2],c=n[0],l=n.index,m=`</${i}>`,g=l+c.length,d=o.indexOf(m,g);if(d===-1){console.warn(`[Lego] Unclosed <${i}> tag in ${r}`);break}let p=o.slice(g,d);if(i==="template"){t.template=p.trim();let b=a.match(/b-stylesheets=["']([^"']+)["']/);b&&(t.stylesAttr=b[1]);let h=a.match(/b-cascade=["']([^"']+)["']/);h&&(t.cascadeAttr=h[1]);let E=a.match(/b-error=["']([^"']+)["']/);E&&(t.errorAttr=E[1])}else if(i==="script"){t.script=p.trim();let b=a.match(/lang=["']([^"']+)["']/);b&&(t.scriptLang=b[1])}else i==="style"&&(t.style=p.trim());o=o.slice(d+m.length)}return t}var He=(e,r,t="block.lego")=>{let o=We(r,t),{blockName:s,template:n,script:i,style:a,stylesAttr:c,cascadeAttr:l,errorAttr:m}=o,g={};if(i)try{let p=i.trim(),b=p.match(/export\s+default\s+({[\s\S]*})/),h=b?b[1]:p;g=new Function("Lego","$db",`return ${h}`)(e,e.globals.$db)}catch(p){f.onError(p,"script",s)}let d=n;a&&(d=`<style>${a}</style>`+d),w[s]=document.createElement("template"),w[s].innerHTML=d,c&&w[s].setAttribute("b-stylesheets",c),l&&w[s].setAttribute("b-cascade",l),m&&w[s].setAttribute("b-error",m),R.set(s,g),document.querySelectorAll(s).forEach(p=>!_(p).snapped&&S(p))};oe.setHandler(O);Be(S,O);Ee(S);var Xe={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},T=z({$route:Xe,$go:(e,...r)=>re(e,...r)(document.body),$db:ue},typeof document<"u"?document.body:null);he(T);var D={db:ue,snap:S,unsnap:I,defineLegoFile:(e,r)=>He(D,e,r),block:(e,r,t={},o="",s="",n="")=>{let i=document.createElement("template");i.setAttribute("b-id",e),i.setAttribute("b-stylesheets",o),s&&i.setAttribute("b-cascade",s),n&&i.setAttribute("b-error",n),i.innerHTML=r,w[e]=i,R.set(e,t);try{let a={};P(t,a),Z.set(e.toLowerCase(),z(a,document.body))}catch(a){f.onError(a,"define",e)}document.querySelectorAll(e).forEach(S),[...L].forEach(a=>{a.tagName.toLowerCase()===e.toLowerCase()&&(f.debug&&console.log("[Lego HMR] Reloading",e),I(a),S(a))}),L.forEach(a=>{a._legoShadow&&a._legoShadow.querySelectorAll(e).forEach(c=>{_(c).snapped||(f.debug&&console.log("[Lego Debug] Lazy-initializing",e,"in",a.tagName),S(c))})})},getActiveBlocksCount:()=>L.size,getLegos:()=>Object.keys(w),config:f,globals:T,route:(e,r,t=null)=>{let o=[],s=e==="*"?".*":e;s=s.replace(/:([^\/]+)/g,(n,i)=>(o.push(i),"([^/]+)")),G.push({path:e,regex:new RegExp(`^${s}$`),tagName:r,paramNames:o,middleware:t})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,r={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),Fe(r.styles||{}),f.loader=r.loader,f.debug=r.debug===!0,await ze(),G.length>0){let n=window.location.pathname,i=window.location.search,a=ce(n);if(a){let{match:c,params:l}=a,m=Object.fromEntries(new URLSearchParams(i));T.$route.url=n+i,T.$route.route=c.path,T.$route.params=l,T.$route.query=m,T.$route.method="GET",T.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(n=>{w[n.getAttribute("b-id")]=n});let t=n=>{if(n.nodeType!==Node.ELEMENT_NODE)return;S(n);let i=n.tagName.toLowerCase();if(i.includes("-")&&!w[i]&&f.loader&&!L.has(n)){let a=f.loader(i);if(a){let c=typeof a=="string"?fetch(a).then(l=>l.text()):a;Promise.resolve(c).then(l=>D.defineLegoFile(l,`${i}.lego`)).catch(l=>console.error(`[Lego] Failed to load ${i}:`,l))}}};new MutationObserver(n=>n.forEach(i=>{i.addedNodes.forEach(t),i.removedNodes.forEach(a=>a.nodeType===Node.ELEMENT_NODE&&I(a))})).observe(e,{childList:!0,subtree:!0});let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(t(e);s.nextNode();)t(s.currentNode);if(e._studs=T,H(e,e),O(e),r.studio){if(!w["lego-studio"]){let n=document.createElement("script");n.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",n.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(n)}D.route("/_/studio","lego-studio"),D.route("/_/studio/:block","lego-studio")}G.length>0&&(window.addEventListener("popstate",n=>{let i=n.state?.legoTargets||null;te(i)}),document.addEventListener("submit",n=>{n.preventDefault()}),document.addEventListener("click",n=>{let a=n.composedPath().find(c=>c.tagName==="A"&&(c.hasAttribute("b-target")||c.hasAttribute("b-link")));if(a){n.preventDefault();let c=a.getAttribute("href"),l=a.getAttribute("b-target"),m=l?l.split(/\s+/).filter(Boolean):[],g=a.getAttribute("b-link")!=="false";T.$go(c,...m).get(g)}}),te()),De()}};typeof window<"u"?window.Lego=D:typeof global<"u"&&(global.Lego=D);var go=D;})();
|
|
7
|
+
`),_e.set(e,r));let n={$ancestors:i=>q(t.self,i),$registry:i=>oe.get(i.toLowerCase()),$element:t.self,$route:_.$route,$params:_.$route?.params||{},$go:(i,...c)=>ae(i,...c)(t.self),$db:_.$db,$emit:(i,c)=>{t.self.dispatchEvent(new CustomEvent(i,{detail:c,bubbles:!0,composed:!0}))}},a=r.call(s,t.global,t.self,t.event,n);return typeof a=="function"?a.call(s,t.event):a}catch(s){if(o)throw s;if(s instanceof ReferenceError)return;throw s}},me=(e,t={})=>{if(!e||e.trim()==="{}")return{};let o=s=>new Function("scope","global",`with(global) { with(scope) { return (${s}); } }`)(t,_);try{return o(e)}catch(s){let r=e.trim();if(!r.startsWith("{")&&r.includes(":"))try{return o(`{${e}}`)}catch{}return console.error(`[Lego] Error parsing b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,s),{}}};var Ne={name:"b-if",scan:(e,{checkGlobal:t,getPrivateData:o})=>B("b-if",e,(s,r)=>{t(s.value);let n=document.createComment(`b-if: ${s.value}`),a=o(r);return a.anchor=n,{anchor:n}}),execute({binding:e,state:t,global:o}){let{node:s,anchor:r,expr:n}=e,a=!!N(n,{state:t,global:o,self:s}),i=!!s.parentNode;a&&!i?r.parentNode&&r.parentNode.replaceChild(s,r):!a&&i&&s.parentNode.replaceChild(r,s)},destroy({binding:e}){e.anchor&&e.anchor.parentNode&&e.anchor.remove()}};var $e={name:"b-show",scan(e,{checkGlobal:t}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let o=e.getAttribute("b-show");return t(o),{type:"b-show",node:e,expr:o}}},execute({binding:e,state:t,global:o}){let{node:s,expr:r}=e;s.style.display=N(r,{state:t,global:o,self:s})?"":"none"}};var Le={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:t,global:o}){let{node:s,path:r}=e;r.startsWith("global.")?s.textContent=C(r.slice(7),o)??"":s.textContent=C(r,t)??""}};var Te={name:"b-html",scan:e=>B("b-html",e),execute:({binding:e,state:t,global:o})=>{let{node:s,expr:r}=e,n=N(r,{state:t,global:o,self:s})||"";s._bHtmlPrev!==n&&(s._bHtmlPrev=n,s.innerHTML=n)},destroy({binding:e}){let{node:t}=e;t&&(delete t._bHtmlPrev,t.innerHTML="")}};var Ae={name:"b-sync",scan(e){if(e.nodeType!==Node.ELEMENT_NODE)return;let t=F(e);if(!t)return;let o=t.name.split(".").slice(1);return{type:"b-sync",node:e,expr:t.value,modifiers:o}},execute({binding:e,state:t,global:o}){let{node:s,expr:r}=e;r.startsWith("global.")?V(s,C(r.slice(7),o)??""):V(s,C(r,t)??"")},destroy({binding:e}){let{node:t}=e;t&&t._bSyncHandler&&(t.removeEventListener("input",t._bSyncHandler),t.removeEventListener("change",t._bSyncHandler),delete t._bSyncHandler)}};var Ce={name:"b-for",scan(e,{checkGlobal:t,pendingOperations:o}){if(e.nodeType!==Node.ELEMENT_NODE)return;let s=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(s){t(s[2]);let r=document.createComment(`b-for: ${s[1]} in ${s[2].trim()}`);return o.push(()=>{e.parentNode&&(e.parentNode.insertBefore(r,e),e.remove())}),{type:"b-for",anchor:r,itemName:s[1],listName:s[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0),terminal:!0}}},execute({binding:e,state:t,global:o,helpers:s}){let{bind:r,updateNodeBindings:n}=s;if(!r||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:a,listName:i,itemName:c,keyPath:f,template:d}=e,{contextEl:u}=s,l=N(i,{state:t,global:o,self:u})||[];P.has(a)||P.set(a,new Map);let p=P.get(a),S=new Set,x=[];l.forEach((m,b)=>{let v;f?(v=C(f,m),(v==null||v==="")&&(console.warn(`[Lego] b-key="${f}" could not resolve a value for item at index ${b}. Falling back to index-based key.`),v=`__bfor_${b}`)):m&&typeof m=="object"?(v=m.id||m._id||m.uuid||m.key,v===void 0&&(re.has(m)||re.set(m,Math.random()),v=re.get(m))):v=`${b}-${m}`,S.add(v);let h=p.get(v);h?h._loopCtx.index=b:(h=d.cloneNode(!0),h.removeAttribute("b-for"),h.removeAttribute("b-key"),p.set(v,h),h._loopCtx={name:c,listName:i,index:b},r(h,u,h._loopCtx));let M=Object.assign(Object.create(t),{[c]:m,$index:b});n(h,M),[h,...h.querySelectorAll("*")].filter(H=>F(H)).forEach(H=>{let Ee=F(H).value;Ee.startsWith(`${c}.`)&&V(H,C(Ee.split(".").slice(1).join("."),l[b]))}),x.push(h)});let E=a.nextSibling;x.forEach(m=>{m!==E?a.parentNode.insertBefore(m,E):E=E.nextSibling});for(let[m,b]of p.entries())S.has(m)||(b.remove(),p.delete(m))},destroy({binding:e}){let{anchor:t}=e;if(t&&P.has(t)){let o=P.get(t);o.forEach(s=>s.remove()),o.clear(),P.delete(t)}t&&t.parentNode&&t.remove()}};var ke={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:t,global:o})=>{e.initialized||(e.initialized=!0,N(e.expr,{state:t,global:o,self:e.node}))}};var Oe={name:"b-enter",scan:e=>B("b-enter",e,(t,o)=>({modifiers:t.name.split(".").slice(1)})),execute:({binding:e,state:t,global:o})=>{if(e.observer||e.done)return;let s=new IntersectionObserver((r,n)=>{r[0].isIntersecting&&(N(e.expr,{state:t,global:o,self:e.node}),e.modifiers.includes("once")&&(n.disconnect(),e.observer=null,e.done=!0))});s.observe(e.node),e.observer=s},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Me={name:"b-leave",scan:e=>B("b-leave",e),execute:({binding:e,state:t,global:o})=>{if(e.observer||e.done)return;let s=new IntersectionObserver((r,n)=>{let a=r[0];a.isIntersecting&&(e.activated=!0),!a.isIntersecting&&e.activated&&(N(e.expr,{state:t,global:o,self:e.node}),e.modifiers.includes("once")&&(n.disconnect(),e.observer=null,e.done=!0))});s.observe(e.node),e.observer=s},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Y={"b-if":Ne,"b-show":$e,"b-text":Le,"b-html":Te,"b-sync":Ae,"b-for":Ce,"b-init":ke,"b-enter":Oe,"b-leave":Me};var Ge=(e=null)=>{let t=!1,o=new Set,s=!1,r=e,n=new Set,a=null,i=new Set,c=l=>{r=l},f=()=>{a&&clearTimeout(a),a=setTimeout(()=>{i.forEach(l=>{let p=l._studs;if(p&&typeof p.updated=="function")try{p.updated.call(p)}catch(S){console.error("[Lego] Error in updated hook:",S)}}),i.clear(),a=null},50)},d=()=>{n.size>0&&(n.forEach(l=>o.add(l)),n.clear(),!t&&o.size>0&&(t=!0,requestAnimationFrame(u)))},u=()=>{s=!0;let l=Array.from(o);o.clear(),t=!1,l.forEach(p=>{p.isConnected&&r&&r(p)}),l.forEach(p=>i.add(p)),f(),s=!1,d()};return{add:l=>{if(l){if(s){n.add(l);return}o.add(l),!t&&(t=!0,requestAnimationFrame(u))}},setHandler:c}},ie=Ge();var L=new Map,ce=new Map,ee=new WeakMap,te=new Map,Je=e=>{let t=Array.from(te.entries()).filter(([r])=>r.startsWith("lego:")).sort((r,n)=>r[1].timestamp-n[1].timestamp),o=0,s=[];for(let[r,n]of t){if(o>=e)break;try{localStorage.removeItem(r),o+=n.size,s.push(r),te.delete(r)}catch(a){console.error(`[Lego] Failed to evict ${r}:`,a)}}return s},Be=(e,t,o)=>{g.debug&&console.log("[Lego Trace] scheduleSave",e,t,o),ce.has(e)&&clearTimeout(ce.get(e));let s=()=>{try{let r=JSON.stringify(t),n=new Blob([r]).size;localStorage.setItem(e,r);let a=e.startsWith("lego:")?e:`lego:${e}`;te.set(a,{timestamp:Date.now(),size:n}),ce.delete(e)}catch(r){if(r.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(t),a=new Blob([n]).size,i=Je(a*2);if(i.length>0){g.debug&&console.log(`[Lego] Evicted ${i.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;te.set(c,{timestamp:Date.now(),size:a})}else g.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{g.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,r)}};o>0?ce.set(e,setTimeout(s,o)):s()},ge=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(o){return this._default=o,this},debounce(o){return this._debounce=o,this},set(o,s=0){return Be(e,o,s),L.has(e)&&L.get(e).forEach(({target:r,prop:n,el:a,batcher:i})=>{r[n]=o,a&&i&&i.add(a)}),o},get(){try{let o=localStorage.getItem(e);return o!==null?JSON.parse(o):null}catch(o){return console.warn(`[Lego] Failed to get localStorage value for key "${e}":`,o),null}},delete(){try{return localStorage.removeItem(e),te.delete(e.startsWith("lego:")?e:`lego:${e}`),L.has(e)&&L.get(e).forEach(({target:o,prop:s,el:r,batcher:n})=>{o[s]=null,r&&n&&n.add(r)}),!0}catch(o){return console.error(`[Lego] Failed to delete localStorage key "${e}":`,o),!1}}}),De=e=>e&&e.__type==="lego-db",Pe=(e,t,o,s,r)=>{g.debug&&console.log("[Lego Trace] Reactive DB Init:",t,o);let n=o._default;try{let a=localStorage.getItem(o.key);a!==null&&(n=JSON.parse(a))}catch(a){console.warn(`[Lego] Failed to parse localStorage value for key "${o.key}":`,a)}e[t]=n,ee.has(e)||ee.set(e,{}),ee.get(e)[t]={key:o.key,debounce:o._debounce},g.debug&&console.log("[Lego Trace] DB Metadata Set:",t,ee.get(e)[t]),L.has(o.key)||L.set(o.key,new Set),L.get(o.key).add({target:e,prop:t,el:s,batcher:r})},Re=(e,t,o)=>{let s=ee.get(e);if(s&&s[t]){let r=s[t].key;Be(r,o,s[t].debounce),L.has(r)&&L.get(r).forEach(({target:n,prop:a,el:i,batcher:c})=>{n!==e&&(n[a]=o,i&&c&&c.add(i))})}},Fe=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!L.has(e.key)))try{let t=JSON.parse(e.newValue);L.get(e.key).forEach(({target:o,prop:s,el:r,batcher:n})=>{o[s]=t,r&&n&&n.add(r)})}catch(t){console.warn("[Lego] Cross-tab sync error:",t)}})};var j=(e,t,o=ie)=>{if(e===null||typeof e!="object"||de(e))return e;if(G.has(e))return G.get(e);for(let n in e){let a=Object.getOwnPropertyDescriptor(e,n);if(a&&a.get)continue;let i=e[n];De(i)&&Pe(e,n,i,t,o)}let s={get:(n,a)=>{let i=Reflect.get(n,a);return i!==null&&typeof i=="object"&&!de(i)?j(i,t,o):i},set:(n,a,i,c)=>{if(a==="__proto__"||a==="constructor"||a==="prototype")return console.warn(`[Lego] Blocked setting dangerous property: "${a}"`),!0;let f=n[a];g.debug&&f!==i&&console.log("[Lego Trace] Reactive SET:",a,"Old:",f,"New:",i,"Target:",n);let d=c===G.get(n),u=Object.prototype.hasOwnProperty.call(n,a),l=!d&&u?Reflect.set(n,a,i):Reflect.set(n,a,i,c);return(d||u)&&f!==i&&(o.add(t),Re(n,a,i)),l},deleteProperty:(n,a)=>{let i=Reflect.deleteProperty(n,a);return o.add(t),i}},r=new Proxy(e,s);return G.set(e,r),r};var Ve=e=>{let t=e;for(;t;){let o=t.getAttribute&&t.getAttribute("b-error");if(o&&o.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:o,targetElement:t};let s=t.tagName?t.tagName.toLowerCase():"",r=w[s];if(r){let n=r.getAttribute("b-error");if(n&&n.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:n,targetElement:t}}t=t.parentElement||t.getRootNode&&t.getRootNode().host}return null},he=null,ze=null,He=(e,t)=>{he=e,ze=t},Xe=(e,t,o)=>{if(!he||!ze){console.error("[Lego] Error boundary dependencies not loaded",o);return}try{t.shadowRoot?t.shadowRoot.innerHTML="":t.innerHTML="";let s=document.createElement(e);s.$initialState={$error:{message:o.message,stack:o.stack,component:t.tagName.toLowerCase()}},(t.shadowRoot||t).appendChild(s),he(s)}catch(s){console.error("[Lego] Error boundary failed to render:",s),console.error("[Lego] Original error:",o)}},U=(e,t,o)=>{let s=Ve(t);s?Xe(s.errorTag,s.targetElement,e):g.onError(e,o,t)};var le=(e,t,o=null)=>{let s=t._studs,r=i=>{let c=A(i);if(!c.bound){if(i.hasAttributes()){let f=i.attributes;for(let u=0;u<f.length;u++){let l=f[u];if(l.name.startsWith("@")){let p=l.name.slice(1).split("."),S=p[0],x=p.slice(1);i.addEventListener(S,E=>{if(x.includes("prevent")&&E.preventDefault(),x.includes("stop")&&E.stopPropagation(),!(x.includes("self")&&E.target!==E.currentTarget)){if(typeof KeyboardEvent<"u"&&E instanceof KeyboardEvent){if(x.includes("ctrl")&&!E.ctrlKey||x.includes("alt")&&!E.altKey||x.includes("shift")&&!E.shiftKey||x.includes("meta")&&!E.metaKey)return;let m=x.filter(b=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(b));if(m.length>0){let b=E.key.toLowerCase();if(!m.some(h=>h==="enter"?b==="enter":h==="esc"||h==="escape"?b==="escape":h==="space"?b===" ":h==="tab"?b==="tab":h==="delete"?b==="delete":h==="backspace"?b==="backspace":h==="up"?b==="arrowup":h==="down"?b==="arrowdown":h==="left"?b==="arrowleft":h==="right"?b==="arrowright":h==="alpha"?/^[a-z]$/.test(b):h==="numbers"?/^[0-9]$/.test(b):h===b))return}}try{let m=s;if(o){let v=N(o.listName,{state:s,global:_,self:t})[o.index];m=Object.assign(Object.create(s),{[o.name]:v})}N(l.value,{state:m,global:_,self:i,event:E,$event:E},!0)}catch(m){U(m,t,"event-handler")}}})}}let d=F(i);if(d){let u=d.value,l=d.name.split(".").slice(1),p=l.includes("lazy"),S=l.includes("number"),x=l.includes("trim"),E=()=>{try{let m,b;if(u.startsWith("global.")){let h=u.slice(7).split(".");b=h.pop(),m=h.reduce((M,D)=>M[D],_)}else if(o&&u.startsWith(`${o.name}.`)){let M=N(o.listName,{state:s,global:_,self:t})[o.index];if(!M)return;let D=u.split(".").slice(1);b=D.pop(),m=D.reduce((H,ye)=>H[ye],M)}else{let h=u.split(".");b=h.pop(),m=h.reduce((M,D)=>M[D],s)}let v=i.type==="checkbox"?i.checked:i.value;if(x&&typeof v=="string"&&(v=v.trim()),S){let h=parseFloat(v);isNaN(h)||(v=h)}m&&m[b]!==v&&(m[b]=v)}catch(m){g.onError(m,"sync-update",i)}};i._bSyncHandler=E,p||i.addEventListener("input",E),i.addEventListener("change",E)}if(i.hasAttribute("b-var")){let u=i.getAttribute("b-var");s.$vars&&(s.$vars[u]=i)}}c.bound=!0}};e instanceof Element&&r(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),a;for(;a=n.nextNode();)r(a)},Qe=e=>{let t=[],o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s,r=[];for(;s=o.nextNode();){let n=s;if((c=>{let f=c.parentNode;for(;f&&f!==e;){if(f.hasAttribute&&f.hasAttribute("b-for"))return!0;f=f.parentNode}return!1})(s))continue;let i=c=>{if(/\bglobal\b/.test(c)){let f=e.host||e;J.add(f)}};if(s.nodeType===Node.ELEMENT_NODE){let c=!1;for(let[d,u]of Object.entries(Y))if(u.scan){let l=u.scan(s,{checkGlobal:i,getPrivateData:A,pendingOperations:r,current:n});l&&(t.push(l),l.terminal&&(c=!0))}if(c)continue;let[f]=X();[...s.attributes].forEach(d=>{d.value.includes(f)&&(i(d.value),t.push({type:"attr",node:s,attrName:d.name,template:d.value}))})}else if(s.nodeType===Node.TEXT_NODE){let[c]=X();s.textContent.includes(c)&&(i(s.textContent),t.push({type:"text",node:s,template:s.textContent}))}}return r.forEach(n=>n()),t},Ze=(e,t)=>{let o=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let a=n._tpl.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:n},!1)??"");n.textContent!==a&&(n.textContent=a)}else if(n.nodeType===Node.ELEMENT_NODE){let[a]=X();[...n.attributes].forEach(i=>{if(i._tpl===void 0&&(i._tpl=i.value),i._tpl.includes(a)){let c=i._tpl.replace(Q(),(f,d)=>N(d.trim(),{state:t,global:_,self:n},!1)??"");i.value!==c&&(i.value=c,i.name==="class"&&(n.className=c))}})}};o(e);let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),r;for(;r=s.nextNode();)o(r)},K=e=>{g.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let t=e._studs;if(!t)return;let o=A(e);if(!o.rendering){o.rendering=!0,g.metrics&&g.metrics.onRenderStart&&g.metrics.onRenderStart(e);try{let s=e.shadowRoot||e;o.bindings||(o.bindings=Qe(s)),o.bindings.forEach(r=>{let n=Y[r.type];if(n){n.execute({binding:r,state:t,global:_,helpers:{bind:le,updateNodeBindings:Ze,contextEl:e}});return}if(r.type==="text"){let a=r.template.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:r.node},!1)??"");r.node.textContent!==a&&(r.node.textContent=a)}if(r.type==="attr"){let a=r.template.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:r.node},!1)??"");r.node.getAttribute(r.attrName)!==a&&(r.node.setAttribute(r.attrName,a),r.attrName==="class"&&(r.node.className=a))}}),t===_&&J.forEach(r=>K(r))}catch(s){U(s,e,"render")}finally{g.metrics&&g.metrics.onRenderEnd&&g.metrics.onRenderEnd(e),o.rendering=!1}}};var We=new Map,Ie={},qe=e=>{Ie=e},je=async()=>{let e=Object.entries(Ie).map(async([t,o])=>{let s=await Promise.all(o.map(async r=>{try{if(r instanceof CSSStyleSheet)return r;let n=await fetch(r);if(!n.ok)throw new Error(`Status ${n.status}`);let a=await n.text(),i=new CSSStyleSheet;return await i.replace(a),i}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${r}`,n),null}}));We.set(t,s.filter(r=>r!==null))});await Promise.all(e),g.debug&&console.log("[Lego Debug] Re-applying stylesheets to",T.size,"blocks"),T.forEach(t=>{be(t)})},be=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let t=e.shadowRoot||e._legoShadow,o=e.tagName.toLowerCase(),s=w[o],r=(s&&s.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),a=[],i=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;i;){let u=(i.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);u.length&&a.push(...u);let l=i.tagName?i.tagName.toLowerCase():"";if(w[l]){let p=(w[l].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);p.length&&a.push(...p)}i=i.parentElement||i.getRootNode&&i.getRootNode().host}let c=[...new Set([...r,...n])],f=[...new Set(a)],d=[...new Set([...f,...c])];if(d.length>0){let u=d.flatMap(l=>We.get(l)||[]);if(u.length>0&&g.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",d,"- Sheets:",u.length),u.length>0){let l=t.adoptedStyleSheets.filter(p=>!u.includes(p));t.adoptedStyleSheets=[...l,...u]}}e._studsMeta={stylesheets:{explicit:c,inherited:f,applied:d}}};var $=e=>{if(g.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let t=A(e),o=e.tagName.toLowerCase(),s=w[o];if(s&&!t.snapped){t.snapped=!0;let n=s.content.cloneNode(!0),a=e.shadowRoot;a?a.innerHTML="":a=e.attachShadow({mode:"open"}),be(e);let i=q(e,"*")||q(e.getRootNode().host,"*"),c=i&&i.state?i.state:{},f=I.get(o)||{},d=me(s.getAttribute("b-logic")||s.getAttribute("b-data")||"{}"),u=me(e.getAttribute("b-logic")||e.getAttribute("b-data")||"{}",c),l={$vars:{},$element:e,get $parent(){return q(e,"*")},$emit:(x,E)=>{e.dispatchEvent(new CustomEvent(x,{detail:E,bubbles:!0,composed:!0}))},get $route(){return _.$route},get $go(){return _.$go}};z(f,l),z(d,l),z(u,l),e.$initialState&&(z(e.$initialState,l),delete e.$initialState),e._studs=j(l,e),Object.defineProperty(e,"state",{get(){return this._studs},set(x){Object.assign(this._studs,x)},configurable:!0,enumerable:!1}),R.locked=!0,a.appendChild(n),R.locked=!1;let p=a.querySelector("style");if(p&&(p.textContent=p.textContent.replace(/\bself\b/g,":host")),le(a,e),T.add(e),K(e),e.setAttribute("b-id",o),e._legoShadow||(e._legoShadow=a),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(x){U(x,e,"mounted")}let S=a.querySelectorAll("*");g.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",S.length),S.forEach(x=>{let E=x.tagName.toLowerCase(),m=!!w[E];m&&g.debug&&console.log("[Lego Debug] Checking",E,"- Registered:",m),m&&$(x)})}let r=e.parentElement;for(;r&&!r._studs;)r=r.parentElement;r&&r._studs&&le(e,r),[...e.children].forEach($)},k=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(o){U(o,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(k),T.delete(e),J.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(o=>{e._studs.$vars[o]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let t=W.get(e);t&&(t.bindings&&(t.bindings.forEach(o=>{let s=Y[o.type];if(s&&s.destroy)try{s.destroy({binding:o})}catch(r){console.error(`[Lego] Error in directive cleanup (${o.type}):`,r)}o.node=null,o.anchor=null}),t.bindings=null),t.anchor=null,W.delete(e)),[...e.children].forEach(k)};function Ue(e,t="block.lego"){let o={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:Se(t),hasTemplate:!1,hasScript:!1,hasStyle:!1},s=e,r=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;s;){let n=s.match(r);if(!n)break;let a=n[1].toLowerCase(),i=n[2],c=n[0],f=n.index,d=`</${a}>`,u=f+c.length,l=s.indexOf(d,u);if(l===-1){console.warn(`[Lego] Unclosed <${a}> tag in ${t}`);break}let p=s.slice(u,l);if(a==="template"){o.hasTemplate=!0,o.template=p.trim();let S=i.match(/b-stylesheets=["']([^"']+)["']/);S&&(o.stylesAttr=S[1]);let x=i.match(/b-cascade=["']([^"']+)["']/);x&&(o.cascadeAttr=x[1]);let E=i.match(/b-error=["']([^"']+)["']/);E&&(o.errorAttr=E[1])}else if(a==="script"){o.hasScript=!0,o.script=p.trim();let S=i.match(/lang=["']([^"']+)["']/);S&&(o.scriptLang=S[1])}else a==="style"&&(o.hasStyle=!0,o.style=p.trim());s=s.slice(l+d.length)}return o}var Ke=(e,t,o="block.lego")=>{let s=Ue(t,o),{blockName:r,template:n,script:a,style:i,stylesAttr:c,cascadeAttr:f,errorAttr:d}=s,u={};if(a)try{let p=a.trim(),S=p.match(/export\s+default\s+(?:\/\*[\s\S]*?\*\/\s*|\/\/[^\n]*\n\s*)*({[\s\S]*})/),x=S?S[1]:p;u=new Function("Lego","$db",`return ${x}`)(e,e.globals.$db)}catch(p){g.onError(p,"script",r)}let l=n;i&&(l=`<style>${i}</style>`+l),w[r]=document.createElement("template"),w[r].innerHTML=l,c&&w[r].setAttribute("b-stylesheets",c),f&&w[r].setAttribute("b-cascade",f),d&&w[r].setAttribute("b-error",d),I.set(r,u),document.querySelectorAll(r).forEach(p=>!A(p).snapped&&$(p))};ie.setHandler(K);He($,K);ve($);var Ye={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},O=j({$route:Ye,$go:(e,...t)=>ae(e,...t)(document.body),$db:ge},typeof document<"u"?document.body:null);we(O);var y={db:ge,snap:$,unsnap:k,defineLegoFile:(e,t)=>Ke(y,e,t),block:(e,t,o={},s="",r="",n="")=>{let a=document.createElement("template");a.setAttribute("b-id",e),a.setAttribute("b-stylesheets",s),r&&a.setAttribute("b-cascade",r),n&&a.setAttribute("b-error",n),a.innerHTML=t,w[e]=a,I.set(e,o);try{let i={};z(o,i),oe.set(e.toLowerCase(),j(i,document.body))}catch(i){g.onError(i,"define",e)}if(customElements.get(e))document.querySelectorAll(e).forEach(i=>{k(i),$(i)}),T.forEach(i=>{i._legoShadow&&i._legoShadow.querySelectorAll(e).forEach(c=>{k(c),$(c)})});else try{customElements.define(e,class extends HTMLElement{connectedCallback(){R.locked||w[e]&&$(this)}disconnectedCallback(){k(this)}})}catch(i){console.warn(`[Lego] Failed to register web component ${e}:`,i)}},getActiveBlocksCount:()=>T.size,getLegos:()=>Object.keys(w),config:g,globals:O,route:(e,t,o=null)=>{let s=[],r=e==="*"?".*":e;r=r.replace(/:([^\/]+)|[.*+?^${}()|[\]\\]/g,(n,a)=>a?(s.push(a),"([^/]+)"):"\\"+n),Z.push({path:e,regex:new RegExp(`^${r}$`),tagName:t,paramNames:s,middleware:o})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,t={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),qe(t.styles||{}),g.loader=t.loader,g.debug=t.debug===!0,await je(),Z.length>0){let r=window.location.pathname,n=window.location.search,a=pe(r);if(a){let{match:i,params:c}=a,f=Object.fromEntries(new URLSearchParams(n));O.$route.url=r+n,O.$route.route=i.path,O.$route.params=c,O.$route.query=f,O.$route.method="GET",O.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(r=>{let n=r.getAttribute("b-id");w[n]=r,customElements.get(n)||customElements.define(n,class extends HTMLElement{connectedCallback(){R.locked||w[n]&&$(this)}disconnectedCallback(){k(this)}})});let o=r=>{if(!r)return{};let n={};return Object.entries(r).forEach(([a,i])=>{if(typeof i=="function")n[a]=i();else if(typeof i=="string"&&i.startsWith("$db.")){let c=i.slice(4);n[a]=y.db(c).get()}else if(typeof i=="string"&&i.startsWith("$globals.")){let c=i.slice(9);n[a]=_[c]}else n[a]=i}),n},s=(r,n,a={})=>{customElements.get(r)||customElements.define(r,class extends HTMLElement{async connectedCallback(){if(w[r]){R.locked||$(this);return}if(y._fetching||(y._fetching=new Set),y._pendingLazy||(y._pendingLazy={}),y._fetching.has(r)){y._pendingLazy[r]||(y._pendingLazy[r]=new Set),y._pendingLazy[r].add(this);return}y._fetching.add(r);try{let i=n.startsWith("POST:")?"POST":"GET",c=n.replace(/^POST:/,""),f=o(a.headers),d={method:i,headers:f,credentials:a.credentials},l=await(await fetch(c,d)).text();y.defineLegoFile(l,`${r}.lego`),w[r]&&$(this);let p=y._pendingLazy[r];p&&(p.forEach(S=>{S.isConnected&&w[r]&&!A(S).snapped&&$(S)}),delete y._pendingLazy[r])}catch(i){console.error(`[Lego] Failed to load manifest block ${r}:`,i)}finally{y._fetching.delete(r)}}disconnectedCallback(){k(this)}})};if(t.manifest){let r=t.manifest;if(r.url&&typeof r.url=="string")try{let a=o(r.headers);r=await(await fetch(r.url,{headers:a,credentials:r.credentials})).json()}catch(a){console.error("[Lego] Failed to load manifest:",a),r=[]}else if(typeof r=="string")try{r=await(await fetch(r)).json()}catch(a){console.error("[Lego] Failed to load manifest:",a),r=[]}let n=Array.isArray(r)?r:[r];for(let a of n){let i=a.base||"",c=a.suffix===!0?".lego":a.suffix||"",f={headers:a.headers||{},credentials:a.credentials};a.legos&&a.legos.forEach(d=>{s(d,`${i}${d}${c}`,f)}),a.map&&Object.entries(a.map).forEach(([d,u])=>{let l=u.match(/^https?:|^\//)?u:`${i}${u}`;s(d,l,f)})}}if(g.loader){let r=a=>{if(a.nodeType!==Node.ELEMENT_NODE)return;let i=a.tagName.toLowerCase();if(i.includes("-")&&!w[i]&&!T.has(a)){if(y._fetching&&y._fetching.has(i))return;y._fetching||(y._fetching=new Set),y._fetching.add(i);let c=g.loader(i);if(c){let f=typeof c=="string"?fetch(c).then(d=>d.text()):c;Promise.resolve(f).then(d=>{y.defineLegoFile(d,`${i}.lego`),y._fetching.delete(i)}).catch(d=>{console.error(`[Lego] Failed to load ${i}:`,d),y._fetching.delete(i)})}}if(a.children.length>0){let c=a.firstElementChild;for(;c;)r(c),c=c.nextElementSibling}};y._discoveryObserver&&y._discoveryObserver.disconnect(),y._discoveryObserver=new MutationObserver(a=>a.forEach(i=>{i.addedNodes.forEach(r)})),y._discoveryObserver.observe(e,{childList:!0,subtree:!0});let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(;n.nextNode();)r(n.currentNode)}if(t.studio){if(!w["lego-studio"]){let r=document.createElement("script");r.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",r.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(r)}y.route("/_/studio","lego-studio"),y.route("/_/studio/:block","lego-studio")}Z.length>0&&(window.addEventListener("popstate",r=>{let n=r.state?.legoTargets||null;ne(n)}),document.addEventListener("submit",r=>{r.preventDefault()}),document.addEventListener("click",r=>{let a=r.composedPath().find(i=>i.tagName==="A"&&(i.hasAttribute("b-target")||i.hasAttribute("b-link")));if(a){r.preventDefault();let i=a.getAttribute("href"),c=a.getAttribute("b-target"),f=c?c.split(/\s+/).filter(Boolean):[],d=a.getAttribute("b-link")!=="false";O.$go(i,...f).get(d)}}),ne()),Fe()}};typeof window<"u"?window.Lego=y:typeof global<"u"&&(global.Lego=y);var yo=y;})();
|
package/dist/lego.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var w={},
|
|
1
|
+
var w={},G=new WeakMap,W=new WeakMap,P=new WeakMap,re=new WeakMap,T=new Set,J=new Set,I=new Map,oe=new Map;var R={locked:!1},A=e=>(W.has(e)||W.set(e,{snapped:!1,bindings:null,bound:!1,rendering:!1,anchor:null}),W.get(e));var _={},we=e=>{_=e};var se=class{constructor(t=1e3){this.limit=t,this.cache=new Map}get(t){if(!this.cache.has(t))return;let o=this.cache.get(t);return this.cache.delete(t),this.cache.set(t,o),o}set(t,o){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.limit){let s=this.cache.keys().next().value;this.cache.delete(s)}this.cache.set(t,o)}get size(){return this.cache.size}clear(){this.cache.clear()}};var q=(e,t)=>{if(!e)return;let o=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;o;){let s=o.tagName?o.tagName.toLowerCase():"";if(s&&(t==="*"&&w[s]||s===t.toLowerCase()))return o;o=o.parentElement||o.getRootNode&&o.getRootNode().host}},xe=(e,t)=>{if(typeof e=="function"){let s=Array.from(document.querySelectorAll("*")).filter(r=>r.tagName.includes("-"));return[].concat(e(s))}if(e.startsWith("#")){let s=document.getElementById(e.slice(1));return s?[s]:[]}let o=t?.querySelectorAll(e)||[];return o.length>0?[...o]:[...document.querySelectorAll(e)]},F=e=>e.attributes?[...e.attributes].find(t=>t.name==="b-sync"||t.name.startsWith("b-sync.")):null,V=(e,t)=>{if(e.type==="checkbox")e.checked!==!!t&&(e.checked=!!t);else{let o=t==null?"":String(t);e.value!==o&&(e.value=o)}};var g={onError:(e,t,o)=>{console.error(`[Lego Error] [${t}]`,e,o)},metrics:{},debug:!1,syntax:"brackets"},z=(e,t)=>{!e||!t||Object.getOwnPropertyNames(e).forEach(o=>{let s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s)})},X=()=>g.syntax==="brackets"?["[[","]]"]:["{{","}}"],fe=new Map,Q=()=>{let[e,t]=X(),o=e+t;if(fe.has(o))return fe.get(o);let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`${s}(.*?)${r}`,"g");return fe.set(o,n),n},Se=e=>{let o=e.split("/").pop().replace(/\.lego$/,"").replace(/_/g,"-").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();if(!o.includes("-"))throw new Error(`[Lego] Invalid block definition: "${e}". Block names must contain a hyphen (e.g. user-card.lego or UserCard.lego).`);return o},C=(e,t)=>{if(!e)return"";let o=e.trim().split("."),s=t;for(let r of o){if(s==null)return"";s=s[r]}return s??""},de=e=>typeof Node<"u"&&e instanceof Node,B=(e,t,o)=>{if(t.nodeType!==Node.ELEMENT_NODE)return;let s=[...t.attributes].find(n=>n.name===e||n.name.startsWith(`${e}.`));if(!s)return;let r={};return o&&(r=o(s,t)),{type:e,node:t,expr:s.value,modifiers:s.name.split(".").slice(1),...r}};var ue=null,ve=e=>{ue=e},Z=[],pe=e=>{let t=Z.find(r=>r.regex.test(e));if(!t)return null;let o=e.match(t.regex).slice(1),s=t.paramNames?Object.fromEntries(t.paramNames.map((r,n)=>[r,o[n]])):{};return{match:t,params:s}},ne=async(e=null,t=null)=>{if(typeof window>"u")return;let o=window.location.pathname,s=pe(o);if(g.debug&&console.log("[Lego Trace] Matching route",o,s?.match),!s)return;let{match:r,params:n}=s;if(r.middleware&&!await r.middleware({path:o,params:n}))return;let a=e&&e.length?e:["lego-router"],i=t||document;r.tagName&&a.flatMap(f=>xe(f,i)).forEach(f=>{f&&(f.innerHTML=`<${r.tagName}></${r.tagName}>`,ue&&ue(f.firstElementChild))})},ae=(e,...t)=>o=>{let s=async(r,n=null,a=!0,i={})=>{if(a&&typeof history<"u"){let f={legoTargets:t.filter(d=>typeof d=="string"),method:r,body:n};history.pushState(f,"",e)}await ne(t.length?t:null,o)};return{get:(r=!0,n={})=>s("GET",null,r,n),post:(r,n=!0,a={})=>s("POST",r,n,a),put:(r,n=!0,a={})=>s("PUT",r,n,a),patch:(r,n=!0,a={})=>s("PATCH",r,n,a),delete:(r=!0,n={})=>s("DELETE",null,r,n)}};var _e=new se(1e3),N=(e,t,o=!0)=>{if(/\b(function|eval|import|class|module|deploy|constructor|__proto__|prototype)\b/.test(e)||/\[\s*['"`].*\+|\+.*['"`]\s*\]/.test(e)){console.warn(`[Lego] Security Warning: Blocked dangerous expression "${e}"`);return}try{let s=t.state||{},r=_e.get(e);r||(r=new Function("global","self","event","helpers",`
|
|
2
2
|
with(this) {
|
|
3
3
|
with(helpers) {
|
|
4
4
|
return ${e}
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
`),we.set(e,s));let n={$ancestors:a=>F(r.self,a),$registry:a=>Z.get(a.toLowerCase()),$element:r.self,$route:x.$route,$go:(a,...c)=>re(a,...c)(r.self),$db:x.$db,$emit:(a,c)=>{r.self.dispatchEvent(new CustomEvent(a,{detail:c,bubbles:!0,composed:!0}))}},i=s.call(o,r.global,r.self,r.event,n);return typeof i=="function"?i.call(o,r.event):i}catch(o){if(t)throw o;f.onError(o,"render-error",r.self);return}},le=(e,r={})=>{if(!e||e.trim()==="{}")return{};let t=o=>new Function("scope","global",`with(global) { with(scope) { return (${o}); } }`)(r,x);try{return t(e)}catch(o){let s=e.trim();if(!s.startsWith("{")&&s.includes(":"))try{return t(`{${e}}`)}catch{}return console.error(`[Lego] Error parsing b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,o),{}}};var Ne={name:"b-if",scan:(e,{checkGlobal:r,getPrivateData:t})=>k("b-if",e,(o,s)=>{r(o.value);let n=document.createComment(`b-if: ${o.value}`),i=t(s);return i.anchor=n,{anchor:n}}),execute({binding:e,state:r,global:t}){let{node:o,anchor:s,expr:n}=e,i=!!N(n,{state:r,global:t,self:o}),a=!!o.parentNode;i&&!a?s.parentNode&&s.parentNode.replaceChild(o,s):!i&&a&&o.parentNode.replaceChild(s,o)}};var xe={name:"b-show",scan(e,{checkGlobal:r}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let t=e.getAttribute("b-show");return r(t),{type:"b-show",node:e,expr:t}}},execute({binding:e,state:r,global:t}){let{node:o,expr:s}=e;o.style.display=N(s,{state:r,global:t,self:o})?"":"none"}};var ve={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:r}){let{node:t,path:o}=e;t.textContent=C(o,r)}};var Se={name:"b-html",scan:e=>k("b-html",e),execute:({binding:e,state:r,global:t})=>{let{node:o,expr:s}=e;o.innerHTML=N(s,{state:r,global:t,self:o})||""}};var Le={name:"b-sync",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-sync"))return{type:"b-sync",node:e}},execute({binding:e,state:r}){let{node:t}=e;ee(t,C(t.getAttribute("b-sync"),r))}};var $e={name:"b-for",scan(e,{checkGlobal:r,pendingOperations:t}){if(e.nodeType!==Node.ELEMENT_NODE)return;let o=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(o){r(o[2]);let s=document.createComment(`b-for: ${o[1]} in ${o[2].trim()}`);return t.push(()=>{e.parentNode&&(e.parentNode.insertBefore(s,e),e.remove())}),{type:"b-for",anchor:s,itemName:o[1],listName:o[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0)}}},execute({binding:e,state:r,global:t,helpers:o}){let{bind:s,updateNodeBindings:n}=o;if(!s||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:i,listName:a,itemName:c,keyPath:l,template:m}=e,{contextEl:g}=o,d=N(a,{state:r,global:t,self:g})||[];M.has(i)||M.set(i,new Map);let p=M.get(i),b=new Set,h=[];d.forEach((u,v)=>{let y;l?(y=C(l,u),y===void 0&&console.warn(`[Lego] b-key="${l}" resolved to undefined for item at index ${v}. Check for typos.`)):u&&typeof u=="object"?(y=u.id||u._id||u.uuid||u.key,y===void 0&&(Q.has(u)||Q.set(u,Math.random()),y=Q.get(u))):y=`${v}-${u}`,b.add(y);let A=p.get(y);A||(A=m.cloneNode(!0),A.removeAttribute("b-for"),A.removeAttribute("b-key"),p.set(y,A),s(A,g,{name:c,listName:a,index:v}));let Ie=Object.assign(Object.create(r),{[c]:u,$index:v});n(A,Ie),A.querySelectorAll("[b-sync]").forEach(me=>{let ge=me.getAttribute("b-sync");if(ge.startsWith(`${c}.`)){let qe=N(a,{state:r,global:t,self:g});ee(me,C(ge.split(".").slice(1).join("."),qe[v]))}}),h.push(A)});let E=i.nextSibling;h.forEach(u=>{u!==E?i.parentNode.insertBefore(u,E):E=E.nextSibling});for(let[u,v]of p.entries())b.has(u)||(v.remove(),p.delete(u))}};var _e={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:r})=>{e.initialized||(e.initialized=!0,N(e.expr,{state:r}))}};var Te={name:"b-enter",scan:e=>k("b-enter",e,(r,t)=>({modifiers:r.name.split(".").slice(1)})),execute:({binding:e,state:r})=>{if(e.observer||e.done)return;let t=new IntersectionObserver((o,s)=>{o[0].isIntersecting&&(N(e.expr,{state:r}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});t.observe(e.node),e.observer=t},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Ae={scan:e=>k("b-leave",e),execute:({binding:e,state:r})=>{if(e.observer||e.done)return;let t=new IntersectionObserver((o,s)=>{let n=o[0];n.isIntersecting&&(e.activated=!0),!n.isIntersecting&&e.activated&&(N(e.expr,{state:r}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});t.observe(e.node),e.observer=t},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var J={"b-if":Ne,"b-show":xe,"b-text":ve,"b-html":Se,"b-sync":Le,"b-for":$e,"b-init":_e,"b-enter":Te,"b-leave":Ae};var Ke=(e=null)=>{let r=!1,t=new Set,o=!1,s=e,n=new Set,i=null,a=new Set,c=d=>{s=d},l=()=>{i&&clearTimeout(i),i=setTimeout(()=>{a.forEach(d=>{let p=d._studs;if(p&&typeof p.updated=="function")try{p.updated.call(p)}catch(b){console.error("[Lego] Error in updated hook:",b)}}),a.clear(),i=null},50)},m=()=>{n.size>0&&(n.forEach(d=>t.add(d)),n.clear(),!r&&t.size>0&&(r=!0,requestAnimationFrame(g)))},g=()=>{o=!0;let d=Array.from(t);t.clear(),r=!1,d.forEach(p=>{p.isConnected&&s&&s(p)}),d.forEach(p=>a.add(p)),l(),o=!1,m()};return{add:d=>{if(d){if(o){n.add(d);return}t.add(d),!r&&(r=!0,requestAnimationFrame(g))}},setHandler:c}},oe=Ke();var $=new Map,se=new Map,V=new WeakMap,X=new Map,Ue=e=>{let r=Array.from(X.entries()).filter(([s])=>s.startsWith("lego:")).sort((s,n)=>s[1].timestamp-n[1].timestamp),t=0,o=[];for(let[s,n]of r){if(t>=e)break;try{localStorage.removeItem(s),t+=n.size,o.push(s),X.delete(s)}catch(i){console.error(`[Lego] Failed to evict ${s}:`,i)}}return o},Me=(e,r,t)=>{f.debug&&console.log("[Lego Trace] scheduleSave",e,r,t),se.has(e)&&clearTimeout(se.get(e));let o=()=>{try{let s=JSON.stringify(r),n=new Blob([s]).size;localStorage.setItem(e,s);let i=e.startsWith("lego:")?e:`lego:${e}`;X.set(i,{timestamp:Date.now(),size:n}),se.delete(e)}catch(s){if(s.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(r),i=new Blob([n]).size,a=Ue(i*2);if(a.length>0){f.debug&&console.log(`[Lego] Evicted ${a.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;X.set(c,{timestamp:Date.now(),size:i})}else f.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{f.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,s)}};t>0?se.set(e,setTimeout(o,t)):o()},ue=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(t){return this._default=t,this},debounce(t){return this._debounce=t,this},set(t,o=0){return Me(e,t,o),$.has(e)&&$.get(e).forEach(({target:s,prop:n,el:i,batcher:a})=>{s[n]=t,i&&a&&a.add(i)}),t},get(){try{let t=localStorage.getItem(e);return t!==null?JSON.parse(t):null}catch(t){return console.warn(`[Lego] Failed to get localStorage value for key "${e}":`,t),null}},delete(){try{return localStorage.removeItem(e),X.delete(e.startsWith("lego:")?e:`lego:${e}`),$.has(e)&&$.get(e).forEach(({target:t,prop:o,el:s,batcher:n})=>{t[o]=null,s&&n&&n.add(s)}),!0}catch(t){return console.error(`[Lego] Failed to delete localStorage key "${e}":`,t),!1}}}),ke=e=>e&&e.__type==="lego-db",Ce=(e,r,t,o,s)=>{f.debug&&console.log("[Lego Trace] Reactive DB Init:",r,t);let n=t._default;try{let i=localStorage.getItem(t.key);i!==null&&(n=JSON.parse(i))}catch(i){console.warn(`[Lego] Failed to parse localStorage value for key "${t.key}":`,i)}e[r]=n,V.has(e)||V.set(e,{}),V.get(e)[r]={key:t.key,debounce:t._debounce},f.debug&&console.log("[Lego Trace] DB Metadata Set:",r,V.get(e)[r]),$.has(t.key)||$.set(t.key,new Set),$.get(t.key).add({target:e,prop:r,el:o,batcher:s})},Oe=(e,r,t)=>{let o=V.get(e);if(o&&o[r]){let s=o[r].key;Me(s,t,o[r].debounce),$.has(s)&&$.get(s).forEach(({target:n,prop:i,el:a,batcher:c})=>{n!==e&&(n[i]=t,a&&c&&c.add(a))})}},De=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!$.has(e.key)))try{let r=JSON.parse(e.newValue);$.get(e.key).forEach(({target:t,prop:o,el:s,batcher:n})=>{t[o]=r,s&&n&&n.add(s)})}catch(r){console.warn("[Lego] Cross-tab sync error:",r)}})};var z=(e,r,t=oe)=>{if(e===null||typeof e!="object"||ae(e))return e;if(q.has(e))return q.get(e);for(let n in e){let i=Object.getOwnPropertyDescriptor(e,n);if(i&&i.get)continue;let a=e[n];ke(a)&&Ce(e,n,a,r,t)}let o={get:(n,i)=>{let a=Reflect.get(n,i);return a!==null&&typeof a=="object"&&!ae(a)?z(a,r,t):a},set:(n,i,a,c)=>{let l=n[i];f.debug&&l!==a&&console.log("[Lego Trace] Reactive SET:",i,"Old:",l,"New:",a,"Target:",n);let m=Reflect.set(n,i,a,c);return c===q.get(n)&&l!==a&&(t.add(r),Oe(n,i,a)),m},deleteProperty:(n,i)=>{let a=Reflect.deleteProperty(n,i);return t.add(r),a}},s=new Proxy(e,o);return q.set(e,s),s};var je=e=>{let r=e;for(;r;){let t=r.getAttribute&&r.getAttribute("b-error");if(t)return{errorTag:t,targetElement:r};let o=r.tagName?r.tagName.toLowerCase():"",s=w[o];if(s){let n=s.getAttribute("b-error");if(n)return{errorTag:n,targetElement:r}}r=r.parentElement||r.getRootNode&&r.getRootNode().host}return null},de=null,fe=null,Be=(e,r)=>{de=e,fe=r},Ge=(e,r,t)=>{if(!de||!fe){console.error("[Lego] Error boundary dependencies not loaded",t);return}try{r.shadowRoot?r.shadowRoot.innerHTML="":r.innerHTML="";let o=document.createElement(e);(r.shadowRoot||r).appendChild(o),de(o),o._studs&&(o._studs.$error={message:t.message,stack:t.stack,component:r.tagName.toLowerCase()},fe(o))}catch(o){console.error("[Lego] Error boundary failed to render:",o),console.error("[Lego] Original error:",t)}},W=(e,r,t)=>{let o=je(r);o?Ge(o.errorTag,o.targetElement,e):f.onError(e,t,r)};var H=(e,r,t=null)=>{let o=r._studs,s=a=>{let c=_(a);if(!c.bound){if(a.hasAttributes()){let l=a.attributes;for(let m=0;m<l.length;m++){let g=l[m];if(g.name.startsWith("@")){let d=g.name.slice(1).split("."),p=d[0],b=d.slice(1);a.addEventListener(p,h=>{if(b.includes("prevent")&&h.preventDefault(),b.includes("stop")&&h.stopPropagation(),!(b.includes("self")&&h.target!==h.currentTarget)){if(typeof KeyboardEvent<"u"&&h instanceof KeyboardEvent){if(b.includes("ctrl")&&!h.ctrlKey||b.includes("alt")&&!h.altKey||b.includes("shift")&&!h.shiftKey||b.includes("meta")&&!h.metaKey)return;let E=b.filter(u=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(u));if(E.length>0){let u=h.key.toLowerCase();if(!E.some(y=>y==="enter"?u==="enter":y==="esc"||y==="escape"?u==="escape":y==="space"?u===" ":y==="tab"?u==="tab":y==="delete"?u==="delete":y==="backspace"?u==="backspace":y==="up"?u==="arrowup":y==="down"?u==="arrowdown":y==="left"?u==="arrowleft":y==="right"?u==="arrowright":y==="alpha"?/^[a-z]$/.test(u):y==="numbers"?/^[0-9]$/.test(u):y===u))return}}try{let E=o;if(t){let v=N(t.listName,{state:o,global:x,self:r})[t.index];E=Object.assign(Object.create(o),{[t.name]:v})}N(g.value,{state:E,global:x,self:a,event:h,$event:h},!0)}catch(E){W(E,r,"event-handler")}}})}}if(a.hasAttribute("b-sync")){let m=a.getAttribute("b-sync"),g=()=>{try{let d,p;if(t&&m.startsWith(`${t.name}.`)){let E=N(t.listName,{state:o,global:x,self:r})[t.index];if(!E)return;let u=m.split(".").slice(1);p=u.pop(),d=u.reduce((v,y)=>v[y],E)}else{let h=m.split(".");p=h.pop(),d=h.reduce((E,u)=>E[u],o)}let b=a.type==="checkbox"?a.checked:a.value;d&&d[p]!==b&&(d[p]=b)}catch(d){f.onError(d,"sync-update",a)}};a.addEventListener("input",g),a.addEventListener("change",g)}if(a.hasAttribute("b-var")){let m=a.getAttribute("b-var");o.$vars&&(o.$vars[m]=a)}}c.bound=!0}};e instanceof Element&&s(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),i;for(;i=n.nextNode();)s(i)},Je=e=>{let r=[],t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),o,s=[];for(;o=t.nextNode();){let n=o;if((c=>{let l=c.parentNode;for(;l&&l!==e;){if(l.hasAttribute&&l.hasAttribute("b-for"))return!0;l=l.parentNode}return!1})(o))continue;let a=c=>{if(/\bglobal\b/.test(c)){let l=e.host||e;K.add(l)}};if(o.nodeType===Node.ELEMENT_NODE){for(let[l,m]of Object.entries(J))if(m.scan){let g=m.scan(o,{checkGlobal:a,getPrivateData:_,pendingOperations:s,current:n});g&&r.push(g)}let[c]=U();[...o.attributes].forEach(l=>{l.value.includes(c)&&(a(l.value),r.push({type:"attr",node:o,attrName:l.name,template:l.value}))})}else if(o.nodeType===Node.TEXT_NODE){let[c]=U();o.textContent.includes(c)&&(a(o.textContent),r.push({type:"text",node:o,template:o.textContent}))}}return s.forEach(n=>n()),r},Ve=(e,r)=>{let t=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let i=n._tpl.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:n})??"");n.textContent!==i&&(n.textContent=i)}else if(n.nodeType===Node.ELEMENT_NODE){let[i]=U();[...n.attributes].forEach(a=>{if(a._tpl===void 0&&(a._tpl=a.value),a._tpl.includes(i)){let c=a._tpl.replace(j(),(l,m)=>N(m.trim(),{state:r,global:x,self:n})??"");a.value!==c&&(a.value=c,a.name==="class"&&(n.className=c))}})}};t(e);let o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s;for(;s=o.nextNode();)t(s)},O=e=>{f.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let r=e._studs;if(!r)return;let t=_(e);if(!t.rendering){t.rendering=!0,f.metrics&&f.metrics.onRenderStart&&f.metrics.onRenderStart(e);try{let o=e.shadowRoot||e;t.bindings||(t.bindings=Je(o)),t.bindings.forEach(s=>{let n=J[s.type];if(n){n.execute({binding:s,state:r,global:x,helpers:{bind:H,updateNodeBindings:Ve,contextEl:e}});return}if(s.type==="text"){let i=s.template.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:s.node})??"");s.node.textContent!==i&&(s.node.textContent=i)}if(s.type==="attr"){let i=s.template.replace(j(),(a,c)=>N(c.trim(),{state:r,global:x,self:s.node})??"");s.node.getAttribute(s.attrName)!==i&&(s.node.setAttribute(s.attrName,i),s.attrName==="class"&&(s.node.className=i))}}),r===x&&K.forEach(s=>O(s))}catch(o){W(o,e,"render")}finally{f.metrics&&f.metrics.onRenderEnd&&f.metrics.onRenderEnd(e),t.rendering=!1}}};var Re=new Map,Pe={},Fe=e=>{Pe=e},ze=async()=>{let e=Object.entries(Pe).map(async([r,t])=>{let o=await Promise.all(t.map(async s=>{try{if(s instanceof CSSStyleSheet)return s;let n=await fetch(s);if(!n.ok)throw new Error(`Status ${n.status}`);let i=await n.text(),a=new CSSStyleSheet;return await a.replace(i),a}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${s}`,n),null}}));Re.set(r,o.filter(s=>s!==null))});await Promise.all(e),f.debug&&console.log("[Lego Debug] Re-applying stylesheets to",L.size,"blocks"),L.forEach(r=>{pe(r)})},pe=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let r=e.shadowRoot||e._legoShadow,t=e.tagName.toLowerCase(),o=w[t],s=(o&&o.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),i=[],a=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;a;){let g=(a.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);g.length&&i.push(...g);let d=a.tagName?a.tagName.toLowerCase():"";if(w[d]){let p=(w[d].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);p.length&&i.push(...p)}a=a.parentElement||a.getRootNode&&a.getRootNode().host}let c=[...new Set([...s,...n])],l=[...new Set(i)],m=[...new Set([...l,...c])];if(m.length>0){let g=m.flatMap(d=>Re.get(d)||[]);g.length>0&&f.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",m,"- Sheets:",g.length),g.length>0&&(r.adoptedStyleSheets=[...g])}e._studsMeta={stylesheets:{explicit:c,inherited:l,applied:m}}};var S=e=>{if(f.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let r=_(e),t=e.tagName.toLowerCase(),o=w[t];if(o&&!r.snapped){r.snapped=!0;let n=o.content.cloneNode(!0),i=e.shadowRoot;i?i.innerHTML="":i=e.attachShadow({mode:"open"}),pe(e);let a=F(e,"*")||F(e.getRootNode().host,"*"),c=a&&a.state?a.state:{},l=R.get(t)||{},m=le(o.getAttribute("b-logic")||"{}"),g=le(e.getAttribute("b-logic")||"{}",c),d={$vars:{},$element:e,get $parent(){return F(e,"*")},$emit:(h,E)=>{e.dispatchEvent(new CustomEvent(h,{detail:E,bubbles:!0,composed:!0}))},get $route(){return x.$route},get $go(){return x.$go}};P(l,d),P(m,d),P(g,d),e._studs=z(d,e),Object.defineProperty(e,"state",{get(){return this._studs},set(h){Object.assign(this._studs,h)},configurable:!0,enumerable:!1}),i.appendChild(n);let p=i.querySelector("style");p&&(p.textContent=p.textContent.replace(/\bself\b/g,":host")),H(i,e),L.add(e),O(e),e.setAttribute("b-id",t);let b=i.querySelectorAll("*");if(f.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",b.length),b.forEach(h=>{let E=h.tagName.toLowerCase(),u=!!w[E];u&&f.debug&&console.log("[Lego Debug] Checking",E,"- Registered:",u),u&&S(h)}),e._legoShadow||(e._legoShadow=i),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(h){W(h,e,"mounted")}}let s=e.parentElement;for(;s&&!s._studs;)s=s.parentElement;s&&s._studs&&H(e,s),[...e.children].forEach(S)},I=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(t){W(t,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(I),L.delete(e),K.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(t=>{e._studs.$vars[t]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let r=B.get(e);if(r&&(r.bindings&&(r.bindings.forEach(t=>{let o=J[t.type];if(o&&o.destroy)try{o.destroy({binding:t})}catch(s){console.error(`[Lego] Error in directive cleanup (${t.type}):`,s)}t.node=null,t.anchor=null}),r.bindings=null),r.anchor=null,B.delete(e)),M.has(e)){let t=M.get(e);t.forEach((o,s)=>{o&&o._studs&&(o._studs=null)}),t.clear(),M.delete(e)}[...e.children].forEach(I)};function We(e,r="block.lego"){let t={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:be(r)},o=e,s=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;o;){let n=o.match(s);if(!n)break;let i=n[1].toLowerCase(),a=n[2],c=n[0],l=n.index,m=`</${i}>`,g=l+c.length,d=o.indexOf(m,g);if(d===-1){console.warn(`[Lego] Unclosed <${i}> tag in ${r}`);break}let p=o.slice(g,d);if(i==="template"){t.template=p.trim();let b=a.match(/b-stylesheets=["']([^"']+)["']/);b&&(t.stylesAttr=b[1]);let h=a.match(/b-cascade=["']([^"']+)["']/);h&&(t.cascadeAttr=h[1]);let E=a.match(/b-error=["']([^"']+)["']/);E&&(t.errorAttr=E[1])}else if(i==="script"){t.script=p.trim();let b=a.match(/lang=["']([^"']+)["']/);b&&(t.scriptLang=b[1])}else i==="style"&&(t.style=p.trim());o=o.slice(d+m.length)}return t}var He=(e,r,t="block.lego")=>{let o=We(r,t),{blockName:s,template:n,script:i,style:a,stylesAttr:c,cascadeAttr:l,errorAttr:m}=o,g={};if(i)try{let p=i.trim(),b=p.match(/export\s+default\s+({[\s\S]*})/),h=b?b[1]:p;g=new Function("Lego","$db",`return ${h}`)(e,e.globals.$db)}catch(p){f.onError(p,"script",s)}let d=n;a&&(d=`<style>${a}</style>`+d),w[s]=document.createElement("template"),w[s].innerHTML=d,c&&w[s].setAttribute("b-stylesheets",c),l&&w[s].setAttribute("b-cascade",l),m&&w[s].setAttribute("b-error",m),R.set(s,g),document.querySelectorAll(s).forEach(p=>!_(p).snapped&&S(p))};oe.setHandler(O);Be(S,O);Ee(S);var Xe={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},T=z({$route:Xe,$go:(e,...r)=>re(e,...r)(document.body),$db:ue},typeof document<"u"?document.body:null);he(T);var D={db:ue,snap:S,unsnap:I,defineLegoFile:(e,r)=>He(D,e,r),block:(e,r,t={},o="",s="",n="")=>{let i=document.createElement("template");i.setAttribute("b-id",e),i.setAttribute("b-stylesheets",o),s&&i.setAttribute("b-cascade",s),n&&i.setAttribute("b-error",n),i.innerHTML=r,w[e]=i,R.set(e,t);try{let a={};P(t,a),Z.set(e.toLowerCase(),z(a,document.body))}catch(a){f.onError(a,"define",e)}document.querySelectorAll(e).forEach(S),[...L].forEach(a=>{a.tagName.toLowerCase()===e.toLowerCase()&&(f.debug&&console.log("[Lego HMR] Reloading",e),I(a),S(a))}),L.forEach(a=>{a._legoShadow&&a._legoShadow.querySelectorAll(e).forEach(c=>{_(c).snapped||(f.debug&&console.log("[Lego Debug] Lazy-initializing",e,"in",a.tagName),S(c))})})},getActiveBlocksCount:()=>L.size,getLegos:()=>Object.keys(w),config:f,globals:T,route:(e,r,t=null)=>{let o=[],s=e==="*"?".*":e;s=s.replace(/:([^\/]+)/g,(n,i)=>(o.push(i),"([^/]+)")),G.push({path:e,regex:new RegExp(`^${s}$`),tagName:r,paramNames:o,middleware:t})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,r={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),Fe(r.styles||{}),f.loader=r.loader,f.debug=r.debug===!0,await ze(),G.length>0){let n=window.location.pathname,i=window.location.search,a=ce(n);if(a){let{match:c,params:l}=a,m=Object.fromEntries(new URLSearchParams(i));T.$route.url=n+i,T.$route.route=c.path,T.$route.params=l,T.$route.query=m,T.$route.method="GET",T.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(n=>{w[n.getAttribute("b-id")]=n});let t=n=>{if(n.nodeType!==Node.ELEMENT_NODE)return;S(n);let i=n.tagName.toLowerCase();if(i.includes("-")&&!w[i]&&f.loader&&!L.has(n)){let a=f.loader(i);if(a){let c=typeof a=="string"?fetch(a).then(l=>l.text()):a;Promise.resolve(c).then(l=>D.defineLegoFile(l,`${i}.lego`)).catch(l=>console.error(`[Lego] Failed to load ${i}:`,l))}}};new MutationObserver(n=>n.forEach(i=>{i.addedNodes.forEach(t),i.removedNodes.forEach(a=>a.nodeType===Node.ELEMENT_NODE&&I(a))})).observe(e,{childList:!0,subtree:!0});let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(t(e);s.nextNode();)t(s.currentNode);if(e._studs=T,H(e,e),O(e),r.studio){if(!w["lego-studio"]){let n=document.createElement("script");n.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",n.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(n)}D.route("/_/studio","lego-studio"),D.route("/_/studio/:block","lego-studio")}G.length>0&&(window.addEventListener("popstate",n=>{let i=n.state?.legoTargets||null;te(i)}),document.addEventListener("submit",n=>{n.preventDefault()}),document.addEventListener("click",n=>{let a=n.composedPath().find(c=>c.tagName==="A"&&(c.hasAttribute("b-target")||c.hasAttribute("b-link")));if(a){n.preventDefault();let c=a.getAttribute("href"),l=a.getAttribute("b-target"),m=l?l.split(/\s+/).filter(Boolean):[],g=a.getAttribute("b-link")!=="false";T.$go(c,...m).get(g)}}),te()),De()}};typeof window<"u"?window.Lego=D:typeof global<"u"&&(global.Lego=D);var go=D;export{D as Lego,go as default};
|
|
7
|
+
`),_e.set(e,r));let n={$ancestors:i=>q(t.self,i),$registry:i=>oe.get(i.toLowerCase()),$element:t.self,$route:_.$route,$params:_.$route?.params||{},$go:(i,...c)=>ae(i,...c)(t.self),$db:_.$db,$emit:(i,c)=>{t.self.dispatchEvent(new CustomEvent(i,{detail:c,bubbles:!0,composed:!0}))}},a=r.call(s,t.global,t.self,t.event,n);return typeof a=="function"?a.call(s,t.event):a}catch(s){if(o)throw s;if(s instanceof ReferenceError)return;throw s}},me=(e,t={})=>{if(!e||e.trim()==="{}")return{};let o=s=>new Function("scope","global",`with(global) { with(scope) { return (${s}); } }`)(t,_);try{return o(e)}catch(s){let r=e.trim();if(!r.startsWith("{")&&r.includes(":"))try{return o(`{${e}}`)}catch{}return console.error(`[Lego] Error parsing b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,s),{}}};var Ne={name:"b-if",scan:(e,{checkGlobal:t,getPrivateData:o})=>B("b-if",e,(s,r)=>{t(s.value);let n=document.createComment(`b-if: ${s.value}`),a=o(r);return a.anchor=n,{anchor:n}}),execute({binding:e,state:t,global:o}){let{node:s,anchor:r,expr:n}=e,a=!!N(n,{state:t,global:o,self:s}),i=!!s.parentNode;a&&!i?r.parentNode&&r.parentNode.replaceChild(s,r):!a&&i&&s.parentNode.replaceChild(r,s)},destroy({binding:e}){e.anchor&&e.anchor.parentNode&&e.anchor.remove()}};var $e={name:"b-show",scan(e,{checkGlobal:t}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let o=e.getAttribute("b-show");return t(o),{type:"b-show",node:e,expr:o}}},execute({binding:e,state:t,global:o}){let{node:s,expr:r}=e;s.style.display=N(r,{state:t,global:o,self:s})?"":"none"}};var Le={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:t,global:o}){let{node:s,path:r}=e;r.startsWith("global.")?s.textContent=C(r.slice(7),o)??"":s.textContent=C(r,t)??""}};var Te={name:"b-html",scan:e=>B("b-html",e),execute:({binding:e,state:t,global:o})=>{let{node:s,expr:r}=e,n=N(r,{state:t,global:o,self:s})||"";s._bHtmlPrev!==n&&(s._bHtmlPrev=n,s.innerHTML=n)},destroy({binding:e}){let{node:t}=e;t&&(delete t._bHtmlPrev,t.innerHTML="")}};var Ae={name:"b-sync",scan(e){if(e.nodeType!==Node.ELEMENT_NODE)return;let t=F(e);if(!t)return;let o=t.name.split(".").slice(1);return{type:"b-sync",node:e,expr:t.value,modifiers:o}},execute({binding:e,state:t,global:o}){let{node:s,expr:r}=e;r.startsWith("global.")?V(s,C(r.slice(7),o)??""):V(s,C(r,t)??"")},destroy({binding:e}){let{node:t}=e;t&&t._bSyncHandler&&(t.removeEventListener("input",t._bSyncHandler),t.removeEventListener("change",t._bSyncHandler),delete t._bSyncHandler)}};var Ce={name:"b-for",scan(e,{checkGlobal:t,pendingOperations:o}){if(e.nodeType!==Node.ELEMENT_NODE)return;let s=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(s){t(s[2]);let r=document.createComment(`b-for: ${s[1]} in ${s[2].trim()}`);return o.push(()=>{e.parentNode&&(e.parentNode.insertBefore(r,e),e.remove())}),{type:"b-for",anchor:r,itemName:s[1],listName:s[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0),terminal:!0}}},execute({binding:e,state:t,global:o,helpers:s}){let{bind:r,updateNodeBindings:n}=s;if(!r||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:a,listName:i,itemName:c,keyPath:f,template:d}=e,{contextEl:u}=s,l=N(i,{state:t,global:o,self:u})||[];P.has(a)||P.set(a,new Map);let p=P.get(a),S=new Set,x=[];l.forEach((m,b)=>{let v;f?(v=C(f,m),(v==null||v==="")&&(console.warn(`[Lego] b-key="${f}" could not resolve a value for item at index ${b}. Falling back to index-based key.`),v=`__bfor_${b}`)):m&&typeof m=="object"?(v=m.id||m._id||m.uuid||m.key,v===void 0&&(re.has(m)||re.set(m,Math.random()),v=re.get(m))):v=`${b}-${m}`,S.add(v);let h=p.get(v);h?h._loopCtx.index=b:(h=d.cloneNode(!0),h.removeAttribute("b-for"),h.removeAttribute("b-key"),p.set(v,h),h._loopCtx={name:c,listName:i,index:b},r(h,u,h._loopCtx));let M=Object.assign(Object.create(t),{[c]:m,$index:b});n(h,M),[h,...h.querySelectorAll("*")].filter(H=>F(H)).forEach(H=>{let Ee=F(H).value;Ee.startsWith(`${c}.`)&&V(H,C(Ee.split(".").slice(1).join("."),l[b]))}),x.push(h)});let E=a.nextSibling;x.forEach(m=>{m!==E?a.parentNode.insertBefore(m,E):E=E.nextSibling});for(let[m,b]of p.entries())S.has(m)||(b.remove(),p.delete(m))},destroy({binding:e}){let{anchor:t}=e;if(t&&P.has(t)){let o=P.get(t);o.forEach(s=>s.remove()),o.clear(),P.delete(t)}t&&t.parentNode&&t.remove()}};var ke={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:t,global:o})=>{e.initialized||(e.initialized=!0,N(e.expr,{state:t,global:o,self:e.node}))}};var Oe={name:"b-enter",scan:e=>B("b-enter",e,(t,o)=>({modifiers:t.name.split(".").slice(1)})),execute:({binding:e,state:t,global:o})=>{if(e.observer||e.done)return;let s=new IntersectionObserver((r,n)=>{r[0].isIntersecting&&(N(e.expr,{state:t,global:o,self:e.node}),e.modifiers.includes("once")&&(n.disconnect(),e.observer=null,e.done=!0))});s.observe(e.node),e.observer=s},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Me={name:"b-leave",scan:e=>B("b-leave",e),execute:({binding:e,state:t,global:o})=>{if(e.observer||e.done)return;let s=new IntersectionObserver((r,n)=>{let a=r[0];a.isIntersecting&&(e.activated=!0),!a.isIntersecting&&e.activated&&(N(e.expr,{state:t,global:o,self:e.node}),e.modifiers.includes("once")&&(n.disconnect(),e.observer=null,e.done=!0))});s.observe(e.node),e.observer=s},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Y={"b-if":Ne,"b-show":$e,"b-text":Le,"b-html":Te,"b-sync":Ae,"b-for":Ce,"b-init":ke,"b-enter":Oe,"b-leave":Me};var Ge=(e=null)=>{let t=!1,o=new Set,s=!1,r=e,n=new Set,a=null,i=new Set,c=l=>{r=l},f=()=>{a&&clearTimeout(a),a=setTimeout(()=>{i.forEach(l=>{let p=l._studs;if(p&&typeof p.updated=="function")try{p.updated.call(p)}catch(S){console.error("[Lego] Error in updated hook:",S)}}),i.clear(),a=null},50)},d=()=>{n.size>0&&(n.forEach(l=>o.add(l)),n.clear(),!t&&o.size>0&&(t=!0,requestAnimationFrame(u)))},u=()=>{s=!0;let l=Array.from(o);o.clear(),t=!1,l.forEach(p=>{p.isConnected&&r&&r(p)}),l.forEach(p=>i.add(p)),f(),s=!1,d()};return{add:l=>{if(l){if(s){n.add(l);return}o.add(l),!t&&(t=!0,requestAnimationFrame(u))}},setHandler:c}},ie=Ge();var L=new Map,ce=new Map,ee=new WeakMap,te=new Map,Je=e=>{let t=Array.from(te.entries()).filter(([r])=>r.startsWith("lego:")).sort((r,n)=>r[1].timestamp-n[1].timestamp),o=0,s=[];for(let[r,n]of t){if(o>=e)break;try{localStorage.removeItem(r),o+=n.size,s.push(r),te.delete(r)}catch(a){console.error(`[Lego] Failed to evict ${r}:`,a)}}return s},Be=(e,t,o)=>{g.debug&&console.log("[Lego Trace] scheduleSave",e,t,o),ce.has(e)&&clearTimeout(ce.get(e));let s=()=>{try{let r=JSON.stringify(t),n=new Blob([r]).size;localStorage.setItem(e,r);let a=e.startsWith("lego:")?e:`lego:${e}`;te.set(a,{timestamp:Date.now(),size:n}),ce.delete(e)}catch(r){if(r.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(t),a=new Blob([n]).size,i=Je(a*2);if(i.length>0){g.debug&&console.log(`[Lego] Evicted ${i.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;te.set(c,{timestamp:Date.now(),size:a})}else g.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{g.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,r)}};o>0?ce.set(e,setTimeout(s,o)):s()},ge=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(o){return this._default=o,this},debounce(o){return this._debounce=o,this},set(o,s=0){return Be(e,o,s),L.has(e)&&L.get(e).forEach(({target:r,prop:n,el:a,batcher:i})=>{r[n]=o,a&&i&&i.add(a)}),o},get(){try{let o=localStorage.getItem(e);return o!==null?JSON.parse(o):null}catch(o){return console.warn(`[Lego] Failed to get localStorage value for key "${e}":`,o),null}},delete(){try{return localStorage.removeItem(e),te.delete(e.startsWith("lego:")?e:`lego:${e}`),L.has(e)&&L.get(e).forEach(({target:o,prop:s,el:r,batcher:n})=>{o[s]=null,r&&n&&n.add(r)}),!0}catch(o){return console.error(`[Lego] Failed to delete localStorage key "${e}":`,o),!1}}}),De=e=>e&&e.__type==="lego-db",Pe=(e,t,o,s,r)=>{g.debug&&console.log("[Lego Trace] Reactive DB Init:",t,o);let n=o._default;try{let a=localStorage.getItem(o.key);a!==null&&(n=JSON.parse(a))}catch(a){console.warn(`[Lego] Failed to parse localStorage value for key "${o.key}":`,a)}e[t]=n,ee.has(e)||ee.set(e,{}),ee.get(e)[t]={key:o.key,debounce:o._debounce},g.debug&&console.log("[Lego Trace] DB Metadata Set:",t,ee.get(e)[t]),L.has(o.key)||L.set(o.key,new Set),L.get(o.key).add({target:e,prop:t,el:s,batcher:r})},Re=(e,t,o)=>{let s=ee.get(e);if(s&&s[t]){let r=s[t].key;Be(r,o,s[t].debounce),L.has(r)&&L.get(r).forEach(({target:n,prop:a,el:i,batcher:c})=>{n!==e&&(n[a]=o,i&&c&&c.add(i))})}},Fe=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!L.has(e.key)))try{let t=JSON.parse(e.newValue);L.get(e.key).forEach(({target:o,prop:s,el:r,batcher:n})=>{o[s]=t,r&&n&&n.add(r)})}catch(t){console.warn("[Lego] Cross-tab sync error:",t)}})};var j=(e,t,o=ie)=>{if(e===null||typeof e!="object"||de(e))return e;if(G.has(e))return G.get(e);for(let n in e){let a=Object.getOwnPropertyDescriptor(e,n);if(a&&a.get)continue;let i=e[n];De(i)&&Pe(e,n,i,t,o)}let s={get:(n,a)=>{let i=Reflect.get(n,a);return i!==null&&typeof i=="object"&&!de(i)?j(i,t,o):i},set:(n,a,i,c)=>{if(a==="__proto__"||a==="constructor"||a==="prototype")return console.warn(`[Lego] Blocked setting dangerous property: "${a}"`),!0;let f=n[a];g.debug&&f!==i&&console.log("[Lego Trace] Reactive SET:",a,"Old:",f,"New:",i,"Target:",n);let d=c===G.get(n),u=Object.prototype.hasOwnProperty.call(n,a),l=!d&&u?Reflect.set(n,a,i):Reflect.set(n,a,i,c);return(d||u)&&f!==i&&(o.add(t),Re(n,a,i)),l},deleteProperty:(n,a)=>{let i=Reflect.deleteProperty(n,a);return o.add(t),i}},r=new Proxy(e,s);return G.set(e,r),r};var Ve=e=>{let t=e;for(;t;){let o=t.getAttribute&&t.getAttribute("b-error");if(o&&o.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:o,targetElement:t};let s=t.tagName?t.tagName.toLowerCase():"",r=w[s];if(r){let n=r.getAttribute("b-error");if(n&&n.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:n,targetElement:t}}t=t.parentElement||t.getRootNode&&t.getRootNode().host}return null},he=null,ze=null,He=(e,t)=>{he=e,ze=t},Xe=(e,t,o)=>{if(!he||!ze){console.error("[Lego] Error boundary dependencies not loaded",o);return}try{t.shadowRoot?t.shadowRoot.innerHTML="":t.innerHTML="";let s=document.createElement(e);s.$initialState={$error:{message:o.message,stack:o.stack,component:t.tagName.toLowerCase()}},(t.shadowRoot||t).appendChild(s),he(s)}catch(s){console.error("[Lego] Error boundary failed to render:",s),console.error("[Lego] Original error:",o)}},U=(e,t,o)=>{let s=Ve(t);s?Xe(s.errorTag,s.targetElement,e):g.onError(e,o,t)};var le=(e,t,o=null)=>{let s=t._studs,r=i=>{let c=A(i);if(!c.bound){if(i.hasAttributes()){let f=i.attributes;for(let u=0;u<f.length;u++){let l=f[u];if(l.name.startsWith("@")){let p=l.name.slice(1).split("."),S=p[0],x=p.slice(1);i.addEventListener(S,E=>{if(x.includes("prevent")&&E.preventDefault(),x.includes("stop")&&E.stopPropagation(),!(x.includes("self")&&E.target!==E.currentTarget)){if(typeof KeyboardEvent<"u"&&E instanceof KeyboardEvent){if(x.includes("ctrl")&&!E.ctrlKey||x.includes("alt")&&!E.altKey||x.includes("shift")&&!E.shiftKey||x.includes("meta")&&!E.metaKey)return;let m=x.filter(b=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(b));if(m.length>0){let b=E.key.toLowerCase();if(!m.some(h=>h==="enter"?b==="enter":h==="esc"||h==="escape"?b==="escape":h==="space"?b===" ":h==="tab"?b==="tab":h==="delete"?b==="delete":h==="backspace"?b==="backspace":h==="up"?b==="arrowup":h==="down"?b==="arrowdown":h==="left"?b==="arrowleft":h==="right"?b==="arrowright":h==="alpha"?/^[a-z]$/.test(b):h==="numbers"?/^[0-9]$/.test(b):h===b))return}}try{let m=s;if(o){let v=N(o.listName,{state:s,global:_,self:t})[o.index];m=Object.assign(Object.create(s),{[o.name]:v})}N(l.value,{state:m,global:_,self:i,event:E,$event:E},!0)}catch(m){U(m,t,"event-handler")}}})}}let d=F(i);if(d){let u=d.value,l=d.name.split(".").slice(1),p=l.includes("lazy"),S=l.includes("number"),x=l.includes("trim"),E=()=>{try{let m,b;if(u.startsWith("global.")){let h=u.slice(7).split(".");b=h.pop(),m=h.reduce((M,D)=>M[D],_)}else if(o&&u.startsWith(`${o.name}.`)){let M=N(o.listName,{state:s,global:_,self:t})[o.index];if(!M)return;let D=u.split(".").slice(1);b=D.pop(),m=D.reduce((H,ye)=>H[ye],M)}else{let h=u.split(".");b=h.pop(),m=h.reduce((M,D)=>M[D],s)}let v=i.type==="checkbox"?i.checked:i.value;if(x&&typeof v=="string"&&(v=v.trim()),S){let h=parseFloat(v);isNaN(h)||(v=h)}m&&m[b]!==v&&(m[b]=v)}catch(m){g.onError(m,"sync-update",i)}};i._bSyncHandler=E,p||i.addEventListener("input",E),i.addEventListener("change",E)}if(i.hasAttribute("b-var")){let u=i.getAttribute("b-var");s.$vars&&(s.$vars[u]=i)}}c.bound=!0}};e instanceof Element&&r(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),a;for(;a=n.nextNode();)r(a)},Qe=e=>{let t=[],o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s,r=[];for(;s=o.nextNode();){let n=s;if((c=>{let f=c.parentNode;for(;f&&f!==e;){if(f.hasAttribute&&f.hasAttribute("b-for"))return!0;f=f.parentNode}return!1})(s))continue;let i=c=>{if(/\bglobal\b/.test(c)){let f=e.host||e;J.add(f)}};if(s.nodeType===Node.ELEMENT_NODE){let c=!1;for(let[d,u]of Object.entries(Y))if(u.scan){let l=u.scan(s,{checkGlobal:i,getPrivateData:A,pendingOperations:r,current:n});l&&(t.push(l),l.terminal&&(c=!0))}if(c)continue;let[f]=X();[...s.attributes].forEach(d=>{d.value.includes(f)&&(i(d.value),t.push({type:"attr",node:s,attrName:d.name,template:d.value}))})}else if(s.nodeType===Node.TEXT_NODE){let[c]=X();s.textContent.includes(c)&&(i(s.textContent),t.push({type:"text",node:s,template:s.textContent}))}}return r.forEach(n=>n()),t},Ze=(e,t)=>{let o=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let a=n._tpl.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:n},!1)??"");n.textContent!==a&&(n.textContent=a)}else if(n.nodeType===Node.ELEMENT_NODE){let[a]=X();[...n.attributes].forEach(i=>{if(i._tpl===void 0&&(i._tpl=i.value),i._tpl.includes(a)){let c=i._tpl.replace(Q(),(f,d)=>N(d.trim(),{state:t,global:_,self:n},!1)??"");i.value!==c&&(i.value=c,i.name==="class"&&(n.className=c))}})}};o(e);let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),r;for(;r=s.nextNode();)o(r)},K=e=>{g.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let t=e._studs;if(!t)return;let o=A(e);if(!o.rendering){o.rendering=!0,g.metrics&&g.metrics.onRenderStart&&g.metrics.onRenderStart(e);try{let s=e.shadowRoot||e;o.bindings||(o.bindings=Qe(s)),o.bindings.forEach(r=>{let n=Y[r.type];if(n){n.execute({binding:r,state:t,global:_,helpers:{bind:le,updateNodeBindings:Ze,contextEl:e}});return}if(r.type==="text"){let a=r.template.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:r.node},!1)??"");r.node.textContent!==a&&(r.node.textContent=a)}if(r.type==="attr"){let a=r.template.replace(Q(),(i,c)=>N(c.trim(),{state:t,global:_,self:r.node},!1)??"");r.node.getAttribute(r.attrName)!==a&&(r.node.setAttribute(r.attrName,a),r.attrName==="class"&&(r.node.className=a))}}),t===_&&J.forEach(r=>K(r))}catch(s){U(s,e,"render")}finally{g.metrics&&g.metrics.onRenderEnd&&g.metrics.onRenderEnd(e),o.rendering=!1}}};var We=new Map,Ie={},qe=e=>{Ie=e},je=async()=>{let e=Object.entries(Ie).map(async([t,o])=>{let s=await Promise.all(o.map(async r=>{try{if(r instanceof CSSStyleSheet)return r;let n=await fetch(r);if(!n.ok)throw new Error(`Status ${n.status}`);let a=await n.text(),i=new CSSStyleSheet;return await i.replace(a),i}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${r}`,n),null}}));We.set(t,s.filter(r=>r!==null))});await Promise.all(e),g.debug&&console.log("[Lego Debug] Re-applying stylesheets to",T.size,"blocks"),T.forEach(t=>{be(t)})},be=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let t=e.shadowRoot||e._legoShadow,o=e.tagName.toLowerCase(),s=w[o],r=(s&&s.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),a=[],i=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;i;){let u=(i.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);u.length&&a.push(...u);let l=i.tagName?i.tagName.toLowerCase():"";if(w[l]){let p=(w[l].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);p.length&&a.push(...p)}i=i.parentElement||i.getRootNode&&i.getRootNode().host}let c=[...new Set([...r,...n])],f=[...new Set(a)],d=[...new Set([...f,...c])];if(d.length>0){let u=d.flatMap(l=>We.get(l)||[]);if(u.length>0&&g.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",d,"- Sheets:",u.length),u.length>0){let l=t.adoptedStyleSheets.filter(p=>!u.includes(p));t.adoptedStyleSheets=[...l,...u]}}e._studsMeta={stylesheets:{explicit:c,inherited:f,applied:d}}};var $=e=>{if(g.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let t=A(e),o=e.tagName.toLowerCase(),s=w[o];if(s&&!t.snapped){t.snapped=!0;let n=s.content.cloneNode(!0),a=e.shadowRoot;a?a.innerHTML="":a=e.attachShadow({mode:"open"}),be(e);let i=q(e,"*")||q(e.getRootNode().host,"*"),c=i&&i.state?i.state:{},f=I.get(o)||{},d=me(s.getAttribute("b-logic")||s.getAttribute("b-data")||"{}"),u=me(e.getAttribute("b-logic")||e.getAttribute("b-data")||"{}",c),l={$vars:{},$element:e,get $parent(){return q(e,"*")},$emit:(x,E)=>{e.dispatchEvent(new CustomEvent(x,{detail:E,bubbles:!0,composed:!0}))},get $route(){return _.$route},get $go(){return _.$go}};z(f,l),z(d,l),z(u,l),e.$initialState&&(z(e.$initialState,l),delete e.$initialState),e._studs=j(l,e),Object.defineProperty(e,"state",{get(){return this._studs},set(x){Object.assign(this._studs,x)},configurable:!0,enumerable:!1}),R.locked=!0,a.appendChild(n),R.locked=!1;let p=a.querySelector("style");if(p&&(p.textContent=p.textContent.replace(/\bself\b/g,":host")),le(a,e),T.add(e),K(e),e.setAttribute("b-id",o),e._legoShadow||(e._legoShadow=a),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(x){U(x,e,"mounted")}let S=a.querySelectorAll("*");g.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",S.length),S.forEach(x=>{let E=x.tagName.toLowerCase(),m=!!w[E];m&&g.debug&&console.log("[Lego Debug] Checking",E,"- Registered:",m),m&&$(x)})}let r=e.parentElement;for(;r&&!r._studs;)r=r.parentElement;r&&r._studs&&le(e,r),[...e.children].forEach($)},k=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(o){U(o,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(k),T.delete(e),J.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(o=>{e._studs.$vars[o]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let t=W.get(e);t&&(t.bindings&&(t.bindings.forEach(o=>{let s=Y[o.type];if(s&&s.destroy)try{s.destroy({binding:o})}catch(r){console.error(`[Lego] Error in directive cleanup (${o.type}):`,r)}o.node=null,o.anchor=null}),t.bindings=null),t.anchor=null,W.delete(e)),[...e.children].forEach(k)};function Ue(e,t="block.lego"){let o={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:Se(t),hasTemplate:!1,hasScript:!1,hasStyle:!1},s=e,r=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;s;){let n=s.match(r);if(!n)break;let a=n[1].toLowerCase(),i=n[2],c=n[0],f=n.index,d=`</${a}>`,u=f+c.length,l=s.indexOf(d,u);if(l===-1){console.warn(`[Lego] Unclosed <${a}> tag in ${t}`);break}let p=s.slice(u,l);if(a==="template"){o.hasTemplate=!0,o.template=p.trim();let S=i.match(/b-stylesheets=["']([^"']+)["']/);S&&(o.stylesAttr=S[1]);let x=i.match(/b-cascade=["']([^"']+)["']/);x&&(o.cascadeAttr=x[1]);let E=i.match(/b-error=["']([^"']+)["']/);E&&(o.errorAttr=E[1])}else if(a==="script"){o.hasScript=!0,o.script=p.trim();let S=i.match(/lang=["']([^"']+)["']/);S&&(o.scriptLang=S[1])}else a==="style"&&(o.hasStyle=!0,o.style=p.trim());s=s.slice(l+d.length)}return o}var Ke=(e,t,o="block.lego")=>{let s=Ue(t,o),{blockName:r,template:n,script:a,style:i,stylesAttr:c,cascadeAttr:f,errorAttr:d}=s,u={};if(a)try{let p=a.trim(),S=p.match(/export\s+default\s+(?:\/\*[\s\S]*?\*\/\s*|\/\/[^\n]*\n\s*)*({[\s\S]*})/),x=S?S[1]:p;u=new Function("Lego","$db",`return ${x}`)(e,e.globals.$db)}catch(p){g.onError(p,"script",r)}let l=n;i&&(l=`<style>${i}</style>`+l),w[r]=document.createElement("template"),w[r].innerHTML=l,c&&w[r].setAttribute("b-stylesheets",c),f&&w[r].setAttribute("b-cascade",f),d&&w[r].setAttribute("b-error",d),I.set(r,u),document.querySelectorAll(r).forEach(p=>!A(p).snapped&&$(p))};ie.setHandler(K);He($,K);ve($);var Ye={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},O=j({$route:Ye,$go:(e,...t)=>ae(e,...t)(document.body),$db:ge},typeof document<"u"?document.body:null);we(O);var y={db:ge,snap:$,unsnap:k,defineLegoFile:(e,t)=>Ke(y,e,t),block:(e,t,o={},s="",r="",n="")=>{let a=document.createElement("template");a.setAttribute("b-id",e),a.setAttribute("b-stylesheets",s),r&&a.setAttribute("b-cascade",r),n&&a.setAttribute("b-error",n),a.innerHTML=t,w[e]=a,I.set(e,o);try{let i={};z(o,i),oe.set(e.toLowerCase(),j(i,document.body))}catch(i){g.onError(i,"define",e)}if(customElements.get(e))document.querySelectorAll(e).forEach(i=>{k(i),$(i)}),T.forEach(i=>{i._legoShadow&&i._legoShadow.querySelectorAll(e).forEach(c=>{k(c),$(c)})});else try{customElements.define(e,class extends HTMLElement{connectedCallback(){R.locked||w[e]&&$(this)}disconnectedCallback(){k(this)}})}catch(i){console.warn(`[Lego] Failed to register web component ${e}:`,i)}},getActiveBlocksCount:()=>T.size,getLegos:()=>Object.keys(w),config:g,globals:O,route:(e,t,o=null)=>{let s=[],r=e==="*"?".*":e;r=r.replace(/:([^\/]+)|[.*+?^${}()|[\]\\]/g,(n,a)=>a?(s.push(a),"([^/]+)"):"\\"+n),Z.push({path:e,regex:new RegExp(`^${r}$`),tagName:t,paramNames:s,middleware:o})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,t={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),qe(t.styles||{}),g.loader=t.loader,g.debug=t.debug===!0,await je(),Z.length>0){let r=window.location.pathname,n=window.location.search,a=pe(r);if(a){let{match:i,params:c}=a,f=Object.fromEntries(new URLSearchParams(n));O.$route.url=r+n,O.$route.route=i.path,O.$route.params=c,O.$route.query=f,O.$route.method="GET",O.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(r=>{let n=r.getAttribute("b-id");w[n]=r,customElements.get(n)||customElements.define(n,class extends HTMLElement{connectedCallback(){R.locked||w[n]&&$(this)}disconnectedCallback(){k(this)}})});let o=r=>{if(!r)return{};let n={};return Object.entries(r).forEach(([a,i])=>{if(typeof i=="function")n[a]=i();else if(typeof i=="string"&&i.startsWith("$db.")){let c=i.slice(4);n[a]=y.db(c).get()}else if(typeof i=="string"&&i.startsWith("$globals.")){let c=i.slice(9);n[a]=_[c]}else n[a]=i}),n},s=(r,n,a={})=>{customElements.get(r)||customElements.define(r,class extends HTMLElement{async connectedCallback(){if(w[r]){R.locked||$(this);return}if(y._fetching||(y._fetching=new Set),y._pendingLazy||(y._pendingLazy={}),y._fetching.has(r)){y._pendingLazy[r]||(y._pendingLazy[r]=new Set),y._pendingLazy[r].add(this);return}y._fetching.add(r);try{let i=n.startsWith("POST:")?"POST":"GET",c=n.replace(/^POST:/,""),f=o(a.headers),d={method:i,headers:f,credentials:a.credentials},l=await(await fetch(c,d)).text();y.defineLegoFile(l,`${r}.lego`),w[r]&&$(this);let p=y._pendingLazy[r];p&&(p.forEach(S=>{S.isConnected&&w[r]&&!A(S).snapped&&$(S)}),delete y._pendingLazy[r])}catch(i){console.error(`[Lego] Failed to load manifest block ${r}:`,i)}finally{y._fetching.delete(r)}}disconnectedCallback(){k(this)}})};if(t.manifest){let r=t.manifest;if(r.url&&typeof r.url=="string")try{let a=o(r.headers);r=await(await fetch(r.url,{headers:a,credentials:r.credentials})).json()}catch(a){console.error("[Lego] Failed to load manifest:",a),r=[]}else if(typeof r=="string")try{r=await(await fetch(r)).json()}catch(a){console.error("[Lego] Failed to load manifest:",a),r=[]}let n=Array.isArray(r)?r:[r];for(let a of n){let i=a.base||"",c=a.suffix===!0?".lego":a.suffix||"",f={headers:a.headers||{},credentials:a.credentials};a.legos&&a.legos.forEach(d=>{s(d,`${i}${d}${c}`,f)}),a.map&&Object.entries(a.map).forEach(([d,u])=>{let l=u.match(/^https?:|^\//)?u:`${i}${u}`;s(d,l,f)})}}if(g.loader){let r=a=>{if(a.nodeType!==Node.ELEMENT_NODE)return;let i=a.tagName.toLowerCase();if(i.includes("-")&&!w[i]&&!T.has(a)){if(y._fetching&&y._fetching.has(i))return;y._fetching||(y._fetching=new Set),y._fetching.add(i);let c=g.loader(i);if(c){let f=typeof c=="string"?fetch(c).then(d=>d.text()):c;Promise.resolve(f).then(d=>{y.defineLegoFile(d,`${i}.lego`),y._fetching.delete(i)}).catch(d=>{console.error(`[Lego] Failed to load ${i}:`,d),y._fetching.delete(i)})}}if(a.children.length>0){let c=a.firstElementChild;for(;c;)r(c),c=c.nextElementSibling}};y._discoveryObserver&&y._discoveryObserver.disconnect(),y._discoveryObserver=new MutationObserver(a=>a.forEach(i=>{i.addedNodes.forEach(r)})),y._discoveryObserver.observe(e,{childList:!0,subtree:!0});let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(;n.nextNode();)r(n.currentNode)}if(t.studio){if(!w["lego-studio"]){let r=document.createElement("script");r.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",r.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(r)}y.route("/_/studio","lego-studio"),y.route("/_/studio/:block","lego-studio")}Z.length>0&&(window.addEventListener("popstate",r=>{let n=r.state?.legoTargets||null;ne(n)}),document.addEventListener("submit",r=>{r.preventDefault()}),document.addEventListener("click",r=>{let a=r.composedPath().find(i=>i.tagName==="A"&&(i.hasAttribute("b-target")||i.hasAttribute("b-link")));if(a){r.preventDefault();let i=a.getAttribute("href"),c=a.getAttribute("b-target"),f=c?c.split(/\s+/).filter(Boolean):[],d=a.getAttribute("b-link")!=="false";O.$go(i,...f).get(d)}}),ne()),Fe()}};typeof window<"u"?window.Lego=y:typeof global<"u"&&(global.Lego=y);var yo=y;export{y as Lego,yo as default};
|
package/dist/main.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
(()=>{var
|
|
1
|
+
(()=>{var y={},I=new WeakMap,R=new WeakMap,k=new WeakMap,X=new WeakMap,_=new Set,q=new Set,P=new Map,Q=new Map;var M=e=>(R.has(e)||R.set(e,{snapped:!1,bindings:null,bound:!1,rendering:!1,anchor:null}),R.get(e));var S={},ge=e=>{S=e};var Z=class{constructor(o=1e3){this.limit=o,this.cache=new Map}get(o){if(!this.cache.has(o))return;let r=this.cache.get(o);return this.cache.delete(o),this.cache.set(o,r),r}set(o,r){if(this.cache.has(o))this.cache.delete(o);else if(this.cache.size>=this.limit){let s=this.cache.keys().next().value;this.cache.delete(s)}this.cache.set(o,r)}get size(){return this.cache.size}clear(){this.cache.clear()}};var F=(e,o)=>{if(!e)return;let r=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;r;){let s=r.tagName?r.tagName.toLowerCase():"";if(s&&(o==="*"&&y[s]||s===o.toLowerCase()))return r;r=r.parentElement||r.getRootNode&&r.getRootNode().host}},he=(e,o)=>{if(typeof e=="function"){let s=Array.from(document.querySelectorAll("*")).filter(t=>t.tagName.includes("-"));return[].concat(e(s))}if(e.startsWith("#")){let s=document.getElementById(e.slice(1));return s?[s]:[]}let r=o?.querySelectorAll(e)||[];return r.length>0?[...r]:[...document.querySelectorAll(e)]},Y=(e,o)=>{if(e.type==="checkbox")e.checked!==!!o&&(e.checked=!!o);else{let r=o==null?"":String(o);e.value!==r&&(e.value=r)}};var g={onError:(e,o,r)=>{console.error(`[Lego Error] [${o}]`,e,r)},metrics:{},debug:!1,syntax:"brackets"},B=(e,o)=>{!e||!o||Object.getOwnPropertyNames(e).forEach(r=>{let s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(o,r,s)})},U=()=>g.syntax==="brackets"?["[[","]]"]:["{{","}}"],ne=new Map,j=()=>{let[e,o]=U(),r=e+o;if(ne.has(r))return ne.get(r);let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),t=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`${s}(.*?)${t}`,"g");return ne.set(r,n),n},be=e=>{let r=e.split("/").pop().replace(/\.lego$/,"").replace(/_/g,"-").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();if(!r.includes("-"))throw new Error(`[Lego] Invalid block definition: "${e}". Block names must contain a hyphen (e.g. user-card.lego or UserCard.lego).`);return r},D=(e,o)=>{if(!e)return"";let r=e.trim().split("."),s=o;for(let t of r){if(s==null)return"";s=s[t]}return s??""},ae=e=>typeof Node<"u"&&e instanceof Node,O=(e,o,r)=>{if(o.nodeType!==Node.ELEMENT_NODE)return;let s=[...o.attributes].find(n=>n.name===e||n.name.startsWith(`${e}.`));if(!s)return;let t={};return r&&(t=r(s,o)),{type:e,node:o,expr:s.value,modifiers:s.name.split(".").slice(1),...t}};var ie=null,ye=e=>{ie=e},K=[],ce=e=>{let o=K.find(t=>t.regex.test(e));if(!o)return null;let r=e.match(o.regex).slice(1),s=o.paramNames?Object.fromEntries(o.paramNames.map((t,n)=>[t,r[n]])):{};return{match:o,params:s}},ee=async(e=null,o=null)=>{if(typeof window>"u")return;let r=window.location.pathname,s=ce(r);if(g.debug&&console.log("[Lego Trace] Matching route",r,s?.match),!s)return;let{match:t,params:n}=s;if(t.middleware&&!await t.middleware({path:r,params:n}))return;let i=e&&e.length?e:["lego-router"],a=o||document;t.tagName&&i.flatMap(l=>he(l,a)).forEach(l=>{l&&(l.innerHTML=`<${t.tagName}></${t.tagName}>`,ie&&ie(l.firstElementChild))})},te=(e,...o)=>r=>{let s=async(t,n=null,i=!0,a={})=>{if(i&&typeof history<"u"){let l={legoTargets:o.filter(d=>typeof d=="string"),method:t,body:n};history.pushState(l,"",e)}await ee(o.length?o:null,r)};return{get:(t=!0,n={})=>s("GET",null,t,n),post:(t,n=!0,i={})=>s("POST",t,n,i),put:(t,n=!0,i={})=>s("PUT",t,n,i),patch:(t,n=!0,i={})=>s("PATCH",t,n,i),delete:(t=!0,n={})=>s("DELETE",null,t,n)}};var Ee=new Z(1e3),x=(e,o,r=!0)=>{if(/\b(function|eval|import|class|module|deploy|constructor|__proto__|prototype)\b/.test(e)||/\[\s*['"`].*\+|\+.*['"`]\s*\]/.test(e)){console.warn(`[Lego] Security Warning: Blocked dangerous expression "${e}"`);return}try{let s=o.state||{},t=Ee.get(e);t||(t=new Function("global","self","event","helpers",`
|
|
2
2
|
with(this) {
|
|
3
3
|
with(helpers) {
|
|
4
4
|
return ${e}
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
`),we.set(e,s));let n={$ancestors:a=>P(t.self,a),$registry:a=>Q.get(a.toLowerCase()),$element:t.self,$route:x.$route,$go:(a,...c)=>te(a,...c)(t.self),$emit:(a,c)=>{t.self.dispatchEvent(new CustomEvent(a,{detail:c,bubbles:!0,composed:!0}))}},i=s.call(o,t.global,t.self,t.event,n);return typeof i=="function"?i.call(o,t.event):i}catch(o){if(r)throw o;f.onError(o,"render-error",t.self);return}},le=(e,t={})=>{if(!e||e.trim()==="{}")return{};try{return new Function("scope","global",`with(global) { with(scope) { return (${e}); } }`)(t,x)}catch(r){return console.error(`[Lego] Error parsing b-data/b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,r),{}}};var Ne={name:"b-if",scan:(e,{checkGlobal:t,getPrivateData:r})=>k("b-if",e,(o,s)=>{t(o.value);let n=document.createComment(`b-if: ${o.value}`),i=r(s);return i.anchor=n,{anchor:n}}),execute({binding:e,state:t,global:r}){let{node:o,anchor:s,expr:n}=e,i=!!N(n,{state:t,global:r,self:o}),a=!!o.parentNode;i&&!a?s.parentNode&&s.parentNode.replaceChild(o,s):!i&&a&&o.parentNode.replaceChild(s,o)}};var xe={name:"b-show",scan(e,{checkGlobal:t}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let r=e.getAttribute("b-show");return t(r),{type:"b-show",node:e,expr:r}}},execute({binding:e,state:t,global:r}){let{node:o,expr:s}=e;o.style.display=N(s,{state:t,global:r,self:o})?"":"none"}};var ve={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:t}){let{node:r,path:o}=e;r.textContent=M(o,t)}};var Se={name:"b-html",scan:e=>k("b-html",e),execute:({binding:e,state:t,global:r})=>{let{node:o,expr:s}=e;o.innerHTML=N(s,{state:t,global:r,self:o})||""}};var Le={name:"b-sync",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-sync"))return{type:"b-sync",node:e}},execute({binding:e,state:t}){let{node:r}=e;Y(r,M(r.getAttribute("b-sync"),t))}};var $e={name:"b-for",scan(e,{checkGlobal:t,pendingOperations:r}){if(e.nodeType!==Node.ELEMENT_NODE)return;let o=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(o){t(o[2]);let s=document.createComment(`b-for: ${o[1]} in ${o[2].trim()}`);return r.push(()=>{e.parentNode&&(e.parentNode.insertBefore(s,e),e.remove())}),{type:"b-for",anchor:s,itemName:o[1],listName:o[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0)}}},execute({binding:e,state:t,global:r,helpers:o}){let{bind:s,updateNodeBindings:n}=o;if(!s||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:i,listName:a,itemName:c,keyPath:l,template:m}=e,{contextEl:g}=o,d=N(a,{state:t,global:r,self:g})||[];A.has(i)||A.set(i,new Map);let p=A.get(i),y=new Set,h=[];d.forEach((u,v)=>{let b;l?(b=M(l,u),b===void 0&&console.warn(`[Lego] b-key="${l}" resolved to undefined for item at index ${v}. Check for typos.`)):u&&typeof u=="object"?(b=u.id||u._id||u.uuid||u.key,b===void 0&&(X.has(u)||X.set(u,Math.random()),b=X.get(u))):b=`${v}-${u}`,y.add(b);let T=p.get(b);T||(T=m.cloneNode(!0),T.removeAttribute("b-for"),T.removeAttribute("b-key"),p.set(b,T),s(T,g,{name:c,listName:a,index:v}));let We=Object.assign(Object.create(t),{[c]:u,$index:v});n(T,We),T.querySelectorAll("[b-sync]").forEach(me=>{let ge=me.getAttribute("b-sync");if(ge.startsWith(`${c}.`)){let Ie=N(a,{state:t,global:r,self:g});Y(me,M(ge.split(".").slice(1).join("."),Ie[v]))}}),h.push(T)});let E=i.nextSibling;h.forEach(u=>{u!==E?i.parentNode.insertBefore(u,E):E=E.nextSibling});for(let[u,v]of p.entries())y.has(u)||(v.remove(),p.delete(u))}};var _e={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:t})=>{e.initialized||(e.initialized=!0,N(e.expr,{state:t}))}};var Te={name:"b-enter",scan:e=>k("b-enter",e,(t,r)=>({modifiers:t.name.split(".").slice(1)})),execute:({binding:e,state:t})=>{if(e.observer||e.done)return;let r=new IntersectionObserver((o,s)=>{o[0].isIntersecting&&(N(e.expr,{state:t}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});r.observe(e.node),e.observer=r},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Ae={scan:e=>k("b-leave",e),execute:({binding:e,state:t})=>{if(e.observer||e.done)return;let r=new IntersectionObserver((o,s)=>{let n=o[0];n.isIntersecting&&(e.activated=!0),!n.isIntersecting&&e.activated&&(N(e.expr,{state:t}),e.modifiers.includes("once")&&(s.disconnect(),e.observer=null,e.done=!0))});r.observe(e.node),e.observer=r},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var G={"b-if":Ne,"b-show":xe,"b-text":ve,"b-html":Se,"b-sync":Le,"b-for":$e,"b-init":_e,"b-enter":Te,"b-leave":Ae};var qe=(e=null)=>{let t=!1,r=new Set,o=!1,s=e,n=new Set,i=null,a=new Set,c=d=>{s=d},l=()=>{i&&clearTimeout(i),i=setTimeout(()=>{a.forEach(d=>{let p=d._studs;if(p&&typeof p.updated=="function")try{p.updated.call(p)}catch(y){console.error("[Lego] Error in updated hook:",y)}}),a.clear(),i=null},50)},m=()=>{n.size>0&&(n.forEach(d=>r.add(d)),n.clear(),!t&&r.size>0&&(t=!0,requestAnimationFrame(g)))},g=()=>{o=!0;let d=Array.from(r);r.clear(),t=!1,d.forEach(p=>{p.isConnected&&s&&s(p)}),d.forEach(p=>a.add(p)),l(),o=!1,m()};return{add:d=>{if(d){if(o){n.add(d);return}r.add(d),!t&&(t=!0,requestAnimationFrame(g))}},setHandler:c}},re=qe();var V=new Map,oe=new Map,J=new WeakMap,se=new Map,Ke=e=>{let t=Array.from(se.entries()).filter(([s])=>s.startsWith("lego:")).sort((s,n)=>s[1].timestamp-n[1].timestamp),r=0,o=[];for(let[s,n]of t){if(r>=e)break;try{localStorage.removeItem(s),r+=n.size,o.push(s),se.delete(s)}catch(i){console.error(`[Lego] Failed to evict ${s}:`,i)}}return o},Ue=(e,t,r)=>{f.debug&&console.log("[Lego Trace] scheduleSave",e,t,r),oe.has(e)&&clearTimeout(oe.get(e));let o=()=>{try{let s=JSON.stringify(t),n=new Blob([s]).size;localStorage.setItem(e,s);let i=e.startsWith("lego:")?e:`lego:${e}`;se.set(i,{timestamp:Date.now(),size:n}),oe.delete(e)}catch(s){if(s.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(t),i=new Blob([n]).size,a=Ke(i*2);if(a.length>0){f.debug&&console.log(`[Lego] Evicted ${a.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;se.set(c,{timestamp:Date.now(),size:i})}else f.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{f.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,s)}};r>0?oe.set(e,setTimeout(o,r)):o()},ue=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(t){return this._default=t,this},debounce(t){return this._debounce=t,this}}),ke=e=>e&&e.__type==="lego-db",Me=(e,t,r,o,s)=>{f.debug&&console.log("[Lego Trace] Reactive DB Init:",t,r);let n=r._default;try{let i=localStorage.getItem(r.key);i!==null&&(n=JSON.parse(i))}catch(i){console.warn(`[Lego] Failed to parse localStorage value for key "${r.key}":`,i)}e[t]=n,J.has(e)||J.set(e,{}),J.get(e)[t]={key:r.key,debounce:r._debounce},f.debug&&console.log("[Lego Trace] DB Metadata Set:",t,J.get(e)[t]),V.has(r.key)||V.set(r.key,new Set),V.get(r.key).add({target:e,prop:t,el:o,batcher:s})},Ce=(e,t,r)=>{let o=J.get(e);o&&o[t]&&Ue(o[t].key,r,o[t].debounce)},Oe=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!V.has(e.key)))try{let t=JSON.parse(e.newValue);V.get(e.key).forEach(({target:r,prop:o,el:s,batcher:n})=>{r[o]=t,s&&n&&n.add(s)})}catch(t){console.warn("[Lego] Cross-tab sync error:",t)}})};var F=(e,t,r=re)=>{if(e===null||typeof e!="object"||ae(e))return e;if(I.has(e))return I.get(e);for(let n in e){let i=Object.getOwnPropertyDescriptor(e,n);if(i&&i.get)continue;let a=e[n];ke(a)&&Me(e,n,a,t,r)}let o={get:(n,i)=>{let a=Reflect.get(n,i);return a!==null&&typeof a=="object"&&!ae(a)?F(a,t,r):a},set:(n,i,a,c)=>{let l=n[i];f.debug&&l!==a&&console.log("[Lego Trace] Reactive SET:",i,"Old:",l,"New:",a,"Target:",n);let m=Reflect.set(n,i,a,c);return c===I.get(n)&&l!==a&&(r.add(t),Ce(n,i,a)),m},deleteProperty:(n,i)=>{let a=Reflect.deleteProperty(n,i);return r.add(t),a}},s=new Proxy(e,o);return I.set(e,s),s};var je=e=>{let t=e;for(;t;){let r=t.getAttribute&&t.getAttribute("b-error");if(r)return{errorTag:r,targetElement:t};let o=t.tagName?t.tagName.toLowerCase():"",s=w[o];if(s){let n=s.getAttribute("b-error");if(n)return{errorTag:n,targetElement:t}}t=t.parentElement||t.getRootNode&&t.getRootNode().host}return null},de=null,fe=null,De=(e,t)=>{de=e,fe=t},Ge=(e,t,r)=>{if(!de||!fe){console.error("[Lego] Error boundary dependencies not loaded",r);return}try{t.shadowRoot?t.shadowRoot.innerHTML="":t.innerHTML="";let o=document.createElement(e);(t.shadowRoot||t).appendChild(o),de(o),o._studs&&(o._studs.$error={message:r.message,stack:r.stack,component:t.tagName.toLowerCase()},fe(o))}catch(o){console.error("[Lego] Error boundary failed to render:",o),console.error("[Lego] Original error:",r)}},z=(e,t,r)=>{let o=je(t);o?Ge(o.errorTag,o.targetElement,e):f.onError(e,r,t)};var H=(e,t,r=null)=>{let o=t._studs,s=a=>{let c=$(a);if(!c.bound){if(a.hasAttributes()){let l=a.attributes;for(let m=0;m<l.length;m++){let g=l[m];if(g.name.startsWith("@")){let d=g.name.slice(1).split("."),p=d[0],y=d.slice(1);a.addEventListener(p,h=>{if(y.includes("prevent")&&h.preventDefault(),y.includes("stop")&&h.stopPropagation(),!(y.includes("self")&&h.target!==h.currentTarget)){if(typeof KeyboardEvent<"u"&&h instanceof KeyboardEvent){if(y.includes("ctrl")&&!h.ctrlKey||y.includes("alt")&&!h.altKey||y.includes("shift")&&!h.shiftKey||y.includes("meta")&&!h.metaKey)return;let E=y.filter(u=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(u));if(E.length>0){let u=h.key.toLowerCase();if(!E.some(b=>b==="enter"?u==="enter":b==="esc"||b==="escape"?u==="escape":b==="space"?u===" ":b==="tab"?u==="tab":b==="delete"?u==="delete":b==="backspace"?u==="backspace":b==="up"?u==="arrowup":b==="down"?u==="arrowdown":b==="left"?u==="arrowleft":b==="right"?u==="arrowright":b==="alpha"?/^[a-z]$/.test(u):b==="numbers"?/^[0-9]$/.test(u):b===u))return}}try{let E=o;if(r){let v=N(r.listName,{state:o,global:x,self:t})[r.index];E=Object.assign(Object.create(o),{[r.name]:v})}N(g.value,{state:E,global:x,self:a,event:h,$event:h},!0)}catch(E){z(E,t,"event-handler")}}})}}if(a.hasAttribute("b-sync")){let m=a.getAttribute("b-sync"),g=()=>{try{let d,p;if(r&&m.startsWith(`${r.name}.`)){let E=N(r.listName,{state:o,global:x,self:t})[r.index];if(!E)return;let u=m.split(".").slice(1);p=u.pop(),d=u.reduce((v,b)=>v[b],E)}else{let h=m.split(".");p=h.pop(),d=h.reduce((E,u)=>E[u],o)}let y=a.type==="checkbox"?a.checked:a.value;d&&d[p]!==y&&(d[p]=y)}catch(d){f.onError(d,"sync-update",a)}};a.addEventListener("input",g),a.addEventListener("change",g)}if(a.hasAttribute("b-var")){let m=a.getAttribute("b-var");o.$vars&&(o.$vars[m]=a)}}c.bound=!0}};e instanceof Element&&s(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),i;for(;i=n.nextNode();)s(i)},Je=e=>{let t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),o,s=[];for(;o=r.nextNode();){let n=o;if((c=>{let l=c.parentNode;for(;l&&l!==e;){if(l.hasAttribute&&l.hasAttribute("b-for"))return!0;l=l.parentNode}return!1})(o))continue;let a=c=>{if(/\bglobal\b/.test(c)){let l=e.host||e;q.add(l)}};if(o.nodeType===Node.ELEMENT_NODE){for(let[l,m]of Object.entries(G))if(m.scan){let g=m.scan(o,{checkGlobal:a,getPrivateData:$,pendingOperations:s,current:n});g&&t.push(g)}let[c]=K();[...o.attributes].forEach(l=>{l.value.includes(c)&&(a(l.value),t.push({type:"attr",node:o,attrName:l.name,template:l.value}))})}else if(o.nodeType===Node.TEXT_NODE){let[c]=K();o.textContent.includes(c)&&(a(o.textContent),t.push({type:"text",node:o,template:o.textContent}))}}return s.forEach(n=>n()),t},Ve=(e,t)=>{let r=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let i=n._tpl.replace(U(),(a,c)=>N(c.trim(),{state:t,global:x,self:n})??"");n.textContent!==i&&(n.textContent=i)}else if(n.nodeType===Node.ELEMENT_NODE){let[i]=K();[...n.attributes].forEach(a=>{if(a._tpl===void 0&&(a._tpl=a.value),a._tpl.includes(i)){let c=a._tpl.replace(U(),(l,m)=>N(m.trim(),{state:t,global:x,self:n})??"");a.value!==c&&(a.value=c,a.name==="class"&&(n.className=c))}})}};r(e);let o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s;for(;s=o.nextNode();)r(s)},C=e=>{f.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let t=e._studs;if(!t)return;let r=$(e);if(!r.rendering){r.rendering=!0,f.metrics&&f.metrics.onRenderStart&&f.metrics.onRenderStart(e);try{let o=e.shadowRoot||e;r.bindings||(r.bindings=Je(o)),r.bindings.forEach(s=>{let n=G[s.type];if(n){n.execute({binding:s,state:t,global:x,helpers:{bind:H,updateNodeBindings:Ve,contextEl:e}});return}if(s.type==="text"){let i=s.template.replace(U(),(a,c)=>N(c.trim(),{state:t,global:x,self:s.node})??"");s.node.textContent!==i&&(s.node.textContent=i)}if(s.type==="attr"){let i=s.template.replace(U(),(a,c)=>N(c.trim(),{state:t,global:x,self:s.node})??"");s.node.getAttribute(s.attrName)!==i&&(s.node.setAttribute(s.attrName,i),s.attrName==="class"&&(s.node.className=i))}}),t===x&&q.forEach(s=>C(s))}catch(o){z(o,e,"render")}finally{f.metrics&&f.metrics.onRenderEnd&&f.metrics.onRenderEnd(e),r.rendering=!1}}};var Be=new Map,Re={},Pe=e=>{Re=e},Fe=async()=>{let e=Object.entries(Re).map(async([t,r])=>{let o=await Promise.all(r.map(async s=>{try{let i=await(await fetch(s)).text(),a=new CSSStyleSheet;return await a.replace(i),a}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${s}`,n),null}}));Be.set(t,o.filter(s=>s!==null))});await Promise.all(e),f.debug&&console.log("[Lego Debug] Re-applying stylesheets to",L.size,"blocks"),L.forEach(t=>{pe(t)})},pe=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let t=e.shadowRoot||e._legoShadow,r=e.tagName.toLowerCase(),o=w[r],s=(o&&o.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),i=[],a=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;a;){let g=(a.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);g.length&&i.push(...g);let d=a.tagName?a.tagName.toLowerCase():"";if(w[d]){let p=(w[d].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);p.length&&i.push(...p)}a=a.parentElement||a.getRootNode&&a.getRootNode().host}let c=[...new Set([...s,...n])],l=[...new Set(i)],m=[...new Set([...l,...c])];if(m.length>0){let g=m.flatMap(d=>Be.get(d)||[]);g.length>0&&f.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",m,"- Sheets:",g.length),g.length>0&&(t.adoptedStyleSheets=[...g])}e._studsMeta={stylesheets:{explicit:c,inherited:l,applied:m}}};var S=e=>{if(f.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let t=$(e),r=e.tagName.toLowerCase(),o=w[r];if(o&&!t.snapped){t.snapped=!0;let n=o.content.cloneNode(!0),i=e.shadowRoot;i?i.innerHTML="":i=e.attachShadow({mode:"open"}),pe(e);let a=P(e,"*")||P(e.getRootNode().host,"*"),c=a&&a.state?a.state:{},l=B.get(r)||{},m=le(o.getAttribute("b-logic")||o.getAttribute("b-data")||"{}"),g=le(e.getAttribute("b-logic")||e.getAttribute("b-data")||"{}",c),d={$vars:{},$element:e,get $parent(){return P(e,"*")},$emit:(h,E)=>{e.dispatchEvent(new CustomEvent(h,{detail:E,bubbles:!0,composed:!0}))},get $route(){return x.$route},get $go(){return x.$go}};R(l,d),R(m,d),R(g,d),e._studs=F(d,e),Object.defineProperty(e,"state",{get(){return this._studs},set(h){Object.assign(this._studs,h)},configurable:!0,enumerable:!1}),i.appendChild(n);let p=i.querySelector("style");p&&(p.textContent=p.textContent.replace(/\bself\b/g,":host")),H(i,e),L.add(e),C(e);let y=i.querySelectorAll("*");if(f.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",y.length),y.forEach(h=>{let E=h.tagName.toLowerCase(),u=!!w[E];u&&f.debug&&console.log("[Lego Debug] Checking",E,"- Registered:",u),u&&S(h)}),e._legoShadow||(e._legoShadow=i),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(h){z(h,e,"mounted")}}let s=e.parentElement;for(;s&&!s._studs;)s=s.parentElement;s&&s._studs&&H(e,s),[...e.children].forEach(S)},W=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(r){z(r,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(W),L.delete(e),q.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(r=>{e._studs.$vars[r]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let t=D.get(e);if(t&&(t.bindings&&(t.bindings.forEach(r=>{let o=G[r.type];if(o&&o.destroy)try{o.destroy({binding:r})}catch(s){console.error(`[Lego] Error in directive cleanup (${r.type}):`,s)}r.node=null,r.anchor=null}),t.bindings=null),t.anchor=null,D.delete(e)),A.has(e)){let r=A.get(e);r.forEach((o,s)=>{o&&o._studs&&(o._studs=null)}),r.clear(),A.delete(e)}[...e.children].forEach(W)};function ze(e,t="block.lego"){let r={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:be(t)},o=e,s=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;o;){let n=o.match(s);if(!n)break;let i=n[1].toLowerCase(),a=n[2],c=n[0],l=n.index,m=`</${i}>`,g=l+c.length,d=o.indexOf(m,g);if(d===-1){console.warn(`[Lego] Unclosed <${i}> tag in ${t}`);break}let p=o.slice(g,d);if(i==="template"){r.template=p.trim();let y=a.match(/b-stylesheets=["']([^"']+)["']/);y&&(r.stylesAttr=y[1]);let h=a.match(/b-cascade=["']([^"']+)["']/);h&&(r.cascadeAttr=h[1]);let E=a.match(/b-error=["']([^"']+)["']/);E&&(r.errorAttr=E[1])}else i==="script"?r.script=p.trim():i==="style"&&(r.style=p.trim());o=o.slice(d+m.length)}return r}var He=(e,t,r="block.lego")=>{let o=ze(t,r),{blockName:s,template:n,script:i,style:a,stylesAttr:c,cascadeAttr:l,errorAttr:m}=o,g={};if(i)try{let p=i.trim(),y=p.match(/export\s+default\s+({[\s\S]*})/),h=y?y[1]:p;g=new Function("Lego","$db",`return ${h}`)(e,e.globals.$db)}catch(p){f.onError(p,"script",s)}let d=n;a&&(d=`<style>${a}</style>`+d),w[s]=document.createElement("template"),w[s].innerHTML=d,c&&w[s].setAttribute("b-stylesheets",c),l&&w[s].setAttribute("b-cascade",l),m&&w[s].setAttribute("b-error",m),B.set(s,g),document.querySelectorAll(s).forEach(p=>!$(p).snapped&&S(p))};re.setHandler(C);De(S,C);Ee(S);var Xe={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},_=F({$route:Xe,$go:(e,...t)=>te(e,...t)(document.body),$db:ue},typeof document<"u"?document.body:null);he(_);var O={db:ue,snap:S,unsnap:W,defineLegoFile:(e,t)=>He(O,e,t),block:(e,t,r={},o="",s="",n="")=>{let i=document.createElement("template");i.setAttribute("b-id",e),i.setAttribute("b-stylesheets",o),s&&i.setAttribute("b-cascade",s),n&&i.setAttribute("b-error",n),i.innerHTML=t,w[e]=i,B.set(e,r);try{let a={};R(r,a),Q.set(e.toLowerCase(),F(a,document.body))}catch(a){f.onError(a,"define",e)}document.querySelectorAll(e).forEach(S),[...L].forEach(a=>{a.tagName.toLowerCase()===e.toLowerCase()&&(f.debug&&console.log("[Lego HMR] Reloading",e),W(a),S(a))}),L.forEach(a=>{a._legoShadow&&a._legoShadow.querySelectorAll(e).forEach(c=>{$(c).snapped||(f.debug&&console.log("[Lego Debug] Lazy-initializing",e,"in",a.tagName),S(c))})})},getActiveBlocksCount:()=>L.size,getLegos:()=>Object.keys(w),config:f,globals:_,route:(e,t,r=null)=>{let o=[],s=e==="*"?".*":e;s=s.replace(/:([^\/]+)/g,(n,i)=>(o.push(i),"([^/]+)")),j.push({path:e,regex:new RegExp(`^${s}$`),tagName:t,paramNames:o,middleware:r})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,t={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),Pe(t.styles||{}),f.loader=t.loader,f.debug=t.debug===!0,await Fe(),j.length>0){let n=window.location.pathname,i=window.location.search,a=ce(n);if(a){let{match:c,params:l}=a,m=Object.fromEntries(new URLSearchParams(i));_.$route.url=n+i,_.$route.route=c.path,_.$route.params=l,_.$route.query=m,_.$route.method="GET",_.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(n=>{w[n.getAttribute("b-id")]=n});let r=n=>{if(n.nodeType!==Node.ELEMENT_NODE)return;S(n);let i=n.tagName.toLowerCase();if(i.includes("-")&&!w[i]&&f.loader&&!L.has(n)){let a=f.loader(i);if(a){let c=typeof a=="string"?fetch(a).then(l=>l.text()):a;Promise.resolve(c).then(l=>O.defineLegoFile(l,`${i}.lego`)).catch(l=>console.error(`[Lego] Failed to load ${i}:`,l))}}};new MutationObserver(n=>n.forEach(i=>{i.addedNodes.forEach(r),i.removedNodes.forEach(a=>a.nodeType===Node.ELEMENT_NODE&&W(a))})).observe(e,{childList:!0,subtree:!0});let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(r(e);s.nextNode();)r(s.currentNode);if(e._studs=_,H(e,e),C(e),t.studio){if(!w["lego-studio"]){let n=document.createElement("script");n.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",n.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(n)}O.route("/_/studio","lego-studio"),O.route("/_/studio/:block","lego-studio")}j.length>0&&(window.addEventListener("popstate",n=>{let i=n.state?.legoTargets||null;ee(i)}),document.addEventListener("submit",n=>{n.preventDefault()}),document.addEventListener("click",n=>{let a=n.composedPath().find(c=>c.tagName==="A"&&(c.hasAttribute("b-target")||c.hasAttribute("b-link")));if(a){n.preventDefault();let c=a.getAttribute("href"),l=a.getAttribute("b-target"),m=l?l.split(/\s+/).filter(Boolean):[],g=a.getAttribute("b-link")!=="false";_.$go(c,...m).get(g)}}),ee()),Oe()}};typeof window<"u"?window.Lego=O:typeof global<"u"&&(global.Lego=O);var go=O;})();
|
|
7
|
+
`),Ee.set(e,t));let n={$ancestors:a=>F(o.self,a),$registry:a=>Q.get(a.toLowerCase()),$element:o.self,$route:S.$route,$params:S.$route?.params||{},$go:(a,...c)=>te(a,...c)(o.self),$db:S.$db,$emit:(a,c)=>{o.self.dispatchEvent(new CustomEvent(a,{detail:c,bubbles:!0,composed:!0}))}},i=t.call(s,o.global,o.self,o.event,n);return typeof i=="function"?i.call(s,o.event):i}catch(s){if(r)throw s;if(s instanceof ReferenceError)return;throw s}},le=(e,o={})=>{if(!e||e.trim()==="{}")return{};let r=s=>new Function("scope","global",`with(global) { with(scope) { return (${s}); } }`)(o,S);try{return r(e)}catch(s){let t=e.trim();if(!t.startsWith("{")&&t.includes(":"))try{return r(`{${e}}`)}catch{}return console.error(`[Lego] Error parsing b-logic: "${e.length>80?e.slice(0,80)+"...":e}"`,s),{}}};var we={name:"b-if",scan:(e,{checkGlobal:o,getPrivateData:r})=>O("b-if",e,(s,t)=>{o(s.value);let n=document.createComment(`b-if: ${s.value}`),i=r(t);return i.anchor=n,{anchor:n}}),execute({binding:e,state:o,global:r}){let{node:s,anchor:t,expr:n}=e,i=!!x(n,{state:o,global:r,self:s}),a=!!s.parentNode;i&&!a?t.parentNode&&t.parentNode.replaceChild(s,t):!i&&a&&s.parentNode.replaceChild(t,s)}};var xe={name:"b-show",scan(e,{checkGlobal:o}){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-show")){let r=e.getAttribute("b-show");return o(r),{type:"b-show",node:e,expr:r}}},execute({binding:e,state:o,global:r}){let{node:s,expr:t}=e;s.style.display=x(t,{state:o,global:r,self:s})?"":"none"}};var Se={name:"b-text",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-text"))return{type:"b-text",node:e,path:e.getAttribute("b-text")}},execute({binding:e,state:o}){let{node:r,path:s}=e;r.textContent=D(s,o)}};var ve={name:"b-html",scan:e=>O("b-html",e),execute:({binding:e,state:o,global:r})=>{let{node:s,expr:t}=e;s.innerHTML=x(t,{state:o,global:r,self:s})||""}};var Ne={name:"b-sync",scan(e){if(e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute("b-sync"))return{type:"b-sync",node:e}},execute({binding:e,state:o}){let{node:r}=e;Y(r,D(r.getAttribute("b-sync"),o))}};var $e={name:"b-for",scan(e,{checkGlobal:o,pendingOperations:r}){if(e.nodeType!==Node.ELEMENT_NODE)return;let s=e.getAttribute("b-for")?.match(/^\s*(\w+)\s+in\s+([\s\S]+?)\s*$/);if(s){o(s[2]);let t=document.createComment(`b-for: ${s[1]} in ${s[2].trim()}`);return r.push(()=>{e.parentNode&&(e.parentNode.insertBefore(t,e),e.remove())}),{type:"b-for",anchor:t,itemName:s[1],listName:s[2].trim(),keyPath:e.getAttribute("b-key")||null,template:e.cloneNode(!0),terminal:!0}}},execute({binding:e,state:o,global:r,helpers:s}){let{bind:t,updateNodeBindings:n}=s;if(!t||!n){console.error("[Lego] b-for directive missing required helpers: bind, updateNodeBindings");return}let{anchor:i,listName:a,itemName:c,keyPath:l,template:d}=e,{contextEl:u}=s,f=x(a,{state:o,global:r,self:u})||[];k.has(i)||k.set(i,new Map);let m=k.get(i),b=new Set,h=[];f.forEach((p,$)=>{let E;l?(E=D(l,p),E===void 0&&console.warn(`[Lego] b-key="${l}" resolved to undefined for item at index ${$}. Check for typos.`)):p&&typeof p=="object"?(E=p.id||p._id||p.uuid||p.key,E===void 0&&(X.has(p)||X.set(p,Math.random()),E=X.get(p))):E=`${$}-${p}`,b.add(E);let T=m.get(E);T||(T=d.cloneNode(!0),T.removeAttribute("b-for"),T.removeAttribute("b-key"),m.set(E,T),t(T,u,{name:c,listName:a,index:$}));let Ie=Object.assign(Object.create(o),{[c]:p,$index:$});n(T,Ie),T.querySelectorAll("[b-sync]").forEach(pe=>{let me=pe.getAttribute("b-sync");if(me.startsWith(`${c}.`)){let qe=x(a,{state:o,global:r,self:u});Y(pe,D(me.split(".").slice(1).join("."),qe[$]))}}),h.push(T)});let w=i.nextSibling;h.forEach(p=>{p!==w?i.parentNode.insertBefore(p,w):w=w.nextSibling});for(let[p,$]of m.entries())b.has(p)||($.remove(),m.delete(p))}};var Le={scan:e=>{if(e.hasAttribute("b-init"))return{type:"b-init",node:e,expr:e.getAttribute("b-init")}},execute:({binding:e,state:o})=>{e.initialized||(e.initialized=!0,x(e.expr,{state:o}))}};var _e={name:"b-enter",scan:e=>O("b-enter",e,(o,r)=>({modifiers:o.name.split(".").slice(1)})),execute:({binding:e,state:o})=>{if(e.observer||e.done)return;let r=new IntersectionObserver((s,t)=>{s[0].isIntersecting&&(x(e.expr,{state:o,self:e.node}),e.modifiers.includes("once")&&(t.disconnect(),e.observer=null,e.done=!0))});r.observe(e.node),e.observer=r},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var Te={scan:e=>O("b-leave",e),execute:({binding:e,state:o})=>{if(e.observer||e.done)return;let r=new IntersectionObserver((s,t)=>{let n=s[0];n.isIntersecting&&(e.activated=!0),!n.isIntersecting&&e.activated&&(x(e.expr,{state:o,self:e.node}),e.modifiers.includes("once")&&(t.disconnect(),e.observer=null,e.done=!0))});r.observe(e.node),e.observer=r},destroy:({binding:e})=>{e.observer&&(e.observer.disconnect(),e.observer=null)}};var G={"b-if":we,"b-show":xe,"b-text":Se,"b-html":ve,"b-sync":Ne,"b-for":$e,"b-init":Le,"b-enter":_e,"b-leave":Te};var Ue=(e=null)=>{let o=!1,r=new Set,s=!1,t=e,n=new Set,i=null,a=new Set,c=f=>{t=f},l=()=>{i&&clearTimeout(i),i=setTimeout(()=>{a.forEach(f=>{let m=f._studs;if(m&&typeof m.updated=="function")try{m.updated.call(m)}catch(b){console.error("[Lego] Error in updated hook:",b)}}),a.clear(),i=null},50)},d=()=>{n.size>0&&(n.forEach(f=>r.add(f)),n.clear(),!o&&r.size>0&&(o=!0,requestAnimationFrame(u)))},u=()=>{s=!0;let f=Array.from(r);r.clear(),o=!1,f.forEach(m=>{m.isConnected&&t&&t(m)}),f.forEach(m=>a.add(m)),l(),s=!1,d()};return{add:f=>{if(f){if(s){n.add(f);return}r.add(f),!o&&(o=!0,requestAnimationFrame(u))}},setHandler:c}},re=Ue();var L=new Map,oe=new Map,J=new WeakMap,V=new Map,je=e=>{let o=Array.from(V.entries()).filter(([t])=>t.startsWith("lego:")).sort((t,n)=>t[1].timestamp-n[1].timestamp),r=0,s=[];for(let[t,n]of o){if(r>=e)break;try{localStorage.removeItem(t),r+=n.size,s.push(t),V.delete(t)}catch(i){console.error(`[Lego] Failed to evict ${t}:`,i)}}return s},Ae=(e,o,r)=>{g.debug&&console.log("[Lego Trace] scheduleSave",e,o,r),oe.has(e)&&clearTimeout(oe.get(e));let s=()=>{try{let t=JSON.stringify(o),n=new Blob([t]).size;localStorage.setItem(e,t);let i=e.startsWith("lego:")?e:`lego:${e}`;V.set(i,{timestamp:Date.now(),size:n}),oe.delete(e)}catch(t){if(t.name==="QuotaExceededError"){console.warn(`[Lego] Storage quota exceeded for key: ${e}`);try{let n=JSON.stringify(o),i=new Blob([n]).size,a=je(i*2);if(a.length>0){g.debug&&console.log(`[Lego] Evicted ${a.length} old keys, retrying save`),localStorage.setItem(e,n);let c=e.startsWith("lego:")?e:`lego:${e}`;V.set(c,{timestamp:Date.now(),size:i})}else g.onError(new Error("Storage quota exceeded and no keys available for eviction"),"quota",e)}catch{g.onError(new Error(`Critical: Could not save ${e} even after eviction`),"quota-critical",e)}}else console.error(`[Lego] Storage Error (${e}):`,t)}};r>0?oe.set(e,setTimeout(s,r)):s()},fe=e=>({__type:"lego-db",key:e,_default:void 0,_debounce:0,default(r){return this._default=r,this},debounce(r){return this._debounce=r,this},set(r,s=0){return Ae(e,r,s),L.has(e)&&L.get(e).forEach(({target:t,prop:n,el:i,batcher:a})=>{t[n]=r,i&&a&&a.add(i)}),r},get(){try{let r=localStorage.getItem(e);return r!==null?JSON.parse(r):null}catch(r){return console.warn(`[Lego] Failed to get localStorage value for key "${e}":`,r),null}},delete(){try{return localStorage.removeItem(e),V.delete(e.startsWith("lego:")?e:`lego:${e}`),L.has(e)&&L.get(e).forEach(({target:r,prop:s,el:t,batcher:n})=>{r[s]=null,t&&n&&n.add(t)}),!0}catch(r){return console.error(`[Lego] Failed to delete localStorage key "${e}":`,r),!1}}}),Ce=e=>e&&e.__type==="lego-db",ke=(e,o,r,s,t)=>{g.debug&&console.log("[Lego Trace] Reactive DB Init:",o,r);let n=r._default;try{let i=localStorage.getItem(r.key);i!==null&&(n=JSON.parse(i))}catch(i){console.warn(`[Lego] Failed to parse localStorage value for key "${r.key}":`,i)}e[o]=n,J.has(e)||J.set(e,{}),J.get(e)[o]={key:r.key,debounce:r._debounce},g.debug&&console.log("[Lego Trace] DB Metadata Set:",o,J.get(e)[o]),L.has(r.key)||L.set(r.key,new Set),L.get(r.key).add({target:e,prop:o,el:s,batcher:t})},Me=(e,o,r)=>{let s=J.get(e);if(s&&s[o]){let t=s[o].key;Ae(t,r,s[o].debounce),L.has(t)&&L.get(t).forEach(({target:n,prop:i,el:a,batcher:c})=>{n!==e&&(n[i]=r,a&&c&&c.add(a))})}},Oe=()=>{typeof window<"u"&&window.addEventListener("storage",e=>{if(!(!e.key||!L.has(e.key)))try{let o=JSON.parse(e.newValue);L.get(e.key).forEach(({target:r,prop:s,el:t,batcher:n})=>{r[s]=o,t&&n&&n.add(t)})}catch(o){console.warn("[Lego] Cross-tab sync error:",o)}})};var z=(e,o,r=re)=>{if(e===null||typeof e!="object"||ae(e))return e;if(I.has(e))return I.get(e);for(let n in e){let i=Object.getOwnPropertyDescriptor(e,n);if(i&&i.get)continue;let a=e[n];Ce(a)&&ke(e,n,a,o,r)}let s={get:(n,i)=>{let a=Reflect.get(n,i);return a!==null&&typeof a=="object"&&!ae(a)?z(a,o,r):a},set:(n,i,a,c)=>{if(i==="__proto__"||i==="constructor"||i==="prototype")return console.warn(`[Lego] Blocked setting dangerous property: "${i}"`),!0;let l=n[i];g.debug&&l!==a&&console.log("[Lego Trace] Reactive SET:",i,"Old:",l,"New:",a,"Target:",n);let d=Reflect.set(n,i,a,c);return c===I.get(n)&&l!==a&&(r.add(o),Me(n,i,a)),d},deleteProperty:(n,i)=>{let a=Reflect.deleteProperty(n,i);return r.add(o),a}},t=new Proxy(e,s);return I.set(e,t),t};var Ke=e=>{let o=e;for(;o;){let r=o.getAttribute&&o.getAttribute("b-error");if(r&&r.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:r,targetElement:o};let s=o.tagName?o.tagName.toLowerCase():"",t=y[s];if(t){let n=t.getAttribute("b-error");if(n&&n.toLowerCase()!==e.tagName.toLowerCase())return{errorTag:n,targetElement:o}}o=o.parentElement||o.getRootNode&&o.getRootNode().host}return null},de=null,Be=null,De=(e,o)=>{de=e,Be=o},Ge=(e,o,r)=>{if(!de||!Be){console.error("[Lego] Error boundary dependencies not loaded",r);return}try{o.shadowRoot?o.shadowRoot.innerHTML="":o.innerHTML="";let s=document.createElement(e);s.$initialState={$error:{message:r.message,stack:r.stack,component:o.tagName.toLowerCase()}},(o.shadowRoot||o).appendChild(s),de(s)}catch(s){console.error("[Lego] Error boundary failed to render:",s),console.error("[Lego] Original error:",r)}},W=(e,o,r)=>{let s=Ke(o);s?Ge(s.errorTag,s.targetElement,e):g.onError(e,r,o)};var se=(e,o,r=null)=>{let s=o._studs,t=a=>{let c=M(a);if(!c.bound){if(a.hasAttributes()){let l=a.attributes;for(let d=0;d<l.length;d++){let u=l[d];if(u.name.startsWith("@")){let f=u.name.slice(1).split("."),m=f[0],b=f.slice(1);a.addEventListener(m,h=>{if(b.includes("prevent")&&h.preventDefault(),b.includes("stop")&&h.stopPropagation(),!(b.includes("self")&&h.target!==h.currentTarget)){if(typeof KeyboardEvent<"u"&&h instanceof KeyboardEvent){if(b.includes("ctrl")&&!h.ctrlKey||b.includes("alt")&&!h.altKey||b.includes("shift")&&!h.shiftKey||b.includes("meta")&&!h.metaKey)return;let w=b.filter(p=>!["prevent","stop","self","ctrl","alt","shift","meta","capture","once","passive"].includes(p));if(w.length>0){let p=h.key.toLowerCase();if(!w.some(E=>E==="enter"?p==="enter":E==="esc"||E==="escape"?p==="escape":E==="space"?p===" ":E==="tab"?p==="tab":E==="delete"?p==="delete":E==="backspace"?p==="backspace":E==="up"?p==="arrowup":E==="down"?p==="arrowdown":E==="left"?p==="arrowleft":E==="right"?p==="arrowright":E==="alpha"?/^[a-z]$/.test(p):E==="numbers"?/^[0-9]$/.test(p):E===p))return}}try{let w=s;if(r){let $=x(r.listName,{state:s,global:S,self:o})[r.index];w=Object.assign(Object.create(s),{[r.name]:$})}x(u.value,{state:w,global:S,self:a,event:h,$event:h},!0)}catch(w){W(w,o,"event-handler")}}})}}if(a.hasAttribute("b-sync")){let d=a.getAttribute("b-sync"),u=()=>{try{let f,m;if(r&&d.startsWith(`${r.name}.`)){let w=x(r.listName,{state:s,global:S,self:o})[r.index];if(!w)return;let p=d.split(".").slice(1);m=p.pop(),f=p.reduce(($,E)=>$[E],w)}else{let h=d.split(".");m=h.pop(),f=h.reduce((w,p)=>w[p],s)}let b=a.type==="checkbox"?a.checked:a.value;f&&f[m]!==b&&(f[m]=b)}catch(f){g.onError(f,"sync-update",a)}};a.addEventListener("input",u),a.addEventListener("change",u)}if(a.hasAttribute("b-var")){let d=a.getAttribute("b-var");s.$vars&&(s.$vars[d]=a)}}c.bound=!0}};e instanceof Element&&t(e);let n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),i;for(;i=n.nextNode();)t(i)},Je=e=>{let o=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),s,t=[];for(;s=r.nextNode();){let n=s;if((c=>{let l=c.parentNode;for(;l&&l!==e;){if(l.hasAttribute&&l.hasAttribute("b-for"))return!0;l=l.parentNode}return!1})(s))continue;let a=c=>{if(/\bglobal\b/.test(c)){let l=e.host||e;q.add(l)}};if(s.nodeType===Node.ELEMENT_NODE){let c=!1;for(let[d,u]of Object.entries(G))if(u.scan){let f=u.scan(s,{checkGlobal:a,getPrivateData:M,pendingOperations:t,current:n});f&&(o.push(f),f.terminal&&(c=!0))}if(c)continue;let[l]=U();[...s.attributes].forEach(d=>{d.value.includes(l)&&(a(d.value),o.push({type:"attr",node:s,attrName:d.name,template:d.value}))})}else if(s.nodeType===Node.TEXT_NODE){let[c]=U();s.textContent.includes(c)&&(a(s.textContent),o.push({type:"text",node:s,template:s.textContent}))}}return t.forEach(n=>n()),o},Ve=(e,o)=>{let r=n=>{if(n.nodeType===Node.TEXT_NODE){n._tpl===void 0&&(n._tpl=n.textContent);let i=n._tpl.replace(j(),(a,c)=>x(c.trim(),{state:o,global:S,self:n},!1)??"");n.textContent!==i&&(n.textContent=i)}else if(n.nodeType===Node.ELEMENT_NODE){let[i]=U();[...n.attributes].forEach(a=>{if(a._tpl===void 0&&(a._tpl=a.value),a._tpl.includes(i)){let c=a._tpl.replace(j(),(l,d)=>x(d.trim(),{state:o,global:S,self:n},!1)??"");a.value!==c&&(a.value=c,a.name==="class"&&(n.className=c))}})}};r(e);let s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT),t;for(;t=s.nextNode();)r(t)},H=e=>{g.debug&&console.log("[Lego Trace] render() called for:",e.tagName);let o=e._studs;if(!o)return;let r=M(e);if(!r.rendering){r.rendering=!0,g.metrics&&g.metrics.onRenderStart&&g.metrics.onRenderStart(e);try{let s=e.shadowRoot||e;r.bindings||(r.bindings=Je(s)),r.bindings.forEach(t=>{let n=G[t.type];if(n){n.execute({binding:t,state:o,global:S,helpers:{bind:se,updateNodeBindings:Ve,contextEl:e}});return}if(t.type==="text"){let i=t.template.replace(j(),(a,c)=>x(c.trim(),{state:o,global:S,self:t.node},!1)??"");t.node.textContent!==i&&(t.node.textContent=i)}if(t.type==="attr"){let i=t.template.replace(j(),(a,c)=>x(c.trim(),{state:o,global:S,self:t.node},!1)??"");t.node.getAttribute(t.attrName)!==i&&(t.node.setAttribute(t.attrName,i),t.attrName==="class"&&(t.node.className=i))}}),o===S&&q.forEach(t=>H(t))}catch(s){W(s,e,"render")}finally{g.metrics&&g.metrics.onRenderEnd&&g.metrics.onRenderEnd(e),r.rendering=!1}}};var Re=new Map,Pe={},Fe=e=>{Pe=e},ze=async()=>{let e=Object.entries(Pe).map(async([o,r])=>{let s=await Promise.all(r.map(async t=>{try{if(t instanceof CSSStyleSheet)return t;let n=await fetch(t);if(!n.ok)throw new Error(`Status ${n.status}`);let i=await n.text(),a=new CSSStyleSheet;return await a.replace(i),a}catch(n){return console.error(`[Lego] Failed to load stylesheet: ${t}`,n),null}}));Re.set(o,s.filter(t=>t!==null))});await Promise.all(e),g.debug&&console.log("[Lego Debug] Re-applying stylesheets to",_.size,"blocks"),_.forEach(o=>{ue(o)})},ue=e=>{if(!e.shadowRoot&&!e._legoShadow)return;let o=e.shadowRoot||e._legoShadow,r=e.tagName.toLowerCase(),s=y[r],t=(s&&s.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),n=(e.getAttribute("b-stylesheets")||"").split(/\s+/).filter(Boolean),i=[],a=e.parentElement||(e.getRootNode?e.getRootNode().host:null);for(;a;){let u=(a.getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);u.length&&i.push(...u);let f=a.tagName?a.tagName.toLowerCase():"";if(y[f]){let m=(y[f].getAttribute("b-cascade")||"").split(/\s+/).filter(Boolean);m.length&&i.push(...m)}a=a.parentElement||a.getRootNode&&a.getRootNode().host}let c=[...new Set([...t,...n])],l=[...new Set(i)],d=[...new Set([...l,...c])];if(d.length>0){let u=d.flatMap(f=>Re.get(f)||[]);u.length>0&&g.debug&&console.log("[Lego Debug] Applying styles to",e.tagName,"- Names:",d,"- Sheets:",u.length),u.length>0&&(o.adoptedStyleSheets=[...u])}e._studsMeta={stylesheets:{explicit:c,inherited:l,applied:d}}};var N=e=>{if(g.debug&&console.log("[Lego Trace] snap() called for:",e.tagName),!e||e.nodeType!==Node.ELEMENT_NODE)return;let o=M(e),r=e.tagName.toLowerCase(),s=y[r];if(s&&!o.snapped){o.snapped=!0;let n=s.content.cloneNode(!0),i=e.shadowRoot;i?i.innerHTML="":i=e.attachShadow({mode:"open"}),ue(e);let a=F(e,"*")||F(e.getRootNode().host,"*"),c=a&&a.state?a.state:{},l=P.get(r)||{},d=le(s.getAttribute("b-logic")||s.getAttribute("b-data")||"{}"),u=le(e.getAttribute("b-logic")||e.getAttribute("b-data")||"{}",c),f={$vars:{},$element:e,get $parent(){return F(e,"*")},$emit:(h,w)=>{e.dispatchEvent(new CustomEvent(h,{detail:w,bubbles:!0,composed:!0}))},get $route(){return S.$route},get $go(){return S.$go}};B(l,f),B(d,f),B(u,f),e.$initialState&&(B(e.$initialState,f),delete e.$initialState),e._studs=z(f,e),Object.defineProperty(e,"state",{get(){return this._studs},set(h){Object.assign(this._studs,h)},configurable:!0,enumerable:!1}),i.appendChild(n);let m=i.querySelector("style");m&&(m.textContent=m.textContent.replace(/\bself\b/g,":host")),se(i,e),_.add(e),H(e),e.setAttribute("b-id",r);let b=i.querySelectorAll("*");if(g.debug&&console.log("[Lego Debug] Nested scan in",e.tagName,"- Found elements:",b.length),b.forEach(h=>{let w=h.tagName.toLowerCase(),p=!!y[w];p&&g.debug&&console.log("[Lego Debug] Checking",w,"- Registered:",p),p&&N(h)}),e._legoShadow||(e._legoShadow=i),typeof e._studs.mounted=="function")try{e._studs.mounted.call(e._studs)}catch(h){W(h,e,"mounted")}}let t=e.parentElement;for(;t&&!t._studs;)t=t.parentElement;t&&t._studs&&se(e,t),[...e.children].forEach(N)},A=e=>{if(e._studs&&typeof e._studs.unmounted=="function")try{e._studs.unmounted.call(e._studs)}catch(r){W(r,e,"unmounted")}e.shadowRoot&&[...e.shadowRoot.children].forEach(A),_.delete(e),q.delete(e),e._studs&&(e._studs.$element=null,e._studs.$vars&&(Object.keys(e._studs.$vars).forEach(r=>{e._studs.$vars[r]=null}),e._studs.$vars=null),e._studs.$emit&&(e._studs.$emit=null),delete e._studs.$parent,delete e._studs.$route,delete e._studs.$go,e._studs=null),e.hasOwnProperty("state")&&delete e.state;let o=R.get(e);if(o&&(o.bindings&&(o.bindings.forEach(r=>{let s=G[r.type];if(s&&s.destroy)try{s.destroy({binding:r})}catch(t){console.error(`[Lego] Error in directive cleanup (${r.type}):`,t)}r.node=null,r.anchor=null}),o.bindings=null),o.anchor=null,R.delete(e)),k.has(e)){let r=k.get(e);r.forEach((s,t)=>{s&&s._studs&&(s._studs=null)}),r.clear(),k.delete(e)}[...e.children].forEach(A)};function We(e,o="block.lego"){let r={template:"",script:"",style:"",stylesAttr:"",cascadeAttr:"",errorAttr:"",blockName:be(o),hasTemplate:!1,hasScript:!1,hasStyle:!1},s=e,t=/<(template|script|style)\b((?:\s+(?:[^>"']|"[^"]*"|'[^']*')*)*)>/i;for(;s;){let n=s.match(t);if(!n)break;let i=n[1].toLowerCase(),a=n[2],c=n[0],l=n.index,d=`</${i}>`,u=l+c.length,f=s.indexOf(d,u);if(f===-1){console.warn(`[Lego] Unclosed <${i}> tag in ${o}`);break}let m=s.slice(u,f);if(i==="template"){r.hasTemplate=!0,r.template=m.trim();let b=a.match(/b-stylesheets=["']([^"']+)["']/);b&&(r.stylesAttr=b[1]);let h=a.match(/b-cascade=["']([^"']+)["']/);h&&(r.cascadeAttr=h[1]);let w=a.match(/b-error=["']([^"']+)["']/);w&&(r.errorAttr=w[1])}else if(i==="script"){r.hasScript=!0,r.script=m.trim();let b=a.match(/lang=["']([^"']+)["']/);b&&(r.scriptLang=b[1])}else i==="style"&&(r.hasStyle=!0,r.style=m.trim());s=s.slice(f+d.length)}return r}var He=(e,o,r="block.lego")=>{let s=We(o,r),{blockName:t,template:n,script:i,style:a,stylesAttr:c,cascadeAttr:l,errorAttr:d}=s,u={};if(i)try{let m=i.trim(),b=m.match(/export\s+default\s+({[\s\S]*})/),h=b?b[1]:m;u=new Function("Lego","$db",`return ${h}`)(e,e.globals.$db)}catch(m){g.onError(m,"script",t)}let f=n;a&&(f=`<style>${a}</style>`+f),y[t]=document.createElement("template"),y[t].innerHTML=f,c&&y[t].setAttribute("b-stylesheets",c),l&&y[t].setAttribute("b-cascade",l),d&&y[t].setAttribute("b-error",d),P.set(t,u),document.querySelectorAll(t).forEach(m=>!M(m).snapped&&N(m))};re.setHandler(H);De(N,H);ye(N);var Xe={url:typeof window<"u"?window.location.pathname:"/",route:"",params:{},query:{},method:"GET",body:null},C=z({$route:Xe,$go:(e,...o)=>te(e,...o)(document.body),$db:fe},typeof document<"u"?document.body:null);ge(C);var v={db:fe,snap:N,unsnap:A,defineLegoFile:(e,o)=>He(v,e,o),block:(e,o,r={},s="",t="",n="")=>{let i=document.createElement("template");i.setAttribute("b-id",e),i.setAttribute("b-stylesheets",s),t&&i.setAttribute("b-cascade",t),n&&i.setAttribute("b-error",n),i.innerHTML=o,y[e]=i,P.set(e,r);try{let a={};B(r,a),Q.set(e.toLowerCase(),z(a,document.body))}catch(a){g.onError(a,"define",e)}if(customElements.get(e))document.querySelectorAll(e).forEach(a=>{A(a),N(a)}),_.forEach(a=>{a._legoShadow&&a._legoShadow.querySelectorAll(e).forEach(c=>{A(c),N(c)})});else try{customElements.define(e,class extends HTMLElement{connectedCallback(){y[e]&&N(this)}disconnectedCallback(){A(this)}})}catch(a){console.warn(`[Lego] Failed to register web component ${e}:`,a)}},getActiveBlocksCount:()=>_.size,getLegos:()=>Object.keys(y),config:g,globals:C,route:(e,o,r=null)=>{let s=[],t=e==="*"?".*":e;t=t.replace(/:([^\/]+)|[.*+?^${}()|[\]\\]/g,(n,i)=>i?(s.push(i),"([^/]+)"):"\\"+n),K.push({path:e,regex:new RegExp(`^${t}$`),tagName:o,paramNames:s,middleware:r})},debug:{stylesheets:e=>!e||!e._studsMeta?null:e._studsMeta.stylesheets},init:async(e=document.body,o={})=>{if((!e||typeof e.nodeType!="number")&&(e=document.body),Fe(o.styles||{}),g.loader=o.loader,g.debug=o.debug===!0,await ze(),K.length>0){let t=window.location.pathname,n=window.location.search,i=ce(t);if(i){let{match:a,params:c}=i,l=Object.fromEntries(new URLSearchParams(n));C.$route.url=t+n,C.$route.route=a.path,C.$route.params=c,C.$route.query=l,C.$route.method="GET",C.$route.body=null}}document.querySelectorAll("template[b-id]").forEach(t=>{let n=t.getAttribute("b-id");y[n]=t,customElements.get(n)||customElements.define(n,class extends HTMLElement{connectedCallback(){y[n]&&N(this)}disconnectedCallback(){A(this)}})});let r=t=>{if(!t)return{};let n={};return Object.entries(t).forEach(([i,a])=>{if(typeof a=="function")n[i]=a();else if(typeof a=="string"&&a.startsWith("$db.")){let c=a.slice(4);n[i]=v.db(c).get()}else if(typeof a=="string"&&a.startsWith("$globals.")){let c=a.slice(9);n[i]=S[c]}else n[i]=a}),n},s=(t,n,i={})=>{customElements.get(t)||customElements.define(t,class extends HTMLElement{async connectedCallback(){if(y[t]){N(this);return}if(v._fetching||(v._fetching=new Set),!v._fetching.has(t)){v._fetching.add(t);try{let a=n.startsWith("POST:")?"POST":"GET",c=n.replace(/^POST:/,""),l=r(i.headers),d={method:a,headers:l,credentials:i.credentials},f=await(await fetch(c,d)).text();v.defineLegoFile(f,`${t}.lego`),y[t]&&N(this)}catch(a){console.error(`[Lego] Failed to load manifest block ${t}:`,a)}finally{v._fetching.delete(t)}}}disconnectedCallback(){A(this)}})};if(o.manifest){let t=o.manifest;if(t.url&&typeof t.url=="string")try{let i=r(t.headers);t=await(await fetch(t.url,{headers:i,credentials:t.credentials})).json()}catch(i){console.error("[Lego] Failed to load manifest:",i),t=[]}else if(typeof t=="string")try{t=await(await fetch(t)).json()}catch(i){console.error("[Lego] Failed to load manifest:",i),t=[]}let n=Array.isArray(t)?t:[t];for(let i of n){let a=i.base||"",c=i.suffix===!0?".lego":i.suffix||"",l={headers:i.headers||{},credentials:i.credentials};i.legos&&i.legos.forEach(d=>{s(d,`${a}${d}${c}`,l)}),i.map&&Object.entries(i.map).forEach(([d,u])=>{let f=u.match(/^https?:|^\//)?u:`${a}${u}`;s(d,f,l)})}}if(g.loader){let t=a=>{if(a.nodeType!==Node.ELEMENT_NODE)return;let c=a.tagName.toLowerCase();if(c.includes("-")&&!y[c]&&!_.has(a)){if(v._fetching&&v._fetching.has(c))return;v._fetching||(v._fetching=new Set),v._fetching.add(c);let l=g.loader(c);if(l){let d=typeof l=="string"?fetch(l).then(u=>u.text()):l;Promise.resolve(d).then(u=>{v.defineLegoFile(u,`${c}.lego`),v._fetching.delete(c)}).catch(u=>{console.error(`[Lego] Failed to load ${c}:`,u),v._fetching.delete(c)})}}if(a.children.length>0){let l=a.firstElementChild;for(;l;)t(l),l=l.nextElementSibling}};new MutationObserver(a=>a.forEach(c=>{c.addedNodes.forEach(t)})).observe(e,{childList:!0,subtree:!0});let i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(;i.nextNode();)t(i.currentNode)}if(o.studio){if(!y["lego-studio"]){let t=document.createElement("script");t.src="https://unpkg.com/@legodom/studio@0.0.2/dist/lego-studio.js",t.onerror=()=>console.warn("[Lego] Failed to load Studio from CDN"),document.head.appendChild(t)}v.route("/_/studio","lego-studio"),v.route("/_/studio/:block","lego-studio")}K.length>0&&(window.addEventListener("popstate",t=>{let n=t.state?.legoTargets||null;ee(n)}),document.addEventListener("submit",t=>{t.preventDefault()}),document.addEventListener("click",t=>{let i=t.composedPath().find(a=>a.tagName==="A"&&(a.hasAttribute("b-target")||a.hasAttribute("b-link")));if(i){t.preventDefault();let a=i.getAttribute("href"),c=i.getAttribute("b-target"),l=c?c.split(/\s+/).filter(Boolean):[],d=i.getAttribute("b-link")!=="false";C.$go(a,...l).get(d)}}),ee()),Oe()}};typeof window<"u"?window.Lego=v:typeof global<"u"&&(global.Lego=v);var go=v;})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lego-dom",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "A feature-rich web components + SFC frontend framework",
|
|
6
6
|
"main": "dist/lego.min.js",
|
|
@@ -57,4 +57,4 @@
|
|
|
57
57
|
"type": "git",
|
|
58
58
|
"url": "https://github.com/rayattack/legodom.git"
|
|
59
59
|
}
|
|
60
|
-
}
|
|
60
|
+
}
|