@riverbankcms/sdk 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +21 -1
  2. package/dist/{PreviewEditorSidebar-DpAbAl08.mjs → PreviewEditorSidebar-DWqwfy3_.mjs} +48 -28
  3. package/dist/{PreviewEditorUI-O7cn6Xxv.mjs → PreviewEditorUI-B7OL4sfR.mjs} +10 -9
  4. package/dist/{PreviewQueryProvider-D0tnKl0t.mjs → PreviewQueryProvider-D0y2l8JN.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CVB7urtl.mjs → SdkPreviewModeRuntime-D8Gt9Gbe.mjs} +633 -220
  6. package/dist/{SiteChromeCustomizeContext-C_sizso-.mjs → SiteChromeCustomizeContext-DUpalEdL.mjs} +5764 -1556
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +15383 -11388
  8. package/dist/_dts/api/src/blocks.d.ts +41 -7
  9. package/dist/_dts/api/src/bookingAdjustments.d.ts +5 -0
  10. package/dist/_dts/api/src/bookingOperations.d.ts +4 -0
  11. package/dist/_dts/api/src/bookingRecords.d.ts +177 -127
  12. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  13. package/dist/_dts/api/src/cache-tags.d.ts +3 -0
  14. package/dist/_dts/api/src/common/envelope.d.ts +7 -0
  15. package/dist/_dts/api/src/contentRuntime.d.ts +19 -1
  16. package/dist/_dts/api/src/courses.d.ts +1 -0
  17. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +5 -5
  18. package/dist/_dts/api/src/endpoints.d.ts +134 -0
  19. package/dist/_dts/api/src/footer-settings.d.ts +1 -0
  20. package/dist/_dts/api/src/footerSettings.d.ts +8 -0
  21. package/dist/_dts/api/src/index.d.ts +7 -4
  22. package/dist/_dts/api/src/navigation/contracts.d.ts +3 -3
  23. package/dist/_dts/api/src/participantMessaging.d.ts +18 -12
  24. package/dist/_dts/api/src/previewContentContract.d.ts +4 -0
  25. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  26. package/dist/_dts/api/src/sdkContracts.d.ts +309 -1
  27. package/dist/_dts/api/src/siteBanner.d.ts +2 -2
  28. package/dist/_dts/api/src/siteInfrastructure.d.ts +13 -0
  29. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +144 -60
  30. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +35 -1
  31. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +74 -28
  32. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientField.d.ts +9 -0
  33. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientWidget.d.ts +3 -4
  34. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  35. package/dist/_dts/blocks/src/index.d.ts +1 -1
  36. package/dist/_dts/blocks/src/primitives/layout/Section.d.ts +0 -1
  37. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -0
  38. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +3 -0
  39. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +3 -0
  40. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +3 -0
  41. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +1 -22
  42. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +3 -0
  43. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +1 -22
  44. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -0
  45. package/dist/_dts/blocks/src/system/blocks/form.d.ts +3 -0
  46. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +3 -0
  47. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -0
  48. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +3 -0
  49. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +50 -0
  50. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +9 -48
  51. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +3 -0
  52. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -0
  53. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +3 -0
  54. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +3 -0
  55. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  56. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +16 -6
  57. package/dist/_dts/blocks/src/system/defineBlock.d.ts +9 -1
  58. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +8 -0
  59. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -1
  60. package/dist/_dts/blocks/src/system/icons/social.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/icons/svg.d.ts +1 -0
  62. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +33 -2
  63. package/dist/_dts/blocks/src/system/node/fragments/backgroundLayer.d.ts +13 -0
  64. package/dist/_dts/blocks/src/system/node/fragments/footerNav.d.ts +2 -0
  65. package/dist/_dts/blocks/src/system/node/fragments/styledContainer.d.ts +4 -4
  66. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +3 -12
  67. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  68. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -6
  69. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  70. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/types/link.d.ts +3 -3
  72. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +14 -0
  73. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +27 -8
  74. package/dist/_dts/content-editor/src/footerComposer.d.ts +56 -0
  75. package/dist/_dts/content-editor/src/hooks/useEntryActions.d.ts +1 -1
  76. package/dist/_dts/content-editor/src/hooks/useEntryMutations.d.ts +5 -5
  77. package/dist/_dts/content-editor/src/index.d.ts +2 -0
  78. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +3 -1
  79. package/dist/_dts/content-editor/src/services/contentEntryServices.d.ts +20 -36
  80. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +5 -1
  81. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +11 -0
  82. package/dist/_dts/content-model/src/content-types/entryValidation.d.ts +31 -0
  83. package/dist/_dts/content-model/src/content-types/scaffold.d.ts +58 -0
  84. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  85. package/dist/_dts/content-model/src/content-types/sentinels.d.ts +36 -0
  86. package/dist/_dts/content-model/src/definitions/shared.d.ts +3 -0
  87. package/dist/_dts/content-model/src/index.d.ts +3 -0
  88. package/dist/_dts/core/src/booking-date-time.d.ts +8 -0
  89. package/dist/_dts/core/src/branded.d.ts +3 -0
  90. package/dist/_dts/core/src/editor-state.d.ts +4 -0
  91. package/dist/_dts/core/src/footer-composition.d.ts +143 -0
  92. package/dist/_dts/core/src/index.d.ts +2 -0
  93. package/dist/_dts/core/src/public-profile.d.ts +73 -0
  94. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +221 -205
  95. package/dist/_dts/db/src/schemas/forms.d.ts +10 -10
  96. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +5 -0
  97. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +1 -0
  98. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +2 -1
  99. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +2 -1
  100. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +2 -1
  101. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +10 -0
  102. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +1 -0
  103. package/dist/_dts/media-core/src/fileMimeDetection.d.ts +16 -0
  104. package/dist/_dts/media-core/src/fileStorage.d.ts +8 -0
  105. package/dist/_dts/media-core/src/storagePathDomain.d.ts +2 -0
  106. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +3 -0
  107. package/dist/_dts/path-utils/src/index.d.ts +5 -0
  108. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +2 -0
  109. package/dist/_dts/preview-next/src/client/preview/PreviewChromeLayer.d.ts +5 -0
  110. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -1
  111. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  112. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -1
  113. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -1
  114. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -0
  115. package/dist/_dts/preview-next/src/client/preview/previewErrorMessages.d.ts +4 -0
  116. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -1
  117. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -1
  118. package/dist/_dts/sdk/src/cli/commands/compare.d.ts +1 -1
  119. package/dist/_dts/sdk/src/cli/commands/deploy.d.ts +1 -1
  120. package/dist/_dts/sdk/src/cli/commands/drafts.d.ts +18 -0
  121. package/dist/_dts/sdk/src/cli/commands/entry.d.ts +15 -0
  122. package/dist/_dts/sdk/src/cli/commands/init-docs.d.ts +2 -2
  123. package/dist/_dts/sdk/src/cli/commands/publish-all.d.ts +1 -1
  124. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +1 -0
  125. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +1 -1
  126. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +3 -0
  127. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +12 -1
  128. package/dist/_dts/sdk/src/cli/commands/setup.d.ts +1 -0
  129. package/dist/_dts/sdk/src/cli/commands/verify.d.ts +1 -0
  130. package/dist/_dts/sdk/src/cli/content/reader.d.ts +1 -0
  131. package/dist/_dts/sdk/src/cli/helpers.d.ts +22 -1
  132. package/dist/_dts/sdk/src/cli/index.d.ts +4 -0
  133. package/dist/_dts/sdk/src/cli/output.d.ts +88 -0
  134. package/dist/_dts/sdk/src/cli/program.d.ts +29 -0
  135. package/dist/_dts/sdk/src/cli/push-config.d.ts +1 -1
  136. package/dist/_dts/sdk/src/client/management/blocks.d.ts +14 -1
  137. package/dist/_dts/sdk/src/client/management/catalog.d.ts +10 -0
  138. package/dist/_dts/sdk/src/client/management/http.d.ts +7 -1
  139. package/dist/_dts/sdk/src/client/management/index.d.ts +2 -1
  140. package/dist/_dts/sdk/src/client/management/types.d.ts +58 -20
  141. package/dist/_dts/sdk/src/config/content-types.d.ts +2 -0
  142. package/dist/_dts/sdk/src/config/content-validation.d.ts +4 -0
  143. package/dist/_dts/sdk/src/date-time/index.d.ts +68 -0
  144. package/dist/_dts/sdk/src/navigation/index.d.ts +2 -0
  145. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -2
  146. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -1
  147. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  148. package/dist/_dts/sdk/src/version.d.ts +1 -1
  149. package/dist/_dts/site-commands/src/commands.d.ts +900 -827
  150. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  151. package/dist/_dts/theme-core/src/buttons/core.d.ts +15 -46
  152. package/dist/_dts/theme-core/src/buttons/effectClassification.d.ts +147 -0
  153. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +2 -3
  154. package/dist/_dts/theme-core/src/buttons/generateDefaultButtonSystem.d.ts +1 -1
  155. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  156. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  157. package/dist/_dts/theme-core/src/buttons/personalities/two-tone-pill.d.ts +17 -0
  158. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +45 -33
  159. package/dist/_dts/theme-core/src/buttons/presets.d.ts +4 -25
  160. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +100 -0
  161. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +16 -0
  162. package/dist/_dts/theme-core/src/buttons/types.d.ts +104 -86
  163. package/dist/_dts/theme-core/src/cards/types.d.ts +16 -16
  164. package/dist/_dts/theme-core/src/footer/mode.d.ts +15 -0
  165. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  166. package/dist/_dts/theme-core/src/gradients/presets.d.ts +200 -8
  167. package/dist/_dts/theme-core/src/gradients/utils.d.ts +6 -2
  168. package/dist/_dts/theme-core/src/interactive/baseSchema.d.ts +1 -1
  169. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +117 -150
  170. package/dist/_dts/theme-core/src/mock-themes/modern-minimal.d.ts +1 -1
  171. package/dist/_dts/theme-core/src/navigation/types.d.ts +3 -3
  172. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -2
  173. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +5 -8
  174. package/dist/_dts/theme-core/src/palette/index.d.ts +0 -1
  175. package/dist/_dts/theme-core/src/schema.d.ts +1264 -138
  176. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  177. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +10 -10
  178. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +12 -1
  179. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +3 -2
  180. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +13 -6
  181. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +29 -8
  182. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +15 -0
  183. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +2 -2
  184. package/dist/cli/index.mjs +68552 -66955
  185. package/dist/cli/init-docs/content/cli-reference.md +50 -7
  186. package/dist/cli/init-docs/content/content-management.md +7 -4
  187. package/dist/cli/init-docs/content/workflow-publish.md +5 -1
  188. package/dist/client/{DiscountCodeDisclosure-BwGkvmVH.mjs → DiscountCodeDisclosure-DU1ygxU2.mjs} +1 -1
  189. package/dist/client/{EventCombined.client-JnWE6Hzc.mjs → EventCombined.client-DB5zagCo.mjs} +3 -3
  190. package/dist/client/{EventListing.client-DQewc_kg.mjs → EventListing.client-CTX9JHBL.mjs} +2 -2
  191. package/dist/client/{LeafletStaticMap-DPAU3SFt.mjs → LeafletStaticMap-BYImhgiB.mjs} +1 -1
  192. package/dist/client/{MagicLinkForm-D4kpWCbW.mjs → MagicLinkForm-CRkw_M3l.mjs} +2 -2
  193. package/dist/client/{StepIndicator-CBlkb4rA.mjs → StepIndicator-BnmVBJJh.mjs} +2 -2
  194. package/dist/client/{accordion-DAIBVpTS.mjs → accordion-CeGreumd.mjs} +1 -1
  195. package/dist/client/{bookingForm-DZ-4l5_1.mjs → bookingForm-CSzFNrpN.mjs} +6 -6
  196. package/dist/client/bookings.mjs +637 -328
  197. package/dist/client/{buttons-DJgynGHQ.mjs → buttons-DoFV7KDL.mjs} +618 -306
  198. package/dist/client/{carousel-D-SLfX8r.mjs → carousel-B2jDtogf.mjs} +1 -1
  199. package/dist/client/{cart-CEgbgJhX.mjs → cart-D-jZ-vaY.mjs} +3 -3
  200. package/dist/client/{checkout-CXWrCRAA.mjs → checkout-Dza-LA7N.mjs} +3 -3
  201. package/dist/client/client.mjs +2497 -1216
  202. package/dist/client/{colorStyles-jZS6KfkP.mjs → colorStyles-CrgzoXsm.mjs} +1 -30
  203. package/dist/client/{courseRegistration-DVmLrRVz.mjs → courseRegistration-TYkNychb.mjs} +7 -7
  204. package/dist/client/{eventCalendar-DCuyPY_c.mjs → eventCalendar-BI_90SsT.mjs} +5 -5
  205. package/dist/client/{eventCombined-kP2CA2D4.mjs → eventCombined-mNrpryE9.mjs} +2 -2
  206. package/dist/client/{eventDetails-DU0LeF5e.mjs → eventDetails-D4GVlCIY.mjs} +3 -3
  207. package/dist/client/{eventListing-CcHF87BI.mjs → eventListing-YhKN018y.mjs} +2 -2
  208. package/dist/client/{eventRegistration-DJnR0yFH.mjs → eventRegistration-CdHGtilr.mjs} +7 -7
  209. package/dist/client/foregroundContract-xICPq59x.mjs +31 -0
  210. package/dist/client/{form-CH1lCusH.mjs → form-AcAL45rA.mjs} +2 -2
  211. package/dist/client/{headerSection-CBPFZoku.mjs → headerSection-uEC52ueD.mjs} +3 -3
  212. package/dist/client/hooks.mjs +1249 -841
  213. package/dist/client/{locationMap-Cx1hBg5n.mjs → locationMap-_wJDSUYe.mjs} +3 -3
  214. package/dist/client/{media-DHtSxS5V.mjs → media-BK0O3b-U.mjs} +3 -2
  215. package/dist/client/{newsletterForm-1ZL_ti9u.mjs → newsletterForm-DrArsb2B.mjs} +2 -2
  216. package/dist/client/{pricing-BIbzmV0G.mjs → pricing-BSYVghwo.mjs} +1 -1
  217. package/dist/client/{productDetail-BTh5gHBV.mjs → productDetail-Dyk90sMs.mjs} +3 -3
  218. package/dist/client/{productList-Cc7OMrqN.mjs → productList-BCKThwAI.mjs} +3 -3
  219. package/dist/client/{propsDecoder-oR-M-ISN.mjs → propsDecoder-CkXxkdSR.mjs} +96 -33
  220. package/dist/client/rendering/client.mjs +1278 -523
  221. package/dist/client/rendering/islands.mjs +19 -19
  222. package/dist/client/rendering.mjs +2308 -1028
  223. package/dist/client/{shop-CQ_YbCnn.mjs → shop-DeltVH10.mjs} +6 -6
  224. package/dist/client/{shop-commerce-BM-AoD3M.mjs → shop-commerce-BD9Jsm2Z.mjs} +6 -6
  225. package/dist/client/{shop-commerce-store-DFMQhU5p.mjs → shop-commerce-store-CmXD6FDS.mjs} +1 -1
  226. package/dist/client/{shopShared-D0SKO2Cu.mjs → shopShared-B8v-lH_F.mjs} +2 -2
  227. package/dist/client/{useDiscountCodeUi-CrG4_ARt.mjs → useDiscountCodeUi-DbWJN8ld.mjs} +1 -1
  228. package/dist/client/{useEventFilters-CxK8Fekl.mjs → useEventFilters-EJIMUnqT.mjs} +46 -69
  229. package/dist/client/{usePolling-jcVryNgZ.mjs → usePolling-Cmh14fc7.mjs} +2 -2
  230. package/dist/preview-next/before-render.mjs +213 -0
  231. package/dist/preview-next/client/runtime.mjs +4 -4
  232. package/dist/preview-next/middleware.mjs +213 -0
  233. package/dist/{previewAuthStore-BPcJPzdz.mjs → previewAuthStore-CTO7CRPk.mjs} +213 -0
  234. package/dist/{sdk-runtime-C39Rsk-x.mjs → sdk-runtime-Dou0GAav.mjs} +2 -2
  235. package/dist/{separator-BoMSQnsP.mjs → separator-CI5wZNXT.mjs} +1 -1
  236. package/dist/server/components.mjs +2370 -1132
  237. package/dist/server/config-validation.mjs +1256 -842
  238. package/dist/server/config.mjs +1256 -843
  239. package/dist/server/data.mjs +1249 -841
  240. package/dist/server/date-time.mjs +386 -0
  241. package/dist/server/index.mjs +214 -1
  242. package/dist/server/navigation.mjs +9 -3
  243. package/dist/server/next.mjs +3421 -1949
  244. package/dist/server/page-converter.mjs +1236 -659
  245. package/dist/server/prebuild.mjs +1 -1
  246. package/dist/server/rendering/server.mjs +2074 -1060
  247. package/dist/server/rendering.mjs +2370 -1132
  248. package/dist/server/routing.mjs +1543 -1062
  249. package/dist/server/server.mjs +1464 -843
  250. package/dist/server/theme-bridge.mjs +1581 -474
  251. package/dist/server/theme.mjs +614 -305
  252. package/dist/styles/index.css +12 -1
  253. package/package.json +7 -1
  254. package/dist/_dts/theme-core/src/buttons/presets/types.d.ts +0 -88
  255. package/dist/_dts/theme-core/src/buttons/utils/contrast.d.ts +0 -38
  256. package/dist/_dts/theme-core/src/palette/themePaletteCompatibility.d.ts +0 -57
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Entry scaffold emitter.
3
+ *
4
+ * Produces a MACHINE-READABLE template for a content type from its normalized
5
+ * field DSL ({@link ContentTypeSchema}): required fields are stubbed with explicit
6
+ * placeholder sentinels (`"<REQUIRED: text>"`, `"<REQUIRED: media-identifier>"`, …
7
+ * per field type, from the shared vocabulary in `sentinels.ts`), optional fields
8
+ * are omitted.
9
+ *
10
+ * The `diagnostics` list is derived from the entry-instance {@link
11
+ * validateEntryInstance} run against the emitted template, so it can never drift
12
+ * from what the validator actually rejects — plus a sentinel sweep so every
13
+ * emitted placeholder is reported even where the schema-walk can't recurse.
14
+ *
15
+ * This is NOT itself a validator: an unfilled template is not upsert-valid. The
16
+ * contract is: replace every placeholder with a valid value and `entry upsert`
17
+ * accepts the result without structural edits (enforced by the validator, used
18
+ * both here and as a CLI pre-flight).
19
+ */
20
+ import type { ContentTypeSchema } from './schema';
21
+ /** Which existing site resource a field points at (must exist before upsert). */
22
+ export type ScaffoldResourceKind = 'media' | 'file' | 'reference';
23
+ /** One required field an agent must fill before the template is upsert-valid. */
24
+ export interface EntryScaffoldDiagnostic {
25
+ /** Dotted path to the field within the entry data (e.g. `hero.cta.link`). */
26
+ path: string;
27
+ /** The field's DSL type. */
28
+ fieldType: string;
29
+ /** The site resource this field references, when applicable. */
30
+ needsResource?: ScaffoldResourceKind;
31
+ /** Short instruction for the agent. */
32
+ message: string;
33
+ }
34
+ export interface EntryScaffold {
35
+ /** Content-type key the template was generated for. */
36
+ contentType: string;
37
+ /**
38
+ * Template with required fields stubbed with placeholder sentinels and optional
39
+ * fields omitted. Replace every sentinel with a valid value before upsert.
40
+ */
41
+ template: Record<string, unknown>;
42
+ /** Required fields to fill, and which of them need existing site resources. */
43
+ diagnostics: EntryScaffoldDiagnostic[];
44
+ /**
45
+ * True when the template contains no placeholders (the type has no required
46
+ * fields) — such a template can be upserted structurally as-is.
47
+ */
48
+ ready: boolean;
49
+ }
50
+ /**
51
+ * Emit a placeholder template + diagnostics for a content type from its field DSL.
52
+ * Diagnostics come from the entry-instance validator run against the template,
53
+ * merged with a sentinel sweep so no emitted placeholder goes unreported.
54
+ */
55
+ export declare function buildEntryScaffold(input: {
56
+ key: string;
57
+ schema: ContentTypeSchema;
58
+ }): EntryScaffold;
@@ -8,11 +8,11 @@ declare const BaseContentFieldSchema: z.ZodObject<{
8
8
  number: "number";
9
9
  boolean: "boolean";
10
10
  date: "date";
11
+ url: "url";
11
12
  text: "text";
12
13
  textarea: "textarea";
13
14
  select: "select";
14
15
  link: "link";
15
- url: "url";
16
16
  file: "file";
17
17
  media: "media";
18
18
  reference: "reference";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Placeholder sentinel vocabulary — the SINGLE source of truth shared by the
3
+ * scaffold emitter and the entry-instance validator so the two can never drift.
4
+ *
5
+ * Every sentinel is a string of the closed form `"<REQUIRED: …>"`. The emitter
6
+ * produces them with {@link buildSentinel}; the validator rejects any value the
7
+ * shared {@link isPlaceholderSentinel} predicate recognizes. Both sides import
8
+ * from here, so adding a field type or changing the shape updates both at once.
9
+ */
10
+ import type { ContentFieldConfig } from './schema';
11
+ /** Leaf field types that receive a placeholder sentinel (containers recurse). */
12
+ export declare const SENTINEL_LEAF_TYPES: readonly ["text", "textarea", "richText", "number", "date", "datetime", "url", "link", "media", "file", "boolean", "select", "reference"];
13
+ export type SentinelLeafType = (typeof SENTINEL_LEAF_TYPES)[number];
14
+ /** Matches the closed sentinel shape `"<REQUIRED: …>"`. */
15
+ export declare const SENTINEL_PATTERN: RegExp;
16
+ /**
17
+ * True when a value is an unfilled placeholder sentinel. Shared by the emitter
18
+ * (self-check) and the validator (rejection) so recognition can't drift.
19
+ */
20
+ export declare function isPlaceholderSentinel(value: unknown): value is string;
21
+ /**
22
+ * The placeholder sentinel for a leaf field. Container types (group/button/
23
+ * repeater) do not have a leaf sentinel — they expand structurally — and calling
24
+ * this for them returns a generic marker only for completeness.
25
+ */
26
+ export declare function buildSentinel(field: ContentFieldConfig): string;
27
+ /** A placeholder sentinel found in entry data, with its dotted path. */
28
+ export interface UnfilledSentinel {
29
+ path: string;
30
+ value: string;
31
+ }
32
+ /**
33
+ * Deep-scan arbitrary entry data for any unfilled placeholder sentinels. Needs no
34
+ * schema, so it powers the CLI's pre-HTTP upsert pre-flight.
35
+ */
36
+ export declare function findUnfilledSentinels(data: unknown, pathPrefix?: string): UnfilledSentinel[];
@@ -38,6 +38,9 @@ type SnapshotDefaults = {
38
38
  slug?: string | null;
39
39
  };
40
40
  export declare function createSnapshotFromContentEntry<TStatus extends string = string>(data: ContentEntryLike, routing: RoutingHelpers, defaults: SnapshotDefaults, titleField?: string | null): ContentEntrySnapshot<TStatus>;
41
+ export declare function createSnapshotFromRoutableContent<TStatus extends string = string>(owner: Readonly<{
42
+ id: string;
43
+ }>, route: NonNullable<ContentEntryLike["route"]>, routing: RoutingHelpers, defaults: SnapshotDefaults): RoutableContentSnapshot<TStatus>;
41
44
  type PageRecordLike = {
42
45
  id: string;
43
46
  draftTitle?: string | null;
@@ -7,6 +7,9 @@ export * from './routeTemplate';
7
7
  export * from './definitions/canonicalizePageRouteMetadata';
8
8
  export * from './definitions/shared';
9
9
  export * from './content-types/schema';
10
+ export * from './content-types/sentinels';
11
+ export * from './content-types/entryValidation';
12
+ export * from './content-types/scaffold';
10
13
  export * from './content-types/defaults';
11
14
  export * from './content-types/builtins';
12
15
  export * from './content-types/builtin-schemas';
@@ -108,6 +108,14 @@ export declare function toScheduledBookingDateRange(input: BookingRangeFormatInp
108
108
  export declare function formatBookingInstant(isoString: string, options: BookingInstantFormatOptions): string;
109
109
  export declare function formatBookingDate(input: ScheduledBookingDateTime, format?: Intl.DateTimeFormatOptions): string;
110
110
  export declare function formatBookingTime(input: ScheduledBookingDateTime, format?: Intl.DateTimeFormatOptions): string;
111
+ /**
112
+ * Formats the compact English event-time presentation used by public surfaces.
113
+ *
114
+ * This intentionally owns the lowercase day-period token and zero-minute
115
+ * omission instead of depending on locale-specific spacing or punctuation.
116
+ * Callers must only use it for an English presentation contract.
117
+ */
118
+ export declare function formatBookingCompactEnglishTime(input: ScheduledBookingDateTime): string;
111
119
  export declare function formatBookingDateTime(input: ScheduledBookingDateTime, format?: Intl.DateTimeFormatOptions): string;
112
120
  export declare function formatBookingDateParts(input: ScheduledBookingDateRange, options?: Readonly<{
113
121
  dateFormat?: Intl.DateTimeFormatOptions;
@@ -96,6 +96,7 @@ export type BookingCalendarFeedTokenPublicId = Brand<string, 'BookingCalendarFee
96
96
  export type BookingCalendarFeedTokenSecret = Brand<string, 'BookingCalendarFeedTokenSecret'>;
97
97
  export type BookingCalendarFeedTokenSecretHash = Brand<string, 'BookingCalendarFeedTokenSecretHash'>;
98
98
  export type ContentEntryId = Brand<string, 'ContentEntryId'>;
99
+ export type ContentBlockId = Brand<string, 'ContentBlockId'>;
99
100
  export type ContentVersionId = Brand<string, 'ContentVersionId'>;
100
101
  export type EntryContentHash = Brand<string, 'EntryContentHash'>;
101
102
  export type StripeInvoiceId = Brand<string, 'StripeInvoiceId'>;
@@ -230,6 +231,7 @@ export declare const unsafeAsBookingCalendarFeedTokenPublicId: (id: string) => B
230
231
  export declare const unsafeAsBookingCalendarFeedTokenSecret: (value: string) => BookingCalendarFeedTokenSecret;
231
232
  export declare const unsafeAsBookingCalendarFeedTokenSecretHash: (value: string) => BookingCalendarFeedTokenSecretHash;
232
233
  export declare const unsafeAsContentEntryId: (id: string) => ContentEntryId;
234
+ export declare const unsafeAsContentBlockId: (id: string) => ContentBlockId;
233
235
  export declare const unsafeAsContentVersionId: (id: string) => ContentVersionId;
234
236
  export declare const unsafeAsEntryContentHash: (value: string) => EntryContentHash;
235
237
  export declare const unsafeAsStripeInvoiceId: (id: string) => StripeInvoiceId;
@@ -280,6 +282,7 @@ export declare const parseProductVariantId: (value: unknown) => Result<ProductVa
280
282
  export declare const parseProductCategoryId: (value: unknown) => Result<ProductCategoryId, BrandedIdParseError>;
281
283
  export declare const parseMediaAssetId: (value: unknown) => Result<MediaAssetId, BrandedIdParseError>;
282
284
  export declare const parseContentEntryId: (value: unknown) => Result<ContentEntryId, BrandedIdParseError>;
285
+ export declare const parseContentBlockId: (value: unknown) => Result<ContentBlockId, BrandedIdParseError>;
283
286
  export declare const parseContentVersionId: (value: unknown) => Result<ContentVersionId, BrandedIdParseError>;
284
287
  export declare const parseNavigationMenuId: (value: unknown) => Result<NavigationMenuId, BrandedIdParseError>;
285
288
  export declare const parseNavigationItemId: (value: unknown) => Result<NavigationItemId, BrandedIdParseError>;
@@ -27,6 +27,7 @@ export type EditorStructuralDraftMeta = Readonly<{
27
27
  purpose: string | null;
28
28
  orderIndex: number | null;
29
29
  publishedContent: EditorBlockValues | null;
30
+ optimisticHash: string | null;
30
31
  }>;
31
32
  export type EditorStructuralDraftSnapshot = Readonly<{
32
33
  id: EditorBlockId;
@@ -45,12 +46,14 @@ export type EditorDraftBlockInitMetaInput = Readonly<{
45
46
  purpose?: string | null;
46
47
  orderIndex?: number | null;
47
48
  publishedContent?: EditorBlockBaselineInput;
49
+ optimisticHash?: string | null;
48
50
  }>;
49
51
  export type EditorDraftBlockBaselineUpdateMetaInput = Readonly<{
50
52
  kind?: string;
51
53
  purpose?: string | null;
52
54
  orderIndex?: number | null;
53
55
  publishedContent?: EditorBlockBaselineInput;
56
+ optimisticHash?: string | null;
54
57
  }>;
55
58
  export type EditorBlockPublishedBaselineInput = Readonly<{
56
59
  id: EditorBlockId;
@@ -66,6 +69,7 @@ export type EditorPersistedBlock = Readonly<{
66
69
  publishedContent: EditorBlockValues | null;
67
70
  bindings: EditorBlockValues | null;
68
71
  purpose: string | null;
72
+ optimisticHash: string | null;
69
73
  }>;
70
74
  export type EditorInsertBlockCommand = Readonly<{
71
75
  type: 'insert-block';
@@ -0,0 +1,143 @@
1
+ import type { Brand } from './branded';
2
+ import { type Result } from './result';
3
+ export type FooterModuleId = Brand<string, 'FooterModuleId'>;
4
+ export type FooterMembershipKey = Brand<string, 'FooterMembershipKey'>;
5
+ export type FooterRichText = Readonly<Record<string, unknown>>;
6
+ export type FooterNavigationRole = 'main' | 'legal-policy';
7
+ type FooterSectionBase<TKind extends string> = Readonly<{
8
+ id: FooterModuleId;
9
+ kind: TKind;
10
+ heading: string | null;
11
+ selected: boolean;
12
+ }>;
13
+ export type FooterSection = (FooterSectionBase<'brand'> & Readonly<{
14
+ showLogo: boolean;
15
+ showTitle: boolean;
16
+ }>) | (FooterSectionBase<'navigation'> & Readonly<{
17
+ source: Readonly<{
18
+ kind: 'menu-role';
19
+ role: 'main';
20
+ }>;
21
+ }>) | (FooterSectionBase<'legal-navigation'> & Readonly<{
22
+ source: Readonly<{
23
+ kind: 'menu-role';
24
+ role: 'legal-policy';
25
+ }>;
26
+ }>) | (FooterSectionBase<'business-address'> & Readonly<{
27
+ source: Readonly<{
28
+ kind: 'business-address';
29
+ }>;
30
+ }>) | (FooterSectionBase<'contact'> & Readonly<{
31
+ source: Readonly<{
32
+ kind: 'public-profile';
33
+ }>;
34
+ }>) | (FooterSectionBase<'opening-hours'> & Readonly<{
35
+ source: Readonly<{
36
+ kind: 'public-profile';
37
+ }>;
38
+ }>) | (FooterSectionBase<'social-links'> & Readonly<{
39
+ source: Readonly<{
40
+ kind: 'public-profile';
41
+ }>;
42
+ }>) | (FooterSectionBase<'supporting-text'> & Readonly<{
43
+ content: FooterRichText | null;
44
+ }>) | (FooterSectionBase<'legal'> & Readonly<{
45
+ content: FooterRichText | null;
46
+ }>);
47
+ /** Retained as a source-compatible name while callers move from modules to sections. */
48
+ export type FooterModule = FooterSection;
49
+ export type FooterModuleKind = FooterSection['kind'];
50
+ export type FooterCompositionV1 = Readonly<{
51
+ schemaVersion: 1;
52
+ sections: readonly FooterSection[];
53
+ }>;
54
+ export type FooterCompositionError = Readonly<{
55
+ code: 'invalid_shape' | 'unsupported_schema_version' | 'invalid_section' | 'duplicate_section_id' | 'duplicate_section_kind' | 'unknown_section';
56
+ path: string;
57
+ message: string;
58
+ }>;
59
+ export type FooterLookPolicy = Readonly<{
60
+ kind: 'integrated-legal';
61
+ }> | Readonly<{
62
+ kind: 'separate-legal-region';
63
+ }>;
64
+ export type FooterVisualGroupKind = 'identity' | 'main-navigation' | 'visit' | 'legal-ending';
65
+ export type FooterColumnCount = 1 | 2 | 3 | 4;
66
+ export type FooterVisualGroup = Readonly<{
67
+ kind: FooterVisualGroupKind;
68
+ sections: readonly FooterSection[];
69
+ span: 1;
70
+ }>;
71
+ export type FooterRenderRegion = Readonly<{
72
+ kind: 'main' | 'bottom';
73
+ columns: FooterColumnCount;
74
+ groups: readonly FooterVisualGroup[];
75
+ }>;
76
+ export type FooterArrangementPlan = Readonly<{
77
+ membershipKey: FooterMembershipKey;
78
+ regions: readonly FooterRenderRegion[];
79
+ mobileGroups: readonly FooterVisualGroup[];
80
+ }>;
81
+ export type FooterRepairTarget = Readonly<{
82
+ kind: 'site-identity';
83
+ }> | Readonly<{
84
+ kind: 'navigation';
85
+ role: FooterNavigationRole;
86
+ }> | Readonly<{
87
+ kind: 'business-address';
88
+ }> | Readonly<{
89
+ kind: 'public-profile';
90
+ section: 'contact' | 'opening-hours' | 'social-links';
91
+ }> | Readonly<{
92
+ kind: 'footer-section';
93
+ sectionId: FooterModuleId;
94
+ }>;
95
+ export type ResolvedFooterSection = Readonly<{
96
+ kind: 'renderable';
97
+ section: FooterSection;
98
+ }> | Readonly<{
99
+ kind: 'missing-source';
100
+ section: FooterSection;
101
+ repairTarget: FooterRepairTarget;
102
+ }>;
103
+ export type RenderableFooterSection = Extract<ResolvedFooterSection, {
104
+ kind: 'renderable';
105
+ }>;
106
+ export type FooterSourceAvailability = Readonly<{
107
+ hasLogo: boolean;
108
+ hasMainNavigation: boolean;
109
+ hasLegalPolicyNavigation: boolean;
110
+ hasBusinessAddress: boolean;
111
+ hasContact: boolean;
112
+ hasOpeningHours: boolean;
113
+ hasSocialLinks: boolean;
114
+ }>;
115
+ export declare function unsafeAsFooterModuleId(value: string): FooterModuleId;
116
+ export declare function parseFooterModuleId(value: unknown): Result<FooterModuleId, FooterCompositionError>;
117
+ export declare function validateFooterComposition(composition: FooterCompositionV1): Result<FooterCompositionV1, FooterCompositionError>;
118
+ export declare function parseFooterCompositionV1(value: unknown): Result<FooterCompositionV1, FooterCompositionError>;
119
+ /**
120
+ * Bounded pre-production upgrader for the placement-shaped V1 that never reached production.
121
+ * It is intentionally not called by the runtime parser.
122
+ */
123
+ export declare function upgradePlacementFooterCompositionV1(value: unknown): Result<FooterCompositionV1, FooterCompositionError>;
124
+ export declare function setFooterSectionSelected(composition: FooterCompositionV1, sectionId: FooterModuleId, selected: boolean): Result<FooterCompositionV1, FooterCompositionError>;
125
+ export declare function resolveFooterSections(composition: FooterCompositionV1, availability: FooterSourceAvailability): readonly ResolvedFooterSection[];
126
+ export declare function planFooterArrangement(renderableSections: readonly RenderableFooterSection[], policy: FooterLookPolicy): FooterArrangementPlan;
127
+ export type FooterEditorOverviewItem = Readonly<{
128
+ section: FooterSection;
129
+ status: 'selected' | 'available';
130
+ }>;
131
+ export declare function deriveFooterEditorOverview(composition: FooterCompositionV1): Readonly<{
132
+ selected: readonly FooterEditorOverviewItem[];
133
+ available: readonly FooterEditorOverviewItem[];
134
+ }>;
135
+ type LegacyFooterNormalizationOptions = Readonly<{
136
+ brand?: Readonly<{
137
+ showLogo: boolean;
138
+ showTitle: boolean;
139
+ }>;
140
+ footerVisible?: boolean;
141
+ }>;
142
+ export declare function normalizeLegacyFooterContentToV1(value: unknown, options?: LegacyFooterNormalizationOptions): Result<FooterCompositionV1, FooterCompositionError>;
143
+ export {};
@@ -29,6 +29,8 @@ export * from './assertNever';
29
29
  export * from './participants';
30
30
  export * from './participant-identity';
31
31
  export * from './public-url-validation';
32
+ export * from './public-profile';
33
+ export * from './footer-composition';
32
34
  export * from './number-input';
33
35
  export * from './field-errors';
34
36
  export * from './form-submission-preview';
@@ -0,0 +1,73 @@
1
+ import type { Brand } from './branded';
2
+ import { type Result } from './result';
3
+ export type PublicProfileTimeZone = Brand<string, 'PublicProfileTimeZone'>;
4
+ export type OpeningHoursTime = Brand<string, 'OpeningHoursTime'>;
5
+ export type PublicSocialLinkId = Brand<string, 'PublicSocialLinkId'>;
6
+ export declare const publicProfileWeekdays: readonly ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"];
7
+ export type PublicProfileWeekday = (typeof publicProfileWeekdays)[number];
8
+ export declare const knownSocialPlatforms: readonly ["facebook", "instagram", "linkedin", "tiktok", "x", "youtube"];
9
+ export type KnownSocialPlatform = (typeof knownSocialPlatforms)[number];
10
+ export type PublicContactDetails = Readonly<{
11
+ kind: 'phone';
12
+ phone: string;
13
+ email: null;
14
+ }> | Readonly<{
15
+ kind: 'email';
16
+ phone: null;
17
+ email: string;
18
+ }> | Readonly<{
19
+ kind: 'phone-and-email';
20
+ phone: string;
21
+ email: string;
22
+ }>;
23
+ export type OpeningHoursInterval = Readonly<{
24
+ opensAt: OpeningHoursTime;
25
+ closesAt: OpeningHoursTime;
26
+ }>;
27
+ export type OpeningHoursDay = Readonly<{
28
+ kind: 'closed';
29
+ weekday: PublicProfileWeekday;
30
+ }> | Readonly<{
31
+ kind: 'open';
32
+ weekday: PublicProfileWeekday;
33
+ intervals: readonly [OpeningHoursInterval, ...OpeningHoursInterval[]];
34
+ }>;
35
+ export type WeeklyOpeningHours = Readonly<{
36
+ timeZone: PublicProfileTimeZone;
37
+ days: readonly [
38
+ OpeningHoursDay,
39
+ OpeningHoursDay,
40
+ OpeningHoursDay,
41
+ OpeningHoursDay,
42
+ OpeningHoursDay,
43
+ OpeningHoursDay,
44
+ OpeningHoursDay
45
+ ];
46
+ }>;
47
+ export type PublicSocialLink = Readonly<{
48
+ id: PublicSocialLinkId;
49
+ kind: 'known';
50
+ platform: KnownSocialPlatform;
51
+ url: string;
52
+ }> | Readonly<{
53
+ id: PublicSocialLinkId;
54
+ kind: 'custom';
55
+ label: string;
56
+ url: string;
57
+ }>;
58
+ export type PublicProfile = Readonly<{
59
+ contact: PublicContactDetails | null;
60
+ openingHours: WeeklyOpeningHours | null;
61
+ socialLinks: readonly PublicSocialLink[];
62
+ }>;
63
+ export type PublicProfileParseError = Readonly<{
64
+ code: 'invalid_shape' | 'contact_method_required' | 'invalid_email' | 'invalid_phone' | 'invalid_timezone' | 'invalid_weekdays' | 'invalid_time' | 'invalid_interval' | 'overlapping_intervals' | 'invalid_social_link' | 'duplicate_social_link_id';
65
+ path: string;
66
+ message: string;
67
+ }>;
68
+ export declare function parsePublicContactDetails(value: unknown): Result<PublicContactDetails, PublicProfileParseError>;
69
+ export declare function parsePublicProfileTimeZone(value: unknown): Result<PublicProfileTimeZone, PublicProfileParseError>;
70
+ export declare function parseWeeklyOpeningHours(value: unknown): Result<WeeklyOpeningHours, PublicProfileParseError>;
71
+ export declare function parsePublicSocialLinks(value: unknown): Result<readonly PublicSocialLink[], PublicProfileParseError>;
72
+ export declare function parsePublicProfile(value: unknown): Result<PublicProfile, PublicProfileParseError>;
73
+ export declare function emptyPublicProfile(): PublicProfile;