@panphora/hyper-cms 0.7.0 → 0.7.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.
@@ -1,5 +1,5 @@
1
- var hypercms=(()=>{var wt=Object.defineProperty;var Nn=Object.getOwnPropertyDescriptor;var In=Object.getOwnPropertyNames;var jn=Object.prototype.hasOwnProperty;var _t=(e,t)=>{for(var r in t)wt(e,r,{get:t[r],enumerable:!0})},Ln=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of In(t))!jn.call(e,i)&&i!==r&&wt(e,i,{get:()=>t[i],enumerable:!(n=Nn(t,i))||n.enumerable});return e};var Fn=e=>Ln(wt({},"__esModule",{value:!0}),e);var us={};_t(us,{cms:()=>ds,default:()=>ms});var mr={includeClasses:!0,includeAttributes:["href","src","name","type","role","aria-label","alt","title"],excludeAttributePrefixes:["data-morph-","data-hyper-","data-im-"],textHintLength:64,excludeIds:!0,maxPathDepth:4,landmarks:["HEADER","NAV","MAIN","ASIDE","FOOTER","SECTION","ARTICLE"],weights:{signature:100,pathSegment:10,textMatch:20,textMismatch:25,uniqueCandidate:50,positionPenalty:1,maxDriftPenalty:19,slotMatch:30},minConfidence:101,maxScoredCandidates:16};function Dn(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t^e.charCodeAt(r);return Math.abs(t).toString(36)}function $n(e){if(e.classList&&e.classList.length>0)return Array.from(e.classList).sort().join(" ");let t=e.getAttribute?.("class");return t?t.split(/\s+/).filter(Boolean).sort().join(" "):""}function Bn(e,t){let r=[];for(let n of e.attributes||[]){let i=n.name;i==="id"||i==="class"||t.excludeAttributePrefixes.some(o=>i.startsWith(o))||t.includeAttributes.includes(i)&&r.push(`${i}=${n.value}`)}return r.sort().join("|")}function Pn(e,t){return(e.textContent||"").replace(/\s+/g," ").trim().slice(0,t.textHintLength)}function zn(e,t){let r=[e.tagName];return t.includeClasses&&r.push($n(e)),r.push(Bn(e,t)),Dn(r.join("|"))}function Un(e){let t=e.tagName,r=1,n=e.previousElementSibling;for(;n;)n.tagName===t&&r++,n=n.previousElementSibling;return r}function Hn(e,t){return e.getAttribute?.("id")||e.getAttribute?.("role")?!0:t.landmarks.includes(e.tagName)}function Vn(e){let t=e.getAttribute?.("id");if(t)return`#${t}`;let r=e.getAttribute?.("role");return r?`@${r}`:e.tagName}function Wn(e,t){let r=[],n=e;for(;n&&n.tagName&&r.length<t.maxPathDepth;){let i=`${n.tagName}:${Un(n)}`;if(r.unshift(i),n!==e&&Hn(n,t)){r.unshift(Vn(n));break}n=n.parentElement}return r}function Kn(e,t){let r=0,n=e.length-1,i=t.length-1;for(;n>=0&&i>=0&&e[n]===t[i];)r++,n--,i--;return r}function Y(e,t,r){if(r.has(e))return r.get(e);let n={signature:zn(e,t),path:Wn(e,t),textHint:Pn(e,t)};return r.set(e,n),n}function fr(e,t,r,n){if(n.has(e))return n.get(e);let i=new Map,o=e.querySelectorAll("*"),a=0;for(let s of o){let l=Y(s,t,r);l.domIndex=a++,!t.shouldIgnore?.(s)&&(i.has(l.signature)||i.set(l.signature,[]),i.get(l.signature).push(s))}return n.set(e,i),i}function Gn(e,t,r){r.delete(e),t.delete(e);let n=e.querySelectorAll("*");for(let i of n)t.delete(i)}function At(e,t,r,n,i){let o=Y(e,r,n),a=Y(t,r,n),s=r.weights,l={},c=0;if(o.signature!==a.signature)return{score:0,breakdown:{rejected:"signature mismatch"}};c+=s.signature,l.signature=s.signature;let p=Kn(o.path,a.path)*s.pathSegment;c+=p,l.path=p;let d=!0;if(o.textHint&&a.textHint?o.textHint===a.textHint?(c+=s.textMatch,l.text=s.textMatch):(c-=s.textMismatch,l.text=-s.textMismatch,d=!1):o.textHint!==a.textHint&&(c-=s.textMismatch,l.text=-s.textMismatch,d=!1),i.candidateCount===1&&d&&(c+=s.uniqueCandidate,l.unique=s.uniqueCandidate),typeof o.domIndex=="number"&&typeof a.domIndex=="number"){let f=Math.abs(o.domIndex-a.domIndex),k=Math.min(f*s.positionPenalty,s.maxDriftPenalty);c-=k,l.drift=-k}return{score:c,breakdown:l}}function ur(e,t,r,n,i){if(r.excludeIds&&e.getAttribute("id"))return null;let o=fr(t,r,n,i),a=Y(e,r,n);if(typeof a.domIndex!="number"){let d=0,f=e.previousElementSibling;for(;f;)d++,f=f.previousElementSibling;a.domIndex=d}let s=o.get(a.signature)||[],l=r.excludeIds?s.filter(d=>!d.getAttribute("id")):s;if(l.length===0)return null;let c=null,u=0,p=null;for(let d of l){let{score:f,breakdown:k}=At(e,d,r,n,{candidateCount:l.length});f>u&&(u=f,c=d,p=k)}return u<r.minConfidence?null:{element:c,confidence:u,breakdown:p}}function Jn(e,t,r,n){let i=[],o=r.weights.signature+r.weights.slotMatch,a={slot:o};function s(p){if(p.children)return p.children;let d=p.childNodes;if(!d)return[];let f=[];for(let k=0;k<d.length;k++)d[k].nodeType===1&&f.push(d[k]);return f}function l(p,d){let f=s(p),k=s(d);if(f.length===k.length)for(let T=0;T<f.length;T++){let M=f[T],F=k[T];if(r.shouldIgnore?.(M)||r.shouldIgnore?.(F)||r.excludeIds&&(M.getAttribute("id")||F.getAttribute("id"))||M.tagName!==F.tagName)continue;let G=Y(M,r,n).signature,q=Y(F,r,n).signature;G!==q&&i.push({newEl:M,oldEl:F,score:o,breakdown:a}),l(M,F)}}function c(p,d){for(;;){if(p.tagName===d.tagName)return[p,d];let f=s(p);if(!p.tagName&&f.length===1){p=f[0];continue}let k=s(d);if(k.length===1&&k[0].tagName===p.tagName){d=k[0];continue}return null}}let u=c(e,t);return u&&l(u[0],u[1]),i}function hr(e,t,r,n,i){let o=t.querySelectorAll("*"),a=fr(e,r,n,i),s=0;for(let f of o){let k=Y(f,r,n);k.domIndex=s++}let l=[],c=new Map;function u(f,k,T){let M=new Set;if(f.textHint){let j=c.get(f.signature);if(!j){j=new Map;for(let Q of k){let fe=Y(Q,r,n).textHint,ce=j.get(fe);ce||(ce=[],j.set(fe,ce)),ce.push(Q)}c.set(f.signature,j)}let V=j.get(f.textHint);if(V)for(let Q=0;Q<V.length&&Q<T;Q++)M.add(V[Q])}let F=0,G=k.length;for(;F<G;){let j=F+G>>1;Y(k[j],r,n).domIndex<f.domIndex?F=j+1:G=j}let q=Math.max(0,Math.min(F-(T>>1),k.length-T)),P=Math.min(q+T,k.length);for(let j=q;j<P;j++)M.add(k[j]);return[...M]}for(let f of o){if(r.shouldIgnore?.(f)||r.excludeIds&&f.getAttribute("id"))continue;let k=Y(f,r,n),T=a.get(k.signature)||[],M=r.excludeIds?T.filter(q=>!q.getAttribute("id")):T,F=r.maxScoredCandidates,G=F&&M.length>F?u(k,M,F):M;for(let q of G){let{score:P,breakdown:j}=At(f,q,r,n,{candidateCount:M.length});P>=r.minConfidence&&l.push({newEl:f,oldEl:q,score:P,breakdown:j})}}if(r.weights.slotMatch>0){let f=Jn(t,e,r,n);for(let k of f)l.push(k)}l.sort((f,k)=>k.score-f.score);let p=new Map,d=new Set;for(let{newEl:f,oldEl:k}of l)p.has(f)||d.has(k)||(p.set(f,k),d.add(k));return p}function pr(e,t,r,n){let i=Y(e,r,n),o=Y(t,r,n),{score:a,breakdown:s}=At(e,t,r,n,{candidateCount:1});return{matches:a>=r.minConfidence,score:a,breakdown:s,newMeta:{signature:i.signature,path:i.path,textHint:i.textHint},oldMeta:{signature:o.signature,path:o.path,textHint:o.textHint}}}function gr(e={}){let t={...mr,...e,weights:{...mr.weights,...e.weights}},r=new WeakMap,n=new WeakMap;return{findMatch:(i,o)=>ur(i,o,t,r,n),computeMatches:(i,o)=>hr(i,o,t,r,n),explain:(i,o)=>pr(i,o,t,r),invalidate:i=>Gn(i,r,n),session:()=>{let i=new WeakMap,o=new WeakMap;return{findMatch:(a,s)=>ur(a,s,t,i,o),computeMatches:(a,s)=>hr(a,s,t,i,o),explain:(a,s)=>pr(a,s,t,i)}},getConfig:()=>({...t})}}function St(e,t){for(;;){for(;t<e.length&&/\s/.test(e[t]);)t++;if(e[t]==="/"&&e[t+1]==="/"){for(;t<e.length&&e[t]!==`
2
- `;)t++;continue}if(e[t]==="/"&&e[t+1]==="*"){let r=e.indexOf("*/",t+2);if(r===-1)return e.length;t=r+2;continue}return t}}function br(e){return e.replace(/\\'/g,"'").replace(/(\\*)"/g,(t,r)=>r.length%2===0?r+'\\"':t)}var Yn=/^-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?$/,Xn=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function We(e){try{return JSON.parse(e)}catch{return JSON.parse(Zn(e))}}function Zn(e){let t="",r=0,n=(i,o)=>{throw new Error(`Invalid relaxed JSON: ${i} at position ${o}`)};for(;r<e.length&&(r=St(e,r),!(r>=e.length));){let i=e[r];if("{}[]:".includes(i)){t+=i,r++;continue}if(i===","){let s=St(e,r+1);if(e[s]==="}"||e[s]==="]"){r++;continue}t+=i,r++;continue}if(i==='"'||i==="'"){let s=r+1;for(;s<e.length&&e[s]!==i;)e[s]==="\\"&&s++,s++;s>=e.length&&n("unterminated string",r);let l=e.slice(r+1,s);i==="'"&&(l=br(l)),t+='"'+l+'"',r=s+1;continue}let o=r;for(;o<e.length&&/[A-Za-z0-9_$.+\-]/.test(e[o]);)o++;o===r&&n("unexpected character "+JSON.stringify(i),r);let a=e.slice(r,o);if(a==="true"||a==="false"||a==="null"||Yn.test(a)){t+=a,r=o;continue}if(Xn.test(a)){if(e[St(e,o)]===":"){t+='"'+a+'"',r=o;continue}n("unquoted value "+JSON.stringify(a),r)}n("invalid token "+JSON.stringify(a),r)}return t}function kr(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function r(i){let o=[],a=0;for(;a<i.length;){let s=i[a];if(/\s/.test(s)){a++;continue}if("{}".includes(s)){o.push({type:s,value:s}),a++;continue}if(s==="["){let p=!1,d=a+1;for(;d<i.length&&/\s/.test(i[d]);)d++;if(d<i.length&&/[a-zA-Z_]/.test(i[d])&&(p=!0),!p){o.push({type:s,value:s}),a++;continue}}if(s==="]"){o.push({type:s,value:s}),a++;continue}if(s===":"){o.push({type:t.COLON,value:s}),a++;continue}if(s===","){o.push({type:t.COMMA,value:s}),a++;continue}if(s==='"'||s==="'"){let p=s,d=a+1;for(;d<i.length&&i[d]!==p;)i[d]==="\\"&&d++,d++;o.push({type:t.STRING,value:i.substring(a+1,d),quoted:!0,sourceQuote:p}),a=d+1;continue}let l=a,c;for(;l<i.length&&!/[{},]/.test(i[l]);)if(i[l]===":"){let p=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],d=!1;for(let f of p){let k=f.substring(1);if(i.substring(l+1,l+1+k.length)===k){d=!0,l+=k.length;break}}if(!d)break}else if(i[l]==="["){for(l++;l<i.length&&i[l]!=="]";){if(i[l]==='"'||i[l]==="'"){let p=i[l];for(l++;l<i.length&&i[l]!==p;)i[l]==="\\"&&l++,l++}l++}l<i.length&&i[l]==="]"&&l++}else l++;c=i.substring(a,l);let u=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(c)?u=t.NUMBER:c==="true"||c==="false"||c==="null"?u=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(c)&&(u=t.SELECTOR),o.push({type:u,value:c,quoted:!1}),a=l}return o}function n(i){let o="";for(let a=0;a<i.length;a++){let s=i[a];if("{}".includes(s.type)||"[]".includes(s.type)){o+=s.value;continue}if(s.type===t.COLON){o+=s.value;continue}if(s.type===t.COMMA){let l=i[a+1];if(l&&(l.type==="}"||l.type==="]"))continue;o+=s.value;continue}if(s.type===t.STRING){let l=s.value;s.sourceQuote==="'"&&(l=br(l)),o+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){o+=s.value;continue}o+=`"${s.value}"`}return o}try{let i=r(e),o=n(i);return JSON.parse(o)}catch(i){throw new Error("Invalid extraction rules syntax: "+i.message)}}var B=Symbol("hyper-morph-json-merge:missing"),yr=["id","_id","uuid","key","slug","code","name"];function be(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Me(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Qn(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:!0,writable:!0,configurable:!0})}function se(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!se(e[r],t[r]))return!1;return!0}if(be(e)&&be(t)){let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n of r)if(!Me(t,n)||!se(e[n],t[n]))return!1;return!0}return!1}function vr(e,t,r,n){return se(t,r)?t:se(t,e)?r:se(r,e)?t:be(t)&&be(r)?ei(be(e)?e:{},t,r,n):Array.isArray(t)&&Array.isArray(r)?ii(Array.isArray(e)?e:[],t,r,n):r}function xr(e,t,r,n){return t===B&&r===B?B:t===B?e===B?r:se(r,e)?B:r:r===B?e===B?t:B:vr(e,t,r,n)}function ei(e,t,r,n){let i={},o=new Set([...Object.keys(e),...Object.keys(t),...Object.keys(r)]);for(let a of o){let s=xr(Me(e,a)?e[a]:B,Me(t,a)?t[a]:B,Me(r,a)?r[a]:B,n);s!==B&&Qn(i,a,s)}return i}function ti(e){return e===null||typeof e!="object"}function Ke(e){return typeof e+":"+String(e)}function ri(e,t){for(let r of t){let n=new Set;for(let i of r){if(!Me(i,e))return!1;let o=i[e];if(typeof o!="string"&&typeof o!="number")return!1;let a=Ke(o);if(n.has(a))return!1;n.add(a)}}return!0}function ni(e,t,r,n){let i=[e,t,r],o=!0;for(let a of i)for(let s of a)be(s)||(o=!1);if(o){for(let a of n.keyCandidates)if(ri(a,i))return{kind:"keyed",field:a};return null}for(let a of i){let s=new Set;for(let l of a){if(!ti(l))return null;let c=Ke(l);if(s.has(c))return null;s.add(c)}}return{kind:"self"}}function ii(e,t,r,n){let i=ni(e,t,r,n);if(!i)return r;let o=i.kind==="self"?Ke:f=>Ke(f[i.field]),a=f=>{let k=new Map;for(let T of f)k.set(o(T),T);return k},s=a(e),l=a(t),c=a(r),u=new Map,p=new Set([...s.keys(),...l.keys(),...c.keys()]);for(let f of p){let k=xr(s.has(f)?s.get(f):B,l.has(f)?l.get(f):B,c.has(f)?c.get(f):B,n);k!==B&&u.set(f,k)}let d=[];for(let f of r){let k=o(f);u.has(k)&&d.push(k)}for(let f=0;f<t.length;f++){let k=o(t[f]);if(!u.has(k)||d.includes(k))continue;let T=0;for(let M=f-1;M>=0;M--){let F=d.indexOf(o(t[M]));if(F!==-1){T=F+1;break}}d.splice(T,0,k)}return d.map(f=>u.get(f))}function Et(e,t,r,n={}){let i=n.keyCandidates?[...n.keyCandidates,...yr]:yr;return vr(e===void 0?B:e,t,r,{keyCandidates:i})}function Ct(e,t,r,n={}){let i=n.parse||We,o=[],a=(p,d)=>{if(typeof p!="string")return B;try{return i(p)}catch(f){return o.push(`${d} side is not valid JSON (${f.message})`),B}},s=a(t,"local"),l=a(r,"remote");if(s===B)return{text:r,warnings:o};if(l===B)return{text:t,warnings:o};let c=a(e,"base"),u=Et(c===B?void 0:c,s,l,n);return se(u,l)?{text:r,warnings:o}:se(u,s)?{text:t,warnings:o}:{text:JSON.stringify(u,null,2),warnings:o}}var Tt=(function(){"use strict";let e=()=>{},t='[save-ignore],[snapshot-remove],[no-snapshot],[no-save],[save-remove],[freeze],[save-freeze],[clay~="no-save"],[clay~="no-snapshot"],[clay~="freeze"]';function r(v){if(!(v instanceof Element))return!1;if(v.matches(t))return!0;if(v.tagName==="LINK"||v.tagName==="SCRIPT"){let E=v.getAttribute("src")||v.getAttribute("href")||"";if(E.startsWith("chrome-extension://")||E.startsWith("moz-extension://")||E.startsWith("safari-web-extension://"))return!0}return!1}function n(v){return v instanceof Element?v.closest(t)?!0:r(v):!1}let i=gr({shouldIgnore:n});function o(v,E,S){if(S){let N=S.identityOf(v);if(N&&!S.disabled.has(N.key))return"hm-merge:"+N.key}if(E!=="smart")return v.outerHTML;let O=v.getAttribute("src"),C=v.getAttribute("type")||"text/javascript";if(O)try{let N=new URL(O,window.location.href);return`ext:${C}:${N.origin}${N.pathname}${N.search}`}catch{return`ext:${C}:${O}`}else{let N=v.textContent.trim(),y=5381;for(let A=0;A<N.length;A++)y=(y<<5)+y^N.charCodeAt(A);return`inline:${C}:${Math.abs(y).toString(36)}`}}let a="http://www.w3.org/1999/xhtml";function s(v){return v instanceof Element&&v.tagName==="SCRIPT"&&v.namespaceURI===a}function l(v){let E=document.createElement("div");E.innerHTML="<script><\/script>";let S=E.firstChild;for(let O of v.attributes)S.setAttribute(O.name,O.value);return S.textContent=v.textContent,S}function c(v){if(s(v))return l(v);if(v instanceof Element)for(let E of v.querySelectorAll("script"))s(E)&&E.replaceWith(l(E));return v}function u(v){let E=(v.getAttribute("type")||"").split(";")[0].trim().toLowerCase();return E==="application/json"||E.endsWith("+json")}let p={match:v=>v.hasAttribute("merge"),identity:v=>v.getAttribute("merge")};function d(v,E,S){if(S.merge===!1)return null;let O=[p,...S.mergeTags||[]],C=new WeakMap,N=g=>{if(C.has(g))return C.get(g);let w=null;if(s(g)&&!g.getAttribute("src")&&!n(g)){let _=g;for(let R=0;R<O.length;R++)if(O[R].match(_)){if(!u(_))console.warn("[hyper-morph] merge ignored: script type is not JSON",_);else{let L=O[R].identity(_);L!=null&&L!==""&&(w={key:R+":"+L,raw:L,recognizer:O[R]})}break}}return C.set(g,w),w},y=new Set,A=g=>{let w=new Map,_=R=>{let L=N(R);L&&(w.has(L.key)?(y.add(L.key),console.warn(`[hyper-morph] merge disabled for duplicate identity "${L.raw}"`)):w.set(L.key,R))};s(g)&&_(g);for(let R of g.querySelectorAll("script"))_(R);return w},b=A(v),h=A(E.__hyperMorphRoot||E);if(b.size===0&&h.size===0)return null;let m=null;return{identityOf:N,disabled:y,oldByKey:b,newByKey:h,baseTexts:()=>{if(m)return m;m=new Map;let g=S.mergeBase;if(!g)return m;let w;typeof g=="string"?w=new DOMParser().parseFromString(g,"text/html").documentElement:g instanceof Document?w=g.documentElement:w=g;let _=R=>{let L=N(R);L&&!m.has(L.key)&&m.set(L.key,R.textContent)};s(w)&&_(w);for(let R of w.querySelectorAll("script"))_(R);return m}}}function f(v,E,S){let O=v.merge;if(!O)return!1;let C=O.identityOf(E);if(!C||O.disabled.has(C.key))return!1;let N=O.identityOf(S);if(!N||N.key!==C.key)return!1;let y=E,A=S,b=A.getAttribute("merge-key")||y.getAttribute("merge-key"),{text:h,warnings:m}=Ct(O.baseTexts().get(C.key),y.textContent,A.textContent,{parse:C.recognizer.parse,keyCandidates:b?b.split(/[\s,]+/).filter(Boolean):void 0});for(let x of m)console.warn(`[hyper-morph] merge "${C.raw}": ${x}`);return y.textContent!==h&&(y.textContent=h),!0}let k={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:e,afterNodeAdded:e,beforeNodeMorphed:e,afterNodeMorphed:e,beforeNodeRemoved:e,afterNodeRemoved:e,beforeAttributeUpdated:e},head:{style:"merge",shouldPreserve:v=>v.getAttribute("im-preserve")==="true",shouldReAppend:v=>v.getAttribute("im-re-append")==="true",shouldRemove:e,afterHeadMorphed:e},scripts:{handle:!0,matchMode:"outerHTML",shouldPreserve:v=>v.getAttribute("im-preserve")==="true",shouldReAppend:v=>v.getAttribute("im-re-append")==="true",shouldRemove:e,afterScriptsHandled:e},restoreFocus:!0},T={computeMatches(v,E){let{computeMatches:S}=i.session();return S(v,E)}};function M(v,E,S={}){v=Mn(v);let O=sr(E),C=On(v,O,S),N=C.scripts.handle?new Set(Array.from(v.querySelectorAll("script")).map(h=>o(h,C.scripts.matchMode,C.merge))):null,y=q(C),A=Q(C,v,O,h=>h.morphStyle==="innerHTML"?(j(h,v,O),Array.from(v.childNodes)):G(h,v,O)),b=h=>{y&&P(C,y),F(C);let m=N?Rn(h,N,C):[];return m.length>0?Promise.all(m).then(()=>h):h};return A instanceof Promise?A.then(b):b(A)}function F(v){for(let E of Array.from(v.pantry.childNodes))v.callbacks.beforeNodeRemoved(E)!==!1&&v.callbacks.afterNodeRemoved(E);v.pantry.remove()}function G(v,E,S){let O=sr(E);return j(v,O,S,E,E.nextSibling),Array.from(O.childNodes)}function q(v){if(!v.config.restoreFocus)return null;let E=document.activeElement;if(!(E instanceof HTMLInputElement||E instanceof HTMLTextAreaElement))return null;let{id:S,selectionStart:O,selectionEnd:C}=E;return{element:E,id:S,selectionStart:O,selectionEnd:C}}function P(v,E){let S=E.element;if(E.id&&E.id!==document.activeElement?.getAttribute("id")&&(S=v.target.querySelector(`[id="${CSS.escape(E.id)}"]`),S?.focus()),S&&!S.selectionEnd&&E.selectionEnd!=null)try{S.setSelectionRange(E.selectionStart,E.selectionEnd)}catch{}}let j=(function(){function v(h,m,x,g=null,w=null){m instanceof HTMLTemplateElement&&x instanceof HTMLTemplateElement&&(m=m.content,x=x.content),g||=m.firstChild;for(let _ of x.childNodes){if(r(_))continue;if(g&&g!=w){let L=S(h,_,g,w);if(L){L!==g&&C(h,g,L),V(L,_,h),g=L.nextSibling;continue}}if(_ instanceof Element){let L=_.getAttribute("id");if(h.persistentIds.has(L)){let $=N(m,L,g,h);V($,_,h),g=$.nextSibling;continue}if(!h.idMap.has(_)){let $=h.hyperMatches.get(_);if($&&!h.idMap.has($)&&!b($,m)){A(m,$,g),V($,_,h),g=$.nextSibling;continue}}}let R=E(m,_,g,h);R&&(g=R.nextSibling)}for(;g&&g!=w;){let _=g;g=g.nextSibling,r(_)||O(h,_)}}function E(h,m,x,g){if(g.callbacks.beforeNodeAdded(m)===!1)return null;if(g.idMap.has(m)){let w=m,_=document.createElementNS(w.namespaceURI,w.localName);return h.insertBefore(_,x),V(_,m,g),g.callbacks.afterNodeAdded(_),_}else{let w=c(document.importNode(m,!0));return h.insertBefore(w,x),g.callbacks.afterNodeAdded(w),w}}let S=(function(){function h(g,w,_,R){let L=w instanceof Element&&!g.idMap.has(w)?g.hyperMatches.get(w):null,$=null,H=w.nextSibling,ee=0,D=_;for(;D&&D!=R;){if(r(D)){D=D.nextSibling;continue}if(x(D,w)){if(m(g,D,w)||D===L&&!g.idMap.has(D))return D;if($===null){let J=D instanceof Element&&g.hyperMatchedOldElements.has(D);!g.idMap.has(D)&&!J&&($=D)}}if($===null&&H&&x(D,H)&&(ee++,H=H.nextSibling,ee>=2&&($=void 0)),g.activeElementAndParents.includes(D))break;D=D.nextSibling}return $||null}function m(g,w,_){let R=g.idMap.get(w),L=g.idMap.get(_);if(!L||!R)return!1;for(let $ of R)if(L.has($))return!0;return!1}function x(g,w){let _=g,R=w;return _.nodeType===R.nodeType&&_.tagName===R.tagName&&(!_.getAttribute?.("id")||_.getAttribute?.("id")===R.getAttribute?.("id"))}return h})();function O(h,m){let x=m instanceof Element&&h.hyperMatchedOldElements.has(m)&&!h.idMap.has(m);if(h.idMap.has(m)||x)A(h.pantry,m,null);else{if(h.callbacks.beforeNodeRemoved(m)===!1)return;m.parentNode?.removeChild(m),h.callbacks.afterNodeRemoved(m)}}function C(h,m,x){let g=m;for(;g&&g!==x;){let w=g;g=g.nextSibling,r(w)||O(h,w)}return g}function N(h,m,x,g){let w=g.target.getAttribute?.("id")===m&&g.target||g.target.querySelector(`[id="${CSS.escape(m)}"]`)||g.pantry.querySelector(`[id="${CSS.escape(m)}"]`);return y(w,g),A(h,w,x),w}function y(h,m){let x=h.getAttribute("id");for(;h=h.parentNode;){let g=m.idMap.get(h);g&&(g.delete(x),g.size||m.idMap.delete(h))}}function A(h,m,x){if(h.moveBefore)try{h.moveBefore(m,x)}catch{h.insertBefore(m,x)}else h.insertBefore(m,x)}function b(h,m){let x=m instanceof Element?m:m.realParentNode;return!!x&&h.contains(x)}return v})(),V=(function(){function v(y,A,b){return b.ignoreActive&&y===document.activeElement?null:(b.callbacks.beforeNodeMorphed(y,A)===!1||(y instanceof HTMLHeadElement&&b.head.ignore||(y instanceof HTMLHeadElement&&b.head.style!=="morph"?ce(y,A,b):(E(y,A,b),f(b,y,A)||N(y,b)||j(b,y,A))),b.callbacks.afterNodeMorphed(y,A)),y)}function E(y,A,b){let h=A.nodeType;if(h===1){let m=y,x=A,g=m.attributes,w=x.attributes;for(let _ of w)C(_.name,m,"update",b)||m.getAttribute(_.name)!==_.value&&m.setAttribute(_.name,_.value);for(let _=g.length-1;0<=_;_--){let R=g[_];if(R&&!x.hasAttribute(R.name)){if(C(R.name,m,"remove",b))continue;m.removeAttribute(R.name)}}N(m,b)||S(m,x,b)}(h===8||h===3)&&y.nodeValue!==A.nodeValue&&(y.nodeValue=A.nodeValue)}function S(y,A,b){if(y instanceof HTMLInputElement&&A instanceof HTMLInputElement&&A.type!=="file"){let h=A.value,m=y.value;O(y,A,"checked",b),O(y,A,"disabled",b),b.formStateSync==="property"&&y.indeterminate!==A.indeterminate&&(y.indeterminate=A.indeterminate),b.formStateSync==="property"?m!==h&&(C("value",y,"update",b)||(y.value=h)):A.hasAttribute("value")?m!==h&&(C("value",y,"update",b)||(y.setAttribute("value",h),y.value=h)):C("value",y,"remove",b)||(y.value="",y.removeAttribute("value"))}else if(y instanceof HTMLOptionElement&&A instanceof HTMLOptionElement)O(y,A,"selected",b);else if(y instanceof HTMLTextAreaElement&&A instanceof HTMLTextAreaElement){let h=A.value,m=y.value;if(C("value",y,"update",b)||(h!==m&&(y.value=h),b.formStateSync==="property"))return;y.firstChild&&y.firstChild.nodeValue!==h&&(y.firstChild.nodeValue=h)}}function O(y,A,b,h){let m=A[b],x=y[b];if(m!==x){let g=C(b,y,"update",h);if(g||(y[b]=A[b]),h.formStateSync==="property")return;m?g||y.setAttribute(b,""):C(b,y,"remove",h)||y.removeAttribute(b)}}function C(y,A,b,h){return y==="value"&&h.ignoreActiveValue&&A===document.activeElement?!0:h.callbacks.beforeAttributeUpdated(y,A,b)===!1}function N(y,A){return!!A.ignoreActiveValue&&y===document.activeElement&&y!==document.body}return v})();function Q(v,E,S,O){if(v.head.block){let C=E.querySelector("head"),N=S.querySelector("head");if(C&&N){let y=ce(C,N,v);return Promise.all(y).then(()=>(v.head.block=!1,v.head.ignore=!0,O(v)))}}return O(v)}function fe(v){return v.tagName==="SCRIPT"?!!v.getAttribute("src"):v.tagName==="LINK"?(v.getAttribute("rel")||"").toLowerCase().split(/\s+/).includes("stylesheet")&&!!v.getAttribute("href"):!1}function ce(v,E,S){let O=[],C=[],N=[],y=[],A=S.scripts.matchMode,b=x=>{if(x.tagName==="SCRIPT")return o(x,A,S.merge);if(x.tagName==="LINK"&&A==="smart"){let g=x.getAttribute("href");if(g)try{let w=new URL(g,window.location.href);return`link:${x.getAttribute("rel")||""}:${w.origin}${w.pathname}${w.search}`}catch{}}return x.outerHTML},h=new Map;for(let x of E.children){if(r(x))continue;let g=b(x),w=h.get(g);w||(w=[],h.set(g,w)),w.push(x)}for(let x of v.children){let g=b(x),w=h.get(g),_=!!(w&&w.length),R=S.head.shouldReAppend(x),L=S.head.shouldPreserve(x);if(_||L)if(R)C.push(x);else{if(w&&w.length){let $=w.pop();w.length||h.delete(g),f(S,x,$)}N.push(x)}else S.head.style==="append"?R&&(C.push(x),y.push(x)):S.head.shouldRemove(x)!==!1&&!r(x)&&C.push(x)}for(let x of h.values())y.push(...x);let m=[];for(let x of y){let g=document.createRange().createContextualFragment(x.outerHTML).firstChild;if(S.callbacks.beforeNodeAdded(g)!==!1){if(g instanceof Element&&fe(g)){let w,_=new Promise(function(R){w=R});g.addEventListener("load",function(){w()}),g.addEventListener("error",function(){w()}),m.push(_)}v.appendChild(g),S.callbacks.afterNodeAdded(g),O.push(g)}}for(let x of C)S.callbacks.beforeNodeRemoved(x)!==!1&&(v.removeChild(x),S.callbacks.afterNodeRemoved(x));return S.head.afterHeadMorphed(v,{added:O,kept:N,removed:C}),m}function Rn(v,E,S){if(!S.scripts.handle)return[];let O=[],C=[],N=[],y=[],A=S.scripts.matchMode,b=[];for(let m of v)if(m instanceof Element){s(m)&&b.push(m);for(let x of m.querySelectorAll("script"))s(x)&&b.push(x)}for(let m of b){if(m.closest("head")||n(m))continue;let x=o(m,A,S.merge),g=E.has(x),w=S.scripts.shouldPreserve(m),_=S.scripts.shouldReAppend(m);g||w?_?(C.push(m),y.push(m)):N.push(m):y.push(m)}let h=[];for(let m of y){if(S.callbacks.beforeNodeAdded(m)===!1)continue;let x=document.createElement("script");for(let g of m.attributes)x.setAttribute(g.name,g.value);if(x.textContent=m.textContent,x.src){let g,w=new Promise(function(_){g=_});x.addEventListener("load",function(){g()}),x.addEventListener("error",function(){g()}),h.push(w)}m.replaceWith(x),S.callbacks.afterNodeAdded(x),O.push(x)}return S.scripts.afterScriptsHandled(S.target,{added:O,kept:N,removed:C}),h}let On=(function(){function v(b,h,m){let{persistentIds:x,idMap:g}=y(b,h),w=T.computeMatches(b,h);if(typeof m.key=="function"){let H=new Map,ee=new Set,D=z=>{let U=m.key(z);U!=null&&(H.has(U)?ee.add(U):H.set(U,z))};b instanceof Element&&D(b);for(let z of b.querySelectorAll("*"))D(z);for(let z of ee)H.delete(z);let J=new Map;for(let[z,U]of w)J.set(U,z);let de=h.__hyperMorphRoot||h,oe=new Map,ar=new Set,lr=z=>{let U=m.key(z);U!=null&&(oe.has(U)?ar.add(U):oe.set(U,z))};de instanceof Element&&lr(de);for(let z of de.querySelectorAll("*"))lr(z);for(let z of ar)oe.delete(z);for(let[z,U]of oe){let ge=H.get(z);if(!ge||ge.tagName!==U.tagName)continue;let vt=J.get(ge);vt&&vt!==U&&w.delete(vt);let xt=w.get(U);xt&&xt!==ge&&J.delete(xt),w.set(U,ge),J.set(ge,U)}}let _=E(m),R=d(b,h,_.scripts);if(R){let H=new Map;for(let[ee,D]of w)H.set(D,ee);for(let[ee,D]of R.newByKey){if(R.disabled.has(ee))continue;let J=R.oldByKey.get(ee);if(!J)continue;let de=H.get(J);de&&de!==D&&w.delete(de);let oe=w.get(D);oe&&oe!==J&&H.delete(oe),w.set(D,J),H.set(J,D)}}let L=new Set;for(let H of w.values())L.add(H);let $=_.morphStyle||"outerHTML";if(!["innerHTML","outerHTML"].includes($))throw new Error(`Do not understand how to morph style ${$}`);return{target:b,newContent:h,config:_,morphStyle:$,ignoreActive:_.ignoreActive,ignoreActiveValue:_.ignoreActiveValue,restoreFocus:_.restoreFocus,formStateSync:_.formStateSync||"attribute",idMap:g,persistentIds:x,hyperMatches:w,hyperMatchedOldElements:L,merge:R,pantry:S(),activeElementAndParents:O(b),callbacks:_.callbacks,head:_.head,scripts:_.scripts}}function E(b){let h=Object.assign({},k);return Object.assign(h,b),h.callbacks=Object.assign({},k.callbacks,b.callbacks),h.head=Object.assign({},k.head,b.head),h.scripts=Object.assign({},k.scripts,b.scripts),h}function S(){let b=document.createElement("div");return b.hidden=!0,document.body.insertAdjacentElement("afterend",b),b}function O(b){let h=[],m=document.activeElement;if(m?.tagName!=="BODY"&&b.contains(m))for(;m&&(h.push(m),m!==b);)m=m.parentElement;return h}function C(b){let h=Array.from(b.querySelectorAll("[id]"));return b.getAttribute?.("id")&&h.push(b),h}function N(b,h,m,x){for(let g of x){let w=g.getAttribute("id");if(h.has(w)){let _=g;for(;_;){let R=b.get(_);if(R==null&&(R=new Set,b.set(_,R)),R.add(w),_===m)break;_=_.parentElement}}}}function y(b,h){let m=C(b),x=C(h),g=A(m,x),w=new Map;N(w,g,b,m);let _=h.__hyperMorphRoot||h;return N(w,g,_,x),{persistentIds:g,idMap:w}}function A(b,h){let m=new Set,x=new Map;for(let w of b){let _=w.getAttribute("id");x.has(_)?m.add(_):x.set(_,w.tagName)}let g=new Set;for(let w of h){let _=w.getAttribute("id");g.has(_)?m.add(_):x.get(_)===w.tagName&&g.add(_)}for(let w of m)g.delete(w);return g}return v})(),{normalizeElement:Mn,normalizeParent:sr}=(function(){let v=new WeakSet;function E(y){return y instanceof Document?y.documentElement:y}function S(y){if(y==null)return document.createElement("div");if(typeof y=="string")return S(N(y));if(v.has(y))return y;if(y instanceof Node){if(y.parentNode)return new O(y);{let A=document.createElement("div");return A.append(y),A}}else{let A=document.createElement("div");for(let b of[...y])A.append(b);return A}}class O{constructor(A){this.originalNode=A,this.realParentNode=A.parentNode,this.previousSibling=A.previousSibling,this.nextSibling=A.nextSibling}get childNodes(){let A=[],b=this.previousSibling?this.previousSibling.nextSibling:this.realParentNode.firstChild;for(;b&&b!=this.nextSibling;)A.push(b),b=b.nextSibling;return A}querySelectorAll(A){return this.childNodes.reduce((b,h)=>{if(h instanceof Element){h.matches(A)&&b.push(h);let m=h.querySelectorAll(A);for(let x=0;x<m.length;x++)b.push(m[x])}return b},[])}insertBefore(A,b){return this.realParentNode.insertBefore(A,b)}moveBefore(A,b){return this.realParentNode.moveBefore(A,b)}get __hyperMorphRoot(){return this.originalNode}}function C(y){let A=x=>`<${x}(?:\\s(?:[^>"']|"[^"]*"|'[^']*')*)?>`,b=y.replace(/<!--[\s\S]*?-->/g,"");for(let x of["script","style","textarea","title"])b=b.replace(new RegExp(`${A(x)}[\\s\\S]*?</${x}\\s*>`,"gi"),"");let h=new RegExp(`${A("svg")}[\\s\\S]*?</svg\\s*>`,"gi"),m;do m=b,b=b.replace(h,"");while(b!==m);return b}function N(y){let A=new DOMParser,b=C(y);if(b.match(/<\/html>/)||b.match(/<\/head>/)||b.match(/<\/body>/)){let h=A.parseFromString(y,"text/html");if(b.match(/<\/html>/))return v.add(h),h;{let m=h.firstChild;return m&&v.add(m),m}}else{let m=A.parseFromString("<body><template>"+y+"</template></body>","text/html").body.querySelector("template").content;return v.add(m),m}}return{normalizeElement:E,normalizeParent:S}})();return{morph:M,defaults:k,mergeJson:Et,mergeScriptText:Ct,parseJsonRelaxed:We,parseRulesRelaxed:kr}})();var Ns=Tt.morph,Is=Tt.defaults;var Rt=Tt;var Ge=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],Ot=new Set(Ge),wr=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),_r=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var Je={};_t(Je,{EmptyListInsert:()=>Ie,MAX_RULE_DEPTH:()=>ve,MaxRuleDepthExceeded:()=>me,RuleTargetReadOnly:()=>je,RulesParseError:()=>ke,ShapeMismatch:()=>Ne,UnknownRulesVersion:()=>ye});var ke=class extends Error{constructor(t,r){super(t),this.name="RulesParseError",this.cause=r}},ye=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},ve=20,me=class extends Error{constructor(t){super(`rule depth exceeded ${ve} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},Ne=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},Ie=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},je=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}};function ae(e,t,r,n={}){return Mt(e,t,r,{depth:0,path:[]},n)}function Mt(e,t,r,n,i){if(n.depth>ve)throw new me(n.path);if(typeof r=="string")return ci(e,t,r,i);if(Array.isArray(r)){let[o,a]=r;return e.find(t,o,i).map((l,c)=>Mt(e,l,a,{depth:n.depth+1,path:[...n.path,c]},i))}if(typeof r=="object"&&r!==null){let o={};for(let[a,s]of Object.entries(r))o[a]=Mt(e,t,s,{depth:n.depth+1,path:[...n.path,a]},i);return o}return null}function ci(e,t,r,n){if(r.endsWith("[]")){let o=r.slice(0,-2);return e.find(t,o,n).map(a=>e.text(a))}if(r.startsWith("@"))return Ar(e,t,r.slice(1));if(r.includes("@")){let o=r.lastIndexOf("@"),a=r.slice(0,o),s=r.slice(o+1),l=a?e.find(t,a,n):[t];return l.length===0?null:Ar(e,l[0],s)}if(r===".")return e.text(t);let i=e.find(t,r,n);return i.length===0?null:e.text(i[0])}function Ar(e,t,r){if(Ot.has(r)){let i=e.prop(t,r);return i==null?null:String(i)}let n=e.attr(t,r);return n||null}function di(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function mi(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var ui={find(e,t,r={}){let n=mi(e);if(!n||!n.querySelectorAll)return[];let i=Array.from(n.querySelectorAll(t));r.includeRulesTag||(i=i.filter(s=>!di(s)));let o=[];r.skip&&o.push(r.skip);let a=r.templateAttr===null?null:r.templateAttr||"cms-template";if(a&&o.push("["+a+"]"),o.length){let s=o.join(", ");i=i.filter(l=>!l.closest||!l.closest(s))}return i},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,r){if(r===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,r)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,r){if(r===void 0){let n=e?e[t]:void 0;return n!==void 0?n:null}e[t]=r},clone(e){return e.cloneNode(!0)},insertAt(e,t,r){let n=e.children[r]||null;e.insertBefore(t,n)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let n=e.ownerDocument.createElement("template");n.innerHTML=t;let i=n.content.firstElementChild;if(!i)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(i,e),i},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(n=>{n.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},te=ui;function Nt(e){try{return JSON.parse(e)}catch(t){throw new ke(`Invalid strict JSON: ${t.message}`,t)}}function xe(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function r(i){let o=[],a=0;for(;a<i.length;){let s=i[a];if(/\s/.test(s)){a++;continue}if("{}".includes(s)){o.push({type:s,value:s}),a++;continue}if(s==="["){let p=!1,d=a+1;for(;d<i.length&&/\s/.test(i[d]);)d++;if(d<i.length&&/[a-zA-Z_]/.test(i[d])&&(p=!0),!p){o.push({type:s,value:s}),a++;continue}}if(s==="]"){o.push({type:s,value:s}),a++;continue}if(s===":"){o.push({type:t.COLON,value:s}),a++;continue}if(s===","){o.push({type:t.COMMA,value:s}),a++;continue}if(s==='"'||s==="'"){let p=s,d=a+1;for(;d<i.length&&i[d]!==p;)i[d]==="\\"&&d++,d++;o.push({type:t.STRING,value:i.substring(a+1,d),quoted:!0,sourceQuote:p}),a=d+1;continue}let l=a,c;for(;l<i.length&&!/[{},]/.test(i[l]);)if(i[l]===":"){let p=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],d=!1;for(let f of p){let k=f.substring(1);if(i.substring(l+1,l+1+k.length)===k){d=!0,l+=k.length;break}}if(!d)break}else if(i[l]==="["){for(l++;l<i.length&&i[l]!=="]";){if(i[l]==='"'||i[l]==="'"){let p=i[l];for(l++;l<i.length&&i[l]!==p;)i[l]==="\\"&&l++,l++}l++}l<i.length&&i[l]==="]"&&l++}else l++;c=i.substring(a,l);let u=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(c)?u=t.NUMBER:c==="true"||c==="false"||c==="null"?u=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(c)&&(u=t.SELECTOR),o.push({type:u,value:c,quoted:!1}),a=l}return o}function n(i){let o="";for(let a=0;a<i.length;a++){let s=i[a];if("{}".includes(s.type)||"[]".includes(s.type)){o+=s.value;continue}if(s.type===t.COLON){o+=s.value;continue}if(s.type===t.COMMA){let l=i[a+1];if(l&&(l.type==="}"||l.type==="]"))continue;o+=s.value;continue}if(s.type===t.STRING&&s.quoted){let l=s.value;s.sourceQuote==="'"&&(l=l.replace(/\\'/g,"'"),l=l.replace(/(\\*)"/g,(c,u)=>u.length%2===0?u+'\\"':c)),o+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){o+=s.value;continue}if(s.type===t.SELECTOR||s.type===t.IDENTIFIER){o+=`"${s.value}"`;continue}o+=`"${s.value}"`}return o}try{let i=r(e),o=n(i);return JSON.parse(o)}catch(i){throw new ke("Invalid extraction rules syntax: "+i.message,i)}}var Er="1",Sr=/^[a-zA-Z0-9_-]+$/;function Le(e,t,r){let n;if(r===void 0)n="script[data-rules-name]";else{if(typeof r!="string"||!Sr.test(r))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(r)} (must match ${Sr})`);n=`script[data-rules-name~="${r}"]`}let i=e.find(t,n,{includeRulesTag:!0});if(i.length===0)return null;r!==void 0&&i.length>1&&console.warn(`hyper-html-api: ${i.length} rules tags match data-rules-name~="${r}"; using the first.`);let o=i[0],a=e.attr(o,"data-rules-version");if(a!==Er)throw new ye(a);return{rules:xe(e.text(o)),tagNode:o}}var ca=new Function("url","return import(url)");var pi=.5;function It(e,t,r,n,i,o,a,s={}){let l=e.find(t,r,s);if(i.length===0){l.forEach(q=>e.remove(q));return}let c=i.length>l.length,u=l[0]||null;if(c&&!u&&(u=yi(e,t,r,s),!u))throw new Ie(o.path);let p=l.map(q=>fi(e,q,n,s)),d=null;if(u){d=e.clone(u),s.templateAttr&&e.removeAttr(d,s.templateAttr);let q=e.stripIds(d);q>0&&console.warn(`[hyper-html-api] stripped ${q} id attribute(s) from cloned template at "${o.path.join(".")||"(root)"}"`)}let f=gi(i,p,n),k=l[0]||u,T=e.parent(k),M=l.length>0?ki(e,T,k):0,F=new Set,G=i.map((q,P)=>{let j=f[P];if(j>=0)return F.add(j),l[j];let V=e.clone(d);return e.stripIds(V),V});l.forEach((q,P)=>{F.has(P)||e.remove(q)}),G.forEach((q,P)=>{let j=M+P;e.children(T).findIndex(fe=>e.sameNode(fe,q))!==j&&e.insertAt(T,q,j)}),G.forEach((q,P)=>{if(n===null){let j=i[P],V=j==null?"":String(j);e.text(q)!==V&&e.text(q,V)}else{let j=a(e,q,n,i[P],{depth:o.depth+1,path:[...o.path,P]},s);j&&j!==q&&(G[P]=j)}})}function fi(e,t,r,n){return r===null?e.text(t):ae(e,t,r,n)}function gi(e,t,r){let n=new Array(e.length).fill(-1),i=new Set;return e.forEach((o,a)=>{let s=-1,l=-1;t.forEach((c,u)=>{if(i.has(u))return;let p=bi(o,c,r),d=p===l&&s>=0?Math.abs(u-a)<Math.abs(s-a):!1;(p>l||d)&&(l=p,s=u)}),l>=pi&&(n[a]=s,i.add(s))}),n}function bi(e,t,r){if(r===null)return e===t?1:0;let n=Object.keys(r||{});if(n.length===0)return 0;let i=0;for(let o of n)JSON.stringify(e?.[o])===JSON.stringify(t?.[o])&&i++;return i/n.length}function ki(e,t,r){let n=e.children(t);for(let i=0;i<n.length;i++)if(e.sameNode(n[i],r))return i;return-1}function yi(e,t,r,n){if(!n.templateAttr)return null;let i=t;for(;i;){let o=e.find(i,r,{includeRulesTag:!1,templateAttr:null});for(let a of o)if(e.attr(a,n.templateAttr)!=null)return a;i=e.parent(i)}return null}var Or=new Set(["checked","selected","disabled","readOnly","paused"]);function we(e,t,r,n,i={}){let o=[];if(jt(r,n,[],o),o.length)throw new Ne(o);Ye(e,t,r,n,{depth:0,path:[]},i)}function Ye(e,t,r,n,i,o={}){if(i.depth>ve)throw new me(i.path);if(n===void 0)return t;if(typeof r=="string")return vi(e,t,r,n,i,o);if(Array.isArray(r)){let[a,s]=r;return It(e,t,a,s,n,i,Ye,o),t}if(typeof r=="object"&&r!==null){for(let[a,s]of Object.entries(r)){let l=Ye(e,t,s,n==null?n:n[a],{depth:i.depth+1,path:[...i.path,a]},o);l&&l!==t&&(t=l)}return t}return t}function vi(e,t,r,n,i,o){if(r.endsWith("[]")){let s=r.slice(0,-2);return It(e,t,s,null,n,i,Ye,o),t}if(r.startsWith("@"))return Mr(e,t,r.slice(1),n);if(r.includes("@")){let s=r.lastIndexOf("@"),l=r.slice(0,s),c=r.slice(s+1),u=l?e.find(t,l,o):[t];return u.length===0||Mr(e,u[0],c,n),t}if(r===".")return e.text(t,n==null?"":String(n)),t;let a=e.find(t,r,o);return a.length===0||e.text(a[0],n==null?"":String(n)),t}function Mr(e,t,r,n){if(_r.has(r))throw new je(r);if(r==="outerHTML"){let i=n==null?"":String(n);return e.replaceWith(t,i)}return wr.has(r)?(e.prop(t,r,xi(r,n)),t):(e.attr(t,r,n==null?"":String(n)),t)}function xi(e,t){return t==null?Or.has(e)?!1:"":Or.has(e)?!!t:t}function jt(e,t,r,n){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((i,o)=>{typeof i=="object"&&i!==null&&n.push({path:qe([...r,o]),expected:"scalar",got:Fe(i)})}):n.push({path:qe(r),expected:"array",got:Fe(t)});return}t!==null&&typeof t=="object"&&n.push({path:qe(r),expected:"scalar",got:Fe(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){n.push({path:qe(r),expected:"array",got:Fe(t)});return}let i=e[1];t.forEach((o,a)=>jt(i,o,[...r,a],n));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){n.push({path:qe(r),expected:"object",got:Fe(t)});return}for(let[i,o]of Object.entries(e))jt(o,t[i],[...r,i],n)}}}function Fe(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function qe(e){return e.join(".")}function Lt(e,t,r){if(r&&typeof r=="object")return{rules:r,tagNode:null};if(typeof r=="string"){let n=t&&t.ownerDocument?t.ownerDocument:t;return Le(e,n,r)}return null}function Ir(e,t,r,n){let i=Lt(e,t,r);if(!i){let s=typeof r=="string"?`data-rules-name~="${r}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${s}`)}let{rules:o,tagNode:a}=i;return{rules:o,tagNode:a,get:()=>ae(e,t,o,n),set:s=>we(e,t,o,s,n)}}var K={extract:(e,t,r)=>ae(te,e,t,r),apply:(e,t,r,n)=>we(te,e,t,r,n),findRulesIn:(e,t)=>Le(te,e,t),findRules:(e,t)=>Lt(te,e,t),bind:(e,t,r)=>Ir(te,e,t,r),parseStrict:Nt,parseRelaxed:xe,errors:Je,DOM_PROPERTIES:Ge};var qt={};_t(qt,{fromString:()=>ne,getRuleAtPath:()=>ue,getValueAtPath:()=>Li,setAtPath:()=>Ft,toString:()=>ji});function ji(e){return e.map(String).join(".")}function ne(e){return e===""?[]:e.split(".").map(t=>/^\d+$/.test(t)?Number(t):t)}function ue(e,t){let r=e;for(let n of t){if(r==null)return;if(typeof r=="string"){if(r.endsWith("[]")&&(typeof n=="number"||n==="*")){r=r.slice(0,-2);continue}return}if(Array.isArray(r)){if(typeof n!="number"&&n!=="*")return;r=r[1];continue}if(typeof r=="object"){if(typeof n=="number"||!(n in r))return;r=r[n];continue}return}return r}function Li(e,t){let r=e;for(let n of t){if(r==null)return;r=r[n]}return r}function Ft(e,t,r){if(t.length===0)return r;let[n,...i]=t;if(typeof n=="number"){let o=Array.isArray(e)?[...e]:[];return o[n]=Ft(o[n],i,r),o}return{...e&&typeof e=="object"?e:{},[n]:Ft((e||{})[n],i,r)}}function De(e){if(typeof e=="string")return e.endsWith("[]")?[]:"";if(Array.isArray(e))return[];if(typeof e=="object"&&e!==null){let t={};for(let[r,n]of Object.entries(e))t[r]=De(n);return t}return""}function Xe(e,t,{ignoreActiveValue:r=!0}={}){Rt.morph(e,t,{morphStyle:"innerHTML",ignoreActiveValue:r,restoreFocus:!0,formStateSync:"property"})}function Qe(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_]/g," ").replace(/\s+/g," ").trim().replace(/^./,t=>t.toUpperCase())}var Fi='<div class="hcms-drag-handle mirk-sortable__grip" aria-hidden="true"><div class="mirk-sortable__dots"><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span></div></div>',Dt='<svg class="hcms-x" viewBox="0 0 16 16" shape-rendering="crispEdges" aria-hidden="true"><path d="M4 4 L12 12 M12 4 L4 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square"></path></svg>',Fr={"@scalar":`
1
+ var hypercms=(()=>{var Dt=Object.defineProperty;var ri=Object.getOwnPropertyDescriptor;var ni=Object.getOwnPropertyNames;var ii=Object.prototype.hasOwnProperty;var $t=(e,t)=>{for(var r in t)Dt(e,r,{get:t[r],enumerable:!0})},oi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ni(t))!ii.call(e,i)&&i!==r&&Dt(e,i,{get:()=>t[i],enumerable:!(n=ri(t,i))||n.enumerable});return e};var si=e=>oi(Dt({},"__esModule",{value:!0}),e);var $s={};$t($s,{cms:()=>qs,default:()=>Ds});function Z(e){let t=0,r=null,n=-1;for(let i=0;i<e.length;i++){let o=e[i];o==="\\"?i++:r?o===r&&(r=null):o==='"'||o==="'"?r=o:o==="["||o==="("?t++:o==="]"||o===")"?t>0&&t--:o==="@"&&t===0&&(n=i)}return n}function it(e){let t=Z(e);return t===-1?{selector:e,prop:null}:{selector:e.slice(0,t),prop:e.slice(t+1)||null}}var Nr={includeClasses:!0,includeAttributes:["href","src","name","type","role","aria-label","alt","title"],excludeAttributePrefixes:["data-morph-","data-hyper-","data-im-"],textHintLength:64,excludeIds:!0,maxPathDepth:4,landmarks:["HEADER","NAV","MAIN","ASIDE","FOOTER","SECTION","ARTICLE"],weights:{signature:100,pathSegment:10,textMatch:20,textMismatch:25,uniqueCandidate:50,positionPenalty:1,maxDriftPenalty:19,slotMatch:30},minConfidence:101,maxScoredCandidates:16};function li(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t^e.charCodeAt(r);return Math.abs(t).toString(36)}function ci(e){if(e.classList&&e.classList.length>0)return Array.from(e.classList).sort().join(" ");let t=e.getAttribute?.("class");return t?t.split(/\s+/).filter(Boolean).sort().join(" "):""}function ui(e,t){let r=[];for(let n of e.attributes||[]){let i=n.name;i==="id"||i==="class"||t.excludeAttributePrefixes.some(o=>i.startsWith(o))||t.includeAttributes.includes(i)&&r.push(`${i}=${n.value}`)}return r.sort().join("|")}function di(e,t){return(e.textContent||"").replace(/\s+/g," ").trim().slice(0,t.textHintLength)}function mi(e,t){let r=[e.tagName];return t.includeClasses&&r.push(ci(e)),r.push(ui(e,t)),li(r.join("|"))}function hi(e){let t=e.tagName,r=1,n=e.previousElementSibling;for(;n;)n.tagName===t&&r++,n=n.previousElementSibling;return r}function pi(e,t){return e.getAttribute?.("id")||e.getAttribute?.("role")?!0:t.landmarks.includes(e.tagName)}function fi(e){let t=e.getAttribute?.("id");if(t)return`#${t}`;let r=e.getAttribute?.("role");return r?`@${r}`:e.tagName}function gi(e,t){let r=[],n=e;for(;n&&n.tagName&&r.length<t.maxPathDepth;){let i=`${n.tagName}:${hi(n)}`;if(r.unshift(i),n!==e&&pi(n,t)){r.unshift(fi(n));break}n=n.parentElement}return r}function bi(e,t){let r=0,n=e.length-1,i=t.length-1;for(;n>=0&&i>=0&&e[n]===t[i];)r++,n--,i--;return r}function se(e,t,r){if(r.has(e))return r.get(e);let n={signature:mi(e,t),path:gi(e,t),textHint:di(e,t)};return r.set(e,n),n}function Fr(e,t,r,n){if(n.has(e))return n.get(e);let i=new Map,o=e.querySelectorAll("*"),a=0;for(let s of o){let l=se(s,t,r);l.domIndex=a++,!t.shouldIgnore?.(s)&&(i.has(l.signature)||i.set(l.signature,[]),i.get(l.signature).push(s))}return n.set(e,i),i}function ki(e,t,r){r.delete(e),t.delete(e);let n=e.querySelectorAll("*");for(let i of n)t.delete(i)}function Bt(e,t,r,n,i){let o=se(e,r,n),a=se(t,r,n),s=r.weights,l={},c=0;if(o.signature!==a.signature)return{score:0,breakdown:{rejected:"signature mismatch"}};c+=s.signature,l.signature=s.signature;let b=bi(o.path,a.path)*s.pathSegment;c+=b,l.path=b;let u=!0;if(o.textHint&&a.textHint?o.textHint===a.textHint?(c+=s.textMatch,l.text=s.textMatch):(c-=s.textMismatch,l.text=-s.textMismatch,u=!1):o.textHint!==a.textHint&&(c-=s.textMismatch,l.text=-s.textMismatch,u=!1),i.candidateCount===1&&u&&(c+=s.uniqueCandidate,l.unique=s.uniqueCandidate),typeof o.domIndex=="number"&&typeof a.domIndex=="number"){let k=Math.abs(o.domIndex-a.domIndex),y=Math.min(k*s.positionPenalty,s.maxDriftPenalty);c-=y,l.drift=-y}return{score:c,breakdown:l}}function Ir(e,t,r,n,i){if(r.excludeIds&&e.getAttribute("id"))return null;let o=Fr(t,r,n,i),a=se(e,r,n);if(typeof a.domIndex!="number"){let u=0,k=e.previousElementSibling;for(;k;)u++,k=k.previousElementSibling;a.domIndex=u}let s=o.get(a.signature)||[],l=r.excludeIds?s.filter(u=>!u.getAttribute("id")):s;if(l.length===0)return null;let c=null,d=0,b=null;for(let u of l){let{score:k,breakdown:y}=Bt(e,u,r,n,{candidateCount:l.length});k>d&&(d=k,c=u,b=y)}return d<r.minConfidence?null:{element:c,confidence:d,breakdown:b}}function yi(e,t,r,n){let i=[],o=r.weights.signature+r.weights.slotMatch,a={slot:o};function s(b){if(b.children)return b.children;let u=b.childNodes;if(!u)return[];let k=[];for(let y=0;y<u.length;y++)u[y].nodeType===1&&k.push(u[y]);return k}function l(b,u){let k=s(b),y=s(u);if(k.length===y.length)for(let N=0;N<k.length;N++){let q=k[N],H=y[N];if(r.shouldIgnore?.(q)||r.shouldIgnore?.(H)||r.excludeIds&&(q.getAttribute("id")||H.getAttribute("id"))||q.tagName!==H.tagName)continue;let oe=se(q,r,n).signature,ee=se(H,r,n).signature;oe!==ee&&i.push({newEl:q,oldEl:H,score:o,breakdown:a}),l(q,H)}}function c(b,u){for(;;){if(b.tagName===u.tagName)return[b,u];let k=s(b);if(!b.tagName&&k.length===1){b=k[0];continue}let y=s(u);if(y.length===1&&y[0].tagName===b.tagName){u=y[0];continue}return null}}let d=c(e,t);return d&&l(d[0],d[1]),i}function Lr(e,t,r,n,i){let o=t.querySelectorAll("*"),a=Fr(e,r,n,i),s=0;for(let k of o){let y=se(k,r,n);y.domIndex=s++}let l=[],c=new Map;function d(k,y,N){let q=new Set;if(k.textHint){let z=c.get(k.signature);if(!z){z=new Map;for(let Q of y){let pe=se(Q,r,n).textHint,fe=z.get(pe);fe||(fe=[],z.set(pe,fe)),fe.push(Q)}c.set(k.signature,z)}let ie=z.get(k.textHint);if(ie)for(let Q=0;Q<ie.length&&Q<N;Q++)q.add(ie[Q])}let H=0,oe=y.length;for(;H<oe;){let z=H+oe>>1;se(y[z],r,n).domIndex<k.domIndex?H=z+1:oe=z}let ee=Math.max(0,Math.min(H-(N>>1),y.length-N)),le=Math.min(ee+N,y.length);for(let z=ee;z<le;z++)q.add(y[z]);return[...q]}for(let k of o){if(r.shouldIgnore?.(k)||r.excludeIds&&k.getAttribute("id"))continue;let y=se(k,r,n),N=a.get(y.signature)||[],q=r.excludeIds?N.filter(ee=>!ee.getAttribute("id")):N,H=r.maxScoredCandidates,oe=H&&q.length>H?d(y,q,H):q;for(let ee of oe){let{score:le,breakdown:z}=Bt(k,ee,r,n,{candidateCount:q.length});le>=r.minConfidence&&l.push({newEl:k,oldEl:ee,score:le,breakdown:z})}}if(r.weights.slotMatch>0){let k=yi(t,e,r,n);for(let y of k)l.push(y)}l.sort((k,y)=>y.score-k.score);let b=new Map,u=new Set;for(let{newEl:k,oldEl:y}of l)b.has(k)||u.has(y)||(b.set(k,y),u.add(y));return b}function jr(e,t,r,n){let i=se(e,r,n),o=se(t,r,n),{score:a,breakdown:s}=Bt(e,t,r,n,{candidateCount:1});return{matches:a>=r.minConfidence,score:a,breakdown:s,newMeta:{signature:i.signature,path:i.path,textHint:i.textHint},oldMeta:{signature:o.signature,path:o.path,textHint:o.textHint}}}function qr(e={}){let t={...Nr,...e,weights:{...Nr.weights,...e.weights}},r=new WeakMap,n=new WeakMap;return{findMatch:(i,o)=>Ir(i,o,t,r,n),computeMatches:(i,o)=>Lr(i,o,t,r,n),explain:(i,o)=>jr(i,o,t,r),invalidate:i=>ki(i,r,n),session:()=>{let i=new WeakMap,o=new WeakMap;return{findMatch:(a,s)=>Ir(a,s,t,i,o),computeMatches:(a,s)=>Lr(a,s,t,i,o),explain:(a,s)=>jr(a,s,t,i)}},getConfig:()=>({...t})}}function Pt(e,t){for(;;){for(;t<e.length&&/\s/.test(e[t]);)t++;if(e[t]==="/"&&e[t+1]==="/"){for(;t<e.length&&e[t]!==`
2
+ `;)t++;continue}if(e[t]==="/"&&e[t+1]==="*"){let r=e.indexOf("*/",t+2);if(r===-1)return e.length;t=r+2;continue}return t}}function Dr(e){return e.replace(/\\'/g,"'").replace(/(\\*)"/g,(t,r)=>r.length%2===0?r+'\\"':t)}var vi=/^-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?$/,xi=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function ot(e){try{return JSON.parse(e)}catch{return JSON.parse(wi(e))}}function wi(e){let t="",r=0,n=(i,o)=>{throw new Error(`Invalid relaxed JSON: ${i} at position ${o}`)};for(;r<e.length&&(r=Pt(e,r),!(r>=e.length));){let i=e[r];if("{}[]:".includes(i)){t+=i,r++;continue}if(i===","){let s=Pt(e,r+1);if(e[s]==="}"||e[s]==="]"){r++;continue}t+=i,r++;continue}if(i==='"'||i==="'"){let s=r+1;for(;s<e.length&&e[s]!==i;)e[s]==="\\"&&s++,s++;s>=e.length&&n("unterminated string",r);let l=e.slice(r+1,s);i==="'"&&(l=Dr(l)),t+='"'+l+'"',r=s+1;continue}let o=r;for(;o<e.length&&/[A-Za-z0-9_$.+\-]/.test(e[o]);)o++;o===r&&n("unexpected character "+JSON.stringify(i),r);let a=e.slice(r,o);if(a==="true"||a==="false"||a==="null"||vi.test(a)){t+=a,r=o;continue}if(xi.test(a)){if(e[Pt(e,o)]===":"){t+='"'+a+'"',r=o;continue}n("unquoted value "+JSON.stringify(a),r)}n("invalid token "+JSON.stringify(a),r)}return t}function $r(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function r(i){let o=[],a=0;for(;a<i.length;){let s=i[a];if(/\s/.test(s)){a++;continue}if("{}".includes(s)){o.push({type:s,value:s}),a++;continue}if(s==="["){let b=!1,u=a+1;for(;u<i.length&&/\s/.test(i[u]);)u++;if(u<i.length&&/[a-zA-Z_]/.test(i[u])&&(b=!0),!b){o.push({type:s,value:s}),a++;continue}}if(s==="]"){o.push({type:s,value:s}),a++;continue}if(s===":"){o.push({type:t.COLON,value:s}),a++;continue}if(s===","){o.push({type:t.COMMA,value:s}),a++;continue}if(s==='"'||s==="'"){let b=s,u=a+1;for(;u<i.length&&i[u]!==b;)i[u]==="\\"&&u++,u++;o.push({type:t.STRING,value:i.substring(a+1,u),quoted:!0,sourceQuote:b}),a=u+1;continue}let l=a,c;for(;l<i.length&&!/[{},]/.test(i[l]);)if(i[l]===":"){let b=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],u=!1;for(let k of b){let y=k.substring(1);if(i.substring(l+1,l+1+y.length)===y){u=!0,l+=y.length;break}}if(!u)break}else if(i[l]==="["){for(l++;l<i.length&&i[l]!=="]";){if(i[l]==='"'||i[l]==="'"){let b=i[l];for(l++;l<i.length&&i[l]!==b;)i[l]==="\\"&&l++,l++}l++}l<i.length&&i[l]==="]"&&l++}else l++;c=i.substring(a,l);let d=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(c)?d=t.NUMBER:c==="true"||c==="false"||c==="null"?d=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(c)&&(d=t.SELECTOR),o.push({type:d,value:c,quoted:!1}),a=l}return o}function n(i){let o="";for(let a=0;a<i.length;a++){let s=i[a];if("{}".includes(s.type)||"[]".includes(s.type)){o+=s.value;continue}if(s.type===t.COLON){o+=s.value;continue}if(s.type===t.COMMA){let l=i[a+1];if(l&&(l.type==="}"||l.type==="]"))continue;o+=s.value;continue}if(s.type===t.STRING){let l=s.value;s.sourceQuote==="'"&&(l=Dr(l)),o+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){o+=s.value;continue}o+=`"${s.value}"`}return o}try{let i=r(e),o=n(i);return JSON.parse(o)}catch(i){throw new Error("Invalid extraction rules syntax: "+i.message)}}var J=Symbol("hyper-morph-json-merge:missing"),Br=["id","_id","uuid","key","slug","code","name"];function Ce(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ue(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _i(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:!0,writable:!0,configurable:!0})}function be(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!be(e[r],t[r]))return!1;return!0}if(Ce(e)&&Ce(t)){let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n of r)if(!Ue(t,n)||!be(e[n],t[n]))return!1;return!0}return!1}function Pr(e,t,r,n){return be(t,r)?t:be(t,e)?r:be(r,e)?t:Ce(t)&&Ce(r)?Ai(Ce(e)?e:{},t,r,n):Array.isArray(t)&&Array.isArray(r)?Ti(Array.isArray(e)?e:[],t,r,n):r}function zr(e,t,r,n){return t===J&&r===J?J:t===J?e===J?r:be(r,e)?J:r:r===J?e===J?t:J:Pr(e,t,r,n)}function Ai(e,t,r,n){let i={},o=new Set([...Object.keys(e),...Object.keys(t),...Object.keys(r)]);for(let a of o){let s=zr(Ue(e,a)?e[a]:J,Ue(t,a)?t[a]:J,Ue(r,a)?r[a]:J,n);s!==J&&_i(i,a,s)}return i}function Si(e){return e===null||typeof e!="object"}function st(e){return typeof e+":"+String(e)}function Ei(e,t){for(let r of t){let n=new Set;for(let i of r){if(!Ue(i,e))return!1;let o=i[e];if(typeof o!="string"&&typeof o!="number")return!1;let a=st(o);if(n.has(a))return!1;n.add(a)}}return!0}function Ci(e,t,r,n){let i=[e,t,r],o=!0;for(let a of i)for(let s of a)Ce(s)||(o=!1);if(o){for(let a of n.keyCandidates)if(Ei(a,i))return{kind:"keyed",field:a};return null}for(let a of i){let s=new Set;for(let l of a){if(!Si(l))return null;let c=st(l);if(s.has(c))return null;s.add(c)}}return{kind:"self"}}function Ti(e,t,r,n){let i=Ci(e,t,r,n);if(!i)return r;let o=i.kind==="self"?st:k=>st(k[i.field]),a=k=>{let y=new Map;for(let N of k)y.set(o(N),N);return y},s=a(e),l=a(t),c=a(r),d=new Map,b=new Set([...s.keys(),...l.keys(),...c.keys()]);for(let k of b){let y=zr(s.has(k)?s.get(k):J,l.has(k)?l.get(k):J,c.has(k)?c.get(k):J,n);y!==J&&d.set(k,y)}let u=[];for(let k of r){let y=o(k);d.has(y)&&u.push(y)}for(let k=0;k<t.length;k++){let y=o(t[k]);if(!d.has(y)||u.includes(y))continue;let N=0;for(let q=k-1;q>=0;q--){let H=u.indexOf(o(t[q]));if(H!==-1){N=H+1;break}}u.splice(N,0,y)}return u.map(k=>d.get(k))}function zt(e,t,r,n={}){let i=n.keyCandidates?[...n.keyCandidates,...Br]:Br;return Pr(e===void 0?J:e,t,r,{keyCandidates:i})}function Ut(e,t,r,n={}){let i=n.parse||ot,o=[],a=(b,u)=>{if(typeof b!="string")return J;try{return i(b)}catch(k){return o.push(`${u} side is not valid JSON (${k.message})`),J}},s=a(t,"local"),l=a(r,"remote");if(s===J)return{text:r,warnings:o};if(l===J)return{text:t,warnings:o};let c=a(e,"base"),d=zt(c===J?void 0:c,s,l,n);return be(d,l)?{text:r,warnings:o}:be(d,s)?{text:t,warnings:o}:{text:JSON.stringify(d,null,2),warnings:o}}var He=(function(){"use strict";let e=()=>{},t='[save-ignore],[snapshot-remove],[no-snapshot],[no-save],[save-remove],[freeze],[save-freeze],[clay~="no-save"],[clay~="no-snapshot"],[clay~="freeze"]';function r(p){if(!(p instanceof Element))return!1;if(p.matches(t))return!0;if(p.tagName==="LINK"||p.tagName==="SCRIPT"){let T=p.getAttribute("src")||p.getAttribute("href")||"";if(T.startsWith("chrome-extension://")||T.startsWith("moz-extension://")||T.startsWith("safari-web-extension://"))return!0}return!1}function n(p){return p instanceof Element?p.closest(t)?!0:r(p):!1}let i=qr({shouldIgnore:n});function o(p,T,E){if(E){let O=E.identityOf(p);if(O&&!E.disabled.has(O.key))return"hm-merge:"+O.key}if(T!=="smart")return p.outerHTML;let R=p.getAttribute("src"),C=p.getAttribute("type")||"text/javascript";if(R)try{let O=new URL(R,window.location.href);return`ext:${C}:${O.origin}${O.pathname}${O.search}`}catch{return`ext:${C}:${R}`}else{let O=p.textContent.trim(),v=5381;for(let A=0;A<O.length;A++)v=(v<<5)+v^O.charCodeAt(A);return`inline:${C}:${Math.abs(v).toString(36)}`}}let a="http://www.w3.org/1999/xhtml";function s(p){return p instanceof Element&&p.tagName==="SCRIPT"&&p.namespaceURI===a}function l(p){let T=document.createElement("div");T.innerHTML="<script><\/script>";let E=T.firstChild;for(let R of p.attributes)E.setAttribute(R.name,R.value);return E.textContent=p.textContent,E}function c(p){if(s(p))return l(p);if(p instanceof Element)for(let T of p.querySelectorAll("script"))s(T)&&T.replaceWith(l(T));return p}function d(p){let T=(p.getAttribute("type")||"").split(";")[0].trim().toLowerCase();return T==="application/json"||T.endsWith("+json")}let b={match:p=>p.hasAttribute("merge"),identity:p=>p.getAttribute("merge")};function u(p,T,E){if(E.merge===!1)return null;let R=[b,...E.mergeTags||[]],C=new WeakMap,O=f=>{if(C.has(f))return C.get(f);let w=null;if(s(f)&&!f.getAttribute("src")&&!n(f)){let _=f;for(let I=0;I<R.length;I++)if(R[I].match(_)){if(!d(_))console.warn("[hyper-morph] merge ignored: script type is not JSON",_);else{let B=R[I].identity(_);B!=null&&B!==""&&(w={key:I+":"+B,raw:B,recognizer:R[I]})}break}}return C.set(f,w),w},v=new Set,A=f=>{let w=new Map,_=I=>{let B=O(I);B&&(w.has(B.key)?(v.add(B.key),console.warn(`[hyper-morph] merge disabled for duplicate identity "${B.raw}"`)):w.set(B.key,I))};s(f)&&_(f);for(let I of f.querySelectorAll("script"))_(I);return w},g=A(p),h=A(T.__hyperMorphRoot||T);if(g.size===0&&h.size===0)return null;let m=null;return{identityOf:O,disabled:v,oldByKey:g,newByKey:h,baseTexts:()=>{if(m)return m;m=new Map;let f=E.mergeBase;if(!f)return m;let w;typeof f=="string"?w=new DOMParser().parseFromString(f,"text/html").documentElement:f instanceof Document?w=f.documentElement:w=f;let _=I=>{let B=O(I);B&&!m.has(B.key)&&m.set(B.key,I.textContent)};s(w)&&_(w);for(let I of w.querySelectorAll("script"))_(I);return m}}}function k(p,T,E){let R=p.merge;if(!R)return!1;let C=R.identityOf(T);if(!C||R.disabled.has(C.key))return!1;let O=R.identityOf(E);if(!O||O.key!==C.key)return!1;let v=T,A=E,g=A.getAttribute("merge-key")||v.getAttribute("merge-key"),{text:h,warnings:m}=Ut(R.baseTexts().get(C.key),v.textContent,A.textContent,{parse:C.recognizer.parse,keyCandidates:g?g.split(/[\s,]+/).filter(Boolean):void 0});for(let x of m)console.warn(`[hyper-morph] merge "${C.raw}": ${x}`);return v.textContent!==h&&(v.textContent=h),!0}let y={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:e,afterNodeAdded:e,beforeNodeMorphed:e,afterNodeMorphed:e,beforeNodeRemoved:e,afterNodeRemoved:e,beforeAttributeUpdated:e},head:{style:"merge",shouldPreserve:p=>p.getAttribute("im-preserve")==="true",shouldReAppend:p=>p.getAttribute("im-re-append")==="true",shouldRemove:e,afterHeadMorphed:e},scripts:{handle:!0,matchMode:"outerHTML",shouldPreserve:p=>p.getAttribute("im-preserve")==="true",shouldReAppend:p=>p.getAttribute("im-re-append")==="true",shouldRemove:e,afterScriptsHandled:e},restoreFocus:!0},N={computeMatches(p,T){let{computeMatches:E}=i.session();return E(p,T)}};function q(p,T,E={}){p=Qn(p);let R=xr(T),C=Zn(p,R,E),O=C.scripts.handle?new Set(Array.from(p.querySelectorAll("script")).map(h=>o(h,C.scripts.matchMode,C.merge))):null,v=ee(C),A=Q(C,p,R,h=>h.morphStyle==="innerHTML"?(z(h,p,R),Array.from(p.childNodes)):oe(h,p,R)),g=h=>{v&&le(C,v),H(C);let m=O?Lt(h,O,C):[];return m.length>0?Promise.all(m).then(()=>h):h};return A instanceof Promise?A.then(g):g(A)}function H(p){for(let T of Array.from(p.pantry.childNodes))p.callbacks.beforeNodeRemoved(T)!==!1&&p.callbacks.afterNodeRemoved(T);p.pantry.remove()}function oe(p,T,E){let R=xr(T);return z(p,R,E,T,T.nextSibling),Array.from(R.childNodes)}function ee(p){if(!p.config.restoreFocus)return null;let T=document.activeElement;if(!(T instanceof HTMLInputElement||T instanceof HTMLTextAreaElement))return null;let{id:E,selectionStart:R,selectionEnd:C}=T;return{element:T,id:E,selectionStart:R,selectionEnd:C}}function le(p,T){let E=T.element;if(T.id&&T.id!==document.activeElement?.getAttribute("id")&&(E=p.target.querySelector(`[id="${CSS.escape(T.id)}"]`),E?.focus()),E&&!E.selectionEnd&&T.selectionEnd!=null)try{E.setSelectionRange(T.selectionStart,T.selectionEnd)}catch{}}let z=(function(){function p(h,m,x,f=null,w=null){m instanceof HTMLTemplateElement&&x instanceof HTMLTemplateElement&&(m=m.content,x=x.content),f||=m.firstChild;for(let _ of x.childNodes){if(r(_))continue;if(f&&f!=w){let B=E(h,_,f,w);if(B){B!==f&&C(h,f,B),ie(B,_,h),f=B.nextSibling;continue}}if(_ instanceof Element){let B=_.getAttribute("id");if(h.persistentIds.has(B)){let S=O(m,B,f,h);ie(S,_,h),f=S.nextSibling;continue}if(!h.idMap.has(_)){let S=h.hyperMatches.get(_);if(S&&!h.idMap.has(S)&&!g(S,m)){A(m,S,f),ie(S,_,h),f=S.nextSibling;continue}}}let I=T(m,_,f,h);I&&(f=I.nextSibling)}for(;f&&f!=w;){let _=f;f=f.nextSibling,r(_)||R(h,_)}}function T(h,m,x,f){if(f.callbacks.beforeNodeAdded(m)===!1)return null;if(f.idMap.has(m)){let w=m,_=document.createElementNS(w.namespaceURI,w.localName);return h.insertBefore(_,x),ie(_,m,f),f.callbacks.afterNodeAdded(_),_}else{let w=c(document.importNode(m,!0));return h.insertBefore(w,x),f.callbacks.afterNodeAdded(w),w}}let E=(function(){function h(f,w,_,I){let B=w instanceof Element&&!f.idMap.has(w)?f.hyperMatches.get(w):null,S=null,M=w.nextSibling,V=0,D=_;for(;D&&D!=I;){if(r(D)){D=D.nextSibling;continue}if(x(D,w)){if(m(f,D,w)||D===B&&!f.idMap.has(D))return D;if(S===null){let W=D instanceof Element&&f.hyperMatchedOldElements.has(D);!f.idMap.has(D)&&!W&&(S=D)}}if(S===null&&M&&x(D,M)&&(V++,M=M.nextSibling,V>=2&&(S=void 0)),f.activeElementAndParents.includes(D))break;D=D.nextSibling}return S||null}function m(f,w,_){let I=f.idMap.get(w),B=f.idMap.get(_);if(!B||!I)return!1;for(let S of I)if(B.has(S))return!0;return!1}function x(f,w){let _=f,I=w;return _.nodeType===I.nodeType&&_.tagName===I.tagName&&(!_.getAttribute?.("id")||_.getAttribute?.("id")===I.getAttribute?.("id"))}return h})();function R(h,m){let x=m instanceof Element&&h.hyperMatchedOldElements.has(m)&&!h.idMap.has(m);if(h.idMap.has(m)||x)A(h.pantry,m,null);else{if(h.callbacks.beforeNodeRemoved(m)===!1)return;m.parentNode?.removeChild(m),h.callbacks.afterNodeRemoved(m)}}function C(h,m,x){let f=m;for(;f&&f!==x;){let w=f;f=f.nextSibling,r(w)||R(h,w)}return f}function O(h,m,x,f){let w=f.target.getAttribute?.("id")===m&&f.target||f.target.querySelector(`[id="${CSS.escape(m)}"]`)||f.pantry.querySelector(`[id="${CSS.escape(m)}"]`);return v(w,f),A(h,w,x),w}function v(h,m){let x=h.getAttribute("id");for(;h=h.parentNode;){let f=m.idMap.get(h);f&&(f.delete(x),f.size||m.idMap.delete(h))}}function A(h,m,x){if(h.moveBefore)try{h.moveBefore(m,x)}catch{h.insertBefore(m,x)}else h.insertBefore(m,x)}function g(h,m){let x=m instanceof Element?m:m.realParentNode;return!!x&&h.contains(x)}return p})(),ie=(function(){function p(v,A,g){return g.ignoreActive&&v===document.activeElement?null:(g.callbacks.beforeNodeMorphed(v,A)===!1||(v instanceof HTMLHeadElement&&g.head.ignore||(v instanceof HTMLHeadElement&&g.head.style!=="morph"?fe(v,A,g):(T(v,A,g),k(g,v,A)||O(v,g)||z(g,v,A))),g.callbacks.afterNodeMorphed(v,A)),v)}function T(v,A,g){let h=A.nodeType;if(h===1){let m=v,x=A,f=m.attributes,w=x.attributes;for(let _ of w)C(_.name,m,"update",g)||m.getAttribute(_.name)!==_.value&&m.setAttribute(_.name,_.value);for(let _=f.length-1;0<=_;_--){let I=f[_];if(I&&!x.hasAttribute(I.name)){if(C(I.name,m,"remove",g))continue;m.removeAttribute(I.name)}}O(m,g)||E(m,x,g)}(h===8||h===3)&&v.nodeValue!==A.nodeValue&&(v.nodeValue=A.nodeValue)}function E(v,A,g){if(v instanceof HTMLInputElement&&A instanceof HTMLInputElement&&A.type!=="file"){let h=A.value,m=v.value;R(v,A,"checked",g),R(v,A,"disabled",g),g.formStateSync==="property"&&v.indeterminate!==A.indeterminate&&(v.indeterminate=A.indeterminate),g.formStateSync==="property"?m!==h&&(C("value",v,"update",g)||(v.value=h)):A.hasAttribute("value")?m!==h&&(C("value",v,"update",g)||(v.setAttribute("value",h),v.value=h)):C("value",v,"remove",g)||(v.value="",v.removeAttribute("value"))}else if(v instanceof HTMLOptionElement&&A instanceof HTMLOptionElement)R(v,A,"selected",g);else if(v instanceof HTMLTextAreaElement&&A instanceof HTMLTextAreaElement){let h=A.value,m=v.value;if(C("value",v,"update",g)||(h!==m&&(v.value=h),g.formStateSync==="property"))return;v.firstChild&&v.firstChild.nodeValue!==h&&(v.firstChild.nodeValue=h)}}function R(v,A,g,h){let m=A[g],x=v[g];if(m!==x){let f=C(g,v,"update",h);if(f||(v[g]=A[g]),h.formStateSync==="property")return;m?f||v.setAttribute(g,""):C(g,v,"remove",h)||v.removeAttribute(g)}}function C(v,A,g,h){return v==="value"&&h.ignoreActiveValue&&A===document.activeElement?!0:h.callbacks.beforeAttributeUpdated(v,A,g)===!1}function O(v,A){return!!A.ignoreActiveValue&&v===document.activeElement&&v!==document.body}return p})();function Q(p,T,E,R){if(p.head.block){let C=T.querySelector("head"),O=E.querySelector("head");if(C&&O){let v=fe(C,O,p);return Promise.all(v).then(()=>(p.head.block=!1,p.head.ignore=!0,R(p)))}}return R(p)}function pe(p){return p.tagName==="SCRIPT"?!!p.getAttribute("src"):p.tagName==="LINK"?(p.getAttribute("rel")||"").toLowerCase().split(/\s+/).includes("stylesheet")&&!!p.getAttribute("href"):!1}function fe(p,T,E){let R=[],C=[],O=[],v=[],A=E.scripts.matchMode,g=x=>{if(x.tagName==="SCRIPT")return o(x,A,E.merge);if(x.tagName==="LINK"&&A==="smart"){let f=x.getAttribute("href");if(f)try{let w=new URL(f,window.location.href);return`link:${x.getAttribute("rel")||""}:${w.origin}${w.pathname}${w.search}`}catch{}}return x.outerHTML},h=new Map;for(let x of T.children){if(r(x))continue;let f=g(x),w=h.get(f);w||(w=[],h.set(f,w)),w.push(x)}for(let x of p.children){let f=g(x),w=h.get(f),_=!!(w&&w.length),I=E.head.shouldReAppend(x),B=E.head.shouldPreserve(x);if(_||B)if(I)C.push(x);else{if(w&&w.length){let S=w.pop();w.length||h.delete(f),k(E,x,S)}O.push(x)}else E.head.style==="append"?I&&(C.push(x),v.push(x)):E.head.shouldRemove(x)!==!1&&!r(x)&&C.push(x)}for(let x of h.values())v.push(...x);let m=[];for(let x of v){let f=document.createRange().createContextualFragment(x.outerHTML).firstChild;if(E.callbacks.beforeNodeAdded(f)!==!1){if(f instanceof Element&&pe(f)){let w,_=new Promise(function(I){w=I});f.addEventListener("load",function(){w()}),f.addEventListener("error",function(){w()}),m.push(_)}p.appendChild(f),E.callbacks.afterNodeAdded(f),R.push(f)}}for(let x of C)E.callbacks.beforeNodeRemoved(x)!==!1&&(p.removeChild(x),E.callbacks.afterNodeRemoved(x));return E.head.afterHeadMorphed(p,{added:R,kept:O,removed:C}),m}function Lt(p,T,E){if(!E.scripts.handle)return[];let R=[],C=[],O=[],v=[],A=E.scripts.matchMode,g=[];for(let m of p)if(m instanceof Element){s(m)&&g.push(m);for(let x of m.querySelectorAll("script"))s(x)&&g.push(x)}for(let m of g){if(m.closest("head")||n(m))continue;let x=o(m,A,E.merge),f=T.has(x),w=E.scripts.shouldPreserve(m),_=E.scripts.shouldReAppend(m);f||w?_?(C.push(m),v.push(m)):O.push(m):v.push(m)}let h=[];for(let m of v){if(E.callbacks.beforeNodeAdded(m)===!1)continue;let x=document.createElement("script");for(let f of m.attributes)x.setAttribute(f.name,f.value);if(x.textContent=m.textContent,x.src){let f,w=new Promise(function(_){f=_});x.addEventListener("load",function(){f()}),x.addEventListener("error",function(){f()}),h.push(w)}m.replaceWith(x),E.callbacks.afterNodeAdded(x),R.push(x)}return E.scripts.afterScriptsHandled(E.target,{added:R,kept:O,removed:C}),h}let Zn=(function(){function p(g,h,m){let{persistentIds:x,idMap:f}=v(g,h),w=N.computeMatches(g,h);if(typeof m.key=="function"){let M=new Map,V=new Set,D=F=>{let L=m.key(F);L!=null&&(M.has(L)?V.add(L):M.set(L,F))};g instanceof Element&&D(g);for(let F of g.querySelectorAll("*"))D(F);for(let F of V)M.delete(F);let W=new Map;for(let[F,L]of w)W.set(L,F);let te=h.__hyperMorphRoot||h,X=new Map,G=new Set,j=F=>{let L=m.key(F);L!=null&&(X.has(L)?G.add(L):X.set(L,F))};te instanceof Element&&j(te);for(let F of te.querySelectorAll("*"))j(F);for(let F of G)X.delete(F);for(let[F,L]of X){let U=M.get(F);if(!U||U.tagName!==L.tagName)continue;let K=W.get(U);K&&K!==L&&w.delete(K);let ve=w.get(L);ve&&ve!==U&&W.delete(ve),w.set(L,U),W.set(U,L)}}let _=T(m),I=u(g,h,_.scripts);if(I){let M=new Map;for(let[V,D]of w)M.set(D,V);for(let[V,D]of I.newByKey){if(I.disabled.has(V))continue;let W=I.oldByKey.get(V);if(!W)continue;let te=M.get(W);te&&te!==D&&w.delete(te);let X=w.get(D);X&&X!==W&&M.delete(X),w.set(D,W),M.set(W,D)}}let B=new Set;for(let M of w.values())B.add(M);let S=_.morphStyle||"outerHTML";if(!["innerHTML","outerHTML"].includes(S))throw new Error(`Do not understand how to morph style ${S}`);return{target:g,newContent:h,config:_,morphStyle:S,ignoreActive:_.ignoreActive,ignoreActiveValue:_.ignoreActiveValue,restoreFocus:_.restoreFocus,formStateSync:_.formStateSync||"attribute",idMap:f,persistentIds:x,hyperMatches:w,hyperMatchedOldElements:B,merge:I,pantry:E(),activeElementAndParents:R(g),callbacks:_.callbacks,head:_.head,scripts:_.scripts}}function T(g){let h=Object.assign({},y);return Object.assign(h,g),h.callbacks=Object.assign({},y.callbacks,g.callbacks),h.head=Object.assign({},y.head,g.head),h.scripts=Object.assign({},y.scripts,g.scripts),h}function E(){let g=document.createElement("div");return g.hidden=!0,document.body.insertAdjacentElement("afterend",g),g}function R(g){let h=[],m=document.activeElement;if(m?.tagName!=="BODY"&&g.contains(m))for(;m&&(h.push(m),m!==g);)m=m.parentElement;return h}function C(g){let h=Array.from(g.querySelectorAll("[id]"));return g.getAttribute?.("id")&&h.push(g),h}function O(g,h,m,x){for(let f of x){let w=f.getAttribute("id");if(h.has(w)){let _=f;for(;_;){let I=g.get(_);if(I==null&&(I=new Set,g.set(_,I)),I.add(w),_===m)break;_=_.parentElement}}}}function v(g,h){let m=C(g),x=C(h),f=A(m,x),w=new Map;O(w,f,g,m);let _=h.__hyperMorphRoot||h;return O(w,f,_,x),{persistentIds:f,idMap:w}}function A(g,h){let m=new Set,x=new Map;for(let w of g){let _=w.getAttribute("id");x.has(_)?m.add(_):x.set(_,w.tagName)}let f=new Set;for(let w of h){let _=w.getAttribute("id");f.has(_)?m.add(_):x.get(_)===w.tagName&&f.add(_)}for(let w of m)f.delete(w);return f}return p})(),{normalizeElement:Qn,normalizeParent:xr}=(function(){let p=new WeakSet;function T(v){return v instanceof Document?v.documentElement:v}function E(v){if(v==null)return document.createElement("div");if(typeof v=="string")return E(O(v));if(p.has(v))return v;if(v instanceof Node){if(v.parentNode)return new R(v);{let A=document.createElement("div");return A.append(v),A}}else{let A=document.createElement("div");for(let g of[...v])A.append(g);return A}}class R{constructor(A){this.originalNode=A,this.realParentNode=A.parentNode,this.previousSibling=A.previousSibling,this.nextSibling=A.nextSibling}get childNodes(){let A=[],g=this.previousSibling?this.previousSibling.nextSibling:this.realParentNode.firstChild;for(;g&&g!=this.nextSibling;)A.push(g),g=g.nextSibling;return A}querySelectorAll(A){return this.childNodes.reduce((g,h)=>{if(h instanceof Element){h.matches(A)&&g.push(h);let m=h.querySelectorAll(A);for(let x=0;x<m.length;x++)g.push(m[x])}return g},[])}insertBefore(A,g){return this.realParentNode.insertBefore(A,g)}moveBefore(A,g){return this.realParentNode.moveBefore(A,g)}get __hyperMorphRoot(){return this.originalNode}}function C(v){let A=x=>`<${x}(?:\\s(?:[^>"']|"[^"]*"|'[^']*')*)?>`,g=v.replace(/<!--[\s\S]*?-->/g,"");for(let x of["script","style","textarea","title"])g=g.replace(new RegExp(`${A(x)}[\\s\\S]*?</${x}\\s*>`,"gi"),"");let h=new RegExp(`${A("svg")}[\\s\\S]*?</svg\\s*>`,"gi"),m;do m=g,g=g.replace(h,"");while(g!==m);return g}function O(v){let A=new DOMParser,g=C(v);if(g.match(/<\/html>/)||g.match(/<\/head>/)||g.match(/<\/body>/)){let h=A.parseFromString(v,"text/html");if(g.match(/<\/html>/))return p.add(h),h;{let m=h.firstChild;return m&&p.add(m),m}}else{let m=A.parseFromString("<body><template>"+v+"</template></body>","text/html").body.querySelector("template").content;return p.add(m),m}}return{normalizeElement:T,normalizeParent:E}})(),wr=Symbol("hyper-morph-duplicate-key"),_r=[p=>p.getAttribute("data-id"),p=>p.getAttribute("id")];function Pe(p,T){return T.map(E=>{let R=new Map;for(let C of p){if(C.nodeType!==1)continue;let O=E(C);O==null||O===""||R.set(O,R.has(O)?wr:C)}return R})}function Ar(p,T,E,R){for(let C=0;C<R.length;C++){let O=R[C](p);if(O==null||O===""||T[C].get(O)!==p)continue;let v=E[C].get(O);if(!(!v||v===wr)&&v.tagName===p.tagName)return v}return null}function Se(p,T,E){for(let R=0;R<E.length;R++){let C=E[R](p);if(!(C==null||C==="")&&T[R].get(C)===p)return!0}return!1}function ei(p,T,E={}){let R=E.skip||(()=>!1),C=E.ignoreAttr||(()=>!1),O=E.tiers&&E.tiers.length?E.tiers:_r,v=null;function A(){return v||(v=Pe([p,...p.querySelectorAll("*")],O)),v}let g=null;function h(){return g||(g=Pe([T,...T.querySelectorAll("*")],O)),g}function m(j){return!j.parentElement||!j.parentElement.parentElement}function x(j,F,L){return m(j)||Se(j,A(),O)?(L.push({type:"subtree",el:j,base:F}),!1):!0}function f(j,F){let L=[];for(let U of j.attributes)C(j,U.name)||F.getAttribute(U.name)!==U.value&&L.push(U.name);for(let U of F.attributes)C(j,U.name)||j.hasAttribute(U.name)||L.push(U.name);return L}function w(j){let F=[],L=null,U=()=>{L!==null&&(F.push({nodeType:3,nodeValue:L}),L=null)};for(let K of j.childNodes){if(K.nodeType===3){L=(L===null?"":L)+K.nodeValue;continue}K.nodeType===1&&R(K)||(U(),(K.nodeType===1||K.nodeType===8)&&F.push(K))}return U(),F}function _(j,F){if(j.nodeType!==F.nodeType)return!1;if(j.nodeType!==1)return!0;if(j.tagName!==F.tagName)return!1;for(let L of O){let U=L(j),K=L(F);if(U!=null&&U!==""&&K!=null&&K!==""&&U!==K)return!1}return!0}function I(j){let F="";for(let L of j)L.nodeType===3&&L.nodeValue.trim()!==""?F+="\0"+L.nodeValue:L.nodeType===8&&(F+=""+L.nodeValue);return F}function B(j,F,L){let U=w(j),K=w(F);if(U.length===K.length){let $=!0;for(let Y=0;Y<U.length;Y++)if(!_(U[Y],K[Y])){$=!1;break}if($){for(let Y=0;Y<U.length;Y++){let Ee=U[Y];if(Ee.nodeType===1){if(S(Ee,K[Y],L))return!0}else if(Ee.nodeValue!==K[Y].nodeValue)return!0}return!1}}let ve=U.filter($=>$.nodeType===1),jt=K.filter($=>$.nodeType===1);if(I(U)!==I(K))return!0;let Sr=Pe(ve,O),Er=Pe(jt,O),Ft=[],qt=new Set,Cr=[];for(let $ of ve){let Y=Ar($,Sr,Er,O);Y&&!qt.has(Y)?(Ft.push([$,Y]),qt.add(Y)):Cr.push($)}let ge=[];for(let $ of Cr)Se($,Sr,O)?L.push({type:"subtree",el:$,base:null}):ge.push($);let ze=[];for(let $ of jt)qt.has($)||(Se($,Er,O)?L.push({type:"deletion",el:$}):ze.push($));if(ge.length!==ze.length)return!0;for(let $=0;$<ge.length;$++)if(!_(ge[$],ze[$]))return!0;let Tr=new Map(Ft);for(let $=0;$<ge.length;$++)Tr.set(ge[$],ze[$]);let Rr=-1;for(let $ of ve){let Y=Tr.get($);if(!Y)continue;let Ee=jt.indexOf(Y);if(Ee<Rr)return!0;Rr=Ee}for(let $=0;$<ge.length;$++)if(S(ge[$],ze[$],L))return!0;for(let[$,Y]of Ft)if(S($,Y,L))return!0;return!1}function S(j,F,L){if(j.tagName!==F.tagName)return x(j,F,L);let U=f(j,F),K=[];if(B(j,F,K))return x(j,F,L);if(U.length){if(!m(j)&&!Se(F,h(),O))return!0;L.push({type:"attrs",el:j,names:U,base:F})}return L.push(...K),!1}let M=[],V=f(p,T);V.length&&M.push({type:"attrs",el:p,names:V});let D=(j,F)=>Array.from(j.children).find(L=>L.tagName===F)||null,W=D(p,"HEAD"),te=D(T,"HEAD");if(W&&te){let j=[];S(W,te,j),j.length&&M.push({type:"head",el:W})}else(W||te)&&W&&M.push({type:"head",el:W});let X=D(p,"BODY"),G=D(T,"BODY");return X&&G?S(X,G,M):X&&M.push({type:"subtree",el:X,base:null}),{entries:M}}function ti(p,T,E={}){let R=E.tiers&&E.tiers.length?E.tiers:_r,C=p.documentElement,O=[],v=0,A=S=>({ok:!1,placed:O,held:S,skippedAttrs:v});if(!C)return A(null);function g(S){let M=[S,...S.querySelectorAll("*")];return Pe(M,R)}let h=g(C),m=new Map,x=S=>{let M=S.getRootNode(),V=m.get(M);if(!V){let D=M.nodeType===9?M.documentElement:M;V=g(D),m.set(M,V)}return V};function f(S){if(!S.parentElement&&S.tagName==="HTML")return C;if(S.parentElement&&!S.parentElement.parentElement&&S.parentElement.tagName==="HTML"){if(S.tagName==="BODY")return p.body||null;if(S.tagName==="HEAD")return p.head||null}return null}function w(S){let M=f(S);return M||Ar(S,x(S),h,R)}function _(S){if(!S)return null;let M=w(S);return M&&M.isConnected?M:null}function I(S){for(let M=0;M<R.length;M++){let V=R[M](S);V!=null&&V!==""&&h[M].set(V,S)}}for(let S of T){if(S.type!=="deletion")continue;let M=w(S.el);M&&M!==C&&M.remove()}let B=T.filter(S=>S.type!=="deletion").sort((S,M)=>S.el===M.el?0:S.el.compareDocumentPosition(M.el)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1);for(let S of B){if(S.type==="head"){let G=p.importNode(S.el,!0);p.head?p.head.replaceWith(G):C.insertBefore(G,C.firstChild),O.push({entry:S,imported:G});continue}if(S.type==="attrs"){let G=_(S.el)||_(S.base);if(!G){v++;continue}for(let j of S.names)S.el.hasAttribute(j)?G.setAttribute(j,S.el.getAttribute(j)):G.removeAttribute(j);continue}let M=S.el;if(f(M))return A(S);let V=_(M)||_(S.base);if(V){let G=p.importNode(M,!0);V.replaceWith(G),I(G),O.push({entry:S,imported:G});continue}if(S.base!=null&&!Se(S.base,x(S.base),R)||!Se(M,x(M),R))return A(S);let D=M.parentElement;if(!D)return A(S);let W=_(D);if(!W)return A(S);let te=null;for(let G=M.previousElementSibling;G;G=G.previousElementSibling){let j=_(G);if(j&&j.parentNode===W){te=j;break}}let X=p.importNode(M,!0);if(te)W.insertBefore(X,te.nextSibling);else{let G=Array.prototype.indexOf.call(D.children,M);W.insertBefore(X,W.children[G]||null)}I(X),O.push({entry:S,imported:X})}return{ok:!0,placed:O,held:null,skippedAttrs:v}}return{morph:q,defaults:y,findChangedRoots:ei,spliceProtected:ti,mergeJson:zt,mergeScriptText:Ut,parseJsonRelaxed:ot,parseRulesRelaxed:$r}})();var aa=He.morph,la=He.defaults,ca=He.findChangedRoots,ua=He.spliceProtected;var Ht=He;var at=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],Vt=new Set(at),Ur=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),Hr=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var lt={};$t(lt,{EmptyListInsert:()=>We,MAX_RULE_DEPTH:()=>Oe,MaxRuleDepthExceeded:()=>xe,RuleTargetReadOnly:()=>Ke,RulesParseError:()=>Te,ShapeMismatch:()=>Ve,UnknownRulesVersion:()=>Re});var Te=class extends Error{constructor(t,r){super(t),this.name="RulesParseError",this.cause=r}},Re=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},Oe=20,xe=class extends Error{constructor(t){super(`rule depth exceeded ${Oe} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},Ve=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},We=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},Ke=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}};function ke(e,t,r,n={}){return Wt(e,t,r,{depth:0,path:[]},n)}function Wt(e,t,r,n,i){if(n.depth>Oe)throw new xe(n.path);if(typeof r=="string")return Ii(e,t,r,i);if(Array.isArray(r)){let[o,a]=r;return e.find(t,o,i).map((l,c)=>Wt(e,l,a,{depth:n.depth+1,path:[...n.path,c]},i))}if(typeof r=="object"&&r!==null){let o={};for(let[a,s]of Object.entries(r))o[a]=Wt(e,t,s,{depth:n.depth+1,path:[...n.path,a]},i);return o}return null}function Ii(e,t,r,n){if(r.endsWith("[]")){let a=r.slice(0,-2);return e.find(t,a,n).map(s=>e.text(s))}if(r.startsWith("@"))return Vr(e,t,r.slice(1));let i=Z(r);if(i!==-1){let a=r.slice(0,i),s=r.slice(i+1),l=a?e.find(t,a,n):[t];return l.length===0?null:Vr(e,l[0],s)}if(r===".")return e.text(t);let o=e.find(t,r,n);return o.length===0?null:e.text(o[0])}function Vr(e,t,r){if(Vt.has(r)){let i=e.prop(t,r);return i==null?null:String(i)}let n=e.attr(t,r);return n||null}function Li(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function ji(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var Fi={find(e,t,r={}){let n=ji(e);if(!n||!n.querySelectorAll)return[];let i=Array.from(n.querySelectorAll(t));r.includeRulesTag||(i=i.filter(s=>!Li(s)));let o=[];r.skip&&o.push(r.skip);let a=r.templateAttr===null?null:r.templateAttr||"cms-template";if(a&&o.push("["+a+"]"),o.length){let s=o.join(", ");i=i.filter(l=>!l.closest||!l.closest(s))}return i},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,r){if(r===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,r)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,r){if(r===void 0){let n=e?e[t]:void 0;return n!==void 0?n:null}e[t]=r},clone(e){return e.cloneNode(!0)},insertAt(e,t,r){let n=e.children[r]||null;e.insertBefore(t,n)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let n=e.ownerDocument.createElement("template");n.innerHTML=t;let i=n.content.firstElementChild;if(!i)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(i,e),i},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(n=>{n.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},ue=Fi;function Kt(e){try{return JSON.parse(e)}catch(t){throw new Te(`Invalid strict JSON: ${t.message}`,t)}}function Me(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function r(i){let o=[],a=0;for(;a<i.length;){let s=i[a];if(/\s/.test(s)){a++;continue}if("{}".includes(s)){o.push({type:s,value:s}),a++;continue}if(s==="["){let b=!1,u=a+1;for(;u<i.length&&/\s/.test(i[u]);)u++;if(u<i.length&&/[a-zA-Z_]/.test(i[u])&&(b=!0),!b){o.push({type:s,value:s}),a++;continue}}if(s==="]"){o.push({type:s,value:s}),a++;continue}if(s===":"){o.push({type:t.COLON,value:s}),a++;continue}if(s===","){o.push({type:t.COMMA,value:s}),a++;continue}if(s==='"'||s==="'"){let b=s,u=a+1;for(;u<i.length&&i[u]!==b;)i[u]==="\\"&&u++,u++;o.push({type:t.STRING,value:i.substring(a+1,u),quoted:!0,sourceQuote:b}),a=u+1;continue}let l=a,c;for(;l<i.length&&!/[{},]/.test(i[l]);)if(i[l]===":"){let b=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],u=!1;for(let k of b){let y=k.substring(1);if(i.substring(l+1,l+1+y.length)===y){u=!0,l+=y.length;break}}if(!u)break}else if(i[l]==="["){for(l++;l<i.length&&i[l]!=="]";){if(i[l]==='"'||i[l]==="'"){let b=i[l];for(l++;l<i.length&&i[l]!==b;)i[l]==="\\"&&l++,l++}l++}l<i.length&&i[l]==="]"&&l++}else l++;c=i.substring(a,l);let d=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(c)?d=t.NUMBER:c==="true"||c==="false"||c==="null"?d=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(c)&&(d=t.SELECTOR),o.push({type:d,value:c,quoted:!1}),a=l}return o}function n(i){let o="";for(let a=0;a<i.length;a++){let s=i[a];if("{}".includes(s.type)||"[]".includes(s.type)){o+=s.value;continue}if(s.type===t.COLON){o+=s.value;continue}if(s.type===t.COMMA){let l=i[a+1];if(l&&(l.type==="}"||l.type==="]"))continue;o+=s.value;continue}if(s.type===t.STRING&&s.quoted){let l=s.value;s.sourceQuote==="'"&&(l=l.replace(/\\'/g,"'"),l=l.replace(/(\\*)"/g,(c,d)=>d.length%2===0?d+'\\"':c)),o+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){o+=s.value;continue}if(s.type===t.SELECTOR||s.type===t.IDENTIFIER){o+=`"${s.value}"`;continue}o+=`"${s.value}"`}return o}try{let i=r(e),o=n(i);return JSON.parse(o)}catch(i){throw new Te("Invalid extraction rules syntax: "+i.message,i)}}var Kr="1",Wr=/^[a-zA-Z0-9_-]+$/;function Ge(e,t,r){let n;if(r===void 0)n="script[data-rules-name]";else{if(typeof r!="string"||!Wr.test(r))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(r)} (must match ${Wr})`);n=`script[data-rules-name~="${r}"]`}let i=e.find(t,n,{includeRulesTag:!0});if(i.length===0)return null;r!==void 0&&i.length>1&&console.warn(`hyper-html-api: ${i.length} rules tags match data-rules-name~="${r}"; using the first.`);let o=i[0],a=e.attr(o,"data-rules-version");if(a!==Kr)throw new Re(a);return{rules:Me(e.text(o)),tagNode:o}}var Pa=new Function("url","return import(url)");var Di=.5;function Gt(e,t,r,n,i,o,a,s={}){let l=e.find(t,r,s);if(i.length===0){l.forEach(z=>e.remove(z));return}let c=i.length>l.length,d=l[0]||null;if(c&&!d&&(d=zi(e,t,r,s),!d))throw new We(o.path);let b=l.map(z=>$i(e,z,n,s)),u=null;if(d){u=e.clone(d),s.templateAttr&&e.removeAttr(u,s.templateAttr);let z=e.stripIds(u);z>0&&console.warn(`[hyper-html-api] stripped ${z} id attribute(s) from cloned template at "${o.path.join(".")||"(root)"}"`)}let k=Bi(i,b,n),y=l[0]||d,N=e.parent(y),q=l.length>0?Zr(e,N,y):0,H=Ui(e,l),oe=new Set,ee=[],le=i.map((z,ie)=>{let Q=k[ie];if(Q>=0)return oe.add(Q),ee.push(!1),l[Q];ee.push(!0);let pe=e.clone(u);return e.stripIds(pe),pe});if(l.forEach((z,ie)=>{oe.has(ie)||e.remove(z)}),H){le.forEach((z,ie)=>{let Q=q+ie;e.children(N).findIndex(Lt=>e.sameNode(Lt,z))!==Q&&e.insertAt(N,z,Q)}),Xr(e,le,n,i,o,a,s);return}Hi(e,le,ee,N,q),Xr(e,le,n,i,o,a,s)}function Xr(e,t,r,n,i,o,a){t.forEach((s,l)=>{if(r===null){let c=n[l],d=c==null?"":String(c);e.text(s)!==d&&e.text(s,d)}else{let c=o(e,s,r,n[l],{depth:i.depth+1,path:[...i.path,l]},a);c&&c!==s&&(t[l]=c)}})}function $i(e,t,r,n){return r===null?e.text(t):ke(e,t,r,n)}function Bi(e,t,r){let n=new Array(e.length).fill(-1),i=new Set;return e.forEach((o,a)=>{let s=-1,l=-1;t.forEach((c,d)=>{if(i.has(d))return;let b=Pi(o,c,r),u=b===l&&s>=0?Math.abs(d-a)<Math.abs(s-a):!1;(b>l||u)&&(l=b,s=d)}),l>=Di&&(n[a]=s,i.add(s))}),n}function Pi(e,t,r){if(r===null)return e===t?1:0;let n=Object.keys(r||{});if(n.length===0)return 0;let i=0;for(let o of n)JSON.stringify(e?.[o])===JSON.stringify(t?.[o])&&i++;return i/n.length}function Zr(e,t,r){let n=e.children(t);for(let i=0;i<n.length;i++)if(e.sameNode(n[i],r))return i;return-1}function zi(e,t,r,n){if(!n.templateAttr)return null;let i=t;for(;i;){let o=e.find(i,r,{includeRulesTag:!1,templateAttr:null});for(let a of o)if(e.attr(a,n.templateAttr)!=null)return a;i=e.parent(i)}return null}function Ui(e,t){if(t.length<=1)return!0;let r=e.parent(t[0]);if(!r)return!1;let n=e.children(r),i=[];for(let o of t){let a=n.findIndex(s=>e.sameNode(s,o));if(a===-1)return!1;i.push(a)}return i.sort((o,a)=>o-a),i[i.length-1]-i[0]===i.length-1}function Hi(e,t,r,n,i){let o=null,a=i;for(let s=0;s<t.length;s++){if(!r[s]){o=t[s];continue}let l=o?e.parent(o):n;if(!l)continue;let c=o?Zr(e,l,o)+1:a++;e.insertAt(l,t[s],c),o=t[s]}}var Qr=new Set(["checked","selected","disabled","readOnly","paused"]);function Ne(e,t,r,n,i={}){let o=[];if(Jt(r,n,[],o),o.length)throw new Ve(o);ct(e,t,r,n,{depth:0,path:[]},i)}function ct(e,t,r,n,i,o={}){if(i.depth>Oe)throw new xe(i.path);if(n===void 0)return t;if(typeof r=="string")return Vi(e,t,r,n,i,o);if(Array.isArray(r)){let[a,s]=r;return Gt(e,t,a,s,n,i,ct,o),t}if(typeof r=="object"&&r!==null){for(let[a,s]of Object.entries(r)){let l=ct(e,t,s,n==null?n:n[a],{depth:i.depth+1,path:[...i.path,a]},o);l&&l!==t&&(t=l)}return t}return t}function Vi(e,t,r,n,i,o){if(r.endsWith("[]")){let l=r.slice(0,-2);return Gt(e,t,l,null,n,i,ct,o),t}if(r.startsWith("@"))return en(e,t,r.slice(1),n);let a=Z(r);if(a!==-1){let l=r.slice(0,a),c=r.slice(a+1),d=l?e.find(t,l,o):[t];return d.length===0||en(e,d[0],c,n),t}if(r===".")return e.text(t,n==null?"":String(n)),t;let s=e.find(t,r,o);return s.length===0||e.text(s[0],n==null?"":String(n)),t}function en(e,t,r,n){if(Hr.has(r))throw new Ke(r);if(r==="outerHTML"){let i=n==null?"":String(n);return e.replaceWith(t,i)}return Ur.has(r)?(e.prop(t,r,Wi(r,n)),t):(e.attr(t,r,n==null?"":String(n)),t)}function Wi(e,t){return t==null?Qr.has(e)?!1:"":Qr.has(e)?t==="false"?!1:!!t:t}function Jt(e,t,r,n){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((i,o)=>{typeof i=="object"&&i!==null&&n.push({path:Ye([...r,o]),expected:"scalar",got:Je(i)})}):n.push({path:Ye(r),expected:"array",got:Je(t)});return}t!==null&&typeof t=="object"&&n.push({path:Ye(r),expected:"scalar",got:Je(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){n.push({path:Ye(r),expected:"array",got:Je(t)});return}let i=e[1];t.forEach((o,a)=>Jt(i,o,[...r,a],n));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){n.push({path:Ye(r),expected:"object",got:Je(t)});return}for(let[i,o]of Object.entries(e))Jt(o,t[i],[...r,i],n)}}}function Je(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function Ye(e){return e.join(".")}function Yt(e,t,r){if(r&&typeof r=="object")return{rules:r,tagNode:null};if(typeof r=="string"){let n=t&&t.ownerDocument?t.ownerDocument:t;return Ge(e,n,r)}return null}function rn(e,t,r,n){let i=Yt(e,t,r);if(!i){let s=typeof r=="string"?`data-rules-name~="${r}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${s}`)}let{rules:o,tagNode:a}=i;return{rules:o,tagNode:a,get:()=>ke(e,t,o,n),set:s=>Ne(e,t,o,s,n)}}var re={extract:(e,t,r)=>ke(ue,e,t,r),apply:(e,t,r,n)=>Ne(ue,e,t,r,n),findRulesIn:(e,t)=>Ge(ue,e,t),findRules:(e,t)=>Yt(ue,e,t),bind:(e,t,r)=>rn(ue,e,t,r),parseStrict:Kt,parseRelaxed:Me,ruleAttrIndex:Z,splitRule:it,errors:lt,DOM_PROPERTIES:at};var Zt={};$t(Zt,{fromString:()=>me,getRuleAtPath:()=>we,getValueAtPath:()=>so,setAtPath:()=>Xt,toString:()=>oo});function oo(e){return e.map(String).join(".")}function me(e){return e===""?[]:e.split(".").map(t=>/^\d+$/.test(t)?Number(t):t)}function we(e,t){let r=e;for(let n of t){if(r==null)return;if(typeof r=="string"){if(r.endsWith("[]")&&(typeof n=="number"||n==="*")){r=r.slice(0,-2);continue}return}if(Array.isArray(r)){if(typeof n!="number"&&n!=="*")return;r=r[1];continue}if(typeof r=="object"){if(typeof n=="number"||!(n in r))return;r=r[n];continue}return}return r}function so(e,t){let r=e;for(let n of t){if(r==null)return;r=r[n]}return r}function Xt(e,t,r){if(t.length===0)return r;let[n,...i]=t;if(typeof n=="number"){let o=Array.isArray(e)?[...e]:[];return o[n]=Xt(o[n],i,r),o}return{...e&&typeof e=="object"?e:{},[n]:Xt((e||{})[n],i,r)}}function Xe(e){if(typeof e=="string")return e.endsWith("[]")?[]:"";if(Array.isArray(e))return[];if(typeof e=="object"&&e!==null){let t={};for(let[r,n]of Object.entries(e))t[r]=Xe(n);return t}return""}function ut(e,t,{ignoreActiveValue:r=!0}={}){Ht.morph(e,t,{morphStyle:"innerHTML",ignoreActiveValue:r,restoreFocus:!0,formStateSync:"property"})}function mt(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_]/g," ").replace(/\s+/g," ").trim().replace(/^./,t=>t.toUpperCase())}var ao='<div class="hcms-drag-handle mirk-sortable__grip" aria-hidden="true"><div class="mirk-sortable__dots"><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span><span class="mirk-sortable__dot"></span></div></div>',Qt='<svg class="hcms-x" viewBox="0 0 16 16" shape-rendering="crispEdges" aria-hidden="true"><path d="M4 4 L12 12 M12 4 L4 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square"></path></svg>',sn={"@scalar":`
3
3
  <label class="hcms-field" data-hcms-shape="scalar">
4
4
  <span class="hcms-label" data-hcms-label></span>
5
5
  <textarea class="mirk-textarea" rows="1" data-hcms-field></textarea>
@@ -39,13 +39,13 @@ var hypercms=(()=>{var wt=Object.defineProperty;var Nn=Object.getOwnPropertyDesc
39
39
  </section>
40
40
  `,"@object-array-item":`
41
41
  <article class="hcms-card mirk-sortable__item" draggable="true">
42
- ${Fi}
42
+ ${ao}
43
43
  <div class="hcms-card-body mirk-sortable__body">
44
44
  <div class="hcms-card-fields"></div>
45
45
  <div class="hcms-card-controls">
46
46
  <button type="button" class="hcms-move hcms-move-up hcms-sr-only" data-hcms-action="move-up" aria-label="Move up">\u2191</button>
47
47
  <button type="button" class="hcms-move hcms-move-down hcms-sr-only" data-hcms-action="move-down" aria-label="Move down">\u2193</button>
48
- <button type="button" class="hcms-remove hcms-remove--card" data-hcms-action="remove" aria-label="Remove">${Dt}</button>
48
+ <button type="button" class="hcms-remove hcms-remove--card" data-hcms-action="remove" aria-label="Remove">${Qt}</button>
49
49
  </div>
50
50
  </div>
51
51
  <div class="hcms-error" hidden></div>
@@ -59,7 +59,7 @@ var hypercms=(()=>{var wt=Object.defineProperty;var Nn=Object.getOwnPropertyDesc
59
59
  <span class="mirk-button__label">Choose</span>
60
60
  </label>
61
61
  <a class="mirk-file__name" data-hcms-field></a>
62
- <button type="button" class="hcms-upload-clear" data-hcms-action="clear-upload" aria-label="Remove file">${Dt}</button>
62
+ <button type="button" class="hcms-upload-clear" data-hcms-action="clear-upload" aria-label="Remove file">${Qt}</button>
63
63
  </div>
64
64
  <div class="hcms-error" hidden></div>
65
65
  </div>
@@ -73,7 +73,7 @@ var hypercms=(()=>{var wt=Object.defineProperty;var Nn=Object.getOwnPropertyDesc
73
73
  </label>
74
74
  <figure class="mirk-image__thumb">
75
75
  <span class="mirk-image__frame"><img class="mirk-image__preview" data-hcms-field alt="" /></span>
76
- <button type="button" class="hcms-upload-clear hcms-upload-clear--badge" data-hcms-action="clear-upload" aria-label="Remove image">${Dt}</button>
76
+ <button type="button" class="hcms-upload-clear hcms-upload-clear--badge" data-hcms-action="clear-upload" aria-label="Remove image">${Qt}</button>
77
77
  </figure>
78
78
  </div>
79
79
  <div class="hcms-error" hidden></div>
@@ -147,11 +147,11 @@ var hypercms=(()=>{var wt=Object.defineProperty;var Nn=Object.getOwnPropertyDesc
147
147
  <input class="hcms-chip-field" data-hcms-field aria-label="Item" placeholder="\u2026" />
148
148
  <button type="button" class="hcms-remove" data-hcms-action="remove" aria-label="Remove">\xD7</button>
149
149
  </span>
150
- `},qi=["@scalar","@object","@scalar-array","@scalar-array-item","@object-array","@object-array-item"];function et(e){let t=e.head||e.documentElement;if(t)for(let r of qi)Br(e,t,r)}function $t(e,t){if(!Fr[t])return null;let r=e&&(e.head||e.documentElement);return r?Br(e,r,t):null}var jr={src:"@image",checked:"@checkbox",innerHTML:"@richtext"},Ze={image:"@image",file:"@file",checkbox:"@checkbox",toggle:"@toggle",select:"@select",radio:"@radio",textarea:"@textarea",number:"@number",richtext:"@richtext"},Di=new Set([...Object.values(Ze),"@chips","@chips-item"]);function $e(e,t,r){if(typeof e!="string")return"@scalar";let n=e.lastIndexOf("@"),i=nt(Be(e,n),t,"data-hcms-component");if(i&&Ze[i]){let o=Ze[i],a=Array.isArray(r)&&r.some(s=>s==="*"||typeof s=="number");return o==="@number"&&!Lr(e,n,t,a).every(Bi)||(o==="@checkbox"||o==="@toggle")&&(n<0||e.slice(n+1)!=="checked")&&!Lr(e,n,t,a).every(Pi)?"@scalar":o}if(n>=0){let o=e.slice(n+1);if(jr[o])return jr[o]}return"@scalar"}function qr(e,t){if(typeof e!="string")return null;let r=e.lastIndexOf("@"),n=nt(Be(e,r),t,"data-hcms-component");return n&&Ze[n]||null}var $i=/^-?\d+(\.\d+)?([eE][+-]?\d+)?$/;function Bi(e){return e==null||e===""?!0:$i.test(String(e))}function Pi(e){return e==null||e===""||e==="true"||e==="false"}function Lr(e,t,r,n){if(!r||!r.querySelectorAll)return[];let i=Be(e,t);if(!i||i===".")return[];let o=null;try{o=r.querySelectorAll(i)}catch{return[]}let a=t>=0?e.slice(t+1):null,s=[];for(let l of o)if(!(l.closest&&l.closest("[cms-template], [data-hcms-shell]"))&&(a?a==="value"&&"value"in l?s.push(l.value):s.push(l.getAttribute?l.getAttribute(a):null):s.push((l.textContent||"").trim()),!n))break;return s}function tt(e,t){if(typeof e!="string"||!e.endsWith("[]")||!t||!t.querySelector)return null;let r=e.slice(0,-2).trim();if(!r)return null;let n=null;try{n=t.querySelector(r)}catch{return null}let i=n&&n.closest?n.closest("[data-hcms-component]"):null;return(i&&i.getAttribute?i.getAttribute("data-hcms-component"):null)==="chips"?{array:"@chips",item:"@chips-item"}:null}function _e(e,t,r){let n=e.join("."),i=e.map(o=>typeof o=="number"?"*":o).join(".");return n&&Z(r,n)||i&&i!==n&&Z(r,i)||Z(r,t)}function rt(e,t,r){let n=tt(e,r);if(!n)return null;let i=_e(t,n.array,r);return i&&i.getAttribute("data-hcms-tpl")===n.array?n:null}function Dr(e,t){if(typeof e!="string")return null;let r=e.lastIndexOf("@"),n=nt(Be(e,r),t,"data-hcms-options");if(n==null)return null;let i=n.trim().split(/\s+/).filter(Boolean);return i.length?i:null}function $r(e,t){if(typeof e!="string")return null;let r=e.lastIndexOf("@");return nt(Be(e,r),t,"data-hcms-crop")}function Be(e,t){return t>=0?e.slice(0,t):e}function nt(e,t,r){if(!t||!t.querySelector||!e||e===".")return null;let n=null;try{n=t.querySelector(e)}catch{return null}return n&&n.getAttribute?n.getAttribute(r):null}function it(e,t){if(!e||t==null)return;r(t);function r(n){let i=he(n);if(i==="scalar"){let o=$e(n,e);Di.has(o)&&$t(e,o);return}if(i==="scalar-array"){let o=tt(n,e);o&&($t(e,o.array),$t(e,o.item));return}if(i==="object"){for(let o of Object.values(n))r(o);return}if(i==="object-array"){let o=n[1];if(o&&typeof o=="object"&&!Array.isArray(o))for(let a of Object.values(o))r(a);else r(o)}}}function Br(e,t,r){let n=Z(e,r);if(n)return n;let i=e.createElement("template");return i.setAttribute("data-hcms-tpl",r),i.setAttribute("save-remove",""),i.innerHTML=Fr[r].trim(),t.appendChild(i),i}function Z(e,t){return!e||!e.querySelector?null:e.querySelector(`template[data-hcms-tpl="${zi(t)}"]`)}function zi(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}function he(e){return typeof e=="string"?e.endsWith("[]")?"scalar-array":"scalar":Array.isArray(e)?"object-array":typeof e=="object"&&e!==null?"object":"scalar"}function Pe(e){return e?!!(e.content||e).querySelector("[data-hcms-field]"):!1}var Pr={IMG:"src",A:"href"};function ot(e){if(!e)return"value";let t=(e.tagName||"").toUpperCase();return t==="INPUT"?(e.getAttribute("type")||"text").toLowerCase()==="checkbox"?"checked":"value":t==="TEXTAREA"||t==="SELECT"?"value":Pr[t]?Pr[t]:e.hasAttribute&&e.hasAttribute("contenteditable")?"innerHTML":null}function zr(e,t){let r=(e.tagName||"").toUpperCase(),n=(e.getAttribute&&e.getAttribute("type")||"").toLowerCase(),i=ot(e),a=`${Hr(r,n)}[data-hcms-field="${Ae(t)}"]`;return r==="INPUT"&&n==="radio"?`${a}:checked@value`:i?`${a}@${i}`:a}function Ui(e){let t=(e.tagName||"").toUpperCase(),r=(e.getAttribute&&e.getAttribute("type")||"").toLowerCase(),n=ot(e),o=`${Hr(t,r)}[data-hcms-field]`;return t==="INPUT"&&r==="radio"?`${o}:checked@value`:n?`${o}@${n}`:o}function Hr(e,t){return e==="INPUT"?t?`input[type="${t}"]`:"input":e==="TEXTAREA"?"textarea":e==="SELECT"?"select":e==="IMG"?"img":e==="A"?"a":':not([data-hcms-shape="scalar"]):not([data-hcms-shape="object"]):not([data-hcms-shape="object-array"]):not([data-hcms-shape="scalar-array"])'}function Ae(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var Ur=new Set(["__proto__","constructor","prototype"]);function st(e,t){return r(e,[]);function r(c,u){let p=he(c);if(p==="scalar")return n(c,u);if(p==="scalar-array")return i(c,u);if(p==="object-array")return o(c,u);if(p==="object"){let d=Object.create(null);for(let[f,k]of Object.entries(c)){if(Ur.has(f))throw new Error(`hypercms: rule key "${f}" is forbidden at "${u.join(".")||"<root>"}"`);d[f]=r(k,[...u,f])}return d}return null}function n(c,u){let p=u.length?u[u.length-1]:null,d=typeof p=="string"?p:"__value",f=l(u,d);if(f)return zr(f,d);let k=s($e(c,t,u),d);return k?zr(k,d):`input[data-hcms-field="${Ae(d)}"]@value`}function i(c,u){let p=rt(c,u,t),d=p&&s(p.item,null)||s("@scalar-array-item",null),f=d?Ui(d):"input[data-hcms-field]@value";return[a(u,"[data-hcms-array-item]"),f]}function o(c,u){let[,p]=c,d=[...u,"*"],f=a(u,"[data-hcms-card]");if(p&&typeof p=="object"&&!Array.isArray(p)){let k=Object.create(null);for(let[T,M]of Object.entries(p)){if(Ur.has(T))throw new Error(`hypercms: rule key "${T}" is forbidden at "${d.join(".")}"`);k[T]=r(M,[...d,T])}return[f,k]}return[f,r(p,[...d,0])]}function a(c,u){let p=c.length?c[c.length-1]:"",d=c.some(T=>T==="*"),f=c.join(".");return`${d?`[data-hcms-field="${Ae(p)}"]`:`[data-hcms-path="${Ae(f)}"]`} > .hcms-array-items > ${u}`}function s(c,u){if(!t)return null;let p=Z(t,c);if(!p)return null;let d=p.content||p;if(u){let f=d.querySelector(`[data-hcms-field="${Ae(u)}"]`);if(f)return f}return d.querySelector("[data-hcms-field]")}function l(c,u){if(!t)return null;let p=c.map(k=>typeof k=="number"?"*":k).join("."),f=[c.join("."),p];for(let k=c.length-1;k>=0;k--){let T=c.slice(0,k).map(M=>typeof M=="number"?"*":M);T.push("*"),f.push(T.join("."))}for(let k of f){if(!k)continue;let T=Z(t,k);if(!T||!Pe(T))continue;let M=T.content||T,F=M.querySelector(`[data-hcms-field="${Ae(u)}"]`)||M.querySelector("[data-hcms-field]");if(F)return F}return null}}function Bt(e){if(!e)return"";let t=String(e).split(/[?#]/)[0],r=t.split("/").pop()||t;try{return decodeURIComponent(r)}catch{return r}}function at({pageRules:e,formRules:t,data:r,doc:n}){let i=n.createDocumentFragment(),o=Pt(e,[],r,n);return o&&i.appendChild(o),i}function Wr({shape:e,itemShape:t,pathArr:r,data:n,doc:i,itemKey:o}){if(e==="object-array-item")return Gr(t,r,n,i);if(e==="scalar-array-item")return Jr(r,n,i,o||null);throw new Error(`hypercms: buildItem called with unknown shape "${e}"`)}function Pt(e,t,r,n){let i=he(e);return i==="scalar"?Hi(e,t,r,n):i==="object"?Gi(e,t,r,n):i==="object-array"?Ji(e,t,r,n):i==="scalar-array"?Yi(e,t,r,n):null}function Hi(e,t,r,n){let i=$e(e,n,t),o=_e(t,i,n);if(!o)throw new Error(`hypercms: missing template for scalar at "${t.join(".")}"`);let a=qr(e,n);a==="@number"&&i==="@scalar"&&console.info(`[hypercms] field "${t.join(".")}" declares component "@number" but its value isn't a plain number; rendering a text input so the value is preserved`),(a==="@checkbox"||a==="@toggle")&&i==="@scalar"&&console.info(`[hypercms] field "${t.join(".")}" declares component "${a}" but its value isn't true/false; rendering a text input so the value is preserved`),Kr(o,a===i?a:null,t);let s=Se(o,n);Ee(s,t);let l=o.getAttribute?.("data-hcms-tpl");if((i==="@select"||i==="@radio")&&l===i&&Vi(s,e,t,r,n,i),i==="@image"&&l==="@image"){let c=$r(e,n);c!=null&&!s.hasAttribute("data-hcms-crop")&&s.setAttribute("data-hcms-crop",c)}return Xi(s,ie(t)),lt(s,ie(t)),ct(s,ie(t)),en(s,r),i==="@file"&&Ki(s),s}function Kr(e,t,r){if(!t)return;let n=e.getAttribute?.("data-hcms-tpl");n&&n!==t&&console.info(`[hypercms] field "${r.join(".")}" declares component "${t}" but custom template "${n}" wins`)}function Vi(e,t,r,n,i,o){let a=Dr(t,i),s=a?[...a]:[],l=n==null?"":String(n);if(l!==""&&!s.includes(l)&&s.unshift(l),!a&&(Wi(e,"data-hcms-options required (space-separated values)"),s.length===0)){e.querySelector(".mirk-radio")?.remove();return}if(o==="@select"){let p=e.querySelector("select[data-hcms-field]");if(!p)return;for(let d of s){let f=i.createElement("option");f.value=d,f.textContent=Qe(d),p.appendChild(f)}return}let c=e.querySelector(".mirk-radio");if(!c||!c.parentNode)return;let u=zt(r.join("."));for(let p of s){let d=c.cloneNode(!0),f=d.querySelector('input[type="radio"]');f&&(f.value=p,f.name=u);let k=d.querySelector(".mirk-radio__label");k&&(k.textContent=Qe(p)),c.parentNode.insertBefore(d,c)}c.remove()}function zt(e){return"hcms-"+String(e).replace(/[^A-Za-z0-9_-]/g,"-")}function Wi(e,t){let r=e.querySelector?e.querySelector(".hcms-error"):null;r&&(r.textContent=t,r.hidden=!1)}function Ki(e){let t=e.querySelector?e.querySelector("a.mirk-file__name[data-hcms-field]"):null;t&&(t.textContent=Bt(t.getAttribute("href")))}function Gi(e,t,r,n){let i=_e(t,"@object",n);if(!i)throw new Error(`hypercms: missing template for object at "${t.join(".")}"`);let o=Se(i,n);if(Ee(o,t),lt(o,ie(t)),ct(o,ie(t)),Pe(i))return rn(o,e,t),tn(o,e,r),o;let a=dt(o,".hcms-object-fields",i,t);for(let[s,l]of Object.entries(e)){let c=r==null?null:r[s],u=Pt(l,[...t,s],c,n);u&&a.appendChild(u)}return o}function Ji(e,t,r,n){let i=_e(t,"@object-array",n);if(!i)throw new Error(`hypercms: missing template for object-array at "${t.join(".")}"`);let o=Se(i,n);Ee(o,t),lt(o,ie(t)),ct(o,ie(t)),Xr(o,i),Qr(o,i,t);let a=dt(o,".hcms-array-items",i,t),[,s]=e;return(Array.isArray(r)?r:[]).forEach((c,u)=>{let p=Gr(s,[...t,u],c,n);p&&a.appendChild(p)}),Zr(o),o}function Gr(e,t,r,n){let i=Yr(t,"object-array-item",n);if(!i)throw new Error(`hypercms: missing item template for "${t.join(".")}"`);let o=Se(i,n);if(o.setAttribute("data-hcms-card",""),o.classList.contains("hcms-card")||o.classList.add("hcms-card"),Ee(o,t),Pe(i))return e&&typeof e=="object"&&!Array.isArray(e)&&(rn(o,e,t),tn(o,e,r)),o;let a=dt(o,".hcms-card-fields",i,t);if(e&&typeof e=="object"&&!Array.isArray(e))for(let[s,l]of Object.entries(e)){let c=r==null?null:r[s],u=Pt(l,[...t,s],c,n);u&&a.appendChild(u)}return o}function Yi(e,t,r,n){let i=tt(e,n),o=rt(e,t,n),a=i?i.array:"@scalar-array",s=_e(t,a,n);if(!s)throw new Error(`hypercms: missing template for scalar-array at "${t.join(".")}"`);Kr(s,i?i.array:null,t);let l=Se(s,n);Ee(l,t),lt(l,ie(t)),ct(l,ie(t)),Xr(l,s),Qr(l,s,t),o&&l.setAttribute("data-hcms-item-tpl",o.item);let c=dt(l,".hcms-array-items",s,t);return(Array.isArray(r)?r:[]).forEach((p,d)=>{let f=Jr([...t,d],p,n,o?o.item:null);f&&c.appendChild(f)}),Zr(l),l}function Jr(e,t,r,n){let i=Yr(e,"scalar-array-item",r,n);if(!i)throw new Error(`hypercms: missing item template for "${e.join(".")}"`);let o=Se(i,r);return o.setAttribute("data-hcms-array-item",""),o.classList.contains("hcms-array-item")||o.classList.add("hcms-array-item"),Ee(o,e),en(o,t),o}function Yr(e,t,r,n){let i=e.map(o=>typeof o=="number"?"*":o).join(".");return Z(r,i)||n&&Z(r,n)||Z(r,"@"+t)}function Se(e,t){let r=e.content||e,n=t.createElement("div");return n.appendChild(r.cloneNode(!0)),n.firstElementChild||n}function Ee(e,t){e.setAttribute("data-hcms-path",t.join("."))}function Xi(e,t){let r=t==null?"":String(t);if(e.matches&&e.matches("[data-hcms-field]")){e.getAttribute("data-hcms-field")||e.setAttribute("data-hcms-field",r);return}(e.querySelectorAll?e.querySelectorAll("[data-hcms-field]"):[]).forEach(i=>{i.getAttribute("data-hcms-field")||i.setAttribute("data-hcms-field",r)})}function lt(e,t){t==null||t===""||!e.setAttribute||e.hasAttribute?.("data-hcms-field")||e.setAttribute("data-hcms-field",String(t))}function ct(e,t){if(t==null||t==="")return;(e.querySelectorAll?e.querySelectorAll("[data-hcms-label]"):[]).forEach(n=>{(n.textContent||"").trim()===""&&(n.textContent=Qe(String(t)))})}function Xr(e,t){["data-hcms-no-add","data-hcms-no-remove","data-hcms-no-reorder"].forEach(r=>{t.hasAttribute(r)&&e.setAttribute(r,"")}),["data-hcms-min-items","data-hcms-max-items"].forEach(r=>{t.hasAttribute(r)&&e.setAttribute(r,t.getAttribute(r))})}function Zr(e){let t=e.querySelector?e.querySelector(".hcms-array-items"):null;if(!t)return;let r=Array.from(t.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),n=r.length,i=Vr(e,"data-hcms-max-items"),o=Vr(e,"data-hcms-min-items"),a=e.hasAttribute("data-hcms-no-add"),s=e.hasAttribute("data-hcms-no-remove"),l=e.hasAttribute("data-hcms-no-reorder"),c=e.querySelector('[data-hcms-action="add"]');c&&(c.hidden=a||i!=null&&n>=i),r.forEach((u,p)=>{let d=u.querySelector('[data-hcms-action="remove"]');d&&(d.hidden=s||o!=null&&n<=o);let f=u.querySelector('[data-hcms-action="move-up"]');f&&(f.hidden=l||p===0);let k=u.querySelector('[data-hcms-action="move-down"]');k&&(k.hidden=l||p===n-1)})}function Vr(e,t){if(!e||!e.hasAttribute(t))return null;let r=parseInt(e.getAttribute(t),10);return Number.isFinite(r)?r:null}function Qr(e,t,r){if(e.hasAttribute("data-hcms-no-reorder")||t.hasAttribute("data-hcms-no-reorder"))return;let n=e.querySelector(".hcms-array-items");if(!n)return;let i="hcms-"+r.join(".");n.setAttribute("sortable",i),n.setAttribute("onsorted","hypercmsCommit && hypercmsCommit()")}function ie(e){return e.length?e[e.length-1]:null}function en(e,t){let r=Zi(e);if(r.length!==0)for(let n of r)nn(n,t)}function Zi(e){if(!e)return[];let t=[];return e.matches?.("[data-hcms-field]")&&Qi(e)&&t.push(e),(e.querySelectorAll?e.querySelectorAll("input[data-hcms-field], textarea[data-hcms-field], select[data-hcms-field], img[data-hcms-field], a[data-hcms-field], [contenteditable][data-hcms-field]"):[]).forEach(n=>t.push(n)),t}function Qi(e){let t=(e.tagName||"").toUpperCase();return!!(t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||t==="IMG"||t==="A"||e.hasAttribute?.("contenteditable"))}function tn(e,t,r){(e.querySelectorAll?e.querySelectorAll("[data-hcms-field]"):[]).forEach(i=>{let o=i.getAttribute("data-hcms-field");if(!o)return;if(!t||typeof t!="object"||!(o in t)){console.warn(`[hypercms] inline template field "${o}" is not in the rule shape; ignoring`);return}let a=r==null?null:r[o];nn(i,a)})}function rn(e,t,r){if(!e.querySelectorAll)return;e.querySelectorAll("[data-hcms-field]").forEach(i=>{let o=i.getAttribute("data-hcms-field");if(!o||t&&typeof t=="object"&&!(o in t))return;let a=[...r,o].join(".");i.setAttribute("data-hcms-path",a)})}function dt(e,t,r,n){if(!e.querySelector)return e;let i=e.querySelector(t);if(i)return i;let o=r?.getAttribute?.("data-hcms-tpl")||n.join(".");throw new Error(`hypercms: template "${o}" is in slotted mode but has no ${t} element`)}function nn(e,t){let r=ot(e),n=(e.tagName||"").toUpperCase(),i=(e.getAttribute("type")||"").toLowerCase();if(n==="INPUT"&&i==="radio"){e.checked=e.value!=null&&String(e.value)===String(t??"");return}if(r==="checked"){e.checked=t===!0||t==="true";return}if(r){e[r]=t==null?"":String(t);return}e.textContent=t==null?"":String(t)}var on={skip:"[data-hcms-shell]",templateAttr:"cms-template"};function sn(e,t,r,n={}){let{observerHandle:i,shellRoot:o,structural:a,structuralPath:s}=n;i?.pause?.();try{if(!a)try{return K.apply(e,t,r,on),{ok:!0}}catch(p){return{ok:!1,error:p}}let l=eo(e,t,s),c=l?ro(l):null,u=l?null:io(e,o);try{return K.apply(e,t,r,on),{ok:!0}}catch(p){return c?no(l,c):u&&oo(e,o,u),{ok:!1,error:p}}}finally{i?.resume?.()}}function eo(e,t,r){if(!r||!e)return null;let n=ne(r),i=[],o=t;for(let a of n){if(typeof o=="string"||o==null||Array.isArray(o))break;if(typeof o=="object"&&a in o){if(i.push(a),o=o[a],Array.isArray(o)||typeof o=="string"&&o.endsWith("[]"))break}else return null}return!Array.isArray(o)&&!(typeof o=="string"&&o.endsWith("[]"))?null:to(e,t,i)}function to(e,t,r){if(r.length===0)return null;let n=e,i=t;for(let o=0;o<r.length;o++){let a=r[o];if(!i||typeof i!="object"||Array.isArray(i))return null;let s=i[a];if(s==null)return null;if(o===r.length-1){if(Array.isArray(s)){let[l]=s;return n.querySelector?.(l)?.parentElement||null}if(typeof s=="string"&&s.endsWith("[]")){let l=s.slice(0,-2);return n.querySelector?.(l)?.parentElement||null}return null}i=s}return null}function ro(e){let t=[];for(let r of Array.from(e.childNodes))t.push(r.cloneNode(!0));return t}function no(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let r of t)e.appendChild(r)}function io(e,t){let r=[];for(let n of Array.from(e.childNodes))n===t||t&&n.contains?.(t)||r.push(n.cloneNode(!0));return r}function oo(e,t,r){for(let i of Array.from(e.childNodes))i===t||t&&i.contains?.(t)||e.removeChild(i);let n=so(e,t);for(let i of r)e.insertBefore(i,n||null)}function so(e,t){if(!t)return null;for(let r of Array.from(e.childNodes))if(r===t||r.contains?.(t))return r;return null}var ao={Mutation:(e,t)=>e?.Mutation??t?.Mutation,undo:(e,t)=>e?.undo??t?.undo,onPrepareForSave:(e,t)=>e?.addDocumentTransform??t?.onPrepareForSave,consent:(e,t)=>e?.confirm??t?.consent,RichClay:(e,t)=>e?.RichClay??t?.RichClay,quickcrop:(e,t)=>e?.quickcrop??t?.quickcrop,uploadFileBasic:(e,t)=>e?.uploadFileBasic??t?.uploadFileBasic};function W(e,t){let r=ao[e];if(!r)throw new Error(`hypercms: unknown platform capability "${e}"`);let n=t||(typeof window<"u"?window:null);return n&&r(n.clay,n.hyperclay)||null}var an=["clay:mutation-ready","hyperclay:mutation-ready"],ln=["clay:sync-applied","hyperclay:livesync-applied"];function Ut(e,t,r){let n=null,i=o=>{n!==null&&n!==o.type||(n=o.type,queueMicrotask(()=>{n=null}),r(o))};for(let o of t)e.addEventListener(o,i);return()=>{for(let o of t)e.removeEventListener(o,i)}}function mt(e,t){if(!t||e==null)return e;return r(e);function r(n){if(typeof n=="string"){if(n.endsWith("[]")||n.lastIndexOf("@")>=0)return n;let i=null;try{i=t.querySelector(n)}catch{return n}return i&&i.children.length>0?n+"@innerHTML":n}if(Array.isArray(n))return n;if(n&&typeof n=="object"){let i=Object.create(null);for(let[o,a]of Object.entries(n))i[o]=r(a);return i}return n}}function Ht(e){if(!e||e.tagName!=="TEXTAREA")return;let t=e.ownerDocument.defaultView||(typeof window<"u"?window:null);t&&t.CSS&&t.CSS.supports&&t.CSS.supports("field-sizing: content")||(e.style.height="auto",e.style.height=e.scrollHeight+"px")}function Ce(e,t){if(!e||!e.querySelectorAll)return;e.querySelectorAll("textarea[data-hcms-field]").forEach(Ht);let r=t&&t.defaultView||(typeof window<"u"?window:null),n=r&&r.richclay&&r.richclay.RichClay||W("RichClay",r)||(r&&typeof r.RichClay=="function"?r.RichClay:null);n&&e.querySelectorAll("[contenteditable][data-hcms-field]").forEach(i=>{if(i.__hcmsRichclay)return;let o;try{o=new n(i,{inline:!0,hyperclay:!1,toolbar:["bold","italic","link","undo","redo"]})}catch(s){console.warn("[hypercms] richclay activation failed; field stays plain contenteditable",s);return}i.__hcmsRichclay=o;let a=o&&o.squire;a&&typeof a.addEventListener=="function"&&a.addEventListener("input",()=>{let s=r&&r.Event||Event;i.dispatchEvent(new s("input",{bubbles:!0}))})})}var Vt=new WeakSet;function Re(e,t){let r=W("undo");if(!r)return t();r.pause();try{let n=t();return n&&n.ok?r.commitCaptured(e):r.discardCaptured(),n}finally{r.resume()}}function pt(e){let t=W("undo");if(!t)return e();t.pause();try{return e()}finally{t.discardCaptured(),t.resume()}}function mn(e){let{formRoot:t}=e;if(!t||Vt.has(t))return;Vt.add(t);let r=a=>{let s=a.target;!s||!s.closest||s.closest("[data-hcms-form-root]")&&s.matches("input, textarea, select, [contenteditable][data-hcms-field]")&&(s.tagName==="TEXTAREA"&&Ht(s),!s.matches('input[type="file"]')&&(!s.closest("[data-hcms-field]")&&!s.hasAttribute?.("data-hcms-field")||cn(s,e)))},n=a=>{let s=a.target;if(!(!s||!s.closest)&&s.closest("[data-hcms-form-root]")){if(s.matches('input[type="file"][data-hcms-upload]')){fo(s,e);return}s.matches('input[type="checkbox"], input[type="radio"], select')&&cn(s,e)}},i=a=>{let s=a.target;if(!s||!s.closest)return;let l=s.closest("[data-hcms-action]");if(!l)return;let c=l.getAttribute("data-hcms-action");if(c==="add"||c==="remove"||c==="move-up"||c==="move-down"||c==="clear-upload"){if(!l.closest("[data-hcms-form-root]"))return}else if(c==="close"&&!l.closest("[data-hcms-shell]"))return;if(c==="add"){let u=l.closest("[data-hcms-path]");if(!u)return;let p=u.getAttribute("data-hcms-path");Wt(p,e)}else if(c==="remove"){let u=l.closest("[data-hcms-card], [data-hcms-array-item]");if(!u)return;xo(u,e)}else if(c==="move-up"||c==="move-down"){let u=l.closest("[data-hcms-card], [data-hcms-array-item]");if(!u)return;yo(u,c==="move-up"?-1:1,e)}else c==="clear-upload"?go(l,e):c==="close"&&e.onCloseRequested?.()},o=t.ownerDocument;o.addEventListener("input",r,!0),o.addEventListener("change",n,!0),o.addEventListener("click",i,!0),e.detachEvents=()=>{o.removeEventListener("input",r,!0),o.removeEventListener("change",n,!0),o.removeEventListener("click",i,!0),Vt.delete(t)}}var lo=new Set(["value","checked"]);function co(e,t){if(!t)return null;let r=ne(t);if(r.some(l=>typeof l=="number"||l==="*"))return null;let n=ue(e.pageRules,r);if(typeof n!="string")return null;let i=n.lastIndexOf("@");if(i===-1)return null;let o=n.slice(i+1);if(!lo.has(o))return null;let a=n.slice(0,i),s=a?e.pageRoot.querySelector(a):e.pageRoot;return s?{el:s,prop:o,oldValue:s[o]}:null}function cn(e,t){let n=(e.closest("[data-hcms-field]")||e).closest("[data-hcms-path]")?.getAttribute("data-hcms-path")||"",i=co(t,n);if(re(X(t),{path:n,structural:!1},t),i){let o=W("undo");o&&typeof o.recordValue=="function"&&o.recordValue(i.el,{prop:i.prop,oldValue:i.oldValue,newValue:i.el[i.prop]})}}var mo={type:"image/webp",quality:.85,maxWidth:2048,maxHeight:2048};async function uo(e,t){let r=t&&t.getAttribute?t.getAttribute("data-hcms-crop"):null;if(r==null)return{file:e};let n=W("quickcrop");if(typeof n!="function")return{file:e};try{let i=await n(e,{aspect:ho(r),...mo});return i===null?null:{file:po(i.blob,e.name),dataURL:i.dataURL}}catch(i){return ze(t,i&&i.message||"Crop failed"),null}}function ho(e){let t=String(e??"").trim().toLowerCase();if(t===""||t==="free")return null;let r=t.match(/^(\d+(?:\.\d+)?)\s*[:/]\s*(\d+(?:\.\d+)?)$/);if(!r)return null;let n=parseFloat(r[1]),i=parseFloat(r[2]);return!n||!i?null:n/i}function po(e,t){let r=e.type==="image/webp"?".webp":e.type==="image/jpeg"?".jpg":".png",n=String(t||"image").replace(/\.[^.]+$/,"");try{return new File([e],n+r,{type:e.type})}catch{return e}}async function fo(e,t){let r=e.files&&e.files[0];if(!r)return;let n=e.closest("[data-hcms-path]");if(!n)return;let i=n.getAttribute("data-hcms-path")||"";ze(n,null);let o=await uo(r,n);if(!o||t.closed){pe(e);return}let a=o.file,s=o.dataURL||null,l=W("uploadFileBasic"),c=null;if(typeof l=="function")try{let u=await l(a);c=u&&u.uploads&&u.uploads[0]&&u.uploads[0].url}catch(u){if(t.closed){pe(e);return}ze(n,u&&u.message||"Upload failed"),t.dispatch?.("hcms:error",{error:u,path:i}),pe(e);return}if(t.closed){pe(e);return}if(c||(c=s||ko(a)),!c){pe(e);return}ze(n,null),un(n,c,a.name),re(X(t),{path:i,structural:!1},t),pe(e)}function go(e,t){let r=e.closest("[data-hcms-path]");if(!r)return;let n=r.getAttribute("data-hcms-path")||"";un(r,"","");let i=r.querySelector('input[type="file"][data-hcms-upload]');i&&pe(i),ze(r,null),re(X(t),{path:n,structural:!1},t)}function bo(e){return e.querySelector?e.querySelector("img[data-hcms-field], a[data-hcms-field]"):null}function un(e,t,r){let n=bo(e);if(!n)return;let i=(n.tagName||"").toUpperCase();i==="IMG"?n.src=t||"":i==="A"&&(n.href=t||"",n.textContent=t?r||Bt(t):"")}function pe(e){try{e.value=""}catch{}}function ko(e){let t=typeof URL<"u"&&URL.createObjectURL?URL:null;if(!t)return"";try{return t.createObjectURL(e)}catch{return""}}function ze(e,t){let r=e.querySelector?e.querySelector(":scope > .hcms-error"):null;r&&(t?(r.textContent=t,r.hidden=!1):(r.textContent="",r.hidden=!0))}function Wt(e,t){let{formRoot:r,pageRules:n}=t,i=r.querySelector(`[data-hcms-path="${To(e)}"]`);if(!i)throw new Error(`hypercms: no element at path "${e}"`);let o=i.querySelector(".hcms-array-items");if(!o)throw new Error(`hypercms: array container missing .hcms-array-items at "${e}"`);let a=ne(e),s=So(n,a),l=Array.isArray(s),c=typeof s=="string"&&s.endsWith("[]");if(!l&&!c)throw new Error(`hypercms: path "${e}" is not an array`);let u=ht(i,"data-hcms-max-items"),p=o.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]");if(i.hasAttribute("data-hcms-no-add")||u!=null&&p.length>=u)return;let d=p.length,f=l?s[1]:s.replace(/\[\]$/,""),k=De(l?f:"string"),T=Wr({shape:l?"object-array-item":"scalar-array-item",itemShape:f,pathArr:[...a,d],data:k,doc:t.doc,itemKey:i.getAttribute("data-hcms-item-tpl")||null});return o.appendChild(T),Ce(T,t.doc),Gt(i),Re(`Add ${e}`,()=>re(X(t),{path:e,structural:!0},t))}function yo(e,t,r){let n=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]');if(!n||n.hasAttribute("data-hcms-no-reorder"))return;let i=n.querySelector(".hcms-array-items");if(!i)return;let o=Array.from(i.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),a=o.indexOf(e);if(a<0)return;let s=a+t;if(s<0||s>=o.length)return;let l=e.querySelector(`[data-hcms-action="${t<0?"move-up":"move-down"}"]`);return t<0?i.insertBefore(e,o[s]):i.insertBefore(e,o[s].nextSibling),Yt(i),Gt(n),l&&typeof l.focus=="function"&&e.querySelector(`[data-hcms-action="${t<0?"move-up":"move-down"}"]`)?.focus?.(),Re(`Reorder ${n.getAttribute("data-hcms-path")||""}`,()=>re(X(r),{path:n.getAttribute("data-hcms-path")||"",structural:!0},r))}var ut="Delete this item?";function vo(e,t){let r=e&&e.getAttribute("data-hcms-confirm-remove");if(r!=null)return/^(off|false|no|0)$/i.test(r.trim())?null:r||ut;let n=t&&t.confirmRemove;return n===!1?null:typeof n=="string"?n||ut:n===!0||e&&e.getAttribute("data-hcms-shape")==="object-array"?ut:null}function xo(e,t){let r=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]'),n=vo(r,t);if(n==null)return Te(e,t);let i=W("consent")||typeof window<"u"&&window.consent;typeof i=="function"?Promise.resolve(i(n)).then(()=>Te(e,t),()=>{}):typeof window<"u"&&typeof window.confirm=="function"?window.confirm(n)&&Te(e,t):Te(e,t)}function Te(e,t){let r=e.getAttribute("data-hcms-path")||"",n=e.parentElement,i=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]');if(!i?.hasAttribute("data-hcms-no-remove")){if(i){let o=ht(i,"data-hcms-min-items"),a=i.querySelector(".hcms-array-items"),s=a?a.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]").length:0;if(o!=null&&s<=o)return}return e.remove(),n&&Yt(n),i&&Gt(i),Re(`Remove ${r}`,()=>re(X(t),{path:r,structural:!0},t))}}function re(e,t,r){let n=Ue(e);if(n===r.lastFingerprint)return{ok:!0,skipped:!0};let i=sn(r.pageRoot,r.pageRules,e,{observerHandle:r.observerHandle,shellRoot:r.shellRoot,structural:!!t.structural,structuralPath:t.path||null});return i.ok?(r.lastFingerprint=n,r.lastData=e,dn(r,null),r.dispatch?.("hcms:change",{data:e,path:t.path,structural:!!t.structural}),r.onChange?.(e,t)):(dn(r,Ao(i.error,t.path)),r.dispatch?.("hcms:error",{error:i.error,attemptedData:e}),r.onError?.(i.error)),i}function X(e){let t=K.extract(e.formRoot,e.formRules);return le(t,e.formRules)}function le(e,t){if(t==null||e==null)return e;if(typeof t=="string")return t.endsWith("@checked")?e===!0||e==="true":e;if(Array.isArray(t)){if(!Array.isArray(e))return e;let[,r]=t;return e.map(n=>le(n,r))}if(typeof t=="object"){if(typeof e!="object"||Array.isArray(e))return e;let r={};for(let[n,i]of Object.entries(t))r[n]=le(e[n],i);return r}return e}function dn(e,t){e.lastErrors=t&&t.length?t:null,Kt(e)}function Kt(e){if(wo(e),e.errorEl&&(e.errorEl.textContent="",e.errorEl.hidden=!0),!e.lastErrors)return;let t=[];for(let{message:r,path:n}of e.lastErrors){if(n!=null&&n!==""){let i=_o(e.formRoot,n);if(i){i.textContent=i.textContent?`${i.textContent}
150
+ `},lo=["@scalar","@object","@scalar-array","@scalar-array-item","@object-array","@object-array-item"];function ht(e){let t=e.head||e.documentElement;if(t)for(let r of lo)un(e,t,r)}function er(e,t){if(!sn[t])return null;let r=e&&(e.head||e.documentElement);return r?un(e,r,t):null}var nn={src:"@image",checked:"@checkbox",innerHTML:"@richtext"},dt={image:"@image",file:"@file",checkbox:"@checkbox",toggle:"@toggle",select:"@select",radio:"@radio",textarea:"@textarea",number:"@number",richtext:"@richtext"},co=new Set([...Object.values(dt),"@chips","@chips-item"]);function Ze(e,t,r,n){if(typeof e!="string")return"@scalar";let i=Z(e),o=gt(e,i,r,n),a=bt(o,t,"data-hcms-component");if(a&&dt[a]){let s=dt[a],l=Array.isArray(r)&&r.some(c=>c==="*"||typeof c=="number");return s==="@number"&&!on(e,i,t,l,o).every(mo)||(s==="@checkbox"||s==="@toggle")&&(i<0||e.slice(i+1)!=="checked")&&!on(e,i,t,l,o).every(ho)?"@scalar":s}if(i>=0){let s=e.slice(i+1);if(nn[s])return nn[s]}return"@scalar"}function an(e,t,r,n){if(typeof e!="string")return null;let i=Z(e),o=bt(gt(e,i,r,n),t,"data-hcms-component");return o&&dt[o]||null}var uo=/^-?\d+(\.\d+)?([eE][+-]?\d+)?$/;function mo(e){return e==null||e===""?!0:uo.test(String(e))}function ho(e){return e==null||e===""||e==="true"||e==="false"}function on(e,t,r,n,i){if(!r||!r.querySelectorAll)return[];if(!i||i===".")return[];let o=null;try{o=r.querySelectorAll(i)}catch{return[]}let a=t>=0?e.slice(t+1):null,s=[];for(let l of o)if(!(l.closest&&l.closest("[cms-template], [data-hcms-shell]"))&&(a?a==="value"&&"value"in l?s.push(l.value):s.push(l.getAttribute?l.getAttribute(a):null):s.push((l.textContent||"").trim()),!n))break;return s}function pt(e,t){if(typeof e!="string"||!e.endsWith("[]")||!t||!t.querySelector)return null;let r=e.slice(0,-2).trim();if(!r)return null;let n=null;try{n=t.querySelector(r)}catch{return null}let i=n&&n.closest?n.closest("[data-hcms-component]"):null;return(i&&i.getAttribute?i.getAttribute("data-hcms-component"):null)==="chips"?{array:"@chips",item:"@chips-item"}:null}function Ie(e,t,r){let n=e.join("."),i=e.map(o=>typeof o=="number"?"*":o).join(".");return n&&ce(r,n)||i&&i!==n&&ce(r,i)||ce(r,t)}function ft(e,t,r){let n=pt(e,r);if(!n)return null;let i=Ie(t,n.array,r);return i&&i.getAttribute("data-hcms-tpl")===n.array?n:null}function ln(e,t,r,n){if(typeof e!="string")return null;let i=Z(e),o=bt(gt(e,i,r,n),t,"data-hcms-options");if(o==null)return null;let a=o.trim().split(/\s+/).filter(Boolean);return a.length?a:null}function cn(e,t,r,n){if(typeof e!="string")return null;let i=Z(e);return bt(gt(e,i,r,n),t,"data-hcms-crop")}function po(e,t){return t>=0?e.slice(0,t):e}function gt(e,t,r,n){let i=po(e,t);return i&&i!=="."?i:fo(n,r)}function fo(e,t){if(e==null||!Array.isArray(t))return"";let r=[],n=e;for(let i of t){if(n==null||typeof n=="string")break;if(Array.isArray(n)){if(typeof n[0]!="string"||i!=="*"&&typeof i!="number")return"";r.push(n[0]),n=n[1];continue}if(typeof n!="object"||!Object.prototype.hasOwnProperty.call(n,i))return"";n=n[i]}return r.join(" ")}function bt(e,t,r){if(!t||!t.querySelector||!e||e===".")return null;let n=null;try{n=t.querySelector(e)}catch{return null}return n&&n.getAttribute?n.getAttribute(r):null}function kt(e,t){if(!e||t==null)return;r(t,[]);function r(n,i){let o=_e(n);if(o==="scalar"){let a=Ze(n,e,i,t);co.has(a)&&er(e,a);return}if(o==="scalar-array"){let a=pt(n,e);a&&(er(e,a.array),er(e,a.item));return}if(o==="object"){for(let[a,s]of Object.entries(n))r(s,[...i,a]);return}if(o==="object-array"){let a=n[1],s=[...i,"*"];if(a&&typeof a=="object"&&!Array.isArray(a))for(let[l,c]of Object.entries(a))r(c,[...s,l]);else r(a,s)}}}function un(e,t,r){let n=ce(e,r);if(n)return n;let i=e.createElement("template");return i.setAttribute("data-hcms-tpl",r),i.setAttribute("save-remove",""),i.innerHTML=sn[r].trim(),t.appendChild(i),i}function ce(e,t){return!e||!e.querySelector?null:e.querySelector(`template[data-hcms-tpl="${go(t)}"]`)}function go(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}function _e(e){return typeof e=="string"?e.endsWith("[]")?"scalar-array":"scalar":Array.isArray(e)?"object-array":typeof e=="object"&&e!==null?"object":"scalar"}function Qe(e){return e?!!(e.content||e).querySelector("[data-hcms-field]"):!1}var dn={IMG:"src",A:"href"};function yt(e){if(!e)return"value";let t=(e.tagName||"").toUpperCase();return t==="INPUT"?(e.getAttribute("type")||"text").toLowerCase()==="checkbox"?"checked":"value":t==="TEXTAREA"||t==="SELECT"?"value":dn[t]?dn[t]:e.hasAttribute&&e.hasAttribute("contenteditable")?"innerHTML":null}function mn(e,t){let r=(e.tagName||"").toUpperCase(),n=(e.getAttribute&&e.getAttribute("type")||"").toLowerCase(),i=yt(e),a=`${pn(r,n)}[data-hcms-field="${Le(t)}"]`;return r==="INPUT"&&n==="radio"?`${a}:checked@value`:i?`${a}@${i}`:a}function bo(e){let t=(e.tagName||"").toUpperCase(),r=(e.getAttribute&&e.getAttribute("type")||"").toLowerCase(),n=yt(e),o=`${pn(t,r)}[data-hcms-field]`;return t==="INPUT"&&r==="radio"?`${o}:checked@value`:n?`${o}@${n}`:o}function pn(e,t){return e==="INPUT"?t?`input[type="${t}"]`:"input":e==="TEXTAREA"?"textarea":e==="SELECT"?"select":e==="IMG"?"img":e==="A"?"a":':not([data-hcms-shape="scalar"]):not([data-hcms-shape="object"]):not([data-hcms-shape="object-array"]):not([data-hcms-shape="scalar-array"])'}function Le(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var hn=new Set(["__proto__","constructor","prototype"]);function vt(e,t){return r(e,[]);function r(c,d){let b=_e(c);if(b==="scalar")return n(c,d);if(b==="scalar-array")return i(c,d);if(b==="object-array")return o(c,d);if(b==="object"){let u=Object.create(null);for(let[k,y]of Object.entries(c)){if(hn.has(k))throw new Error(`hypercms: rule key "${k}" is forbidden at "${d.join(".")||"<root>"}"`);u[k]=r(y,[...d,k])}return u}return null}function n(c,d){let b=d.length?d[d.length-1]:null,u=typeof b=="string"?b:"__value",k=l(d,u);if(k)return mn(k,u);let y=s(Ze(c,t,d,e),u);return y?mn(y,u):`input[data-hcms-field="${Le(u)}"]@value`}function i(c,d){let b=ft(c,d,t),u=b&&s(b.item,null)||s("@scalar-array-item",null),k=u?bo(u):"input[data-hcms-field]@value";return[a(d,"[data-hcms-array-item]"),k]}function o(c,d){let[,b]=c,u=[...d,"*"],k=a(d,"[data-hcms-card]");if(b&&typeof b=="object"&&!Array.isArray(b)){let y=Object.create(null);for(let[N,q]of Object.entries(b)){if(hn.has(N))throw new Error(`hypercms: rule key "${N}" is forbidden at "${u.join(".")}"`);y[N]=r(q,[...u,N])}return[k,y]}return[k,r(b,[...u,0])]}function a(c,d){let b=c.length?c[c.length-1]:"",u=c.some(N=>N==="*"),k=c.join(".");return`${u?`[data-hcms-field="${Le(b)}"]`:`[data-hcms-path="${Le(k)}"]`} > .hcms-array-items > ${d}`}function s(c,d){if(!t)return null;let b=ce(t,c);if(!b)return null;let u=b.content||b;if(d){let k=u.querySelector(`[data-hcms-field="${Le(d)}"]`);if(k)return k}return u.querySelector("[data-hcms-field]")}function l(c,d){if(!t)return null;let b=c.map(y=>typeof y=="number"?"*":y).join("."),k=[c.join("."),b];for(let y=c.length-1;y>=0;y--){let N=c.slice(0,y).map(q=>typeof q=="number"?"*":q);N.push("*"),k.push(N.join("."))}for(let y of k){if(!y)continue;let N=ce(t,y);if(!N||!Qe(N))continue;let q=N.content||N,H=q.querySelector(`[data-hcms-field="${Le(d)}"]`)||q.querySelector("[data-hcms-field]");if(H)return H}return null}}function tr(e){if(!e)return"";let t=String(e).split(/[?#]/)[0],r=t.split("/").pop()||t;try{return decodeURIComponent(r)}catch{return r}}function xt({pageRules:e,formRules:t,data:r,doc:n}){let i=n.createDocumentFragment(),o=rr(e,[],r,n,e);return o&&i.appendChild(o),i}function gn({shape:e,itemShape:t,pathArr:r,data:n,doc:i,itemKey:o,pageRules:a}){if(e==="object-array-item")return kn(t,r,n,i,a);if(e==="scalar-array-item")return yn(r,n,i,o||null);throw new Error(`hypercms: buildItem called with unknown shape "${e}"`)}function rr(e,t,r,n,i){let o=_e(e);return o==="scalar"?ko(e,t,r,n,i):o==="object"?wo(e,t,r,n,i):o==="object-array"?_o(e,t,r,n,i):o==="scalar-array"?Ao(e,t,r,n):null}function ko(e,t,r,n,i){let o=Ze(e,n,t,i),a=Ie(t,o,n);if(!a)throw new Error(`hypercms: missing template for scalar at "${t.join(".")}"`);let s=an(e,n,t,i);s==="@number"&&o==="@scalar"&&console.info(`[hypercms] field "${t.join(".")}" declares component "@number" but its value isn't a plain number; rendering a text input so the value is preserved`),(s==="@checkbox"||s==="@toggle")&&o==="@scalar"&&console.info(`[hypercms] field "${t.join(".")}" declares component "${s}" but its value isn't true/false; rendering a text input so the value is preserved`),bn(a,s===o?s:null,t);let l=je(a,n);Fe(l,t);let c=a.getAttribute?.("data-hcms-tpl");if((o==="@select"||o==="@radio")&&c===o&&yo(l,e,t,r,n,o,i),o==="@image"&&c==="@image"){let d=cn(e,n,t,i);d!=null&&!l.hasAttribute("data-hcms-crop")&&l.setAttribute("data-hcms-crop",d)}return So(l,he(t)),wt(l,he(t)),_t(l,he(t)),An(l,r),o==="@file"&&xo(l),l}function bn(e,t,r){if(!t)return;let n=e.getAttribute?.("data-hcms-tpl");n&&n!==t&&console.info(`[hypercms] field "${r.join(".")}" declares component "${t}" but custom template "${n}" wins`)}function yo(e,t,r,n,i,o,a){let s=ln(t,i,r,a),l=s?[...s]:[],c=n==null?"":String(n);if(c!==""&&!l.includes(c)&&l.unshift(c),!s&&(vo(e,"data-hcms-options required (space-separated values)"),l.length===0)){e.querySelector(".mirk-radio")?.remove();return}if(o==="@select"){let u=e.querySelector("select[data-hcms-field]");if(!u)return;for(let k of l){let y=i.createElement("option");y.value=k,y.textContent=mt(k),u.appendChild(y)}return}let d=e.querySelector(".mirk-radio");if(!d||!d.parentNode)return;let b=nr(r.join("."));for(let u of l){let k=d.cloneNode(!0),y=k.querySelector('input[type="radio"]');y&&(y.value=u,y.name=b);let N=k.querySelector(".mirk-radio__label");N&&(N.textContent=mt(u)),d.parentNode.insertBefore(k,d)}d.remove()}function nr(e){return"hcms-"+String(e).replace(/[^A-Za-z0-9_-]/g,"-")}function vo(e,t){let r=e.querySelector?e.querySelector(".hcms-error"):null;r&&(r.textContent=t,r.hidden=!1)}function xo(e){let t=e.querySelector?e.querySelector("a.mirk-file__name[data-hcms-field]"):null;t&&(t.textContent=tr(t.getAttribute("href")))}function wo(e,t,r,n,i){let o=Ie(t,"@object",n);if(!o)throw new Error(`hypercms: missing template for object at "${t.join(".")}"`);let a=je(o,n);if(Fe(a,t),wt(a,he(t)),_t(a,he(t)),Qe(o))return En(a,e,t),Sn(a,e,r),a;let s=At(a,".hcms-object-fields",o,t);for(let[l,c]of Object.entries(e)){let d=r==null?null:r[l],b=rr(c,[...t,l],d,n,i);b&&s.appendChild(b)}return a}function _o(e,t,r,n,i){let o=Ie(t,"@object-array",n);if(!o)throw new Error(`hypercms: missing template for object-array at "${t.join(".")}"`);let a=je(o,n);Fe(a,t),wt(a,he(t)),_t(a,he(t)),xn(a,o),_n(a,o,t);let s=At(a,".hcms-array-items",o,t),[,l]=e;return(Array.isArray(r)?r:[]).forEach((d,b)=>{let u=kn(l,[...t,b],d,n,i);u&&s.appendChild(u)}),wn(a),a}function kn(e,t,r,n,i){let o=vn(t,"object-array-item",n);if(!o)throw new Error(`hypercms: missing item template for "${t.join(".")}"`);let a=je(o,n);if(a.setAttribute("data-hcms-card",""),a.classList.contains("hcms-card")||a.classList.add("hcms-card"),Fe(a,t),Qe(o))return e&&typeof e=="object"&&!Array.isArray(e)&&(En(a,e,t),Sn(a,e,r)),a;let s=At(a,".hcms-card-fields",o,t);if(e&&typeof e=="object"&&!Array.isArray(e))for(let[l,c]of Object.entries(e)){let d=r==null?null:r[l],b=rr(c,[...t,l],d,n,i);b&&s.appendChild(b)}return a}function Ao(e,t,r,n){let i=pt(e,n),o=ft(e,t,n),a=i?i.array:"@scalar-array",s=Ie(t,a,n);if(!s)throw new Error(`hypercms: missing template for scalar-array at "${t.join(".")}"`);bn(s,i?i.array:null,t);let l=je(s,n);Fe(l,t),wt(l,he(t)),_t(l,he(t)),xn(l,s),_n(l,s,t),o&&l.setAttribute("data-hcms-item-tpl",o.item);let c=At(l,".hcms-array-items",s,t);return(Array.isArray(r)?r:[]).forEach((b,u)=>{let k=yn([...t,u],b,n,o?o.item:null);k&&c.appendChild(k)}),wn(l),l}function yn(e,t,r,n){let i=vn(e,"scalar-array-item",r,n);if(!i)throw new Error(`hypercms: missing item template for "${e.join(".")}"`);let o=je(i,r);return o.setAttribute("data-hcms-array-item",""),o.classList.contains("hcms-array-item")||o.classList.add("hcms-array-item"),Fe(o,e),An(o,t),o}function vn(e,t,r,n){let i=e.map(o=>typeof o=="number"?"*":o).join(".");return ce(r,i)||n&&ce(r,n)||ce(r,"@"+t)}function je(e,t){let r=e.content||e,n=t.createElement("div");return n.appendChild(r.cloneNode(!0)),n.firstElementChild||n}function Fe(e,t){e.setAttribute("data-hcms-path",t.join("."))}function So(e,t){let r=t==null?"":String(t);if(e.matches&&e.matches("[data-hcms-field]")){e.getAttribute("data-hcms-field")||e.setAttribute("data-hcms-field",r);return}(e.querySelectorAll?e.querySelectorAll("[data-hcms-field]"):[]).forEach(i=>{i.getAttribute("data-hcms-field")||i.setAttribute("data-hcms-field",r)})}function wt(e,t){t==null||t===""||!e.setAttribute||e.hasAttribute?.("data-hcms-field")||e.setAttribute("data-hcms-field",String(t))}function _t(e,t){if(t==null||t==="")return;(e.querySelectorAll?e.querySelectorAll("[data-hcms-label]"):[]).forEach(n=>{(n.textContent||"").trim()===""&&(n.textContent=mt(String(t)))})}function xn(e,t){["data-hcms-no-add","data-hcms-no-remove","data-hcms-no-reorder"].forEach(r=>{t.hasAttribute(r)&&e.setAttribute(r,"")}),["data-hcms-min-items","data-hcms-max-items"].forEach(r=>{t.hasAttribute(r)&&e.setAttribute(r,t.getAttribute(r))})}function wn(e){let t=e.querySelector?e.querySelector(".hcms-array-items"):null;if(!t)return;let r=Array.from(t.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),n=r.length,i=fn(e,"data-hcms-max-items"),o=fn(e,"data-hcms-min-items"),a=e.hasAttribute("data-hcms-no-add"),s=e.hasAttribute("data-hcms-no-remove"),l=e.hasAttribute("data-hcms-no-reorder"),c=e.querySelector('[data-hcms-action="add"]');c&&(c.hidden=a||i!=null&&n>=i),r.forEach((d,b)=>{let u=d.querySelector('[data-hcms-action="remove"]');u&&(u.hidden=s||o!=null&&n<=o);let k=d.querySelector('[data-hcms-action="move-up"]');k&&(k.hidden=l||b===0);let y=d.querySelector('[data-hcms-action="move-down"]');y&&(y.hidden=l||b===n-1)})}function fn(e,t){if(!e||!e.hasAttribute(t))return null;let r=parseInt(e.getAttribute(t),10);return Number.isFinite(r)?r:null}function _n(e,t,r){if(e.hasAttribute("data-hcms-no-reorder")||t.hasAttribute("data-hcms-no-reorder"))return;let n=e.querySelector(".hcms-array-items");if(!n)return;let i="hcms-"+r.join(".");n.setAttribute("sortable",i),n.setAttribute("onsorted","hypercmsCommit && hypercmsCommit()")}function he(e){return e.length?e[e.length-1]:null}function An(e,t){let r=Eo(e);if(r.length!==0)for(let n of r)Cn(n,t)}function Eo(e){if(!e)return[];let t=[];return e.matches?.("[data-hcms-field]")&&Co(e)&&t.push(e),(e.querySelectorAll?e.querySelectorAll("input[data-hcms-field], textarea[data-hcms-field], select[data-hcms-field], img[data-hcms-field], a[data-hcms-field], [contenteditable][data-hcms-field]"):[]).forEach(n=>t.push(n)),t}function Co(e){let t=(e.tagName||"").toUpperCase();return!!(t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||t==="IMG"||t==="A"||e.hasAttribute?.("contenteditable"))}function Sn(e,t,r){(e.querySelectorAll?e.querySelectorAll("[data-hcms-field]"):[]).forEach(i=>{let o=i.getAttribute("data-hcms-field");if(!o)return;if(!t||typeof t!="object"||!(o in t)){console.warn(`[hypercms] inline template field "${o}" is not in the rule shape; ignoring`);return}let a=r==null?null:r[o];Cn(i,a)})}function En(e,t,r){if(!e.querySelectorAll)return;e.querySelectorAll("[data-hcms-field]").forEach(i=>{let o=i.getAttribute("data-hcms-field");if(!o||t&&typeof t=="object"&&!(o in t))return;let a=[...r,o].join(".");i.setAttribute("data-hcms-path",a)})}function At(e,t,r,n){if(!e.querySelector)return e;let i=e.querySelector(t);if(i)return i;let o=r?.getAttribute?.("data-hcms-tpl")||n.join(".");throw new Error(`hypercms: template "${o}" is in slotted mode but has no ${t} element`)}function Cn(e,t){let r=yt(e),n=(e.tagName||"").toUpperCase(),i=(e.getAttribute("type")||"").toLowerCase();if(n==="INPUT"&&i==="radio"){e.checked=e.value!=null&&String(e.value)===String(t??"");return}if(r==="checked"){e.checked=t===!0||t==="true";return}if(r){e[r]=t==null?"":String(t);return}e.textContent=t==null?"":String(t)}var Tn={skip:"[data-hcms-shell]",templateAttr:"cms-template"};function Rn(e,t,r,n={}){let{observerHandle:i,shellRoot:o,structural:a,structuralPath:s}=n;i?.pause?.();try{if(!a)try{return re.apply(e,t,r,Tn),{ok:!0}}catch(b){return{ok:!1,error:b}}let l=To(e,t,s),c=l?Oo(l):null,d=l?null:No(e,o);try{return re.apply(e,t,r,Tn),{ok:!0}}catch(b){return c?Mo(l,c):d&&Io(e,o,d),{ok:!1,error:b}}}finally{i?.resume?.()}}function To(e,t,r){if(!r||!e)return null;let n=me(r),i=[],o=t;for(let a of n){if(typeof o=="string"||o==null||Array.isArray(o))break;if(typeof o=="object"&&a in o){if(i.push(a),o=o[a],Array.isArray(o)||typeof o=="string"&&o.endsWith("[]"))break}else return null}return!Array.isArray(o)&&!(typeof o=="string"&&o.endsWith("[]"))?null:Ro(e,t,i)}function Ro(e,t,r){if(r.length===0)return null;let n=e,i=t;for(let o=0;o<r.length;o++){let a=r[o];if(!i||typeof i!="object"||Array.isArray(i))return null;let s=i[a];if(s==null)return null;if(o===r.length-1){if(Array.isArray(s)){let[l]=s;return n.querySelector?.(l)?.parentElement||null}if(typeof s=="string"&&s.endsWith("[]")){let l=s.slice(0,-2);return n.querySelector?.(l)?.parentElement||null}return null}i=s}return null}function Oo(e){let t=[];for(let r of Array.from(e.childNodes))t.push(r.cloneNode(!0));return t}function Mo(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let r of t)e.appendChild(r)}function No(e,t){let r=[];for(let n of Array.from(e.childNodes))n===t||t&&n.contains?.(t)||r.push(n.cloneNode(!0));return r}function Io(e,t,r){for(let i of Array.from(e.childNodes))i===t||t&&i.contains?.(t)||e.removeChild(i);let n=Lo(e,t);for(let i of r)e.insertBefore(i,n||null)}function Lo(e,t){if(!t)return null;for(let r of Array.from(e.childNodes))if(r===t||r.contains?.(t))return r;return null}var jo={Mutation:(e,t)=>e?.Mutation??t?.Mutation,undo:(e,t)=>e?.undo??t?.undo,onPrepareForSave:(e,t)=>e?.addDocumentTransform??t?.onPrepareForSave,consent:(e,t)=>e?.confirm??t?.consent,RichClay:(e,t)=>e?.RichClay??t?.RichClay,quickcrop:(e,t)=>e?.quickcrop??t?.quickcrop,uploadFileBasic:(e,t)=>e?.uploadFileBasic??t?.uploadFileBasic};function ne(e,t){let r=jo[e];if(!r)throw new Error(`hypercms: unknown platform capability "${e}"`);let n=t||(typeof window<"u"?window:null);return n&&r(n.clay,n.hyperclay)||null}var On=["clay:mutation-ready","hyperclay:mutation-ready"],Mn=["clay:sync-applied","hyperclay:livesync-applied"];function ir(e,t,r){let n=null,i=o=>{n!==null&&n!==o.type||(n=o.type,queueMicrotask(()=>{n=null}),r(o))};for(let o of t)e.addEventListener(o,i);return()=>{for(let o of t)e.removeEventListener(o,i)}}function St(e,t){if(!t||e==null)return e;return r(e);function r(n){if(typeof n=="string"){if(n.endsWith("[]")||Z(n)!==-1)return n;let i=null;try{i=t.querySelector(n)}catch{return n}return i&&i.children.length>0?n+"@innerHTML":n}if(Array.isArray(n))return n;if(n&&typeof n=="object"){let i=Object.create(null);for(let[o,a]of Object.entries(n))i[o]=r(a);return i}return n}}function or(e){if(!e||e.tagName!=="TEXTAREA")return;let t=e.ownerDocument.defaultView||(typeof window<"u"?window:null);t&&t.CSS&&t.CSS.supports&&t.CSS.supports("field-sizing: content")||(e.style.height="auto",e.style.height=e.scrollHeight+"px")}function qe(e,t){if(!e||!e.querySelectorAll)return;e.querySelectorAll("textarea[data-hcms-field]").forEach(or);let r=t&&t.defaultView||(typeof window<"u"?window:null),n=r&&r.richclay&&r.richclay.RichClay||ne("RichClay",r)||(r&&typeof r.RichClay=="function"?r.RichClay:null);n&&e.querySelectorAll("[contenteditable][data-hcms-field]").forEach(i=>{if(i.__hcmsRichclay)return;let o;try{o=new n(i,{inline:!0,hyperclay:!1,toolbar:["bold","italic","link","undo","redo"]})}catch(s){console.warn("[hypercms] richclay activation failed; field stays plain contenteditable",s);return}i.__hcmsRichclay=o;let a=o&&o.squire;a&&typeof a.addEventListener=="function"&&a.addEventListener("input",()=>{let s=r&&r.Event||Event;i.dispatchEvent(new s("input",{bubbles:!0}))})})}var sr=new WeakSet;function $e(e,t){let r=ne("undo");if(!r)return t();r.pause();try{let n=t();return n&&n.ok?r.commitCaptured(e):r.discardCaptured(),n}finally{r.resume()}}function Tt(e){let t=ne("undo");if(!t)return e();t.pause();try{return e()}finally{t.discardCaptured(),t.resume()}}function Ln(e){let{formRoot:t}=e;if(!t||sr.has(t))return;sr.add(t);let r=a=>{let s=a.target;!s||!s.closest||s.closest("[data-hcms-form-root]")&&s.matches("input, textarea, select, [contenteditable][data-hcms-field]")&&(s.tagName==="TEXTAREA"&&or(s),!s.matches('input[type="file"]')&&(!s.closest("[data-hcms-field]")&&!s.hasAttribute?.("data-hcms-field")||Nn(s,e)))},n=a=>{let s=a.target;if(!(!s||!s.closest)&&s.closest("[data-hcms-form-root]")){if(s.matches('input[type="file"][data-hcms-upload]')){zo(s,e);return}s.matches('input[type="checkbox"], input[type="radio"], select')&&Nn(s,e)}},i=a=>{let s=a.target;if(!s||!s.closest)return;let l=s.closest("[data-hcms-action]");if(!l)return;let c=l.getAttribute("data-hcms-action");if(c==="add"||c==="remove"||c==="move-up"||c==="move-down"||c==="clear-upload"){if(!l.closest("[data-hcms-form-root]"))return}else if(c==="close"&&!l.closest("[data-hcms-shell]"))return;if(c==="add"){let d=l.closest("[data-hcms-path]");if(!d)return;let b=d.getAttribute("data-hcms-path");ar(b,e)}else if(c==="remove"){let d=l.closest("[data-hcms-card], [data-hcms-array-item]");if(!d)return;Go(d,e)}else if(c==="move-up"||c==="move-down"){let d=l.closest("[data-hcms-card], [data-hcms-array-item]");if(!d)return;Wo(d,c==="move-up"?-1:1,e)}else c==="clear-upload"?Uo(l,e):c==="close"&&e.onCloseRequested?.()},o=t.ownerDocument;o.addEventListener("input",r,!0),o.addEventListener("change",n,!0),o.addEventListener("click",i,!0),e.detachEvents=()=>{o.removeEventListener("input",r,!0),o.removeEventListener("change",n,!0),o.removeEventListener("click",i,!0),sr.delete(t)}}var Fo=new Set(["value","checked"]);function qo(e,t){if(!t)return null;let r=me(t);if(r.some(l=>typeof l=="number"||l==="*"))return null;let n=we(e.pageRules,r);if(typeof n!="string")return null;let i=re.ruleAttrIndex(n);if(i===-1)return null;let o=n.slice(i+1);if(!Fo.has(o))return null;let a=n.slice(0,i),s=a?e.pageRoot.querySelector(a):e.pageRoot;return s?{el:s,prop:o,oldValue:s[o]}:null}function Nn(e,t){let n=(e.closest("[data-hcms-field]")||e).closest("[data-hcms-path]")?.getAttribute("data-hcms-path")||"",i=qo(t,n);if(de(ae(t),{path:n,structural:!1},t),i){let o=ne("undo");o&&typeof o.recordValue=="function"&&o.recordValue(i.el,{prop:i.prop,oldValue:i.oldValue,newValue:i.el[i.prop]})}}var Do={type:"image/webp",quality:.85,maxWidth:2048,maxHeight:2048};async function $o(e,t){let r=t&&t.getAttribute?t.getAttribute("data-hcms-crop"):null;if(r==null)return{file:e};let n=ne("quickcrop");if(typeof n!="function")return{file:e};try{let i=await n(e,{aspect:Bo(r),...Do});return i===null?null:{file:Po(i.blob,e.name),dataURL:i.dataURL}}catch(i){return et(t,i&&i.message||"Crop failed"),null}}function Bo(e){let t=String(e??"").trim().toLowerCase();if(t===""||t==="free")return null;let r=t.match(/^(\d+(?:\.\d+)?)\s*[:/]\s*(\d+(?:\.\d+)?)$/);if(!r)return null;let n=parseFloat(r[1]),i=parseFloat(r[2]);return!n||!i?null:n/i}function Po(e,t){let r=e.type==="image/webp"?".webp":e.type==="image/jpeg"?".jpg":".png",n=String(t||"image").replace(/\.[^.]+$/,"");try{return new File([e],n+r,{type:e.type})}catch{return e}}async function zo(e,t){let r=e.files&&e.files[0];if(!r)return;let n=e.closest("[data-hcms-path]");if(!n)return;let i=n.getAttribute("data-hcms-path")||"";et(n,null);let o=await $o(r,n);if(!o||t.closed){Ae(e);return}let a=o.file,s=o.dataURL||null,l=ne("uploadFileBasic"),c=null;if(typeof l=="function")try{let d=await l(a);c=d&&d.uploads&&d.uploads[0]&&d.uploads[0].url}catch(d){if(t.closed){Ae(e);return}et(n,d&&d.message||"Upload failed"),t.dispatch?.("hcms:error",{error:d,path:i}),Ae(e);return}if(t.closed){Ae(e);return}if(c||(c=s||Vo(a)),!c){Ae(e);return}et(n,null),jn(n,c,a.name),de(ae(t),{path:i,structural:!1},t),Ae(e)}function Uo(e,t){let r=e.closest("[data-hcms-path]");if(!r)return;let n=r.getAttribute("data-hcms-path")||"";jn(r,"","");let i=r.querySelector('input[type="file"][data-hcms-upload]');i&&Ae(i),et(r,null),de(ae(t),{path:n,structural:!1},t)}function Ho(e){return e.querySelector?e.querySelector("img[data-hcms-field], a[data-hcms-field]"):null}function jn(e,t,r){let n=Ho(e);if(!n)return;let i=(n.tagName||"").toUpperCase();i==="IMG"?n.src=t||"":i==="A"&&(n.href=t||"",n.textContent=t?r||tr(t):"")}function Ae(e){try{e.value=""}catch{}}function Vo(e){let t=typeof URL<"u"&&URL.createObjectURL?URL:null;if(!t)return"";try{return t.createObjectURL(e)}catch{return""}}function et(e,t){let r=e.querySelector?e.querySelector(":scope > .hcms-error"):null;r&&(t?(r.textContent=t,r.hidden=!1):(r.textContent="",r.hidden=!0))}function ar(e,t){let{formRoot:r,pageRules:n}=t,i=r.querySelector(`[data-hcms-path="${ts(e)}"]`);if(!i)throw new Error(`hypercms: no element at path "${e}"`);let o=i.querySelector(".hcms-array-items");if(!o)throw new Error(`hypercms: array container missing .hcms-array-items at "${e}"`);let a=me(e),s=Zo(n,a),l=Array.isArray(s),c=typeof s=="string"&&s.endsWith("[]");if(!l&&!c)throw new Error(`hypercms: path "${e}" is not an array`);let d=Ct(i,"data-hcms-max-items"),b=o.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]");if(i.hasAttribute("data-hcms-no-add")||d!=null&&b.length>=d)return;let u=b.length,k=l?s[1]:s.replace(/\[\]$/,""),y=Xe(l?k:"string"),N=gn({shape:l?"object-array-item":"scalar-array-item",itemShape:k,pathArr:[...a,u],data:y,doc:t.doc,itemKey:i.getAttribute("data-hcms-item-tpl")||null,pageRules:n});return o.appendChild(N),qe(N,t.doc),cr(i),$e(`Add ${e}`,()=>de(ae(t),{path:e,structural:!0},t))}function Wo(e,t,r){let n=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]');if(!n||n.hasAttribute("data-hcms-no-reorder"))return;let i=n.querySelector(".hcms-array-items");if(!i)return;let o=Array.from(i.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),a=o.indexOf(e);if(a<0)return;let s=a+t;if(s<0||s>=o.length)return;let l=e.querySelector(`[data-hcms-action="${t<0?"move-up":"move-down"}"]`);return t<0?i.insertBefore(e,o[s]):i.insertBefore(e,o[s].nextSibling),dr(i),cr(n),l&&typeof l.focus=="function"&&e.querySelector(`[data-hcms-action="${t<0?"move-up":"move-down"}"]`)?.focus?.(),$e(`Reorder ${n.getAttribute("data-hcms-path")||""}`,()=>de(ae(r),{path:n.getAttribute("data-hcms-path")||"",structural:!0},r))}var Et="Delete this item?";function Ko(e,t){let r=e&&e.getAttribute("data-hcms-confirm-remove");if(r!=null)return/^(off|false|no|0)$/i.test(r.trim())?null:r||Et;let n=t&&t.confirmRemove;return n===!1?null:typeof n=="string"?n||Et:n===!0||e&&e.getAttribute("data-hcms-shape")==="object-array"?Et:null}function Go(e,t){let r=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]'),n=Ko(r,t);if(n==null)return De(e,t);let i=ne("consent")||typeof window<"u"&&window.consent;typeof i=="function"?Promise.resolve(i(n)).then(()=>De(e,t),()=>{}):typeof window<"u"&&typeof window.confirm=="function"?window.confirm(n)&&De(e,t):De(e,t)}function De(e,t){let r=e.getAttribute("data-hcms-path")||"",n=e.parentElement,i=e.closest('[data-hcms-shape="object-array"], [data-hcms-shape="scalar-array"]');if(!i?.hasAttribute("data-hcms-no-remove")){if(i){let o=Ct(i,"data-hcms-min-items"),a=i.querySelector(".hcms-array-items"),s=a?a.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]").length:0;if(o!=null&&s<=o)return}return e.remove(),n&&dr(n),i&&cr(i),$e(`Remove ${r}`,()=>de(ae(t),{path:r,structural:!0},t))}}function de(e,t,r){let n=tt(e);if(n===r.lastFingerprint)return{ok:!0,skipped:!0};let i=Rn(r.pageRoot,r.pageRules,e,{observerHandle:r.observerHandle,shellRoot:r.shellRoot,structural:!!t.structural,structuralPath:t.path||null});return i.ok?(r.lastFingerprint=n,r.lastData=e,In(r,null),r.dispatch?.("hcms:change",{data:e,path:t.path,structural:!!t.structural}),r.onChange?.(e,t)):(In(r,Xo(i.error,t.path)),r.dispatch?.("hcms:error",{error:i.error,attemptedData:e}),r.onError?.(i.error)),i}function ae(e){let t=re.extract(e.formRoot,e.formRules);return ye(t,e.formRules)}function ye(e,t){if(t==null||e==null)return e;if(typeof t=="string")return t.endsWith("@checked")?e===!0||e==="true":e;if(Array.isArray(t)){if(!Array.isArray(e))return e;let[,r]=t;return e.map(n=>ye(n,r))}if(typeof t=="object"){if(typeof e!="object"||Array.isArray(e))return e;let r={};for(let[n,i]of Object.entries(t))r[n]=ye(e[n],i);return r}return e}function In(e,t){e.lastErrors=t&&t.length?t:null,lr(e)}function lr(e){if(Jo(e),e.errorEl&&(e.errorEl.textContent="",e.errorEl.hidden=!0),!e.lastErrors)return;let t=[];for(let{message:r,path:n}of e.lastErrors){if(n!=null&&n!==""){let i=Yo(e.formRoot,n);if(i){i.textContent=i.textContent?`${i.textContent}
151
151
  ${r}`:r,i.hidden=!1;continue}}t.push(r)}t.length&&e.errorEl&&(e.errorEl.textContent=t.join(`
152
- `),e.errorEl.hidden=!1)}function wo(e){if(e.formRoot)for(let t of e.formRoot.querySelectorAll(".hcms-error"))t.textContent="",t.hidden=!0}function _o(e,t){if(!e)return null;let r=t.split(".");for(;r.length>0;){let n=r.join("."),i=typeof CSS<"u"&&CSS.escape?CSS.escape(n):n.replace(/[^a-zA-Z0-9_\-.*]/g,a=>"\\"+a),o=e.querySelector(`[data-hcms-path="${i}"]`);if(o){for(let a of o.children)if(a.classList&&a.classList.contains("hcms-error"))return a}r.pop()}return null}function Ao(e,t){return e?e.name==="EmptyListInsert"?[{message:"Add a seed item in HTML first.",path:t}]:e.name==="ShapeMismatch"&&Array.isArray(e.mismatches)&&e.mismatches.length?e.mismatches.map(r=>({message:`Shape mismatch: expected ${r.expected}, got ${r.got}`,path:r.path})):[{message:e.message||String(e),path:t}]:[{message:"unknown error",path:t}]}function So(e,t){let r=e;for(let n of t){if(r==null||typeof r=="string")return;if(Array.isArray(r)){if(typeof n!="number"&&n!=="*")return;r=r[1];continue}if(typeof r=="object"){if(typeof n=="number"||!(n in r))return;r=r[n];continue}return}return r}function ht(e,t){if(!e||!e.hasAttribute(t))return null;let r=parseInt(e.getAttribute(t),10);return Number.isFinite(r)?r:null}function Gt(e){if(!e)return;let t=e.querySelector(".hcms-array-items");if(!t)return;let r=Array.from(t.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),n=r.length,i=ht(e,"data-hcms-max-items"),o=ht(e,"data-hcms-min-items"),a=e.hasAttribute("data-hcms-no-add"),s=e.hasAttribute("data-hcms-no-remove"),l=e.hasAttribute("data-hcms-no-reorder"),c=e.querySelector(':scope > .hcms-add, :scope > * > .hcms-add, :scope > [data-hcms-action="add"]');c&&(c.hidden=a||i!=null&&n>=i),r.forEach((u,p)=>{let d=u.querySelector('[data-hcms-action="remove"]');d&&(d.hidden=s||o!=null&&n<=o);let f=u.querySelector('[data-hcms-action="move-up"]');f&&(f.hidden=l||p===0);let k=u.querySelector('[data-hcms-action="move-down"]');k&&(k.hidden=l||p===n-1)})}function Jt(e){!e||!e.querySelectorAll||e.querySelectorAll(".hcms-array-items").forEach(t=>Yt(t))}function Yt(e){let t=e.querySelectorAll?Array.from(e.querySelectorAll('input[type="radio"][data-hcms-field]'),n=>[n,n.checked]):[],r=0;for(let n of e.children){if(!n.matches?.("[data-hcms-card], [data-hcms-array-item]"))continue;let i=n.getAttribute("data-hcms-path");if(!i)continue;let o=i.split(".");o[o.length-1]=String(r);let a=o.join(".");a!==i&&Eo(n,i,a),r++}for(let[n,i]of t)n.checked!==i&&(n.checked=i)}function Eo(e,t,r){let n=e.querySelectorAll("[data-hcms-path]");e.setAttribute("data-hcms-path",r);for(let i of n){let o=i.getAttribute("data-hcms-path");o===t?i.setAttribute("data-hcms-path",r):o&&o.startsWith(t+".")&&i.setAttribute("data-hcms-path",r+o.slice(t.length))}Co(e)}function Co(e){for(let t of e.querySelectorAll('input[type="radio"][data-hcms-field]')){if(!t.name||!t.name.startsWith("hcms-"))continue;let r=t.closest("[data-hcms-path]");r&&(t.name=zt(r.getAttribute("data-hcms-path")))}}function Ue(e){return JSON.stringify(e,(t,r)=>{if(r&&typeof r=="object"&&!Array.isArray(r)){let n=Object.create(null);for(let i of Object.keys(r).sort())n[i]=r[i];return n}return r})}function To(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var Lo={},ft="hcms-shell-styles",Ro="hcms-bundled-styles-installed",Oo='a[href], area[href], button:not([disabled]), input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',Oe=new WeakSet,Xt="";function pn(e){Xt=e}var Mo=0;function hn(e){return String(e).replace(/[&<>"]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[t])}function fn({mountTo:e,side:t="right",overlay:r=!1,showSaveButton:n=!1,title:i="Page content",eyebrow:o="Edit",theme:a=null,doc:s}){gn(s);let l=`hcms-shell-title-${++Mo}`,c=s.createElement("div");c.setAttribute("data-hcms-shell",""),c.setAttribute("save-remove",""),c.setAttribute("save-ignore",""),c.setAttribute("tabindex","-1"),c.setAttribute("role","dialog"),c.setAttribute("aria-modal","true"),c.setAttribute("aria-labelledby",l);let u=a==="dark"?" dark":a==="light"?" light":"";c.className="hcms-shell pixel-quiet hcms-side-"+t+(r?" hcms-overlay":"")+u;let p=hn(i),d=hn(o);c.innerHTML=`
152
+ `),e.errorEl.hidden=!1)}function Jo(e){if(e.formRoot)for(let t of e.formRoot.querySelectorAll(".hcms-error"))t.textContent="",t.hidden=!0}function Yo(e,t){if(!e)return null;let r=t.split(".");for(;r.length>0;){let n=r.join("."),i=typeof CSS<"u"&&CSS.escape?CSS.escape(n):n.replace(/[^a-zA-Z0-9_\-.*]/g,a=>"\\"+a),o=e.querySelector(`[data-hcms-path="${i}"]`);if(o){for(let a of o.children)if(a.classList&&a.classList.contains("hcms-error"))return a}r.pop()}return null}function Xo(e,t){return e?e.name==="EmptyListInsert"?[{message:"Add a seed item in HTML first.",path:t}]:e.name==="ShapeMismatch"&&Array.isArray(e.mismatches)&&e.mismatches.length?e.mismatches.map(r=>({message:`Shape mismatch: expected ${r.expected}, got ${r.got}`,path:r.path})):[{message:e.message||String(e),path:t}]:[{message:"unknown error",path:t}]}function Zo(e,t){let r=e;for(let n of t){if(r==null||typeof r=="string")return;if(Array.isArray(r)){if(typeof n!="number"&&n!=="*")return;r=r[1];continue}if(typeof r=="object"){if(typeof n=="number"||!(n in r))return;r=r[n];continue}return}return r}function Ct(e,t){if(!e||!e.hasAttribute(t))return null;let r=parseInt(e.getAttribute(t),10);return Number.isFinite(r)?r:null}function cr(e){if(!e)return;let t=e.querySelector(".hcms-array-items");if(!t)return;let r=Array.from(t.querySelectorAll(":scope > [data-hcms-card], :scope > [data-hcms-array-item]")),n=r.length,i=Ct(e,"data-hcms-max-items"),o=Ct(e,"data-hcms-min-items"),a=e.hasAttribute("data-hcms-no-add"),s=e.hasAttribute("data-hcms-no-remove"),l=e.hasAttribute("data-hcms-no-reorder"),c=e.querySelector(':scope > .hcms-add, :scope > * > .hcms-add, :scope > [data-hcms-action="add"]');c&&(c.hidden=a||i!=null&&n>=i),r.forEach((d,b)=>{let u=d.querySelector('[data-hcms-action="remove"]');u&&(u.hidden=s||o!=null&&n<=o);let k=d.querySelector('[data-hcms-action="move-up"]');k&&(k.hidden=l||b===0);let y=d.querySelector('[data-hcms-action="move-down"]');y&&(y.hidden=l||b===n-1)})}function ur(e){!e||!e.querySelectorAll||e.querySelectorAll(".hcms-array-items").forEach(t=>dr(t))}function dr(e){let t=e.querySelectorAll?Array.from(e.querySelectorAll('input[type="radio"][data-hcms-field]'),n=>[n,n.checked]):[],r=0;for(let n of e.children){if(!n.matches?.("[data-hcms-card], [data-hcms-array-item]"))continue;let i=n.getAttribute("data-hcms-path");if(!i)continue;let o=i.split(".");o[o.length-1]=String(r);let a=o.join(".");a!==i&&Qo(n,i,a),r++}for(let[n,i]of t)n.checked!==i&&(n.checked=i)}function Qo(e,t,r){let n=e.querySelectorAll("[data-hcms-path]");e.setAttribute("data-hcms-path",r);for(let i of n){let o=i.getAttribute("data-hcms-path");o===t?i.setAttribute("data-hcms-path",r):o&&o.startsWith(t+".")&&i.setAttribute("data-hcms-path",r+o.slice(t.length))}es(e)}function es(e){for(let t of e.querySelectorAll('input[type="radio"][data-hcms-field]')){if(!t.name||!t.name.startsWith("hcms-"))continue;let r=t.closest("[data-hcms-path]");r&&(t.name=nr(r.getAttribute("data-hcms-path")))}}function tt(e){return JSON.stringify(e,(t,r)=>{if(r&&typeof r=="object"&&!Array.isArray(r)){let n=Object.create(null);for(let i of Object.keys(r).sort())n[i]=r[i];return n}return r})}function ts(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var ls={},Rt="hcms-shell-styles",rs="hcms-bundled-styles-installed",ns='a[href], area[href], button:not([disabled]), input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',Be=new WeakSet,mr="";function qn(e){mr=e}var is=0;function Fn(e){return String(e).replace(/[&<>"]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[t])}function Dn({mountTo:e,side:t="right",overlay:r=!1,showSaveButton:n=!1,title:i="Page content",eyebrow:o="Edit",theme:a=null,doc:s}){$n(s);let l=`hcms-shell-title-${++is}`,c=s.createElement("div");c.setAttribute("data-hcms-shell",""),c.setAttribute("save-remove",""),c.setAttribute("save-ignore",""),c.setAttribute("tabindex","-1"),c.setAttribute("role","dialog"),c.setAttribute("aria-modal","true"),c.setAttribute("aria-labelledby",l);let d=a==="dark"?" dark":a==="light"?" light":"";c.className="hcms-shell pixel-quiet hcms-side-"+t+(r?" hcms-overlay":"")+d;let b=Fn(i),u=Fn(o);c.innerHTML=`
153
153
  <div class="hcms-shell-minibar" aria-hidden="true">
154
- <span class="hcms-shell-minibar-title">${p}</span>
154
+ <span class="hcms-shell-minibar-title">${b}</span>
155
155
  <button type="button" class="hcms-shell-close mirk-button mirk-button--small" data-hcms-action="close" aria-label="Close">
156
156
  <span class="mirk-button__label">\xD7</span>
157
157
  </button>
@@ -159,8 +159,8 @@ ${r}`:r,i.hidden=!1;continue}}t.push(r)}t.length&&e.errorEl&&(e.errorEl.textCont
159
159
  <div class="hcms-shell-body">
160
160
  <header class="hcms-shell-header">
161
161
  <div class="hcms-shell-heading">
162
- <div class="hcms-shell-eyebrow">${d}</div>
163
- <h2 class="hcms-shell-title" id="${l}">${p}</h2>
162
+ <div class="hcms-shell-eyebrow">${u}</div>
163
+ <h2 class="hcms-shell-title" id="${l}">${b}</h2>
164
164
  </div>
165
165
  <button type="button" class="hcms-shell-close mirk-button mirk-button--small" data-hcms-action="close" aria-label="Close">
166
166
  <span class="mirk-button__label">\xD7</span>
@@ -175,7 +175,7 @@ ${r}`:r,i.hidden=!1;continue}}t.push(r)}t.length&&e.errorEl&&(e.errorEl.textCont
175
175
  </button>
176
176
  </footer>
177
177
  </div>
178
- `,(e||s.body).appendChild(c);let k=s.body;k.classList.add("hcms-open"),r&&k.classList.add("hcms-overlay"),t==="left"&&k.classList.add("hcms-side-left");let T=jo(c,s),M=Io(c);return{root:c,formRoot:c.querySelector("[data-hcms-form-root]"),noticeEl:c.querySelector(".hcms-shell-notice"),errorEl:c.querySelector(".hcms-shell-error"),saveButton:c.querySelector(".hcms-shell-save"),destroy(){T.detach(),M.detach(),c.remove(),k.classList.remove("hcms-open","hcms-overlay","hcms-side-left")},restoreChrome(){No(s),k.classList.add("hcms-open"),r&&k.classList.add("hcms-overlay"),t==="left"&&k.classList.add("hcms-side-left")}}}function No(e){e&&(e.getElementById(ft)||e.querySelector("style[data-hcms-bundled-styles]")||(Oe.delete(e),gn(e)))}function gn(e){if(e&&!Oe.has(e)){if(e[Ro]){Oe.add(e);return}if(e.getElementById(ft)||e.querySelector("style[data-hcms-bundled-styles]")){Oe.add(e);return}if(Xt){let t=e.createElement("style");t.id=ft,t.setAttribute("save-remove",""),t.setAttribute("save-ignore",""),t.textContent=Xt,(e.head||e.documentElement).appendChild(t),Oe.add(e);return}try{let t=new URL("./theme.generated.css",Lo.url).href,r=e.createElement("link");r.rel="stylesheet",r.id=ft,r.setAttribute("save-remove",""),r.setAttribute("save-ignore",""),r.href=t,(e.head||e.documentElement).appendChild(r),Oe.add(e)}catch{console.warn("hypercms: shell stylesheet not applied \u2014 cssText is empty and the co-located theme fallback is unavailable. Call installStyles(themeText) before opening the CMS.")}}}function Io(e){let t=e.querySelector(".hcms-shell-body"),r=e.querySelector(".hcms-shell-header");if(!t||!r||typeof t.addEventListener!="function")return{detach(){}};let n=()=>{let i=(r.offsetHeight||0)-12;e.classList.toggle("is-condensed",t.scrollTop>i)};return t.addEventListener("scroll",n,{passive:!0}),n(),{detach(){t.removeEventListener("scroll",n)}}}function jo(e,t){function r(n){if(n.key!=="Tab"||!e.contains(t.activeElement))return;let i=Array.from(e.querySelectorAll(Oo));if(i.length===0)return;let o=i[0],a=i[i.length-1];n.shiftKey&&t.activeElement===o?(n.preventDefault(),a.focus()):!n.shiftKey&&t.activeElement===a&&(n.preventDefault(),o.focus())}return t.addEventListener("keydown",r),{detach:()=>t.removeEventListener("keydown",r)}}var Fo="[hypercms]",bn={skip:"[data-hcms-shell]",templateAttr:"cms-template"},kn={skip:"[data-hcms-shell]",templateAttr:null},Zt=class extends Error{constructor(t,r,n){super(`hypercms: rule at "${t}" has an invalid CSS selector: "${r}"`),this.name="InvalidRuleSelector",this.path=t,this.selector=r,this.cause=n}};function bt(e,t){let r=[],n=[];return Qt(e,t,[],r,n),{missing:Bo(r),twins:Po(n)}}function Qt(e,t,r,n,i){if(typeof t=="string"){let o=qo(t);if(!o)return;let a=gt(e,o,bn,r);if(t.endsWith("[]")){a.length===0&&gt(e,o,kn,r).length===0&&n.push(He(r));return}a.length===0?n.push(He(r)):a.length>1&&i.push({path:He(r),count:a.length});return}if(Array.isArray(t)){let[o,a]=t;if(typeof o!="string"||!o)return;let s=gt(e,o,bn,r);if(s.length===0){gt(e,o,kn,r).length===0&&n.push(He(r));return}for(let l of s)Qt(l,a,[...r,"*"],n,i);return}if(t&&typeof t=="object")for(let[o,a]of Object.entries(t))Qt(e,a,[...r,o],n,i)}function gt(e,t,r,n){try{return te.find(e,t,r)}catch(i){throw new Zt(He(n),t,i)}}function qo(e){if(e==="."||e.startsWith("@"))return null;if(e.endsWith("[]"))return e.slice(0,-2)||null;let t=e.lastIndexOf("@");return(t===-1?e:e.slice(0,t))||null}function kt(e){Do(e),$o(e)}function Do(e){let t=e.noticeEl;if(!t)return;let r=e.unresolved&&e.unresolved.missing||[];if(r.length===0){t.textContent="",t.hidden=!0;return}let n=r.length===1?"1 field no longer matches this page":`${r.length} fields no longer match this page`;t.textContent=`${n}: ${r.join(", ")}`,t.hidden=!1}function $o(e){let t=e.unresolved&&e.unresolved.twins||[],r=t.map(n=>`${n.path}:${n.count}`).join("|");if(r!==e.lastTwinSignature){e.lastTwinSignature=r;for(let{path:n,count:i}of t)console.warn(`${Fo} "${n}" matches ${i} elements; edits go to the first one.`)}}function Bo(e){return[...new Set(e)]}function Po(e){let t=new Map;for(let r of e){let n=t.get(r.path);(!n||r.count>n.count)&&t.set(r.path,r)}return[...t.values()]}function He(e){return e.length?e.join("."):"(whole page)"}var zo={skip:"[data-hcms-shell]",templateAttr:"cms-template"};function yt(e,{ignoreActiveValue:t}={}){let r=K.findRules(e.doc,e.rulesSource||"cms");r&&(e.pageRules=e.richText?mt(r.rules,e.pageRoot):r.rules,e.rulesTagNode=r.tagNode),et(e.doc),it(e.doc,e.pageRules),e.formRules=st(e.pageRules,e.doc),e.unresolved=bt(e.pageRoot,e.pageRules);let n=le(K.extract(e.pageRoot,e.pageRules,zo),e.pageRules),i=at({pageRules:e.pageRules,formRules:e.formRules,data:n,doc:e.doc});Xe(e.formRoot,i,{ignoreActiveValue:t}),Ce(e.formRoot,e.doc),Kt(e),kt(e),e.updateFingerprint&&e.updateFingerprint()}function yn({debounce:e=100,onRefresh:t}){let r=W("Mutation");if(!r||typeof r.onAnyChange!="function")throw new Error("hypercms: a mutation hub is required (clay.Mutation or hyperclay.Mutation). Load clayjs or hyperclayjs, or just the mutation utility, before initializing hypercms.");let n=0,i=r.onAnyChange({debounce:e},()=>{n>0||t()});return{unsubscribe:typeof i=="function"?i:()=>{},pause(){n++},resume(){n=Math.max(0,n-1)}}}var Uo="[hypercms]";function vn(e,t){if(!e||!e.querySelectorAll||!t)return;let r=Ho(t);e.querySelectorAll("template[data-hcms-tpl]").forEach(i=>{let o=i.getAttribute("data-hcms-tpl");o&&(o.startsWith("@")||r.has(o)||console.warn(`${Uo} template "${o}" doesn't match any rule path; ignored`))})}function Ho(e){let t=new Set;return r([],e),t;function r(n,i){let o=n.join("."),a=n.map(l=>typeof l=="number"?"*":l).join(".");o&&t.add(o),a&&t.add(a);let s=he(i);if(s==="object")for(let[l,c]of Object.entries(i))r([...n,l],c);else if(s==="object-array"||s==="scalar-array"){let l=[...n,"*"],c=l.map(u=>typeof u=="number"?"*":u).join(".");if(t.add(c),s==="object-array"){let u=i[1];if(u&&typeof u=="object"&&!Array.isArray(u))for(let[p,d]of Object.entries(u))r([...l,p],d)}}}}var xn="hcms-toggle",wn="hcms-toggle-style",Vo=`
178
+ `,(e||s.body).appendChild(c);let y=s.body;y.classList.add("hcms-open"),r&&y.classList.add("hcms-overlay"),t==="left"&&y.classList.add("hcms-side-left");let N=as(c,s),q=ss(c);return{root:c,formRoot:c.querySelector("[data-hcms-form-root]"),noticeEl:c.querySelector(".hcms-shell-notice"),errorEl:c.querySelector(".hcms-shell-error"),saveButton:c.querySelector(".hcms-shell-save"),destroy(){N.detach(),q.detach(),c.remove(),y.classList.remove("hcms-open","hcms-overlay","hcms-side-left")},restoreChrome(){os(s),y.classList.add("hcms-open"),r&&y.classList.add("hcms-overlay"),t==="left"&&y.classList.add("hcms-side-left")}}}function os(e){e&&(e.getElementById(Rt)||e.querySelector("style[data-hcms-bundled-styles]")||(Be.delete(e),$n(e)))}function $n(e){if(e&&!Be.has(e)){if(e[rs]){Be.add(e);return}if(e.getElementById(Rt)||e.querySelector("style[data-hcms-bundled-styles]")){Be.add(e);return}if(mr){let t=e.createElement("style");t.id=Rt,t.setAttribute("save-remove",""),t.setAttribute("save-ignore",""),t.textContent=mr,(e.head||e.documentElement).appendChild(t),Be.add(e);return}try{let t=new URL("./theme.generated.css",ls.url).href,r=e.createElement("link");r.rel="stylesheet",r.id=Rt,r.setAttribute("save-remove",""),r.setAttribute("save-ignore",""),r.href=t,(e.head||e.documentElement).appendChild(r),Be.add(e)}catch{console.warn("hypercms: shell stylesheet not applied \u2014 cssText is empty and the co-located theme fallback is unavailable. Call installStyles(themeText) before opening the CMS.")}}}function ss(e){let t=e.querySelector(".hcms-shell-body"),r=e.querySelector(".hcms-shell-header");if(!t||!r||typeof t.addEventListener!="function")return{detach(){}};let n=()=>{let i=(r.offsetHeight||0)-12;e.classList.toggle("is-condensed",t.scrollTop>i)};return t.addEventListener("scroll",n,{passive:!0}),n(),{detach(){t.removeEventListener("scroll",n)}}}function as(e,t){function r(n){if(n.key!=="Tab"||!e.contains(t.activeElement))return;let i=Array.from(e.querySelectorAll(ns));if(i.length===0)return;let o=i[0],a=i[i.length-1];n.shiftKey&&t.activeElement===o?(n.preventDefault(),a.focus()):!n.shiftKey&&t.activeElement===a&&(n.preventDefault(),o.focus())}return t.addEventListener("keydown",r),{detach:()=>t.removeEventListener("keydown",r)}}var cs="[hypercms]",Bn={skip:"[data-hcms-shell]",templateAttr:"cms-template"},Pn={skip:"[data-hcms-shell]",templateAttr:null},hr=class extends Error{constructor(t,r,n){super(`hypercms: rule at "${t}" has an invalid CSS selector: "${r}"`),this.name="InvalidRuleSelector",this.path=t,this.selector=r,this.cause=n}};function Mt(e,t){let r=[],n=[];return pr(e,t,[],r,n),{missing:hs(r),twins:ps(n)}}function pr(e,t,r,n,i){if(typeof t=="string"){let o=us(t);if(!o)return;let a=Ot(e,o,Bn,r);if(t.endsWith("[]")){a.length===0&&Ot(e,o,Pn,r).length===0&&n.push(rt(r));return}a.length===0?n.push(rt(r)):a.length>1&&i.push({path:rt(r),count:a.length});return}if(Array.isArray(t)){let[o,a]=t;if(typeof o!="string"||!o)return;let s=Ot(e,o,Bn,r);if(s.length===0){Ot(e,o,Pn,r).length===0&&n.push(rt(r));return}for(let l of s)pr(l,a,[...r,"*"],n,i);return}if(t&&typeof t=="object")for(let[o,a]of Object.entries(t))pr(e,a,[...r,o],n,i)}function Ot(e,t,r,n){try{return ue.find(e,t,r)}catch(i){throw new hr(rt(n),t,i)}}function us(e){if(e==="."||e.startsWith("@"))return null;if(e.endsWith("[]"))return e.slice(0,-2)||null;let t=Z(e);return(t===-1?e:e.slice(0,t))||null}function Nt(e){ds(e),ms(e)}function ds(e){let t=e.noticeEl;if(!t)return;let r=e.unresolved&&e.unresolved.missing||[];if(r.length===0){t.textContent="",t.hidden=!0;return}let n=r.length===1?"1 field no longer matches this page":`${r.length} fields no longer match this page`;t.textContent=`${n}: ${r.join(", ")}`,t.hidden=!1}function ms(e){let t=e.unresolved&&e.unresolved.twins||[],r=t.map(n=>`${n.path}:${n.count}`).join("|");if(r!==e.lastTwinSignature){e.lastTwinSignature=r;for(let{path:n,count:i}of t)console.warn(`${cs} "${n}" matches ${i} elements; edits go to the first one.`)}}function hs(e){return[...new Set(e)]}function ps(e){let t=new Map;for(let r of e){let n=t.get(r.path);(!n||r.count>n.count)&&t.set(r.path,r)}return[...t.values()]}function rt(e){return e.length?e.join("."):"(whole page)"}var fs={skip:"[data-hcms-shell]",templateAttr:"cms-template"};function It(e,{ignoreActiveValue:t}={}){let r=re.findRules(e.doc,e.rulesSource||"cms");r&&(e.pageRules=e.richText?St(r.rules,e.pageRoot):r.rules,e.rulesTagNode=r.tagNode),ht(e.doc),kt(e.doc,e.pageRules),e.formRules=vt(e.pageRules,e.doc),e.unresolved=Mt(e.pageRoot,e.pageRules);let n=ye(re.extract(e.pageRoot,e.pageRules,fs),e.pageRules),i=xt({pageRules:e.pageRules,formRules:e.formRules,data:n,doc:e.doc});ut(e.formRoot,i,{ignoreActiveValue:t}),qe(e.formRoot,e.doc),lr(e),Nt(e),e.updateFingerprint&&e.updateFingerprint()}function zn({debounce:e=100,onRefresh:t}){let r=ne("Mutation");if(!r||typeof r.onAnyChange!="function")throw new Error("hypercms: a mutation hub is required (clay.Mutation or hyperclay.Mutation). Load clayjs or hyperclayjs, or just the mutation utility, before initializing hypercms.");let n=0,i=r.onAnyChange({debounce:e},()=>{n>0||t()});return{unsubscribe:typeof i=="function"?i:()=>{},pause(){n++},resume(){n=Math.max(0,n-1)}}}var gs="[hypercms]";function Un(e,t){if(!e||!e.querySelectorAll||!t)return;let r=bs(t);e.querySelectorAll("template[data-hcms-tpl]").forEach(i=>{let o=i.getAttribute("data-hcms-tpl");o&&(o.startsWith("@")||r.has(o)||console.warn(`${gs} template "${o}" doesn't match any rule path; ignored`))})}function bs(e){let t=new Set;return r([],e),t;function r(n,i){let o=n.join("."),a=n.map(l=>typeof l=="number"?"*":l).join(".");o&&t.add(o),a&&t.add(a);let s=_e(i);if(s==="object")for(let[l,c]of Object.entries(i))r([...n,l],c);else if(s==="object-array"||s==="scalar-array"){let l=[...n,"*"],c=l.map(d=>typeof d=="number"?"*":d).join(".");if(t.add(c),s==="object-array"){let d=i[1];if(d&&typeof d=="object"&&!Array.isArray(d))for(let[b,u]of Object.entries(d))r([...l,b],u)}}}}var Hn="hcms-toggle",Vn="hcms-toggle-style",ks=`
179
179
  #hcms-toggle {
180
180
  position: fixed; right: 16px; bottom: 16px; z-index: 2147482900;
181
181
  display: inline-flex; align-items: center; gap: 7px; padding: 9px 14px;
@@ -189,7 +189,7 @@ body.hcms-open #hcms-toggle .hcms-toggle__open { display: none; }
189
189
  body.hcms-open #hcms-toggle .hcms-toggle__close { display: inline; }
190
190
  body.hcms-open:not(.hcms-overlay):not(.hcms-side-left) #hcms-toggle { right: calc(380px + 16px); }
191
191
  body.hcms-open.hcms-overlay #hcms-toggle { display: none; }
192
- `;function Wo({search:e="",cookie:t="",forced:r=null}={}){let n=typeof e=="string"?e:"",i=n.indexOf("?"),o=i===-1?n:n.slice(i+1),a=new URLSearchParams(o).get("editmode");return a?a==="true":r!=null?!!r:/(?:^|;\s*)isAdminOfCurrentResource=[^;]/.test(t)}function Ko({open:e,close:t,isOpen:r},n=document){let i=n.getElementById(xn);if(i)return i;if(!n.getElementById(wn)){let a=n.createElement("style");a.id=wn,a.setAttribute("snapshot-remove",""),a.textContent=Vo,n.head.appendChild(a)}let o=n.createElement("button");return o.type="button",o.id=xn,o.setAttribute("no-save",""),o.setAttribute("snapshot-remove",""),o.setAttribute("save-ignore",""),o.setAttribute("aria-label","Toggle content editor"),o.innerHTML='<span class="hcms-toggle__open">Edit content</span><span class="hcms-toggle__close">Close editor</span>',o.addEventListener("click",async()=>{try{r()?t():await e()}catch(a){console.warn("hypercms: toggle failed to open the CMS",a)}}),n.body.appendChild(o),o}function _n(e){if(typeof window>"u"||typeof document>"u")return;let t=window.__hyperclayEditMode!=null?window.__hyperclayEditMode:null;if(!Wo({search:window.location.search,cookie:document.cookie,forced:t}))return;let r=()=>{document.body&&e.hasRules(document)&&Ko(e)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",r,{once:!0}):r()}function En(e){pn(e)}var I={isOpen:!1,ctx:null,shell:null,opts:null};function An(e,t){if(I.ctx!==e)return;let r=t==="livesync";t==="livesync"&&I.shell?.restoreChrome?.(),yt(e,{ignoreActiveValue:r})}var Sn=!1;function Go(){if(Sn)return;let e=W("onPrepareForSave");typeof e=="function"&&(e(t=>{let r=t&&t.querySelector&&t.querySelector("body");r&&r.classList.remove("hcms-open","hcms-overlay","hcms-side-left")}),Sn=!0)}function rr(e={}){if(I.isOpen){console.warn("cms.open() called while already open; ignoring");return}Go();let t=e.pageRoot||(typeof document<"u"?document.body:null);if(!t)throw new Error("hypercms: no pageRoot available");let r=t.ownerDocument||(typeof document<"u"?document:null);if(!r)throw new Error("hypercms: no document available");let n=e.rules!==void 0?e.rules:"cms",i=K.findRules(r,n);if(!i){let f=typeof n=="string"?`data-rules-name~="${n}"`:"the provided rules object";throw new Error(`hypercms: no rules found for ${f}`)}let o=e.richText!==!1,a=o?mt(i.rules,t):i.rules,s=i.tagNode;et(r),it(r,a),vn(r,a);let l=st(a,r),c=bt(t,a),u=le(K.extract(t,a,{skip:"[data-hcms-shell]",templateAttr:"cms-template"}),a),p=pt(()=>fn({mountTo:e.mountTo||r.body,side:e.side||"right",overlay:!!e.overlay,showSaveButton:!!e.showSaveButton,title:e.title,eyebrow:e.eyebrow,theme:e.theme,doc:r})),d={doc:r,pageRoot:t,pageRules:a,formRules:l,rulesTagNode:s,rulesSource:n,richText:o,formRoot:p.formRoot,shellRoot:p.root,errorEl:p.errorEl,noticeEl:p.noticeEl,unresolved:c,lastTwinSignature:null,lastFingerprint:null,lastData:null,observerHandle:null,undoUnsub:null,livesyncUnsub:null,onChange:e.onChange,onError:e.onError,confirmRemove:e.confirmRemove,previouslyFocused:r.activeElement,dispatch(f,k){let T=r.defaultView&&r.defaultView.CustomEvent||(typeof CustomEvent<"u"?CustomEvent:null);if(!T)return;let M=new T(f,{bubbles:!0,cancelable:f==="hcms:change",detail:k});p.root.dispatchEvent(M)},onCloseRequested(){nr()}};d.updateFingerprint=()=>{d.lastFingerprint=Ue(X(d))};try{let f=at({pageRules:a,formRules:l,data:u,doc:r});p.formRoot.appendChild(f),Ce(p.formRoot,r),kt(d),mn(d),d.updateFingerprint(),d.observerHandle=yn({onRefresh:()=>yt(d)});let k=W("undo");if(k&&typeof k.on=="function"){let M=()=>{if(I.ctx!==d)return;An(d,"undo");let F=le(K.extract(d.pageRoot,d.pageRules,{skip:"[data-hcms-shell]",templateAttr:"cms-template"}),d.pageRules);Ue(F)!==Ue(d.lastData)&&(d.lastData=F,d.onChange?.(F,{path:"",structural:!1}))};k.on("undo",M),k.on("redo",M),d.undoUnsub=()=>{k.off("undo",M),k.off("redo",M)}}let T=()=>An(d,"livesync");d.livesyncUnsub=Ut(r,ln,T),Ve.ctx=d,Yo(r),Jo(p.root),I.isOpen=!0,I.ctx=d,I.shell=p,I.opts=e,d.dispatch("hcms:open",{pageRoot:t})}catch(f){throw d.observerHandle?.unsubscribe?.(),d.undoUnsub?.(),d.livesyncUnsub?.(),d.detachEvents?.(),Ve.ctx===d&&(Ve.ctx=null),pt(()=>p.destroy()),I.isOpen=!1,I.ctx=null,I.shell=null,I.opts=null,f}}function Jo(e){let r=e.querySelector('input:not([disabled]):not([type="hidden"]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex="-1"])');r&&typeof r.focus=="function"&&r.focus()}var Ve={ctx:null};function Yo(e){let t=e.defaultView||(typeof globalThis<"u"?globalThis:null);if(!t)return;let r=function(){let i=Ve.ctx;if(i)return Jt(i.formRoot),Re("Reorder",()=>re(X(i),{path:"",structural:!0},i))};typeof t.hypercmsCommit!="function"&&(t.hypercmsCommit=r),typeof globalThis<"u"&&typeof globalThis.hypercmsCommit!="function"&&(globalThis.hypercmsCommit=r)}var tr="cms";function Xo(e){let t=typeof e=="string"?e:"",r=t.indexOf("?"),n=r===-1?t:t.slice(r+1);if(!n)return t;let i=new URLSearchParams(n);return i.get(tr)!=="true"?t:(i.set(tr,"false"),"?"+i.toString())}function Zo(e){let t=typeof e=="string"?e:"",r=t.indexOf("?"),n=r===-1?t:t.slice(r+1);return n?new URLSearchParams(n).get(tr)==="true":!1}function Qo(){if(typeof window>"u"||!window.location||!window.history||typeof window.history.replaceState!="function")return;let e=window.location.search,t=Xo(e);t!==e&&window.history.replaceState(window.history.state,"",t+window.location.hash)}function nr(){if(!I.isOpen)return;let{ctx:e,shell:t}=I;e.closed=!0;let r=e.previouslyFocused;if(e.dispatch("hcms:close",null),Qo(),e.observerHandle?.unsubscribe?.(),e.undoUnsub?.(),e.livesyncUnsub?.(),e.detachEvents?.(),pt(()=>t.destroy()),I.isOpen=!1,I.ctx=null,I.shell=null,I.opts=null,Ve.ctx=null,r&&typeof r.focus=="function")try{r.focus()}catch{}}function Cn(){I.isOpen&&yt(I.ctx)}function es(){return I.isOpen}var ts={getData(){return I.isOpen?X(I.ctx):null},setValue(e,t){if(!I.isOpen)throw new Error("hypercms: cms is not open");let r=I.ctx,n=ne(e),i=ue(r.pageRules,n);if(i===void 0)throw new Error(`hypercms: no rule at path "${e}"`);if(typeof i!="string"||i.endsWith("[]"))throw new Error(`hypercms: setValue requires a leaf scalar path; "${e}" is not a leaf`);let o=rs(r.formRoot,e);if(!o)throw new Error(`hypercms: no field element at path "${e}"`);ns(o,t,r.formRoot,e),re(X(r),{path:e,structural:!1},r)},addItem(e){if(!I.isOpen)throw new Error("hypercms: cms is not open");Wt(e,I.ctx)},removeItem(e){if(!I.isOpen)throw new Error("hypercms: cms is not open");let t=I.ctx,r=ne(e);if(typeof r[r.length-1]!="number")throw new Error(`hypercms: removeItem requires an item path; "${e}" is not an array index`);let i=ue(t.pageRules,r.slice(0,-1));if(!(Array.isArray(i)||typeof i=="string"&&i.endsWith("[]")))throw new Error(`hypercms: removeItem requires an item path; parent of "${e}" is not an array`);let a=t.formRoot.querySelector(`[data-hcms-path="${or(e)}"]`);if(!a)throw new Error(`hypercms: no element at path "${e}"`);Te(a,t)},refresh:Cn,_commit(){if(!I.isOpen)return;let e=I.ctx;return Jt(e.formRoot),Re("Update",()=>re(X(e),{path:"",structural:!0},e))}};function rs(e,t){let r=or(t),n=`[data-hcms-path="${r}"] input[data-hcms-field], [data-hcms-path="${r}"] textarea[data-hcms-field], [data-hcms-path="${r}"] select[data-hcms-field], [data-hcms-path="${r}"] img[data-hcms-field], [data-hcms-path="${r}"] a[data-hcms-field], [data-hcms-path="${r}"] [contenteditable][data-hcms-field], input[data-hcms-path="${r}"][data-hcms-field], textarea[data-hcms-path="${r}"][data-hcms-field], select[data-hcms-path="${r}"][data-hcms-field], img[data-hcms-path="${r}"][data-hcms-field], a[data-hcms-path="${r}"][data-hcms-field], [contenteditable][data-hcms-path="${r}"][data-hcms-field]`;return e.querySelector(n)}function ns(e,t,r,n){let i=(e.tagName||"").toUpperCase(),o=(e.getAttribute("type")||"").toLowerCase();if(i==="INPUT"&&o==="checkbox"){e.checked=t===!0||t==="true";return}if(i==="INPUT"&&o==="radio"){let a=or(n),s=r.querySelectorAll(`[data-hcms-path="${a}"][data-hcms-field][type="radio"], [data-hcms-path="${a}"] [data-hcms-field][type="radio"]`);s.length?s.forEach(l=>{l.checked=String(l.value)===String(t??"")}):e.checked=String(e.value)===String(t??"");return}if(i==="IMG"){e.src=t==null?"":String(t);return}if(i==="A"){e.href=t==null?"":String(t);return}if(e.hasAttribute&&e.hasAttribute("contenteditable")){e.innerHTML=t==null?"":String(t);return}if("value"in e){e.value=t==null?"":String(t);return}e.textContent=t==null?"":String(t)}var is=250,os=1e4;function ss(){typeof window>"u"||typeof document>"u"||Zo(window.location?window.location.search:"")&&(I.isOpen||as(()=>{if(!I.isOpen)try{rr()}catch(e){console.warn("hypercms: auto-open failed",e)}}))}function er(){return!!document.body&&!!W("Mutation")}function as(e){if(er()){queueMicrotask(e);return}let t=Date.now()+os,r=!1,n=null,i=null,o=()=>{r||(r=!0,n!==null&&clearInterval(n),i&&i())};function a(){if(I.isOpen){o();return}er()&&(o(),e())}i=Ut(document,an,a),n=setInterval(()=>{if(I.isOpen){o();return}if(er()){o(),e();return}Date.now()>=t&&(o(),console.warn("hypercms: ?cms=true auto-open gave up \u2014 no mutation hub appeared. Load clayjs or hyperclayjs (or just the mutation utility) so the CMS can initialize."))},is)}ss();_n({open:rr,close:nr,isOpen:es,hasRules:e=>!!K.findRules(e,"cms")});var ir={open:rr,close:nr,refresh:Cn,api:ts,get isOpen(){return I.isOpen},path:qt,scaffold:De,morphForm:Xe};function or(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var Tn=`/* GENERATED by scripts/build-theme.js from mirk-interface/mirk.css \u2014 DO NOT EDIT.
192
+ `;function ys({search:e="",cookie:t="",forced:r=null}={}){let n=typeof e=="string"?e:"",i=n.indexOf("?"),o=i===-1?n:n.slice(i+1),a=new URLSearchParams(o).get("editmode");return a?a==="true":r!=null?!!r:/(?:^|;\s*)isAdminOfCurrentResource=[^;]/.test(t)}function vs({open:e,close:t,isOpen:r},n=document){let i=n.getElementById(Hn);if(i)return i;if(!n.getElementById(Vn)){let a=n.createElement("style");a.id=Vn,a.setAttribute("snapshot-remove",""),a.textContent=ks,n.head.appendChild(a)}let o=n.createElement("button");return o.type="button",o.id=Hn,o.setAttribute("no-save",""),o.setAttribute("snapshot-remove",""),o.setAttribute("save-ignore",""),o.setAttribute("aria-label","Toggle content editor"),o.innerHTML='<span class="hcms-toggle__open">Edit content</span><span class="hcms-toggle__close">Close editor</span>',o.addEventListener("click",async()=>{try{r()?t():await e()}catch(a){console.warn("hypercms: toggle failed to open the CMS",a)}}),n.body.appendChild(o),o}function Wn(e){if(typeof window>"u"||typeof document>"u")return;let t=window.__hyperclayEditMode!=null?window.__hyperclayEditMode:null;if(!ys({search:window.location.search,cookie:document.cookie,forced:t}))return;let r=()=>{document.body&&e.hasRules(document)&&vs(e)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",r,{once:!0}):r()}function Jn(e){qn(e)}var P={isOpen:!1,ctx:null,shell:null,opts:null};function Kn(e,t){if(P.ctx!==e)return;let r=t==="livesync";t==="livesync"&&P.shell?.restoreChrome?.(),It(e,{ignoreActiveValue:r})}var Gn=!1;function xs(){if(Gn)return;let e=ne("onPrepareForSave");typeof e=="function"&&(e(t=>{let r=t&&t.querySelector&&t.querySelector("body");r&&r.classList.remove("hcms-open","hcms-overlay","hcms-side-left")}),Gn=!0)}function br(e={}){if(P.isOpen){console.warn("cms.open() called while already open; ignoring");return}xs();let t=e.pageRoot||(typeof document<"u"?document.body:null);if(!t)throw new Error("hypercms: no pageRoot available");let r=t.ownerDocument||(typeof document<"u"?document:null);if(!r)throw new Error("hypercms: no document available");let n=e.rules!==void 0?e.rules:"cms",i=re.findRules(r,n);if(!i){let k=typeof n=="string"?`data-rules-name~="${n}"`:"the provided rules object";throw new Error(`hypercms: no rules found for ${k}`)}let o=e.richText!==!1,a=o?St(i.rules,t):i.rules,s=i.tagNode;ht(r),kt(r,a),Un(r,a);let l=vt(a,r),c=Mt(t,a),d=ye(re.extract(t,a,{skip:"[data-hcms-shell]",templateAttr:"cms-template"}),a),b=Tt(()=>Dn({mountTo:e.mountTo||r.body,side:e.side||"right",overlay:!!e.overlay,showSaveButton:!!e.showSaveButton,title:e.title,eyebrow:e.eyebrow,theme:e.theme,doc:r})),u={doc:r,pageRoot:t,pageRules:a,formRules:l,rulesTagNode:s,rulesSource:n,richText:o,formRoot:b.formRoot,shellRoot:b.root,errorEl:b.errorEl,noticeEl:b.noticeEl,unresolved:c,lastTwinSignature:null,lastFingerprint:null,lastData:null,observerHandle:null,undoUnsub:null,livesyncUnsub:null,onChange:e.onChange,onError:e.onError,confirmRemove:e.confirmRemove,previouslyFocused:r.activeElement,dispatch(k,y){let N=r.defaultView&&r.defaultView.CustomEvent||(typeof CustomEvent<"u"?CustomEvent:null);if(!N)return;let q=new N(k,{bubbles:!0,cancelable:k==="hcms:change",detail:y});b.root.dispatchEvent(q)},onCloseRequested(){kr()}};u.updateFingerprint=()=>{u.lastFingerprint=tt(ae(u))};try{let k=xt({pageRules:a,formRules:l,data:d,doc:r});b.formRoot.appendChild(k),qe(b.formRoot,r),Nt(u),Ln(u),u.updateFingerprint(),u.observerHandle=zn({onRefresh:()=>It(u)});let y=ne("undo");if(y&&typeof y.on=="function"){let q=()=>{if(P.ctx!==u)return;Kn(u,"undo");let H=ye(re.extract(u.pageRoot,u.pageRules,{skip:"[data-hcms-shell]",templateAttr:"cms-template"}),u.pageRules);tt(H)!==tt(u.lastData)&&(u.lastData=H,u.onChange?.(H,{path:"",structural:!1}))};y.on("undo",q),y.on("redo",q),u.undoUnsub=()=>{y.off("undo",q),y.off("redo",q)}}let N=()=>Kn(u,"livesync");u.livesyncUnsub=ir(r,Mn,N),nt.ctx=u,_s(r),ws(b.root),P.isOpen=!0,P.ctx=u,P.shell=b,P.opts=e,u.dispatch("hcms:open",{pageRoot:t})}catch(k){throw u.observerHandle?.unsubscribe?.(),u.undoUnsub?.(),u.livesyncUnsub?.(),u.detachEvents?.(),nt.ctx===u&&(nt.ctx=null),Tt(()=>b.destroy()),P.isOpen=!1,P.ctx=null,P.shell=null,P.opts=null,k}}function ws(e){let r=e.querySelector('input:not([disabled]):not([type="hidden"]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex="-1"])');r&&typeof r.focus=="function"&&r.focus()}var nt={ctx:null};function _s(e){let t=e.defaultView||(typeof globalThis<"u"?globalThis:null);if(!t)return;let r=function(){let i=nt.ctx;if(i)return ur(i.formRoot),$e("Reorder",()=>de(ae(i),{path:"",structural:!0},i))};typeof t.hypercmsCommit!="function"&&(t.hypercmsCommit=r),typeof globalThis<"u"&&typeof globalThis.hypercmsCommit!="function"&&(globalThis.hypercmsCommit=r)}var gr="cms";function As(e){let t=typeof e=="string"?e:"",r=t.indexOf("?"),n=r===-1?t:t.slice(r+1);if(!n)return t;let i=new URLSearchParams(n);return i.get(gr)!=="true"?t:(i.set(gr,"false"),"?"+i.toString())}function Ss(e){let t=typeof e=="string"?e:"",r=t.indexOf("?"),n=r===-1?t:t.slice(r+1);return n?new URLSearchParams(n).get(gr)==="true":!1}function Es(){if(typeof window>"u"||!window.location||!window.history||typeof window.history.replaceState!="function")return;let e=window.location.search,t=As(e);t!==e&&window.history.replaceState(window.history.state,"",t+window.location.hash)}function kr(){if(!P.isOpen)return;let{ctx:e,shell:t}=P;e.closed=!0;let r=e.previouslyFocused;if(e.dispatch("hcms:close",null),Es(),e.observerHandle?.unsubscribe?.(),e.undoUnsub?.(),e.livesyncUnsub?.(),e.detachEvents?.(),Tt(()=>t.destroy()),P.isOpen=!1,P.ctx=null,P.shell=null,P.opts=null,nt.ctx=null,r&&typeof r.focus=="function")try{r.focus()}catch{}}function Yn(){P.isOpen&&It(P.ctx)}function Cs(){return P.isOpen}var Ts={getData(){return P.isOpen?ae(P.ctx):null},setValue(e,t){if(!P.isOpen)throw new Error("hypercms: cms is not open");let r=P.ctx,n=me(e),i=we(r.pageRules,n);if(i===void 0)throw new Error(`hypercms: no rule at path "${e}"`);if(typeof i!="string"||i.endsWith("[]"))throw new Error(`hypercms: setValue requires a leaf scalar path; "${e}" is not a leaf`);let o=Rs(r.formRoot,e);if(!o)throw new Error(`hypercms: no field element at path "${e}"`);Os(o,t,r.formRoot,e),de(ae(r),{path:e,structural:!1},r)},addItem(e){if(!P.isOpen)throw new Error("hypercms: cms is not open");ar(e,P.ctx)},removeItem(e){if(!P.isOpen)throw new Error("hypercms: cms is not open");let t=P.ctx,r=me(e);if(typeof r[r.length-1]!="number")throw new Error(`hypercms: removeItem requires an item path; "${e}" is not an array index`);let i=we(t.pageRules,r.slice(0,-1));if(!(Array.isArray(i)||typeof i=="string"&&i.endsWith("[]")))throw new Error(`hypercms: removeItem requires an item path; parent of "${e}" is not an array`);let a=t.formRoot.querySelector(`[data-hcms-path="${vr(e)}"]`);if(!a)throw new Error(`hypercms: no element at path "${e}"`);De(a,t)},refresh:Yn,_commit(){if(!P.isOpen)return;let e=P.ctx;return ur(e.formRoot),$e("Update",()=>de(ae(e),{path:"",structural:!0},e))}};function Rs(e,t){let r=vr(t),n=`[data-hcms-path="${r}"] input[data-hcms-field], [data-hcms-path="${r}"] textarea[data-hcms-field], [data-hcms-path="${r}"] select[data-hcms-field], [data-hcms-path="${r}"] img[data-hcms-field], [data-hcms-path="${r}"] a[data-hcms-field], [data-hcms-path="${r}"] [contenteditable][data-hcms-field], input[data-hcms-path="${r}"][data-hcms-field], textarea[data-hcms-path="${r}"][data-hcms-field], select[data-hcms-path="${r}"][data-hcms-field], img[data-hcms-path="${r}"][data-hcms-field], a[data-hcms-path="${r}"][data-hcms-field], [contenteditable][data-hcms-path="${r}"][data-hcms-field]`;return e.querySelector(n)}function Os(e,t,r,n){let i=(e.tagName||"").toUpperCase(),o=(e.getAttribute("type")||"").toLowerCase();if(i==="INPUT"&&o==="checkbox"){e.checked=t===!0||t==="true";return}if(i==="INPUT"&&o==="radio"){let a=vr(n),s=r.querySelectorAll(`[data-hcms-path="${a}"][data-hcms-field][type="radio"], [data-hcms-path="${a}"] [data-hcms-field][type="radio"]`);s.length?s.forEach(l=>{l.checked=String(l.value)===String(t??"")}):e.checked=String(e.value)===String(t??"");return}if(i==="IMG"){e.src=t==null?"":String(t);return}if(i==="A"){e.href=t==null?"":String(t);return}if(e.hasAttribute&&e.hasAttribute("contenteditable")){e.innerHTML=t==null?"":String(t);return}if("value"in e){e.value=t==null?"":String(t);return}e.textContent=t==null?"":String(t)}var Ms=250,Ns=1e4;function Is(){typeof window>"u"||typeof document>"u"||Ss(window.location?window.location.search:"")&&(P.isOpen||Ls(()=>{if(!P.isOpen)try{br()}catch(e){console.warn("hypercms: auto-open failed",e)}}))}function fr(){return!!document.body&&!!ne("Mutation")}function Ls(e){if(fr()){queueMicrotask(e);return}let t=Date.now()+Ns,r=!1,n=null,i=null,o=()=>{r||(r=!0,n!==null&&clearInterval(n),i&&i())};function a(){if(P.isOpen){o();return}fr()&&(o(),e())}i=ir(document,On,a),n=setInterval(()=>{if(P.isOpen){o();return}if(fr()){o(),e();return}Date.now()>=t&&(o(),console.warn("hypercms: ?cms=true auto-open gave up \u2014 no mutation hub appeared. Load clayjs or hyperclayjs (or just the mutation utility) so the CMS can initialize."))},Ms)}Is();Wn({open:br,close:kr,isOpen:Cs,hasRules:e=>!!re.findRules(e,"cms")});var yr={open:br,close:kr,refresh:Yn,api:Ts,get isOpen(){return P.isOpen},path:Zt,scaffold:Xe,morphForm:ut};function vr(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_\-.*]/g,t=>"\\"+t)}var Xn=`/* GENERATED by scripts/build-theme.js from mirk-interface/mirk.css \u2014 DO NOT EDIT.
193
193
  Source of truth: mirk-interface/mirk.css + src/theme/pixel-quiet.overrides.css.
194
194
  Regenerate with: npm run build:theme */
195
195
 
@@ -1749,4 +1749,4 @@ body.hcms-open.hcms-overlay { overflow: hidden; }
1749
1749
  cursor: pointer;
1750
1750
  }
1751
1751
  .hcms-sr-only[hidden] { display: none; }
1752
- `;typeof window<"u"&&typeof document<"u"&&(function(){if(window.__mirk)return;window.__mirk=!0;let e='<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 4 12 12M12 4 4 12" stroke="currentColor" stroke-width="2" stroke-linecap="square" fill="none"/></svg>';document.addEventListener("click",r=>{let n=r.target.closest(".mirk-number__step");if(!n)return;let i=n.closest(".mirk-number").querySelector("input[type=number]");i&&(n.dataset.step==="up"?i.stepUp():i.stepDown(),i.dispatchEvent(new Event("change",{bubbles:!0})))}),document.addEventListener("input",r=>{let n=r.target.closest(".mirk-slider__input");n&&n.closest(".mirk-slider").style.setProperty("--mirk-value",`${n.value}%`)}),document.addEventListener("change",r=>{let n=r.target.closest(".mirk-file__input");if(!n||!n.files.length)return;let i=n.closest(".mirk-file"),o=i.querySelector(".mirk-file__name");if(!o)return;let a=n.files[0],s=document.createElement("a");if(s.className="mirk-file__name",s.dataset.filled="",s.href=URL.createObjectURL(a),s.target="_blank",s.rel="noopener",s.textContent=a.name,o.replaceWith(s),!i.querySelector(".mirk-file__remove")){let l=document.createElement("button");l.type="button",l.className="mirk-file__remove",l.setAttribute("aria-label","Remove file"),l.innerHTML=e,s.after(l)}}),document.addEventListener("change",r=>{let n=r.target.closest(".mirk-image__input");if(!n||!n.files.length)return;let i=n.closest(".mirk-image"),o=i.querySelector(".mirk-image__preview");if(!o)return;let a=i.querySelector(".mirk-image__placeholder"),s=new FileReader;s.onload=l=>{o.src=l.target.result,o.removeAttribute("hidden"),a&&a.setAttribute("hidden",""),i.querySelector(".mirk-image__thumb")?.removeAttribute("hidden"),i.querySelector(".mirk-image__upload")?.setAttribute("hidden","")},s.readAsDataURL(n.files[0])}),document.addEventListener("click",r=>{let n=r.target.closest(".mirk-file__remove");if(n){let o=n.closest(".mirk-file"),a=o?.querySelector(".mirk-file__input"),s=o?.querySelector(".mirk-file__name");if(a&&(a.value=""),s){let l=document.createElement("span");l.className="mirk-file__name",l.textContent="No file chosen",s.replaceWith(l)}n.remove();return}let i=r.target.closest(".mirk-image__remove");if(i){let o=i.closest(".mirk-image"),a=o?.querySelector(".mirk-image__input"),s=o?.querySelector(".mirk-image__preview");a&&(a.value=""),s&&(s.removeAttribute("src"),s.setAttribute("hidden","")),o?.querySelector(".mirk-image__thumb")?.setAttribute("hidden",""),o?.querySelector(".mirk-image__upload")?.removeAttribute("hidden")}});function t(r,n){let i=document.createElement("span");i.textContent=r;let o=document.createElement("input");o.type="hidden",o.name="tags[]",o.value=r;let a=document.createElement("button");a.type="button",a.className="mirk-tags__remove",a.textContent="\xD7";let s=document.createElement("span");if(s.className="mirk-tags__chip",n){let l=document.createElement("span");l.className="mirk-tags__chip-inner",l.append(i,o,a),s.append(l)}else s.append(i,o,a);return s}document.addEventListener("keydown",r=>{let n=r.target.closest(".mirk-tags__input");if(!n)return;let i=n.closest(".mirk-tags");if(r.key==="Enter"||r.key===","){let o=n.value.trim();if(!o)return;r.preventDefault(),n.before(t(o,i.classList.contains("mirk-tags--round"))),n.value=""}else if(r.key==="Backspace"&&!n.value){let o=i.querySelectorAll(".mirk-tags__chip");o[o.length-1]?.remove()}}),document.addEventListener("click",r=>{let n=r.target.closest(".mirk-tags__remove");if(n){n.closest(".mirk-tags__chip").remove();return}let i=r.target.closest(".mirk-tags");i&&r.target===i&&i.querySelector(".mirk-tags__input")?.focus()}),document.addEventListener("click",r=>{let n=r.target.closest("[data-mirk-chip]");if(!n)return;let i=n.getAttribute("data-mirk-chip");if(i==="open")n.closest(".mirk-chip")?.classList.add("mirk-chip--open");else if(i==="collapse")n.closest(".mirk-chip")?.classList.remove("mirk-chip--open");else if(i==="changes"){let o=n.closest(".mirk-chip__panel")?.classList.toggle("is-changes");n.textContent=o?"(hide changes)":"(view changes)"}}),document.addEventListener("click",r=>{let n=r.target.closest("[data-copy-btn]");if(!n)return;let i=n.closest("[data-copy]");if(!i)return;let o=i.cloneNode(!0);o.querySelectorAll("[data-copy-btn]").forEach(l=>l.remove());let s=i.getAttribute("data-copy")==="text"?o.textContent.replace(/^\s+|\s+$/g,""):o.innerHTML.replace(/\s+data-copy(="[^"]*")?/g,"").replace(/^\s*\n/gm,"").trim();navigator.clipboard.writeText(s).then(()=>{let l=n.textContent;n.textContent="copied",n.dataset.copied="",setTimeout(()=>{n.textContent=l,delete n.dataset.copied},1200)}).catch(()=>{n.textContent="error",setTimeout(()=>{n.textContent="copy"},1200)})})})();En(Tn);var ds=ir,ms={cms:ir};return Fn(us);})();
1752
+ `;typeof window<"u"&&typeof document<"u"&&(function(){if(window.__mirk)return;window.__mirk=!0;let e='<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 4 12 12M12 4 4 12" stroke="currentColor" stroke-width="2" stroke-linecap="square" fill="none"/></svg>';document.addEventListener("click",r=>{let n=r.target.closest(".mirk-number__step");if(!n)return;let i=n.closest(".mirk-number").querySelector("input[type=number]");i&&(n.dataset.step==="up"?i.stepUp():i.stepDown(),i.dispatchEvent(new Event("change",{bubbles:!0})))}),document.addEventListener("input",r=>{let n=r.target.closest(".mirk-slider__input");n&&n.closest(".mirk-slider").style.setProperty("--mirk-value",`${n.value}%`)}),document.addEventListener("change",r=>{let n=r.target.closest(".mirk-file__input");if(!n||!n.files.length)return;let i=n.closest(".mirk-file"),o=i.querySelector(".mirk-file__name");if(!o)return;let a=n.files[0],s=document.createElement("a");if(s.className="mirk-file__name",s.dataset.filled="",s.href=URL.createObjectURL(a),s.target="_blank",s.rel="noopener",s.textContent=a.name,o.replaceWith(s),!i.querySelector(".mirk-file__remove")){let l=document.createElement("button");l.type="button",l.className="mirk-file__remove",l.setAttribute("aria-label","Remove file"),l.innerHTML=e,s.after(l)}}),document.addEventListener("change",r=>{let n=r.target.closest(".mirk-image__input");if(!n||!n.files.length)return;let i=n.closest(".mirk-image"),o=i.querySelector(".mirk-image__preview");if(!o)return;let a=i.querySelector(".mirk-image__placeholder"),s=new FileReader;s.onload=l=>{o.src=l.target.result,o.removeAttribute("hidden"),a&&a.setAttribute("hidden",""),i.querySelector(".mirk-image__thumb")?.removeAttribute("hidden"),i.querySelector(".mirk-image__upload")?.setAttribute("hidden","")},s.readAsDataURL(n.files[0])}),document.addEventListener("click",r=>{let n=r.target.closest(".mirk-file__remove");if(n){let o=n.closest(".mirk-file"),a=o?.querySelector(".mirk-file__input"),s=o?.querySelector(".mirk-file__name");if(a&&(a.value=""),s){let l=document.createElement("span");l.className="mirk-file__name",l.textContent="No file chosen",s.replaceWith(l)}n.remove();return}let i=r.target.closest(".mirk-image__remove");if(i){let o=i.closest(".mirk-image"),a=o?.querySelector(".mirk-image__input"),s=o?.querySelector(".mirk-image__preview");a&&(a.value=""),s&&(s.removeAttribute("src"),s.setAttribute("hidden","")),o?.querySelector(".mirk-image__thumb")?.setAttribute("hidden",""),o?.querySelector(".mirk-image__upload")?.removeAttribute("hidden")}});function t(r,n){let i=document.createElement("span");i.textContent=r;let o=document.createElement("input");o.type="hidden",o.name="tags[]",o.value=r;let a=document.createElement("button");a.type="button",a.className="mirk-tags__remove",a.textContent="\xD7";let s=document.createElement("span");if(s.className="mirk-tags__chip",n){let l=document.createElement("span");l.className="mirk-tags__chip-inner",l.append(i,o,a),s.append(l)}else s.append(i,o,a);return s}document.addEventListener("keydown",r=>{let n=r.target.closest(".mirk-tags__input");if(!n)return;let i=n.closest(".mirk-tags");if(r.key==="Enter"||r.key===","){let o=n.value.trim();if(!o)return;r.preventDefault(),n.before(t(o,i.classList.contains("mirk-tags--round"))),n.value=""}else if(r.key==="Backspace"&&!n.value){let o=i.querySelectorAll(".mirk-tags__chip");o[o.length-1]?.remove()}}),document.addEventListener("click",r=>{let n=r.target.closest(".mirk-tags__remove");if(n){n.closest(".mirk-tags__chip").remove();return}let i=r.target.closest(".mirk-tags");i&&r.target===i&&i.querySelector(".mirk-tags__input")?.focus()}),document.addEventListener("click",r=>{let n=r.target.closest("[data-mirk-chip]");if(!n)return;let i=n.getAttribute("data-mirk-chip");if(i==="open")n.closest(".mirk-chip")?.classList.add("mirk-chip--open");else if(i==="collapse")n.closest(".mirk-chip")?.classList.remove("mirk-chip--open");else if(i==="changes"){let o=n.closest(".mirk-chip__panel")?.classList.toggle("is-changes");n.textContent=o?"(hide changes)":"(view changes)"}}),document.addEventListener("click",r=>{let n=r.target.closest("[data-copy-btn]");if(!n)return;let i=n.closest("[data-copy]");if(!i)return;let o=i.cloneNode(!0);o.querySelectorAll("[data-copy-btn]").forEach(l=>l.remove());let s=i.getAttribute("data-copy")==="text"?o.textContent.replace(/^\s+|\s+$/g,""):o.innerHTML.replace(/\s+data-copy(="[^"]*")?/g,"").replace(/^\s*\n/gm,"").trim();navigator.clipboard.writeText(s).then(()=>{let l=n.textContent;n.textContent="copied",n.dataset.copied="",setTimeout(()=>{n.textContent=l,delete n.dataset.copied},1200)}).catch(()=>{n.textContent="error",setTimeout(()=>{n.textContent="copy"},1200)})})})();Jn(Xn);var qs=yr,Ds={cms:yr};return si($s);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panphora/hyper-cms",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Live edit-in-place CMS sidebar for HTML pages with a hyper-html-api rules tag",
5
5
  "keywords": [
6
6
  "HTML",
@@ -44,8 +44,8 @@
44
44
  "test:all": "npm run test:node && npm run test:browser"
45
45
  },
46
46
  "dependencies": {
47
- "hyper-html-api": "^0.5.2",
48
- "hyper-morph": "^0.4.0"
47
+ "hyper-html-api": "^0.6.4",
48
+ "hyper-morph": "^0.5.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@open-wc/testing": "^4.0.0",
package/src/enhance.js CHANGED
@@ -10,6 +10,7 @@
10
10
  // cms.open({ richText: false }).
11
11
 
12
12
  import { platform } from './platform.js'
13
+ import { ruleAttrIndex } from 'hyper-html-api/engine'
13
14
 
14
15
  export function upgradeRichTextRules(rules, pageRoot) {
15
16
  if (!pageRoot || rules == null) return rules
@@ -18,7 +19,7 @@ export function upgradeRichTextRules(rules, pageRoot) {
18
19
  function walk(rule) {
19
20
  if (typeof rule === 'string') {
20
21
  if (rule.endsWith('[]')) return rule
21
- if (rule.lastIndexOf('@') >= 0) return rule
22
+ if (ruleAttrIndex(rule) !== -1) return rule
22
23
  let el = null
23
24
  try {
24
25
  el = pageRoot.querySelector(rule)
package/src/events.js CHANGED
@@ -149,7 +149,7 @@ function resolveUnobservedProjection(ctx, pathStr) {
149
149
  if (fullPath.some((seg) => typeof seg === 'number' || seg === '*')) return null
150
150
  const rule = getRuleAtPath(ctx.pageRules, fullPath)
151
151
  if (typeof rule !== 'string') return null
152
- const at = rule.lastIndexOf('@')
152
+ const at = engine.ruleAttrIndex(rule)
153
153
  if (at === -1) return null // text projection — observed
154
154
  const prop = rule.slice(at + 1)
155
155
  if (!UNOBSERVED_FIELD_PROPS.has(prop)) return null
@@ -367,6 +367,7 @@ export function onAdd(arrayPath, ctx) {
367
367
  // Component arrays (chips) record their item-template key at build time so
368
368
  // added items keep the same chrome.
369
369
  itemKey: arrayEl.getAttribute('data-hcms-item-tpl') || null,
370
+ pageRules,
370
371
  })
371
372
  slot.appendChild(itemNode)
372
373
  enhanceFields(itemNode, ctx.doc)
@@ -28,14 +28,19 @@ export function fileNameFromUrl(url) {
28
28
 
29
29
  export function buildForm({ pageRules, formRules: _formRules, data, doc }) {
30
30
  const fragment = doc.createDocumentFragment()
31
- const root = buildNode(pageRules, [], data, doc)
31
+ const root = buildNode(pageRules, [], data, doc, pageRules)
32
32
  if (root) fragment.appendChild(root)
33
33
  return fragment
34
34
  }
35
35
 
36
- export function buildItem({ shape, itemShape, pathArr, data, doc, itemKey }) {
36
+ // pageRules rides alongside doc so a scalar bound to its own context element
37
+ // ("." / "@attr") can resolve the row that carries its named control; doc alone
38
+ // cannot answer that, because the row is only knowable from the enclosing array
39
+ // rule. deriveFormRules resolves it from the same pair, which is what keeps the
40
+ // built form and the derived rules in lockstep.
41
+ export function buildItem({ shape, itemShape, pathArr, data, doc, itemKey, pageRules }) {
37
42
  if (shape === 'object-array-item') {
38
- return buildObjectArrayItem(itemShape, pathArr, data, doc)
43
+ return buildObjectArrayItem(itemShape, pathArr, data, doc, pageRules)
39
44
  }
40
45
  if (shape === 'scalar-array-item') {
41
46
  return buildScalarArrayItem(pathArr, data, doc, itemKey || null)
@@ -43,23 +48,23 @@ export function buildItem({ shape, itemShape, pathArr, data, doc, itemKey }) {
43
48
  throw new Error(`hypercms: buildItem called with unknown shape "${shape}"`)
44
49
  }
45
50
 
46
- function buildNode(rule, pathArr, data, doc) {
51
+ function buildNode(rule, pathArr, data, doc, pageRules) {
47
52
  const kind = shapeKindOf(rule)
48
- if (kind === 'scalar') return buildScalar(rule, pathArr, data, doc)
49
- if (kind === 'object') return buildObject(rule, pathArr, data, doc)
50
- if (kind === 'object-array') return buildObjectArray(rule, pathArr, data, doc)
53
+ if (kind === 'scalar') return buildScalar(rule, pathArr, data, doc, pageRules)
54
+ if (kind === 'object') return buildObject(rule, pathArr, data, doc, pageRules)
55
+ if (kind === 'object-array') return buildObjectArray(rule, pathArr, data, doc, pageRules)
51
56
  if (kind === 'scalar-array') return buildScalarArray(rule, pathArr, data, doc)
52
57
  return null
53
58
  }
54
59
 
55
- function buildScalar(rule, pathArr, data, doc) {
60
+ function buildScalar(rule, pathArr, data, doc, pageRules) {
56
61
  // Opt-in components select a richer template off the bound rule (explicit
57
62
  // data-hcms-component, then @prop inference); plain scalars stay @scalar.
58
63
  // A path-bound template override still wins inside resolveTemplate.
59
- const componentKey = componentForScalarRule(rule, doc, pathArr)
64
+ const componentKey = componentForScalarRule(rule, doc, pathArr, pageRules)
60
65
  const tpl = resolveTemplate(pathArr, componentKey, doc)
61
66
  if (!tpl) throw new Error(`hypercms: missing template for scalar at "${pathArr.join('.')}"`)
62
- const declaredKey = declaredComponentKey(rule, doc)
67
+ const declaredKey = declaredComponentKey(rule, doc, pathArr, pageRules)
63
68
  // A value-guard fell back to text: say so, or "where did my number input /
64
69
  // checkbox go" has no answer.
65
70
  if (declaredKey === '@number' && componentKey === '@scalar') {
@@ -81,10 +86,10 @@ function buildScalar(rule, pathArr, data, doc) {
81
86
  // corrupt that UI.
82
87
  const winnerKey = tpl.getAttribute?.('data-hcms-tpl')
83
88
  if ((componentKey === '@select' || componentKey === '@radio') && winnerKey === componentKey) {
84
- populateOptions(node, rule, pathArr, data, doc, componentKey)
89
+ populateOptions(node, rule, pathArr, data, doc, componentKey, pageRules)
85
90
  }
86
91
  if (componentKey === '@image' && winnerKey === '@image') {
87
- const crop = readCropOverride(rule, doc)
92
+ const crop = readCropOverride(rule, doc, pathArr, pageRules)
88
93
  if (crop != null && !node.hasAttribute('data-hcms-crop')) node.setAttribute('data-hcms-crop', crop)
89
94
  }
90
95
  // Stamp leaf input(s) FIRST so the container's data-hcms-field doesn't
@@ -119,8 +124,8 @@ function noteShadowedComponent(tpl, declaredKey, pathArr) {
119
124
  // page value is prepended when it isn't in the list, so opening the editor
120
125
  // never silently changes data. Radio inputs get a per-field name derived from
121
126
  // the path so sibling fields (and array items) never cross-group.
122
- function populateOptions(node, rule, pathArr, data, doc, componentKey) {
123
- const provided = readOptionsOverride(rule, doc)
127
+ function populateOptions(node, rule, pathArr, data, doc, componentKey, pageRules) {
128
+ const provided = readOptionsOverride(rule, doc, pathArr, pageRules)
124
129
  const values = provided ? [...provided] : []
125
130
  const current = data == null ? '' : String(data)
126
131
  if (current !== '' && !values.includes(current)) values.unshift(current)
@@ -192,7 +197,7 @@ function syncFileLeafText(node) {
192
197
  if (a) a.textContent = fileNameFromUrl(a.getAttribute('href'))
193
198
  }
194
199
 
195
- function buildObject(rule, pathArr, data, doc) {
200
+ function buildObject(rule, pathArr, data, doc, pageRules) {
196
201
  const tpl = resolveTemplate(pathArr, '@object', doc)
197
202
  if (!tpl) throw new Error(`hypercms: missing template for object at "${pathArr.join('.')}"`)
198
203
  const node = cloneTemplate(tpl, doc)
@@ -209,13 +214,13 @@ function buildObject(rule, pathArr, data, doc) {
209
214
  const slot = requireSlot(node, '.hcms-object-fields', tpl, pathArr)
210
215
  for (const [k, child] of Object.entries(rule)) {
211
216
  const childData = data == null ? null : data[k]
212
- const childNode = buildNode(child, [...pathArr, k], childData, doc)
217
+ const childNode = buildNode(child, [...pathArr, k], childData, doc, pageRules)
213
218
  if (childNode) slot.appendChild(childNode)
214
219
  }
215
220
  return node
216
221
  }
217
222
 
218
- function buildObjectArray(rule, pathArr, data, doc) {
223
+ function buildObjectArray(rule, pathArr, data, doc, pageRules) {
219
224
  const tpl = resolveTemplate(pathArr, '@object-array', doc)
220
225
  if (!tpl) throw new Error(`hypercms: missing template for object-array at "${pathArr.join('.')}"`)
221
226
  const node = cloneTemplate(tpl, doc)
@@ -229,14 +234,14 @@ function buildObjectArray(rule, pathArr, data, doc) {
229
234
  const [, itemShape] = rule
230
235
  const items = Array.isArray(data) ? data : []
231
236
  items.forEach((itemData, i) => {
232
- const itemNode = buildObjectArrayItem(itemShape, [...pathArr, i], itemData, doc)
237
+ const itemNode = buildObjectArrayItem(itemShape, [...pathArr, i], itemData, doc, pageRules)
233
238
  if (itemNode) slot.appendChild(itemNode)
234
239
  })
235
240
  applyConstraintVisibility(node)
236
241
  return node
237
242
  }
238
243
 
239
- function buildObjectArrayItem(itemShape, pathArr, data, doc) {
244
+ function buildObjectArrayItem(itemShape, pathArr, data, doc, pageRules) {
240
245
  const tpl = resolveItemTemplate(pathArr, 'object-array-item', doc)
241
246
  if (!tpl) throw new Error(`hypercms: missing item template for "${pathArr.join('.')}"`)
242
247
  const node = cloneTemplate(tpl, doc)
@@ -256,7 +261,7 @@ function buildObjectArrayItem(itemShape, pathArr, data, doc) {
256
261
  if (itemShape && typeof itemShape === 'object' && !Array.isArray(itemShape)) {
257
262
  for (const [k, child] of Object.entries(itemShape)) {
258
263
  const childData = data == null ? null : data[k]
259
- const childNode = buildNode(child, [...pathArr, k], childData, doc)
264
+ const childNode = buildNode(child, [...pathArr, k], childData, doc, pageRules)
260
265
  if (childNode) slot.appendChild(childNode)
261
266
  }
262
267
  }
package/src/form-rules.js CHANGED
@@ -112,7 +112,7 @@ export function deriveFormRules(pageRules, doc) {
112
112
  // leaf tag, so an @image field reads img@src and an @file field reads
113
113
  // a@href, while a plain scalar still respects a global @scalar override
114
114
  // (e.g. a <textarea>) instead of assuming <input>.
115
- const shapeEl = findShapeFieldEl(componentForScalarRule(rule, doc, pathArr), fieldKey)
115
+ const shapeEl = findShapeFieldEl(componentForScalarRule(rule, doc, pathArr, pageRules), fieldKey)
116
116
  if (shapeEl) return fieldSelectorFor(shapeEl, fieldKey)
117
117
  return `input[data-hcms-field="${cssEscape(fieldKey)}"]@value`
118
118
  }
package/src/platform.js CHANGED
@@ -4,8 +4,9 @@
4
4
  //
5
5
  // TWO clients provide this and they disagree on names. hyperclayjs owns
6
6
  // window.hyperclay; clayjs owns window.clay and renamed things on the way past
7
- // (onPrepareForSave -> addDocumentTransform, consent -> confirm) while leaving RichClay and
8
- // both upload helpers off its namespace entirely. So this is a capability table
7
+ // (onPrepareForSave -> addDocumentTransform, consent -> confirm). clay.RichClay exists,
8
+ // but quickcrop and uploadFileBasic have no clay equivalent at all, so image crop and
9
+ // file upload silently degrade under clayjs. So this is a capability table
9
10
  // rather than a namespace pointer: `window.clay ?? window.hyperclay` would resolve
10
11
  // to clay, find no onPrepareForSave, and silently stop stripping the CMS's own
11
12
  // chrome out of every save.
@@ -32,16 +33,17 @@ export function platform(name, win) {
32
33
  return read(scope.clay, scope.hyperclay) || null
33
34
  }
34
35
 
35
- // Both spellings of the same signal. clayjs dispatches its own name and mirrors the
36
- // legacy one; it will stop mirroring when it drops the window.hyperclay shim, and
37
- // hyperclayjs only ever dispatches the legacy one. Listening for both is what makes
38
- // this survive that change without a flag day.
36
+ // Both spellings of the same signal. Each client fires exactly one name: clayjs
37
+ // its own, hyperclayjs the legacy one. Listening for both is what lets one build
38
+ // of hypercms ride either client. The name-keyed guard below stays regardless, so
39
+ // a listener on both names still can't double-fire if a client ever dispatches
40
+ // the pair again.
39
41
  export const MUTATION_READY = ['clay:mutation-ready', 'hyperclay:mutation-ready']
40
42
  export const LIVESYNC_APPLIED = ['clay:sync-applied', 'hyperclay:livesync-applied']
41
43
 
42
44
  // Subscribe to every spelling of one signal, delivering the handler ONCE per
43
- // occurrence. clayjs dispatches the pair back to back in the same tick, so a plain
44
- // listener on each name fires the handler twice for one event: two form
45
+ // occurrence. No client dispatches the pair today, but one that did would make a
46
+ // plain listener on each name fire the handler twice for one event: two form
45
47
  // re-extracts, or two open() calls.
46
48
  //
47
49
  // The first name to arrive claims the tick, and only a DIFFERENT name is suppressed
package/src/templates.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { ruleAttrIndex } from 'hyper-html-api/engine'
1
2
  import { getRuleAtPath } from './path.js'
2
3
 
3
4
  export function humanize(key) {
@@ -245,7 +246,7 @@ export function injectComponentTemplate(doc, key) {
245
246
  // workflow) and @checked means checkbox (a text input showing the literal word
246
247
  // "true" helps nobody). @href is NOT inferred: editing a link/URL is far more
247
248
  // common than uploading a file, so an a@href rule stays a plain URL field and
248
- // the file upload is opt-in. Suffix is split like the engine (lastIndexOf('@'),
249
+ // the file upload is opt-in. Suffix is split like the engine (ruleAttrIndex,
249
250
  // see engine/extract.js). Returns a DEFAULT_TEMPLATES key.
250
251
  const PROP_TO_COMPONENT = { src: '@image', checked: '@checkbox', innerHTML: '@richtext' }
251
252
  // data-hcms-component values for scalar rules. "chips" is array-only (below).
@@ -268,10 +269,11 @@ const ON_DEMAND_COMPONENT_KEYS = new Set([
268
269
  '@chips-item',
269
270
  ])
270
271
 
271
- export function componentForScalarRule(rule, doc, pathArr) {
272
+ export function componentForScalarRule(rule, doc, pathArr, pageRules) {
272
273
  if (typeof rule !== 'string') return '@scalar'
273
- const at = rule.lastIndexOf('@')
274
- const override = readElementAttr(scalarSelectorOf(rule, at), doc, 'data-hcms-component')
274
+ const at = ruleAttrIndex(rule)
275
+ const host = hostSelectorOf(rule, at, pathArr, pageRules)
276
+ const override = readElementAttr(host, doc, 'data-hcms-component')
275
277
  if (override && SCALAR_COMPONENT_BY_NAME[override]) {
276
278
  const key = SCALAR_COMPONENT_BY_NAME[override]
277
279
  // Value guards check exactly the elements the engine binds: under an array
@@ -279,13 +281,13 @@ export function componentForScalarRule(rule, doc, pathArr) {
279
281
  // plain scalar binds only the FIRST match — a decorative second element
280
282
  // sharing the selector must not veto the control.
281
283
  const multi = Array.isArray(pathArr) && pathArr.some((s) => s === '*' || typeof s === 'number')
282
- if (key === '@number' && !currentScalarValues(rule, at, doc, multi).every(numberInputCanHold)) {
284
+ if (key === '@number' && !currentScalarValues(rule, at, doc, multi, host).every(numberInputCanHold)) {
283
285
  return '@scalar'
284
286
  }
285
287
  if (
286
288
  (key === '@checkbox' || key === '@toggle') &&
287
289
  (at < 0 || rule.slice(at + 1) !== 'checked') &&
288
- !currentScalarValues(rule, at, doc, multi).every(checkboxCanHold)
290
+ !currentScalarValues(rule, at, doc, multi, host).every(checkboxCanHold)
289
291
  ) {
290
292
  return '@scalar'
291
293
  }
@@ -302,10 +304,10 @@ export function componentForScalarRule(rule, doc, pathArr) {
302
304
  // rule, or null (absent / unknown name / value-guard fallback). Lets the
303
305
  // builder tell "author asked for this" apart from suffix inference when
304
306
  // logging shadowing notices.
305
- export function declaredComponentKey(rule, doc) {
307
+ export function declaredComponentKey(rule, doc, pathArr, pageRules) {
306
308
  if (typeof rule !== 'string') return null
307
- const at = rule.lastIndexOf('@')
308
- const name = readElementAttr(scalarSelectorOf(rule, at), doc, 'data-hcms-component')
309
+ const at = ruleAttrIndex(rule)
310
+ const name = readElementAttr(hostSelectorOf(rule, at, pathArr, pageRules), doc, 'data-hcms-component')
309
311
  return (name && SCALAR_COMPONENT_BY_NAME[name]) || null
310
312
  }
311
313
 
@@ -335,9 +337,8 @@ function checkboxCanHold(value) {
335
337
  // skips: cms-template seeds and the shell are never extracted, so their
336
338
  // values don't get a vote. `multi` mirrors the engine's binding: all matches
337
339
  // under an array (one element per item), only the first match otherwise.
338
- function currentScalarValues(rule, at, doc, multi) {
340
+ function currentScalarValues(rule, at, doc, multi, selector) {
339
341
  if (!doc || !doc.querySelectorAll) return []
340
- const selector = scalarSelectorOf(rule, at)
341
342
  if (!selector || selector === '.') return []
342
343
  let els = null
343
344
  try {
@@ -412,10 +413,10 @@ export function winningScalarArrayComponent(rule, pathArr, doc) {
412
413
  // Option list for @select/@radio: data-hcms-options="low medium high" on the
413
414
  // same page element as data-hcms-component. Space-separated value tokens (the
414
415
  // data-rules-name idiom); labels derive via humanize() like every other label.
415
- export function readOptionsOverride(rule, doc) {
416
+ export function readOptionsOverride(rule, doc, pathArr, pageRules) {
416
417
  if (typeof rule !== 'string') return null
417
- const at = rule.lastIndexOf('@')
418
- const raw = readElementAttr(scalarSelectorOf(rule, at), doc, 'data-hcms-options')
418
+ const at = ruleAttrIndex(rule)
419
+ const raw = readElementAttr(hostSelectorOf(rule, at, pathArr, pageRules), doc, 'data-hcms-options')
419
420
  if (raw == null) return null
420
421
  const tokens = raw.trim().split(/\s+/).filter(Boolean)
421
422
  return tokens.length ? tokens : null
@@ -424,16 +425,61 @@ export function readOptionsOverride(rule, doc) {
424
425
  // Crop opt-in for @image: data-hcms-crop="1:1" | "16:9" | "free" on the page
425
426
  // element. The form-builder copies it onto the built field so the upload path
426
427
  // reads it without a second page lookup.
427
- export function readCropOverride(rule, doc) {
428
+ export function readCropOverride(rule, doc, pathArr, pageRules) {
428
429
  if (typeof rule !== 'string') return null
429
- const at = rule.lastIndexOf('@')
430
- return readElementAttr(scalarSelectorOf(rule, at), doc, 'data-hcms-crop')
430
+ const at = ruleAttrIndex(rule)
431
+ return readElementAttr(hostSelectorOf(rule, at, pathArr, pageRules), doc, 'data-hcms-crop')
431
432
  }
432
433
 
433
434
  function scalarSelectorOf(rule, at) {
434
435
  return at >= 0 ? rule.slice(0, at) : rule
435
436
  }
436
437
 
438
+ // The page element that carries this rule's authoring attributes
439
+ // (data-hcms-component / -options / -crop), and whose values the guards read.
440
+ //
441
+ // A rule that binds its own context element — a lone "." or a leading "@attr" —
442
+ // has no selector of its own: scalarSelectorOf yields "" or ".". Inside a list
443
+ // that context element IS the row, so the element to read is the row, and the
444
+ // row selector is the enclosing array's item selector. That is the "state is
445
+ // content" case (data-status on the card), and without this it can never carry
446
+ // a named control. Outside any list the context is the document root, so there
447
+ // is still no element to read and we return "" — readElementAttr and
448
+ // currentScalarValues both treat that as "nothing declared", exactly as before.
449
+ //
450
+ // The component is chosen per RULE, not per row, so any ONE matching row
451
+ // answers the question; readElementAttr's querySelector taking the first match
452
+ // is correct rather than a shortcut.
453
+ function hostSelectorOf(rule, at, pathArr, pageRules) {
454
+ const own = scalarSelectorOf(rule, at)
455
+ if (own && own !== '.') return own
456
+ return enclosingArraySelector(pageRules, pathArr)
457
+ }
458
+
459
+ // The descendant-joined item selectors of every array rule crossed on the way
460
+ // to pathArr, or "" when the path crosses none (or does not resolve). Mirrors
461
+ // the scope chain hyperclay's resolveControl builds for the same path, so the
462
+ // generator stamps the attribute on exactly the elements read back here.
463
+ function enclosingArraySelector(pageRules, pathArr) {
464
+ if (pageRules == null || !Array.isArray(pathArr)) return ''
465
+ const scope = []
466
+ let node = pageRules
467
+ for (const seg of pathArr) {
468
+ if (node == null || typeof node === 'string') break
469
+ if (Array.isArray(node)) {
470
+ if (typeof node[0] !== 'string') return ''
471
+ if (seg !== '*' && typeof seg !== 'number') return ''
472
+ scope.push(node[0])
473
+ node = node[1]
474
+ continue
475
+ }
476
+ if (typeof node !== 'object') return ''
477
+ if (!Object.prototype.hasOwnProperty.call(node, seg)) return ''
478
+ node = node[seg]
479
+ }
480
+ return scope.join(' ')
481
+ }
482
+
437
483
  // The only branch that reads the page DOM during selection.
438
484
  function readElementAttr(selector, doc, attrName) {
439
485
  if (!doc || !doc.querySelector) return null
@@ -452,12 +498,16 @@ function readElementAttr(selector, doc, attrName) {
452
498
  // same rule shapes as buildTemplateMap; idempotent and author-template-safe.
453
499
  export function injectComponents(doc, pageRules) {
454
500
  if (!doc || pageRules == null) return
455
- walk(pageRules)
501
+ walk(pageRules, [])
456
502
 
457
- function walk(rule) {
503
+ // The path is carried so componentForScalarRule can resolve a context leaf
504
+ // ("." / "@attr") against its enclosing row, the same way the builder does.
505
+ // Without it a row-level named control resolves to @scalar here, its template
506
+ // is never injected, and buildScalar then throws on the missing template.
507
+ function walk(rule, pathArr) {
458
508
  const kind = shapeKindOf(rule)
459
509
  if (kind === 'scalar') {
460
- const key = componentForScalarRule(rule, doc)
510
+ const key = componentForScalarRule(rule, doc, pathArr, pageRules)
461
511
  if (ON_DEMAND_COMPONENT_KEYS.has(key)) injectComponentTemplate(doc, key)
462
512
  return
463
513
  }
@@ -470,15 +520,16 @@ export function injectComponents(doc, pageRules) {
470
520
  return
471
521
  }
472
522
  if (kind === 'object') {
473
- for (const child of Object.values(rule)) walk(child)
523
+ for (const [k, child] of Object.entries(rule)) walk(child, [...pathArr, k])
474
524
  return
475
525
  }
476
526
  if (kind === 'object-array') {
477
527
  const itemShape = rule[1]
528
+ const itemPath = [...pathArr, '*']
478
529
  if (itemShape && typeof itemShape === 'object' && !Array.isArray(itemShape)) {
479
- for (const child of Object.values(itemShape)) walk(child)
530
+ for (const [k, child] of Object.entries(itemShape)) walk(child, [...itemPath, k])
480
531
  } else {
481
- walk(itemShape)
532
+ walk(itemShape, itemPath)
482
533
  }
483
534
  }
484
535
  }
package/src/unresolved.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import domAdapter from 'hyper-html-api/dom'
2
+ import { ruleAttrIndex } from 'hyper-html-api/engine'
2
3
 
3
4
  const PREFIX = '[hypercms]'
4
5
 
@@ -76,11 +77,12 @@ function find(ctx, selector, opts, path) {
76
77
 
77
78
  // Mirrors the engine's scalar parsing: a trailing [] strips, "." and a leading
78
79
  // @ read the context node itself so they can never fail to resolve, and
79
- // otherwise the selector is the part before the LAST @.
80
+ // otherwise the selector is the part before the separator @ (the last one that
81
+ // is not inside brackets or quotes, so a mailto address stays in the selector).
80
82
  function selectorOf(rule) {
81
83
  if (rule === '.' || rule.startsWith('@')) return null
82
84
  if (rule.endsWith('[]')) return rule.slice(0, -2) || null
83
- const at = rule.lastIndexOf('@')
85
+ const at = ruleAttrIndex(rule)
84
86
  return (at === -1 ? rule : rule.slice(0, at)) || null
85
87
  }
86
88