@dinoreic/fez 0.2.2 → 0.3.2

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 CHANGED
@@ -144,12 +144,13 @@ This example showcases:
144
144
  * **Reactive State Management** - Built-in reactive `state` object automatically triggers re-renders on property changes
145
145
  * **DOM Morphing** - Uses [Idiomorph](https://github.com/bigskysoftware/idiomorph) for intelligent DOM updates that preserve element state and animations
146
146
  * **Preserve DOM Elements** - Use `fez-keep="unique-key"` attribute to preserve DOM elements across re-renders (useful for animations, form inputs, or stateful elements)
147
+ * **DOM Memoization** - Use `fez-memoize="key"` attribute to memoize and restore DOM content by key (component-scoped) or `<fez-memoize key="unique-key">` component for global memoization
147
148
  * **Style Macros** - Define custom CSS shortcuts like `Fez.styleMacro('mobile', '@media (max-width: 768px)')` and use as `:mobile { ... }`
148
149
  * **Scoped & Global Styles** - Components can define both scoped CSS (`:fez { ... }`) and global styles in the same component
149
150
 
150
151
  ### Developer Experience
151
152
 
152
- * **Built-in Utilities** - Helpful methods like `formData()`, `setInterval()` (auto-cleanup), `onResize()`, and `nextTick()`
153
+ * **Built-in Utilities** - Helpful methods like `formData()`, `setInterval()` (auto-cleanup), `onWindowResize()`, and `nextTick()`
153
154
  * **Two-Way Data Binding** - Use `fez-bind` directive for automatic form synchronization
154
155
  * **Advanced Slot System** - Full `<slot />` support with event listener preservation
155
156
  * **Publish/Subscribe** - Built-in pub/sub system for component communication
@@ -159,8 +160,8 @@ This example showcases:
159
160
 
160
161
  ### Performance & Integration
161
162
 
162
- * **Fast/Slow Render Modes** - Optimize initial render with `FAST = true` to prevent flickering
163
- * **Request Animation Frame** - Smart RAF integration for smooth updates
163
+ * **Optimized Rendering** - Batched microtask rendering for flicker-free component initialization
164
+ * **Smart DOM Updates** - Efficient DOM manipulation with minimal reflows
164
165
  * **Built-in Fetch with Caching** - `Fez.fetch()` includes automatic response caching and JSON/FormData handling
165
166
  * **Global Component Access** - Register components globally with `GLOBAL = 'ComponentName'` for easy access
166
167
  * **Rich Lifecycle Hooks** - `init`, `onMount`, `beforeRender`, `afterRender`, `onDestroy`, `onPropsChange`, `onStateChange`, `onGlobalStateChange`
@@ -195,14 +196,6 @@ Fez('foo-bar', class {
195
196
  // set element style, set as property or method
196
197
  CSS = `scss string... `
197
198
 
198
- // unless node has no innerHTML on initialization, bind will be set to slow (fastBind = false)
199
- // if you are using components that to not use innerHTML and slots, enable fast bind (fastBind = true)
200
- // component will be rendered as parsed, and not on next tick (reduces flickering)
201
- // <fez-icon name="gear" />
202
- FAST = true
203
- FAST(node) { ... }
204
- // alternative: static fastBind() { return true }
205
-
206
199
  // define static HTML. calling `this.render()` (no arguments) will refresh current node.
207
200
  // if you pair it with `reactiveStore()`, to auto update on props change, you will have Svelte or Vue style reactive behaviour.
208
201
  HTML = `...`
@@ -293,11 +286,11 @@ Fez('foo-bar', class {
293
286
 
294
287
  // window resize event with cleanup (shorthand for this.on('resize', func, delay))
295
288
  // runs immediately on init and then throttled
296
- this.onResize(func, delay)
289
+ this.onWindowResize(func, delay)
297
290
 
298
291
  // window scroll event with cleanup (shorthand for this.on('scroll', func, delay))
299
292
  // runs immediately on init and then throttled
300
- this.onScroll(func, delay)
293
+ this.onWindowScroll(func, delay)
301
294
 
302
295
  // requestAnimationFrame wrapper with deduplication
303
296
  this.nextTick(func, name)
@@ -351,7 +344,7 @@ Fez.css(text)
351
344
  // get generated css class name without global attachment
352
345
  Fez.cssClass(text)
353
346
 
354
- // display information about fast/slow bind components in console
347
+ // display information about registered components in console
355
348
  Fez.info()
356
349
 
357
350
  // low-level DOM morphing function
@@ -366,6 +359,12 @@ Fez.tag(tag, opts, html)
366
359
  // execute function until it returns true
367
360
  Fez.untilTrue(func, pingRate)
368
361
 
362
+ // resolve and execute a function from string or function reference
363
+ // useful for event handlers that can be either functions or strings
364
+ // Fez.resolveFunction('alert("hi")', element) - creates function and calls with element as this
365
+ // Fez.resolveFunction(myFunc, element) - calls myFunc with element as this
366
+ Fez.resolveFunction(pointer, context)
367
+
369
368
  // add scripts/styles to document head
370
369
  // Load JavaScript from URL: Fez.head({ js: 'path/to/script.js' })
371
370
  // Load JavaScript with attributes: Fez.head({ js: 'path/to/script.js', type: 'module', async: true })
@@ -395,9 +394,6 @@ Fez.head(config, callback)
395
394
  <!-- pass JSON template via data-json-template -->
396
395
  <script type="text/template">{...}</script>
397
396
  <foo-bar data-json-template="true"></foo-bar>
398
-
399
- <!-- override slow bind behavior -->
400
- <foo-bar fez-fast="true"></foo-bar>
401
397
  ```
402
398
 
403
399
  ## Component structure
@@ -478,6 +474,10 @@ All parts are optional
478
474
  <!-- preserve state by key, not affected by state changes-->>
479
475
  <p fez-keep="key">...</p>
480
476
 
477
+ <!-- memoize DOM content by key (component-scoped) -->
478
+ <!-- stores DOM on first render, restores on subsequent renders with same key -->
479
+ <div fez-memoize="unique-key">expensive content</div>
480
+
481
481
  <!-- :attribute for evaluated attributes (converts to JSON) -->
482
482
  <div :data-config="state.config"></div>
483
483
  </div>
@@ -552,6 +552,45 @@ Fez.onError = (kind, error) => {
552
552
  }
553
553
  ```
554
554
 
555
+ ## Default Components
556
+
557
+ Fez includes several built-in components available when you include `defaults.js`:
558
+
559
+ ### fez-component
560
+ Dynamically includes a Fez component by name:
561
+ ```html
562
+ <fez-component name="some-node" :props="fez.props"></fez-component>
563
+ ```
564
+
565
+ ### fez-include
566
+ Loads remote HTML content via URL:
567
+ ```html
568
+ <fez-include src="./demo/fez/ui-slider.html"></fez-include>
569
+ ```
570
+
571
+ ### fez-inline
572
+ Creates inline components with reactive state:
573
+ ```html
574
+ <fez-inline :state="{count: 0}">
575
+ <button onclick="fez.state.count += 1">+</button>
576
+ {{ state.count }} * {{ state.count }} = {{ state.count * state.count }}
577
+ </fez-inline>
578
+ ```
579
+
580
+ ### fez-memoize
581
+ Memoizes DOM content by key (global scope):
582
+ ```html
583
+ <!-- First render: stores the content -->
584
+ <fez-memoize key="unique-key">
585
+ <expensive-component></expensive-component>
586
+ </fez-memoize>
587
+
588
+ <!-- Subsequent renders: restores stored content instantly -->
589
+ <fez-memoize key="unique-key">
590
+ <!-- Content here is ignored, stored version is used -->
591
+ </fez-memoize>
592
+ ```
593
+
555
594
  ## Global State Management
556
595
 
557
596
  Fez includes a built-in global state manager that automatically tracks component subscriptions. It automatically tracks which components use which state variables and only updates exactly what's needed.
package/dist/fez.js CHANGED
@@ -1,28 +1,31 @@
1
- (()=>{var ve=Object.defineProperty;var Se=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{for(var r in e)ve(t,r,{get:e[r],enumerable:!0})};var ie={};Ee(ie,{loadDefaults:()=>ne});var ne,oe=Se(()=>{ne=()=>{Fez("fez-component",class{FAST=!0;init(t){let e=document.createElement(t.name);for(e.props=t.props||t["data-props"]||t;this.root.firstChild;)this.root.parentNode.insertBefore(this.root.lastChild,e.nextSibling);this.root.innerHTML="",this.root.appendChild(e)}}),Fez("fez-include",class{FAST=!0;init(t){Fez.fetch(t.src,e=>{let r=Fez.domRoot(e);Fez.head(r),this.root.innerHTML=r.innerHTML})}}),Fez("fez-inline",class{init(t){let e=this.root.innerHTML;if(this.root.innerHTML.includes("<")){let s=`inline-${Fez.fnv1(this.root.outerHTML)}`;Fez(s,class{FAST=!0;HTML=e;init(){Object.assign(this.state,t.state||{})}});let n=document.createElement(s);this.root.after(this.root.lastChild,n),this.root.remove()}}})};typeof Fez<"u"&&Fez&&ne()});function D(t,e={},r){if(typeof e=="string"&&([e,r]=[r,e],e||={}),e instanceof Node&&(r=e,e={}),Array.isArray(t)&&(r=t,t="div"),(typeof e!="object"||Array.isArray(e))&&(r=e,e={}),t.includes(".")){let n=t.split(".");t=n.shift()||"div";let o=n.join(" ");e.class?e.class+=` ${o}`:e.class=o}let s=document.createElement(t);for(let[n,o]of Object.entries(e))if(typeof o=="function")s[n]=o.bind(this);else{let i=String(o).replaceAll("fez.",this.fezHtmlRoot);s.setAttribute(n,i)}if(r)if(Array.isArray(r))for(let n of r)s.appendChild(n);else r instanceof Node?s.appendChild(r):s.innerHTML=String(r);return s}function Ae(t,e){if(t=t.replace(/^#?raw/,"@html").replace(/^#?html/,"@html"),t.startsWith("#if")||t.startsWith("if"))return e.push(!1),t=t.replace(/^#?if/,""),`\${ ${t} ? \``;if(t.startsWith("#unless")||t.startsWith("unless"))return e.push(!1),t=t.replace(/^#?unless/,""),`\${ !(${t}) ? \``;if(t=="/block")return"`) && ''}";if(t.startsWith("#for")||t.startsWith("for")){t=t.replace(/^#?for/,"");let r=t.split(" in ",2);return"${"+r[1]+".map(("+r[0]+")=>`"}else if(t.startsWith("#each")||t.startsWith("each")){t=t.replace(/^#?each/,"");let r=t.split(" as ",2);return"${"+r[0]+".map(("+r[1]+")=>`"}else{if(t==":else"||t=="else")return e[e.length-1]=!0,"` : `";if(t=="/if"||t=="/unless")return e.pop()?"`}":"` : ``}";if(t=="/for"||t=="/each")return'`).join("")}';{let r="@html ";return t.startsWith("json ")&&(t=t.replace("json ","@html '<pre class=json>'+JSON.stringify("),t+=", null, 2) + '</pre>'"),t.startsWith(r)?t=t.replace(r,""):t=`Fez.htmlEscape(${t})`,"${"+t+"}"}}}function j(t,e={}){let r=[];t=t.replaceAll("[[","{{").replaceAll("]]","}}"),t=t.replace(/(\w+)=\{\{\s*(.*?)\s*\}\}([\s>])/g,(o,i,a,u)=>`${i}="{{ ${a} }}"${u}`);let s={};t=t.replace(/\{\{block\s+(\w+)\s*\}\}([^§]+)\{\{\/block\}\}/g,(o,i,a)=>(s[i]=a,"")),t=t.replace(/\{\{block:([\w\-]+)\s*\}\}/g,(o,i)=>s[i]||`block:${i}?`),t=t.replace(/:(\w+)="([\w\.\[\]]+)"/,(o,i,a)=>`:${i}=Fez.store.delete({{ Fez.store.set(${a}) }})`);let n=t.replace(/{{(.*?)}}/g,(o,i)=>(i=i.replaceAll("&#x60;","`"),i=i.replaceAll("&lt;","<").replaceAll("&gt;",">").replaceAll("&amp;","&"),Ae(i,r)));n=n.replace(/<!\-\-.*?\-\->/g,"").replace(/>\s+</g,"><"),n="`"+n.trim()+"`";try{let o=`const fez = this;
1
+ (()=>{var Ae=Object.defineProperty;var Ce=(r,e)=>()=>(r&&(e=r(r=0)),e);var we=(r,e)=>{for(var t in e)Ae(r,t,{get:e[t],enumerable:!0})};var ce={};we(ce,{loadDefaults:()=>le});var le,ae=Ce(()=>{le=()=>{Fez("fez-component",class{init(e){let t=document.createElement(e.name);for(t.props=e.props||e["data-props"]||e;this.root.firstChild;)this.root.parentNode.insertBefore(this.root.lastChild,t.nextSibling);this.root.innerHTML="",this.root.appendChild(t)}}),Fez("fez-include",class{init(e){Fez.fetch(e.src,t=>{let n=Fez.domRoot(t);Fez.head(n),this.root.innerHTML=n.innerHTML})}}),Fez("fez-inline",class{init(e){let t=this.root.innerHTML;if(this.root.innerHTML.includes("<")){let o=`inline-${Fez.fnv1(this.root.outerHTML)}`;Fez(o,class{HTML=t;init(){Object.assign(this.state,e.state||{})}});let s=document.createElement(o);this.root.after(this.root.lastChild,s),this.root.remove()}}});let r=new Map;Fez("fez-memoize",class{init(e){if(!e.key){Fez.error("fez-memoize: key prop is required");return}if(r.has(e.key)){let t=r.get(e.key);Fez.log(`Memoize - key: "${e.key}" - restore`),this.root.innerHTML="",this.root.appendChild(t.cloneNode(!0))}}onMount(e){r.has(e.key)||requestAnimationFrame(()=>{let t=document.createElement("div");t.innerHTML=this.root.innerHTML,Fez.log(`Memoize - key: "${e.key}" - set`),r.set(e.key,t)})}})};typeof Fez<"u"&&Fez&&le()});function D(r,e={},t){if(typeof e=="string"&&([e,t]=[t,e],e||={}),e instanceof Node&&(t=e,e={}),Array.isArray(r)&&(t=r,r="div"),(typeof e!="object"||Array.isArray(e))&&(t=e,e={}),r.includes(".")){let o=r.split(".");r=o.shift()||"div";let s=o.join(" ");e.class?e.class+=` ${s}`:e.class=s}let n=document.createElement(r);for(let[o,s]of Object.entries(e))if(typeof s=="function")n[o]=s.bind(this);else{let i=String(s).replaceAll("fez.",this.fezHtmlRoot);n.setAttribute(o,i)}if(t)if(Array.isArray(t))for(let o of t)n.appendChild(o);else t instanceof Node?n.appendChild(t):n.innerHTML=String(t);return n}function Te(r,e){if(r=r.replace(/^#?raw/,"@html").replace(/^#?html/,"@html"),r.startsWith("#if")||r.startsWith("if"))return e.push(!1),r=r.replace(/^#?if/,""),`\${ ${r} ? \``;if(r.startsWith("#unless")||r.startsWith("unless"))return e.push(!1),r=r.replace(/^#?unless/,""),`\${ !(${r}) ? \``;if(r=="/block")return"`) && ''}";if(r.startsWith("#for")||r.startsWith("for")){r=r.replace(/^#?for/,"");let t=r.split(" in ",2);return"${"+t[1]+".map(("+t[0]+")=>`"}else if(r.startsWith("#each")||r.startsWith("each")){r=r.replace(/^#?each/,"");let t=r.split(" as ",2);return"${"+t[0]+".map(("+t[1]+")=>`"}else{if(r==":else"||r=="else")return e[e.length-1]=!0,"` : `";if(r=="/if"||r=="/unless")return e.pop()?"`}":"` : ``}";if(r=="/for"||r=="/each")return'`).join("")}';{let t="@html ";return r.startsWith("json ")&&(r=r.replace("json ","@html '<pre class=json>'+JSON.stringify("),r+=", null, 2) + '</pre>'"),r.startsWith(t)?r=r.replace(t,""):r=`Fez.htmlEscape(${r})`,"${"+r+"}"}}}function N(r,e={}){let t=[];r=r.replaceAll("[[","{{").replaceAll("]]","}}"),r=r.replace(/(\w+)=\{\{\s*(.*?)\s*\}\}([\s>])/g,(s,i,u,f)=>`${i}="{{ ${u} }}"${f}`);let n={};r=r.replace(/\{\{block\s+(\w+)\s*\}\}([^§]+)\{\{\/block\}\}/g,(s,i,u)=>(n[i]=u,"")),r=r.replace(/\{\{block:([\w\-]+)\s*\}\}/g,(s,i)=>n[i]||`block:${i}?`),r=r.replace(/:(\w+)="([\w\.\[\]]+)"/,(s,i,u)=>`:${i}=Fez.store.delete({{ Fez.store.set(${u}) }})`);let o=r.replace(/{{(.*?)}}/g,(s,i)=>(i=i.replaceAll("&#x60;","`"),i=i.replaceAll("&lt;","<").replaceAll("&gt;",">").replaceAll("&amp;","&"),Te(i,t)));o=o.replace(/<!\-\-.*?\-\->/g,"").replace(/>\s+</g,"><"),o="`"+o.trim()+"`";try{let s=`const fez = this;
2
2
  with (this) {
3
- return ${n}
3
+ return ${o}
4
4
  }
5
- `,i=new Function(o);return u=>{try{return i.bind(u)()}catch(b){b.message=`FEZ template runtime error: ${b.message}
5
+ `,i=new Function(s);return f=>{try{return i.bind(f)()}catch(m){m.message=`FEZ template runtime error: ${m.message}
6
6
 
7
- Template source: ${n}`,console.error(b)}}}catch(o){return o.message=`FEZ template compile error: ${o.message}Template source:
8
- ${n}`,console.error(o),()=>Fez.error("Template Compile Error",!0)}}var L=class{static getProps(e,r){let s={};if(e.props)return e.props;for(let n of e.attributes)s[n.name]=n.value;for(let[n,o]of Object.entries(s))if([":"].includes(n[0])){delete s[n];try{let i=new Function(`return (${o})`).bind(r)();s[n.replace(/[\:_]/,"")]=i}catch(i){console.error(`Fez: Error evaluating attribute ${n}="${o}" for ${e.tagName}: ${i.message}`)}}if(s["data-props"]){let n=s["data-props"];if(typeof n=="object")return n;n[0]!="{"&&(n=decodeURIComponent(n));try{s=JSON.parse(n)}catch(o){console.error(`Fez: Invalid JSON in data-props for ${e.tagName}: ${o.message}`)}}else if(s["data-json-template"]){let n=r.previousSibling?.textContent;if(n)try{s=JSON.parse(n),r.previousSibling.remove()}catch(o){console.error(`Fez: Invalid JSON in template for ${e.tagName}: ${o.message}`)}}return s}static formData(e){let r=e.closest("form")||e.querySelector("form");if(!r)return Fez.log("No form found for formData()"),{};let s=new FormData(r),n={};return s.forEach((o,i)=>{n[i]=o}),n}static fastBind(){return!1}static nodeName="div";constructor(){}n=D;get fezHtmlRoot(){return`Fez(${this.UID}).`}get isConnected(){return this.root?.isConnected?!0:(this.fezRemoveSelf(),!1)}fezRemoveSelf(){this._setIntervalCache||={},Object.keys(this._setIntervalCache).forEach(e=>{clearInterval(this._setIntervalCache[e])}),this._eventHandlers&&(Object.entries(this._eventHandlers).forEach(([e,r])=>{window.removeEventListener(e,r)}),this._eventHandlers={}),this._timeouts&&(Object.values(this._timeouts).forEach(e=>{clearTimeout(e)}),this._timeouts={}),this.onDestroy(),this.onDestroy=()=>{},this.root&&(this.root.fez=void 0),this.root=void 0}prop(e){let r=this.oldRoot[e]||this.props[e];return typeof r=="function"&&(r=r.bind(this.root)),r}copy(){for(let e of Array.from(arguments)){let r=this.props[e];if(r!==void 0){if(e=="class"){let s=this.root.getAttribute(e,r);s&&(r=[s,r].join(" "))}(e=="style"||!this.root[e])&&(typeof r=="string"?this.root.setAttribute(e,r):this.root[e]=r)}}}on(e,r,s=200){this._eventHandlers=this._eventHandlers||{},this._timeouts=this._timeouts||{},this._eventHandlers[e]&&window.removeEventListener(e,this._eventHandlers[e]),this._timeouts[e]&&clearTimeout(this._timeouts[e]);let n=0,o=()=>this.isConnected?(r.call(this),!0):(this._eventHandlers[e]&&(window.removeEventListener(e,this._eventHandlers[e]),delete this._eventHandlers[e]),this._timeouts[e]&&(clearTimeout(this._timeouts[e]),delete this._timeouts[e]),!1),i=()=>{let a=Date.now();if(a-n>=s)if(o())n=a;else return;this._timeouts[e]&&clearTimeout(this._timeouts[e]),this._timeouts[e]=setTimeout(()=>{a>n&&o()&&(n=Date.now()),delete this._timeouts[e]},s)};this._eventHandlers[e]=i,window.addEventListener(e,i)}onResize(e,r){this.on("resize",e,r),e()}onScroll(e,r){this.on("scroll",e,r),e()}slot(e,r){r||=document.createElement("template");let s=r.nodeName=="SLOT";for(;e.firstChild;)s?r.parentNode.insertBefore(e.lastChild,r.nextSibling):r.appendChild(e.firstChild);return s?r.parentNode.removeChild(r):e.innerHTML="",r}setStyle(e,r){this.root.style.setProperty(e,r)}connect(){}onMount(){}beforeRender(){}afterRender(){}onDestroy(){}onStateChange(){}onGlobalStateChange(){}publish(e,...r){let s=o=>{if(Fez._subs&&Fez._subs[e]){let i=Fez._subs[e].find(([a])=>a===o);if(i)return i[1].bind(o)(...r),!0}return!1};if(s(this))return!0;let n=this.root.parentElement;for(;n;){if(n.fez&&s(n.fez))return!0;n=n.parentElement}return!1}fezBlocks={};parseHtml(e){let r=this.fezHtmlRoot.replaceAll('"',"&quot;");return e=e.replace(/([!'"\s;])fez\.(\w)/g,`$1${r}$2`).replace(/>\s+</g,"><"),e.trim()}nextTick(e,r){r?(this._nextTicks||={},this._nextTicks[r]||=window.requestAnimationFrame(()=>{e.bind(this)(),this._nextTicks[r]=null},r)):window.requestAnimationFrame(e.bind(this))}render(e){if(e||=this?.class?.fezHtmlFunc,!e||!this.root)return;this.beforeRender();let r=document.createElement(this.class.nodeName||"div"),s;Array.isArray(e)?e[0]instanceof Node?e.forEach(n=>r.appendChild(n)):s=e.join(""):typeof e=="string"?s=j(e)(this):typeof e=="function"&&(s=e(this)),s&&(s=s.replace(/\s\w+="undefined"/g,""),r.innerHTML=this.parseHtml(s)),r.querySelectorAll("[fez-keep]").forEach(n=>{let o=n.getAttribute("fez-keep"),i=this.root.querySelector(`[fez-keep="${o}"]`);i?n.parentNode.replaceChild(i,n):o==="default-slot"&&Array.from(this.root.childNodes).forEach(a=>n.appendChild(a))}),Fez.morphdom(this.root,r),this.renderFezPostProcess(),this.afterRender()}renderFezPostProcess(){let e=(r,s)=>{this.root.querySelectorAll(`*[${r}]`).forEach(n=>{let o=n.getAttribute(r);n.removeAttribute(r),o&&s.bind(this)(o,n)})};e("fez-this",(r,s)=>{new Function("n",`this.${r} = n`).bind(this)(s)}),e("fez-use",(r,s)=>{let n=this[r];typeof n=="function"?n(s):console.error(`Fez error: "${r}" is not a function in ${this.fezName}`)}),e("fez-class",(r,s)=>{let n=r.split(/\s+/),o=n.pop();n.forEach(i=>s.classList.add(i)),o&&setTimeout(()=>{s.classList.add(o)},300)}),e("fez-bind",(r,s)=>{if(["INPUT","SELECT","TEXTAREA"].includes(s.nodeName)){let n=new Function(`return this.${r}`).bind(this)(),o=s.type.toLowerCase()=="checkbox",i=["SELECT"].includes(s.nodeName)||o?"onchange":"onkeyup";s.setAttribute(i,`${this.fezHtmlRoot}${r} = this.${o?"checked":"value"}`),this.val(s,n)}else console.error(`Cant fez-bind="${r}" to ${s.nodeName} (needs INPUT, SELECT or TEXTAREA. Want to use fez-this?).`)}),this.root.querySelectorAll("*[disabled]").forEach(r=>{let s=r.getAttribute("disabled");["false"].includes(s)?r.removeAttribute("disabled"):r.setAttribute("disabled","true")})}refresh(e){if(alert("NEEDS FIX and remove htmlTemplate"),e){let s=Fez.domRoot(this.class.htmlTemplate).querySelector(e).innerHTML;this.render(e,s)}else this.render()}setInterval(e,r,s){return typeof e=="number"&&([r,e]=[e,r]),s||=Fez.fnv1(String(e)),this._setIntervalCache||={},clearInterval(this._setIntervalCache[s]),this._setIntervalCache[s]=setInterval(()=>{this.isConnected&&e()},r),this._setIntervalCache[s]}find(e){return typeof e=="string"?this.root.querySelector(e):e}val(e,r){let s=this.find(e);if(s)if(["INPUT","TEXTAREA","SELECT"].includes(s.nodeName))if(typeof r<"u")s.type=="checkbox"?s.checked=!!r:s.value=r;else return s.value;else if(typeof r<"u")s.innerHTML=r;else return s.innerHTML}formData(e){return this.class.formData(e||this.root)}attr(e,r){return typeof r>"u"?this.root.getAttribute(e):(this.root.setAttribute(e,r),r)}childNodes(e){let r=Array.from(this.root.children);if(e){let s=document.createElement("div");s.style.display="none",document.body.appendChild(s),r.forEach(n=>s.appendChild(n)),r=Array.from(s.children).map(e),document.body.removeChild(s)}return r}subscribe(e,r){Fez._subs||={},Fez._subs[e]||=[],Fez._subs[e]=Fez._subs[e].filter(s=>s[0].isConnected),Fez._subs[e].push([this,r])}rootId(){return this.root.id||=`fez_${this.UID}`,this.root.id}fezRegister(){this.css&&(this.css=Fez.globalCss(this.css,{name:this.fezName,wrap:!0})),this.class.css&&(this.class.css=Fez.globalCss(this.class.css,{name:this.fezName})),this.state||=this.reactiveStore(),this.globalState=Fez.state.createProxy(this),this.fezRegisterBindMethods()}fezRegisterBindMethods(){Object.getOwnPropertyNames(Object.getPrototypeOf(this)).filter(r=>r!=="constructor"&&typeof this[r]=="function").forEach(r=>this[r]=this[r].bind(this))}fezHide(){let e=this.root,r=this.childNodes(),s=this.root.parentNode;return r.reverse().forEach(n=>s.insertBefore(n,e.nextSibling)),this.root.remove(),this.root=s,r}reactiveStore(e,r){e||={},r||=(n,o,i,a)=>{this.onStateChange(o,i,a),this.nextTick(this.render,"render")},r.bind(this);function s(n,o){return typeof n!="object"||n===null?n:new Proxy(n,{set(i,a,u,b){let g=Reflect.get(i,a,b);if(g!==u){typeof u=="object"&&u!==null&&(u=s(u,o));let S=Reflect.set(i,a,u,b);return o(i,a,u,g),S}return!0},get(i,a,u){let b=Reflect.get(i,a,u);return typeof b=="object"&&b!==null?s(b,o):b}})}return s(e,r)}};var Te={data:""},X=t=>typeof window=="object"?((t?t.querySelector("#_goober"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:t||Te,Fe=t=>{let e=X(t),r=e.data;return e.data="",r},$e=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,we=/\/\*[^]*?\*\/| +/g,K=/\n+/g,F=(t,e)=>{let r="",s="",n="";for(let o in t){let i=t[o];o[0]=="@"?o[1]=="i"?r=o+" "+i+";":s+=o[1]=="f"?F(i,o):o+"{"+F(i,o[1]=="k"?"":e)+"}":typeof i=="object"?s+=F(i,e?e.replace(/([^,])+/g,a=>o.replace(/(^:.*)|([^,])+/g,u=>/&/.test(u)?u.replace(/&/g,a):a?a+" "+u:u)):o):i!=null&&(o=/^--/.test(o)?o:o.replace(/[A-Z]/g,"-$&").toLowerCase(),n+=F.p?F.p(o,i):o+":"+i+";")}return r+(e&&n?e+"{"+n+"}":n)+s},T={},Z=t=>{if(typeof t=="object"){let e="";for(let r in t)e+=r+Z(t[r]);return e}return t},Ce=(t,e,r,s,n)=>{let o=Z(t),i=T[o]||(T[o]=(u=>{let b=0,g=11;for(;b<u.length;)g=101*g+u.charCodeAt(b++)>>>0;return"go"+g})(o));if(!T[i]){let u=o!==t?t:(b=>{let g,S,C=[{}];for(;g=$e.exec(b.replace(we,""));)g[4]?C.shift():g[3]?(S=g[3].replace(K," ").trim(),C.unshift(C[0][S]=C[0][S]||{})):C[0][g[1]]=g[2].replace(K," ").trim();return C[0]})(t);T[i]=F(n?{["@keyframes "+i]:u}:u,r?"":"."+i)}let a=r&&T.g?T.g:null;return r&&(T.g=T[i]),((u,b,g,S)=>{S?b.data=b.data.replace(S,u):b.data.indexOf(u)===-1&&(b.data=g?u+b.data:b.data+u)})(T[i],e,s,a),i},Me=(t,e,r)=>t.reduce((s,n,o)=>{let i=e[o];if(i&&i.call){let a=i(r),u=a&&a.props&&a.props.className||/^go/.test(a)&&a;i=u?"."+u:a&&typeof a=="object"?a.props?"":F(a,""):a===!1?"":a}return s+n+(i??"")},"");function R(t){let e=this||{},r=t.call?t(e.p):t;return Ce(r.unshift?r.raw?Me(r,[].slice.call(arguments,1),e.p):r.reduce((s,n)=>Object.assign(s,n&&n.call?n(e.p):n),{}):r,X(e.target),e.g,e.o,e.k)}var Y,B,k,_e=R.bind({g:1}),Le=R.bind({k:1});function He(t,e,r,s){F.p=e,Y=t,B=r,k=s}function Oe(t,e){let r=this||{};return function(){let s=arguments;function n(o,i){let a=Object.assign({},o),u=a.className||n.className;r.p=Object.assign({theme:B&&B()},a),r.o=/ *go\d+/.test(u),a.className=R.apply(r,s)+(u?" "+u:""),e&&(a.ref=i);let b=t;return t[0]&&(b=a.as||t,delete a.as),k&&b[0]&&k(a),Y(b,a)}return e?e(n):n}}var Q={css:R,extractCss:Fe,glob:_e,keyframes:Le,setup:He,styled:Oe};var x=function(){"use strict";let t=new Set,e={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:A,afterNodeAdded:A,beforeNodeMorphed:A,afterNodeMorphed:A,beforeNodeRemoved:A,afterNodeRemoved:A,beforeAttributeUpdated:A},head:{style:"merge",shouldPreserve:function(l){return l.getAttribute("im-preserve")==="true"},shouldReAppend:function(l){return l.getAttribute("im-re-append")==="true"},shouldRemove:A,afterHeadMorphed:A}};function r(l,c,f={}){l instanceof Document&&(l=l.documentElement),typeof c=="string"&&(c=ue(c));let d=de(c),h=ce(l,d,f);return s(l,d,h)}function s(l,c,f){if(f.head.block){let d=l.querySelector("head"),h=c.querySelector("head");if(d&&h){let p=S(h,d,f);Promise.all(p).then(function(){s(l,c,Object.assign(f,{head:{block:!1,ignore:!0}}))});return}}if(f.morphStyle==="innerHTML")return i(c,l,f),l.children;if(f.morphStyle==="outerHTML"||f.morphStyle==null){let d=pe(c,l,f),h=d?.previousSibling,p=d?.nextSibling,y=o(l,d,f);return d?he(h,y,p):[]}else throw"Do not understand how to morph style "+f.morphStyle}function n(l,c){return c.ignoreActiveValue&&l===document.activeElement&&l!==document.body}function o(l,c,f){if(!(f.ignoreActive&&l===document.activeElement))return c==null?f.callbacks.beforeNodeRemoved(l)===!1?l:(l.remove(),f.callbacks.afterNodeRemoved(l),null):I(l,c)?(f.callbacks.beforeNodeMorphed(l,c)===!1||(l instanceof HTMLHeadElement&&f.head.ignore||(l instanceof HTMLHeadElement&&f.head.style!=="morph"?S(c,l,f):(u(c,l,f),n(l,f)||i(c,l,f))),f.callbacks.afterNodeMorphed(l,c)),l):f.callbacks.beforeNodeRemoved(l)===!1||f.callbacks.beforeNodeAdded(c)===!1?l:(l.parentElement.replaceChild(c,l),f.callbacks.afterNodeAdded(c),f.callbacks.afterNodeRemoved(l),c)}function i(l,c,f){let d=l.firstChild,h=c.firstChild,p;for(;d;){if(p=d,d=p.nextSibling,h==null){if(f.callbacks.beforeNodeAdded(p)===!1)return;c.appendChild(p),f.callbacks.afterNodeAdded(p),M(f,p);continue}if(W(p,h,f)){o(h,p,f),h=h.nextSibling,M(f,p);continue}let y=fe(l,c,p,h,f);if(y){h=V(h,y,f),o(y,p,f),M(f,p);continue}let z=ae(l,c,p,h,f);if(z){h=V(h,z,f),o(z,p,f),M(f,p);continue}if(f.callbacks.beforeNodeAdded(p)===!1)return;c.insertBefore(p,h),f.callbacks.afterNodeAdded(p),M(f,p)}for(;h!==null;){let y=h;h=h.nextSibling,G(y,f)}}function a(l,c,f,d){return l==="value"&&d.ignoreActiveValue&&c===document.activeElement?!0:d.callbacks.beforeAttributeUpdated(l,c,f)===!1}function u(l,c,f){let d=l.nodeType;if(d===1){let h=l.attributes,p=c.attributes;for(let y of h)if(!a(y.name,c,"update",f))try{c.getAttribute(y.name)!==y.value&&c.setAttribute(y.name,y.value)}catch(z){console.error("Error setting attribute:",{badNode:c,badAttribute:y,error:z.message})}for(let y=p.length-1;0<=y;y--){let z=p[y];a(z.name,c,"remove",f)||l.hasAttribute(z.name)||c.removeAttribute(z.name)}}(d===8||d===3)&&c.nodeValue!==l.nodeValue&&(c.nodeValue=l.nodeValue),n(c,f)||g(l,c,f)}function b(l,c,f,d){if(l[f]!==c[f]){let h=a(f,c,"update",d);h||(c[f]=l[f]),l[f]?h||c.setAttribute(f,l[f]):a(f,c,"remove",d)||c.removeAttribute(f)}}function g(l,c,f){if(l instanceof HTMLInputElement&&c instanceof HTMLInputElement&&l.type!=="file"){let d=l.value,h=c.value;b(l,c,"checked",f),b(l,c,"disabled",f),l.hasAttribute("value")?d!==h&&(a("value",c,"update",f)||(c.setAttribute("value",d),c.value=d)):a("value",c,"remove",f)||(c.value="",c.removeAttribute("value"))}else if(l instanceof HTMLOptionElement)b(l,c,"selected",f);else if(l instanceof HTMLTextAreaElement&&c instanceof HTMLTextAreaElement){let d=l.value,h=c.value;if(a("value",c,"update",f))return;d!==h&&(c.value=d),c.firstChild&&c.firstChild.nodeValue!==d&&(c.firstChild.nodeValue=d)}}function S(l,c,f){let d=[],h=[],p=[],y=[],z=f.head.style,_=new Map;for(let v of l.children)_.set(v.outerHTML,v);for(let v of c.children){let E=_.has(v.outerHTML),O=f.head.shouldReAppend(v),P=f.head.shouldPreserve(v);E||P?O?h.push(v):(_.delete(v.outerHTML),p.push(v)):z==="append"?O&&(h.push(v),y.push(v)):f.head.shouldRemove(v)!==!1&&h.push(v)}y.push(..._.values());let J=[];for(let v of y){let E=document.createRange().createContextualFragment(v.outerHTML).firstChild;if(f.callbacks.beforeNodeAdded(E)!==!1){if(E.href||E.src){let O=null,P=new Promise(function(ze){O=ze});E.addEventListener("load",function(){O()}),J.push(P)}c.appendChild(E),f.callbacks.afterNodeAdded(E),d.push(E)}}for(let v of h)f.callbacks.beforeNodeRemoved(v)!==!1&&(c.removeChild(v),f.callbacks.afterNodeRemoved(v));return f.head.afterHeadMorphed(c,{added:d,kept:p,removed:h}),J}function C(){}function A(){}function le(l){let c={};return Object.assign(c,e),Object.assign(c,l),c.callbacks={},Object.assign(c.callbacks,e.callbacks),Object.assign(c.callbacks,l.callbacks),c.head={},Object.assign(c.head,e.head),Object.assign(c.head,l.head),c}function ce(l,c,f){return f=le(f),{target:l,newContent:c,config:f,morphStyle:f.morphStyle,ignoreActive:f.ignoreActive,ignoreActiveValue:f.ignoreActiveValue,idMap:ge(l,c),deadIds:new Set,callbacks:f.callbacks,head:f.head}}function W(l,c,f){return l==null||c==null?!1:l.nodeType===c.nodeType&&l.tagName===c.tagName?l.id!==""&&l.id===c.id?!0:H(f,l,c)>0:!1}function I(l,c){return l==null||c==null?!1:l.nodeType===c.nodeType&&l.tagName===c.tagName}function V(l,c,f){for(;l!==c;){let d=l;l=l.nextSibling,G(d,f)}return M(f,c),c.nextSibling}function fe(l,c,f,d,h){let p=H(h,f,c),y=null;if(p>0){let z=d,_=0;for(;z!=null;){if(W(f,z,h))return z;if(_+=H(h,z,l),_>p)return null;z=z.nextSibling}}return y}function ae(l,c,f,d,h){let p=d,y=f.nextSibling,z=0;for(;p!=null;){if(H(h,p,l)>0)return null;if(I(f,p))return p;if(I(y,p)&&(z++,y=y.nextSibling,z>=2))return null;p=p.nextSibling}return p}function ue(l){let c=new DOMParser,f=l.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");if(f.match(/<\/html>/)||f.match(/<\/head>/)||f.match(/<\/body>/)){let d=c.parseFromString(l,"text/html");if(f.match(/<\/html>/))return d.generatedByIdiomorph=!0,d;{let h=d.firstChild;return h?(h.generatedByIdiomorph=!0,h):null}}else{let h=c.parseFromString("<body><template>"+l+"</template></body>","text/html").body.querySelector("template").content;return h.generatedByIdiomorph=!0,h}}function de(l){if(l==null)return document.createElement("div");if(l.generatedByIdiomorph)return l;if(l instanceof Node){let c=document.createElement("div");return c.append(l),c}else{let c=document.createElement("div");for(let f of[...l])c.append(f);return c}}function he(l,c,f){let d=[],h=[];for(;l!=null;)d.push(l),l=l.previousSibling;for(;d.length>0;){let p=d.pop();h.push(p),c.parentElement.insertBefore(p,c)}for(h.push(c);f!=null;)d.push(f),h.push(f),f=f.nextSibling;for(;d.length>0;)c.parentElement.insertBefore(d.pop(),c.nextSibling);return h}function pe(l,c,f){let d;d=l.firstChild;let h=d,p=0;for(;d;){let y=me(d,c,f);y>p&&(h=d,p=y),d=d.nextSibling}return h}function me(l,c,f){return I(l,c)?.5+H(f,l,c):0}function G(l,c){M(c,l),c.callbacks.beforeNodeRemoved(l)!==!1&&(l.remove(),c.callbacks.afterNodeRemoved(l))}function be(l,c){return!l.deadIds.has(c)}function ye(l,c,f){return(l.idMap.get(f)||t).has(c)}function M(l,c){let f=l.idMap.get(c)||t;for(let d of f)l.deadIds.add(d)}function H(l,c,f){let d=l.idMap.get(c)||t,h=0;for(let p of d)be(l,p)&&ye(l,p,f)&&++h;return h}function U(l,c){let f=l.parentElement,d=l.querySelectorAll("[id]");for(let h of d){let p=h;for(;p!==f&&p!=null;){let y=c.get(p);y==null&&(y=new Set,c.set(p,y)),y.add(h.id),p=p.parentElement}}}function ge(l,c){let f=new Map;return U(l,f),U(c,f),f}return{morph:r,defaults:e}}();function te(t,e){let r=globalThis.window?.Fez||globalThis.Fez;if(t.includes("-")||console.error(`Fez: Invalid custom element name "${t}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`),!e.fezHtmlRoot){let s=new e,n=class extends L{};if(Object.getOwnPropertyNames(s).concat(Object.getOwnPropertyNames(e.prototype)).filter(a=>!["constructor","prototype"].includes(a)).forEach(a=>n.prototype[a]=s[a]),r.fastBindInfo||={fast:[],slow:[]},s.GLOBAL&&(n.fezGlobal=s.GLOBAL),s.CSS&&(n.css=s.CSS),s.HTML&&(n.html=s.HTML),s.NAME&&(n.nodeName=s.NAME),s.FAST?(n.fastBind=s.FAST,r.fastBindInfo.fast.push(typeof s.FAST=="function"?`${t} (func)`:t)):r.fastBindInfo.slow.push(t),s.GLOBAL){let a=()=>document.body.appendChild(document.createElement(t));document.readyState==="loading"?document.addEventListener("DOMContentLoaded",a):a()}e=n;let i=`${t} compiled`;s.FAST&&(i+=" (fast bind)"),r.log(i)}e.html&&(e.html=je(e.html),e.html=e.html.replace(/<slot\s*\/>|<slot\s*>\s*<\/slot>/g,()=>{let s=e.SLOT||"div";return`<${s} class="fez-slot" fez-keep="default-slot"></${s}>`}),e.fezHtmlFunc=j(e.html)),e.css&&(e.css=r.globalCss(e.css,{name:t})),r.classes[t]=e,customElements.get(t)||customElements.define(t,class extends HTMLElement{connectedCallback(){Ie(this,e)?ee(t,this):window.requestAnimationFrame(()=>{this.parentNode&&ee(t,this)})}})}function je(t){let e=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]);return t.replace(/<([a-z-]+)\b([^>]*)\/>/g,(r,s,n)=>e.has(s)?r:`<${s}${n}></${s}>`)}function Ie(t,e){let r=t.getAttribute("fez-fast");var s=typeof e.fastBind=="function"?e.fastBind(t):e.fastBind;return r=="false"?!1:r||s}function ee(t,e){let r=Fez.classes[t],s=e.parentNode;if(e.isConnected){let n=typeof r.nodeName=="function"?r.nodeName(e):r.nodeName,o=document.createElement(n||"div");o.classList.add("fez"),o.classList.add(`fez-${t}`),s.replaceChild(o,e);let i=new r;if(i.UID=++Fez.instanceCount,Fez.instances.set(i.UID,i),i.oldRoot=e,i.fezName=t,i.root=o,i.props=r.getProps(e,o),i.class=r,i.slot(e,o),o.fez=i,r.fezGlobal&&r.fezGlobal!=!0&&(window[r.fezGlobal]=i),window.$&&(i.$root=$(o)),i.props.id&&o.setAttribute("id",i.props.id),i.fezRegister(),(i.init||i.created||i.connect).bind(i)(i.props),i.render(),i.firstRender=!0,i.onMount(i.props),i.onSubmit){let a=i.root.nodeName=="FORM"?i.root:i.find("form");a.onsubmit=u=>{u.preventDefault(),i.onSubmit(i.formData())}}if(i.onPropsChange){Re.observe(o,{attributes:!0});for(let[a,u]of Object.entries(i.props))i.onPropsChange(a,u)}}}var Re=new MutationObserver((t,e)=>{for(let r of t)if(r.type==="attributes"){let s=r.target.fez,n=r.attributeName,o=r.target.getAttribute(n);s&&(s.props[n]=o,s.onPropsChange(n,o))}});var Ne=t=>{let e={script:"",style:"",html:"",head:""},r=t.split(`
9
- `),s=[],n="";for(var o of r)o=o.trim(),o.startsWith("<script")&&!e.script&&n!="head"?n="script":o.startsWith("<head")&&!e.script?n="head":o.startsWith("<style")?n="style":o.endsWith("<\/script>")&&n==="script"&&!e.script?(e.script=s.join(`
10
- `),s=[],n=null):o.endsWith("</style>")&&n==="style"?(e.style=s.join(`
11
- `),s=[],n=null):(o.endsWith("</head>")||o.endsWith("</header>"))&&n==="head"?(e.head=s.join(`
12
- `),s=[],n=null):n?s.push(o):e.html+=o+`
13
- `;if(e.head){let a=Fez.domRoot(e.head);Array.from(a.children).forEach(u=>{if(u.tagName==="SCRIPT"){let b=document.createElement("script");Array.from(u.attributes).forEach(g=>{b.setAttribute(g.name,g.value)}),b.type||="text/javascript",u.src?document.head.appendChild(b):(b.type.includes("javascript")||b.type=="module")&&(b.textContent=u.textContent,document.head.appendChild(b))}else document.head.appendChild(u.cloneNode(!0))})}let i=e.script;return/class\s+\{/.test(i)||(i=`class {
7
+ Template source: ${o}`,console.error(m)}}}catch(s){return s.message=`FEZ template compile error: ${s.message}Template source:
8
+ ${o}`,console.error(s),()=>Fez.error("Template Compile Error",!0)}}var _=class{static getProps(e,t){let n={};if(e.props)return e.props;for(let o of e.attributes)n[o.name]=o.value;for(let[o,s]of Object.entries(n))if([":"].includes(o[0])){delete n[o];try{let i=new Function(`return (${s})`).bind(t)();n[o.replace(/[\:_]/,"")]=i}catch(i){console.error(`Fez: Error evaluating attribute ${o}="${s}" for ${e.tagName}: ${i.message}`)}}if(n["data-props"]){let o=n["data-props"];if(typeof o=="object")return o;o[0]!="{"&&(o=decodeURIComponent(o));try{n=JSON.parse(o)}catch(s){console.error(`Fez: Invalid JSON in data-props for ${e.tagName}: ${s.message}`)}}else if(n["data-json-template"]){let o=t.previousSibling?.textContent;if(o)try{n=JSON.parse(o),t.previousSibling.remove()}catch(s){console.error(`Fez: Invalid JSON in template for ${e.tagName}: ${s.message}`)}}return n}static formData(e){let t=e.closest("form")||e.querySelector("form");if(!t)return Fez.log("No form found for formData()"),{};let n=new FormData(t),o={};return n.forEach((s,i)=>{o[i]=s}),o}static nodeName="div";constructor(){}n=D;get fezHtmlRoot(){return`Fez(${this.UID}).`}get isConnected(){return this.root?.isConnected?!0:(this.fezOnDestroy(),!1)}prop(e){let t=this.oldRoot[e]||this.props[e];return typeof t=="function"&&(t=t.bind(this.root)),t}copy(){for(let e of Array.from(arguments)){let t=this.props[e];if(t!==void 0){if(e=="class"){let n=this.root.getAttribute(e,t);n&&(t=[n,t].join(" "))}(e=="style"||!this.root[e])&&(typeof t=="string"?this.root.setAttribute(e,t):this.root[e]=t)}}}fezOnDestroy(){this._onDestroyCallbacks&&(this._onDestroyCallbacks.forEach(e=>{try{e()}catch(t){console.error("Fez: Error in cleanup callback:",t)}}),this._onDestroyCallbacks=[]),this.onDestroy(),this.onDestroy=()=>{},this.root&&(this.root.fez=void 0),this.root=void 0}addOnDestroy(e){this._onDestroyCallbacks=this._onDestroyCallbacks||[],this._onDestroyCallbacks.push(e)}on(e,t,n=200){this._eventHandlers=this._eventHandlers||{},this._eventHandlers[e]&&window.removeEventListener(e,this._eventHandlers[e]);let o=Fez.throttle(()=>{this.isConnected&&t.call(this)},n);this._eventHandlers[e]=o,window.addEventListener(e,o),this.addOnDestroy(()=>{window.removeEventListener(e,o),delete this._eventHandlers[e]})}onWindowResize(e,t){this.on("resize",e,t),e()}onWindowScroll(e,t){this.on("scroll",e,t),e()}onElementResize(e,t,n=200){let o=Fez.throttle(()=>{this.isConnected&&t.call(this,e.getBoundingClientRect(),e)},n),s=new ResizeObserver(o);s.observe(e),t.call(this,e.getBoundingClientRect(),e),this.addOnDestroy(()=>{s.disconnect()})}slot(e,t){t||=document.createElement("template");let n=t.nodeName=="SLOT";for(;e.firstChild;)n?t.parentNode.insertBefore(e.lastChild,t.nextSibling):t.appendChild(e.firstChild);return n?t.parentNode.removeChild(t):e.innerHTML="",t}setStyle(e,t){this.root.style.setProperty(e,t)}connect(){}onMount(){}beforeRender(){}afterRender(){}onDestroy(){}onStateChange(){}onGlobalStateChange(){}publish(e,...t){let n=s=>{if(Fez._subs&&Fez._subs[e]){let i=Fez._subs[e].find(([u])=>u===s);if(i)return i[1].bind(s)(...t),!0}return!1};if(n(this))return!0;let o=this.root.parentElement;for(;o;){if(o.fez&&n(o.fez))return!0;o=o.parentElement}return!1}fezBlocks={};parseHtml(e){let t=this.fezHtmlRoot.replaceAll('"',"&quot;");return e=e.replace(/([!'"\s;])fez\.(\w)/g,`$1${t}$2`).replace(/>\s+</g,"><"),e.trim()}nextTick(e,t){t?(this._nextTicks||={},this._nextTicks[t]||=window.requestAnimationFrame(()=>{e.bind(this)(),this._nextTicks[t]=null},t)):window.requestAnimationFrame(e.bind(this))}render(e){if(e||=this?.class?.fezHtmlFunc,!e||!this.root)return;this.beforeRender();let t=typeof this.class.nodeName=="function"?this.class.nodeName(this.root):this.class.nodeName,n=document.createElement(t||"div"),o;Array.isArray(e)?e[0]instanceof Node?e.forEach(s=>n.appendChild(s)):o=e.join(""):typeof e=="string"?o=N(e)(this):typeof e=="function"&&(o=e(this)),o&&(o=o.replace(/\s\w+="undefined"/g,""),n.innerHTML=this.parseHtml(o)),this.fezKeepNode(n),this.fezMemoization(n),Fez.morphdom(this.root,n),this.fezRenderPostProcess(),this.afterRender()}fezRenderPostProcess(){let e=(t,n)=>{this.root.querySelectorAll(`*[${t}]`).forEach(o=>{let s=o.getAttribute(t);o.removeAttribute(t),s&&n.bind(this)(s,o)})};e("fez-this",(t,n)=>{new Function("n",`this.${t} = n`).bind(this)(n)}),e("fez-use",(t,n)=>{let o=this[t];typeof o=="function"?o(n):console.error(`Fez error: "${t}" is not a function in ${this.fezName}`)}),e("fez-class",(t,n)=>{let o=t.split(/\s+/),s=o.pop();o.forEach(i=>n.classList.add(i)),s&&setTimeout(()=>{n.classList.add(s)},300)}),e("fez-bind",(t,n)=>{if(["INPUT","SELECT","TEXTAREA"].includes(n.nodeName)){let o=new Function(`return this.${t}`).bind(this)(),s=n.type.toLowerCase()=="checkbox",i=["SELECT"].includes(n.nodeName)||s?"onchange":"onkeyup";n.setAttribute(i,`${this.fezHtmlRoot}${t} = this.${s?"checked":"value"}`),this.val(n,o)}else console.error(`Cant fez-bind="${t}" to ${n.nodeName} (needs INPUT, SELECT or TEXTAREA. Want to use fez-this?).`)}),this.root.querySelectorAll("*[disabled]").forEach(t=>{let n=t.getAttribute("disabled");["false"].includes(n)?t.removeAttribute("disabled"):t.setAttribute("disabled","true")})}fezKeepNode(e){e.querySelectorAll("[fez-keep]").forEach(t=>{let n=t.getAttribute("fez-keep"),o=this.root.querySelector(`[fez-keep="${n}"]`);o?t.parentNode.replaceChild(o,t):n==="default-slot"&&Array.from(this.root.childNodes).forEach(s=>t.appendChild(s))})}fezMemoization(e){let t=e.querySelector("[fez-memoize]:not(.fez)");if(!t)return;this.fezMemoStore||=new Map;let n=t.getAttribute("fez-memoize"),o=this.fezMemoStore.get(n);if(o)Fez.log(`Memoize restore ${this.fezName}: ${n}`),t.parentNode.replaceChild(o.cloneNode(!0),t);else{let s=this.root.querySelector("[fez-memoize]:not(.fez)");if(s){let i=s.getAttribute("fez-memoize");this.fezMemoStore.set(i,s.cloneNode(!0))}}}refresh(e){if(alert("NEEDS FIX and remove htmlTemplate"),e){let n=Fez.domRoot(this.class.htmlTemplate).querySelector(e).innerHTML;this.render(e,n)}else this.render()}setInterval(e,t,n){typeof e=="number"&&([t,e]=[e,t]),n||=Fez.fnv1(String(e)),this._setIntervalCache||={},clearInterval(this._setIntervalCache[n]);let o=setInterval(()=>{this.isConnected&&e()},t);return this._setIntervalCache[n]=o,this.addOnDestroy(()=>{clearInterval(o),delete this._setIntervalCache[n]}),o}find(e){return typeof e=="string"?this.root.querySelector(e):e}val(e,t){let n=this.find(e);if(n)if(["INPUT","TEXTAREA","SELECT"].includes(n.nodeName))if(typeof t<"u")n.type=="checkbox"?n.checked=!!t:n.value=t;else return n.value;else if(typeof t<"u")n.innerHTML=t;else return n.innerHTML}formData(e){return this.class.formData(e||this.root)}attr(e,t){return typeof t>"u"?this.root.getAttribute(e):(this.root.setAttribute(e,t),t)}childNodes(e){let t=Array.from(this.root.children);if(e){let n=document.createElement("div");n.style.display="none",document.body.appendChild(n),t.forEach(o=>n.appendChild(o)),t=Array.from(n.children).map(e),document.body.removeChild(n)}return t}subscribe(e,t){Fez._subs||={},Fez._subs[e]||=[],Fez._subs[e]=Fez._subs[e].filter(n=>n[0].isConnected),Fez._subs[e].push([this,t])}rootId(){return this.root.id||=`fez_${this.UID}`,this.root.id}fezRegister(){this.css&&(this.css=Fez.globalCss(this.css,{name:this.fezName,wrap:!0})),this.class.css&&(this.class.css=Fez.globalCss(this.class.css,{name:this.fezName})),this.state||=this.reactiveStore(),this.globalState=Fez.state.createProxy(this),this.fezRegisterBindMethods()}fezRegisterBindMethods(){Object.getOwnPropertyNames(Object.getPrototypeOf(this)).filter(t=>t!=="constructor"&&typeof this[t]=="function").forEach(t=>this[t]=this[t].bind(this))}fezHide(){let e=this.root,t=this.childNodes(),n=this.root.parentNode;return t.reverse().forEach(o=>n.insertBefore(o,e.nextSibling)),this.root.remove(),this.root=n,t}reactiveStore(e,t){e||={},t||=(o,s,i,u)=>{this.onStateChange(s,i,u),this.nextTick(this.render,"render")},t.bind(this);function n(o,s){return typeof o!="object"||o===null?o:new Proxy(o,{set(i,u,f,m){let g=Reflect.get(i,u,m);if(g!==f){typeof f=="object"&&f!==null&&(f=n(f,s));let S=Reflect.set(i,u,f,m);return s(i,u,f,g),S}return!0},get(i,u,f){let m=Reflect.get(i,u,f);return typeof m=="object"&&m!==null?n(m,s):m}})}return n(e,t)}};var $e={data:""},Z=r=>typeof window=="object"?((r?r.querySelector("#_goober"):window._goober)||Object.assign((r||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:r||$e,Me=r=>{let e=Z(r),t=e.data;return e.data="",t},Fe=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,Le=/\/\*[^]*?\*\/| +/g,X=/\n+/g,w=(r,e)=>{let t="",n="",o="";for(let s in r){let i=r[s];s[0]=="@"?s[1]=="i"?t=s+" "+i+";":n+=s[1]=="f"?w(i,s):s+"{"+w(i,s[1]=="k"?"":e)+"}":typeof i=="object"?n+=w(i,e?e.replace(/([^,])+/g,u=>s.replace(/(^:.*)|([^,])+/g,f=>/&/.test(f)?f.replace(/&/g,u):u?u+" "+f:f)):s):i!=null&&(s=/^--/.test(s)?s:s.replace(/[A-Z]/g,"-$&").toLowerCase(),o+=w.p?w.p(s,i):s+":"+i+";")}return t+(e&&o?e+"{"+o+"}":o)+n},C={},Y=r=>{if(typeof r=="object"){let e="";for(let t in r)e+=t+Y(r[t]);return e}return r},_e=(r,e,t,n,o)=>{let s=Y(r),i=C[s]||(C[s]=(f=>{let m=0,g=11;for(;m<f.length;)g=101*g+f.charCodeAt(m++)>>>0;return"go"+g})(s));if(!C[i]){let f=s!==r?r:(m=>{let g,S,M=[{}];for(;g=Fe.exec(m.replace(Le,""));)g[4]?M.shift():g[3]?(S=g[3].replace(X," ").trim(),M.unshift(M[0][S]=M[0][S]||{})):M[0][g[1]]=g[2].replace(X," ").trim();return M[0]})(r);C[i]=w(o?{["@keyframes "+i]:f}:f,t?"":"."+i)}let u=t&&C.g?C.g:null;return t&&(C.g=C[i]),((f,m,g,S)=>{S?m.data=m.data.replace(S,f):m.data.indexOf(f)===-1&&(m.data=g?f+m.data:m.data+f)})(C[i],e,n,u),i},Oe=(r,e,t)=>r.reduce((n,o,s)=>{let i=e[s];if(i&&i.call){let u=i(t),f=u&&u.props&&u.props.className||/^go/.test(u)&&u;i=f?"."+f:u&&typeof u=="object"?u.props?"":w(u,""):u===!1?"":u}return n+o+(i??"")},"");function j(r){let e=this||{},t=r.call?r(e.p):r;return _e(t.unshift?t.raw?Oe(t,[].slice.call(arguments,1),e.p):t.reduce((n,o)=>Object.assign(n,o&&o.call?o(e.p):o),{}):t,Z(e.target),e.g,e.o,e.k)}var Q,R,P,Ie=j.bind({g:1}),Ne=j.bind({k:1});function ke(r,e,t,n){w.p=e,Q=r,R=t,P=n}function je(r,e){let t=this||{};return function(){let n=arguments;function o(s,i){let u=Object.assign({},s),f=u.className||o.className;t.p=Object.assign({theme:R&&R()},u),t.o=/ *go\d+/.test(f),u.className=j.apply(t,n)+(f?" "+f:""),e&&(u.ref=i);let m=r;return r[0]&&(m=u.as||r,delete u.as),P&&m[0]&&P(u),Q(m,u)}return e?e(o):o}}var ee={css:j,extractCss:Me,glob:Ie,keyframes:Ne,setup:ke,styled:je};var te=function(){"use strict";let r=new Set,e={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:A,afterNodeAdded:A,beforeNodeMorphed:A,afterNodeMorphed:A,beforeNodeRemoved:A,afterNodeRemoved:A,beforeAttributeUpdated:A},head:{style:"merge",shouldPreserve:function(l){return l.getAttribute("im-preserve")==="true"},shouldReAppend:function(l){return l.getAttribute("im-re-append")==="true"},shouldRemove:A,afterHeadMorphed:A}};function t(l,c,a={}){l instanceof Document&&(l=l.documentElement),typeof c=="string"&&(c=pe(c));let d=me(c),h=ue(l,d,a);return n(l,d,h)}function n(l,c,a){if(a.head.block){let d=l.querySelector("head"),h=c.querySelector("head");if(d&&h){let p=S(h,d,a);Promise.all(p).then(function(){n(l,c,Object.assign(a,{head:{block:!1,ignore:!0}}))});return}}if(a.morphStyle==="innerHTML")return i(c,l,a),l.children;if(a.morphStyle==="outerHTML"||a.morphStyle==null){let d=ye(c,l,a),h=d?.previousSibling,p=d?.nextSibling,y=s(l,d,a);return d?be(h,y,p):[]}else throw"Do not understand how to morph style "+a.morphStyle}function o(l,c){return c.ignoreActiveValue&&l===document.activeElement&&l!==document.body}function s(l,c,a){if(!(a.ignoreActive&&l===document.activeElement))return c==null?a.callbacks.beforeNodeRemoved(l)===!1?l:(l.remove(),a.callbacks.afterNodeRemoved(l),null):k(l,c)?(a.callbacks.beforeNodeMorphed(l,c)===!1||(l instanceof HTMLHeadElement&&a.head.ignore||(l instanceof HTMLHeadElement&&a.head.style!=="morph"?S(c,l,a):(f(c,l,a),o(l,a)||i(c,l,a))),a.callbacks.afterNodeMorphed(l,c)),l):a.callbacks.beforeNodeRemoved(l)===!1||a.callbacks.beforeNodeAdded(c)===!1?l:(l.parentElement.replaceChild(c,l),a.callbacks.afterNodeAdded(c),a.callbacks.afterNodeRemoved(l),c)}function i(l,c,a){let d=l.firstChild,h=c.firstChild,p;for(;d;){if(p=d,d=p.nextSibling,h==null){if(a.callbacks.beforeNodeAdded(p)===!1)return;c.appendChild(p),a.callbacks.afterNodeAdded(p),F(a,p);continue}if(W(p,h,a)){s(h,p,a),h=h.nextSibling,F(a,p);continue}let y=de(l,c,p,h,a);if(y){h=V(h,y,a),s(y,p,a),F(a,p);continue}let z=he(l,c,p,h,a);if(z){h=V(h,z,a),s(z,p,a),F(a,p);continue}if(a.callbacks.beforeNodeAdded(p)===!1)return;c.insertBefore(p,h),a.callbacks.afterNodeAdded(p),F(a,p)}for(;h!==null;){let y=h;h=h.nextSibling,U(y,a)}}function u(l,c,a,d){return l==="value"&&d.ignoreActiveValue&&c===document.activeElement?!0:d.callbacks.beforeAttributeUpdated(l,c,a)===!1}function f(l,c,a){let d=l.nodeType;if(d===1){let h=l.attributes,p=c.attributes;for(let y of h)if(!u(y.name,c,"update",a))try{c.getAttribute(y.name)!==y.value&&c.setAttribute(y.name,y.value)}catch(z){console.error("Error setting attribute:",{badNode:c,badAttribute:y,error:z.message})}for(let y=p.length-1;0<=y;y--){let z=p[y];u(z.name,c,"remove",a)||l.hasAttribute(z.name)||c.removeAttribute(z.name)}}(d===8||d===3)&&c.nodeValue!==l.nodeValue&&(c.nodeValue=l.nodeValue),o(c,a)||g(l,c,a)}function m(l,c,a,d){if(l[a]!==c[a]){let h=u(a,c,"update",d);h||(c[a]=l[a]),l[a]?h||c.setAttribute(a,l[a]):u(a,c,"remove",d)||c.removeAttribute(a)}}function g(l,c,a){if(l instanceof HTMLInputElement&&c instanceof HTMLInputElement&&l.type!=="file"){let d=l.value,h=c.value;m(l,c,"checked",a),m(l,c,"disabled",a),l.hasAttribute("value")?d!==h&&(u("value",c,"update",a)||(c.setAttribute("value",d),c.value=d)):u("value",c,"remove",a)||(c.value="",c.removeAttribute("value"))}else if(l instanceof HTMLOptionElement)m(l,c,"selected",a);else if(l instanceof HTMLTextAreaElement&&c instanceof HTMLTextAreaElement){let d=l.value,h=c.value;if(u("value",c,"update",a))return;d!==h&&(c.value=d),c.firstChild&&c.firstChild.nodeValue!==d&&(c.firstChild.nodeValue=d)}}function S(l,c,a){let d=[],h=[],p=[],y=[],z=a.head.style,L=new Map;for(let v of l.children)L.set(v.outerHTML,v);for(let v of c.children){let E=L.has(v.outerHTML),I=a.head.shouldReAppend(v),H=a.head.shouldPreserve(v);E||H?I?h.push(v):(L.delete(v.outerHTML),p.push(v)):z==="append"?I&&(h.push(v),y.push(v)):a.head.shouldRemove(v)!==!1&&h.push(v)}y.push(...L.values());let J=[];for(let v of y){let E=document.createRange().createContextualFragment(v.outerHTML).firstChild;if(a.callbacks.beforeNodeAdded(E)!==!1){if(E.href||E.src){let I=null,H=new Promise(function(Ee){I=Ee});E.addEventListener("load",function(){I()}),J.push(H)}c.appendChild(E),a.callbacks.afterNodeAdded(E),d.push(E)}}for(let v of h)a.callbacks.beforeNodeRemoved(v)!==!1&&(c.removeChild(v),a.callbacks.afterNodeRemoved(v));return a.head.afterHeadMorphed(c,{added:d,kept:p,removed:h}),J}function M(){}function A(){}function fe(l){let c={};return Object.assign(c,e),Object.assign(c,l),c.callbacks={},Object.assign(c.callbacks,e.callbacks),Object.assign(c.callbacks,l.callbacks),c.head={},Object.assign(c.head,e.head),Object.assign(c.head,l.head),c}function ue(l,c,a){return a=fe(a),{target:l,newContent:c,config:a,morphStyle:a.morphStyle,ignoreActive:a.ignoreActive,ignoreActiveValue:a.ignoreActiveValue,idMap:Se(l,c),deadIds:new Set,callbacks:a.callbacks,head:a.head}}function W(l,c,a){return l==null||c==null?!1:l.nodeType===c.nodeType&&l.tagName===c.tagName?l.id!==""&&l.id===c.id?!0:O(a,l,c)>0:!1}function k(l,c){return l==null||c==null?!1:l.nodeType===c.nodeType&&l.tagName===c.tagName}function V(l,c,a){for(;l!==c;){let d=l;l=l.nextSibling,U(d,a)}return F(a,c),c.nextSibling}function de(l,c,a,d,h){let p=O(h,a,c),y=null;if(p>0){let z=d,L=0;for(;z!=null;){if(W(a,z,h))return z;if(L+=O(h,z,l),L>p)return null;z=z.nextSibling}}return y}function he(l,c,a,d,h){let p=d,y=a.nextSibling,z=0;for(;p!=null;){if(O(h,p,l)>0)return null;if(k(a,p))return p;if(k(y,p)&&(z++,y=y.nextSibling,z>=2))return null;p=p.nextSibling}return p}function pe(l){let c=new DOMParser,a=l.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");if(a.match(/<\/html>/)||a.match(/<\/head>/)||a.match(/<\/body>/)){let d=c.parseFromString(l,"text/html");if(a.match(/<\/html>/))return d.generatedByIdiomorph=!0,d;{let h=d.firstChild;return h?(h.generatedByIdiomorph=!0,h):null}}else{let h=c.parseFromString("<body><template>"+l+"</template></body>","text/html").body.querySelector("template").content;return h.generatedByIdiomorph=!0,h}}function me(l){if(l==null)return document.createElement("div");if(l.generatedByIdiomorph)return l;if(l instanceof Node){let c=document.createElement("div");return c.append(l),c}else{let c=document.createElement("div");for(let a of[...l])c.append(a);return c}}function be(l,c,a){let d=[],h=[];for(;l!=null;)d.push(l),l=l.previousSibling;for(;d.length>0;){let p=d.pop();h.push(p),c.parentElement.insertBefore(p,c)}for(h.push(c);a!=null;)d.push(a),h.push(a),a=a.nextSibling;for(;d.length>0;)c.parentElement.insertBefore(d.pop(),c.nextSibling);return h}function ye(l,c,a){let d;d=l.firstChild;let h=d,p=0;for(;d;){let y=ge(d,c,a);y>p&&(h=d,p=y),d=d.nextSibling}return h}function ge(l,c,a){return k(l,c)?.5+O(a,l,c):0}function U(l,c){F(c,l),c.callbacks.beforeNodeRemoved(l)!==!1&&(l.remove(),c.callbacks.afterNodeRemoved(l))}function ze(l,c){return!l.deadIds.has(c)}function ve(l,c,a){return(l.idMap.get(a)||r).has(c)}function F(l,c){let a=l.idMap.get(c)||r;for(let d of a)l.deadIds.add(d)}function O(l,c,a){let d=l.idMap.get(c)||r,h=0;for(let p of d)ze(l,p)&&ve(l,p,a)&&++h;return h}function K(l,c){let a=l.parentElement,d=l.querySelectorAll("[id]");for(let h of d){let p=h;for(;p!==a&&p!=null;){let y=c.get(p);y==null&&(y=new Set,c.set(p,y)),y.add(h.id),p=p.parentElement}}}function Se(l,c){let a=new Map;return K(l,a),K(c,a),a}return{morph:t,defaults:e}}();var xe=r=>{let e=r.split(/(<\/?[^>]+>)/g).map(o=>o.trim()).filter(o=>o),t=0,n=[];for(let o=0;o<e.length;o++){let s=e[o],i=e[o+1],u=e[o+2];if(s.startsWith("<"))if(!s.startsWith("</")&&!s.endsWith("/>")&&i&&!i.startsWith("<")&&u&&u.startsWith("</")){let f=Math.max(0,t);n.push(" ".repeat(f)+s+i+u),o+=2}else if(s.startsWith("</")){t--;let f=Math.max(0,t);n.push(" ".repeat(f)+s)}else if(s.endsWith("/>")||s.includes(" />")){let f=Math.max(0,t);n.push(" ".repeat(f)+s)}else{let f=Math.max(0,t);n.push(" ".repeat(f)+s),t++}else if(s){let f=Math.max(0,t);n.push(" ".repeat(f)+s)}}return n.join(`
9
+ `)},q=(()=>{let r=[],e=[],t=0;document.addEventListener("keydown",s=>{if(s.key==="Escape"){s.preventDefault();let i=document.getElementById("dump-dialog"),u=document.getElementById("log-reopen-button");i?(i.remove(),localStorage.setItem("_LOG_CLOSED","true"),n()):u&&(u.remove(),localStorage.setItem("_LOG_CLOSED","false"),o())}});let n=()=>{let s=document.getElementById("log-reopen-button");s||(s=document.body.appendChild(document.createElement("button")),s.id="log-reopen-button",s.innerHTML='<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>LOG',s.style.cssText="position:fixed; top: 10px; right: 10px;padding:10px 20px;background:#ff3333;color:#fff;border:none;cursor:pointer;font:14px/1.4 monospace;z-index:2147483647;border-radius:8px;display:flex;align-items:center;opacity:1;visibility:visible;box-shadow:0 4px 12px rgba(255,51,51,0.3)",s.onclick=()=>{s.remove(),localStorage.setItem("_LOG_CLOSED","false"),o()})},o=()=>{let s=document.getElementById("dump-dialog");if(!s){s=document.body.appendChild(document.createElement("div")),s.id="dump-dialog";let f=window.pageYOffset||document.documentElement.scrollTop;s.style.cssText="position:absolute; top:"+(f+20)+"px; left: 20px; right:20px;background:#fff; border:1px solid #333; box-shadow:0 0 10px rgba(0,0,0,0.5);padding:20px; overflow:auto; z-index:2147483646; font:13px/1.4 monospace;white-space:pre; display:block; opacity:1; visibility:visible"}let i=parseInt(localStorage.getItem("_LOG_INDEX"));!isNaN(i)&&i>=0&&i<r.length?t=i:t=r.length-1;let u=()=>{let f=r.map((m,g)=>{let S="#f0f0f0";return g!==t&&(e[g]==="object"?S="#d6e3ef":e[g]==="array"&&(S="#d8d5ef")),`<button style="font-size: 14px; font-weight: 400; padding:2px 6px; margin: 0 2px 2px 0;cursor:pointer;background:${g===t?"#333":S};color:${g===t?"#fff":"#000"}" data-index="${g}">${g+1}</button>`}).join("");s.innerHTML='<div style="display:flex;flex-direction:column;height:100%"><div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px"><div style="display:flex;flex-wrap:wrap;gap:4px;flex:1;margin-right:10px">'+f+'</div><button style="padding:4px 8px;cursor:pointer;flex-shrink:0">&times;</button></div><xmp style="font-family:monospace;flex:1;overflow:auto;margin:0;padding:0;color:#000;background:#fff;font-size:14px;line-height:22px">'+r[t]+"</xmp></div>",s.querySelector('button[style*="flex-shrink:0"]').onclick=()=>{s.remove(),localStorage.setItem("_LOG_CLOSED","true"),n()},s.querySelectorAll("button[data-index]").forEach(m=>{m.onclick=()=>{t=parseInt(m.dataset.index),localStorage.setItem("_LOG_INDEX",t),u()}})};u()};return s=>{if(!document.body){window.requestAnimationFrame(()=>q(s));return}s instanceof Node&&(s=xe(s.outerHTML));let i=typeof s;s===void 0&&(s="undefined"),s===null&&(s="null"),Array.isArray(s)?i="array":typeof s=="object"&&s!==null&&(i="object"),typeof s!="string"&&(s=JSON.stringify(s,(f,m)=>typeof m=="function"?String(m):m,2).replaceAll("<","&lt;")),s=s.trim(),r.push(s+`
10
+
11
+ type: ${i}`),e.push(i),localStorage.getItem("_LOG_CLOSED")==="true"?n():o()}})();typeof window<"u"&&!window.LOG&&(window.LOG=q);var re=q;function B(r,e){let t=globalThis.window?.Fez||globalThis.Fez;if(r.includes("-")||console.error(`Fez: Invalid custom element name "${r}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`),e.fezHtmlRoot)e.html&&(e.html=ne(e.html));else{let n=new e,o=class extends _{};if(Object.getOwnPropertyNames(n).concat(Object.getOwnPropertyNames(e.prototype)).filter(i=>!["constructor","prototype"].includes(i)).forEach(i=>o.prototype[i]=n[i]),n.GLOBAL&&(o.fezGlobal=n.GLOBAL),n.CSS&&(o.css=n.CSS),n.HTML&&(o.html=ne(n.HTML)),n.NAME&&(o.nodeName=n.NAME),n.GLOBAL){let i=()=>document.body.appendChild(document.createElement(r));document.readyState==="loading"?document.addEventListener("DOMContentLoaded",i):i()}e=o,t.log(`${r} compiled`)}e.html&&(e.html=e.html.replace(/<slot\s*\/>|<slot\s*>\s*<\/slot>/g,()=>{let n=e.SLOT||"div";return`<${n} class="fez-slot" fez-keep="default-slot"></${n}>`}),e.fezHtmlFunc=N(e.html)),e.css&&(e.css=t.globalCss(e.css,{name:r})),t.classes[r]=e,He(r,e)}function He(r,e){let t=globalThis.window?.Fez||globalThis.Fez;customElements.get(r)||customElements.define(r,class extends HTMLElement{connectedCallback(){t._pendingConnections||(t._pendingConnections=[],t._batchScheduled=!1),t._pendingConnections.push({name:r,node:this}),t._batchScheduled||(t._batchScheduled=!0,Promise.resolve().then(()=>{let n=t._pendingConnections.slice();t._pendingConnections=[],t._batchScheduled=!1,n.sort((o,s)=>o.node.contains(s.node)?-1:s.node.contains(o.node)?1:0),n.forEach(({name:o,node:s})=>{s.isConnected&&s.parentNode&&De(o,s)})}))}})}function ne(r){let e=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]);return r.replace(/<([a-z-]+)\b([^>]*)\/>/g,(t,n,o)=>e.has(n)?t:`<${n}${o}></${n}>`)}function De(r,e){let t=Fez.classes[r],n=e.parentNode;if(e.isConnected){let o=typeof t.nodeName=="function"?t.nodeName(e):t.nodeName,s=document.createElement(o||"div");s.classList.add("fez"),s.classList.add(`fez-${r}`),n.replaceChild(s,e);let i=new t;if(i.UID=++Fez.instanceCount,Fez.instances.set(i.UID,i),i.oldRoot=e,i.fezName=r,i.root=s,i.props=t.getProps(e,s),i.class=t,i.slot(e,s),s.fez=i,t.fezGlobal&&t.fezGlobal!=!0&&(window[t.fezGlobal]=i),window.$&&(i.$root=$(s)),i.props.id&&s.setAttribute("id",i.props.id),i.fezRegister(),(i.init||i.created||i.connect).bind(i)(i.props),i.render(),i.firstRender=!0,i.onMount(i.props),i.onSubmit){let u=i.root.nodeName=="FORM"?i.root:i.find("form");u.onsubmit=f=>{f.preventDefault(),i.onSubmit(i.formData())}}if(i.onPropsChange){Re.observe(s,{attributes:!0});for(let[u,f]of Object.entries(i.props))i.onPropsChange(u,f)}}}var Re=new MutationObserver((r,e)=>{for(let t of r)if(t.type==="attributes"){let n=t.target.fez,o=t.attributeName,s=t.target.getAttribute(o);n&&(n.props[o]=s,n.onPropsChange(o,s))}});var Pe=r=>{let e={script:"",style:"",html:"",head:""},t=r.split(`
12
+ `),n=[],o="";for(var s of t)s=s.trim(),s.startsWith("<script")&&!e.script&&o!="head"?o="script":s.startsWith("<head")&&!e.script?o="head":s.startsWith("<style")?o="style":s.endsWith("<\/script>")&&o==="script"&&!e.script?(e.script=n.join(`
13
+ `),n=[],o=null):s.endsWith("</style>")&&o==="style"?(e.style=n.join(`
14
+ `),n=[],o=null):(s.endsWith("</head>")||s.endsWith("</header>"))&&o==="head"?(e.head=n.join(`
15
+ `),n=[],o=null):o?n.push(s):e.html+=s+`
16
+ `;if(e.head){let u=Fez.domRoot(e.head);Array.from(u.children).forEach(f=>{if(f.tagName==="SCRIPT"){let m=document.createElement("script");Array.from(f.attributes).forEach(g=>{m.setAttribute(g.name,g.value)}),m.type||="text/javascript",f.src?document.head.appendChild(m):(m.type.includes("javascript")||m.type=="module")&&(m.textContent=f.textContent,document.head.appendChild(m))}else document.head.appendChild(f.cloneNode(!0))})}let i=e.script;return/class\s+\{/.test(i)||(i=`class {
14
17
  ${i}
15
- }`),String(e.style).includes(":")&&(Object.entries(Fez._styleMacros).forEach(([a,u])=>{e.style=e.style.replaceAll(`:${a} `,`${u} `)}),e.style=e.style.includes(":fez")||/(?:^|\s)body\s*\{/.test(e.style)?e.style:`:fez {
18
+ }`),String(e.style).includes(":")&&(Object.entries(Fez._styleMacros).forEach(([u,f])=>{e.style=e.style.replaceAll(`:${u} `,`${f} `)}),e.style=e.style.includes(":fez")||/(?:^|\s)body\s*\{/.test(e.style)?e.style:`:fez {
16
19
  ${e.style}
17
20
  }`,i=i.replace(/\}\s*$/,`
18
21
  CSS = \`${e.style}\`
19
22
  }`)),/\w/.test(String(e.html))&&(e.html=e.html.replaceAll("`","&#x60;"),e.html=e.html.replaceAll("$","\\$"),i=i.replace(/\}\s*$/,`
20
23
  HTML = \`${e.html}\`
21
- }`)),i};function q(t){if(t instanceof Node){let e=t;e.remove();let r=e.getAttribute("fez");if(r&&(r.includes(".")||r.includes("/"))){Pe(r);return}else return r&&!r.includes("-")&&console.error(`Fez: Invalid custom element name "${r}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`),N(r,e.innerHTML)}else{(t?Fez.domRoot(t):document.body).querySelectorAll("template[fez], xmp[fez]").forEach(r=>{q(r)});return}}function Pe(t){Fez.log(`Loading from ${t}`),Fez.fetch(t).then(e=>{let n=new DOMParser().parseFromString(e,"text/html").querySelectorAll("template[fez], xmp[fez]");if(n.length>0)n.forEach(o=>{let i=o.getAttribute("fez");i&&!i.includes("-")&&!i.includes(".")&&!i.includes("/")&&console.error(`Fez: Invalid custom element name "${i}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`);let a=o.innerHTML;N(i,a)});else{let o=t.split("/").pop().split(".")[0];N(o,e)}}).catch(e=>{console.error(`FEZ template load error for "${t}": ${e.message}`)})}function N(t,e){if(arguments.length===1)return q(t);if(e&&e.includes("</xmp>"))return q(e);t&&!t.includes("-")&&!t.includes(".")&&!t.includes("/")&&console.error(`Fez: Invalid custom element name "${t}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`);let r=Ne(e),s=r.split(/class\s+\{/,2);if(r=`${s[0]};
24
+ }`)),i};function G(r){if(r instanceof Node){let e=r;e.remove();let t=e.getAttribute("fez");if(t&&(t.includes(".")||t.includes("/"))){qe(t);return}else return t&&!t.includes("-")&&console.error(`Fez: Invalid custom element name "${t}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`),x(t,e.innerHTML)}else{(r?Fez.domRoot(r):document.body).querySelectorAll("template[fez], xmp[fez]").forEach(t=>{G(t)});return}}function qe(r){Fez.log(`Loading from ${r}`),Fez.fetch(r).then(e=>{let o=new DOMParser().parseFromString(e,"text/html").querySelectorAll("template[fez], xmp[fez]");if(o.length>0)o.forEach(s=>{let i=s.getAttribute("fez");i&&!i.includes("-")&&!i.includes(".")&&!i.includes("/")&&console.error(`Fez: Invalid custom element name "${i}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`);let u=s.innerHTML;x(i,u)});else{let s=r.split("/").pop().split(".")[0];x(s,e)}}).catch(e=>{console.error(`FEZ template load error for "${r}": ${e.message}`)})}function x(r,e){if(arguments.length===1)return G(r);if(e&&e.includes("</xmp>"))return G(e);r&&!r.includes("-")&&!r.includes(".")&&!r.includes("/")&&console.error(`Fez: Invalid custom element name "${r}". Custom element names must contain a dash (e.g., 'my-element', 'ui-button').`);let t=Pe(e),n=t.split(/class\s+\{/,2);if(t=`${n[0]};
22
25
 
23
- window.Fez('${t}', class {
24
- ${s[1]})`,t){let n=document.getElementById("fez-hidden-styles");n||(n=document.createElement("style"),n.id="fez-hidden-styles",document.head.appendChild(n));let o=[...Object.keys(Fez.classes),t].sort().join(", ");n.textContent=`${o} { display: none; }
25
- `}if(r.includes("import "))Fez.head({script:r}),setTimeout(()=>{Fez.classes[t]||Fez.error(`Template "${t}" possible compile error. (can be a false positive, it imports are not loaded)`)},2e3);else try{new Function(r)()}catch(n){Fez.error(`Template "${t}" compile error: ${n.message}`),console.log(r)}}var re=N;var De={data:{},listeners:new Map,subscribers:new Map,globalSubscribers:new Set,notify(t,e,r){Fez.log(`Global state change for ${t}: ${e} (from ${r})`);let s=this.listeners.get(t);s&&s.forEach(o=>{o.isConnected?(o.onGlobalStateChange(t,e,r),o.render()):s.delete(o)});let n=this.subscribers.get(t);n&&n.forEach(o=>{try{o(e,r,t)}catch(i){console.error(`Error in subscriber for key ${t}:`,i)}}),this.globalSubscribers.forEach(o=>{try{o(t,e,r)}catch(i){console.error("Error in global subscriber:",i)}})},createProxy(t){return new Proxy({},{get:(e,r)=>(t._globalStateKeys||=new Set,t._globalStateKeys.has(r)||(t._globalStateKeys.add(r),this.listeners.has(r)||this.listeners.set(r,new Set),this.listeners.get(r).add(t)),this.data[r]),set:(e,r,s)=>{let n=this.data[r];return n!==s&&(this.data[r]=s,this.notify(r,s,n)),!0}})},set(t,e){let r=this.data[t];r!==e&&(this.data[t]=e,this.notify(t,e,r))},get(t){return this.data[t]},forEach(t,e){let r=this.listeners.get(t);r&&r.forEach(s=>{s.isConnected?e(s):r.delete(s)})},subscribe(t,e){if(typeof t=="function")return this.globalSubscribers.add(t),()=>this.globalSubscribers.delete(t);{let r=t;return this.subscribers.has(r)||this.subscribers.set(r,new Set),this.subscribers.get(r).add(e),()=>{let s=this.subscribers.get(r);s&&(s.delete(e),s.size===0&&this.subscribers.delete(r))}}}},se=De;var m=(t,e)=>{if(typeof t=="number"){let r=m.instances.get(t);if(r)return r;m.error(`Instance with UID "${t}" not found.`)}else if(t)if(e)if(typeof e=="function"&&!/^\s*class/.test(e.toString())&&!/\b(this|new)\b/.test(e.toString())){let s=Array.from(document.querySelectorAll(`.fez.fez-${t}`)).filter(n=>n.fez);return s.forEach(n=>e(n.fez)),s}else return typeof e!="function"?m.find(t,e):te(t,e);else{let r=t.nodeName?t.closest(".fez"):document.querySelector(t.includes("#")?t:`.fez.fez-${t}`);if(r){if(r.fez)return r.fez;m.error(`node "${t}" has no Fez attached.`)}else m.error(`node "${t}" not found.`)}else m.error("Fez() ?")};m.classes={};m.instanceCount=0;m.instances=new Map;m.find=(t,e)=>{let r=t;typeof r=="string"&&(r=document.body.querySelector(r)),typeof r.val=="function"&&(r=r[0]);let s=e?`.fez.fez-${e}`:".fez",n=r.closest(s);if(n&&n.fez)return n.fez;console.error("Fez node connector not found",t,r)};m.cssClass=t=>Q.css(t);m.globalCss=(t,e={})=>{if(typeof t=="function"&&(t=t()),t.includes(":")){let r=t.split(`
26
- `).filter(s=>!/^\s*\/\//.test(s)).join(`
27
- `);e.wrap&&(r=`:fez { ${r} }`),r=r.replace(/\:fez|\:host/,`.fez.fez-${e.name}`),t=m.cssClass(r)}return document.body?document.body.parentElement.classList.add(t):document.addEventListener("DOMContentLoaded",()=>{document.body.parentElement.classList.add(t)}),t};m.info=()=>{console.log(JSON.stringify(m.fastBindInfo,null,2))};m.morphdom=(t,e,r={})=>{Array.from(t.attributes).forEach(n=>{e.setAttribute(n.name,n.value)}),x.morph(t,e,{morphStyle:"outerHTML"});let s=t.nextSibling;s?.nodeType===Node.TEXT_NODE&&s.textContent.trim()===""&&s.remove()};m.htmlEscape=t=>typeof t=="string"?(t=t.replace(/font-family\s*:\s*(?:&[^;]+;|[^;])*?;/gi,"").replaceAll("&","&amp;").replaceAll("'","&apos;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;"),t):t===void 0?"":t;m.publish=(t,...e)=>{m._subs||={},m._subs[t]||=[],m._subs[t].forEach(r=>{r[1].bind(r[0])(...e)})};m.fnv1=t=>{var e,r,s,n,o,i;for(e=2166136261,r=16777619,s=e,n=o=0,i=t.length-1;0<=i?o<=i:o>=i;n=0<=i?++o:--o)s^=t.charCodeAt(n),s*=r;return s.toString(36).replaceAll("-","")};m.tag=(t,e={},r="")=>{let s=encodeURIComponent(JSON.stringify(e));return`<${t} data-props="${s}">${r}</${t}>`};m.error=(t,e)=>{if(t=`Fez: ${t}`,console.error(t),e)return`<span style="border: 1px solid red; font-size: 14px; padding: 3px 7px; background: #fee; border-radius: 4px;">${t}</span>`};m.log=t=>{m.LOG===!0&&(t=String(t).substring(0,180),console.log(`Fez: ${t}`))};document.addEventListener("DOMContentLoaded",()=>{m.log("Fez.LOG === true, logging enabled.")});m.untilTrue=(t,e)=>{e||=200,t()||setTimeout(()=>{m.untilTrue(t,e)},e)};m.head=(t,e)=>{if(t.nodeName){t.nodeName=="SCRIPT"?(m.head({script:t.innerText}),t.remove()):(t.querySelectorAll("script").forEach(a=>m.head(a)),t.querySelectorAll("template[fez], xmp[fez], script[fez]").forEach(a=>m.compile(a)));return}if(typeof t!="object"||t===null)throw new Error("head requires an object parameter");let r,s={},n;if(t.script){if(t.script.includes("import ")){e&&m.error("Fez.head callback is not supported when script with import is passed (module context).");let a=document.createElement("script");a.type="module",a.textContent=t.script,document.head.appendChild(a),setTimeout(()=>a.remove(),100)}else try{new Function(t.script)(),e&&e()}catch(a){m.error("Error executing script:",a),console.log(t.script)}return}else if(t.js){r=t.js,n="script";for(let[a,u]of Object.entries(t))a!=="js"&&a!=="module"&&(s[a]=u);t.module&&(s.type="module")}else if(t.css){r=t.css,n="link",s.rel="stylesheet";for(let[a,u]of Object.entries(t))a!=="css"&&(s[a]=u)}else throw new Error('head requires either "script", "js" or "css" property');let o=document.querySelector(`${n}[src="${r}"], ${n}[href="${r}"]`);if(o)return e&&e(),o;let i=document.createElement(n);n==="link"?i.href=r:i.src=r;for(let[a,u]of Object.entries(s))i.setAttribute(a,u);return(e||t.module)&&(i.onload=()=>{t.module&&n==="script"&&import(r).then(a=>{window[t.module]=a.default||a[t.module]||a}).catch(a=>{console.error(`Error importing module ${t.module}:`,a)}),e&&e()}),document.head.appendChild(i),i};m.fetch=function(...t){m._fetchCache||={};let e="GET",r,s;typeof t[0]=="string"&&/^[A-Z]+$/.test(t[0])&&(e=t.shift()),r=t.shift();let n={},o=null;if(typeof t[0]=="object"&&(o=t.shift()),typeof t[0]=="function"&&(s=t.shift()),o){if(e==="GET"){let u=new URLSearchParams(o);r+=(r.includes("?")?"&":"?")+u.toString()}else if(e==="POST"){let u=new FormData;for(let[b,g]of Object.entries(o))u.append(b,g);n.body=u}}n.method=e;let i=`${e}:${r}:${JSON.stringify(n)}`;if(m._fetchCache[i]){let u=m._fetchCache[i];if(m.log(`fetch cache hit: ${e} ${r}`),s){s(u);return}return Promise.resolve(u)}m.log(`fetch live: ${e} ${r}`);let a=u=>u.headers.get("content-type")?.includes("application/json")?u.json():u.text();if(s){fetch(r,n).then(a).then(u=>{m._fetchCache[i]=u,s(u)}).catch(u=>m.onError("fetch",u));return}return fetch(r,n).then(a).then(u=>(m._fetchCache[i]=u,u))};m.onError=(t,e)=>{if(typeof t!="string")throw new Error("Fez.onError: kind must be a string");console.error(`${t}: ${e.toString()}`)};m._styleMacros={};m.styleMacro=(t,e)=>{m._styleMacros[t]=e};m.store={store:new Map,counter:0,set(t){let e=this.counter++;return this.store.set(e,t),e},get(t){return this.store.get(t)},delete(t){let e=this.store.get(t);return this.store.delete(t),e}};m.domRoot=(t,e="div")=>{if(t instanceof Node)return t;{let r=document.createElement(e);return r.innerHTML=t,r}};m.activateNode=(t,e="active")=>{Array.from(t.parentElement.children).forEach(r=>{r.classList.remove(e)}),t.classList.add(e)};m.compile=re;m.state=se;var w=m;typeof window<"u"&&(window.FezBase=L);typeof window<"u"&&(window.Fez=w);Promise.resolve().then(()=>oe());setInterval(()=>{for(let[t,e]of w.instances)e?.isConnected||(e.fez?.fezRemoveSelf(),w.instances.delete(t))},5e3);var Be=new MutationObserver(t=>{for(let{addedNodes:e,removedNodes:r}of t)e.forEach(s=>{s.nodeType===1&&(s.matches("template[fez], xmp[fez], script[fez]")&&(w.compile(s),s.remove()),s.querySelectorAll&&s.querySelectorAll("template[fez], xmp[fez], script[fez]").forEach(o=>{w.compile(o),o.remove()}))}),r.forEach(s=>{s.nodeType===1&&s.querySelectorAll&&s.querySelectorAll(".fez, :scope.fez").forEach(o=>{o.fez&&o.root&&(w.instances.delete(o.fez.UID),o.fez.fezRemoveSelf())})})});Be.observe(document.documentElement,{childList:!0,subtree:!0});var pt=w;})();
26
+ window.Fez('${r}', class {
27
+ ${n[1]})`,r){let o=document.getElementById("fez-hidden-styles");o||(o=document.createElement("style"),o.id="fez-hidden-styles",document.head.appendChild(o));let s=[...Object.keys(Fez.classes),r].sort().join(", ");o.textContent=`${s} { display: none; }
28
+ `}if(t.includes("import "))Fez.head({script:t}),setTimeout(()=>{Fez.classes[r]||Fez.error(`Template "${r}" possible compile error. (can be a false positive, it imports are not loaded)`)},2e3);else try{new Function(t)()}catch(o){Fez.error(`Template "${r}" compile error: ${o.message}`),console.log(t)}}var se=x;var Be={data:{},listeners:new Map,subscribers:new Map,globalSubscribers:new Set,notify(r,e,t){Fez.log(`Global state change for ${r}: ${e} (from ${t})`);let n=this.listeners.get(r);n&&n.forEach(s=>{s.isConnected?(s.onGlobalStateChange(r,e,t),s.render()):n.delete(s)});let o=this.subscribers.get(r);o&&o.forEach(s=>{try{s(e,t,r)}catch(i){console.error(`Error in subscriber for key ${r}:`,i)}}),this.globalSubscribers.forEach(s=>{try{s(r,e,t)}catch(i){console.error("Error in global subscriber:",i)}})},createProxy(r){return new Proxy({},{get:(e,t)=>(r._globalStateKeys||=new Set,r._globalStateKeys.has(t)||(r._globalStateKeys.add(t),this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r)),this.data[t]),set:(e,t,n)=>{let o=this.data[t];return o!==n&&(this.data[t]=n,this.notify(t,n,o)),!0}})},set(r,e){let t=this.data[r];t!==e&&(this.data[r]=e,this.notify(r,e,t))},get(r){return this.data[r]},forEach(r,e){let t=this.listeners.get(r);t&&t.forEach(n=>{n.isConnected?e(n):t.delete(n)})},subscribe(r,e){if(typeof r=="function")return this.globalSubscribers.add(r),()=>this.globalSubscribers.delete(r);{let t=r;return this.subscribers.has(t)||this.subscribers.set(t,new Set),this.subscribers.get(t).add(e),()=>{let n=this.subscribers.get(t);n&&(n.delete(e),n.size===0&&this.subscribers.delete(t))}}}},oe=Be;var ie=r=>{r.head=(e,t)=>{if(e.nodeName){e.nodeName=="SCRIPT"?(r.head({script:e.innerText}),e.remove()):(e.querySelectorAll("script").forEach(f=>r.head(f)),e.querySelectorAll("template[fez], xmp[fez], script[fez]").forEach(f=>r.compile(f)));return}if(typeof e!="object"||e===null)throw new Error("head requires an object parameter");let n,o={},s;if(e.script){if(e.script.includes("import ")){t&&r.error("Fez.head callback is not supported when script with import is passed (module context).");let f=document.createElement("script");f.type="module",f.textContent=e.script,document.head.appendChild(f),setTimeout(()=>f.remove(),100)}else try{new Function(e.script)(),t&&t()}catch(f){r.error("Error executing script:",f),console.log(e.script)}return}else if(e.js){n=e.js,s="script";for(let[f,m]of Object.entries(e))f!=="js"&&f!=="module"&&(o[f]=m);e.module&&(o.type="module")}else if(e.css){n=e.css,s="link",o.rel="stylesheet";for(let[f,m]of Object.entries(e))f!=="css"&&(o[f]=m)}else throw new Error('head requires either "script", "js" or "css" property');let i=document.querySelector(`${s}[src="${n}"], ${s}[href="${n}"]`);if(i)return t&&t(),i;let u=document.createElement(s);s==="link"?u.href=n:u.src=n;for(let[f,m]of Object.entries(o))u.setAttribute(f,m);return(t||e.module)&&(u.onload=()=>{e.module&&s==="script"&&import(n).then(f=>{window[e.module]=f.default||f[e.module]||f}).catch(f=>{console.error(`Error importing module ${e.module}:`,f)}),t&&t()}),document.head.appendChild(u),u},r.darkenColor=(e,t=20)=>{let n=parseInt(e.replace("#",""),16),o=Math.round(2.55*t),s=(n>>16)-o,i=(n>>8&255)-o,u=(n&255)-o;return"#"+(16777216+(s<255?s<1?0:s:255)*65536+(i<255?i<1?0:i:255)*256+(u<255?u<1?0:u:255)).toString(16).slice(1)},r.lightenColor=(e,t=20)=>{let n=parseInt(e.replace("#",""),16),o=Math.round(2.55*t),s=(n>>16)+o,i=(n>>8&255)+o,u=(n&255)+o;return"#"+(16777216+(s<255?s<1?0:s:255)*65536+(i<255?i<1?0:i:255)*256+(u<255?u<1?0:u:255)).toString(16).slice(1)},r.htmlEscape=e=>typeof e=="string"?(e=e.replace(/font-family\s*:\s*(?:&[^;]+;|[^;])*?;/gi,"").replaceAll("&","&amp;").replaceAll("'","&apos;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;"),e):e===void 0?"":e,r.domRoot=(e,t="div")=>{if(e instanceof Node)return e;{let n=document.createElement(t);return n.innerHTML=e,n}},r.activateNode=(e,t="active")=>{Array.from(e.parentElement.children).forEach(n=>{n.classList.remove(t)}),e.classList.add(t)},r.isTrue=e=>["1","true","on"].includes(String(e).toLowerCase()),r.getFunction=e=>{if(e){if(typeof e=="function")return e;if(typeof e=="string")return new Function(e)}else return()=>{}}};var b=(r,e)=>{if(typeof r=="number"){let t=b.instances.get(r);if(t)return t;b.error(`Instance with UID "${r}" not found.`)}else if(r)if(e)if(typeof e=="function"&&!/^\s*class/.test(e.toString())&&!/\b(this|new)\b/.test(e.toString())){let n=Array.from(document.querySelectorAll(`.fez.fez-${r}`)).filter(o=>o.fez);return n.forEach(o=>e(o.fez)),n}else return typeof e!="function"?b.find(r,e):B(r,e);else{let t=r.nodeName?r.closest(".fez"):document.querySelector(r.includes("#")?r:`.fez.fez-${r}`);if(t){if(t.fez)return t.fez;b.error(`node "${r}" has no Fez attached.`)}else b.error(`node "${r}" not found.`)}else b.error("Fez() ?")};b.classes={};b.instanceCount=0;b.instances=new Map;b.find=(r,e)=>{let t=r;typeof t=="string"&&(t=document.body.querySelector(t)),typeof t.val=="function"&&(t=t[0]);let n=e?`.fez.fez-${e}`:".fez",o=t.closest(n);if(o&&o.fez)return o.fez;console.error("Fez node connector not found",r,t)};b.cssClass=r=>ee.css(r);b.globalCss=(r,e={})=>{if(typeof r=="function"&&(r=r()),r.includes(":")){let t=r.split(`
29
+ `).filter(n=>!/^\s*\/\//.test(n)).join(`
30
+ `);e.wrap&&(t=`:fez { ${t} }`),t=t.replace(/\:fez|\:host/,`.fez.fez-${e.name}`),r=b.cssClass(t)}return document.body?document.body.parentElement.classList.add(r):document.addEventListener("DOMContentLoaded",()=>{document.body.parentElement.classList.add(r)}),r};b.info=()=>{console.log("Fez components:",Object.keys(b.classes||{}))};b.morphdom=(r,e,t={})=>{Array.from(r.attributes).forEach(o=>{e.setAttribute(o.name,o.value)}),te.morph(r,e,{morphStyle:"outerHTML"});let n=r.nextSibling;n?.nodeType===Node.TEXT_NODE&&n.textContent.trim()===""&&n.remove()};b.publish=(r,...e)=>{b._subs||={},b._subs[r]||=[],b._subs[r].forEach(t=>{t[1].bind(t[0])(...e)})};b.fnv1=r=>{var e,t,n,o,s,i;for(e=2166136261,t=16777619,n=e,o=s=0,i=r.length-1;0<=i?s<=i:s>=i;o=0<=i?++s:--s)n^=r.charCodeAt(o),n*=t;return n.toString(36).replaceAll("-","")};b.tag=(r,e={},t="")=>{let n=encodeURIComponent(JSON.stringify(e));return`<${r} data-props="${n}">${t}</${r}>`};b.error=(r,e)=>{if(r=`Fez: ${r}`,console.error(r),e)return`<span style="border: 1px solid red; font-size: 14px; padding: 3px 7px; background: #fee; border-radius: 4px;">${r}</span>`};b.log=r=>{b.LOG===!0&&(r=String(r).substring(0,180),console.log(`Fez: ${r}`))};document.addEventListener("DOMContentLoaded",()=>{b.log("Fez.LOG === true, logging enabled.")});b.untilTrue=(r,e)=>{e||=200,r()||setTimeout(()=>{b.untilTrue(r,e)},e)};b.throttle=(r,e=200)=>{let t=0,n;return function(...o){let s=Date.now();s-t>=e?(r.apply(this,o),t=s):(clearTimeout(n),n=setTimeout(()=>{r.apply(this,o),t=Date.now()},e-(s-t)))}};b.fetch=function(...r){b._fetchCache||={};let e="GET",t,n;typeof r[0]=="string"&&/^[A-Z]+$/.test(r[0])&&(e=r.shift()),t=r.shift();let o={},s=null;if(typeof r[0]=="object"&&(s=r.shift()),typeof r[0]=="function"&&(n=r.shift()),s){if(e==="GET"){let f=new URLSearchParams(s);t+=(t.includes("?")?"&":"?")+f.toString()}else if(e==="POST"){let f=new FormData;for(let[m,g]of Object.entries(s))f.append(m,g);o.body=f}}o.method=e;let i=`${e}:${t}:${JSON.stringify(o)}`;if(b._fetchCache[i]){let f=b._fetchCache[i];if(b.log(`fetch cache hit: ${e} ${t}`),n){n(f);return}return Promise.resolve(f)}b.log(`fetch live: ${e} ${t}`);let u=f=>f.headers.get("content-type")?.includes("application/json")?f.json():f.text();if(n){fetch(t,o).then(u).then(f=>{b._fetchCache[i]=f,n(f)}).catch(f=>b.onError("fetch",f));return}return fetch(t,o).then(u).then(f=>(b._fetchCache[i]=f,f))};b.onError=(r,e)=>{if(typeof r!="string")throw new Error("Fez.onError: kind must be a string");console.error(`${r}: ${e.toString()}`)};b._styleMacros={};b.styleMacro=(r,e)=>{b._styleMacros[r]=e};b.store={store:new Map,counter:0,set(r){let e=this.counter++;return this.store.set(e,r),e},get(r){return this.store.get(r)},delete(r){let e=this.store.get(r);return this.store.delete(r),e}};ie(b);b.compile=se;b.state=oe;b.dump=re;var T=b;typeof window<"u"&&(window.FezBase=_);typeof window<"u"&&(window.Fez=T);Promise.resolve().then(()=>ae());setInterval(()=>{for(let[r,e]of T.instances)e?.isConnected||(e.fez?.fezOnDestroy(),T.instances.delete(r))},5e3);var Ge=new MutationObserver(r=>{for(let{addedNodes:e,removedNodes:t}of r)e.forEach(n=>{n.nodeType===1&&(n.matches("template[fez], xmp[fez], script[fez]")&&(T.compile(n),n.remove()),n.querySelectorAll&&n.querySelectorAll("template[fez], xmp[fez], script[fez]").forEach(s=>{T.compile(s),s.remove()}))}),t.forEach(n=>{n.nodeType===1&&n.querySelectorAll&&n.querySelectorAll(".fez, :scope.fez").forEach(s=>{s.fez&&s.root&&(T.instances.delete(s.fez.UID),s.fez.fezOnDestroy())})})});Ge.observe(document.documentElement,{childList:!0,subtree:!0});var At=T;})();
28
31
  //# sourceMappingURL=fez.js.map