efficient-web-builder 5.3.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/README.md +2 -0
  3. package/dist/components/Countdown.d.ts +9 -0
  4. package/dist/components/Countdown.js +1 -0
  5. package/dist/components/ImageFocusRow.js +1 -1
  6. package/dist/components/PartStyledKind.d.ts +5 -0
  7. package/dist/components/PartStyledKind.js +1 -0
  8. package/dist/components/SectionThumbnail.js +1 -1
  9. package/dist/components/SocialLinksPanel.js +1 -1
  10. package/dist/components/StorefrontLinkField.js +1 -1
  11. package/dist/components/socialIcons.js +1 -1
  12. package/dist/components/storefront-editor.css +18 -120
  13. package/dist/components/useSocialSettings.d.ts +2 -2
  14. package/dist/lib/content/block-sources.d.ts +20 -0
  15. package/dist/lib/content/block-sources.js +1 -0
  16. package/dist/lib/content/product-page.js +1 -1
  17. package/dist/lib/content/record-types.d.ts +21 -0
  18. package/dist/lib/content/record-types.js +1 -0
  19. package/dist/lib/content/social-links.d.ts +1 -1
  20. package/dist/lib/content/social-links.js +1 -1
  21. package/dist/lib/links/link-picker-setup.d.ts +1 -1
  22. package/dist/lib/links/link-picker-setup.js +1 -1
  23. package/dist/lib/links/page-link-rules.d.ts +0 -1
  24. package/dist/lib/links/page-link-rules.js +1 -1
  25. package/dist/lib/puck/block-source-fields.d.ts +5 -0
  26. package/dist/lib/puck/block-source-fields.js +1 -0
  27. package/dist/lib/puck/blocks/general/Countdown/fields.d.ts +2 -0
  28. package/dist/lib/puck/blocks/general/Countdown/fields.js +1 -0
  29. package/dist/lib/puck/blocks/general/Countdown/render.d.ts +6 -0
  30. package/dist/lib/puck/blocks/general/Countdown/render.js +1 -0
  31. package/dist/lib/puck/blocks/general/HeroSingle/render.js +1 -1
  32. package/dist/lib/puck/blocks/general/HeroSlide/render.js +1 -1
  33. package/dist/lib/puck/blocks/general/OrderSummary/fields.js +1 -1
  34. package/dist/lib/puck/blocks/general/OrderSummary/render.js +1 -1
  35. package/dist/lib/puck/blocks/general/index.d.ts +2 -2
  36. package/dist/lib/puck/blocks/general/index.js +1 -1
  37. package/dist/lib/puck/blocks/general/renders.d.ts +1 -0
  38. package/dist/lib/puck/blocks/general/renders.js +1 -1
  39. package/dist/lib/puck/controls.d.ts +2 -1
  40. package/dist/lib/puck/controls.js +1 -1
  41. package/dist/lib/puck/editor-page-context.d.ts +1 -0
  42. package/dist/lib/puck/editor-page-context.js +1 -1
  43. package/dist/lib/puck/general-registry.d.ts +1 -1
  44. package/dist/lib/puck/general-registry.js +1 -1
  45. package/dist/lib/puck/page-root-fields.d.ts +4 -1
  46. package/dist/lib/puck/page-root-fields.js +1 -1
  47. package/dist/lib/puck/registry.js +1 -1
  48. package/dist/lib/puck/section-catalog.js +1 -1
  49. package/dist/lib/puck/section-descriptions.js +1 -1
  50. package/dist/lib/source-rules/editor-chrome-note.js +1 -1
  51. package/dist/lib/source-rules/social-icons-import.js +4 -4
  52. package/package.json +4 -4
  53. package/dist/lib/image-focus.d.ts +0 -16
  54. package/dist/lib/image-focus.js +0 -1
@@ -3670,26 +3670,7 @@ input.sf-list-marking {
3670
3670
  /* THE MEDIA ROW IS efficient-easel's `ImageBox` since blueprint step 4.8
3671
3671
  (`es-pick-image-*`, efficient-easel/pick.css): the picture, its name under
3672
3672
  it, Replace and Remove. What stays here is the shop's own around it — the
3673
- button the focus row borrows, the drop's live regions, and the template's
3674
- inert slot. */
3675
- .sf-image-btn {
3676
- border: 1px solid var(--sf-btn-border);
3677
- background: var(--sf-panel);
3678
- color: var(--sf-btn-text);
3679
- border-radius: var(--radius-md);
3680
- padding: 4px 10px;
3681
- font-size: 12px;
3682
- font-weight: 500;
3683
- cursor: pointer;
3684
- transition: background 0.12s;
3685
- }
3686
- .sf-image-btn:hover:not(:disabled) {
3687
- background: var(--sf-hover);
3688
- }
3689
- .sf-image-btn:disabled {
3690
- cursor: default;
3691
- opacity: 0.55;
3692
- }
3673
+ drop's live regions and the template's inert slot. */
3693
3674
  /* Loading / error line under the slot, so a slow or failed picker round-trip is
3694
3675
  visible instead of nothing happening. */
3695
3676
  .sf-image-status {
@@ -3729,109 +3710,26 @@ ul.sf-image-status {
3729
3710
  /* ── The image FOCUS point (card 66226) ──────────────────────────────────────
3730
3711
  WHICH PART OF A BACKGROUND IMAGE SURVIVES ITS CROP, as any point on the
3731
3712
  picture rather than as one of nine. The `Image focus` row opens (the shared
3732
- .sf-style-head grammar, see components/ImageFocusRow.tsx), shows the whole
3733
- photograph, and a press or an arrow key puts the point where the merchant
3734
- wants it. The stored value is the same CSS `object-position` string it has
3735
- always been.
3713
+ .sf-style-head grammar, see components/ImageFocusRow.tsx) onto
3714
+ efficient-shell's `ImageFocusPoint`, which draws the whole photograph, the
3715
+ dot and its crosshair with the kit's own classes (efficient-shell#375); no
3716
+ rule here styles it.
3736
3717
 
3737
3718
  ⚠️ THE MEDIA ROW'S OWN FRAME IS NOT RESTYLED, EVER. `.es-pick-image-frame`
3738
3719
  stays `cover` because that is what the PAGE will look like, and that
3739
- is its job. This block is a second frame, on screen only while a merchant is
3740
- actually setting the point, because a `cover` view cannot express a point it
3741
- has already cropped away. */
3742
- .sf-focus {
3743
- display: flex;
3744
- flex-direction: column;
3745
- gap: 6px;
3746
- }
3747
- /* THE PHOTOGRAPH IS A REAL <button>, not a div wearing a tabIndex. What this
3748
- card replaced is a `role="radiogroup"` a keyboard could already drive, so the
3749
- successor has to earn its place in the tab order the same way. `touch-action`
3750
- is off so a drag on a phone moves the point instead of scrolling the panel. */
3751
- .sf-focus-canvas {
3752
- display: flex;
3753
- align-items: center;
3754
- justify-content: center;
3755
- min-height: 150px;
3756
- padding: 0;
3757
- border: 1px solid var(--sf-line);
3758
- border-radius: var(--radius-md);
3759
- background: var(--sf-preview-bg);
3760
- cursor: crosshair;
3761
- touch-action: none;
3762
- }
3763
- .sf-focus-canvas:focus-visible {
3764
- outline: 2px solid var(--sf-accent);
3765
- outline-offset: 1px;
3766
- }
3767
- /* Shrink-wraps the picture. The marker and crosshairs are positioned against
3768
- THIS and not against the canvas, because a whole photograph in a fixed-height
3769
- box is letterboxed — measuring against the box would land the marker on a
3770
- different pixel for every aspect ratio, and the merchant would watch the dot
3771
- drift away from where they pressed. */
3772
- .sf-focus-pane {
3773
- position: relative;
3774
- display: inline-block;
3775
- max-width: 100%;
3776
- line-height: 0;
3777
- }
3778
- .sf-focus-img {
3779
- display: block;
3780
- width: auto;
3781
- height: auto;
3782
- max-width: 100%;
3783
- max-height: 150px;
3784
- object-fit: contain;
3785
- }
3786
- .sf-focus-cross {
3787
- position: absolute;
3788
- background: color-mix(in srgb, var(--status-on-solid) 45%, transparent);
3789
- pointer-events: none;
3790
- }
3791
- .sf-focus-cross--h {
3792
- right: 0;
3793
- left: 0;
3794
- height: 1px;
3795
- }
3796
- .sf-focus-cross--v {
3797
- top: 0;
3798
- bottom: 0;
3799
- width: 1px;
3800
- }
3801
- /* Drawn in white with a dark ring rather than in a panel token: it sits on a
3802
- merchant's own photograph, which can be any colour, and a token that read
3803
- correctly against the panel would vanish against half of them. White and the
3804
- ring are the shell's own on-media pair (`--status-on-solid`, the media
3805
- scrim), which do not change with the theme for the same reason. */
3806
- .sf-focus-marker {
3807
- position: absolute;
3808
- width: 18px;
3809
- height: 18px;
3810
- border: 2px solid var(--status-on-solid);
3811
- border-radius: 50%;
3812
- box-shadow: 0 0 0 1.5px var(--rosh-media-scrim-button), 0 1px 5px var(--rosh-media-scrim-button);
3813
- transform: translate(-50%, -50%);
3814
- pointer-events: none;
3815
- }
3816
- .sf-focus-bar {
3817
- display: flex;
3818
- align-items: center;
3819
- gap: 8px;
3820
- }
3821
- .sf-focus-hint {
3822
- min-width: 0;
3823
- flex: 1;
3824
- font-size: 11px;
3825
- color: var(--sf-muted);
3826
- }
3827
- /* THE PHOTOGRAPH IS NEVER ON SCREEN TWICE. The 96px crop belongs to the
3828
- Background image field and this row belongs to `imageFocal` — two sibling
3829
- Puck fields, which cannot reach each other from React — so the crop stands
3830
- down for as long as a focus session is open, and comes back the moment it
3831
- closes. The `:has()` on Puck's own field wrapper is this stylesheet's
3832
- established idiom for exactly that problem (see the `[data-sf-bucket]` and
3833
- `[data-sf-no-control]` rules above). */
3834
- .es-insp-rows:has([data-sf-focusing]) .es-pick-image-frame {
3720
+ is its job. The focus part is a second frame, on screen only while a
3721
+ merchant is actually setting the point, because a `cover` view cannot
3722
+ express a point it has already cropped away.
3723
+
3724
+ THE PHOTOGRAPH IS NEVER ON SCREEN TWICE. The 96px crop belongs to the
3725
+ Background image field and the focus row belongs to `imageFocal` — two
3726
+ sibling Puck fields, which cannot reach each other from React — so the crop
3727
+ stands down for as long as the part is open (its root carries
3728
+ `data-image-focus`), and comes back the moment it closes. The `:has()` on
3729
+ Puck's own field wrapper is this stylesheet's established idiom for exactly
3730
+ that problem (see the `[data-sf-bucket]` and `[data-sf-no-control]` rules
3731
+ above). */
3732
+ .es-insp-rows:has([data-image-focus]) .es-pick-image-frame {
3835
3733
  display: none;
3836
3734
  }
3837
3735
 
@@ -7,8 +7,8 @@ export declare function useSocialSettings({ token, siteId, enabled, }: {
7
7
  siteId: string | null;
8
8
  enabled: boolean;
9
9
  }): {
10
- links: Partial<Record<"facebook" | "instagram" | "pinterest" | "tiktok" | "whatsapp" | "youtube" | "x" | "linkedin", string>>;
11
- rows: Record<"facebook" | "instagram" | "pinterest" | "tiktok" | "whatsapp" | "youtube" | "x" | "linkedin", SocialRowState>;
10
+ links: Partial<Record<"facebook" | "instagram" | "pinterest" | "telegram" | "tiktok" | "whatsapp" | "youtube" | "x" | "linkedin" | "line" | "wechat", string>>;
11
+ rows: Record<"facebook" | "instagram" | "pinterest" | "telegram" | "tiktok" | "whatsapp" | "youtube" | "x" | "linkedin" | "line" | "wechat", SocialRowState>;
12
12
  canSave: boolean;
13
13
  saveLink: (platform: SocialPlatform, value: string) => Promise<SocialSaveOutcome>;
14
14
  };
@@ -0,0 +1,20 @@
1
+ export declare const BLOCK_SOURCE_PROP = "dataSource";
2
+ export declare const BLOCK_SOURCE_OPTIONS_PROP = "dataSourceOptions";
3
+ export declare const BLOCK_SOURCE_ROWS_PROP = "dataRows";
4
+ export type SourceRow = Readonly<Record<string, string>>;
5
+ export interface BlockSourceSpec {
6
+ key: string;
7
+ label: string;
8
+ blocks: readonly string[];
9
+ sample?: readonly SourceRow[];
10
+ }
11
+ export declare function registerBlockSources(sources: readonly BlockSourceSpec[]): void;
12
+ export declare function blockSources(block?: string): readonly BlockSourceSpec[];
13
+ export declare function blockSourceSpec(key: string): BlockSourceSpec | null;
14
+ export declare function blockSourcesRevision(): number;
15
+ export declare function declaredBlockSource(props?: Record<string, unknown> | null): string;
16
+ export declare function servedRows(props?: Record<string, unknown> | null): readonly SourceRow[] | null;
17
+ export declare function sourcedRows(props: Record<string, unknown> | null | undefined, editing: boolean, fallback?: readonly SourceRow[]): {
18
+ rows: readonly SourceRow[];
19
+ sample: boolean;
20
+ };
@@ -0,0 +1 @@
1
+ const c="dataSource",b="dataSourceOptions",i="dataRows",a=/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,f=Symbol.for("efficient.block-sources");function n(){const e=globalThis;return e[f]??={sources:new Map,revision:0}}function u(e){if(typeof e.key!="string"||!a.test(e.key))throw new Error(`A block source key is lower-case words joined by hyphens, not ${JSON.stringify(e.key)}.`);if(typeof e.label!="string"||!e.label.trim())throw new Error(`The block source ${e.key} has no label.`);if(!Array.isArray(e.blocks)||!e.blocks.length||e.blocks.some(t=>typeof t!="string"||!t))throw new Error(`The block source ${e.key} names no block it can fill.`);return{key:e.key,label:e.label.trim(),blocks:[...e.blocks],...e.sample?{sample:e.sample.map(t=>l(t)).filter(t=>t!==null)}:{}}}function O(e){const t=e.map(u),o=n();for(const r of t)o.sources.set(r.key,r);t.length&&(o.revision+=1)}function d(e){const t=[...n().sources.values()];return e===void 0?t:t.filter(o=>o.blocks.includes(e))}function p(e){return n().sources.get(e)??null}function m(){return n().revision}function k(e){const t=e?.[c];return typeof t=="string"?t.trim():""}function l(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const t={};for(const[o,r]of Object.entries(e))typeof r=="string"&&r&&(t[o]=r);return Object.keys(t).length?t:null}function y(e){const t=e?.[i];return Array.isArray(t)?t.map(l).filter(o=>o!==null):null}function S(e,t,o=[]){const r=y(e);if(r!==null&&(r.length||!t))return{rows:r,sample:!1};if(!t)return{rows:[],sample:!1};const s=p(k(e))?.sample;return{rows:s?.length?s:o,sample:!0}}export{b as BLOCK_SOURCE_OPTIONS_PROP,c as BLOCK_SOURCE_PROP,i as BLOCK_SOURCE_ROWS_PROP,p as blockSourceSpec,d as blockSources,m as blockSourcesRevision,k as declaredBlockSource,O as registerBlockSources,y as servedRows,S as sourcedRows};
@@ -1 +1 @@
1
- const o="product",r="tyre",c=[o,r];function d(t){return c.includes(t)}const u="productType",l={[o]:"alloy-wheel",[r]:"tyre"},p=["alloy-wheel","tyre"];function P(t,e){return n(e)??l[t]??null}function n(t){const e=t?.[u];return typeof e=="string"&&p.includes(e)?e:null}function i(t){const e=t?.root;return n(e?.props)}function s(t,e){return P(t,e)!==null}const T="dynamic";export{T as DYNAMIC_PRODUCT_PROP,c as DYNAMIC_TEMPLATE_SLUGS,o as PRODUCT_PAGE_SLUG,u as TEMPLATE_PRODUCT_TYPE_PROP,r as TYRE_PAGE_SLUG,n as declaredTemplateProductKind,d as isDynamicTemplateSlug,s as isProductTemplatePage,i as layoutDeclaredProductKind,P as templateProductKind};
1
+ import{drawsProduct as r}from"./record-types.js";const n="product",o="tyre",c=[n,o];function a(t){return c.includes(t)}const l="productType",d={[n]:"alloy-wheel",[o]:"tyre"},i=["alloy-wheel","tyre"];function p(t,e){return r(e)?u(e)??d[t]??null:null}function u(t){if(!r(t))return null;const e=t?.[l];return typeof e=="string"&&i.includes(e)?e:null}function s(t){const e=t?.root;return u(e?.props)}function T(t,e){return p(t,e)!==null}const _="dynamic";export{_ as DYNAMIC_PRODUCT_PROP,c as DYNAMIC_TEMPLATE_SLUGS,n as PRODUCT_PAGE_SLUG,l as TEMPLATE_PRODUCT_TYPE_PROP,o as TYRE_PAGE_SLUG,u as declaredTemplateProductKind,a as isDynamicTemplateSlug,T as isProductTemplatePage,s as layoutDeclaredProductKind,p as templateProductKind};
@@ -0,0 +1,21 @@
1
+ export declare const PRODUCT_RECORD_TYPE = "product";
2
+ export declare const TEMPLATE_RECORD_TYPE_PROP = "recordType";
3
+ export type RecordFieldKind = "text" | "date";
4
+ export interface RecordFieldSpec {
5
+ key: string;
6
+ label: string;
7
+ kind: RecordFieldKind;
8
+ }
9
+ export interface RecordTypeSpec {
10
+ key: string;
11
+ label: string;
12
+ fields: readonly RecordFieldSpec[];
13
+ }
14
+ export declare function registerRecordTypes(types: readonly RecordTypeSpec[]): void;
15
+ export declare function recordTypes(): readonly RecordTypeSpec[];
16
+ export declare function recordTypeSpec(key: string): RecordTypeSpec | null;
17
+ export declare function recordTypesRevision(): number;
18
+ export declare function declaredRecordType(rootProps?: Record<string, unknown> | null): string;
19
+ export declare function layoutRecordType(layout: unknown): string;
20
+ export declare function drawsProduct(rootProps?: Record<string, unknown> | null): boolean;
21
+ export declare function recordFields(key: string, kinds?: readonly RecordFieldKind[]): readonly RecordFieldSpec[];
@@ -0,0 +1 @@
1
+ const t="product",f="recordType",i={key:t,label:"Product",fields:[]},l=/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/,a=/^[a-z][A-Za-z0-9]*$/,u=["text","date"],n=new Map;let s=0;function y(e){if(typeof e.key!="string"||!l.test(e.key))throw new Error(`A record type key is lower-case words joined by hyphens, not ${JSON.stringify(e.key)}.`);if(e.key===t)throw new Error("The product record type is the builder's own and is not declared by a host.");if(typeof e.label!="string"||!e.label.trim())throw new Error(`The record type ${e.key} has no label.`);const o=new Set;for(const r of e.fields){if(typeof r.key!="string"||!a.test(r.key)||o.has(r.key))throw new Error(`The record type ${e.key} has a field key it cannot use: ${JSON.stringify(r.key)}.`);if(!u.includes(r.kind))throw new Error(`The field ${r.key} of ${e.key} has no kind ${JSON.stringify(r.kind)}.`);o.add(r.key)}return{key:e.key,label:e.label.trim(),fields:e.fields.map(r=>({...r}))}}function k(e){const o=e.map(y);for(const r of o)n.set(r.key,r);o.length&&(s+=1)}function h(){return[i,...n.values()]}function p(e){return e===t?i:n.get(e)??null}function T(){return s}function c(e){const o=e?.[f];return typeof o!="string"?t:o.trim()||t}function w(e){const o=e?.root;return c(o&&typeof o=="object"?o.props:null)}function E(e){return c(e)===t}function x(e,o){const r=p(e)?.fields??[];return o?r.filter(d=>o.includes(d.kind)):r}export{t as PRODUCT_RECORD_TYPE,f as TEMPLATE_RECORD_TYPE_PROP,c as declaredRecordType,E as drawsProduct,w as layoutRecordType,x as recordFields,p as recordTypeSpec,h as recordTypes,T as recordTypesRevision,k as registerRecordTypes};
@@ -1,4 +1,4 @@
1
- export declare const SOCIAL_PLATFORMS: readonly ["instagram", "facebook", "tiktok", "youtube", "x", "linkedin", "pinterest", "whatsapp"];
1
+ export declare const SOCIAL_PLATFORMS: readonly ["instagram", "facebook", "tiktok", "youtube", "x", "linkedin", "pinterest", "whatsapp", "telegram", "line", "wechat"];
2
2
  export type SocialPlatform = (typeof SOCIAL_PLATFORMS)[number];
3
3
  export declare const SOCIAL_PLATFORM_LABELS: Record<SocialPlatform, string>;
4
4
  export type SocialLinks = Partial<Record<SocialPlatform, string>>;
@@ -1 +1 @@
1
- const r=["instagram","facebook","tiktok","youtube","x","linkedin","pinterest","whatsapp"],s={instagram:"Instagram",facebook:"Facebook",tiktok:"TikTok",youtube:"YouTube",x:"X",linkedin:"LinkedIn",pinterest:"Pinterest",whatsapp:"WhatsApp"},a={};function c(t){if(!t||typeof t!="object")return a;const o={};for(const e of r){const i=t[e];if(typeof i!="string")continue;const n=i.trim();!n||!/^https?:\/\//i.test(n)||(o[e]=n)}return o}function p(t){return r.flatMap(o=>{const e=t[o];return e?[{platform:o,href:e,label:s[o]}]:[]})}const u=t=>`${t}_url`;export{a as EMPTY_SOCIAL_LINKS,r as SOCIAL_PLATFORMS,s as SOCIAL_PLATFORM_LABELS,c as normalizeSocialLinks,p as socialLinksToDraw,u as socialUrlField};
1
+ const r=["instagram","facebook","tiktok","youtube","x","linkedin","pinterest","whatsapp","telegram","line","wechat"],a={instagram:"Instagram",facebook:"Facebook",tiktok:"TikTok",youtube:"YouTube",x:"X",linkedin:"LinkedIn",pinterest:"Pinterest",whatsapp:"WhatsApp",telegram:"Telegram",line:"LINE",wechat:"WeChat"},s={};function c(t){if(!t||typeof t!="object")return s;const e={};for(const o of r){const i=t[o];if(typeof i!="string")continue;const n=i.trim();!n||!/^https?:\/\//i.test(n)||(e[o]=n)}return e}function l(t){return r.flatMap(e=>{const o=t[e];return o?[{platform:e,href:o,label:a[e]}]:[]})}const p=t=>`${t}_url`;export{s as EMPTY_SOCIAL_LINKS,r as SOCIAL_PLATFORMS,a as SOCIAL_PLATFORM_LABELS,c as normalizeSocialLinks,l as socialLinksToDraw,p as socialUrlField};
@@ -1,4 +1,4 @@
1
- import type { LinkFilterField, LinkKindChoice, LinkRules } from "efficient-easel/fields";
1
+ import type { LinkFilterField, LinkKindChoice, LinkRules } from "efficient-shell/ui";
2
2
  import type { LinkFilters, LinkPickerPage } from "./link-filters.js";
3
3
  import { type LinkKind } from "./page-link-rules.js";
4
4
  export type { LinkFilters, LinkPickerPage };
@@ -1 +1 @@
1
- import{anchorPath as d,isSafeLink as u,linkKindsFor as f,pageAnchors as P,pagePath as m,postPath as v}from"./page-link-rules.js";const r={choosePage:"Choose a page",chooseSection:"Choose a section",noSections:"No section anchors yet",sectionHint:"Jumps to a section on that page.",choosePost:"Choose a post",chooseProduct:"Choose a product"};function p(t,o,a){if(!t)return"page";if(t.startsWith("/journal/"))return"blog";if(t.startsWith("/wheels/"))return"product";if(t.includes("#")){const n=t.slice(0,t.indexOf("#"));if(n===""||n==="/"||o.includes(n))return"anchor"}return t==="/"||o.includes(t)||a&&a.listingPaths.includes(a.targetOf(t))?"page":"custom"}function O(t,o){const a=t.pages.map(e=>({value:m(e.slug),label:e.title})),n=o?.pageOptions?o.pageOptions(a):a,i=n.map(e=>e.value),c=t.pages.map(e=>({label:e.title,options:P(...e.docs).map(s=>({value:d(e.slug,s.slug),label:s.name}))})).filter(e=>e.options.length>0),g=e=>{switch(e){case"page":return{type:"select",options:n,placeholder:r.choosePage};case"anchor":return{type:"groups",groups:c,placeholder:c.length?r.chooseSection:r.noSections};case"blog":return{type:"select",options:t.posts.map(s=>({value:v(s.slug),label:s.title||s.slug})),placeholder:r.choosePost};case"product":return{type:"select",options:t.products.map(s=>({value:s.href,label:s.name||s.href})),placeholder:r.chooseProduct};case"custom":return{type:"text"}}},l=f(t.offers).map(e=>({value:e.value,label:e.label,target:g(e.value),...e.value==="anchor"?{hint:r.sectionHint}:{},...e.value==="blog"||e.value==="product"?{hideWhenEmpty:!0}:{}}));if(!o)return{kinds:l,rules:{kindOf:e=>p(e,i),targetOf:e=>e,readFilter:()=>null,withFilter:e=>e,isSafe:u}};const h=e=>{const s=o.withFilter(e,null);return o.listingPaths.includes(s)?s:e};return{kinds:l,rules:{kindOf:e=>p(e,i,{listingPaths:o.listingPaths,targetOf:h}),targetOf:h,readFilter:o.readFilter,withFilter:o.withFilter,isSafe:u},filtersFor:e=>o.listingPaths.includes(e)?o.filtersFor(e):null}}export{p as inferLinkKind,O as linkPickerSetup};
1
+ import{anchorPath as g,linkKindsFor as d,pageAnchors as P,pagePath as f,postPath as m}from"./page-link-rules.js";const r={choosePage:"Choose a page",chooseSection:"Choose a section",noSections:"No section anchors yet",sectionHint:"Jumps to a section on that page.",choosePost:"Choose a post",chooseProduct:"Choose a product"};function u(t,o,a){if(!t)return"page";if(t.startsWith("/journal/"))return"blog";if(t.startsWith("/wheels/"))return"product";if(t.includes("#")){const n=t.slice(0,t.indexOf("#"));if(n===""||n==="/"||o.includes(n))return"anchor"}return t==="/"||o.includes(t)||a&&a.listingPaths.includes(a.targetOf(t))?"page":"custom"}function F(t,o){const a=t.pages.map(e=>({value:f(e.slug),label:e.title})),n=o?.pageOptions?o.pageOptions(a):a,c=n.map(e=>e.value),i=t.pages.map(e=>({label:e.title,options:P(...e.docs).map(s=>({value:g(e.slug,s.slug),label:s.name}))})).filter(e=>e.options.length>0),p=e=>{switch(e){case"page":return{type:"select",options:n,placeholder:r.choosePage};case"anchor":return{type:"groups",groups:i,placeholder:i.length?r.chooseSection:r.noSections};case"blog":return{type:"select",options:t.posts.map(s=>({value:m(s.slug),label:s.title||s.slug})),placeholder:r.choosePost};case"product":return{type:"select",options:t.products.map(s=>({value:s.href,label:s.name||s.href})),placeholder:r.chooseProduct};case"custom":return{type:"text"}}},l=d(t.offers).map(e=>({value:e.value,label:e.label,target:p(e.value),...e.value==="anchor"?{hint:r.sectionHint}:{},...e.value==="blog"||e.value==="product"?{hideWhenEmpty:!0}:{}}));if(!o)return{kinds:l,rules:{kindOf:e=>u(e,c),targetOf:e=>e,readFilter:()=>null,withFilter:e=>e}};const h=e=>{const s=o.withFilter(e,null);return o.listingPaths.includes(s)?s:e};return{kinds:l,rules:{kindOf:e=>u(e,c,{listingPaths:o.listingPaths,targetOf:h}),targetOf:h,readFilter:o.readFilter,withFilter:o.withFilter},filtersFor:e=>o.listingPaths.includes(e)?o.filtersFor(e):null}}export{u as inferLinkKind,F as linkPickerSetup};
@@ -17,6 +17,5 @@ export declare function pageAnchors(...docs: unknown[]): {
17
17
  slug: string;
18
18
  name: string;
19
19
  }[];
20
- export declare function isSafeLink(url: string): boolean;
21
20
  export declare function linkPagePath(url: string): string;
22
21
  export declare function inferKind(url: string, pagePaths: string[]): LinkKind;
@@ -1 +1 @@
1
- import{HOME_PAGE_SLUG as u}from"../puck/home-page.js";import{slugify as f}from"../slugify.js";const i=[{value:"page",label:"Page"},{value:"anchor",label:"Anchor"},{value:"blog",label:"Blog post",needs:"service"},{value:"product",label:"Product",needs:"commerce"},{value:"custom",label:"Custom URL"}];function x(e){return e.offersCommerce&&e.offersService?i:i.filter(t=>!t.needs||(t.needs==="commerce"?e.offersCommerce:e.offersService))}function a(e){return e===u?"/":`/${e}`}function g(e){return`/journal/${e}`}function b(e){return`/wheels/${e}`}function S(e,t){return`${a(e)}#${t}`}function l(e){return f(e)}function p(e){return typeof e=="string"?e.trim():e&&typeof e=="object"&&typeof e.text=="string"?e.text.trim():""}function A(...e){const t=new Set,n=[];for(const r of e)for(const s of r?.content??[]){const c=p(s?.props?.anchor);if(!c)continue;const o=l(c);!o||t.has(o)||(t.add(o),n.push({slug:o,name:c}))}return n}const h=["http","https","mailto","tel"];function P(e){const t=e.trim();if(!t||/\s/.test(t))return!1;const n=/^([a-z][a-z0-9+.-]*):/i.exec(t);return!n||h.includes(n[1].toLowerCase())}function w(e){const t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),r=n.indexOf("?");return r===-1?n:n.slice(0,r)}function y(e,t){if(!e)return"page";if(e.startsWith("/journal/"))return"blog";if(e.startsWith("/wheels/"))return"product";if(e.includes("#")){const n=e.slice(0,e.indexOf("#"));if(n===""||n==="/"||t.includes(n))return"anchor"}return e==="/"||t.includes(e)?"page":"custom"}export{i as LINK_KINDS,S as anchorPath,y as inferKind,P as isSafeLink,x as linkKindsFor,w as linkPagePath,A as pageAnchors,a as pagePath,g as postPath,l as slugifyAnchor,b as wheelPath};
1
+ import{HOME_PAGE_SLUG as u}from"../puck/home-page.js";import{slugify as f}from"../slugify.js";const i=[{value:"page",label:"Page"},{value:"anchor",label:"Anchor"},{value:"blog",label:"Blog post",needs:"service"},{value:"product",label:"Product",needs:"commerce"},{value:"custom",label:"Custom URL"}];function d(e){return e.offersCommerce&&e.offersService?i:i.filter(t=>!t.needs||(t.needs==="commerce"?e.offersCommerce:e.offersService))}function a(e){return e===u?"/":`/${e}`}function x(e){return`/journal/${e}`}function g(e){return`/wheels/${e}`}function b(e,t){return`${a(e)}#${t}`}function p(e){return f(e)}function l(e){return typeof e=="string"?e.trim():e&&typeof e=="object"&&typeof e.text=="string"?e.text.trim():""}function P(...e){const t=new Set,n=[];for(const r of e)for(const s of r?.content??[]){const c=l(s?.props?.anchor);if(!c)continue;const o=p(c);!o||t.has(o)||(t.add(o),n.push({slug:o,name:c}))}return n}function A(e){const t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),r=n.indexOf("?");return r===-1?n:n.slice(0,r)}function y(e,t){if(!e)return"page";if(e.startsWith("/journal/"))return"blog";if(e.startsWith("/wheels/"))return"product";if(e.includes("#")){const n=e.slice(0,e.indexOf("#"));if(n===""||n==="/"||t.includes(n))return"anchor"}return e==="/"||t.includes(e)?"page":"custom"}export{i as LINK_KINDS,b as anchorPath,y as inferKind,d as linkKindsFor,A as linkPagePath,P as pageAnchors,a as pagePath,x as postPath,p as slugifyAnchor,g as wheelPath};
@@ -0,0 +1,5 @@
1
+ import { type SelectField } from "./controls.js";
2
+ export declare function blockSourceField(label: string, own: string): SelectField;
3
+ export declare function blockSourceFields<Fields extends Record<string, unknown>>(block: string, fields: Fields, props: Record<string, unknown> | null | undefined, options?: {
4
+ hides?: readonly string[];
5
+ }): Fields;
@@ -0,0 +1 @@
1
+ import{jsx as y}from"react/jsx-runtime";import{ListIcon as M}from"efficient-easel/icons";import{BLOCK_SOURCE_PROP as m,blockSources as v,blockSourcesRevision as f,declaredBlockSource as $}from"../content/block-sources.js";import{select as O}from"./controls.js";function C(s,e){return O(s,y(M,{}),[{label:e,value:""}],"")}const b=new WeakMap;let S=-1,p={};const g=new WeakMap;function j(s,e,c){S!==f()&&(S=f(),p={});let t=b.get(e);(!t||g.get(t)!==p)&&(t=new Map,g.set(t,p),b.set(e,t));const i=v(s),o=c&&!i.some(n=>n.key===c)?c:"",l=`${s}\0${o}`;let r=t.get(l);return r||(r={...e,options:[...e.options,...i.map(n=>({label:n.label,value:n.key})),...o?[{label:o,value:o}]:[]]},t.set(l,r)),r}const R=new WeakMap;function F(s,e,c,t={}){const i=e[m];if(!i)return e;const o=$(c),l=v(s).length>0||o!=="",r=l?j(s,i,o):null;let n=R.get(e);n||R.set(e,n=new Map);const w=`${f()}\0${l?"1":"0"}\0${o}`,k=n.get(w);if(k)return k;const h=new Set(o?t.hides??[]:[]),a={};for(const[u,x]of Object.entries(e))u===m?r&&(a[u]=r):h.has(u)||(a[u]=x);return n.set(w,a),a}export{C as blockSourceField,F as blockSourceFields};
@@ -0,0 +1,2 @@
1
+ import type { BlockFields } from "../../block-types.js";
2
+ export declare const CountdownFields: BlockFields;
@@ -0,0 +1 @@
1
+ import{jsx as o}from"react/jsx-runtime";import{ClockIcon as n,TagIcon as r}from"efficient-easel/icons";import{dateTime as i,text as t,toggle as s}from"../../../controls.js";import{COUNTDOWN_DEFAULTS as e}from"./render.js";const x={fields:{title:t("Heading",e.title),zeroText:t("At zero",e.zeroText),endsAt:i("Ends",o(n,{}),"In your own time zone. Every visitor counts down to the same moment."),showUnits:s("Unit labels",!0,o(r,{}))}};export{x as CountdownFields};
@@ -0,0 +1,6 @@
1
+ import type { BlockRender } from "../../block-types.js";
2
+ export declare const COUNTDOWN_DEFAULTS: {
3
+ title: string;
4
+ zeroText: string;
5
+ };
6
+ export declare const CountdownRender: BlockRender;
@@ -0,0 +1 @@
1
+ import{jsx as r}from"react/jsx-runtime";import i from"../../../../../components/Countdown.js";const d={title:"Back online in",zeroText:"Almost done. Back very soon."},a={label:"Countdown",defaultProps:{...d,endsAt:"",showUnits:!0},render:({title:o,zeroText:t,endsAt:e,showUnits:n,puck:s})=>r(i,{title:o,zeroText:t,endsAt:e,showUnits:n,editing:s?.isEditing})};export{d as COUNTDOWN_DEFAULTS,a as CountdownRender};
@@ -1 +1 @@
1
- import{jsx as O}from"react/jsx-runtime";import y from"../../../../../components/HeroSingle.js";import{FOCAL_DEFAULT as c}from"../../../../image-focus.js";import{DEFAULT_OVERLAY_COLOR as L,DEFAULT_OVERLAY_POSITION as u}from"../../../../sections/hero-overlay.js";const v={boxes:{type:"slot",allow:["HeroGroup"]}},S={label:"Hero",fields:v,defaultProps:{mediaType:"image",imageFocal:c,tintColor:"#000000",tintOpacity:0,overlay:100,overlayColor:L,overlayPosition:u},render:({mediaType:o,mediaImage:e,mediaVideo:i,poster:r,imageFocal:t,tintColor:n,tintOpacity:l,overlay:a,overlayColor:s,overlayPosition:d,heightDesktop:m,heightMobile:g,boxes:p,puck:f})=>O(y,{mediaType:o,mediaSrc:(o==="image"?e:i)||void 0,poster:r||void 0,objectPosition:o==="image"&&t||void 0,tintColor:n,tintOpacity:o==="image"?l:0,overlay:a,overlayColor:s,overlayPosition:d,heightDesktop:m,heightMobile:g,boxes:p,editing:f?.isEditing})};export{S as HeroSingleRender,v as HeroSingleSlots};
1
+ import{jsx as O}from"react/jsx-runtime";import y from"../../../../../components/HeroSingle.js";import{FOCAL_DEFAULT as c}from"efficient-shell/format";import{DEFAULT_OVERLAY_COLOR as L,DEFAULT_OVERLAY_POSITION as u}from"../../../../sections/hero-overlay.js";const v={boxes:{type:"slot",allow:["HeroGroup"]}},S={label:"Hero",fields:v,defaultProps:{mediaType:"image",imageFocal:c,tintColor:"#000000",tintOpacity:0,overlay:100,overlayColor:L,overlayPosition:u},render:({mediaType:o,mediaImage:e,mediaVideo:i,poster:r,imageFocal:t,tintColor:n,tintOpacity:l,overlay:a,overlayColor:s,overlayPosition:d,heightDesktop:m,heightMobile:g,boxes:p,puck:f})=>O(y,{mediaType:o,mediaSrc:(o==="image"?e:i)||void 0,poster:r||void 0,objectPosition:o==="image"&&t||void 0,tintColor:n,tintOpacity:o==="image"?l:0,overlay:a,overlayColor:s,overlayPosition:d,heightDesktop:m,heightMobile:g,boxes:p,editing:f?.isEditing})};export{S as HeroSingleRender,v as HeroSingleSlots};
@@ -1 +1 @@
1
- import{jsx as g}from"react/jsx-runtime";import S from"../../../../../components/HeroSlide.js";import{FOCAL_DEFAULT as H}from"../../../../image-focus.js";import{nestedAccentValue as h,sectionThemeWrap as y}from"../../../../content/section-surface.js";import{phHide as A}from"../../scaffold.js";const b={groups:{type:"slot",allow:["HeroGroup"]}},L={label:"Hero Slide",fields:b,defaultProps:{mediaType:"video",videoSpeed:100,imageFocal:H,tintColor:"#000000",overlay:0},render:({name:r,process:d,mediaType:e,mediaVideo:s,mediaImage:l,poster:m,mediaSrc:a,videoSpeed:o,imageFocal:c,tintColor:p,overlay:f,groups:u,puck:t,...i})=>{const n=y({...i,sectionAccent:h(i.sectionAccent)});return g(S,{themeClassName:n?.className,themeStyle:n?.style,name:r||void 0,process:A(d,"Label",t),mediaType:e,mediaSrc:(e==="image"?l:s||a)||void 0,videoSpeed:typeof o=="number"?o:void 0,poster:m||void 0,objectPosition:e==="image"&&c||void 0,tintColor:p,tintOpacity:e==="image"?f:0,groups:u,editing:t?.isEditing})}};export{L as HeroSlideRender,b as HeroSlideSlots};
1
+ import{jsx as g}from"react/jsx-runtime";import S from"../../../../../components/HeroSlide.js";import{FOCAL_DEFAULT as H}from"efficient-shell/format";import{nestedAccentValue as h,sectionThemeWrap as y}from"../../../../content/section-surface.js";import{phHide as A}from"../../scaffold.js";const b={groups:{type:"slot",allow:["HeroGroup"]}},L={label:"Hero Slide",fields:b,defaultProps:{mediaType:"video",videoSpeed:100,imageFocal:H,tintColor:"#000000",overlay:0},render:({name:r,process:d,mediaType:e,mediaVideo:s,mediaImage:l,poster:m,mediaSrc:a,videoSpeed:o,imageFocal:c,tintColor:p,overlay:f,groups:u,puck:t,...i})=>{const n=y({...i,sectionAccent:h(i.sectionAccent)});return g(S,{themeClassName:n?.className,themeStyle:n?.style,name:r||void 0,process:A(d,"Label",t),mediaType:e,mediaSrc:(e==="image"?l:s||a)||void 0,videoSpeed:typeof o=="number"?o:void 0,poster:m||void 0,objectPosition:e==="image"&&c||void 0,tintColor:p,tintOpacity:e==="image"?f:0,groups:u,editing:t?.isEditing})}};export{L as HeroSlideRender,b as HeroSlideSlots};
@@ -1 +1 @@
1
- import{copyText as t,group as e,text as o,textarea as l}from"../../../controls.js";import{PH as r}from"../../placeholders.js";import{ORDER_SUMMARY_PH as m}from"./render.js";const u={fields:{_gContent:e("Content"),eyebrow:o("Eyebrow",r.eyebrow),title:l("Heading",m.title),_gItems:e("Items"),rows:{type:"array",label:"Items",arrayFields:{label:t("Item"),meta:t("Meta line"),amount:t("Amount")},getItemSummary:a=>a.label||"Item"},subRows:{type:"array",label:"Sub-total lines",arrayFields:{label:t("Label"),amount:t("Amount")},getItemSummary:a=>a.label||"Line"},_gTotal:e("Total"),totalLabel:o("Total label","Total"),totalAmount:o("Total amount","$0,000"),note:l("Note",m.note),_gLayout:e("Layout")}};export{u as OrderSummaryFields};
1
+ import{blockSourceField as s,blockSourceFields as i}from"../../../block-source-fields.js";import{copyText as t,group as o,text as a,textarea as r}from"../../../controls.js";import{PH as u}from"../../placeholders.js";import{ORDER_SUMMARY_PH as l}from"./render.js";const p={fields:{_gContent:o("Content"),eyebrow:a("Eyebrow",u.eyebrow),title:r("Heading",l.title),_gItems:o("Items"),dataSource:s("Items from","Typed here"),rows:{type:"array",label:"Items",arrayFields:{label:t("Item"),meta:t("Meta line"),amount:t("Amount")},getItemSummary:e=>e.label||"Item"},subRows:{type:"array",label:"Sub-total lines",arrayFields:{label:t("Label"),amount:t("Amount")},getItemSummary:e=>e.label||"Line"},_gTotal:o("Total"),totalLabel:a("Total label","Total"),totalAmount:a("Total amount","$0,000"),note:r("Note",l.note),_gLayout:o("Layout")},resolveFields:(e,{fields:m})=>i("OrderSummary",m,e.props,{hides:["rows"]})};export{p as OrderSummaryFields};
@@ -1 +1 @@
1
- import{jsx as d}from"react/jsx-runtime";import S from"../../../../../components/OrderSummary.js";import{PH as u}from"../../placeholders.js";import{phRows as o,phHide as e}from"../../scaffold.js";const r={title:"Order summary",note:"A short reassurance note under the total."},O=[{label:"Product name",meta:"Finish · Size · ×1",amount:"$0,000"},{label:"Second item",meta:"Detail line",amount:"$000"}],_=[{label:"Subtotal",amount:"$0,000"},{label:"Delivery",amount:"$00"}],M={label:"Order Table",defaultProps:{eyebrow:"",title:"",rows:[],subRows:[],totalLabel:"",totalAmount:"",note:"",contained:!0},render:({eyebrow:a,title:l,rows:n,subRows:m,totalLabel:s,totalAmount:i,note:R,contained:b,puck:t})=>d(S,{eyebrow:e(a,u.eyebrow,t),title:e(l,r.title,t),rows:o(n,O,t),subRows:o(m,_,t),totalLabel:e(s,"Total",t),totalAmount:e(i,"$0,000",t),note:e(R,r.note,t),contained:b})};export{r as ORDER_SUMMARY_PH,M as OrderSummaryRender};
1
+ import{Fragment as w,jsx as r}from"react/jsx-runtime";import c from"../../../../../components/OrderSummary.js";import{declaredBlockSource as O,sourcedRows as _}from"../../../../content/block-sources.js";import{PH as R}from"../../placeholders.js";import{phRows as S,phHide as e}from"../../scaffold.js";const l={title:"Order summary",note:"A short reassurance note under the total."},y=[{label:"Product name",meta:"Finish · Size · ×1",amount:"$0,000"},{label:"Second item",meta:"Detail line",amount:"$000"}],M=[{label:"Subtotal",amount:"$0,000"},{label:"Delivery",amount:"$00"}],f=[{label:"First item",meta:"A detail line",amount:"$000"},{label:"Second item",meta:"A detail line",amount:"$000"},{label:"Third item",meta:"A detail line",amount:"$000"}],p=o=>({label:o.label,meta:o.meta,amount:o.amount}),U={label:"Order Table",defaultProps:{eyebrow:"",title:"",rows:[],subRows:[],totalLabel:"",totalAmount:"",note:"",contained:!0},render:o=>{const{eyebrow:n,title:m,rows:A,subRows:a,totalLabel:i,totalAmount:s,note:u,contained:b,puck:t}=o;if(O(o)!==""){const d=_(o,!!t?.isEditing,f);return d.rows.length?r(c,{eyebrow:e(n,R.eyebrow,t),title:e(m,l.title,t),rows:d.rows.map(p),subRows:Array.isArray(a)?a:[],totalLabel:e(i,"",t),totalAmount:e(s,"",t),note:e(u,"",t),contained:b}):r(w,{})}return r(c,{eyebrow:e(n,R.eyebrow,t),title:e(m,l.title,t),rows:S(A,y,t),subRows:S(a,M,t),totalLabel:e(i,"Total",t),totalAmount:e(s,"$0,000",t),note:e(u,l.note,t),contained:b})}};export{l as ORDER_SUMMARY_PH,U as OrderSummaryRender};
@@ -1,2 +1,2 @@
1
- export declare const generalBlocks: Record<"Text" | "Divider" | "Flex" | "LogoBlock" | "Hero" | "HeroSingle" | "IntroBleed" | "SpecStrip" | "ProcessSteps" | "OrderSummary" | "PaymentBadges" | "Manifesto" | "Timeline" | "TimelineTrack" | "Footprint" | "Prose" | "ParagraphsA" | "Split" | "Cards" | "KeyFeatures" | "Stats" | "StatsParagraph" | "Chart" | "Mockup" | "Testimonials" | "Logos" | "Banner" | "TitleWithButtons" | "Ticker" | "Masthead" | "FeaturedCover" | "LongRead" | "Series" | "Breadcrumb" | "CategoryBar" | "DocTabs" | "DocMasthead" | "DocBody" | "DocMetaCards" | "FAQ" | "ContactLocations" | "SectionHeader" | "Spacer" | "CustomHTML" | "Grid" | "Heading" | "Eyebrow" | "ImageBlock" | "ButtonBlock" | "PostCard" | "HeroSlide" | "HeroGroup" | "Integrations", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
2
- export declare const assembleGeneralBlocks: () => Record<"Text" | "Divider" | "Flex" | "LogoBlock" | "Hero" | "HeroSingle" | "IntroBleed" | "SpecStrip" | "ProcessSteps" | "OrderSummary" | "PaymentBadges" | "Manifesto" | "Timeline" | "TimelineTrack" | "Footprint" | "Prose" | "ParagraphsA" | "Split" | "Cards" | "KeyFeatures" | "Stats" | "StatsParagraph" | "Chart" | "Mockup" | "Testimonials" | "Logos" | "Banner" | "TitleWithButtons" | "Ticker" | "Masthead" | "FeaturedCover" | "LongRead" | "Series" | "Breadcrumb" | "CategoryBar" | "DocTabs" | "DocMasthead" | "DocBody" | "DocMetaCards" | "FAQ" | "ContactLocations" | "SectionHeader" | "Spacer" | "CustomHTML" | "Grid" | "Heading" | "Eyebrow" | "ImageBlock" | "ButtonBlock" | "PostCard" | "HeroSlide" | "HeroGroup" | "Integrations", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
1
+ export declare const generalBlocks: Record<"Text" | "Divider" | "Flex" | "LogoBlock" | "Hero" | "HeroSingle" | "IntroBleed" | "SpecStrip" | "ProcessSteps" | "OrderSummary" | "PaymentBadges" | "Manifesto" | "Timeline" | "TimelineTrack" | "Footprint" | "Prose" | "ParagraphsA" | "Split" | "Cards" | "KeyFeatures" | "Stats" | "StatsParagraph" | "Chart" | "Mockup" | "Testimonials" | "Logos" | "Banner" | "TitleWithButtons" | "Ticker" | "Countdown" | "Masthead" | "FeaturedCover" | "LongRead" | "Series" | "Breadcrumb" | "CategoryBar" | "DocTabs" | "DocMasthead" | "DocBody" | "DocMetaCards" | "FAQ" | "ContactLocations" | "SectionHeader" | "Spacer" | "CustomHTML" | "Grid" | "Heading" | "Eyebrow" | "ImageBlock" | "ButtonBlock" | "PostCard" | "HeroSlide" | "HeroGroup" | "Integrations", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
2
+ export declare const assembleGeneralBlocks: () => Record<"Text" | "Divider" | "Flex" | "LogoBlock" | "Hero" | "HeroSingle" | "IntroBleed" | "SpecStrip" | "ProcessSteps" | "OrderSummary" | "PaymentBadges" | "Manifesto" | "Timeline" | "TimelineTrack" | "Footprint" | "Prose" | "ParagraphsA" | "Split" | "Cards" | "KeyFeatures" | "Stats" | "StatsParagraph" | "Chart" | "Mockup" | "Testimonials" | "Logos" | "Banner" | "TitleWithButtons" | "Ticker" | "Countdown" | "Masthead" | "FeaturedCover" | "LongRead" | "Series" | "Breadcrumb" | "CategoryBar" | "DocTabs" | "DocMasthead" | "DocBody" | "DocMetaCards" | "FAQ" | "ContactLocations" | "SectionHeader" | "Spacer" | "CustomHTML" | "Grid" | "Heading" | "Eyebrow" | "ImageBlock" | "ButtonBlock" | "PostCard" | "HeroSlide" | "HeroGroup" | "Integrations", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
@@ -1 +1 @@
1
- import{assembleBlocks as o}from"../block-types.js";import{BannerFields as i}from"./Banner/fields.js";import{BreadcrumbFields as m}from"./Breadcrumb/fields.js";import{ButtonBlockFields as t}from"./ButtonBlock/fields.js";import{CardsFields as s}from"./Cards/fields.js";import{CategoryBarFields as d}from"./CategoryBar/fields.js";import{ChartFields as l}from"./Chart/fields.js";import{ContactLocationsFields as a}from"./ContactLocations/fields.js";import{CustomHTMLFields as p}from"./CustomHTML/fields.js";import{DividerFields as F}from"./Divider/fields.js";import{DocBodyFields as f}from"./DocBody/fields.js";import{DocMastheadFields as n}from"./DocMasthead/fields.js";import{DocMetaCardsFields as c}from"./DocMetaCards/fields.js";import{DocTabsFields as S}from"./DocTabs/fields.js";import{EyebrowFields as B}from"./Eyebrow/fields.js";import{FAQFields as g}from"./FAQ/fields.js";import{FeaturedCoverFields as u}from"./FeaturedCover/fields.js";import{FlexFields as T}from"./Flex/fields.js";import{FootprintFields as C}from"./Footprint/fields.js";import{GridFields as k}from"./Grid/fields.js";import{HeadingFields as H}from"./Heading/fields.js";import{HeroFields as L}from"./Hero/fields.js";import{HeroGroupFields as h}from"./HeroGroup/fields.js";import{HeroSingleFields as y}from"./HeroSingle/fields.js";import{HeroSlideFields as D}from"./HeroSlide/fields.js";import{ImageBlockFields as M}from"./ImageBlock/fields.js";import{IntegrationsFields as P}from"./Integrations/fields.js";import{IntroBleedFields as E}from"./IntroBleed/fields.js";import{KeyFeaturesFields as b}from"./KeyFeatures/fields.js";import{LogoBlockFields as G}from"./LogoBlock/fields.js";import{LogosFields as I}from"./Logos/fields.js";import{LongReadFields as x}from"./LongRead/fields.js";import{ManifestoFields as A}from"./Manifesto/fields.js";import{MastheadFields as R}from"./Masthead/fields.js";import{MockupFields as v}from"./Mockup/fields.js";import{OrderSummaryFields as N}from"./OrderSummary/fields.js";import{ParagraphsAFields as w}from"./ParagraphsA/fields.js";import{PaymentBadgesFields as K}from"./PaymentBadges/fields.js";import{PostCardFields as O}from"./PostCard/fields.js";import{ProcessStepsFields as Q}from"./ProcessSteps/fields.js";import{ProseFields as W}from"./Prose/fields.js";import{SectionHeaderFields as _}from"./SectionHeader/fields.js";import{SeriesFields as j}from"./Series/fields.js";import{SpacerFields as q}from"./Spacer/fields.js";import{SpecStripFields as z}from"./SpecStrip/fields.js";import{SplitFields as J}from"./Split/fields.js";import{StatsFields as U}from"./Stats/fields.js";import{StatsParagraphFields as V}from"./StatsParagraph/fields.js";import{TestimonialsFields as X}from"./Testimonials/fields.js";import{TextFields as Y}from"./Text/fields.js";import{TickerFields as Z}from"./Ticker/fields.js";import{TimelineFields as $}from"./Timeline/fields.js";import{TimelineTrackFields as oo}from"./TimelineTrack/fields.js";import{TitleWithButtonsFields as ro}from"./TitleWithButtons/fields.js";import{GENERAL_RENDERS as r}from"./renders.js";const e={Banner:i,Breadcrumb:m,ButtonBlock:t,Cards:s,CategoryBar:d,Chart:l,ContactLocations:a,CustomHTML:p,Divider:F,DocBody:f,DocMasthead:n,DocMetaCards:c,DocTabs:S,Eyebrow:B,FAQ:g,FeaturedCover:u,Flex:T,Footprint:C,Grid:k,Heading:H,Hero:L,HeroGroup:h,HeroSingle:y,HeroSlide:D,ImageBlock:M,Integrations:P,IntroBleed:E,KeyFeatures:b,LogoBlock:G,Logos:I,LongRead:x,Manifesto:A,Masthead:R,Mockup:v,OrderSummary:N,ParagraphsA:w,PaymentBadges:K,PostCard:O,ProcessSteps:Q,Prose:W,SectionHeader:_,Series:j,Spacer:q,SpecStrip:z,Split:J,Stats:U,StatsParagraph:V,Testimonials:X,Text:Y,Ticker:Z,Timeline:$,TimelineTrack:oo,TitleWithButtons:ro},mr=o(r,e),tr=()=>o(r,e);export{tr as assembleGeneralBlocks,mr as generalBlocks};
1
+ import{assembleBlocks as o}from"../block-types.js";import{BannerFields as i}from"./Banner/fields.js";import{BreadcrumbFields as t}from"./Breadcrumb/fields.js";import{ButtonBlockFields as m}from"./ButtonBlock/fields.js";import{CardsFields as s}from"./Cards/fields.js";import{CategoryBarFields as d}from"./CategoryBar/fields.js";import{ChartFields as l}from"./Chart/fields.js";import{ContactLocationsFields as a}from"./ContactLocations/fields.js";import{CountdownFields as p}from"./Countdown/fields.js";import{CustomHTMLFields as F}from"./CustomHTML/fields.js";import{DividerFields as f}from"./Divider/fields.js";import{DocBodyFields as n}from"./DocBody/fields.js";import{DocMastheadFields as c}from"./DocMasthead/fields.js";import{DocMetaCardsFields as S}from"./DocMetaCards/fields.js";import{DocTabsFields as B}from"./DocTabs/fields.js";import{EyebrowFields as g}from"./Eyebrow/fields.js";import{FAQFields as u}from"./FAQ/fields.js";import{FeaturedCoverFields as C}from"./FeaturedCover/fields.js";import{FlexFields as T}from"./Flex/fields.js";import{FootprintFields as k}from"./Footprint/fields.js";import{GridFields as H}from"./Grid/fields.js";import{HeadingFields as L}from"./Heading/fields.js";import{HeroFields as h}from"./Hero/fields.js";import{HeroGroupFields as y}from"./HeroGroup/fields.js";import{HeroSingleFields as D}from"./HeroSingle/fields.js";import{HeroSlideFields as M}from"./HeroSlide/fields.js";import{ImageBlockFields as P}from"./ImageBlock/fields.js";import{IntegrationsFields as E}from"./Integrations/fields.js";import{IntroBleedFields as b}from"./IntroBleed/fields.js";import{KeyFeaturesFields as G}from"./KeyFeatures/fields.js";import{LogoBlockFields as I}from"./LogoBlock/fields.js";import{LogosFields as x}from"./Logos/fields.js";import{LongReadFields as A}from"./LongRead/fields.js";import{ManifestoFields as R}from"./Manifesto/fields.js";import{MastheadFields as v}from"./Masthead/fields.js";import{MockupFields as w}from"./Mockup/fields.js";import{OrderSummaryFields as N}from"./OrderSummary/fields.js";import{ParagraphsAFields as K}from"./ParagraphsA/fields.js";import{PaymentBadgesFields as O}from"./PaymentBadges/fields.js";import{PostCardFields as Q}from"./PostCard/fields.js";import{ProcessStepsFields as W}from"./ProcessSteps/fields.js";import{ProseFields as _}from"./Prose/fields.js";import{SectionHeaderFields as j}from"./SectionHeader/fields.js";import{SeriesFields as q}from"./Series/fields.js";import{SpacerFields as z}from"./Spacer/fields.js";import{SpecStripFields as J}from"./SpecStrip/fields.js";import{SplitFields as U}from"./Split/fields.js";import{StatsFields as V}from"./Stats/fields.js";import{StatsParagraphFields as X}from"./StatsParagraph/fields.js";import{TestimonialsFields as Y}from"./Testimonials/fields.js";import{TextFields as Z}from"./Text/fields.js";import{TickerFields as $}from"./Ticker/fields.js";import{TimelineFields as oo}from"./Timeline/fields.js";import{TimelineTrackFields as ro}from"./TimelineTrack/fields.js";import{TitleWithButtonsFields as eo}from"./TitleWithButtons/fields.js";import{GENERAL_RENDERS as r}from"./renders.js";const e={Banner:i,Breadcrumb:t,ButtonBlock:m,Cards:s,CategoryBar:d,Chart:l,ContactLocations:a,Countdown:p,CustomHTML:F,Divider:f,DocBody:n,DocMasthead:c,DocMetaCards:S,DocTabs:B,Eyebrow:g,FAQ:u,FeaturedCover:C,Flex:T,Footprint:k,Grid:H,Heading:L,Hero:h,HeroGroup:y,HeroSingle:D,HeroSlide:M,ImageBlock:P,Integrations:E,IntroBleed:b,KeyFeatures:G,LogoBlock:I,Logos:x,LongRead:A,Manifesto:R,Masthead:v,Mockup:w,OrderSummary:N,ParagraphsA:K,PaymentBadges:O,PostCard:Q,ProcessSteps:W,Prose:_,SectionHeader:j,Series:q,Spacer:z,SpecStrip:J,Split:U,Stats:V,StatsParagraph:X,Testimonials:Y,Text:Z,Ticker:$,Timeline:oo,TimelineTrack:ro,TitleWithButtons:eo},sr=o(r,e),dr=()=>o(r,e);export{dr as assembleGeneralBlocks,sr as generalBlocks};
@@ -27,6 +27,7 @@ export declare const GENERAL_RENDERS: {
27
27
  ImageBlock: BlockRender;
28
28
  Integrations: BlockRender;
29
29
  IntroBleed: BlockRender;
30
+ Countdown: BlockRender;
30
31
  KeyFeatures: BlockRender;
31
32
  LogoBlock: BlockRender;
32
33
  Logos: BlockRender;
@@ -1 +1 @@
1
- import{BannerRender as r}from"./Banner/render.js";import{BreadcrumbRender as e}from"./Breadcrumb/render.js";import{ButtonBlockRender as o}from"./ButtonBlock/render.js";import{CardsRender as t}from"./Cards/render.js";import{CategoryBarRender as m}from"./CategoryBar/render.js";import{ChartRender as i}from"./Chart/render.js";import{ContactLocationsRender as n}from"./ContactLocations/render.js";import{CustomHTMLRender as d}from"./CustomHTML/render.js";import{DividerRender as a}from"./Divider/render.js";import{DocBodyRender as p}from"./DocBody/render.js";import{DocMastheadRender as R}from"./DocMasthead/render.js";import{DocMetaCardsRender as f}from"./DocMetaCards/render.js";import{DocTabsRender as s}from"./DocTabs/render.js";import{EyebrowRender as c}from"./Eyebrow/render.js";import{FAQRender as S}from"./FAQ/render.js";import{FeaturedCoverRender as l}from"./FeaturedCover/render.js";import{FlexRender as g}from"./Flex/render.js";import{FootprintRender as B}from"./Footprint/render.js";import{GridRender as u}from"./Grid/render.js";import{HeadingRender as T}from"./Heading/render.js";import{HeroRender as C}from"./Hero/render.js";import{HeroGroupRender as H}from"./HeroGroup/render.js";import{HeroSingleRender as h}from"./HeroSingle/render.js";import{HeroSlideRender as k}from"./HeroSlide/render.js";import{ImageBlockRender as y}from"./ImageBlock/render.js";import{IntegrationsRender as M}from"./Integrations/render.js";import{IntroBleedRender as P}from"./IntroBleed/render.js";import{KeyFeaturesRender as D}from"./KeyFeatures/render.js";import{LogoBlockRender as L}from"./LogoBlock/render.js";import{LogosRender as F}from"./Logos/render.js";import{LongReadRender as b}from"./LongRead/render.js";import{ManifestoRender as E}from"./Manifesto/render.js";import{MastheadRender as I}from"./Masthead/render.js";import{MockupRender as x}from"./Mockup/render.js";import{OrderSummaryRender as A}from"./OrderSummary/render.js";import{ParagraphsARender as G}from"./ParagraphsA/render.js";import{PaymentBadgesRender as v}from"./PaymentBadges/render.js";import{PostCardRender as w}from"./PostCard/render.js";import{ProcessStepsRender as K}from"./ProcessSteps/render.js";import{ProseRender as N}from"./Prose/render.js";import{SectionHeaderRender as O}from"./SectionHeader/render.js";import{SeriesRender as Q}from"./Series/render.js";import{SpacerRender as W}from"./Spacer/render.js";import{SpecStripRender as _}from"./SpecStrip/render.js";import{SplitRender as j}from"./Split/render.js";import{StatsRender as q}from"./Stats/render.js";import{StatsParagraphRender as z}from"./StatsParagraph/render.js";import{TestimonialsRender as J}from"./Testimonials/render.js";import{TextRender as U}from"./Text/render.js";import{TickerRender as V}from"./Ticker/render.js";import{TimelineRender as X}from"./Timeline/render.js";import{TimelineTrackRender as Y}from"./TimelineTrack/render.js";import{TitleWithButtonsRender as Z}from"./TitleWithButtons/render.js";const Zr={Banner:r,Breadcrumb:e,ButtonBlock:o,Cards:t,CategoryBar:m,Chart:i,ContactLocations:n,CustomHTML:d,Divider:a,DocBody:p,DocMasthead:R,DocMetaCards:f,DocTabs:s,Eyebrow:c,FAQ:S,FeaturedCover:l,Flex:g,Footprint:B,Grid:u,Heading:T,Hero:C,HeroGroup:H,HeroSingle:h,HeroSlide:k,ImageBlock:y,Integrations:M,IntroBleed:P,KeyFeatures:D,LogoBlock:L,Logos:F,LongRead:b,Manifesto:E,Masthead:I,Mockup:x,OrderSummary:A,ParagraphsA:G,PaymentBadges:v,PostCard:w,ProcessSteps:K,Prose:N,SectionHeader:O,Series:Q,Spacer:W,SpecStrip:_,Split:j,Stats:q,StatsParagraph:z,Testimonials:J,Text:U,Ticker:V,Timeline:X,TimelineTrack:Y,TitleWithButtons:Z};export{Zr as GENERAL_RENDERS};
1
+ import{BannerRender as r}from"./Banner/render.js";import{BreadcrumbRender as e}from"./Breadcrumb/render.js";import{ButtonBlockRender as o}from"./ButtonBlock/render.js";import{CardsRender as t}from"./Cards/render.js";import{CategoryBarRender as m}from"./CategoryBar/render.js";import{ChartRender as i}from"./Chart/render.js";import{ContactLocationsRender as n}from"./ContactLocations/render.js";import{CustomHTMLRender as d}from"./CustomHTML/render.js";import{DividerRender as a}from"./Divider/render.js";import{DocBodyRender as p}from"./DocBody/render.js";import{DocMastheadRender as R}from"./DocMasthead/render.js";import{DocMetaCardsRender as f}from"./DocMetaCards/render.js";import{DocTabsRender as s}from"./DocTabs/render.js";import{EyebrowRender as c}from"./Eyebrow/render.js";import{FAQRender as S}from"./FAQ/render.js";import{FeaturedCoverRender as l}from"./FeaturedCover/render.js";import{FlexRender as g}from"./Flex/render.js";import{FootprintRender as B}from"./Footprint/render.js";import{GridRender as u}from"./Grid/render.js";import{HeadingRender as C}from"./Heading/render.js";import{HeroRender as T}from"./Hero/render.js";import{HeroGroupRender as H}from"./HeroGroup/render.js";import{HeroSingleRender as h}from"./HeroSingle/render.js";import{HeroSlideRender as k}from"./HeroSlide/render.js";import{ImageBlockRender as y}from"./ImageBlock/render.js";import{IntegrationsRender as M}from"./Integrations/render.js";import{IntroBleedRender as P}from"./IntroBleed/render.js";import{CountdownRender as D}from"./Countdown/render.js";import{KeyFeaturesRender as L}from"./KeyFeatures/render.js";import{LogoBlockRender as F}from"./LogoBlock/render.js";import{LogosRender as b}from"./Logos/render.js";import{LongReadRender as E}from"./LongRead/render.js";import{ManifestoRender as I}from"./Manifesto/render.js";import{MastheadRender as x}from"./Masthead/render.js";import{MockupRender as A}from"./Mockup/render.js";import{OrderSummaryRender as G}from"./OrderSummary/render.js";import{ParagraphsARender as v}from"./ParagraphsA/render.js";import{PaymentBadgesRender as w}from"./PaymentBadges/render.js";import{PostCardRender as K}from"./PostCard/render.js";import{ProcessStepsRender as N}from"./ProcessSteps/render.js";import{ProseRender as O}from"./Prose/render.js";import{SectionHeaderRender as Q}from"./SectionHeader/render.js";import{SeriesRender as W}from"./Series/render.js";import{SpacerRender as _}from"./Spacer/render.js";import{SpecStripRender as j}from"./SpecStrip/render.js";import{SplitRender as q}from"./Split/render.js";import{StatsRender as z}from"./Stats/render.js";import{StatsParagraphRender as J}from"./StatsParagraph/render.js";import{TestimonialsRender as U}from"./Testimonials/render.js";import{TextRender as V}from"./Text/render.js";import{TickerRender as X}from"./Ticker/render.js";import{TimelineRender as Y}from"./Timeline/render.js";import{TimelineTrackRender as Z}from"./TimelineTrack/render.js";import{TitleWithButtonsRender as $}from"./TitleWithButtons/render.js";const re={Banner:r,Breadcrumb:e,ButtonBlock:o,Cards:t,CategoryBar:m,Chart:i,ContactLocations:n,CustomHTML:d,Divider:a,DocBody:p,DocMasthead:R,DocMetaCards:f,DocTabs:s,Eyebrow:c,FAQ:S,FeaturedCover:l,Flex:g,Footprint:B,Grid:u,Heading:C,Hero:T,HeroGroup:H,HeroSingle:h,HeroSlide:k,ImageBlock:y,Integrations:M,IntroBleed:P,Countdown:D,KeyFeatures:L,LogoBlock:F,Logos:b,LongRead:E,Manifesto:I,Masthead:x,Mockup:A,OrderSummary:G,ParagraphsA:v,PaymentBadges:w,PostCard:K,ProcessSteps:N,Prose:O,SectionHeader:Q,Series:W,Spacer:_,SpecStrip:j,Split:q,Stats:z,StatsParagraph:J,Testimonials:U,Text:V,Ticker:X,Timeline:Y,TimelineTrack:Z,TitleWithButtons:$};export{re as GENERAL_RENDERS};
@@ -1,8 +1,8 @@
1
1
  import { type ReactElement, type ReactNode } from "react";
2
2
  import { readHidable, hidableText, type HidableValue } from "./hidable.js";
3
- import { FOCAL_DEFAULT } from "../image-focus.js";
4
3
  import { FOLD_FIELD_MARKER, LINK_FIELD_MARKER, MEDIA_FIELD_MARKER, SCAFFOLD_FIELD_MARKER, TEXT_FIELD_MARKER, foldMetaOf, textFieldIdentifier, type EdgeCell, type FoldFieldMeta, type TextFieldMeta, type TextListRendering } from "./field-markers.js";
5
4
  import { type HeroGroupPlacement } from "../hero-group-placement.js";
5
+ import { FOCAL_DEFAULT } from "efficient-shell/ui";
6
6
  import type { GeocodeState } from "../content/contact.js";
7
7
  import { type DirectionContainer } from "../content/container-direction.js";
8
8
  import { GAP_FIELD_CONTAINER, type GapContainer } from "../content/container-gap.js";
@@ -192,6 +192,7 @@ export declare function spacingFields(opts?: {
192
192
  export declare function widthField(defaultMode: WidthMode, modes?: readonly WidthMode[], inheritable?: boolean): Record<string, CustomField<undefined> | CustomField<string> | CustomField<number>>;
193
193
  export declare function heightFields(): Record<string, CustomField<undefined> | CustomField<string> | CustomField<number>>;
194
194
  export declare function anchorFields(): Record<string, CustomField<undefined> | CustomField<HidableValue>>;
195
+ export declare function dateTime(label: string, icon?: ReactNode, hint?: string): CustomField<string>;
195
196
  export declare function toggle(label: string, fallback: boolean, icon?: ReactNode): CustomField<boolean>;
196
197
  export declare function pageBackgroundField(): CustomField<string>;
197
198
  export declare function checkbox(label: string, fallback: boolean): CustomField<boolean>;