@baack-software/baack-ts-editor 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chunks/{chunk-JI2V7IMH.js → chunk-TKIJLJYW.js} +23 -23
- package/dist/chunks/chunk-TKIJLJYW.js.map +7 -0
- package/dist/editor.js +10 -9
- package/dist/editor.js.map +4 -4
- package/dist/loader.js +1 -1
- package/dist/loader.js.map +3 -3
- package/package.json +2 -2
- package/dist/chunks/chunk-JI2V7IMH.js.map +0 -7
package/dist/editor.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import{b as w,c as R,e as L,f as Mt,h as Z,i as T,j as W,k as fe,l as c,m as Ct}from"./chunks/chunk-JI2V7IMH.js";function E(r,e={},...t){return{tag:r,attrs:e,children:t}}function It(r,e=document){if(typeof r=="string")return e.createTextNode(r);let t=e.createElement(r.tag);for(let[n,i]of Object.entries(r.attrs))i!==void 0&&t.setAttribute(n,i);return r.html!==void 0?t.innerHTML=r.html:t.append(...r.children.map(n=>It(n,e))),t}function Pt(r,e,t,n){for(let i of t)e.attrs[i]===void 0&&r.removeAttribute(i);for(let[i,s]of Object.entries(e.attrs))s===void 0?r.removeAttribute(i):r.getAttribute(i)!==s&&r.setAttribute(i,s);n&&(e.html!==void 0?r.innerHTML=e.html:r.replaceChildren(...e.children.map(i=>It(i,r.ownerDocument))))}function ve(r,e,t){if(!r.carried||!e)return t;let n={...t};for(let i of r.carried){let s=e[i];!(i in n)&&s!==void 0&&(n[i]=s)}return n}function M(r,e){let t={};for(let n of r.valueKeys){let i=e[n];i!==void 0&&(t[n]=i)}return t}function ye(r,e,t){return JSON.stringify(M(r,e))===JSON.stringify(M(r,t))}function dt(r,e,t){let n={...e,...t};for(let i of r.derived??[])delete n[i];return n}function $t(r,e,t,n){let i=r.component?.(e);if(!i)return;let s=i.propsFrom(e);Pt(e,i.render({name:t.name,sortOrder:t.sortOrder,item:n},s),i.volatile,i.ownsChildren)}function Y(r,e,t,n){let i={...M(r,t),name:e.name,sortOrder:e.sortOrder,entity:{urn:n}};return e.urn!==void 0&&(i.urn=e.urn),i}function ae(r){return`data-${r.attribute}-name`}function X(r){return`data-${r.attribute}-sort-order`}function P(r){return`data-${r.attribute}-urn`}var U="data-entity-urn",ge=class{entries;listener;selector;byElement=new Map;unscopedByElement=new Map;observer;warned=new WeakSet;constructor(e,t){this.entries=e,this.listener=t,this.selector=e.map(n=>`[${ae(n)}]`).join(","),this.observer=new MutationObserver(n=>this.onMutations(n))}start(e=document.documentElement){this.scan(e),this.observer.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[U,...this.entries.flatMap(t=>[ae(t),X(t)])]})}stop(){this.observer.disconnect()}all(){return[...this.byElement.values()].flat()}unscoped(){for(let e of this.unscopedByElement.keys())e.isConnected||this.unscopedByElement.delete(e);return[...this.unscopedByElement.values()].flat()}of(e){return this.byElement.get(e)??[]}closest(e){if(!(e instanceof Element))return;let t=e.closest(this.selector);return t instanceof HTMLElement&&this.byElement.has(t)?t:void 0}flush(){let e=this.observer.takeRecords();e.length>0&&this.onMutations(e)}onMutations(e){let t=new Set,n=!1;for(let i of e){i.type==="attributes"&&i.target instanceof Element&&t.add(i.target);for(let s of i.addedNodes)s instanceof Element&&t.add(s);i.removedNodes.length>0&&(n=!0)}n&&this.sweep();for(let i of t)i.isConnected&&this.scan(i)}scan(e){let t=[...e.querySelectorAll(this.selector)];e instanceof HTMLElement&&e.matches(this.selector)&&t.unshift(e);let n=[],i=[];for(let s of t){let o=this.bind(s),a=this.unscopedSlots(s);a.length>0?this.unscopedByElement.set(s,a):this.unscopedByElement.delete(s);let d=this.byElement.get(s)??[];ci(d,o)||(i.push(...d),n.push(...o),o.length>0?this.byElement.set(s,o):this.byElement.delete(s))}e instanceof HTMLElement&&!e.matches(this.selector)&&this.byElement.has(e)&&(i.push(...this.byElement.get(e)),this.byElement.delete(e)),i.length>0&&this.listener.removed(i),n.length>0&&this.listener.added(n)}sweep(){let e=[];for(let[t,n]of this.byElement)t.isConnected||(e.push(...n),this.byElement.delete(t));e.length>0&&this.listener.removed(e)}bind(e){let t=e.closest(`[${U}]`)?.getAttribute(U),n=[];for(let i of this.entries){let s=e.getAttribute(ae(i));if(!s||!t)continue;let o=this.sortOrder(e,i);o!==void 0&&n.push({element:e,entry:i,scope:t,name:s,sortOrder:o})}return n}unscopedSlots(e){if(e.closest(`[${U}]`))return[];let t=[];for(let n of this.entries){let i=e.getAttribute(ae(n)),s=i?this.sortOrder(e,n):void 0;i&&s!==void 0&&t.push({element:e,entry:n,name:i,sortOrder:s})}return t}sortOrder(e,t){let n=e.getAttribute(X(t)),i=n===null||n.trim()===""?0:Number(n);if(Number.isInteger(i))return i;this.warn(e,`has ${X(t)}="${n}", which is not an integer`)}warn(e,t){this.warned.has(e)||(this.warned.add(e),console.warn(`Baack editor: element ${t}; it will not be editable.`,e))}};function ci(r,e){return r.length===e.length&&r.every((t,n)=>t.entry===e[n].entry&&t.scope===e[n].scope&&t.name===e[n].name&&t.sortOrder===e[n].sortOrder)}function $(r){return`${r.entityUrn}|${r.type}|${r.name}|${r.sortOrder}`}function z(r){return r.kind==="move"?`move|${r.planId}|${r.urn}`:r.kind==="edit"?r.urn:$(r)}var be=class{items=new Map;onChange;constructor(e){this.onChange=e}getEdit(e){let t=this.items.get(e);return t?.kind==="edit"?t:void 0}getCreate(e){let t=this.items.get(e);return t?.kind==="create"?t:void 0}set(e){this.items.set(z(e),e),this.onChange()}clear(e){this.items.delete(e)&&this.onChange()}clearAll(e){let t=this.all().filter(n=>e===void 0||n.entityUrn===e);for(let n of t)this.items.delete(z(n));return t.length>0&&this.onChange(),t}load(e){this.items.clear();for(let t of e)this.items.set(z(t),t);this.onChange()}all(){return[...this.items.values()]}plan(e){return this.all().filter(t=>t.kind==="move"&&t.planId===e)}count(){return this.items.size}byEntity(){let e=new Map;for(let t of this.items.values())e.set(t.entityUrn,[...e.get(t.entityUrn)??[],t]);return e}};var Ht="baack-editor:stash:";var we=class{key;constructor(e){this.key=Ht+e}load(e=Date.now()){ui(e);try{let t=window.localStorage.getItem(this.key);if(!t)return[];let n=JSON.parse(t);return n.version!==1||!Array.isArray(n.items)?[]:n.items}catch(t){return console.warn("Baack editor: could not read unsaved changes from this browser.",t),[]}}save(e,t=Date.now()){try{if(e.length===0)window.localStorage.removeItem(this.key);else{let n={version:1,savedAt:t,items:e};window.localStorage.setItem(this.key,JSON.stringify(n))}}catch(n){console.warn("Baack editor: could not keep unsaved changes in this browser.",n)}}};function ui(r){try{for(let e=window.localStorage.length-1;e>=0;e-=1){let t=window.localStorage.key(e);if(!t?.startsWith(Ht))continue;let n=JSON.parse(window.localStorage.getItem(t)??"{}").savedAt;(typeof n!="number"||r-n>6048e5)&&window.localStorage.removeItem(t)}}catch{}}var Ee=class r{entity;constructor(e){this.entity=e}get urn(){return this.entity.urn}get name(){return this.entity.name}get status(){return this.entity.status}get language(){return this.entity.language}get variant(){return this.entity.variant}get publishedAt(){return this.entity.publishTimestamp?new Date(this.entity.publishTimestamp):void 0}get updatedAt(){return this.entity.updatedTimestamp?new Date(this.entity.updatedTimestamp):void 0}get raw(){return this.entity}allByName(e,t){return e?e.filter(n=>n.name===t).sort((n,i)=>n.sortOrder-i.sortOrder):[]}byNameAndSortOrder(e,t,n=0){return e?.find(i=>i.name===t&&i.sortOrder===n)}has(e){let{texts:t,markdowns:n,templates:i,booleans:s,doubles:o,longs:a,money:d,dateTimes:l,images:u,latLongs:h,jsons:f,links:p,references:v}=this.entity;return[t,n,i,s,o,a,d,l,u,h,f,p,v].some(m=>m?.some(g=>g.name===e))}hasByNameAndSortOrder(e,t,n=0){return this.byNameAndSortOrder(e,t,n)!==void 0}hasText(e,t=0){return this.hasByNameAndSortOrder(this.entity.texts,e,t)}hasMarkdown(e,t=0){return this.hasByNameAndSortOrder(this.entity.markdowns,e,t)}hasTemplate(e,t=0){return this.hasByNameAndSortOrder(this.entity.templates,e,t)}hasBoolean(e,t=0){return this.hasByNameAndSortOrder(this.entity.booleans,e,t)}hasDouble(e,t=0){return this.hasByNameAndSortOrder(this.entity.doubles,e,t)}hasLong(e,t=0){return this.hasByNameAndSortOrder(this.entity.longs,e,t)}hasNumber(e,t=0){return this.hasDouble(e,t)||this.hasLong(e,t)}hasMoney(e,t=0){return this.hasByNameAndSortOrder(this.entity.money,e,t)}hasDate(e,t=0){return this.hasByNameAndSortOrder(this.entity.dateTimes,e,t)}hasImage(e,t=0){return this.hasByNameAndSortOrder(this.entity.images,e,t)}hasLatLong(e,t=0){return this.hasByNameAndSortOrder(this.entity.latLongs,e,t)}hasJson(e,t=0){return this.hasByNameAndSortOrder(this.entity.jsons,e,t)}hasLink(e,t=0){return this.hasByNameAndSortOrder(this.entity.links,e,t)}hasReference(e,t=0){return this.hasByNameAndSortOrder(this.entity.references,e,t)}text(e,t=0){return this.byNameAndSortOrder(this.entity.texts,e,t)}texts(e){return this.allByName(this.entity.texts,e)}requireText(e,t=0){let n=this.text(e,t);if(n===void 0)throw new Error(`EntityView: missing required text item "${e}" on entity ${this.entity.urn}`);return n}markdown(e,t=0){return this.byNameAndSortOrder(this.entity.markdowns,e,t)}markdowns(e){return this.allByName(this.entity.markdowns,e)}template(e,t=0){return this.byNameAndSortOrder(this.entity.templates,e,t)}templates(e){return this.allByName(this.entity.templates,e)}boolean(e,t=0){return this.byNameAndSortOrder(this.entity.booleans,e,t)}booleans(e){return this.allByName(this.entity.booleans,e)}double(e,t=0){return this.byNameAndSortOrder(this.entity.doubles,e,t)}doubles(e){return this.allByName(this.entity.doubles,e)}long(e,t=0){return this.byNameAndSortOrder(this.entity.longs,e,t)}longs(e){return this.allByName(this.entity.longs,e)}number(e,t=0){return this.double(e,t)??this.long(e,t)}money(e,t=0){return this.byNameAndSortOrder(this.entity.money,e,t)}moneys(e){return this.allByName(this.entity.money,e)}date(e,t=0){return this.byNameAndSortOrder(this.entity.dateTimes,e,t)}dates(e){return this.allByName(this.entity.dateTimes,e)}image(e,t=0){return this.byNameAndSortOrder(this.entity.images,e,t)}images(e){return this.allByName(this.entity.images,e)}latLong(e,t=0){return this.byNameAndSortOrder(this.entity.latLongs,e,t)}latLongs(e){return this.allByName(this.entity.latLongs,e)}json(e,t=0){return this.byNameAndSortOrder(this.entity.jsons,e,t)}jsons(e){return this.allByName(this.entity.jsons,e)}link(e,t=0){return this.byNameAndSortOrder(this.entity.links,e,t)}links(e){return this.allByName(this.entity.links,e)}reference(e,t=0){return this.byNameAndSortOrder(this.entity.references,e,t)}references(e){return this.allByName(this.entity.references,e)}static async fetch(e,t,n,i){let s=await e.read(w.ENTITY_VIEW,t,n,i);return new r(s)}static from(e){return new r(e)}};var ke=class{scopes=new Map;views=new Map;items=new Map;hasScope(e){return this.scopes.has(e)}loadEntity(e,t){this.scopes.set(e,t.urn),this.views.set(t.urn,Ee.from(t))}entityFor(e){return this.scopes.get(e)}view(e){return this.views.get(e)}entities(){return[...this.views.keys()]}scopesFor(e){return[...this.scopes].filter(([,t])=>t===e).map(([t])=>t)}itemFor(e){let t=this.scopes.get(e.scope);return t===void 0?void 0:this.itemAt(t,e.entry,e.name,e.sortOrder)}itemAt(e,t,n,i){let s=this.views.get(e),o=s?t.find(s,n,i):void 0;if(!o?.urn)return;let a={entry:t,item:o,entityUrn:e};return this.items.set(o.urn,a),a}remember(e,t,n){let i={entry:t,item:n,entityUrn:e};return n.urn&&this.items.set(n.urn,i),i}get(e){return this.items.get(e)}replace(e,t){let n=this.items.get(e);if(!n||!t.urn)throw new Error(`Cannot replace unknown item ${e}`);let i={entry:n.entry,item:t,entityUrn:n.entityUrn};if(this.items.delete(e),this.items.set(t.urn,i),n.entry.renderedByView)return i;let s=this.views.get(n.entityUrn)?.raw[n.entry.entityArray],o=s?.findIndex(a=>a.urn===e)??-1;return s&&o>=0&&(s[o]=t),i}clearEntities(){this.scopes.clear(),this.views.clear(),this.items.clear()}};var de=class extends Error{expectedUrn;received;constructor(e,t){super(`The entity view returned ${t.urn} (${t.language}) for ${e}`),this.name="EntityMismatchError",this.expectedUrn=e,this.received=t}},Q=class extends Error{entityUrn;constructor(e){super(`${e} has no live view: it is not published`),this.name="NotLiveError",this.entityUrn=e}};function S(r){return r==="PUBLISHED"||r==="PUBLISHED_WITH_DRAFTS"}var xe=class{transport;locators=new Map;constructor(e){this.transport=e}async read(e,t={}){let n=await this.locator(e),i;try{i=await this.transport.entityView(e,{...t,...n})}catch(s){throw t.version===void 0&&R(s)&&s.isNotFound?new Q(e):s}if(i.urn!==e)throw new de(e,i);return i}async readAsLive(e){let t=await this.transport.readEntity(e);if(this.locators.set(e,Promise.resolve({language:t.language,variant:t.variant??""})),S(t.status))return{entity:await this.read(e),live:!0};if(t.status==="PUBLISH"||t.status==="PUBLISH_PENDING")try{return{entity:await this.read(e),live:!0}}catch(n){if(!(n instanceof Q))throw n}return{entity:await this.read(e,{version:"LATEST"}),live:!1}}locator(e){let t=this.locators.get(e);return t||(t=this.transport.readEntity(e).then(n=>({language:n.language,variant:n.variant??""})),t.catch(()=>this.locators.delete(e)),this.locators.set(e,t)),t}};function Le(r,e){return{label:r.canPublish?"Review and publish\u2026":"Request approval\u2026",run:()=>r.hooks.publishEntity(e)}}function ee(r){let e=document.documentElement.getAttribute(U);return e?r.entityFor(e):void 0}function te(r,e){let t=ee(r);return[...e].sort((n,i)=>n===t?-1:i===t?1:0)}function le(r){switch(r){case"DRAFT_UNPUBLISHED":return"Draft, not published yet";case"PUBLISH":return"Publishing\u2026";case"PUBLISH_PENDING":return"Scheduled to publish";case"PUBLISHED":return"Published";case"PUBLISHED_WITH_DRAFTS":return"Published, with unpublished changes";default:return""}}var Te="data-baack-state",hi={editable:["1px dashed","primary",70],editing:["2px solid","primary",100],changed:["2px solid","warning",100],unresolved:["1px dotted","muted",80],previewing:["2px dashed","preview",100],published:["2px solid","success",100]};function pi(r,e){let[t,n,i]=hi[e],[s,o]=Mt[n],a=d=>i===100?d:`color-mix(in srgb, ${d} ${i}%, transparent)`;r.style.outline=`${t} ${a(s)}`,r.style.outline=`${t} ${a(`light-dark(${s}, ${o})`)}`}var ce=new WeakMap;function N(r,e){if(!ce.has(r)){let{outline:t,outlineOffset:n,display:i,minWidth:s,minHeight:o}=r.style;ce.set(r,{outline:t,outlineOffset:n,display:i,minWidth:s,minHeight:o})}pi(r,e),r.style.outlineOffset="2px",r.setAttribute(Te,e),Se(r)}function Se(r){let e=ce.get(r);e&&(r.style.display=e.display,r.style.minWidth=e.minWidth,r.style.minHeight=e.minHeight,!(r.textContent!==""||r.querySelector("img, picture, svg, video, iframe"))&&(getComputedStyle(r).display==="inline"&&(r.style.display="inline-block"),r.style.minWidth="1ch",r.style.minHeight="1lh"))}function Bt(r){let e=ce.get(r);e&&(r.style.outline=e.outline,r.style.outlineOffset=e.outlineOffset,r.style.display=e.display,r.style.minWidth=e.minWidth,r.style.minHeight=e.minHeight,r.getAttribute("style")||r.removeAttribute("style"),ce.delete(r)),r.removeAttribute(Te)}function Ae(r){return r.split(/\n\s*\n/).map(e=>e.split(`
|
|
2
|
-
`).map(t=>t.replace(/\s+/g," ").trim()).filter(Boolean)).filter(e=>e.length>0)}function Oe(r){return Ae(r).flat()}var mi=/(https?:\/\/[^\s)]+[^\s).,;:!?]|[\w.+-]+@[\w-]+(?:\.[\w-]+)+)/g;function Rt(r){return r.split(mi).map((e,t)=>{if(e!=="")return t%2===0?{text:e}:{text:e,href:e.includes("@")&&!e.startsWith("http")?`mailto:${e}`:e}}).filter(e=>e!==void 0)}function ue(r){try{return new Intl.NumberFormat("en-GB",{style:"currency",currency:r}).resolvedOptions().maximumFractionDigits??2}catch{return 2}}function Nt(r){return r.formattedValue?r.formattedValue:Me(r.unitValue,ue(r.currencyCode))}function Dt(r){if(r.currencySymbol)return r.currencySymbol;try{return new Intl.NumberFormat("en-GB",{style:"currency",currency:r.currencyCode}).formatToParts(0).find(t=>t.type==="currency")?.value??r.currencyCode}catch{return r.currencyCode}}function Me(r,e){let t=r<0,n=String(Math.abs(Math.trunc(r)));if(e===0)return(t?"-":"")+n;let i=n.padStart(e+1,"0");return`${t?"-":""}${i.slice(0,-e)}.${i.slice(-e)}`}function lt(r,e){let t=/^\s*(-)?(\d+)(?:\.(\d*))?\s*$/.exec(r);if(!t)return;let[,n,i="0",s=""]=t;if(s.length>e)return;let o=Number(i+s.padEnd(e,"0"));if(Number.isSafeInteger(o))return n?-o:o}function C(r){return Date.parse(/[zZ]|[+-]\d\d:?\d\d$/.test(r)?r:`${r}Z`)}function Ft(r,e){let t=C(r);if(Number.isNaN(t))return r;let n={timeZone:e.timeZone??"UTC"};return e.dateStyle&&(n.dateStyle=e.dateStyle),e.timeStyle&&(n.timeStyle=e.timeStyle),!e.dateStyle&&!e.timeStyle&&(n.dateStyle="medium"),new Intl.DateTimeFormat(e.locale??"en-GB",n).format(t)}function Ut(r,e){return new Intl.NumberFormat(e??"en-GB",{maximumFractionDigits:20}).format(r)}var fi=new Set(["id","role","title","lang","dir","tabindex","itemscope","itemtype","itemid","itemref"]),vi=/^data-(placeholder|section|content-rows?|[a-z]+-(name|sort-order|urn|list))$/;function yi(r){return vi.test(r)?!1:fi.has(r)||/^(data|aria)-[a-z0-9-]+$/.test(r)}function H(r){let e={};for(let[t,n]of Object.entries(r??{}))yi(t)&&(e[t]=n);return e}function B(r,e,t){return{[`data-${r}-name`]:e.name,[`data-${r}-sort-order`]:String(e.sortOrder),[`data-${r}-urn`]:t?void 0:e.item?.urn,"data-placeholder":t?"":void 0}}function D(r,...e){return[`data-${r}-urn`,"data-placeholder",...e]}function ne(r){return{className:r.getAttribute("class")??void 0,itemProp:r.getAttribute("itemprop")??void 0}}function Vt(r,e,t){return t?r.flatMap((n,i)=>i>0?[E("br"),...e(n)]:e(n)):[r.join(" ")]}function _t(r,e){return e?Rt(r).map(t=>"href"in t?E("a",{href:t.href},t.text):t.text):[r]}var ct={type:"text",volatile:D("text"),ownsChildren:!0,render(r,e){let t=r.item?Oe(r.item.value):[],n=t.length===0,i=e.as??"span",s=n?Oe(e.placeholder):t,o=E(i,{...H(e.attributes),class:e.className,itemprop:e.itemProp,...B("text",r,n),"data-text-linkify":e.linkify?"":void 0,"data-text-unsafe-literal":e.unsafeLiteral?"":void 0},...Vt(s,a=>_t(a,e.linkify===!0),i!=="title"&&i!=="option"));return e.unsafeLiteral&&!n&&(o.html=r.item.value),o},propsFrom:r=>({...ne(r),placeholder:"",as:r.localName,linkify:r.hasAttribute("data-text-linkify"),unsafeLiteral:r.hasAttribute("data-text-unsafe-literal")})},zt={type:"text",volatile:D("text"),ownsChildren:!0,render(r,e){let t=r.item?Ae(r.item.value):[],n=t.length===0,i=n?Ae(e.placeholder):t,s=E(e.as??"div",{...H(e.attributes),class:e.className,itemprop:e.itemProp,...B("text",r,n),"data-text-layout":"paragraphs","data-text-linkify":e.linkify?"":void 0,"data-text-unsafe-literal":e.unsafeLiteral?"":void 0},...i.map(o=>E("p",{class:e.paragraphClassName},...Vt(o,a=>_t(a,e.linkify===!0),!0))));return e.unsafeLiteral&&!n&&(s.html=r.item.value),s},propsFrom:r=>({...ct.propsFrom(r),paragraphClassName:r.querySelector(":scope > p")?.getAttribute("class")??void 0})},Gt={type:"text",volatile:D("text","content"),ownsChildren:!1,render(r,e){let t=r.item?Oe(r.item.value).join(" "):"",n=t==="";return E("meta",{...H(e.attributes),name:e.name,property:e.property,content:n?e.placeholder:t,...B("text",r,n)})},propsFrom:r=>({name:r.getAttribute("name")??void 0,property:r.getAttribute("property")??void 0,placeholder:""})};function Kt(r){return{type:r,volatile:D(r),ownsChildren:!0,render(e,t){let n=e.item?.value,i=!n?.trim(),s=E(t.as??"div",{...H(t.attributes),class:t.className,itemprop:t.itemProp,...B(r,e,i)});return i?s.children=[E("p",{},t.placeholder)]:s.html=n,s},propsFrom:e=>({...ne(e),placeholder:"",as:e.localName})}}var jt=Kt("markdown"),qt=Kt("template"),Wt={type:"money",volatile:D("money","itemprop","content","data-money-currency","data-money-unit-value"),ownsChildren:!0,render(r,e){let t=r.item,n={"data-money-offer":e.offer?"":void 0,"data-money-item-prop":e.offer?void 0:e.itemProp};if(!t)return E("span",{...H(e.attributes),class:e.className,...B("money",r,!0),...n},e.placeholder);let i=Nt(t);return E("span",{...H(e.attributes),class:e.className,itemprop:e.offer?"price":e.itemProp,content:e.offer?i:void 0,...B("money",r,!1),"data-money-currency":t.currencyCode,"data-money-unit-value":String(t.unitValue),...n},E("span",{itemprop:e.offer?"priceCurrency":void 0,content:e.offer?t.currencyCode:void 0},Dt(t)),i)},propsFrom:r=>({className:r.getAttribute("class")??void 0,itemProp:r.getAttribute("data-money-item-prop")??void 0,offer:r.hasAttribute("data-money-offer"),placeholder:""})};function Yt(r){return{type:r,volatile:D(r,"value"),ownsChildren:!0,render(e,t){let n=e.item;return E("data",{...H(t.attributes),class:t.className,itemprop:t.itemProp,value:n?String(n.value):void 0,...B(r,e,!n),"data-locale":t.locale},n?Ut(n.value,t.locale):t.placeholder)},propsFrom:e=>({...ne(e),placeholder:"",locale:e.getAttribute("data-locale")??void 0})}}var Jt=Yt("long"),Zt=Yt("double"),Xt={type:"datetime",volatile:D("datetime","datetime"),ownsChildren:!0,render(r,e){let t=r.item,n=t?C(t.value):NaN;return E("time",{...H(e.attributes),class:e.className,itemprop:e.itemProp,datetime:Number.isNaN(n)?void 0:new Date(n).toISOString(),...B("datetime",r,!t),"data-locale":e.locale,"data-date-style":e.dateStyle,"data-time-style":e.timeStyle,"data-time-zone":e.timeZone},t?Ft(t.value,e):e.placeholder)},propsFrom:r=>({...ne(r),placeholder:"",locale:r.getAttribute("data-locale")??void 0,dateStyle:r.getAttribute("data-date-style")??void 0,timeStyle:r.getAttribute("data-time-style")??void 0,timeZone:r.getAttribute("data-time-zone")??void 0})},Qt={type:"boolean",volatile:D("boolean","hidden"),ownsChildren:!1,render(r,e){let t=r.item?r.item.value:e.fallback===!0,n=e.invert?!t:t;return E(e.as??"div",{...H(e.attributes),class:e.className,hidden:n?void 0:"",...B("boolean",r,!r.item),"data-boolean-value":String(t),"data-boolean-invert":e.invert?"":void 0})},propsFrom:r=>({className:r.getAttribute("class")??void 0,invert:r.hasAttribute("data-boolean-invert"),as:r.localName})},en={type:"latlong",volatile:D("latlong"),ownsChildren:!0,render(r,e){let t=r.item,n={...H(e.attributes),class:e.className,itemprop:e.itemProp,itemscope:"",itemtype:"https://schema.org/GeoCoordinates",...B("latlong",r,!t)};return t?E("span",n,E("meta",{itemprop:"latitude",content:String(t.latitude)}),E("meta",{itemprop:"longitude",content:String(t.longitude)}),`${t.latitude}, ${t.longitude}`):E("span",n,e.placeholder)},propsFrom:r=>({...ne(r),placeholder:""})},tn={type:"link",volatile:D("link","rel","hreflang"),ownsChildren:!0,render(r,e){let t=r.item,n=t?t.text||t.href:e.placeholder;return E("a",{...H(e.attributes),class:e.className,itemprop:e.itemProp,href:t?t.href:e.placeholderHref??"#",rel:t?.rel||void 0,hreflang:t?.lang||void 0,...B("link",r,!t)},e.textItemProp?E("span",{itemprop:e.textItemProp},n):n)},propsFrom:r=>({...ne(r),placeholder:"",textItemProp:r.querySelector(":scope > span[itemprop]")?.getAttribute("itemprop")??void 0})},gi="768px",bi="1024px",nn={type:"image",volatile:D("image"),ownsChildren:!0,render(r,e){let t=r.item,n={...H(e.attributes),class:e.className,...B("image",r,!t?.src),"data-image-priority":e.priority?"":void 0,"data-image-alt":e.placeholderAlt,"data-image-item-prop":e.itemProp,"data-image-img-class":e.imgClassName};return t?.src?E("picture",n,...t.largeSrc?[E("source",{media:`(min-width: ${bi})`,srcset:t.largeSrc})]:[],...t.mediumSrc?[E("source",{media:`(min-width: ${gi})`,srcset:t.mediumSrc})]:[],E("img",{src:t.src,alt:t.altText??e.placeholderAlt??"",loading:e.priority?"eager":"lazy",decoding:"async",fetchpriority:e.priority?"high":void 0,itemprop:e.itemProp,class:e.imgClassName})):E("picture",n)},propsFrom:r=>({className:r.getAttribute("class")??void 0,priority:r.hasAttribute("data-image-priority"),itemProp:r.getAttribute("data-image-item-prop")??void 0,imgClassName:r.getAttribute("data-image-img-class")??void 0,placeholderAlt:r.getAttribute("data-image-alt")??void 0})};var rn={type:"text",volatile:D("text","data-section"),ownsChildren:!1,render(r,e){let t=r.item?.value.trim();return E(e.as??"section",{...H(e.attributes),class:e.className,...B("text",r,!t),"data-section":t||e.placeholder})},propsFrom:r=>({className:r.getAttribute("class")??void 0,placeholder:r.getAttribute("data-section")??"",as:r.localName})};var O=r=>typeof r=="string"?r:"";function dn(r,e,t,n,i,s){return{type:r,label:e,attribute:r,entityArray:r==="markdown"?"markdowns":"templates",endpoint:t,historyEndpoint:n,surface:"panel",valueKeys:["value"],renderedByView:!0,component:()=>i,fromPlaceholder:o=>({value:(o.textContent??"").trim()}),find:s,defaults:()=>({value:""}),form:{fields:[{key:"value",label:r==="markdown"?"Markdown source":"Velocity template source",kind:"code"}],toForm:o=>({value:o.value}),fromForm:o=>({value:O(o.value)}),describe:()=>r==="markdown"?"The page shows the rendered result after you send.":"Templates can show other items. The page shows the result after you send."},validate:()=>[]}}var ln=dn("markdown","Markdown",w.MARKDOWN,w.MARKDOWN_HISTORY,jt,(r,e,t)=>r.markdown(e,t)),cn=dn("template","Template",w.TEMPLATE,w.TEMPLATE_HISTORY,qt,(r,e,t)=>r.template(e,t)),un={type:"json",label:"JSON",attribute:"json",entityArray:"jsons",endpoint:w.JSON,historyEndpoint:w.JSON_HISTORY,surface:"panel",valueKeys:["value"],find:(r,e,t)=>r.json(e,t),defaults:()=>({value:{}}),form:{fields:[{key:"value",label:"JSON object",kind:"code"}],toForm:r=>({value:JSON.stringify(r.value??{},null,2)}),fromForm:r=>{try{let e=JSON.parse(O(r.value));return typeof e!="object"||e===null||Array.isArray(e)?'The value must be a JSON object, like {"key": "value"}.':{value:e}}catch(e){return`This is not valid JSON: ${e instanceof Error?e.message:String(e)}`}}},validate:()=>[]},hn={type:"boolean",label:"Switch",attribute:"boolean",entityArray:"booleans",endpoint:w.BOOLEAN,historyEndpoint:w.BOOLEAN_HISTORY,surface:"popover",valueKeys:["value"],component:()=>Qt,fromPlaceholder:r=>({value:r.getAttribute("data-boolean-value")==="true"}),find:(r,e,t)=>r.boolean(e,t),defaults:()=>({value:!1}),form:{fields:[{key:"value",label:"On",kind:"checkbox"}],toForm:r=>({value:r.value}),fromForm:r=>({value:r.value===!0})},validate:()=>[]};function wi(r){if(!/^\s*-?\d+\s*$/.test(r))return;let e=Number(r);return Number.isSafeInteger(e)?e:void 0}var pn={type:"long",label:"Whole number",attribute:"long",entityArray:"longs",endpoint:w.LONG,historyEndpoint:w.LONG_HISTORY,surface:"popover",valueKeys:["value"],component:()=>Jt,find:(r,e,t)=>r.long(e,t),defaults:()=>({value:0}),form:{fields:[{key:"value",label:"Value",kind:"integer"}],toForm:r=>({value:String(r.value)}),fromForm:r=>{let e=wi(O(r.value));return e===void 0?"Enter a whole number.":{value:e}}},validate:()=>[]};function ut(r){if(!/^\s*-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?\s*$/i.test(r))return;let e=Number(r);return Number.isFinite(e)?e:void 0}var mn={type:"double",label:"Number",attribute:"double",entityArray:"doubles",endpoint:w.DOUBLE,historyEndpoint:w.DOUBLE_HISTORY,surface:"popover",valueKeys:["value"],component:()=>Zt,find:(r,e,t)=>r.double(e,t),defaults:()=>({value:0}),form:{fields:[{key:"value",label:"Value",kind:"decimal"}],toForm:r=>({value:String(r.value)}),fromForm:r=>{let e=ut(O(r.value));return e===void 0?"Enter a number.":{value:e}}},validate:()=>[]};function Ei(r){let e=C(r);return Number.isNaN(e)?"":new Date(e-new Date(e).getTimezoneOffset()*6e4).toISOString().slice(0,16)}function on(r){if(!/^\d{4}-\d\d-\d\dT\d\d:\d\d(:\d\d)?$/.test(r))return;let e=new Date(r).getTime();return Number.isNaN(e)?void 0:new Date(e).toISOString().replace("Z","")}var fn={type:"dateTime",label:"Date and time",attribute:"datetime",entityArray:"dateTimes",endpoint:w.DATE_TIME,historyEndpoint:w.DATE_TIME_HISTORY,surface:"popover",valueKeys:["value"],component:()=>Xt,find:(r,e,t)=>r.date(e,t),defaults:()=>({value:new Date().toISOString().replace("Z","")}),form:{fields:[{key:"value",label:"Date and time (your local time)",kind:"datetime"}],toForm:r=>({value:Ei(r.value)}),fromForm:r=>{let e=on(O(r.value));return e===void 0?"Enter a date and time.":{value:e}},describe:r=>{let e=on(O(r.value));return e?`Stored as ${e.slice(0,16).replace("T"," ")} UTC.`:""}},validate:()=>[]},vn={type:"latLong",label:"Location",attribute:"latlong",entityArray:"latLongs",endpoint:w.LAT_LONG,historyEndpoint:w.LAT_LONG_HISTORY,surface:"popover",valueKeys:["latitude","longitude"],component:()=>en,find:(r,e,t)=>r.latLong(e,t),defaults:()=>({latitude:0,longitude:0}),form:{fields:[{key:"latitude",label:"Latitude",kind:"decimal"},{key:"longitude",label:"Longitude",kind:"decimal"}],toForm:r=>({latitude:String(r.latitude),longitude:String(r.longitude)}),fromForm:r=>{let e=ut(O(r.latitude)),t=ut(O(r.longitude));return e===void 0||Math.abs(e)>90?"Latitude must be a number from -90 to 90.":t===void 0||Math.abs(t)>180?"Longitude must be a number from -180 to 180.":{latitude:e,longitude:t}}},validate:()=>[]};function an(r){if(!/^[A-Z]{3}$/.test(r))return!1;try{return new Intl.NumberFormat("en",{style:"currency",currency:r}),!0}catch{return!1}}var yn={type:"money",label:"Money",attribute:"money",entityArray:"money",endpoint:w.MONEY,historyEndpoint:w.MONEY_HISTORY,surface:"popover",valueKeys:["currencyCode","unitValue"],derived:["formattedValue","currencySymbol"],component:()=>Wt,find:(r,e,t)=>r.money(e,t),defaults:()=>({currencyCode:"GBP",unitValue:0}),form:{fields:[{key:"currencyCode",label:"Currency",kind:"currency"},{key:"amount",label:"Amount",kind:"text"}],toForm:r=>({currencyCode:r.currencyCode,amount:Me(r.unitValue,ue(r.currencyCode))}),fromForm:r=>{let e=O(r.currencyCode).trim().toUpperCase();if(!an(e))return"Enter a three-letter currency code, like GBP or JPY.";let t=ue(e),n=lt(O(r.amount),t);return n===void 0?t===0?`${e} has no minor units. Enter a whole amount.`:`Enter an amount with at most ${t} decimal places, like ${Me(1250,t)}.`:{currencyCode:e,unitValue:n}},describe:r=>{let e=O(r.currencyCode).trim().toUpperCase();if(!an(e))return"";let t=lt(O(r.amount),ue(e));return t===void 0?"":`Stored as ${t} in the smallest unit of ${e}.`}},validate:()=>[]},V=[{size:"DEFAULT",field:"src",label:"Default file"},{size:"MEDIUM",field:"mediumSrc",label:"Medium file (from 768px wide)"},{size:"LARGE",field:"largeSrc",label:"Large file (from 1024px wide)"}],gn={type:"image",label:"Image",attribute:"image",entityArray:"images",endpoint:w.IMAGE,historyEndpoint:w.IMAGE_HISTORY,surface:"popover",valueKeys:["altText","src","mediumSrc","largeSrc"],carried:["src","mediumSrc","largeSrc"],component:()=>nn,fromPlaceholder:r=>({altText:r.querySelector("img")?.alt??""}),find:(r,e,t)=>r.image(e,t),defaults:()=>({altText:""}),form:{fields:[{key:"altText",label:"Alt text",kind:"text"},...V.map(r=>({key:r.size,label:r.label,kind:"file"}))],toForm:r=>({altText:r.altText??"",...Object.fromEntries(V.flatMap(e=>[[e.size,""],[`${e.size}:current`,String(r[e.field]??"")]]))}),fromForm:r=>({altText:O(r.altText)}),describe:r=>{let e=V.filter(i=>O(r[i.size])!=="");if(e.length===0)return"Saving keeps the current files.";let t=V.filter(i=>!e.includes(i)&&O(r[`${i.size}:current`])!==""),n=`Saving creates a new version, then uploads ${e.map(i=>i.label.toLowerCase().split(" (")[0]).join(", ")}.`;return e.some(i=>i.size==="DEFAULT")&&t.length>0?`${n} The ${t.map(i=>i.size.toLowerCase()).join(" and ")} file still shows the previous picture; choose new ones too if it changed.`:n}},validate:({altText:r})=>r?[]:[{level:"warning",message:"Images need alt text unless they are decorative."}]},bn={type:"link",label:"Link",attribute:"link",entityArray:"links",endpoint:w.LINK,historyEndpoint:w.LINK_HISTORY,surface:"popover",valueKeys:["href","text","rel","lang"],component:()=>tn,fromPlaceholder:r=>{let e=r.getAttribute("href"),t=(r.textContent??"").trim();return{href:e&&e!=="#"?e:"",...t?{text:t}:{}}},find:(r,e,t)=>r.link(e,t),defaults:()=>({href:"",text:""}),form:{fields:[{key:"text",label:"Text",kind:"text"},{key:"href",label:"Address",kind:"url"},{key:"rel",label:"Relationship (rel), e.g. nofollow",kind:"text"},{key:"lang",label:"Language of the target, e.g. en",kind:"text"}],toForm:r=>({text:r.text??"",href:r.href,rel:r.rel??"",lang:r.lang??""}),fromForm:r=>{let e=O(r.href).trim();if(!e)return"Enter the address the link goes to.";if(e.length>2048)return"The address can be at most 2048 characters.";let t={href:e};for(let n of["text","rel","lang"]){let i=O(r[n]).trim();i&&(t[n]=i)}return t}},validate:({href:r})=>/^\s*javascript:/i.test(r)?[{level:"error",message:"Links cannot run scripts."}]:[]},wn={type:"reference",label:"Reference",attribute:"reference",entityArray:"references",endpoint:w.REFERENCE,historyEndpoint:w.REFERENCE_HISTORY,surface:"popover",valueKeys:["entityReference"],find:(r,e,t)=>r.reference(e,t),defaults:()=>({entityReference:{urn:""}}),form:{fields:[{key:"urn",label:"Entity referred to",kind:"entity"}],toForm:r=>({urn:r.entityReference?.urn??""}),fromForm:r=>{let e=O(r.urn).trim();return/^[0-9a-f-]{36}$/i.test(e)?{entityReference:{urn:e}}:"Choose the entity this refers to."}},validate:()=>[]};var En=[250,500,1e3,2e3,4e3],ki=3e4,Ce=class{ctx;view;saving;editing;constructor(e,t,n,i){this.ctx=e,this.view=t,this.saving=n,this.editing=i}async save(e,t){let n=pt(t).find(g=>g.level==="error");if(n)return this.ctx.popover.setError(n.message);let i=await xi(t,window.baackEditorConfig?.imageWidths),{pending:s,popover:o,store:a,feedback:d}=this.ctx,l=e.entry,u=l.form.fromForm(o.values());if(typeof u=="string")return o.setError(u);let h=e.urn?a.get(e.urn)?.item:void 0,f=ve(l,h,u);for(let g of i.keys())delete f[V.find(y=>y.size===g).field];e.urn?s.set({kind:"edit",type:l.type,urn:e.urn,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:f}):s.set({kind:"create",type:l.type,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:f});let p=e.urn?s.getEdit(e.urn):s.getCreate($({...e,type:l.type}));o.setSending(!0),o.setError("");let v;try{v=await this.saving().commit(p)}catch(g){o.setSending(!1);let y=await d.describe(g,"save this image");o.setError(y.message,y.debug);return}o.setSending(!1);let m=new Map([...i].map(([g,y])=>[g,URL.createObjectURL(y)]));this.preview(e.entityUrn,v,m),await this.upload(e,v,i,m)}async upload(e,t,n,i){let{transport:s,feedback:o,toolbar:a}=this.ctx;this.editing().close();let d=c("div","simple-form");d.setAttribute("aria-label","Image upload");let l=new Map;d.append(c("div","title",`Uploading to a new version of ${e.name}`));for(let[b,k]of n){let A=c("p","hint",`${kn(b)}: ${k.name}: uploading\u2026`);l.set(b,A),d.append(A)}let u=this.ctx.panels.show(d,{entityUrn:e.entityUrn,focus:!1}),h=(b,k,A=!1)=>{let K=l.get(b);K.textContent=`${kn(b)}: ${n.get(b).name}: ${k}`,K.className=A?"error":"hint"},f=await Promise.allSettled([...n].map(([b,k])=>s.uploadImageFile(t.urn,b,k))),p=f.flatMap(b=>b.status==="fulfilled"?[b.value]:[]),v=new Map;for(let[b,k]of f.entries()){let[A,K]=[...n][b];k.status==="rejected"?(v.set(A,K),h(A,(await o.describe(k.reason,"upload this file")).message,!0)):h(A,"uploaded; waiting for the CDN\u2026")}let m=[...n.keys()].filter(b=>!v.has(b)),g=b=>V.find(k=>k.size===b).field,x=m.every(b=>p.some(k=>k[g(b)]))||await this.waitForAddresses(e.entry,t.urn,m);for(let b of m)h(b,x?"done":"still processing; it appears when the CDN has placed it.");if(await this.view.refresh(e.entityUrn),v.size>0){this.preview(e.entityUrn,t,new Map([...i].filter(([A])=>v.has(A))));let b=c("button","primary","Retry failed uploads");b.type="button",b.addEventListener("click",()=>{this.retry(e,t,v,i)});let k=c("div","actions");k.append(b),d.append(c("p","message","Some files were not uploaded. The new version keeps the others."),k);return}for(let b of i.values())URL.revokeObjectURL(b);u.close(),a.showMessage(`Uploaded ${n.size} ${n.size===1?"file":"files"} to a new version of ${e.name}.`,!0)}async retry(e,t,n,i){let s=await this.ctx.transport.read(e.entry,t.urn),o=new Map([...n].filter(([a])=>!s[V.find(d=>d.size===a).field]));await this.upload(e,t,o,i)}async waitForAddresses(e,t,n){if(n.length===0)return!0;let i=Date.now();for(let s=0;Date.now()-i<ki;s+=1){let o=await this.ctx.transport.read(e,t);if(n.every(a=>o[V.find(d=>d.size===a).field]))return this.ctx.store.remember(this.ctx.store.get(t)?.entityUrn??"",e,o),!0;await new Promise(a=>setTimeout(a,En[Math.min(s,En.length-1)]))}return!1}preview(e,t,n){let i={...this.ctx.store.get(t.urn)?.item??t};for(let[o,a]of n)i[V.find(d=>d.size===o).field]=a;let s=this.ctx.entry("image");for(let o of this.ctx.discovery.all())o.entry!==s||this.ctx.store.entityFor(o.scope)!==e||o.element.getAttribute(P(s))!==t.urn&&!(o.name===t.name&&o.sortOrder===t.sortOrder)||(this.ctx.live.render(o,i),N(o.element,"changed"))}};function kn(r){return V.find(e=>e.size===r).label.split(" (")[0]}async function xi(r,e){let t=r.get("DEFAULT");if(!e||!t||r.size>1)return r;let n=new Map(r);for(let i of["MEDIUM","LARGE"]){let s=e[i];s&&n.set(i,await Li(t,s,i))}return n}async function Li(r,e,t){try{let n=await createImageBitmap(r);if(n.width<=e)return r;let i=Math.round(n.height*e/n.width),s=document.createElement("canvas");s.width=e,s.height=i,s.getContext("2d").drawImage(n,0,0,e,i);let o=r.type==="image/png"||r.type==="image/webp"?r.type:"image/jpeg",a=await new Promise((l,u)=>s.toBlob(h=>h?l(h):u(new Error("Could not scale the image")),o,.9)),d=r.name.replace(/(\.[^.]+)?$/,`-${t.toLowerCase()}$1`);return new File([a],d,{type:o})}catch{return r}}var Ti=["image/apng","image/avif","image/gif","image/jpeg","image/png","image/svg+xml","image/webp"],ht=1024*1024;function pt(r){let e=window.baackEditorConfig?.maxImageBytes??10*ht,t=window.baackEditorConfig?.warnImageBytes??2*ht,n=s=>`${(s/ht).toFixed(1)} MB`,i=[];for(let s of r.values())Ti.includes(s.type)?s.size>e?i.push({level:"error",message:`${s.name} is ${n(s.size)}; the limit is ${n(e)}. Use a smaller file.`}):s.size>t&&i.push({level:"warning",message:`${s.name} is ${n(s.size)}, large for the web. Compressing it will make the page faster.`}):i.push({level:"error",message:`${s.name} is not an image type Baack accepts: JPEG, PNG, APNG, GIF, WebP, AVIF or SVG.`});return i}var xn="data-content-live",Ln="baack:item-shown",Tn="baack:live-request";function G(r){return r.closest(`[${xn}]`)!==null}var Pe=class{store;shown=new Map;previews=new Set;constructor(e){this.store=e,document.addEventListener(Tn,this.onRequest)}render(e,t){if(!G(e.element)){$t(e.entry,e.element,e,t);return}let n={...this.slot(e),item:t};this.previews.has(J(n))||(this.shown.set(J(n),n),Ie(n),t.urn&&e.element.setAttribute(P(e.entry),t.urn))}restore(e){if(!G(e.element))return!1;let t={...this.slot(e),restore:!0};return this.previews.has(J(t))||(this.shown.delete(J(t)),Ie(t)),!0}showAt(e,t,n){let i=n?{...this.slot(e),sortOrder:t,item:n}:{...this.slot(e),sortOrder:t,restore:!0};n?(this.shown.set(J(i),i),this.previews.add(J(i))):(this.shown.delete(J(i)),this.previews.delete(J(i))),Ie(i)}endPreviews(){this.previews.clear()}slot(e){return{entityUrn:this.store.entityFor(e.scope)??e.scope,type:e.entry.type,name:e.name,sortOrder:e.sortOrder}}onRequest=e=>{for(let t of this.shown.values())t.entityUrn===e.detail.entityUrn&&Ie(t)}};function J(r){return`${r.entityUrn}\0${r.type}\0${r.name}\0${r.sortOrder}`}function Ie(r){document.dispatchEvent(new CustomEvent(Ln,{detail:r}))}var Si=/Mac|iPhone|iPad/.test(navigator.userAgent),$e=class{element;sendsOnEnter;host;callbacks;savedEditable;savedWhiteSpace;savedChildren;constructor(e,t,n,i){this.element=e,this.host=n,this.callbacks=i,this.sendsOnEnter=getComputedStyle(e).display.startsWith("inline")&&e.getAttribute("data-text-layout")!=="paragraphs",this.savedEditable=e.getAttribute("contenteditable"),this.savedWhiteSpace=e.style.whiteSpace,this.savedChildren=G(e)?[...e.childNodes]:void 0,e.textContent=t,Se(e),e.setAttribute("contenteditable","plaintext-only"),e.style.whiteSpace="pre-wrap",e.addEventListener("input",this.onInput),e.addEventListener("keydown",this.onKeyDown),e.addEventListener("blur",this.onBlur),e.focus(),Ai(e)}get hint(){let e=Si?"\u2318":"Ctrl";return this.sendsOnEnter?"Enter to save \xB7 Esc to revert":`${e}+Enter to save \xB7 Esc to revert`}close(){this.element.removeEventListener("input",this.onInput),this.element.removeEventListener("keydown",this.onKeyDown),this.element.removeEventListener("blur",this.onBlur),this.savedEditable===null?this.element.removeAttribute("contenteditable"):this.element.setAttribute("contenteditable",this.savedEditable),this.element.style.whiteSpace=this.savedWhiteSpace,this.element.getAttribute("style")||this.element.removeAttribute("style"),this.savedChildren&&this.element.replaceChildren(...this.savedChildren)}onInput=()=>{Se(this.element),this.callbacks.input()};onKeyDown=e=>{e.key==="Escape"?(e.preventDefault(),this.callbacks.revert()):e.key==="Enter"&&(e.metaKey||e.ctrlKey||this.sendsOnEnter&&!e.shiftKey)&&(e.preventDefault(),this.callbacks.send())};onBlur=e=>{e.relatedTarget!==this.host.element&&this.callbacks.blurred()}};function Ai(r){let e=window.getSelection();if(!e||e.rangeCount>0&&r.contains(e.getRangeAt(0).commonAncestorContainer))return;let t=document.createRange();t.selectNodeContents(r),t.collapse(!1),e.removeAllRanges(),e.addRange(t)}var He=class{ctx;view;save;active;constructor(e,t,n){this.ctx=e,this.view=t,this.save=n}get current(){return this.active}attach(){document.addEventListener("dblclick",this.onDoubleClick,!0),document.addEventListener("click",this.onClick,!0)}detach(){document.removeEventListener("dblclick",this.onDoubleClick,!0),document.removeEventListener("click",this.onClick,!0)}onDoubleClick=e=>{let{discovery:t,toolbar:n}=this.ctx,i=t.closest(e.target);if(!i||this.active?.target.binding?.element===i)return;let s=t.of(i)[0];if(!s)return;e.preventDefault();let o=this.targetFor(s);if(!o){n.showMessage(`The content for "${s.name}" has not loaded.`);return}this.open(o)};onClick=e=>{this.ctx.discovery.closest(e.target)&&e.preventDefault()};onPointerDown=e=>{let t=e.composedPath(),n=this.active?.target.binding?.element??this.active?.target.anchor;!this.active||t.includes(this.ctx.host.element)||n&&t.includes(n)||this.close()};targetFor(e){let{store:t}=this.ctx,n=t.entityFor(e.scope);if(!n)return;let i=e.element.getAttribute(P(e.entry))??void 0;return{entityUrn:n,entry:e.entry,name:e.name,sortOrder:e.sortOrder,urn:i&&t.get(i)?i:void 0,anchor:e.element,binding:e}}open(e){this.view.stopPreview(e);let t=e.binding&&e.binding.element.getClientRects().length>0,n=e.binding?e.entry.component?.(e.binding.element).ownsChildren!==!1:!1;if(e.urn&&e.entry.surface==="inline"&&e.binding&&t&&n)this.openInline(e);else{let i=!e.urn&&e.binding?e.entry.fromPlaceholder?.(e.binding.element):void 0;this.openForm(t?e:{...e,binding:void 0,anchor:e.anchor},i)}}openInline(e){this.close();let{store:t,pending:n,host:i,popover:s}=this.ctx,{entry:o}=e,a=e.binding.element,d=t.get(e.urn),l=n.getEdit(e.urn)?.value??M(o,d.item),u=new $e(a,String(l.value??""),i,{input:()=>this.setPending(e,o.read(a)),send:()=>{this.save(e)},revert:()=>this.revert(e),blurred:()=>this.close()});this.active={target:e,session:u},N(a,"editing"),s.show(a,o.label,`${e.name} #${e.sortOrder}`,u.hint,{send:()=>{this.save(e)},revert:()=>this.revert(e)}),s.setIssues(o.validate(o.read(a))),this.offerHistory(e)}offerHistory(e){let{hooks:t}=this.ctx;this.ctx.popover.setNameAction(()=>t.showItem(e));let n=e.urn;if(!n||e.fromVersion){this.ctx.popover.setExtras([]);return}let i=e.binding,s=[{label:"History",icon:"history",run:()=>{this.close(),t.openHistory({entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder,urn:n})}}];i&&t.canReorder(i)&&s.push({label:"Move up",icon:"arrow-up",menu:!0,run:()=>t.moveBy(i,-1)},{label:"Move down",icon:"arrow-down",menu:!0,run:()=>t.moveBy(i,1)},{label:"Reorder\u2026",icon:"list-ordered",menu:!0,run:()=>t.reorder(i)}),s.push({label:"Move or rename\u2026",icon:"pencil-line",menu:!0,run:()=>t.relocate(e)}),this.ctx.popover.setExtras(s)}async openForm(e,t){this.close();let{store:n,pending:i,popover:s,toolbar:o}=this.ctx,{entry:a}=e,d=a.form;if(!d)return;let l;if(e.urn){let h=await this.baseValue(e);if(!h)return;l=(e.fromVersion?void 0:i.getEdit(e.urn)?.value)??h}else{if(n.itemAt(e.entityUrn,a,e.name,e.sortOrder)){o.showMessage(`An item already exists at ${e.name} #${e.sortOrder}.`);return}l=i.getCreate($({...e,type:a.type}))?.value??t??(e.binding?a.fromPlaceholder?.(e.binding.element):void 0)??a.defaults()}this.active={target:e,session:void 0},e.binding&&N(e.binding.element,"editing");let u=d.toForm(l);s.showForm(e.anchor,e.fromVersion?`${a.label}, from an older version`:e.urn?a.label:`New ${a.label.toLowerCase()}`,`${e.name} #${e.sortOrder}`,d.fields,u,{input:h=>this.onFormInput(e,h),send:()=>{this.save(e)},revert:()=>this.revert(e)},a.surface==="panel"),s.setDescription(this.describeForm(e,u)),s.setIssues(a.validate(l)),this.offerHistory(e),e.fromVersion&&this.setPending(e,l),document.addEventListener("pointerdown",this.onPointerDown,!0)}describeForm(e,t){let n=[e.entry.form?.describe?.(t)??""];return!e.urn&&S(this.ctx.store.view(e.entityUrn)?.status)&&n.push("This content is published, so a new item is live as soon as it is saved."),n.filter(Boolean).join(" ")}async baseValue(e){let{store:t,sources:n,transport:i,feedback:s}=this.ctx,o=e.urn,a=t.get(o)??t.itemAt(e.entityUrn,e.entry,e.name,e.sortOrder);if(!(!a||a.item.urn!==o)){if(!e.entry.renderedByView)return M(e.entry,a.item);try{let d=n.get(o)??M(e.entry,await i.read(e.entry,o));return n.set(o,d),d}catch(d){s.report(d,"load the source",()=>{this.openForm(e)});return}}}close(){let e=this.active;if(!e)return;this.active=void 0,document.removeEventListener("pointerdown",this.onPointerDown,!0),e.session?.close(),this.ctx.popover.hide();let t=e.target.binding;this.view.isEditing&&t?.element.isConnected&&this.view.show(t)}onFormInput(e,t){let{popover:n}=this.ctx,i=e.entry.form;if(!i)return;n.setDescription(this.describeForm(e,t));let s=i.fromForm(t);if(typeof s=="string"){n.setError(s),n.setIssues([]);return}n.setError("");let o=e.entry.type==="image"?pt(n.files()):[];n.setIssues([...e.entry.validate(s),...o]),this.setPending(e,s)}setPending(e,t){let{store:n,sources:i,pending:s,popover:o}=this.ctx,{entry:a}=e,d=t;if(e.urn){let l=n.get(e.urn)??n.itemAt(e.entityUrn,a,e.name,e.sortOrder);d=ve(a,l?.item,t);let u=e.fromVersion?n.itemAt(e.entityUrn,a,e.name,e.sortOrder):l,h=a.renderedByView?i.get(u?.item.urn??e.urn):u?.item;h&&ye(a,d,h)?s.clear(e.urn):s.set({kind:"edit",type:a.type,urn:e.urn,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:d,...e.fromVersion?{fromVersion:!0}:{}})}else s.set({kind:"create",type:a.type,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:d});this.view.reshow(e),e.entry.surface==="inline"&&this.active?.session&&o.setIssues(a.validate(d))}revert(e){this.ctx.pending.clear(e.urn??$({...e,type:e.entry.type})),this.close(),this.view.reshow(e)}};function ie(r,e,t){if(R(r)){let n=Mi(r);return n===void 0?Sn(r,e,t):{...Sn(r,e,t),debug:n}}return Oi(r,e)}function Sn(r,e,t){if(r.isUnauthorized||r.isNotFound&&t===!1)return{kind:"unauthorized",message:`Your session has ended. Log in again to ${e}. Your changes are kept.`};if(r.isForbidden)return{kind:"forbidden",message:`You don't have permission to ${e}.`};if(r.isNotFound)return{kind:"not-found",message:`This item no longer exists, or you don't have permission to ${e}.`};if(r.isConflict)return{kind:"conflict",message:"Someone else changed this since you opened it. Reload to see their version."};let{detail:n}=r;return{kind:"failed",message:`Couldn't ${e} (HTTP ${r.status})${n?`: ${n.replace(/\.$/,"")}`:""}. Try again.`}}function Oi(r,e){if(r instanceof Q)return{kind:"not-live",message:"This content is not published yet, so it has no live version to show. Show the latest drafts to edit it."};if(r instanceof de){let{language:t}=r.received;return{kind:"mismatch",message:`Couldn't ${e}: Baack returned a different language version (${t}) instead of the content on this page, so it can't be edited here. Reload the page and try again.`}}return r instanceof TypeError?{kind:"network",message:`Couldn't reach Baack to ${e}. Check your connection and try again.`}:{kind:"failed",message:`Couldn't ${e}: ${r instanceof Error?r.message:String(r)}`}}function Mi(r){let e=r.json();if(e===void 0)return;let t=s=>{try{return JSON.stringify(JSON.parse(s),null,2)}catch{return s}},n=(()=>{try{return new URL(r.url).pathname}catch{return r.url}})();return`${`Request: ${r.method} ${n}${r.requestBody?`
|
|
1
|
+
import{b as w,c as N,e as L,f as Ct,h as X,i as T,j as Y,k as ye,l as c,m as Pt,n as It,o as $t}from"./chunks/chunk-TKIJLJYW.js";function E(r,e={},...t){return{tag:r,attrs:e,children:t}}function Bt(r,e=document){if(typeof r=="string")return e.createTextNode(r);let t=e.createElement(r.tag);for(let[n,i]of Object.entries(r.attrs))i!==void 0&&t.setAttribute(n,i);return r.html!==void 0?t.innerHTML=r.html:t.append(...r.children.map(n=>Bt(n,e))),t}function Ht(r,e,t,n){for(let i of t)e.attrs[i]===void 0&&r.removeAttribute(i);for(let[i,s]of Object.entries(e.attrs))s===void 0?r.removeAttribute(i):r.getAttribute(i)!==s&&r.setAttribute(i,s);n&&(e.html!==void 0?r.innerHTML=e.html:r.replaceChildren(...e.children.map(i=>Bt(i,r.ownerDocument))))}function ge(r,e,t){if(!r.carried||!e)return t;let n={...t};for(let i of r.carried){let s=e[i];!(i in n)&&s!==void 0&&(n[i]=s)}return n}function M(r,e){let t={};for(let n of r.valueKeys){let i=e[n];i!==void 0&&(t[n]=i)}return t}function be(r,e,t){return JSON.stringify(M(r,e))===JSON.stringify(M(r,t))}function lt(r,e,t){let n={...e,...t};for(let i of r.derived??[])delete n[i];return n}function Rt(r,e,t,n){let i=r.component?.(e);if(!i)return;let s=i.propsFrom(e);Ht(e,i.render({name:t.name,sortOrder:t.sortOrder,item:n},s),i.volatile,i.ownsChildren)}function J(r,e,t,n){let i={...M(r,t),name:e.name,sortOrder:e.sortOrder,entity:{urn:n}};return e.urn!==void 0&&(i.urn=e.urn),i}function le(r){return`data-${r.attribute}-name`}function Q(r){return`data-${r.attribute}-sort-order`}function B(r){return`data-${r.attribute}-urn`}var U="data-entity-urn",we=class{entries;listener;selector;byElement=new Map;unscopedByElement=new Map;observer;warned=new WeakSet;constructor(e,t){this.entries=e,this.listener=t,this.selector=e.map(n=>`[${le(n)}]`).join(","),this.observer=new MutationObserver(n=>this.onMutations(n))}start(e=document.documentElement){this.scan(e),this.observer.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[U,...this.entries.flatMap(t=>[le(t),Q(t)])]})}stop(){this.observer.disconnect()}all(){return[...this.byElement.values()].flat()}unscoped(){for(let e of this.unscopedByElement.keys())e.isConnected||this.unscopedByElement.delete(e);return[...this.unscopedByElement.values()].flat()}of(e){return this.byElement.get(e)??[]}closest(e){if(!(e instanceof Element))return;let t=e.closest(this.selector);return t instanceof HTMLElement&&this.byElement.has(t)?t:void 0}flush(){let e=this.observer.takeRecords();e.length>0&&this.onMutations(e)}onMutations(e){let t=new Set,n=!1;for(let i of e){i.type==="attributes"&&i.target instanceof Element&&t.add(i.target);for(let s of i.addedNodes)s instanceof Element&&t.add(s);i.removedNodes.length>0&&(n=!0)}n&&this.sweep();for(let i of t)i.isConnected&&this.scan(i)}scan(e){let t=[...e.querySelectorAll(this.selector)];e instanceof HTMLElement&&e.matches(this.selector)&&t.unshift(e);let n=[],i=[];for(let s of t){let o=this.bind(s),a=this.unscopedSlots(s);a.length>0?this.unscopedByElement.set(s,a):this.unscopedByElement.delete(s);let d=this.byElement.get(s)??[];fi(d,o)||(i.push(...d),n.push(...o),o.length>0?this.byElement.set(s,o):this.byElement.delete(s))}e instanceof HTMLElement&&!e.matches(this.selector)&&this.byElement.has(e)&&(i.push(...this.byElement.get(e)),this.byElement.delete(e)),i.length>0&&this.listener.removed(i),n.length>0&&this.listener.added(n)}sweep(){let e=[];for(let[t,n]of this.byElement)t.isConnected||(e.push(...n),this.byElement.delete(t));e.length>0&&this.listener.removed(e)}bind(e){let t=e.closest(`[${U}]`)?.getAttribute(U),n=[];for(let i of this.entries){let s=e.getAttribute(le(i));if(!s||!t)continue;let o=this.sortOrder(e,i);o!==void 0&&n.push({element:e,entry:i,scope:t,name:s,sortOrder:o})}return n}unscopedSlots(e){if(e.closest(`[${U}]`))return[];let t=[];for(let n of this.entries){let i=e.getAttribute(le(n)),s=i?this.sortOrder(e,n):void 0;i&&s!==void 0&&t.push({element:e,entry:n,name:i,sortOrder:s})}return t}sortOrder(e,t){let n=e.getAttribute(Q(t)),i=n===null||n.trim()===""?0:Number(n);if(Number.isInteger(i))return i;this.warn(e,`has ${Q(t)}="${n}", which is not an integer`)}warn(e,t){this.warned.has(e)||(this.warned.add(e),console.warn(`Baack editor: element ${t}; it will not be editable.`,e))}};function fi(r,e){return r.length===e.length&&r.every((t,n)=>t.entry===e[n].entry&&t.scope===e[n].scope&&t.name===e[n].name&&t.sortOrder===e[n].sortOrder)}function H(r){return`${r.entityUrn}|${r.type}|${r.name}|${r.sortOrder}`}function z(r){return r.kind==="move"?`move|${r.planId}|${r.urn}`:r.kind==="edit"?r.urn:H(r)}var Ee=class{items=new Map;onChange;constructor(e){this.onChange=e}getEdit(e){let t=this.items.get(e);return t?.kind==="edit"?t:void 0}getCreate(e){let t=this.items.get(e);return t?.kind==="create"?t:void 0}set(e){this.items.set(z(e),e),this.onChange()}clear(e){this.items.delete(e)&&this.onChange()}clearAll(e){let t=this.all().filter(n=>e===void 0||n.entityUrn===e);for(let n of t)this.items.delete(z(n));return t.length>0&&this.onChange(),t}load(e){this.items.clear();for(let t of e)this.items.set(z(t),t);this.onChange()}all(){return[...this.items.values()]}plan(e){return this.all().filter(t=>t.kind==="move"&&t.planId===e)}count(){return this.items.size}byEntity(){let e=new Map;for(let t of this.items.values())e.set(t.entityUrn,[...e.get(t.entityUrn)??[],t]);return e}};var Nt="baack-editor:stash:";var ke=class{key;constructor(e){this.key=Nt+e}load(e=Date.now()){vi(e);try{let t=window.localStorage.getItem(this.key);if(!t)return[];let n=JSON.parse(t);return n.version!==1||!Array.isArray(n.items)?[]:n.items}catch(t){return console.warn("Baack editor: could not read unsaved changes from this browser.",t),[]}}save(e,t=Date.now()){try{if(e.length===0)window.localStorage.removeItem(this.key);else{let n={version:1,savedAt:t,items:e};window.localStorage.setItem(this.key,JSON.stringify(n))}}catch(n){console.warn("Baack editor: could not keep unsaved changes in this browser.",n)}}};function vi(r){try{for(let e=window.localStorage.length-1;e>=0;e-=1){let t=window.localStorage.key(e);if(!t?.startsWith(Nt))continue;let n=JSON.parse(window.localStorage.getItem(t)??"{}").savedAt;(typeof n!="number"||r-n>6048e5)&&window.localStorage.removeItem(t)}}catch{}}var xe=class r{entity;constructor(e){this.entity=e}get urn(){return this.entity.urn}get name(){return this.entity.name}get status(){return this.entity.status}get language(){return this.entity.language}get variant(){return this.entity.variant}get publishedAt(){return this.entity.publishTimestamp?new Date(this.entity.publishTimestamp):void 0}get updatedAt(){return this.entity.updatedTimestamp?new Date(this.entity.updatedTimestamp):void 0}get raw(){return this.entity}allByName(e,t){return e?e.filter(n=>n.name===t).sort((n,i)=>n.sortOrder-i.sortOrder):[]}byNameAndSortOrder(e,t,n=0){return e?.find(i=>i.name===t&&i.sortOrder===n)}has(e){let{texts:t,markdowns:n,templates:i,booleans:s,doubles:o,longs:a,money:d,dateTimes:l,images:u,latLongs:h,jsons:f,links:p,references:v}=this.entity;return[t,n,i,s,o,a,d,l,u,h,f,p,v].some(m=>m?.some(g=>g.name===e))}hasByNameAndSortOrder(e,t,n=0){return this.byNameAndSortOrder(e,t,n)!==void 0}hasText(e,t=0){return this.hasByNameAndSortOrder(this.entity.texts,e,t)}hasMarkdown(e,t=0){return this.hasByNameAndSortOrder(this.entity.markdowns,e,t)}hasTemplate(e,t=0){return this.hasByNameAndSortOrder(this.entity.templates,e,t)}hasBoolean(e,t=0){return this.hasByNameAndSortOrder(this.entity.booleans,e,t)}hasDouble(e,t=0){return this.hasByNameAndSortOrder(this.entity.doubles,e,t)}hasLong(e,t=0){return this.hasByNameAndSortOrder(this.entity.longs,e,t)}hasNumber(e,t=0){return this.hasDouble(e,t)||this.hasLong(e,t)}hasMoney(e,t=0){return this.hasByNameAndSortOrder(this.entity.money,e,t)}hasDate(e,t=0){return this.hasByNameAndSortOrder(this.entity.dateTimes,e,t)}hasImage(e,t=0){return this.hasByNameAndSortOrder(this.entity.images,e,t)}hasLatLong(e,t=0){return this.hasByNameAndSortOrder(this.entity.latLongs,e,t)}hasJson(e,t=0){return this.hasByNameAndSortOrder(this.entity.jsons,e,t)}hasLink(e,t=0){return this.hasByNameAndSortOrder(this.entity.links,e,t)}hasReference(e,t=0){return this.hasByNameAndSortOrder(this.entity.references,e,t)}text(e,t=0){return this.byNameAndSortOrder(this.entity.texts,e,t)}texts(e){return this.allByName(this.entity.texts,e)}requireText(e,t=0){let n=this.text(e,t);if(n===void 0)throw new Error(`EntityView: missing required text item "${e}" on entity ${this.entity.urn}`);return n}markdown(e,t=0){return this.byNameAndSortOrder(this.entity.markdowns,e,t)}markdowns(e){return this.allByName(this.entity.markdowns,e)}template(e,t=0){return this.byNameAndSortOrder(this.entity.templates,e,t)}templates(e){return this.allByName(this.entity.templates,e)}boolean(e,t=0){return this.byNameAndSortOrder(this.entity.booleans,e,t)}booleans(e){return this.allByName(this.entity.booleans,e)}double(e,t=0){return this.byNameAndSortOrder(this.entity.doubles,e,t)}doubles(e){return this.allByName(this.entity.doubles,e)}long(e,t=0){return this.byNameAndSortOrder(this.entity.longs,e,t)}longs(e){return this.allByName(this.entity.longs,e)}number(e,t=0){return this.double(e,t)??this.long(e,t)}money(e,t=0){return this.byNameAndSortOrder(this.entity.money,e,t)}moneys(e){return this.allByName(this.entity.money,e)}date(e,t=0){return this.byNameAndSortOrder(this.entity.dateTimes,e,t)}dates(e){return this.allByName(this.entity.dateTimes,e)}image(e,t=0){return this.byNameAndSortOrder(this.entity.images,e,t)}images(e){return this.allByName(this.entity.images,e)}latLong(e,t=0){return this.byNameAndSortOrder(this.entity.latLongs,e,t)}latLongs(e){return this.allByName(this.entity.latLongs,e)}json(e,t=0){return this.byNameAndSortOrder(this.entity.jsons,e,t)}jsons(e){return this.allByName(this.entity.jsons,e)}link(e,t=0){return this.byNameAndSortOrder(this.entity.links,e,t)}links(e){return this.allByName(this.entity.links,e)}reference(e,t=0){return this.byNameAndSortOrder(this.entity.references,e,t)}references(e){return this.allByName(this.entity.references,e)}static async fetch(e,t,n,i){let s=await e.read(w.ENTITY_VIEW,t,n,i);return new r(s)}static from(e){return new r(e)}};var Le=class{scopes=new Map;views=new Map;items=new Map;hasScope(e){return this.scopes.has(e)}loadEntity(e,t){this.scopes.set(e,t.urn),this.views.set(t.urn,xe.from(t))}entityFor(e){return this.scopes.get(e)}view(e){return this.views.get(e)}entities(){return[...this.views.keys()]}scopesFor(e){return[...this.scopes].filter(([,t])=>t===e).map(([t])=>t)}itemFor(e){let t=this.scopes.get(e.scope);return t===void 0?void 0:this.itemAt(t,e.entry,e.name,e.sortOrder)}itemAt(e,t,n,i){let s=this.views.get(e),o=s?t.find(s,n,i):void 0;if(!o?.urn)return;let a={entry:t,item:o,entityUrn:e};return this.items.set(o.urn,a),a}remember(e,t,n){let i={entry:t,item:n,entityUrn:e};return n.urn&&this.items.set(n.urn,i),i}get(e){return this.items.get(e)}replace(e,t){let n=this.items.get(e);if(!n||!t.urn)throw new Error(`Cannot replace unknown item ${e}`);let i={entry:n.entry,item:t,entityUrn:n.entityUrn};if(this.items.delete(e),this.items.set(t.urn,i),n.entry.renderedByView)return i;let s=this.views.get(n.entityUrn)?.raw[n.entry.entityArray],o=s?.findIndex(a=>a.urn===e)??-1;return s&&o>=0&&(s[o]=t),i}clearEntities(){this.scopes.clear(),this.views.clear(),this.items.clear()}};var ce=class extends Error{expectedUrn;received;constructor(e,t){super(`The entity view returned ${t.urn} (${t.language}) for ${e}`),this.name="EntityMismatchError",this.expectedUrn=e,this.received=t}},ee=class extends Error{entityUrn;constructor(e){super(`${e} has no live view: it is not published`),this.name="NotLiveError",this.entityUrn=e}};function S(r){return r==="PUBLISHED"||r==="PUBLISHED_WITH_DRAFTS"}var Te=class{transport;locators=new Map;constructor(e){this.transport=e}async read(e,t={}){let n=await this.locator(e),i;try{i=await this.transport.entityView(e,{...t,...n})}catch(s){throw t.version===void 0&&N(s)&&s.isNotFound?new ee(e):s}if(i.urn!==e)throw new ce(e,i);return i}async readAsLive(e){let t=await this.transport.readEntity(e);if(this.locators.set(e,Promise.resolve({language:t.language,variant:t.variant??""})),S(t.status))return{entity:await this.read(e),live:!0};if(t.status==="PUBLISH"||t.status==="PUBLISH_PENDING")try{return{entity:await this.read(e),live:!0}}catch(n){if(!(n instanceof ee))throw n}return{entity:await this.read(e,{version:"LATEST"}),live:!1}}locator(e){let t=this.locators.get(e);return t||(t=this.transport.readEntity(e).then(n=>({language:n.language,variant:n.variant??""})),t.catch(()=>this.locators.delete(e)),this.locators.set(e,t)),t}};function Se(r,e){return{label:r.canPublish?"Review and publish\u2026":"Request approval\u2026",run:()=>r.hooks.publishEntity(e)}}function te(r){let e=document.documentElement.getAttribute(U);return e?r.entityFor(e):void 0}function ne(r,e){let t=te(r);return[...e].sort((n,i)=>n===t?-1:i===t?1:0)}function ue(r){switch(r){case"DRAFT_UNPUBLISHED":return"Draft, not published yet";case"PUBLISH":return"Publishing\u2026";case"PUBLISH_PENDING":return"Scheduled to publish";case"PUBLISHED":return"Published";case"PUBLISHED_WITH_DRAFTS":return"Published, with unpublished changes";default:return""}}var Ae="data-baack-state",yi={editable:["1px dashed","primary",70],editing:["2px solid","primary",100],changed:["2px solid","warning",100],unresolved:["1px dotted","muted",80],previewing:["2px dashed","preview",100],published:["2px solid","success",100]};function gi(r,e){let[t,n,i]=yi[e],[s,o]=Ct[n],a=d=>i===100?d:`color-mix(in srgb, ${d} ${i}%, transparent)`;r.style.outline=`${t} ${a(s)}`,r.style.outline=`${t} ${a(`light-dark(${s}, ${o})`)}`}var he=new WeakMap;function D(r,e){if(!he.has(r)){let{outline:t,outlineOffset:n,display:i,minWidth:s,minHeight:o}=r.style;he.set(r,{outline:t,outlineOffset:n,display:i,minWidth:s,minHeight:o})}gi(r,e),r.style.outlineOffset="2px",r.setAttribute(Ae,e),Oe(r)}function Oe(r){let e=he.get(r);e&&(r.style.display=e.display,r.style.minWidth=e.minWidth,r.style.minHeight=e.minHeight,!(r.textContent!==""||r.querySelector("img, picture, svg, video, iframe"))&&(getComputedStyle(r).display==="inline"&&(r.style.display="inline-block"),r.style.minWidth="1ch",r.style.minHeight="1lh"))}function Dt(r){let e=he.get(r);e&&(r.style.outline=e.outline,r.style.outlineOffset=e.outlineOffset,r.style.display=e.display,r.style.minWidth=e.minWidth,r.style.minHeight=e.minHeight,r.getAttribute("style")||r.removeAttribute("style"),he.delete(r)),r.removeAttribute(Ae)}function Me(r){return r.split(/\n\s*\n/).map(e=>e.split(`
|
|
2
|
+
`).map(t=>t.replace(/\s+/g," ").trim()).filter(Boolean)).filter(e=>e.length>0)}function ie(r){return Me(r).flat()}var bi=/(https?:\/\/[^\s)]+[^\s).,;:!?]|[\w.+-]+@[\w-]+(?:\.[\w-]+)+)/g;function Ft(r){return r.split(bi).map((e,t)=>{if(e!=="")return t%2===0?{text:e}:{text:e,href:e.includes("@")&&!e.startsWith("http")?`mailto:${e}`:e}}).filter(e=>e!==void 0)}function pe(r){try{return new Intl.NumberFormat("en-GB",{style:"currency",currency:r}).resolvedOptions().maximumFractionDigits??2}catch{return 2}}function Ut(r){return r.formattedValue?r.formattedValue:Ce(r.unitValue,pe(r.currencyCode))}function Vt(r){if(r.currencySymbol)return r.currencySymbol;try{return new Intl.NumberFormat("en-GB",{style:"currency",currency:r.currencyCode}).formatToParts(0).find(t=>t.type==="currency")?.value??r.currencyCode}catch{return r.currencyCode}}function Ce(r,e){let t=r<0,n=String(Math.abs(Math.trunc(r)));if(e===0)return(t?"-":"")+n;let i=n.padStart(e+1,"0");return`${t?"-":""}${i.slice(0,-e)}.${i.slice(-e)}`}function ct(r,e){let t=/^\s*(-)?(\d+)(?:\.(\d*))?\s*$/.exec(r);if(!t)return;let[,n,i="0",s=""]=t;if(s.length>e)return;let o=Number(i+s.padEnd(e,"0"));if(Number.isSafeInteger(o))return n?-o:o}function C(r){return Date.parse(/[zZ]|[+-]\d\d:?\d\d$/.test(r)?r:`${r}Z`)}function _t(r,e){let t=C(r);if(Number.isNaN(t))return r;let n={timeZone:e.timeZone??"UTC"};return e.dateStyle&&(n.dateStyle=e.dateStyle),e.timeStyle&&(n.timeStyle=e.timeStyle),!e.dateStyle&&!e.timeStyle&&(n.dateStyle="medium"),new Intl.DateTimeFormat(e.locale??"en-GB",n).format(t)}function zt(r,e){return new Intl.NumberFormat(e??"en-GB",{maximumFractionDigits:20}).format(r)}var wi=new Set(["id","role","title","lang","dir","tabindex","itemscope","itemtype","itemid","itemref"]),Ei=/^data-(placeholder|section|content-rows?|[a-z]+-(name|sort-order|urn|list)|attr-[a-z0-9-]+-(name|sort-order|urn|placeholder))$/;function ki(r){return Ei.test(r)?!1:wi.has(r)||/^(data|aria)-[a-z0-9-]+$/.test(r)}function I(r){let e={};for(let[t,n]of Object.entries(r??{}))ki(t)&&(e[t]=n);return e}function $(r,e,t){return{[`data-${r}-name`]:e.name,[`data-${r}-sort-order`]:String(e.sortOrder),[`data-${r}-urn`]:t?void 0:e.item?.urn,"data-placeholder":t?"":void 0}}function R(r,...e){return[`data-${r}-urn`,"data-placeholder",...e]}function j(r){return{className:r.getAttribute("class")??void 0,itemProp:r.getAttribute("itemprop")??void 0}}function Kt(r,e,t){return t?r.flatMap((n,i)=>i>0?[E("br"),...e(n)]:e(n)):[r.join(" ")]}function jt(r,e){return e?Ft(r).map(t=>"href"in t?E("a",{href:t.href},t.text):t.text):[r]}var ut={type:"text",volatile:R("text"),ownsChildren:!0,render(r,e){let t=r.item?ie(r.item.value):[],n=t.length===0,i=e.as??"span",s=n?ie(e.placeholder):t,o=E(i,{...I(e.attributes),class:e.className,itemprop:e.itemProp,...$("text",r,n),"data-text-linkify":e.linkify?"":void 0,"data-text-unsafe-literal":e.unsafeLiteral?"":void 0},...Kt(s,a=>jt(a,e.linkify===!0),i!=="title"&&i!=="option"));return e.unsafeLiteral&&!n&&(o.html=r.item.value),o},propsFrom:r=>({...j(r),placeholder:"",as:r.localName,linkify:r.hasAttribute("data-text-linkify"),unsafeLiteral:r.hasAttribute("data-text-unsafe-literal")})},Wt={type:"text",volatile:R("text"),ownsChildren:!0,render(r,e){let t=r.item?Me(r.item.value):[],n=t.length===0,i=n?Me(e.placeholder):t,s=E(e.as??"div",{...I(e.attributes),class:e.className,itemprop:e.itemProp,...$("text",r,n),"data-text-layout":"paragraphs","data-text-linkify":e.linkify?"":void 0,"data-text-unsafe-literal":e.unsafeLiteral?"":void 0},...i.map(o=>E("p",{class:e.paragraphClassName},...Kt(o,a=>jt(a,e.linkify===!0),!0))));return e.unsafeLiteral&&!n&&(s.html=r.item.value),s},propsFrom:r=>({...ut.propsFrom(r),paragraphClassName:r.querySelector(":scope > p")?.getAttribute("class")??void 0})},qt={type:"text",volatile:R("text","content"),ownsChildren:!1,render(r,e){let t=r.item?ie(r.item.value).join(" "):"",n=t==="";return E("meta",{...I(e.attributes),name:e.name,property:e.property,content:n?e.placeholder:t,...$("text",r,n)})},propsFrom:r=>({name:r.getAttribute("name")??void 0,property:r.getAttribute("property")??void 0,placeholder:""})};function Yt(r){return{type:r,volatile:R(r),ownsChildren:!0,render(e,t){let n=e.item?.value,i=!n?.trim(),s=E(t.as??"div",{...I(t.attributes),class:t.className,itemprop:t.itemProp,...$(r,e,i)});return i?s.children=[E("p",{},t.placeholder)]:s.html=n,s},propsFrom:e=>({...j(e),placeholder:"",as:e.localName})}}var Jt=Yt("markdown"),Zt=Yt("template"),Xt={type:"money",volatile:R("money","itemprop","content","data-money-currency","data-money-unit-value"),ownsChildren:!0,render(r,e){let t=r.item,n={"data-money-offer":e.offer?"":void 0,"data-money-item-prop":e.offer?void 0:e.itemProp};if(!t)return E("span",{...I(e.attributes),class:e.className,...$("money",r,!0),...n},e.placeholder);let i=Ut(t);return E("span",{...I(e.attributes),class:e.className,itemprop:e.offer?"price":e.itemProp,content:e.offer?i:void 0,...$("money",r,!1),"data-money-currency":t.currencyCode,"data-money-unit-value":String(t.unitValue),...n},E("span",{itemprop:e.offer?"priceCurrency":void 0,content:e.offer?t.currencyCode:void 0},Vt(t)),i)},propsFrom:r=>({className:r.getAttribute("class")??void 0,itemProp:r.getAttribute("data-money-item-prop")??void 0,offer:r.hasAttribute("data-money-offer"),placeholder:""})};function Qt(r){return{type:r,volatile:R(r,"value"),ownsChildren:!0,render(e,t){let n=e.item;return E("data",{...I(t.attributes),class:t.className,itemprop:t.itemProp,value:n?String(n.value):void 0,...$(r,e,!n),"data-locale":t.locale},n?zt(n.value,t.locale):t.placeholder)},propsFrom:e=>({...j(e),placeholder:"",locale:e.getAttribute("data-locale")??void 0})}}var en=Qt("long"),tn=Qt("double"),nn={type:"datetime",volatile:R("datetime","datetime"),ownsChildren:!0,render(r,e){let t=r.item,n=t?C(t.value):NaN;return E("time",{...I(e.attributes),class:e.className,itemprop:e.itemProp,datetime:Number.isNaN(n)?void 0:new Date(n).toISOString(),...$("datetime",r,!t),"data-locale":e.locale,"data-date-style":e.dateStyle,"data-time-style":e.timeStyle,"data-time-zone":e.timeZone},t?_t(t.value,e):e.placeholder)},propsFrom:r=>({...j(r),placeholder:"",locale:r.getAttribute("data-locale")??void 0,dateStyle:r.getAttribute("data-date-style")??void 0,timeStyle:r.getAttribute("data-time-style")??void 0,timeZone:r.getAttribute("data-time-zone")??void 0})},rn={type:"boolean",volatile:R("boolean","hidden"),ownsChildren:!1,render(r,e){let t=r.item?r.item.value:e.fallback===!0,n=e.invert?!t:t;return E(e.as??"div",{...I(e.attributes),class:e.className,hidden:n?void 0:"",...$("boolean",r,!r.item),"data-boolean-value":String(t),"data-boolean-invert":e.invert?"":void 0})},propsFrom:r=>({className:r.getAttribute("class")??void 0,invert:r.hasAttribute("data-boolean-invert"),as:r.localName})},sn={type:"latlong",volatile:R("latlong"),ownsChildren:!0,render(r,e){let t=r.item,n={...I(e.attributes),class:e.className,itemprop:e.itemProp,itemscope:"",itemtype:"https://schema.org/GeoCoordinates",...$("latlong",r,!t)};return t?E("span",n,E("meta",{itemprop:"latitude",content:String(t.latitude)}),E("meta",{itemprop:"longitude",content:String(t.longitude)}),`${t.latitude}, ${t.longitude}`):E("span",n,e.placeholder)},propsFrom:r=>({...j(r),placeholder:""})};function xi(r,e,t){let n=e.item?ie(e.item.value).join(" "):"",i=n==="";return{[r]:i?t:n,[`data-attr-${r}-name`]:e.name,[`data-attr-${r}-sort-order`]:String(e.sortOrder),[`data-attr-${r}-urn`]:i?void 0:e.item?.urn,[`data-attr-${r}-placeholder`]:i?"":void 0}}function Li(r){return[`data-attr-${r}-urn`,`data-attr-${r}-placeholder`]}function Ti(r,e){let t=r.getAttribute(`data-attr-${e}-name`)??"",n=Number(r.getAttribute(`data-attr-${e}-sort-order`)??0),i=r.getAttribute(`data-attr-${e}-urn`),s=r.getAttribute(e)??"";return i===null?{ref:{name:t,sortOrder:n},placeholder:s}:{ref:{name:t,sortOrder:n,item:{urn:i,value:s}},placeholder:""}}var Br={type:"text",volatile:[...R("text"),...Li("value")],ownsChildren:!0,render(r,e){let t=r.item?ie(r.item.value).join(" "):"",n=t==="";return E("option",{...I(e.attributes),class:e.className,...Oi(r.sortOrder),...$("text",r,n),...xi("value",e.value,e.valuePlaceholder)},n?e.placeholder:t)},propsFrom:r=>{let e=Ti(r,"value");return{...j(r),placeholder:"",value:e.ref,valuePlaceholder:e.placeholder}}};function Gt(r){return r.replace(/\r\n?/g,`
|
|
3
|
+
`)}var on={type:"text",volatile:R("text"),ownsChildren:!0,render(r,e){let t=r.item&&r.item.value.trim()!==""?Gt(r.item.value):"",n=t==="";return E(e.as??"code",{...I(e.attributes),class:e.className,itemprop:e.itemProp,...$("text",r,n),"data-text-layout":"code"},n?Gt(e.placeholder):t)},propsFrom:r=>({...j(r),placeholder:"",as:r.localName})},Pe={type:"link",volatile:R("link","rel","hreflang"),ownsChildren:!0,render(r,e){let t=r.item,n=t?t.text||t.href:e.placeholder;return E("a",{...I(e.attributes),class:e.className,itemprop:e.itemProp,href:t?t.href:e.placeholderHref??"#",rel:t?.rel||void 0,hreflang:t?.lang||void 0,...$("link",r,!t)},e.textItemProp?E("span",{itemprop:e.textItemProp},n):n)},propsFrom:r=>({...j(r),placeholder:"",textItemProp:r.querySelector(":scope > span[itemprop]")?.getAttribute("itemprop")??void 0})},an={type:"link",volatile:Pe.volatile,ownsChildren:!1,render(r,e){let t=Pe.render(r,{...e,placeholder:""});return t.attrs["data-link-wraps"]="",t.children=[],t},propsFrom:r=>j(r)},Si="768px",Ai="1024px",dn={type:"image",volatile:R("image"),ownsChildren:!0,render(r,e){let t=r.item,n={...I(e.attributes),class:e.className,...$("image",r,!t?.src),"data-image-priority":e.priority?"":void 0,"data-image-alt":e.placeholderAlt,"data-image-item-prop":e.itemProp,"data-image-img-class":e.imgClassName};return t?.src?E("picture",n,...t.largeSrc?[E("source",{media:`(min-width: ${Ai})`,srcset:t.largeSrc})]:[],...t.mediumSrc?[E("source",{media:`(min-width: ${Si})`,srcset:t.mediumSrc})]:[],E("img",{src:t.src,alt:t.altText??e.placeholderAlt??"",loading:e.priority?"eager":"lazy",decoding:"async",fetchpriority:e.priority?"high":void 0,itemprop:e.itemProp,class:e.imgClassName})):E("picture",n)},propsFrom:r=>({className:r.getAttribute("class")??void 0,priority:r.hasAttribute("data-image-priority"),itemProp:r.getAttribute("data-image-item-prop")??void 0,imgClassName:r.getAttribute("data-image-img-class")??void 0,placeholderAlt:r.getAttribute("data-image-alt")??void 0})};function Oi(r){return{"data-content-row":String(r)}}var ln={type:"text",volatile:R("text","data-section"),ownsChildren:!1,render(r,e){let t=r.item?.value.trim();return E(e.as??"section",{...I(e.attributes),class:e.className,...$("text",r,!t),"data-section":t||e.placeholder})},propsFrom:r=>({className:r.getAttribute("class")??void 0,placeholder:r.getAttribute("data-section")??"",as:r.localName})};var Mi=/<\/?[a-z!][^>]*>/i,un={type:"text",label:"Text",attribute:"text",entityArray:"texts",endpoint:w.TEXT,historyEndpoint:w.TEXT_HISTORY,surface:"inline",valueKeys:["value"],component:r=>r.localName==="meta"?qt:r.hasAttribute("data-section")?ln:r.getAttribute("data-text-layout")==="code"?on:Ci(r.getAttribute("data-text-layout")==="paragraphs"?Wt:ut),find:(r,e,t)=>r.text(e,t),defaults:()=>({value:""}),read:r=>({value:re(r)}),form:{fields:[{key:"value",label:"Text",kind:"textarea"}],toForm:r=>({value:r.value}),fromForm:r=>({value:typeof r.value=="string"?r.value:""})},fromPlaceholder:r=>r.localName==="meta"?{value:r.getAttribute("content")??""}:r.hasAttribute("data-section")?{value:r.getAttribute("data-section")??""}:r.getAttribute("data-text-layout")==="paragraphs"?{value:[...r.querySelectorAll(":scope > p")].map(e=>re(e)).join(`
|
|
4
|
+
|
|
5
|
+
`)}:{value:re(r)},validate:({value:r})=>Mi.test(r)?[{level:"warning",message:"This looks like HTML. Text items are plain text, so the page shows the tags as typed, and apps on other platforms will too."}]:[]};function Ci(r){return{...r,render(e,t){let n=r.render(e,{...t,unsafeLiteral:!1});return t.unsafeLiteral&&(n.attrs["data-text-unsafe-literal"]=""),n}}}function re(r){let e="";for(let t of r.childNodes)t.nodeType===Node.TEXT_NODE?e+=t.nodeValue??"":t.nodeName==="BR"?e+=`
|
|
6
|
+
`:e+=re(t);return e}var O=r=>typeof r=="string"?r:"";function mn(r,e,t,n,i,s){return{type:r,label:e,attribute:r,entityArray:r==="markdown"?"markdowns":"templates",endpoint:t,historyEndpoint:n,surface:r==="markdown"?"inline":"panel",valueKeys:["value"],renderedByView:!0,component:()=>i,...r==="markdown"?{read:o=>({value:re(o)})}:{},fromPlaceholder:o=>({value:(o.textContent??"").trim()}),find:s,defaults:()=>({value:""}),form:{fields:[{key:"value",label:r==="markdown"?"Markdown source":"Velocity template source",kind:"code"}],toForm:o=>({value:o.value}),fromForm:o=>({value:O(o.value)}),describe:()=>r==="markdown"?"The page shows the rendered result after you send.":"Templates can show other items. The page shows the result after you send."},validate:()=>[]}}var fn=mn("markdown","Markdown",w.MARKDOWN,w.MARKDOWN_HISTORY,Jt,(r,e,t)=>r.markdown(e,t)),vn=mn("template","Template",w.TEMPLATE,w.TEMPLATE_HISTORY,Zt,(r,e,t)=>r.template(e,t)),yn={type:"json",label:"JSON",attribute:"json",entityArray:"jsons",endpoint:w.JSON,historyEndpoint:w.JSON_HISTORY,surface:"panel",valueKeys:["value"],find:(r,e,t)=>r.json(e,t),defaults:()=>({value:{}}),form:{fields:[{key:"value",label:"JSON object",kind:"code"}],toForm:r=>({value:JSON.stringify(r.value??{},null,2)}),fromForm:r=>{try{let e=JSON.parse(O(r.value));return typeof e!="object"||e===null||Array.isArray(e)?'The value must be a JSON object, like {"key": "value"}.':{value:e}}catch(e){return`This is not valid JSON: ${e instanceof Error?e.message:String(e)}`}}},validate:()=>[]},gn={type:"boolean",label:"Switch",attribute:"boolean",entityArray:"booleans",endpoint:w.BOOLEAN,historyEndpoint:w.BOOLEAN_HISTORY,surface:"popover",valueKeys:["value"],component:()=>rn,fromPlaceholder:r=>({value:r.getAttribute("data-boolean-value")==="true"}),find:(r,e,t)=>r.boolean(e,t),defaults:()=>({value:!1}),form:{fields:[{key:"value",label:"On",kind:"checkbox"}],toForm:r=>({value:r.value}),fromForm:r=>({value:r.value===!0})},validate:()=>[]};function Pi(r){if(!/^\s*-?\d+\s*$/.test(r))return;let e=Number(r);return Number.isSafeInteger(e)?e:void 0}var bn={type:"long",label:"Whole number",attribute:"long",entityArray:"longs",endpoint:w.LONG,historyEndpoint:w.LONG_HISTORY,surface:"popover",valueKeys:["value"],component:()=>en,find:(r,e,t)=>r.long(e,t),defaults:()=>({value:0}),form:{fields:[{key:"value",label:"Value",kind:"integer"}],toForm:r=>({value:String(r.value)}),fromForm:r=>{let e=Pi(O(r.value));return e===void 0?"Enter a whole number.":{value:e}}},validate:()=>[]};function ht(r){if(!/^\s*-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?\s*$/i.test(r))return;let e=Number(r);return Number.isFinite(e)?e:void 0}var wn={type:"double",label:"Number",attribute:"double",entityArray:"doubles",endpoint:w.DOUBLE,historyEndpoint:w.DOUBLE_HISTORY,surface:"popover",valueKeys:["value"],component:()=>tn,find:(r,e,t)=>r.double(e,t),defaults:()=>({value:0}),form:{fields:[{key:"value",label:"Value",kind:"decimal"}],toForm:r=>({value:String(r.value)}),fromForm:r=>{let e=ht(O(r.value));return e===void 0?"Enter a number.":{value:e}}},validate:()=>[]};function Ii(r){let e=C(r);return Number.isNaN(e)?"":new Date(e-new Date(e).getTimezoneOffset()*6e4).toISOString().slice(0,16)}function hn(r){if(!/^\d{4}-\d\d-\d\dT\d\d:\d\d(:\d\d)?$/.test(r))return;let e=new Date(r).getTime();return Number.isNaN(e)?void 0:new Date(e).toISOString().replace("Z","")}var En={type:"dateTime",label:"Date and time",attribute:"datetime",entityArray:"dateTimes",endpoint:w.DATE_TIME,historyEndpoint:w.DATE_TIME_HISTORY,surface:"popover",valueKeys:["value"],component:()=>nn,find:(r,e,t)=>r.date(e,t),defaults:()=>({value:new Date().toISOString().replace("Z","")}),form:{fields:[{key:"value",label:"Date and time (your local time)",kind:"datetime"}],toForm:r=>({value:Ii(r.value)}),fromForm:r=>{let e=hn(O(r.value));return e===void 0?"Enter a date and time.":{value:e}},describe:r=>{let e=hn(O(r.value));return e?`Stored as ${e.slice(0,16).replace("T"," ")} UTC.`:""}},validate:()=>[]},kn={type:"latLong",label:"Location",attribute:"latlong",entityArray:"latLongs",endpoint:w.LAT_LONG,historyEndpoint:w.LAT_LONG_HISTORY,surface:"popover",valueKeys:["latitude","longitude"],component:()=>sn,find:(r,e,t)=>r.latLong(e,t),defaults:()=>({latitude:0,longitude:0}),form:{fields:[{key:"latitude",label:"Latitude",kind:"decimal"},{key:"longitude",label:"Longitude",kind:"decimal"}],toForm:r=>({latitude:String(r.latitude),longitude:String(r.longitude)}),fromForm:r=>{let e=ht(O(r.latitude)),t=ht(O(r.longitude));return e===void 0||Math.abs(e)>90?"Latitude must be a number from -90 to 90.":t===void 0||Math.abs(t)>180?"Longitude must be a number from -180 to 180.":{latitude:e,longitude:t}}},validate:()=>[]};function pn(r){if(!/^[A-Z]{3}$/.test(r))return!1;try{return new Intl.NumberFormat("en",{style:"currency",currency:r}),!0}catch{return!1}}var xn={type:"money",label:"Money",attribute:"money",entityArray:"money",endpoint:w.MONEY,historyEndpoint:w.MONEY_HISTORY,surface:"popover",valueKeys:["currencyCode","unitValue"],derived:["formattedValue","currencySymbol"],component:()=>Xt,find:(r,e,t)=>r.money(e,t),defaults:()=>({currencyCode:"GBP",unitValue:0}),form:{fields:[{key:"currencyCode",label:"Currency",kind:"currency"},{key:"amount",label:"Amount",kind:"text"}],toForm:r=>({currencyCode:r.currencyCode,amount:Ce(r.unitValue,pe(r.currencyCode))}),fromForm:r=>{let e=O(r.currencyCode).trim().toUpperCase();if(!pn(e))return"Enter a three-letter currency code, like GBP or JPY.";let t=pe(e),n=ct(O(r.amount),t);return n===void 0?t===0?`${e} has no minor units. Enter a whole amount.`:`Enter an amount with at most ${t} decimal places, like ${Ce(1250,t)}.`:{currencyCode:e,unitValue:n}},describe:r=>{let e=O(r.currencyCode).trim().toUpperCase();if(!pn(e))return"";let t=ct(O(r.amount),pe(e));return t===void 0?"":`Stored as ${t} in the smallest unit of ${e}.`}},validate:()=>[]},V=[{size:"DEFAULT",field:"src",label:"Default file"},{size:"MEDIUM",field:"mediumSrc",label:"Medium file (from 768px wide)"},{size:"LARGE",field:"largeSrc",label:"Large file (from 1024px wide)"}],Ln={type:"image",label:"Image",attribute:"image",entityArray:"images",endpoint:w.IMAGE,historyEndpoint:w.IMAGE_HISTORY,surface:"popover",valueKeys:["altText","src","mediumSrc","largeSrc"],carried:["src","mediumSrc","largeSrc"],component:()=>dn,fromPlaceholder:r=>({altText:r.querySelector("img")?.alt??""}),find:(r,e,t)=>r.image(e,t),defaults:()=>({altText:""}),form:{fields:[{key:"altText",label:"Alt text",kind:"text"},...V.map(r=>({key:r.size,label:r.label,kind:"file"}))],toForm:r=>({altText:r.altText??"",...Object.fromEntries(V.flatMap(e=>[[e.size,""],[`${e.size}:current`,String(r[e.field]??"")]]))}),fromForm:r=>({altText:O(r.altText)}),describe:r=>{let e=V.filter(i=>O(r[i.size])!=="");if(e.length===0)return"Saving keeps the current files.";let t=V.filter(i=>!e.includes(i)&&O(r[`${i.size}:current`])!==""),n=`Saving creates a new version, then uploads ${e.map(i=>i.label.toLowerCase().split(" (")[0]).join(", ")}.`;return e.some(i=>i.size==="DEFAULT")&&t.length>0?`${n} The ${t.map(i=>i.size.toLowerCase()).join(" and ")} file still shows the previous picture; choose new ones too if it changed.`:n}},validate:({altText:r})=>r?[]:[{level:"warning",message:"Images need alt text unless they are decorative."}]},Tn={type:"link",label:"Link",attribute:"link",entityArray:"links",endpoint:w.LINK,historyEndpoint:w.LINK_HISTORY,surface:"popover",valueKeys:["href","text","rel","lang"],component:r=>r.hasAttribute("data-link-wraps")?an:Pe,fromPlaceholder:r=>{let e=r.getAttribute("href"),t=r.hasAttribute("data-link-wraps")?"":(r.textContent??"").trim();return{href:e&&e!=="#"?e:"",...t?{text:t}:{}}},find:(r,e,t)=>r.link(e,t),defaults:()=>({href:"",text:""}),form:{fields:[{key:"text",label:"Text",kind:"text"},{key:"href",label:"Address",kind:"url"},{key:"rel",label:"Relationship (rel), e.g. nofollow",kind:"text"},{key:"lang",label:"Language of the target, e.g. en",kind:"text"}],toForm:r=>({text:r.text??"",href:r.href,rel:r.rel??"",lang:r.lang??""}),fromForm:r=>{let e=O(r.href).trim();if(!e)return"Enter the address the link goes to.";if(e.length>2048)return"The address can be at most 2048 characters.";let t={href:e};for(let n of["text","rel","lang"]){let i=O(r[n]).trim();i&&(t[n]=i)}return t}},validate:({href:r})=>/^\s*javascript:/i.test(r)?[{level:"error",message:"Links cannot run scripts."}]:[]},Sn={type:"reference",label:"Reference",attribute:"reference",entityArray:"references",endpoint:w.REFERENCE,historyEndpoint:w.REFERENCE_HISTORY,surface:"popover",valueKeys:["entityReference"],find:(r,e,t)=>r.reference(e,t),defaults:()=>({entityReference:{urn:""}}),form:{fields:[{key:"urn",label:"Entity referred to",kind:"entity"}],toForm:r=>({urn:r.entityReference?.urn??""}),fromForm:r=>{let e=O(r.urn).trim();return/^[0-9a-f-]{36}$/i.test(e)?{entityReference:{urn:e}}:"Choose the entity this refers to."}},validate:()=>[]};var An=[250,500,1e3,2e3,4e3],$i=3e4,Ie=class{ctx;view;saving;editing;constructor(e,t,n,i){this.ctx=e,this.view=t,this.saving=n,this.editing=i}async save(e,t){let n=mt(t).find(g=>g.level==="error");if(n)return this.ctx.popover.setError(n.message);let i=await Bi(t,window.baackEditorConfig?.imageWidths),{pending:s,popover:o,store:a,feedback:d}=this.ctx,l=e.entry,u=l.form.fromForm(o.values());if(typeof u=="string")return o.setError(u);let h=e.urn?a.get(e.urn)?.item:void 0,f=ge(l,h,u);for(let g of i.keys())delete f[V.find(y=>y.size===g).field];e.urn?s.set({kind:"edit",type:l.type,urn:e.urn,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:f}):s.set({kind:"create",type:l.type,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:f});let p=e.urn?s.getEdit(e.urn):s.getCreate(H({...e,type:l.type}));o.setSending(!0),o.setError("");let v;try{v=await this.saving().commit(p)}catch(g){o.setSending(!1);let y=await d.describe(g,"save this image");o.setError(y.message,y.debug);return}o.setSending(!1);let m=new Map([...i].map(([g,y])=>[g,URL.createObjectURL(y)]));this.preview(e.entityUrn,v,m),await this.upload(e,v,i,m)}async upload(e,t,n,i){let{transport:s,feedback:o,toolbar:a}=this.ctx;this.editing().close();let d=c("div","simple-form");d.setAttribute("aria-label","Image upload");let l=new Map;d.append(c("div","title",`Uploading to a new version of ${e.name}`));for(let[b,k]of n){let A=c("p","hint",`${On(b)}: ${k.name}: uploading\u2026`);l.set(b,A),d.append(A)}let u=this.ctx.panels.show(d,{entityUrn:e.entityUrn,focus:!1}),h=(b,k,A=!1)=>{let K=l.get(b);K.textContent=`${On(b)}: ${n.get(b).name}: ${k}`,K.className=A?"error":"hint"},f=await Promise.allSettled([...n].map(([b,k])=>s.uploadImageFile(t.urn,b,k))),p=f.flatMap(b=>b.status==="fulfilled"?[b.value]:[]),v=new Map;for(let[b,k]of f.entries()){let[A,K]=[...n][b];k.status==="rejected"?(v.set(A,K),h(A,(await o.describe(k.reason,"upload this file")).message,!0)):h(A,"uploaded; waiting for the CDN\u2026")}let m=[...n.keys()].filter(b=>!v.has(b)),g=b=>V.find(k=>k.size===b).field,x=m.every(b=>p.some(k=>k[g(b)]))||await this.waitForAddresses(e.entry,t.urn,m);for(let b of m)h(b,x?"done":"still processing; it appears when the CDN has placed it.");if(await this.view.refresh(e.entityUrn),v.size>0){this.preview(e.entityUrn,t,new Map([...i].filter(([A])=>v.has(A))));let b=c("button","primary","Retry failed uploads");b.type="button",b.addEventListener("click",()=>{this.retry(e,t,v,i)});let k=c("div","actions");k.append(b),d.append(c("p","message","Some files were not uploaded. The new version keeps the others."),k);return}for(let b of i.values())URL.revokeObjectURL(b);u.close(),a.showMessage(`Uploaded ${n.size} ${n.size===1?"file":"files"} to a new version of ${e.name}.`,!0)}async retry(e,t,n,i){let s=await this.ctx.transport.read(e.entry,t.urn),o=new Map([...n].filter(([a])=>!s[V.find(d=>d.size===a).field]));await this.upload(e,t,o,i)}async waitForAddresses(e,t,n){if(n.length===0)return!0;let i=Date.now();for(let s=0;Date.now()-i<$i;s+=1){let o=await this.ctx.transport.read(e,t);if(n.every(a=>o[V.find(d=>d.size===a).field]))return this.ctx.store.remember(this.ctx.store.get(t)?.entityUrn??"",e,o),!0;await new Promise(a=>setTimeout(a,An[Math.min(s,An.length-1)]))}return!1}preview(e,t,n){let i={...this.ctx.store.get(t.urn)?.item??t};for(let[o,a]of n)i[V.find(d=>d.size===o).field]=a;let s=this.ctx.entry("image");for(let o of this.ctx.discovery.all())o.entry!==s||this.ctx.store.entityFor(o.scope)!==e||o.element.getAttribute(B(s))!==t.urn&&!(o.name===t.name&&o.sortOrder===t.sortOrder)||(this.ctx.live.render(o,i),D(o.element,"changed"))}};function On(r){return V.find(e=>e.size===r).label.split(" (")[0]}async function Bi(r,e){let t=r.get("DEFAULT");if(!e||!t||r.size>1)return r;let n=new Map(r);for(let i of["MEDIUM","LARGE"]){let s=e[i];s&&n.set(i,await Hi(t,s,i))}return n}async function Hi(r,e,t){try{let n=await createImageBitmap(r);if(n.width<=e)return r;let i=Math.round(n.height*e/n.width),s=document.createElement("canvas");s.width=e,s.height=i,s.getContext("2d").drawImage(n,0,0,e,i);let o=r.type==="image/png"||r.type==="image/webp"?r.type:"image/jpeg",a=await new Promise((l,u)=>s.toBlob(h=>h?l(h):u(new Error("Could not scale the image")),o,.9)),d=r.name.replace(/(\.[^.]+)?$/,`-${t.toLowerCase()}$1`);return new File([a],d,{type:o})}catch{return r}}var Ri=["image/apng","image/avif","image/gif","image/jpeg","image/png","image/svg+xml","image/webp"],pt=1024*1024;function mt(r){let e=window.baackEditorConfig?.maxImageBytes??10*pt,t=window.baackEditorConfig?.warnImageBytes??2*pt,n=s=>`${(s/pt).toFixed(1)} MB`,i=[];for(let s of r.values())Ri.includes(s.type)?s.size>e?i.push({level:"error",message:`${s.name} is ${n(s.size)}; the limit is ${n(e)}. Use a smaller file.`}):s.size>t&&i.push({level:"warning",message:`${s.name} is ${n(s.size)}, large for the web. Compressing it will make the page faster.`}):i.push({level:"error",message:`${s.name} is not an image type Baack accepts: JPEG, PNG, APNG, GIF, WebP, AVIF or SVG.`});return i}var Mn="data-content-live",Cn="baack:item-shown",Pn="baack:live-request";function G(r){return r.closest(`[${Mn}]`)!==null}var Be=class{store;shown=new Map;previews=new Set;constructor(e){this.store=e,document.addEventListener(Pn,this.onRequest)}render(e,t){if(!G(e.element)){Rt(e.entry,e.element,e,t);return}let n={...this.slot(e),item:t};this.previews.has(Z(n))||(this.shown.set(Z(n),n),$e(n),t.urn&&e.element.setAttribute(B(e.entry),t.urn))}restore(e){if(!G(e.element))return!1;let t={...this.slot(e),restore:!0};return this.previews.has(Z(t))||(this.shown.delete(Z(t)),$e(t)),!0}showAt(e,t,n){let i=n?{...this.slot(e),sortOrder:t,item:n}:{...this.slot(e),sortOrder:t,restore:!0};n?(this.shown.set(Z(i),i),this.previews.add(Z(i))):(this.shown.delete(Z(i)),this.previews.delete(Z(i))),$e(i)}endPreviews(){this.previews.clear()}slot(e){return{entityUrn:this.store.entityFor(e.scope)??e.scope,type:e.entry.type,name:e.name,sortOrder:e.sortOrder}}onRequest=e=>{for(let t of this.shown.values())t.entityUrn===e.detail.entityUrn&&$e(t)}};function Z(r){return`${r.entityUrn}\0${r.type}\0${r.name}\0${r.sortOrder}`}function $e(r){document.dispatchEvent(new CustomEvent(Cn,{detail:r}))}var Ni=/Mac|iPhone|iPad/.test(navigator.userAgent),He=class{element;sendsOnEnter;host;callbacks;savedEditable;savedWhiteSpace;savedChildren;constructor(e,t,n,i){this.element=e,this.host=n,this.callbacks=i,this.sendsOnEnter=getComputedStyle(e).display.startsWith("inline")&&e.getAttribute("data-text-layout")!=="paragraphs",this.savedEditable=e.getAttribute("contenteditable"),this.savedWhiteSpace=e.style.whiteSpace,this.savedChildren=G(e)?[...e.childNodes]:void 0,e.textContent=t,Oe(e),e.setAttribute("contenteditable","plaintext-only"),e.style.whiteSpace="pre-wrap",e.addEventListener("input",this.onInput),e.addEventListener("keydown",this.onKeyDown),e.addEventListener("blur",this.onBlur),e.focus(),Di(e)}get hint(){let e=Ni?"\u2318":"Ctrl";return this.sendsOnEnter?"Enter to save \xB7 Esc to revert":`${e}+Enter to save \xB7 Esc to revert`}close(){this.element.removeEventListener("input",this.onInput),this.element.removeEventListener("keydown",this.onKeyDown),this.element.removeEventListener("blur",this.onBlur),this.savedEditable===null?this.element.removeAttribute("contenteditable"):this.element.setAttribute("contenteditable",this.savedEditable),this.element.style.whiteSpace=this.savedWhiteSpace,this.element.getAttribute("style")||this.element.removeAttribute("style"),this.savedChildren&&this.element.replaceChildren(...this.savedChildren)}onInput=()=>{Oe(this.element),this.callbacks.input()};onKeyDown=e=>{e.key==="Escape"?(e.preventDefault(),this.callbacks.revert()):e.key==="Enter"&&(e.metaKey||e.ctrlKey||this.sendsOnEnter&&!e.shiftKey)&&(e.preventDefault(),this.callbacks.send())};onBlur=e=>{e.relatedTarget!==this.host.element&&this.callbacks.blurred()}};function Di(r){let e=window.getSelection();if(!e||e.rangeCount>0&&r.contains(e.getRangeAt(0).commonAncestorContainer))return;let t=document.createRange();t.selectNodeContents(r),t.collapse(!1),e.removeAllRanges(),e.addRange(t)}var Re=class{ctx;view;save;active;constructor(e,t,n){this.ctx=e,this.view=t,this.save=n}get current(){return this.active}attach(){document.addEventListener("dblclick",this.onDoubleClick,!0),document.addEventListener("click",this.onClick,!0)}detach(){document.removeEventListener("dblclick",this.onDoubleClick,!0),document.removeEventListener("click",this.onClick,!0)}onDoubleClick=e=>{let{discovery:t,toolbar:n}=this.ctx,i=t.closest(e.target);if(!i||this.active?.target.binding?.element===i)return;let s=t.of(i)[0];if(!s)return;e.preventDefault();let o=this.targetFor(s);if(!o){n.showMessage(`The content for "${s.name}" has not loaded.`);return}this.open(o)};onClick=e=>{this.ctx.discovery.closest(e.target)&&e.preventDefault()};onPointerDown=e=>{let t=e.composedPath(),n=this.active?.target.binding?.element??this.active?.target.anchor;!this.active||t.includes(this.ctx.host.element)||n&&t.includes(n)||this.close()};targetFor(e){let{store:t}=this.ctx,n=t.entityFor(e.scope);if(!n)return;let i=e.element.getAttribute(B(e.entry))??void 0;return{entityUrn:n,entry:e.entry,name:e.name,sortOrder:e.sortOrder,urn:i&&t.get(i)?i:void 0,anchor:e.element,binding:e}}open(e){this.view.stopPreview(e);let t=e.binding&&e.binding.element.getClientRects().length>0,n=e.binding?e.entry.component?.(e.binding.element).ownsChildren!==!1:!1;if(e.urn&&e.entry.surface==="inline"&&e.binding&&t&&n)this.openInline(e);else{let i=!e.urn&&e.binding?e.entry.fromPlaceholder?.(e.binding.element):void 0;this.openForm(t?e:{...e,binding:void 0,anchor:e.anchor},i)}}async openInline(e){this.close();let{store:t,pending:n,host:i,popover:s}=this.ctx,{entry:o}=e,a=e.binding.element,d=t.get(e.urn),l=o.renderedByView?await this.baseValue(e):M(o,d.item);if(!l||this.active||!this.view.isEditing||!a.isConnected)return;let u=n.getEdit(e.urn)?.value??l,h=new He(a,String(u.value??""),i,{input:()=>this.setPending(e,o.read(a)),send:()=>{this.save(e)},revert:()=>this.revert(e),blurred:()=>this.close()});this.active={target:e,session:h},D(a,"editing"),s.show(a,o.label,`${e.name} #${e.sortOrder}`,h.hint,{send:()=>{this.save(e)},revert:()=>this.revert(e)}),s.setIssues(o.validate(o.read(a))),this.offerHistory(e)}offerHistory(e){let{hooks:t}=this.ctx;this.ctx.popover.setNameAction(()=>t.showItem(e));let n=e.urn;if(!n||e.fromVersion){this.ctx.popover.setExtras([]);return}let i=e.binding,s=[{label:"History",icon:"history",run:()=>{this.close(),t.openHistory({entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder,urn:n})}}];i&&t.canReorder(i)&&s.push({label:"Move up",icon:"arrow-up",menu:!0,run:()=>t.moveBy(i,-1)},{label:"Move down",icon:"arrow-down",menu:!0,run:()=>t.moveBy(i,1)},{label:"Reorder\u2026",icon:"list-ordered",menu:!0,run:()=>t.reorder(i)}),s.push({label:"Move or rename\u2026",icon:"pencil-line",menu:!0,run:()=>t.relocate(e)}),this.ctx.popover.setExtras(s)}async openForm(e,t){this.close();let{store:n,pending:i,popover:s,toolbar:o}=this.ctx,{entry:a}=e,d=a.form;if(!d)return;let l;if(e.urn){let h=await this.baseValue(e);if(!h)return;l=(e.fromVersion?void 0:i.getEdit(e.urn)?.value)??h}else{if(n.itemAt(e.entityUrn,a,e.name,e.sortOrder)){o.showMessage(`An item already exists at ${e.name} #${e.sortOrder}.`);return}l=i.getCreate(H({...e,type:a.type}))?.value??t??(e.binding?a.fromPlaceholder?.(e.binding.element):void 0)??a.defaults()}this.active={target:e,session:void 0},e.binding&&D(e.binding.element,"editing");let u=d.toForm(l);s.showForm(e.anchor,e.fromVersion?`${a.label}, from an older version`:e.urn?a.label:`New ${a.label.toLowerCase()}`,`${e.name} #${e.sortOrder}`,d.fields,u,{input:h=>this.onFormInput(e,h),send:()=>{this.save(e)},revert:()=>this.revert(e)},a.surface==="panel"),s.setDescription(this.describeForm(e,u)),s.setIssues(a.validate(l)),this.offerHistory(e),e.fromVersion&&this.setPending(e,l),document.addEventListener("pointerdown",this.onPointerDown,!0)}describeForm(e,t){let n=[e.entry.form?.describe?.(t)??""];return!e.urn&&S(this.ctx.store.view(e.entityUrn)?.status)&&n.push("This content is published, so a new item is live as soon as it is saved."),n.filter(Boolean).join(" ")}async baseValue(e){let{store:t,sources:n,transport:i,feedback:s}=this.ctx,o=e.urn,a=t.get(o)??t.itemAt(e.entityUrn,e.entry,e.name,e.sortOrder);if(!(!a||a.item.urn!==o)){if(!e.entry.renderedByView)return M(e.entry,a.item);try{let d=n.get(o)??M(e.entry,await i.read(e.entry,o));return n.set(o,d),d}catch(d){s.report(d,"load the source",()=>{this.openForm(e)});return}}}close(){let e=this.active;if(!e)return;this.active=void 0,document.removeEventListener("pointerdown",this.onPointerDown,!0),e.session?.close(),this.ctx.popover.hide();let t=e.target.binding;this.view.isEditing&&t?.element.isConnected&&this.view.show(t)}onFormInput(e,t){let{popover:n}=this.ctx,i=e.entry.form;if(!i)return;n.setDescription(this.describeForm(e,t));let s=i.fromForm(t);if(typeof s=="string"){n.setError(s),n.setIssues([]);return}n.setError("");let o=e.entry.type==="image"?mt(n.files()):[];n.setIssues([...e.entry.validate(s),...o]),this.setPending(e,s)}setPending(e,t){let{store:n,sources:i,pending:s,popover:o}=this.ctx,{entry:a}=e,d=t;if(e.urn){let l=n.get(e.urn)??n.itemAt(e.entityUrn,a,e.name,e.sortOrder);d=ge(a,l?.item,t);let u=e.fromVersion?n.itemAt(e.entityUrn,a,e.name,e.sortOrder):l,h=a.renderedByView?i.get(u?.item.urn??e.urn):u?.item;h&&be(a,d,h)?s.clear(e.urn):s.set({kind:"edit",type:a.type,urn:e.urn,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:d,...e.fromVersion?{fromVersion:!0}:{}})}else s.set({kind:"create",type:a.type,entityUrn:e.entityUrn,name:e.name,sortOrder:e.sortOrder,value:d});this.view.reshow(e),e.entry.surface==="inline"&&this.active?.session&&o.setIssues(a.validate(d))}revert(e){this.ctx.pending.clear(e.urn??H({...e,type:e.entry.type})),this.close(),this.view.reshow(e)}};function se(r,e,t){if(N(r)){let n=Ui(r);return n===void 0?In(r,e,t):{...In(r,e,t),debug:n}}return Fi(r,e)}function In(r,e,t){if(r.isUnauthorized||r.isNotFound&&t===!1)return{kind:"unauthorized",message:`Your session has ended. Log in again to ${e}. Your changes are kept.`};if(r.isForbidden)return{kind:"forbidden",message:`You don't have permission to ${e}.`};if(r.isNotFound)return{kind:"not-found",message:`This item no longer exists, or you don't have permission to ${e}.`};if(r.isConflict)return{kind:"conflict",message:"Someone else changed this since you opened it. Reload to see their version."};let{detail:n}=r;return{kind:"failed",message:`Couldn't ${e} (HTTP ${r.status})${n?`: ${n.replace(/\.$/,"")}`:""}. Try again.`}}function Fi(r,e){if(r instanceof ee)return{kind:"not-live",message:"This content is not published yet, so it has no live version to show. Show the latest drafts to edit it."};if(r instanceof ce){let{language:t}=r.received;return{kind:"mismatch",message:`Couldn't ${e}: Baack returned a different language version (${t}) instead of the content on this page, so it can't be edited here. Reload the page and try again.`}}return r instanceof TypeError?{kind:"network",message:`Couldn't reach Baack to ${e}. Check your connection and try again.`}:{kind:"failed",message:`Couldn't ${e}: ${r instanceof Error?r.message:String(r)}`}}function Ui(r){let e=r.json();if(e===void 0)return;let t=s=>{try{return JSON.stringify(JSON.parse(s),null,2)}catch{return s}},n=(()=>{try{return new URL(r.url).pathname}catch{return r.url}})();return`${`Request: ${r.method} ${n}${r.requestBody?`
|
|
3
7
|
${t(r.requestBody)}`:""}`}
|
|
4
8
|
|
|
5
9
|
Response: ${r.status}
|
|
6
|
-
${JSON.stringify(e,null,2)}`}var
|
|
10
|
+
${JSON.stringify(e,null,2)}`}var Vi=2e3,Ne=class{transport;toolbar;retry;stopWatching;constructor(e,t){this.transport=e,this.toolbar=t}retryAfterLogin(){this.stopWatching?.(),this.retry?.()}async report(e,t,n){let i=await this.describe(e,t);this.toolbar().showMessage(i.message,!1,i.debug),i.kind==="unauthorized"&&this.promptLogin(i.message,n)}async describe(e,t){let n;if(N(e)&&e.isNotFound)try{n=(await this.transport.clientContext()).hasSession===!0}catch(i){console.warn("Baack editor: could not read the client context to explain a 404",i)}return se(e,t,n)}async promptLogin(e,t){this.retry=t;let n;try{n=(await this.transport.clientContext()).loginIframeSrc}catch(d){console.warn("Baack editor: could not read the client context for the login prompt",d)}this.toolbar().showLogin(e,n),this.stopWatching?.();let i=!1,s=()=>{i||(i=!0,this.transport.clientContext().then(d=>{if(!this.toolbar().loginShown)return this.stopWatching?.();d.hasSession===!0&&(this.toolbar().hideLogin(),this.retryAfterLogin())}).catch(()=>{}).finally(()=>i=!1))},o=setInterval(s,Vi),a=$t(s);this.stopWatching=()=>{clearInterval(o),a(),this.stopWatching=void 0}}};function Bn(r,e){return r===e?0:r===0?e>0?100:-100:(e-r)/Math.abs(r)*100}function Hn(r){let e=new Intl.NumberFormat("en-GB",{maximumFractionDigits:1}).format(Math.abs(r));return`${r>0?"+":r<0?"\u2212":""}${e}%`}var $n=2e3;function De(r,e){if(r===e)return[{kind:"same",text:e}];let t=r.split(/(\s+)/).filter(Boolean),n=e.split(/(\s+)/).filter(Boolean);if(t.length*n.length>$n*$n)return[{kind:"removed",text:r},{kind:"added",text:e}];let i=Array.from({length:t.length+1},()=>new Array(n.length+1).fill(0));for(let l=t.length-1;l>=0;l-=1)for(let u=n.length-1;u>=0;u-=1)i[l][u]=t[l]===n[u]?i[l+1][u+1]+1:Math.max(i[l+1][u],i[l][u+1]);let s=[],o=(l,u)=>{let h=s.at(-1);h?.kind===l?h.text+=u:s.push({kind:l,text:u})},a=0,d=0;for(;a<t.length&&d<n.length;)t[a]===n[d]?(o("same",t[a]),a+=1,d+=1):i[a+1][d]>=i[a][d+1]?(o("removed",t[a]),a+=1):(o("added",n[d]),d+=1);for(;a<t.length;)o("removed",t[a++]);for(;d<n.length;)o("added",n[d++]);return s}function oe(r){document.dispatchEvent(new CustomEvent("baack:item-updated",{detail:r}))}function ft(r){document.dispatchEvent(new CustomEvent("baack:item-published",{detail:r}))}function Rn(r){document.dispatchEvent(new CustomEvent("baack:entity-state",{detail:r}))}function Nn(r){document.dispatchEvent(new CustomEvent("baack:entity-published",{detail:{entityUrn:r}}))}var _=class{element;inputs=new Map;submit;error;submitLabel;onCancel;constructor(e,t,n,i,s){this.submitLabel=n,this.onCancel=s,this.element=c("form","simple-form"),this.element.append(c("div","title",e));for(let d of t){let l=c("label","field"),u;if(d.options){u=c("select");for(let h of d.options)u.append(Object.assign(c("option","",h.label),{value:h.value}))}else u=c("input"),u.type="text";u.name=d.key,u.value=d.value,d.required&&u.setAttribute("aria-required","true"),l.append(c("span","caption",d.label),u instanceof HTMLSelectElement?ye(u):u),this.inputs.set(d.key,u),this.element.append(l)}this.error=c("p","error"),this.error.setAttribute("role","alert"),this.submit=c("button","primary",n),this.submit.type="submit";let o=c("button","","Cancel");o.type="button",o.addEventListener("click",()=>this.cancel());let a=c("div","actions");a.append(o,this.submit),this.element.append(this.error,a),this.element.addEventListener("submit",d=>{d.preventDefault(),this.submit.disabled||i(this.values())})}cancel(){this.element.dispatchEvent(new Event("cancel")),this.element.remove(),this.onCancel?.()}values(){return Object.fromEntries([...this.inputs].map(([e,t])=>[e,t.value.trim()]))}setBusy(e,t="Working\u2026"){this.submit.disabled=e,this.submit.textContent=e?t:this.submitLabel}setError(e){this.error.textContent=e}};var ae=class extends Error{change;newest;constructor(e,t){super("a newer draft of this item has been saved"),this.change=e,this.newest=t}};function F(r,e){return r.form?Object.values(r.form.toForm(e)).map(t=>typeof t=="boolean"?t?"on":"off":t).filter(t=>t!=="").join(" \xB7 "):JSON.stringify(e)}function Ue(r,e,t){let n=[{kind:"same",text:F(r,e)},{kind:"arrow",text:"\u2192"},{kind:"same",text:F(r,t)}],i=_i(e,t);return i?[...n,{kind:"same",text:" "},i]:n}function _i(r,e){let t=r,n=e;if(typeof t.unitValue!="number"||typeof n.unitValue!="number"||t.currencyCode!==n.currencyCode)return;let i=Bn(t.unitValue,n.unitValue);if(i!==0)return{kind:i>0?"increase":"decrease",text:Hn(i)}}var Fe=class{ctx;view;editing;inFlight=new Set;constructor(e,t,n){this.ctx=e,this.view=t,this.editing=n}async save(e){let{pending:t,popover:n,feedback:i}=this.ctx,s=this.editing(),o=e.urn??H({...e,type:e.entry.type});if(this.inFlight.has(o))return;let a=()=>s.current?.target===e;if(a()&&e.entry.type==="image"){let l=n.files();if(l.size>0){this.inFlight.add(o);try{await this.ctx.hooks.saveImage(e,l)}finally{this.inFlight.delete(o)}return}}if(a()&&!s.current.session&&e.entry.form){let l=e.entry.form.fromForm(n.values());if(typeof l=="string"){n.setError(l);return}(!e.urn||!t.getEdit(e.urn))&&s.setPending(e,l)}let d=e.urn?t.getEdit(e.urn):t.getCreate(o);if(!d){a()&&s.close();return}if(!e.entry.validate(d.value).some(l=>l.level==="error")){this.inFlight.add(o),n.setSending(!0),n.setError("");try{await this.commit(d),a()&&s.close(),await this.view.refresh(e.entityUrn)}catch(l){if(l instanceof ae){this.showConflict(l,a()?e.anchor:this.ctx.toolbar.modeButton);return}if(l instanceof me){a()&&s.close(),this.ctx.toolbar.showMessage(l.message),await this.view.refresh(e.entityUrn);return}let u=()=>{this.save(e)};if(a()){let h=await i.describe(l,e.urn?"save this change":"create this item");n.setError(h.message,h.debug),h.kind==="unauthorized"&&i.promptLogin(h.message,u)}else i.report(l,"save this change",u)}finally{this.inFlight.delete(o),n.setSending(!1)}}}async commit(e){let{store:t,transport:n,pending:i}=this.ctx,s=this.ctx.entry(e.type);if(e.kind==="edit"){if(!e.fromVersion){let u=(await n.history(s,e.urn)).history[0];if(u?.urn&&u.urn!==e.urn)throw new ae(e,u)}let d=t.get(e.urn)??t.itemAt(e.entityUrn,s,e.name,e.sortOrder);if(!d||d.item.urn!==e.urn)throw new Error("the item has changed since this edit was made");let l=await n.update(s,e.urn,J(s,d.item,e.value,e.entityUrn));if(!l?.urn)throw new Error("the API returned no URN for the new version");return this.applySaved(s,e.urn,l),oe({entityUrn:e.entityUrn,oldUrn:e.urn,newUrn:l.urn,type:s.type,value:l}),Dn(l,d.item),l}if(t.itemAt(e.entityUrn,s,e.name,e.sortOrder))throw i.clear(z(e)),new Error(`an item already exists at ${e.name} #${e.sortOrder}`);let o={name:e.name,sortOrder:e.sortOrder},a=await n.create(s,J(s,o,e.value,e.entityUrn));if(!a?.urn)throw new Error("the API returned no URN for the new item");return i.clear(z(e)),oe({entityUrn:e.entityUrn,newUrn:a.urn,type:s.type,value:a}),Dn(a,o),a}applySaved(e,t,n){let{discovery:i,store:s,pending:o,sources:a,toolbar:d}=this.ctx,l=this.editing(),u=i.all().filter(f=>f.entry===e&&f.element.getAttribute(B(e))===t);s.replace(t,n),o.clear(t),a.delete(t);let h=l.current?.target.binding;h&&u.includes(h)&&l.close();for(let f of u)e.renderedByView?f.element.setAttribute(B(e),n.urn):this.ctx.live.render(f,n),D(f.element,"editable");d.showMessage("")}async saveAll(e){let{pending:t,feedback:n,toolbar:i}=this.ctx,s=t.all().filter(h=>(e===void 0||h.entityUrn===e)&&!(h.kind==="edit"&&h.stale));for(let h of new Set(s.flatMap(f=>f.kind==="move"?[f.planId]:[])))await this.ctx.hooks.runPlan(h);await Promise.all([...new Set(s.map(h=>h.entityUrn))].map(h=>this.view.loadScope(h)));let o=[],a=[],d=new Set,l=0;for(let h of s)if(h.kind!=="move")try{await this.commit(h),l+=1,d.add(h.entityUrn)}catch(f){if(f instanceof me){l+=1,d.add(h.entityUrn),o.push(`${h.name} #${h.sortOrder}: ${f.message}`);continue}if(f instanceof ae){this.ctx.pending.set({...f.change,stale:!0}),o.push(`${h.name} #${h.sortOrder}: a newer draft was saved; use Resolve.`);continue}let p=await n.describe(f,"save this change");if(p.kind==="unauthorized"){n.promptLogin(p.message,()=>{this.saveAll(e)});break}o.push(`${h.name} #${h.sortOrder}: ${p.message}`),p.debug&&a.push(`${h.name} #${h.sortOrder}:
|
|
7
11
|
${p.debug}`)}for(let h of d)await this.view.refresh(h);let[u]=d;i.showMessage(o.length>0?`Saved ${l}. Not saved: ${o.join(" ")}`:`Saved ${l} ${l===1?"change":"changes"}.`,o.length===0,a.join(`
|
|
8
12
|
|
|
9
|
-
`)||void 0,o.length===0&&l>0&&d.size===1&&u?
|
|
13
|
+
`)||void 0,o.length===0&&l>0&&d.size===1&&u?Se(this.ctx,u):void 0)}async resolve(e,t){let n=this.ctx.entry(e.type);try{let i=(await this.ctx.transport.history(n,e.urn)).history[0];i?.urn&&i.urn!==e.urn?this.showConflict(new ae(e,i),t):this.ctx.pending.set({...e,stale:!1})}catch(i){this.ctx.feedback.report(i,"check this item",()=>{this.resolve(e,t)})}}showConflict(e,t){let{popover:n}=this.ctx,{change:i,newest:s}=e,o=this.ctx.entry(i.type),a=s.createdTimestamp?new Date(C(s.createdTimestamp)).toLocaleString():"recently",d=()=>{n.hide(),this.editing().close()};n.showChoices(t,"A newer draft was saved",`${i.name} #${i.sortOrder}`,[{label:"Yours (not saved)",text:F(o,i.value)},{label:`The newer draft, saved ${a}`,text:F(o,s)}],"Nothing has been saved. Choose which value to keep.",[{label:"Cancel",run:d},{label:"Keep theirs",run:()=>{this.ctx.pending.clear(i.urn),d(),this.view.refresh(i.entityUrn)}},{label:"Save yours on top",primary:!0,run:()=>{this.saveOnTop(e,d)}}])}async saveOnTop(e,t){let{transport:n,pending:i,sources:s,feedback:o}=this.ctx,{change:a,newest:d}=e,l=this.ctx.entry(a.type);try{let u=await n.update(l,d.urn,J(l,d,a.value,a.entityUrn));i.clear(a.urn),s.delete(a.urn),oe({entityUrn:a.entityUrn,oldUrn:d.urn,newUrn:u.urn,type:l.type,value:u}),t(),await this.view.refresh(a.entityUrn)}catch(u){o.report(u,"save this change",()=>{this.saveOnTop(e,t)})}}discardAll(e){this.editing().close();let t=this.ctx.pending.clearAll(e);for(let n of t)this.view.reshow({entityUrn:n.entityUrn,entry:this.ctx.entry(n.type),name:n.name,sortOrder:n.sortOrder,urn:n.kind==="edit"?n.urn:void 0});this.ctx.toolbar.showMessage(`Discarded ${t.length} unsaved ${t.length===1?"change":"changes"}.`,!0)}confirmCreateAll(e,t){let{store:n}=this.ctx;if(!S(n.view(e)?.status)){this.createAll(e);return}let i=new _(`${this.ctx.entityTitle(e)} is published`,[],`Create ${t} ${t===1?"item":"items"} on the live site`,()=>{s.close(),this.createAll(e)});i.element.insertBefore(Object.assign(document.createElement("p"),{className:"hint",textContent:"New items on a published entity are live as soon as they are created. Check the placeholders first."}),i.element.querySelector(".error"));let s=this.ctx.panels.show(i.element,{entityUrn:e})}async createAll(e){let{store:t,pending:n,feedback:i,toolbar:s}=this.ctx;await this.view.refresh(e);let o=0,a=[],d=[];for(let l of this.view.missingBindings(e)){let{entry:u}=l;if(t.itemAt(e,u,l.name,l.sortOrder))continue;let h=H({entityUrn:e,type:u.type,name:l.name,sortOrder:l.sortOrder}),f=n.getCreate(h)?.value??u.fromPlaceholder?.(l.element)??u.defaults();if(u.form&&typeof u.form.fromForm(u.form.toForm(f))=="string"){a.push(`${l.name}: its placeholder is not a valid ${u.label.toLowerCase()}`);continue}try{await this.commit({kind:"create",type:u.type,entityUrn:e,name:l.name,sortOrder:l.sortOrder,value:f}),o+=1,await this.view.refresh(e)}catch(p){let v=await i.describe(p,"create this item");if(v.kind==="unauthorized"){i.promptLogin(v.message,()=>{this.createAll(e)});break}a.push(`${l.name}: ${v.message}`),v.debug&&d.push(`${l.name}:
|
|
10
14
|
${v.debug}`)}}s.showMessage(`Created ${o} ${o===1?"item":"items"}.${a.length>0?` Not created: ${a.join(" ")}`:""}`,a.length===0,d.join(`
|
|
11
15
|
|
|
12
|
-
`)||void 0)}};function Pn(r,e){if(!(r.name===e.name&&r.sortOrder===e.sortOrder))throw new he(`Saved, but the API stored it as "${r.name??""}" #${r.sortOrder??"?"} instead of ${e.name} #${e.sortOrder}. Do not save it again; this needs fixing in the API.`)}var he=class extends Error{};var Ii={added:["ins",""],removed:["del",""],increase:["span","delta up"],decrease:["span","delta down"],arrow:["span","arrow"]};function pe(r){let e=c("div","change");if(typeof r=="string")return e.textContent=r,e;for(let t of r){if(t.kind==="same"){e.append(t.text);continue}let[n,i]=Ii[t.kind],s=c(n,i,t.text);t.kind==="arrow"&&s.setAttribute("aria-label","to"),(t.kind==="increase"||t.kind==="decrease")&&(s.title=`${t.text.replace(/^[+−]/,"")} ${t.kind}`),e.append(s)}return e}var Fe=class{element;status;list;more;compare;constructor(e,t){this.element=c("div","level-item");let n=c("label","field");this.compare=c("select"),this.compare.append(Object.assign(c("option","","Compare with the live version"),{value:"live"}),Object.assign(c("option","","Compare with the previous version"),{value:"previous"})),this.compare.addEventListener("change",()=>t(this.compare.value)),n.append(c("span","caption","Show changes"),fe(this.compare)),this.status=c("p","hint"),this.status.setAttribute("role","status"),this.list=c("ol","rows history-rows"),this.list.setAttribute("aria-label","Versions, newest first"),this.more=c("button","","Load older versions"),this.more.type="button",this.more.hidden=!0,this.more.addEventListener("click",e),this.element.append(n,this.status,this.list,this.more)}setStatus(e){this.status.textContent=e}render(e,t){let n=new Set([...this.list.querySelectorAll('li.history-row:has(> button[aria-expanded="true"])')].map(i=>i.dataset.when));this.list.replaceChildren(...e.map(i=>this.row(i,n))),this.more.hidden=!t}row(e,t){let n=c("li","row history-row");n.dataset.when=e.whenUtc;let i=c("button","row-main");i.type="button",i.dataset.row="";let s=c("span","row-name",e.when);s.title=`${e.whenUtc} UTC`,i.append(s),e.live&&i.append(c("span","status status-up-to-date","live"));for(let d of e.notes)i.append(c("span","status note",d));let o=c("span","stack-chevron");o.append(L("chevron-right")),o.setAttribute("aria-hidden","true"),i.append(o),i.addEventListener("click",()=>e.open());let a=c("div","actions");if(a.append($n(e.preview)),n.append(i,pe(e.change),a),e.collapsed.length>0){let d=T(`${e.collapsed.length} earlier ${e.collapsed.length===1?"draft":"drafts"}`,"ghost","xs"),l=t.has(e.whenUtc);d.setAttribute("aria-expanded",String(l));let u=c("ol","rows");u.hidden=!l,u.append(...e.collapsed.map(h=>this.row(h,t))),d.addEventListener("click",()=>{u.hidden=!u.hidden,d.setAttribute("aria-expanded",String(!u.hidden))}),n.append(d,u)}return n}};function ft(r,e){if(!e){r.replaceChildren(c("p","message","This version is no longer in the history. Go back to see the versions there are."));return}let t=c("p","version-head");t.title=`Saved ${e.whenUtc} UTC`;for(let s of e.marks)t.append(c("span",`status ${s==="live"?"status-up-to-date":"note"}`,s));for(let s of e.notes)t.append(c("span","status note",s));let n=e.changes.map(({label:s,change:o})=>{let a=c("div","field version-change");return a.append(c("span","caption",s),pe(o)),a}),i=c("div","actions");i.append(...e.actions.map($n)),r.replaceChildren(...t.childElementCount>0?[t]:[],...n,i)}function $n(r){let e=T(r.label,W(r),"sm");return r.pressed!==void 0&&e.setAttribute("aria-pressed",String(r.pressed)),r.disabled&&(e.disabled=!0,e.title=r.disabled),e.addEventListener("click",()=>r.run(e)),e}var Pi=400,$i=0,me,vt=0;function I(r,e){if(r.removeAttribute("title"),e!==void 0){let n=c("span","visually-hidden",e);n.id=`baack-tooltip-${++$i}`;let i=()=>r.parentElement&&!n.isConnected&&r.after(n);i(),queueMicrotask(i),r.setAttribute("aria-describedby",n.id)}let t=()=>e??r.getAttribute("aria-label")??"";r.addEventListener("pointerenter",n=>{n.pointerType!=="touch"&&(clearTimeout(vt),vt=window.setTimeout(()=>Hn(r,t()),me?0:Pi))}),r.addEventListener("focus",()=>{r.matches(":focus-visible")&&Hn(r,t())});for(let n of["pointerleave","blur","pointerdown"])r.addEventListener(n,yt);r.addEventListener("keydown",n=>{n.key==="Escape"&&me?.trigger===r&&yt()})}function Hn(r,e){if(yt(),!r.isConnected||r.getClientRects().length===0)return;let t=c("div","tooltip",e);t.setAttribute("aria-hidden","true"),r.getRootNode().append(t);let n=r.getBoundingClientRect(),{width:i,height:s}=t.getBoundingClientRect(),o=n.top-s-6;t.style.top=`${o>=8?o:n.bottom+6}px`,t.style.left=`${Math.min(Math.max(8,n.left+n.width/2-i/2),window.innerWidth-i-8)}px`,me={tip:t,trigger:r}}function yt(){clearTimeout(vt),me?.tip.remove(),me=void 0}var Rn="baack-editor:side",Hi=150,Bn=3,Bi=0,Ri="(max-width: 640px)",Ue=class{element;back;heading;crumbs;body;announcer;dock;entries=[];id=`baack-stack-${Bi+=1}`;closeListeners=[];toolbar;constructor(e){this.element=c("aside","panel side stack"),this.element.setAttribute("aria-label","Editor"),this.element.hidden=!0;let t=c("div","stack-bar");this.back=T("","ghost","sm","stack-back"),this.back.addEventListener("click",()=>this.pop()),this.dock=T("","ghost","icon-sm","side-dock"),this.dock.addEventListener("click",()=>this.setSide(this.side==="right"?"left":"right"));let n=T("","ghost","icon-sm","stack-close");n.setAttribute("aria-label","Close"),n.append(L("x")),n.addEventListener("click",()=>this.close()),t.append(this.back,c("span","stack-spacer"),this.dock,n),I(this.dock),I(n);let i=c("nav","stack-crumbs");i.setAttribute("aria-label","Where you are"),this.crumbs=c("ol"),i.append(this.crumbs),this.heading=c("h2","stack-title"),this.heading.id=`${this.id}-title`,this.heading.tabIndex=-1,this.body=c("div","stack-body"),this.announcer=c("p","visually-hidden"),this.announcer.setAttribute("aria-live","polite"),this.element.append(t,i,this.heading,this.body,this.announcer),this.element.addEventListener("keydown",this.onKeyDown),this.setSide(Ni()),e.root.append(this.element)}avoid(e){this.toolbar=e,new ResizeObserver(()=>this.fit()).observe(e),window.addEventListener("resize",()=>this.fit()),this.fit()}onClose(e){this.closeListeners.push(e)}fit(){let e=this.toolbar?.getBoundingClientRect().top,t=(this.side==="right"||matchMedia(Ri).matches)&&e!==void 0;this.element.style.bottom=t?`${Math.max(16,window.innerHeight-e+8)}px`:""}get current(){return this.entries.at(-1)?.level}get path(){return this.entries.map(e=>e.level.id)}get isOpen(){return!this.element.hidden}push(e,{focus:t=!0}={}){let n=this.entries.at(-1);n&&(n.scrollTop=this.body.scrollTop,n.origin=this.focusedIn(n.section));let i=this.enter(e);this.entries.push(i),this.show(i,n,"in",t)}pop(){if(this.entries.length<=1){this.close();return}this.popTo(this.entries.at(-2).level.id)}popTo(e){let t=this.entries.findIndex(i=>i.level.id===e);if(t<0||t===this.entries.length-1)return;let n=this.entries.at(-1);for(let i of this.entries.splice(t+1))this.leave(i,i===n);this.show(this.entries[t],n,"out")}replace(e,{focus:t=!0}={}){let n=this.entries.pop();n&&this.leave(n,!1);let i=this.enter(e);this.entries.push(i),this.show(i,void 0,"none",t)}reset(e,{focus:t=!0}={}){for(let i of this.entries.splice(0))this.leave(i,!1);for(let i of e)this.entries.push(this.enter(i));let n=this.entries.at(-1);n&&this.show(n,void 0,"none",t)}open(){this.element.hidden=!1}close(){if(!this.element.hidden){this.element.hidden=!0;for(let e of this.closeListeners)e()}}get side(){return this.element.dataset.side==="left"?"left":"right"}setSide(e){this.element.dataset.side=e,this.dock.setAttribute("aria-label",e==="right"?"Move to left":"Move to right"),this.dock.replaceChildren(L(e==="right"?"panel-left":"panel-right")),this.fit();try{localStorage.setItem(Rn,e)}catch{}}enter(e){let t=c("section","stack-level");return t.dataset.level=e.id,t.setAttribute("aria-labelledby",this.heading.id),t.hidden=!0,t.append(e.render()),this.body.append(t),{level:e,section:t,scrollTop:0,origin:void 0}}leave(e,t){e.level.dispose?.(),(!t||!this.animates())&&e.section.remove()}show(e,t,n,i=!0){this.element.hidden=!1;for(let o of this.entries)o.section.hidden=o!==e;e.section.hidden=!1,this.renderHeader(),this.body.scrollTop=n==="out"?e.scrollTop:0,t&&n!=="none"&&this.slide(e.section,t.section,n),e.level.onShow?.(),this.announcer.textContent=e.level.title;let s=n==="out"&&e.origin?.isConnected?e.origin:void 0;i&&(s??this.heading).focus({preventScroll:n==="out"})}renderHeader(){let e=this.entries.at(-1).level,t=this.entries.at(-2)?.level;this.heading.textContent=e.title,this.back.hidden=!t,this.back.replaceChildren(...t?[L("chevron-left"),c("span","stack-back-text",t.title)]:[]),this.back.setAttribute("aria-label",t?`Back to ${t.title}`:"Back");let n=this.entries.map((s,o)=>({entry:s,index:o})),i=n.length>Bn+1?[n[0],void 0,...n.slice(n.length-(Bn-1))]:n;this.crumbs.replaceChildren(...i.flatMap((s,o)=>{let a=c("li","stack-crumb-separator");a.setAttribute("role","presentation"),a.setAttribute("aria-hidden","true"),a.append(L("chevron-right"));let d=c("li"),l=h=>(d.append(h),o===0?[d]:[a,d]);if(!s)return l(c("span","meta","\u2026"));if(s.index===this.entries.length-1){let h=c("span","",s.entry.level.title);return h.setAttribute("aria-current","page"),l(h)}let u=c("button","stack-crumb",s.entry.level.title);return u.type="button",u.addEventListener("click",()=>this.popTo(s.entry.level.id)),l(u)})),this.crumbs.parentElement.hidden=this.entries.length<2}animates(){return typeof Element.prototype.animate=="function"&&!matchMedia("(prefers-reduced-motion: reduce)").matches}slide(e,t,n){if(!this.animates())return;let i=this.side==="right"?"100%":"-100%",s={duration:Hi,easing:"ease-out"};if(n==="in"){e.animate([{transform:`translateX(${i})`},{transform:"none"}],s);return}t.hidden=!1,t.inert=!0,t.setAttribute("aria-hidden","true"),t.classList.add("leaving"),t.style.top=`${this.body.scrollTop}px`,t.animate([{transform:"none"},{transform:`translateX(${i})`}],s).finished.then(()=>t.remove(),()=>t.remove())}focusedIn(e){let t=this.element.getRootNode().activeElement;return t instanceof HTMLElement&&e.contains(t)?t:void 0}onKeyDown=e=>{if(e.key==="Escape"&&!e.defaultPrevented){e.preventDefault(),e.stopPropagation(),this.pop();return}if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;let t=this.entries.at(-1)?.section,n=t&&this.focusedIn(t);if(!t||!n?.matches("[data-row]"))return;let i=[...t.querySelectorAll("[data-row]")].filter(o=>!o.closest("[hidden]")),s=i[i.indexOf(n)+(e.key==="ArrowDown"?1:-1)];s&&(e.preventDefault(),s.focus())}};function Ni(){try{return localStorage.getItem(Rn)==="left"?"left":"right"}catch{return"right"}}function Nn(r,e,t){let n=c("button","stack-row");n.type="button",n.dataset.row="";let i=c("span","stack-row-text");i.append(c("span","stack-row-label",r)),e&&i.append(c("span","meta",e));let s=c("span","stack-chevron");return s.append(L("chevron-right")),n.append(i,s),n.addEventListener("click",t),n}function Ve(r){let e=c("div","level-confirm");e.append(c("p","meta",r.meta));for(let n of r.blocks){let i=c("div","field");i.append(c("span","caption",n.label),c("pre","snippet",n.text)),e.append(i)}e.append(c("p","description",r.description));let t=c("div","actions");for(let n of r.choices){let i=T(n.label,W(n));i.addEventListener("click",()=>n.run(i)),t.append(i)}return e.append(t),{id:r.id,title:r.title,render:()=>e}}var Di=600*1e3,_e=class{stack;ctx;editing;view;hooks;state;constructor(e,t,n,i,s){this.ctx=e,this.editing=t,this.view=n,this.stack=i,this.hooks=s,n.onPreviewChange(()=>this.render())}async open(e){this.state&&!Ui(this.state,e)&&this.stopPreview();let t=new Fe(()=>{this.loadMore()},s=>{this.state===i&&(i.against=s,this.render())}),n={id:Fi(e),title:`${e.name} #${e.sortOrder}`,render:()=>t.element,dispose:()=>{this.state===i&&(this.stopPreview(),this.state=void 0)}},i={...e,versions:[],live:void 0,after:void 0,against:"live",linked:!1,level:n,view:t,version:void 0};this.state=i,this.hooks.show(n,e.entityUrn),t.setStatus("Loading\u2026"),i.linked=await this.isLinked(e),this.state===i&&await this.loadMore()}close(){this.stopPreview(),this.state=void 0}stopPreview(){this.state&&this.view.previewedUrn&&(this.view.stopPreview(this.state),this.ctx.toolbar.showMessage(""))}togglePreview(e,t){if(this.view.previewedUrn===t.urn){this.stopPreview();return}this.editing.close(),this.view.previewVersion(e,t);let n=window.getSelection(),i=this.view.bindingsAt(e).map(o=>o.element);n?.anchorNode&&i.some(o=>o.contains(n.anchorNode))&&n.removeAllRanges(),this.view.bindingsAt(e)[0]?.element.scrollIntoView({block:"nearest",behavior:"smooth"});let s=new Date(C(t.createdTimestamp??"")).toLocaleString();this.ctx.toolbar.showMessage(`Previewing the version of ${e.name} saved ${s}. Nothing is saved; stop the preview to see the latest again.`,!0)}changed(e){let t=this.state;if(!t||e&&e!==t.entityUrn)return;let n=this.ctx.store.itemAt(t.entityUrn,t.entry,t.name,t.sortOrder);n?.item.urn&&(t.urn=n.item.urn),this.reload(t)}async reload(e){try{let t=await this.ctx.transport.history(e.entry,e.urn);if(this.state!==e)return;e.live=t.item??void 0,e.versions=[...t.history],e.after=t.pagination?.isMorePages?t.pagination.after??void 0:void 0,this.render()}catch(t){this.ctx.feedback.report(t,"load the history",()=>{this.reload(e)})}}async loadMore(){let e=this.state;if(e)try{let t=await this.ctx.transport.history(e.entry,e.urn,e.after);if(this.state!==e)return;e.live??=t.item??void 0,e.versions.push(...t.history),e.after=t.pagination?.isMorePages?t.pagination.after??void 0:void 0,e.view.setStatus(""),this.render()}catch(t){e.view.setStatus(""),this.ctx.feedback.report(t,"load the history",()=>{this.loadMore()})}}render(){let e=this.state;if(!e)return;let t=e.versions.map((s,o)=>this.row(e,s,e.versions[o+1])),n=[],i;e.versions.forEach((s,o)=>{let a=C(s.createdTimestamp??""),d=n.at(-1),l=s.isPublished===!0;d&&!l&&!d.live&&i!==void 0&&i-a<=Di?d.collapsed.push(t[o]):n.push(t[o]),i=a}),e.view.render(n,e.after!==void 0),e.version&&this.stack.path.includes(Dn(e.version.urn))&&ft(e.version.body,this.versionModel(e,e.version.urn))}row(e,t,n){let i=e.against==="live"?e.live:n;return{when:bt(t),whenUtc:t.createdTimestamp??"",live:t.isPublished===!0,change:gt(e.entry,t,i,e.against),notes:this.notes(t,n),open:()=>this.openVersion(e,t),preview:this.previewAction(e,t),collapsed:[]}}notes(e,t){let n=[];t&&t.name!==e.name&&n.push(`renamed from ${t.name}`),t&&t.sortOrder!==e.sortOrder&&n.push(`moved from #${t.sortOrder} to #${e.sortOrder}`);let i=e.urn?this.ctx.groups?.of(e.urn):void 0;return i&&n.push(`part of: ${i.label}`),n}openVersion(e,t){let n=t.urn,i=c("div","level-version");e.version={urn:n,body:i},ft(i,this.versionModel(e,n)),this.stack.push({id:Dn(n),title:`Version saved ${bt(t)}`,render:()=>i,dispose:()=>{e.version?.urn===n&&(e.version=void 0)}})}versionModel(e,t){let n=e.versions.findIndex(l=>l.urn===t),i=e.versions[n];if(!i)return;let s=e.versions[n+1],o=[...i.isPublished===!0?["live"]:[],...n===0?["latest"]:[]],a=s!==void 0&&s.urn===e.live?.urn,d=[{label:a?"Against the one before, which is live":"Against the one before",change:gt(e.entry,i,s,"previous")||"The same value as the one before."}];return i.isPublished!==!0&&!a&&d.push({label:"Against live",change:gt(e.entry,i,e.live,"live")}),{when:bt(i),whenUtc:i.createdTimestamp??"",marks:o,notes:this.notes(i,s),changes:d,actions:this.actions(e,i)}}actions(e,t){let{ctx:n}=this,i=[],s=n.store.view(e.entityUrn)?.status;if(n.canPublish&&t.isPublished!==!0&&(S(s)||s==="PUBLISH")){let a=s==="PUBLISH"?"Publishing is in progress for this page.":void 0,d=n.groups?.of(t.urn)!==void 0;i.push(e.linked||d?{label:"Publish with the page\u2026",disabled:a,run:()=>this.hooks.publishEntity(e.entityUrn)}:{label:"Publish this version",primary:!0,disabled:a,run:()=>{this.publish(e,t)}})}i.push(this.previewAction(e,t)),t!==e.versions[0]&&i.push({label:"Edit from this version",run:a=>this.editFrom(e,t,a)});let o=e.versions.length===1&&e.after===void 0;return i.push({label:o?"Delete this item\u2026":"Delete this version\u2026",destructive:!0,run:()=>this.confirmDelete(e,t,o)}),i}previewAction(e,t){let n=this.view.previewedUrn===t.urn,i=this.ctx.store.itemAt(e.entityUrn,e.entry,e.name,e.sortOrder)?.item.urn,s=e.entry.renderedByView?"The page shows the server's rendering of this type, which history does not include.":this.view.mode!=="LATEST"?"Previews are shown on the latest drafts.":this.view.bindingsAt(e).length===0?"This item is not shown on this page.":t.urn===i&&!this.ctx.pending.getEdit(t.urn)?"The page already shows this version.":void 0;return{label:n?"Stop preview":"Preview on the page",pressed:n,disabled:n?void 0:s,run:()=>this.togglePreview(e,t)}}confirmDelete(e,t,n){let i=new Date(C(t.createdTimestamp??"")).toLocaleString(),s=t.isPublished===!0?"from this page and from the live site":"from this page",o=[{label:`The version saved ${i}`,text:F(e.entry,t)}],a=n?`This is its only version, so deleting it deletes the item: it disappears ${s}, and cannot be restored.`:"It is removed from the history for good and cannot be restored. Every version uses storage, which is billed.",d=!n&&t.isPublished===!0?Fn(e,t):void 0;if(d){let l=new Date(C(d.version?.createdTimestamp??"")).toLocaleString();d.version&&o.push({label:`Goes live in its place: the version saved ${l}`,text:F(e.entry,d.version)}),a=d.newer?`This is the live version. The API puts the next newer version live in its place: a draft saved ${l}, which may never have been published. Publish the version you want first if that is not it. It cannot be restored.`:d.version?`This is the live version. The API puts the version before it live in its place (saved ${l}). It cannot be restored.`:"This is the live version. The API puts the version before it live in its place. It cannot be restored."}this.stack.push(Ve({id:"confirm-delete",title:n?"Delete this item permanently?":d?"Delete the live version permanently?":"Delete this version permanently?",meta:`${e.name} #${e.sortOrder}`,blocks:o,description:a,choices:[{label:"Cancel",run:()=>this.stack.pop()},{label:"Delete permanently",destructive:!0,run:l=>{l.disabled=!0,l.textContent="Deleting\u2026",this.deleteVersion(e,t).finally(()=>{l.disabled=!1,l.textContent="Delete permanently"})}}]}))}async deleteVersion(e,t){let{transport:n,pending:i,toolbar:s,feedback:o}=this.ctx,a=t.isPublished===!0?Fn(e,t).version:void 0;try{await n.remove(e.entry,t.urn),a?.urn&&mt({entityUrn:e.entityUrn,urn:a.urn,type:e.entry.type});let d=e.versions.find(u=>u.urn!==t.urn),l=i.getEdit(t.urn);if(!d?.urn){l&&i.clear(t.urn),this.close(),this.stack.popTo(`entity:${e.entityUrn}`),s.showMessage(`Deleted ${e.name} #${e.sortOrder}.`,!0),await this.hooks.published(e.entityUrn);return}l&&i.set({...l,stale:!0}),s.showMessage(`Deleted the version of ${e.name} saved ${new Date(C(t.createdTimestamp??"")).toLocaleString()}.`,!0),this.state===e&&this.stack.popTo(e.level.id),e.urn=d.urn,await this.hooks.published(e.entityUrn),this.state===e&&await this.reload(e)}catch(d){o.report(d,"delete this version",()=>{this.deleteVersion(e,t)})}}async publish(e,t){try{await this.ctx.transport.publishVersion(e.entry,t),mt({entityUrn:e.entityUrn,urn:t.urn,type:e.entry.type}),this.ctx.announcePublished(e.entityUrn,`Published the version of ${e.name} saved ${new Date(C(t.createdTimestamp??"")).toLocaleString()}.`,{itemUrn:t.urn}),await this.hooks.published(e.entityUrn)}catch(n){this.ctx.feedback.report(n,"publish this version",()=>{this.publish(e,t)})}}editFrom(e,t,n){this.ctx.store.remember(e.entityUrn,e.entry,t),this.editing.open({entityUrn:e.entityUrn,entry:e.entry,name:t.name,sortOrder:t.sortOrder,urn:t.urn,anchor:n,binding:void 0,fromVersion:!0})}async isLinked(e){if(e.entry.type==="template")return!0;let{store:t,sources:n,transport:i}=this.ctx,s=t.view(e.entityUrn)?.raw.templates??[],o=this.ctx.entry("template"),a=new RegExp(`\\$\\{?${e.name.replace(/[^\w-]/g,"")}\\b`);for(let d of s)if(d.urn)try{let l=n.get(d.urn)??{value:(await i.read(o,d.urn)).value};if(n.set(d.urn,l),a.test(String(l.value??"")))return!0}catch{}return!1}};function gt(r,e,t,n){if(!t)return n==="live"?"Nothing is live yet.":"The first version.";if(t.urn===e.urn)return n==="live"?"This is the live version.":"";let i=t.value,s=e.value;if(typeof i=="string"&&typeof s=="string")return Re(i,s);let o=F(r,t),a=F(r,e);return o===a?"No change to the value.":De(r,t,e)}function bt(r){let e=C(r.createdTimestamp??"");return Number.isNaN(e)?"Unknown time":new Date(e).toLocaleString()}function Fi(r){return`item:${r.entityUrn}:${r.entry.type}:${r.name}:${r.sortOrder}`}function Dn(r){return`version:${r}`}function Ui(r,e){return r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}function Fn(r,e){let t=r.versions.indexOf(e);return t>0?{version:r.versions[t-1],newer:!0}:{version:r.versions[t+1],newer:!1}}function Vn(r,e){let t=r.map(s=>s.sortOrder).sort((s,o)=>s-o),n=new Map(r.map(s=>[s.key,s]));if(e.length!==r.length||e.some(s=>!n.has(s)))throw new Error("The new order must contain exactly the items of the list");let i=[];return e.forEach((s,o)=>{let a=n.get(s),d=t[o];a.sortOrder!==d&&i.push({key:s,from:a.sortOrder,to:d})}),i}function _n(r,e){let t=[...r].sort((d,l)=>d.sortOrder-l.sortOrder);if(t.length===0)return{sortOrder:0,shifts:[]};if(e.position==="head")return{sortOrder:t[0].sortOrder-1,shifts:[]};if(e.position==="tail")return{sortOrder:t.at(-1).sortOrder+1,shifts:[]};let n=t.findIndex(d=>d.key===e.key);if(n<0)throw new Error("The item to insert after is not in the list");let i=t[n],s=t[n+1];if(!s)return{sortOrder:i.sortOrder+1,shifts:[]};if(s.sortOrder-i.sortOrder>1)return{sortOrder:Math.floor((i.sortOrder+s.sortOrder)/2),shifts:[]};let o=t.slice(0,n+1),a=t.slice(n+1);return a.length<=o.length?{sortOrder:s.sortOrder,shifts:[...Un(a,1)].reverse()}:{sortOrder:i.sortOrder,shifts:Un([...o].reverse(),-1).reverse()}}function Un(r,e){let t=[];for(let[n,i]of r.entries()){if(n>0&&i.sortOrder!==t.at(-1).to)break;t.push({key:i.key,from:i.sortOrder,to:i.sortOrder+e})}return t}function zn(r,e){return[{key:r.key,from:r.sortOrder,to:e.sortOrder},{key:e.key,from:e.sortOrder,to:r.sortOrder}]}async function Gn(r,e,t){let{store:n,sources:i,transport:s}=r,o=r.entry("template"),a=new RegExp(`\\$\\{?${t.replace(/[^\w-]/g,"")}\\b`),d=[];for(let l of n.view(e)?.raw.templates??[])if(l.urn)try{let u=i.get(l.urn)??{value:(await s.read(o,l.urn)).value};i.set(l.urn,u),a.test(String(u.value??""))&&d.push(`${l.name} #${l.sortOrder}`)}catch{}return d}var ze=class{element;entries=[];actions;list;status;saveButton;addButtons;dragging;panels;handle;constructor(e){this.panels=e,this.element=c("div","reorder"),this.status=c("p","hint"),this.status.setAttribute("role","status"),this.list=c("ol","rows reorder-rows"),this.list.setAttribute("aria-label","Entries, in order"),this.addButtons=c("div","actions");let t=c("div","actions"),n=c("button","","Cancel");n.type="button",n.addEventListener("click",()=>this.actions?.cancel()),this.saveButton=c("button","primary","Save order"),this.saveButton.type="button",this.saveButton.addEventListener("click",()=>this.actions?.save(this.keys())),t.append(n,this.saveButton),this.element.append(this.status,this.list,this.addButtons,t)}get isOpen(){return this.handle?.isOpen??!1}open(e,t,n,i){if(this.entries=[...n],this.actions=i,this.setStatus(""),this.setBusy(!1),this.addButtons.replaceChildren(),i.add){let s=c("button","","Add at the start");s.type="button",s.addEventListener("click",()=>i.add({position:"head"},s));let o=c("button","","Add at the end");o.type="button",o.addEventListener("click",()=>i.add({position:"tail"},o)),this.addButtons.append(s,o)}this.render(),this.handle=this.panels.show(this.element,{title:e,entityUrn:t,onLeave:()=>{let s=this.actions;this.actions=void 0,s?.cancel()}})}close(){this.actions=void 0,this.handle?.close()}setStatus(e){this.status.textContent=e}setBusy(e,t="Saving\u2026"){this.saveButton.disabled=e,this.saveButton.textContent=e?t:"Save order"}keys(){return this.entries.map(e=>e.key)}move(e,t,n){if(t<0||t>=this.entries.length||e===t)return;let[i]=this.entries.splice(e,1);if(this.entries.splice(t,0,i),this.render(),n){let o=[...[...this.list.children].find(a=>a.dataset.key===i.key)?.querySelectorAll("button[data-move]")??[]];(o.find(a=>a.dataset.move===n&&!a.disabled)??o.find(a=>!a.disabled))?.focus()}this.actions?.changed(this.keys())}render(){this.list.replaceChildren(...this.entries.map((e,t)=>{let n=c("li","row reorder-row");n.draggable=!0,n.dataset.key=e.key;let i=c("span","handle");i.setAttribute("aria-hidden","true"),i.append(L("grip-vertical"));let s=c("div","row-main");s.append(c("span","row-name",e.label)),e.detail&&s.append(c("span","meta",e.detail));let o=c("button","","Move up");o.type="button",o.disabled=t===0,o.setAttribute("aria-label",`Move ${e.label} up`),o.dataset.move="up",o.addEventListener("click",()=>this.move(t,t-1,"up"));let a=c("button","","Move down");if(a.type="button",a.disabled=t===this.entries.length-1,a.setAttribute("aria-label",`Move ${e.label} down`),a.dataset.move="down",a.addEventListener("click",()=>this.move(t,t+1,"down")),n.append(i,s,o,a),this.actions?.add){let d=T("","ghost","icon-sm");d.setAttribute("aria-label",`Add after ${e.label}`),d.append(L("plus")),I(d),d.addEventListener("click",()=>this.actions?.add({position:"after",key:e.key},d)),n.append(d)}return n.addEventListener("dragstart",d=>{this.dragging=e.key,d.dataTransfer?.setData("text/plain",e.key),n.classList.add("dragging")}),n.addEventListener("dragend",()=>{this.dragging=void 0,n.classList.remove("dragging")}),n.addEventListener("dragover",d=>d.preventDefault()),n.addEventListener("drop",d=>{d.preventDefault();let l=this.entries.findIndex(u=>u.key===this.dragging);l>=0&&this.move(l,t)}),n}))}};var Ge=class{panel;ctx;view;editing;groups;done=new Map;failures=new Map;create;constructor(e,t,n,i,s){this.ctx=e,this.create=s,this.view=t,this.editing=n,this.groups=i,this.panel=new ze(e.panels)}groupOf(e){let t=this.ctx.store.entityFor(e.scope);if(!t)return;let n=e.element.closest("[data-content-rows]"),i=e.element.closest(`[data-${e.entry.attribute}-list="${CSS.escape(e.name)}"]`);if(i&&(!n||n.contains(i)))return this.listGroup(i,e,t);if(n)return this.rowsGroup(n,e,t)}listGroup(e,t,n){let i=[];for(let s of e.children){let o=this.ctx.discovery.all().find(u=>u.entry===t.entry&&u.name===t.name&&s.contains(u.element)&&this.ctx.store.entityFor(u.scope)===n);if(!o)continue;let a=this.ctx.store.itemFor(o),d=o.element.getAttribute("data-section");if(!a?.item.urn&&d===null)continue;let l=a?.item.urn?String(a.item.value??a.item.name):d;i.push({key:a?.item.urn??`slot:${o.sortOrder}`,element:s,bindings:[o],sortOrder:o.sortOrder,label:d===null?l:Vi(s,l),...d!==null?{detail:` \xB7 ${(s.textContent??"").trim().replace(/\s+/g," ").slice(0,70)}\u2026`}:{},...a?.item.urn?{}:{missing:d}})}return{kind:"list",container:e,entityUrn:n,entry:t.entry,name:t.name,units:i}}rowsGroup(e,t,n){let i=[];for(let s of e.children){let o=Number(s.getAttribute("data-content-row"));if(!Number.isInteger(o))continue;let a=this.ctx.discovery.all().filter(l=>s.contains(l.element)&&this.ctx.store.entityFor(l.scope)===n),d=a.map(l=>(l.element.textContent??"").trim()).filter(Boolean);i.push({key:`row:${o}`,element:s,bindings:a,sortOrder:o,label:d[0]??`Row ${o}`,detail:d.length>1?` \xB7 ${d.slice(1).join(" \xB7 ")}`:""})}return{kind:"rows",container:e,entityUrn:n,entry:t.entry,name:t.name,units:i}}openReorder(e){let t=this.groupOf(e);if(!t||t.units.length===0)return;this.editing().close(),this.view.rememberOrder(t.container);let n=t.units.map(s=>s.key),i=t.kind==="rows"?"rows":t.name==="sections"?"sections":`"${t.name}"`;this.panel.open(`Reorder ${i}`,t.entityUrn,t.units.map(s=>({key:s.key,label:s.label,sortOrder:s.sortOrder,...s.detail?{detail:s.detail}:{}})),{changed:s=>this.preview(t,s),cancel:()=>{this.preview(t,n),this.panel.close()},save:s=>{this.saveOrder(t,s,()=>this.panel.close())},...t.kind==="list"?{add:(s,o)=>{this.insert(t,s,o)}}:{}})}moveBy(e,t){let n=this.groupOf(e);if(!n)return;let i=n.units.map(a=>a.key),s=n.units.findIndex(a=>a.bindings.includes(e)),o=s+t;s<0||o<0||o>=i.length||([i[s],i[o]]=[i[o],i[s]],this.editing().close(),this.view.rememberOrder(n.container),this.preview(n,i),this.saveOrder(n,i,()=>{}))}preview(e,t){let n=new Map(e.units.map(a=>[a.key,a]));if(G(e.container)){this.previewLive(e,t);return}let i=new Set(e.units.map(a=>a.element)),o=[...e.container.children].filter(a=>i.has(a)).map(a=>{let d=document.createComment("");return a.replaceWith(d),d});t.forEach((a,d)=>o[d]?.replaceWith(n.get(a).element))}previewLive(e,t){let n=new Map(e.units.map(a=>[a.key,a])),i=e.units.map(a=>a.sortOrder).sort((a,d)=>a-d),s=e.units.map(a=>a.key),o=t.every((a,d)=>a===s[d]);t.forEach((a,d)=>{let l=n.get(a),u=l.bindings[0],f=this.ctx.store.itemFor(u)?.item??{name:e.name,value:l.missing};this.ctx.live.showAt(u,i[d],o?void 0:{...f,sortOrder:i[d]})})}async saveOrder(e,t,n){let i=Vn(e.units.map(u=>({key:u.key,sortOrder:u.sortOrder})),t),s=new Map(e.units.map(u=>[u.key,u])),o=e.units.filter(u=>u.missing!==void 0);if(i.length===0&&o.length===0){n();return}let a=[];for(let u of i){let h=s.get(u.key);if(h.missing===void 0)for(let f of h.bindings){let p=this.ctx.store.itemFor(f);p?.item.urn&&a.push(this.step(f.entry,p.item,e.entityUrn,{name:f.name,sortOrder:u.to}))}}let d=e.kind==="rows"?"Reorder rows":`Reorder ${e.name}`;this.panel.setBusy(!0);let l=await this.runSteps(a,d)&&await this.createMissing(e,o,i);if(this.panel.setBusy(!1),!l){this.preview(e,e.units.map(u=>u.key)),await this.view.refresh(e.entityUrn);return}if(G(e.container))this.ctx.live.endPreviews();else for(let u of i)for(let h of s.get(u.key).bindings)this.view.retag(h,u.to);n(),await this.view.refresh(e.entityUrn)}async createMissing(e,t,n){if(t.length===0)return!0;let{feedback:i,toolbar:s}=this.ctx;await this.view.refresh(e.entityUrn);let o=new Map(n.map(a=>[a.key,a.to]));for(let a of t){let d=o.get(a.key)??a.sortOrder;try{await this.create({kind:"create",type:e.entry.type,entityUrn:e.entityUrn,name:e.name,sortOrder:d,value:{value:a.missing}})}catch(l){let u=await i.describe(l,`add ${a.missing} to ${e.name}`);return s.showMessage(`Reorder ${e.name}: ${u.message}`,!1,u.debug),!1}}return!0}keyedMembers(){let e=new Set,t=[];for(let n of this.ctx.discovery.all()){if(!n.element.hasAttribute("data-section"))continue;let i=this.groupOf(n);!i||i.kind!=="list"||e.has(i.container)||(e.add(i.container),i.units.forEach((s,o)=>t.push({binding:s.bindings[0],name:i.name,index:o,count:i.units.length})))}return t}openOrderMenu(e){let t=this.groupOf(e);if(!t||t.units.length<2)return;let{popover:n}=this.ctx;this.editing().close(),this.view.rememberOrder(t.container);let i=t.units.map(u=>u.key),s=t.units.find(u=>u.bindings.includes(e)),o=[...i],a=new Map(t.units.map(u=>[u.key,u.label])),d=()=>{this.preview(t,i),this.changedOrder()},l=()=>{let u=o.indexOf(s.key),h=o.some((m,g)=>m!==i[g]),f=m=>{let g=[...o];[g[u],g[u+m]]=[g[u+m],g[u]],o=g,this.preview(t,o),this.changedOrder(),l()},p=o[u-1],v=o[u+1];n.whenEnded(void 0),n.showChoices(s.element,`Order of ${t.name}`,`${u+1} of ${o.length}`,[],[`${s.label} is ${u+1} of ${o.length}.`,p?`Before it: ${a.get(p)}.`:"",v?`After it: ${a.get(v)}.`:"",h?"Not saved yet.":"",h&&t.units.some(m=>m.missing!==void 0)&&S(this.ctx.store.view(t.entityUrn)?.status)?"This content is published, and this order is new, so it is live as soon as it is saved.":""].filter(Boolean).join(" "),[...p?[{label:"Move previous",run:()=>f(-1)}]:[],...v?[{label:"Move next",run:()=>f(1)}]:[],{label:"Reorder all\u2026",run:()=>{n.whenEnded(void 0),n.hide(),d(),this.openReorder(e)}},...h?[{label:"Save",primary:!0,run:()=>{n.whenEnded(void 0),n.hide(),this.saveOrder(t,o,()=>{}).then(()=>this.changedOrder())}}]:[],{label:h?"Revert":"Close",run:()=>n.hide()}]),n.whenEnded(d)};l()}orderListeners=new Set;onOrderChange(e){this.orderListeners.add(e)}changedOrder(){for(let e of this.orderListeners)e()}async insert(e,t,n){let i=e.units.map(h=>({key:h.key,sortOrder:h.sortOrder}));await this.view.refresh(e.entityUrn);let s=_n(i,t),o=new Map(e.units.map(h=>[h.key,h]));if(s.shifts.length>0){let h=s.shifts.flatMap(f=>o.get(f.key).bindings.flatMap(p=>{let v=this.ctx.store.itemFor(p);return v?.item.urn?[this.step(p.entry,v.item,e.entityUrn,{name:p.name,sortOrder:f.to})]:[]}));if(!await this.runSteps(h,`Make room in ${e.name}`))return;for(let f of s.shifts)for(let p of o.get(f.key).bindings)this.view.retag(p,f.to);await this.view.refresh(e.entityUrn)}if(this.ctx.store.itemAt(e.entityUrn,e.entry,e.name,s.sortOrder)){this.ctx.toolbar.showMessage(`${e.name} #${s.sortOrder} is taken. Reopen the list and try again.`);return}let a=e.units.at(t.position==="head"?0:-1),d=t.position==="after"?o.get(t.key).element:a.element,l=a.element.cloneNode(!0);for(let h of[l,...l.querySelectorAll("*")])h.removeAttribute("style"),h.removeAttribute("data-baack-state"),h.removeAttribute(`data-${e.entry.attribute}-urn`),h.hasAttribute(`data-${e.entry.attribute}-name`)&&(h.setAttribute(`data-${e.entry.attribute}-sort-order`,String(s.sortOrder)),h.setAttribute("data-placeholder",""));t.position==="head"?e.container.insertBefore(l,d):d.after(l),this.view.track(l),this.panel.close();let u=l.matches(`[data-${e.entry.attribute}-name]`)?l:l.querySelector(`[data-${e.entry.attribute}-name]`);this.editing().open({entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:s.sortOrder,anchor:u??l,binding:void 0})}async relocate(e,t,n,i){let{store:s}=this.ctx;this.editing().close();let o=this.ctx.discovery.all().filter(f=>f.entry===n&&f.name===i.name&&f.sortOrder===i.sortOrder).length,a=await Gn(this.ctx,t,i.name),d=c("div","simple-form");d.append(c("p","hint",`${i.name} #${i.sortOrder} is shown in ${o} ${o===1?"place":"places"} on this page. Those places will show the new item there, or a placeholder.`));let l=new _(`Move or rename ${i.name} #${i.sortOrder}`,[{key:"name",label:"Name",value:i.name},{key:"sortOrder",label:"Sort order",value:String(i.sortOrder)}],"Move",f=>{let p=f.name??"",v=Number(f.sortOrder);if(!/^[A-Za-z0-9_-]+$/.test(p))return l.setError("Use letters, numbers, - and _ in the name.");if(!Number.isInteger(v))return l.setError("The sort order must be a whole number.");if(p===i.name&&v===i.sortOrder)return l.setError("That is where it is now.");l.setBusy(!0,"Checking\u2026"),this.view.refresh(t).then(async()=>{if(l.setBusy(!1),s.itemAt(t,n,p,v)&&!u){u=!0,l.setError(`${p} #${v} is taken. Press Move again to swap the two.`);return}h.close(),await this.moveTo(t,n,i,{name:p,sortOrder:v})})}),u=!1;l.element.insertBefore(d,l.element.querySelector(".error")),a.length>0&&l.element.insertBefore(c("p","issues",`Templates use "${i.name}" and would stop showing it if it is renamed: ${a.join(", ")}.`),l.element.querySelector(".error")),l.element.insertBefore(c("p","issues","Renaming changes the name every client looks this item up by, including apps this editor cannot see. They break when it is published."),l.element.querySelector(".error"));let h=this.ctx.panels.show(l.element,{entityUrn:t})}async moveTo(e,t,n,i){await this.view.refresh(e);let s=this.ctx.store.itemAt(e,t,i.name,i.sortOrder);if(s?.item.urn===n.urn)return!0;let o=s?zn({key:n.urn,sortOrder:n.sortOrder},{key:s.item.urn,sortOrder:i.sortOrder}).map(d=>this.step(t,d.key===n.urn?n:s.item,e,{name:d.key===n.urn?i.name:n.name,sortOrder:d.to})):[this.step(t,n,e,i)],a=s?`Swap ${n.name} #${n.sortOrder} and ${i.name} #${i.sortOrder}`:i.name===n.name?`Move ${n.name} #${n.sortOrder} to #${i.sortOrder}`:`Rename ${n.name} to ${i.name}`;return await this.runSteps(o,a)?(await this.view.refresh(e),!0):!1}step(e,t,n,i){return{kind:"move",type:e.type,urn:t.urn,entityUrn:n,name:t.name,sortOrder:t.sortOrder,to:i}}async runSteps(e,t){if(e.length===0)return!0;let n=`plan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`;for(let i of e)this.ctx.pending.set({...i,planId:n,label:t});return this.run(n)}async run(e){let{pending:t,transport:n,toolbar:i,feedback:s}=this.ctx,o=t.plan(e);if(o.length===0)return!0;let a=o[0].label,d=o[0].entityUrn,l=this.done.get(e)??[];this.done.set(e,l),i.showMessage(`${a}: moving\u2026`,!0);for(let u of o){let h=this.ctx.entry(u.type);try{let f=(await n.history(h,u.urn)).history[0];if(!f?.urn)throw new Error(`${u.name} #${u.sortOrder} no longer exists`);if(f.name===u.to.name&&f.sortOrder===u.to.sortOrder){t.clear(z(u)),l.push({step:u,urn:f.urn});continue}if(f.urn!==u.urn)throw new Error(`${u.name} #${u.sortOrder} was changed by someone else after this move was planned`);let p={...f,name:u.to.name,sortOrder:u.to.sortOrder},v=await n.update(h,f.urn,Y(h,p,M(h,f),u.entityUrn));if(!v?.urn)throw new Error("the API returned no URN for the new version");t.clear(z(u)),l.push({step:u,urn:v.urn}),re({entityUrn:u.entityUrn,oldUrn:u.urn,newUrn:v.urn,type:h.type,value:v})}catch(f){let p=await s.describe(f,"move this item");return this.showFailure(e,a,l.length,l.length+t.plan(e).length,p.message,p.debug,d),p.kind==="unauthorized"&&s.promptLogin(p.message,()=>{this.run(e)}),!1}}return this.groups()?.add({id:e,label:a,entityUrn:d,versions:l.map(u=>u.urn),at:Date.now()}),this.done.delete(e),this.closeFailure(e),i.showMessage(`${a}: done. Saved as drafts.`,!0,void 0,Le(this.ctx,d)),!0}showFailure(e,t,n,i,s,o,a){let d=c("div","simple-form");d.append(c("div","title",`${t} stopped part-way`),c("p","message",`Moved ${n} of ${i}. ${s}`),...Z(o),c("p","hint","The rest is kept with your unsaved changes, in this browser, until you retry or put things back."));let l=c("button","primary","Retry");l.type="button",l.addEventListener("click",()=>{this.run(e).then(async f=>{f&&await this.refreshAfter(e)})});let u=c("button","",n>0?"Put back":"Discard this move");u.type="button",u.addEventListener("click",()=>{this.putBack(e)});let h=c("div","actions");h.append(u,l),d.append(h),this.closeFailure(e),this.failures.set(e,this.ctx.panels.show(d,{entityUrn:a}))}closeFailure(e){this.failures.get(e)?.close(),this.failures.delete(e)}async refreshAfter(e){for(let t of this.ctx.store.entities())await this.view.refresh(t)}async putBack(e){let{pending:t}=this.ctx,n=this.done.get(e)??[],i=t.plan(e);for(let d of i)t.clear(z(d));let s=i[0]?.label??n[0]?.step.label??"Move",o=i[0]?.entityUrn??n[0]?.step.entityUrn;if(this.done.delete(e),n.length===0){this.closeFailure(e),this.ctx.toolbar.showMessage(`${s}: nothing had moved, so nothing changed. The move is discarded.`,!0);return}let a=n.map(({step:d,urn:l})=>({kind:"move",type:d.type,urn:l,entityUrn:d.entityUrn,name:d.to.name,sortOrder:d.to.sortOrder,to:{name:d.name,sortOrder:d.sortOrder}}));await this.runSteps(a,`Put back: ${s}`)&&(this.ctx.toolbar.showMessage(`Put back: ${s}.`,!0),o&&await this.view.refresh(o))}};function Vi(r,e){return(r.querySelector("h1, h2, h3, h4, h5, h6")?.textContent??"").trim().replace(/\s+/g," ")||e}var Ke=class{layer;onOpen;tags=[];frame=0;resizes=new ResizeObserver(()=>this.schedule());constructor(e,t){this.layer=c("div","order-tags"),e.root.append(this.layer),this.onOpen=t}show(e){if(e.length===this.tags.length&&e.every((i,s)=>this.tags[s].binding===i.binding&&this.tags[s].button.textContent===Kn(i))){this.place();return}let n=this.tags.findIndex(i=>i.button.matches(":focus"));this.clear();for(let i of e){let s=c("button","order-tag",Kn(i));s.type="button",s.setAttribute("aria-label",`Order of ${i.name}: ${i.index+1} of ${i.count}`),s.addEventListener("click",()=>this.onOpen(i.binding)),this.layer.append(s),this.tags.push({binding:i.binding,element:i.binding.element,button:s}),this.resizes.observe(i.binding.element)}this.tags.length>0&&(window.addEventListener("scroll",this.schedule,!0),window.addEventListener("resize",this.schedule)),this.place(),this.tags[n]?.button.focus()}clear(){cancelAnimationFrame(this.frame),this.resizes.disconnect(),window.removeEventListener("scroll",this.schedule,!0),window.removeEventListener("resize",this.schedule),this.layer.replaceChildren(),this.tags=[]}schedule=()=>{cancelAnimationFrame(this.frame),this.frame=requestAnimationFrame(()=>this.place())};place(){for(let{element:e,button:t}of this.tags){let n=e.getBoundingClientRect();t.hidden=e.getClientRects().length===0,t.style.top=`${n.top+4}px`,t.style.right=`${window.innerWidth-n.right+4}px`}}};function Kn(r){return`${r.name} \xB7 ${r.index+1} of ${r.count} \u22EF`}var _i="baack-editor:groups:";var je=class{key;constructor(e){this.key=_i+e}all(){try{let e=JSON.parse(window.localStorage.getItem(this.key)??"[]");return Array.isArray(e)?e:[]}catch{return[]}}of(e){return this.all().find(t=>t.versions.includes(e))}add(e){try{let t=[...this.all(),e].slice(-200);window.localStorage.setItem(this.key,JSON.stringify(t))}catch(t){console.warn("Baack editor: could not record which versions belong together.",t)}}};var zi="baack-editor:entities",jn=1440*60*1e3,Gi=4,Ki=[500,2e3];function j(r){return r.replace(/^\/[^/]+\/content(?=\/|$)/,"")||"/"}var qe=class{transport;owners;cache=new Map;key;search;constructor(e,t,n){this.transport=e,this.owners=t,this.key=`${zi}:${n??"anonymous"}`;try{let i=JSON.parse(localStorage.getItem(this.key)??"[]");for(let s of i)Date.now()-s.at<jn&&this.cache.set(s.urn,s)}catch{}}get(e){return this.cache.get(e)}async describe(e){return this.cache.get(e)??this.remember(await this.transport.readEntity(e))}remember(e){let t={urn:e.urn,name:e.name,path:j(e.name),language:e.language,variant:e.variant??"",at:Date.now()};return this.cache.set(t.urn,t),this.search=this.search?.then(n=>({...n,urns:n.urns.includes(t.urn)?n.urns:[...n.urns,t.urn]})),this.save(),t}async list(e){this.search??=this.searchAll().catch(u=>{throw this.search=void 0,u});let{urns:t,complete:n}=await this.search,i=()=>({entities:t.flatMap(u=>this.cache.get(u)??[]).sort(ji),complete:n}),s=t.filter(u=>!this.fresh(u));s.length>0&&e?.(i());let o,a=[...s],d=async()=>{for(let u=a.shift();u;u=a.shift())try{this.remember(await this.readWithRetry(u)),e?.(i())}catch(h){R(h)&&h.isNotFound||(o??=h)}};if(await Promise.all(Array.from({length:Math.min(Gi,s.length)},d)),o)throw o;let l=i();return e?.(l),l}async readWithRetry(e){for(let t of Ki)try{return await this.transport.readEntity(e)}catch(n){if(!(R(n)&&n.status===429))throw n;await new Promise(i=>setTimeout(i,t))}return this.transport.readEntity(e)}async searchAll(){let e=await Promise.all((await this.owners()).map(t=>this.transport.searchEntities(t)));return{urns:[...new Set(e.flatMap(t=>t.urns))],complete:e.every(t=>t.complete)}}fresh(e){let t=this.cache.get(e);return t!==void 0&&Date.now()-t.at<jn}save(){try{localStorage.setItem(this.key,JSON.stringify([...this.cache.values()]))}catch{}}};function ji(r,e){return r.path.localeCompare(e.path)||r.language.localeCompare(e.language)||r.variant.localeCompare(e.variant)}var qn="/home";function We(r){let e=r.replace(/\/index\.html?$/,"/").replace(/\/+$/,"");return e===""?qn:e}function Wn(r){return r===qn?"/":r}function wt(r){return r.endsWith("/")}var Ye=class{deps;constructor(e){this.deps=e}async offerEntityForPage(){let{transport:e,panels:t}=this.deps,n=(this.deps.entityNameForPage??We)(location.pathname),i=document.documentElement.lang||"en-GB";try{let s=await e.entityView(n,{version:"LATEST",language:i}),o=c("div","simple-form");o.append(c("div","title","Content for this page exists"),c("p","hint","Add this to the page's root element so the editor and the site can find it:"),Yn(s.urn));let a=c("button","primary","Use it for this visit");a.type="button",a.addEventListener("click",()=>{document.documentElement.setAttribute(U,s.urn),d.close()}),o.append(oe(a));let d=t.show(o)}catch(s){R(s)&&s.isNotFound?await this.showCreateEntity(n,i):this.deps.report(s,"look up this page",()=>{this.offerEntityForPage()})}}async showCreateEntity(e,t){let{panels:n}=this.deps,i=await this.newEntityForm({title:"This page has no content in Baack yet",submitLabel:"Create content for this page",path:e,pathLabel:"Name of this page's content",hint:`No content named ${e} (${t}) was found for ${location.pathname}.`,language:t,onCreated:s=>{let o=c("div","simple-form");o.append(c("div","title","Content created (in draft)"),c("p","hint","Add this to the page's root element. Until then, the editor uses it for this visit:"),Yn(s.urn),c("p","hint",'Next: create the items this page shows, with "Create all" on its content.'));let a=c("button","primary","Show its items");a.type="button",a.addEventListener("click",()=>this.deps.openEntity(s.urn)),o.append(oe(a)),n.show(o),document.documentElement.setAttribute(U,s.urn)}});n.show(i.element)}async offerNewEntity(e){let{panels:t}=this.deps,n=await this.newEntityForm({title:"New entity",submitLabel:"Create entity",path:"",language:e,onCreated:i=>{let s=c("div","simple-form"),o=c("pre","snippet",i.urn),a=c("button","","Copy URN");a.type="button",a.addEventListener("click",()=>{navigator.clipboard?.writeText(i.urn).then(()=>a.textContent="Copied",()=>a.textContent="Select and copy it")});let d=c("button","","Done");d.type="button",d.addEventListener("click",()=>l.close()),s.append(c("div","title",`Created ${j(i.name)} (${i.language}) in draft`),c("p","hint","Choose it in a reference item, or use its URN in the site:"),o,oe(a,d));let l=t.show(s)}});t.show(n.element)}async newEntityForm(e){let{transport:t}=this.deps,n=await this.owners(),i=new _(e.title,[{key:"name",label:e.pathLabel??"Path, such as /menu",value:e.path},{key:"language",label:"Language",value:e.language},{key:"variant",label:"Variant (optional)",value:e.variant??""},...n.length>1?[{key:"owner",label:"Owner",value:n[0].urn,options:n.map(s=>({value:s.urn,label:s.name??s.urn}))}]:[]],e.submitLabel,s=>{let o=s.owner??n[0]?.urn,a=s.name??"",d=s.language??"",l=s.variant??"";if(!o)return i.setError("No company was found to own the content.");if(!a.startsWith("/"))return i.setError("The path must start with /, like /menu.");if(wt(a))return i.setError(`Content has no index: give it a name of its own, without a trailing /, such as ${We(a)}.`);if(!d)return i.setError("Enter a language, such as en-GB.");i.setError(""),i.setBusy(!0,"Creating\u2026"),this.existing(a,d,l).then(u=>{if(u){i.setBusy(!1),i.setError(`${a} (${d}${l?` \xB7 ${l}`:""}) already exists.`);return}return t.createEntity({owner:{urn:o},status:"DRAFT_UNPUBLISHED",name:a,language:d,variant:l}).then(h=>{this.deps.created(h),e.onCreated(h)})}).catch(u=>{i.setBusy(!1),i.setError(ie(u,"create the entity").message)})},e.onCancel);return e.hint&&i.element.insertBefore(c("p","hint",e.hint),i.element.querySelector("label")),i}async existing(e,t,n){try{let i=await this.deps.transport.entityView(e,{version:"LATEST",language:t,variant:n});return j(i.name)===e&&i.language.toLowerCase()===t.toLowerCase()&&(i.variant??"")===n?i:void 0}catch(i){if(R(i)&&i.isNotFound)return;throw i}}offerNewPageLike(e){let{transport:t,panels:n,store:i,context:s}=this.deps,o=i.view(e);if(!o)return;let a=new _("New page like this",[{key:"name",label:"Path of the new page",value:j(o.raw.name)},{key:"language",label:"Language, such as fr-FR",value:o.language,required:!0},{key:"variant",label:"Variant (optional, empty for the default)",value:o.variant??""}],"Create page",d=>{let l=d.name??"",u=d.language??"",h=d.variant??"",f=o.raw.owner?.urn??s.company?.urn;if(!l.startsWith("/"))return a.setError("The path must start with /, like /blog/new-post.");if(wt(l))return a.setError(`Content has no index: give it a name of its own, without a trailing /, such as ${We(l)}.`);if(!u)return a.setError("Enter a language, such as fr-FR.");if(!f)return a.setError("No company was found to own the content.");a.setError(""),a.setBusy(!0,"Creating\u2026"),this.existing(l,u,h).then(p=>{if(p){a.setBusy(!1),a.setError(`${l} (${u}${h?` \xB7 ${h}`:""}) already exists. Change the path, language or variant.`);return}return t.createEntity({owner:{urn:f},status:"DRAFT_UNPUBLISHED",name:l,language:u,variant:h}).then(v=>(this.deps.created(v),this.copyItems(e,v.urn,l,0,{language:u,variant:h})))}).catch(p=>{a.setBusy(!1),a.setError(ie(p,"create the page").message)})});n.show(a.element,{entityUrn:e})}async copyItems(e,t,n,i,s){let{transport:o,panels:a,store:d,registry:l}=this.deps,u=d.view(e),f=s&&(s.language.toLowerCase()!==u.language.toLowerCase()||s.variant!==(u.variant??""))?`${n} (${s.language}${s.variant?` \xB7 ${s.variant}`:""})`:n,p=l.flatMap(y=>(u.raw[y.entityArray]??[]).map(x=>[y,x])),v=c("p","hint");v.setAttribute("role","status");let m=c("div","simple-form");m.append(c("div","title",`Creating ${f}`),v),a.show(m,{entityUrn:e});for(let y=i;y<p.length;y+=1){let[x,b]=p[y];v.textContent=`Copying item ${y+1} of ${p.length}\u2026`;try{let k=x.renderedByView?M(x,await o.read(x,b.urn)):M(x,b),A={name:b.name,sortOrder:b.sortOrder};await o.create(x,Y(x,A,k,t))}catch(k){v.textContent=`Copied ${y} of ${p.length}. ${ie(k,`copy ${b.name}`).message}`;let A=c("button","primary","Copy the rest");A.type="button",A.addEventListener("click",()=>{this.copyItems(e,t,n,y,s)}),m.append(oe(A));return}}let g=c("a","",`Open ${n}`);g.href=n,v.textContent=`Created ${f} in draft with ${p.length} items. Images need their files uploaded again. A site built ahead of time shows the page after its next build.`,m.append(oe(g))}async owners(){let e=this.deps.context.company?[this.deps.context.company]:[];try{let t=await this.deps.transport.companies(),n=this.deps.context.company?.urn;return t.length>0?[...t].sort((i,s)=>i.urn===n?-1:s.urn===n?1:0):e}catch{return e}}};function Yn(r){let e=c("div","simple-form"),t=c("pre","snippet",`<html data-entity-urn="${r}">`),n=c("button","","Copy");return n.type="button",n.addEventListener("click",()=>{navigator.clipboard?.writeText(`data-entity-urn="${r}"`).then(()=>n.textContent="Copied",()=>n.textContent="Select and copy it")}),e.append(t,oe(n)),e}function oe(...r){let e=c("div","actions");return e.append(...r),e}function Jn(r,e,t){let n=c("p","hint",e.note??"");n.setAttribute("role","status");let i=[n];for(let d of e.blockers)i.push(c("p","error",d));for(let d of e.warnings)i.push(c("p","issues",d));let s=c("ul","rows");s.setAttribute("aria-label","Changes that will go live");for(let d of e.changes){let l=c("li","row history-row"),u=c("div","row-main"),h=d.select?c("button","row-name link",d.name):c("span","row-name",d.name);h instanceof HTMLButtonElement&&(h.type="button",I(h,"Show its history"),h.addEventListener("click",()=>d.select?.())),u.append(h,c("span","meta",` #${d.sortOrder} \xB7 ${d.type}`),c("span",`status status-${d.kind==="changed"?"unpublished-changes":"note"}`,d.kind),...(d.notes??[]).map(f=>c("span","status note move",f))),l.append(u,pe(d.change)),s.append(l)}e.changes.length===0&&i.push(c("p","hint","Nothing has changed since the last publish.")),i.push(s);let o=c("div","actions");if(t.schedule){let d=t.schedule,l=c("button","","Schedule\u2026");l.type="button",I(l,"Publish at a later time"),l.disabled=e.blockers.length>0,l.addEventListener("click",()=>d()),o.append(l)}let a=c("button","primary",e.confirmLabel);a.type="button",a.disabled=e.blockers.length>0,a.addEventListener("click",()=>t.confirm(a)),o.append(a),i.push(o),r.replaceChildren(...i)}function Zn(r,e,t,n){let i=c("p","hint","The content goes live by itself at this time. Until then it stays a draft, and you can cancel the schedule."),s=c("label","field"),o=c("input");o.type="datetime-local",s.append(c("span","caption","Publish at (your local time)"),o);let a=c("div","actions"),d=c("button","","Cancel");d.type="button",d.addEventListener("click",n);let l=c("button","primary",e);l.type="button",l.disabled=!0,o.addEventListener("input",()=>l.disabled=!o.value),l.addEventListener("click",()=>t(o.value,l)),a.append(d,l),r.replaceChildren(i,s,a)}var Xn=[1,2,4,8,15],Je=class{ctx;stack;hooks;reviewing;view;tracked=new Map;stuckAfterMs;active=!1;constructor(e,t,n,i,s){this.ctx=e,this.view=t,this.stuckAfterMs=n,this.stack=i,this.hooks=s,window.addEventListener("focus",()=>{this.refreshAll()}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&this.refreshAll()})}start(){this.active=!0,this.render()}stop(){this.active=!1;for(let e of this.tracked.values())clearTimeout(e.timer);this.tracked.clear(),this.reviewing=void 0,this.ctx.toolbar.setLifecycle([])}changed(){if(this.active){for(let e of this.ctx.store.entities()){let t=this.ctx.store.view(e)?.status;t&&this.observe(e,t)}this.render()}}async refreshAll(){this.active&&await Promise.all(this.ctx.store.entities().map(e=>this.refreshStatus(e)))}async refreshStatus(e){try{let t=await this.ctx.transport.readEntity(e);this.observe(e,t.status,t.publishTimestamp??void 0),this.render()}catch(t){this.ctx.feedback.report(t,"check the publishing status",()=>{this.refreshStatus(e)})}}observe(e,t,n){let i=this.ctx.store.view(e);if(i){let d=i.raw;d.status=t,n!==void 0&&(d.publishTimestamp=n)}let s=this.tracked.get(e),o=s?.status,a=s??{status:t,attempt:0};a.status=t,t==="PUBLISH"?(a.publishingSince??=Date.now(),this.poll(e,a)):(clearTimeout(a.timer),delete a.timer,delete a.publishingSince,a.attempt=0),this.tracked.set(e,a),o!==void 0&&o!==t&&(Cn({entityUrn:e,status:t,previous:o}),o==="PUBLISH"&&S(t)&&this.published(e))}published(e){In(e),this.ctx.announcePublished(e,`${this.ctx.entityTitle(e)} is published.`,{quiet:!0}),this.view.refresh(e)}poll(e,t){if(t.timer)return;let n=Xn[Math.min(t.attempt,Xn.length-1)];t.attempt+=1,t.timer=setTimeout(()=>{delete t.timer,this.active&&this.refreshStatus(e)},n*1e3)}render(){if(!this.active)return;let e=te(this.ctx.store,this.ctx.store.entities()).map(t=>this.row(t));this.ctx.toolbar.setLifecycle(e)}row(e){let{canPublish:t}=this.ctx,n=this.ctx.store.view(e),i=this.tracked.get(e)?.status??n?.status,s=this.ctx.entityTitle(e),o=t?"Publish\u2026":"Request approval\u2026",a=t?"Review and publish\u2026":"Request approval\u2026",d={entityUrn:e,title:s,label:le(i),verbs:[]};switch(i){case"DRAFT_UNPUBLISHED":d.verbs.push({label:o,primary:!0,run:()=>{this.openReview(e)}});break;case"PUBLISH_PENDING":{let l=n?.raw.publishTimestamp;l&&(d.label=`Scheduled for ${new Date(C(l)).toLocaleString()}`),t&&d.verbs.push({label:"Cancel schedule",run:()=>this.confirmDraft(e,"Cancel the schedule?")});break}case"PUBLISH":{let l=this.tracked.get(e)?.publishingSince??Date.now();Date.now()-l>this.stuckAfterMs&&(d.note="Publishing is taking longer than expected. Publishing again is safe; if that does not help, contact support.",t&&d.verbs.push({label:"Publish again",run:()=>{this.setStatus(e,"PUBLISH",void 0)}}));break}case"PUBLISHED_WITH_DRAFTS":d.verbs.push({label:a,primary:!0,run:()=>{this.openReview(e)}}),t&&d.verbs.push({label:"Unpublish",run:()=>this.confirmDraft(e,"Unpublish this content?")});break;case"PUBLISHED":t&&d.verbs.push({label:"Unpublish",run:()=>this.confirmDraft(e,"Unpublish this content?")});break;default:break}return d}confirmDraft(e,t){this.hooks.show(Ve({id:`draft:${e}`,title:t,meta:this.ctx.entityTitle(e),blocks:[],description:"The content stays in Baack but is no longer public. You can publish it again, now or at a later time.",choices:[{label:"Cancel",run:()=>this.stack.pop()},{label:"Back to draft",primary:!0,run:n=>{n.disabled=!0,this.setStatus(e,"DRAFT_UNPUBLISHED",void 0).then(i=>{i?this.stack.popTo(`entity:${e}`):n.disabled=!1})}}]}),e)}async openReview(e,t){let{store:n,views:i,canPublish:s}=this.ctx,o=n.view(e)?.status;if(o==="PUBLISH")return;let a;try{a=await i.read(e)}catch{a=void 0}let d=n.view(e).raw,l=Qn(d,this.ctx.registry),u=await this.changes(e,d,a),{blockers:h,warnings:f}=await this.checks(d),p=`review:${e}`,v=`${u.length} ${u.length===1?"change":"changes"}`,m=this.reviewing?.id===p&&this.stack.path.includes(p)?this.reviewing:void 0,g=m?.body??c("div","level-review");if(Jn(g,{changes:u,blockers:h,warnings:f,confirmLabel:s?`Publish ${v}`:"Request approval",...t?{note:t}:{}},{confirm:x=>{this.confirm(e,l,u,void 0,x)},...s&&o==="DRAFT_UNPUBLISHED"?{schedule:()=>this.stack.push(this.scheduleLevel(e,l,u,`Schedule ${v}`))}:{}}),m){this.stack.popTo(p);return}this.reviewing={entityUrn:e,id:p,body:g};let y=this.ctx.entityTitle(e).replace(/^Content for /,"");this.hooks.show({id:p,title:`${s?"Review and publish":"Request approval for"} ${y}`,render:()=>g,dispose:()=>{this.reviewing?.body===g&&(this.reviewing=void 0)}},e)}scheduleLevel(e,t,n,i){let s=c("div","level-schedule");return Zn(s,i,(o,a)=>{this.confirm(e,t,n,o,a)},()=>this.stack.pop()),{id:`schedule:${e}`,title:"Schedule the publish",render:()=>s}}async confirm(e,t,n,i,s){let{views:o,feedback:a,canPublish:d}=this.ctx;s.disabled=!0;try{let l=await o.read(e,{version:"LATEST"}),u=Qn(l,this.ctx.registry);if(u.size!==t.size||[...u].some(h=>!t.has(h))){await this.view.refresh(e),await this.openReview(e,"The content changed while you were reviewing. Check the list again before publishing.");return}if(d){let h=i?new Date(i).toISOString().replace("Z",""):void 0;if(!await this.setStatus(e,"PUBLISH",h)){s.disabled=!1;return}}else await this.requestApproval(e,n);this.stack.popTo(`entity:${e}`)}catch(l){s.disabled=!1,a.report(l,d?"publish":"request approval",()=>{this.confirm(e,t,n,i,s)})}}async setStatus(e,t,n){let{transport:i,feedback:s}=this.ctx;try{let o=await i.readEntity(e),a=await i.updateEntity(e,{owner:{urn:o.owner.urn},name:o.name,language:o.language,variant:o.variant??"",status:t,...n?{publishTimestamp:n}:{}}),d=this.tracked.get(e)?.status;return this.observe(e,a.status,a.publishTimestamp??void 0),t==="PUBLISH"&&d!=="PUBLISH"&&S(a.status)&&(a.status==="PUBLISHED"?this.published(e):(this.ctx.announcePublished(e,`${this.ctx.entityTitle(e)} was published, but some changes are still not live.`,{info:!1}),this.view.refresh(e))),this.render(),t==="DRAFT_UNPUBLISHED"&&await this.view.refresh(e),!0}catch(o){return s.report(o,t==="PUBLISH"?"publish":"move the content back to draft",()=>{this.setStatus(e,t,n)}),!1}}async requestApproval(e,t){let{transport:n,store:i,toolbar:s}=this.ctx,a=i.view(e).raw.owner?.urn,d=this.ctx.entityTitle(e).replace(/^Content for /,""),l=t.map(h=>`- ${h.name} #${h.sortOrder} (${h.type}): ${h.kind}`),u=await n.createTask({...a?{owner:{urn:a}}:{},title:`Review and publish ${d}`,description:[`Page: ${location.href}`,`Entity: ${e}`,"","Changes:",...l].join(`
|
|
13
|
-
`),status:"PENDING",priority:"MEDIUM",associatedEntities:[{urn:e}]});s.showMessage(`Approval requested (task ${u.urn?.slice(0,8)??""}).`,!0)}async changes(e,t,n){let i=(o,a)=>()=>a.urn?this.ctx.hooks.openHistory({entityUrn:e,entry:o,name:a.name,sortOrder:a.sortOrder,urn:a.urn}):void 0,s=[];for(let o of this.ctx.registry){let a=t[o.entityArray]??[],d=n?.[o.entityArray]??[],l=new Map(d.map(m=>[m.urn,m])),u=m=>`${m.name}#${m.sortOrder}`,h=new Map(d.map(m=>[u(m),m])),f=a.filter(m=>!l.has(m.urn)),p=await Promise.all(f.map(m=>this.liveVersionOf(o,m,l,h.get(u(m))))),v=new Set(a.filter(m=>l.has(m.urn)).map(m=>m.urn));f.forEach((m,g)=>{let y=p[g];y&&v.add(y.urn);let x=y?Wi(y,m):[],b=!y||!ye(o,M(o,y),M(o,m));s.push({name:m.name,sortOrder:m.sortOrder,type:o.label,kind:y?"changed":"new",change:b?ei(o,y,m):qi(x.join("; ")),...b&&x.length>0?{notes:x}:{},select:i(o,m)})});for(let m of d)!v.has(m.urn)&&!a.some(g=>u(g)===u(m))&&s.push({name:m.name,sortOrder:m.sortOrder,type:o.label,kind:"removed",change:ei(o,m,void 0)})}return s}async liveVersionOf(e,t,n,i){try{let{history:s,pagination:o}=await this.ctx.transport.history(e,t.urn),a=s.find(d=>n.has(d.urn));return a?n.get(a.urn):o?.isMorePages?i:void 0}catch{return i}}async checks(e){let t=(e.images??[]).flatMap(i=>Et(i,this.ctx.requiredImageSlots).map(s=>`${i.name} #${i.sortOrder} has no ${s==="DEFAULT"?"image":s.toLowerCase()} file. Upload one before publishing.`)),n=[];for(let i of e.references??[]){let s=i.entityReference?.urn;if(s)try{let o=await this.ctx.transport.readEntity(s);(o.status==="DRAFT_UNPUBLISHED"||o.status==="PUBLISHED_WITH_DRAFTS")&&n.push(`${i.name} refers to content that ${o.status==="DRAFT_UNPUBLISHED"?"is not published":"has unpublished changes"} (${o.name}).`)}catch{n.push(`${i.name} refers to content that could not be checked.`)}}return{blockers:t,warnings:n}}};function Et(r,e){let t={DEFAULT:"src",MEDIUM:"mediumSrc",LARGE:"largeSrc"};return e.filter(n=>!r[t[n]])}function Qn(r,e){let t=new Set;for(let n of e)for(let i of r[n.entityArray]??[])i.urn&&t.add(i.urn);return t}function ei(r,e,t){let n=o=>{let a=o?.value;if(typeof a=="string")return r.renderedByView?new DOMParser().parseFromString(a,"text/html").body.textContent??"":a},i=n(e),s=n(t);return i!==void 0||s!==void 0?Re(i??"",s??""):e?t?De(r,e,t):`Removed: ${F(r,e)}`:F(r,t)}var qi=r=>r.charAt(0).toUpperCase()+r.slice(1);function Wi(r,e){let t=[];r.name!==e.name&&t.push(`renamed from ${r.name}`);let n=e.sortOrder-r.sortOrder;return n!==0&&t.push(`moved #${r.sortOrder} \u2192 #${e.sortOrder} (${n>0?"+":"\u2212"}${Math.abs(n)})`),t}var Ze=class{stack;onOpen;constructor(e,t,n=()=>{}){this.onOpen=t,this.stack=new Ue(e),this.stack.element.classList.add("outline"),this.stack.onClose(n)}get element(){return this.stack.element}get isOpen(){return this.stack.isOpen}open(){this.stack.open(),this.onOpen()}close(){this.stack.close()}focusFilter(){this.element.querySelector('.stack-level:not([hidden]) input[type="search"]')?.focus()}renderSection(e,t){let n=e.querySelector('input[type="search"]')?.value??"",i=[];if(t.subtitle||t.verbs?.length){let o=c("div","level-lifecycle");if(o.setAttribute("role","group"),o.setAttribute("aria-label","Lifecycle"),t.subtitle&&o.append(c("p","section-status lifecycle-status",t.subtitle)),t.note&&o.append(c("p","message",t.note)),t.verbs?.length){let a=c("div","actions");a.append(...t.verbs.map(d=>this.button(d))),o.append(a)}i.push(o)}let s=c("input");s.type="search",s.placeholder="Filter by name or type",s.setAttribute("aria-label","Filter items"),s.value=n,s.addEventListener("input",()=>ti(e,s.value)),i.push(s);for(let o of t.groups){if(o.rows.length===0)continue;let a=c("div","outline-group"),d=c("div","group-heading");d.append(c("span","group-label",`${o.label} (${o.rows.length})`)),o.action&&d.append(this.button(o.action)),a.append(d),o.hint&&a.append(c("p","group-hint",o.hint));let l=c("ul","rows");l.setAttribute("aria-label",o.label),l.append(...o.rows.map(u=>this.row(u))),a.append(l),i.push(a)}if(t.actions.length>0){let o=c("div","actions");o.append(...t.actions.map(a=>this.button(a))),i.push(o)}e.replaceChildren(...i),ti(e,n),e.querySelector("li.row.current")?.scrollIntoView({block:"nearest"})}row(e){let t=c("li",e.current?"row current":"row");e.current&&t.setAttribute("aria-current","true"),t.dataset.filter=`${e.name} ${e.type}`.toLowerCase();let n=c(e.select?"button":"div","row-main");n instanceof HTMLButtonElement&&(n.type="button",n.dataset.row="",n.addEventListener("click",()=>e.select?.(t))),n.append(c("span","row-name",e.name),c("span","meta",` #${e.sortOrder} \xB7 ${e.type}`),...e.status?[c("span",`status status-${e.status.replace(/\s+/g,"-")}`,e.status)]:[],...(e.notes??[]).map(i=>c("span","status note",i))),t.append(n);for(let i of e.flags)t.append(c("span","flag",i));e.action&&t.append(this.button(e.action));for(let i of e.actions??[])t.append(this.button(i));return t}button(e){let t=T(e.label,W(e),"sm");return e.disabled&&(t.disabled=!0,t.title=e.disabled),t.addEventListener("click",()=>e.run(t)),t}};function ti(r,e){let t=e.trim().toLowerCase();for(let n of r.querySelectorAll("li.row"))n.hidden=t!==""&&!n.dataset.filter.includes(t)}var Yi=/<\/?[a-z!][^>]*>/i,Xe=class{outline;ctx;view;editing;saving;onboarding;live=new Map;focus;selected;levels=new Map;closed;panels=0;newEntity;constructor(e,t,n,i,s){this.ctx=e,this.view=t,this.editing=n,this.saving=i,this.onboarding=s,this.outline=new Ze(e.host,()=>{this.outline.stack.path.length===0?this.openAt(ee(e.store),{focus:!1}):this.render()},()=>{this.focus=void 0,this.selected=void 0,this.closed?.()})}onClose(e){this.closed=e}changed(e){e&&this.live.delete(e),this.outline.isOpen&&this.render()}clear(){this.outline.close(),this.outline.stack.reset([]),this.levels.clear(),this.live.clear(),this.focus=void 0}setNewEntity(e){this.newEntity=e,this.outline.isOpen&&this.render()}toggle(){this.outline.isOpen?this.outline.close():this.outline.open()}openEntity(e){this.selected=void 0,this.focus=void 0,this.openAt(e)}selectItem(e){this.focus=void 0,this.selected={entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder},this.openAt(e.entityUrn)}focusSlot(e){this.focus={entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder},this.openAt(e.entityUrn,{slots:!0})}showAbove(e,t){let{stack:n}=this.outline,i=[`entity:${e}`,`review:${e}`];if(this.outline.isOpen&&i.includes(n.current?.id??"")){n.push(t);return}this.focus=void 0,this.selected=void 0,this.openAt(e,{above:t})}showPanel(e,t={}){let{stack:n}=this.outline,i=e.querySelector(":scope > .title"),s=t.title??i?.textContent??"Editor";t.title||i?.remove(),this.panels+=1;let o=`panel:${this.panels}`,a=!0,d={id:o,title:s,render:()=>e,dispose:()=>{a=!1,t.onLeave?.()}},l={get isOpen(){return a},close:()=>{let f=n.path,p=f.indexOf(o);p>0&&n.popTo(f[p-1])}};e.addEventListener("cancel",()=>l.close());let u=t.focus??!0,h=this.outline.isOpen&&n.path.length>0;return h&&n.current?.id.startsWith("panel:")?n.replace(d,{focus:u}):h&&(!t.entityUrn||n.path.includes(`entity:${t.entityUrn}`))?n.push(d,{focus:u}):(this.focus=void 0,this.selected=void 0,this.openAt(t.entityUrn,{above:d,focus:u})),l}openAt(e,{slots:t=!1,focus:n=!0,above:i=void 0}={}){let s=[this.pageLevel()];e&&this.ctx.store.view(e)&&s.push(this.entityLevel(e)),t&&this.focus&&s.push(this.slotsLevel(this.focus)),i&&s.push(i),this.outline.stack.reset(s,{focus:n}),this.outline.open(),this.render()}async render(){this.outline.isOpen&&await Promise.all(this.outline.stack.path.map(e=>this.levels.get(e)?.refresh()))}remember(e,t,n){return this.levels.set(e.id,{level:e,body:t,refresh:n}),e}pageLevel(){let e=c("div","level-page"),t={id:"page",title:"This page",render:()=>e};return this.remember(t,e,()=>{let{store:n,toolbar:i}=this.ctx,s=te(n,n.entities()),o=s.map(a=>Nn(this.ctx.entityTitle(a),i.lifecycleOf(a)?.label??le(n.view(a)?.status),()=>this.outline.stack.push(this.entityLevel(a))));if(s.length===0&&o.push(c("p","hint","No content has loaded for this page.")),this.newEntity){let a=this.newEntity,d=c("button","","New entity\u2026");d.type="button",I(d,"Create an entity, such as a menu shared by many pages"),d.addEventListener("click",()=>a());let l=c("div","actions");l.append(d),o.push(l)}e.replaceChildren(...o)})}entityLevel(e){let t=`entity:${e}`,n=this.levels.get(t);if(n)return n.level;let i=c("div","level-entity"),s={id:t,title:this.ctx.entityTitle(e),render:()=>i,onShow:()=>{this.render()}};return this.remember(s,i,async()=>{if(!this.ctx.store.view(e))return;let o=await this.section(e,e===ee(this.ctx.store));this.outline.stack.path.includes(t)&&this.outline.renderSection(i,o)})}togglePending(){if(this.outline.isOpen&&this.outline.stack.current?.id==="unsaved"){this.outline.close();return}this.focus=void 0,this.selected=void 0,this.outline.stack.reset([this.pageLevel(),this.pendingLevel()]),this.outline.open()}pendingLevel(){let e=c("div","level-unsaved"),t={id:"unsaved",title:"Unsaved changes",render:()=>e};return this.remember(t,e,()=>e.replaceChildren(...this.ctx.toolbar.pendingSections()))}slotsLevel(e){let t=c("div","level-slots"),n={id:"slots",title:`Slots for ${e.name}`,render:()=>t};return this.remember(n,t,()=>{!this.focus||!this.ctx.store.view(this.focus.entityUrn)||this.outline.renderSection(t,this.slotsSection(this.focus))})}slotsSection(e){let{store:t,hooks:n}=this.ctx,{entityUrn:i,entry:s,name:o}=e,a=(t.view(i).raw[s.entityArray]??[]).filter(h=>h.name===o&&h.urn).sort((h,f)=>h.sortOrder-f.sortOrder),d=a.find(h=>h.sortOrder===e.sortOrder),l=async h=>{d&&await n.moveSlot(e,d,h)&&(this.focus={...e,sortOrder:h},this.render())},u=a.map(h=>h===d?{name:o,sortOrder:h.sortOrder,type:s.label,status:"moving",flags:[],current:!0,actions:[{label:"Rename\u2026",run:()=>n.rename(e,h)}]}:{name:o,sortOrder:h.sortOrder,type:s.label,status:"",flags:[],...d?{actions:[{label:`Swap with #${d.sortOrder}`,run:()=>{l(h.sortOrder)}}]}:{}});if(d){let h=new Set(a.map(m=>m.sortOrder)),f=a[0]?.sortOrder??0,p=a.at(-1)?.sortOrder??0,v=Array.from({length:Math.max(0,p-f)},(m,g)=>f+g).filter(m=>!h.has(m));for(let m of[...v.length<=5?v:[],p+1])u.push({name:o,sortOrder:m,type:s.label,status:"empty",flags:[],actions:[{label:"Move here",run:()=>{l(m)}}]});u.sort((m,g)=>m.sortOrder-g.sortOrder)}return{subtitle:d?`Moving ${o} #${d.sortOrder}. Swap it with another, move it to a free sort order, or rename it.`:`${o} #${e.sortOrder} is no longer here.`,groups:[{label:`Slots for ${o}`,rows:u}],actions:[{label:"Show all items",run:()=>{this.focus=void 0,this.outline.stack.popTo(`entity:${i}`)}}]}}async section(e,t){let{store:n,pending:i,registry:s}=this.ctx,o=n.view(e),{urns:a,found:d}=await this.counterpartUrns(e),l=this.view.mode==="live"?!this.view.draftsOnLivePage.has(e):S(o.status)||d,u=[],h=[],f=[];for(let m of s){let g=o.raw[m.entityArray]??[];for(let y of g){if(!y.urn)continue;let x={entityUrn:e,entry:m,name:y.name,sortOrder:y.sortOrder},b=this.view.bindingsAt(x),k=b.filter(q=>!q.element.closest("head")),A=g.filter(q=>q.name===y.name&&q.sortOrder===y.sortOrder).length,K=y.urn,at={name:y.name,sortOrder:y.sortOrder,type:m.label,status:i.getEdit(K)?"unsaved":l?a.has(K)?"up to date":"unpublished changes":"",flags:[...Ji(m,y,A,this.ctx.requiredImageSlots),...b.some(q=>q.element.hasAttribute("data-text-unsafe-literal"))?["the site renders this as HTML"]:[]],action:{label:"History",run:()=>this.ctx.hooks.openHistory({...x,urn:K})},...this.referenceAction(y),current:ni(this.selected,x),select:q=>{let Ot={...x,urn:K,anchor:q,binding:k[0]};k[0]&&k[0].element.scrollIntoView({block:"center"}),this.editing.open(k[0]&&k[0].element.getClientRects().length>0?Ot:{...Ot,binding:void 0})}};k.length>0?u.push(at):b.length>0||!m.component?h.push(at):f.push({...at,notes:["not used"]})}}let p=this.view.missingBindings(e).map(m=>{let g=$({entityUrn:e,type:m.entry.type,name:m.name,sortOrder:m.sortOrder});return{name:m.name,sortOrder:m.sortOrder,type:m.entry.label,status:i.getCreate(g)?"unsaved":"not in content",flags:[],current:ni(this.selected,{entityUrn:e,entry:m.entry,name:m.name,sortOrder:m.sortOrder}),action:{label:"Create",run:y=>{m.element.getClientRects().length>0&&m.element.scrollIntoView({block:"center"}),this.editing.open({entityUrn:e,entry:m.entry,name:m.name,sortOrder:m.sortOrder,anchor:y,binding:m})}}}}),v=this.ctx.toolbar.lifecycleOf(e);return{subtitle:v?.label??le(o.status),...v?.note?{note:v.note}:{},verbs:(v?.verbs??[]).map(m=>({label:m.label,run:()=>m.run(),...m.primary?{primary:!0}:{},...m.disabled?{disabled:m.disabled}:{}})),groups:[{label:"On this page",rows:u},{label:"Page settings",rows:h},{label:"Not used on this page",rows:f,hint:"In the content, but nothing on this page shows them."},{label:"In the page, not in the content",rows:p,hint:"Content items on the page that are not saved in the content yet. Each shows its placeholder until it is created.",action:{label:"Create all",run:()=>this.saving.confirmCreateAll(e,p.length)}}],actions:[{label:"Add item",run:m=>this.showAddItem(e,m)},...t?[{label:"New page like this",run:()=>this.onboarding.offerNewPageLike(e)}]:[]]}}referenceAction(e){let t=e.entityReference?.urn;return!t||!this.ctx.store.view(t)?{}:{actions:[{label:`${this.ctx.entityTitle(t)} \u203A`,run:()=>this.outline.stack.push(this.entityLevel(t))}]}}counterpartUrns(e){let t=this.live.get(e);return t||(t=this.ctx.views.read(e,this.view.mode==="live"?{version:"LATEST"}:{}).then(n=>{let i=new Set;for(let s of this.ctx.registry)for(let o of n[s.entityArray]??[])o.urn&&i.add(o.urn);return i}).then(n=>({urns:n,found:!0})).catch(()=>({urns:new Set,found:!1})),this.live.set(e,t)),t}showAddItem(e,t){let{store:n,registry:i}=this.ctx,s=new _(`Add an item to ${this.ctx.entityTitle(e)}`,[{key:"type",label:"Type",value:"text",options:i.map(a=>({value:a.type,label:a.label}))},{key:"name",label:"Name",value:""},{key:"sortOrder",label:"Sort order",value:"0"}],"Next",a=>{let d=this.ctx.entry(a.type),l=a.name??"",u=Number(a.sortOrder);if(!/^[A-Za-z0-9_-]+$/.test(l))return s.setError("Use letters, numbers, - and _ in the name.");if(!Number.isInteger(u))return s.setError("The sort order must be a whole number.");s.setBusy(!0,"Checking\u2026"),this.view.refresh(e).then(()=>{if(s.setBusy(!1),n.itemAt(e,d,l,u)){s.setError(`An item already exists at ${l} #${u}. Choose a free sort order.`);return}o.close(),this.editing.open({entityUrn:e,entry:d,name:l,sortOrder:u,anchor:t,binding:void 0})})}),o=this.ctx.panels.show(s.element,{entityUrn:e})}};function Ji(r,e,t,n){let i=[];t>1&&i.push(`${t} items share this sort order`);let s=e;if(r.type==="text"&&Yi.test(String(s.value??""))&&i.push("contains markup"),r.type==="image"){s.altText||i.push("no alt text");for(let o of Et(e,n))i.push(o==="DEFAULT"?"no image file":`no ${o.toLowerCase()} file`)}return i}function ni(r,e){return r!==void 0&&r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}var kt="A site that is built ahead of time shows it to visitors after its next build.";function xt(r){return typeof r=="string"?r:void 0}async function ii(r,e,t,n,{info:i=!0,quiet:s=!1}={}){let o=(a,d)=>s?r.announce(n,a,d):r.showMessage(a?`${n} ${a}`:n,d);if(o("",i),e!==void 0)try{let a=typeof e=="string"?e:await e(t);a&&o(a,i)}catch(a){console.error("Baack editor: the site's afterPublish callback failed",a);let d=a instanceof Error?a.message:String(a);o(`The site's after-publish step failed: ${d}`,!1)}}var Lt=50,Zi=0;function Tt(r){return`${r.path} (${r.language}${r.variant?` \xB7 ${r.variant}`:""})`}var Qe=class{element;input;value;source;onChange;listbox;status;note;createArea;id=`baack-entity-picker-${Zi+=1}`;listing;created=[];loading;options=[];active=-1;chosenLabel="";constructor(e,t,n,i){this.source=e,this.onChange=i,this.element=c("div","entity-picker"),this.input=c("input"),this.input.type="text",this.input.autocomplete="off",this.input.spellcheck=!1,this.input.placeholder="Type a path, such as /menu",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("aria-controls",`${this.id}-list`),this.value=c("input"),this.value.type="hidden",this.value.name=t,this.value.value=n,this.listbox=c("ul","entity-options"),this.listbox.id=`${this.id}-list`,this.listbox.setAttribute("role","listbox"),this.listbox.setAttribute("aria-label","Entities"),this.listbox.hidden=!0,this.status=c("p","hint"),this.status.setAttribute("role","status"),this.note=c("p","hint"),this.createArea=c("div","entity-create");let s=c("div","combobox-field");s.append(L("search"),this.input,L("chevron-down")),this.element.append(s,this.listbox,this.status,this.note,this.createArea,this.value),this.input.addEventListener("focus",()=>this.open()),this.input.addEventListener("input",()=>this.open()),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("blur",()=>{this.close(),this.input.value!==this.chosenLabel&&(this.input.value=this.chosenLabel)}),n&&this.showChosen(n)}async showChosen(e){this.chosenLabel=e,this.input.value=e;try{let t=await this.source.describe(e);if(this.value.value!==e)return;this.chosenLabel=Tt(t),this.input.value===e&&(this.input.value=this.chosenLabel)}catch(t){this.source.report(t,"show the entity referred to",()=>{this.showChosen(e)})}this.showNote(e)}async showNote(e){try{let t=await this.source.note(e);this.value.value===e&&(this.note.textContent=t)}catch(t){this.source.report(t,"check the entity referred to",()=>{this.showNote(e)})}}open(){this.listbox.hidden=!1,this.input.setAttribute("aria-expanded","true"),this.loading??=this.source.list(e=>{this.listing=e,this.render()}).then(e=>{this.listing=e,this.render()}).catch(e=>{this.loading=void 0,this.status.textContent="The list of entities could not be loaded.",this.source.report(e,"list the entities",()=>this.open())}),this.render()}close(){this.listbox.hidden=!0,this.input.setAttribute("aria-expanded","false"),this.input.removeAttribute("aria-activedescendant"),this.active=-1}render(){if(this.listbox.hidden)return;let e=this.input.value===this.chosenLabel?"":this.input.value.trim().toLowerCase(),t=this.listing?.entities??[],n=[...t,...this.created.filter(d=>!t.some(l=>l.urn===d.urn))].filter(d=>!e||Tt(d).toLowerCase().includes(e)).sort((d,l)=>d.path===l.path?+(l.language===this.source.language)-+(d.language===this.source.language):0);this.options=n.slice(0,Lt).map(d=>{let l=c("li","entity-option");l.append(c("span","",d.path),c("span","meta",` ${d.language}${d.variant?` \xB7 ${d.variant}`:""}`));let u=d.urn===this.value.value;return l.setAttribute("aria-selected",String(u)),u&&l.append(L("check")),{element:l,choose:()=>this.choose(d)}});let i=this.input.value.trim(),s=e&&i.startsWith("/")?i:e?`/${i}`:"",o=c("li","entity-option create",s?`Create a new entity "${s}"\u2026`:"Create a new entity\u2026");o.prepend(L("plus")),this.options.push({element:o,choose:()=>{this.create(s)}}),this.options.forEach((d,l)=>{d.element.id=`${this.id}-option-${l}`,d.element.setAttribute("role","option"),d.element.addEventListener("mousedown",u=>u.preventDefault()),d.element.addEventListener("click",()=>d.choose())}),this.listbox.replaceChildren(...this.options.map(d=>d.element)),this.setActive(Math.min(this.active,this.options.length-1));let a=t.length+this.created.length;this.status.textContent=this.listing?[n.length>Lt?`Showing ${Lt} of ${n.length}; type to narrow.`:"",this.listing.complete?"":"The search was still running, so some entities may be missing.",a===0?"No entities found.":""].filter(Boolean).join(" "):"Loading entities\u2026"}setActive(e){this.active=e,this.options.forEach((n,i)=>n.element.classList.toggle("active",i===e));let t=this.options[e];t?(this.input.setAttribute("aria-activedescendant",t.element.id),t.element.scrollIntoView({block:"nearest"})):this.input.removeAttribute("aria-activedescendant")}choose(e){this.value.value=e.urn,this.chosenLabel=Tt(e),this.input.value=this.chosenLabel,this.note.textContent="",this.close(),this.onChange(),this.showNote(e.urn)}async create(e){this.close(),this.input.disabled=!0;try{let t=await this.source.create(this.createArea,e);t&&(this.created.push(t),this.choose(t))}finally{this.createArea.replaceChildren(),this.input.disabled=!1,this.input.focus()}}onKeyDown=e=>{let t=!this.listbox.hidden;if(e.key==="ArrowDown"||e.key==="ArrowUp"){e.preventDefault(),t||this.open();let n=e.key==="ArrowDown"?1:-1;this.setActive((this.active+n+this.options.length)%this.options.length)}else e.key==="Enter"&&t&&this.active>=0&&!(e.metaKey||e.ctrlKey)?(e.preventDefault(),e.stopPropagation(),this.options[this.active]?.choose()):e.key==="Escape"&&t&&(e.preventDefault(),e.stopPropagation(),this.close())}};var Xi=0,et=class{trigger;items;menu;constructor(e,t){this.trigger=e,this.items=t,e.id||=`baack-menu-trigger-${++Xi}`,e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded","false"),e.addEventListener("mousedown",n=>n.preventDefault()),e.addEventListener("click",n=>this.menu?this.close(!0):this.open(n.detail===0?"first":void 0)),e.addEventListener("keydown",n=>{(n.key==="ArrowDown"||n.key==="ArrowUp")&&(n.preventDefault(),this.open(n.key==="ArrowDown"?"first":"last"))})}get isOpen(){return this.menu!==void 0}open(e){this.close(!1);let t=c("div","menu");t.setAttribute("role","menu"),t.setAttribute("aria-labelledby",this.trigger.id);for(let n of this.items()){let i=c("button",n.destructive?"menu-item destructive":"menu-item");i.type="button",i.setAttribute("role","menuitem"),i.tabIndex=-1,n.icon&&i.append(L(n.icon)),i.append(n.label),i.addEventListener("mousedown",s=>s.preventDefault()),i.addEventListener("click",()=>{this.close(i.matches(":focus")),n.run()}),t.append(i)}t.addEventListener("keydown",this.onKey),(this.trigger.closest(".panel")??this.trigger.parentElement).append(t),this.menu=t,this.trigger.setAttribute("aria-expanded","true"),this.trigger.setAttribute("aria-controls",t.id=`${this.trigger.id}-list`),this.place(),window.addEventListener("pointerdown",this.onOutside,!0),window.addEventListener("scroll",this.onScroll,!0),window.addEventListener("resize",this.onScroll),e&&this.focusAt(e==="first"?0:-1)}close(e){this.menu&&(this.menu.remove(),this.menu=void 0,this.trigger.setAttribute("aria-expanded","false"),this.trigger.removeAttribute("aria-controls"),window.removeEventListener("pointerdown",this.onOutside,!0),window.removeEventListener("scroll",this.onScroll,!0),window.removeEventListener("resize",this.onScroll),e&&this.trigger.focus())}entries(){return[...this.menu?.querySelectorAll('[role="menuitem"]')??[]]}focusAt(e){let t=this.entries(),n=t.at(e%t.length);for(let i of t)i.tabIndex=i===n?0:-1;n?.focus()}onKey=e=>{let t=this.entries(),n=t.indexOf(e.target);if(e.key==="Escape")e.preventDefault(),e.stopPropagation(),this.close(!0);else if(e.key==="Tab")e.preventDefault(),this.close(!0);else if(e.key==="ArrowDown"||e.key==="ArrowUp")e.preventDefault(),this.focusAt((n+(e.key==="ArrowDown"?1:-1)+t.length)%t.length);else if(e.key==="Home"||e.key==="End")e.preventDefault(),this.focusAt(e.key==="Home"?0:-1);else if(e.key.length===1&&/\S/.test(e.key)){let i=e.key.toLowerCase();for(let s=1;s<=t.length;s++){let o=(n+s)%t.length;if(t[o].textContent.trim().toLowerCase().startsWith(i)){this.focusAt(o);break}}}};onOutside=e=>{let t=e.composedPath();!t.includes(this.menu)&&!t.includes(this.trigger)&&this.close(!1)};onScroll=e=>{e.type==="scroll"&&this.menu&&e.composedPath().includes(this.menu)||this.close(!1)};place(){let e=this.menu,t=this.trigger.getBoundingClientRect();e.style.minWidth=`${Math.max(t.width,128)}px`;let{width:n,height:i}=e.getBoundingClientRect(),s=t.bottom+4,o=s+i<=window.innerHeight-8||t.top-i-4<8?s:t.top-i-4;e.style.top=`${Math.max(8,o)}px`,e.style.left=`${Math.min(Math.max(8,t.right-n),window.innerWidth-n-8)}px`}};var Qi=["GBP","EUR","USD","JPY","CHF","CAD","AUD","NZD","SEK","NOK","DKK","PLN","INR","CNY","BRL"],er=/Mac|iPhone|iPad/.test(navigator.userAgent),tt=class{element;title;form;description;issues;error;errorDebug;sendButton;extras;menu;buttons;choices;hint;anchor;actions;inputs=new Map;slotStatus=new Map;reposition=()=>this.place();side;onEnd;anchorObserver=new ResizeObserver(this.reposition);entities;currentValues={};constructor(e){this.element=c("div","panel popover"),this.element.setAttribute("role","dialog"),this.element.hidden=!0,this.title=c("div","title"),this.form=c("div","form"),this.description=c("p","hint"),this.issues=c("ul","issues"),this.error=c("p","error"),this.error.setAttribute("role","alert"),this.errorDebug=c("div","error-debug");let t=c("button","","Revert");t.type="button",this.sendButton=c("button","primary","Save"),this.sendButton.type="button";for(let n of[t,this.sendButton])n.addEventListener("mousedown",i=>i.preventDefault());t.addEventListener("click",()=>this.actions?.revert()),this.sendButton.addEventListener("click",()=>this.actions?.send()),this.element.addEventListener("keydown",n=>{n.key==="Escape"?(n.preventDefault(),this.actions?.revert()):n.key==="Enter"&&(n.metaKey||n.ctrlKey)&&(n.preventDefault(),this.actions?.send())}),this.extras=c("div","extras"),this.buttons=c("div","actions"),this.buttons.append(t,this.sendButton),this.choices=c("div","actions"),this.choices.hidden=!0,this.hint=c("p","hint"),this.element.append(this.title,this.form,this.description,this.issues,this.error,this.errorDebug,this.extras,this.buttons,this.choices,this.hint),e.root.append(this.element),new ResizeObserver(()=>{this.element.hidden||(this.side=void 0,this.place())}).observe(this.element)}setEntitySource(e){this.entities=e}get isOpen(){return!this.element.hidden}show(e,t,n,i,s){this.open(e,t,n,i,s,!1),this.form.replaceChildren(),this.inputs.clear(),this.place()}showForm(e,t,n,i,s,o,a){this.open(e,t,n,`${er?"\u2318":"Ctrl"}+Enter to save \xB7 Esc to revert`,o,a),this.inputs.clear(),this.slotStatus.clear(),this.currentValues=s,this.form.replaceChildren(...i.map(d=>this.field(d,s[d.key],()=>o.input(this.values())))),this.place(),this.form.querySelector('input:not([type="hidden"]), textarea, select')?.focus()}showChoices(e,t,n,i,s,o){this.open(e,t,n,"",{send:()=>{},revert:()=>o.at(-1)?.run()},!0),this.inputs.clear(),this.form.replaceChildren(...i.map(a=>{let d=c("div","field");return d.append(c("span","caption",a.label),c("pre","snippet",a.text)),d})),this.setDescription(s),this.buttons.hidden=!0,this.choices.hidden=!1,this.choices.replaceChildren(...o.map(a=>{let d=T(a.label,W(a));return d.addEventListener("click",()=>a.run()),d})),this.place()}whenEnded(e){this.onEnd=e}ended(){let e=this.onEnd;this.onEnd=void 0,e?.()}hide(){this.ended(),this.menu?.close(!1),this.element.hidden=!0,this.anchor=void 0,this.side=void 0,this.anchorObserver.disconnect(),this.actions=void 0,window.removeEventListener("scroll",this.reposition,!0),window.removeEventListener("resize",this.reposition),window.removeEventListener("keydown",this.onWindowKey)}onWindowKey=e=>{e.key!=="Escape"||e.defaultPrevented||this.element.hidden||(e.preventDefault(),this.actions?.revert())};values(){let e={...this.currentValues};for(let[t,n]of this.inputs)n instanceof HTMLInputElement&&n.type==="file"?e[t]=n.files?.[0]?.name??"":e[t]=n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked:n.value;return e}files(){let e=new Map;for(let[t,n]of this.inputs){let i=n instanceof HTMLInputElement&&n.type==="file"?n.files?.[0]:void 0;i&&e.set(t,i)}return e}setSlotStatus(e,t,n=!1){let i=this.slotStatus.get(e);i&&(i.textContent=t,i.classList.toggle("error",n))}setValues(e){for(let[t,n]of this.inputs){let i=e[t];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=i===!0:n.type!=="file"&&(n.value=typeof i=="string"?i:"")}}setNameAction(e){let t=this.title.querySelector(".meta");if(!t||!e)return;let n=c("button","meta link",t.textContent??"");n.type="button",I(n,"Show in Items"),n.addEventListener("mousedown",i=>i.preventDefault()),n.addEventListener("click",e),t.replaceWith(n)}setExtras(e){this.menu?.close(!1),this.menu=void 0;let t=e.filter(i=>!i.menu),n=e.filter(i=>i.menu);if(this.extras.replaceChildren(...t.map(i=>{let s=T(i.label,"ghost","sm");return i.icon&&s.prepend(L(i.icon)),s.addEventListener("mousedown",o=>o.preventDefault()),s.addEventListener("click",()=>i.run()),s})),n.length>0){let i=T("","ghost","icon-sm");i.setAttribute("aria-label","More actions"),i.append(L("ellipsis")),this.extras.append(i),I(i),this.menu=new et(i,()=>n)}}setDescription(e){this.description.textContent=e}setIssues(e){this.issues.replaceChildren(...e.map(t=>c("li",t.level,t.message)))}setError(e,t){this.error.textContent=e,this.errorDebug.replaceChildren(...Z(t))}setSending(e){this.sendButton.disabled=e,this.sendButton.textContent=e?"Saving\u2026":"Save"}open(e,t,n,i,s,o){this.ended(),e!==this.anchor&&(this.side=void 0),this.anchor=e,this.anchorObserver.disconnect(),this.anchorObserver.observe(e),this.actions=s,this.title.textContent=`${t} `,this.title.append(c("span","meta",n)),this.element.setAttribute("aria-label",`Edit ${t.toLowerCase()} ${n}`),this.element.classList.toggle("wide",o),this.buttons.hidden=!1,this.choices.hidden=!0,this.setExtras([]),this.hint.textContent=i,this.setDescription(""),this.setIssues([]),this.setError(""),this.setSending(!1),this.element.hidden=!1,window.addEventListener("scroll",this.reposition,!0),window.addEventListener("resize",this.reposition),window.addEventListener("keydown",this.onWindowKey)}field(e,t,n){let i=c("label",`field ${e.kind}`),s=c("span","caption",e.label),o;if(e.kind==="file"){o=c("input"),o.type="file",o.accept="image/apng,image/avif,image/gif,image/jpeg,image/png,image/svg+xml,image/webp",o.name=e.key;let a=typeof this.currentValues[`${e.key}:current`]=="string"?this.currentValues[`${e.key}:current`]:"",d=c("div","slot-preview");if(a){let u=c("img");u.src=a,u.alt="",d.append(u,c("span","meta",a))}else d.append(c("span","meta","No file"));let l=c("span","hint");return l.setAttribute("role","status"),this.slotStatus.set(e.key,l),o.addEventListener("change",n),this.inputs.set(e.key,o),i.append(s,d,o,l),i}if(e.kind==="entity"&&this.entities){let a=c("div","field entity");s.id=`baack-field-${e.key}`;let d=new Qe(this.entities,e.key,typeof t=="string"?t:"",n);return d.input.setAttribute("aria-labelledby",s.id),this.inputs.set(e.key,d.value),a.append(s,d.element),a}if(e.kind==="textarea"||e.kind==="code")o=c("textarea"),o.rows=e.kind==="code"?12:4,o.spellcheck=e.kind!=="code";else{if(o=c("input"),o.type=e.kind==="checkbox"?"checkbox":e.kind==="datetime"?"datetime-local":e.kind==="url"?"url":"text",e.kind==="integer"&&(o.inputMode="numeric"),e.kind==="decimal"&&(o.inputMode="decimal"),e.kind==="currency"){o.maxLength=3,o.autocapitalize="characters";let a=c("datalist");a.id=`baack-currencies-${e.key}`,a.append(...Qi.map(d=>Object.assign(c("option"),{value:d}))),o.setAttribute("list",a.id),i.append(a)}e.kind==="url"&&this.entities&&i.append(this.pathSuggestions(o,e.key))}return o instanceof HTMLInputElement&&o.type==="checkbox"?(o.setAttribute("role","switch"),o.className="switch",o.checked=t===!0,i.append(o,s)):(o.value=typeof t=="string"?t:"",i.append(s,o)),o.name=e.key,o.addEventListener("input",n),o.addEventListener("change",n),this.inputs.set(e.key,o),i}pathSuggestions(e,t){let n=c("datalist");n.id=`baack-paths-${t}`,e.setAttribute("list",n.id);let i=({entities:s})=>n.replaceChildren(...[...new Set(s.map(o=>this.entities.pagePath(o.path)))].map(o=>Object.assign(c("option"),{value:o})));return e.addEventListener("focus",()=>{this.entities?.list(i).then(i,()=>{})},{once:!0}),n}place(){if(!this.anchor)return;let e=this.anchor.getBoundingClientRect();if(!this.anchor.getClientRects().length&&this.side)return;let t=this.element.offsetHeight,n=this.element.offsetWidth,i=this.anchor.closest(".panel");if(i&&i!==this.element){let a=i.getBoundingClientRect();this.element.style.left=`${Math.max(8,a.left-n-8)}px`,this.element.style.top=`${Math.max(8,Math.min(e.top,window.innerHeight-t-8))}px`;return}this.side??=e.bottom+8+t<=window.innerHeight?"below":e.top-t-8>=8?"above":"within";let s=this.side==="below"?Math.max(8,e.bottom+8):this.side==="above"?Math.min(e.top-t-8,window.innerHeight-t-8):Math.max(8,Math.min(e.bottom+8,window.innerHeight-t-8)),o=Math.max(8,Math.min(e.left,window.innerWidth-n-8));this.element.style.top=`${s}px`,this.element.style.left=`${o}px`}};var nt=class{modeButton;itemsButton;readButton;pendingButton;message;messageAction;runMessageAction;messageDebug;entities;lifecycleRows=[];pendingGroups=[];openPending;pendingListeners=[];openEntity;lifecycleListeners=[];login;loginFrame;loginText;pendingActions;constructor(e,t,n){this.pendingActions=n,this.modeButton=Ct(e);let i=this.modeButton.closest(".toolbar"),s=this.modeButton.parentElement;this.itemsButton=c("button","","Items"),this.itemsButton.type="button",I(this.itemsButton,"Every item on this page (Alt+Shift+I)"),this.itemsButton.hidden=!0,this.pendingButton=c("button","pending"),this.pendingButton.type="button",this.pendingButton.hidden=!0,I(this.pendingButton,"Show them in the sidebar, with Save all and Discard all"),this.pendingButton.addEventListener("click",()=>this.openPending?.()),this.readButton=c("button","","Show live page"),this.readButton.type="button",this.readButton.hidden=!0,s.append(this.itemsButton,this.readButton,this.pendingButton),this.message=c("p","message"),this.message.setAttribute("role","status"),this.messageAction=T("","primary","sm","message-action"),this.messageAction.hidden=!0,this.messageAction.addEventListener("click",()=>{let a=this.runMessageAction;this.showMessage(""),a?.()}),this.messageDebug=c("div","message-debug"),this.entities=c("div","entities"),this.login=c("div","login"),this.login.hidden=!0,this.loginText=c("p","message"),this.loginText.setAttribute("role","alert"),this.loginFrame=c("iframe"),this.loginFrame.title="Log in to Baack";let o=c("button","primary","I have logged in, try again");o.type="button",o.addEventListener("click",()=>{this.hideLogin(),t()}),this.login.append(this.loginText,this.loginFrame,o),i.append(this.entities,this.message,this.messageAction,this.messageDebug,this.login)}setEditMode(e){this.modeButton.disabled=!1,this.modeButton.setAttribute("aria-pressed",String(e)),this.itemsButton.hidden=!e,this.readButton.hidden=!e}setReadMode(e){this.readButton.textContent=e?"Show live page":"Show latest drafts"}setPending(e){this.pendingGroups=e;let t=e.reduce((n,i)=>n+i.rows.length,0);this.pendingButton.hidden=t===0,this.pendingButton.textContent=t===1?"1 unsaved change":`${t} unsaved changes`,this.renderEntities();for(let n of this.pendingListeners)n()}setOpenPending(e){this.openPending=e}onPending(e){this.pendingListeners.push(e)}pendingSections(){return this.pendingGroups.length===0?[c("p","hint","Nothing is unsaved.")]:[...this.pendingGroups.map(e=>this.pendingSection(e)),...this.pendingGroups.length>1?[this.actions(void 0,"everywhere")]:[]]}setOpenEntity(e){this.openEntity=e}setLifecycle(e){this.lifecycleRows=e,this.renderEntities();for(let t of this.lifecycleListeners)t()}lifecycleOf(e){return this.lifecycleRows.find(t=>t.entityUrn===e)}showsEntity(e){return this.lifecycleRows[0]?.entityUrn===e}onLifecycle(e){this.lifecycleListeners.push(e)}renderEntities(){let e=this.lifecycleRows[0];this.entities.replaceChildren(...e?[this.entityLabel(e)]:[])}entityLabel(e){let t=this.pendingGroups.find(i=>i.entityUrn===e.entityUrn)?.rows.length??0,n=c("button","entity-label");if(n.type="button",I(n,"Open in the sidebar"),n.append(c("span","title",e.title),c("span","meta",` \xB7 ${e.label}`)),t>0&&n.append(c("span","meta unsent",` \xB7 ${t} unsaved`)),n.addEventListener("click",()=>this.openEntity?.(e.entityUrn)),e.note){let i=c("div","entity");return i.append(n,c("p","message",e.note)),i}return n}pendingSection(e){let t=e.title,n=c("section","entity");n.setAttribute("aria-label",`Unsaved in ${t}`),n.append(c("div","meta",`${t}: ${e.rows.length} unsaved`));let i=c("ul","rows");for(let s of e.rows){let o=c("li",s.problem?"row problem":"row",s.label);if(o.append(c("span","meta",` \xB7 ${s.detail}`)),s.action){let a=c("button","",s.action.label);a.type="button";let d=s.action.run;a.addEventListener("click",()=>d(a)),o.append(" ",a)}i.append(o)}return n.append(i,this.actions(e.entityUrn,`in ${t}`)),n}showMessage(e,t=!1,n,i){this.message.textContent=e,this.message.classList.remove("visually-hidden"),this.message.classList.toggle("info",t),this.messageDebug.replaceChildren(...Z(n)),this.runMessageAction=i?.run,this.messageAction.textContent=i?.label??"",this.messageAction.hidden=!i}announce(e,t="",n=!0){this.showMessage(t,n),this.message.prepend(c("span","visually-hidden",t?`${e} `:e)),this.message.classList.toggle("visually-hidden",!t)}showLogin(e,t){this.loginText.textContent=e,t?(this.loginFrame.src=t,this.loginFrame.hidden=!1):(this.loginFrame.removeAttribute("src"),this.loginFrame.hidden=!0),this.login.hidden=!1}hideLogin(){this.login.hidden=!0}actions(e,t){let n=c("div","actions"),i=c("button","primary",e?"Save all":"Save everything");i.type="button",i.setAttribute("aria-label",`Save all unsaved changes ${t}`),i.addEventListener("click",()=>this.pendingActions.sendAll(e));let s=T(e?"Discard all":"Discard everything","destructive");return s.setAttribute("aria-label",`Discard all unsaved changes ${t}`),s.addEventListener("click",()=>this.pendingActions.discardAll(e)),n.append(s,i),n}};function it(r){let e=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;if(typeof document.startViewTransition!="function"||e||document.visibilityState!=="visible")return r(),Promise.resolve();let t=document.startViewTransition(r);return t.ready.catch(()=>{}),t.finished.catch(()=>{}),t.updateCallbackDone}var rt=class{ctx;hooks;snapshots=new Map;carried=new Map;orders=new Map;added=new Set;loading=new Map;editMode=!1;readMode="LATEST";session=0;previewing;previewListeners=new Set;changedThisVisit=new Set;built=new WeakMap;constructor(e,t){this.ctx=e,this.hooks=t}get isEditing(){return this.editMode}get mode(){return this.readMode}begin(e="LATEST"){this.editMode=!0,this.readMode=e,this.session+=1}readOptions(e){return e==="live"?{}:{version:e==="LATEST"?"LATEST":String(e)}}readLiveChanges(){let{store:e}=this.ctx,t=[...this.changedThisVisit].filter(n=>S(e.view(n)?.status)).flatMap(n=>e.scopesFor(n));return this.readLive(t)}async readLive(e){try{return await Promise.all(e.map(async t=>[t,await this.ctx.views.read(t)]))}catch(t){return this.ctx.feedback.report(t,"show the published content",()=>{this.readLive(e).then(n=>{this.editMode||this.showLive(n)})}),[]}}showLive(e){let{store:t,discovery:n}=this.ctx;for(let[o,a]of e)t.loadEntity(o,a);let i=new Set(e.map(([o])=>o)),s=!1;n.flush();for(let o of n.all()){if(!i.has(o.scope))continue;let a=t.itemFor(o);!a?.item.urn||o.element.getAttribute(P(o.entry))===a.item.urn||(this.recordBuilt(o),this.ctx.live.render(o,a.item),s=!0)}return t.clearEntities(),s}async leave(e){let t=!1;return await it(()=>{this.end(),t=this.showLive(e)}),t}async prefetch(e,t){let n=await Promise.all(t.map(async i=>[i,await this.readIn(i,e)]));return new Map(n)}async switchTo(e,t){let{store:n,discovery:i}=this.ctx;await it(()=>{this.end(),this.begin(e);for(let[s,o]of t)n.loadEntity(s,o.entity),o.draft&&this.draftsOnLivePage.add(o.entity.urn);i.flush();for(let s of i.all())this.show(s)}),this.hooks.changed()}get previewedUrn(){return this.previewing?.version.urn}onPreviewChange(e){this.previewListeners.add(e)}previewVersion(e,t){let n=this.previewing?.slot;this.previewing={slot:e,version:t},n&&!St(n,e)&&this.reshow(n),this.reshow(e),this.notifyPreview()}stopPreview(e){let t=this.previewing;!t||e&&!St(t.slot,e)||(this.previewing=void 0,this.reshow(t.slot),this.notifyPreview())}notifyPreview(){for(let e of this.previewListeners)e()}end(){this.previewing&&(this.previewing=void 0,this.notifyPreview()),this.editMode=!1,this.session+=1,this.ctx.live.endPreviews();for(let e of this.added)e.remove();this.added.clear(),this.restoreOrders();for(let e of[...this.snapshots.keys()])this.restore(e);for(let[e,t]of this.carried)for(let n of t.values())e.isConnected&&!G(e)&&si(e,n);this.carried.clear(),this.ctx.store.clearEntities(),this.loading.clear(),this.draftsOnLivePage.clear(),this.ctx.sources.clear()}async hydrate(e){let t=this.session,n=new Set(e.map(i=>i.scope));await Promise.all([...n].map(i=>this.loadScope(i))),t===this.session&&(await it(()=>{if(t===this.session)for(let i of e)this.ctx.discovery.of(i.element).includes(i)&&this.show(i)}),t===this.session&&this.hooks.changed())}draftsOnLivePage=new Set;async readScope(e){let{entity:t,draft:n}=await this.readIn(e,this.readMode);return n?this.draftsOnLivePage.add(t.urn):this.draftsOnLivePage.delete(t.urn),t}async readIn(e,t){let{views:n}=this.ctx;if(t!=="live")return{entity:await n.read(e,this.readOptions(t)),draft:!1};let{entity:i,live:s}=await n.readAsLive(e);return{entity:i,draft:!s}}loadScope(e){let{store:t,feedback:n,discovery:i}=this.ctx;if(t.hasScope(e))return Promise.resolve();let s=this.loading.get(e);if(!s){let o=this.session;s=this.readScope(e).then(a=>{o===this.session&&t.loadEntity(e,a)}).catch(a=>{this.loading.delete(e);let d=this.readMode==="live"?"load the live content":"load the latest content";n.report(a,d,()=>{this.hydrate(i.all())})}),this.loading.set(e,s)}return s}show(e){let{store:t,pending:n}=this.ctx,{element:i,entry:s}=e;this.snapshots.has(e)||this.snapshots.set(e,this.carriedSnapshot(i,s)??ri(i,s)),this.recordBuilt(e);let o=t.itemFor(e),a=this.previewing;if(o?.item.urn&&a&&St(a.slot,{...e,entityUrn:t.entityFor(e.scope)})){this.ctx.live.render(e,dt(s,o.item,M(s,a.version))),N(i,"previewing");return}if(o?.item.urn){let u=n.getEdit(o.item.urn),h=u&&!u.stale,f=h&&!s.renderedByView?dt(s,o.item,u.value):o.item;this.ctx.live.render(e,f),N(i,h?"changed":this.publishedSinceBuilt(e,o.item.urn)?"published":"editable");return}let d=t.entityFor(e.scope),l=d?n.getCreate($({entityUrn:d,type:s.type,name:e.name,sortOrder:e.sortOrder})):void 0;l&&!s.renderedByView?(this.ctx.live.render(e,{name:e.name,sortOrder:e.sortOrder,...l.value}),N(i,"changed")):N(i,l?"changed":"unresolved")}recordBuilt({element:e,entry:t}){let n=this.built.get(e)??new Map;n.has(t)||n.set(t,e.getAttribute(P(t))??void 0),this.built.set(e,n)}publishedSinceBuilt(e,t){if(this.readMode!=="live")return!1;let n=this.ctx.store.entityFor(e.scope);return!n||this.draftsOnLivePage.has(n)?!1:this.built.get(e.element)?.get(e.entry)!==t}countPublishedSinceBuilt(){return new Set(this.ctx.discovery.all().filter(e=>e.element.getAttribute(Te)==="published").map(e=>e.element)).size}showAll(){for(let e of this.ctx.discovery.all())this.show(e)}reshow(e){let{discovery:t,store:n}=this.ctx;for(let i of t.all()){if(i.entry!==e.entry||n.entityFor(i.scope)!==e.entityUrn)continue;let s=e.urn&&i.element.getAttribute(P(i.entry))===e.urn,o=i.name===e.name&&i.sortOrder===e.sortOrder;!s&&!o||this.hooks.editingElement()!==i.element&&this.show(i)}}forget(e){for(let t of e){if(this.hooks.editingBinding()===t&&this.hooks.closeEditor(),this.carried.get(t.element)?.has(t.entry)){this.snapshots.delete(t);continue}this.restore(t)}}retag(e,t,n=e.name){let{element:i,entry:s}=e,o=this.snapshots.get(e)??ri(i,s),a=this.carried.get(i)??new Map;a.set(s,o),this.carried.set(i,a),i.setAttribute(X(s),String(t)),i.setAttribute(`data-${s.attribute}-name`,n)}carriedSnapshot(e,t){let n=this.carried.get(e),i=n?.get(t);return i&&n.delete(t),n&&n.size===0&&this.carried.delete(e),i}rememberOrder(e){G(e)||this.orders.has(e)||this.orders.set(e,[...e.childNodes])}restoreOrder(e){let t=this.orders.get(e);t&&(e.append(...t.filter(n=>n.parentNode===e||!n.parentNode)),this.orders.delete(e))}restoreOrders(){for(let e of[...this.orders.keys()])this.restoreOrder(e)}track(e){this.added.add(e)}async refresh(e){let{store:t,feedback:n,discovery:i}=this.ctx,s=this.session,o=t.scopesFor(e);this.readMode==="LATEST"&&this.changedThisVisit.add(e);try{for(let a of o){let d=await this.readScope(a);if(s!==this.session)return;t.loadEntity(a,d)}}catch(a){n.report(a,"show the latest content",()=>{this.refresh(e)});return}for(let a of i.all())o.includes(a.scope)&&this.hooks.editingBinding()!==a&&this.show(a);this.hooks.changed(e)}bindingsAt(e){return this.ctx.discovery.all().filter(t=>t.entry===e.entry&&t.name===e.name&&t.sortOrder===e.sortOrder&&this.ctx.store.entityFor(t.scope)===e.entityUrn)}missingBindings(e){let{store:t,discovery:n}=this.ctx,i=new Set;return n.all().filter(s=>{if(t.entityFor(s.scope)!==e||t.itemAt(e,s.entry,s.name,s.sortOrder))return!1;let o=$({entityUrn:e,type:s.entry.type,name:s.name,sortOrder:s.sortOrder});return i.has(o)?!1:(i.add(o),!0)})}restore(e){let t=this.snapshots.get(e);if(this.snapshots.delete(e),Bt(e.element),this.ctx.live.restore(e)){let n=P(e.entry),i=t?.attributes.find(([s])=>s===n)?.[1];i?e.element.setAttribute(n,i):e.element.removeAttribute(n);return}t&&e.element.isConnected&&si(e.element,t)}};function ri(r,e){let t=e.component?.(r).ownsChildren??!0;return{attributes:[...r.attributes].map(n=>[n.name,n.value]),children:t?[...r.childNodes].map(n=>n.cloneNode(!0)):void 0}}function si(r,e){let t=new Set(e.attributes.map(([n])=>n));for(let n of[...r.attributes])t.has(n.name)||r.removeAttribute(n.name);for(let[n,i]of e.attributes)r.setAttribute(n,i);e.children&&r.replaceChildren(...e.children)}function St(r,e){return r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}var st=class{ctx;view;editing;saving;outline;onboarding;history;publishing;moves;tags;images;stash;restored=!1;constructor(e,t,n,i,s){let o=new ke,a,d=new Be(e,()=>a);a=new nt(t,()=>d.retryAfterLogin(),{sendAll:p=>{this.saving.saveAll(p)},discardAll:p=>this.saving.discardAll(p)});let l=new ge(n,{added:p=>{this.view.isEditing&&this.view.hydrate(p)},removed:p=>this.view.forget(p)}),u=new qe(e,async()=>{let v=(await e.companies().catch(()=>[])).map(m=>m.urn);return v.length>0?v:s.company?.urn?[s.company.urn]:[]},s.user?.urn);this.ctx={transport:e,host:t,registry:i,store:o,pending:new be(()=>this.pendingChanged()),toolbar:a,popover:new tt(t),panels:{show:(p,v)=>this.outline.showPanel(p,v)},feedback:d,views:new xe(e),sources:new Map,discovery:l,canPublish:["PUBLISHER","ADMIN","SUPER"].includes(s.user?.role??""),requiredImageSlots:window.baackEditorConfig?.requiredImageSlots??["DEFAULT"],live:new Pe(o),hooks:{openHistory:p=>{this.history.open(p)},publishEntity:p=>{this.publishing.openReview(p)},canReorder:p=>(this.moves.groupOf(p)?.units.length??0)>1,reorder:p=>this.moves.openReorder(p),moveBy:(p,v)=>this.moves.moveBy(p,v),relocate:p=>{this.editing.close(),this.outline.focusSlot(p)},showItem:p=>this.outline.selectItem(p),rename:(p,v)=>{this.moves.relocate(void 0,p.entityUrn,p.entry,v)},moveSlot:(p,v,m)=>this.moves.moveTo(p.entityUrn,p.entry,v,{name:p.name,sortOrder:m}),runPlan:p=>this.moves.run(p),saveImage:(p,v)=>this.images.save(p,v)},groups:s.user?.urn?new je(s.user.urn):void 0,entry:p=>i.find(v=>v.type===p),entityTitle:p=>{let v=o.view(p)?.name;return v?`Content for ${j(v)}`:`Entity ${p.slice(0,8)}`},announcePublished:(p,v,m={})=>{let g=o.view(p),y=g?.name??"",x={entityUrn:p,name:y,path:y&&ai(j(y)),language:g?.language??"",variant:g?.variant??""};m.itemUrn&&(x.itemUrn=m.itemUrn);let b=m.quiet===!0&&a.showsEntity(p);ii(a,window.baackEditorConfig?.afterPublish,x,v,{...m.info!==void 0?{info:m.info}:{},quiet:b})}},this.stash=s.user?.urn?new we(s.user.urn):void 0,this.view=new rt(this.ctx,{editingElement:()=>this.editing.current?.session?this.editing.current.target.binding?.element:void 0,editingBinding:()=>this.editing.current?.target.binding,closeEditor:()=>this.editing.close(),changed:p=>{this.refreshTags(),this.outline.changed(p),this.history?.changed(p),this.publishing?.changed()}}),this.saving=new Ne(this.ctx,this.view,()=>this.editing),this.editing=new He(this.ctx,this.view,p=>this.saving.save(p)),this.onboarding=new Ye({transport:e,toolbar:a,context:s,registry:i,store:o,panels:this.ctx.panels,openEntity:p=>this.outline.openEntity(p),entityNameForPage:window.baackEditorConfig?.entityNameForPage,report:(p,v,m)=>d.report(p,v,m),created:p=>u.remember(p)}),this.ctx.popover.setEntitySource(this.entitySource(u)),this.outline=new Xe(this.ctx,this.view,this.editing,this.saving,this.onboarding);let h=this.outline.outline.stack;h.avoid(a.modeButton.closest(".toolbar"));let f=this.ctx.popover.element;new MutationObserver(()=>h.element.classList.toggle("item-editing",!f.hidden)).observe(f,{attributes:!0,attributeFilter:["hidden"]}),this.moves=new Ge(this.ctx,this.view,()=>this.editing,()=>this.ctx.groups,p=>this.saving.commit(p)),this.tags=new Ke(this.ctx.host,p=>this.moves.openOrderMenu(p)),this.moves.onOrderChange(()=>this.refreshTags()),this.images=new Ce(this.ctx,this.view,()=>this.saving,()=>this.editing),this.publishing=new Je(this.ctx,this.view,window.baackEditorConfig?.publishTimeoutMs??300*1e3,this.outline.outline.stack,{show:(p,v)=>this.outline.showAbove(v,p)}),this.history=new _e(this.ctx,this.editing,this.view,this.outline.outline.stack,{show:(p,v)=>this.outline.showAbove(v,p),publishEntity:p=>this.ctx.hooks.publishEntity(p),published:async p=>{await this.view.refresh(p),await this.publishing.refreshStatus(p)}}),a.modeButton.addEventListener("click",()=>{this.setEditMode(!this.view.isEditing)}),a.itemsButton.addEventListener("click",()=>this.outline.toggle()),a.setOpenEntity(p=>this.outline.openEntity(p)),a.onLifecycle(()=>this.outline.changed()),a.setOpenPending(()=>this.outline.togglePending()),a.onPending(()=>this.outline.changed()),this.outline.onClose(()=>this.history.stopPreview()),a.readButton.addEventListener("click",()=>{this.setReadMode(this.view.mode==="LATEST"?"live":"LATEST")}),document.addEventListener("keydown",p=>{this.view.isEditing&&p.altKey&&p.shiftKey&&p.code==="KeyI"&&(p.preventDefault(),this.outline.toggle(),this.outline.outline.isOpen&&this.outline.outline.focusFilter())}),l.start()}leaving;get isEditing(){return this.view.isEditing}async setEditMode(e,t="LATEST",n=!0){if(await this.leaving,e===this.view.isEditing)return;let{toolbar:i,discovery:s}=this.ctx;if(i.setEditMode(e),e)this.view.begin(t),this.startMode(t),await this.view.hydrate(s.all()),await this.afterRead(t);else{this.stopMode();let o=n&&this.view.mode==="LATEST"?this.view.readLiveChanges():Promise.resolve([]);this.leaving=o.then(()=>{});let a=await o;this.leaving=void 0,await this.view.leave(a)&&i.showMessage(`Showing the published content. ${xt(window.baackEditorConfig?.afterPublish)??kt}`,!0)}}startMode(e){this.showReadMode(e),e==="LATEST"&&(this.editing.attach(),this.publishing.start(),this.outline.setNewEntity(()=>{this.onboarding.offerNewEntity(this.pageLanguage())}))}pageLanguage(){let{store:e}=this.ctx,t=ee(e);return t&&e.view(t)?.language||document.documentElement.lang||"en-GB"}entitySource(e){let{transport:t,feedback:n}=this.ctx,i=()=>this.onboarding,s=()=>this.pageLanguage();return{list:o=>e.list(o),describe:o=>e.describe(o),get language(){return s()},create(o,a){return new Promise(d=>{i().newEntityForm({title:"New entity",submitLabel:"Create and choose it",path:a,language:this.language,onCreated:l=>d(e.remember(l)),onCancel:()=>d(void 0)}).then(l=>{l.element.addEventListener("keydown",u=>{u.key==="Escape"&&(u.preventDefault(),u.stopPropagation(),l.cancel())}),o.replaceChildren(l.element),l.element.querySelector("input")?.focus()})})},note:async o=>{let a=await t.readEntity(o);return e.remember(a),S(a.status)||a.status==="PUBLISH"?"":`${j(a.name)} is not published yet, so pages show it only once it is.`},pagePath:ai,report:(o,a,d)=>{n.report(o,a,d)}}}refreshTags(){this.tags&&(this.view.isEditing&&this.view.mode==="LATEST"?this.tags.show(this.moves.keyedMembers()):this.tags.clear())}stopMode(){let{toolbar:e}=this.ctx;this.tags.clear(),this.editing.detach(),this.editing.close(),this.outline.clear(),this.history.close(),this.publishing.stop(),this.moves.panel.close(),this.outline.setNewEntity(void 0),e.showMessage(""),e.hideLogin()}async afterRead(e){let{toolbar:t,discovery:n}=this.ctx;if(e==="live"){let i=this.view.countPublishedSinceBuilt(),s=[i>0?`Showing the live content. ${i===1?"1 item was":`${i} items were`} published since this page was built, outlined in green. ${xt(window.baackEditorConfig?.afterPublish)??kt}`:"Showing the live page, as visitors see it."];if(this.view.draftsOnLivePage.size>0){let o=[...this.view.draftsOnLivePage].map(a=>this.ctx.entityTitle(a)).join(", ");s.push(`Not published yet, so shown as the latest drafts: ${o}.`)}t.showMessage(`${s.join(" ")} Editing is off.`,!0)}e==="LATEST"&&(await this.restoreStash(),n.unscoped().length>0&&!document.documentElement.hasAttribute(U)&&this.onboarding.offerEntityForPage())}async setReadMode(e){if(!this.view.isEditing){await this.setEditMode(!0,e);return}if(e===this.view.mode)return;let t=[...new Set(this.ctx.discovery.all().map(i=>i.scope))],n;try{n=await this.view.prefetch(e,t)}catch(i){let s=e==="live"?"load the live content":"load the latest content";this.ctx.feedback.report(i,s,()=>{this.setReadMode(e)});return}!this.view.isEditing||e===this.view.mode||(this.stopMode(),this.startMode(e),await this.view.switchTo(e,n),await this.afterRead(e))}showReadMode(e){let{toolbar:t}=this.ctx;t.setReadMode(e==="LATEST"),e==="live"&&t.showMessage("Showing the live page, as visitors see it. Editing is off.",!0),typeof e=="number"&&t.showMessage(`Showing the latest drafts as of ${new Date(e).toLocaleString()}. Read-only.`,!0)}pendingChanged(){let{pending:e,toolbar:t}=this.ctx,n=e.all();this.stash?.save(n);let i=e.byEntity(),s=te(this.ctx.store,[...i.keys()]).map(o=>({entityUrn:o,title:this.ctx.entityTitle(o),rows:i.get(o).map(a=>({label:`${a.name} #${a.sortOrder}`,detail:a.kind==="create"?"new item":a.kind==="move"?`${a.label}: to ${a.to.name===a.name?"":a.to.name}#${a.to.sortOrder}`:a.stale?"based on an older version":"edit",problem:a.kind==="edit"&&a.stale===!0,...a.kind==="edit"&&a.stale?{action:{label:"Resolve",run:d=>{this.saving.resolve(a,d)}}}:{}}))}));t.setPending(s),n.length>0?window.addEventListener("beforeunload",oi):window.removeEventListener("beforeunload",oi),this.outline?.changed()}async restoreStash(){if(this.restored||!this.stash)return;this.restored=!0;let e=this.stash.load();if(e.length===0)return;await Promise.all([...new Set(e.map(n=>n.entityUrn))].map(n=>this.view.loadScope(n)));let t=e.map(n=>n.kind!=="edit"?n:this.ctx.store.itemAt(n.entityUrn,this.ctx.entry(n.type),n.name,n.sortOrder)?.item.urn===n.urn?{...n,stale:!1}:{...n,stale:!0});this.ctx.pending.load(t),this.view.showAll(),this.ctx.toolbar.showMessage(`Restored ${t.length} unsaved ${t.length===1?"change":"changes"} from this browser.`,!0)}};function oi(r){r.preventDefault()}function ai(r){return(window.baackEditorConfig?.pagePathForEntity??Wn)(r)}var tr=/<\/?[a-z!][^>]*>/i,di={type:"text",label:"Text",attribute:"text",entityArray:"texts",endpoint:w.TEXT,historyEndpoint:w.TEXT_HISTORY,surface:"inline",valueKeys:["value"],component:r=>r.localName==="meta"?Gt:r.hasAttribute("data-section")?rn:nr(r.getAttribute("data-text-layout")==="paragraphs"?zt:ct),find:(r,e,t)=>r.text(e,t),defaults:()=>({value:""}),read:r=>({value:ot(r)}),form:{fields:[{key:"value",label:"Text",kind:"textarea"}],toForm:r=>({value:r.value}),fromForm:r=>({value:typeof r.value=="string"?r.value:""})},fromPlaceholder:r=>r.localName==="meta"?{value:r.getAttribute("content")??""}:r.hasAttribute("data-section")?{value:r.getAttribute("data-section")??""}:r.getAttribute("data-text-layout")==="paragraphs"?{value:[...r.querySelectorAll(":scope > p")].map(e=>ot(e)).join(`
|
|
14
|
-
|
|
15
|
-
`)}:{value:ot(r)},validate:({value:r})=>tr.test(r)?[{level:"warning",message:"This looks like HTML. Text items are plain text, so the page shows the tags as typed, and apps on other platforms will too."}]:[]};function nr(r){return{...r,render(e,t){let n=r.render(e,{...t,unsafeLiteral:!1});return t.unsafeLiteral&&(n.attrs["data-text-unsafe-literal"]=""),n}}}function ot(r){let e="";for(let t of r.childNodes)t.nodeType===Node.TEXT_NODE?e+=t.nodeValue??"":t.nodeName==="BR"?e+=`
|
|
16
|
-
`:e+=ot(t);return e}var At=[di,ln,cn,un,hn,pn,mn,fn,vn,yn,gn,bn,wn],li=At.filter(r=>r.component!==void 0);function za(r){let e=new st(r.transport,r.host,li,At,r.context);return e.setReadMode(r.mode??"LATEST"),e}export{za as start};
|
|
16
|
+
`)||void 0)}};function Dn(r,e){if(!(r.name===e.name&&r.sortOrder===e.sortOrder))throw new me(`Saved, but the API stored it as "${r.name??""}" #${r.sortOrder??"?"} instead of ${e.name} #${e.sortOrder}. Do not save it again; this needs fixing in the API.`)}var me=class extends Error{};var zi={added:["ins",""],removed:["del",""],increase:["span","delta up"],decrease:["span","delta down"],arrow:["span","arrow"]};function fe(r){let e=c("div","change");if(typeof r=="string")return e.textContent=r,e;for(let t of r){if(t.kind==="same"){e.append(t.text);continue}let[n,i]=zi[t.kind],s=c(n,i,t.text);t.kind==="arrow"&&s.setAttribute("aria-label","to"),(t.kind==="increase"||t.kind==="decrease")&&(s.title=`${t.text.replace(/^[+−]/,"")} ${t.kind}`),e.append(s)}return e}var Ve=class{element;status;list;more;compare;constructor(e,t){this.element=c("div","level-item");let n=c("label","field");this.compare=c("select"),this.compare.append(Object.assign(c("option","","Compare with the live version"),{value:"live"}),Object.assign(c("option","","Compare with the previous version"),{value:"previous"})),this.compare.addEventListener("change",()=>t(this.compare.value)),n.append(c("span","caption","Show changes"),ye(this.compare)),this.status=c("p","hint"),this.status.setAttribute("role","status"),this.list=c("ol","rows history-rows"),this.list.setAttribute("aria-label","Versions, newest first"),this.more=c("button","","Load older versions"),this.more.type="button",this.more.hidden=!0,this.more.addEventListener("click",e),this.element.append(n,this.status,this.list,this.more)}setStatus(e){this.status.textContent=e}render(e,t){let n=new Set([...this.list.querySelectorAll('li.history-row:has(> button[aria-expanded="true"])')].map(i=>i.dataset.when));this.list.replaceChildren(...e.map(i=>this.row(i,n))),this.more.hidden=!t}row(e,t){let n=c("li","row history-row");n.dataset.when=e.whenUtc;let i=c("button","row-main");i.type="button",i.dataset.row="";let s=c("span","row-name",e.when);s.title=`${e.whenUtc} UTC`,i.append(s),e.live&&i.append(c("span","status status-up-to-date","live"));for(let d of e.notes)i.append(c("span","status note",d));let o=c("span","stack-chevron");o.append(L("chevron-right")),o.setAttribute("aria-hidden","true"),i.append(o),i.addEventListener("click",()=>e.open());let a=c("div","actions");if(a.append(Fn(e.preview)),n.append(i,fe(e.change),a),e.collapsed.length>0){let d=T(`${e.collapsed.length} earlier ${e.collapsed.length===1?"draft":"drafts"}`,"ghost","xs"),l=t.has(e.whenUtc);d.setAttribute("aria-expanded",String(l));let u=c("ol","rows");u.hidden=!l,u.append(...e.collapsed.map(h=>this.row(h,t))),d.addEventListener("click",()=>{u.hidden=!u.hidden,d.setAttribute("aria-expanded",String(!u.hidden))}),n.append(d,u)}return n}};function vt(r,e){if(!e){r.replaceChildren(c("p","message","This version is no longer in the history. Go back to see the versions there are."));return}let t=c("p","version-head");t.title=`Saved ${e.whenUtc} UTC`;for(let s of e.marks)t.append(c("span",`status ${s==="live"?"status-up-to-date":"note"}`,s));for(let s of e.notes)t.append(c("span","status note",s));let n=e.changes.map(({label:s,change:o})=>{let a=c("div","field version-change");return a.append(c("span","caption",s),fe(o)),a}),i=c("div","actions");i.append(...e.actions.map(Fn)),r.replaceChildren(...t.childElementCount>0?[t]:[],...n,i)}function Fn(r){let e=T(r.label,Y(r),"sm");return r.pressed!==void 0&&e.setAttribute("aria-pressed",String(r.pressed)),r.disabled&&(e.disabled=!0,e.title=r.disabled),e.addEventListener("click",()=>r.run(e)),e}var Gi=400,Ki=0,ve,yt=0;function P(r,e){if(r.removeAttribute("title"),e!==void 0){let n=c("span","visually-hidden",e);n.id=`baack-tooltip-${++Ki}`;let i=()=>r.parentElement&&!n.isConnected&&r.after(n);i(),queueMicrotask(i),r.setAttribute("aria-describedby",n.id)}let t=()=>e??r.getAttribute("aria-label")??"";r.addEventListener("pointerenter",n=>{n.pointerType!=="touch"&&(clearTimeout(yt),yt=window.setTimeout(()=>Un(r,t()),ve?0:Gi))}),r.addEventListener("focus",()=>{r.matches(":focus-visible")&&Un(r,t())});for(let n of["pointerleave","blur","pointerdown"])r.addEventListener(n,gt);r.addEventListener("keydown",n=>{n.key==="Escape"&&ve?.trigger===r&>()})}function Un(r,e){if(gt(),!r.isConnected||r.getClientRects().length===0)return;let t=c("div","tooltip",e);t.setAttribute("aria-hidden","true"),r.getRootNode().append(t);let n=r.getBoundingClientRect(),{width:i,height:s}=t.getBoundingClientRect(),o=n.top-s-6;t.style.top=`${o>=8?o:n.bottom+6}px`,t.style.left=`${Math.min(Math.max(8,n.left+n.width/2-i/2),window.innerWidth-i-8)}px`,ve={tip:t,trigger:r}}function gt(){clearTimeout(yt),ve?.tip.remove(),ve=void 0}var _n="baack-editor:side",ji=150,Vn=3,Wi=0,qi="(max-width: 640px)",_e=class{element;back;heading;crumbs;body;announcer;dock;entries=[];id=`baack-stack-${Wi+=1}`;closeListeners=[];toolbar;constructor(e){this.element=c("aside","panel side stack"),this.element.setAttribute("aria-label","Editor"),this.element.hidden=!0;let t=c("div","stack-bar");this.back=T("","ghost","sm","stack-back"),this.back.addEventListener("click",()=>this.pop()),this.dock=T("","ghost","icon-sm","side-dock"),this.dock.addEventListener("click",()=>this.setSide(this.side==="right"?"left":"right"));let n=T("","ghost","icon-sm","stack-close");n.setAttribute("aria-label","Close"),n.append(L("x")),n.addEventListener("click",()=>this.close()),t.append(this.back,c("span","stack-spacer"),this.dock,n),P(this.dock),P(n);let i=c("nav","stack-crumbs");i.setAttribute("aria-label","Where you are"),this.crumbs=c("ol"),i.append(this.crumbs),this.heading=c("h2","stack-title"),this.heading.id=`${this.id}-title`,this.heading.tabIndex=-1,this.body=c("div","stack-body"),this.announcer=c("p","visually-hidden"),this.announcer.setAttribute("aria-live","polite"),this.element.append(t,i,this.heading,this.body,this.announcer),this.element.addEventListener("keydown",this.onKeyDown),this.setSide(Yi()),e.root.append(this.element)}avoid(e){this.toolbar=e,new ResizeObserver(()=>this.fit()).observe(e),window.addEventListener("resize",()=>this.fit()),this.fit()}onClose(e){this.closeListeners.push(e)}fit(){let e=this.toolbar?.getBoundingClientRect().top,t=(this.side==="right"||matchMedia(qi).matches)&&e!==void 0;this.element.style.bottom=t?`${Math.max(16,window.innerHeight-e+8)}px`:""}get current(){return this.entries.at(-1)?.level}get path(){return this.entries.map(e=>e.level.id)}get isOpen(){return!this.element.hidden}push(e,{focus:t=!0}={}){let n=this.entries.at(-1);n&&(n.scrollTop=this.body.scrollTop,n.origin=this.focusedIn(n.section));let i=this.enter(e);this.entries.push(i),this.show(i,n,"in",t)}pop(){if(this.entries.length<=1){this.close();return}this.popTo(this.entries.at(-2).level.id)}popTo(e){let t=this.entries.findIndex(i=>i.level.id===e);if(t<0||t===this.entries.length-1)return;let n=this.entries.at(-1);for(let i of this.entries.splice(t+1))this.leave(i,i===n);this.show(this.entries[t],n,"out")}replace(e,{focus:t=!0}={}){let n=this.entries.pop();n&&this.leave(n,!1);let i=this.enter(e);this.entries.push(i),this.show(i,void 0,"none",t)}reset(e,{focus:t=!0}={}){for(let i of this.entries.splice(0))this.leave(i,!1);for(let i of e)this.entries.push(this.enter(i));let n=this.entries.at(-1);n&&this.show(n,void 0,"none",t)}open(){this.element.hidden=!1}close(){if(!this.element.hidden){this.element.hidden=!0;for(let e of this.closeListeners)e()}}get side(){return this.element.dataset.side==="left"?"left":"right"}setSide(e){this.element.dataset.side=e,this.dock.setAttribute("aria-label",e==="right"?"Move to left":"Move to right"),this.dock.replaceChildren(L(e==="right"?"panel-left":"panel-right")),this.fit();try{localStorage.setItem(_n,e)}catch{}}enter(e){let t=c("section","stack-level");return t.dataset.level=e.id,t.setAttribute("aria-labelledby",this.heading.id),t.hidden=!0,t.append(e.render()),this.body.append(t),{level:e,section:t,scrollTop:0,origin:void 0}}leave(e,t){e.level.dispose?.(),(!t||!this.animates())&&e.section.remove()}show(e,t,n,i=!0){this.element.hidden=!1;for(let o of this.entries)o.section.hidden=o!==e;e.section.hidden=!1,this.renderHeader(),this.body.scrollTop=n==="out"?e.scrollTop:0,t&&n!=="none"&&this.slide(e.section,t.section,n),e.level.onShow?.(),this.announcer.textContent=e.level.title;let s=n==="out"&&e.origin?.isConnected?e.origin:void 0;i&&(s??this.heading).focus({preventScroll:n==="out"})}renderHeader(){let e=this.entries.at(-1).level,t=this.entries.at(-2)?.level;this.heading.textContent=e.title,this.back.hidden=!t,this.back.replaceChildren(...t?[L("chevron-left"),c("span","stack-back-text",t.title)]:[]),this.back.setAttribute("aria-label",t?`Back to ${t.title}`:"Back");let n=this.entries.map((s,o)=>({entry:s,index:o})),i=n.length>Vn+1?[n[0],void 0,...n.slice(n.length-(Vn-1))]:n;this.crumbs.replaceChildren(...i.flatMap((s,o)=>{let a=c("li","stack-crumb-separator");a.setAttribute("role","presentation"),a.setAttribute("aria-hidden","true"),a.append(L("chevron-right"));let d=c("li"),l=h=>(d.append(h),o===0?[d]:[a,d]);if(!s)return l(c("span","meta","\u2026"));if(s.index===this.entries.length-1){let h=c("span","",s.entry.level.title);return h.setAttribute("aria-current","page"),l(h)}let u=c("button","stack-crumb",s.entry.level.title);return u.type="button",u.addEventListener("click",()=>this.popTo(s.entry.level.id)),l(u)})),this.crumbs.parentElement.hidden=this.entries.length<2}animates(){return typeof Element.prototype.animate=="function"&&!matchMedia("(prefers-reduced-motion: reduce)").matches}slide(e,t,n){if(!this.animates())return;let i=this.side==="right"?"100%":"-100%",s={duration:ji,easing:"ease-out"};if(n==="in"){e.animate([{transform:`translateX(${i})`},{transform:"none"}],s);return}t.hidden=!1,t.inert=!0,t.setAttribute("aria-hidden","true"),t.classList.add("leaving"),t.style.top=`${this.body.scrollTop}px`,t.animate([{transform:"none"},{transform:`translateX(${i})`}],s).finished.then(()=>t.remove(),()=>t.remove())}focusedIn(e){let t=this.element.getRootNode().activeElement;return t instanceof HTMLElement&&e.contains(t)?t:void 0}onKeyDown=e=>{if(e.key==="Escape"&&!e.defaultPrevented){e.preventDefault(),e.stopPropagation(),this.pop();return}if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;let t=this.entries.at(-1)?.section,n=t&&this.focusedIn(t);if(!t||!n?.matches("[data-row]"))return;let i=[...t.querySelectorAll("[data-row]")].filter(o=>!o.closest("[hidden]")),s=i[i.indexOf(n)+(e.key==="ArrowDown"?1:-1)];s&&(e.preventDefault(),s.focus())}};function Yi(){try{return localStorage.getItem(_n)==="left"?"left":"right"}catch{return"right"}}function zn(r,e,t){let n=c("button","stack-row");n.type="button",n.dataset.row="";let i=c("span","stack-row-text");i.append(c("span","stack-row-label",r)),e&&i.append(c("span","meta",e));let s=c("span","stack-chevron");return s.append(L("chevron-right")),n.append(i,s),n.addEventListener("click",t),n}function ze(r){let e=c("div","level-confirm");e.append(c("p","meta",r.meta));for(let n of r.blocks){let i=c("div","field");i.append(c("span","caption",n.label),c("pre","snippet",n.text)),e.append(i)}e.append(c("p","description",r.description));let t=c("div","actions");for(let n of r.choices){let i=T(n.label,Y(n));i.addEventListener("click",()=>n.run(i)),t.append(i)}return e.append(t),{id:r.id,title:r.title,render:()=>e}}var Ji=600*1e3,Ge=class{stack;ctx;editing;view;hooks;state;constructor(e,t,n,i,s){this.ctx=e,this.editing=t,this.view=n,this.stack=i,this.hooks=s,n.onPreviewChange(()=>this.render())}async open(e){this.state&&!Xi(this.state,e)&&this.stopPreview();let t=new Ve(()=>{this.loadMore()},s=>{this.state===i&&(i.against=s,this.render())}),n={id:Zi(e),title:`${e.name} #${e.sortOrder}`,render:()=>t.element,dispose:()=>{this.state===i&&(this.stopPreview(),this.state=void 0)}},i={...e,versions:[],live:void 0,after:void 0,against:"live",linked:!1,level:n,view:t,version:void 0};this.state=i,this.hooks.show(n,e.entityUrn),t.setStatus("Loading\u2026"),i.linked=await this.isLinked(e),this.state===i&&await this.loadMore()}close(){this.stopPreview(),this.state=void 0}stopPreview(){this.state&&this.view.previewedUrn&&(this.view.stopPreview(this.state),this.ctx.toolbar.showMessage(""))}togglePreview(e,t){if(this.view.previewedUrn===t.urn){this.stopPreview();return}this.editing.close(),this.view.previewVersion(e,t);let n=window.getSelection(),i=this.view.bindingsAt(e).map(o=>o.element);n?.anchorNode&&i.some(o=>o.contains(n.anchorNode))&&n.removeAllRanges(),this.view.bindingsAt(e)[0]?.element.scrollIntoView({block:"nearest",behavior:"smooth"});let s=new Date(C(t.createdTimestamp??"")).toLocaleString();this.ctx.toolbar.showMessage(`Previewing the version of ${e.name} saved ${s}. Nothing is saved; stop the preview to see the latest again.`,!0)}changed(e){let t=this.state;if(!t||e&&e!==t.entityUrn)return;let n=this.ctx.store.itemAt(t.entityUrn,t.entry,t.name,t.sortOrder);n?.item.urn&&(t.urn=n.item.urn),this.reload(t)}async reload(e){try{let t=await this.ctx.transport.history(e.entry,e.urn);if(this.state!==e)return;e.live=t.item??void 0,e.versions=[...t.history],e.after=t.pagination?.isMorePages?t.pagination.after??void 0:void 0,this.render()}catch(t){this.ctx.feedback.report(t,"load the history",()=>{this.reload(e)})}}async loadMore(){let e=this.state;if(e)try{let t=await this.ctx.transport.history(e.entry,e.urn,e.after);if(this.state!==e)return;e.live??=t.item??void 0,e.versions.push(...t.history),e.after=t.pagination?.isMorePages?t.pagination.after??void 0:void 0,e.view.setStatus(""),this.render()}catch(t){e.view.setStatus(""),this.ctx.feedback.report(t,"load the history",()=>{this.loadMore()})}}render(){let e=this.state;if(!e)return;let t=e.versions.map((s,o)=>this.row(e,s,e.versions[o+1])),n=[],i;e.versions.forEach((s,o)=>{let a=C(s.createdTimestamp??""),d=n.at(-1),l=s.isPublished===!0;d&&!l&&!d.live&&i!==void 0&&i-a<=Ji?d.collapsed.push(t[o]):n.push(t[o]),i=a}),e.view.render(n,e.after!==void 0),e.version&&this.stack.path.includes(Gn(e.version.urn))&&vt(e.version.body,this.versionModel(e,e.version.urn))}row(e,t,n){let i=e.against==="live"?e.live:n;return{when:wt(t),whenUtc:t.createdTimestamp??"",live:t.isPublished===!0,change:bt(e.entry,t,i,e.against),notes:this.notes(t,n),open:()=>this.openVersion(e,t),preview:this.previewAction(e,t),collapsed:[]}}notes(e,t){let n=[];t&&t.name!==e.name&&n.push(`renamed from ${t.name}`),t&&t.sortOrder!==e.sortOrder&&n.push(`moved from #${t.sortOrder} to #${e.sortOrder}`);let i=e.urn?this.ctx.groups?.of(e.urn):void 0;return i&&n.push(`part of: ${i.label}`),n}openVersion(e,t){let n=t.urn,i=c("div","level-version");e.version={urn:n,body:i},vt(i,this.versionModel(e,n)),this.stack.push({id:Gn(n),title:`Version saved ${wt(t)}`,render:()=>i,dispose:()=>{e.version?.urn===n&&(e.version=void 0)}})}versionModel(e,t){let n=e.versions.findIndex(l=>l.urn===t),i=e.versions[n];if(!i)return;let s=e.versions[n+1],o=[...i.isPublished===!0?["live"]:[],...n===0?["latest"]:[]],a=s!==void 0&&s.urn===e.live?.urn,d=[{label:a?"Against the one before, which is live":"Against the one before",change:bt(e.entry,i,s,"previous")||"The same value as the one before."}];return i.isPublished!==!0&&!a&&d.push({label:"Against live",change:bt(e.entry,i,e.live,"live")}),{when:wt(i),whenUtc:i.createdTimestamp??"",marks:o,notes:this.notes(i,s),changes:d,actions:this.actions(e,i)}}actions(e,t){let{ctx:n}=this,i=[],s=n.store.view(e.entityUrn)?.status;if(n.canPublish&&t.isPublished!==!0&&(S(s)||s==="PUBLISH")){let a=s==="PUBLISH"?"Publishing is in progress for this page.":void 0,d=n.groups?.of(t.urn)!==void 0;i.push(e.linked||d?{label:"Publish with the page\u2026",disabled:a,run:()=>this.hooks.publishEntity(e.entityUrn)}:{label:"Publish this version",primary:!0,disabled:a,run:()=>{this.publish(e,t)}})}i.push(this.previewAction(e,t)),t!==e.versions[0]&&i.push({label:"Edit from this version",run:a=>this.editFrom(e,t,a)});let o=e.versions.length===1&&e.after===void 0;return i.push({label:o?"Delete this item\u2026":"Delete this version\u2026",destructive:!0,run:()=>this.confirmDelete(e,t,o)}),i}previewAction(e,t){let n=this.view.previewedUrn===t.urn,i=this.ctx.store.itemAt(e.entityUrn,e.entry,e.name,e.sortOrder)?.item.urn,s=e.entry.renderedByView?"The page shows the server's rendering of this type, which history does not include.":this.view.mode!=="LATEST"?"Previews are shown on the latest drafts.":this.view.bindingsAt(e).length===0?"This item is not shown on this page.":t.urn===i&&!this.ctx.pending.getEdit(t.urn)?"The page already shows this version.":void 0;return{label:n?"Stop preview":"Preview on the page",pressed:n,disabled:n?void 0:s,run:()=>this.togglePreview(e,t)}}confirmDelete(e,t,n){let i=new Date(C(t.createdTimestamp??"")).toLocaleString(),s=t.isPublished===!0?"from this page and from the live site":"from this page",o=[{label:`The version saved ${i}`,text:F(e.entry,t)}],a=n?`This is its only version, so deleting it deletes the item: it disappears ${s}, and cannot be restored.`:"It is removed from the history for good and cannot be restored. Every version uses storage, which is billed.",d=!n&&t.isPublished===!0?Kn(e,t):void 0;if(d){let l=new Date(C(d.version?.createdTimestamp??"")).toLocaleString();d.version&&o.push({label:`Goes live in its place: the version saved ${l}`,text:F(e.entry,d.version)}),a=d.newer?`This is the live version. The API puts the next newer version live in its place: a draft saved ${l}, which may never have been published. Publish the version you want first if that is not it. It cannot be restored.`:d.version?`This is the live version. The API puts the version before it live in its place (saved ${l}). It cannot be restored.`:"This is the live version. The API puts the version before it live in its place. It cannot be restored."}this.stack.push(ze({id:"confirm-delete",title:n?"Delete this item permanently?":d?"Delete the live version permanently?":"Delete this version permanently?",meta:`${e.name} #${e.sortOrder}`,blocks:o,description:a,choices:[{label:"Cancel",run:()=>this.stack.pop()},{label:"Delete permanently",destructive:!0,run:l=>{l.disabled=!0,l.textContent="Deleting\u2026",this.deleteVersion(e,t).finally(()=>{l.disabled=!1,l.textContent="Delete permanently"})}}]}))}async deleteVersion(e,t){let{transport:n,pending:i,toolbar:s,feedback:o}=this.ctx,a=t.isPublished===!0?Kn(e,t).version:void 0;try{await n.remove(e.entry,t.urn),a?.urn&&ft({entityUrn:e.entityUrn,urn:a.urn,type:e.entry.type});let d=e.versions.find(u=>u.urn!==t.urn),l=i.getEdit(t.urn);if(!d?.urn){l&&i.clear(t.urn),this.close(),this.stack.popTo(`entity:${e.entityUrn}`),s.showMessage(`Deleted ${e.name} #${e.sortOrder}.`,!0),await this.hooks.published(e.entityUrn);return}l&&i.set({...l,stale:!0}),s.showMessage(`Deleted the version of ${e.name} saved ${new Date(C(t.createdTimestamp??"")).toLocaleString()}.`,!0),this.state===e&&this.stack.popTo(e.level.id),e.urn=d.urn,await this.hooks.published(e.entityUrn),this.state===e&&await this.reload(e)}catch(d){o.report(d,"delete this version",()=>{this.deleteVersion(e,t)})}}async publish(e,t){try{await this.ctx.transport.publishVersion(e.entry,t),ft({entityUrn:e.entityUrn,urn:t.urn,type:e.entry.type}),this.ctx.announcePublished(e.entityUrn,`Published the version of ${e.name} saved ${new Date(C(t.createdTimestamp??"")).toLocaleString()}.`,{itemUrn:t.urn}),await this.hooks.published(e.entityUrn)}catch(n){this.ctx.feedback.report(n,"publish this version",()=>{this.publish(e,t)})}}editFrom(e,t,n){this.ctx.store.remember(e.entityUrn,e.entry,t),this.editing.open({entityUrn:e.entityUrn,entry:e.entry,name:t.name,sortOrder:t.sortOrder,urn:t.urn,anchor:n,binding:void 0,fromVersion:!0})}async isLinked(e){if(e.entry.type==="template")return!0;let{store:t,sources:n,transport:i}=this.ctx,s=t.view(e.entityUrn)?.raw.templates??[],o=this.ctx.entry("template"),a=new RegExp(`\\$\\{?${e.name.replace(/[^\w-]/g,"")}\\b`);for(let d of s)if(d.urn)try{let l=n.get(d.urn)??{value:(await i.read(o,d.urn)).value};if(n.set(d.urn,l),a.test(String(l.value??"")))return!0}catch{}return!1}};function bt(r,e,t,n){if(!t)return n==="live"?"Nothing is live yet.":"The first version.";if(t.urn===e.urn)return n==="live"?"This is the live version.":"";let i=t.value,s=e.value;if(typeof i=="string"&&typeof s=="string")return De(i,s);let o=F(r,t),a=F(r,e);return o===a?"No change to the value.":Ue(r,t,e)}function wt(r){let e=C(r.createdTimestamp??"");return Number.isNaN(e)?"Unknown time":new Date(e).toLocaleString()}function Zi(r){return`item:${r.entityUrn}:${r.entry.type}:${r.name}:${r.sortOrder}`}function Gn(r){return`version:${r}`}function Xi(r,e){return r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}function Kn(r,e){let t=r.versions.indexOf(e);return t>0?{version:r.versions[t-1],newer:!0}:{version:r.versions[t+1],newer:!1}}function Wn(r,e){let t=r.map(s=>s.sortOrder).sort((s,o)=>s-o),n=new Map(r.map(s=>[s.key,s]));if(e.length!==r.length||e.some(s=>!n.has(s)))throw new Error("The new order must contain exactly the items of the list");let i=[];return e.forEach((s,o)=>{let a=n.get(s),d=t[o];a.sortOrder!==d&&i.push({key:s,from:a.sortOrder,to:d})}),i}function qn(r,e){let t=[...r].sort((d,l)=>d.sortOrder-l.sortOrder);if(t.length===0)return{sortOrder:0,shifts:[]};if(e.position==="head")return{sortOrder:t[0].sortOrder-1,shifts:[]};if(e.position==="tail")return{sortOrder:t.at(-1).sortOrder+1,shifts:[]};let n=t.findIndex(d=>d.key===e.key);if(n<0)throw new Error("The item to insert after is not in the list");let i=t[n],s=t[n+1];if(!s)return{sortOrder:i.sortOrder+1,shifts:[]};if(s.sortOrder-i.sortOrder>1)return{sortOrder:Math.floor((i.sortOrder+s.sortOrder)/2),shifts:[]};let o=t.slice(0,n+1),a=t.slice(n+1);return a.length<=o.length?{sortOrder:s.sortOrder,shifts:[...jn(a,1)].reverse()}:{sortOrder:i.sortOrder,shifts:jn([...o].reverse(),-1).reverse()}}function jn(r,e){let t=[];for(let[n,i]of r.entries()){if(n>0&&i.sortOrder!==t.at(-1).to)break;t.push({key:i.key,from:i.sortOrder,to:i.sortOrder+e})}return t}function Yn(r,e){return[{key:r.key,from:r.sortOrder,to:e.sortOrder},{key:e.key,from:e.sortOrder,to:r.sortOrder}]}async function Jn(r,e,t){let{store:n,sources:i,transport:s}=r,o=r.entry("template"),a=new RegExp(`\\$\\{?${t.replace(/[^\w-]/g,"")}\\b`),d=[];for(let l of n.view(e)?.raw.templates??[])if(l.urn)try{let u=i.get(l.urn)??{value:(await s.read(o,l.urn)).value};i.set(l.urn,u),a.test(String(u.value??""))&&d.push(`${l.name} #${l.sortOrder}`)}catch{}return d}var Ke=class{element;entries=[];actions;list;status;saveButton;addButtons;dragging;panels;handle;constructor(e){this.panels=e,this.element=c("div","reorder"),this.status=c("p","hint"),this.status.setAttribute("role","status"),this.list=c("ol","rows reorder-rows"),this.list.setAttribute("aria-label","Entries, in order"),this.addButtons=c("div","actions");let t=c("div","actions"),n=c("button","","Cancel");n.type="button",n.addEventListener("click",()=>this.actions?.cancel()),this.saveButton=c("button","primary","Save order"),this.saveButton.type="button",this.saveButton.addEventListener("click",()=>this.actions?.save(this.keys())),t.append(n,this.saveButton),this.element.append(this.status,this.list,this.addButtons,t)}get isOpen(){return this.handle?.isOpen??!1}open(e,t,n,i){if(this.entries=[...n],this.actions=i,this.setStatus(""),this.setBusy(!1),this.addButtons.replaceChildren(),i.add){let s=c("button","","Add at the start");s.type="button",s.addEventListener("click",()=>i.add({position:"head"},s));let o=c("button","","Add at the end");o.type="button",o.addEventListener("click",()=>i.add({position:"tail"},o)),this.addButtons.append(s,o)}this.render(),this.handle=this.panels.show(this.element,{title:e,entityUrn:t,onLeave:()=>{let s=this.actions;this.actions=void 0,s?.cancel()}})}close(){this.actions=void 0,this.handle?.close()}setStatus(e){this.status.textContent=e}setBusy(e,t="Saving\u2026"){this.saveButton.disabled=e,this.saveButton.textContent=e?t:"Save order"}keys(){return this.entries.map(e=>e.key)}move(e,t,n){if(t<0||t>=this.entries.length||e===t)return;let[i]=this.entries.splice(e,1);if(this.entries.splice(t,0,i),this.render(),n){let o=[...[...this.list.children].find(a=>a.dataset.key===i.key)?.querySelectorAll("button[data-move]")??[]];(o.find(a=>a.dataset.move===n&&!a.disabled)??o.find(a=>!a.disabled))?.focus()}this.actions?.changed(this.keys())}render(){this.list.replaceChildren(...this.entries.map((e,t)=>{let n=c("li","row reorder-row");n.draggable=!0,n.dataset.key=e.key;let i=c("span","handle");i.setAttribute("aria-hidden","true"),i.append(L("grip-vertical"));let s=c("div","row-main");s.append(c("span","row-name",e.label)),e.detail&&s.append(c("span","meta",e.detail));let o=c("button","","Move up");o.type="button",o.disabled=t===0,o.setAttribute("aria-label",`Move ${e.label} up`),o.dataset.move="up",o.addEventListener("click",()=>this.move(t,t-1,"up"));let a=c("button","","Move down");if(a.type="button",a.disabled=t===this.entries.length-1,a.setAttribute("aria-label",`Move ${e.label} down`),a.dataset.move="down",a.addEventListener("click",()=>this.move(t,t+1,"down")),n.append(i,s,o,a),this.actions?.add){let d=T("","ghost","icon-sm");d.setAttribute("aria-label",`Add after ${e.label}`),d.append(L("plus")),P(d),d.addEventListener("click",()=>this.actions?.add({position:"after",key:e.key},d)),n.append(d)}return n.addEventListener("dragstart",d=>{this.dragging=e.key,d.dataTransfer?.setData("text/plain",e.key),n.classList.add("dragging")}),n.addEventListener("dragend",()=>{this.dragging=void 0,n.classList.remove("dragging")}),n.addEventListener("dragover",d=>d.preventDefault()),n.addEventListener("drop",d=>{d.preventDefault();let l=this.entries.findIndex(u=>u.key===this.dragging);l>=0&&this.move(l,t)}),n}))}};var je=class{panel;ctx;view;editing;groups;done=new Map;failures=new Map;create;constructor(e,t,n,i,s){this.ctx=e,this.create=s,this.view=t,this.editing=n,this.groups=i,this.panel=new Ke(e.panels)}groupOf(e){let t=this.ctx.store.entityFor(e.scope);if(!t)return;let n=e.element.closest("[data-content-rows]"),i=e.element.closest(`[data-${e.entry.attribute}-list="${CSS.escape(e.name)}"]`);if(i&&(!n||n.contains(i)))return this.listGroup(i,e,t);if(n)return this.rowsGroup(n,e,t)}listGroup(e,t,n){let i=[];for(let s of e.children){let o=this.ctx.discovery.all().find(u=>u.entry===t.entry&&u.name===t.name&&s.contains(u.element)&&this.ctx.store.entityFor(u.scope)===n);if(!o)continue;let a=this.ctx.store.itemFor(o),d=o.element.getAttribute("data-section");if(!a?.item.urn&&d===null)continue;let l=a?.item.urn?String(a.item.value??a.item.name):d;i.push({key:a?.item.urn??`slot:${o.sortOrder}`,element:s,bindings:[o],sortOrder:o.sortOrder,label:d===null?l:Qi(s,l),...d!==null?{detail:` \xB7 ${(s.textContent??"").trim().replace(/\s+/g," ").slice(0,70)}\u2026`}:{},...a?.item.urn?{}:{missing:d}})}return{kind:"list",container:e,entityUrn:n,entry:t.entry,name:t.name,units:i}}rowsGroup(e,t,n){let i=[];for(let s of e.children){let o=Number(s.getAttribute("data-content-row"));if(!Number.isInteger(o))continue;let a=this.ctx.discovery.all().filter(l=>s.contains(l.element)&&this.ctx.store.entityFor(l.scope)===n),d=a.map(l=>(l.element.textContent??"").trim()).filter(Boolean);i.push({key:`row:${o}`,element:s,bindings:a,sortOrder:o,label:d[0]??`Row ${o}`,detail:d.length>1?` \xB7 ${d.slice(1).join(" \xB7 ")}`:""})}return{kind:"rows",container:e,entityUrn:n,entry:t.entry,name:t.name,units:i}}openReorder(e){let t=this.groupOf(e);if(!t||t.units.length===0)return;this.editing().close(),this.view.rememberOrder(t.container);let n=t.units.map(s=>s.key),i=t.kind==="rows"?"rows":t.name==="sections"?"sections":`"${t.name}"`;this.panel.open(`Reorder ${i}`,t.entityUrn,t.units.map(s=>({key:s.key,label:s.label,sortOrder:s.sortOrder,...s.detail?{detail:s.detail}:{}})),{changed:s=>this.preview(t,s),cancel:()=>{this.preview(t,n),this.panel.close()},save:s=>{this.saveOrder(t,s,()=>this.panel.close())},...t.kind==="list"?{add:(s,o)=>{this.insert(t,s,o)}}:{}})}moveBy(e,t){let n=this.groupOf(e);if(!n)return;let i=n.units.map(a=>a.key),s=n.units.findIndex(a=>a.bindings.includes(e)),o=s+t;s<0||o<0||o>=i.length||([i[s],i[o]]=[i[o],i[s]],this.editing().close(),this.view.rememberOrder(n.container),this.preview(n,i),this.saveOrder(n,i,()=>{}))}preview(e,t){let n=new Map(e.units.map(a=>[a.key,a]));if(G(e.container)){this.previewLive(e,t);return}let i=new Set(e.units.map(a=>a.element)),o=[...e.container.children].filter(a=>i.has(a)).map(a=>{let d=document.createComment("");return a.replaceWith(d),d});t.forEach((a,d)=>o[d]?.replaceWith(n.get(a).element))}previewLive(e,t){let n=new Map(e.units.map(a=>[a.key,a])),i=e.units.map(a=>a.sortOrder).sort((a,d)=>a-d),s=e.units.map(a=>a.key),o=t.every((a,d)=>a===s[d]);t.forEach((a,d)=>{let l=n.get(a),u=l.bindings[0],f=this.ctx.store.itemFor(u)?.item??{name:e.name,value:l.missing};this.ctx.live.showAt(u,i[d],o?void 0:{...f,sortOrder:i[d]})})}async saveOrder(e,t,n){let i=Wn(e.units.map(u=>({key:u.key,sortOrder:u.sortOrder})),t),s=new Map(e.units.map(u=>[u.key,u])),o=e.units.filter(u=>u.missing!==void 0);if(i.length===0&&o.length===0){n();return}let a=[];for(let u of i){let h=s.get(u.key);if(h.missing===void 0)for(let f of h.bindings){let p=this.ctx.store.itemFor(f);p?.item.urn&&a.push(this.step(f.entry,p.item,e.entityUrn,{name:f.name,sortOrder:u.to}))}}let d=e.kind==="rows"?"Reorder rows":`Reorder ${e.name}`;this.panel.setBusy(!0);let l=await this.runSteps(a,d)&&await this.createMissing(e,o,i);if(this.panel.setBusy(!1),!l){this.preview(e,e.units.map(u=>u.key)),await this.view.refresh(e.entityUrn);return}if(G(e.container))this.ctx.live.endPreviews();else for(let u of i)for(let h of s.get(u.key).bindings)this.view.retag(h,u.to);n(),await this.view.refresh(e.entityUrn)}async createMissing(e,t,n){if(t.length===0)return!0;let{feedback:i,toolbar:s}=this.ctx;await this.view.refresh(e.entityUrn);let o=new Map(n.map(a=>[a.key,a.to]));for(let a of t){let d=o.get(a.key)??a.sortOrder;try{await this.create({kind:"create",type:e.entry.type,entityUrn:e.entityUrn,name:e.name,sortOrder:d,value:{value:a.missing}})}catch(l){let u=await i.describe(l,`add ${a.missing} to ${e.name}`);return s.showMessage(`Reorder ${e.name}: ${u.message}`,!1,u.debug),!1}}return!0}keyedMembers(){let e=new Set,t=[];for(let n of this.ctx.discovery.all()){if(!n.element.hasAttribute("data-section"))continue;let i=this.groupOf(n);!i||i.kind!=="list"||e.has(i.container)||(e.add(i.container),i.units.forEach((s,o)=>t.push({binding:s.bindings[0],name:i.name,index:o,count:i.units.length})))}return t}openOrderMenu(e){let t=this.groupOf(e);if(!t||t.units.length<2)return;let{popover:n}=this.ctx;this.editing().close(),this.view.rememberOrder(t.container);let i=t.units.map(u=>u.key),s=t.units.find(u=>u.bindings.includes(e)),o=[...i],a=new Map(t.units.map(u=>[u.key,u.label])),d=()=>{this.preview(t,i),this.changedOrder()},l=()=>{let u=o.indexOf(s.key),h=o.some((m,g)=>m!==i[g]),f=m=>{let g=[...o];[g[u],g[u+m]]=[g[u+m],g[u]],o=g,this.preview(t,o),this.changedOrder(),l()},p=o[u-1],v=o[u+1];n.whenEnded(void 0),n.showChoices(s.element,`Order of ${t.name}`,`${u+1} of ${o.length}`,[],[`${s.label} is ${u+1} of ${o.length}.`,p?`Before it: ${a.get(p)}.`:"",v?`After it: ${a.get(v)}.`:"",h?"Not saved yet.":"",h&&t.units.some(m=>m.missing!==void 0)&&S(this.ctx.store.view(t.entityUrn)?.status)?"This content is published, and this order is new, so it is live as soon as it is saved.":""].filter(Boolean).join(" "),[...p?[{label:"Move previous",run:()=>f(-1)}]:[],...v?[{label:"Move next",run:()=>f(1)}]:[],{label:"Reorder all\u2026",run:()=>{n.whenEnded(void 0),n.hide(),d(),this.openReorder(e)}},...h?[{label:"Save",primary:!0,run:()=>{n.whenEnded(void 0),n.hide(),this.saveOrder(t,o,()=>{}).then(()=>this.changedOrder())}}]:[],{label:h?"Revert":"Close",run:()=>n.hide()}]),n.whenEnded(d)};l()}orderListeners=new Set;onOrderChange(e){this.orderListeners.add(e)}changedOrder(){for(let e of this.orderListeners)e()}async insert(e,t,n){let i=e.units.map(h=>({key:h.key,sortOrder:h.sortOrder}));await this.view.refresh(e.entityUrn);let s=qn(i,t),o=new Map(e.units.map(h=>[h.key,h]));if(s.shifts.length>0){let h=s.shifts.flatMap(f=>o.get(f.key).bindings.flatMap(p=>{let v=this.ctx.store.itemFor(p);return v?.item.urn?[this.step(p.entry,v.item,e.entityUrn,{name:p.name,sortOrder:f.to})]:[]}));if(!await this.runSteps(h,`Make room in ${e.name}`))return;for(let f of s.shifts)for(let p of o.get(f.key).bindings)this.view.retag(p,f.to);await this.view.refresh(e.entityUrn)}if(this.ctx.store.itemAt(e.entityUrn,e.entry,e.name,s.sortOrder)){this.ctx.toolbar.showMessage(`${e.name} #${s.sortOrder} is taken. Reopen the list and try again.`);return}let a=e.units.at(t.position==="head"?0:-1),d=t.position==="after"?o.get(t.key).element:a.element,l=a.element.cloneNode(!0);for(let h of[l,...l.querySelectorAll("*")])h.removeAttribute("style"),h.removeAttribute("data-baack-state"),h.removeAttribute(`data-${e.entry.attribute}-urn`),h.hasAttribute(`data-${e.entry.attribute}-name`)&&(h.setAttribute(`data-${e.entry.attribute}-sort-order`,String(s.sortOrder)),h.setAttribute("data-placeholder",""));t.position==="head"?e.container.insertBefore(l,d):d.after(l),this.view.track(l),this.panel.close();let u=l.matches(`[data-${e.entry.attribute}-name]`)?l:l.querySelector(`[data-${e.entry.attribute}-name]`);this.editing().open({entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:s.sortOrder,anchor:u??l,binding:void 0})}async relocate(e,t,n,i){let{store:s}=this.ctx;this.editing().close();let o=this.ctx.discovery.all().filter(f=>f.entry===n&&f.name===i.name&&f.sortOrder===i.sortOrder).length,a=await Jn(this.ctx,t,i.name),d=c("div","simple-form");d.append(c("p","hint",`${i.name} #${i.sortOrder} is shown in ${o} ${o===1?"place":"places"} on this page. Those places will show the new item there, or a placeholder.`));let l=new _(`Move or rename ${i.name} #${i.sortOrder}`,[{key:"name",label:"Name",value:i.name},{key:"sortOrder",label:"Sort order",value:String(i.sortOrder)}],"Move",f=>{let p=f.name??"",v=Number(f.sortOrder);if(!/^[A-Za-z0-9_-]+$/.test(p))return l.setError("Use letters, numbers, - and _ in the name.");if(!Number.isInteger(v))return l.setError("The sort order must be a whole number.");if(p===i.name&&v===i.sortOrder)return l.setError("That is where it is now.");l.setBusy(!0,"Checking\u2026"),this.view.refresh(t).then(async()=>{if(l.setBusy(!1),s.itemAt(t,n,p,v)&&!u){u=!0,l.setError(`${p} #${v} is taken. Press Move again to swap the two.`);return}h.close(),await this.moveTo(t,n,i,{name:p,sortOrder:v})})}),u=!1;l.element.insertBefore(d,l.element.querySelector(".error")),a.length>0&&l.element.insertBefore(c("p","issues",`Templates use "${i.name}" and would stop showing it if it is renamed: ${a.join(", ")}.`),l.element.querySelector(".error")),l.element.insertBefore(c("p","issues","Renaming changes the name every client looks this item up by, including apps this editor cannot see. They break when it is published."),l.element.querySelector(".error"));let h=this.ctx.panels.show(l.element,{entityUrn:t})}async moveTo(e,t,n,i){await this.view.refresh(e);let s=this.ctx.store.itemAt(e,t,i.name,i.sortOrder);if(s?.item.urn===n.urn)return!0;let o=s?Yn({key:n.urn,sortOrder:n.sortOrder},{key:s.item.urn,sortOrder:i.sortOrder}).map(d=>this.step(t,d.key===n.urn?n:s.item,e,{name:d.key===n.urn?i.name:n.name,sortOrder:d.to})):[this.step(t,n,e,i)],a=s?`Swap ${n.name} #${n.sortOrder} and ${i.name} #${i.sortOrder}`:i.name===n.name?`Move ${n.name} #${n.sortOrder} to #${i.sortOrder}`:`Rename ${n.name} to ${i.name}`;return await this.runSteps(o,a)?(await this.view.refresh(e),!0):!1}step(e,t,n,i){return{kind:"move",type:e.type,urn:t.urn,entityUrn:n,name:t.name,sortOrder:t.sortOrder,to:i}}async runSteps(e,t){if(e.length===0)return!0;let n=`plan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`;for(let i of e)this.ctx.pending.set({...i,planId:n,label:t});return this.run(n)}async run(e){let{pending:t,transport:n,toolbar:i,feedback:s}=this.ctx,o=t.plan(e);if(o.length===0)return!0;let a=o[0].label,d=o[0].entityUrn,l=this.done.get(e)??[];this.done.set(e,l),i.showMessage(`${a}: moving\u2026`,!0);for(let u of o){let h=this.ctx.entry(u.type);try{let f=(await n.history(h,u.urn)).history[0];if(!f?.urn)throw new Error(`${u.name} #${u.sortOrder} no longer exists`);if(f.name===u.to.name&&f.sortOrder===u.to.sortOrder){t.clear(z(u)),l.push({step:u,urn:f.urn});continue}if(f.urn!==u.urn)throw new Error(`${u.name} #${u.sortOrder} was changed by someone else after this move was planned`);let p={...f,name:u.to.name,sortOrder:u.to.sortOrder},v=await n.update(h,f.urn,J(h,p,M(h,f),u.entityUrn));if(!v?.urn)throw new Error("the API returned no URN for the new version");t.clear(z(u)),l.push({step:u,urn:v.urn}),oe({entityUrn:u.entityUrn,oldUrn:u.urn,newUrn:v.urn,type:h.type,value:v})}catch(f){let p=await s.describe(f,"move this item");return this.showFailure(e,a,l.length,l.length+t.plan(e).length,p.message,p.debug,d),p.kind==="unauthorized"&&s.promptLogin(p.message,()=>{this.run(e)}),!1}}return this.groups()?.add({id:e,label:a,entityUrn:d,versions:l.map(u=>u.urn),at:Date.now()}),this.done.delete(e),this.closeFailure(e),i.showMessage(`${a}: done. Saved as drafts.`,!0,void 0,Se(this.ctx,d)),!0}showFailure(e,t,n,i,s,o,a){let d=c("div","simple-form");d.append(c("div","title",`${t} stopped part-way`),c("p","message",`Moved ${n} of ${i}. ${s}`),...X(o),c("p","hint","The rest is kept with your unsaved changes, in this browser, until you retry or put things back."));let l=c("button","primary","Retry");l.type="button",l.addEventListener("click",()=>{this.run(e).then(async f=>{f&&await this.refreshAfter(e)})});let u=c("button","",n>0?"Put back":"Discard this move");u.type="button",u.addEventListener("click",()=>{this.putBack(e)});let h=c("div","actions");h.append(u,l),d.append(h),this.closeFailure(e),this.failures.set(e,this.ctx.panels.show(d,{entityUrn:a}))}closeFailure(e){this.failures.get(e)?.close(),this.failures.delete(e)}async refreshAfter(e){for(let t of this.ctx.store.entities())await this.view.refresh(t)}async putBack(e){let{pending:t}=this.ctx,n=this.done.get(e)??[],i=t.plan(e);for(let d of i)t.clear(z(d));let s=i[0]?.label??n[0]?.step.label??"Move",o=i[0]?.entityUrn??n[0]?.step.entityUrn;if(this.done.delete(e),n.length===0){this.closeFailure(e),this.ctx.toolbar.showMessage(`${s}: nothing had moved, so nothing changed. The move is discarded.`,!0);return}let a=n.map(({step:d,urn:l})=>({kind:"move",type:d.type,urn:l,entityUrn:d.entityUrn,name:d.to.name,sortOrder:d.to.sortOrder,to:{name:d.name,sortOrder:d.sortOrder}}));await this.runSteps(a,`Put back: ${s}`)&&(this.ctx.toolbar.showMessage(`Put back: ${s}.`,!0),o&&await this.view.refresh(o))}};function Qi(r,e){return(r.querySelector("h1, h2, h3, h4, h5, h6")?.textContent??"").trim().replace(/\s+/g," ")||e}var We=class{layer;onOpen;tags=[];frame=0;resizes=new ResizeObserver(()=>this.schedule());constructor(e,t){this.layer=c("div","order-tags"),e.root.append(this.layer),this.onOpen=t}show(e){if(e.length===this.tags.length&&e.every((i,s)=>this.tags[s].binding===i.binding&&this.tags[s].button.textContent===Zn(i))){this.place();return}let n=this.tags.findIndex(i=>i.button.matches(":focus"));this.clear();for(let i of e){let s=c("button","order-tag",Zn(i));s.type="button",s.setAttribute("aria-label",`Order of ${i.name}: ${i.index+1} of ${i.count}`),s.addEventListener("click",()=>this.onOpen(i.binding)),this.layer.append(s),this.tags.push({binding:i.binding,element:i.binding.element,button:s}),this.resizes.observe(i.binding.element)}this.tags.length>0&&(window.addEventListener("scroll",this.schedule,!0),window.addEventListener("resize",this.schedule)),this.place(),this.tags[n]?.button.focus()}clear(){cancelAnimationFrame(this.frame),this.resizes.disconnect(),window.removeEventListener("scroll",this.schedule,!0),window.removeEventListener("resize",this.schedule),this.layer.replaceChildren(),this.tags=[]}schedule=()=>{cancelAnimationFrame(this.frame),this.frame=requestAnimationFrame(()=>this.place())};place(){for(let{element:e,button:t}of this.tags){let n=e.getBoundingClientRect();t.hidden=e.getClientRects().length===0,t.style.top=`${n.top+4}px`,t.style.right=`${window.innerWidth-n.right+4}px`}}};function Zn(r){return`${r.name} \xB7 ${r.index+1} of ${r.count} \u22EF`}var er="baack-editor:groups:";var qe=class{key;constructor(e){this.key=er+e}all(){try{let e=JSON.parse(window.localStorage.getItem(this.key)??"[]");return Array.isArray(e)?e:[]}catch{return[]}}of(e){return this.all().find(t=>t.versions.includes(e))}add(e){try{let t=[...this.all(),e].slice(-200);window.localStorage.setItem(this.key,JSON.stringify(t))}catch(t){console.warn("Baack editor: could not record which versions belong together.",t)}}};var tr="baack-editor:entities",Xn=1440*60*1e3,nr=4,ir=[500,2e3];function W(r){return r.replace(/^\/[^/]+\/content(?=\/|$)/,"")||"/"}var Ye=class{transport;owners;cache=new Map;key;search;constructor(e,t,n){this.transport=e,this.owners=t,this.key=`${tr}:${n??"anonymous"}`;try{let i=JSON.parse(localStorage.getItem(this.key)??"[]");for(let s of i)Date.now()-s.at<Xn&&this.cache.set(s.urn,s)}catch{}}get(e){return this.cache.get(e)}async describe(e){return this.cache.get(e)??this.remember(await this.transport.readEntity(e))}remember(e){let t={urn:e.urn,name:e.name,path:W(e.name),language:e.language,variant:e.variant??"",at:Date.now()};return this.cache.set(t.urn,t),this.search=this.search?.then(n=>({...n,urns:n.urns.includes(t.urn)?n.urns:[...n.urns,t.urn]})),this.save(),t}async list(e){this.search??=this.searchAll().catch(u=>{throw this.search=void 0,u});let{urns:t,complete:n}=await this.search,i=()=>({entities:t.flatMap(u=>this.cache.get(u)??[]).sort(rr),complete:n}),s=t.filter(u=>!this.fresh(u));s.length>0&&e?.(i());let o,a=[...s],d=async()=>{for(let u=a.shift();u;u=a.shift())try{this.remember(await this.readWithRetry(u)),e?.(i())}catch(h){N(h)&&h.isNotFound||(o??=h)}};if(await Promise.all(Array.from({length:Math.min(nr,s.length)},d)),o)throw o;let l=i();return e?.(l),l}async readWithRetry(e){for(let t of ir)try{return await this.transport.readEntity(e)}catch(n){if(!(N(n)&&n.status===429))throw n;await new Promise(i=>setTimeout(i,t))}return this.transport.readEntity(e)}async searchAll(){let e=await Promise.all((await this.owners()).map(t=>this.transport.searchEntities(t)));return{urns:[...new Set(e.flatMap(t=>t.urns))],complete:e.every(t=>t.complete)}}fresh(e){let t=this.cache.get(e);return t!==void 0&&Date.now()-t.at<Xn}save(){try{localStorage.setItem(this.key,JSON.stringify([...this.cache.values()]))}catch{}}};function rr(r,e){return r.path.localeCompare(e.path)||r.language.localeCompare(e.language)||r.variant.localeCompare(e.variant)}var Qn="/home";function Je(r){let e=r.replace(/\/index\.html?$/,"/").replace(/\/+$/,"");return e===""?Qn:e}function ei(r){return r===Qn?"/":r}function Et(r){return r.endsWith("/")}var Ze=class{deps;constructor(e){this.deps=e}async offerEntityForPage(){let{transport:e,panels:t}=this.deps,n=(this.deps.entityNameForPage??Je)(location.pathname),i=document.documentElement.lang||"en-GB";try{let s=await e.entityView(n,{version:"LATEST",language:i}),o=c("div","simple-form");o.append(c("div","title","Content for this page exists"),c("p","hint","Add this to the page's root element so the editor and the site can find it:"),ti(s.urn));let a=c("button","primary","Use it for this visit");a.type="button",a.addEventListener("click",()=>{document.documentElement.setAttribute(U,s.urn),d.close()}),o.append(de(a));let d=t.show(o)}catch(s){N(s)&&s.isNotFound?await this.showCreateEntity(n,i):this.deps.report(s,"look up this page",()=>{this.offerEntityForPage()})}}async showCreateEntity(e,t){let{panels:n}=this.deps,i=await this.newEntityForm({title:"This page has no content in Baack yet",submitLabel:"Create content for this page",path:e,pathLabel:"Name of this page's content",hint:`No content named ${e} (${t}) was found for ${location.pathname}.`,language:t,onCreated:s=>{let o=c("div","simple-form");o.append(c("div","title","Content created (in draft)"),c("p","hint","Add this to the page's root element. Until then, the editor uses it for this visit:"),ti(s.urn),c("p","hint",'Next: create the items this page shows, with "Create all" on its content.'));let a=c("button","primary","Show its items");a.type="button",a.addEventListener("click",()=>this.deps.openEntity(s.urn)),o.append(de(a)),n.show(o),document.documentElement.setAttribute(U,s.urn)}});n.show(i.element)}async offerNewEntity(e){let{panels:t}=this.deps,n=await this.newEntityForm({title:"New entity",submitLabel:"Create entity",path:"",language:e,onCreated:i=>{let s=c("div","simple-form"),o=c("pre","snippet",i.urn),a=c("button","","Copy URN");a.type="button",a.addEventListener("click",()=>{navigator.clipboard?.writeText(i.urn).then(()=>a.textContent="Copied",()=>a.textContent="Select and copy it")});let d=c("button","","Done");d.type="button",d.addEventListener("click",()=>l.close()),s.append(c("div","title",`Created ${W(i.name)} (${i.language}) in draft`),c("p","hint","Choose it in a reference item, or use its URN in the site:"),o,de(a,d));let l=t.show(s)}});t.show(n.element)}async newEntityForm(e){let{transport:t}=this.deps,n=await this.owners(),i=new _(e.title,[{key:"name",label:e.pathLabel??"Path, such as /menu",value:e.path},{key:"language",label:"Language",value:e.language},{key:"variant",label:"Variant (optional)",value:e.variant??""},...n.length>1?[{key:"owner",label:"Owner",value:n[0].urn,options:n.map(s=>({value:s.urn,label:s.name??s.urn}))}]:[]],e.submitLabel,s=>{let o=s.owner??n[0]?.urn,a=s.name??"",d=s.language??"",l=s.variant??"";if(!o)return i.setError("No company was found to own the content.");if(!a.startsWith("/"))return i.setError("The path must start with /, like /menu.");if(Et(a))return i.setError(`Content has no index: give it a name of its own, without a trailing /, such as ${Je(a)}.`);if(!d)return i.setError("Enter a language, such as en-GB.");i.setError(""),i.setBusy(!0,"Creating\u2026"),this.existing(a,d,l).then(u=>{if(u){i.setBusy(!1),i.setError(`${a} (${d}${l?` \xB7 ${l}`:""}) already exists.`);return}return t.createEntity({owner:{urn:o},status:"DRAFT_UNPUBLISHED",name:a,language:d,variant:l}).then(h=>{this.deps.created(h),e.onCreated(h)})}).catch(u=>{i.setBusy(!1),i.setError(se(u,"create the entity").message)})},e.onCancel);return e.hint&&i.element.insertBefore(c("p","hint",e.hint),i.element.querySelector("label")),i}async existing(e,t,n){try{let i=await this.deps.transport.entityView(e,{version:"LATEST",language:t,variant:n});return W(i.name)===e&&i.language.toLowerCase()===t.toLowerCase()&&(i.variant??"")===n?i:void 0}catch(i){if(N(i)&&i.isNotFound)return;throw i}}offerNewPageLike(e){let{transport:t,panels:n,store:i,context:s}=this.deps,o=i.view(e);if(!o)return;let a=new _("New page like this",[{key:"name",label:"Path of the new page",value:W(o.raw.name)},{key:"language",label:"Language, such as fr-FR",value:o.language,required:!0},{key:"variant",label:"Variant (optional, empty for the default)",value:o.variant??""}],"Create page",d=>{let l=d.name??"",u=d.language??"",h=d.variant??"",f=o.raw.owner?.urn??s.company?.urn;if(!l.startsWith("/"))return a.setError("The path must start with /, like /blog/new-post.");if(Et(l))return a.setError(`Content has no index: give it a name of its own, without a trailing /, such as ${Je(l)}.`);if(!u)return a.setError("Enter a language, such as fr-FR.");if(!f)return a.setError("No company was found to own the content.");a.setError(""),a.setBusy(!0,"Creating\u2026"),this.existing(l,u,h).then(p=>{if(p){a.setBusy(!1),a.setError(`${l} (${u}${h?` \xB7 ${h}`:""}) already exists. Change the path, language or variant.`);return}return t.createEntity({owner:{urn:f},status:"DRAFT_UNPUBLISHED",name:l,language:u,variant:h}).then(v=>(this.deps.created(v),this.copyItems(e,v.urn,l,0,{language:u,variant:h})))}).catch(p=>{a.setBusy(!1),a.setError(se(p,"create the page").message)})});n.show(a.element,{entityUrn:e})}async copyItems(e,t,n,i,s){let{transport:o,panels:a,store:d,registry:l}=this.deps,u=d.view(e),f=s&&(s.language.toLowerCase()!==u.language.toLowerCase()||s.variant!==(u.variant??""))?`${n} (${s.language}${s.variant?` \xB7 ${s.variant}`:""})`:n,p=l.flatMap(y=>(u.raw[y.entityArray]??[]).map(x=>[y,x])),v=c("p","hint");v.setAttribute("role","status");let m=c("div","simple-form");m.append(c("div","title",`Creating ${f}`),v),a.show(m,{entityUrn:e});for(let y=i;y<p.length;y+=1){let[x,b]=p[y];v.textContent=`Copying item ${y+1} of ${p.length}\u2026`;try{let k=x.renderedByView?M(x,await o.read(x,b.urn)):M(x,b),A={name:b.name,sortOrder:b.sortOrder};await o.create(x,J(x,A,k,t))}catch(k){v.textContent=`Copied ${y} of ${p.length}. ${se(k,`copy ${b.name}`).message}`;let A=c("button","primary","Copy the rest");A.type="button",A.addEventListener("click",()=>{this.copyItems(e,t,n,y,s)}),m.append(de(A));return}}let g=c("a","",`Open ${n}`);g.href=n,v.textContent=`Created ${f} in draft with ${p.length} items. Images need their files uploaded again. A site built ahead of time shows the page after its next build.`,m.append(de(g))}async owners(){let e=this.deps.context.company?[this.deps.context.company]:[];try{let t=await this.deps.transport.companies(),n=this.deps.context.company?.urn;return t.length>0?[...t].sort((i,s)=>i.urn===n?-1:s.urn===n?1:0):e}catch{return e}}};function ti(r){let e=c("div","simple-form"),t=c("pre","snippet",`<html data-entity-urn="${r}">`),n=c("button","","Copy");return n.type="button",n.addEventListener("click",()=>{navigator.clipboard?.writeText(`data-entity-urn="${r}"`).then(()=>n.textContent="Copied",()=>n.textContent="Select and copy it")}),e.append(t,de(n)),e}function de(...r){let e=c("div","actions");return e.append(...r),e}function ni(r,e,t){let n=c("p","hint",e.note??"");n.setAttribute("role","status");let i=[n];for(let d of e.blockers)i.push(c("p","error",d));for(let d of e.warnings)i.push(c("p","issues",d));let s=c("ul","rows");s.setAttribute("aria-label","Changes that will go live");for(let d of e.changes){let l=c("li","row history-row"),u=c("div","row-main"),h=d.select?c("button","row-name link",d.name):c("span","row-name",d.name);h instanceof HTMLButtonElement&&(h.type="button",P(h,"Show its history"),h.addEventListener("click",()=>d.select?.())),u.append(h,c("span","meta",` #${d.sortOrder} \xB7 ${d.type}`),c("span",`status status-${d.kind==="changed"?"unpublished-changes":"note"}`,d.kind),...(d.notes??[]).map(f=>c("span","status note move",f))),l.append(u,fe(d.change)),s.append(l)}e.changes.length===0&&i.push(c("p","hint","Nothing has changed since the last publish.")),i.push(s);let o=c("div","actions");if(t.schedule){let d=t.schedule,l=c("button","","Schedule\u2026");l.type="button",P(l,"Publish at a later time"),l.disabled=e.blockers.length>0,l.addEventListener("click",()=>d()),o.append(l)}let a=c("button","primary",e.confirmLabel);a.type="button",a.disabled=e.blockers.length>0,a.addEventListener("click",()=>t.confirm(a)),o.append(a),i.push(o),r.replaceChildren(...i)}function ii(r,e,t,n){let i=c("p","hint","The content goes live by itself at this time. Until then it stays a draft, and you can cancel the schedule."),s=c("label","field"),o=c("input");o.type="datetime-local",s.append(c("span","caption","Publish at (your local time)"),o);let a=c("div","actions"),d=c("button","","Cancel");d.type="button",d.addEventListener("click",n);let l=c("button","primary",e);l.type="button",l.disabled=!0,o.addEventListener("input",()=>l.disabled=!o.value),l.addEventListener("click",()=>t(o.value,l)),a.append(d,l),r.replaceChildren(i,s,a)}var ri=[1,2,4,8,15],Xe=class{ctx;stack;hooks;reviewing;view;tracked=new Map;stuckAfterMs;active=!1;constructor(e,t,n,i,s){this.ctx=e,this.view=t,this.stuckAfterMs=n,this.stack=i,this.hooks=s,window.addEventListener("focus",()=>{this.refreshAll()}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&this.refreshAll()})}start(){this.active=!0,this.render()}stop(){this.active=!1;for(let e of this.tracked.values())clearTimeout(e.timer);this.tracked.clear(),this.reviewing=void 0,this.ctx.toolbar.setLifecycle([])}changed(){if(this.active){for(let e of this.ctx.store.entities()){let t=this.ctx.store.view(e)?.status;t&&this.observe(e,t)}this.render()}}async refreshAll(){this.active&&await Promise.all(this.ctx.store.entities().map(e=>this.refreshStatus(e)))}async refreshStatus(e){try{let t=await this.ctx.transport.readEntity(e);this.observe(e,t.status,t.publishTimestamp??void 0),this.render()}catch(t){this.ctx.feedback.report(t,"check the publishing status",()=>{this.refreshStatus(e)})}}observe(e,t,n){let i=this.ctx.store.view(e);if(i){let d=i.raw;d.status=t,n!==void 0&&(d.publishTimestamp=n)}let s=this.tracked.get(e),o=s?.status,a=s??{status:t,attempt:0};a.status=t,t==="PUBLISH"?(a.publishingSince??=Date.now(),this.poll(e,a)):(clearTimeout(a.timer),delete a.timer,delete a.publishingSince,a.attempt=0),this.tracked.set(e,a),o!==void 0&&o!==t&&(Rn({entityUrn:e,status:t,previous:o}),o==="PUBLISH"&&S(t)&&this.published(e))}published(e){Nn(e),this.ctx.announcePublished(e,`${this.ctx.entityTitle(e)} is published.`,{quiet:!0}),this.view.refresh(e)}poll(e,t){if(t.timer)return;let n=ri[Math.min(t.attempt,ri.length-1)];t.attempt+=1,t.timer=setTimeout(()=>{delete t.timer,this.active&&this.refreshStatus(e)},n*1e3)}render(){if(!this.active)return;let e=ne(this.ctx.store,this.ctx.store.entities()).map(t=>this.row(t));this.ctx.toolbar.setLifecycle(e)}row(e){let{canPublish:t}=this.ctx,n=this.ctx.store.view(e),i=this.tracked.get(e)?.status??n?.status,s=this.ctx.entityTitle(e),o=t?"Publish\u2026":"Request approval\u2026",a=t?"Review and publish\u2026":"Request approval\u2026",d={entityUrn:e,title:s,label:ue(i),verbs:[]};switch(i){case"DRAFT_UNPUBLISHED":d.verbs.push({label:o,primary:!0,run:()=>{this.openReview(e)}});break;case"PUBLISH_PENDING":{let l=n?.raw.publishTimestamp;l&&(d.label=`Scheduled for ${new Date(C(l)).toLocaleString()}`),t&&d.verbs.push({label:"Cancel schedule",run:()=>this.confirmDraft(e,"Cancel the schedule?")});break}case"PUBLISH":{let l=this.tracked.get(e)?.publishingSince??Date.now();Date.now()-l>this.stuckAfterMs&&(d.note="Publishing is taking longer than expected. Publishing again is safe; if that does not help, contact support.",t&&d.verbs.push({label:"Publish again",run:()=>{this.setStatus(e,"PUBLISH",void 0)}}));break}case"PUBLISHED_WITH_DRAFTS":d.verbs.push({label:a,primary:!0,run:()=>{this.openReview(e)}}),t&&d.verbs.push({label:"Unpublish",run:()=>this.confirmDraft(e,"Unpublish this content?")});break;case"PUBLISHED":t&&d.verbs.push({label:"Unpublish",run:()=>this.confirmDraft(e,"Unpublish this content?")});break;default:break}return d}confirmDraft(e,t){this.hooks.show(ze({id:`draft:${e}`,title:t,meta:this.ctx.entityTitle(e),blocks:[],description:"The content stays in Baack but is no longer public. You can publish it again, now or at a later time.",choices:[{label:"Cancel",run:()=>this.stack.pop()},{label:"Back to draft",primary:!0,run:n=>{n.disabled=!0,this.setStatus(e,"DRAFT_UNPUBLISHED",void 0).then(i=>{i?this.stack.popTo(`entity:${e}`):n.disabled=!1})}}]}),e)}async openReview(e,t){let{store:n,views:i,canPublish:s}=this.ctx,o=n.view(e)?.status;if(o==="PUBLISH")return;let a;try{a=await i.read(e)}catch{a=void 0}let d=n.view(e).raw,l=si(d,this.ctx.registry),u=await this.changes(e,d,a),{blockers:h,warnings:f}=await this.checks(d),p=`review:${e}`,v=`${u.length} ${u.length===1?"change":"changes"}`,m=this.reviewing?.id===p&&this.stack.path.includes(p)?this.reviewing:void 0,g=m?.body??c("div","level-review");if(ni(g,{changes:u,blockers:h,warnings:f,confirmLabel:s?`Publish ${v}`:"Request approval",...t?{note:t}:{}},{confirm:x=>{this.confirm(e,l,u,void 0,x)},...s&&o==="DRAFT_UNPUBLISHED"?{schedule:()=>this.stack.push(this.scheduleLevel(e,l,u,`Schedule ${v}`))}:{}}),m){this.stack.popTo(p);return}this.reviewing={entityUrn:e,id:p,body:g};let y=this.ctx.entityTitle(e).replace(/^Content for /,"");this.hooks.show({id:p,title:`${s?"Review and publish":"Request approval for"} ${y}`,render:()=>g,dispose:()=>{this.reviewing?.body===g&&(this.reviewing=void 0)}},e)}scheduleLevel(e,t,n,i){let s=c("div","level-schedule");return ii(s,i,(o,a)=>{this.confirm(e,t,n,o,a)},()=>this.stack.pop()),{id:`schedule:${e}`,title:"Schedule the publish",render:()=>s}}async confirm(e,t,n,i,s){let{views:o,feedback:a,canPublish:d}=this.ctx;s.disabled=!0;try{let l=await o.read(e,{version:"LATEST"}),u=si(l,this.ctx.registry);if(u.size!==t.size||[...u].some(h=>!t.has(h))){await this.view.refresh(e),await this.openReview(e,"The content changed while you were reviewing. Check the list again before publishing.");return}if(d){let h=i?new Date(i).toISOString().replace("Z",""):void 0;if(!await this.setStatus(e,"PUBLISH",h)){s.disabled=!1;return}}else await this.requestApproval(e,n);this.stack.popTo(`entity:${e}`)}catch(l){s.disabled=!1,a.report(l,d?"publish":"request approval",()=>{this.confirm(e,t,n,i,s)})}}async setStatus(e,t,n){let{transport:i,feedback:s}=this.ctx;try{let o=await i.readEntity(e),a=await i.updateEntity(e,{owner:{urn:o.owner.urn},name:o.name,language:o.language,variant:o.variant??"",status:t,...n?{publishTimestamp:n}:{}}),d=this.tracked.get(e)?.status;return this.observe(e,a.status,a.publishTimestamp??void 0),t==="PUBLISH"&&d!=="PUBLISH"&&S(a.status)&&(a.status==="PUBLISHED"?this.published(e):(this.ctx.announcePublished(e,`${this.ctx.entityTitle(e)} was published, but some changes are still not live.`,{info:!1}),this.view.refresh(e))),this.render(),t==="DRAFT_UNPUBLISHED"&&await this.view.refresh(e),!0}catch(o){return s.report(o,t==="PUBLISH"?"publish":"move the content back to draft",()=>{this.setStatus(e,t,n)}),!1}}async requestApproval(e,t){let{transport:n,store:i,toolbar:s}=this.ctx,a=i.view(e).raw.owner?.urn,d=this.ctx.entityTitle(e).replace(/^Content for /,""),l=t.map(h=>`- ${h.name} #${h.sortOrder} (${h.type}): ${h.kind}`),u=await n.createTask({...a?{owner:{urn:a}}:{},title:`Review and publish ${d}`,description:[`Page: ${location.href}`,`Entity: ${e}`,"","Changes:",...l].join(`
|
|
17
|
+
`),status:"PENDING",priority:"MEDIUM",associatedEntities:[{urn:e}]});s.showMessage(`Approval requested (task ${u.urn?.slice(0,8)??""}).`,!0)}async changes(e,t,n){let i=(o,a)=>()=>a.urn?this.ctx.hooks.openHistory({entityUrn:e,entry:o,name:a.name,sortOrder:a.sortOrder,urn:a.urn}):void 0,s=[];for(let o of this.ctx.registry){let a=t[o.entityArray]??[],d=n?.[o.entityArray]??[],l=new Map(d.map(m=>[m.urn,m])),u=m=>`${m.name}#${m.sortOrder}`,h=new Map(d.map(m=>[u(m),m])),f=a.filter(m=>!l.has(m.urn)),p=await Promise.all(f.map(m=>this.liveVersionOf(o,m,l,h.get(u(m))))),v=new Set(a.filter(m=>l.has(m.urn)).map(m=>m.urn));f.forEach((m,g)=>{let y=p[g];y&&v.add(y.urn);let x=y?or(y,m):[],b=!y||!be(o,M(o,y),M(o,m));s.push({name:m.name,sortOrder:m.sortOrder,type:o.label,kind:y?"changed":"new",change:b?oi(o,y,m):sr(x.join("; ")),...b&&x.length>0?{notes:x}:{},select:i(o,m)})});for(let m of d)!v.has(m.urn)&&!a.some(g=>u(g)===u(m))&&s.push({name:m.name,sortOrder:m.sortOrder,type:o.label,kind:"removed",change:oi(o,m,void 0)})}return s}async liveVersionOf(e,t,n,i){try{let{history:s,pagination:o}=await this.ctx.transport.history(e,t.urn),a=s.find(d=>n.has(d.urn));return a?n.get(a.urn):o?.isMorePages?i:void 0}catch{return i}}async checks(e){let t=(e.images??[]).flatMap(i=>kt(i,this.ctx.requiredImageSlots).map(s=>`${i.name} #${i.sortOrder} has no ${s==="DEFAULT"?"image":s.toLowerCase()} file. Upload one before publishing.`)),n=[];for(let i of e.references??[]){let s=i.entityReference?.urn;if(s)try{let o=await this.ctx.transport.readEntity(s);(o.status==="DRAFT_UNPUBLISHED"||o.status==="PUBLISHED_WITH_DRAFTS")&&n.push(`${i.name} refers to content that ${o.status==="DRAFT_UNPUBLISHED"?"is not published":"has unpublished changes"} (${o.name}).`)}catch{n.push(`${i.name} refers to content that could not be checked.`)}}return{blockers:t,warnings:n}}};function kt(r,e){let t={DEFAULT:"src",MEDIUM:"mediumSrc",LARGE:"largeSrc"};return e.filter(n=>!r[t[n]])}function si(r,e){let t=new Set;for(let n of e)for(let i of r[n.entityArray]??[])i.urn&&t.add(i.urn);return t}function oi(r,e,t){let n=o=>{let a=o?.value;if(typeof a=="string")return r.renderedByView?new DOMParser().parseFromString(a,"text/html").body.textContent??"":a},i=n(e),s=n(t);return i!==void 0||s!==void 0?De(i??"",s??""):e?t?Ue(r,e,t):`Removed: ${F(r,e)}`:F(r,t)}var sr=r=>r.charAt(0).toUpperCase()+r.slice(1);function or(r,e){let t=[];r.name!==e.name&&t.push(`renamed from ${r.name}`);let n=e.sortOrder-r.sortOrder;return n!==0&&t.push(`moved #${r.sortOrder} \u2192 #${e.sortOrder} (${n>0?"+":"\u2212"}${Math.abs(n)})`),t}var Qe=class{stack;onOpen;constructor(e,t,n=()=>{}){this.onOpen=t,this.stack=new _e(e),this.stack.element.classList.add("outline"),this.stack.onClose(n)}get element(){return this.stack.element}get isOpen(){return this.stack.isOpen}open(){this.stack.open(),this.onOpen()}close(){this.stack.close()}focusFilter(){this.element.querySelector('.stack-level:not([hidden]) input[type="search"]')?.focus()}renderSection(e,t){let n=e.querySelector('input[type="search"]')?.value??"",i=[];if(t.subtitle||t.verbs?.length){let o=c("div","level-lifecycle");if(o.setAttribute("role","group"),o.setAttribute("aria-label","Lifecycle"),t.subtitle&&o.append(c("p","section-status lifecycle-status",t.subtitle)),t.note&&o.append(c("p","message",t.note)),t.verbs?.length){let a=c("div","actions");a.append(...t.verbs.map(d=>this.button(d))),o.append(a)}i.push(o)}let s=c("input");s.type="search",s.placeholder="Filter by name or type",s.setAttribute("aria-label","Filter items"),s.value=n,s.addEventListener("input",()=>ai(e,s.value)),i.push(s);for(let o of t.groups){if(o.rows.length===0)continue;let a=c("div","outline-group"),d=c("div","group-heading");d.append(c("span","group-label",`${o.label} (${o.rows.length})`)),o.action&&d.append(this.button(o.action)),a.append(d),o.hint&&a.append(c("p","group-hint",o.hint));let l=c("ul","rows");l.setAttribute("aria-label",o.label),l.append(...o.rows.map(u=>this.row(u))),a.append(l),i.push(a)}if(t.actions.length>0){let o=c("div","actions");o.append(...t.actions.map(a=>this.button(a))),i.push(o)}e.replaceChildren(...i),ai(e,n),e.querySelector("li.row.current")?.scrollIntoView({block:"nearest"})}row(e){let t=c("li",e.current?"row current":"row");e.current&&t.setAttribute("aria-current","true"),t.dataset.filter=`${e.name} ${e.type}`.toLowerCase();let n=c(e.select?"button":"div","row-main");n instanceof HTMLButtonElement&&(n.type="button",n.dataset.row="",n.addEventListener("click",()=>e.select?.(t))),n.append(c("span","row-name",e.name),c("span","meta",` #${e.sortOrder} \xB7 ${e.type}`),...e.status?[c("span",`status status-${e.status.replace(/\s+/g,"-")}`,e.status)]:[],...(e.notes??[]).map(i=>c("span","status note",i))),t.append(n);for(let i of e.flags)t.append(c("span","flag",i));e.action&&t.append(this.button(e.action));for(let i of e.actions??[])t.append(this.button(i));return t}button(e){let t=T(e.label,Y(e),"sm");return e.disabled&&(t.disabled=!0,t.title=e.disabled),t.addEventListener("click",()=>e.run(t)),t}};function ai(r,e){let t=e.trim().toLowerCase();for(let n of r.querySelectorAll("li.row"))n.hidden=t!==""&&!n.dataset.filter.includes(t)}var ar=/<\/?[a-z!][^>]*>/i,et=class{outline;ctx;view;editing;saving;onboarding;live=new Map;focus;selected;levels=new Map;closed;panels=0;newEntity;constructor(e,t,n,i,s){this.ctx=e,this.view=t,this.editing=n,this.saving=i,this.onboarding=s,this.outline=new Qe(e.host,()=>{this.outline.stack.path.length===0?this.openAt(te(e.store),{focus:!1}):this.render()},()=>{this.focus=void 0,this.selected=void 0,this.closed?.()})}onClose(e){this.closed=e}changed(e){e&&this.live.delete(e),this.outline.isOpen&&this.render()}clear(){this.outline.close(),this.outline.stack.reset([]),this.levels.clear(),this.live.clear(),this.focus=void 0}setNewEntity(e){this.newEntity=e,this.outline.isOpen&&this.render()}toggle(){this.outline.isOpen?this.outline.close():this.outline.open()}openEntity(e){this.selected=void 0,this.focus=void 0,this.openAt(e)}selectItem(e){this.focus=void 0,this.selected={entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder},this.openAt(e.entityUrn)}focusSlot(e){this.focus={entityUrn:e.entityUrn,entry:e.entry,name:e.name,sortOrder:e.sortOrder},this.openAt(e.entityUrn,{slots:!0})}showAbove(e,t){let{stack:n}=this.outline,i=[`entity:${e}`,`review:${e}`];if(this.outline.isOpen&&i.includes(n.current?.id??"")){n.push(t);return}this.focus=void 0,this.selected=void 0,this.openAt(e,{above:t})}showPanel(e,t={}){let{stack:n}=this.outline,i=e.querySelector(":scope > .title"),s=t.title??i?.textContent??"Editor";t.title||i?.remove(),this.panels+=1;let o=`panel:${this.panels}`,a=!0,d={id:o,title:s,render:()=>e,dispose:()=>{a=!1,t.onLeave?.()}},l={get isOpen(){return a},close:()=>{let f=n.path,p=f.indexOf(o);p>0&&n.popTo(f[p-1])}};e.addEventListener("cancel",()=>l.close());let u=t.focus??!0,h=this.outline.isOpen&&n.path.length>0;return h&&n.current?.id.startsWith("panel:")?n.replace(d,{focus:u}):h&&(!t.entityUrn||n.path.includes(`entity:${t.entityUrn}`))?n.push(d,{focus:u}):(this.focus=void 0,this.selected=void 0,this.openAt(t.entityUrn,{above:d,focus:u})),l}openAt(e,{slots:t=!1,focus:n=!0,above:i=void 0}={}){let s=[this.pageLevel()];e&&this.ctx.store.view(e)&&s.push(this.entityLevel(e)),t&&this.focus&&s.push(this.slotsLevel(this.focus)),i&&s.push(i),this.outline.stack.reset(s,{focus:n}),this.outline.open(),this.render()}async render(){this.outline.isOpen&&await Promise.all(this.outline.stack.path.map(e=>this.levels.get(e)?.refresh()))}remember(e,t,n){return this.levels.set(e.id,{level:e,body:t,refresh:n}),e}pageLevel(){let e=c("div","level-page"),t={id:"page",title:"This page",render:()=>e};return this.remember(t,e,()=>{let{store:n,toolbar:i}=this.ctx,s=ne(n,n.entities()),o=s.map(a=>zn(this.ctx.entityTitle(a),i.lifecycleOf(a)?.label??ue(n.view(a)?.status),()=>this.outline.stack.push(this.entityLevel(a))));if(s.length===0&&o.push(c("p","hint","No content has loaded for this page.")),this.newEntity){let a=this.newEntity,d=c("button","","New entity\u2026");d.type="button",P(d,"Create an entity, such as a menu shared by many pages"),d.addEventListener("click",()=>a());let l=c("div","actions");l.append(d),o.push(l)}e.replaceChildren(...o)})}entityLevel(e){let t=`entity:${e}`,n=this.levels.get(t);if(n)return n.level;let i=c("div","level-entity"),s={id:t,title:this.ctx.entityTitle(e),render:()=>i,onShow:()=>{this.render()}};return this.remember(s,i,async()=>{if(!this.ctx.store.view(e))return;let o=await this.section(e,e===te(this.ctx.store));this.outline.stack.path.includes(t)&&this.outline.renderSection(i,o)})}togglePending(){if(this.outline.isOpen&&this.outline.stack.current?.id==="unsaved"){this.outline.close();return}this.focus=void 0,this.selected=void 0,this.outline.stack.reset([this.pageLevel(),this.pendingLevel()]),this.outline.open()}pendingLevel(){let e=c("div","level-unsaved"),t={id:"unsaved",title:"Unsaved changes",render:()=>e};return this.remember(t,e,()=>e.replaceChildren(...this.ctx.toolbar.pendingSections()))}slotsLevel(e){let t=c("div","level-slots"),n={id:"slots",title:`Slots for ${e.name}`,render:()=>t};return this.remember(n,t,()=>{!this.focus||!this.ctx.store.view(this.focus.entityUrn)||this.outline.renderSection(t,this.slotsSection(this.focus))})}slotsSection(e){let{store:t,hooks:n}=this.ctx,{entityUrn:i,entry:s,name:o}=e,a=(t.view(i).raw[s.entityArray]??[]).filter(h=>h.name===o&&h.urn).sort((h,f)=>h.sortOrder-f.sortOrder),d=a.find(h=>h.sortOrder===e.sortOrder),l=async h=>{d&&await n.moveSlot(e,d,h)&&(this.focus={...e,sortOrder:h},this.render())},u=a.map(h=>h===d?{name:o,sortOrder:h.sortOrder,type:s.label,status:"moving",flags:[],current:!0,actions:[{label:"Rename\u2026",run:()=>n.rename(e,h)}]}:{name:o,sortOrder:h.sortOrder,type:s.label,status:"",flags:[],...d?{actions:[{label:`Swap with #${d.sortOrder}`,run:()=>{l(h.sortOrder)}}]}:{}});if(d){let h=new Set(a.map(m=>m.sortOrder)),f=a[0]?.sortOrder??0,p=a.at(-1)?.sortOrder??0,v=Array.from({length:Math.max(0,p-f)},(m,g)=>f+g).filter(m=>!h.has(m));for(let m of[...v.length<=5?v:[],p+1])u.push({name:o,sortOrder:m,type:s.label,status:"empty",flags:[],actions:[{label:"Move here",run:()=>{l(m)}}]});u.sort((m,g)=>m.sortOrder-g.sortOrder)}return{subtitle:d?`Moving ${o} #${d.sortOrder}. Swap it with another, move it to a free sort order, or rename it.`:`${o} #${e.sortOrder} is no longer here.`,groups:[{label:`Slots for ${o}`,rows:u}],actions:[{label:"Show all items",run:()=>{this.focus=void 0,this.outline.stack.popTo(`entity:${i}`)}}]}}async section(e,t){let{store:n,pending:i,registry:s}=this.ctx,o=n.view(e),{urns:a,found:d}=await this.counterpartUrns(e),l=this.view.mode==="live"?!this.view.draftsOnLivePage.has(e):S(o.status)||d,u=[],h=[],f=[];for(let m of s){let g=o.raw[m.entityArray]??[];for(let y of g){if(!y.urn)continue;let x={entityUrn:e,entry:m,name:y.name,sortOrder:y.sortOrder},b=this.view.bindingsAt(x),k=b.filter(q=>!q.element.closest("head")),A=g.filter(q=>q.name===y.name&&q.sortOrder===y.sortOrder).length,K=y.urn,dt={name:y.name,sortOrder:y.sortOrder,type:m.label,status:i.getEdit(K)?"unsaved":l?a.has(K)?"up to date":"unpublished changes":"",flags:[...dr(m,y,A,this.ctx.requiredImageSlots),...b.some(q=>q.element.hasAttribute("data-text-unsafe-literal"))?["the site renders this as HTML"]:[]],action:{label:"History",run:()=>this.ctx.hooks.openHistory({...x,urn:K})},...this.referenceAction(y),current:di(this.selected,x),select:q=>{let Mt={...x,urn:K,anchor:q,binding:k[0]};k[0]&&k[0].element.scrollIntoView({block:"center"}),this.editing.open(k[0]&&k[0].element.getClientRects().length>0?Mt:{...Mt,binding:void 0})}};k.length>0?u.push(dt):b.length>0||!m.component?h.push(dt):f.push({...dt,notes:["not used"]})}}let p=this.view.missingBindings(e).map(m=>{let g=H({entityUrn:e,type:m.entry.type,name:m.name,sortOrder:m.sortOrder});return{name:m.name,sortOrder:m.sortOrder,type:m.entry.label,status:i.getCreate(g)?"unsaved":"not in content",flags:[],current:di(this.selected,{entityUrn:e,entry:m.entry,name:m.name,sortOrder:m.sortOrder}),action:{label:"Create",run:y=>{m.element.getClientRects().length>0&&m.element.scrollIntoView({block:"center"}),this.editing.open({entityUrn:e,entry:m.entry,name:m.name,sortOrder:m.sortOrder,anchor:y,binding:m})}}}}),v=this.ctx.toolbar.lifecycleOf(e);return{subtitle:v?.label??ue(o.status),...v?.note?{note:v.note}:{},verbs:(v?.verbs??[]).map(m=>({label:m.label,run:()=>m.run(),...m.primary?{primary:!0}:{},...m.disabled?{disabled:m.disabled}:{}})),groups:[{label:"On this page",rows:u},{label:"Page settings",rows:h},{label:"Not used on this page",rows:f,hint:"In the content, but nothing on this page shows them."},{label:"In the page, not in the content",rows:p,hint:"Content items on the page that are not saved in the content yet. Each shows its placeholder until it is created.",action:{label:"Create all",run:()=>this.saving.confirmCreateAll(e,p.length)}}],actions:[{label:"Add item",run:m=>this.showAddItem(e,m)},...t?[{label:"New page like this",run:()=>this.onboarding.offerNewPageLike(e)}]:[]]}}referenceAction(e){let t=e.entityReference?.urn;return!t||!this.ctx.store.view(t)?{}:{actions:[{label:`${this.ctx.entityTitle(t)} \u203A`,run:()=>this.outline.stack.push(this.entityLevel(t))}]}}counterpartUrns(e){let t=this.live.get(e);return t||(t=this.ctx.views.read(e,this.view.mode==="live"?{version:"LATEST"}:{}).then(n=>{let i=new Set;for(let s of this.ctx.registry)for(let o of n[s.entityArray]??[])o.urn&&i.add(o.urn);return i}).then(n=>({urns:n,found:!0})).catch(()=>({urns:new Set,found:!1})),this.live.set(e,t)),t}showAddItem(e,t){let{store:n,registry:i}=this.ctx,s=new _(`Add an item to ${this.ctx.entityTitle(e)}`,[{key:"type",label:"Type",value:"text",options:i.map(a=>({value:a.type,label:a.label}))},{key:"name",label:"Name",value:""},{key:"sortOrder",label:"Sort order",value:"0"}],"Next",a=>{let d=this.ctx.entry(a.type),l=a.name??"",u=Number(a.sortOrder);if(!/^[A-Za-z0-9_-]+$/.test(l))return s.setError("Use letters, numbers, - and _ in the name.");if(!Number.isInteger(u))return s.setError("The sort order must be a whole number.");s.setBusy(!0,"Checking\u2026"),this.view.refresh(e).then(()=>{if(s.setBusy(!1),n.itemAt(e,d,l,u)){s.setError(`An item already exists at ${l} #${u}. Choose a free sort order.`);return}o.close(),this.editing.open({entityUrn:e,entry:d,name:l,sortOrder:u,anchor:t,binding:void 0})})}),o=this.ctx.panels.show(s.element,{entityUrn:e})}};function dr(r,e,t,n){let i=[];t>1&&i.push(`${t} items share this sort order`);let s=e;if(r.type==="text"&&ar.test(String(s.value??""))&&i.push("contains markup"),r.type==="image"){s.altText||i.push("no alt text");for(let o of kt(e,n))i.push(o==="DEFAULT"?"no image file":`no ${o.toLowerCase()} file`)}return i}function di(r,e){return r!==void 0&&r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}var xt="A site that is built ahead of time shows it to visitors after its next build.";function Lt(r){return typeof r=="string"?r:void 0}async function li(r,e,t,n,{info:i=!0,quiet:s=!1}={}){let o=(a,d)=>s?r.announce(n,a,d):r.showMessage(a?`${n} ${a}`:n,d);if(o("",i),e!==void 0)try{let a=typeof e=="string"?e:await e(t);a&&o(a,i)}catch(a){console.error("Baack editor: the site's afterPublish callback failed",a);let d=a instanceof Error?a.message:String(a);o(`The site's after-publish step failed: ${d}`,!1)}}var Tt=50,lr=0;function St(r){return`${r.path} (${r.language}${r.variant?` \xB7 ${r.variant}`:""})`}var tt=class{element;input;value;source;onChange;listbox;status;note;createArea;id=`baack-entity-picker-${lr+=1}`;listing;created=[];loading;options=[];active=-1;chosenLabel="";constructor(e,t,n,i){this.source=e,this.onChange=i,this.element=c("div","entity-picker"),this.input=c("input"),this.input.type="text",this.input.autocomplete="off",this.input.spellcheck=!1,this.input.placeholder="Type a path, such as /menu",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("aria-controls",`${this.id}-list`),this.value=c("input"),this.value.type="hidden",this.value.name=t,this.value.value=n,this.listbox=c("ul","entity-options"),this.listbox.id=`${this.id}-list`,this.listbox.setAttribute("role","listbox"),this.listbox.setAttribute("aria-label","Entities"),this.listbox.hidden=!0,this.status=c("p","hint"),this.status.setAttribute("role","status"),this.note=c("p","hint"),this.createArea=c("div","entity-create");let s=c("div","combobox-field");s.append(L("search"),this.input,L("chevron-down")),this.element.append(s,this.listbox,this.status,this.note,this.createArea,this.value),this.input.addEventListener("focus",()=>this.open()),this.input.addEventListener("input",()=>this.open()),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("blur",()=>{this.close(),this.input.value!==this.chosenLabel&&(this.input.value=this.chosenLabel)}),n&&this.showChosen(n)}async showChosen(e){this.chosenLabel=e,this.input.value=e;try{let t=await this.source.describe(e);if(this.value.value!==e)return;this.chosenLabel=St(t),this.input.value===e&&(this.input.value=this.chosenLabel)}catch(t){this.source.report(t,"show the entity referred to",()=>{this.showChosen(e)})}this.showNote(e)}async showNote(e){try{let t=await this.source.note(e);this.value.value===e&&(this.note.textContent=t)}catch(t){this.source.report(t,"check the entity referred to",()=>{this.showNote(e)})}}open(){this.listbox.hidden=!1,this.input.setAttribute("aria-expanded","true"),this.loading??=this.source.list(e=>{this.listing=e,this.render()}).then(e=>{this.listing=e,this.render()}).catch(e=>{this.loading=void 0,this.status.textContent="The list of entities could not be loaded.",this.source.report(e,"list the entities",()=>this.open())}),this.render()}close(){this.listbox.hidden=!0,this.input.setAttribute("aria-expanded","false"),this.input.removeAttribute("aria-activedescendant"),this.active=-1}render(){if(this.listbox.hidden)return;let e=this.input.value===this.chosenLabel?"":this.input.value.trim().toLowerCase(),t=this.listing?.entities??[],n=[...t,...this.created.filter(d=>!t.some(l=>l.urn===d.urn))].filter(d=>!e||St(d).toLowerCase().includes(e)).sort((d,l)=>d.path===l.path?+(l.language===this.source.language)-+(d.language===this.source.language):0);this.options=n.slice(0,Tt).map(d=>{let l=c("li","entity-option");l.append(c("span","",d.path),c("span","meta",` ${d.language}${d.variant?` \xB7 ${d.variant}`:""}`));let u=d.urn===this.value.value;return l.setAttribute("aria-selected",String(u)),u&&l.append(L("check")),{element:l,choose:()=>this.choose(d)}});let i=this.input.value.trim(),s=e&&i.startsWith("/")?i:e?`/${i}`:"",o=c("li","entity-option create",s?`Create a new entity "${s}"\u2026`:"Create a new entity\u2026");o.prepend(L("plus")),this.options.push({element:o,choose:()=>{this.create(s)}}),this.options.forEach((d,l)=>{d.element.id=`${this.id}-option-${l}`,d.element.setAttribute("role","option"),d.element.addEventListener("mousedown",u=>u.preventDefault()),d.element.addEventListener("click",()=>d.choose())}),this.listbox.replaceChildren(...this.options.map(d=>d.element)),this.setActive(Math.min(this.active,this.options.length-1));let a=t.length+this.created.length;this.status.textContent=this.listing?[n.length>Tt?`Showing ${Tt} of ${n.length}; type to narrow.`:"",this.listing.complete?"":"The search was still running, so some entities may be missing.",a===0?"No entities found.":""].filter(Boolean).join(" "):"Loading entities\u2026"}setActive(e){this.active=e,this.options.forEach((n,i)=>n.element.classList.toggle("active",i===e));let t=this.options[e];t?(this.input.setAttribute("aria-activedescendant",t.element.id),t.element.scrollIntoView({block:"nearest"})):this.input.removeAttribute("aria-activedescendant")}choose(e){this.value.value=e.urn,this.chosenLabel=St(e),this.input.value=this.chosenLabel,this.note.textContent="",this.close(),this.onChange(),this.showNote(e.urn)}async create(e){this.close(),this.input.disabled=!0;try{let t=await this.source.create(this.createArea,e);t&&(this.created.push(t),this.choose(t))}finally{this.createArea.replaceChildren(),this.input.disabled=!1,this.input.focus()}}onKeyDown=e=>{let t=!this.listbox.hidden;if(e.key==="ArrowDown"||e.key==="ArrowUp"){e.preventDefault(),t||this.open();let n=e.key==="ArrowDown"?1:-1;this.setActive((this.active+n+this.options.length)%this.options.length)}else e.key==="Enter"&&t&&this.active>=0&&!(e.metaKey||e.ctrlKey)?(e.preventDefault(),e.stopPropagation(),this.options[this.active]?.choose()):e.key==="Escape"&&t&&(e.preventDefault(),e.stopPropagation(),this.close())}};var cr=0,nt=class{trigger;items;menu;constructor(e,t){this.trigger=e,this.items=t,e.id||=`baack-menu-trigger-${++cr}`,e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded","false"),e.addEventListener("mousedown",n=>n.preventDefault()),e.addEventListener("click",n=>this.menu?this.close(!0):this.open(n.detail===0?"first":void 0)),e.addEventListener("keydown",n=>{(n.key==="ArrowDown"||n.key==="ArrowUp")&&(n.preventDefault(),this.open(n.key==="ArrowDown"?"first":"last"))})}get isOpen(){return this.menu!==void 0}open(e){this.close(!1);let t=c("div","menu");t.setAttribute("role","menu"),t.setAttribute("aria-labelledby",this.trigger.id);for(let n of this.items()){let i=c("button",n.destructive?"menu-item destructive":"menu-item");i.type="button",i.setAttribute("role","menuitem"),i.tabIndex=-1,n.icon&&i.append(L(n.icon)),i.append(n.label),i.addEventListener("mousedown",s=>s.preventDefault()),i.addEventListener("click",()=>{this.close(i.matches(":focus")),n.run()}),t.append(i)}t.addEventListener("keydown",this.onKey),(this.trigger.closest(".panel")??this.trigger.parentElement).append(t),this.menu=t,this.trigger.setAttribute("aria-expanded","true"),this.trigger.setAttribute("aria-controls",t.id=`${this.trigger.id}-list`),this.place(),window.addEventListener("pointerdown",this.onOutside,!0),window.addEventListener("scroll",this.onScroll,!0),window.addEventListener("resize",this.onScroll),e&&this.focusAt(e==="first"?0:-1)}close(e){this.menu&&(this.menu.remove(),this.menu=void 0,this.trigger.setAttribute("aria-expanded","false"),this.trigger.removeAttribute("aria-controls"),window.removeEventListener("pointerdown",this.onOutside,!0),window.removeEventListener("scroll",this.onScroll,!0),window.removeEventListener("resize",this.onScroll),e&&this.trigger.focus())}entries(){return[...this.menu?.querySelectorAll('[role="menuitem"]')??[]]}focusAt(e){let t=this.entries(),n=t.at(e%t.length);for(let i of t)i.tabIndex=i===n?0:-1;n?.focus()}onKey=e=>{let t=this.entries(),n=t.indexOf(e.target);if(e.key==="Escape")e.preventDefault(),e.stopPropagation(),this.close(!0);else if(e.key==="Tab")e.preventDefault(),this.close(!0);else if(e.key==="ArrowDown"||e.key==="ArrowUp")e.preventDefault(),this.focusAt((n+(e.key==="ArrowDown"?1:-1)+t.length)%t.length);else if(e.key==="Home"||e.key==="End")e.preventDefault(),this.focusAt(e.key==="Home"?0:-1);else if(e.key.length===1&&/\S/.test(e.key)){let i=e.key.toLowerCase();for(let s=1;s<=t.length;s++){let o=(n+s)%t.length;if(t[o].textContent.trim().toLowerCase().startsWith(i)){this.focusAt(o);break}}}};onOutside=e=>{let t=e.composedPath();!t.includes(this.menu)&&!t.includes(this.trigger)&&this.close(!1)};onScroll=e=>{e.type==="scroll"&&this.menu&&e.composedPath().includes(this.menu)||this.close(!1)};place(){let e=this.menu,t=this.trigger.getBoundingClientRect();e.style.minWidth=`${Math.max(t.width,128)}px`;let{width:n,height:i}=e.getBoundingClientRect(),s=t.bottom+4,o=s+i<=window.innerHeight-8||t.top-i-4<8?s:t.top-i-4;e.style.top=`${Math.max(8,o)}px`,e.style.left=`${Math.min(Math.max(8,t.right-n),window.innerWidth-n-8)}px`}};var ur=["GBP","EUR","USD","JPY","CHF","CAD","AUD","NZD","SEK","NOK","DKK","PLN","INR","CNY","BRL"],hr=/Mac|iPhone|iPad/.test(navigator.userAgent),it=class{element;title;form;description;issues;error;errorDebug;sendButton;extras;menu;buttons;choices;hint;anchor;actions;inputs=new Map;slotStatus=new Map;reposition=()=>this.place();side;onEnd;anchorObserver=new ResizeObserver(this.reposition);entities;currentValues={};constructor(e){this.element=c("div","panel popover"),this.element.setAttribute("role","dialog"),this.element.hidden=!0,this.title=c("div","title"),this.form=c("div","form"),this.description=c("p","hint"),this.issues=c("ul","issues"),this.error=c("p","error"),this.error.setAttribute("role","alert"),this.errorDebug=c("div","error-debug");let t=c("button","","Revert");t.type="button",this.sendButton=c("button","primary","Save"),this.sendButton.type="button";for(let n of[t,this.sendButton])n.addEventListener("mousedown",i=>i.preventDefault());t.addEventListener("click",()=>this.actions?.revert()),this.sendButton.addEventListener("click",()=>this.actions?.send()),this.element.addEventListener("keydown",n=>{n.key==="Escape"?(n.preventDefault(),this.actions?.revert()):n.key==="Enter"&&(n.metaKey||n.ctrlKey)&&(n.preventDefault(),this.actions?.send())}),this.extras=c("div","extras"),this.buttons=c("div","actions"),this.buttons.append(t,this.sendButton),this.choices=c("div","actions"),this.choices.hidden=!0,this.hint=c("p","hint"),this.element.append(this.title,this.form,this.description,this.issues,this.error,this.errorDebug,this.extras,this.buttons,this.choices,this.hint),e.root.append(this.element),new ResizeObserver(()=>{this.element.hidden||(this.side=void 0,this.place())}).observe(this.element)}setEntitySource(e){this.entities=e}get isOpen(){return!this.element.hidden}show(e,t,n,i,s){this.open(e,t,n,i,s,!1),this.form.replaceChildren(),this.inputs.clear(),this.place()}showForm(e,t,n,i,s,o,a){this.open(e,t,n,`${hr?"\u2318":"Ctrl"}+Enter to save \xB7 Esc to revert`,o,a),this.inputs.clear(),this.slotStatus.clear(),this.currentValues=s,this.form.replaceChildren(...i.map(d=>this.field(d,s[d.key],()=>o.input(this.values())))),this.place(),this.form.querySelector('input:not([type="hidden"]), textarea, select')?.focus()}showChoices(e,t,n,i,s,o){this.open(e,t,n,"",{send:()=>{},revert:()=>o.at(-1)?.run()},!0),this.inputs.clear(),this.form.replaceChildren(...i.map(a=>{let d=c("div","field");return d.append(c("span","caption",a.label),c("pre","snippet",a.text)),d})),this.setDescription(s),this.buttons.hidden=!0,this.choices.hidden=!1,this.choices.replaceChildren(...o.map(a=>{let d=T(a.label,Y(a));return d.addEventListener("click",()=>a.run()),d})),this.place()}whenEnded(e){this.onEnd=e}ended(){let e=this.onEnd;this.onEnd=void 0,e?.()}hide(){this.ended(),this.menu?.close(!1),this.element.hidden=!0,this.anchor=void 0,this.side=void 0,this.anchorObserver.disconnect(),this.actions=void 0,window.removeEventListener("scroll",this.reposition,!0),window.removeEventListener("resize",this.reposition),window.removeEventListener("keydown",this.onWindowKey)}onWindowKey=e=>{e.key!=="Escape"||e.defaultPrevented||this.element.hidden||(e.preventDefault(),this.actions?.revert())};values(){let e={...this.currentValues};for(let[t,n]of this.inputs)n instanceof HTMLInputElement&&n.type==="file"?e[t]=n.files?.[0]?.name??"":e[t]=n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked:n.value;return e}files(){let e=new Map;for(let[t,n]of this.inputs){let i=n instanceof HTMLInputElement&&n.type==="file"?n.files?.[0]:void 0;i&&e.set(t,i)}return e}setSlotStatus(e,t,n=!1){let i=this.slotStatus.get(e);i&&(i.textContent=t,i.classList.toggle("error",n))}setValues(e){for(let[t,n]of this.inputs){let i=e[t];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=i===!0:n.type!=="file"&&(n.value=typeof i=="string"?i:"")}}setNameAction(e){let t=this.title.querySelector(".meta");if(!t||!e)return;let n=c("button","meta link",t.textContent??"");n.type="button",P(n,"Show in Items"),n.addEventListener("mousedown",i=>i.preventDefault()),n.addEventListener("click",e),t.replaceWith(n)}setExtras(e){this.menu?.close(!1),this.menu=void 0;let t=e.filter(i=>!i.menu),n=e.filter(i=>i.menu);if(this.extras.replaceChildren(...t.map(i=>{let s=T(i.label,"ghost","sm");return i.icon&&s.prepend(L(i.icon)),s.addEventListener("mousedown",o=>o.preventDefault()),s.addEventListener("click",()=>i.run()),s})),n.length>0){let i=T("","ghost","icon-sm");i.setAttribute("aria-label","More actions"),i.append(L("ellipsis")),this.extras.append(i),P(i),this.menu=new nt(i,()=>n)}}setDescription(e){this.description.textContent=e}setIssues(e){this.issues.replaceChildren(...e.map(t=>c("li",t.level,t.message)))}setError(e,t){this.error.textContent=e,this.errorDebug.replaceChildren(...X(t))}setSending(e){this.sendButton.disabled=e,this.sendButton.textContent=e?"Saving\u2026":"Save"}open(e,t,n,i,s,o){this.ended(),e!==this.anchor&&(this.side=void 0),this.anchor=e,this.anchorObserver.disconnect(),this.anchorObserver.observe(e),this.actions=s,this.title.textContent=`${t} `,this.title.append(c("span","meta",n)),this.element.setAttribute("aria-label",`Edit ${t.toLowerCase()} ${n}`),this.element.classList.toggle("wide",o),this.buttons.hidden=!1,this.choices.hidden=!0,this.setExtras([]),this.hint.textContent=i,this.setDescription(""),this.setIssues([]),this.setError(""),this.setSending(!1),this.element.hidden=!1,window.addEventListener("scroll",this.reposition,!0),window.addEventListener("resize",this.reposition),window.addEventListener("keydown",this.onWindowKey)}field(e,t,n){let i=c("label",`field ${e.kind}`),s=c("span","caption",e.label),o;if(e.kind==="file"){o=c("input"),o.type="file",o.accept="image/apng,image/avif,image/gif,image/jpeg,image/png,image/svg+xml,image/webp",o.name=e.key;let a=typeof this.currentValues[`${e.key}:current`]=="string"?this.currentValues[`${e.key}:current`]:"",d=c("div","slot-preview");if(a){let u=c("img");u.src=a,u.alt="",d.append(u,c("span","meta",a))}else d.append(c("span","meta","No file"));let l=c("span","hint");return l.setAttribute("role","status"),this.slotStatus.set(e.key,l),o.addEventListener("change",n),this.inputs.set(e.key,o),i.append(s,d,o,l),i}if(e.kind==="entity"&&this.entities){let a=c("div","field entity");s.id=`baack-field-${e.key}`;let d=new tt(this.entities,e.key,typeof t=="string"?t:"",n);return d.input.setAttribute("aria-labelledby",s.id),this.inputs.set(e.key,d.value),a.append(s,d.element),a}if(e.kind==="textarea"||e.kind==="code")o=c("textarea"),o.rows=e.kind==="code"?12:4,o.spellcheck=e.kind!=="code";else{if(o=c("input"),o.type=e.kind==="checkbox"?"checkbox":e.kind==="datetime"?"datetime-local":e.kind==="url"?"url":"text",e.kind==="integer"&&(o.inputMode="numeric"),e.kind==="decimal"&&(o.inputMode="decimal"),e.kind==="currency"){o.maxLength=3,o.autocapitalize="characters";let a=c("datalist");a.id=`baack-currencies-${e.key}`,a.append(...ur.map(d=>Object.assign(c("option"),{value:d}))),o.setAttribute("list",a.id),i.append(a)}e.kind==="url"&&this.entities&&i.append(this.pathSuggestions(o,e.key))}return o instanceof HTMLInputElement&&o.type==="checkbox"?(o.setAttribute("role","switch"),o.className="switch",o.checked=t===!0,i.append(o,s)):(o.value=typeof t=="string"?t:"",i.append(s,o)),o.name=e.key,o.addEventListener("input",n),o.addEventListener("change",n),this.inputs.set(e.key,o),i}pathSuggestions(e,t){let n=c("datalist");n.id=`baack-paths-${t}`,e.setAttribute("list",n.id);let i=({entities:s})=>n.replaceChildren(...[...new Set(s.map(o=>this.entities.pagePath(o.path)))].map(o=>Object.assign(c("option"),{value:o})));return e.addEventListener("focus",()=>{this.entities?.list(i).then(i,()=>{})},{once:!0}),n}place(){if(!this.anchor)return;let e=this.anchor.getBoundingClientRect();if(!this.anchor.getClientRects().length&&this.side)return;let t=this.element.offsetHeight,n=this.element.offsetWidth,i=this.anchor.closest(".panel");if(i&&i!==this.element){let a=i.getBoundingClientRect();this.element.style.left=`${Math.max(8,a.left-n-8)}px`,this.element.style.top=`${Math.max(8,Math.min(e.top,window.innerHeight-t-8))}px`;return}this.side??=e.bottom+8+t<=window.innerHeight?"below":e.top-t-8>=8?"above":"within";let s=this.side==="below"?Math.max(8,e.bottom+8):this.side==="above"?Math.min(e.top-t-8,window.innerHeight-t-8):Math.max(8,Math.min(e.bottom+8,window.innerHeight-t-8)),o=Math.max(8,Math.min(e.left,window.innerWidth-n-8));this.element.style.top=`${s}px`,this.element.style.left=`${o}px`}};var rt=class{modeButton;itemsButton;readButton;pendingButton;message;messageAction;runMessageAction;messageDebug;entities;lifecycleRows=[];pendingGroups=[];openPending;pendingListeners=[];openEntity;lifecycleListeners=[];login;loginActions;loginLink;loginText;pendingActions;constructor(e,t,n){this.pendingActions=n,this.modeButton=Pt(e);let i=this.modeButton.closest(".toolbar"),s=this.modeButton.parentElement;this.itemsButton=c("button","","Items"),this.itemsButton.type="button",P(this.itemsButton,"Every item on this page (Alt+Shift+I)"),this.itemsButton.hidden=!0,this.pendingButton=c("button","pending"),this.pendingButton.type="button",this.pendingButton.hidden=!0,P(this.pendingButton,"Show them in the sidebar, with Save all and Discard all"),this.pendingButton.addEventListener("click",()=>this.openPending?.()),this.readButton=c("button","","Show live page"),this.readButton.type="button",this.readButton.hidden=!0,s.append(this.itemsButton,this.readButton,this.pendingButton),this.message=c("p","message"),this.message.setAttribute("role","status"),this.messageAction=T("","primary","sm","message-action"),this.messageAction.hidden=!0,this.messageAction.addEventListener("click",()=>{let a=this.runMessageAction;this.showMessage(""),a?.()}),this.messageDebug=c("div","message-debug"),this.entities=c("div","entities"),this.login=c("div","login"),this.login.hidden=!0,this.loginText=c("p","message"),this.loginText.setAttribute("role","alert"),this.loginActions=c("span","login-actions");let o=c("button","","I have logged in, try again");o.type="button",o.addEventListener("click",()=>{this.hideLogin(),t()}),this.login.append(this.loginText,this.loginActions,o),i.append(this.entities,this.message,this.messageAction,this.messageDebug,this.login)}setEditMode(e){this.modeButton.disabled=!1,this.modeButton.setAttribute("aria-pressed",String(e)),this.itemsButton.hidden=!e,this.readButton.hidden=!e}setReadMode(e){this.readButton.textContent=e?"Show live page":"Show latest drafts"}setPending(e){this.pendingGroups=e;let t=e.reduce((n,i)=>n+i.rows.length,0);this.pendingButton.hidden=t===0,this.pendingButton.textContent=t===1?"1 unsaved change":`${t} unsaved changes`,this.renderEntities();for(let n of this.pendingListeners)n()}setOpenPending(e){this.openPending=e}onPending(e){this.pendingListeners.push(e)}pendingSections(){return this.pendingGroups.length===0?[c("p","hint","Nothing is unsaved.")]:[...this.pendingGroups.map(e=>this.pendingSection(e)),...this.pendingGroups.length>1?[this.actions(void 0,"everywhere")]:[]]}setOpenEntity(e){this.openEntity=e}setLifecycle(e){this.lifecycleRows=e,this.renderEntities();for(let t of this.lifecycleListeners)t()}lifecycleOf(e){return this.lifecycleRows.find(t=>t.entityUrn===e)}showsEntity(e){return this.lifecycleRows[0]?.entityUrn===e}onLifecycle(e){this.lifecycleListeners.push(e)}renderEntities(){let e=this.lifecycleRows[0];this.entities.replaceChildren(...e?[this.entityLabel(e)]:[])}entityLabel(e){let t=this.pendingGroups.find(i=>i.entityUrn===e.entityUrn)?.rows.length??0,n=c("button","entity-label");if(n.type="button",P(n,"Open in the sidebar"),n.append(c("span","title",e.title),c("span","meta",` \xB7 ${e.label}`)),t>0&&n.append(c("span","meta unsent",` \xB7 ${t} unsaved`)),n.addEventListener("click",()=>this.openEntity?.(e.entityUrn)),e.note){let i=c("div","entity");return i.append(n,c("p","message",e.note)),i}return n}pendingSection(e){let t=e.title,n=c("section","entity");n.setAttribute("aria-label",`Unsaved in ${t}`),n.append(c("div","meta",`${t}: ${e.rows.length} unsaved`));let i=c("ul","rows");for(let s of e.rows){let o=c("li",s.problem?"row problem":"row",s.label);if(o.append(c("span","meta",` \xB7 ${s.detail}`)),s.action){let a=c("button","",s.action.label);a.type="button";let d=s.action.run;a.addEventListener("click",()=>d(a)),o.append(" ",a)}i.append(o)}return n.append(i,this.actions(e.entityUrn,`in ${t}`)),n}showMessage(e,t=!1,n,i){this.message.textContent=e,this.message.classList.remove("visually-hidden"),this.message.classList.toggle("info",t),this.messageDebug.replaceChildren(...X(n)),this.runMessageAction=i?.run,this.messageAction.textContent=i?.label??"",this.messageAction.hidden=!i}announce(e,t="",n=!0){this.showMessage(t,n),this.message.prepend(c("span","visually-hidden",t?`${e} `:e)),this.message.classList.toggle("visually-hidden",!t)}showLogin(e,t){this.loginText.textContent=e,this.loginLink?.close(),this.loginLink=t?It(t):void 0,this.loginActions.replaceChildren(...this.loginLink?[this.loginLink.element]:[]),this.login.hidden=!1}hideLogin(){this.login.hidden=!0,this.loginLink?.close(),this.loginLink=void 0}get loginShown(){return!this.login.hidden}actions(e,t){let n=c("div","actions"),i=c("button","primary",e?"Save all":"Save everything");i.type="button",i.setAttribute("aria-label",`Save all unsaved changes ${t}`),i.addEventListener("click",()=>this.pendingActions.sendAll(e));let s=T(e?"Discard all":"Discard everything","destructive");return s.setAttribute("aria-label",`Discard all unsaved changes ${t}`),s.addEventListener("click",()=>this.pendingActions.discardAll(e)),n.append(s,i),n}};function st(r){let e=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;if(typeof document.startViewTransition!="function"||e||document.visibilityState!=="visible")return r(),Promise.resolve();let t=document.startViewTransition(r);return t.ready.catch(()=>{}),t.finished.catch(()=>{}),t.updateCallbackDone}var ot=class{ctx;hooks;snapshots=new Map;carried=new Map;orders=new Map;added=new Set;loading=new Map;editMode=!1;readMode="LATEST";session=0;previewing;previewListeners=new Set;changedThisVisit=new Set;built=new WeakMap;constructor(e,t){this.ctx=e,this.hooks=t}get isEditing(){return this.editMode}get mode(){return this.readMode}begin(e="LATEST"){this.editMode=!0,this.readMode=e,this.session+=1}readOptions(e){return e==="live"?{}:{version:e==="LATEST"?"LATEST":String(e)}}readLiveChanges(){let{store:e}=this.ctx,t=[...this.changedThisVisit].filter(n=>S(e.view(n)?.status)).flatMap(n=>e.scopesFor(n));return this.readLive(t)}async readLive(e){try{return await Promise.all(e.map(async t=>[t,await this.ctx.views.read(t)]))}catch(t){return this.ctx.feedback.report(t,"show the published content",()=>{this.readLive(e).then(n=>{this.editMode||this.showLive(n)})}),[]}}showLive(e){let{store:t,discovery:n}=this.ctx;for(let[o,a]of e)t.loadEntity(o,a);let i=new Set(e.map(([o])=>o)),s=!1;n.flush();for(let o of n.all()){if(!i.has(o.scope))continue;let a=t.itemFor(o);!a?.item.urn||o.element.getAttribute(B(o.entry))===a.item.urn||(this.recordBuilt(o),this.ctx.live.render(o,a.item),s=!0)}return t.clearEntities(),s}async leave(e){let t=!1;return await st(()=>{this.end(),t=this.showLive(e)}),t}async prefetch(e,t){let n=await Promise.all(t.map(async i=>[i,await this.readIn(i,e)]));return new Map(n)}async switchTo(e,t){let{store:n,discovery:i}=this.ctx;await st(()=>{this.end(),this.begin(e);for(let[s,o]of t)n.loadEntity(s,o.entity),o.draft&&this.draftsOnLivePage.add(o.entity.urn);i.flush();for(let s of i.all())this.show(s)}),this.hooks.changed()}get previewedUrn(){return this.previewing?.version.urn}onPreviewChange(e){this.previewListeners.add(e)}previewVersion(e,t){let n=this.previewing?.slot;this.previewing={slot:e,version:t},n&&!At(n,e)&&this.reshow(n),this.reshow(e),this.notifyPreview()}stopPreview(e){let t=this.previewing;!t||e&&!At(t.slot,e)||(this.previewing=void 0,this.reshow(t.slot),this.notifyPreview())}notifyPreview(){for(let e of this.previewListeners)e()}end(){this.previewing&&(this.previewing=void 0,this.notifyPreview()),this.editMode=!1,this.session+=1,this.ctx.live.endPreviews();for(let e of this.added)e.remove();this.added.clear(),this.restoreOrders();for(let e of[...this.snapshots.keys()])this.restore(e);for(let[e,t]of this.carried)for(let n of t.values())e.isConnected&&!G(e)&&ui(e,n);this.carried.clear(),this.ctx.store.clearEntities(),this.loading.clear(),this.draftsOnLivePage.clear(),this.ctx.sources.clear()}async hydrate(e){let t=this.session,n=new Set(e.map(i=>i.scope));await Promise.all([...n].map(i=>this.loadScope(i))),t===this.session&&(await st(()=>{if(t===this.session)for(let i of e)this.ctx.discovery.of(i.element).includes(i)&&this.show(i)}),t===this.session&&this.hooks.changed())}draftsOnLivePage=new Set;async readScope(e){let{entity:t,draft:n}=await this.readIn(e,this.readMode);return n?this.draftsOnLivePage.add(t.urn):this.draftsOnLivePage.delete(t.urn),t}async readIn(e,t){let{views:n}=this.ctx;if(t!=="live")return{entity:await n.read(e,this.readOptions(t)),draft:!1};let{entity:i,live:s}=await n.readAsLive(e);return{entity:i,draft:!s}}loadScope(e){let{store:t,feedback:n,discovery:i}=this.ctx;if(t.hasScope(e))return Promise.resolve();let s=this.loading.get(e);if(!s){let o=this.session;s=this.readScope(e).then(a=>{o===this.session&&t.loadEntity(e,a)}).catch(a=>{this.loading.delete(e);let d=this.readMode==="live"?"load the live content":"load the latest content";n.report(a,d,()=>{this.hydrate(i.all())})}),this.loading.set(e,s)}return s}show(e){let{store:t,pending:n}=this.ctx,{element:i,entry:s}=e;this.snapshots.has(e)||this.snapshots.set(e,this.carriedSnapshot(i,s)??ci(i,s)),this.recordBuilt(e);let o=t.itemFor(e),a=this.previewing;if(o?.item.urn&&a&&At(a.slot,{...e,entityUrn:t.entityFor(e.scope)})){this.ctx.live.render(e,lt(s,o.item,M(s,a.version))),D(i,"previewing");return}if(o?.item.urn){let u=n.getEdit(o.item.urn),h=u&&!u.stale,f=h&&!s.renderedByView?lt(s,o.item,u.value):o.item;this.ctx.live.render(e,f),D(i,h?"changed":this.publishedSinceBuilt(e,o.item.urn)?"published":"editable");return}let d=t.entityFor(e.scope),l=d?n.getCreate(H({entityUrn:d,type:s.type,name:e.name,sortOrder:e.sortOrder})):void 0;l&&!s.renderedByView?(this.ctx.live.render(e,{name:e.name,sortOrder:e.sortOrder,...l.value}),D(i,"changed")):D(i,l?"changed":"unresolved")}recordBuilt({element:e,entry:t}){let n=this.built.get(e)??new Map;n.has(t)||n.set(t,e.getAttribute(B(t))??void 0),this.built.set(e,n)}publishedSinceBuilt(e,t){if(this.readMode!=="live")return!1;let n=this.ctx.store.entityFor(e.scope);return!n||this.draftsOnLivePage.has(n)?!1:this.built.get(e.element)?.get(e.entry)!==t}countPublishedSinceBuilt(){return new Set(this.ctx.discovery.all().filter(e=>e.element.getAttribute(Ae)==="published").map(e=>e.element)).size}showAll(){for(let e of this.ctx.discovery.all())this.show(e)}reshow(e){let{discovery:t,store:n}=this.ctx;for(let i of t.all()){if(i.entry!==e.entry||n.entityFor(i.scope)!==e.entityUrn)continue;let s=e.urn&&i.element.getAttribute(B(i.entry))===e.urn,o=i.name===e.name&&i.sortOrder===e.sortOrder;!s&&!o||this.hooks.editingElement()!==i.element&&this.show(i)}}forget(e){for(let t of e){if(this.hooks.editingBinding()===t&&this.hooks.closeEditor(),this.carried.get(t.element)?.has(t.entry)){this.snapshots.delete(t);continue}this.restore(t)}}retag(e,t,n=e.name){let{element:i,entry:s}=e,o=this.snapshots.get(e)??ci(i,s),a=this.carried.get(i)??new Map;a.set(s,o),this.carried.set(i,a),i.setAttribute(Q(s),String(t)),i.setAttribute(`data-${s.attribute}-name`,n)}carriedSnapshot(e,t){let n=this.carried.get(e),i=n?.get(t);return i&&n.delete(t),n&&n.size===0&&this.carried.delete(e),i}rememberOrder(e){G(e)||this.orders.has(e)||this.orders.set(e,[...e.childNodes])}restoreOrder(e){let t=this.orders.get(e);t&&(e.append(...t.filter(n=>n.parentNode===e||!n.parentNode)),this.orders.delete(e))}restoreOrders(){for(let e of[...this.orders.keys()])this.restoreOrder(e)}track(e){this.added.add(e)}async refresh(e){let{store:t,feedback:n,discovery:i}=this.ctx,s=this.session,o=t.scopesFor(e);this.readMode==="LATEST"&&this.changedThisVisit.add(e);try{for(let a of o){let d=await this.readScope(a);if(s!==this.session)return;t.loadEntity(a,d)}}catch(a){n.report(a,"show the latest content",()=>{this.refresh(e)});return}for(let a of i.all())o.includes(a.scope)&&this.hooks.editingBinding()!==a&&this.show(a);this.hooks.changed(e)}bindingsAt(e){return this.ctx.discovery.all().filter(t=>t.entry===e.entry&&t.name===e.name&&t.sortOrder===e.sortOrder&&this.ctx.store.entityFor(t.scope)===e.entityUrn)}missingBindings(e){let{store:t,discovery:n}=this.ctx,i=new Set;return n.all().filter(s=>{if(t.entityFor(s.scope)!==e||t.itemAt(e,s.entry,s.name,s.sortOrder))return!1;let o=H({entityUrn:e,type:s.entry.type,name:s.name,sortOrder:s.sortOrder});return i.has(o)?!1:(i.add(o),!0)})}restore(e){let t=this.snapshots.get(e);if(this.snapshots.delete(e),Dt(e.element),this.ctx.live.restore(e)){let n=B(e.entry),i=t?.attributes.find(([s])=>s===n)?.[1];i?e.element.setAttribute(n,i):e.element.removeAttribute(n);return}t&&e.element.isConnected&&ui(e.element,t)}};function ci(r,e){let t=e.component?.(r).ownsChildren??!0;return{attributes:[...r.attributes].map(n=>[n.name,n.value]),children:t?[...r.childNodes].map(n=>n.cloneNode(!0)):void 0}}function ui(r,e){let t=new Set(e.attributes.map(([n])=>n));for(let n of[...r.attributes])t.has(n.name)||r.removeAttribute(n.name);for(let[n,i]of e.attributes)r.setAttribute(n,i);e.children&&r.replaceChildren(...e.children)}function At(r,e){return r.entityUrn===e.entityUrn&&r.entry===e.entry&&r.name===e.name&&r.sortOrder===e.sortOrder}var at=class{ctx;view;editing;saving;outline;onboarding;history;publishing;moves;tags;images;stash;restored=!1;constructor(e,t,n,i,s){let o=new Le,a,d=new Ne(e,()=>a);a=new rt(t,()=>d.retryAfterLogin(),{sendAll:p=>{this.saving.saveAll(p)},discardAll:p=>this.saving.discardAll(p)});let l=new we(n,{added:p=>{this.view.isEditing&&this.view.hydrate(p)},removed:p=>this.view.forget(p)}),u=new Ye(e,async()=>{let v=(await e.companies().catch(()=>[])).map(m=>m.urn);return v.length>0?v:s.company?.urn?[s.company.urn]:[]},s.user?.urn);this.ctx={transport:e,host:t,registry:i,store:o,pending:new Ee(()=>this.pendingChanged()),toolbar:a,popover:new it(t),panels:{show:(p,v)=>this.outline.showPanel(p,v)},feedback:d,views:new Te(e),sources:new Map,discovery:l,canPublish:["PUBLISHER","ADMIN","SUPER"].includes(s.user?.role??""),requiredImageSlots:window.baackEditorConfig?.requiredImageSlots??["DEFAULT"],live:new Be(o),hooks:{openHistory:p=>{this.history.open(p)},publishEntity:p=>{this.publishing.openReview(p)},canReorder:p=>(this.moves.groupOf(p)?.units.length??0)>1,reorder:p=>this.moves.openReorder(p),moveBy:(p,v)=>this.moves.moveBy(p,v),relocate:p=>{this.editing.close(),this.outline.focusSlot(p)},showItem:p=>this.outline.selectItem(p),rename:(p,v)=>{this.moves.relocate(void 0,p.entityUrn,p.entry,v)},moveSlot:(p,v,m)=>this.moves.moveTo(p.entityUrn,p.entry,v,{name:p.name,sortOrder:m}),runPlan:p=>this.moves.run(p),saveImage:(p,v)=>this.images.save(p,v)},groups:s.user?.urn?new qe(s.user.urn):void 0,entry:p=>i.find(v=>v.type===p),entityTitle:p=>{let v=o.view(p)?.name;return v?`Content for ${W(v)}`:`Entity ${p.slice(0,8)}`},announcePublished:(p,v,m={})=>{let g=o.view(p),y=g?.name??"",x={entityUrn:p,name:y,path:y&&pi(W(y)),language:g?.language??"",variant:g?.variant??""};m.itemUrn&&(x.itemUrn=m.itemUrn);let b=m.quiet===!0&&a.showsEntity(p);li(a,window.baackEditorConfig?.afterPublish,x,v,{...m.info!==void 0?{info:m.info}:{},quiet:b})}},this.stash=s.user?.urn?new ke(s.user.urn):void 0,this.view=new ot(this.ctx,{editingElement:()=>this.editing.current?.session?this.editing.current.target.binding?.element:void 0,editingBinding:()=>this.editing.current?.target.binding,closeEditor:()=>this.editing.close(),changed:p=>{this.refreshTags(),this.outline.changed(p),this.history?.changed(p),this.publishing?.changed()}}),this.saving=new Fe(this.ctx,this.view,()=>this.editing),this.editing=new Re(this.ctx,this.view,p=>this.saving.save(p)),this.onboarding=new Ze({transport:e,toolbar:a,context:s,registry:i,store:o,panels:this.ctx.panels,openEntity:p=>this.outline.openEntity(p),entityNameForPage:window.baackEditorConfig?.entityNameForPage,report:(p,v,m)=>d.report(p,v,m),created:p=>u.remember(p)}),this.ctx.popover.setEntitySource(this.entitySource(u)),this.outline=new et(this.ctx,this.view,this.editing,this.saving,this.onboarding);let h=this.outline.outline.stack;h.avoid(a.modeButton.closest(".toolbar"));let f=this.ctx.popover.element;new MutationObserver(()=>h.element.classList.toggle("item-editing",!f.hidden)).observe(f,{attributes:!0,attributeFilter:["hidden"]}),this.moves=new je(this.ctx,this.view,()=>this.editing,()=>this.ctx.groups,p=>this.saving.commit(p)),this.tags=new We(this.ctx.host,p=>this.moves.openOrderMenu(p)),this.moves.onOrderChange(()=>this.refreshTags()),this.images=new Ie(this.ctx,this.view,()=>this.saving,()=>this.editing),this.publishing=new Xe(this.ctx,this.view,window.baackEditorConfig?.publishTimeoutMs??300*1e3,this.outline.outline.stack,{show:(p,v)=>this.outline.showAbove(v,p)}),this.history=new Ge(this.ctx,this.editing,this.view,this.outline.outline.stack,{show:(p,v)=>this.outline.showAbove(v,p),publishEntity:p=>this.ctx.hooks.publishEntity(p),published:async p=>{await this.view.refresh(p),await this.publishing.refreshStatus(p)}}),a.modeButton.addEventListener("click",()=>{this.setEditMode(!this.view.isEditing)}),a.itemsButton.addEventListener("click",()=>this.outline.toggle()),a.setOpenEntity(p=>this.outline.openEntity(p)),a.onLifecycle(()=>this.outline.changed()),a.setOpenPending(()=>this.outline.togglePending()),a.onPending(()=>this.outline.changed()),this.outline.onClose(()=>this.history.stopPreview()),a.readButton.addEventListener("click",()=>{this.setReadMode(this.view.mode==="LATEST"?"live":"LATEST")}),document.addEventListener("keydown",p=>{this.view.isEditing&&p.altKey&&p.shiftKey&&p.code==="KeyI"&&(p.preventDefault(),this.outline.toggle(),this.outline.outline.isOpen&&this.outline.outline.focusFilter())}),l.start()}leaving;get isEditing(){return this.view.isEditing}async setEditMode(e,t="LATEST",n=!0){if(await this.leaving,e===this.view.isEditing)return;let{toolbar:i,discovery:s}=this.ctx;if(i.setEditMode(e),e)this.view.begin(t),this.startMode(t),await this.view.hydrate(s.all()),await this.afterRead(t);else{this.stopMode();let o=n&&this.view.mode==="LATEST"?this.view.readLiveChanges():Promise.resolve([]);this.leaving=o.then(()=>{});let a=await o;this.leaving=void 0,await this.view.leave(a)&&i.showMessage(`Showing the published content. ${Lt(window.baackEditorConfig?.afterPublish)??xt}`,!0)}}startMode(e){this.showReadMode(e),e==="LATEST"&&(this.editing.attach(),this.publishing.start(),this.outline.setNewEntity(()=>{this.onboarding.offerNewEntity(this.pageLanguage())}))}pageLanguage(){let{store:e}=this.ctx,t=te(e);return t&&e.view(t)?.language||document.documentElement.lang||"en-GB"}entitySource(e){let{transport:t,feedback:n}=this.ctx,i=()=>this.onboarding,s=()=>this.pageLanguage();return{list:o=>e.list(o),describe:o=>e.describe(o),get language(){return s()},create(o,a){return new Promise(d=>{i().newEntityForm({title:"New entity",submitLabel:"Create and choose it",path:a,language:this.language,onCreated:l=>d(e.remember(l)),onCancel:()=>d(void 0)}).then(l=>{l.element.addEventListener("keydown",u=>{u.key==="Escape"&&(u.preventDefault(),u.stopPropagation(),l.cancel())}),o.replaceChildren(l.element),l.element.querySelector("input")?.focus()})})},note:async o=>{let a=await t.readEntity(o);return e.remember(a),S(a.status)||a.status==="PUBLISH"?"":`${W(a.name)} is not published yet, so pages show it only once it is.`},pagePath:pi,report:(o,a,d)=>{n.report(o,a,d)}}}refreshTags(){this.tags&&(this.view.isEditing&&this.view.mode==="LATEST"?this.tags.show(this.moves.keyedMembers()):this.tags.clear())}stopMode(){let{toolbar:e}=this.ctx;this.tags.clear(),this.editing.detach(),this.editing.close(),this.outline.clear(),this.history.close(),this.publishing.stop(),this.moves.panel.close(),this.outline.setNewEntity(void 0),e.showMessage(""),e.hideLogin()}async afterRead(e){let{toolbar:t,discovery:n}=this.ctx;if(e==="live"){let i=this.view.countPublishedSinceBuilt(),s=[i>0?`Showing the live content. ${i===1?"1 item was":`${i} items were`} published since this page was built, outlined in green. ${Lt(window.baackEditorConfig?.afterPublish)??xt}`:"Showing the live page, as visitors see it."];if(this.view.draftsOnLivePage.size>0){let o=[...this.view.draftsOnLivePage].map(a=>this.ctx.entityTitle(a)).join(", ");s.push(`Not published yet, so shown as the latest drafts: ${o}.`)}t.showMessage(`${s.join(" ")} Editing is off.`,!0)}e==="LATEST"&&(await this.restoreStash(),n.unscoped().length>0&&!document.documentElement.hasAttribute(U)&&this.onboarding.offerEntityForPage())}async setReadMode(e){if(!this.view.isEditing){await this.setEditMode(!0,e);return}if(e===this.view.mode)return;let t=[...new Set(this.ctx.discovery.all().map(i=>i.scope))],n;try{n=await this.view.prefetch(e,t)}catch(i){let s=e==="live"?"load the live content":"load the latest content";this.ctx.feedback.report(i,s,()=>{this.setReadMode(e)});return}!this.view.isEditing||e===this.view.mode||(this.stopMode(),this.startMode(e),await this.view.switchTo(e,n),await this.afterRead(e))}showReadMode(e){let{toolbar:t}=this.ctx;t.setReadMode(e==="LATEST"),e==="live"&&t.showMessage("Showing the live page, as visitors see it. Editing is off.",!0),typeof e=="number"&&t.showMessage(`Showing the latest drafts as of ${new Date(e).toLocaleString()}. Read-only.`,!0)}pendingChanged(){let{pending:e,toolbar:t}=this.ctx,n=e.all();this.stash?.save(n);let i=e.byEntity(),s=ne(this.ctx.store,[...i.keys()]).map(o=>({entityUrn:o,title:this.ctx.entityTitle(o),rows:i.get(o).map(a=>({label:`${a.name} #${a.sortOrder}`,detail:a.kind==="create"?"new item":a.kind==="move"?`${a.label}: to ${a.to.name===a.name?"":a.to.name}#${a.to.sortOrder}`:a.stale?"based on an older version":"edit",problem:a.kind==="edit"&&a.stale===!0,...a.kind==="edit"&&a.stale?{action:{label:"Resolve",run:d=>{this.saving.resolve(a,d)}}}:{}}))}));t.setPending(s),n.length>0?window.addEventListener("beforeunload",hi):window.removeEventListener("beforeunload",hi),this.outline?.changed()}async restoreStash(){if(this.restored||!this.stash)return;this.restored=!0;let e=this.stash.load();if(e.length===0)return;await Promise.all([...new Set(e.map(n=>n.entityUrn))].map(n=>this.view.loadScope(n)));let t=e.map(n=>n.kind!=="edit"?n:this.ctx.store.itemAt(n.entityUrn,this.ctx.entry(n.type),n.name,n.sortOrder)?.item.urn===n.urn?{...n,stale:!1}:{...n,stale:!0});this.ctx.pending.load(t),this.view.showAll(),this.ctx.toolbar.showMessage(`Restored ${t.length} unsaved ${t.length===1?"change":"changes"} from this browser.`,!0)}};function hi(r){r.preventDefault()}function pi(r){return(window.baackEditorConfig?.pagePathForEntity??ei)(r)}var Ot=[un,fn,vn,yn,gn,bn,wn,En,kn,xn,Ln,Tn,Sn],mi=Ot.filter(r=>r.component!==void 0);function id(r){let e=new at(r.transport,r.host,mi,Ot,r.context);return e.setReadMode(r.mode??"LATEST"),e}export{id as start};
|
|
17
18
|
//# sourceMappingURL=editor.js.map
|