pagepilot-visual-editor 1.0.25 → 1.0.27

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 (58) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/blocks-internal/block-list/src/index.d.ts +1 -1
  3. package/dist/blocks-internal/block-stepper/src/index.d.ts +1 -1
  4. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/FormsPickerSidebarPanel.d.ts +1 -0
  5. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.d.ts +4 -1
  6. package/dist/editor-sample/App/InspectorDrawer/LayersPanelStyles.d.ts +1 -1
  7. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/templateApplyHelpers.d.ts +22 -4
  8. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/GroupBlockPreview.d.ts +7 -0
  9. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ItemsArrayRepeatSection.d.ts +14 -0
  10. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ScalarDataReferencePanel.d.ts +24 -0
  11. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ScalarFieldRow.d.ts +12 -0
  12. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariableGroupList.d.ts +8 -0
  13. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariablesPanelContext.d.ts +10 -0
  14. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/dataReferenceUtils.d.ts +24 -6
  15. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/index.d.ts +8 -1
  16. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/repeatRowActions.d.ts +27 -0
  17. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/styles.d.ts +20 -0
  18. package/dist/editor-sample/App/InspectorDrawer/components/DateFieldControls.d.ts +12 -0
  19. package/dist/editor-sample/App/InspectorDrawer/components/DateTimeFieldControls.d.ts +14 -0
  20. package/dist/editor-sample/App/InspectorDrawer/components/TimeFieldControls.d.ts +12 -0
  21. package/dist/editor-sample/App/shared/editor.styles.d.ts +2 -2
  22. package/dist/editor-sample/documents/blocks/FormsPicker/FormsPropsSchema.d.ts +2 -0
  23. package/dist/editor-sample/documents/blocks/Table/TableImportDialog.styles.d.ts +4 -4
  24. package/dist/editor-sample/documents/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +14 -0
  25. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/blockMenuStyles.d.ts +2 -0
  26. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.d.ts +3 -4
  27. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/hooks/useToolbarCommands.d.ts +17 -1
  28. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/popovers/ResponsiveFontSizePopover.d.ts +43 -0
  29. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/types.d.ts +7 -0
  30. package/dist/editor-sample/documents/blocks/helpers/documentUtils.d.ts +93 -2
  31. package/dist/editor-sample/documents/blocks/helpers/responsiveFontSizeCss.d.ts +72 -0
  32. package/dist/editor-sample/documents/blocks/helpers/variableBinding.d.ts +5 -0
  33. package/dist/editor-sample/documents/editor/core.d.ts +17 -2
  34. package/dist/editor-sample/documents/editor/templateVariables.d.ts +3 -3
  35. package/dist/email-builder-core/blocks/FormsPicker/FormsPropsSchema.d.ts +1 -0
  36. package/dist/email-builder-core/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +14 -0
  37. package/dist/email-builder-core/renderers/pageScripts.d.ts +1 -0
  38. package/dist/email-builder-core/utils/substituteTemplateVars.d.ts +32 -0
  39. package/dist/host-stubs/view/shared/common/InfoTooltip.d.ts +19 -0
  40. package/dist/host-stubs/view/shared/timeZones.d.ts +4 -0
  41. package/dist/{index-RcTlEXS2.cjs → index-BNqa-SV3.cjs} +317 -288
  42. package/dist/{index-uAL1Hpt1.js → index-C4zNSWXe.js} +1 -1
  43. package/dist/{index-Cx_nuxVE.cjs → index-Cu-dtp0Q.cjs} +1 -1
  44. package/dist/{index-txCEAgzG.js → index-Dk7bp7l0.js} +29768 -26808
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.js +15 -12
  48. package/dist/render-core/apiDataSource.d.ts +50 -0
  49. package/dist/render-core/dateFormats.d.ts +67 -0
  50. package/dist/render-core/repeatRowManagement.d.ts +96 -0
  51. package/dist/render-core/templateBaking.d.ts +105 -2
  52. package/dist/render.cjs +186 -163
  53. package/dist/render.d.ts +4 -2
  54. package/dist/render.js +8297 -7057
  55. package/dist/renderToStaticHtml.d.ts +58 -3
  56. package/dist/{xlsx-CMNIZUaT.cjs → xlsx-C6JQXDb3.cjs} +1 -1
  57. package/dist/{xlsx-DSQPVb8u.js → xlsx-Cd1etxFW.js} +1 -1
  58. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { LinkInsertParams } from '../types';
2
+ export type FontSizeDevice = 'desktop' | 'tablet' | 'mobile';
2
3
  /** Snapshot of an existing anchor under the saved/live selection — populated
3
4
  * by `getSavedSelectionLink` and used by the Link dialog to prefill its
4
5
  * fields when the user opens the dialog while standing on a link. */
@@ -23,7 +24,22 @@ export type ToolbarCommandsApi = {
23
24
  * onChange tick.
24
25
  */
25
26
  applyColor: (cmd: string, value: string) => void;
26
- applyFontSize: (px: number) => void;
27
+ /**
28
+ * Set the font size for the current selection at the given device slot.
29
+ * Writes `data-fs-<device>="<px>"` on a wrapping <span> so responsive CSS
30
+ * rules (see the Text block renderer + responsiveFontSizeCss.ts) can pick
31
+ * the correct size per preview device / breakpoint. Preserves any
32
+ * pre-existing device markers on the same range so setting Mobile doesn't
33
+ * clobber Desktop.
34
+ */
35
+ applyFontSize: (px: number, device: FontSizeDevice) => void;
36
+ /**
37
+ * Remove the size override for one device on the current selection. If the
38
+ * span was carrying no other device markers, the wrapper is unwrapped so
39
+ * the block-level font size shows through. Leaves other devices' markers
40
+ * intact.
41
+ */
42
+ clearFontSize: (device: FontSizeDevice) => void;
27
43
  /** Set CSS line-height on every block-level ancestor the current selection
28
44
  * touches. Pass an empty string to clear back to the inherited default. */
29
45
  applyLineHeight: (value: string) => void;
@@ -0,0 +1,43 @@
1
+ import { FontSizeDevice } from '../hooks/useToolbarCommands';
2
+ type ResponsiveFontSizePopoverProps = {
3
+ /**
4
+ * Currently-applied per-device values, read from the nearest wrapping
5
+ * responsive span at the caret. Empty string means "no override for this
6
+ * device" — the block-level font size shows through.
7
+ */
8
+ values: {
9
+ desktop: string;
10
+ tablet: string;
11
+ mobile: string;
12
+ };
13
+ /** Block-level size (from `fmt.fontSize`) — shown in the trigger when no
14
+ * per-device override exists so the label matches the pre-responsive
15
+ * behavior of the single font-size dropdown. */
16
+ fallbackSize: string;
17
+ /** Which device tab should open by default. Wired to the canvas's
18
+ * currently-previewed device so the popover lands on whatever the user is
19
+ * looking at. */
20
+ initialDevice: FontSizeDevice;
21
+ /** Write a size to `data-fs-<device>` on the current selection's span. */
22
+ onApply: (px: number, device: FontSizeDevice) => void;
23
+ /** Remove `data-fs-<device>` from the current selection's span. */
24
+ onClear: (device: FontSizeDevice) => void;
25
+ };
26
+ /**
27
+ * Font-size control that lets the user set a distinct size per device
28
+ * (Desktop / Tablet / Mobile) on the current selection. Layout:
29
+ *
30
+ * [ 40 ▾ ] ← trigger (compact summary)
31
+ * └─ popover ────────────────────────────
32
+ * | 🖥 Desktop 40 · Clear |
33
+ * | 📱 Tablet Not set | ← device rows
34
+ * | 📱 Mobile 24 · Clear |
35
+ * | ───────────────────────────── |
36
+ * | ✓ 10 12 14 … | ← size list for the active row
37
+ *
38
+ * The device rows act as radio-style tabs — clicking one selects it as the
39
+ * "active" row and highlights its current value in the size list below. The
40
+ * size list writes to whichever device the active row represents.
41
+ */
42
+ export declare function ResponsiveFontSizePopover({ values, fallbackSize, initialDevice, onApply, onClear, }: ResponsiveFontSizePopoverProps): import("react/jsx-runtime").JSX.Element;
43
+ export {};
@@ -2,6 +2,7 @@ export type ToolbarPosition = {
2
2
  top: number;
3
3
  left: number;
4
4
  };
5
+ export declare const LINK_COLOR = "#2563eb";
5
6
  export type FormatSnapshot = {
6
7
  bold: boolean;
7
8
  italic: boolean;
@@ -18,6 +19,12 @@ export type FormatSnapshot = {
18
19
  blockLabel: string;
19
20
  fontName: string;
20
21
  fontSize: string;
22
+ /** Per-device font-size override read from the nearest wrapping
23
+ * `<span data-fs-*>` at the caret. Empty string means no override for
24
+ * that device — the block-level `fontSize` shows through. */
25
+ fontSizeDesktop: string;
26
+ fontSizeTablet: string;
27
+ fontSizeMobile: string;
21
28
  /** Unitless multiplier (e.g. "1.5") if the block carries an inline
22
29
  * line-height; empty string when the block inherits its default. */
23
30
  lineHeight: string;
@@ -41,8 +41,8 @@ export type RepeatableSlot = {
41
41
  };
42
42
  export type RepeatableContainerInfo = {
43
43
  containerId: string;
44
- type: 'Grid' | 'FlexColumns' | 'Carousel';
45
- /** Total fixed slots (grid cells / flex columns / carousel slides). */
44
+ type: 'Grid' | 'FlexColumns' | 'Carousel' | 'Marquee' | 'Pagination' | 'TabsBlock';
45
+ /** Total fixed slots (grid cells / flex columns / carousel slides / tab panels). */
46
46
  slotCount: number;
47
47
  /** Each slot's current child ids, normalized to `slotCount` length. */
48
48
  slots: RepeatableSlot[];
@@ -62,6 +62,97 @@ export declare function getRepeatableContainerInfo(documentTree: Record<string,
62
62
  /** Write a container's slots back onto the block (Grid → cells, Carousel →
63
63
  * items[].contentChildrenIds, else → columns). */
64
64
  export declare function writeContainerSlots(block: any, slots: RepeatableSlot[]): any;
65
+ export type ItemsArrayInfo = {
66
+ blockId: string;
67
+ type: string;
68
+ items: Record<string, any>[];
69
+ };
70
+ /** True if the block's repeatable content is a flat `props.items` array (no child blocks). */
71
+ export declare function isItemsArrayBlockType(type: string | undefined): boolean;
72
+ /**
73
+ * Describe an items-array block's current items. Returns null when the block
74
+ * isn't a supported items-array type. Used by the Variables tab to decide
75
+ * whether to show the items data-source controls for the selected block.
76
+ */
77
+ export declare function getItemsArrayInfo(documentTree: Record<string, any>, blockId: string): ItemsArrayInfo | null;
78
+ /** Write an items-array block's `items` back onto the block. */
79
+ export declare function writeItemsArray(block: any, items: Record<string, any>[]): any;
80
+ export type VariableGroupKind = 'container' | 'itemsArray' | 'block' | 'page';
81
+ export type VariableGroup = {
82
+ /** Stable identity for selection — the owning block id, or `page` for page-level. */
83
+ id: string;
84
+ kind: VariableGroupKind;
85
+ /** Block id to select on the canvas when the group is opened. Null for page-level. */
86
+ blockId: string | null;
87
+ /** Block type (`Grid`, `FlexColumns`, …) — drives the list row's icon. Null for page-level. */
88
+ blockType: string | null;
89
+ /** How many variable fields this group holds. */
90
+ fieldCount: number;
91
+ /** Repeat slot total, when the group is a slot container. */
92
+ slotCount?: number;
93
+ /**
94
+ * Field names in this group, in order — rendered as the card's preview so
95
+ * the user can tell two same-type groups apart by their CONTENT rather than
96
+ * by a positional number.
97
+ */
98
+ fieldNames: string[];
99
+ /**
100
+ * True when the block is a repeatable container the author has NOT set up
101
+ * yet — no field, no Repeat toggle, no row tokens. It owns nothing to edit,
102
+ * but its Repeat toggle is only reachable from its own screen, so it is
103
+ * listed separately rather than dropped. See `isVariableBoundBlock`.
104
+ */
105
+ isCandidate?: boolean;
106
+ };
107
+ /**
108
+ * The block a field belongs to, or null when the field is page-level.
109
+ *
110
+ * `sourceBlockId` points at the template block sitting INSIDE a container slot,
111
+ * not at the container itself — and in practice `containerId` is usually absent
112
+ * (the repeat flow only ever writes `sourceBlockId`). So a source block is
113
+ * walked UP to its owning repeatable container: that container is what the user
114
+ * thinks of as "the group", and grouping by the raw `sourceBlockId` would both
115
+ * split one grid into a row per slot and fail every `getRepeatableContainerInfo`
116
+ * lookup downstream.
117
+ *
118
+ * A source block with no repeatable ancestor is a plain (non-repeatable) block
119
+ * with variables — it stays its own group, keyed on itself.
120
+ */
121
+ export declare function getFieldOwnerBlockId(documentTree: Record<string, any>, field: {
122
+ containerId?: string;
123
+ sourceBlockId?: string;
124
+ itemsBlockId?: string;
125
+ }): string | null;
126
+ /**
127
+ * Cheap structural fingerprint of everything `collectVariableGroups` actually
128
+ * reads: each block's `type` + every child-id array (the `collectSubtreeIds`
129
+ * walk) + the slot-count props Grid/Pagination use, plus each field's owner ids
130
+ * / name / type. Text edits, colour/style tweaks, `data.style`, block `props`
131
+ * that aren't structural — none of it moves this string. Memo the group list on
132
+ * this instead of the whole `document` so ~90% of editor keystrokes skip the
133
+ * full tree re-scan.
134
+ *
135
+ * Must list the SAME shapes `collectSubtreeIds` + `readContainerSlots` walk —
136
+ * if a new container child-array is added there, mirror it here or the list can
137
+ * go stale until an unrelated structural edit flushes it.
138
+ */
139
+ export declare function variableGroupsStructuralKey(documentTree: Record<string, any>, fields: Array<{
140
+ id?: string;
141
+ name?: string;
142
+ type?: string;
143
+ containerId?: string;
144
+ sourceBlockId?: string;
145
+ itemsBlockId?: string;
146
+ }>): string;
147
+ export declare function collectVariableGroups(documentTree: Record<string, any>, fields: Array<{
148
+ id?: string;
149
+ name?: string;
150
+ type?: string;
151
+ value?: unknown;
152
+ containerId?: string;
153
+ sourceBlockId?: string;
154
+ itemsBlockId?: string;
155
+ }>): VariableGroup[];
65
156
  /**
66
157
  * Grow a repeatable container so it has at least `neededSlots` cells/columns/slides.
67
158
  *
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Global stylesheet that makes per-span `data-fs-<device>` attributes render
3
+ * at the picked size.
4
+ *
5
+ * The inline toolbar writes attributes only — no `style="font-size:…"` — so
6
+ * a single span can carry three independent sizes (Desktop / Tablet / Mobile)
7
+ * without fighting over a single inline slot. This module owns the CSS that
8
+ * turns those attributes into a live font-size.
9
+ *
10
+ * Rendering paths and how each finds the right rule:
11
+ *
12
+ * Real page viewport: `@media (max-width: 640px) { [data-fs-mobile="24"] … }`
13
+ * Fires on real pages where the browser viewport width is truthful. The
14
+ * published page loads its viewport-driven CSS this way.
15
+ *
16
+ * Editor canvas simulation: `@container ahd-page (max-width: 640px) …`
17
+ * The editor fakes device widths by RESIZING the `.ahd-page-root` box
18
+ * (378px mobile / 720px tablet) inside a full-width browser, so plain
19
+ * `@media` never fires in the editor. `.ahd-page-root` is set up as a
20
+ * `container-type: inline-size; container-name: ahd-page` context (see
21
+ * renderDynamicCss.ts), which `@container ahd-page (max-width: …)`
22
+ * queries against — so the same rule table works in both places.
23
+ *
24
+ * Emitting both queries around identical rule bodies is the shared pattern
25
+ * across the codebase (see MenuPicker, FlexColumns, EmailLayout responsive
26
+ * helpers). Desktop rules stay unscoped so they always apply as the base.
27
+ *
28
+ * The rule table is static (22 sizes × 3 devices × two queries) so no
29
+ * per-render work happens — the stylesheet is injected once into
30
+ * `document.head` on first import.
31
+ */
32
+ export declare const RESPONSIVE_FONT_SIZE_CSS: string;
33
+ export declare function buildExtraResponsiveFontSizeCss(html: string): string;
34
+ /**
35
+ * Injects the responsive font-size stylesheet into `document.head` exactly
36
+ * once per document. Safe to call from any block renderer's top-level
37
+ * module load — a second call is a no-op if the element already exists.
38
+ */
39
+ export declare function ensureResponsiveFontSizeCssInjected(): void;
40
+ /**
41
+ * Collapse chains of nested `<span data-fs-*>` wrappers so a single span
42
+ * carries all three device markers.
43
+ *
44
+ * A previous version of applyFontSize wrapped each write in a fresh <font
45
+ * size="7"> which turned into a fresh <span data-fs-<device>>. Applying
46
+ * three device sizes in a row produced three concentric spans, one per
47
+ * device, each seeing only its own attribute — which broke both the
48
+ * per-device readback (readLiveFormat surfaced only the innermost) and
49
+ * the published-page cascade (the outermost span's unscoped desktop rule
50
+ * shadowed inner mobile/tablet markers on their respective breakpoints).
51
+ *
52
+ * Runs on the editor DOM whenever it renders, so any legacy nested
53
+ * content authored under the old code path heals in place the moment it
54
+ * flows through this normalizer. Idempotent.
55
+ *
56
+ * The merge rule: if a responsive span has exactly one responsive-span
57
+ * child and no non-whitespace text siblings alongside that child, fold the
58
+ * two together. Attributes already on the child win over the parent's for
59
+ * the same device slot (the child was written more recently).
60
+ */
61
+ export declare function normalizeResponsiveSpans(root: HTMLElement | null): void;
62
+ /**
63
+ * Copy the parent responsive span's inline style properties and class onto the
64
+ * child before the parent is unwrapped. Child values win, so the more
65
+ * recently-authored inner span keeps its own choices; the parent's `font-size`
66
+ * is skipped because per-device sizing is driven by `data-fs-*` + CSS rules.
67
+ *
68
+ * Exported so `applyFontSize` in the inline toolbar can share the exact same
69
+ * merge behavior when its slow-path parent-merge loop collapses nested
70
+ * responsive spans it just produced.
71
+ */
72
+ export declare function mergeStylingFromParent(parent: HTMLElement, child: HTMLElement): void;
@@ -0,0 +1,5 @@
1
+ export declare function subtreeHasRowTokens(documentTree: Record<string, any>, rootId: string): boolean;
2
+ /** True if the author has switched the block's Repeat toggle on. */
3
+ export declare function hasRepeatEnabled(block: any): boolean;
4
+ export declare function isVariableBoundBlock(documentTree: Record<string, any>, blockId: string, fieldOwnerIds: Set<string>): boolean;
5
+ export declare function classifyVariableBlock(documentTree: Record<string, any>, blockId: string, fieldOwnerIds: Set<string>): 'bound' | 'candidate' | 'none';
@@ -475,8 +475,14 @@ export declare const EditorBlock: ({ type, data }: import('@usewaypoint/document
475
475
  left: z.ZodNumber;
476
476
  }, z.core.$strip>>>;
477
477
  tabActiveColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
478
+ tabActiveBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
479
+ tabInactiveTextColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
480
+ tabInactiveBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
481
+ tabInactiveBorderColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
482
+ tabInactiveBorderWidth: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
478
483
  tabTextColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
479
484
  tabBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
485
+ tabBorderRadius: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
480
486
  tabGap: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
481
487
  contentGap: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
482
488
  navBorderColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
@@ -505,6 +511,14 @@ export declare const EditorBlock: ({ type, data }: import('@usewaypoint/document
505
511
  showSelectedSection: "showSelectedSection";
506
512
  scrollToSelectedSection: "scrollToSelectedSection";
507
513
  }>>>;
514
+ tabsAlign: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
515
+ right: "right";
516
+ left: "left";
517
+ center: "center";
518
+ }>>>;
519
+ dropdown: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
520
+ dropdownTablet: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
521
+ dropdownMobile: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
508
522
  activeTabIndex: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
509
523
  stickyNav: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
510
524
  items: z.ZodNullable<z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -1026,6 +1040,7 @@ export declare const EditorBlock: ({ type, data }: import('@usewaypoint/document
1026
1040
  height: z.ZodDefault<z.ZodString>;
1027
1041
  heightTablet: z.ZodOptional<z.ZodString>;
1028
1042
  heightMobile: z.ZodOptional<z.ZodString>;
1043
+ autoHeight: z.ZodDefault<z.ZodBoolean>;
1029
1044
  alignment: z.ZodDefault<z.ZodEnum<{
1030
1045
  right: "right";
1031
1046
  left: "left";
@@ -2132,8 +2147,8 @@ export declare const EditorBlock: ({ type, data }: import('@usewaypoint/document
2132
2147
  }, z.core.$strip>>>;
2133
2148
  props: z.ZodNullable<z.ZodOptional<z.ZodObject<{
2134
2149
  stepperType: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
2135
- both: "both";
2136
2150
  numeric: "numeric";
2151
+ both: "both";
2137
2152
  dots: "dots";
2138
2153
  }>>>;
2139
2154
  totalDots: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
@@ -2186,8 +2201,8 @@ export declare const EditorBlock: ({ type, data }: import('@usewaypoint/document
2186
2201
  marker: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
2187
2202
  none: "none";
2188
2203
  check: "check";
2189
- square: "square";
2190
2204
  circle: "circle";
2205
+ square: "square";
2191
2206
  decimal: "decimal";
2192
2207
  disc: "disc";
2193
2208
  dash: "dash";
@@ -1,9 +1,9 @@
1
1
  import { TEditorConfiguration } from './core';
2
2
  import { TemplateFormField } from '../../../render-core/templateBaking';
3
- export { bakeTemplateValues, substituteBlockText, applyVariables, buildRepeatRowIndex, getTemplateForms, getTextFieldsForType, } from '../../../render-core/templateBaking';
3
+ export { bakeTemplateValues, substituteBlockText, applyVariables, buildRepeatRowIndex, getTemplateForms, getTextFieldsForType, TEMPLATE_SCALAR_TYPES, } from '../../../render-core/templateBaking';
4
4
  export type { TemplateScalarType, TemplateFormType, TemplateItemFieldDef, TemplateArrayRow, TemplateFormField, } from '../../../render-core/templateBaking';
5
- /** All scalar types — used by both top-level fields and array sub-fields. */
6
- export declare const TEMPLATE_SCALAR_TYPES: Array<'text' | 'textarea' | 'number' | 'image'>;
5
+ export type { DateFormatPreset, TimeFormatPreset } from '../../../render-core/dateFormats';
6
+ export { DATE_FORMAT_PRESETS, DEFAULT_DATE_FORMAT, DEFAULT_TIME_FORMAT, formatDateValue, formatRelativeDate, formatTimeValue, TIME_FORMAT_PRESETS, } from '../../../render-core/dateFormats';
7
7
  /**
8
8
  * Apply `sourceHtml`'s formatting shell to `targetHtml`'s text. If the source
9
9
  * has no formatting, returns the target unchanged (keeps the copy's text as-is).
@@ -9,6 +9,7 @@ export declare const FormsPropsSchema: z.ZodObject<{
9
9
  height: z.ZodDefault<z.ZodString>;
10
10
  heightTablet: z.ZodOptional<z.ZodString>;
11
11
  heightMobile: z.ZodOptional<z.ZodString>;
12
+ autoHeight: z.ZodDefault<z.ZodBoolean>;
12
13
  alignment: z.ZodDefault<z.ZodEnum<{
13
14
  right: "right";
14
15
  left: "left";
@@ -31,8 +31,14 @@ export declare const TabsBlockPropsSchema: z.ZodObject<{
31
31
  left: z.ZodNumber;
32
32
  }, z.core.$strip>>>;
33
33
  tabActiveColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
34
+ tabActiveBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
35
+ tabInactiveTextColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
36
+ tabInactiveBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
37
+ tabInactiveBorderColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
38
+ tabInactiveBorderWidth: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
34
39
  tabTextColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
35
40
  tabBgColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
41
+ tabBorderRadius: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
36
42
  tabGap: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
37
43
  contentGap: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
38
44
  navBorderColor: z.ZodNullable<z.ZodOptional<z.ZodString>>;
@@ -61,6 +67,14 @@ export declare const TabsBlockPropsSchema: z.ZodObject<{
61
67
  showSelectedSection: "showSelectedSection";
62
68
  scrollToSelectedSection: "scrollToSelectedSection";
63
69
  }>>>;
70
+ tabsAlign: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
71
+ right: "right";
72
+ left: "left";
73
+ center: "center";
74
+ }>>>;
75
+ dropdown: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
76
+ dropdownTablet: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
77
+ dropdownMobile: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
64
78
  activeTabIndex: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
65
79
  stickyNav: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
66
80
  items: z.ZodNullable<z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -1,4 +1,5 @@
1
1
  import { TReaderDocument } from '../Reader/core';
2
+ export declare const buildTemplateVarSubstitutionMarkup: () => string;
2
3
  export declare const hasTabsBlock: (document: TReaderDocument) => boolean;
3
4
  export declare const hasDemoBlock: (document: TReaderDocument) => boolean;
4
5
  export declare const hasCarouselBlock: (document: TReaderDocument) => boolean;
@@ -0,0 +1,32 @@
1
+ export declare const TEMPLATE_VAR_ATTR = "data-ahd-var";
2
+ export declare function markTemplateVarsInHtml(html: string): string;
3
+ export declare function markTemplateVarsInPlainText(value: string): string;
4
+ export declare function fillTemplateVarsInUrlString(url: string, search?: string): string;
5
+ export declare function fillTemplateVarSpans(root: ParentNode, search?: string): void;
6
+ export declare const TEMPLATE_DATE_ATTR = "data-ahd-date";
7
+ export declare const TEMPLATE_DATE_FORMAT_ATTR = "data-ahd-date-format";
8
+ /**
9
+ * Marker span for a relative date token. Carries the raw ISO in `data-ahd-date`
10
+ * and `data-ahd-date-format="relative"`. Its text content is the label computed
11
+ * NOW (so the editor canvas and any non-runtime render already read sensibly);
12
+ * the client / saved-HTML runtime overwrites it on view so "Today" stays
13
+ * accurate on later opens. `data-ahd-var` is kept so the orphan-token / pill
14
+ * machinery still recognises the span.
15
+ */
16
+ export declare function markDateVar(name: string, isoValue: string): string;
17
+ /**
18
+ * "Today" | "Tomorrow" | "Yesterday" | weekday | "Mmm D" | "Mmm D, YYYY",
19
+ * compared against `now` in the host's local timezone. Standalone (no imports)
20
+ * so the saved-HTML runtime in pageScripts.ts can inline the same logic.
21
+ *
22
+ * NOTE: keep in sync with formatRelativeDate in src/utils/dateFormats.ts and the
23
+ * inlined copy in pageScripts.ts (buildTemplateVarSubstitutionMarkup).
24
+ */
25
+ export declare function formatRelativeDateLabel(iso: string, now?: Date): string;
26
+ /**
27
+ * Client-side fill for relative-date markers within `root`. Runs alongside
28
+ * fillTemplateVarSpans in the Reader's layout effect. Idempotent — re-running
29
+ * re-reads the ISO from the attribute, so it's safe to call on every document
30
+ * change.
31
+ */
32
+ export declare function fillDateVarSpans(root: ParentNode, now?: Date): void;
@@ -0,0 +1,19 @@
1
+ export interface InfoTooltipLink {
2
+ label: string;
3
+ href: string;
4
+ }
5
+ interface InfoTooltipProps {
6
+ text: string;
7
+ link?: InfoTooltipLink;
8
+ placement?: 'top' | 'bottom' | 'left' | 'right' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';
9
+ iconSize?: number;
10
+ }
11
+ /**
12
+ * Common help-icon tooltip, ported from ahd-fe's host-app copy (which lives
13
+ * outside the email-builder package, at `src/view/shared/common/InfoTooltip.tsx`,
14
+ * and resolves relative links against a host-only `PRODUCT_DOCS_BASE_URL`
15
+ * constant VE doesn't have). Callers here pass a full `https://` URL instead —
16
+ * see VariablesPanel's `DOCS_TEMPLATE_VARIABLES` for the same convention.
17
+ */
18
+ declare const InfoTooltip: React.FC<InfoTooltipProps>;
19
+ export default InfoTooltip;
@@ -0,0 +1,4 @@
1
+ export declare const timeZoneOptions: {
2
+ value: string;
3
+ label: string;
4
+ }[];