@mapled/vanilla 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/mapled.js +17 -17
- package/dist/mapled.js.sha384 +1 -1
- package/dist/runtime.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<html lang="en">
|
|
14
14
|
<head>
|
|
15
15
|
<title data-mapled-bind="home.headline">Studio Nord</title>
|
|
16
|
-
<script src="https://cdn.jsdelivr.net/npm/@mapled/vanilla@0.
|
|
16
|
+
<script src="https://cdn.jsdelivr.net/npm/@mapled/vanilla@0.4.0/dist/mapled.js" data-mapled-key="mk_live_…" defer></script>
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<h1 data-mapled-bind="home.headline">Websites, built by hand</h1>
|
package/dist/mapled.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
/*! @mapled/vanilla 0.
|
|
2
|
-
"use strict";(()=>{var It=Object.defineProperty;var Ft=(e,t,n)=>t in e?It(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Se=(e,t,n)=>Ft(e,typeof t!="symbol"?t+"":t,n);var Re="mapled-preview",pe="mapled:preview",Dt=/^mpv_[A-Za-z0-9]{16,96}$/,Je=/^mps_[A-Za-z0-9]{16,96}$/,Ye=new WeakMap,_t=4e3;function Ae(){if(typeof window>"u"||typeof document>"u")return null;try{let e=window.sessionStorage,t=Ye.get(window);return t||Ye.set(window,t={memory:null,exchanging:null,epoch:0}),{location:window.location,history:window.history,sessionStorage:e,page:t}}catch{return null}}function jt(e){try{let t=e.getItem(pe);if(!t)return null;let n=JSON.parse(t),r=typeof n?.expiresAt=="string"?Date.parse(n.expiresAt):NaN;return typeof n?.draftToken!="string"||!Je.test(n.draftToken)||!(r>Date.now())?(e.removeItem(pe),null):{draftToken:n.draftToken,expiresAt:n.expiresAt}}catch{return null}}function K(e){let t=jt(e.sessionStorage);if(t)return t;let n=e.page.memory;return n&&Date.parse(n.expiresAt)>Date.now()?n:(e.page.memory=null,null)}function B(){let e=Ae();return e?K(e):null}function Qe(e){let t;try{t=new URL(e.location.href)}catch{return null}let n=t.searchParams.get(Re);if(n===null)return null;t.searchParams.delete(Re);try{e.history.replaceState(e.history.state,"",`${t.pathname}${t.search}${t.hash}`)}catch{}return n}function ve(){let e=Ae();if(e){e.page.memory=null,e.page.epoch++,e.page.exchanging=null,Qe(e);try{e.sessionStorage.removeItem(pe)}catch{}}}function et(e={}){let t=Ae();if(!t)return Promise.resolve(null);let n=Qe(t);if(n===null)return t.page.exchanging?t.page.exchanging.done:Promise.resolve(K(t));if(!Dt.test(n))return Promise.resolve(K(t));if(t.page.exchanging?.token===n)return t.page.exchanging.done;let r=(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,""),s=(e.appUrl??"https://app.mapled.io").replace(/\/+$/,""),l=e.fetch??fetch,c=++t.page.epoch,o=(async()=>{try{let i=await l(`${r}/v1/delivery/preview/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({token:n}),cache:"no-store"});if(i.ok){let p=await i.json();if(typeof p.draftToken!="string"||typeof p.expiresAt!="string"||!Je.test(p.draftToken)||!(Date.parse(p.expiresAt)>Date.now())||t.page.epoch!==c)return K(t);let f={draftToken:p.draftToken,expiresAt:p.expiresAt};t.page.memory=f;try{t.sessionStorage.setItem(pe,JSON.stringify(f))}catch{}return f}if(i.status===401&&t.page.epoch===c){let p=await i.json().catch(()=>null),f=p?.error?.projectId;if(t.page.epoch===c&&p?.error?.code==="PREVIEW_EXPIRED"&&typeof f=="string"&&/^[0-9a-f-]{8,64}$/i.test(f))return t.location.assign(`${s}/preview/expired?project=${encodeURIComponent(f)}`),await new Promise(a=>setTimeout(a,_t)),K(t)}return K(t)}catch{return K(t)}})(),d={token:n,done:o};return t.page.exchanging=d,o.then(()=>{t.page.exchanging===d&&(t.page.exchanging=null)}),o}async function tt(e){return(await et(e))?.draftToken??null}function Te(e){if(!e||typeof e!="object")return;let{release:t,publishedAt:n}=e;if(t===null)return n===null?null:void 0;if(!(!Number.isInteger(t)||t<1||typeof n!="string"))return{release:t,publishedAt:n}}var Kt=1e4;function Bt(e,t){let n=typeof document>"u"?void 0:globalThis.performance?.timeOrigin;if(n===void 0)return!1;let r=Date.parse(t.get("date")??""),s=Number.isNaN(r)?0:r+(Number(t.get("age"))||0)*1e3-Date.now();return Date.parse(e)>n+s-Kt}function nt(e,t){return(n,r)=>{if(e!==void 0)return e;let s=t?.();return s!==void 0?s:Bt(n.publishedAt,r)?null:n.release}}function rt(e,t,n){let r=typeof e.key=="string"&&e.key.length>0;if(!r&&!e.endpoint)throw new Error("Mapled: watchRelease needs an endpoint or a delivery key.");let s=r?`${(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,"")}/v1/delivery/release`:e.endpoint,l=r?{accept:"application/json","x-mapled-key":e.key}:{accept:"application/json"},c=(r?Math.max(15,e.interval??60):Math.max(2,e.interval??10))*1e3,o=e.fetch??fetch,d=typeof document>"u"?null:document,i,p=null,f=0,a=null,g=0,R=!1,O,P=null,w=()=>!d||d.visibilityState!=="hidden",U=()=>{R||!w()||(O=setTimeout(N,Math.min(c*2**g,3e5)))};async function N(){if(R||P)return;let I=new AbortController;P=I;let F=null;try{let J=await o(s,{cache:"no-cache",headers:l,signal:I.signal}),$=J.ok?Te(await J.json()):void 0;if(R)return;$===void 0?g+=1:(g=0,i===void 0&&(i=$?t($,J.headers):null),$&&$.release>(p?.release??0)&&(p=$),$&&$.release>(i??0)?(F={next:$,previous:i},i=$.release,f=$.release,a=null):$&&a!==null&&typeof i=="number"&&$.release>=i&&i>f&&(F={next:$,previous:a},f=i,a=null))}catch{if(R)return;g+=1}finally{P===I&&(P=null)}U(),F&&e.onPublish(F.next,F.previous)}let L=()=>{clearTimeout(O),w()&&N()};d?.addEventListener("visibilitychange",L);let W=n?.(I=>{if(R||typeof i!="number"||I>=i||i<=f||(a=a===null?I:Math.min(a,I),p===null||p.release<i))return;f=i;let F=a;a=null,e.onPublish(p,F)});return w()&&N(),()=>{R=!0,clearTimeout(O),P?.abort(),W?.(),d?.removeEventListener("visibilitychange",L)}}function st(e){let t={};return e.forEach((n,r)=>{typeof n!="string"||r in t||(t[r]=n)}),t}async function xe(e,t,n){if(!n?.key)throw new Error("Mapled: a delivery key is required.");let r=(n.apiUrl??"https://api.mapled.io").replace(/\/+$/,""),s=typeof HTMLFormElement<"u"&&t instanceof HTMLFormElement?st(new FormData(t)):typeof FormData<"u"&&t instanceof FormData?st(t):{...t},l=n.page??(typeof window<"u"&&typeof document<"u"?window.location.pathname:void 0),c={...s};n.consent&&(c._consent=n.consent),l&&c._page===void 0&&(c._page=l),n.test&&(c._test=!0);let o=B()?.draftToken,d={"content-type":"application/json","x-mapled-key":n.key};o&&(d["x-mapled-draft"]=o);let i;try{i=await(n.fetch??fetch)(`${r}/v1/delivery/forms/${encodeURIComponent(e)}`,{method:"POST",headers:d,body:JSON.stringify(c)})}catch{return{ok:!1,status:0,code:"NETWORK",message:"Mapled couldn't be reached. Try again in a minute."}}if(i.ok)return{ok:!0};let p=`The submission wasn't accepted (${i.status}).`,f;try{let a=await i.json();a.error?.message&&(p=a.error.message),typeof a.error?.code=="string"&&(f=a.error.code)}catch{}return{ok:!1,status:i.status,code:f,message:p}}var Ee=/^[a-z0-9][a-z0-9-]{0,63}$/,ot=new Set;function Ht(e){if(typeof process<"u")return;let t=e?.aliases;if(!(!t||typeof t!="object")){for(let[n,r]of Object.entries(t))if(!(!r||typeof r!="object"||!Ee.test(n)))for(let[s,l]of Object.entries(r)){if(typeof l!="string"||!Ee.test(s)||!Ee.test(l))continue;let c=`${n}.${s}`;ot.has(c)||(ot.add(c),console.warn(`[mapled] \u201C${s}\u201D in \u201C${n}\u201D was renamed to \u201C${l}\u201D. The old key keeps working until its alias is removed in Mapled \u2014 use \u201C${l}\u201D instead.`))}}}function at(e,t={}){let n=new URLSearchParams;t.width&&n.set("w",String(t.width)),t.height&&n.set("h",String(t.height)),t.fit&&n.set("fit",t.fit),t.format&&n.set("fmt",t.format),t.quality&&n.set("q",String(t.quality));let r=n.toString(),s=t.files?(t.files[e]??t.files[e.toLowerCase()])?.url:void 0;return typeof s=="string"&&s?r?`${s}${s.includes("?")?"&":"?"}${r}`:s:`${(t.apiUrl??"https://api.mapled.io").replace(/\/+$/,"")}/files/${encodeURIComponent(e)}${r?`?${r}`:""}`}var V=class extends Error{constructor(n,r,s){super(r);Se(this,"status");Se(this,"code");this.name="MapledError",this.status=n,this.code=s}},it=e=>Number.isInteger(e)&&e>=1,lt=()=>new Error("Mapled: release must be a positive whole number.");function ut(e){let t=(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,"");if(!e.key)throw new Error("Mapled: a delivery key is required.");if(e.release!==void 0&&!it(e.release))throw lt();let n=(f,a)=>(e.fetch??fetch)(f,a),r,s=new Set;async function l(){return e.draft===null?null:typeof e.draft=="string"?e.draft||null:typeof e.draft=="function"?await e.draft()||null:tt({apiUrl:t,appUrl:e.appUrl,fetch:e.fetch})}async function c(f){let a=`Mapled request failed (${f.status}).`,g;try{let R=await f.json();R.error?.message&&(a=R.error.message),typeof R.error?.code=="string"&&(g=R.error.code)}catch{}return new V(f.status,a,g)}async function o(f,a,g){let R=await l(),O=g.release??e.release;if(O!==void 0&&!it(O))throw lt();O!==void 0&&!R&&a.set("release",String(O));let P=g.locale||e.locale;P&&a.set("locale",P);let w=a.toString(),U=await n(`${t}${f}${w?`?${w}`:""}`,{headers:R?{"x-mapled-key":e.key,"x-mapled-draft":R}:{"x-mapled-key":e.key},...R?{cache:"no-store"}:{},...g.signal?{signal:g.signal}:{}});if(!U.ok)throw await c(U);let N=await U.json();if(!R){let L=Number(U.headers.get("x-mapled-release"));if(Number.isInteger(L)&&L>=1){r=r===void 0?L:Math.min(r,L);for(let W of s)Promise.resolve().then(()=>W(L))}}return Ht(N),N}let d=(f,a)=>(a.expand?.length&&f.set("expand",a.expand.join(",")),a.fields?.length&&f.set("fields",a.fields.join(",")),f),i=async(f,a)=>{try{return(await o(f,d(new URLSearchParams,a),a)).record}catch(g){if(g instanceof V&&g.status===404&&g.code!=="RELEASE_NOT_FOUND")return null;throw g}};return{async getRecords(f,a={}){let g=new URLSearchParams;for(let[R,O]of Object.entries(a.filter??{}))if(O!==null&&typeof O=="object")for(let[P,w]of Object.entries(O))w!==void 0&&g.set(`filter[${R}][${P}]`,Array.isArray(w)?w.join(","):String(w));else g.set(`filter[${R}]`,String(O));return a.sort&&g.set("sort",a.sort),a.limit!==void 0&&g.set("limit",String(a.limit)),a.offset!==void 0&&g.set("offset",String(a.offset)),a.search&&g.set("search",a.search),d(g,a),o(`/v1/delivery/collections/${encodeURIComponent(f)}/records`,g,a)},getRecord(f,a,g={}){return i(`/v1/delivery/collections/${encodeURIComponent(f)}/records/${encodeURIComponent(a)}`,g)},getRecordBySlug(f,a,g={}){return i(`/v1/delivery/collections/${encodeURIComponent(f)}/records/by-slug/${encodeURIComponent(a)}`,g)},getSingle(f,a={}){return i(`/v1/delivery/singles/${encodeURIComponent(f)}`,a)},async isPreview(){return await l()!==null},watch(f,a={}){return rt({key:e.key,apiUrl:t,interval:a.interval,onPublish:f,fetch:e.fetch},nt(a.from,()=>r),g=>(s.add(g),()=>{s.delete(g)}))},async getRelease(f={}){let a=await n(`${t}/v1/delivery/release`,{headers:{"x-mapled-key":e.key},cache:"no-cache",...f.signal?{signal:f.signal}:{}});if(!a.ok)throw await c(a);let g=Te(await a.json());if(g===void 0)throw new Error("Mapled: the release pointer didn't come back as one \u2014 check the API origin.");return g}}}var qt=/^[a-z0-9][a-z0-9_-]{0,63}$/;function te(e){if(typeof e!="string")return null;let t=e.trim().split(".");if(t.length>8)return null;for(let n of t)if(!qt.test(n))return null;return t}var z=(e,t)=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;function Me(e,t){let n=e.data,r=e.expanded,s=e.expandedBlocks;for(let l=0;l<t.length;l++){let c=t[l],o=z(r,c);if(l===t.length-1)return{value:z(n,c),linked:o,blocks:z(s,c)};if(o!==void 0){if(o===null||Array.isArray(o))return{value:void 0};n=z(o,"data"),r=z(o,"expanded"),s=z(o,"expandedBlocks");continue}if(n=z(n,c),r=void 0,s=void 0,n===void 0)return{value:void 0}}return{value:n}}var ne=e=>e==null||e===""||Array.isArray(e)&&e.length===0;function Oe(e){return typeof e=="string"?e:typeof e=="number"&&Number.isFinite(e)?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)&&e.every(t=>typeof t=="string"||typeof t=="number")?e.join(", "):null}var zt=new Set(["http:","https:","mailto:","tel:"]),Wt=new Set(["http:","https:"]),Gt=2048;function H(e,t,n){if(typeof e!="string"||e.length>Gt)return null;let r;try{r=new URL(e,t)}catch{return null}return!(n==="link"?zt:Wt).has(r.protocol)||r.username!==""||r.password!==""?null:r.href}var Xt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ct=e=>typeof e=="string"&&Xt.test(e);function dt(e,t,n){let r=[],s=e.replace(/\{([^{}]*)\}/g,(c,o)=>{let d=te(o);if(!d)return r.push({ok:!1,reason:"bad-path",path:o.trim().slice(0,80)}),"";let i=n(d);if(typeof i!="string"&&typeof i!="number"||i==="")return r.push({ok:!1,reason:"empty",path:d.join(".")}),"";try{return encodeURIComponent(String(i))}catch{return r.push({ok:!1,reason:"unsafe-url",path:d.join(".")}),""}});if(r[0])return r[0];let l=H(s,t,"link");return l===null?{ok:!1,reason:"unsafe-url",path:e.slice(0,80)}:{ok:!0,url:l}}var Vt=1e5,pt=8,mt=2048,Zt="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",ft={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB"};function gt(e,t,n){let r=t.createDocumentFragment();if(typeof e!="string"||e==="")return r;let s=e.replace(/\r\n?/g,`
|
|
3
|
-
`).replace(/\t/g," ").replace(/\u0000/g,"\uFFFD"),
|
|
4
|
-
`),r,0),r}function
|
|
5
|
-
`).trim();
|
|
1
|
+
/*! @mapled/vanilla 0.4.0 | MIT | https://mapled.io */
|
|
2
|
+
"use strict";(()=>{var mn=Object.defineProperty;var gn=(e,t,n)=>t in e?mn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var We=(e,t,n)=>gn(e,typeof t!="symbol"?t+"":t,n);var qe="mapled-preview",Ne="mapled:preview",hn=/^mpv_[A-Za-z0-9]{16,96}$/,yt=/^mps_[A-Za-z0-9]{16,96}$/,yn=/^(?:https:\/\/[a-z0-9.-]+|http:\/\/(?:localhost|127\.0\.0\.1))(?::[0-9]{1,5})?$/;function kt(e){let t={draftToken:e.draftToken,expiresAt:e.expiresAt};return e.mode==="edit"&&typeof e.appOrigin=="string"&&yn.test(e.appOrigin)&&(t.mode="edit",t.appOrigin=e.appOrigin),t}var ht=new WeakMap,kn=4e3;function Ve(){if(typeof window>"u"||typeof document>"u")return null;try{let e=window.sessionStorage,t=ht.get(window);return t||ht.set(window,t={memory:null,exchanging:null,epoch:0}),{location:window.location,history:window.history,sessionStorage:e,page:t}}catch{return null}}function bn(e){try{let t=e.getItem(Ne);if(!t)return null;let n=JSON.parse(t),r=typeof n?.expiresAt=="string"?Date.parse(n.expiresAt):NaN;return typeof n?.draftToken!="string"||!yt.test(n.draftToken)||!(r>Date.now())?(e.removeItem(Ne),null):kt({...n,draftToken:n.draftToken,expiresAt:n.expiresAt})}catch{return null}}function te(e){let t=bn(e.sessionStorage);if(t)return t;let n=e.page.memory;return n&&Date.parse(n.expiresAt)>Date.now()?n:(e.page.memory=null,null)}function J(){let e=Ve();return e?te(e):null}function bt(e){let t;try{t=new URL(e.location.href)}catch{return null}let n=t.searchParams.get(qe);if(n===null)return null;t.searchParams.delete(qe);try{e.history.replaceState(e.history.state,"",`${t.pathname}${t.search}${t.hash}`)}catch{}return n}function Ge(){let e=Ve();if(e){e.page.memory=null,e.page.epoch++,e.page.exchanging=null,bt(e);try{e.sessionStorage.removeItem(Ne)}catch{}}}function wt(e={}){let t=Ve();if(!t)return Promise.resolve(null);let n=bt(t);if(n===null)return t.page.exchanging?t.page.exchanging.done:Promise.resolve(te(t));if(!hn.test(n))return Promise.resolve(te(t));if(t.page.exchanging?.token===n)return t.page.exchanging.done;let r=(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,""),s=(e.appUrl??"https://app.mapled.io").replace(/\/+$/,""),i=e.fetch??fetch,u=++t.page.epoch,a=(async()=>{try{let l=await i(`${r}/v1/delivery/preview/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({token:n}),cache:"no-store"});if(l.ok){let g=await l.json();if(typeof g.draftToken!="string"||typeof g.expiresAt!="string"||!yt.test(g.draftToken)||!(Date.parse(g.expiresAt)>Date.now())||t.page.epoch!==u)return te(t);let m=kt({...g,draftToken:g.draftToken,expiresAt:g.expiresAt});t.page.memory=m;try{t.sessionStorage.setItem(Ne,JSON.stringify(m))}catch{}return m}if(l.status===401&&t.page.epoch===u){let g=await l.json().catch(()=>null),m=g?.error?.projectId;if(t.page.epoch===u&&g?.error?.code==="PREVIEW_EXPIRED"&&typeof m=="string"&&/^[0-9a-f-]{8,64}$/i.test(m))return t.location.assign(`${s}/preview/expired?project=${encodeURIComponent(m)}`),await new Promise(c=>setTimeout(c,kn)),te(t)}return te(t)}catch{return te(t)}})(),d={token:n,done:a};return t.page.exchanging=d,a.then(()=>{t.page.exchanging===d&&(t.page.exchanging=null)}),a}async function At(e){return(await wt(e))?.draftToken??null}function Xe(e){if(!e||typeof e!="object")return;let{release:t,publishedAt:n}=e;if(t===null)return n===null?null:void 0;if(!(!Number.isInteger(t)||t<1||typeof n!="string"))return{release:t,publishedAt:n}}var wn=1e4;function An(e,t){let n=typeof document>"u"?void 0:globalThis.performance?.timeOrigin;if(n===void 0)return!1;let r=Date.parse(t.get("date")??""),s=Number.isNaN(r)?0:r+(Number(t.get("age"))||0)*1e3-Date.now();return Date.parse(e)>n+s-wn}function St(e,t){return(n,r)=>{if(e!==void 0)return e;let s=t?.();return s!==void 0?s:An(n.publishedAt,r)?null:n.release}}function Rt(e,t,n){let r=typeof e.key=="string"&&e.key.length>0;if(!r&&!e.endpoint)throw new Error("Mapled: watchRelease needs an endpoint or a delivery key.");let s=r?`${(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,"")}/v1/delivery/release`:e.endpoint,i=r?{accept:"application/json","x-mapled-key":e.key}:{accept:"application/json"},u=(r?Math.max(15,e.interval??60):Math.max(2,e.interval??10))*1e3,a=e.fetch??fetch,d=typeof document>"u"?null:document,l,g=null,m=0,c=null,b=0,x=!1,_,D=null,k=()=>!d||d.visibilityState!=="hidden",N=()=>{x||!k()||(_=setTimeout(q,Math.min(u*2**b,3e5)))};async function q(){if(x||D)return;let H=new AbortController;D=H;let j=null;try{let B=await a(s,{cache:"no-cache",headers:i,signal:H.signal}),I=B.ok?Xe(await B.json()):void 0;if(x)return;I===void 0?b+=1:(b=0,l===void 0&&(l=I?t(I,B.headers):null),I&&I.release>(g?.release??0)&&(g=I),I&&I.release>(l??0)?(j={next:I,previous:l},l=I.release,m=I.release,c=null):I&&c!==null&&typeof l=="number"&&I.release>=l&&l>m&&(j={next:I,previous:c},m=l,c=null))}catch{if(x)return;b+=1}finally{D===H&&(D=null)}N(),j&&e.onPublish(j.next,j.previous)}let K=()=>{clearTimeout(_),k()&&q()};d?.addEventListener("visibilitychange",K);let Z=n?.(H=>{if(x||typeof l!="number"||H>=l||l<=m||(c=c===null?H:Math.min(c,H),g===null||g.release<l))return;m=l;let j=c;c=null,e.onPublish(g,j)});return k()&&q(),()=>{x=!0,clearTimeout(_),D?.abort(),Z?.(),d?.removeEventListener("visibilitychange",K)}}function Et(e){let t={};return e.forEach((n,r)=>{typeof n!="string"||r in t||(t[r]=n)}),t}async function Ze(e,t,n){if(!n?.key)throw new Error("Mapled: a delivery key is required.");let r=(n.apiUrl??"https://api.mapled.io").replace(/\/+$/,""),s=typeof HTMLFormElement<"u"&&t instanceof HTMLFormElement?Et(new FormData(t)):typeof FormData<"u"&&t instanceof FormData?Et(t):{...t},i=n.page??(typeof window<"u"&&typeof document<"u"?window.location.pathname:void 0),u={...s};n.consent&&(u._consent=n.consent),i&&u._page===void 0&&(u._page=i),n.test&&(u._test=!0);let a=J()?.draftToken,d={"content-type":"application/json","x-mapled-key":n.key};a&&(d["x-mapled-draft"]=a);let l;try{l=await(n.fetch??fetch)(`${r}/v1/delivery/forms/${encodeURIComponent(e)}`,{method:"POST",headers:d,body:JSON.stringify(u)})}catch{return{ok:!1,status:0,code:"NETWORK",message:"Mapled couldn't be reached. Try again in a minute."}}if(l.ok)return{ok:!0};let g=`The submission wasn't accepted (${l.status}).`,m;try{let c=await l.json();c.error?.message&&(g=c.error.message),typeof c.error?.code=="string"&&(m=c.error.code)}catch{}return{ok:!1,status:l.status,code:m,message:g}}var vt={"\u200B":0,"\u200C":1,"\u200D":2,"\u2060":3},Sn=1,Rn=1024,Ct=/\u2064[\u200B\u200C\u200D\u2060]*/g;function be(e){return e.indexOf("\u2064")<0?e:e.replace(Ct,"")}function _e(e){if(e.indexOf("\u2064")<0)return[];let t=[];for(let n of e.matchAll(Ct)){let r=En(n[0]);r&&t.push(r)}return t}function En(e){for(let t=e.indexOf("\u2064");t>=0;t=e.indexOf("\u2064",t+1)){let n=vn(e,t);if(n)return n}return null}function vn(e,t){let n=t+1;for(;n<e.length&&vt[e[n]]!==void 0;)if(n+=1,n-t-1>Rn*4)return null;let r=e.slice(t,n),s=r.length-1;if(s===0||s%4!==0)return null;let i=new Uint8Array(s/4);for(let u=0;u<i.length;u+=1){let a=0;for(let d=0;d<4;d+=1)a=a<<2|vt[r[1+u*4+d]];i[u]=a}return Tn(i,r)}function Tn(e,t){if(e.length<19||e[0]!==Sn)return null;let n=Tt(e,1),s=18+e[17];if(s>=e.length)return null;let i="";for(let l=18;l<s;l+=1)i+=String.fromCharCode(e[l]);if(i&&!xn.test(i))return null;let u=e.indexOf(0,s),a=Pt(xt(e.subarray(s,u<0?e.length:u)));if(!a)return null;let d={raw:t,token:Pn(e),record:n,locale:i||null,path:a};if(u>=0){if(s=u+1,e.length<s+17)return null;let l=Pt(xt(e.subarray(s+16)));if(!l)return null;d.via={record:Tt(e,s),path:l}}return d}function Tt(e,t){let n="";for(let r=t;r<t+16;r+=1)n+=e[r].toString(16).padStart(2,"0");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}function xt(e){if(e.length===0)return null;try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(e)}catch{return null}}var xn=/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8}){0,3}$/,Mt=/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/,Ot=/^(?:0|[1-9][0-9]{0,3})$/,Mn=/^@[A-Za-z0-9_-]{1,40}$/,On=new Set(["__proto__","prototype","constructor"]);function Pt(e){if(!e||e.length>2048)return null;let t=e.split(".");if(!Mt.test(t[0])||Ot.test(t[0]))return null;for(let n of t)if(!(Mt.test(n)||Ot.test(n)||Mn.test(n))||On.has(n))return null;return e}var Ue="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";function Pn(e){let t="";for(let n=0;n<e.length;n+=3){let r=e[n]<<16|(e[n+1]??0)<<8|(e[n+2]??0);t+=Ue[r>>18&63]+Ue[r>>12&63],n+1<e.length&&(t+=Ue[r>>6&63]),n+2<e.length&&(t+=Ue[r&63])}return t}var Je={mapled:"editor",v:1},X={marks:2e3,assets:500,text:1e5,mark:4100,asset:64,path:2048,label:200},Cn=/^\u2064[\u200B\u200C\u200D\u2060]+$/,$n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Ln(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.mapled===Je.mapled&&t.v===Je.v&&typeof t.type=="string"?t:null}var we=(e,t)=>typeof e=="string"&&e.length<=t,ue=e=>we(e,X.mark)&&Cn.test(e),In=e=>typeof e=="string"&&$n.test(e);function $t(e){let t=Ln(e);if(!t)return null;switch(t.type){case"init":{let n=Ye(t.homes,X.marks,ue,i=>i==="page"||i==="cms"||i==="none"),r=Ye(t.assets,X.assets,In,i=>i==="page"||i==="cms"),s=t.labels===void 0?void 0:Ye(t.labels,X.marks,ue,i=>we(i,X.label));return!n||!r||s===null?null:{type:"init",homes:n,assets:r,...s?{labels:s}:{}}}case"edit":return!ue(t.mark)||t.kind!=="inline"&&t.kind!=="panel"||t.text!==void 0&&!we(t.text,X.text)?null:{type:"edit",mark:t.mark,kind:t.kind,...typeof t.text=="string"?{text:t.text}:{}};case"patch":return ue(t.mark)&&we(t.text,X.text)&&we(t.previous,X.text)?{type:"patch",mark:t.mark,text:t.text,previous:t.previous}:null;case"refresh":return{type:"refresh"};case"highlight":return ue(t.mark)?{type:"highlight",mark:t.mark}:null;case"finish":return ue(t.mark)&&typeof t.save=="boolean"?{type:"finish",mark:t.mark,save:t.save}:null;default:return null}}function Ye(e,t,n,r){if(!e||typeof e!="object"||Array.isArray(e))return null;let s=Object.entries(e);if(s.length>t)return null;let i=Object.create(null);for(let[u,a]of s){if(!n(u)||!r(a))return null;i[u]=a}return i}var Dn=/^(?:https:\/\/[a-z0-9.-]+|http:\/\/(?:localhost|127\.0\.0\.1))(?::[0-9]{1,5})?$/;function Lt(e,t,n){return!Dn.test(t)||e.origin!==t?!1:n.parent!==void 0&&n.parent!==null&&n.parent!==n.self&&e.source===n.parent||n.opener!=null&&e.source===n.opener}function It(e){return{...Je,...e}}var Nt="#eb5c1a",Nn="#2d82cc",Un=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,Ut=["alt","title","aria-label"],_n="script, style, textarea, noscript, template, iframe, object, select, option",_t="a[href], area[href]";function et(e){let t=e.window??(typeof window>"u"?void 0:window);if(!t)return()=>{};let n=t,r=n.document,i=n.parent&&n.parent!==n.self?n.parent:n.opener;if(!i)return()=>{};let u=e.appOrigin,a=!1,d=new Map,l=new WeakMap,g=new Map,m=new WeakMap,c=Object.create(null),b=Object.create(null),x=Object.create(null),_="",D=null,k=null,N=o=>{try{i.postMessage(It(o),u)}catch{}},q=()=>`${n.location.pathname}${n.location.search}`,K=r.createElement("mapled-editor"),Z=K.attachShadow({mode:"closed"});Ae(K,{position:"fixed",inset:"0",pointerEvents:"none",zIndex:"2147483647"});let H=me(),j=me();j.style.borderStyle="dashed",j.style.borderWidth="1px";let B=me(),I=r.createElement("div");Ae(I,{position:"absolute",display:"none",padding:"3px 8px",borderRadius:"6px",font:"500 12px/16px Inter, system-ui, sans-serif",color:"#ffffff",whiteSpace:"nowrap"}),Z.append(j,H,B,I),r.documentElement.append(K);function me(){let o=r.createElement("div");return Ae(o,{position:"absolute",display:"none",border:`2px solid ${Nt}`,borderRadius:"6px",boxSizing:"border-box"}),o}function z(o,p,S=6){if(!p){o.style.display="none";return}Ae(o,{display:"block",left:`${p.x-S}px`,top:`${p.y-S}px`,width:`${p.width+S*2}px`,height:`${p.height+S*2}px`})}function ae(){if(a||k)return;let o=new Map,p=new WeakMap,S=A=>{if(o.size>=X.marks&&!o.has(A.mark.raw))return;let $=o.get(A.mark.raw)??[];$.push(A),o.set(A.mark.raw,$);let F=p.get(A.el)??[];F.push(A),p.set(A.el,F)},w=r.createTreeWalker(r.body??r.documentElement,n.NodeFilter.SHOW_TEXT,{acceptNode:A=>A.parentElement?.closest(_n)?n.NodeFilter.FILTER_REJECT:n.NodeFilter.FILTER_ACCEPT});for(let A=w.nextNode();A;A=w.nextNode()){let $=A;if(!($.data.indexOf("\u2064")<0||!$.parentElement))for(let F of _e($.data))S({mark:F,el:$.parentElement,node:$})}for(let A of Ut)for(let $ of Array.from(r.querySelectorAll(`[${A}]`))){let F=$.getAttribute(A)??"";if(F.indexOf("\u2064")>=0)for(let ce of _e(F))S({mark:ce,el:$,attr:A})}let P=new Map,U=new WeakMap,G=(A,$)=>{if($)for(let F of $.matchAll(Un)){let ce=F[0].toLowerCase();if(P.size>=X.assets&&!P.has(ce))return;let gt=P.get(ce)??[];gt.push(A),P.set(ce,gt),U.has(A)||U.set(A,ce)}};for(let A of Array.from(r.images)){G(A,A.getAttribute("src")),G(A,A.getAttribute("srcset"));let $=A.parentElement?.tagName==="PICTURE"?A.parentElement:null;if($)for(let F of Array.from($.querySelectorAll("source")))G(A,F.getAttribute("srcset"))}for(let A of Array.from(r.querySelectorAll("[style*='background']")))G(A,A.style.backgroundImage);d=o,l=p,g=P,m=U;let oe={type:"marks",path:q(),marks:[...d.keys()],assets:[...g.keys()]},R=JSON.stringify(oe);R!==_&&(_=R,N(oe)),D&&h()}function le(o){let p=o instanceof n.Element?o:null;for(;p&&p!==r.documentElement;p=p.parentElement){let S=l.get(p)?.filter(P=>c[P.mark.raw]==="page"||c[P.mark.raw]==="cms"),w=m.get(p);if(w&&b[w]&&(!S||S.every(P=>P.attr==="alt")))return{asset:w,el:p};if(S&&S.length>0)return{places:S,el:p}}return null}function ge(o){let p=Qe(o.mark);if(!p)return null;let S=[];for(let w of d.values())for(let P of w)Qe(P.mark)===p&&S.push(P.el);return Fn(S)}let $e=o=>!!o.node&&o.el.childNodes.length===1&&o.node.data.endsWith(o.mark.raw)&&_e(o.node.data).length===1,V=o=>{let p=o.getBoundingClientRect();return{x:p.left,y:p.top,width:p.width,height:p.height}};function Le(o){if(!o||k){z(H,null),z(j,null),I.style.display="none";return}let p=o.places?.[0],S=p?.mark.via!==void 0,w=p?c[p.mark.raw]:o.asset?b[o.asset]:void 0,P=S?Nn:Nt,U=V(o.el);H.style.borderColor=P,z(H,U);let G=p?ge(p):null;G&&G!==o.el?(j.style.borderColor=P,z(j,V(G),10)):z(j,null);let oe=(p&&x[p.mark.raw])??(o.asset?w==="cms"?"Image \u2022 from Content":"Image":w==="cms"?"From Content":S?"Component \u2022 on every page":"Text");I.textContent=oe,Ae(I,{display:"block",background:P,left:`${U.x-6}px`,top:`${Math.max(U.y-30,0)}px`})}function Ie(o){if(!o.node||k||a)return;let p=o.node.data;k={place:o,before:p},o.el.textContent=be(p),o.el.setAttribute("contenteditable","plaintext-only"),o.el.isContentEditable===!1&&o.el.setAttribute("contenteditable","true"),o.el.addEventListener("keydown",De),o.el.addEventListener("paste",ee),o.el.addEventListener("drop",se),o.el.addEventListener("input",h),o.el.focus(),z(H,null),I.style.display="none",z(B,V(o.el)),h()}function Y(o){if(!k)return;let{place:p,before:S}=k;if(k=null,p.el.removeEventListener("keydown",De),p.el.removeEventListener("paste",ee),p.el.removeEventListener("drop",se),p.el.removeEventListener("input",h),p.el.removeAttribute("contenteditable"),o){let w=(p.el.textContent??"").slice(0,X.text);p.el.textContent=w+p.mark.raw,N({type:"commit",mark:p.mark.raw,text:w})}else p.el.textContent=S,N({type:"cancel",mark:p.mark.raw});z(B,null),ae()}function De(o){o.isComposing||o.keyCode===229||(o.key==="Escape"?(o.preventDefault(),Y(!1)):o.key==="Enter"&&!o.shiftKey&&(o.preventDefault(),Y(!0)))}function he(o){let p=n.getSelection();if(!p||p.rangeCount===0||!k)return;let S=p.getRangeAt(0);if(!k.place.el.contains(S.startContainer)||!k.place.el.contains(S.endContainer))return;S.deleteContents();let w=r.createTextNode(o);S.insertNode(w),S.setStartAfter(w),S.collapse(!0),p.removeAllRanges(),p.addRange(S)}function ee(o){o.preventDefault(),he(be(o.clipboardData?.getData("text/plain")??""))}function se(o){o.preventDefault()}let ye=o=>Le(le(o.target)),ke=o=>{if(k&&k.place.el.contains(o.target))return;let p=le(o.target);if(p){o.preventDefault(),o.stopPropagation(),k&&Y(!0);let w=p.places?.[0];if(w){D={mark:w.mark.raw};let P=ge(w),U=$e(w)&&c[w.mark.raw]==="page";N({type:"select",mark:w.mark.raw,rect:V(p.el),kind:"text",editable:U,...P?{item:V(P)}:{}})}else if(p.asset){D={asset:p.asset};let P=l.get(p.el)?.find(U=>U.attr==="alt"&&(c[U.mark.raw]==="page"||c[U.mark.raw]==="cms"));N({type:"select",asset:p.asset,rect:V(p.el),kind:"image",...P?{alt:P.mark.raw}:{}})}z(B,V(p.el));return}k&&Y(!0);let S=o.target?.closest?.(_t)??null;if(S){o.preventDefault(),o.stopPropagation();try{let w=new URL(S.getAttribute("href")??"",n.location.href);w.origin===n.location.origin&&N({type:"navigate",path:`${w.pathname}${w.search}`})}catch{}}},f=o=>{o.preventDefault(),o.stopImmediatePropagation()},y=o=>{o.target?.closest?.(_t)&&(o.preventDefault(),o.stopImmediatePropagation())},v=0,h=()=>{v||(v=n.requestAnimationFrame(()=>{v=0;let o=[],p=k?{mark:k.place.mark.raw}:D;if(p?.mark)for(let S of d.get(p.mark)??[])o.push({mark:p.mark,rect:V(S.el)});if(p?.asset)for(let S of g.get(p.asset)??[])o.push({asset:p.asset,rect:V(S)});k?z(B,V(k.place.el)):o[0]&&z(B,o[0].rect),z(H,null),z(j,null),I.style.display="none",o.length>0&&N({type:"rects",items:o.slice(0,X.marks)})}))};function E(o){switch(o.type){case"init":c=o.homes,b=o.assets,x=o.labels??Object.create(null);break;case"edit":{let p=d.get(o.mark)??[];if(o.kind==="inline"){let S=c[o.mark]==="page"&&o.text!==void 0?p.find(w=>$e(w)&&be(w.node.data)===o.text):void 0;S&&!k?Ie(S):k?.place.mark.raw!==o.mark&&N({type:"cancel",mark:o.mark});break}p[0]&&z(B,V(p[0].el));break}case"finish":k&&k.place.mark.raw===o.mark&&Y(o.save);break;case"patch":{let p=!0,S=(w,P)=>{let U=w.indexOf(P),G=U-o.previous.length;return U<0||G<0||w.slice(G,U)!==o.previous?null:w.slice(0,G)+o.text+w.slice(U)};for(let w of d.get(o.mark)??[]){if(k?.place===w)continue;let P=S(w.attr?w.el.getAttribute(w.attr)??"":w.node?.data??"",w.mark.raw);P===null?p=!1:w.attr?w.el.setAttribute(w.attr,P):w.node&&(w.node.data=P)}p||e.onRefresh?.();break}case"highlight":{let p=d.get(o.mark)?.[0];p&&(p.el.scrollIntoView?.({block:"center",behavior:"smooth"}),z(B,V(p.el)));break}case"refresh":e.onRefresh?.();break}}let T=o=>{if(!Lt(o,u,{parent:n.parent,opener:n.opener,self:n.self}))return;let p=$t(o.data);p&&E(p)},O,C=0,L=new n.MutationObserver(o=>{if(o.every(S=>K.contains(S.target)))return;clearTimeout(O);let p=Date.now();C||(C=p),O=setTimeout(()=>{C=0,ae()},p-C>=1e3?0:150)});return n.addEventListener("message",T),r.addEventListener("pointermove",ye,!0),r.addEventListener("click",ke,!0),r.addEventListener("auxclick",y,!0),n.addEventListener("submit",f,!0),n.addEventListener("scroll",h,!0),n.addEventListener("resize",h),L.observe(r.documentElement,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["src","srcset","style",...Ut]}),N({type:"ready",sdk:e.sdk,path:q(),title:be(r.title)}),ae(),()=>{a||(k&&Y(!1),a=!0,clearTimeout(O),v&&n.cancelAnimationFrame(v),L.disconnect(),n.removeEventListener("message",T),r.removeEventListener("pointermove",ye,!0),r.removeEventListener("click",ke,!0),r.removeEventListener("auxclick",y,!0),n.removeEventListener("submit",f,!0),n.removeEventListener("scroll",h,!0),n.removeEventListener("resize",h),K.remove())}}function Qe(e){if(e.via)return`${e.via.record}:${e.via.path}`;let t=e.path.split(".");for(let n=t.length-1;n>0;n-=1)if(t[n].startsWith("@")||/^[0-9]+$/.test(t[n]))return`${e.record}:${t.slice(0,n+1).join(".")}`;return null}function Fn(e){if(e.length===0)return null;let t=e[0];for(let n of e.slice(1))for(;t&&!t.contains(n);)t=t.parentElement;return t}function Ae(e,t){Object.assign(e.style,t)}var tt=/^[a-z0-9][a-z0-9-]{0,63}$/,Ft=new Set;function Kn(e){if(typeof process<"u")return;let t=e?.aliases;if(!(!t||typeof t!="object")){for(let[n,r]of Object.entries(t))if(!(!r||typeof r!="object"||!tt.test(n)))for(let[s,i]of Object.entries(r)){if(typeof i!="string"||!tt.test(s)||!tt.test(i))continue;let u=`${n}.${s}`;Ft.has(u)||(Ft.add(u),console.warn(`[mapled] \u201C${s}\u201D in \u201C${n}\u201D was renamed to \u201C${i}\u201D. The old key keeps working until its alias is removed in Mapled \u2014 use \u201C${i}\u201D instead.`))}}}function Ht(e,t={}){let n=new URLSearchParams;t.width&&n.set("w",String(t.width)),t.height&&n.set("h",String(t.height)),t.fit&&n.set("fit",t.fit),t.format&&n.set("fmt",t.format),t.quality&&n.set("q",String(t.quality));let r=n.toString(),s=t.files?(t.files[e]??t.files[e.toLowerCase()])?.url:void 0;return typeof s=="string"&&s?r?`${s}${s.includes("?")?"&":"?"}${r}`:s:`${(t.apiUrl??"https://api.mapled.io").replace(/\/+$/,"")}/files/${encodeURIComponent(e)}${r?`?${r}`:""}`}var de=class extends Error{constructor(n,r,s){super(r);We(this,"status");We(this,"code");this.name="MapledError",this.status=n,this.code=s}},Kt=e=>Number.isInteger(e)&&e>=1,jt=()=>new Error("Mapled: release must be a positive whole number.");function Bt(e){let t=(e.apiUrl??"https://api.mapled.io").replace(/\/+$/,"");if(!e.key)throw new Error("Mapled: a delivery key is required.");if(e.release!==void 0&&!Kt(e.release))throw jt();let n=(m,c)=>(e.fetch??fetch)(m,c),r,s=new Set;async function i(){return e.draft===null?null:typeof e.draft=="string"?e.draft||null:typeof e.draft=="function"?await e.draft()||null:At({apiUrl:t,appUrl:e.appUrl,fetch:e.fetch})}async function u(m){let c=`Mapled request failed (${m.status}).`,b;try{let x=await m.json();x.error?.message&&(c=x.error.message),typeof x.error?.code=="string"&&(b=x.error.code)}catch{}return new de(m.status,c,b)}async function a(m,c,b){let x=await i(),_=b.release??e.release;if(_!==void 0&&!Kt(_))throw jt();_!==void 0&&!x&&c.set("release",String(_));let D=b.locale||e.locale;D&&c.set("locale",D);let k=c.toString(),N=await n(`${t}${m}${k?`?${k}`:""}`,{headers:x?{"x-mapled-key":e.key,"x-mapled-draft":x}:{"x-mapled-key":e.key},...x?{cache:"no-store"}:{},...b.signal?{signal:b.signal}:{}});if(!N.ok)throw await u(N);let q=await N.json();if(!x){let K=Number(N.headers.get("x-mapled-release"));if(Number.isInteger(K)&&K>=1){r=r===void 0?K:Math.min(r,K);for(let Z of s)Promise.resolve().then(()=>Z(K))}}return Kn(q),q}let d=(m,c)=>(c.expand?.length&&m.set("expand",c.expand.join(",")),c.fields?.length&&m.set("fields",c.fields.join(",")),m),l=async(m,c)=>{try{return(await a(m,d(new URLSearchParams,c),c)).record}catch(b){if(b instanceof de&&b.status===404&&b.code!=="RELEASE_NOT_FOUND")return null;throw b}};return{async getRecords(m,c={}){let b=new URLSearchParams;for(let[x,_]of Object.entries(c.filter??{}))if(_!==null&&typeof _=="object")for(let[D,k]of Object.entries(_))k!==void 0&&b.set(`filter[${x}][${D}]`,Array.isArray(k)?k.join(","):String(k));else b.set(`filter[${x}]`,String(_));return c.sort&&b.set("sort",c.sort),c.limit!==void 0&&b.set("limit",String(c.limit)),c.offset!==void 0&&b.set("offset",String(c.offset)),c.search&&b.set("search",c.search),d(b,c),a(`/v1/delivery/collections/${encodeURIComponent(m)}/records`,b,c)},getRecord(m,c,b={}){return l(`/v1/delivery/collections/${encodeURIComponent(m)}/records/${encodeURIComponent(c)}`,b)},getRecordBySlug(m,c,b={}){return l(`/v1/delivery/collections/${encodeURIComponent(m)}/records/by-slug/${encodeURIComponent(c)}`,b)},getSingle(m,c={}){return l(`/v1/delivery/singles/${encodeURIComponent(m)}`,c)},async isPreview(){return await i()!==null},watch(m,c={}){return Rt({key:e.key,apiUrl:t,interval:c.interval,onPublish:m,fetch:e.fetch},St(c.from,()=>r),b=>(s.add(b),()=>{s.delete(b)}))},async getRelease(m={}){let c=await n(`${t}/v1/delivery/release`,{headers:{"x-mapled-key":e.key},cache:"no-cache",...m.signal?{signal:m.signal}:{}});if(!c.ok)throw await u(c);let b=Xe(await c.json());if(b===void 0)throw new Error("Mapled: the release pointer didn't come back as one \u2014 check the API origin.");return b}}}var jn=/^[a-z0-9][a-z0-9_-]{0,63}$/;function Se(e){if(typeof e!="string")return null;let t=e.trim().split(".");if(t.length>8)return null;for(let n of t)if(!jn.test(n))return null;return t}var ie=(e,t)=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;function nt(e,t){let n=e.data,r=e.expanded,s=e.expandedBlocks;for(let i=0;i<t.length;i++){let u=t[i],a=ie(r,u);if(i===t.length-1)return{value:ie(n,u),linked:a,blocks:ie(s,u)};if(a!==void 0){if(a===null||Array.isArray(a))return{value:void 0};n=ie(a,"data"),r=ie(a,"expanded"),s=ie(a,"expandedBlocks");continue}if(n=ie(n,u),r=void 0,s=void 0,n===void 0)return{value:void 0}}return{value:n}}var Re=e=>e==null||e===""||Array.isArray(e)&&e.length===0;function rt(e){return typeof e=="string"?e:typeof e=="number"&&Number.isFinite(e)?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)&&e.every(t=>typeof t=="string"||typeof t=="number")?e.join(", "):null}var Hn=new Set(["http:","https:","mailto:","tel:"]),Bn=new Set(["http:","https:"]),zn=2048;function ne(e,t,n){if(typeof e!="string"||e.length>zn)return null;let r;try{r=new URL(e,t)}catch{return null}return!(n==="link"?Hn:Bn).has(r.protocol)||r.username!==""||r.password!==""?null:r.href}var Wn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,zt=e=>typeof e=="string"&&Wn.test(e);function Wt(e,t,n){let r=[],s=e.replace(/\{([^{}]*)\}/g,(u,a)=>{let d=Se(a);if(!d)return r.push({ok:!1,reason:"bad-path",path:a.trim().slice(0,80)}),"";let l=n(d);if(typeof l!="string"&&typeof l!="number"||l==="")return r.push({ok:!1,reason:"empty",path:d.join(".")}),"";try{return encodeURIComponent(String(l))}catch{return r.push({ok:!1,reason:"unsafe-url",path:d.join(".")}),""}});if(r[0])return r[0];let i=ne(s,t,"link");return i===null?{ok:!1,reason:"unsafe-url",path:e.slice(0,80)}:{ok:!0,url:i}}var qn=1e5,Vt=8,Gt=2048,Vn="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",qt={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB"};function Xt(e,t,n){let r=t.createDocumentFragment();if(typeof e!="string"||e==="")return r;let s=e.replace(/\r\n?/g,`
|
|
3
|
+
`).replace(/\t/g," ").replace(/\u0000/g,"\uFFFD"),i={doc:t,base:n};if(s.length>qn){for(let u of s.split(/\n{2,}/))u.trim()!==""&&(W(i,"p",r).textContent=u.trim());return r}return ct(i,s.split(`
|
|
4
|
+
`),r,0),r}function W(e,t,n){let r=e.doc.createElement(t);return n.appendChild(r),r}var st=e=>e.trim()==="",ve=e=>e.length-e.trimStart().length;function Zt(e){let t=ve(e);if(t>3)return null;let n=0;for(;n<7&&e[t+n]==="#";)n++;if(n===0||n>6)return null;let r=e[t+n];if(r!==void 0&&r!==" ")return null;let s=e.slice(t+n).trim(),i=s.length;for(;i>0&&s[i-1]==="#";)i--;return i<s.length&&(i===0||s[i-1]===" ")&&(s=s.slice(0,i).trim()),{level:n,text:s}}function lt(e){if(ve(e)>3)return!1;let t=e.replace(/ /g,""),n=t[0];if(t.length<3||n!=="-"&&n!=="*"&&n!=="_")return!1;for(let r of t)if(r!==n)return!1;return!0}function ot(e){let t=/^ {0,3}(`{3,}|~{3,})/.exec(e);if(!t)return null;let n=t[1][0];return n==="`"&&e.slice(t[0].length).includes("`")?null:{mark:n,size:t[1].length}}function Ee(e){let t=/^( {0,3})([-*+]|\d{1,9}[.)])( +|$)/.exec(e);if(!t)return null;let n=t[2],r=t[3].length,s=n.length>1||/\d/.test(n);return{indent:t[1].length,width:n.length+(r>=1&&r<=4?r:1),ordered:s,start:s?parseInt(n,10):1,rest:e.slice(t[0].length)}}var it=e=>/^ {0,3}>/.test(e);function Gn(e){if(Zt(e)!==null||ot(e)!==null||it(e)||lt(e))return!0;let t=Ee(e);return t!==null&&t.rest!==""&&(!t.ordered||t.start===1)}function ct(e,t,n,r){if(r>=Vt){let i=t.join(`
|
|
5
|
+
`).trim();i!==""&&(W(e,"p",n).textContent=i);return}let s=0;for(;s<t.length;){let i=t[s];if(st(i)){s++;continue}let u=ot(i);if(u){let g=[],m=ve(i);for(s++;s<t.length;){let c=t[s],b=ot(c);if(b&&b.mark===u.mark&&b.size>=u.size&&c.trim().length===b.size)break;g.push(c.slice(Math.min(m,ve(c)))),s++}s++,W(e,"code",W(e,"pre",n)).textContent=g.length>0?`${g.join(`
|
|
6
6
|
`)}
|
|
7
|
-
`:"";continue}let
|
|
8
|
-
`),
|
|
9
|
-
`,
|
|
10
|
-
&`);if(n===-1)return null;let r=e.slice(t+1,n);if(r[0]==="#"){let
|
|
11
|
-
<`);if(
|
|
12
|
-
`)break;if(d==="("&&
|
|
13
|
-
`);)r++;let
|
|
14
|
-
`);)r++}return e[r]!==")"?null:{address:
|
|
15
|
-
`)for(
|
|
16
|
-
`){let
|
|
17
|
-
`,
|
|
18
|
-
<`),p=i===-1?null:t.slice(o+1,i);if(p!==null&&nn.test(p)){let f=H(p.includes(":")?p:`mailto:${p}`,e.base,"link");if(f!==null){l();let a=C(e,"a",n);a.setAttribute("href",f),a.textContent=p,o=i+1;continue}}}if(d==="&"){let i=en(t,o);if(i){s+=i.char,o=i.end;continue}}if(d==="*"||d==="_"||d==="~"){let i=oe(t,o,d),p=i-o,f=!Ie(t[i])&&(d!=="_"||!yt(t[o-1])),a=d==="~"?p>=2?[["~~",["del"]]]:[]:[...p>=3?[[d.repeat(3),["em","strong"]]]:[],...p>=2?[[d.repeat(2),["strong"]]]:[],[d,["em"]]],g=!1;if(f)for(let[R,O]of a){if(c.has(R))continue;let P=o+R.length,w=Qt(t,P,R);if(w===-1){c.add(R);continue}if(w===P)continue;l();let U=n;for(let N of O)U=C(e,N,U);ge(e,t.slice(P,w),U,r+1),o=w+R.length,g=!0;break}g||(s+=t.slice(o,i),o=i);continue}s+=d,o++}l()}var rn="http://www.w3.org/1999/xhtml",sn=new Set(["script","style","iframe","frame","frameset","object","embed","applet","base","link","meta","template","noscript"]),ie={href:{on:["a","area"],holds:"link"},src:{on:["img","video","audio","source"],holds:"media"},alt:{on:["img","area"],holds:"text"},title:{on:null,holds:"text"},"aria-label":{on:null,holds:"text"},placeholder:{on:["input","textarea"],holds:"text"},datetime:{on:["time","del","ins"],holds:"text"}},le=e=>e.namespaceURI===rn,he=e=>!sn.has(e.localName.toLowerCase());function Fe(e,t){if(!he(e))return"refused-element";let n=Oe(t);return n===null?"type":(e.textContent=n,null)}function St(e,t,n){return!he(e)||!le(e)?"refused-element":typeof t!="string"?"type":(e.replaceChildren(gt(t,e.ownerDocument,n.base)),null)}function Rt(e,t,n){return typeof e!="string"?null:ct(e)?at(e,{...t.apiUrl?{apiUrl:t.apiUrl}:{},...n?{width:n}:{}}):H(e,t.base,"media")}function At(e,t,n,r){if(!le(e)||e.localName!=="img")return"refused-element";if(typeof t!="string")return"type";let s=Rt(t,n,r);return s===null?"unsafe-url":(e.removeAttribute("srcset"),e.setAttribute("src",s),null)}function vt(e,t){return!he(e)||(e.localName==="img"||t==="markdown")&&!le(e)?"refused-element":null}function De(e,t){let n=t.toLowerCase(),r=Object.prototype.hasOwnProperty.call(ie,n)?ie[n]:void 0;return r?!he(e)||!le(e)?"refused-element":r.on!==null&&!r.on.includes(e.localName)?"unsupported":null:"unsupported"}function Tt(e,t,n,r,s){let l=De(e,t);if(l)return l;let c=t.toLowerCase(),o=ie[c];if(o.holds==="text"){let i=Oe(n);return i===null?"type":(e.setAttribute(c,i),null)}if(typeof n!="string")return"type";let d=o.holds==="media"?Rt(n,r,e.localName==="img"?s:void 0):H(n,r.base,"link");return d===null?"unsafe-url":(e.setAttribute(c,d),null)}function xt(e,t){return!le(e)||e.localName!=="a"&&e.localName!=="area"?"unsupported":(e.setAttribute("href",t),null)}function Z(e,t){t?e.removeAttribute("hidden"):e.setAttribute("hidden","")}var Et=["text","markdown","date","datetime","number"],on=/^\d{4}-\d{2}-\d{2}$/,ln=/^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;function Mt(e,t,n){let r=n&&/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(n)?n:void 0;try{if(t==="number"){let c=typeof e=="number"?e:typeof e=="string"&&e.trim()!==""?Number(e):NaN;return Number.isFinite(c)?new Intl.NumberFormat(r).format(c):null}if(typeof e!="string"||!ln.test(e))return null;let s=new Date(e);if(Number.isNaN(s.getTime()))return null;let l=on.test(e);return new Intl.DateTimeFormat(r,{dateStyle:"long",...t==="datetime"&&!l?{timeStyle:"short"}:{},...l?{timeZone:"UTC"}:{}}).format(s)}catch{return null}}var S="data-mapled-",an=new Set(["bind","format","width","show","hide","link","list","each","record","slug","slug-param","sort","limit","filter","expand","empty","form","form-state","form-sent","form-failed","consent","end-preview","state","preview","key","api","live","locale","type"]),ce=/^[a-z0-9][a-z0-9_-]{0,63}$/,un=/^mk_[A-Za-z0-9_]{8,128}$/,cn=4,dn=100,Ot=2,Y=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);function ue(e,t=0){if(!Y(e))return!1;let{data:n,expanded:r,expandedBlocks:s}=e;if(!Y(n))return!1;let l=o=>Y(o)&&(t>=Ot?Object.keys(o).length===0:Object.values(o).every(d=>d===null||(Array.isArray(d)?d.every(i=>ue(i,t+1)):ue(d,t+1))));if(r!==void 0&&!l(r))return!1;if(s===void 0)return!0;if(!Y(s))return!1;let c=Object.entries(s);return t>=Ot?c.length===0:c.every(([o,d])=>{let i=Object.prototype.hasOwnProperty.call(n,o)?n[o]:void 0;return Array.isArray(d)&&(!Array.isArray(i)||d.length===i.length)&&d.every(l)})}var fn=e=>Array.isArray(e)&&e.every(t=>ue(t));function j(e){let t=e.getAttribute("id");return`${e.localName}${t&&/^[\w-]{1,40}$/.test(t)?`#${t}`:""}`}var be=e=>(e??"").split(",").map(t=>t.trim()).filter(t=>/^[a-z0-9][a-z0-9_.-]{0,127}$/.test(t));function Pt(e){let t={plain:null,typed:new Map,all:[],bad:[]};for(let n of Array.from(e.children)){if(n.localName!=="template")continue;let r=n;t.all.push(r);let s=r.getAttribute(`${S}type`);s===null?t.plain??(t.plain=r):ce.test(s.trim())?t.typed.has(s.trim())||t.typed.set(s.trim(),r):t.bad.push(r)}return t}function pn(e){let t=e.data;if(t===null||typeof t!="object"||Array.isArray(t)||!Object.prototype.hasOwnProperty.call(t,"_type"))return null;let n=t._type;return typeof n=="string"&&ce.test(n)?n:null}function _e(e,t){let n=null,r=()=>n??(n={format:"text",attrs:[],expand:[]});for(let o of Array.from(e.attributes)){if(!o.name.startsWith(S))continue;let d=o.name.slice(S.length);if(d==="bind")r().bind=o.value;else if(d.startsWith("bind-")){let i=d.slice(5);Object.prototype.hasOwnProperty.call(ie,i)?r().attrs.push([i,o.value]):t.push({path:o.value.slice(0,80),reason:"unsupported",on:`${j(e)}[${o.name.slice(0,60)}]`})}else d==="show"?r().show=o.value:d==="hide"?r().hide=o.value:d==="link"?r().link=o.value:an.has(d)||t.push({path:o.value.slice(0,80),reason:"unsupported",on:`${j(e)}[${o.name.slice(0,60)}]`})}if(!n)return null;let s=n,l=e.getAttribute(`${S}format`);l!==null&&(Et.includes(l)?s.format=l:t.push({path:l.slice(0,80),reason:"bad-path",on:`${j(e)}[${S}format]`}));let c=parseInt(e.getAttribute(`${S}width`)??"",10);return c>=16&&c<=4096&&(s.width=c),s.expand=be(e.getAttribute(`${S}expand`)),s}function mn(e,t){let n={},r=e.getAttribute(`${S}sort`);r!==null&&(/^-?[a-z0-9][a-z0-9_-]{0,63}$/.test(r.trim())?n.sort=r.trim():t.push({path:r.slice(0,80),reason:"bad-path",on:`${j(e)}[${S}sort]`}));let s=parseInt(e.getAttribute(`${S}limit`)??"",10);s>=1&&s<=100&&(n.limit=s);let l=e.getAttribute(`${S}filter`);if(l!==null)for(let o of l.split(";")){if(o.trim()==="")continue;let d=o.indexOf("="),i=d===-1?"":o.slice(0,d).trim(),p=d===-1?"":o.slice(d+1).trim();ce.test(i)&&p!==""&&p.length<=200?(n.filter??(n.filter={}))[i]=p:t.push({path:o.trim().slice(0,80),reason:"bad-path",on:`${j(e)}[${S}filter]`})}let c=be(e.getAttribute(`${S}expand`));return c.length>0&&(n.expand=c),n}function ye(e,t){let n={bound:[],eaches:[],lists:[],records:[],issues:[]},r=s=>{if(s.hasAttributes()){let l=s.getAttribute(`${S}list`),c=s.getAttribute(`${S}record`),o=s.getAttribute(`${S}each`);if(l!==null||c!==null){let i=(l??c??"").trim();if(!t)n.issues.push({path:i.slice(0,80),reason:"unsupported",on:j(s)});else if(!ce.test(i))n.issues.push({path:i.slice(0,80),reason:"bad-path",on:j(s)});else if(l!==null)n.lists.push({el:s,collection:i,options:mn(s,n.issues)});else{let p=s.getAttribute(`${S}slug-param`),f=s.getAttribute(`${S}slug`)??(p===null?null:new URLSearchParams(s.ownerDocument.location?.search??"").get(p)),a=ye(s,!0);for(let R of a.records)n.issues.push({path:R.collection,reason:"unsupported",on:j(R.el)});n.lists.push(...a.lists),n.issues.push(...a.issues);let g=_e(s,n.issues);g&&a.bound.unshift({el:s,d:g}),n.records.push({el:s,collection:i,slug:f!==null&&f.trim()!==""&&f.length<=200?f.trim():null,expand:be(s.getAttribute(`${S}expand`)),block:{...a,lists:[],records:[],issues:[]}})}return}if(o!==null){n.eaches.push({el:s,path:o});return}let d=_e(s,n.issues);d&&n.bound.push({el:s,d})}for(let l of Array.from(s.children))r(l)};for(let s of Array.from(e.children))r(s);return n}function Ct(e){let t=new Map,n=(r,s=[])=>{let l=te(r)?.[0];if(!l)return;let c=t.get(l)??new Set;for(let o of s)c.add(o);t.set(l,c)};for(let{d:r}of e.bound){n(r.bind,r.expand);for(let[,s]of r.attrs)n(s,r.expand);n(r.show,r.expand),n(r.hide,r.expand);for(let s of(r.link??"").matchAll(/\{([^{}]*)\}/g))n(s[1],r.expand)}for(let r of e.eaches)n(r.path,be(r.el.getAttribute(`${S}expand`)));return t}function ae(e,t){let n=te(t);if(!n)return{status:"bad-path"};if(e.kind==="record")return{status:"value",...Me(e.source,n)};if(n.length<2)return{status:"bad-path"};let r=e.singles.get(n[0]);return!r||r.status!=="ok"?{status:r?.status==="failed"?"failed":"missing"}:{status:"value",...Me(r.value,n.slice(1))}}function je(e){if(typeof e?.key!="string"||!un.test(e.key))throw new Error("Mapled: data-mapled-key takes the delivery key (mk_\u2026) \u2014 the one key that is safe in a page. A server key or a secret never goes into HTML.");if(typeof document>"u")throw new Error("Mapled: @mapled/vanilla fills a page \u2014 it runs in a browser. On a server read with @mapled/client.");let t=e.root??document.documentElement,n=t.ownerDocument,r=ut({key:e.key,apiUrl:e.apiUrl,appUrl:e.appUrl,fetch:e.fetch,...e.locale?{locale:e.locale}:{}}),s={apiUrl:e.apiUrl,base:n.baseURI},l=new Map,c=u=>{let m=l.get(u);return m||l.set(u,m={attrs:new Map}),m},o=u=>{let m=c(u);m.nodes??(m.nodes=Array.from(u.childNodes))},d=(u,m)=>{let A=c(u);A.attrs.has(m)||A.attrs.set(m,u.getAttribute(m))},i=()=>{for(let[u,m]of l){m.nodes&&u.replaceChildren(...m.nodes);for(let[A,h]of m.attrs)h===null?u.removeAttribute(A):u.setAttribute(A,h)}l.clear()},p=[],f=0,a=(u,m,A)=>p.push({path:(m??"").trim().slice(0,120),reason:A,on:j(u)});function g(u,m,A){if(m.bind!==void 0){let h=ae(A,m.bind),y=vt(u,m.format);if(h.status!=="value")a(u,m.bind,h.status);else if(y)a(u,m.bind,y);else{let k=u.localName==="img";if(k?(d(u,"src"),d(u,"srcset"),d(u,"hidden")):o(u),ne(h.value))k?Z(u,!1):u.textContent="",a(u,m.bind,"empty");else{let v;if(k)v=At(u,h.value,s,m.width);else if(m.format==="markdown")v=St(u,h.value,s);else if(m.format==="text")v=Fe(u,h.value);else{let T=Mt(h.value,m.format,u.closest("[lang]")?.getAttribute("lang")??void 0);v=T===null?"type":Fe(u,T)}v?a(u,m.bind,v):f++}}}for(let[h,y]of m.attrs){let k=ae(A,y);if(k.status!=="value"){a(u,y,k.status);continue}let v=De(u,h);if(v){a(u,y,v);continue}if(d(u,h),ne(k.value)){h==="alt"?u.setAttribute("alt",""):u.removeAttribute(h),a(u,y,"empty");continue}let T=u.getAttribute(h),x=Tt(u,h,k.value,s,m.width);x?(T===null&&u.removeAttribute(h),a(u,y,x)):f++}for(let[h,y]of[[m.show,!0],[m.hide,!1]]){if(h===void 0)continue;let k=ae(A,h);if(k.status!=="value"){a(u,h,k.status);continue}d(u,"hidden");let v=!ne(k.value)&&k.value!==!1;Z(u,v===y),f++}if(m.link!==void 0){let h=[],y=dt(m.link,s.base,k=>{let v=ae(A,k.join("."));if(v.status==="value")return v.value;h.push(v.status)});if(h[0])a(u,m.link,h[0]);else if(!y.ok)a(u,y.path,y.reason);else{d(u,"href");let k=xt(u,y.url);k?a(u,m.link,k):f++}}}function R(u,m,A,h,y){let k=Pt(u);for(let E of k.bad)a(E,E.getAttribute(`${S}type`)??"","bad-path");if(!k.plain&&k.typed.size===0){a(u,"template","unsupported");return}o(u);let v=[...k.all];for(let E of Array.from(u.children))E.hasAttribute(`${S}empty`)&&(d(E,"hidden"),Z(E,m.length===0),v.push(E));let T=[],x=!1;for(let E of m.slice(0,dn)){let ee=y?pn(E):null,G=(ee===null?void 0:k.typed.get(ee))??k.plain;if(!G){x=!0;continue}let X=G.content.cloneNode(!0);O(ye(X,!1),{kind:"record",source:E},A+1),T.push(...Array.from(X.childNodes))}x&&a(u,h,"no-template"),u.replaceChildren(...v,...T),f++}function O(u,m,A){p.push(...u.issues);for(let{el:h,d:y}of u.bound)g(h,y,m);for(let h of u.eaches){let y=ae(m,h.path);if(y.status!=="value"){a(h.el,h.path,y.status);continue}if(A>=cn){a(h.el,h.path,"unsupported");continue}if(y.linked!==void 0){let x=Array.isArray(y.linked)?y.linked:y.linked===null?[]:[y.linked];x.length===0&&a(h.el,h.path,"empty"),R(h.el,x,A,h.path,!1);continue}let k=y.value,v=Array.isArray(k)?k:ne(k)?[]:[k];if(v.some(x=>!Y(x))){a(h.el,h.path,"type");continue}v.length===0&&a(h.el,h.path,"empty");let T=Array.isArray(k)&&Array.isArray(y.blocks)?y.blocks:[];R(h.el,v.map((x,E)=>Y(T[E])?{data:x,expanded:T[E]}:{data:x}),A,h.path,!0)}}async function P(u,m){try{let A=await u();return A===null?{status:"missing"}:m(A)?{status:"ok",value:A}:{status:"failed",answered:!0}}catch(A){return A instanceof V&&A.status===404&&A.code!=="RELEASE_NOT_FOUND"?{status:"missing"}:{status:"failed"}}}let w=null,U="",N=null,L,W=!1,I=0,F=-1,J=3,$=typeof e.live=="number"?e.live:void 0;function Ke(){i(),w={state:"fallback",release:null,preview:!1,bound:0,issues:[]},t.setAttribute(`${S}state`,"fallback"),t.removeAttribute(`${S}preview`)}function Be(){I++,clearTimeout(L),w?.preview&&Ke()}function Ut(){clearTimeout(L);let u=B();if(!u||W)return;let m=Date.parse(u.expiresAt)-Date.now();L=setTimeout(()=>{B()===null&&Be(),ke()},Math.min(Math.max(m,0)+1,2147483647))}async function He(u,m=1){let A=w===null;A&&t.setAttribute(`${S}state`,"loading");let h=I,y=await r.isPreview().catch(()=>!1),k=y?B()?.draftToken??null:null;if(w!==null&&w.preview&&!y&&Ke(),!y&&u!==void 0&&w!==null&&w.state==="ready"&&!w.preview&&w.release!==null&&u<=w.release)return w;let v=b=>{w=b,F=h,t.setAttribute(`${S}state`,b.state),t.toggleAttribute(`${S}preview`,b.preview);let M=b.issues.filter(_=>_.reason!=="empty"),D=M.map(_=>`${_.path} (${_.reason}) on ${_.on}`).join("; ");return D!==U&&(U=D,M.length>0&&console.warn(`[mapled] ${M.length===1?"1 place":`${M.length} places`} couldn't be filled: ${D}`)),n.dispatchEvent(new CustomEvent(A?"mapled:ready":"mapled:update",{detail:b})),b.preview?Ut():(clearTimeout(L),e.live&&N===null&&(N=r.watch(_=>{ke(_.release)},{interval:$,from:b.state==="ready"?b.release:null}))),b},T=null;if(!y)if(u!==void 0)T=u;else try{let b=await r.getRelease();if(b===null)return i(),v({state:"unpublished",release:null,preview:y,bound:0,issues:[]});T=b.release}catch{return w!==null&&w.state==="ready"?w:v({state:"fallback",release:null,preview:y,bound:0,issues:[]})}let x=T===null?{}:{release:T},E=ye(t,!0),ee=_e(t,E.issues);ee&&E.bound.unshift({el:t,d:ee});let G=new Map,X=new Map,de=new Map,fe=[];for(let[b,M]of Ct(E))fe.push(P(()=>r.getSingle(b,{...x,...M.size>0?{expand:[...M]}:{}}),ue).then(D=>G.set(b,D)));for(let b of E.lists){let M=Pt(b.el).plain,D=M?[...Ct(ye(M.content,!1)).keys()]:[];fe.push(P(async()=>(await r.getRecords(b.collection,{...b.options,...x,...D.length>0?{fields:D}:{}})).records,fn).then(_=>X.set(b,_)))}for(let b of E.records){if(b.slug===null){de.set(b,{status:"missing"});continue}let M=b.slug;fe.push(P(()=>r.getRecordBySlug(b.collection,M,{...x,...b.expand.length>0?{expand:b.expand}:{}}),ue).then(D=>de.set(b,D)))}await Promise.all(fe);let Ve=await r.isPreview().catch(()=>!1)?B()?.draftToken??null:null;if(h!==I||Ve!==k)return m<J?He(u,m+1):(i(),v({state:"fallback",release:null,preview:Ve!==null,bound:0,issues:[]}));let Ze=[...G.values(),...X.values(),...de.values()];if(Ze.length>0&&Ze.every(b=>b.status==="failed"&&!b.answered))return w!==null&&w.state==="ready"?w:v({state:"fallback",release:T,preview:y,bound:0,issues:[]});i(),p=[],f=0,O(E,{kind:"page",singles:G},0);for(let b of E.lists){let M=X.get(b);M?.status==="ok"?R(b.el,M.value,0,b.collection,!1):a(b.el,b.collection,M?.status??"failed")}for(let b of E.records){let M=de.get(b);M?.status==="ok"?O(b.block,{kind:"record",source:M.value},0):a(b.el,b.collection,M?.status??"failed")}return We(),v({state:"ready",release:T,preview:y,bound:f,issues:p})}let qe=new WeakSet,ze=new WeakSet;function We(){for(let u of Array.from(t.querySelectorAll(`form[${S}form]`)))qe.has(u)||(qe.add(u),u.addEventListener("submit",m=>{m.preventDefault(),Nt(u)}))}async function Nt(u){if(u.getAttribute(`${S}form-state`)==="sending")return;let m=(u.getAttribute(`${S}form`)??"").trim(),A=u.querySelector(`[${S}form-sent]`),h=u.querySelector(`[${S}form-failed]`),y=Array.from(u.querySelectorAll("button, input[type=submit]")).filter(x=>!x.disabled);u.setAttribute(`${S}form-state`,"sending");for(let x of y)x.disabled=!0;let k=u.querySelector(`input[type=checkbox][${S}consent]`),v=k?.checked?(k.labels?.[0]?.textContent??k.closest("label")?.textContent??"").trim().slice(0,500):"",T=ce.test(m)?await xe(m,u,{key:e.key,apiUrl:e.apiUrl,fetch:e.fetch,...v?{consent:v}:{}}):{ok:!1,status:0,code:"BAD_FORM",message:"This form isn't set up yet."};for(let x of y)x.disabled=!1;u.setAttribute(`${S}form-state`,T.ok?"sent":"failed"),T.ok&&u.reset(),A&&Z(A,T.ok),h&&(!T.ok&&(ze.has(h)||(h.textContent??"").trim()==="")&&(ze.add(h),h.textContent=T.message),Z(h,!T.ok)),n.dispatchEvent(new CustomEvent("mapled:form",{detail:T.ok?{form:m,ok:!0}:{form:m,ok:!1,status:T.status,code:T.code}}))}We();let we=async u=>{try{return await He(u)}catch(m){return console.error(`[mapled] ${m instanceof Error?m.message:"The page couldn't be filled."}`),w??{state:"fallback",release:null,preview:!1,bound:0,issues:[]}}},Q=we(),ke=u=>Q=Q.then(()=>we(u)),Ge=()=>{ve(),Be();let u=I;return Q=Q.then(()=>F>=u&&w!==null?w:we())},Xe=u=>{u.target?.closest?.(`[${S}end-preview]`)&&(u.preventDefault(),Ge())};return n.addEventListener("click",Xe),{ready:Q,get report(){return w},refresh:()=>ke(),endPreview:Ge,stop:()=>{W=!0,N?.(),N=()=>{},clearTimeout(L),n.removeEventListener("click",Xe)},client:r}}var $t="0.3.0";var Lt={version:$t,mount:je,page:null};window.Mapled=Lt;var q=document.currentScript;if(q instanceof HTMLScriptElement&&q.hasAttribute("data-mapled-key")){let e=q.getAttribute("data-mapled-live"),t=e===null?NaN:parseInt(e,10),n=()=>{try{Lt.page=je({key:q.getAttribute("data-mapled-key")??"",...q.getAttribute("data-mapled-api")?{apiUrl:q.getAttribute("data-mapled-api")}:{},...q.getAttribute("data-mapled-locale")?{locale:q.getAttribute("data-mapled-locale")}:{},...e===null?{}:{live:Number.isFinite(t)?t:!0}})}catch(r){console.error(r instanceof Error?r.message:"Mapled couldn't start.")}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",n,{once:!0}):n()}})();
|
|
7
|
+
`:"";continue}let a=Zt(i);if(a){Ke(e,a.text,W(e,`h${a.level}`,n),r),s++;continue}if(lt(i)){W(e,"hr",n),s++;continue}if(it(i)){let g=[];for(;s<t.length&&it(t[s]);)g.push(t[s].replace(/^ {0,3}> ?/,"")),s++;ct(e,g,W(e,"blockquote",n),r+1);continue}let d=Ee(i);if(d){s=Xn(e,t,s,d,n,r);continue}let l=[i.trimStart()];for(s++;s<t.length&&!st(t[s])&&!Gn(t[s]);)l.push(t[s].trimStart()),s++;Ke(e,l.join(`
|
|
8
|
+
`),W(e,"p",n),r)}}function Xn(e,t,n,r,s,i){let u=W(e,r.ordered?"ol":"ul",s);r.ordered&&r.start!==1&&u.setAttribute("start",String(r.start));let a=[],d=!1;for(;n<t.length;){let l=Ee(t[n]);if(!l||l.ordered!==r.ordered||l.indent!==r.indent||lt(t[n]))break;let g=l.indent+l.width,m=[l.rest];n++;let c=!1;for(;n<t.length;){let b=t[n];if(st(b)){c=!0,m.push(""),n++;continue}if(ve(b)<g)break;c&&m.some(x=>x!=="")&&!Ee(b.slice(g))&&(d=!0),c=!1,m.push(b.slice(g)),n++}for(;m.length>0&&m[m.length-1]==="";)m.pop();if(c&&n<t.length){let b=Ee(t[n]);b&&b.ordered===r.ordered&&b.indent===r.indent&&(d=!0)}a.push({lines:m,el:W(e,"li",u)})}for(let l of a)if(ct(e,l.lines,l.el,i+1),!d){for(let g of Array.from(l.el.childNodes))if(g.nodeName==="P"){for(;g.firstChild;)l.el.insertBefore(g.firstChild,g);l.el.removeChild(g)}}return n}var ut=e=>e===void 0||e===" "||e===`
|
|
9
|
+
`,Yt=e=>e!==void 0&&/[\p{L}\p{N}]/u.test(e);function Fe(e,t,n,r,s=""){let i=Math.min(e.length,r);for(let u=n;u<i;u++){if(e[u]===t)return u;if(s.includes(e[u]))return-1}return-1}function Te(e,t,n){let r=t;for(;e[r]===n;)r++;return r}function Jt(e,t){if(e[t]==="\\")return t+2;if(e[t]==="`"){let n=Te(e,t,"`"),r=Qt(e,n,n-t);return r===-1?n:r+(n-t)}return-1}function Qt(e,t,n){let r=e.indexOf("`",t);for(;r!==-1;){let s=Te(e,r,"`");if(s-r===n)return r;r=e.indexOf("`",s)}return-1}function Zn(e,t,n){let r=n[0],s=t;for(;s<e.length;){let i=Jt(e,s);if(i!==-1){s=i;continue}if(e[s]!==r){s++;continue}let u=Te(e,s,r),a=u-s;if((n.length===1?a===1||a>=3:a>=n.length)&&s>t&&!ut(e[s-1])&&(r!=="_"||!Yt(e[u])))return u-n.length;s=u}return-1}function Yn(e,t){let n=Fe(e,";",t+1,t+34,`
|
|
10
|
+
&`);if(n===-1)return null;let r=e.slice(t+1,n);if(r[0]==="#"){let i=r[1]==="x"||r[1]==="X",u=r.slice(i?2:1);if(!(i?/^[0-9a-fA-F]{1,6}$/:/^[0-9]{1,7}$/).test(u))return null;let a=parseInt(u,i?16:10);return{char:a>0&&a<=1114111&&!(a>=55296&&a<=57343)?String.fromCodePoint(a):"\uFFFD",end:n+1}}let s=Object.prototype.hasOwnProperty.call(qt,r)?qt[r]:void 0;return s===void 0?null:{char:s,end:n+1}}var en=e=>e.replace(/\\([!-/:-@[-`{-~])/g,"$1");function Jn(e,t){if(e[t]!=="(")return null;let n=Math.min(e.length,t+Gt+1024),r=t+1;for(;r<n&&ut(e[r])&&e[r]!==void 0;)r++;let s="";if(e[r]==="<"){let u=Fe(e,">",r+1,n,`
|
|
11
|
+
<`);if(u===-1)return null;s=e.slice(r+1,u),r=u+1}else{let u=r,a=0;for(;r<n;){let d=e[r];if(d==="\\"&&r+1<n){r+=2;continue}if(d===" "||d===`
|
|
12
|
+
`)break;if(d==="("&&a++,d===")"){if(a===0)break;a--}r++}s=e.slice(u,r)}for(;r<n&&(e[r]===" "||e[r]===`
|
|
13
|
+
`);)r++;let i=e[r];if(i==='"'||i==="'"||i==="("){let u=Fe(e,i==="("?")":i,r+1,n);if(u===-1)return null;for(r=u+1;r<n&&(e[r]===" "||e[r]===`
|
|
14
|
+
`);)r++}return e[r]!==")"?null:{address:en(s),end:r+1}}function at(e,t,n=!1){let r=t+1;for(;r<e.length;){let i=Jt(e,r);if(i!==-1){r=i;continue}if(!n&&e[r]==="!"&&e[r+1]==="["){let u=at(e,r+1,!0);if(!u)return null;r=u.end;continue}if(e[r]==="[")return null;if(e[r]==="]")break;r++}if(r>=e.length)return null;let s=Jn(e,r+1);return s?{label:e.slice(t+1,r),address:s.address,end:s.end}:null}var Qn=/^(?:[a-z][a-z0-9+.-]{1,31}:[^\s<>]*|[^\s<>@]+@[^\s<>@]+\.[^\s<>@]+)$/i;function Ke(e,t,n,r){if(r>=Vt){n.appendChild(e.doc.createTextNode(t));return}let s="",i=()=>{s!==""&&n.appendChild(e.doc.createTextNode(s)),s=""},u=new Set,a=0;for(;a<t.length;){let d=t[a];if(d==="\\"){let l=t[a+1];if(l===`
|
|
15
|
+
`)for(i(),W(e,"br",n),a+=2;t[a]===" ";)a++;else l!==void 0&&Vn.includes(l)?(s+=l,a+=2):(s+=d,a++);continue}if(d===`
|
|
16
|
+
`){let l=s.endsWith(" "),g=s.length;for(;g>0&&s[g-1]===" ";)g--;for(s=s.slice(0,g),l?(i(),W(e,"br",n)):s+=`
|
|
17
|
+
`,a++;t[a]===" ";)a++;continue}if(d==="`"){let l=Te(t,a,"`"),g=Qt(t,l,l-a);if(g===-1){s+=t.slice(a,l),a=l;continue}let m=t.slice(l,g).replace(/\n/g," ");m.length>1&&m.startsWith(" ")&&m.endsWith(" ")&&m.trim()!==""&&(m=m.slice(1,-1)),i(),W(e,"code",n).textContent=m,a=g+(l-a);continue}if(d==="!"&&t[a+1]==="["){let l=at(t,a+1);if(l){let g=en(l.label),m=ne(l.address.trim(),e.base,"media");if(m===null)s+=g;else{i();let c=W(e,"img",n);c.setAttribute("src",m),c.setAttribute("alt",g),c.setAttribute("loading","lazy")}a=l.end;continue}}if(d==="["){let l=at(t,a);if(l){let g=ne(l.address.trim(),e.base,"link");i();let m=g===null?n:W(e,"a",n);g!==null&&m.setAttribute("href",g),Ke(e,l.label,m,r+1),a=l.end;continue}}if(d==="<"){let l=Fe(t,">",a+1,a+Gt,`
|
|
18
|
+
<`),g=l===-1?null:t.slice(a+1,l);if(g!==null&&Qn.test(g)){let m=ne(g.includes(":")?g:`mailto:${g}`,e.base,"link");if(m!==null){i();let c=W(e,"a",n);c.setAttribute("href",m),c.textContent=g,a=l+1;continue}}}if(d==="&"){let l=Yn(t,a);if(l){s+=l.char,a=l.end;continue}}if(d==="*"||d==="_"||d==="~"){let l=Te(t,a,d),g=l-a,m=!ut(t[l])&&(d!=="_"||!Yt(t[a-1])),c=d==="~"?g>=2?[["~~",["del"]]]:[]:[...g>=3?[[d.repeat(3),["em","strong"]]]:[],...g>=2?[[d.repeat(2),["strong"]]]:[],[d,["em"]]],b=!1;if(m)for(let[x,_]of c){if(u.has(x))continue;let D=a+x.length,k=Zn(t,D,x);if(k===-1){u.add(x);continue}if(k===D)continue;i();let N=n;for(let q of _)N=W(e,q,N);Ke(e,t.slice(D,k),N,r+1),a=k+x.length,b=!0;break}b||(s+=t.slice(a,l),a=l);continue}s+=d,a++}i()}var er="http://www.w3.org/1999/xhtml",tr=new Set(["script","style","iframe","frame","frameset","object","embed","applet","base","link","meta","template","noscript"]),xe={href:{on:["a","area"],holds:"link"},src:{on:["img","video","audio","source"],holds:"media"},alt:{on:["img","area"],holds:"text"},title:{on:null,holds:"text"},"aria-label":{on:null,holds:"text"},placeholder:{on:["input","textarea"],holds:"text"},datetime:{on:["time","del","ins"],holds:"text"}},Me=e=>e.namespaceURI===er,je=e=>!tr.has(e.localName.toLowerCase());function dt(e,t){if(!je(e))return"refused-element";let n=rt(t);return n===null?"type":(e.textContent=n,null)}function tn(e,t,n){return!je(e)||!Me(e)?"refused-element":typeof t!="string"?"type":(e.replaceChildren(Xt(t,e.ownerDocument,n.base)),null)}function nn(e,t,n){return typeof e!="string"?null:zt(e)?Ht(e,{...t.apiUrl?{apiUrl:t.apiUrl}:{},...n?{width:n}:{}}):ne(e,t.base,"media")}function rn(e,t,n,r){if(!Me(e)||e.localName!=="img")return"refused-element";if(typeof t!="string")return"type";let s=nn(t,n,r);return s===null?"unsafe-url":(e.removeAttribute("srcset"),e.setAttribute("src",s),null)}function sn(e,t){return!je(e)||(e.localName==="img"||t==="markdown")&&!Me(e)?"refused-element":null}function ft(e,t){let n=t.toLowerCase(),r=Object.prototype.hasOwnProperty.call(xe,n)?xe[n]:void 0;return r?!je(e)||!Me(e)?"refused-element":r.on!==null&&!r.on.includes(e.localName)?"unsupported":null:"unsupported"}function on(e,t,n,r,s){let i=ft(e,t);if(i)return i;let u=t.toLowerCase(),a=xe[u];if(a.holds==="text"){let l=rt(n);return l===null?"type":(e.setAttribute(u,l),null)}if(typeof n!="string")return"type";let d=a.holds==="media"?nn(n,r,e.localName==="img"?s:void 0):ne(n,r.base,"link");return d===null?"unsafe-url":(e.setAttribute(u,d),null)}function an(e,t){return!Me(e)||e.localName!=="a"&&e.localName!=="area"?"unsupported":(e.setAttribute("href",t),null)}function fe(e,t){t?e.removeAttribute("hidden"):e.setAttribute("hidden","")}var ln=["text","markdown","date","datetime","number"],nr=/^\d{4}-\d{2}-\d{2}$/,rr=/^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;function cn(e,t,n){let r=n&&/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(n)?n:void 0;try{if(t==="number"){let u=typeof e=="number"?e:typeof e=="string"&&e.trim()!==""?Number(e):NaN;return Number.isFinite(u)?new Intl.NumberFormat(r).format(u):null}if(typeof e!="string"||!rr.test(e))return null;let s=new Date(e);if(Number.isNaN(s.getTime()))return null;let i=nr.test(e);return new Intl.DateTimeFormat(r,{dateStyle:"long",...t==="datetime"&&!i?{timeStyle:"short"}:{},...i?{timeZone:"UTC"}:{}}).format(s)}catch{return null}}var He="0.4.0";var M="data-mapled-",sr=new Set(["bind","format","width","show","hide","link","list","each","record","slug","slug-param","sort","limit","filter","expand","empty","form","form-state","form-sent","form-failed","consent","end-preview","state","preview","key","api","live","locale","type"]),Ce=/^[a-z0-9][a-z0-9_-]{0,63}$/,or=/^mk_[A-Za-z0-9_]{8,128}$/,ir=4,ar=100,un=2,pe=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);function Pe(e,t=0){if(!pe(e))return!1;let{data:n,expanded:r,expandedBlocks:s}=e;if(!pe(n))return!1;let i=a=>pe(a)&&(t>=un?Object.keys(a).length===0:Object.values(a).every(d=>d===null||(Array.isArray(d)?d.every(l=>Pe(l,t+1)):Pe(d,t+1))));if(r!==void 0&&!i(r))return!1;if(s===void 0)return!0;if(!pe(s))return!1;let u=Object.entries(s);return t>=un?u.length===0:u.every(([a,d])=>{let l=Object.prototype.hasOwnProperty.call(n,a)?n[a]:void 0;return Array.isArray(d)&&(!Array.isArray(l)||d.length===l.length)&&d.every(i)})}var lr=e=>Array.isArray(e)&&e.every(t=>Pe(t));function Q(e){let t=e.getAttribute("id");return`${e.localName}${t&&/^[\w-]{1,40}$/.test(t)?`#${t}`:""}`}var ze=e=>(e??"").split(",").map(t=>t.trim()).filter(t=>/^[a-z0-9][a-z0-9_.-]{0,127}$/.test(t));function dn(e){let t={plain:null,typed:new Map,all:[],bad:[]};for(let n of Array.from(e.children)){if(n.localName!=="template")continue;let r=n;t.all.push(r);let s=r.getAttribute(`${M}type`);s===null?t.plain??(t.plain=r):Ce.test(s.trim())?t.typed.has(s.trim())||t.typed.set(s.trim(),r):t.bad.push(r)}return t}function cr(e){let t=e.data;if(t===null||typeof t!="object"||Array.isArray(t)||!Object.prototype.hasOwnProperty.call(t,"_type"))return null;let n=t._type;return typeof n=="string"&&Ce.test(n)?n:null}function pt(e,t){let n=null,r=()=>n??(n={format:"text",attrs:[],expand:[]});for(let a of Array.from(e.attributes)){if(!a.name.startsWith(M))continue;let d=a.name.slice(M.length);if(d==="bind")r().bind=a.value;else if(d.startsWith("bind-")){let l=d.slice(5);Object.prototype.hasOwnProperty.call(xe,l)?r().attrs.push([l,a.value]):t.push({path:a.value.slice(0,80),reason:"unsupported",on:`${Q(e)}[${a.name.slice(0,60)}]`})}else d==="show"?r().show=a.value:d==="hide"?r().hide=a.value:d==="link"?r().link=a.value:sr.has(d)||t.push({path:a.value.slice(0,80),reason:"unsupported",on:`${Q(e)}[${a.name.slice(0,60)}]`})}if(!n)return null;let s=n,i=e.getAttribute(`${M}format`);i!==null&&(ln.includes(i)?s.format=i:t.push({path:i.slice(0,80),reason:"bad-path",on:`${Q(e)}[${M}format]`}));let u=parseInt(e.getAttribute(`${M}width`)??"",10);return u>=16&&u<=4096&&(s.width=u),s.expand=ze(e.getAttribute(`${M}expand`)),s}function ur(e,t){let n={},r=e.getAttribute(`${M}sort`);r!==null&&(/^-?[a-z0-9][a-z0-9_-]{0,63}$/.test(r.trim())?n.sort=r.trim():t.push({path:r.slice(0,80),reason:"bad-path",on:`${Q(e)}[${M}sort]`}));let s=parseInt(e.getAttribute(`${M}limit`)??"",10);s>=1&&s<=100&&(n.limit=s);let i=e.getAttribute(`${M}filter`);if(i!==null)for(let a of i.split(";")){if(a.trim()==="")continue;let d=a.indexOf("="),l=d===-1?"":a.slice(0,d).trim(),g=d===-1?"":a.slice(d+1).trim();Ce.test(l)&&g!==""&&g.length<=200?(n.filter??(n.filter={}))[l]=g:t.push({path:a.trim().slice(0,80),reason:"bad-path",on:`${Q(e)}[${M}filter]`})}let u=ze(e.getAttribute(`${M}expand`));return u.length>0&&(n.expand=u),n}function Be(e,t){let n={bound:[],eaches:[],lists:[],records:[],issues:[]},r=s=>{if(s.hasAttributes()){let i=s.getAttribute(`${M}list`),u=s.getAttribute(`${M}record`),a=s.getAttribute(`${M}each`);if(i!==null||u!==null){let l=(i??u??"").trim();if(!t)n.issues.push({path:l.slice(0,80),reason:"unsupported",on:Q(s)});else if(!Ce.test(l))n.issues.push({path:l.slice(0,80),reason:"bad-path",on:Q(s)});else if(i!==null)n.lists.push({el:s,collection:l,options:ur(s,n.issues)});else{let g=s.getAttribute(`${M}slug-param`),m=s.getAttribute(`${M}slug`)??(g===null?null:new URLSearchParams(s.ownerDocument.location?.search??"").get(g)),c=Be(s,!0);for(let x of c.records)n.issues.push({path:x.collection,reason:"unsupported",on:Q(x.el)});n.lists.push(...c.lists),n.issues.push(...c.issues);let b=pt(s,n.issues);b&&c.bound.unshift({el:s,d:b}),n.records.push({el:s,collection:l,slug:m!==null&&m.trim()!==""&&m.length<=200?m.trim():null,expand:ze(s.getAttribute(`${M}expand`)),block:{...c,lists:[],records:[],issues:[]}})}return}if(a!==null){n.eaches.push({el:s,path:a});return}let d=pt(s,n.issues);d&&n.bound.push({el:s,d})}for(let i of Array.from(s.children))r(i)};for(let s of Array.from(e.children))r(s);return n}function fn(e){let t=new Map,n=(r,s=[])=>{let i=Se(r)?.[0];if(!i)return;let u=t.get(i)??new Set;for(let a of s)u.add(a);t.set(i,u)};for(let{d:r}of e.bound){n(r.bind,r.expand);for(let[,s]of r.attrs)n(s,r.expand);n(r.show,r.expand),n(r.hide,r.expand);for(let s of(r.link??"").matchAll(/\{([^{}]*)\}/g))n(s[1],r.expand)}for(let r of e.eaches)n(r.path,ze(r.el.getAttribute(`${M}expand`)));return t}function Oe(e,t){let n=Se(t);if(!n)return{status:"bad-path"};if(e.kind==="record")return{status:"value",...nt(e.source,n)};if(n.length<2)return{status:"bad-path"};let r=e.singles.get(n[0]);return!r||r.status!=="ok"?{status:r?.status==="failed"?"failed":"missing"}:{status:"value",...nt(r.value,n.slice(1))}}function mt(e){if(typeof e?.key!="string"||!or.test(e.key))throw new Error("Mapled: data-mapled-key takes the delivery key (mk_\u2026) \u2014 the one key that is safe in a page. A server key or a secret never goes into HTML.");if(typeof document>"u")throw new Error("Mapled: @mapled/vanilla fills a page \u2014 it runs in a browser. On a server read with @mapled/client.");let t=e.root??document.documentElement,n=t.ownerDocument,r=Bt({key:e.key,apiUrl:e.apiUrl,appUrl:e.appUrl,fetch:e.fetch,...e.locale?{locale:e.locale}:{}}),s={apiUrl:e.apiUrl,base:n.baseURI},i=new Map,u=f=>{let y=i.get(f);return y||i.set(f,y={attrs:new Map}),y},a=f=>{let y=u(f);y.nodes??(y.nodes=Array.from(f.childNodes))},d=(f,y)=>{let v=u(f);v.attrs.has(y)||v.attrs.set(y,f.getAttribute(y))},l=()=>{for(let[f,y]of i){y.nodes&&f.replaceChildren(...y.nodes);for(let[v,h]of y.attrs)h===null?f.removeAttribute(v):f.setAttribute(v,h)}i.clear()},g=[],m=0,c=(f,y,v)=>g.push({path:(y??"").trim().slice(0,120),reason:v,on:Q(f)});function b(f,y,v){if(y.bind!==void 0){let h=Oe(v,y.bind),E=sn(f,y.format);if(h.status!=="value")c(f,y.bind,h.status);else if(E)c(f,y.bind,E);else{let T=f.localName==="img";if(T?(d(f,"src"),d(f,"srcset"),d(f,"hidden")):a(f),Re(h.value))T?fe(f,!1):f.textContent="",c(f,y.bind,"empty");else{let O;if(T)O=rn(f,h.value,s,y.width);else if(y.format==="markdown")O=tn(f,h.value,s);else if(y.format==="text")O=dt(f,h.value);else{let C=cn(h.value,y.format,f.closest("[lang]")?.getAttribute("lang")??void 0);O=C===null?"type":dt(f,C)}O?c(f,y.bind,O):m++}}}for(let[h,E]of y.attrs){let T=Oe(v,E);if(T.status!=="value"){c(f,E,T.status);continue}let O=ft(f,h);if(O){c(f,E,O);continue}if(d(f,h),Re(T.value)){h==="alt"?f.setAttribute("alt",""):f.removeAttribute(h),c(f,E,"empty");continue}let C=f.getAttribute(h),L=on(f,h,T.value,s,y.width);L?(C===null&&f.removeAttribute(h),c(f,E,L)):m++}for(let[h,E]of[[y.show,!0],[y.hide,!1]]){if(h===void 0)continue;let T=Oe(v,h);if(T.status!=="value"){c(f,h,T.status);continue}d(f,"hidden");let O=!Re(T.value)&&T.value!==!1;fe(f,O===E),m++}if(y.link!==void 0){let h=[],E=Wt(y.link,s.base,T=>{let O=Oe(v,T.join("."));if(O.status==="value")return O.value;h.push(O.status)});if(h[0])c(f,y.link,h[0]);else if(!E.ok)c(f,E.path,E.reason);else{d(f,"href");let T=an(f,E.url);T?c(f,y.link,T):m++}}}function x(f,y,v,h,E){let T=dn(f);for(let o of T.bad)c(o,o.getAttribute(`${M}type`)??"","bad-path");if(!T.plain&&T.typed.size===0){c(f,"template","unsupported");return}a(f);let O=[...T.all];for(let o of Array.from(f.children))o.hasAttribute(`${M}empty`)&&(d(o,"hidden"),fe(o,y.length===0),O.push(o));let C=[],L=!1;for(let o of y.slice(0,ar)){let p=E?cr(o):null,S=(p===null?void 0:T.typed.get(p))??T.plain;if(!S){L=!0;continue}let w=S.content.cloneNode(!0);_(Be(w,!1),{kind:"record",source:o},v+1),C.push(...Array.from(w.childNodes))}L&&c(f,h,"no-template"),f.replaceChildren(...O,...C),m++}function _(f,y,v){g.push(...f.issues);for(let{el:h,d:E}of f.bound)b(h,E,y);for(let h of f.eaches){let E=Oe(y,h.path);if(E.status!=="value"){c(h.el,h.path,E.status);continue}if(v>=ir){c(h.el,h.path,"unsupported");continue}if(E.linked!==void 0){let L=Array.isArray(E.linked)?E.linked:E.linked===null?[]:[E.linked];L.length===0&&c(h.el,h.path,"empty"),x(h.el,L,v,h.path,!1);continue}let T=E.value,O=Array.isArray(T)?T:Re(T)?[]:[T];if(O.some(L=>!pe(L))){c(h.el,h.path,"type");continue}O.length===0&&c(h.el,h.path,"empty");let C=Array.isArray(T)&&Array.isArray(E.blocks)?E.blocks:[];x(h.el,O.map((L,o)=>pe(C[o])?{data:L,expanded:C[o]}:{data:L}),v,h.path,!0)}}async function D(f,y){try{let v=await f();return v===null?{status:"missing"}:y(v)?{status:"ok",value:v}:{status:"failed",answered:!0}}catch(v){return v instanceof de&&v.status===404&&v.code!=="RELEASE_NOT_FOUND"?{status:"missing"}:{status:"failed"}}}let k=null,N="",q=null,K,Z=!1,H=null,j=null,B=0,I=-1,me=3,z=typeof e.live=="number"?e.live:void 0;function ae(){le(!1),l(),k={state:"fallback",release:null,preview:!1,bound:0,issues:[]},t.setAttribute(`${M}state`,"fallback"),t.removeAttribute(`${M}preview`)}function le(f){let y=f&&!Z?J():null,v=n.defaultView,h=y?.mode==="edit"&&v?y.appOrigin??null:null;h!==j&&(H?.(),H=null,j=h,h&&v&&(H=et({appOrigin:h,sdk:`@mapled/vanilla@${He}`,onRefresh:()=>{se()},window:v})))}function ge(){B++,clearTimeout(K),k?.preview&&ae()}function $e(){clearTimeout(K);let f=J();if(!f||Z)return;let y=Date.parse(f.expiresAt)-Date.now();K=setTimeout(()=>{J()===null&&ge(),se()},Math.min(Math.max(y,0)+1,2147483647))}async function V(f,y=1){let v=k===null;v&&t.setAttribute(`${M}state`,"loading");let h=B,E=await r.isPreview().catch(()=>!1),T=E?J()?.draftToken??null:null;if(k!==null&&k.preview&&!E&&ae(),!E&&f!==void 0&&k!==null&&k.state==="ready"&&!k.preview&&k.release!==null&&f<=k.release)return k;let O=R=>{k=R,I=h,t.setAttribute(`${M}state`,R.state),t.toggleAttribute(`${M}preview`,R.preview);let A=R.issues.filter(F=>F.reason!=="empty"),$=A.map(F=>`${F.path} (${F.reason}) on ${F.on}`).join("; ");return $!==N&&(N=$,A.length>0&&console.warn(`[mapled] ${A.length===1?"1 place":`${A.length} places`} couldn't be filled: ${$}`)),n.dispatchEvent(new CustomEvent(v?"mapled:ready":"mapled:update",{detail:R})),le(R.preview),R.preview?$e():(clearTimeout(K),e.live&&q===null&&(q=r.watch(F=>{se(F.release)},{interval:z,from:R.state==="ready"?R.release:null}))),R},C=null;if(!E)if(f!==void 0)C=f;else try{let R=await r.getRelease();if(R===null)return l(),O({state:"unpublished",release:null,preview:E,bound:0,issues:[]});C=R.release}catch{return k!==null&&k.state==="ready"?k:O({state:"fallback",release:null,preview:E,bound:0,issues:[]})}let L=C===null?{}:{release:C},o=Be(t,!0),p=pt(t,o.issues);p&&o.bound.unshift({el:t,d:p});let S=new Map,w=new Map,P=new Map,U=[];for(let[R,A]of fn(o))U.push(D(()=>r.getSingle(R,{...L,...A.size>0?{expand:[...A]}:{}}),Pe).then($=>S.set(R,$)));for(let R of o.lists){let A=dn(R.el).plain,$=A?[...fn(Be(A.content,!1)).keys()]:[];U.push(D(async()=>(await r.getRecords(R.collection,{...R.options,...L,...$.length>0?{fields:$}:{}})).records,lr).then(F=>w.set(R,F)))}for(let R of o.records){if(R.slug===null){P.set(R,{status:"missing"});continue}let A=R.slug;U.push(D(()=>r.getRecordBySlug(R.collection,A,{...L,...R.expand.length>0?{expand:R.expand}:{}}),Pe).then($=>P.set(R,$)))}await Promise.all(U);let G=await r.isPreview().catch(()=>!1)?J()?.draftToken??null:null;if(h!==B||G!==T)return y<me?V(f,y+1):(l(),O({state:"fallback",release:null,preview:G!==null,bound:0,issues:[]}));let oe=[...S.values(),...w.values(),...P.values()];if(oe.length>0&&oe.every(R=>R.status==="failed"&&!R.answered))return k!==null&&k.state==="ready"?k:O({state:"fallback",release:C,preview:E,bound:0,issues:[]});l(),g=[],m=0,_(o,{kind:"page",singles:S},0);for(let R of o.lists){let A=w.get(R);A?.status==="ok"?x(R.el,A.value,0,R.collection,!1):c(R.el,R.collection,A?.status??"failed")}for(let R of o.records){let A=P.get(R);A?.status==="ok"?_(R.block,{kind:"record",source:A.value},0):c(R.el,R.collection,A?.status??"failed")}return Y(),O({state:"ready",release:C,preview:E,bound:m,issues:g})}let Le=new WeakSet,Ie=new WeakSet;function Y(){for(let f of Array.from(t.querySelectorAll(`form[${M}form]`)))Le.has(f)||(Le.add(f),f.addEventListener("submit",y=>{y.preventDefault(),De(f)}))}async function De(f){if(f.getAttribute(`${M}form-state`)==="sending")return;let y=(f.getAttribute(`${M}form`)??"").trim(),v=f.querySelector(`[${M}form-sent]`),h=f.querySelector(`[${M}form-failed]`),E=Array.from(f.querySelectorAll("button, input[type=submit]")).filter(L=>!L.disabled);f.setAttribute(`${M}form-state`,"sending");for(let L of E)L.disabled=!0;let T=f.querySelector(`input[type=checkbox][${M}consent]`),O=T?.checked?(T.labels?.[0]?.textContent??T.closest("label")?.textContent??"").trim().slice(0,500):"",C=Ce.test(y)?await Ze(y,f,{key:e.key,apiUrl:e.apiUrl,fetch:e.fetch,...O?{consent:O}:{}}):{ok:!1,status:0,code:"BAD_FORM",message:"This form isn't set up yet."};for(let L of E)L.disabled=!1;f.setAttribute(`${M}form-state`,C.ok?"sent":"failed"),C.ok&&f.reset(),v&&fe(v,C.ok),h&&(!C.ok&&(Ie.has(h)||(h.textContent??"").trim()==="")&&(Ie.add(h),h.textContent=C.message),fe(h,!C.ok)),n.dispatchEvent(new CustomEvent("mapled:form",{detail:C.ok?{form:y,ok:!0}:{form:y,ok:!1,status:C.status,code:C.code}}))}Y();let he=async f=>{try{return await V(f)}catch(y){return console.error(`[mapled] ${y instanceof Error?y.message:"The page couldn't be filled."}`),k??{state:"fallback",release:null,preview:!1,bound:0,issues:[]}}},ee=he(),se=f=>ee=ee.then(()=>he(f)),ye=()=>{Ge(),ge();let f=B;return ee=ee.then(()=>I>=f&&k!==null?k:he())},ke=f=>{f.target?.closest?.(`[${M}end-preview]`)&&(f.preventDefault(),ye())};return n.addEventListener("click",ke),{ready:ee,get report(){return k},refresh:()=>se(),endPreview:ye,stop:()=>{Z=!0,le(!1),q?.(),q=()=>{},clearTimeout(K),n.removeEventListener("click",ke)},client:r}}var pn={version:He,mount:mt,page:null};window.Mapled=pn;var re=document.currentScript;if(re instanceof HTMLScriptElement&&re.hasAttribute("data-mapled-key")){let e=re.getAttribute("data-mapled-live"),t=e===null?NaN:parseInt(e,10),n=()=>{try{pn.page=mt({key:re.getAttribute("data-mapled-key")??"",...re.getAttribute("data-mapled-api")?{apiUrl:re.getAttribute("data-mapled-api")}:{},...re.getAttribute("data-mapled-locale")?{locale:re.getAttribute("data-mapled-locale")}:{},...e===null?{}:{live:Number.isFinite(t)?t:!0}})}catch(r){console.error(r instanceof Error?r.message:"Mapled couldn't start.")}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",n,{once:!0}):n()}})();
|
package/dist/mapled.js.sha384
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
sha384-
|
|
1
|
+
sha384-DgnLLoT4DVtklY1XJM+nCt7FvO1tWtJxmVn4IQM4+yEpV1ttw/1uYuP50+dZN5y7
|
package/dist/runtime.js
CHANGED
|
@@ -30,10 +30,11 @@
|
|
|
30
30
|
|
|
31
31
|
Paths start at a single from the document (`home.headline`) and at the
|
|
32
32
|
record inside a list, an each or a record (`title`, `author.name`). */
|
|
33
|
-
import { createClient, endPreview, MapledError, previewSession, submitForm } from "@mapled/client";
|
|
33
|
+
import { createClient, endPreview, MapledError, previewSession, startEditor, submitForm } from "@mapled/client";
|
|
34
34
|
import { isEmpty, parsePath, walk } from "./paths.js";
|
|
35
35
|
import { ATTRIBUTES, attributeRefusal, bindRefusal, FORMATS, formatted, setVisible, writeAttribute, writeImage, writeLink, writeMarkdown, writeText } from "./sinks.js";
|
|
36
36
|
import { fillTemplate } from "./url.js";
|
|
37
|
+
import { VERSION } from "./version.js";
|
|
37
38
|
/** Why a place wasn't filled. `missing` — no such single, record or
|
|
38
39
|
collection in the release; `empty` — the record is there, a value at
|
|
39
40
|
this path isn't; `failed` — the read didn't come back; `bad-path` —
|
|
@@ -555,6 +556,9 @@ export function mount(options) {
|
|
|
555
556
|
let stopWatching = null;
|
|
556
557
|
let expiry;
|
|
557
558
|
let stopped = false;
|
|
559
|
+
/** the editing overlay, while the page is open in Mapled's editor (Edit site) */
|
|
560
|
+
let stopEditor = null;
|
|
561
|
+
let editorOrigin = null;
|
|
558
562
|
/** moves when preview is left: a fill that began before it commits nothing */
|
|
559
563
|
let generation = 0;
|
|
560
564
|
/** the generation of the last fill that committed: an exit's own fill is skipped when one already has */
|
|
@@ -566,11 +570,26 @@ export function mount(options) {
|
|
|
566
570
|
page is as written again, and says so, before anything is asked of
|
|
567
571
|
Mapled; what is published follows when it is in hand. */
|
|
568
572
|
function leave() {
|
|
573
|
+
editor(false);
|
|
569
574
|
restore();
|
|
570
575
|
last = { state: "fallback", release: null, preview: false, bound: 0, issues: [] };
|
|
571
576
|
root.setAttribute(`${P}state`, "fallback");
|
|
572
577
|
root.removeAttribute(`${P}preview`);
|
|
573
578
|
}
|
|
579
|
+
/** The overlay runs while the drafts shown are an editing session's, and only then. */
|
|
580
|
+
function editor(on) {
|
|
581
|
+
const session = on && !stopped ? previewSession() : null;
|
|
582
|
+
const view = doc.defaultView;
|
|
583
|
+
const origin = session?.mode === "edit" && view ? (session.appOrigin ?? null) : null;
|
|
584
|
+
if (origin === editorOrigin)
|
|
585
|
+
return;
|
|
586
|
+
stopEditor?.();
|
|
587
|
+
stopEditor = null;
|
|
588
|
+
editorOrigin = origin;
|
|
589
|
+
// a new editing session with another Mapled is a new overlay, listening to that one alone
|
|
590
|
+
if (origin && view)
|
|
591
|
+
stopEditor = startEditor({ appOrigin: origin, sdk: `@mapled/vanilla@${VERSION}`, onRefresh: () => void refresh(), window: view });
|
|
592
|
+
}
|
|
574
593
|
/** Preview ends now, not after the fill in flight: the draft goes at
|
|
575
594
|
once, and whatever that fill brings back is dropped. */
|
|
576
595
|
function drop() {
|
|
@@ -620,6 +639,7 @@ export function mount(options) {
|
|
|
620
639
|
console.warn(`[mapled] ${loud.length === 1 ? "1 place" : `${loud.length} places`} couldn't be filled: ${text}`);
|
|
621
640
|
}
|
|
622
641
|
doc.dispatchEvent(new CustomEvent(first ? "mapled:ready" : "mapled:update", { detail: report }));
|
|
642
|
+
editor(report.preview);
|
|
623
643
|
if (report.preview)
|
|
624
644
|
watchExpiry();
|
|
625
645
|
else {
|
|
@@ -804,6 +824,7 @@ export function mount(options) {
|
|
|
804
824
|
endPreview: exit,
|
|
805
825
|
stop: () => {
|
|
806
826
|
stopped = true;
|
|
827
|
+
editor(false);
|
|
807
828
|
stopWatching?.();
|
|
808
829
|
stopWatching = () => { };
|
|
809
830
|
clearTimeout(expiry);
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapled/vanilla",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "The browser runtime of Mapled, the hosted headless CMS for sites built with AI — published content in a plain HTML site: one script tag and data-mapled attributes, no framework and no build step.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://mapled.io",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@mapled/client": "^0.5.
|
|
44
|
+
"@mapled/client": "^0.5.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"esbuild": "^0.28.2",
|