efficient-web-builder 15.0.1 → 15.1.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## 15.1.1 - 2026-10-16
4
+
5
+ **On a phone, a hero with a set height grows to fit its words** (card [ADD] INOVIT And Hartes Metal US Websites, GG 2026-10-15; backport of 16.0.2 to the 15 line, GG 2026-10-16, so hosts on 15 take it without the 16 major). hartesmetal.com/dealers: the heading "Become a Hartes Metal dealer" is five lines on a phone, and the hero's set phone height (60vh) was a fixed height, so the bottom-aligned words overflowed upward and the heading ran under the logo (181px above the top of the page at 390x844, 267px at 375x667).
6
+
7
+ ### Fixed
8
+
9
+ - **HeroSingle, below 720px, with a set height:** the set phone height is a minimum, the section is a column, and the words layer is in the flow and fills it. The hero is the set height or its words, whichever is taller; words that already fit sit where they did. 720px and up is unchanged (the desktop height is still a height, and the phone minimum is cleared there). Measured in Chrome on the live page with these rules: 390x844, hero 506px to 839px, heading top -181px to +152px; 375x667, 400px to 819px, -267px to +152px; 1440x900 unchanged.
10
+ - A hero with no set height keeps its built-in output (`h-screen min-h-[680px]`), byte for byte.
11
+ - Guard: `scripts/test-hero-grows-on-phone.tsx`.
12
+
13
+ ## 15.1.0 - 2026-10-15
14
+
15
+ **The site-footer document beside every page, behind a switch that is off** (card [DESIGN] Edit The Header And Footer On The Page, plan 2026-10-15 PR 2; design approved by Lewis 2026-10-15: https://claude.ai/artifact/53ddJmXavpdDspYJrqVf6q). A minor: nothing a merchant sees changes. The screen turns it on in the next release (PR 3).
16
+
17
+ ### Added
18
+
19
+ - **`lib/pinned-chrome-doc`** (pure): `spliceChrome(page, chrome)` puts the site-footer document's pinned nodes into a page's working data, the header group first and the old `Footer` or the footer group last. `splitChrome(working, chrome)` takes them back out into `{ page, chrome }`. An untouched splice splits back byte for byte. The chrome keeps its root, its unknown nodes and keys, an old `Footer` behind a footer group, and its legacy zones. A second copy of a pinned node is dropped (the `siteFooterDocChrome` rules). `lockedWhileHeld(isLockedBlock, held)` locks the pinned nodes while somebody else holds the chrome document.
20
+ - **Site page adapter, `makeSitePageAdapter(…, { editsPinnedInPlace: true })`**: loads the site-footer document with the page and splices it in; on save writes the page, and the chrome only when it changed, with its own version and the tab's clientId; a refused chrome save (changed elsewhere, taken) is reported on the chrome only and never fails the page's save; publish publishes the chrome too when it has changes not live yet; the edit lock claims the chrome beside the page and never takes it over. The site-footer page itself and templates are never spliced.
21
+ - **`WebsiteCapabilities.editsPinnedInPlace`** (false unless the host asks, and only for a site page with the pinned chrome) and **`WebsiteDocumentAdapter.pinnedChrome`** (`state()` → `{ docId, lockHolder, conflict, saveFailed, unpublished }`, `subscribe`). New types: `WebsiteCapabilities`, `WebsiteDocumentAdapter`, `PinnedChromeState`, `PinnedChromeReport`, `SitePageAdapterOptions`.
22
+
23
+ ### Guards
24
+
25
+ - New `test-pinned-chrome-doc` (19 tests): round trips on no groups, an old Footer, a Box footer, a Box header + a Box footer, both + the old `Header` placeholder; the order; what the chrome keeps; a page edit and a footer edit each leave the other half as it was; new and deleted groups; duplicates; `lockedWhileHeld`.
26
+ - New `test-pinned-chrome-adapter` (14 tests, fake backend): off by default and today's adapter; a page-only save writes the page only; a footer edit writes both, the chrome on its own version; a stale chrome version is a conflict on the chrome only; a held chrome is reported, locks the pinned nodes and is never written, and the page stays editable; publish takes the chrome only when it is not live; the site-footer page and a template are never spliced.
27
+
3
28
  ## 15.0.1 - 2026-10-15
4
29
 
5
30
  **The Button's three kept fields draw the no-control mark** (card [BUMP] Storefront Editor Packages To Latest, director JJ; found by the storefront's move to 14.0.0). A patch: nothing a merchant sees changes.
@@ -1 +1 @@
1
- "use client";import{jsx as e,jsxs as N}from"react/jsx-runtime";import{useRef as S}from"react";import E from"./HeroPoster.js";import{resolveMedia as s}from"../lib/media.js";import{hasSectionHeight as j,resolveSectionHeight as c}from"../lib/content/section-height.js";import{DEFAULT_OVERLAY_COLOR as z,DEFAULT_OVERLAY_POSITION as L,overlayGradient as O}from"../lib/sections/hero-overlay.js";import{ON_MEDIA_INK_STYLE as A}from"../lib/content/ink.js";function H({overlay:h=100,overlayColor:f=z,overlayPosition:d=L,mediaType:p="image",mediaSrc:r,poster:t,objectPosition:v,tintColor:u="#000000",tintOpacity:i=0,heightDesktop:a,heightMobile:n,boxes:m,editing:x=!1}){const l=j(a,n),g=l?"h-[var(--sf-hero-h-m)] min-[720px]:h-[var(--sf-hero-h-d)]":"h-screen min-h-[680px]",_=l?{"--sf-hero-h-d":c(a),"--sf-hero-h-m":c(n)}:void 0,o=p==="video",b=o?s(r):void 0,w=o?s(t):s(r)??s(t),y=S(null);return N("section",{ref:y,className:`relative mx-[var(--sf-hero-bleed-m,calc(50%_-_50vw))] w-[var(--sf-hero-bleed-w,100vw)] ${g} max-w-[var(--sf-hero-cap,none)] overflow-hidden`,style:_,children:[e("div",{className:"absolute inset-0 z-[1]",children:e(E,{videoSrc:b,posterSrc:w,showVideo:o,objectPosition:v})}),i>0&&e("div",{className:"pointer-events-none absolute inset-0 z-[2]",style:{background:u,opacity:Math.min(Math.max(i,0),100)/100}}),e("div",{className:"pointer-events-none absolute inset-0 z-[2]",style:{background:O(f,d),opacity:Math.min(Math.max(h,0),100)/100}}),m&&e("div",{className:["sf-hero-group-layer absolute inset-0 z-[3] mx-auto","max-w-[min(var(--sf-page-cap,var(--sf-site-width,1600px)),var(--sf-site-width,1600px))]","px-[var(--sf-site-gutter,40px)] pt-[140px] pb-14",x?"sf-hero-group-layer-edit":""].filter(Boolean).join(" "),style:A,children:e(m,{className:"sf-hero-group-zone",minEmptyHeight:160})})]})}export{H as default};
1
+ "use client";import{jsx as e,jsxs as S}from"react/jsx-runtime";import{useRef as E}from"react";import j from"./HeroPoster.js";import{resolveMedia as o}from"../lib/media.js";import{hasSectionHeight as z,resolveSectionHeight as c}from"../lib/content/section-height.js";import{DEFAULT_OVERLAY_COLOR as L,DEFAULT_OVERLAY_POSITION as O,overlayGradient as A}from"../lib/sections/hero-overlay.js";import{ON_MEDIA_INK_STYLE as H}from"../lib/content/ink.js";function M({overlay:h=100,overlayColor:f=L,overlayPosition:p=O,mediaType:d="image",mediaSrc:t,poster:i,objectPosition:x,tintColor:v="#000000",tintOpacity:a=0,heightDesktop:n,heightMobile:m,boxes:l,editing:u=!1}){const s=z(n,m),g=s?"min-h-[var(--sf-hero-h-m)] max-[720px]:flex max-[720px]:flex-col min-[720px]:min-h-0 min-[720px]:h-[var(--sf-hero-h-d)]":"h-screen min-h-[680px]",w=s?"max-[720px]:relative max-[720px]:flex-auto":"",_=s?{"--sf-hero-h-d":c(n),"--sf-hero-h-m":c(m)}:void 0,r=d==="video",b=r?o(t):void 0,y=r?o(i):o(t)??o(i),N=E(null);return S("section",{ref:N,className:`relative mx-[var(--sf-hero-bleed-m,calc(50%_-_50vw))] w-[var(--sf-hero-bleed-w,100vw)] ${g} max-w-[var(--sf-hero-cap,none)] overflow-hidden`,style:_,children:[e("div",{className:"absolute inset-0 z-[1]",children:e(j,{videoSrc:b,posterSrc:y,showVideo:r,objectPosition:x})}),a>0&&e("div",{className:"pointer-events-none absolute inset-0 z-[2]",style:{background:v,opacity:Math.min(Math.max(a,0),100)/100}}),e("div",{className:"pointer-events-none absolute inset-0 z-[2]",style:{background:A(f,p),opacity:Math.min(Math.max(h,0),100)/100}}),l&&e("div",{className:["sf-hero-group-layer absolute inset-0 z-[3] mx-auto",w,"max-w-[min(var(--sf-page-cap,var(--sf-site-width,1600px)),var(--sf-site-width,1600px))]","px-[var(--sf-site-gutter,40px)] pt-[140px] pb-14",u?"sf-hero-group-layer-edit":""].filter(Boolean).join(" "),style:H,children:e(l,{className:"sf-hero-group-zone",minEmptyHeight:160})})]})}export{M as default};
@@ -1,7 +1,29 @@
1
+ import type { LockHolder, SaveConflict } from "efficient-easel/edit-lock";
1
2
  import { type OfferedSets } from "./editor-blocks.js";
2
3
  import type { EditorCapabilities, EditorDocument, EditorDocumentAdapter } from "./editor-document-contract.js";
3
4
  import type { EditorPageRow, WebsiteBackend } from "./web-backend.js";
4
5
  export type { EditorPageRow };
5
6
  export type { EditorCapabilities, EditorDocument, EditorDocumentAdapter };
6
- export declare function makeSitePageAdapter(siteId: string | undefined, backend?: WebsiteBackend, offered?: OfferedSets): EditorDocumentAdapter;
7
- export declare function makeTemplatePageAdapter(templateId: string, backend?: WebsiteBackend, offered?: OfferedSets): EditorDocumentAdapter;
7
+ export type WebsiteCapabilities = EditorCapabilities & {
8
+ editsPinnedInPlace: boolean;
9
+ };
10
+ export type PinnedChromeState = {
11
+ docId: string | null;
12
+ lockHolder: LockHolder | null;
13
+ conflict: SaveConflict | null;
14
+ saveFailed: boolean;
15
+ unpublished: boolean;
16
+ };
17
+ export interface PinnedChromeReport {
18
+ state(): PinnedChromeState;
19
+ subscribe(listener: () => void): () => void;
20
+ }
21
+ export type WebsiteDocumentAdapter = EditorDocumentAdapter & {
22
+ capabilities: WebsiteCapabilities;
23
+ pinnedChrome?: PinnedChromeReport;
24
+ };
25
+ export type SitePageAdapterOptions = {
26
+ editsPinnedInPlace?: boolean;
27
+ };
28
+ export declare function makeSitePageAdapter(siteId: string | undefined, backend?: WebsiteBackend, offered?: OfferedSets, options?: SitePageAdapterOptions): WebsiteDocumentAdapter;
29
+ export declare function makeTemplatePageAdapter(templateId: string, backend?: WebsiteBackend, offered?: OfferedSets): WebsiteDocumentAdapter;
@@ -1 +1 @@
1
- "use client";import{offeredSetsOf as m}from"./editor-blocks.js";import{isEfficientBackend as c}from"./editor-session.js";import{noteLoaded as p,notePublished as d,noteSaved as v}from"./page-live-state.js";import{backendOf as u}from"./website-session.js";function h(i,t){const r=t?{siteId:t}:void 0;return{resolve:e=>i.load({slug:e,...r}).then(n=>(n&&p(n.id,n.live),n)),saveLayout:(e,n,o,s)=>i.save(e,{layout:n},{version:o,clientId:s??""}).then(a=>(v(e,a.live),a)),rereadVersion:i.version?e=>i.version(e):void 0,publish:i.publish?(e,n)=>i.publish(e,n?{version:n}:void 0).then(o=>(d(e,o.live),o)):void 0,listPages:()=>i.list(r),createPage:i.create?e=>i.create({...e,...r}):void 0,deletePage:i.remove?(e,n)=>i.remove(e,n):void 0}}function E(i,t=u(),r=m()){const e=c(t),n=i?{siteId:i}:void 0,o=e?!!i:!0,s=t.site.update;return{capabilities:{canPublish:!!t.pages.publish,hasSiteSettings:e,hasSiteTheme:!!t.theme,placeholderFrames:!1,mediaEditing:!0,pageCreationInAdminForm:!t.pages.create,canDeletePagesInline:!!t.pages.remove,hasEditLock:!!t.lock,hasEditGuard:!0,hasPinnedChrome:e&&r.commerce&&r.service,explainsSiteSettings:!1,hasSiteRecord:o,canEditSiteRecord:o&&!!s,hasPreviewLink:e||!!t.preview,hasCatalog:e&&r.commerce,hasForms:e&&r.service,hasBlog:!!t.blog&&r.service,offersCommerce:r.commerce,offersService:r.service},...h(t.pages,i),lock:t.lock,site:o?()=>t.site.get(n):void 0,updateSite:o&&s?a=>s(a,n):void 0,previewHref:t.preview?a=>t.preview.href(a):void 0}}function B(i,t=u(),r=m()){const e=c(t),n=t.templates,o=n?n.pages(i):{list:()=>Promise.reject(new Error(l)),load:()=>Promise.reject(new Error(l)),save:()=>Promise.reject(new Error(l))};return{capabilities:{canPublish:!1,hasSiteSettings:!1,hasSiteTheme:!1,placeholderFrames:!0,mediaEditing:!1,pageCreationInAdminForm:!o.create,canDeletePagesInline:!!o.remove,hasEditLock:!1,hasEditGuard:!1,hasPinnedChrome:e&&r.commerce&&r.service,explainsSiteSettings:e,hasSiteRecord:!1,canEditSiteRecord:!1,hasPreviewLink:!1,hasCatalog:e&&r.commerce,hasForms:e&&r.service,hasBlog:!!t.blog&&r.service,offersCommerce:r.commerce,offersService:r.service},...h(o,void 0),publish:void 0,templateName:n?()=>n.get(i).then(s=>s.name):void 0}}const l="This editor's backend has no website templates.";export{E as makeSitePageAdapter,B as makeTemplatePageAdapter};
1
+ "use client";import{SITE_FOOTER_SLUG as C}from"./content/footer.js";import{offeredSetsOf as F}from"./editor-blocks.js";import{isBackendError as y}from"./editor-backend-error.js";import{isEfficientBackend as H}from"./editor-session.js";import{noteLoaded as L,notePublished as A,noteSaved as O,pageLiveState as J}from"./page-live-state.js";import{spliceChrome as j,splitChrome as T}from"./pinned-chrome-doc.js";import{backendOf as k}from"./website-session.js";function b(t,i){const o=i?{siteId:i}:void 0;return{resolve:s=>t.load({slug:s,...o}).then(e=>(e&&L(e.id,e.live),e)),saveLayout:(s,e,c,m)=>t.save(s,{layout:e},{version:c,clientId:m??""}).then(u=>(O(s,u.live),u)),rereadVersion:t.version?s=>t.version(s):void 0,publish:t.publish?(s,e)=>t.publish(s,e?{version:e}:void 0).then(c=>(A(s,c.live),c)):void 0,listPages:()=>t.list(o),createPage:t.create?s=>t.create({...s,...o}):void 0,deletePage:t.remove?(s,e)=>t.remove(s,e):void 0}}function N(t,i,o,s){let e=null;const c=new Set;let m=!1,u={docId:null,lockHolder:null,conflict:null,saveFailed:!1,unpublished:!1};const S=new Set,P=()=>{if(!e)return!1;const n=J(e.id);return n==="changed"||n==="never"||n===void 0&&m},f=n=>{u={...u,...n,docId:e?.id??null,unpublished:P()};for(const r of S)r()},w=n=>n&&typeof n=="object"&&!Array.isArray(n)?n:{},h=n=>!!e&&c.has(n);return{resolve:async n=>{if(n===C)return o.resolve(n);const[r,l]=await Promise.all([o.resolve(n),t.load({slug:C,...i})]);if(l){L(l.id,l.live);const a=w(l.layout);e={id:l.id,layout:a,version:l.version,savedJson:""}}else e=null;if(m=!1,!r||!e)return f({conflict:null,saveFailed:!1}),r;const d=j(w(r.layout),e.layout);return e.savedJson=JSON.stringify(T(d,e.layout).chrome),c.add(r.id),f({conflict:null,saveFailed:!1}),{...r,layout:d}},saveLayout:async(n,r,l,d)=>{if(!e||!h(n))return o.saveLayout(n,r,l,d);const a=e,v=T(r,a.layout),B=await o.saveLayout(n,v.page,l,d),E=JSON.stringify(v.chrome);if(!v.chrome||E===a.savedJson||u.lockHolder)return B;try{const p=await t.save(a.id,{layout:v.chrome},{version:a.version,clientId:d??""});O(a.id,p.live),a.layout=v.chrome,a.version=p.version,a.savedJson=E,m=!0,f({conflict:null,saveFailed:!1})}catch(p){y(p,"changed-elsewhere")?f({conflict:p.conflict??{savedBy:"",savedByYou:!1,secondsAgo:0}}):y(p,"lock-taken")?f({lockHolder:p.holder??{name:"",secondsSinceSeen:0,secondsSinceHeld:0}}):f({saveFailed:!0})}return B},publish:o.publish?async(n,r)=>{const l=await o.publish(n,r),d=e;if(d&&h(n)&&t.publish&&P()&&!u.lockHolder){const a=await t.publish(d.id,d.version?{version:d.version}:void 0);A(d.id,a.live),a.version!==null&&(d.version=a.version),m=!1,f({})}return l}:void 0,lock:s?{claim:async(n,r,l)=>{const d=await s.claim(n,r,l),a=e;if(a&&h(n))try{await s.claim(a.id,r,!1),u.lockHolder&&f({lockHolder:null})}catch(v){y(v,"lock-taken")&&f({lockHolder:v.holder??{name:"",secondsSinceSeen:0,secondsSinceHeld:0}})}return d},release:async(n,r)=>{await s.release(n,r);const l=e;l&&h(n)&&!u.lockHolder&&await s.release(l.id,r).catch(()=>{})}}:void 0,pinnedChrome:{state:()=>u,subscribe:n=>(S.add(n),()=>{S.delete(n)})}}}function U(t,i=k(),o=F(),s={}){const e=H(i),c=t?{siteId:t}:void 0,m=e?!!t:!0,u=i.site.update,S=e&&o.commerce&&o.service,P=!!s.editsPinnedInPlace&&S,f=b(i.pages,t),w=P?N(i.pages,c,f,i.lock):null;return{capabilities:{canPublish:!!i.pages.publish,hasSiteSettings:e,hasSiteTheme:!!i.theme,placeholderFrames:!1,mediaEditing:!0,pageCreationInAdminForm:!i.pages.create,canDeletePagesInline:!!i.pages.remove,hasEditLock:!!i.lock,hasEditGuard:!0,hasPinnedChrome:S,editsPinnedInPlace:P,explainsSiteSettings:!1,hasSiteRecord:m,canEditSiteRecord:m&&!!u,hasPreviewLink:e||!!i.preview,hasCatalog:e&&o.commerce,hasForms:e&&o.service,hasBlog:!!i.blog&&o.service,offersCommerce:o.commerce,offersService:o.service},...f,lock:i.lock,...w,site:m?()=>i.site.get(c):void 0,updateSite:m&&u?h=>u(h,c):void 0,previewHref:i.preview?h=>i.preview.href(h):void 0}}function V(t,i=k(),o=F()){const s=H(i),e=i.templates,c=e?e.pages(t):{list:()=>Promise.reject(new Error(g)),load:()=>Promise.reject(new Error(g)),save:()=>Promise.reject(new Error(g))};return{capabilities:{canPublish:!1,hasSiteSettings:!1,hasSiteTheme:!1,placeholderFrames:!0,mediaEditing:!1,pageCreationInAdminForm:!c.create,canDeletePagesInline:!!c.remove,hasEditLock:!1,hasEditGuard:!1,hasPinnedChrome:s&&o.commerce&&o.service,editsPinnedInPlace:!1,explainsSiteSettings:s,hasSiteRecord:!1,canEditSiteRecord:!1,hasPreviewLink:!1,hasCatalog:s&&o.commerce,hasForms:s&&o.service,hasBlog:!!i.blog&&o.service,offersCommerce:o.commerce,offersService:o.service},...b(c,void 0),publish:void 0,templateName:e?()=>e.get(t).then(m=>m.name):void 0}}const g="This editor's backend has no website templates.";export{U as makeSitePageAdapter,V as makeTemplatePageAdapter};
@@ -0,0 +1,8 @@
1
+ export type ChromeLayout = Record<string, unknown>;
2
+ export declare const PINNED_CHROME_TYPES: readonly string[];
3
+ export declare function spliceChrome(page: ChromeLayout, chrome: ChromeLayout | null): ChromeLayout;
4
+ export declare function splitChrome(working: ChromeLayout, chrome: ChromeLayout | null): {
5
+ page: ChromeLayout;
6
+ chrome: ChromeLayout | null;
7
+ };
8
+ export declare function lockedWhileHeld(isLocked: (type: string | undefined) => boolean, held: () => boolean): (type: string | undefined) => boolean;
@@ -0,0 +1 @@
1
+ import{isSectionGroupType as F,SITE_FOOTER_TYPE as E,SITE_HEADER_TYPE as O,siteFooterDocChrome as z}from"./puck/section-groups.js";const A="Footer",N=[O,A,E],y=e=>{const t=e?.content;return Array.isArray(t)?t:[]},l=e=>{const t=e?.zones;return t&&typeof t=="object"&&!Array.isArray(t)?t:null},h=e=>{const t=e?.props?.id;return typeof t=="string"?t:void 0},I=e=>e.slice(0,Math.max(0,e.lastIndexOf(":")));function x(e){const t=z(y(e)),o=t.some(r=>r?.type===E);return t.filter(r=>r?.type===O||r?.type===E||r?.type===A&&!o)}function k(e,t){const o=new Set,r=s=>{if(Array.isArray(s)){for(const f of s)r(f);return}if(!s||typeof s!="object")return;const i=s;if(typeof i.type=="string"&&i.props&&typeof i.props=="object"){const f=h(i);f&&o.add(f)}for(const f of Object.values(s))r(f)};if(r(e),t){let s=!0;const i=new Set;for(;s;){s=!1;for(const[f,p]of Object.entries(t))i.has(f)||!o.has(I(f))||(i.add(f),r(p),s=!0)}}return o}function T(e,t){const o={},r={};for(const[s,i]of Object.entries(e??{}))(t.has(I(s))?o:r)[s]=i;return{owned:o,rest:r}}function M(e,t){if(!t)return e;const o=x(t);if(!o.length)return e;const r=o.filter(p=>p.type===O),s=o.filter(p=>p.type!==O),i={...e,content:[...r,...y(e),...s]},{owned:f}=T(l(t),k(o,l(t)));return Object.keys(f).length&&(i.zones={...l(e)??{},...f}),i}function R(e,t){if(!t)return{page:e,chrome:null};const o=x(t),r=new Set(o.map(h).filter(n=>!!n)),s=[],i=[];for(const n of y(e)){const c=h(n);c&&r.has(c)||F(n?.type)?i.push(n):s.push(n)}const f=new Map(i.map(n=>[h(n),n])),p=new Set;let d=z(y(t)).flatMap(n=>{const c=h(n);if(!c||!r.has(c))return[n];const u=f.get(c);return u?(p.add(u),[u]):[]});for(const n of i)p.has(n)||d.some(c=>c?.type===n.type)||(d=n.type===O?[n,...d]:[...d,n]);d=z(d);const P=d.length===y(t).length&&d.every((n,c)=>n===y(t)[c]),j=l(e),C=k(d,j),{owned:b,rest:S}=T(j,C),_=T(l(t),k(o,l(t))).owned,g={...t,content:P?t.content:[...d]},a=l(t);if(a||Object.keys(b).length){const n={};for(const[c,u]of Object.entries(a??{}))c in _?c in b&&(n[c]=b[c]):n[c]=u;for(const[c,u]of Object.entries(b))c in n||(n[c]=u);g.zones=n,a&&m(g.zones,a)&&(g.zones=a)}const w={...e,content:s};return j&&(Object.keys(S).length||!Object.keys(_).length?w.zones=S:delete w.zones),{page:w,chrome:g}}function m(e,t){const o=Object.keys(e),r=Object.keys(t);return o.length===r.length&&o.every((s,i)=>s===r[i]&&e[s]===t[s])}function Y(e,t){return o=>e(o)||o!==void 0&&N.includes(o)&&t()}export{N as PINNED_CHROME_TYPES,Y as lockedWhileHeld,M as spliceChrome,R as splitChrome};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efficient-web-builder",
3
- "version": "15.0.1",
3
+ "version": "15.1.1",
4
4
  "description": "The EFFICIENT website builder: the website editor, the general sections and the renderer that draws them, compiled. Hostable by any EFFICIENT product; nothing here imports a host.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Efficient Pty Ltd",