pagepilot-visual-editor 1.0.28 → 1.0.30

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 (180) hide show
  1. package/CHANGELOG.md +96 -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-container/src/index.d.ts +1 -1
  8. package/dist/blocks-internal/block-heading/src/index.d.ts +1 -1
  9. package/dist/blocks-internal/block-list/src/index.d.ts +11 -1
  10. package/dist/blocks-internal/block-mdx/src/index.d.ts +47 -0
  11. package/dist/blocks-internal/block-quill/src/index.d.ts +48 -0
  12. package/dist/editor/PagePreviewDialog.d.ts +14 -0
  13. package/dist/editor/Topbar.d.ts +3 -1
  14. package/dist/editor/pageUrls.d.ts +25 -0
  15. package/dist/editor/publish/PageLiveSuccessDialog.d.ts +9 -0
  16. package/dist/editor/publish/PagePublishDialog.d.ts +1 -0
  17. package/dist/editor/publish/PublishAccessibilityPanel.d.ts +8 -0
  18. package/dist/editor/publish/a11yLinter.d.ts +8 -0
  19. package/dist/editor/recordDirty.d.ts +16 -0
  20. package/dist/editor/renderSections.d.ts +2 -2
  21. package/dist/editor/savePipeline.d.ts +40 -0
  22. package/dist/editor/types.d.ts +35 -0
  23. package/dist/editor-sample/App/InspectorDrawer/BehaviourPanel.d.ts +22 -0
  24. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandColorPalette.d.ts +9 -0
  25. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandEmptyLink.d.ts +8 -0
  26. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandPanel.styled.d.ts +22 -0
  27. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/BrandSection.d.ts +8 -0
  28. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/EmptyText.d.ts +6 -0
  29. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/FontDetailsList.d.ts +6 -0
  30. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/index.d.ts +5 -0
  31. package/dist/editor-sample/App/InspectorDrawer/BrandPanel/useBrandApply.d.ts +9 -0
  32. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/ResponsiveDeviceTabs.d.ts +0 -2
  33. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/blockStyleClipboard.d.ts +2 -8
  34. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/index.d.ts +1 -4
  35. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/EmailLayoutSidebarPanel.d.ts +2 -1
  36. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/FlexColumns/ColumnSection.d.ts +2 -0
  37. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/FormsPickerSidebarPanel.d.ts +2 -1
  38. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/MdxSidebarPanel.d.ts +7 -0
  39. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/MenuPickerSidebarPanel.d.ts +22 -0
  40. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/QuillSidebarPanel.d.ts +8 -0
  41. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/TextSidebarPanel.d.ts +2 -2
  42. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/AnimationSection.d.ts +7 -5
  43. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/HoverEffectSection.d.ts +1 -1
  44. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/imageSizeUnit.d.ts +19 -0
  45. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.d.ts +0 -2
  46. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/inputs/VariableLinkHint.d.ts +8 -0
  47. package/dist/editor-sample/App/InspectorDrawer/EditorBehavior.d.ts +8 -2
  48. package/dist/editor-sample/App/InspectorDrawer/LayersPanelStyles.d.ts +1 -1
  49. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/AiSupportedBadge.d.ts +7 -0
  50. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/SectionsModal.d.ts +2 -10
  51. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/icons/index.d.ts +3 -5
  52. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/templateHelpers.d.ts +226 -0
  53. package/dist/editor-sample/App/InspectorDrawer/LayoutPanel/useDebouncedValue.d.ts +8 -0
  54. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/AiFillAllDialog.d.ts +21 -0
  55. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/AiGenerateButton.d.ts +14 -0
  56. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/ScalarFieldRow.d.ts +4 -1
  57. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariableGroupDialog.d.ts +19 -0
  58. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/VariableGroupList.d.ts +5 -0
  59. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/aiFill.d.ts +36 -0
  60. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/styles.d.ts +14 -11
  61. package/dist/editor-sample/App/InspectorDrawer/VariablesPanel/upgradeDialog.d.ts +8 -8
  62. package/dist/editor-sample/App/InspectorDrawer/behaviourFields.d.ts +30 -0
  63. package/dist/editor-sample/App/InspectorDrawer/index.d.ts +8 -1
  64. package/dist/editor-sample/App/InspectorDrawer/publish/BackgroundPanel.d.ts +6 -0
  65. package/dist/editor-sample/App/InspectorDrawer/renderBehaviourField.d.ts +7 -0
  66. package/dist/editor-sample/App/TemplatePanel/hooks/useMainBoxStyles.d.ts +2 -1
  67. package/dist/editor-sample/App/TemplatePanel/index.d.ts +2 -1
  68. package/dist/editor-sample/App/TemplatePanel/minimap/useMiniMapSync.d.ts +2 -2
  69. package/dist/editor-sample/App/hooks/page/saveMenuHrefEdits.d.ts +1 -1
  70. package/dist/editor-sample/App/hooks/page/useSaveHandler.d.ts +1 -0
  71. package/dist/editor-sample/App/hooks/useAutosave.d.ts +8 -3
  72. package/dist/editor-sample/App/hooks/useIsTemplateEditorRoute.d.ts +1 -0
  73. package/dist/editor-sample/App/hooks/useStretch.d.ts +9 -0
  74. package/dist/editor-sample/App/shared/UploadImage.d.ts +4 -0
  75. package/dist/editor-sample/App/shared/editor.styles.d.ts +11 -1
  76. package/dist/editor-sample/documents/blocks/Container/ContainerPropsSchema.d.ts +6 -4
  77. package/dist/editor-sample/documents/blocks/FormsPicker/FormsPropsSchema.d.ts +33 -2
  78. package/dist/editor-sample/documents/blocks/List/ListEditor.d.ts +8 -0
  79. package/dist/editor-sample/documents/blocks/Marquee/MarqueePropsSchema.d.ts +4 -0
  80. package/dist/editor-sample/documents/blocks/MenuPicker/MenuPropsSchema.d.ts +6 -0
  81. package/dist/editor-sample/documents/blocks/Table/TableCellEditor.d.ts +2 -1
  82. package/dist/editor-sample/documents/blocks/Table/TableImportDialog.styles.d.ts +11 -1
  83. package/dist/editor-sample/documents/blocks/Table/parseClipboardTable.d.ts +7 -0
  84. package/dist/editor-sample/documents/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +6 -0
  85. package/dist/editor-sample/documents/blocks/Timer/TimerPropsSchema.d.ts +2 -0
  86. package/dist/editor-sample/documents/blocks/Timer/variants/CircularProgressView.d.ts +2 -1
  87. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/blockMenuStyles.d.ts +1 -1
  88. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/brandButtonDefaults.d.ts +1 -4
  89. package/dist/editor-sample/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.d.ts +0 -6
  90. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/dialogs/LinkDialog.d.ts +4 -1
  91. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/hooks/useToolbarCommands.d.ts +16 -4
  92. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/styles.d.ts +2 -2
  93. package/dist/editor-sample/documents/blocks/helpers/InlineTextToolbar/types.d.ts +2 -4
  94. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.d.ts +2 -3
  95. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/TuneMenu.styles.d.ts +17 -0
  96. package/dist/editor-sample/documents/blocks/helpers/block-wrappers/saveAsTemplateUtils.d.ts +29 -1
  97. package/dist/editor-sample/documents/blocks/helpers/documentUtils.d.ts +33 -26
  98. package/dist/editor-sample/documents/blocks/helpers/variableBinding.d.ts +9 -0
  99. package/dist/editor-sample/documents/editor/EditorBlock.d.ts +2 -6
  100. package/dist/editor-sample/documents/editor/EditorContext.d.ts +77 -20
  101. package/dist/editor-sample/documents/editor/LazyEditorBlock.d.ts +1 -0
  102. package/dist/editor-sample/documents/editor/core.d.ts +492 -390
  103. package/dist/editor-sample/documents/editor/templateVariables.d.ts +151 -14
  104. package/dist/editor-sample/documents/editor/useRootFontFamily.d.ts +10 -0
  105. package/dist/editor-sample/utils/editorStorageKey.d.ts +2 -0
  106. package/dist/editor-sample/utils/localStoragePref.d.ts +2 -0
  107. package/dist/email-builder-core/blocks/Container/ContainerPropsSchema.d.ts +1 -1
  108. package/dist/email-builder-core/blocks/EmailLayout/EmailLayoutReader.d.ts +1 -1
  109. package/dist/email-builder-core/blocks/TabsBlock/TabsBlockPropsSchema.d.ts +6 -0
  110. package/dist/email-builder-core/blocks/Timer/variants/CircularProgressView.d.ts +5 -1
  111. package/dist/email-builder-core/blocks/Timer/variants/DigitalFlipView.d.ts +4 -1
  112. package/dist/email-builder-core/blocks/Timer/variants/TextInlineView.d.ts +3 -1
  113. package/dist/email-builder-core/blocks/helpers/blockStyleHelpers.d.ts +22 -0
  114. package/dist/email-builder-core/renderers/pageScripts.d.ts +0 -1
  115. package/dist/email-builder-core/renderers/themeTokens.d.ts +5 -126
  116. package/dist/host-stubs/history.d.ts +5 -0
  117. package/dist/host-stubs/hooks/useTenantFeatureCutoff.d.ts +8 -0
  118. package/dist/host-stubs/hooks/useTenantPlan.d.ts +18 -0
  119. package/dist/host-stubs/i18nAhdDefaults.d.ts +1 -0
  120. package/dist/host-stubs/modules/auth/authCurrentTenant.d.ts +6 -0
  121. package/dist/host-stubs/modules/forms/formsService.d.ts +3 -1
  122. package/dist/host-stubs/modules/forms/useFormsList.d.ts +4 -1
  123. package/dist/host-stubs/modules/menu/menuService.d.ts +4 -0
  124. package/dist/host-stubs/modules/page/pageService.d.ts +11 -0
  125. package/dist/host-stubs/modules/settings/settingsActions.d.ts +2 -0
  126. package/dist/host-stubs/modules/settings/settingsSelectors.d.ts +4 -0
  127. package/dist/host-stubs/modules/shared/axios/authAxios.d.ts +16 -0
  128. package/dist/host-stubs/modules/shared/constants.d.ts +14 -0
  129. package/dist/host-stubs/modules/store.d.ts +4 -0
  130. package/dist/host-stubs/modules/template/templateEnumerators.d.ts +19 -0
  131. package/dist/host-stubs/modules/tour/injectTourIntoPage.d.ts +20 -0
  132. package/dist/host-stubs/style/icons.d.ts +57 -0
  133. package/dist/host-stubs/utils/dateFormats.d.ts +1 -0
  134. package/dist/host-stubs/view/branding/brandDefaultFont.d.ts +3 -1
  135. package/dist/host-stubs/view/branding/styles/BrandIcons.d.ts +9 -0
  136. package/dist/host-stubs/view/branding/styles/types.d.ts +76 -0
  137. package/dist/host-stubs/view/configurations/ConfigurationIcons.d.ts +9 -0
  138. package/dist/host-stubs/view/demo/DemoIcons.d.ts +9 -0
  139. package/dist/host-stubs/view/images/Icons.d.ts +6 -0
  140. package/dist/host-stubs/view/media/MediaGalleryDialog/types.d.ts +47 -0
  141. package/dist/host-stubs/view/media/MediaGalleryDialog/utils/fileUtils.d.ts +3 -0
  142. package/dist/host-stubs/view/media/MediaGalleryDialog/utils/mediaTypes.d.ts +9 -0
  143. package/dist/host-stubs/view/media/MediaGalleryDialog.d.ts +12 -2
  144. package/dist/host-stubs/view/media/styles/MediaIcons.d.ts +13 -0
  145. package/dist/host-stubs/view/shared/Confetti.d.ts +5 -0
  146. package/dist/host-stubs/view/shared/PagePilotLoader.d.ts +2 -0
  147. package/dist/host-stubs/view/shared/UpgradeDialog/UpgradeDialogContext.d.ts +1 -0
  148. package/dist/host-stubs/view/shared/common/CopyToClipboard.d.ts +7 -0
  149. package/dist/host-stubs/view/shared/editors/MdxEditor.d.ts +8 -0
  150. package/dist/host-stubs/view/shared/editors/QuillEditor.d.ts +3 -0
  151. package/dist/host-stubs/view/shared/editors/sanitize.d.ts +4 -0
  152. package/dist/host-stubs/view/shared/editors/types.d.ts +7 -0
  153. package/dist/host-stubs/view/shared/media/TemplatePreviewMedia.d.ts +29 -0
  154. package/dist/host-stubs/view/shared/modals/ConfigureDialog.d.ts +7 -0
  155. package/dist/host-stubs/view/shared/modals/ManageTemplateModal.d.ts +5 -0
  156. package/dist/host-stubs/view/shared/speech/index.d.ts +17 -0
  157. package/dist/host-stubs/view/shared/styles/Table.styles.d.ts +3 -0
  158. package/dist/host-stubs/view/template/form/TemplateFormModal.d.ts +10 -0
  159. package/dist/host-stubs/view/template/form/fields/types.d.ts +7 -0
  160. package/dist/{index-DcN8zC8_.js → index-B8pdGALF.js} +86258 -73803
  161. package/dist/{index-SYmY8c1I.cjs → index-C-KL2oQP.cjs} +1 -1
  162. package/dist/{index-Cp5AeqH5.js → index-CStZQ7E0.js} +1 -1
  163. package/dist/index-DVx38kGU.cjs +1553 -0
  164. package/dist/index.cjs +1 -1
  165. package/dist/index.js +1 -1
  166. package/dist/render-core/combineSections.d.ts +33 -3
  167. package/dist/render-core/dateFormats.d.ts +14 -3
  168. package/dist/render-core/stubs/pickerEmptyState.d.ts +2 -0
  169. package/dist/render-core/stubs/styleIcons.d.ts +1 -0
  170. package/dist/render.cjs +281 -219
  171. package/dist/render.js +9858 -8266
  172. package/dist/style.css +1 -1
  173. package/dist/{xlsx-vznvhtjT.cjs → xlsx-DUs4Mvqq.cjs} +1 -1
  174. package/dist/{xlsx-Bk2GErZO.js → xlsx-bYU68TCR.js} +1 -1
  175. package/package.json +1 -1
  176. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/ResponsiveEditingBanner.d.ts +0 -13
  177. package/dist/editor-sample/App/InspectorDrawer/ConfigurationPanel/input-panels/helpers/BoxShadowControls.d.ts +0 -19
  178. package/dist/editor-sample/documents/blocks/AppBannerPicker/appBanner.styled.d.ts +0 -2
  179. package/dist/email-builder-core/blocks/boxShadowSchema.d.ts +0 -23
  180. package/dist/index-Br_dDd3Z.cjs +0 -1493
package/CHANGELOG.md CHANGED
@@ -6,7 +6,38 @@ 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 (`editor-sample/`, `email-builder-core/`,
11
+ `blocks-internal/`) with ahd-fe `master` (82ec6ec4b). 358 of 453 shared
12
+ files are now byte-identical. The rest differ only where the standalone
13
+ build needs it: pagepilot API wiring, no dayjs / x-date-pickers / lab /
14
+ react-hook-form / react-select dependencies, MUI 6 + zod 4 typing, and
15
+ pagepilot-named i18n keys. Upstream behaviour pulled in includes:
16
+ - Every block sidebar panel re-laid out into ahd-fe's collapsible
17
+ Content / Appearance / Typography / Layout / Spacing / Border / Effects
18
+ sections, with per-device (desktop / tablet / mobile) values and margin.
19
+ - Inline text toolbar: link editing on click, link underline, table row
20
+ background, font-family apply, per-device font sizes.
21
+ - Brand panel (new rail tab, `panels.brand`), Manage Templates dialog,
22
+ variable groups, AI fill for variables (through `apiConfig`), schema
23
+ markup in the SEO panel, Section Library rewrite (global / private
24
+ sources, plan lock, AI badge), resizable / collapsible inspector.
25
+ - Legacy Markdown (Mdx) and Quill blocks render again; their rich editors
26
+ fall back to plain source textareas.
27
+ - Reader: per-device `responsive` resolution and `ahd-<id>` wrapper ids.
28
+ - Host stubs: `@/` imports now resolve like `src/` (vite + tsconfig). The
29
+ English strings for every referenced i18n key are generated from ahd-fe's
30
+ `en.tsx` (`host-stubs/i18nAhdDefaults.ts`). The media gallery stub is a
31
+ working URL picker, so every "Upload / Replace media" button works.
32
+ - `onUpgrade` may now receive ahd-fe's optional `{ title, description }`.
33
+
9
34
  ### Fixed
35
+ - `renderToStaticHtml` (the `./render` subpath) no longer coerces Progress,
36
+ Breadcrumb, Markdown and Quill blocks to Text — its block allow-list now
37
+ matches the Reader's 41 block types exactly.
38
+ - The `./render` bundle stays MUI / emotion-free: the IFrame block's editor
39
+ placeholder (shown when no URL is set) is stubbed out for Node renders.
40
+ Before, an IFrame without a URL crashed server-side rendering.
10
41
  - Re-synced the renderer (`email-builder-core/` + `blocks-internal/`) with
11
42
  ahd-fe, so server-side `renderToStaticHtml` output matches what the editor
12
43
  publishes on Save. Pages regenerated by ahd-be's `pagebypath?update=true`
@@ -26,12 +57,77 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
26
57
  - Published scripts (tabs, carousel, pagination, timer, animation,
27
58
  demo-scale) are now referenced by hosted URL, matching ahd-fe, instead of
28
59
  being inlined.
60
+ - The `activeStepIndex` prop now also selects that section in the editor
61
+ store. Before, the canvas showed section N while saves wrote the canvas
62
+ into section 0.
63
+ - With `apiConfig`, a single-document record's save sent no content (its
64
+ `contentMetadata` was stripped and there were no sections). It now sends
65
+ one section, as ahd-fe does.
29
66
 
30
67
  ### Added
31
68
  - `recordType` render option. EmailLayout detects the record type from the
32
69
  browser URL, and Node has none, so a page with no authored width rendered
33
70
  at 320px. The pageId / pagePath shapes now default to `"page"`. Sync
34
71
  callers rendering a page should pass `recordType: "page"`.
72
+ - Editor shell parity with ahd-fe's page editor:
73
+ - **"Page is live" dialog** after a publish through `apiConfig`: the
74
+ live URL plus, when the tenant has its own domain, the preview URL on
75
+ it, each with copy and open buttons.
76
+ - **Accessibility check** in the publish dialog (port of ahd-fe's
77
+ `a11yLinter` + `PublishAccessibilityPanel`).
78
+ - **Plan-gated scheduling** in the publish dialog: below Pro, the date
79
+ fields show "✦ Upgrade" and a date after today opens the upgrade
80
+ prompt. The native date input is kept (no new dependencies).
81
+ - **Pagination script** toggle in the publish dialog's Scripts tab.
82
+ - **Page preview** rebuilt on ahd-fe's `PagePreviewDialog`: syncs the
83
+ current section first, renders inside the `pagePilotStyles.css` +
84
+ `.ahd-page-root` wrapper, shows external sections as anchors, and adds
85
+ "Open live URL" / "Open on your domain" buttons.
86
+ - **Keyboard shortcuts**: Ctrl/Cmd+Z, Ctrl/Cmd+Y and Ctrl/Cmd+Shift+Z for
87
+ undo / redo; Ctrl/Cmd+B toggles bold on a selected Heading.
88
+ - **Built-in Publish ▾ menu** when the host passes no `onPublishMenu`:
89
+ Publish, Live URL (live pages) and Save as Draft.
90
+ - The initial canvas device comes from `record.device`; switching device
91
+ scrolls the selected block back into view.
92
+ - `SaveChangesPayload` gains optional `status`, `sections` (exactly what is
93
+ sent to `upsert-page-item`), `schedule` and `response`. Existing fields
94
+ are unchanged.
95
+ - `combineSections`: `injectPaginationScript` and `rootOverrides` render
96
+ options, plus `externalSectionAnchorHtml` / `wrapSectionsInDocumentShell`
97
+ helpers.
98
+
99
+ ### Changed
100
+ - Save Changes and autosave now save with the record's **current status**
101
+ (ahd-fe's `onShowHtml(record.status)`) instead of always `"draft"`, so
102
+ saving a live page keeps it live. Save Draft / Save as Draft still send
103
+ `"draft"`; Publish sends `"live"`.
104
+ - Save / publish HTML now goes through a port of ahd-fe's `useSaveHandler`
105
+ pipeline (`src/editor/savePipeline.ts`): template variables are baked into
106
+ the published HTML while the saved document keeps them editable; page
107
+ records save `<body>` inner HTML only; fonts ship inline
108
+ (`injectFontAssets: true`); `record.bodyBottom` is appended; an existing
109
+ AHD integration snippet is preserved. A single-document record now sends
110
+ one synthesized section to the API, as ahd-fe does.
111
+ - After a successful save or publish the API response is merged back into
112
+ the record (reported through `onUpdateRecord`), the undo history is reset,
113
+ and "Changes saved" shows. Publish now also shows "Changes saved".
114
+ - External (client-side) sections render as an empty `<div id=identifier>`
115
+ anchor on save, publish, preview and in `renderToStaticHtml` (previously
116
+ their stored `content` was used).
117
+ - Switching sections loads the new section with a fresh undo history (like
118
+ ahd-fe's `loadStepDocument`): it no longer marks the editor dirty, and
119
+ Undo can't walk back into another section's document. Adding or deleting
120
+ a section is a single undoable step.
121
+ - Dirty tracking now also covers record-level changes: sections added,
122
+ deleted, renamed, reordered or retyped, edits flushed from other sections,
123
+ and sidebar-edited page fields (SEO meta, head, body bottom, …).
124
+ - Zoom controls are page-only, hidden below the `lg` breakpoint, and show a
125
+ toast at the 25% / 100% limits instead of disabling.
126
+ - Undo, Redo, More, Preview and Publish are disabled while a save runs.
127
+ - The tab-close "Leave site?" prompt is skipped while "Changes saved" shows.
128
+ - The canvas now shows the external-section placeholder for the active
129
+ section (the flag is synced to the editor store and passed to the
130
+ inspector and canvas).
35
131
 
36
132
  ## [1.0.27] — 2026-09-21
37
133
 
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==";
@@ -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";
@@ -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'): 32 | 24 | 19 | 16 | 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"];
@@ -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;
@@ -0,0 +1,25 @@
1
+ export declare const PAGE_STATUS: {
2
+ readonly LIVE: "live";
3
+ readonly DRAFT: "draft";
4
+ readonly UNDER_REVIEW: "under-review";
5
+ };
6
+ export declare const PAGE_CACHE_BUST_PARAM = "v";
7
+ export declare const PAGE_PREVIEW_MODE_PARAM = "mode";
8
+ export declare const PAGE_PREVIEW_MODE_VALUE = "preview";
9
+ type TenantLike = {
10
+ id?: string;
11
+ applications?: Array<{
12
+ ipAddress?: string | null;
13
+ } | null> | null;
14
+ [key: string]: any;
15
+ };
16
+ /** Origin of the tenant's own site (first application with an `ipAddress`). */
17
+ export declare function getTenantSiteOrigin(tenant: TenantLike | null | undefined): string | null;
18
+ /**
19
+ * The page on the default FAB Builder address. `updatedAt` is appended as a
20
+ * cache-buster so a freshly published page never serves a cached copy.
21
+ */
22
+ export declare function buildPageLiveUrl(tenantIdOrTenant: string | TenantLike | null | undefined, slug: string, updatedAt?: string | Date | null): string;
23
+ /** The same page on the tenant's own domain, in preview mode. */
24
+ export declare function buildPageDomainPreviewUrl(tenant: TenantLike | null | undefined, slug: string): string | null;
25
+ export {};
@@ -0,0 +1,9 @@
1
+ interface PageLiveSuccessDialogProps {
2
+ open: boolean;
3
+ onClose: () => void;
4
+ tenantId: string;
5
+ tenant?: any;
6
+ slug: string;
7
+ }
8
+ export default function PageLiveSuccessDialog({ open, onClose, tenantId, tenant, slug, }: PageLiveSuccessDialogProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -22,6 +22,7 @@ interface PagePublishDialogProps {
22
22
  };
23
23
  injectTabsScrollSyncScript?: boolean;
24
24
  injectCarouselScript?: boolean;
25
+ injectPaginationScript?: boolean;
25
26
  injectAnimationScript?: boolean;
26
27
  }) => Promise<boolean>;
27
28
  }
@@ -0,0 +1,8 @@
1
+ import { A11yIssue } from './a11yLinter';
2
+ interface PublishAccessibilityPanelProps {
3
+ issues: A11yIssue[];
4
+ errorCount: number;
5
+ warningCount: number;
6
+ }
7
+ export default function PublishAccessibilityPanel({ issues, errorCount, }: PublishAccessibilityPanelProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import { TEditorConfiguration } from '../../editor-sample/documents/editor/core';
2
+ export type A11ySeverity = 'error' | 'warning';
3
+ export type A11yIssue = {
4
+ severity: A11ySeverity;
5
+ message: string;
6
+ blockId?: string;
7
+ };
8
+ export declare function runAccessibilityChecks(document: TEditorConfiguration): A11yIssue[];