pagepilot-visual-editor 1.0.29 → 1.0.33

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 (194) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +42 -28
  3. package/dist/PagePilotEditor.d.ts +12 -9
  4. package/dist/api/ApiClientContext.d.ts +1 -0
  5. package/dist/api/PagepilotApiClient.d.ts +7 -0
  6. package/dist/assets/aiChatbotIcon.d.ts +1 -0
  7. package/dist/blocks-internal/block-button/src/index.d.ts +6 -0
  8. package/dist/blocks-internal/block-container/src/index.d.ts +1 -1
  9. package/dist/blocks-internal/block-heading/src/index.d.ts +2 -2
  10. package/dist/blocks-internal/block-list/src/index.d.ts +12 -2
  11. package/dist/blocks-internal/block-mdx/src/index.d.ts +47 -0
  12. package/dist/blocks-internal/block-quill/src/index.d.ts +48 -0
  13. package/dist/editor/PagePreviewDialog.d.ts +14 -0
  14. package/dist/editor/Topbar.d.ts +3 -1
  15. package/dist/editor/pageUrls.d.ts +25 -0
  16. package/dist/editor/publish/PageLiveSuccessDialog.d.ts +9 -0
  17. package/dist/editor/publish/PagePublishDialog.d.ts +1 -0
  18. package/dist/editor/publish/PublishAccessibilityPanel.d.ts +8 -0
  19. package/dist/editor/publish/a11yLinter.d.ts +8 -0
  20. package/dist/editor/recordDirty.d.ts +16 -0
  21. package/dist/editor/renderSections.d.ts +2 -2
  22. package/dist/editor/savePipeline.d.ts +40 -0
  23. package/dist/editor/types.d.ts +35 -0
  24. package/dist/editor-sample/App/InspectorDrawer/BehaviourPanel.d.ts +22 -0
  25. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandColorPalette.d.ts +9 -0
  26. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandEmptyLink.d.ts +8 -0
  27. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandPanel.styled.d.ts +22 -0
  28. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandSection.d.ts +8 -0
  29. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/EmptyText.d.ts +6 -0
  30. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/FontDetailsList.d.ts +6 -0
  31. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/index.d.ts +5 -0
  32. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/useBrandApply.d.ts +9 -0
  33. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/ResponsiveDeviceTabs.d.ts +0 -2
  34. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/blockStyleClipboard.d.ts +2 -8
  35. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/index.d.ts +1 -4
  36. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/EmailLayoutSidebarPanel.d.ts +2 -1
  37. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/FlexColumns/ColumnSection.d.ts +2 -0
  38. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/FormsPickerSidebarPanel.d.ts +2 -1
  39. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/MdxSidebarPanel.d.ts +7 -0
  40. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/MenuPickerSidebarPanel.d.ts +23 -1
  41. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/QuillSidebarPanel.d.ts +8 -0
  42. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/TextSidebarPanel.d.ts +2 -2
  43. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/AnimationSection.d.ts +7 -5
  44. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/HoverEffectSection.d.ts +1 -1
  45. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/imageSizeUnit.d.ts +19 -0
  46. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.d.ts +0 -2
  47. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/inputs/VariableLinkHint.d.ts +27 -0
  48. package/dist/editor-sample/App/InspectorDrawer/EditorBehavior.d.ts +8 -2
  49. package/dist/editor-sample/App/InspectorDrawer/LayersPanelStyles.d.ts +2 -2
  50. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/AiSupportedBadge.d.ts +7 -0
  51. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/SectionsModal.d.ts +2 -10
  52. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/icons/index.d.ts +3 -5
  53. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/templateHelpers.d.ts +198 -0
  54. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/useDebouncedValue.d.ts +8 -0
  55. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/AiGenerateButton.d.ts +18 -0
  56. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ItemsArrayRepeatSection.d.ts +2 -3
  57. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ScalarFieldRow.d.ts +4 -1
  58. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariableGroupDialog.d.ts +19 -0
  59. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariableGroupList.d.ts +5 -0
  60. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/aiFill.d.ts +75 -0
  61. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/styles.d.ts +14 -11
  62. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/upgradeDialog.d.ts +8 -8
  63. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/useAutoRegisterTokenFields.d.ts +8 -0
  64. package/dist/editor-sample/App/InspectorDrawer/behaviourFields.d.ts +30 -0
  65. package/dist/editor-sample/App/InspectorDrawer/components/RichTextAiButton.d.ts +7 -0
  66. package/dist/editor-sample/App/InspectorDrawer/index.d.ts +8 -1
  67. package/dist/editor-sample/App/InspectorDrawer/publish/BackgroundPanel.d.ts +6 -0
  68. package/dist/editor-sample/App/InspectorDrawer/renderBehaviourField.d.ts +7 -0
  69. package/dist/editor-sample/App/TemplatePanel/hooks/useMainBoxStyles.d.ts +2 -1
  70. package/dist/editor-sample/App/TemplatePanel/index.d.ts +2 -1
  71. package/dist/editor-sample/App/TemplatePanel/minimap/useMiniMapSync.d.ts +2 -2
  72. package/dist/editor-sample/App/TemplatePanel/pageGuide/iframeSrcDoc.d.ts +3 -6
  73. package/dist/editor-sample/App/hooks/page/saveMenuHrefEdits.d.ts +1 -1
  74. package/dist/editor-sample/App/hooks/page/useSaveHandler.d.ts +1 -0
  75. package/dist/editor-sample/App/hooks/useAutosave.d.ts +8 -3
  76. package/dist/editor-sample/App/hooks/useIsTemplateEditorRoute.d.ts +1 -0
  77. package/dist/editor-sample/App/hooks/useStretch.d.ts +9 -0
  78. package/dist/editor-sample/App/shared/PagePreviewFrame.d.ts +17 -2
  79. package/dist/editor-sample/App/shared/UploadImage.d.ts +4 -0
  80. package/dist/editor-sample/App/shared/editor.styles.d.ts +13 -3
  81. package/dist/editor-sample/documents/blocks/Container/ContainerPropsSchema.d.ts +6 -4
  82. package/dist/editor-sample/documents/blocks/EmailLayout/EmailLayoutPropsSchema.d.ts +4 -0
  83. package/dist/editor-sample/documents/blocks/FormsPicker/FormsPropsSchema.d.ts +33 -2
  84. package/dist/editor-sample/documents/blocks/List/ListEditor.d.ts +8 -0
  85. package/dist/editor-sample/documents/blocks/Marquee/MarqueePropsSchema.d.ts +4 -0
  86. package/dist/editor-sample/documents/blocks/MenuPicker/MenuPropsSchema.d.ts +11 -0
  87. package/dist/editor-sample/documents/blocks/Table/TableCellEditor.d.ts +2 -1
  88. package/dist/editor-sample/documents/blocks/Table/TableImportDialog.styles.d.ts +15 -5
  89. package/dist/editor-sample/documents/blocks/Table/parseClipboardTable.d.ts +7 -0
  90. package/dist/editor-sample/documents/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +6 -0
  91. package/dist/editor-sample/documents/blocks/Timer/TimerPropsSchema.d.ts +2 -0
  92. package/dist/editor-sample/documents/blocks/Timer/variants/CircularProgressView.d.ts +2 -1
  93. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/blockMenuStyles.d.ts +1 -1
  94. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/brandButtonDefaults.d.ts +1 -4
  95. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.d.ts +0 -6
  96. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/dialogs/LinkDialog.d.ts +4 -1
  97. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/hooks/useToolbarCommands.d.ts +16 -4
  98. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/popovers/TableResizeOverlay.d.ts +17 -0
  99. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/styles.d.ts +2 -2
  100. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/types.d.ts +2 -4
  101. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.d.ts +2 -3
  102. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/TuneMenu.styles.d.ts +17 -0
  103. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/saveAsTemplateUtils.d.ts +37 -7
  104. package/dist/editor-sample/documents/blocks/helpers/documentUtils.d.ts +55 -28
  105. package/dist/editor-sample/documents/blocks/helpers/responsiveStyle.d.ts +1 -1
  106. package/dist/editor-sample/documents/blocks/helpers/variableBinding.d.ts +9 -2
  107. package/dist/editor-sample/documents/editor/EditorBlock.d.ts +2 -6
  108. package/dist/editor-sample/documents/editor/EditorContext.d.ts +87 -20
  109. package/dist/editor-sample/documents/editor/LazyEditorBlock.d.ts +1 -0
  110. package/dist/editor-sample/documents/editor/core.d.ts +510 -390
  111. package/dist/editor-sample/documents/editor/templateVariables.d.ts +178 -25
  112. package/dist/editor-sample/documents/editor/useRootFontFamily.d.ts +10 -0
  113. package/dist/editor-sample/utils/editorStorageKey.d.ts +2 -0
  114. package/dist/editor-sample/utils/localStoragePref.d.ts +2 -0
  115. package/dist/email-builder-core/blocks/Container/ContainerPropsSchema.d.ts +1 -1
  116. package/dist/email-builder-core/blocks/Container/ContainerReader.d.ts +1 -1
  117. package/dist/email-builder-core/blocks/EmailLayout/EmailLayoutPropsSchema.d.ts +4 -0
  118. package/dist/email-builder-core/blocks/EmailLayout/EmailLayoutReader.d.ts +1 -1
  119. package/dist/email-builder-core/blocks/FlexColumns/FlexColumnsPropsSchema.d.ts +3 -0
  120. package/dist/email-builder-core/blocks/FlexColumns/flexColumnsHelpers.d.ts +4 -2
  121. package/dist/email-builder-core/blocks/MenuPicker/MenuColumns.d.ts +13 -0
  122. package/dist/email-builder-core/blocks/MenuPicker/MenuPropsSchema.d.ts +10 -0
  123. package/dist/email-builder-core/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +6 -0
  124. package/dist/email-builder-core/index.d.ts +0 -2
  125. package/dist/email-builder-core/renderers/pageScripts.d.ts +0 -1
  126. package/dist/email-builder-core/renderers/themeTokens.d.ts +94 -132
  127. package/dist/host-stubs/history.d.ts +5 -0
  128. package/dist/host-stubs/hooks/useTenantFeatureCutoff.d.ts +8 -0
  129. package/dist/host-stubs/hooks/useTenantPlan.d.ts +18 -0
  130. package/dist/host-stubs/i18nAhdDefaults.d.ts +1 -0
  131. package/dist/host-stubs/modules/allSlugs/allSlugsActions.d.ts +1 -0
  132. package/dist/host-stubs/modules/allSlugs/allSlugsSelectors.d.ts +1 -0
  133. package/dist/host-stubs/modules/auth/authCurrentTenant.d.ts +6 -0
  134. package/dist/host-stubs/modules/forms/formsService.d.ts +3 -1
  135. package/dist/host-stubs/modules/forms/useFormsList.d.ts +4 -1
  136. package/dist/host-stubs/modules/menu/menuService.d.ts +4 -0
  137. package/dist/host-stubs/modules/page/pageService.d.ts +11 -0
  138. package/dist/host-stubs/modules/settings/settingsActions.d.ts +2 -0
  139. package/dist/host-stubs/modules/settings/settingsSelectors.d.ts +4 -0
  140. package/dist/host-stubs/modules/shared/axios/authAxios.d.ts +17 -0
  141. package/dist/host-stubs/modules/shared/constants.d.ts +14 -0
  142. package/dist/host-stubs/modules/store.d.ts +4 -0
  143. package/dist/host-stubs/modules/template/templateEnumerators.d.ts +19 -0
  144. package/dist/host-stubs/modules/tour/injectTourIntoPage.d.ts +20 -0
  145. package/dist/host-stubs/modules/websiteV2/propagateFromPage.d.ts +4 -0
  146. package/dist/host-stubs/style/icons.d.ts +57 -0
  147. package/dist/host-stubs/utils/dateFormats.d.ts +1 -0
  148. package/dist/host-stubs/view/branding/brandDefaultFont.d.ts +3 -1
  149. package/dist/host-stubs/view/branding/styles/BrandIcons.d.ts +9 -0
  150. package/dist/host-stubs/view/branding/styles/types.d.ts +76 -0
  151. package/dist/host-stubs/view/configurations/ConfigurationIcons.d.ts +9 -0
  152. package/dist/host-stubs/view/demo/DemoIcons.d.ts +9 -0
  153. package/dist/host-stubs/view/images/Icons.d.ts +6 -0
  154. package/dist/host-stubs/view/media/MediaGalleryDialog/types.d.ts +47 -0
  155. package/dist/host-stubs/view/media/MediaGalleryDialog/utils/fileUtils.d.ts +3 -0
  156. package/dist/host-stubs/view/media/MediaGalleryDialog/utils/mediaTypes.d.ts +9 -0
  157. package/dist/host-stubs/view/media/MediaGalleryDialog.d.ts +12 -2
  158. package/dist/host-stubs/view/media/styles/MediaIcons.d.ts +13 -0
  159. package/dist/host-stubs/view/shared/Confetti.d.ts +5 -0
  160. package/dist/host-stubs/view/shared/PagePilotLoader.d.ts +2 -0
  161. package/dist/host-stubs/view/shared/UpgradeDialog/UpgradeDialogContext.d.ts +1 -0
  162. package/dist/host-stubs/view/shared/common/CopyToClipboard.d.ts +7 -0
  163. package/dist/host-stubs/view/shared/editors/MdxEditor.d.ts +8 -0
  164. package/dist/host-stubs/view/shared/editors/QuillEditor.d.ts +3 -0
  165. package/dist/host-stubs/view/shared/editors/sanitize.d.ts +4 -0
  166. package/dist/host-stubs/view/shared/editors/types.d.ts +7 -0
  167. package/dist/host-stubs/view/shared/media/TemplatePreviewMedia.d.ts +29 -0
  168. package/dist/host-stubs/view/shared/modals/ConfigureDialog.d.ts +7 -0
  169. package/dist/host-stubs/view/shared/modals/ManageTemplateModal.d.ts +5 -0
  170. package/dist/host-stubs/view/shared/speech/index.d.ts +17 -0
  171. package/dist/host-stubs/view/shared/styles/Table.styles.d.ts +3 -0
  172. package/dist/host-stubs/view/template/form/TemplateFormModal.d.ts +10 -0
  173. package/dist/host-stubs/view/template/form/fields/types.d.ts +7 -0
  174. package/dist/{index-BN1BduFG.js → index-BONR8bWR.js} +1 -1
  175. package/dist/{index-DojXOBrb.js → index-B_cb-ZLC.js} +88415 -74153
  176. package/dist/index-BfIWhBCR.cjs +1561 -0
  177. package/dist/{index-BRq3RgdO.cjs → index-CFA3aG_U.cjs} +1 -1
  178. package/dist/index.cjs +1 -1
  179. package/dist/index.js +1 -1
  180. package/dist/render-core/combineSections.d.ts +33 -3
  181. package/dist/render-core/dateFormats.d.ts +14 -3
  182. package/dist/render-core/stubs/pickerEmptyState.d.ts +2 -0
  183. package/dist/render-core/stubs/styleIcons.d.ts +1 -0
  184. package/dist/render.cjs +272 -219
  185. package/dist/render.js +9856 -7949
  186. package/dist/style.css +1 -1
  187. package/dist/{xlsx-D2quXLTv.cjs → xlsx-CBpoXUEM.cjs} +1 -1
  188. package/dist/{xlsx-0y4dyiCO.js → xlsx-DSqBw3Em.js} +1 -1
  189. package/package.json +1 -1
  190. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/ResponsiveEditingBanner.d.ts +0 -13
  191. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/BoxShadowControls.d.ts +0 -19
  192. package/dist/editor-sample/documents/blocks/AppBannerPicker/appBanner.styled.d.ts +0 -2
  193. package/dist/email-builder-core/blocks/boxShadowSchema.d.ts +0 -23
  194. package/dist/index-DEBoxZlq.cjs +0 -1510
package/CHANGELOG.md CHANGED
@@ -6,7 +6,58 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ### Changed
10
+ - Re-synced the vendored editor with ahd-fe `master` (9661ba36b), on top of
11
+ the 82ec6ec4b sync below. Upstream behaviour pulled in includes:
12
+ - Host-application theme support (theme slots, surface lock, dark-host
13
+ `light-dark()` adaptation) across readers, the canvas and previews.
14
+ - Selecting a block no longer switches the sidebar tab; a variable-bound
15
+ block highlights its variable for the Variables tab.
16
+ - AI: per-field `RichTextAiButton` / `AiGenerateButton` (the AI Fill All
17
+ dialog is removed), and scalar `{{token}}` fields are auto-registered.
18
+ - Token editing inside inline text keeps `{{token}}` wrappers intact
19
+ (`splitEditedTokenHtml`, `htmlToPlainText`).
20
+ - Inline toolbar table resizing, MenuPicker items-array / columns plus a
21
+ page-link picker, FlexColumns column widths, container responsive
22
+ height, removing a repeat row deletes its subtree.
23
+ - Section Library defaults to "My templates" when the tenant has any.
24
+ - Debounced inputs and fewer re-renders in the sidebar and minimap.
25
+ - Host stubs: `modules/allSlugs` (empty list) and
26
+ `modules/websiteV2/propagateFromPage` (no-op), and `authAxios` accepts
27
+ `signal` so AI requests can be cancelled without axios.
28
+ - ahd-fe-only template-switch UI (Templates / SavedTemplates / compare
29
+ dialogs) is not vendored.
30
+ - Re-synced the vendored editor (`editor-sample/`, `email-builder-core/`,
31
+ `blocks-internal/`) with ahd-fe `master` (82ec6ec4b). 358 of 453 shared
32
+ files are now byte-identical. The rest differ only where the standalone
33
+ build needs it: pagepilot API wiring, no dayjs / x-date-pickers / lab /
34
+ react-hook-form / react-select dependencies, MUI 6 + zod 4 typing, and
35
+ pagepilot-named i18n keys. Upstream behaviour pulled in includes:
36
+ - Every block sidebar panel re-laid out into ahd-fe's collapsible
37
+ Content / Appearance / Typography / Layout / Spacing / Border / Effects
38
+ sections, with per-device (desktop / tablet / mobile) values and margin.
39
+ - Inline text toolbar: link editing on click, link underline, table row
40
+ background, font-family apply, per-device font sizes.
41
+ - Brand panel (new rail tab, `panels.brand`), Manage Templates dialog,
42
+ variable groups, AI fill for variables (through `apiConfig`), schema
43
+ markup in the SEO panel, Section Library rewrite (global / private
44
+ sources, plan lock, AI badge), resizable / collapsible inspector.
45
+ - Legacy Markdown (Mdx) and Quill blocks render again; their rich editors
46
+ fall back to plain source textareas.
47
+ - Reader: per-device `responsive` resolution and `ahd-<id>` wrapper ids.
48
+ - Host stubs: `@/` imports now resolve like `src/` (vite + tsconfig). The
49
+ English strings for every referenced i18n key are generated from ahd-fe's
50
+ `en.tsx` (`host-stubs/i18nAhdDefaults.ts`). The media gallery stub is a
51
+ working URL picker, so every "Upload / Replace media" button works.
52
+ - `onUpgrade` may now receive ahd-fe's optional `{ title, description }`.
53
+
9
54
  ### Fixed
55
+ - `renderToStaticHtml` (the `./render` subpath) no longer coerces Progress,
56
+ Breadcrumb, Markdown and Quill blocks to Text — its block allow-list now
57
+ matches the Reader's 41 block types exactly.
58
+ - The `./render` bundle stays MUI / emotion-free: the IFrame block's editor
59
+ placeholder (shown when no URL is set) is stubbed out for Node renders.
60
+ Before, an IFrame without a URL crashed server-side rendering.
10
61
  - Re-synced the renderer (`email-builder-core/` + `blocks-internal/`) with
11
62
  ahd-fe, so server-side `renderToStaticHtml` output matches what the editor
12
63
  publishes on Save. Pages regenerated by ahd-be's `pagebypath?update=true`
@@ -26,12 +77,77 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
26
77
  - Published scripts (tabs, carousel, pagination, timer, animation,
27
78
  demo-scale) are now referenced by hosted URL, matching ahd-fe, instead of
28
79
  being inlined.
80
+ - The `activeStepIndex` prop now also selects that section in the editor
81
+ store. Before, the canvas showed section N while saves wrote the canvas
82
+ into section 0.
83
+ - With `apiConfig`, a single-document record's save sent no content (its
84
+ `contentMetadata` was stripped and there were no sections). It now sends
85
+ one section, as ahd-fe does.
29
86
 
30
87
  ### Added
31
88
  - `recordType` render option. EmailLayout detects the record type from the
32
89
  browser URL, and Node has none, so a page with no authored width rendered
33
90
  at 320px. The pageId / pagePath shapes now default to `"page"`. Sync
34
91
  callers rendering a page should pass `recordType: "page"`.
92
+ - Editor shell parity with ahd-fe's page editor:
93
+ - **"Page is live" dialog** after a publish through `apiConfig`: the
94
+ live URL plus, when the tenant has its own domain, the preview URL on
95
+ it, each with copy and open buttons.
96
+ - **Accessibility check** in the publish dialog (port of ahd-fe's
97
+ `a11yLinter` + `PublishAccessibilityPanel`).
98
+ - **Plan-gated scheduling** in the publish dialog: below Pro, the date
99
+ fields show "✦ Upgrade" and a date after today opens the upgrade
100
+ prompt. The native date input is kept (no new dependencies).
101
+ - **Pagination script** toggle in the publish dialog's Scripts tab.
102
+ - **Page preview** rebuilt on ahd-fe's `PagePreviewDialog`: syncs the
103
+ current section first, renders inside the `pagePilotStyles.css` +
104
+ `.ahd-page-root` wrapper, shows external sections as anchors, and adds
105
+ "Open live URL" / "Open on your domain" buttons.
106
+ - **Keyboard shortcuts**: Ctrl/Cmd+Z, Ctrl/Cmd+Y and Ctrl/Cmd+Shift+Z for
107
+ undo / redo; Ctrl/Cmd+B toggles bold on a selected Heading.
108
+ - **Built-in Publish ▾ menu** when the host passes no `onPublishMenu`:
109
+ Publish, Live URL (live pages) and Save as Draft.
110
+ - The initial canvas device comes from `record.device`; switching device
111
+ scrolls the selected block back into view.
112
+ - `SaveChangesPayload` gains optional `status`, `sections` (exactly what is
113
+ sent to `upsert-page-item`), `schedule` and `response`. Existing fields
114
+ are unchanged.
115
+ - `combineSections`: `injectPaginationScript` and `rootOverrides` render
116
+ options, plus `externalSectionAnchorHtml` / `wrapSectionsInDocumentShell`
117
+ helpers.
118
+
119
+ ### Changed
120
+ - Save Changes and autosave now save with the record's **current status**
121
+ (ahd-fe's `onShowHtml(record.status)`) instead of always `"draft"`, so
122
+ saving a live page keeps it live. Save Draft / Save as Draft still send
123
+ `"draft"`; Publish sends `"live"`.
124
+ - Save / publish HTML now goes through a port of ahd-fe's `useSaveHandler`
125
+ pipeline (`src/editor/savePipeline.ts`): template variables are baked into
126
+ the published HTML while the saved document keeps them editable; page
127
+ records save `<body>` inner HTML only; fonts ship inline
128
+ (`injectFontAssets: true`); `record.bodyBottom` is appended; an existing
129
+ AHD integration snippet is preserved. A single-document record now sends
130
+ one synthesized section to the API, as ahd-fe does.
131
+ - After a successful save or publish the API response is merged back into
132
+ the record (reported through `onUpdateRecord`), the undo history is reset,
133
+ and "Changes saved" shows. Publish now also shows "Changes saved".
134
+ - External (client-side) sections render as an empty `<div id=identifier>`
135
+ anchor on save, publish, preview and in `renderToStaticHtml` (previously
136
+ their stored `content` was used).
137
+ - Switching sections loads the new section with a fresh undo history (like
138
+ ahd-fe's `loadStepDocument`): it no longer marks the editor dirty, and
139
+ Undo can't walk back into another section's document. Adding or deleting
140
+ a section is a single undoable step.
141
+ - Dirty tracking now also covers record-level changes: sections added,
142
+ deleted, renamed, reordered or retyped, edits flushed from other sections,
143
+ and sidebar-edited page fields (SEO meta, head, body bottom, …).
144
+ - Zoom controls are page-only, hidden below the `lg` breakpoint, and show a
145
+ toast at the 25% / 100% limits instead of disabling.
146
+ - Undo, Redo, More, Preview and Publish are disabled while a save runs.
147
+ - The tab-close "Leave site?" prompt is skipped while "Changes saved" shows.
148
+ - The canvas now shows the external-section placeholder for the active
149
+ section (the flag is synced to the editor store and passed to the
150
+ inspector and canvas).
35
151
 
36
152
  ## [1.0.27] — 2026-09-21
37
153
 
package/README.md CHANGED
@@ -113,7 +113,7 @@ built-in layout doesn't scale unexpectedly.
113
113
  * only when template has vars
114
114
  ```
115
115
 
116
- - **Left rail** — up to 7 panels: **Style**, **Layout**, **Inspect**, **Layers**, **Variables**, **SEO**, **Pagepilot** (each can be toggled off via the `panels` prop). Variables auto-hides unless a template with fields is applied or a repeatable container is selected. Pagepilot currently renders a "Coming soon" placeholder — the full AI page generator lands in a future release.
116
+ - **Left rail** — up to 8 panels: **Style**, **Layout**, **Inspect**, **Layers**, **Variables**, **SEO**, **Brand**, **Pagepilot** (each can be toggled off via the `panels` prop, e.g. `panels={{ brand: false }}`). Brand lists the workspace's brand colours and fonts, as in ahd-fe; the standalone build has no tenant branding source, so it shows ahd-fe's empty state. Variables auto-hides unless a template with fields is applied or a repeatable container is selected. Pagepilot currently renders a "Coming soon" placeholder — the full AI page generator lands in a future release.
117
117
  - **Topbar** — every control is individually toggleable via the `topbar` prop. Includes zoom out / zoom-% / zoom in (also driven by Ctrl/Cmd + wheel) / undo / redo / **deselect block** (auto-hidden when nothing is selected) / save / **auto save** (opt-in) / desktop-tablet-mobile / theme / more menu / fullscreen / preview / publish.
118
118
  - **Canvas** — the block-based page editor. Click the empty-state "Add first section" or the ⋮ → Add Section. A **minimap** overview (togglable from the 3-dot menu) docks to the bottom-right and lets you click / drag to scroll long pages. Unsaved edits show the browser's native "Leave site?" prompt on tab close or reload.
119
119
  - **Block TuneMenu** — appears above any selected block: **drag handle** (native reorder) / move up / move down / delete / **open in Layers** / **edit variables** (template-bound blocks only) / **more menu** (Save as template / Duplicate / Copy / Paste / **Replace** / Hide).
@@ -277,9 +277,9 @@ type BlockToggles = Partial<Record<BlockKey, boolean>>;
277
277
  |---|---|---|
278
278
  | `onUpdateRecord` | `(record: PageRecord) => void` | Whenever the editor mutates the document, adds/removes/reorders sections, etc. The host owns the record state and should call `setState`/equivalent here. |
279
279
  | `onChange` | `(document: any) => void` | Lower-level: fires on every document tree mutation. Use when you only need the canvas document, not the full record. |
280
- | `onSaveChanges` | `(payload: SaveChangesPayload) => Promise<boolean \| void> \| boolean \| void` | Fires when **Save Changes** is clicked. Receives the full payload (record + document + rendered HTML). Return `true` (or void) for success, `false` to indicate the save failed. |
280
+ | `onSaveChanges` | `(payload: SaveChangesPayload) => Promise<boolean \| void> \| boolean \| void` | Fires on **Save Changes**, autosave, and **Save Draft / Save as Draft**. Receives the full payload (record + document + rendered HTML + `status` + `sections`). Save Changes and autosave keep the record's current `status` (a live page stays live); the draft actions send `"draft"`. Return `true` (or void) for success, `false` to indicate the save failed. |
281
281
  | `onPublish` | `(payload: SaveChangesPayload) => Promise<void> \| void` | Fires when the **Publish** button is clicked. Same payload as Save. |
282
- | `onPublishMenu` | `(anchorEl: HTMLElement, payload: SaveChangesPayload) => void` | Fires when the small ▾ arrow next to Publish is clicked. The host can open any custom popover/menu/dialog anchored to `anchorEl`. **Omit to disable the arrow.** |
282
+ | `onPublishMenu` | `(anchorEl: HTMLElement, payload: SaveChangesPayload) => void` | Fires when the small ▾ arrow next to Publish is clicked. The host can open any custom popover/menu/dialog anchored to `anchorEl`. **Omit it to get the built-in menu**: Publish, **Live URL** (when the page is live and the tenant is known) and **Save as Draft**. |
283
283
  | `renderPublish` | `({ payload, onPublish }) => ReactNode` | **Fully replaces** the Publish split-button group with the host's component. When provided, `onPublish` / `onPublishMenu` are ignored — host owns the slot. |
284
284
  | `onBack` | `() => void` | Fires when the ← Back button is clicked. |
285
285
  | `onTogglePreview` | `(html: string, doc: any) => void` | Optional preview hook. **If provided**, the host owns the preview UI (typically opening its own dialog with `html`). **If omitted**, the editor opens its built-in in-page preview dialog with desktop/tablet/mobile size toggles. |
@@ -304,9 +304,20 @@ interface SaveChangesPayload {
304
304
  html: string; // rendered HTML — for multi-section pages, every
305
305
  // section's fragment is concatenated inside one
306
306
  // <html> shell with viewport meta + base font
307
+ status?: string | null; // status saved with: record's current status for
308
+ // Save Changes / autosave, "draft" / "live" for
309
+ // the draft / publish actions
310
+ sections?: any[]; // sections exactly as sent to upsert-page-item
311
+ // (one synthesized section for single-doc records)
312
+ schedule?: { startDate?: Date | null; endDate?: Date | null };
313
+ // publish-dialog schedule, when submitted
314
+ response?: any; // upsert-page-item response (apiConfig only)
307
315
  }
308
316
  ```
309
317
 
318
+ `status`, `sections`, `schedule` and `response` are additive — existing
319
+ hosts that destructure `{ record, document, html }` see no change.
320
+
310
321
  **Multi-section deduplication.** When `record.sections[]` is present, the
311
322
  payload's `record` is stripped down — the record-level `contentMetadata`
312
323
  and any empty `behaviour` / `steps` are removed because sections are the
@@ -591,13 +602,15 @@ Authorization: Bearer ${authToken}
591
602
  "data": {
592
603
  ...record, // full record — id, name, slug, tags, groups, tenant, …
593
604
  "pageId": "6a43bc20…", // === record.id
594
- "status": "live" | "draft", // "draft" for Save Changes, "live" for Publish
605
+ "status": "live" | "draft", // record's current status for Save Changes / autosave,
606
+ // "draft" for Save Draft, "live" for Publish
595
607
  "sections": [ // rendered sections (source of truth for multi-section pages)
596
608
  {
597
609
  "title": "Section 1",
598
610
  "sectionType": "internal",
599
611
  "identifier": "section-1784032010220",
600
- "content": "<div …>…rendered HTML…</div>",
612
+ "content": "<div …>…rendered HTML…</div>", // <body> inner HTML, variables baked;
613
+ // external sections: <div id="identifier"></div>
601
614
  "contentMetadata": {
602
615
  "document": { "root": { "type": "EmailLayout", … }, "block-…": {…} }
603
616
  }
@@ -609,7 +622,7 @@ Authorization: Bearer ${authToken}
609
622
  }
610
623
  ```
611
624
 
612
- **Same shape ahd-fe writes.** The rendered `sections[].content` HTML is what the pagepilot public page-serving layer reads.
625
+ **Same shape ahd-fe writes.** The rendered `sections[].content` HTML is what the pagepilot public page-serving layer reads. After a successful write the editor merges the response back into the record (reported through `onUpdateRecord`), resets the dirty state and undo history, and shows **Changes saved**.
613
626
 
614
627
  **Failure handling.** Any non-2xx response throws inside the editor. Without `onApiError`, the error is logged to `console.error` and the Save button stays visually "dirty" (no state change). Passing `onApiError` lets you surface it to the user:
615
628
 
@@ -627,11 +640,14 @@ Authorization: Bearer ${authToken}
627
640
 
628
641
  When `apiConfig` is set, clicking **Publish** opens a full dialog instead of firing `onPublish` immediately. The dialog mirrors ahd-fe's `PagePublishDialog`:
629
642
 
630
- - **Basic Info** tab: page name, slug, publish date, "All Time Live" toggle, end date (when off).
643
+ - **Basic Info** tab: page name, slug, publish date, "All Time Live" toggle, end date (when off). Scheduling is plan-gated like ahd-fe: below the Pro plan the fields show **✦ Upgrade**, and picking a date after today opens the upgrade prompt (`onUpgrade`, or the built-in upgrade dialog) instead of applying it.
644
+ - **Accessibility check** (Basic Info tab): the active section is linted on open — missing alt text, unlabeled buttons, non-descriptive links, H1 count, skipped heading levels, duplicate landmarks. Findings show in a collapsible warning card; they don't block publishing.
631
645
  - **Menu Links** tab: pick a tenant menu (fetched via `apiClient.listMenus`) and append this page as a new item to that menu's `configuration`.
632
- - **Scripts & Styles** tab: paste a stylesheet snippet that's inlined into the published HTML, and flip per-page injection toggles for the built-in tabs scroll-sync and carousel scripts. Both toggles default on inside `renderToStaticMarkup`; setting them here lets a page opt out.
646
+ - **Scripts & Styles** tab: the stylesheet snippet for responsive styles, plus per-page injection toggles for the tabs, carousel, pagination and animation runtimes (each shown only when the page uses that block). All default on inside `renderToStaticMarkup`; turning one off lets a page opt out.
633
647
  - **Save Draft** and **Publish** buttons at the bottom. Both use the same `upsert-page-item` endpoint above; the CTA differs by the `status` field.
634
648
 
649
+ After a successful publish a **Page is live** dialog shows the live URL (`https://<tenantId>.emtrendz.com/<slug>`) and, when the tenant has its own domain configured (`applications[].ipAddress`), the preview URL on that domain — each with copy and open buttons.
650
+
635
651
  If you'd rather keep the direct one-click publish (fires `onPublish` without a dialog), set `apiConfig` to `undefined` — the direct callback flow still works.
636
652
 
637
653
  ### Templates + Saved + Section Library
@@ -715,19 +731,19 @@ All methods send `Content-Type: application/json` + the bearer token automatical
715
731
  |---|---|
716
732
  | **← Back** | Calls `onBack`. The host typically navigates away. |
717
733
  | **Page title + status pill** | Display-only. Sourced from `recordTitle` / `recordStatus` (or `record.title / record.name / record.status`). |
718
- | **Section dropdown** | Only appears when `record.sections.length > 1`. Lets the user pick / edit / delete sections. Switching a section flushes the current canvas edits into the active section, then loads the target section's document onto the canvas. |
719
- | **Zoom controls** (− / % / +) | Zoom out, current zoom level (click to reset to 100%), zoom in. Range is 25%–100%; buttons disable at the endpoints. Users can also hold **Ctrl / Cmd** and scroll on the canvas to zoom cursor-anchored. Hidden together with Undo/Redo via `topbar={{ undo: false }}` (they share the toggle since they sit in the same group). |
720
- | **Undo / Redo** | Hooked to the editor's internal history stack. Buttons disable when there's nothing to undo/redo. A settle-window guard on mount prevents block-level `useEffect`s (auto-seed, positioning re-measure, etc.) from preloading spurious entries — Undo starts disabled on every fresh load until the user makes a real edit. |
734
+ | **Section dropdown** | Only appears when `record.sections.length > 1`. Lets the user pick / edit / delete / reorder sections. Switching a section flushes the current canvas edits into the active section, then loads the target section's document with a **fresh undo history** — switching is navigation, so it never marks the editor dirty and Undo can't walk back into another section's document. Adding or deleting a section is one undoable step. |
735
+ | **Zoom controls** (− / % / +) | Page records only, and hidden below the `lg` breakpoint. Zoom out, current zoom level (click to reset to 100%), zoom in. Range is 25%–100%; clicking past either end shows a toast instead of doing nothing. Users can also hold **Ctrl / Cmd** and scroll on the canvas to zoom cursor-anchored. Hidden together with Undo/Redo via `topbar={{ undo: false }}` (they share the toggle since they sit in the same group). |
736
+ | **Undo / Redo** | Hooked to the editor's internal history stack, plus the global shortcuts **Ctrl/Cmd+Z**, **Ctrl/Cmd+Y** and **Ctrl/Cmd+Shift+Z** (inputs and sidebar rich-text editors keep their native undo). **Ctrl/Cmd+B** toggles bold on a selected Heading. Buttons disable when there's nothing to undo/redo and while a save is running. A settle-window guard on load prevents block-level `useEffect`s (auto-seed, positioning re-measure, etc.) from preloading spurious entries — Undo starts disabled on every fresh load until the user makes a real edit. Every successful save starts a fresh history. |
721
737
  | **Deselect Block** ⊟ | Only appears when a block is selected on the canvas. Clears `selectedBlockId` so the block's TuneMenu / handles collapse and the Inspect panel unfocuses. Same behavior as ahd-fe's `TabUnselectedOutlined` button. Hidden entirely via `topbar={{ unselect: false }}`. |
722
- | **Save Changes** | **Dirty-tracked.** Disabled with tooltip "No unsaved changes" until the user makes their first edit; enables on every subsequent edit; disables again after `onSaveChanges` resolves (unless the handler returns `false`). Builds the payload (renders document → HTML, flushes sections) and calls `onSaveChanges`. When `apiConfig` is set, the editor **first** persists via `POST /upsert-page-item`, then fires `onSaveChanges` — errors surface via `onApiError`. |
738
+ | **Save Changes** | **Dirty-tracked.** Disabled with tooltip "No unsaved changes" until there is something to save — a canvas edit, an edit flushed from another section, a section added / deleted / renamed / reordered, or a sidebar-edited page field (SEO meta, head, body bottom, …); disables again after the save. Saves with the record's **current status** (a live page stays live, as in ahd-fe). Builds the payload (see *Save / Publish payload generation*) and calls `onSaveChanges`. When `apiConfig` is set, the editor **first** persists via `POST /upsert-page-item`, then fires `onSaveChanges` and merges the server response into the record — errors surface via `onApiError`. The browser's "Leave site?" prompt is skipped while **Changes saved** is showing. |
723
739
  | **Auto Save** | **Opt-in** — hidden unless `topbar={{ autoSave: true }}`. Bordered label + toggle switch rendered immediately left of Save Changes. While on, the editor re-runs the same handler `Save Changes` uses on a fixed interval (`autoSaveIntervalMs`, default 60s), gated by the same dirty flag — a clean editor never fires. The switch is uncontrolled by default and its checked state is persisted to `localStorage` under `pagepilot.editor.autoSave.v1`; pass `autoSaveEnabled` + `onAutoSaveChange` to control it from the host. Every flip fires `onAutoSaveChange` so hosts can mirror the flag to their own settings. |
724
- | **Screen size** (Desktop / Tablet / Mobile) | Three-way icon strip that constrains the canvas preview width and keeps the sidebar's per-device tabs in lock-step — switching here also switches which per-device slice the Inspect panel is editing. Hidden via `topbar={{ screenSize: false }}`. |
740
+ | **Screen size** (Desktop / Tablet / Mobile) | Three-way icon strip that constrains the canvas preview width and keeps the sidebar's per-device tabs in lock-step — switching here also switches which per-device slice the Inspect panel is editing, and scrolls the selected block back into view. The initial device comes from `record.device`. Hidden via `topbar={{ screenSize: false }}`. |
725
741
  | **Theme toggle** ☀/🌙 | Sun/moon icon flips between the built-in light and dark themes. The choice is persisted in `localStorage` under `pagepilot.editor.mode.v1`, so a page reload keeps the user's preference — even if `props.mode` changes. Hidden automatically when the host passes a custom `theme` prop (no `mode` to flip). |
726
742
  | **3-dot menu** ⋮ | Off by default — enable via `topbar.moreMenu`. Contains **+ Add Section** and **Show / Hide Minimap** (the minimap is a click-to-jump / drag-to-scroll canvas overview that docks to the bottom-right corner). |
727
743
  | **Fullscreen** ⤢ | Toggles the editor's container via the browser Fullscreen API. Icon swaps to "exit fullscreen" while active; pressing `Esc` exits. |
728
- | **Preview** ▶ | Opens the in-page Preview dialog with desktop/tablet/mobile size toggles. The iframe renders the **same HTML** that's sent to `onSaveChanges` / `onPublish`. If `onTogglePreview` is supplied, that callback fires instead. |
729
- | **Publish** | Calls `onPublish`. |
730
- | **Publish ▾** | Calls `onPublishMenu(anchorEl, payload)` so the host can open a custom dialog/popover anchored to the button. |
744
+ | **Preview** ▶ | Syncs the current section, then opens the full-screen page preview with desktop/tablet/mobile size toggles (see *Preview*). If `onTogglePreview` is supplied, that callback fires instead. Disabled while saving. |
745
+ | **Publish** | With `apiConfig`: opens the Publish dialog. Without it: calls `onPublish`. Disabled while saving. |
746
+ | **Publish ▾** | Calls `onPublishMenu(anchorEl, payload)` when provided. Otherwise opens the built-in menu: **Publish**, **Live URL** (live pages, tenant known) and **Save as Draft** (saves with `status: "draft"`). |
731
747
 
732
748
  ### Block TuneMenu
733
749
 
@@ -808,22 +824,20 @@ if the standalone integration model doesn't fit.
808
824
 
809
825
  ### Preview
810
826
 
811
- - **Default behavior** (no `onTogglePreview`): the editor renders every section through `renderToStaticMarkup`, concatenates the fragments inside a minimal HTML shell (with viewport meta + base font + canvas color from `EmailLayout.canvasColor`), and shows it in an in-page MUI dialog with desktop / tablet / mobile size toggles. The iframe uses `srcDoc` (inline HTML) so no network round-trip and no blob-URL flake. The "Open in new tab" header icon is hidden in this mode (nothing to link to — the HTML is inline). A host that supplies a real `previewUrl` (via internal preview server) gets the icon.
812
- - **Custom UI**: pass `onTogglePreview={(html, doc) => myDialog.open(html)}` to skip the built-in dialog and render your own.
827
+ - **Default behavior** (no `onTogglePreview`): the editor first syncs the canvas into its section, then renders the in-memory page the way ahd-fe's page preview does — internal sections through `renderToStaticMarkup`, external sections as their empty `<div id=identifier>` anchors — inside the `pagePilotStyles.css` + `.ahd-page-root` wrapper published pages get. It shows in a full-screen dialog with desktop / tablet / mobile size toggles. When the page is live and the tenant is known, the header adds **Open live URL**; when the tenant has its own domain, **Open on your domain** opens the page there in preview mode.
828
+ - **Custom UI**: pass `onTogglePreview={(html, doc) => myDialog.open(html)}` to skip the built-in dialog and render your own. `html` is the same HTML handed to `onSaveChanges`.
813
829
 
814
830
  ### Save / Publish payload generation
815
831
 
816
- When the user clicks **Save Changes** or **Publish**, the editor does the following before invoking the callback:
817
-
818
- 1. Reads the current canvas document from the internal store.
819
- 2. If the record has `sections`, flushes the canvas document into `sections[activeIndex].contentMetadata.document` so the active section is up-to-date.
820
- 3. Renders every section's document via `renderToStaticMarkup({ rootBlockId: "root", injectElementIds: true, minifyCss: true, includePageCSS: true, lang, skipLink, accessibilityTools })`.
821
- 4. Per-section HTML is written to `section.content` and per-section documents to `section.contentMetadata.document`.
822
- 5. All section fragments are concatenated inside a single HTML document with viewport meta, base font, and canvas color from `EmailLayout`.
823
- 6. **Multi-section payload**: `{ record, html }` with the record's redundant `contentMetadata` / empty `behaviour` / empty `steps` stripped, and the outer `document` key omitted.
824
- **Single-doc payload**: `{ record, document, html }` where `record.contentMetadata` carries `document` + `html`.
832
+ When the user saves or publishes, the editor does the following before invoking the callback. The pipeline (`src/editor/savePipeline.ts`) is a port of ahd-fe's `useSaveHandler`:
825
833
 
826
- This guarantees **Preview ≡ Save Changes ≡ Publish** — all three see the exact same rendered output.
834
+ 1. Reads the current canvas document from the internal store and prunes orphan blocks.
835
+ 2. Keeps an **editable** copy with its template variables (`withPersistedFormFields`) and renders the published HTML from a **baked** copy with every `{{token}}` substituted (`bakeTemplateValues`). Non-active sections bake their own variables.
836
+ 3. Renders each section via `renderToStaticMarkup({ rootBlockId: "root", injectElementIds: true, minifyCss: true, includePageCSS: true, injectFontAssets: true, bodyBottomHtml: record.bodyBottom, lang, skipLink, accessibilityTools })` — `lang` / skip-link / accessibility tools come from the active section's root (falling back to `record.lang`). Page records keep only the `<body>` inner HTML.
837
+ 4. External (client-side) sections save as an empty `<div id="identifier"></div>` anchor.
838
+ 5. Every section gets a `sectionType` and an `identifier`. An AHD integration snippet already on the first internal section (placed by the tour / tooltip publish flow) is preserved.
839
+ 6. **Multi-section payload**: `{ record, html, status, sections }` with the record's redundant `contentMetadata` / empty `behaviour` / empty `steps` stripped, and the outer `document` key omitted. `html` wraps all section fragments in one HTML document with viewport meta, base font, and canvas color from `EmailLayout`.
840
+ **Single-doc payload**: `{ record, document, html, status, sections }` where `record.contentMetadata` carries `document` + `html`, and `sections` holds the one section sent to the API.
827
841
 
828
842
  ### Themes
829
843
 
@@ -2,16 +2,19 @@ import { PagePilotEditorProps } from './editor/types';
2
2
  /**
3
3
  * Standalone page-type visual editor.
4
4
  *
5
- * - **Undo / Redo**: wired directly to the editor's history store; buttons
6
- * disable when their stack is empty.
7
- * - **Save Changes**: renders the current document (or every section, for
8
- * multi-section pages) to static HTML via
9
- * `@usewaypoint/email-builder.renderToStaticMarkup` and hands the host
10
- * `{ record, document, html }` through the `onSaveChanges` callback.
5
+ * - **Undo / Redo**: wired directly to the editor's history store (toolbar
6
+ * buttons plus Ctrl/Cmd+Z, Ctrl/Cmd+Y, Ctrl/Cmd+Shift+Z); buttons disable
7
+ * when their stack is empty or a save is running.
8
+ * - **Save Changes / autosave**: renders every section through the ahd-fe
9
+ * save pipeline (`editor/savePipeline.ts`) and saves with the record's
10
+ * current status; the host gets `{ record, document?, html, status,
11
+ * sections, response? }` through `onSaveChanges`.
11
12
  * - **Fullscreen**: requests the editor's container via the Fullscreen API.
12
- * - **Preview**: renders the same HTML into an in-page iframe (or calls
13
- * `onTogglePreview` if the host provides one).
14
- * - **Publish**: same payload as Save Changes, routed to `onPublish`.
13
+ * - **Preview**: renders the in-memory page (current section synced) in a
14
+ * full-screen dialog, or calls `onTogglePreview` if the host provides one.
15
+ * - **Publish**: with `apiConfig`, opens the publish dialog (schedule, menu
16
+ * links, scripts, accessibility check) and shows the "Page is live" dialog
17
+ * afterwards; without it, routes the payload to `onPublish`.
15
18
  */
16
19
  export declare function PagePilotEditor(props: PagePilotEditorProps): import("react/jsx-runtime").JSX.Element;
17
20
  export { setDocument, resetDocument, } from './editor-sample/documents/editor/EditorContext';
@@ -12,6 +12,7 @@ interface ProviderProps {
12
12
  children: ReactNode;
13
13
  }
14
14
  export declare function PagepilotApiClientProvider({ config, globalTemplatesBaseUrl, children, }: ProviderProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function getActivePagepilotApiClient(): PagepilotApiClient | null;
15
16
  export declare function usePagepilotApiClient(): PagepilotApiClient | null;
16
17
  export declare function useGlobalTemplatesBaseUrl(): string;
17
18
  export {};
@@ -38,6 +38,13 @@ export declare class PagepilotApiClient {
38
38
  constructor(cfg: PagepilotApiConfig);
39
39
  private headers;
40
40
  private buildUrl;
41
+ /**
42
+ * `fetch` an absolute URL with this client's bearer token — for ahd-fe
43
+ * services that live on another origin but share the tenant auth (the
44
+ * form-builder API, the FabAI generate endpoint). Backs the
45
+ * `src/modules/shared/axios/authAxios` host stub.
46
+ */
47
+ authedFetch(url: string, init?: RequestInit): Promise<Response>;
41
48
  private request;
42
49
  createPage(data: Record<string, unknown>): Promise<any>;
43
50
  updatePage(id: string, data: Record<string, unknown>): Promise<any>;
@@ -0,0 +1 @@
1
+ export declare const AI_CHATBOT_ICON_URL = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik03LjIyMzYxIDIuMzUyNjFDNy4yOTAyOSAyLjM1MjM1IDcuMzU2OTYgMi4zNTIwOCA3LjQyNTY1IDIuMzUxODJDNy42NDkyMSAyLjM1MTA0IDcuODcyNzcgMi4zNTA3NiA4LjA5NjM0IDIuMzUwNDlDOC4yNTY1OSAyLjM1MDA1IDguNDE2ODUgMi4zNDk1OCA4LjU3NzExIDIuMzQ5MDhDOS4xMDM2NCAyLjM0NzYgOS42MzAxNyAyLjM0Njg2IDEwLjE1NjcgMi4zNDYxNkMxMC4zMzgyIDIuMzQ1ODcgMTAuNTE5NiAyLjM0NTU4IDEwLjcwMTEgMi4zNDUyOEMxMS40NTYxIDIuMzQ0MDkgMTIuMjExMiAyLjM0MzA1IDEyLjk2NjMgMi4zNDI1NEMxMy4xNjIgMi4zNDI0IDEzLjM1NzggMi4zNDIyNyAxMy41NTM2IDIuMzQyMTNDMTMuNjI2NiAyLjM0MjA4IDEzLjYyNjYgMi4zNDIwOCAxMy43MDExIDIuMzQyMDJDMTQuNDg4MiAyLjM0MTQ0IDE1LjI3NTQgMi4zMzk2NSAxNi4wNjI2IDIuMzM3MzRDMTYuODcyIDIuMzM1IDE3LjY4MTQgMi4zMzM3NSAxOC40OTA5IDIuMzMzNUMxOC45NDQ4IDIuMzMzMzQgMTkuMzk4OCAyLjMzMjcxIDE5Ljg1MjcgMi4zMzA5MkMyMC4yODAyIDIuMzI5MjcgMjAuNzA3NyAyLjMyODk3IDIxLjEzNTIgMi4zMjk3QzIxLjI5MTUgMi4zMjk3MyAyMS40NDc4IDIuMzI5MjkgMjEuNjA0MiAyLjMyODMyQzIzLjI2NjIgMi4zMTg1MyAyNC42MTE1IDIuNjgzOTkgMjUuODQzNiAzLjg2NjU3QzI3LjI1MzEgNS4zMzM2OSAyNy4zMjkyIDcuMDk3ODcgMjcuMzI1NiA5LjAxOTg3QzI3LjMyNTcgOS4xOTg2NCAyNy4zMjU4IDkuMzc3NDIgMjcuMzI2IDkuNTU2MkMyNy4zMjYyIDkuOTI5MTcgMjcuMzI1OSAxMC4zMDIxIDI3LjMyNTMgMTAuNjc1MUMyNy4zMjQ1IDExLjEwNTYgMjcuMzI0NyAxMS41MzYxIDI3LjMyNTUgMTEuOTY2NkMyNy4zMjYyIDEyLjM4MjYgMjcuMzI2MiAxMi43OTg1IDI3LjMyNTggMTMuMjE0NUMyNy4zMjU3IDEzLjM5MDkgMjcuMzI1OCAxMy41NjcyIDI3LjMyNjEgMTMuNzQzNkMyNy4zMjY1IDEzLjk4OTQgMjcuMzI1OSAxNC4yMzUzIDI3LjMyNTEgMTQuNDgxMUMyNy4zMjU0IDE0LjU1MzggMjcuMzI1NyAxNC42MjY2IDI3LjMyNiAxNC43MDE1QzI3LjMyNTYgMTQuNzY4NiAyNy4zMjUyIDE0LjgzNTcgMjcuMzI0OCAxNC45MDQ4QzI3LjMyNDcgMTQuOTkxNyAyNy4zMjQ3IDE0Ljk5MTcgMjcuMzI0NiAxNS4wODA1QzI3LjI5NjggMTUuMzQxNiAyNy4yMjQyIDE1LjU0MDQgMjcuMDQxMyAxNS43Mjk4QzI2Ljc4MDUgMTUuODY3NSAyNi41NDA3IDE1LjgzODIgMjYuMjYyMyAxNS43NTY5QzI2LjE5NjcgMTUuNzMxOSAyNi4xMzExIDE1LjcwNjkgMjYuMDYzNSAxNS42ODExQzI1LjY3MjEgMTUuNTQxNCAyNS4yOTkzIDE1LjQ3ODIgMjQuODg2NSAxNS40Mzc4QzI0LjYyOTkgMTUuMzc1MSAyNC41NTkgMTUuMzIxNyAyNC40MDQzIDE1LjEwNTlDMjQuMzYxNCAxNC44Njc5IDI0LjM2NTggMTQuNjMyMSAyNC4zNjc5IDE0LjM5MDhDMjQuMzY3MSAxNC4yODE4IDI0LjM2NzEgMTQuMjgxOCAyNC4zNjYzIDE0LjE3MDZDMjQuMzY1IDEzLjkyOTkgMjQuMzY1NiAxMy42ODkzIDI0LjM2NjEgMTMuNDQ4NkMyNC4zNjU0IDEzLjI4MTEgMjQuMzY0NSAxMy4xMTM1IDI0LjM2MzYgMTIuOTQ1OUMyNC4zNjEzIDEyLjUwNDEgMjQuMzYwNSAxMi4wNjIzIDI0LjM2MDIgMTEuNjIwNEMyNC4zNTk2IDEwLjkxNSAyNC4zNTcxIDEwLjIwOTUgMjQuMzUzNyA5LjUwNDFDMjQuMzUyOCA5LjI1ODM1IDI0LjM1MjkgOS4wMTI2MiAyNC4zNTMgOC43NjY4N0MyNC4zNTI2IDguNjE0NjYgMjQuMzUyMSA4LjQ2MjQ1IDI0LjM1MTUgOC4zMTAyNUMyNC4zNTE4IDguMjQyNjYgMjQuMzUyMSA4LjE3NTA4IDI0LjM1MjQgOC4xMDU0NEMyNC4zNDc2IDcuMjkzNDcgMjQuMjQ4MSA2LjUzMjc1IDIzLjY3ODYgNS45MjA0MkMyMi44NTY0IDUuMTU0MDkgMjEuNzY3NiA1LjI0NDkgMjAuNzE4IDUuMjQ3MjVDMjAuNTc0IDUuMjQ3MDYgMjAuNDI5OSA1LjI0NjgxIDIwLjI4NTkgNS4yNDY1QzE5Ljg5NjMgNS4yNDU4NiAxOS41MDY2IDUuMjQ2MTEgMTkuMTE3IDUuMjQ2NTZDMTguNzA4NCA1LjI0NjkyIDE4LjI5OTggNS4yNDY1OCAxNy44OTEyIDUuMjQ2MzZDMTcuMjA1MSA1LjI0NjEgMTYuNTE5MSA1LjI0NjQ0IDE1LjgzMzEgNS4yNDcxMkMxNS4wNDA5IDUuMjQ3ODkgMTQuMjQ4OCA1LjI0NzY0IDEzLjQ1NjcgNS4yNDY4NkMxMi43NzU1IDUuMjQ2MjEgMTIuMDk0MyA1LjI0NjEyIDExLjQxMzEgNS4yNDY0OUMxMS4wMDY3IDUuMjQ2NzIgMTAuNjAwMyA1LjI0Njc1IDEwLjE5NCA1LjI0NjI4QzkuODExODUgNS4yNDU4NyA5LjQyOTczIDUuMjQ2MTUgOS4wNDc2MiA1LjI0Njk3QzguOTA3NzMgNS4yNDcxNiA4Ljc2NzgzIDUuMjQ3MSA4LjYyNzk0IDUuMjQ2NzlDNy4xNDA5OSA1LjIyMjcxIDcuMTQwOTkgNS4yMjI3MSA1Ljg3Mzk1IDUuOTIwNDJDNS4wOTk4MyA2Ljc1Mjc0IDUuMTk4MzggNy44ODM4MSA1LjIwMDc5IDguOTQ1NzVDNS4yMDA1OSA5LjA4ODI4IDUuMjAwMzQgOS4yMzA4MSA1LjIwMDAzIDkuMzczMzRDNS4xOTkzOSA5Ljc1ODYxIDUuMTk5NjQgMTAuMTQzOSA1LjIwMDA5IDEwLjUyOTFDNS4yMDA0NSAxMC45MzMzIDUuMjAwMTEgMTEuMzM3NiA1LjE5OTg5IDExLjc0MThDNS4xOTk2MyAxMi40MjA0IDUuMTk5OTcgMTMuMDk5MSA1LjIwMDY1IDEzLjc3NzdDNS4yMDE0MiAxNC41NjEgNS4yMDExNyAxNS4zNDQ0IDUuMjAwMzkgMTYuMTI3N0M1LjE5OTc1IDE2LjgwMTYgNS4xOTk2NiAxNy40NzU1IDUuMjAwMDMgMTguMTQ5NUM1LjIwMDI1IDE4LjU1MTQgNS4yMDAyOCAxOC45NTMzIDUuMTk5ODEgMTkuMzU1MkM1LjE5OTQgMTkuNzMzMSA1LjE5OTY5IDIwLjExMSA1LjIwMDUgMjAuNDg5QzUuMjAwNjkgMjAuNjI3MiA1LjIwMDY0IDIwLjc2NTUgNS4yMDAzMiAyMC45MDM4QzUuMTcxNTkgMjIuNDI1NiA1LjE3MTU5IDIyLjQyNTYgNS44NzM5NSAyMy43MjUxQzYuNTUwNDQgMjQuMzU1NiA3LjM4OTM5IDI0LjQwMTUgOC4yNzQ4MSAyNC4zOTY5QzguMzU3ODkgMjQuMzk3IDguNDQwOTggMjQuMzk3MiA4LjUyNjU4IDI0LjM5NzNDOC43MDU3NyAyNC4zOTc2IDguODg0OTYgMjQuMzk3NSA5LjA2NDE1IDI0LjM5NzJDOS4zNDc3MSAyNC4zOTY4IDkuNjMxMjYgMjQuMzk3NCA5LjkxNDgxIDI0LjM5ODRDMTAuNzIwNiAyNC40MDExIDExLjUyNjQgMjQuNDAyNCAxMi4zMzIxIDI0LjQwMTZDMTIuNzc4MyAyNC40MDExIDEzLjIyNDUgMjQuNDAxOSAxMy42NzA3IDI0LjQwNDFDMTMuOTA2NCAyNC40MDUyIDE0LjE0MiAyNC40MDU1IDE0LjM3NzYgMjQuNDA0NUMxNC42Mzk5IDI0LjQwMzUgMTQuOTAyMiAyNC40MDQ3IDE1LjE2NDUgMjQuNDA2M0MxNS4yNDIyIDI0LjQwNTUgMTUuMzE5OSAyNC40MDQ2IDE1LjQgMjQuNDAzOEMxNS45MjY2IDI0LjQxMDIgMTUuOTI2NiAyNC40MTAyIDE2LjIwMTMgMjQuNjE5NEMxNi4zMjkgMjQuNzk4MSAxNi40MzAxIDI0Ljk2OTEgMTYuNTI0IDI1LjE2NzVDMTYuNzMwOCAyNS41Njg2IDE3IDI1Ljg2MTkgMTcuMzE5NiAyNi4xNzc3QzE3LjQ4ODUgMjYuMzg5OSAxNy41MjU2IDI2LjUxOCAxNy41MzcyIDI2Ljc4NjlDMTcuMzc5OCAyNy4xODQyIDE3LjM3OTggMjcuMTg0MiAxNy4xODMzIDI3LjI4MjVDMTcuMDQ2MSAyNy4yODk5IDE2LjkwODYgMjcuMjkyNyAxNi43NzEyIDI3LjI5MzRDMTYuNjgzNCAyNy4yOTQgMTYuNTk1NiAyNy4yOTQ2IDE2LjUwNTEgMjcuMjk1MkMxNi40MDczIDI3LjI5NTUgMTYuMzA5NCAyNy4yOTU4IDE2LjIxMTUgMjcuMjk2MUMxNi4xMDg4IDI3LjI5NjcgMTYuMDA2MSAyNy4yOTczIDE1LjkwMzQgMjcuMjk3OUMxNS41NjUyIDI3LjI5OTggMTUuMjI3IDI3LjMwMDggMTQuODg4OCAyNy4zMDE4QzE0Ljc3MjEgMjcuMzAyMiAxNC42NTU1IDI3LjMwMjYgMTQuNTM4OCAyNy4zMDNDMTQuMDUyNiAyNy4zMDQ1IDEzLjU2NjUgMjcuMzA1OCAxMy4wODAzIDI3LjMwNjZDMTIuMzg1NyAyNy4zMDc4IDExLjY5MTEgMjcuMzEwMSAxMC45OTY0IDI3LjMxNDJDMTAuNTA3MSAyNy4zMTY5IDEwLjAxNzkgMjcuMzE4MyA5LjUyODU1IDI3LjMxODdDOS4yMzY5MyAyNy4zMTg5IDguOTQ1MzQgMjcuMzE5OCA4LjY1MzcyIDI3LjMyMjFDNi42NzI0NiAyNy4zMzcgNS4xNTEyNiAyNy4xNTIxIDMuNjQ4MzcgMjUuNzE4OUMyLjc4MTEgMjQuODA3NiAyLjMwNTg4IDIzLjYyNTMgMi4zMDYxNCAyMi4zNzU0QzIuMzA1ODggMjIuMzA4OCAyLjMwNTYyIDIyLjI0MjEgMi4zMDUzNSAyMi4xNzM0QzIuMzA0NTcgMjEuOTQ5OCAyLjMwNDMgMjEuNzI2MyAyLjMwNDAzIDIxLjUwMjdDMi4zMDM1OCAyMS4zNDI0IDIuMzAzMTEgMjEuMTgyMiAyLjMwMjYyIDIxLjAyMTlDMi4zMDExMyAyMC40OTU0IDIuMzAwMzkgMTkuOTY4OSAyLjI5OTY5IDE5LjQ0MjNDMi4yOTk0IDE5LjI2MDkgMi4yOTkxMSAxOS4wNzk0IDIuMjk4ODEgMTguODk4QzIuMjk3NjIgMTguMTQyOSAyLjI5NjU4IDE3LjM4NzggMi4yOTYwNyAxNi42MzI4QzIuMjk1OTMgMTYuNDM3IDIuMjk1OCAxNi4yNDEyIDIuMjk1NjYgMTYuMDQ1NEMyLjI5NTYzIDE1Ljk5NjggMi4yOTU1OSAxNS45NDgxIDIuMjk1NTYgMTUuODk4QzIuMjk0OTcgMTUuMTEwOCAyLjI5MzE4IDE0LjMyMzYgMi4yOTA4OCAxMy41MzY1QzIuMjg4NTMgMTIuNzI3IDIuMjg3MjggMTEuOTE3NiAyLjI4NzAzIDExLjEwODJDMi4yODY4NyAxMC42NTQyIDIuMjg2MjQgMTAuMjAwMyAyLjI4NDQ1IDkuNzQ2MzJDMi4yODI4IDkuMzE4ODIgMi4yODI1MSA4Ljg5MTM1IDIuMjgzMjMgOC40NjM4NEMyLjI4MzI3IDguMzA3NTIgMi4yODI4MiA4LjE1MTE5IDIuMjgxODUgNy45OTQ4N0MyLjI3NjkgNy4xNTQ2MyAyLjI5NjAxIDYuNDEzOTcgMi41OTk3MyA1LjYxOTU0QzIuNjE5MiA1LjU2ODQgMi42Mzg2NyA1LjUxNzI2IDIuNjU4NzIgNS40NjQ1N0MzLjE4NTQ5IDQuMTk5OTMgNC4xNTI3NSAzLjMxMTczIDUuMzYwNjkgMi43MTY5OUM1Ljk4OTYxIDIuNDY1NTcgNi41NTA2NSAyLjM1MjQ2IDcuMjIzNjEgMi4zNTI2MVoiIGZpbGw9IndoaXRlIi8+DQo8cGF0aCBkPSJNMjUuMDAxNiAxOC4xOTUzQzI1LjE4MyAxOC4yMjE5IDI1LjE4MyAxOC4yMjE5IDI1LjI4NSAxOC4zMjY0QzI1LjQ0MTMgMTguNTc5NCAyNS41MzkyIDE4Ljg0NzEgMjUuNjQ0IDE5LjEyNDhDMjUuNjkyMyAxOS4yNDk0IDI1Ljc0MDYgMTkuMzczOSAyNS43ODkgMTkuNDk4NUMyNS44NjQyIDE5LjY5MzQgMjUuOTM5IDE5Ljg4ODQgMjYuMDEzMSAyMC4wODM3QzI2LjQ4NTggMjEuMzI2NyAyNi45NjMzIDIyLjI3NDcgMjguMjM1IDIyLjg1NzhDMjguNDg5OSAyMi45Njk1IDI4Ljc0NzYgMjMuMDczNyAyOS4wMDU5IDIzLjE3NzRDMjkuMjU3NSAyMy4yNzkxIDI5LjUwOSAyMy4zODA4IDI5Ljc2MDUgMjMuNDgyNkMyOS45MzQzIDIzLjU1MyAzMC4xMDg0IDIzLjYyMjcgMzAuMjgyNiAyMy42OTJDMzAuMzYyNyAyMy43MjQyIDMwLjQ0MjcgMjMuNzU2MyAzMC41MjUyIDIzLjc4OTRDMzAuNTk3MyAyMy44MTgxIDMwLjY2OTQgMjMuODQ2OSAzMC43NDM3IDIzLjg3NjVDMzAuOTE3MyAyMy45NTYyIDMwLjkxNzMgMjMuOTU2MiAzMS4wNTg5IDI0LjA5NzhDMzEuMDY3NyAyNC4yODM2IDMxLjA2NzcgMjQuMjgzNiAzMS4wNTg5IDI0LjQ1MTdDMzAuNDI2OCAyNC43ODc0IDI5Ljc2ODggMjUuMDM5MSAyOS4xMDEgMjUuMjkzOEMyNy44OTkyIDI1Ljc1NzUgMjYuOTQzMiAyNi4yNzMzIDI2LjM5ODkgMjcuNDk3MkMyNi4yMTc2IDI3LjkxNzggMjYuMDQ3NiAyOC4zNDI5IDI1Ljg3NzcgMjguNzY4MUMyNS44MjA0IDI4LjkxMTQgMjUuNzYyOSAyOS4wNTQ1IDI1LjcwNTMgMjkuMTk3NkMyNS42NSAyOS4zMzUyIDI1LjU5NTIgMjkuNDczIDI1LjU0MSAyOS42MTFDMjUuNTE1OSAyOS42NzM3IDI1LjQ5MDcgMjkuNzM2NSAyNS40NjQ4IDI5LjgwMTFDMjUuNDQyOCAyOS44NTY3IDI1LjQyMDggMjkuOTEyMiAyNS4zOTgyIDI5Ljk2OTVDMjUuMzE3NiAzMC4xMjkxIDI1LjI2MDMgMzAuMjI1OSAyNS4xMTIyIDMwLjMyNzZDMjQuOTM0NiAzMC4zMzE1IDI0LjkzNDYgMzAuMzMxNSAyNC43NTgyIDMwLjI1NjhDMjQuNjQ3OSAzMC4wNzgzIDI0LjY0NzkgMzAuMDc4MyAyNC41NTUyIDI5Ljg0MDZDMjQuNTAzMiAyOS43MTA2IDI0LjUwMzIgMjkuNzEwNiAyNC40NTAyIDI5LjU3OEMyNC40MzI2IDI5LjUzMiAyNC40MTQ5IDI5LjQ4NiAyNC4zOTY4IDI5LjQzODZDMjQuMzQyMSAyOS4yOTYyIDI0LjI4NTkgMjkuMTU0NiAyNC4yMjkyIDI5LjAxM0MyNC4xNTQ5IDI4LjgyNzQgMjQuMDgxMSAyOC42NDE1IDI0LjAwOCAyOC40NTUzQzIzLjQ1ODkgMjcuMDY0NCAyMi45MTAxIDI2LjE0NjcgMjEuNTAxNyAyNS41MTM2QzIxLjI5NTQgMjUuNDI5NCAyMS4wODc1IDI1LjM0OTQgMjAuODc5MiAyNS4yNzAzQzIwLjgyNTEgMjUuMjQ5NiAyMC43NzEgMjUuMjI5IDIwLjcxNTMgMjUuMjA3N0MyMC40OTA5IDI1LjEyMjQgMjAuMjY2NiAyNS4wMzczIDIwLjA0MTIgMjQuOTU0N0MxOS44NzQ1IDI0Ljg5MzMgMTkuNzA4NyAyNC44Mjk4IDE5LjU0MyAyNC43NjU5QzE5LjQ2NjIgMjQuNzM4NiAxOS40NjYyIDI0LjczODYgMTkuMzg3OSAyNC43MTA5QzE5LjI0NTkgMjQuNjU1IDE5LjI0NTkgMjQuNjU1IDE5LjAyMzkgMjQuNTIyNUMxOC45NTYxIDI0LjI5NDkgMTguOTU2MSAyNC4yOTQ5IDE4Ljk1MzEgMjQuMDk3OEMxOS4yMDE0IDIzLjg4NTEgMTkuNDc5OCAyMy43NzY0IDE5Ljc4MTEgMjMuNjYwM0MxOS44NjA1IDIzLjYyOSAxOS44NjA1IDIzLjYyOSAxOS45NDE0IDIzLjU5NzFDMjAuMTEwMyAyMy41MzA1IDIwLjI3OTUgMjMuNDY0NSAyMC40NDg2IDIzLjM5ODdDMjIuMzkxMiAyMi42NTg0IDIyLjM5MTIgMjIuNjU4NCAyMy42MjU4IDIxLjAzOUMyMy44MDg4IDIwLjYxIDIzLjk3NTkgMjAuMTc0NyAyNC4xNDMyIDE5LjczOTVDMjQuMjE4OSAxOS41NDQxIDI0LjI5NDkgMTkuMzQ4OCAyNC4zNzEyIDE5LjE1MzZDMjQuNDE4NCAxOS4wMzMgMjQuNDY1MSAxOC45MTIyIDI0LjUxMTQgMTguNzkxM0MyNC41NDMgMTguNzEgMjQuNTQzIDE4LjcxIDI0LjU3NTIgMTguNjI3MUMyNC41OTM2IDE4LjU3OTUgMjQuNjExOSAxOC41MzE4IDI0LjYzMDcgMTguNDgyN0MyNC43MjE5IDE4LjI5MSAyNC43OTExIDE4LjIyNzcgMjUuMDAxNiAxOC4xOTUzWiIgZmlsbD0id2hpdGUiLz4NCjxwYXRoIGQ9Ik0xMS40MTY0IDguNzE1NEMxMS40OTA5IDguNzE1MjEgMTEuNTY1NCA4LjcxNTAzIDExLjY0MjEgOC43MTQ4NEMxMS43MTk1IDguNzE1MzkgMTEuNzk2OSA4LjcxNTk0IDExLjg3NjYgOC43MTY1QzExLjk1NCA4LjcxNTk2IDEyLjAzMTQgOC43MTU0MSAxMi4xMTExIDguNzE0ODRDMTIuMTg1NiA4LjcxNTAzIDEyLjI2IDguNzE1MjEgMTIuMzM2OCA4LjcxNTRDMTIuNDM4NiA4LjcxNTY0IDEyLjQzODYgOC43MTU2NCAxMi41NDI1IDguNzE1ODhDMTIuNzQwOSA4LjczNTY4IDEyLjg0MjkgOC43NjczMyAxMy4wMDkzIDguODc1NzlDMTMuMDg2OCA5LjAyMzAxIDEzLjA4NjggOS4wMjMwMSAxMy4xNDcxIDkuMjA4MzFDMTMuMTcwNSA5LjI3ODYxIDEzLjE5NCA5LjM0ODkxIDEzLjIxODIgOS40MjEzNUMxMy4yNDI3IDkuNDk4MjkgMTMuMjY3MiA5LjU3NTI0IDEzLjI5MjUgOS42NTQ1MkMxMy4zMTg3IDkuNzMzNjggMTMuMzQ1IDkuODEyODMgMTMuMzcyMSA5Ljg5NDM5QzEzLjQ2MTUgMTAuMTY0NCAxMy41NDkxIDEwLjQzNSAxMy42MzY1IDEwLjcwNTZDMTMuNjY5NSAxMC44MDc2IDEzLjcwMjUgMTAuOTA5NiAxMy43MzU2IDExLjAxMTZDMTMuODIzNSAxMS4yODMyIDEzLjkxMTMgMTEuNTU1IDEzLjk5OTEgMTEuODI2N0MxNC4wNzIxIDEyLjA1MjYgMTQuMTQ1MSAxMi4yNzg1IDE0LjIxODIgMTIuNTA0NEMxNC43OTUzIDE0LjI4ODUgMTUuMzcxMyAxNi4wNzMgMTUuOTM4NCAxNy44NjA0QzE2LjAxNjkgMTguMTA3MyAxNi4wOTcgMTguMzUzNiAxNi4xNzgxIDE4LjU5OTZDMTYuMTk4IDE4LjY2MDcgMTYuMjE4IDE4LjcyMTggMTYuMjM4NSAxOC43ODQ4QzE2LjI3NTkgMTguODk5NiAxNi4zMTM4IDE5LjAxNDEgMTYuMzUyMiAxOS4xMjg2QzE2LjQ0NzYgMTkuNDIzNCAxNi41MTE5IDE5LjY3NjYgMTYuNDc4MiAxOS45OTA0QzE2LjQzMTUgMjAuMDYwNSAxNi4zODQ3IDIwLjEzMDYgMTYuMzM2NiAyMC4yMDI4QzE2LjA5MzQgMjAuMjUxMyAxNS44NDUyIDIwLjIzODkgMTUuNTk3NyAyMC4yMzgyQzE1LjUyOTIgMjAuMjQwMiAxNS40NjA3IDIwLjI0MjIgMTUuMzkwMiAyMC4yNDQzQzE0Ljg5NDMgMjAuMjQ1NyAxNC44OTQzIDIwLjI0NTcgMTQuNzEzMyAyMC4wNzA5QzE0LjY4ODMgMTkuOTk3NiAxNC42NjMzIDE5LjkyNDMgMTQuNjM3NiAxOS44NDg4QzE0LjYxNzQgMTkuNzk0IDE0LjU5NzMgMTkuNzM5MiAxNC41NzY1IDE5LjY4MjdDMTQuNTA1OSAxOS40ODcgMTQuNDQwOCAxOS4yOTAxIDE0LjM3NjUgMTkuMDkyMkMxNC4zNTM4IDE5LjAyNDEgMTQuMzMxMSAxOC45NTYgMTQuMzA3OCAxOC44ODU4QzE0LjE0MiAxOC4zODIxIDE0LjE0MiAxOC4zODIxIDE0LjE0MiAxOC4yMjA2QzEyLjY0NjggMTguMjQzOSAxMS4xNTE3IDE4LjI2NzMgOS42MTExOSAxOC4yOTE0QzkuNDI0MjkgMTguODc1NCA5LjIzNzM5IDE5LjQ1OTUgOS4wNDQ4MyAyMC4wNjEyQzguODQxMjMgMjAuMjY0OCA4LjY3NjMyIDIwLjIyMzQgOC4zOTc4NyAyMC4yMjU2QzguMzMyNDkgMjAuMjI1NCA4LjI2NzEgMjAuMjI1MiA4LjE5OTczIDIwLjIyNDlDOC4xMDIwNiAyMC4yMjY3IDguMTAyMDYgMjAuMjI2NyA4LjAwMjQyIDIwLjIyODRDNy45MDg1OSAyMC4yMjg1IDcuOTA4NTkgMjAuMjI4NSA3LjgxMjg1IDIwLjIyODVDNy43NTU1NSAyMC4yMjg3IDcuNjk4MjUgMjAuMjI5IDcuNjM5MjEgMjAuMjI5MkM3LjQ4NzM3IDIwLjIwMjggNy40ODczNyAyMC4yMDI4IDcuMzU2NDEgMjAuMTMwNEM3LjE5NzQ0IDE5Ljg1NzEgNy4zMTQ3NiAxOS41NDE0IDcuMzkxMjIgMTkuMjUyMkM3LjQ0OTIxIDE5LjA1NDYgNy41MTExMiAxOC44NTg3IDcuNTc0MiAxOC42NjI4QzcuNjA5ODUgMTguNTUwMSA3LjYwOTg1IDE4LjU1MDEgNy42NDYyMiAxOC40MzUxQzcuNzI1NTEgMTguMTg1IDcuODA1NTMgMTcuOTM1MSA3Ljg4NTU4IDE3LjY4NTJDNy45NDE4NyAxNy41MDgzIDcuOTk4MTMgMTcuMzMxNSA4LjA1NDM2IDE3LjE1NDZDOC41MjU3NiAxNS42NzM3IDkuMDA0MTEgMTQuMTk0OSA5LjQ4Mjg3IDEyLjcxNjRDOS41MDAyNSAxMi42NjI3IDkuNTE3NjIgMTIuNjA5IDkuNTM1NTMgMTIuNTUzN0M5Ljg0NTk5IDExLjU5NTIgOS44NDU5OSAxMS41OTUyIDkuOTg0MTQgMTEuMTcyOUMxMC4wMDcyIDExLjEwMjQgMTAuMDA3MiAxMS4xMDI0IDEwLjAzMDcgMTEuMDMwNUMxMC4wNjA5IDEwLjkzODMgMTAuMDkxIDEwLjg0NjEgMTAuMTIxMiAxMC43NTRDMTAuMjE1IDEwLjQ2NjggMTAuMzA2MiAxMC4xNzg5IDEwLjM5NjIgOS44OTA1NUMxMC40MTg1IDkuODIwNDEgMTAuNDQwNyA5Ljc1MDI3IDEwLjQ2MzcgOS42NzgwMUMxMC41MDM5IDkuNTUxMjMgMTAuNTQzNCA5LjQyNDIgMTAuNTgxOCA5LjI5Njg4QzEwLjcxMDMgOC44OTY3OSAxMC43MTAzIDguODk2NzkgMTAuODgwOCA4Ljc5MDEyQzExLjA2NTkgOC43MTkzNCAxMS4yMTg0IDguNzE1ODYgMTEuNDE2NCA4LjcxNTRaTTExLjg3NjYgMTEuMjgyOEMxMS42Mzc1IDExLjg1MDEgMTEuNDQ0IDEyLjQyOTIgMTEuMjU2IDEzLjAxNUMxMS4yMjQ3IDEzLjExMjEgMTEuMTkzNCAxMy4yMDkxIDExLjE2MiAxMy4zMDYyQzExLjA5NjkgMTMuNTA4IDExLjAzMTkgMTMuNzA5OCAxMC45NjcxIDEzLjkxMTZDMTAuODg0IDE0LjE3MDYgMTAuODAwNCAxNC40Mjk0IDEwLjcxNjcgMTQuNjg4MUMxMC42NTIyIDE0Ljg4NzggMTAuNTg3OCAxNS4wODc1IDEwLjUyMzYgMTUuMjg3MkMxMC40OTI4IDE1LjM4MjcgMTAuNDYyIDE1LjQ3ODIgMTAuNDMxMSAxNS41NzM3QzEwLjM4ODIgMTUuNzA2NSAxMC4zNDU2IDE1LjgzOTMgMTAuMzAzIDE1Ljk3MjJDMTAuMjc4NyAxNi4wNDc3IDEwLjI1NDQgMTYuMTIzMiAxMC4yMjk0IDE2LjIwMTFDMTAuMTcxIDE2LjM3MTYgMTAuMTcxIDE2LjM3MTYgMTAuMTc3NSAxNi41MjE1QzExLjI5ODkgMTYuNTIxNSAxMi40MjAzIDE2LjUyMTUgMTMuNTc1NiAxNi41MjE1QzEzLjQ1NzMgMTUuOTg1NyAxMy40NTczIDE1Ljk4NTcgMTMuMzA0NCAxNS40NjU5QzEzLjI3OTYgMTUuMzkwMiAxMy4yNTQ3IDE1LjMxNDYgMTMuMjI5MiAxNS4yMzY3QzEzLjIwMjcgMTUuMTU3IDEzLjE3NjIgMTUuMDc3NCAxMy4xNDg5IDE0Ljk5NTNDMTMuMTA3NiAxNC44Njk2IDEzLjEwNzYgMTQuODY5NiAxMy4wNjU0IDE0Ljc0MTJDMTIuOTkyNSAxNC41MTk3IDEyLjkxOTMgMTQuMjk4MyAxMi44NDYgMTQuMDc2OUMxMi43NDMxIDEzLjc2NTkgMTIuNjQwNiAxMy40NTQ3IDEyLjUzODEgMTMuMTQzNUMxMi40ODM3IDEyLjk3ODQgMTIuNDI5MSAxMi44MTMzIDEyLjM3NDUgMTIuNjQ4MkMxMi4yMjQ5IDEyLjE5NTEgMTIuMDgxNSAxMS43NDA4IDExLjk0NzQgMTEuMjgyOEMxMS45MjQgMTEuMjgyOCAxMS45MDA3IDExLjI4MjggMTEuODc2NiAxMS4yODI4WiIgZmlsbD0id2hpdGUiLz4NCjxwYXRoIGQ9Ik0xOS40ODc1IDguNzg3NjZDMTkuNTUwMiA4Ljc4NzQ4IDE5LjYxMyA4Ljc4NzMgMTkuNjc3NyA4Ljc4NzExQzE5Ljc3NjMgOC43ODc5MyAxOS43NzYzIDguNzg3OTMgMTkuODc2OCA4Ljc4ODc3QzE5Ljk0MjUgOC43ODgyMiAyMC4wMDgyIDguNzg3NjcgMjAuMDc1OSA4Ljc4NzExQzIwLjE3MDEgOC43ODczOCAyMC4xNzAxIDguNzg3MzggMjAuMjY2MiA4Ljc4NzY2QzIwLjMyMzkgOC43ODc4MiAyMC4zODE1IDguNzg3OTggMjAuNDQxIDguNzg4MTVDMjAuNTg0OCA4LjgwNjQ3IDIwLjU4NDggOC44MDY0NyAyMC43MjYzIDguOTQ4MDVDMjAuNzQ0MiA5LjEzODY2IDIwLjc0NDIgOS4xMzg2NiAyMC43NDQzIDkuMzg2MDhDMjAuNzQ0NSA5LjQzMTQ5IDIwLjc0NDggOS40NzY5IDIwLjc0NSA5LjUyMzY4QzIwLjc0NTYgOS42NzY1MiAyMC43NDUxIDkuODI5MzQgMjAuNzQ0NyA5Ljk4MjE3QzIwLjc0NDkgMTAuMDkxNSAyMC43NDUxIDEwLjIwMDggMjAuNzQ1NCAxMC4zMTAxQzIwLjc0NjEgMTAuNjA3NCAyMC43NDU4IDEwLjkwNDggMjAuNzQ1NCAxMS4yMDIxQzIwLjc0NSAxMS41MTI4IDIwLjc0NTMgMTEuODIzNSAyMC43NDU2IDEyLjEzNDJDMjAuNzQ1OCAxMi42NTYgMjAuNzQ1NSAxMy4xNzc4IDIwLjc0NDggMTMuNjk5NkMyMC43NDQgMTQuMzAzNiAyMC43NDQzIDE0LjkwNzUgMjAuNzQ1MSAxNS41MTE0QzIwLjc0NTcgMTYuMDI5MyAyMC43NDU4IDE2LjU0NzEgMjAuNzQ1NCAxNy4wNjQ5QzIwLjc0NTIgMTcuMzc0NSAyMC43NDUyIDE3LjY4NDEgMjAuNzQ1NiAxNy45OTM3QzIwLjc0NjEgMTguMjg0NyAyMC43NDU4IDE4LjU3NTcgMjAuNzQ1IDE4Ljg2NjdDMjAuNzQ0OCAxOC45NzM3IDIwLjc0NDggMTkuMDgwNyAyMC43NDUxIDE5LjE4NzdDMjAuNzQ1NSAxOS4zMzM0IDIwLjc0NSAxOS40NzkgMjAuNzQ0MyAxOS42MjQ3QzIwLjc0NDMgMTkuNzA2MyAyMC43NDQyIDE5Ljc4OCAyMC43NDQyIDE5Ljg3MjFDMjAuNzI2MyAyMC4wNjI3IDIwLjcyNjMgMjAuMDYyNyAyMC41ODQ4IDIwLjIwNDNDMjAuNDQxIDIwLjIyMjYgMjAuNDQxIDIwLjIyMjYgMjAuMjY2MiAyMC4yMjMxQzIwLjIwMzQgMjAuMjIzMyAyMC4xNDA2IDIwLjIyMzUgMjAuMDc1OSAyMC4yMjM2QzIwLjAxMDIgMjAuMjIzMSAxOS45NDQ1IDIwLjIyMjUgMTkuODc2OCAyMC4yMjJDMTkuODExMSAyMC4yMjI1IDE5Ljc0NTQgMjAuMjIzMSAxOS42Nzc3IDIwLjIyMzZDMTkuNTgzNSAyMC4yMjM0IDE5LjU4MzUgMjAuMjIzNCAxOS40ODc1IDIwLjIyMzFDMTkuNDI5OCAyMC4yMjI5IDE5LjM3MjEgMjAuMjIyOCAxOS4zMTI3IDIwLjIyMjZDMTkuMTY4OSAyMC4yMDQzIDE5LjE2ODkgMjAuMjA0MyAxOS4wMjczIDIwLjA2MjdDMTkuMDA5NSAxOS44NzIxIDE5LjAwOTUgMTkuODcyMSAxOS4wMDkzIDE5LjYyNDdDMTkuMDA5IDE5LjU1NjYgMTkuMDA5IDE5LjU1NjYgMTkuMDA4NiAxOS40ODcxQzE5LjAwODEgMTkuMzM0MiAxOS4wMDg1IDE5LjE4MTQgMTkuMDA5IDE5LjAyODZDMTkuMDA4OCAxOC45MTkzIDE5LjAwODUgMTguODEgMTkuMDA4MiAxOC43MDA3QzE5LjAwNzYgMTguNDAzMyAxOS4wMDc4IDE4LjEwNiAxOS4wMDgzIDE3LjgwODZDMTkuMDA4NiAxNy40OTc5IDE5LjAwODMgMTcuMTg3MyAxOS4wMDgxIDE2Ljg3NjZDMTkuMDA3OCAxNi4zNTQ3IDE5LjAwODIgMTUuODMyOSAxOS4wMDg4IDE1LjMxMTFDMTkuMDA5NiAxNC43MDcyIDE5LjAwOTQgMTQuMTAzMyAxOS4wMDg2IDEzLjQ5OTNDMTkuMDA3OSAxMi45ODE1IDE5LjAwNzggMTIuNDYzNyAxOS4wMDgyIDExLjk0NThDMTkuMDA4NCAxMS42MzYyIDE5LjAwODUgMTEuMzI2NyAxOS4wMDggMTEuMDE3MUMxOS4wMDc2IDEwLjcyNjEgMTkuMDA3OSAxMC40MzUxIDE5LjAwODcgMTAuMTQ0MUMxOS4wMDg5IDEwLjAzNzEgMTkuMDA4OCA5LjkzMDA1IDE5LjAwODUgOS44MjMwM0MxOS4wMDgxIDkuNjc3MzcgMTkuMDA4NiA5LjUzMTc0IDE5LjAwOTMgOS4zODYwOEMxOS4wMDk0IDkuMzA0NDMgMTkuMDA5NCA5LjIyMjc5IDE5LjAwOTUgOS4xMzg2NkMxOS4wNDA1IDguODA3MSAxOS4xOTEzIDguNzg4NDggMTkuNDg3NSA4Ljc4NzY2WiIgZmlsbD0id2hpdGUiLz4NCjwvc3ZnPg==";
@@ -42,6 +42,12 @@ export declare const ButtonPropsSchema: z.ZodObject<{
42
42
  normal: "normal";
43
43
  bold: "bold";
44
44
  }>>>;
45
+ textDecoration: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
46
+ none: "none";
47
+ underline: "underline";
48
+ "line-through": "line-through";
49
+ "underline line-through": "underline line-through";
50
+ }>>>;
45
51
  textAlign: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
46
52
  right: "right";
47
53
  left: "left";
@@ -2,7 +2,7 @@ import * as z from 'zod';
2
2
  export declare const ContainerPropsSchema: z.ZodObject<{
3
3
  style: z.ZodNullable<z.ZodOptional<z.ZodObject<{
4
4
  backgroundColor: z.ZodPreprocess<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>>;
5
- backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodString]>>>;
6
6
  backgroundSize: z.ZodOptional<z.ZodNullable<z.ZodString>>;
7
7
  backgroundRepeat: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
8
8
  repeat: "repeat";
@@ -11,8 +11,8 @@ export declare const HeadingPropsSchema: z.ZodObject<{
11
11
  h6: "h6";
12
12
  }>>>;
13
13
  linkType: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
14
- link: "link";
15
14
  text: "text";
15
+ link: "link";
16
16
  }>>>;
17
17
  url: z.ZodNullable<z.ZodOptional<z.ZodString>>;
18
18
  openInNewTab: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
@@ -132,4 +132,4 @@ export declare const HeadingPropsDefaults: {
132
132
  readonly openInNewTab: false;
133
133
  };
134
134
  export declare function Heading({ props, style }: HeadingProps): import("react/jsx-runtime").JSX.Element;
135
- export declare function getFontSize(level: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'): 16 | 24 | 32 | 19 | 13 | 11;
135
+ export declare function getFontSize(level: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'): 16 | 32 | 24 | 19 | 13 | 11;
@@ -1,3 +1,4 @@
1
+ import { ReactNode } from 'react';
1
2
  import { z } from 'zod';
2
3
  export declare const UNORDERED_MARKERS: readonly ["disc", "circle", "square", "dash", "arrow", "check", "cross", "none"];
3
4
  export declare const ORDERED_MARKERS: readonly ["decimal", "decimal-zero", "lower-alpha", "upper-alpha", "lower-roman", "upper-roman"];
@@ -52,8 +53,8 @@ export declare const ListPropsSchema: z.ZodObject<{
52
53
  "upper-roman": "upper-roman";
53
54
  }>>>;
54
55
  numberSuffix: z.ZodPreprocess<z.ZodNullable<z.ZodOptional<z.ZodEnum<{
55
- ".": ".";
56
56
  ")": ")";
57
+ ".": ".";
57
58
  }>>>>;
58
59
  startNumber: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
59
60
  markerColor: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>;
@@ -86,5 +87,14 @@ export declare const ListPropsDefaults: {
86
87
  readonly text: "Third list item";
87
88
  }];
88
89
  };
89
- export declare function List({ style, props }: ListProps): import("react/jsx-runtime").JSX.Element;
90
+ type ListRenderProps = ListProps & {
91
+ /**
92
+ * Optional per-item text override, e.g. to swap in a variable pill chip for
93
+ * an unfilled `{{token}}` on the editor canvas. Returning `undefined` falls
94
+ * through to the default plain/marked-token rendering. Omitted entirely by
95
+ * the published Reader path, which always uses the default.
96
+ */
97
+ renderItemText?: (item: ListItem, index: number) => ReactNode | undefined;
98
+ };
99
+ export declare function List({ style, props, renderItemText }: ListRenderProps): import("react/jsx-runtime").JSX.Element;
90
100
  export {};
@@ -0,0 +1,47 @@
1
+ import { z } from 'zod';
2
+ export declare const MdxPropsSchema: z.ZodObject<{
3
+ style: z.ZodNullable<z.ZodOptional<z.ZodObject<{
4
+ color: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>;
5
+ backgroundColor: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>;
6
+ fontSize: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
7
+ fontWeight: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
8
+ 400: "400";
9
+ 500: "500";
10
+ 600: "600";
11
+ 700: "700";
12
+ normal: "normal";
13
+ bold: "bold";
14
+ }>>>;
15
+ textAlign: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
16
+ right: "right";
17
+ left: "left";
18
+ center: "center";
19
+ }>>>;
20
+ padding: z.ZodNullable<z.ZodOptional<z.ZodObject<{
21
+ top: z.ZodNumber;
22
+ bottom: z.ZodNumber;
23
+ right: z.ZodNumber;
24
+ left: z.ZodNumber;
25
+ }, z.core.$strip>>>;
26
+ margin: z.ZodNullable<z.ZodOptional<z.ZodObject<{
27
+ top: z.ZodNumber;
28
+ bottom: z.ZodNumber;
29
+ right: z.ZodNumber;
30
+ left: z.ZodNumber;
31
+ }, z.core.$strip>>>;
32
+ }, z.core.$strip>>>;
33
+ props: z.ZodNullable<z.ZodOptional<z.ZodObject<{
34
+ markdown: z.ZodNullable<z.ZodOptional<z.ZodString>>;
35
+ html: z.ZodNullable<z.ZodOptional<z.ZodString>>;
36
+ }, z.core.$strip>>>;
37
+ responsive: z.ZodNullable<z.ZodOptional<z.ZodObject<{
38
+ tablet: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>>;
39
+ mobile: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>>;
40
+ }, z.core.$strip>>>;
41
+ }, z.core.$strip>;
42
+ export type MdxProps = z.infer<typeof MdxPropsSchema>;
43
+ export declare const MdxPropsDefaults: {
44
+ markdown: string;
45
+ html: string;
46
+ };
47
+ export declare function Mdx({ style, props }: MdxProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ export declare const QuillPropsSchema: z.ZodObject<{
3
+ style: z.ZodNullable<z.ZodOptional<z.ZodObject<{
4
+ color: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>;
5
+ backgroundColor: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodString, z.ZodString, z.ZodLiteral<"transparent">]>>>;
6
+ fontSize: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
7
+ fontFamily: z.ZodNullable<z.ZodOptional<z.ZodString>>;
8
+ fontWeight: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
9
+ 400: "400";
10
+ 500: "500";
11
+ 600: "600";
12
+ 700: "700";
13
+ normal: "normal";
14
+ bold: "bold";
15
+ }>>>;
16
+ textAlign: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
17
+ right: "right";
18
+ left: "left";
19
+ center: "center";
20
+ }>>>;
21
+ padding: z.ZodNullable<z.ZodOptional<z.ZodObject<{
22
+ top: z.ZodNumber;
23
+ bottom: z.ZodNumber;
24
+ right: z.ZodNumber;
25
+ left: z.ZodNumber;
26
+ }, z.core.$strip>>>;
27
+ margin: z.ZodNullable<z.ZodOptional<z.ZodObject<{
28
+ top: z.ZodNumber;
29
+ bottom: z.ZodNumber;
30
+ right: z.ZodNumber;
31
+ left: z.ZodNumber;
32
+ }, z.core.$strip>>>;
33
+ }, z.core.$strip>>>;
34
+ props: z.ZodNullable<z.ZodOptional<z.ZodObject<{
35
+ text: z.ZodNullable<z.ZodOptional<z.ZodString>>;
36
+ }, z.core.$strip>>>;
37
+ responsive: z.ZodNullable<z.ZodOptional<z.ZodObject<{
38
+ tablet: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>>;
39
+ mobile: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>>;
40
+ }, z.core.$strip>>>;
41
+ }, z.core.$strip>;
42
+ export type QuillProps = z.infer<typeof QuillPropsSchema>;
43
+ export declare const QuillPropsDefaults: {
44
+ text: string;
45
+ padding: string;
46
+ margin: string;
47
+ };
48
+ export declare function Quill({ style, props }: QuillProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,14 @@
1
+ export declare const PAGE_PILOT_STYLES_URL = "https://pagepilot.fabbuilder.com/pagePilotStyles.css";
2
+ /** ahd-fe's `buildPageHtml` — full preview HTML for a page record. */
3
+ export declare function buildPagePreviewHtml(record: any): string;
4
+ export interface PagePreviewDialogProps {
5
+ open: boolean;
6
+ onClose: () => void;
7
+ /** The in-memory record to render (current section already synced). */
8
+ record: any;
9
+ /** Live URL, shown only when the page is live. */
10
+ liveUrl?: string | null;
11
+ /** Same page on the tenant's own domain, in preview mode. */
12
+ domainPreviewUrl?: string | null;
13
+ }
14
+ export default function PagePreviewDialog({ open, onClose, record, liveUrl, domainPreviewUrl, }: PagePreviewDialogProps): import("react/jsx-runtime").JSX.Element;
@@ -31,5 +31,7 @@ export interface TopbarProps {
31
31
  autoSaveEnabled?: boolean;
32
32
  /** Fired when the user toggles the Auto Save switch. */
33
33
  onAutoSaveChange?: (enabled: boolean) => void;
34
+ /** Zoom controls are page-only (ahd-fe hides them for other record types). */
35
+ isPageRecord?: boolean;
34
36
  }
35
- export default function Topbar({ toggles, title, recordTitle, recordStatus, onBack, onSave, onPublish, onPublishMenu, publishSlot, onPreview, onToggleFullscreen, isFullscreen, onOpenMoreMenu, sectionsDropdown, mode, onToggleMode, isDirty, isSaving, changesSaved, autoSaveEnabled, onAutoSaveChange, }: TopbarProps): import("react/jsx-runtime").JSX.Element;
37
+ export default function Topbar({ toggles, title, recordTitle, recordStatus, onBack, onSave, onPublish, onPublishMenu, publishSlot, onPreview, onToggleFullscreen, isFullscreen, onOpenMoreMenu, sectionsDropdown, mode, onToggleMode, isDirty, isSaving, changesSaved, autoSaveEnabled, onAutoSaveChange, isPageRecord, }: TopbarProps): import("react/jsx-runtime").JSX.Element;