@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
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { $ as idleEditorTransactionQueueState, $a as eventButtonVariantSchema, $c as generateInteractiveChildInheritanceCSS, $d as ImageUp, $i as LABEL_FONT_SIZE_MAP, $l as Dialog, $n as eventListingBlockDefinition, $o as defineInteractiveIslandMetaKeys, $r as footerBottomTextFragment, $s as ChevronDownIcon, $t as getPageDesignEditorState, $u as formatBookingTime, Aa as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, Ac as resolveMediaNodeResponsiveImage, Ad as Upload, Af as __commonJSMin, Ai as normalEditorCuratedPromotedFieldPaths, Al as Textarea, An as getBlockDefinition, Ao as buildGoogleMapsDirectionsUrl, Ar as buildShopInteractiveIslandProps, As as parseBlockIconValue, At as unsafeAsLinkedContentEntryId, Au as __spreadArray, Ba as isSemanticSpacing, Bc as resolveMediaTransformForAspect, Bd as Settings, Bi as pageDesignEditorBackgroundOverrideOwner, Bl as Popover, Bn as mediaTransforms, Bo as getCardOrientation, Br as deriveCommerceCheckoutState, Bs as inlineTextToPlainText, Bt as usePalette, Bu as cva, Ca as generateCssVars, Cc as MediaPlaceholder, Cd as unsafeAsPassId, Cf as ChevronLeft, Ci as readHeaderNavFontSizePreference, Cl as unmapValueFromSelect, Cn as isKeyboardEvent, Co as normalizeBoxStylesCardVariant, Cr as resolveEventRegistrationScopedEvents, Cs as resolveFeatureCardGeneratedIconSizePx, Ct as useOptionalEditorUiStoreInstance, Cu as DropdownMenuTrigger, Dc as renderAudio, Dd as ok$3, Df as ArrowUp, Di as compileEditorModelRuntime, Dl as TooltipContent, Dn as isSupportedLoaderEndpoint, Do as resolveTokenOrCssColorValue, Dr as buildCheckoutInteractiveIslandProps, Ds as buildGeneratedBlockIconRenderAssetLookupFromUnknown, Dt as pushHistoryEntry, Du as __generator, Ea as ctaButton, Ec as getCurrentResolveImageUrlContext, Ed as err$2, Ef as Box, Ei as applyCompiledRuntimeFieldsToContent, El as Tooltip, En as useUniqueId, Eo as resolveOnColorForThemeToken, Er as buildCartInteractiveIslandProps, Es as toFeatureCardIconSuggestionInputs, Et as createHistoryState, Eu as __extends, Fa as normalizeOfferingsPreviewItemLimit, Fc as attachRenderableMediaAssetFields, Fi as designRuntimeRulesForTheme, Fl as SelectTrigger, Fn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Fo as formatEventDateParts, Fr as formatCommercePrice, Fs as createRichTextDocFromMarkdown, Ft as createSnapshotFromPageRecord, Fu as useControllableState, Ga as getEventRuntimeFiltersKey, Gc as siblingPath$1, Gd as Pencil, Gi as NAV_LINK_BORDER_RADIUS_MAP, Gl as TabsContent, Gn as isInternalResolvedLinkValue, Go as getEventAvailability, Gr as augmentManifestWithStyleGroups, Gs as SEMANTIC_ICON_DEFINITIONS, Gt as createManifestFormAdapter, Gu as createEditorRemoveBlockCommand, Ha as buildEventRuntimeFilters, Hc as getDirectImageUrlForMediaAsset, Hd as RotateCcw, Hi as getComponentShadowVar, Hl as PopoverTrigger, Hn as uiTransforms, Ho as groupEventsByDate, Hr as productItemKey, Hs as parseInlineTextFromUnknown, Ht as unfinishedBlockCopy, Hu as cn$1, Ia as resolveOfferingsPreviewCoursePath, Ic as isRotationDimensionSwap, Id as Star, Ii as getCuratedSiteStyle, Il as SelectValue, In as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Io as formatEventPrice, Ir as formatInterval, Is as unwrapRichTextRoot, Iu as createContextScope, Ja as normalizeCsvIds, Jc as AFFORDANCE_SUPPRESS_CLASS, Ji as NAV_LINK_PADDING_X_MAP, Jl as Content$1, Jn as shopBlockDefinition, Jo as getLocalMinuteOfDay, Jr as cardFragment, Js as ArrowDownIcon, Jt as evaluateVisibility, Ju as unsafeAsEditorBlockValues, Ka as resolveEventCalendarListPageSize, Ki as NAV_LINK_LETTER_SPACING_MAP, Kl as TabsList, Kn as ImageResolveContextProvider, Ko as getEventAvailabilityStatus, Kr as richTextFragment, Ks as getSemanticIconComponent, Ku as createEditorReorderBlocksCommand, La as resolveOfferingsPreviewGroupCta, Lc as normalizeRightAngle, Ld as Sparkles, Li as surfaceResolutionContextFromTheme, Ll as Label, Ln as planSiteOverlayHeaderClearance, Lo as formatEventPriceDisplay, Lr as EMPTY_COMMERCE_CART_STATE, Ls as isObjectRecord, Lu as composeEventHandlers, Ma as inferLegacyOfferingsPreviewGroupOrder, Mc as setContextResolveImageUrlContext, Mf as __toESM, Mi as resolveVisiblePromotedFieldPathsForEditorBlock, Ml as Select, Mn as projectRecurringSchedule, Mo as toLocationMapHydrationProps, Mr as buildCartDisplay, Ms as parseGeneratedIconAssetId, Mu as useId$1, Na as isOfferingsPreviewSourceKey, Nc as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, Nd as Trash2, Ni as componentRuntimeRulesForTheme, Nl as SelectContent, Nn as siteFooterManifest, No as formatDate$3, Nr as buildProductCardDisplay, Ns as parseGeneratedIconSetId, Nt as useDebouncedLatestSave, Nu as useDirection, Oc as renderVideo, Od as lucide_react_exports, Of as ArrowDown, Oi as retargetCompiledBoundaryRuntimeForContentAdjacency, Ol as TooltipProvider, On as gradientToCss, Oo as getTextColorForBackground, Or as buildProductDetailInteractiveIslandProps, Os as getBlockIconSemanticId, Ot as redoHistory, Ou as __read, Pa as normalizeOfferingsPreviewGroupOrder, Pc as resolveMediaSlotContract, Pd as Ticket, Pl as SelectItem, Pn as siteHeaderManifest, Po as formatEventCompactDateRail, Pr as buildProductDetailDisplay, Ps as parseSiteIconStyleGuideVersionId, Pt as createRoutingHelpers, Pu as createCollection, Q as enqueueTransaction, Qa as columnOptionSchema, Qc as generateBaseInteractiveCSS, Qd as Image, Qi as INPUT_SPACING_MAP, Ql as ScrollableDialogContent, Qn as buildNewsletterFormInteractiveIslandProps, Qo as createInteractiveIslandCodec, Qr as singleButtonFragment, Qs as CheckIcon$1, Qt as applyPageDesignEditorAction, Qu as formatBookingInstant, Ra as resolveOfferingsPreviewGroupOrderEntries, Rc as formatAspectRatioToken, Ri as isThemeV2NormalEditorRawStyleFieldName, Rl as Badge, Rn as visibleHeaderClearancePx, Ro as formatEventTeacherLine, Rr as buildPassCartItem, Rs as isRecord$21, Ru as Primitive, Sa as expandPalette, Sc as ImagePresets, Sd as unsafeAsMediaAssetId, Sf as ChevronRight, Si as mergeHeaderNavTypographyPreference, Sl as mapOptionValueForSelect, Sn as CSS, So as generateShadowValue, Sr as normalizeEventRegistrationPageSurfaceSubject, Ss as parseFeatureCardGeneratedIconSizePx, St as useEditorUiStoreInstance, Su as DropdownMenuSeparator, Ta as runTransforms, Tc as computeMediaTransformStyle, Td as unsafeAsPositiveSeconds, Tf as Check, Ti as PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, Tl as useField, Tn as useIsomorphicLayoutEffect, To as isCssColorLiteral, Tr as cartBlockDefinition, Ts as suggestSemanticIconForFeatureCard, Tt as canUndoHistory, Tu as __awaiter, Ua as eventListPaginationActionSchema, Uc as getImageUrl, Ui as parseBlockCustomCssRules, Ul as Input, Un as formattingTransforms, Uo as resolveEventCta, Ur as reduceCommerceCart, Us as isIconPickerPreset, Ut as validateBlockManifestIssues, Uu as clsx, Va as resolveSpacing, Vc as asRecord, Vd as Search, Vi as getComponentBorderWidthPx, Vl as PopoverContent, Vn as layoutTransforms, Vo as getContainerClass, Vr as parseStoredCommerceCartState, Vs as isInlineTextEmpty, Vt as recoveryConflictCopy, Vu as useComposedRefs, Wa as eventPageSizeSchema, Wc as getAtPath, Wd as Plus, Wi as parseCustomCssRules, Wl as Tabs, Wn as createManifestValidator, Wo as resolveEventLinkProps, Wr as augmentManifest, Ws as resolveIconPickerPreset, Wt as ManifestForm, Wu as createEditorInsertBlockCommand, X as confirmAutosaveBatch, Xa as normalizeOptionalId, Xc as generateEffectsCSS, Xi as FONT_WEIGHT_MAP, Xl as Root2$1, Xn as productDetailBlockDefinition, Xo as blockBookingPaymentTermsSchema, Xr as faqHeadingFragment, Xs as ArrowRightIcon, Xt as listContentTypes, Xu as formatBookingDate, Y as beginAutosaveBatch, Ya as normalizeCsvString, Yc as generateButtonCss, Yd as Minus, Yi as NAV_LINK_TEXT_SIZE_MAP, Yl as List, Yn as productListBlockDefinition, Yo as resolveRuntimeEventPricing, Yr as faqAccordionFragment, Ys as ArrowLeftIcon, Yt as createStoreBackend, Yu as addLocalScheduleDays, Z as deriveTransactionCapabilities, Za as calendarTabViewsSchema, Zc as generateShadowValue$1, Zd as LoaderCircle, Zi as INPUT_FONT_SIZE_MAP, Zl as Trigger$1, Zn as newsletterSignupBlockDefinition, Zo as buildInteractiveIslandProps, Zr as blogFeaturedPostFragment, Zs as CalendarIcon$1, Zt as toRoutableLinkPayload, Zu as formatBookingDateTime, _c as PlayIcon, _d as parseSiteId, _f as CircleMinus, _i as BACKGROUND_POSITION_PRESET_VALUES, _l as useBlockContext, _n as useDndContext, _o as normalizeEventSurfacePresetsCsv, _r as getWizardStepsForContext$1, _s as mediaSchema, _t as EntryControllerProvider, aa as boundaryRuntimeMetricsForTransition, ac as ClockIcon$1, ad as toScheduledBookingDateTime, af as FileSpreadsheet, ai as heroCtaRowFragment, al as cssVarValue, an as mutateBlockContent, ao as eventCalendarListLayoutCompatibleDisplayModeValues, ar as formBlockDefinition, as as markEditableSurfaceForwarding, at as PreviewTextEditor, au as DialogTitle, bc as UploadIcon, bd as unsafeAsCustomerPassId, bf as ChevronsUpDown, bi as resolveSurfaceForegroundStyles, bl as hasEmptyOption, bn as useSensor, bo as publicEventSchema, br as courseRegistrationBlockDefinition, bs as createFeatureCardIconKey, bu as DropdownMenuItem, ca as sectionTransitionFamilyForBoundaryOptionId, cc as FileArchiveIcon, cd as publicEventPricingCurrency, cf as FileArchive, ci as bodyCopyFragment, cl as textColorStyle, cn as decodePublicProductCategorySelectorQuery, co as when, cr as buildEventRegistrationInteractiveIslandProps, cs as asDesignBlockId, ct as RichTextEditorSurface, da as backgroundAppearanceColorTokenNames, dc as FileTextIcon, dd as publicEventScalarPrice, df as EllipsisVertical, di as siteOptionSources, dl as surfaceForegroundValue, dn as AMBIENT_BACKGROUND_ROLES$1, do as eventScheduleScopeValues, dr as findPreSelectedEvent, ds as ACCORDION_SPACING_MAP, dt as InlineTextEditor, du as Trigger, ec as ChevronLeftIcon, ed as formatLocalScheduleDate, ef as ImagePlus, ei as formEmbedFragment, el as TokenResolver, en as createBlock, eo as eventCalendarDefaultViewSchema, er as buildEventListingInteractiveIslandProps, es as createZodCodec, et as rejectAutosaveBatch, eu as DialogClose, fa as backgroundAppearanceQuickColorTokenNames, fc as InfoIcon, fd as publicEventTicketTypes, ff as Crop, fi as MQ_LG_UP, fl as useBackendWatch, fn as DndContext, fo as eventSurfaceScopeValues, fr as resolveDiscountContext, fs as ACCORDION_TRIGGER_FONT_SCALE, ft as EditorProvider, fu as createCollapsibleScope, g as PreviewDesignCoordinatorProvider, gc as PhoneIcon, gd as parseMediaAssetId, gf as CirclePlus, gi as MQ_TABLET_ONLY, gl as isNonEmptyValue, gn as getClientRect, go as normalizeEventStaffMemberId, gr as getStepNumber$1, gs as PUBLIC_DOWNLOAD_MEDIA_TYPES, gt as EditableBlockProvider, gu as CardTitle, ha as defaultThemeTokens, hc as MinusIcon, hd as expectParsedBrandedId, hf as Clock3, hi as MQ_SM_UP, hl as isHeaderField, hn as closestCenter, ho as normalizeEventScheduleScope, hr as WIZARD_STEPS$1, hs as ICON_SIZE_PX, ht as useUISelector, hu as CardHeader, i as usePreviewDesignHistoryOrder, ic as CirclePlusIcon, id as toBookingTimeZone, if as FileText, ii as ctaCopyFragment, il as borderColorStyle, io as weekStartSchema, ir as buildEventCalendarListingRender, is as composeHeaderSectionWrapperClassName, it as PreviewInlineTextEditor, iu as DialogHeader, ja as buildOfferingsPreviewRenderStates, jc as resolveMediaStorageUrl, jf as __exportAll, ji as planPageDesignLayoutLookCompatibility, jl as Slider, jn as listBlockDescriptors, jo as normalizeLocationMapProps, jr as getShopDisplayForItems, js as resolveBlockIconRenderValue, jt as recordsEqual, ju as __spreadArrays, kc as resolveImageUrlWithContext, kd as X, kf as Archive, ki as retargetCompiledRuntimeFieldsForContentAdjacency, kl as TooltipTrigger, kn as GRADIENT_PRESETS, ko as featuresFromHex, kr as buildProductListInteractiveIslandProps, ks as getGeneratedBlockIconStyleState, kt as undoHistory, ku as __rest, la as sectionTransitionVariantForBoundaryOptionId, lc as FileAudioIcon, ld as publicEventPricingMode, li as defineFragment, ll as DEFAULT_SURFACE_TEXT_COLOR, ln as DEFAULT_LAUNCH_READINESS_INPUT, lo as bindingSchema, lr as toRegistrationEvents, ls as assertNever$6, lt as getRichTextImagePositionFromTarget, lu as Content, ma as parseBackgroundAppearanceColorToken, mc as MapPinIcon$1, md as assertNever$5, mf as Copy, mi as MQ_SM_DOWN, ml as getModalConfig, mn as PointerSensor, mo as normalizeEventCategoryIdsCsv, mr as resolveRegistrationTarget, ms as ICON_CONFIG, mu as CardContent, n as useSiteChromeCustomizeOptional, nc as ChevronUpIcon, nd as parseBookingLocalDate, nf as GripVertical, ni as testimonialsCarouselFragment, nl as themeButtonClassName, nn as deleteBlock, no as filterAutoShowSchema, nr as buildEventCalendarInteractiveIslandProps, ns as defineProgressiveBlockRuntime, nt as resolvePreviewSidebarTab, nu as DialogDescription, oa as defaultSectionTransitionVariantForFamily, oc as DownloadIcon, od as parseEventPageSurfaceSubject, of as FilePlay, oi as ctaRowFragment, ol as mergeStyles, on as reorderBlocks, oo as eventCalendarListLayoutOptions, or as buildFormInteractiveIslandProps, os as splitPositioningClasses, ot as useRichTextEditor, ou as Collapsible, pa as foregroundTokenForBackgroundAppearanceColorToken, pc as MailIcon, pd as formatCurrencyAmount, pf as CreditCard, pi as MQ_MD_DOWN, pl as getFieldIntent, pn as KeyboardCode, po as normalizeEventBlockKind, pr as resolveEventRequiresPayment, ps as ACCORDION_TRIGGER_LETTER_SPACING, pt as useEditor, pu as Card, qa as resolveEventListPaginationAction, qi as NAV_LINK_PADDING_MAP, ql as TabsTrigger, qn as useImageResolveContextOptional, qo as getLocalDateKey, qr as headingFragment, qs as isSemanticIconId, qt as FormRenderer, qu as unsafeAsEditorBlockId, r as PreviewDesignHistoryOrderProvider, rc as CircleMinusIcon, rd as resolveBookingTimeZoneId, rf as File, ri as testimonialsHeadingFragment, rl as backgroundColorStyle, rn as deleteEntrySlotBlock, ro as previewStageSchema, rr as buildEventCalendarListingDisplay, rt as PreviewRichTextEditor, ru as DialogFooter, sa as sectionTransitionFamilies, sc as ExternalLinkIcon, sd as formatBookingPriceDisplay, sf as FileHeadphone, si as heroCopyFragment, sl as rgbColorValue, sn as reorderEntrySlotBlocks, so as el, sr as eventRegistrationBlockDefinition, ss as planSiteChromePlacement, st as EMPTY_DOC, su as CollapsibleContent, t as SiteChromeCustomizeProvider, tc as ChevronRightIcon, td as getBookingLocalDateKey, tf as ImageOff, ti as formCopyFragment, tl as parseThemeButtonVariantId, tn as createEntrySlotBlock, to as eventLayoutSchema, tr as eventCalendarBlockDefinition, ts as defineClientOwnedBlockRuntime, tu as DialogContent, ua as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, uc as FileSpreadsheetIcon, ud as publicEventPricingType, uf as EyeOff, ui as PUBLIC_FILE_FIELD_KINDS, ul as surfaceForegroundDeclarations, un as deriveLaunchReadiness, uo as eventBlockKindValues, ur as findEventByOccurrenceId, us as ACCORDION_OPEN_ACCENT_THICKNESS, ut as insertOrReplaceRichTextImage, uu as Root, v as PreviewThemeOverlayProvider, vc as PlusIcon, vd as unsafeAsAppointmentResourceId, vf as CircleCheck, vi as getAnchorClasses, vl as SdkConfigProvider, vn as useDraggable, vo as normalizeEventSurfaceScope, vr as giftingBlockDefinition, vs as FEATURE_CARD_GENERATED_ICON_SIZE_PX, vu as DropdownMenu, wa as createTransformRegistry, wc as buildResolveImageUrlContext, wd as unsafeAsPositiveByteCount$1, wf as ChevronDown, wi as formatSiteChromeBackgroundTokenLabel, wl as FieldFrame, wn as useCombinedRefs, wo as normalizeCardVariantRole, wr as checkoutBlockDefinition, ws as shouldReserveFeatureCardIconZone, wt as canRedoHistory, wu as __assign, xc as XIcon, xd as unsafeAsFormId, xf as ChevronUp, xi as resolveBackgroundColorValue, xl as mapCurrentValueForSelect, xn as useSensors, xo as generateCardCss, xr as buildCourseRegistrationInteractiveIslandProps, xs as getFeatureCardIconCompletion, xt as useEditorUiStore, y as usePreviewThemeOverlay, yc as ShoppingCartIcon, yd as unsafeAsAppointmentServiceId, yf as CircleAlert, yi as boxStylesTransforms, yl as useSdkConfig, yn as useDroppable, yo as normalizeEventVenueId, yr as buildGiftingInteractiveIslandProps, ys as FEATURE_CARD_ICON_TREATMENTS, yt as useEntryEditorController, yu as DropdownMenuContent, za as resolveOfferingsPreviewGroups, zc as parseAspectRatioValue, zi as isThemeV2NormalEditorRawStylePath, zn as contentTransforms, zo as formatTime$3, zr as buildProductCartItem, zs as coerceInlineTextWithFallback, zt as PaletteProvider, zu as Button } from "./SiteChromeCustomizeContext-C_sizso-.mjs";
3
- import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-D0tnKl0t.mjs";
4
- import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, l as ApiEnvelopeError, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-BPcJPzdz.mjs";
2
+ import { $ as beginAutosaveBatch, $a as eventPageSizeSchema, $c as getImageUrl, $i as NAV_LINK_PADDING_X_MAP, $l as Popover, $n as useImageResolveContextOptional, $o as resolveEventLinkProps, $r as headingFragment, $s as resolveIconPickerPreset, $t as evaluateVisibility, $u as cva, Ac as XIcon, Ad as parseMediaAssetId, Af as CirclePlus, Ai as formatSiteChromeBackgroundTokenLabel, Al as useBlockContext, An as CSS, Ao as normalizeEventVenueId, Ar as checkoutBlockDefinition, As as getFeatureCardIconCompletion, At as canUndoHistory, Ba as buildOfferingsPreviewRenderStates, Bc as resolveMediaNodeResponsiveImage, Bd as err$2, Bf as ArrowUp, Bi as designRuntimeRulesForTheme, Bl as TooltipContent, Bn as siteHeaderManifest, Bo as normalizeLocationMapProps, Br as buildProductDetailDisplay, Bs as resolveBlockIconRenderValue, Bt as createSnapshotFromPageRecord, Bu as __generator, C as usePreviewThemeOverlay, Ca as foregroundTokenForBackgroundAppearanceColorToken, Cc as MapPinIcon$1, Cd as publicEventPricingMode, Ci as BACKGROUND_POSITION_PRESET_VALUES, Cl as surfaceForegroundDeclarations, Cn as closestCenter, Co as eventSurfaceScopeValues, Cr as getWizardStepsForContext$1, Cs as ICON_CONFIG, Cu as Root, Dc as PlusIcon, Dd as formatCurrencyAmount, Df as CreditCard, Di as resolveBackgroundColorValue, Dl as getModalConfig, Dn as useDroppable, Do as normalizeEventStaffMemberId, Dr as buildCourseRegistrationInteractiveIslandProps, Ds as FEATURE_CARD_GENERATED_ICON_SIZE_PX, Dt as useEditorUiStoreInstance, Du as CardContent, Ec as PlayIcon, Ed as publicEventTicketTypes, Ef as Crop, Ei as resolveSurfaceForegroundStyles, El as getFieldIntent, En as useDraggable, Eo as normalizeEventScheduleScope, Er as courseRegistrationBlockDefinition, Es as mediaSchema, Et as useEditorUiStore, Eu as Card, Fa as ctaButton, Fc as computeMediaTransformStyle, Fd as unsafeAsFormId, Ff as ChevronRight, Fi as normalEditorCuratedPromotedFieldPaths, Fl as mapOptionValueForSelect, Fn as isSupportedLoaderEndpoint, Fo as normalizeCardVariantRole, Fr as buildProductListInteractiveIslandProps, Fs as toFeatureCardIconSuggestionInputs, Ft as unsafeAsLinkedContentEntryId, Fu as DropdownMenuSeparator, Ga as resolveOfferingsPreviewCoursePath, Gc as attachRenderableMediaAssetFields, Gf as __toESM, Gi as pageDesignEditorBackgroundOverrideOwner, Gl as Select, Gn as contentTransforms, Go as formatEventPrice, Gr as buildProductCartItem, Gs as unwrapRichTextRoot, Gt as usePalette, Gu as useId$1, Ha as isOfferingsPreviewSourceKey, Hc as setContextResolveImageUrlContext, Hd as lucide_react_exports, Hf as Archive, Hi as surfaceResolutionContextFromTheme, Hl as TooltipTrigger, Hn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Ho as formatDate$3, Hr as formatInterval, Hs as parseGeneratedIconSetId, Hu as __rest, Ic as getCurrentResolveImageUrlContext, Id as unsafeAsMediaAssetId, If as ChevronLeft, Ii as planPageDesignLayoutLookCompatibility, Il as unmapValueFromSelect, In as getBlockDefinition, Io as isCssColorLiteral, Ir as buildShopInteractiveIslandProps, Is as buildGeneratedBlockIconRenderAssetLookupFromUnknown, It as recordsEqual, Iu as DropdownMenuTrigger, Ja as resolveOfferingsPreviewGroups, Jc as formatAspectRatioToken, Jd as Ticket, Ji as parseBlockCustomCssRules, Jl as SelectTrigger, Jn as uiTransforms, Jo as formatTime$3, Jr as productItemKey, Js as coerceInlineTextWithFallback, Jt as validateBlockManifestIssues, Ju as useControllableState, Ka as resolveOfferingsPreviewGroupCta, Kc as isRotationDimensionSwap, Ki as getComponentBorderWidthPx, Kl as SelectContent, Kn as mediaTransforms, Ko as formatEventPriceDisplay, Kr as deriveCommerceCheckoutState, Ks as isObjectRecord, Kt as recoveryConflictCopy, Ku as useDirection, Lc as renderAudio, Ld as unsafeAsPassId, Lf as ChevronDown, Li as resolveVisiblePromotedFieldPathsForEditorBlock, Ll as FieldFrame, Ln as listBlockDescriptors, Lo as resolveOnColorForThemeToken, Lr as getShopDisplayForItems, Ls as getBlockIconSemanticId, Lu as __assign, Ma as generateCssVars, Mc as ImagePresets, Md as unsafeAsAppointmentResourceId, Mf as CircleCheck, Mi as compileEditorModelRuntime, Ml as useSdkConfig, Mn as useCombinedRefs, Mo as generateCardCss, Mr as buildCartInteractiveIslandProps, Ms as resolveFeatureCardGeneratedIconSizePx, Mt as pushHistoryEntry, Mu as DropdownMenuContent, Na as createTransformRegistry, Nc as MediaPlaceholder, Nd as unsafeAsAppointmentServiceId, Nf as CircleAlert, Ni as retargetCompiledBoundaryRuntimeForContentAdjacency, Nl as hasEmptyOption, Nn as useIsomorphicLayoutEffect, No as generateShadowValue, Nr as buildCheckoutInteractiveIslandProps, Ns as shouldReserveFeatureCardIconZone, Nt as redoHistory, Nu as DropdownMenuItem, Oc as ShoppingCartIcon, Od as assertNever$5, Of as Copy, Oi as mergeHeaderNavTypographyPreference, Ol as isHeaderField, On as useSensor, Oo as normalizeEventSurfacePresetsCsv, Or as normalizeEventRegistrationPageSurfaceSubject, Os as FEATURE_CARD_ICON_TREATMENTS, Ot as useOptionalEditorUiStoreInstance, Ou as CardHeader, Pa as runTransforms, Pc as buildResolveImageUrlContext, Pd as unsafeAsCustomerPassId, Pf as ChevronsUpDown, Pi as retargetCompiledRuntimeFieldsForContentAdjacency, Pl as mapCurrentValueForSelect, Pn as useUniqueId, Po as normalizeBoxStylesCardVariant, Pr as buildProductDetailInteractiveIslandProps, Ps as suggestSemanticIconForFeatureCard, Pt as undoHistory, Qa as eventListPaginationActionSchema, Qc as getDirectImageUrlForMediaAsset, Qi as NAV_LINK_PADDING_MAP, Qn as ImageResolveContextProvider, Qo as resolveEventCta, Qr as richTextFragment, Qs as isIconPickerPreset, Qt as FormRenderer, Qu as Button, Rc as renderVideo, Rd as unsafeAsPositiveByteCount$1, Rf as Check, Ri as componentRuntimeRulesForTheme, Rl as useField, Rn as projectRecurringSchedule, Ro as resolveTokenOrCssColorValue, Rr as buildCartDisplay, Rs as getGeneratedBlockIconStyleState, Rt as useDebouncedLatestSave, Ru as __awaiter, S as PreviewThemeOverlayProvider, Sa as backgroundAppearanceQuickColorTokenNames, Sc as MailIcon, Sd as publicEventPricingCurrency, Sf as FileArchive, Si as MQ_TABLET_ONLY, Sl as DEFAULT_SURFACE_TEXT_COLOR, Sn as PointerSensor, So as eventScheduleScopeValues, Sr as getStepNumber$1, Ss as ACCORDION_TRIGGER_LETTER_SPACING, St as EntryControllerProvider, Su as Content, Ta as defaultThemeTokens, Tc as PhoneIcon, Td as publicEventScalarPrice, Tf as EllipsisVertical, Ti as boxStylesTransforms, Tl as useBackendWatch, Tn as useDndContext, To as normalizeEventCategoryIdsCsv, Tr as buildGiftingInteractiveIslandProps, Ts as PUBLIC_DOWNLOAD_MEDIA_TYPES, Tu as createCollapsibleScope, Ua as normalizeOfferingsPreviewGroupOrder, Uc as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, Ud as X, Uf as __commonJSMin, Ui as isThemeV2NormalEditorRawStyleFieldName, Ul as Textarea, Un as planSiteOverlayHeaderClearance, Uo as formatEventCompactDateRail, Ur as EMPTY_COMMERCE_CART_STATE, Us as parseSiteIconStyleGuideVersionId, Uu as __spreadArray, Va as inferLegacyOfferingsPreviewGroupOrder, Vc as resolveMediaStorageUrl, Vd as ok$3, Vf as ArrowDown, Vi as getCuratedSiteStyle, Vl as TooltipProvider, Vn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Vo as toLocationMapHydrationProps, Vr as formatCommercePrice, Vs as parseGeneratedIconAssetId, Vu as __read, Wa as normalizeOfferingsPreviewItemLimit, Wc as resolveMediaSlotContract, Wd as Upload, Wf as __exportAll, Wi as isThemeV2NormalEditorRawStylePath, Wl as Slider, Wn as visibleHeaderClearancePx, Wo as formatEventDateParts, Wr as buildPassCartItem, Ws as createRichTextDocFromMarkdown, Wt as PaletteProvider, Wu as __spreadArrays, Xa as resolveSpacing, Xc as resolveMediaTransformForAspect, Xd as Star, Xi as NAV_LINK_BORDER_RADIUS_MAP, Xl as Label, Xn as createManifestValidator, Xo as getContainerClass, Xr as augmentManifest, Xs as isInlineTextEmpty, Xt as createManifestFormAdapter, Xu as composeEventHandlers, Ya as isSemanticSpacing, Yc as parseAspectRatioValue, Yi as parseCustomCssRules, Yl as SelectValue, Yn as formattingTransforms, Yo as getCardOrientation, Yr as reduceCommerceCart, Ys as inlineTextToPlainText, Yt as ManifestForm, Yu as createContextScope, Za as buildEventRuntimeFilters, Zc as asRecord, Zd as Sparkles, Zi as NAV_LINK_LETTER_SPACING_MAP, Zl as Badge, Zn as isInternalResolvedLinkValue, Zo as groupEventsByDate, Zr as augmentManifestWithStyleGroups, Zs as parseInlineTextFromUnknown, Zu as Primitive, _a as sectionTransitionFamilies, _c as FileArchiveIcon, _d as resolveBookingTimeZoneId, _f as File, _i as MQ_LG_UP, _l as borderColorStyle, _n as DEFAULT_LAUNCH_READINESS_INPUT, _o as el, _r as findPreSelectedEvent, _s as asDesignBlockId, _t as EditorProvider, _u as DialogHeader, ac as ArrowRightIcon, ad as createEditorRemoveBlockCommand, af as Pencil, ai as formEmbedFragment, al as generateButtonCss, an as createBlock, ao as normalizeOptionalId, ar as eventListingBlockDefinition, as as blockBookingPaymentTermsSchema, au as TabsList, b as PreviewDesignCoordinatorProvider, ba as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, bc as FileTextIcon, bd as parseEventPageSurfaceSubject, bf as FilePlay, bi as MQ_SM_DOWN, bl as rgbColorValue, bn as DndContext, bo as bindingSchema, br as resolveRegistrationTarget, bs as ACCORDION_SPACING_MAP, bt as useUISelector, bu as CollapsibleContent, cc as ChevronDownIcon, cd as unsafeAsEditorBlockValues, ci as testimonialsHeadingFragment, cl as featuresFromHex, cn as deleteBlock, co as eventButtonVariantSchema, cr as buildEventCalendarInteractiveIslandProps, cs as defineInteractiveIslandMetaKeys, ct as PreviewRichTextEditor, cu as List, da as GRADIENT_PRESETS, dc as ChevronUpIcon, dd as formatBookingDateTime, df as LoaderCircle, di as ctaRowFragment, dl as generateBaseInteractiveCSS, do as filterAutoShowSchema, dr as formBlockDefinition, ds as defineProgressiveBlockRuntime, dt as useRichTextEditor, du as ScrollableDialogContent, ea as NAV_LINK_TEXT_SIZE_MAP, ec as SEMANTIC_ICON_DEFINITIONS, ed as useComposedRefs, ef as Settings, ei as cardFragment, el as getAtPath, en as createStoreBackend, eo as getEventRuntimeFiltersKey, er as shopBlockDefinition, es as getEventAvailability, et as confirmAutosaveBatch, eu as PopoverContent, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as GRADIENT_PRESET_IDS, fc as CircleMinusIcon, fd as formatBookingInstant, ff as Image, fi as heroCopyFragment, fl as generateInteractiveChildInheritanceCSS, fn as mutateBlockContent, fo as previewStageSchema, fr as buildFormInteractiveIslandProps, ft as EMPTY_DOC, fu as Dialog, ga as defaultSectionTransitionVariantForFamily, gc as ExternalLinkIcon, gd as parseBookingLocalDate, gf as GripVertical, gi as siteOptionSources, gl as backgroundColorStyle, gn as decodePublicProductCategorySelectorQuery, go as bind, gr as findEventByOccurrenceId, gs as planSiteChromePlacement, gt as InlineTextEditor, gu as DialogFooter, ha as boundaryRuntimeMetricsForTransition, hc as DownloadIcon, hd as getBookingLocalDateKey, hf as ImageOff, hi as PUBLIC_FILE_FIELD_KINDS, hl as themeButtonClassName, hn as reorderPageSurfaceSlotBlocks, ho as eventCalendarListLayoutOptions, hr as toRegistrationEvents, hs as splitPositioningClasses, ht as insertOrReplaceRichTextImage, hu as DialogDescription, i as usePreviewDesignHistoryOrder, ia as LABEL_FONT_SIZE_MAP, ic as ArrowLeftIcon, id as createEditorInsertBlockCommand, if as Plus, ii as singleButtonFragment, il as AFFORDANCE_SUPPRESS_CLASS, in as getPageDesignEditorState, io as normalizeCsvString, ir as buildNewsletterFormInteractiveIslandProps, is as resolveRuntimeEventPricing, it as rejectAutosaveBatch, iu as TabsContent, jc as createIcon, jd as parseSiteId, jf as CircleMinus, ji as applyCompiledRuntimeFieldsToContent, jl as SdkConfigProvider, jn as isKeyboardEvent, jo as publicEventSchema, jr as cartBlockDefinition, js as parseFeatureCardGeneratedIconSizePx, jt as createHistoryState, ju as DropdownMenu, kc as UploadIcon, kd as expectParsedBrandedId, kf as Clock3, ki as readHeaderNavFontSizePreference, kl as isNonEmptyValue, kn as useSensors, ko as normalizeEventSurfaceScope, kr as resolveEventRegistrationScopedEvents, ks as createFeatureCardIconKey, kt as canRedoHistory, ku as CardTitle, lc as ChevronLeftIcon, ld as addLocalScheduleDays, lf as Minus, li as ctaCopyFragment, ll as generateEffectsCSS, ln as deleteEntrySlotBlock, lo as eventCalendarDefaultViewSchema, lr as buildEventCalendarListingDisplay, ls as createZodCodec, lt as PreviewInlineTextEditor, lu as Root2$1, ma as parseGradientPresetId, mc as ClockIcon$1, md as formatLocalScheduleDate, mf as ImagePlus, mi as defineFragment, ml as parseThemeButtonVariantId, mn as reorderEntrySlotBlocks, mo as eventCalendarListLayoutCompatibleDisplayModeValues, mr as buildEventRegistrationInteractiveIslandProps, ms as markEditableSurfaceForwarding, mt as getRichTextImagePositionFromTarget, mu as DialogContent, n as useSiteChromeCustomizeOptional, na as INPUT_FONT_SIZE_MAP, nc as isSemanticIconId, nd as clsx, nf as RotateCcw, ni as faqHeadingFragment, nn as toRoutableLinkPayload, no as resolveEventListPaginationAction, nr as productDetailBlockDefinition, ns as getLocalDateKey, nt as enqueueTransaction, nu as Input, oc as CalendarIcon$1, od as createEditorReorderBlocksCommand, oi as formCopyFragment, ol as expandPalette, on as createEntrySlotBlock, oo as calendarTabViewsSchema, or as buildEventListingInteractiveIslandProps, os as buildInteractiveIslandProps, ot as resolvePreviewSidebarTab, ou as TabsTrigger, p as reportPreviewDesignError, pa as getGradientPreset, pc as CirclePlusIcon, pd as formatBookingTime, pf as ImageUp, pi as bodyCopyFragment, pl as TokenResolver, pn as reorderBlocks, po as weekStartSchema, pr as eventRegistrationBlockDefinition, ps as composeHeaderSectionWrapperClassName, pt as RichTextEditorSurface, pu as DialogClose, qa as resolveOfferingsPreviewGroupOrderEntries, qc as normalizeRightAngle, qd as Trash2, qi as getComponentShadowVar, ql as SelectItem, qn as layoutTransforms, qo as formatEventTeacherLine, qr as parseStoredCommerceCartState, qs as isRecord$21, qt as unfinishedBlockCopy, qu as createCollection, r as PreviewDesignHistoryOrderProvider, ra as INPUT_SPACING_MAP, rc as ArrowDownIcon, rd as parseFooterModuleId, ri as blogFeaturedPostFragment, rn as applyPageDesignEditorAction, ro as normalizeCsvIds, rr as newsletterSignupBlockDefinition, rs as getLocalMinuteOfDay, rt as idleEditorTransactionQueueState, ru as Tabs, sc as CheckIcon$1, sd as unsafeAsEditorBlockId, si as testimonialsCarouselFragment, sl as getTextColorForBackground, sn as createPageSurfaceSlotBlock, so as columnOptionSchema, sr as eventCalendarBlockDefinition, ss as createInteractiveIslandCodec, su as Content$1, t as SiteChromeCustomizeProvider, ta as FONT_WEIGHT_MAP, tc as getSemanticIconComponent, td as cn$1, tf as Search, ti as faqAccordionFragment, tl as siblingPath$1, tn as listContentTypes, to as resolveEventCalendarListPageSize, tr as productListBlockDefinition, ts as getEventAvailabilityStatus, tt as deriveTransactionCapabilities, tu as PopoverTrigger, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, ua as gradientToCss, uc as ChevronRightIcon, ud as formatBookingDate, ui as heroCtaRowFragment, ul as generateShadowValue$1, un as deletePageSurfaceSlotBlock, uo as eventLayoutSchema, ur as buildEventCalendarListingRender, us as defineClientOwnedBlockRuntime, ut as PreviewTextEditor, uu as Trigger$1, va as sectionTransitionFamilyForBoundaryOptionId, vc as FileAudioIcon, vd as toBookingTimeZone, vf as FileText, vi as MQ_MD_DOWN, vl as cssVarValue, vn as deriveLaunchReadiness, vo as richText, vr as resolveDiscountContext, vs as assertNever$6, vt as useEditor, vu as DialogTitle, wa as parseBackgroundAppearanceColorToken, wc as MinusIcon, wd as publicEventPricingType, wf as EyeOff, wi as getAnchorClasses, wl as surfaceForegroundValue, wn as getClientRect, wo as normalizeEventBlockKind, wr as giftingBlockDefinition, ws as ICON_SIZE_PX, wt as useEntryEditorController, wu as Trigger, xa as backgroundAppearanceColorTokenNames, xc as InfoIcon, xd as formatBookingPriceDisplay, xf as FileHeadphone, xi as MQ_SM_UP, xl as textColorStyle, xn as KeyboardCode, xo as eventBlockKindValues, xr as WIZARD_STEPS$1, xs as ACCORDION_TRIGGER_FONT_SCALE, xt as EditableBlockProvider, ya as sectionTransitionVariantForBoundaryOptionId, yc as FileSpreadsheetIcon, yd as toScheduledBookingDateTime, yf as FileSpreadsheet, yi as MQ_MD_UP, yl as mergeStyles, yn as AMBIENT_BACKGROUND_ROLES$1, yo as when, yr as resolveEventRequiresPayment, ys as ACCORDION_OPEN_ACCENT_THICKNESS, yu as Collapsible, za as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, zc as resolveImageUrlWithContext, zd as unsafeAsPositiveSeconds, zf as Box, zl as Tooltip, zn as siteFooterManifest, zo as buildGoogleMapsDirectionsUrl, zr as buildProductCardDisplay, zs as parseBlockIconValue, zt as createRoutingHelpers, zu as __extends } from "./SiteChromeCustomizeContext-DUpalEdL.mjs";
3
+ import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-D0y2l8JN.mjs";
4
+ import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, l as ApiEnvelopeError, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-CTO7CRPk.mjs";
5
5
  import * as React$1 from "react";
6
6
  import React, { Children, Component, Fragment, cloneElement, createContext, createElement, createRef, forwardRef, isValidElement, memo, startTransition, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1973,10 +1973,10 @@ function useBlockApi() {
1973
1973
  }
1974
1974
  //#endregion
1975
1975
  //#region ../blocks/src/primitives/layout/Section.tsx
1976
- const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", allowOverflow = false, style, "data-slot": dataSlot }, ref) {
1976
+ const Section = forwardRef(function Section({ as: Comp = "section", children, background, className = "", style, "data-slot": dataSlot }, ref) {
1977
1977
  return /* @__PURE__ */ jsx(Comp, {
1978
1978
  ref,
1979
- className: clsx("rb-relative rb-isolate", allowOverflow ? "rb-overflow-visible" : "rb-overflow-hidden", className),
1979
+ className: clsx("rb-relative rb-isolate rb-overflow-visible", className),
1980
1980
  style: mergeStyles(typeof background === "string" && background.trim().length > 0 ? backgroundColorStyle(background.trim()) : void 0, style),
1981
1981
  "data-slot": dataSlot ?? "section",
1982
1982
  children
@@ -2097,10 +2097,7 @@ function Grid({ as: Comp = "div", cols = {
2097
2097
  }
2098
2098
  //#endregion
2099
2099
  //#region ../blocks/src/system/runtime/nodes/layout.tsx
2100
- const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, allowOverflow, ...props }) => /* @__PURE__ */ jsx(Section, {
2101
- ...props,
2102
- allowOverflow
2103
- });
2100
+ const SectionNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Section, { ...props });
2104
2101
  const StackNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Stack, { ...props });
2105
2102
  const InlineNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Inline, { ...props });
2106
2103
  const GridNode = ({ blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, previewAuthoring: _previewAuthoring, pathBase: _pathBase, ...props }) => /* @__PURE__ */ jsx(Grid, { ...props });
@@ -2611,6 +2608,58 @@ function getCtaIconComponent(name) {
2611
2608
  return CTA_ICON_COMPONENTS[name] ?? null;
2612
2609
  }
2613
2610
  //#endregion
2611
+ //#region ../blocks/src/system/icons/social.tsx
2612
+ const SOCIAL_ICON_NAMES = [
2613
+ "SocialFacebook",
2614
+ "SocialInstagram",
2615
+ "SocialLinkedIn",
2616
+ "SocialTikTok",
2617
+ "SocialX",
2618
+ "SocialYouTube"
2619
+ ];
2620
+ const socialIcons = {
2621
+ SocialFacebook: createIcon("SocialFacebookIcon", /* @__PURE__ */ jsx("path", { d: "M14 8h3V4h-3c-3 0-5 2-5 5v3H6v4h3v6h4v-6h3l1-4h-4V9c0-.7.3-1 1-1Z" })),
2622
+ SocialInstagram: createIcon("SocialInstagramIcon", /* @__PURE__ */ jsxs(Fragment$1, { children: [
2623
+ /* @__PURE__ */ jsx("rect", {
2624
+ x: "3",
2625
+ y: "3",
2626
+ width: "18",
2627
+ height: "18",
2628
+ rx: "5"
2629
+ }),
2630
+ /* @__PURE__ */ jsx("circle", {
2631
+ cx: "12",
2632
+ cy: "12",
2633
+ r: "4"
2634
+ }),
2635
+ /* @__PURE__ */ jsx("circle", {
2636
+ cx: "17.5",
2637
+ cy: "6.5",
2638
+ r: ".75",
2639
+ fill: "currentColor",
2640
+ stroke: "none"
2641
+ })
2642
+ ] })),
2643
+ SocialLinkedIn: createIcon("SocialLinkedInIcon", /* @__PURE__ */ jsxs(Fragment$1, { children: [
2644
+ /* @__PURE__ */ jsx("path", { d: "M6 9v10" }),
2645
+ /* @__PURE__ */ jsx("path", {
2646
+ d: "M6 5.5v.01",
2647
+ strokeWidth: "3"
2648
+ }),
2649
+ /* @__PURE__ */ jsx("path", { d: "M10.5 19v-6a4 4 0 0 1 8 0v6" }),
2650
+ /* @__PURE__ */ jsx("path", { d: "M10.5 9v10" })
2651
+ ] })),
2652
+ SocialTikTok: createIcon("SocialTikTokIcon", /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("path", { d: "M14 4v11.5a4.5 4.5 0 1 1-4-4.47" }), /* @__PURE__ */ jsx("path", { d: "M14 4c.7 3 2.4 4.5 5 4.5" })] })),
2653
+ SocialX: createIcon("SocialXIcon", /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("path", { d: "m5 4 14 16" }), /* @__PURE__ */ jsx("path", { d: "M19 4 5 20" })] })),
2654
+ SocialYouTube: createIcon("SocialYouTubeIcon", /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("path", { d: "M21 12c0 3.5-.5 5.5-1.3 6.3S16.5 19.5 12 19.5s-6.9-.4-7.7-1.2S3 15.5 3 12s.5-5.5 1.3-6.3S7.5 4.5 12 4.5s6.9.4 7.7 1.2S21 8.5 21 12Z" }), /* @__PURE__ */ jsx("path", { d: "m10 9 5 3-5 3Z" })] }))
2655
+ };
2656
+ function isSocialIconName(value) {
2657
+ return typeof value === "string" && SOCIAL_ICON_NAMES.includes(value);
2658
+ }
2659
+ function getSocialIconComponent(value) {
2660
+ return isSocialIconName(value) ? socialIcons[value] : null;
2661
+ }
2662
+ //#endregion
2614
2663
  //#region ../blocks/src/system/icons/registry.ts
2615
2664
  function buildSearchText(parts) {
2616
2665
  return parts.map((part) => part.trim()).filter(Boolean).join(" ");
@@ -2646,10 +2695,10 @@ function getIconPickerOptionsForPreset(preset) {
2646
2695
  return ICON_PICKER_OPTIONS_BY_PRESET[preset];
2647
2696
  }
2648
2697
  function isKnownIconName(value) {
2649
- return isCtaIconName(value) || isSemanticIconId(value);
2698
+ return isCtaIconName(value) || isSemanticIconId(value) || isSocialIconName(value);
2650
2699
  }
2651
2700
  function getIconComponent(name) {
2652
- return getCtaIconComponent(name) ?? getSemanticIconComponent(name);
2701
+ return getCtaIconComponent(name) ?? getSemanticIconComponent(name) ?? getSocialIconComponent(name);
2653
2702
  }
2654
2703
  //#endregion
2655
2704
  //#region ../blocks/src/system/runtime/nodes/buttonAffordance.ts
@@ -3537,7 +3586,6 @@ const HeaderSectionNode$1 = ({ blockId, children, className, "data-preview-site-
3537
3586
  const asProp = rest.as;
3538
3587
  const styleProp = rest.style;
3539
3588
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
3540
- const allowOverflowProp = typeof rest.allowOverflow === "boolean" ? rest.allowOverflow : void 0;
3541
3589
  const dataSlotProp = typeof rest["data-slot"] === "string" ? rest["data-slot"] : void 0;
3542
3590
  return /* @__PURE__ */ jsxs("nav", {
3543
3591
  ...getIslandRootProps("headerSection", blockId),
@@ -3552,7 +3600,6 @@ const HeaderSectionNode$1 = ({ blockId, children, className, "data-preview-site-
3552
3600
  as: asProp,
3553
3601
  style: styleProp,
3554
3602
  background: backgroundProp ?? "background",
3555
- allowOverflow: allowOverflowProp,
3556
3603
  "data-slot": dataSlotProp,
3557
3604
  className: sectionClasses || void 0,
3558
3605
  children
@@ -7192,7 +7239,7 @@ function resolveGroupFrame(cardStyles) {
7192
7239
  contentClassName: "offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
7193
7240
  };
7194
7241
  return {
7195
- containerClassName: ["offerings-preview-card offerings-preview-card--framed rb-relative rb-isolate rb-h-full rb-min-h-full rb-overflow-hidden rb-bg-surface rb-border rb-border-border", resolveGroupFrameClasses(cardStyles)].filter(Boolean).join(" "),
7242
+ containerClassName: ["offerings-preview-card offerings-preview-card--framed rb-relative rb-isolate rb-h-full rb-min-h-full rb-overflow-visible rb-bg-surface rb-border rb-border-border", resolveGroupFrameClasses(cardStyles)].filter(Boolean).join(" "),
7196
7243
  containerStyle: resolveGroupFrameStyle(cardStyles),
7197
7244
  contentClassName: "card-content offerings-preview-card-content rb-flex rb-h-full rb-min-h-full rb-flex-col rb-gap-5"
7198
7245
  };
@@ -7454,6 +7501,39 @@ function headingDecoration({ bindFrom = defaultBindFrom, className } = {}) {
7454
7501
  } } })], when(`${bindFrom}.family`));
7455
7502
  }
7456
7503
  //#endregion
7504
+ //#region ../blocks/src/system/fragments/library/footerBottomText.ts
7505
+ const footerBottomTextFragment = defineFragment({
7506
+ id: "footerBottomText",
7507
+ title: "Footer Text",
7508
+ description: "Rich text content for the main footer body and optional bottom bar.",
7509
+ fields: [{
7510
+ id: "bodyText",
7511
+ type: "richText",
7512
+ label: "Body text",
7513
+ description: "Appears in the main footer area.",
7514
+ ui: { variant: "limited" }
7515
+ }, {
7516
+ id: "bottomText",
7517
+ type: "richText",
7518
+ label: "Bottom bar text",
7519
+ description: "Appears in the optional footer bottom bar.",
7520
+ ui: { variant: "limited" }
7521
+ }],
7522
+ layout: [richText({
7523
+ className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
7524
+ style: textColorStyle("text/80")
7525
+ }, when("bodyText"), bind("bodyText", { transforms: [{
7526
+ id: "content.interpolateRichTextTokens",
7527
+ options: { tokens: ["year", "site_name"] }
7528
+ }] })), richText({
7529
+ className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
7530
+ style: textColorStyle("text/80")
7531
+ }, when("bottomText"), bind("bottomText", { transforms: [{
7532
+ id: "content.interpolateRichTextTokens",
7533
+ options: { tokens: ["year", "site_name"] }
7534
+ }] }))]
7535
+ });
7536
+ //#endregion
7457
7537
  //#region ../blocks/src/system/fragments/library/headerCta.ts
7458
7538
  const headerCtaFragment = defineFragment({
7459
7539
  id: "headerCta",
@@ -24994,7 +25074,6 @@ const HeaderSectionNode = ({ blockId, blockKind, blockContent, fragmentRegistry,
24994
25074
  const asProp = restProps.as;
24995
25075
  const styleProp = restProps.style;
24996
25076
  const backgroundProp = typeof restProps.background === "string" ? restProps.background : void 0;
24997
- const allowOverflowProp = typeof restProps.allowOverflow === "boolean" ? restProps.allowOverflow : void 0;
24998
25077
  const dataSlotProp = typeof restProps["data-slot"] === "string" ? restProps["data-slot"] : void 0;
24999
25078
  return /* @__PURE__ */ jsx("nav", {
25000
25079
  ref: (el) => {
@@ -25016,7 +25095,6 @@ const HeaderSectionNode = ({ blockId, blockKind, blockContent, fragmentRegistry,
25016
25095
  as: asProp,
25017
25096
  style: styleProp,
25018
25097
  background: backgroundProp ?? "background",
25019
- allowOverflow: allowOverflowProp,
25020
25098
  "data-slot": dataSlotProp,
25021
25099
  className: sectionClasses || void 0,
25022
25100
  children
@@ -28141,9 +28219,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
28141
28219
  ].filter(Boolean).join(" ");
28142
28220
  }
28143
28221
  function gradientPresetCss(value) {
28144
- if (!isString$1(value)) return null;
28145
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
28146
- if (!preset) return null;
28222
+ const presetId = parseGradientPresetId(value);
28223
+ if (!presetId) return null;
28224
+ const preset = getGradientPreset(presetId);
28147
28225
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
28148
28226
  }
28149
28227
  const backgroundTransforms = [
@@ -28182,16 +28260,17 @@ const backgroundTransforms = [
28182
28260
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
28183
28261
  },
28184
28262
  {
28185
- id: "background.resolveAllowOverflow",
28263
+ id: "background.resolveFrameClassName",
28186
28264
  kind: "formatter",
28187
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
28188
- run: (value) => {
28189
- if (!value || typeof value !== "object") return false;
28265
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
28266
+ run: (value, options) => {
28267
+ const baseClass = options?.baseClass?.trim() ?? "";
28268
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
28190
28269
  const input = value;
28191
- if (input.overflow === true) return true;
28270
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
28192
28271
  const objectFit = isString$1(input.objectFit) ? input.objectFit.trim() : null;
28193
28272
  const scale = isString$1(input.scale) ? input.scale.trim() : isNumber$1(input.scale) ? String(input.scale) : null;
28194
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
28273
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
28195
28274
  }
28196
28275
  },
28197
28276
  {
@@ -29544,9 +29623,9 @@ function isReactNode(value) {
29544
29623
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
29545
29624
  */
29546
29625
  function resolveNode(node, context, indexFallback) {
29547
- if (!shouldRenderNode(node, context)) return null;
29548
29626
  const scopeContext = applyScopes(node, context);
29549
29627
  if (node.$repeat) return resolveRepeater(node, scopeContext);
29628
+ if (!shouldRenderNode(node, scopeContext)) return null;
29550
29629
  const registry = scopeContext.registry ?? serverComponentRegistry;
29551
29630
  const normalizedType = node.type.toLowerCase();
29552
29631
  const component = registry[node.type] ?? registry[normalizedType] ?? (normalizedType === "section" ? SectionNode : void 0);
@@ -30913,6 +30992,19 @@ Object.keys(NAV_LINK_PRESETS);
30913
30992
  //#region ../theme-core/src/header/generateHeaderCss.ts
30914
30993
  const HEADER_BLUR = "blur(12px)";
30915
30994
  const FLOATING_BLUR = "blur(16px)";
30995
+ const INSET_SHELL_MARKER_CLASS = "header-bar-frame-inset-shell";
30996
+ const INSET_SHELL_EDGE = "1rem";
30997
+ const INSET_SHELL_INSET_BLOCK = "0.875rem";
30998
+ const INSET_SHELL_RADIUS = "9999px";
30999
+ const INSET_SHELL_CONTAINER_MAX = "80rem";
31000
+ const INSET_SHELL_INTERIOR_PADDING_X = "1.75rem";
31001
+ /**
31002
+ * Whether the classic header should render as an inset "brand capsule" shell.
31003
+ * The facet is only meaningful for the classic layout; other variants ignore it.
31004
+ */
31005
+ function usesInsetShell(header) {
31006
+ return header.barFrame === "inset-shell" && header.variant === "classic";
31007
+ }
30916
31008
  /**
30917
31009
  * Generate complete CSS for header system from theme config
30918
31010
  *
@@ -31012,7 +31104,36 @@ function generateHeaderRootStyles(header, themeId, tokens, _theme) {
31012
31104
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
31013
31105
  const overlayFix = `\n${`${selector}:has([data-nav-mobile-overlay][aria-hidden="false"])`} {\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n}\n`;
31014
31106
  if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
31015
- return `${baseBlock}\n${`\n${backgroundSelector} {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n z-index: -1;\n ${backgroundRules.join("\n ")}\n}\n`}\n${overlayFix}`;
31107
+ return `${baseBlock}\n${`\n${backgroundSelector} {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n z-index: -1;\n ${backgroundRules.join("\n ")}\n}\n`}\n${overlayFix}${usesInsetShell(header) ? generateInsetShellStyles(header, themeId) : ""}`;
31108
+ }
31109
+ /**
31110
+ * Reshapes the full-bleed header paint layer into a contained brand capsule at
31111
+ * the desktop breakpoint. The capsule is centred, capped to the page container
31112
+ * width, inset from the top, fully rounded, and carries the header depth so it
31113
+ * reads as a floating pill. Root border/shadow are neutralised on desktop so a
31114
+ * bordered style does not leave a full-width hairline around the capsule. Sticky
31115
+ * positioning is unaffected — the root stays full width and sticky while the
31116
+ * ::before paint provides the capsule.
31117
+ */
31118
+ function generateInsetShellStyles(header, themeId) {
31119
+ const scope = `:where([data-theme-scope="${themeId}"])`;
31120
+ const shellRootSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}`;
31121
+ const shellBeforeSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS}::before`;
31122
+ const layoutSelector = `${scope} .header-root.${INSET_SHELL_MARKER_CLASS} .rb-header-layout`;
31123
+ const widthValue = header.maxWidth === "full" ? `calc(100% - (${INSET_SHELL_EDGE} * 2))` : `min(${INSET_SHELL_CONTAINER_MAX}, calc(100% - (${INSET_SHELL_EDGE} * 2)))`;
31124
+ const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
31125
+ const rootRules = ["border: none;", "box-shadow: none;"];
31126
+ const beforeRules = [
31127
+ `inset: ${INSET_SHELL_INSET_BLOCK} auto;`,
31128
+ "left: 50%;",
31129
+ "right: auto;",
31130
+ "transform: translateX(-50%);",
31131
+ `width: ${widthValue};`,
31132
+ `border-radius: ${INSET_SHELL_RADIUS};`,
31133
+ ...shadowVar ? [`box-shadow: ${shadowVar};`] : []
31134
+ ];
31135
+ const layoutRules = [`padding-inline: ${INSET_SHELL_INTERIOR_PADDING_X};`];
31136
+ return `\n@media ${MQ_MD_UP} {\n${shellRootSelector} {\n ${rootRules.join("\n ")}\n}\n${shellBeforeSelector} {\n ${beforeRules.join("\n ")}\n}\n${layoutSelector} {\n ${layoutRules.join("\n ")}\n}\n}\n`;
31016
31137
  }
31017
31138
  /**
31018
31139
  * Generate logo typography styles
@@ -31090,7 +31211,7 @@ function generateLogoTextBehaviorStyles(logoText, themeId) {
31090
31211
  */
31091
31212
  function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment, navTextSize) {
31092
31213
  const navPreferences = {
31093
- typography: header.navTypography ?? "inherit",
31214
+ typography: header.navFontRole ?? header.navTypography ?? "inherit",
31094
31215
  fontSize: readHeaderNavFontSizePreference(header.navTextSize)
31095
31216
  };
31096
31217
  if (header.navLinkStyle) return generateNavLinkCSS({
@@ -33275,6 +33396,8 @@ function buildThemeCssVars(theme) {
33275
33396
  const inputRadius = mapInputRadius(inputSystem.base.corners, theme.corners);
33276
33397
  return {
33277
33398
  ...generateCssVars(theme.palette),
33399
+ ["--tb-secondaryForeground"]: "var(--tb-onSecondary)",
33400
+ ["--tb-accentForeground"]: "var(--tb-onAccent)",
33278
33401
  ["--tb-scrim"]: "0 0 0",
33279
33402
  ["--tb-shadow"]: "0 0 0",
33280
33403
  ...generateShadowCssVars(theme),
@@ -35416,6 +35539,12 @@ const containerResponsiveThemeCss = `/*
35416
35539
  .rb-lg-hidden {
35417
35540
  display: none;
35418
35541
  }
35542
+ .rb-lg-flex-row {
35543
+ flex-direction: row;
35544
+ }
35545
+ .rb-lg-items-center {
35546
+ align-items: center;
35547
+ }
35419
35548
  }
35420
35549
 
35421
35550
  }
@@ -41925,6 +42054,11 @@ const containerResponsiveThemeCss = `/*
41925
42054
  flex-wrap: wrap;
41926
42055
  }
41927
42056
 
42057
+ /* Text-style CTA actions belong to the section foreground contract. */
42058
+ :where(.theme-scope) [data-block="cta-full"] .cta-row .button-link {
42059
+ color: var(--rb-surface-link-color, var(--rb-surface-text-color, rgb(var(--tb-primary))));
42060
+ }
42061
+
41928
42062
  /* =============================================================================
41929
42063
  * Block: Body Text (content block, Phase 2)
41930
42064
  *
@@ -46852,7 +46986,7 @@ const containerResponsiveThemeCss = `/*
46852
46986
  [data-block="feature-cards"][data-block-composition="asymmetric-emphasis"]
46853
46987
  .rb-feature-card {
46854
46988
  height: auto;
46855
- overflow: hidden;
46989
+ overflow: visible;
46856
46990
  border: 0;
46857
46991
  border-radius: 0;
46858
46992
  background: transparent;
@@ -48154,6 +48288,26 @@ function stripEmptyStringValues(params) {
48154
48288
  function ensureSiteId(params, context) {
48155
48289
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
48156
48290
  }
48291
+ /**
48292
+ * Map the embed block's author-facing order values onto the public
48293
+ * `listPublishedEntries` `order` contract enum.
48294
+ *
48295
+ * `'order'` ("Custom order field") is the MANUAL-ORDERING axis: it means "render
48296
+ * entries in the content type's author-defined order". It intentionally maps to
48297
+ * `undefined` (endpoint default) here rather than a fixed `manual.asc`, because
48298
+ * this transform is schema-blind — it can't tell whether the embedded content
48299
+ * type actually opts into `ordering.mode: 'manual'`. Forcing `manual.asc` for a
48300
+ * non-manual type would silently flip its default sort (all `manualOrder` values
48301
+ * are equal, so it would degrade to createdAt-asc) — a render regression.
48302
+ *
48303
+ * The manual-ordering HONOR therefore lives server-side where the schema IS
48304
+ * known: `listContentEntries` (content/entries/list.ts) applies `manualOrder ASC`
48305
+ * as the default for manual-ordered types (plan 8.3). That is the path
48306
+ * `block-loaders/content.ts` renders through. The embed/`listPublishedEntries`
48307
+ * loader path (contentEntryLoaders) is not yet schema-aware for its default
48308
+ * ordering; honoring manual order there for the default `'order'` value is a
48309
+ * bounded follow-up (recorded in plan 8.3), not this change.
48310
+ */
48157
48311
  function normalizeOrder(orderBy) {
48158
48312
  switch (orderBy) {
48159
48313
  case "newest": return "published_at.desc";
@@ -55838,7 +55992,8 @@ function validateRelativeStoragePath(value) {
55838
55992
  if (value.startsWith("sites/")) return fail({ tag: "SITE_SCOPED_PATH" });
55839
55993
  if (value.startsWith("/")) return fail({ tag: "LEADING_SLASH" });
55840
55994
  if (value.includes("//")) return fail({ tag: "DOUBLE_SLASH" });
55841
- if (value.split("/").some((segment) => segment === "..")) return fail({ tag: "TRAVERSAL" });
55995
+ if (value.includes("%")) return fail({ tag: "PERCENT_ENCODING" });
55996
+ if (value.split("/").some((segment) => segment === "." || segment === "..")) return fail({ tag: "TRAVERSAL" });
55842
55997
  return ok$1(value);
55843
55998
  }
55844
55999
  function brandRelativeStoragePath(value) {
@@ -57036,124 +57191,85 @@ function BackgroundColorField({ path, backend, config }) {
57036
57191
  //#endregion
57037
57192
  //#region ../block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientWidget.tsx
57038
57193
  /**
57039
- * BackgroundGradientWidget
57040
- *
57041
57194
  * Select a curated gradient from the theme-based library.
57042
57195
  * Gradients use theme color tokens, so they adapt to the site's palette.
57043
57196
  */
57044
- function BackgroundGradientWidget(props) {
57045
- const { label, value, onChange, description, error, dataPath } = props;
57197
+ function BackgroundGradientWidget({ label, value, onChange, description, error, dataPath }) {
57046
57198
  const { tokens } = usePalette();
57047
- const [showAdvanced, setShowAdvanced] = useState(false);
57048
- const selectedPresetId = useMemo(() => {
57049
- if (!value) return null;
57050
- return GRADIENT_PRESETS.find((p) => p.type === value.type && p.angle === value.angle && p.position === value.position && p.stops.length === value.stops.length && p.stops.every((stop, i) => stop.color === value.stops[i]?.color && stop.position === value.stops[i]?.position))?.id ?? null;
57051
- }, [value]);
57199
+ const selectedPreset = useMemo(() => value ? GRADIENT_PRESETS.find((preset) => gradientConfigsMatch(preset, value)) ?? null : null, [value]);
57052
57200
  const handleSelectPreset = (presetId) => {
57053
- const preset = GRADIENT_PRESETS.find((p) => p.id === presetId);
57054
- if (!preset) return;
57055
- onChange({
57056
- type: preset.type,
57057
- angle: preset.angle,
57058
- position: preset.position,
57059
- stops: preset.stops
57060
- });
57201
+ onChange(gradientConfigFromPreset(getGradientPreset(presetId)));
57061
57202
  };
57062
- return /* @__PURE__ */ jsxs("div", {
57203
+ return /* @__PURE__ */ jsx(FieldFrame, {
57204
+ fieldPath: dataPath,
57205
+ label,
57206
+ description,
57207
+ error,
57063
57208
  className: "space-y-3",
57064
- "data-path": dataPath,
57065
- children: [
57066
- /* @__PURE__ */ jsxs("div", { children: [
57067
- /* @__PURE__ */ jsx(Label, {
57068
- className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground",
57069
- children: label
57070
- }),
57071
- description ? /* @__PURE__ */ jsx("p", {
57072
- className: "text-xs text-muted-foreground mt-1",
57073
- children: description
57074
- }) : null,
57075
- error ? /* @__PURE__ */ jsx("p", {
57076
- className: "text-xs text-destructive mt-1",
57077
- children: error
57078
- }) : null
57079
- ] }),
57080
- /* @__PURE__ */ jsx("div", {
57209
+ children: ({ id, descriptionId, messageId }) => /* @__PURE__ */ jsxs("div", {
57210
+ className: "space-y-3",
57211
+ children: [/* @__PURE__ */ jsx("div", {
57212
+ role: "group",
57213
+ "aria-label": `${label} presets`,
57214
+ "aria-describedby": [descriptionId, messageId].filter(Boolean).join(" ") || void 0,
57081
57215
  className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
57082
- children: GRADIENT_PRESETS.map((preset) => {
57083
- const isSelected = selectedPresetId === preset.id;
57084
- const cssGradient = gradientToCss({
57085
- type: preset.type,
57086
- angle: preset.angle,
57087
- position: preset.position,
57088
- stops: preset.stops
57089
- }, tokens);
57216
+ children: GRADIENT_PRESETS.map((preset, index) => {
57217
+ const isSelected = selectedPreset?.id === preset.id;
57218
+ const cssGradient = gradientToCss(gradientConfigFromPreset(preset), tokens);
57219
+ const kindLabel = gradientKindLabel$1(preset.type);
57090
57220
  return /* @__PURE__ */ jsxs("button", {
57221
+ id: index === 0 ? id : void 0,
57091
57222
  type: "button",
57223
+ "aria-label": `${preset.name}, ${kindLabel} gradient`,
57224
+ "aria-pressed": isSelected,
57092
57225
  onClick: () => handleSelectPreset(preset.id),
57093
- className: cn$1("group flex flex-col gap-2 rounded-md border p-2 transition", isSelected ? "border-foreground bg-accent/30" : "border-muted-foreground/30 bg-background hover:bg-muted/40"),
57094
- children: [/* @__PURE__ */ jsx("div", {
57226
+ className: cn$1("group flex flex-col gap-2 rounded-md border p-2 text-left transition", isSelected ? "border-foreground bg-accent/30" : "border-muted-foreground/30 bg-background hover:bg-muted/40"),
57227
+ children: [/* @__PURE__ */ jsx("span", {
57228
+ "aria-hidden": "true",
57095
57229
  className: "h-16 w-full rounded-sm",
57096
57230
  style: { background: cssGradient }
57097
- }), /* @__PURE__ */ jsx("div", {
57098
- className: "text-xs font-medium text-foreground text-left",
57099
- children: preset.name
57231
+ }), /* @__PURE__ */ jsxs("span", {
57232
+ className: "space-y-0.5",
57233
+ children: [/* @__PURE__ */ jsx("span", {
57234
+ className: "block text-xs font-medium text-foreground",
57235
+ children: preset.name
57236
+ }), /* @__PURE__ */ jsx("span", {
57237
+ className: "block text-[11px] font-medium uppercase tracking-wide text-muted-foreground",
57238
+ children: kindLabel
57239
+ })]
57100
57240
  })]
57101
57241
  }, preset.id);
57102
57242
  })
57103
- }),
57104
- value ? /* @__PURE__ */ jsxs("div", {
57243
+ }), value ? /* @__PURE__ */ jsxs("p", {
57105
57244
  className: "text-xs text-muted-foreground",
57106
- children: ["Selected: ", selectedPresetId ? GRADIENT_PRESETS.find((p) => p.id === selectedPresetId)?.name : "Custom"]
57107
- }) : null,
57108
- /* @__PURE__ */ jsxs("div", {
57109
- className: "border-t border-border/40 pt-3",
57110
- children: [/* @__PURE__ */ jsxs("button", {
57111
- type: "button",
57112
- onClick: () => setShowAdvanced(!showAdvanced),
57113
- className: "flex items-center gap-2 text-xs font-medium text-muted-foreground hover:text-foreground transition",
57114
- children: [showAdvanced ? /* @__PURE__ */ jsx(ChevronUp, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3" }), "Advanced Settings"]
57115
- }), showAdvanced && value ? /* @__PURE__ */ jsxs("div", {
57116
- className: "mt-3 space-y-3 text-xs",
57117
- children: [
57118
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(Label, {
57119
- className: "text-xs",
57120
- children: "Type"
57121
- }), /* @__PURE__ */ jsxs("div", {
57122
- className: "mt-1 text-muted-foreground",
57123
- children: [
57124
- value.type === "linear" ? "Linear" : "Radial",
57125
- value.type === "linear" && value.angle !== void 0 ? ` (${value.angle}�)` : "",
57126
- value.type === "radial" && value.position ? ` (${value.position})` : ""
57127
- ]
57128
- })] }),
57129
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(Label, {
57130
- className: "text-xs",
57131
- children: "Color Stops"
57132
- }), /* @__PURE__ */ jsx("div", {
57133
- className: "mt-1 space-y-1",
57134
- children: value.stops.map((stop, idx) => /* @__PURE__ */ jsxs("div", {
57135
- className: "flex items-center gap-2 text-muted-foreground",
57136
- children: [
57137
- /* @__PURE__ */ jsx("span", {
57138
- className: "h-3 w-3 rounded-full border border-border/50",
57139
- style: { backgroundColor: tokens[stop.color] ?? "#000000" }
57140
- }),
57141
- /* @__PURE__ */ jsx("span", { children: stop.color }),
57142
- /* @__PURE__ */ jsx("span", { children: "�" }),
57143
- /* @__PURE__ */ jsxs("span", { children: [stop.position, "%"] })
57144
- ]
57145
- }, idx))
57146
- })] }),
57147
- /* @__PURE__ */ jsx("p", {
57148
- className: "text-muted-foreground",
57149
- children: "To customize gradient angles, positions, or add/remove color stops, select a preset as a starting point. Full customization coming soon."
57150
- })
57151
- ]
57152
- }) : null]
57153
- })
57154
- ]
57245
+ "aria-live": "polite",
57246
+ children: ["Selected gradient: ", selectedPreset ? `${selectedPreset.name} · ${gradientKindLabel$1(selectedPreset.type)}` : "Custom"]
57247
+ }) : null]
57248
+ })
57155
57249
  });
57156
57250
  }
57251
+ function gradientConfigFromPreset(preset) {
57252
+ return {
57253
+ type: preset.type,
57254
+ angle: preset.angle,
57255
+ shape: preset.shape,
57256
+ position: preset.position,
57257
+ stops: preset.stops.map((stop) => ({ ...stop }))
57258
+ };
57259
+ }
57260
+ function gradientConfigsMatch(preset, value) {
57261
+ return preset.type === value.type && preset.angle === value.angle && radialShape(preset) === radialShape(value) && preset.position === value.position && preset.stops.length === value.stops.length && preset.stops.every((stop, index) => stop.color === value.stops[index]?.color && stop.position === value.stops[index]?.position);
57262
+ }
57263
+ function radialShape(config) {
57264
+ return config.type === "radial" ? config.shape ?? "circle" : config.shape;
57265
+ }
57266
+ function gradientKindLabel$1(type) {
57267
+ switch (type) {
57268
+ case "linear": return "Linear";
57269
+ case "radial": return "Radial";
57270
+ case "conic": return "Conic";
57271
+ }
57272
+ }
57157
57273
  //#endregion
57158
57274
  //#region ../block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientField.tsx
57159
57275
  /**
@@ -57191,12 +57307,7 @@ function BackgroundGradientField({ path, backend, config }) {
57191
57307
  function findPresetFromCss(css, tokens) {
57192
57308
  if (!css) return null;
57193
57309
  for (const preset of GRADIENT_PRESETS) {
57194
- const presetConfig = {
57195
- type: preset.type,
57196
- angle: preset.angle,
57197
- position: preset.position,
57198
- stops: preset.stops
57199
- };
57310
+ const presetConfig = gradientConfigFromPreset(preset);
57200
57311
  if (gradientToCss(presetConfig, tokens) === css) return presetConfig;
57201
57312
  }
57202
57313
  return null;
@@ -58420,7 +58531,8 @@ function buildInsertBlockHistoryCommand({ block, index, draftContent, publishedC
58420
58531
  draftContent: toEditorBlockValues(baseline),
58421
58532
  publishedContent: toEditorBlockValues(nextPublishedContent),
58422
58533
  bindings: toEditorBlockValues(block.bindings ?? null),
58423
- purpose
58534
+ purpose,
58535
+ optimisticHash: block.optimisticHash ?? null
58424
58536
  }, {
58425
58537
  id: blockId,
58426
58538
  version: 0,
@@ -58431,7 +58543,8 @@ function buildInsertBlockHistoryCommand({ block, index, draftContent, publishedC
58431
58543
  kind: block.kind,
58432
58544
  purpose,
58433
58545
  orderIndex: index,
58434
- publishedContent: toEditorBlockValues(nextPublishedContent)
58546
+ publishedContent: toEditorBlockValues(nextPublishedContent),
58547
+ optimisticHash: block.optimisticHash ?? null
58435
58548
  }
58436
58549
  }, index);
58437
58550
  }
@@ -58441,6 +58554,8 @@ function blockEditorOwnerKey(owner) {
58441
58554
  switch (owner.kind) {
58442
58555
  case "page": return `page:${owner.pageId}`;
58443
58556
  case "entry-slot": return `entry-slot:${owner.type}:${owner.entryId}:${owner.slotKey}`;
58557
+ case "surface-slot": return `surface-slot:${owner.pageSurfaceId}:${owner.slotKey}`;
58558
+ default: return assertNever$5(owner);
58444
58559
  }
58445
58560
  }
58446
58561
  async function createEditableBlockForOwner(apiClient, siteId, owner, input) {
@@ -58462,6 +58577,16 @@ async function createEditableBlockForOwner(apiClient, siteId, owner, input) {
58462
58577
  position: input.position,
58463
58578
  purpose: input.purpose
58464
58579
  });
58580
+ case "surface-slot": return createPageSurfaceSlotBlock(apiClient, {
58581
+ siteId,
58582
+ pageSurfaceId: owner.pageSurfaceId,
58583
+ slotKey: owner.slotKey,
58584
+ kind: input.kind,
58585
+ position: input.position,
58586
+ purpose: input.purpose,
58587
+ expectedCompositionHash: owner.compositionHash
58588
+ });
58589
+ default: return assertNever$5(owner);
58465
58590
  }
58466
58591
  }
58467
58592
  async function reorderEditableBlocksForOwner(apiClient, siteId, owner, blockIds) {
@@ -58478,6 +58603,14 @@ async function reorderEditableBlocksForOwner(apiClient, siteId, owner, blockIds)
58478
58603
  slotKey: owner.slotKey,
58479
58604
  blockIds
58480
58605
  });
58606
+ case "surface-slot": return reorderPageSurfaceSlotBlocks(apiClient, {
58607
+ siteId,
58608
+ pageSurfaceId: owner.pageSurfaceId,
58609
+ slotKey: owner.slotKey,
58610
+ blockIds,
58611
+ expectedCompositionHash: owner.compositionHash
58612
+ });
58613
+ default: return assertNever$5(owner);
58481
58614
  }
58482
58615
  }
58483
58616
  async function deleteEditableBlockForOwner(apiClient, siteId, owner, blockId) {
@@ -58494,11 +58627,23 @@ async function deleteEditableBlockForOwner(apiClient, siteId, owner, blockId) {
58494
58627
  slotKey: owner.slotKey,
58495
58628
  blockId
58496
58629
  });
58630
+ case "surface-slot": return deletePageSurfaceSlotBlock(apiClient, {
58631
+ siteId,
58632
+ pageSurfaceId: owner.pageSurfaceId,
58633
+ slotKey: owner.slotKey,
58634
+ blockId,
58635
+ expectedCompositionHash: owner.compositionHash
58636
+ });
58637
+ default: return assertNever$5(owner);
58497
58638
  }
58498
58639
  }
58640
+ function surfaceCompositionHashFromResponse(response) {
58641
+ if (typeof response === "object" && response !== null && "compositionHash" in response && typeof response.compositionHash === "string") return response.compositionHash;
58642
+ return null;
58643
+ }
58499
58644
  //#endregion
58500
58645
  //#region ../editor-blocks/src/block-editor/hooks/useBlockCreation.ts
58501
- function useBlockCreation({ allowCreation, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, triggerFocus, uiStore }) {
58646
+ function useBlockCreation({ allowCreation, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, triggerFocus, uiStore, onStructuralRevisionChange }) {
58502
58647
  const [pickerOpen, setPickerOpen] = useState(false);
58503
58648
  const [insertPosition, setInsertPosition] = useState(null);
58504
58649
  const [creatingBlockName, setCreatingBlockName] = useState(null);
@@ -58526,11 +58671,14 @@ function useBlockCreation({ allowCreation, apiClient, siteId, owner, blockList,
58526
58671
  setCreatingBlockName(descriptor.name);
58527
58672
  setErrorMessage(null);
58528
58673
  try {
58529
- const newBlock = (await createEditableBlockForOwner(apiClient, siteId, owner, {
58674
+ const response = await createEditableBlockForOwner(apiClient, siteId, owner, {
58530
58675
  kind: descriptor.name,
58531
58676
  position: insertPosition,
58532
58677
  purpose: "content"
58533
- })).block;
58678
+ });
58679
+ const nextCompositionHash = surfaceCompositionHashFromResponse(response);
58680
+ if (nextCompositionHash) onStructuralRevisionChange?.(nextCompositionHash);
58681
+ const newBlock = response.block;
58534
58682
  const updated = [...blockList];
58535
58683
  updated.splice(insertPosition, 0, {
58536
58684
  ...newBlock,
@@ -58576,6 +58724,7 @@ function useBlockCreation({ allowCreation, apiClient, siteId, owner, blockList,
58576
58724
  creatingBlockName,
58577
58725
  insertPosition,
58578
58726
  onBlocksChange,
58727
+ onStructuralRevisionChange,
58579
58728
  owner,
58580
58729
  setBlockList,
58581
58730
  siteId,
@@ -58591,7 +58740,7 @@ function getDuplicateDraftContent(block) {
58591
58740
  if (!source || typeof source !== "object" || Array.isArray(source)) return null;
58592
58741
  return JSON.parse(JSON.stringify(source));
58593
58742
  }
58594
- function useBlockDuplication({ allowCreation, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, triggerFocus, setErrorMessage, uiStore }) {
58743
+ function useBlockDuplication({ allowCreation, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, triggerFocus, setErrorMessage, uiStore, onStructuralRevisionChange }) {
58595
58744
  const [duplicatingBlockId, setDuplicatingBlockId] = useState(null);
58596
58745
  return {
58597
58746
  duplicatingBlockId,
@@ -58607,18 +58756,27 @@ function useBlockDuplication({ allowCreation, apiClient, siteId, owner, blockLis
58607
58756
  setDuplicatingBlockId(blockId);
58608
58757
  setErrorMessage(null);
58609
58758
  let createdBlockId = null;
58759
+ let ownerAfterCreate = owner;
58610
58760
  try {
58611
- const createdBlock = (await createEditableBlockForOwner(apiClient, siteId, owner, {
58761
+ const response = await createEditableBlockForOwner(apiClient, siteId, owner, {
58612
58762
  kind: sourceBlock.kind,
58613
58763
  position: insertIndex,
58614
58764
  purpose,
58615
58765
  duplicatedFromBlockId: blockId
58616
- })).block;
58766
+ });
58767
+ const createdCompositionHash = surfaceCompositionHashFromResponse(response);
58768
+ ownerAfterCreate = owner.kind === "surface-slot" && createdCompositionHash ? {
58769
+ ...owner,
58770
+ compositionHash: createdCompositionHash
58771
+ } : owner;
58772
+ if (createdCompositionHash) onStructuralRevisionChange?.(createdCompositionHash);
58773
+ const createdBlock = response.block;
58617
58774
  if (!createdBlock.id) throw new Error("Duplicate block did not return a block id");
58618
58775
  createdBlockId = createdBlock.id;
58619
58776
  if (draftContent) await mutateBlockContent(apiClient, {
58620
58777
  siteId,
58621
58778
  blockId: createdBlock.id,
58779
+ optimisticHash: createdBlock.optimisticHash ?? null,
58622
58780
  data: draftContent
58623
58781
  });
58624
58782
  const insertedBlock = {
@@ -58650,7 +58808,8 @@ function useBlockDuplication({ allowCreation, apiClient, siteId, owner, blockLis
58650
58808
  }
58651
58809
  } catch (error) {
58652
58810
  if (createdBlockId) try {
58653
- await deleteEditableBlockForOwner(apiClient, siteId, owner, createdBlockId);
58811
+ const nextCompositionHash = surfaceCompositionHashFromResponse(await deleteEditableBlockForOwner(apiClient, siteId, ownerAfterCreate, createdBlockId));
58812
+ if (nextCompositionHash) onStructuralRevisionChange?.(nextCompositionHash);
58654
58813
  } catch {}
58655
58814
  const message = error instanceof Error ? error.message : "Failed to duplicate block";
58656
58815
  console.error("[useBlockDuplication] duplicate failed:", message, error);
@@ -58664,6 +58823,7 @@ function useBlockDuplication({ allowCreation, apiClient, siteId, owner, blockLis
58664
58823
  blockList,
58665
58824
  duplicatingBlockId,
58666
58825
  onBlocksChange,
58826
+ onStructuralRevisionChange,
58667
58827
  owner,
58668
58828
  setBlockList,
58669
58829
  setErrorMessage,
@@ -58682,7 +58842,7 @@ function blockIdsEqual(left, right) {
58682
58842
  if (left.length !== right.length) return false;
58683
58843
  return left.every((blockId, index) => blockId === right[index]);
58684
58844
  }
58685
- function useBlockReorder({ allowReordering, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, setErrorMessage, uiStore }) {
58845
+ function useBlockReorder({ allowReordering, apiClient, siteId, owner, blockList, setBlockList, onBlocksChange, setErrorMessage, uiStore, onStructuralRevisionChange }) {
58686
58846
  const [reorderId, setReorderId] = useState(null);
58687
58847
  const applyReorder = useCallback(async (updated, original) => {
58688
58848
  if (!allowReordering) return;
@@ -58690,7 +58850,8 @@ function useBlockReorder({ allowReordering, apiClient, siteId, owner, blockList,
58690
58850
  const nextBlockIds = getBlockIds(updated);
58691
58851
  uiStore?.getState().history.applyCommand?.({ ...createEditorReorderBlocksCommand(nextBlockIds.map((blockId) => unsafeAsEditorBlockId(blockId))) });
58692
58852
  try {
58693
- await reorderEditableBlocksForOwner(apiClient, siteId, owner, nextBlockIds);
58853
+ const nextCompositionHash = surfaceCompositionHashFromResponse(await reorderEditableBlocksForOwner(apiClient, siteId, owner, nextBlockIds));
58854
+ if (nextCompositionHash) onStructuralRevisionChange?.(nextCompositionHash);
58694
58855
  onBlocksChange?.(updated);
58695
58856
  } catch (error) {
58696
58857
  const message = error instanceof Error ? error.message : "Failed to reorder blocks";
@@ -58707,6 +58868,7 @@ function useBlockReorder({ allowReordering, apiClient, siteId, owner, blockList,
58707
58868
  allowReordering,
58708
58869
  apiClient,
58709
58870
  onBlocksChange,
58871
+ onStructuralRevisionChange,
58710
58872
  owner,
58711
58873
  setBlockList,
58712
58874
  siteId,
@@ -60509,6 +60671,7 @@ const SortableBlockItem = memo(function SortableBlockItem({ siteId, block, onMov
60509
60671
  })
60510
60672
  });
60511
60673
  return /* @__PURE__ */ jsx("div", {
60674
+ "data-block-editor-client-ready": mounted ? "true" : "false",
60512
60675
  ref: (node) => {
60513
60676
  sortable.setNodeRef(node);
60514
60677
  if (node) blockRef.current = node;
@@ -60576,7 +60739,7 @@ function getGeneratedIconSetErrorMessage(error) {
60576
60739
  const message = getApiRequestErrorMessage(error);
60577
60740
  return message === "Internal server error" || /^Request to .+ failed with status \d+$/u.test(message) ? GENERATED_ICON_SET_FRIENDLY_ERROR : message;
60578
60741
  }
60579
- const BlockEditor = forwardRef(function BlockEditor({ siteId, dashboardBaseUrl, owner, blocks, recoveryConflictBlockIds = [], recoveryConflictReviewRequestId = null, apiClient, uiStore, enableReordering = true, enableCreation = true, enableDeletion = true, onBlockSave, onBlocksChange, theme, widgetOverrides, headerLeftSlot, hideThemeV2RawStyleFields = false, pageDesignEditorModel = null, enabledContentTypes = [], sdkConfig = null, customBlocks = [], allowedBlockKinds = null, emptyUnavailableMessage = "No blocks available for this page.", initialCollapsed = true, reorderControlMode = DEFAULT_REORDER_CONTROL_MODE, actionPresentation = DEFAULT_BLOCK_ACTION_PRESENTATION }, ref) {
60742
+ const BlockEditor = forwardRef(function BlockEditor({ siteId, dashboardBaseUrl, owner, blocks, recoveryConflictBlockIds = [], recoveryConflictReviewRequestId = null, apiClient, uiStore, enableReordering = true, enableCreation = true, enableDeletion = true, onBlockSave, onBlocksChange, onStructuralRevisionChange, theme, widgetOverrides, headerLeftSlot, hideThemeV2RawStyleFields = false, pageDesignEditorModel = null, enabledContentTypes = [], sdkConfig = null, customBlocks = [], allowedBlockKinds = null, emptyUnavailableMessage = "No blocks available for this page.", initialCollapsed = true, reorderControlMode = DEFAULT_REORDER_CONTROL_MODE, actionPresentation = DEFAULT_BLOCK_ACTION_PRESENTATION }, ref) {
60580
60743
  const [blockList, setBlockList] = useState(() => normalizeBlockListInitial(blocks));
60581
60744
  const [errorMessage, setErrorMessage] = useState(null);
60582
60745
  const [highlightedBlockId, setHighlightedBlockId] = useState(null);
@@ -60601,8 +60764,21 @@ const BlockEditor = forwardRef(function BlockEditor({ siteId, dashboardBaseUrl,
60601
60764
  const conflictedBlockIdSet = useMemo(() => new Set(recoveryConflictBlockIds), [recoveryConflictBlockIds]);
60602
60765
  const blockIds = useMemo(() => blockList.map((block) => block.id).filter((blockId) => typeof blockId === "string"), [blockList]);
60603
60766
  const pageDesignBlockById = useMemo(() => new Map((pageDesignEditorModel?.blocks ?? []).map((block) => [String(block.blockId), block])), [pageDesignEditorModel]);
60767
+ const ownerKey = useMemo(() => blockEditorOwnerKey(owner), [owner]);
60768
+ const [surfaceCompositionHash, setSurfaceCompositionHash] = useState(owner.kind === "surface-slot" ? owner.compositionHash : null);
60769
+ const updateStructuralRevision = useCallback((revision) => {
60770
+ setSurfaceCompositionHash(revision);
60771
+ onStructuralRevisionChange?.(revision);
60772
+ }, [onStructuralRevisionChange]);
60773
+ useEffect(() => {
60774
+ setSurfaceCompositionHash(owner.kind === "surface-slot" ? owner.compositionHash : null);
60775
+ }, [ownerKey, owner.kind === "surface-slot" ? owner.compositionHash : null]);
60776
+ const mutationOwner = useMemo(() => owner.kind === "surface-slot" ? {
60777
+ ...owner,
60778
+ compositionHash: surfaceCompositionHash ?? owner.compositionHash
60779
+ } : owner, [owner, surfaceCompositionHash]);
60604
60780
  const { isCollapsed, setCollapsed } = useBlockExpandState({
60605
- pageId: useMemo(() => blockEditorOwnerKey(owner), [owner]),
60781
+ pageId: ownerKey,
60606
60782
  blockIds,
60607
60783
  initialCollapsed
60608
60784
  });
@@ -60833,41 +61009,45 @@ const BlockEditor = forwardRef(function BlockEditor({ siteId, dashboardBaseUrl,
60833
61009
  allowCreation: canCreateBlocks,
60834
61010
  apiClient,
60835
61011
  siteId,
60836
- owner,
61012
+ owner: mutationOwner,
60837
61013
  blockList,
60838
61014
  setBlockList,
60839
61015
  onBlocksChange,
60840
61016
  triggerFocus,
60841
- uiStore
61017
+ uiStore,
61018
+ onStructuralRevisionChange: updateStructuralRevision
60842
61019
  });
60843
61020
  const { reorderId, handleMove, onDragEnd } = useBlockReorder({
60844
61021
  allowReordering,
60845
61022
  apiClient,
60846
61023
  siteId,
60847
- owner,
61024
+ owner: mutationOwner,
60848
61025
  blockList,
60849
61026
  setBlockList,
60850
61027
  onBlocksChange,
60851
61028
  setErrorMessage,
60852
- uiStore
61029
+ uiStore,
61030
+ onStructuralRevisionChange: updateStructuralRevision
60853
61031
  });
60854
61032
  const { duplicatingBlockId, duplicateBlock } = useBlockDuplication({
60855
61033
  allowCreation: canCreateBlocks,
60856
61034
  apiClient,
60857
61035
  siteId,
60858
- owner,
61036
+ owner: mutationOwner,
60859
61037
  blockList,
60860
61038
  setBlockList,
60861
61039
  onBlocksChange,
60862
61040
  triggerFocus,
60863
61041
  setErrorMessage,
60864
- uiStore
61042
+ uiStore,
61043
+ onStructuralRevisionChange: updateStructuralRevision
60865
61044
  });
60866
61045
  const handleDelete = useCallback(async (blockId) => {
60867
61046
  try {
60868
61047
  setErrorMessage(null);
60869
61048
  if (!blockList.find((block) => block.id === blockId)) return;
60870
- await deleteEditableBlockForOwner(apiClient, siteId, owner, blockId);
61049
+ const nextCompositionHash = surfaceCompositionHashFromResponse(await deleteEditableBlockForOwner(apiClient, siteId, mutationOwner, blockId));
61050
+ if (nextCompositionHash) updateStructuralRevision(nextCompositionHash);
60871
61051
  const updatedList = blockList.filter((b) => b.id !== blockId);
60872
61052
  setBlockList(updatedList);
60873
61053
  if (uiStore) uiStore.getState().history.applyCommand?.({ ...createEditorRemoveBlockCommand(unsafeAsEditorBlockId(blockId)) });
@@ -60879,11 +61059,12 @@ const BlockEditor = forwardRef(function BlockEditor({ siteId, dashboardBaseUrl,
60879
61059
  }, [
60880
61060
  apiClient,
60881
61061
  siteId,
60882
- owner,
61062
+ mutationOwner,
60883
61063
  blockList,
60884
61064
  setBlockList,
60885
61065
  onBlocksChange,
60886
- uiStore
61066
+ uiStore,
61067
+ updateStructuralRevision
60887
61068
  ]);
60888
61069
  useEffect(() => {
60889
61070
  return () => {
@@ -64322,14 +64503,7 @@ const IMAGE_BACKGROUND_TREATMENT = {
64322
64503
  minContrastRatio: BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO,
64323
64504
  minOverlayOpacity: .64
64324
64505
  };
64325
- const gradientPresetIds = GRADIENT_PRESETS.map((preset) => preset.id);
64326
- const gradientPresetIdSet = new Set(gradientPresetIds);
64327
- function parseGradientPresetId(value) {
64328
- if (typeof value !== "string") return null;
64329
- const normalized = value.trim();
64330
- if (!gradientPresetIdSet.has(normalized)) return null;
64331
- return normalized;
64332
- }
64506
+ const gradientPresetIds = GRADIENT_PRESET_IDS;
64333
64507
  function backgroundModeForOverride(override) {
64334
64508
  return override.kind;
64335
64509
  }
@@ -64423,7 +64597,27 @@ function backgroundCapabilityFromModes(modeCapabilities) {
64423
64597
  };
64424
64598
  }
64425
64599
  function parseBackgroundOverrideFromContent(content) {
64426
- return parseBackgroundOverride((isRecord$9(content._sectionStyles) ? content._sectionStyles : null)?.background);
64600
+ const source = parseCanonicalSectionBackground(content);
64601
+ return source.kind === "page-design-override" ? source.parsed : {
64602
+ kind: "supported",
64603
+ override: DEFAULT_BACKGROUND_OVERRIDE
64604
+ };
64605
+ }
64606
+ /**
64607
+ * Classifies persisted content before runtime Look decoration is considered.
64608
+ * Only the explicit owner marker can make a background a page-design override.
64609
+ */
64610
+ function parseCanonicalSectionBackground(content) {
64611
+ const background = (isRecord$9(content._sectionStyles) ? content._sectionStyles : null)?.background;
64612
+ if (background === null || background === void 0) return { kind: "none" };
64613
+ if (!isRecord$9(background) || background.contentOwner !== "page-design-editor") return {
64614
+ kind: "block-authored",
64615
+ background: isRecord$9(background) ? background : {}
64616
+ };
64617
+ return {
64618
+ kind: "page-design-override",
64619
+ parsed: parseBackgroundOverride(background)
64620
+ };
64427
64621
  }
64428
64622
  function parseBackgroundOverride(value) {
64429
64623
  if (value === null || value === void 0) return {
@@ -64530,11 +64724,15 @@ function serializeBackgroundOverride(override) {
64530
64724
  headingColor: foregroundToken
64531
64725
  };
64532
64726
  }
64533
- case "gradient": return {
64534
- contentOwner: pageDesignEditorBackgroundOverrideOwner,
64535
- type: "gradient",
64536
- gradientPresetId: override.gradientId
64537
- };
64727
+ case "gradient": {
64728
+ const foreground = getGradientPreset(override.gradientId).foreground;
64729
+ return {
64730
+ contentOwner: pageDesignEditorBackgroundOverrideOwner,
64731
+ type: "gradient",
64732
+ gradientPresetId: override.gradientId,
64733
+ ...foreground
64734
+ };
64735
+ }
64538
64736
  case "image": return {
64539
64737
  contentOwner: pageDesignEditorBackgroundOverrideOwner,
64540
64738
  type: "image",
@@ -65719,7 +65917,8 @@ function localRuntimeDraftForBlock(input) {
65719
65917
  kind: block.blockKind,
65720
65918
  purpose: null,
65721
65919
  orderIndex: null,
65722
- publishedContent: null
65920
+ publishedContent: null,
65921
+ optimisticHash: null
65723
65922
  }
65724
65923
  };
65725
65924
  }
@@ -65774,8 +65973,8 @@ function PreviewPageDesignEditorStateProvider({ apiClient, siteId, pageId, enabl
65774
65973
  if (!cancelled) setWorkflowState(previewCustomizeLoadSucceeded(nextState));
65775
65974
  }).catch((error) => {
65776
65975
  if (cancelled) return;
65777
- if (!(error instanceof ApiRequestError)) console.error("[preview-page-design-editor-state] Unexpected load failure", error);
65778
- setWorkflowState(failedPreviewCustomizeWorkflowState(error instanceof ApiRequestError ? error.message : PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE));
65976
+ reportPreviewDesignError("Failed to load page design editor state", error);
65977
+ setWorkflowState(failedPreviewCustomizeWorkflowState(PREVIEW_DESIGN_LOAD_ERROR_MESSAGE));
65779
65978
  });
65780
65979
  return () => {
65781
65980
  cancelled = true;
@@ -66062,20 +66261,23 @@ function actionWithCurrentBaseContentId(action, editorModel) {
66062
66261
  }
66063
66262
  }
66064
66263
  function classifyApplyActionError(error) {
66065
- const message = error instanceof Error ? error.message : "Failed to save design change.";
66066
66264
  if (error instanceof ApiRequestError) {
66067
66265
  if (error.status === 409) return {
66068
66266
  kind: "stale",
66069
66267
  message: PREVIEW_CUSTOMIZE_STALE_MESSAGE
66070
66268
  };
66071
- if (error.status === 400 || error.status === 422) return {
66072
- kind: "invalid",
66073
- message
66074
- };
66269
+ if (error.status === 400 || error.status === 422) {
66270
+ reportPreviewDesignError("Failed to apply page design change", error);
66271
+ return {
66272
+ kind: "invalid",
66273
+ message: PREVIEW_DESIGN_SAVE_ERROR_MESSAGE
66274
+ };
66275
+ }
66075
66276
  }
66277
+ reportPreviewDesignError("Failed to apply page design change", error);
66076
66278
  return {
66077
66279
  kind: "failed",
66078
- message
66280
+ message: PREVIEW_DESIGN_SAVE_ERROR_MESSAGE
66079
66281
  };
66080
66282
  }
66081
66283
  function usePreviewPageDesignEditorState() {
@@ -66212,7 +66414,8 @@ function PreviewEntryControllerProvider({ children, siteId, pageId, routeId: pro
66212
66414
  content: b.content ?? null,
66213
66415
  draftContent: b.draftContent ?? null,
66214
66416
  publishedContent: b.publishedContent ?? null,
66215
- bindings: b.bindings ?? null
66417
+ bindings: b.bindings ?? null,
66418
+ optimisticHash: b.optimisticHash ?? null
66216
66419
  }));
66217
66420
  }, [initialBlocks]);
66218
66421
  const entityId = pageId || entryData?.id || "";
@@ -66220,20 +66423,30 @@ function PreviewEntryControllerProvider({ children, siteId, pageId, routeId: pro
66220
66423
  const entityLabel = entryData ? "Entry" : "Page";
66221
66424
  const routeId = providedRouteId ?? void 0;
66222
66425
  const initialContent = entryData ? draftContent ?? entryData.content ?? {} : null;
66223
- return /* @__PURE__ */ jsx(EntryControllerProvider, {
66426
+ const common = {
66224
66427
  apiClient,
66225
- kind: entryData ? "content" : "page",
66226
66428
  type: entityType || "page",
66227
66429
  siteId,
66228
- entryId: entityId,
66430
+ owner: {
66431
+ kind: "contentEntry",
66432
+ contentEntryId: entityId
66433
+ },
66229
66434
  routeId,
66230
66435
  schema,
66231
66436
  entityLabel,
66232
66437
  initialEntry,
66438
+ initialBlocks: normalizedInitialBlocks,
66439
+ historyShortcutsEnabled: isEditingMode
66440
+ };
66441
+ return entryData ? /* @__PURE__ */ jsx(EntryControllerProvider, {
66442
+ ...common,
66443
+ kind: "content",
66233
66444
  initialContent,
66445
+ children
66446
+ }) : /* @__PURE__ */ jsx(EntryControllerProvider, {
66447
+ ...common,
66448
+ kind: "page",
66234
66449
  initialStatus,
66235
- initialBlocks: normalizedInitialBlocks,
66236
- historyShortcutsEnabled: isEditingMode,
66237
66450
  children
66238
66451
  });
66239
66452
  }
@@ -67228,6 +67441,74 @@ function PreviewChromeFloatingControl({ anchorSelector, anchorTargetSelector, pl
67228
67441
  children
67229
67442
  }), layer.portalTarget)] });
67230
67443
  }
67444
+ function PreviewChromeFloatingBar({ anchorSelector, gapPx = 8, children }) {
67445
+ const layer = usePreviewChromeLayerOptional();
67446
+ const probeRef = useRef(null);
67447
+ const [position, setPosition] = useState(null);
67448
+ const [themeCustomProperties, setThemeCustomProperties] = useState({});
67449
+ useEffect(() => {
67450
+ if (!layer?.portalTarget) return;
67451
+ const portalTarget = layer.portalTarget;
67452
+ let resizeObserver = null;
67453
+ let observedAnchor = null;
67454
+ const update = () => {
67455
+ const anchor = probeRef.current?.closest(anchorSelector);
67456
+ if (anchor !== observedAnchor) {
67457
+ resizeObserver?.disconnect();
67458
+ observedAnchor = anchor;
67459
+ if (anchor && typeof ResizeObserver !== "undefined") {
67460
+ resizeObserver = new ResizeObserver(update);
67461
+ resizeObserver.observe(anchor);
67462
+ }
67463
+ }
67464
+ if (!anchor) {
67465
+ setPosition(null);
67466
+ return;
67467
+ }
67468
+ const anchorRect = anchor.getBoundingClientRect();
67469
+ const layerRect = portalTarget.getBoundingClientRect();
67470
+ const placement = anchorRect.top >= 56 ? "above" : "below";
67471
+ setThemeCustomProperties(readThemeCustomProperties(anchor));
67472
+ setPosition({
67473
+ left: anchorRect.left - layerRect.left,
67474
+ top: placement === "above" ? anchorRect.top - layerRect.top - gapPx : anchorRect.bottom - layerRect.top + gapPx,
67475
+ width: anchorRect.width,
67476
+ placement
67477
+ });
67478
+ };
67479
+ update();
67480
+ const unsubscribe = layer.subscribeLayout(update);
67481
+ return () => {
67482
+ resizeObserver?.disconnect();
67483
+ unsubscribe();
67484
+ };
67485
+ }, [
67486
+ anchorSelector,
67487
+ gapPx,
67488
+ layer
67489
+ ]);
67490
+ if (!layer?.portalTarget) return /* @__PURE__ */ jsx("div", {
67491
+ className: "absolute inset-x-0 bottom-full z-20 mb-2",
67492
+ children
67493
+ });
67494
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
67495
+ ref: probeRef,
67496
+ "aria-hidden": "true",
67497
+ style: { display: "contents" }
67498
+ }), position ? createPortal(/* @__PURE__ */ jsx("div", {
67499
+ "data-preview-chrome-floating-bar": "",
67500
+ "data-placement": position.placement,
67501
+ className: "pointer-events-auto absolute z-[80]",
67502
+ style: {
67503
+ ...themeCustomProperties,
67504
+ left: position.left,
67505
+ top: position.top,
67506
+ width: position.width,
67507
+ transform: position.placement === "above" ? "translateY(-100%)" : void 0
67508
+ },
67509
+ children
67510
+ }), layer.portalTarget) : null] });
67511
+ }
67231
67512
  function readThemeCustomProperties(element) {
67232
67513
  if (typeof window === "undefined") return {};
67233
67514
  const computedStyle = window.getComputedStyle(element);
@@ -67646,6 +67927,7 @@ function CustomizeBackgroundControlRows({ modeLabel, valueLabel, valueAriaLabel,
67646
67927
  //#region ../preview-next/src/client/preview/SiteChromeCustomizeButton.tsx
67647
67928
  function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-events-auto absolute right-2 top-2 z-50 opacity-0 transition group-focus-within/site-chrome:opacity-100 group-hover/site-chrome:opacity-100" }) {
67648
67929
  const customize = useSiteChromeCustomizeOptional();
67930
+ const editorUiStore = useOptionalEditorUiStoreInstance();
67649
67931
  const popover = useCustomizePopoverController();
67650
67932
  const [backgroundChooserOpen, setBackgroundChooserOpen] = useState(false);
67651
67933
  const popoverSide = useSiteChromeCustomizePopoverSide({
@@ -67797,13 +68079,18 @@ function SiteChromeCustomizeButton({ surface, containerClassName = "pointer-even
67797
68079
  onClick: (event) => {
67798
68080
  event.preventDefault();
67799
68081
  event.stopPropagation();
67800
- requestPreviewSidebarOpen({
68082
+ if (surfaceState.surface === "footer") {
68083
+ const editorUi = editorUiStore?.getState();
68084
+ editorUi?.inspectFooter();
68085
+ editorUi?.setPreviewSidebarTab("editor");
68086
+ editorUi?.setDrawerOpen(true);
68087
+ } else requestPreviewSidebarOpen({
67801
68088
  tab: "editor",
67802
- designRow: surfaceState.surface === "header" ? "header-style" : "footer"
68089
+ designRow: "header-style"
67803
68090
  });
67804
68091
  popover.close();
67805
68092
  },
67806
- children: "More options"
68093
+ children: surfaceState.surface === "footer" ? "Edit footer" : "More options"
67807
68094
  })
67808
68095
  }),
67809
68096
  surfaceState.diagnostics.length > 0 ? /* @__PURE__ */ jsx("ul", {
@@ -67969,7 +68256,7 @@ function renderEditableSurface(children, surface, options) {
67969
68256
  if (isValidElement(child) && child.type !== Fragment && (isHostElement(child) || options.preserveSingleComponentRoot || isEditableSurfaceForwardingElement(child))) return cloneElement(child, {
67970
68257
  className: joinClassNames(child.props.className, "group/site-chrome relative"),
67971
68258
  "data-preview-site-chrome-surface": surface,
67972
- children: /* @__PURE__ */ jsxs(Fragment$1, { children: [child.props.children, /* @__PURE__ */ jsx(SiteChromeCustomizeButton, { surface })] })
68259
+ children: /* @__PURE__ */ jsxs(Fragment$1, { children: [surface === "footer" ? /* @__PURE__ */ jsx(FooterModuleInspectionSurface, { children: child.props.children }) : child.props.children, /* @__PURE__ */ jsx(SiteChromeCustomizeButton, { surface })] })
67973
68260
  });
67974
68261
  if (surface === "header") return /* @__PURE__ */ jsxs("div", {
67975
68262
  className: "group/site-chrome",
@@ -67983,7 +68270,66 @@ function renderEditableSurface(children, surface, options) {
67983
68270
  return /* @__PURE__ */ jsxs("div", {
67984
68271
  className: "group/site-chrome relative",
67985
68272
  "data-preview-site-chrome-surface": surface,
67986
- children: [children, /* @__PURE__ */ jsx(SiteChromeCustomizeButton, { surface })]
68273
+ children: [/* @__PURE__ */ jsx(FooterModuleInspectionSurface, { children }), /* @__PURE__ */ jsx(SiteChromeCustomizeButton, { surface })]
68274
+ });
68275
+ }
68276
+ function FooterModuleInspectionSurface({ children }) {
68277
+ const uiStore = useOptionalEditorUiStoreInstance();
68278
+ const rootRef = useRef(null);
68279
+ const [active, setActive] = useState(null);
68280
+ const [position, setPosition] = useState(null);
68281
+ useEffect(() => {
68282
+ const root = rootRef.current;
68283
+ if (!root) return;
68284
+ const modules = root.querySelectorAll("[data-preview-footer-module-id]");
68285
+ for (const module of modules) {
68286
+ module.tabIndex = 0;
68287
+ const label = module.dataset.previewFooterModuleId?.replace(/-/gu, " ") ?? "footer section";
68288
+ module.setAttribute("aria-label", `Edit ${label}`);
68289
+ }
68290
+ }, [children]);
68291
+ const activateElement = (element) => {
68292
+ if (!element) return;
68293
+ const parsed = parseFooterModuleId(element.dataset.previewFooterModuleId);
68294
+ if (!parsed.ok) return;
68295
+ const label = element.dataset.previewFooterModuleId?.replace(/-/gu, " ") ?? "footer section";
68296
+ const rect = element.getBoundingClientRect();
68297
+ setActive({
68298
+ moduleId: parsed.value,
68299
+ label
68300
+ });
68301
+ setPosition({
68302
+ top: Math.max(8, rect.top + 8),
68303
+ left: Math.max(8, rect.right - 64)
68304
+ });
68305
+ };
68306
+ const inspect = (moduleId) => {
68307
+ uiStore?.getState().inspectFooterModule(moduleId);
68308
+ uiStore?.getState().setPreviewSidebarTab("editor");
68309
+ uiStore?.getState().setDrawerOpen(true);
68310
+ };
68311
+ return /* @__PURE__ */ jsxs("div", {
68312
+ ref: rootRef,
68313
+ style: { display: "contents" },
68314
+ onMouseOver: (event) => activateElement(event.target.closest("[data-preview-footer-module-id]")),
68315
+ onFocusCapture: (event) => activateElement(event.target.closest("[data-preview-footer-module-id]")),
68316
+ onKeyDown: (event) => {
68317
+ if (event.key !== "Enter" && event.key !== " ") return;
68318
+ const element = event.target.closest("[data-preview-footer-module-id]");
68319
+ if (!element) return;
68320
+ const parsed = parseFooterModuleId(element.dataset.previewFooterModuleId);
68321
+ if (!parsed.ok) return;
68322
+ event.preventDefault();
68323
+ inspect(parsed.value);
68324
+ },
68325
+ children: [children, active && position && uiStore ? /* @__PURE__ */ jsx("button", {
68326
+ type: "button",
68327
+ className: "pointer-events-auto fixed z-[75] rounded-full border bg-background px-3 py-1.5 text-xs font-medium text-foreground shadow-md",
68328
+ style: position,
68329
+ "aria-label": `Edit ${active.label}`,
68330
+ onClick: () => inspect(active.moduleId),
68331
+ children: "Edit"
68332
+ }) : null]
67987
68333
  });
67988
68334
  }
67989
68335
  function isHostElement(child) {
@@ -68224,17 +68570,17 @@ function LinkedEntryEditEventBridge() {
68224
68570
  //#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
68225
68571
  const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
68226
68572
  const PreviewEditorSidebar = React.lazy(async () => {
68227
- return { default: (await import("./PreviewEditorSidebar-DpAbAl08.mjs")).PreviewEditorSidebar };
68573
+ return { default: (await import("./PreviewEditorSidebar-DWqwfy3_.mjs")).PreviewEditorSidebar };
68228
68574
  });
68229
68575
  const PreviewEditorUI = React.lazy(async () => {
68230
- return { default: (await import("./PreviewEditorUI-O7cn6Xxv.mjs")).PreviewEditorUI };
68576
+ return { default: (await import("./PreviewEditorUI-B7OL4sfR.mjs")).PreviewEditorUI };
68231
68577
  });
68232
68578
  const previewPaneContainmentStyle = {
68233
68579
  contain: "layout paint",
68234
68580
  isolation: "isolate",
68235
68581
  transform: "translateZ(0)"
68236
68582
  };
68237
- function PreviewShellLayout({ children, theme, surfaceId, siteId, dashboardBaseUrl = null, pageId, entryData, contentTypeSchema, referenceContentTypeKeys = [], draftContent, currentTemplate, apiClient, bearerToken, themeId = null, themeSelectionId = null, themeSelectionVersion = null, themeSelectionUpdatedAt = null, themeSelectionButtonPersonalityId = null, runtimePaletteState, themeSelectionHeaderLayoutId = null, themeSelectionHeaderStyleId = null, themeSelectionHeaderLookId = null, themeSelectionFooterLookId = null, themeSelectionHeaderContext, themeSelectionFooterContext, supabaseUrl, isSiteLaunched, maintenanceModeEnabled, entrySubrouteContext, assistantPanel, sdkConfig, mediaAssets, bookingOfferingPresets, themeRuntime = defaultPreviewThemeRuntime, siteStyleAccess = { kind: "hidden" } }) {
68583
+ function PreviewShellLayout({ children, theme, surfaceId, siteId, dashboardBaseUrl = null, pageId, entryData, contentTypeSchema, referenceContentTypeKeys = [], draftContent, currentTemplate, apiClient, bearerToken, themeId = null, themeSelectionId = null, themeSelectionVersion = null, themeSelectionUpdatedAt = null, themeSelectionButtonPersonalityId = null, runtimePaletteState, themeSelectionHeaderLayoutId = null, themeSelectionHeaderStyleId = null, themeSelectionHeaderLookId = null, themeSelectionFooterLookId = null, themeSelectionHeaderContext, themeSelectionFooterContext, supabaseUrl, isSiteLaunched, maintenanceModeEnabled, entrySubrouteContext, assistantPanel, sdkConfig, mediaAssets, bookingOfferingPresets, themeRuntime = defaultPreviewThemeRuntime, siteStyleAccess = { kind: "hidden" }, onFooterSaved }) {
68238
68584
  const layout = useOptionalPreviewLayout();
68239
68585
  const headerNode = layout?.headerNode ?? null;
68240
68586
  const bannerNode = layout?.bannerNode ?? null;
@@ -68439,6 +68785,7 @@ function PreviewShellLayout({ children, theme, surfaceId, siteId, dashboardBaseU
68439
68785
  setPreviewSidebarTab(tab);
68440
68786
  setPreviewSidebarActiveTab(tab);
68441
68787
  },
68788
+ onFooterSaved,
68442
68789
  onClose: () => setDrawerOpen(false),
68443
68790
  entrySubrouteContext: entrySubrouteContext ?? null,
68444
68791
  assistantPanel,
@@ -68517,7 +68864,7 @@ function PreviewShellLayout({ children, theme, surfaceId, siteId, dashboardBaseU
68517
68864
  }
68518
68865
  //#endregion
68519
68866
  //#region ../preview-next/src/client/preview/PreviewShell.tsx
68520
- function PreviewShell({ children, apiBaseUrl, blockApiConfig, siteId, siteSlug, editableId, previewSession, previewToken, dashboardBaseUrl = null, surfaceId, theme, themeId = null, themeSelectionId = null, themeSelectionVersion = null, themeSelectionUpdatedAt = null, themeSelectionButtonPersonalityId = null, runtimePaletteState, themeSelectionHeaderLayoutId = null, themeSelectionHeaderStyleId = null, themeSelectionHeaderLookId = null, themeSelectionFooterLookId = null, themeSelectionHeaderContext, themeSelectionFooterContext, pageId, routeId, entryData, contentTypeSchema, referenceContentTypeKeys = [], draftContent, currentTemplate, initialStatus, initialBlocks, pageMetadata, isSiteLaunched, maintenanceModeEnabled, entrySubrouteContext, assistantPanel, sdkConfig, mediaAssets, bookingOfferingPresets, supabaseUrl, themeRuntime = defaultPreviewThemeRuntime, designEditorEligibility, hideSiteStyleConfigurator = false, baseFetch }) {
68867
+ function PreviewShell({ children, apiBaseUrl, blockApiConfig, siteId, siteSlug, editableId, previewSession, previewToken, dashboardBaseUrl = null, surfaceId, theme, themeId = null, themeSelectionId = null, themeSelectionVersion = null, themeSelectionUpdatedAt = null, themeSelectionButtonPersonalityId = null, runtimePaletteState, themeSelectionHeaderLayoutId = null, themeSelectionHeaderStyleId = null, themeSelectionHeaderLookId = null, themeSelectionFooterLookId = null, themeSelectionHeaderContext, themeSelectionFooterContext, pageId, routeId, entryData, contentTypeSchema, referenceContentTypeKeys = [], draftContent, currentTemplate, initialStatus, initialBlocks, pageMetadata, isSiteLaunched, maintenanceModeEnabled, entrySubrouteContext, assistantPanel, sdkConfig, mediaAssets, bookingOfferingPresets, supabaseUrl, themeRuntime = defaultPreviewThemeRuntime, designEditorEligibility, hideSiteStyleConfigurator = false, baseFetch, onFooterSaved }) {
68521
68868
  const apiClient = useMemo(() => createBearerAPIClient(previewToken, apiBaseUrl), [previewToken, apiBaseUrl]);
68522
68869
  const resolvedDesignEditorEligibility = designEditorEligibility ?? defaultDesignEditorEligibility({
68523
68870
  pageId,
@@ -68592,6 +68939,7 @@ function PreviewShell({ children, apiBaseUrl, blockApiConfig, siteId, siteSlug,
68592
68939
  bookingOfferingPresets,
68593
68940
  themeRuntime,
68594
68941
  siteStyleAccess,
68942
+ onFooterSaved,
68595
68943
  children
68596
68944
  })]
68597
68945
  })
@@ -69105,6 +69453,12 @@ function normalizeTextChildren(input) {
69105
69453
  if (Array.isArray(input)) return input.map((item) => normalizeTextChildren(item)).join("");
69106
69454
  return "";
69107
69455
  }
69456
+ function renderPreviewRichTextToolbarHost(toolbar) {
69457
+ return /* @__PURE__ */ jsx(PreviewChromeFloatingBar, {
69458
+ anchorSelector: "[data-rb-preview-richtext-editor]",
69459
+ children: toolbar
69460
+ });
69461
+ }
69108
69462
  const RichTextWithEditor = ({ value, path, linkedEntryField, ...rest }) => {
69109
69463
  const { isEditingMode } = useEditor();
69110
69464
  if (isEditingMode && (path || linkedEntryField)) return /* @__PURE__ */ jsx(PreviewRichTextEditor, {
@@ -69113,6 +69467,7 @@ const RichTextWithEditor = ({ value, path, linkedEntryField, ...rest }) => {
69113
69467
  linkedEntryField,
69114
69468
  onLinkedEntryFieldFocus: dispatchLinkedEntryFieldFocusEvent,
69115
69469
  onBlockFieldFocus: dispatchBlockFieldFocusEventFromPath,
69470
+ renderToolbarHost: renderPreviewRichTextToolbarHost,
69116
69471
  doc: value
69117
69472
  });
69118
69473
  return /* @__PURE__ */ jsx(RichText, {
@@ -69715,30 +70070,81 @@ function BackgroundChooser({ capability, current, imagePoolStatus, onChoose }) {
69715
70070
  })(event);
69716
70071
  }
69717
70072
  });
69718
- const renderGradientOptions = () => capability.gradientIds?.length ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
69719
- className: "mb-1 text-xs font-medium text-muted-foreground",
69720
- children: "Gradients"
69721
- }), /* @__PURE__ */ jsx("div", {
69722
- className: "space-y-1",
69723
- children: capability.gradientIds.map((gradientId) => /* @__PURE__ */ jsx("button", {
69724
- type: "button",
69725
- className: `w-full rounded-md border px-2 py-1 text-left text-xs hover:bg-muted ${current.kind === "gradient" && current.gradientId === gradientId ? "border-foreground" : "bg-background"}`,
69726
- onClick: chooseFromClick({
69727
- kind: "gradient",
69728
- gradientId
69729
- }),
69730
- children: /* @__PURE__ */ jsxs("span", {
69731
- className: "flex items-center gap-2",
70073
+ const renderGradientOptions = () => capability.gradientIds?.length ? /* @__PURE__ */ jsxs("div", { children: [
70074
+ /* @__PURE__ */ jsx("div", {
70075
+ className: "mb-1 text-xs font-medium text-muted-foreground",
70076
+ children: "Gradients"
70077
+ }),
70078
+ /* @__PURE__ */ jsx("p", {
70079
+ className: "mb-2 text-[11px] leading-4 text-muted-foreground",
70080
+ children: "Curated presets use this site's colours. The full section preview shows the final result."
70081
+ }),
70082
+ /* @__PURE__ */ jsx("div", {
70083
+ className: "grid grid-cols-2 gap-2",
70084
+ children: capability.gradientIds.map((gradientId) => {
70085
+ const preset = getGradientPreset(gradientId);
70086
+ const kindLabel = gradientKindLabel(preset);
70087
+ const selected = current.kind === "gradient" && current.gradientId === gradientId;
70088
+ return /* @__PURE__ */ jsxs("button", {
70089
+ type: "button",
70090
+ "aria-label": `Choose ${preset.name}, ${kindLabel}`,
70091
+ "aria-pressed": selected,
70092
+ className: `overflow-hidden rounded-md border text-left text-xs transition hover:border-muted-foreground ${selected ? "border-foreground ring-1 ring-foreground" : "bg-background"}`,
70093
+ onClick: chooseFromClick({
70094
+ kind: "gradient",
70095
+ gradientId
70096
+ }),
70097
+ children: [/* @__PURE__ */ jsx("span", {
70098
+ "aria-hidden": "true",
70099
+ className: "block h-14 w-full border-b",
70100
+ style: { backgroundImage: gradientPreviewCss(gradientId) }
70101
+ }), /* @__PURE__ */ jsxs("span", {
70102
+ className: "relative block min-w-0 px-2 py-1.5",
70103
+ children: [
70104
+ /* @__PURE__ */ jsx("span", {
70105
+ className: "block truncate font-medium",
70106
+ children: preset.name
70107
+ }),
70108
+ /* @__PURE__ */ jsx("span", {
70109
+ className: "block text-[10px] text-muted-foreground",
70110
+ children: kindLabel
70111
+ }),
70112
+ selected ? /* @__PURE__ */ jsx("span", {
70113
+ "aria-hidden": "true",
70114
+ className: "absolute right-2 top-1.5 grid h-4 w-4 place-items-center rounded-full bg-foreground text-[10px] text-background",
70115
+ children: "✓"
70116
+ }) : null
70117
+ ]
70118
+ })]
70119
+ }, gradientId);
70120
+ })
70121
+ }),
70122
+ current.kind === "gradient" ? /* @__PURE__ */ jsxs("div", {
70123
+ className: "mt-2 flex items-center justify-between gap-2 border-t pt-2",
70124
+ children: [/* @__PURE__ */ jsxs("span", {
70125
+ className: "flex min-w-0 items-center gap-2",
69732
70126
  children: [/* @__PURE__ */ jsx("span", {
69733
- className: "h-4 w-8 shrink-0 rounded border",
69734
- style: { backgroundImage: gradientPreviewCss(gradientId) }
69735
- }), /* @__PURE__ */ jsx("span", {
69736
- className: "truncate",
69737
- children: gradientLabel(gradientId)
70127
+ "aria-hidden": "true",
70128
+ className: "h-7 w-10 shrink-0 rounded border",
70129
+ style: { backgroundImage: gradientPreviewCss(current.gradientId) }
70130
+ }), /* @__PURE__ */ jsxs("span", {
70131
+ className: "min-w-0",
70132
+ children: [/* @__PURE__ */ jsx("span", {
70133
+ className: "block truncate text-xs font-medium",
70134
+ children: gradientLabel(current.gradientId)
70135
+ }), /* @__PURE__ */ jsx("span", {
70136
+ className: "block text-[10px] text-muted-foreground",
70137
+ children: "Selected for this section"
70138
+ })]
69738
70139
  })]
69739
- })
69740
- }, gradientId))
69741
- })] }) : null;
70140
+ }), capability.modes.includes("default") ? /* @__PURE__ */ jsx("button", {
70141
+ type: "button",
70142
+ className: "shrink-0 rounded px-1.5 py-1 text-xs font-medium hover:bg-muted",
70143
+ onClick: chooseFromClick(defaultBackgroundOverrideForMode("default", capability)),
70144
+ children: "Use default"
70145
+ }) : null]
70146
+ }) : null
70147
+ ] }) : null;
69742
70148
  const renderImageOptions = () => capability.modes.includes("image") ? /* @__PURE__ */ jsxs("div", { children: [
69743
70149
  /* @__PURE__ */ jsx("div", {
69744
70150
  className: "mb-1 text-xs font-medium text-muted-foreground",
@@ -69970,7 +70376,15 @@ function backgroundModeLabel(mode) {
69970
70376
  return mode === "default" ? "Default" : formatVariantLabel(mode);
69971
70377
  }
69972
70378
  function gradientLabel(gradientId) {
69973
- return GRADIENT_PRESETS.find((preset) => preset.id === gradientId)?.name ?? formatVariantLabel(gradientId);
70379
+ return getGradientPreset(gradientId).name;
70380
+ }
70381
+ function gradientKindLabel(preset) {
70382
+ switch (preset.type) {
70383
+ case "linear": return "Linear";
70384
+ case "radial": return "Radial · top";
70385
+ case "conic": return "Conic";
70386
+ default: return assertNever$6(preset.type, "Unhandled gradient preset type");
70387
+ }
69974
70388
  }
69975
70389
  function imageSourceLabel(source) {
69976
70390
  switch (source) {
@@ -69984,8 +70398,7 @@ function tokenSwatchCss(token) {
69984
70398
  return `rgb(var(--tb-${token}))`;
69985
70399
  }
69986
70400
  function gradientPreviewCss(gradientId) {
69987
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === gradientId);
69988
- if (!preset) return "linear-gradient(135deg, rgb(var(--tb-primary)), rgb(var(--tb-secondary)))";
70401
+ const preset = getGradientPreset(gradientId);
69989
70402
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, tokenSwatchCss(stop.color)])));
69990
70403
  }
69991
70404
  function readBackgroundColorPaletteSnapshot() {