@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
@@ -44,6 +44,12 @@ function parsePublicProductCategorySelector(value) {
44
44
  }
45
45
  //#endregion
46
46
  //#region ../api/src/apiEndpointTypes.ts
47
+ function allowedDemoMutationPolicy() {
48
+ return {
49
+ classification: "allowed",
50
+ publicMessage: ""
51
+ };
52
+ }
47
53
  function blockedDemoMutationPolicy(classification, publicMessage) {
48
54
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
49
55
  return {
@@ -71,6 +77,7 @@ const TAG_TEMPLATES = {
71
77
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
72
78
  routeById: "riverbank:route:{routeId}",
73
79
  pageById: "riverbank:page:{pageId}",
80
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
74
81
  workflowRunById: "riverbank:workflow-run:{runId}",
75
82
  siteForms: "riverbank:site:{siteId}:forms",
76
83
  formById: "riverbank:form:{formId}",
@@ -96,6 +103,7 @@ const TAG_TEMPLATES = {
96
103
  const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
97
104
  const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
98
105
  const DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
106
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
99
107
  const API_ENDPOINTS$1 = {
100
108
  aiContentUpdateChat: {
101
109
  path: "/ai/content-update-chat",
@@ -2234,6 +2242,49 @@ const API_ENDPOINTS$1 = {
2234
2242
  auth: "user",
2235
2243
  responseKind: "json"
2236
2244
  },
2245
+ updatePageSurfaceDraftContent: {
2246
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/content",
2247
+ method: "PUT",
2248
+ errors: [
2249
+ "validation:invalid_input",
2250
+ "resource:not_found",
2251
+ "resource:conflict",
2252
+ "server:internal_error"
2253
+ ],
2254
+ tags: [TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById],
2255
+ auth: "user",
2256
+ responseKind: "json"
2257
+ },
2258
+ discardPageSurfaceDraftContent: {
2259
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/content/draft",
2260
+ method: "DELETE",
2261
+ errors: [
2262
+ "validation:invalid_input",
2263
+ "resource:not_found",
2264
+ "resource:conflict",
2265
+ "server:internal_error"
2266
+ ],
2267
+ tags: [TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById],
2268
+ auth: "user",
2269
+ responseKind: "json"
2270
+ },
2271
+ updatePageSurfaceRouteMetadata: {
2272
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/metadata",
2273
+ method: "PATCH",
2274
+ errors: [
2275
+ "validation:invalid_input",
2276
+ "resource:not_found",
2277
+ "resource:conflict",
2278
+ "server:internal_error"
2279
+ ],
2280
+ tags: [
2281
+ TAG_TEMPLATES.siteCollection,
2282
+ TAG_TEMPLATES.siteRoutableContent,
2283
+ TAG_TEMPLATES.pageSurfaceById
2284
+ ],
2285
+ auth: "user",
2286
+ responseKind: "json"
2287
+ },
2237
2288
  runSdkWorkflow: {
2238
2289
  path: "/sites/{siteId}/content/{type}/{entryId}/workflows/{workflowId}/run",
2239
2290
  method: "POST",
@@ -2614,6 +2665,50 @@ const API_ENDPOINTS$1 = {
2614
2665
  errors: [],
2615
2666
  responseKind: "json"
2616
2667
  },
2668
+ getFooterComposition: {
2669
+ path: "/sites/{siteId}/settings/footer-composition",
2670
+ method: "GET",
2671
+ revalidate: 120,
2672
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2673
+ auth: "user",
2674
+ errors: ["resource:not_found", "server:internal_error"],
2675
+ responseKind: "json"
2676
+ },
2677
+ updateFooterComposition: {
2678
+ path: "/sites/{siteId}/settings/footer-composition",
2679
+ method: "POST",
2680
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2681
+ auth: "user",
2682
+ demoMutation: DEMO_MUTATION_ALLOWED,
2683
+ errors: [
2684
+ "validation:invalid_input",
2685
+ "resource:not_found",
2686
+ "server:internal_error"
2687
+ ],
2688
+ responseKind: "json"
2689
+ },
2690
+ getPublicProfile: {
2691
+ path: "/sites/{siteId}/settings/public-profile",
2692
+ method: "GET",
2693
+ revalidate: 120,
2694
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2695
+ auth: "user",
2696
+ errors: ["resource:not_found", "server:internal_error"],
2697
+ responseKind: "json"
2698
+ },
2699
+ updatePublicProfile: {
2700
+ path: "/sites/{siteId}/settings/public-profile",
2701
+ method: "POST",
2702
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
2703
+ auth: "user",
2704
+ demoMutation: DEMO_MUTATION_ALLOWED,
2705
+ errors: [
2706
+ "validation:invalid_input",
2707
+ "resource:not_found",
2708
+ "server:internal_error"
2709
+ ],
2710
+ responseKind: "json"
2711
+ },
2617
2712
  updateSiteLayoutSettings: {
2618
2713
  path: "/sites/{siteId}/settings/layout",
2619
2714
  method: "POST",
@@ -3686,6 +3781,76 @@ const API_ENDPOINTS$1 = {
3686
3781
  responseKind: "json",
3687
3782
  errors: ["resource:not_found"]
3688
3783
  },
3784
+ listPageSurfaceContentSlots: {
3785
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots",
3786
+ method: "GET",
3787
+ tags: [
3788
+ TAG_TEMPLATES.siteCollection,
3789
+ TAG_TEMPLATES.pageSurfaceById,
3790
+ "surface-slots",
3791
+ "blocks"
3792
+ ],
3793
+ auth: "user",
3794
+ responseKind: "json",
3795
+ errors: [
3796
+ "resource:not_found",
3797
+ "resource:conflict",
3798
+ "server:internal_error"
3799
+ ]
3800
+ },
3801
+ createPageSurfaceSlotBlock: {
3802
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks",
3803
+ method: "POST",
3804
+ tags: [
3805
+ TAG_TEMPLATES.siteCollection,
3806
+ TAG_TEMPLATES.pageSurfaceById,
3807
+ "surface-slot-{slotKey}",
3808
+ "blocks"
3809
+ ],
3810
+ auth: "user",
3811
+ responseKind: "json",
3812
+ errors: [
3813
+ "validation:invalid_input",
3814
+ "resource:not_found",
3815
+ "resource:conflict",
3816
+ "server:internal_error"
3817
+ ]
3818
+ },
3819
+ reorderPageSurfaceSlotBlocks: {
3820
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks/reorder",
3821
+ method: "POST",
3822
+ tags: [
3823
+ TAG_TEMPLATES.siteCollection,
3824
+ TAG_TEMPLATES.pageSurfaceById,
3825
+ "surface-slot-{slotKey}",
3826
+ "blocks"
3827
+ ],
3828
+ auth: "user",
3829
+ responseKind: "json",
3830
+ errors: [
3831
+ "validation:invalid_input",
3832
+ "resource:not_found",
3833
+ "resource:conflict",
3834
+ "server:internal_error"
3835
+ ]
3836
+ },
3837
+ deletePageSurfaceSlotBlock: {
3838
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/slots/{slotKey}/blocks/{blockId}",
3839
+ method: "DELETE",
3840
+ tags: [
3841
+ TAG_TEMPLATES.siteCollection,
3842
+ TAG_TEMPLATES.pageSurfaceById,
3843
+ "surface-slot-{slotKey}",
3844
+ "blocks"
3845
+ ],
3846
+ auth: "user",
3847
+ responseKind: "json",
3848
+ errors: [
3849
+ "resource:not_found",
3850
+ "resource:conflict",
3851
+ "server:internal_error"
3852
+ ]
3853
+ },
3689
3854
  createBlock: {
3690
3855
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3691
3856
  method: "POST",
@@ -6169,6 +6334,41 @@ const API_ENDPOINTS$1 = {
6169
6334
  auth: "service",
6170
6335
  responseKind: "json"
6171
6336
  },
6337
+ sdkCatalogTheme: {
6338
+ path: "/sdk/{siteId}/catalog/theme",
6339
+ method: "GET",
6340
+ errors: ["server:internal_error"],
6341
+ auth: "service",
6342
+ responseKind: "json"
6343
+ },
6344
+ sdkCatalogBlocks: {
6345
+ path: "/sdk/{siteId}/catalog/blocks",
6346
+ method: "GET",
6347
+ errors: ["server:internal_error"],
6348
+ auth: "service",
6349
+ responseKind: "json"
6350
+ },
6351
+ sdkCatalogContentTypes: {
6352
+ path: "/sdk/{siteId}/catalog/content-types",
6353
+ method: "GET",
6354
+ errors: ["server:internal_error"],
6355
+ auth: "service",
6356
+ responseKind: "json"
6357
+ },
6358
+ sdkCapabilities: {
6359
+ path: "/sdk/{siteId}/capabilities",
6360
+ method: "GET",
6361
+ errors: ["server:internal_error"],
6362
+ auth: "service",
6363
+ responseKind: "json"
6364
+ },
6365
+ sdkListDemoContent: {
6366
+ path: "/sdk/{siteId}/demo-content",
6367
+ method: "GET",
6368
+ errors: ["server:internal_error"],
6369
+ auth: "service",
6370
+ responseKind: "json"
6371
+ },
6172
6372
  sdkPullPages: {
6173
6373
  path: "/sdk/{siteId}/pull/pages",
6174
6374
  method: "GET",
@@ -6298,6 +6498,19 @@ const API_ENDPOINTS$1 = {
6298
6498
  auth: "service",
6299
6499
  responseKind: "json"
6300
6500
  },
6501
+ sdkPatchPageBlock: {
6502
+ path: "/sdk/{siteId}/pages/{identifier}/blocks/{blockIdentifier}",
6503
+ method: "PATCH",
6504
+ errors: [
6505
+ "validation:invalid_input",
6506
+ "resource:not_found",
6507
+ "resource:conflict",
6508
+ "billing:plan_limit_exceeded",
6509
+ "server:internal_error"
6510
+ ],
6511
+ auth: "service",
6512
+ responseKind: "json"
6513
+ },
6301
6514
  sdkReorderPageBlocks: {
6302
6515
  path: "/sdk/{siteId}/pages/{identifier}/blocks/reorder",
6303
6516
  method: "POST",
@@ -7190,17 +7403,17 @@ function buildEndpointURL(baseURL, endpoint) {
7190
7403
  function isFormDataBody(value) {
7191
7404
  return typeof FormData !== "undefined" && value instanceof FormData;
7192
7405
  }
7193
- function isUnknownArray(value) {
7406
+ function isUnknownArray$1(value) {
7194
7407
  return Array.isArray(value);
7195
7408
  }
7196
7409
  function appendQueryParam(queryParams, key, value) {
7197
7410
  if (value === void 0 || value === null) return;
7198
- if (isUnknownArray(value)) {
7411
+ if (isUnknownArray$1(value)) {
7199
7412
  const stack = [...value].reverse();
7200
7413
  while (stack.length > 0) {
7201
7414
  const item = stack.pop();
7202
7415
  if (item === void 0 || item === null) continue;
7203
- if (isUnknownArray(item)) {
7416
+ if (isUnknownArray$1(item)) {
7204
7417
  stack.push(...[...item].reverse());
7205
7418
  continue;
7206
7419
  }
@@ -7573,7 +7786,7 @@ var SimpleCache = class {
7573
7786
  * 1. This constant
7574
7787
  * 2. The "version" field in package.json
7575
7788
  */
7576
- const SDK_VERSION = "0.107.0";
7789
+ const SDK_VERSION = "0.109.0";
7577
7790
  //#endregion
7578
7791
  //#region src/client/error.ts
7579
7792
  let _Symbol$for;
@@ -10174,19 +10387,29 @@ function isRecord$12(value) {
10174
10387
  //#region ../core/src/booking-date-time.ts
10175
10388
  const DEFAULT_LOCALE = "en-US";
10176
10389
  const FALLBACK_TIMEZONE = "UTC";
10390
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
10391
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
10392
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
10177
10393
  function isValidTimeZone(timeZone) {
10394
+ const cached = timeZoneValidityCache.get(timeZone);
10395
+ if (cached !== void 0) return cached;
10396
+ let isValid;
10178
10397
  try {
10179
10398
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
10180
- return true;
10399
+ isValid = true;
10181
10400
  } catch {
10182
- return false;
10401
+ isValid = false;
10183
10402
  }
10403
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
10404
+ timeZoneValidityCache.set(timeZone, isValid);
10405
+ return isValid;
10184
10406
  }
10185
10407
  function getSafeTimeZone(timeZone) {
10186
10408
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
10187
10409
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
10188
10410
  }
10189
10411
  function parseStrictBookingTimeZone(timeZone) {
10412
+ if (typeof timeZone !== "string") return null;
10190
10413
  const normalized = timeZone.trim();
10191
10414
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
10192
10415
  return normalized;
@@ -10199,10 +10422,19 @@ function formatParseError(error) {
10199
10422
  }
10200
10423
  }
10201
10424
  function formatToPartsLookup(date, locale, timeZone, format) {
10202
- return new Map(new Intl.DateTimeFormat(locale, {
10425
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
10426
+ }
10427
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
10428
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
10429
+ const cached = dateTimeFormatterCache.get(key);
10430
+ if (cached !== void 0) return cached;
10431
+ const formatter = new Intl.DateTimeFormat(locale, {
10203
10432
  ...format,
10204
10433
  timeZone
10205
- }).formatToParts(date).map((part) => [part.type, part.value]));
10434
+ });
10435
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
10436
+ dateTimeFormatterCache.set(key, formatter);
10437
+ return formatter;
10206
10438
  }
10207
10439
  function getZonedDateTimeParts(date, timeZone) {
10208
10440
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -10245,23 +10477,9 @@ function toUtcIsoDateTimeString(value) {
10245
10477
  return parsed.value;
10246
10478
  }
10247
10479
  function parseScheduledBookingDateTime(input) {
10480
+ let startsAt;
10248
10481
  try {
10249
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
10250
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
10251
- if (timeZone === null) return {
10252
- ok: false,
10253
- field: "timeZone",
10254
- reason: "invalid_time_zone",
10255
- value: input.timeZone
10256
- };
10257
- return {
10258
- ok: true,
10259
- value: {
10260
- startsAt,
10261
- timeZone,
10262
- locale: input.locale
10263
- }
10264
- };
10482
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
10265
10483
  } catch {
10266
10484
  return {
10267
10485
  ok: false,
@@ -10270,6 +10488,21 @@ function parseScheduledBookingDateTime(input) {
10270
10488
  value: input.startsAt
10271
10489
  };
10272
10490
  }
10491
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
10492
+ if (timeZone === null) return {
10493
+ ok: false,
10494
+ field: "timeZone",
10495
+ reason: "invalid_time_zone",
10496
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
10497
+ };
10498
+ return {
10499
+ ok: true,
10500
+ value: {
10501
+ startsAt,
10502
+ timeZone,
10503
+ locale: input.locale
10504
+ }
10505
+ };
10273
10506
  }
10274
10507
  function toScheduledBookingDateTime(input) {
10275
10508
  const result = parseScheduledBookingDateTime(input);
@@ -13399,6 +13632,111 @@ const mediaSchema$1 = z.object({
13399
13632
  transform: transformSchema$1.optional()
13400
13633
  });
13401
13634
  //#endregion
13635
+ //#region ../theme-core/src/buttons/effectClassification.ts
13636
+ /**
13637
+ * Exhaustive live policy for every registered effect id.
13638
+ *
13639
+ * The resolver consumes the transition payload directly, so adding an effect
13640
+ * cannot update classification without also defining its runtime behavior.
13641
+ */
13642
+ const BUTTON_EFFECT_POLICIES = {
13643
+ "darken-background": {
13644
+ classification: "colour-transition",
13645
+ transition: {
13646
+ kind: "adjust-shade",
13647
+ direction: "darker"
13648
+ }
13649
+ },
13650
+ "lighten-background": {
13651
+ classification: "colour-transition",
13652
+ transition: {
13653
+ kind: "adjust-shade",
13654
+ direction: "lighter"
13655
+ }
13656
+ },
13657
+ "background-on-hover": {
13658
+ classification: "colour-transition",
13659
+ transition: { kind: "replace-background" }
13660
+ },
13661
+ "background-on-hover-alpha": {
13662
+ classification: "unsupported-colour",
13663
+ reason: "alpha_requires_surface"
13664
+ },
13665
+ "fade-background": {
13666
+ classification: "unsupported-colour",
13667
+ reason: "changes_element_opacity"
13668
+ },
13669
+ "opacity-reduce": {
13670
+ classification: "unsupported-colour",
13671
+ reason: "changes_element_opacity"
13672
+ },
13673
+ "gradient-text": {
13674
+ classification: "unsupported-colour",
13675
+ reason: "changes_foreground"
13676
+ },
13677
+ "text-color-change": {
13678
+ classification: "unsupported-colour",
13679
+ reason: "changes_foreground"
13680
+ },
13681
+ "border-color-change": {
13682
+ classification: "unsupported-colour",
13683
+ reason: "changes_border"
13684
+ },
13685
+ "aurora-glow": {
13686
+ classification: "unsupported-background-overlay",
13687
+ reason: "unresolved_background_overlay"
13688
+ },
13689
+ "cosmic-stardust": {
13690
+ classification: "unsupported-background-overlay",
13691
+ reason: "unresolved_background_overlay"
13692
+ },
13693
+ "gradient-border-fill": {
13694
+ classification: "unsupported-background-overlay",
13695
+ reason: "unresolved_background_overlay"
13696
+ },
13697
+ "animated-gradient-border-fill": {
13698
+ classification: "unsupported-background-overlay",
13699
+ reason: "unresolved_background_overlay"
13700
+ },
13701
+ "nav-underline": {
13702
+ classification: "not-button",
13703
+ reason: "not_button_effect"
13704
+ },
13705
+ "nav-frosted-base": {
13706
+ classification: "not-button",
13707
+ reason: "not_button_effect"
13708
+ },
13709
+ "nav-frosted-hover": {
13710
+ classification: "not-button",
13711
+ reason: "not_button_effect"
13712
+ },
13713
+ "nav-frosted-active": {
13714
+ classification: "not-button",
13715
+ reason: "not_button_effect"
13716
+ },
13717
+ "animated-gradient": { classification: "non-colour" },
13718
+ "border-glow": { classification: "non-colour" },
13719
+ "drop-shadow": { classification: "non-colour" },
13720
+ "inner-shadow": { classification: "non-colour" },
13721
+ "neumorphic-shadow": { classification: "non-colour" },
13722
+ "outer-glow": { classification: "non-colour" },
13723
+ "retro-3d-shadow": { classification: "non-colour" },
13724
+ "scale-up": { classification: "non-colour" },
13725
+ "scale-down": { classification: "non-colour" },
13726
+ lift: { classification: "non-colour" },
13727
+ "press-down": { classification: "non-colour" },
13728
+ pop: { classification: "non-colour" },
13729
+ "border-bottom-grow": { classification: "non-colour" },
13730
+ "sketchy-border": { classification: "non-colour" },
13731
+ "pulse-animation": { classification: "non-colour" }
13732
+ };
13733
+ function getButtonEffectPolicy(effectId) {
13734
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
13735
+ }
13736
+ function classifyButtonEffectId(effectId) {
13737
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
13738
+ }
13739
+ //#endregion
13402
13740
  //#region ../theme-core/src/buttons/types.ts
13403
13741
  /**
13404
13742
  * Standard semantic variant roles a theme exposes.
@@ -13415,6 +13753,20 @@ const VARIANT_ROLES = [
13415
13753
  "tertiary",
13416
13754
  "accent"
13417
13755
  ];
13756
+ function parseOpaqueButtonColourToken(value) {
13757
+ const token = parseThemeColorToken(value);
13758
+ if (token === null) return null;
13759
+ const parts = parseColorTokenParts(token);
13760
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
13761
+ }
13762
+ function unsafeAsOpaqueButtonColourToken(value) {
13763
+ return value;
13764
+ }
13765
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
13766
+ const token = parseOpaqueButtonColourToken(value);
13767
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
13768
+ return token;
13769
+ });
13418
13770
  const cornerStyleSchema = z$1.enum([
13419
13771
  "square",
13420
13772
  "rounded",
@@ -13516,7 +13868,7 @@ const buttonSizesSchema = z$1.object({
13516
13868
  lg,
13517
13869
  xl: xl ?? lg
13518
13870
  }));
13519
- const buttonGlobalSettingsSchema = z$1.object({
13871
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
13520
13872
  cornerStyle: cornerStyleSchema,
13521
13873
  cornerRadius: z$1.number().min(0).max(24).optional(),
13522
13874
  /**
@@ -13547,11 +13899,12 @@ const buttonGlobalSettingsSchema = z$1.object({
13547
13899
  paddingPreset: buttonPaddingPresetSchema.optional(),
13548
13900
  hoverTransform: hoverTransformSchema,
13549
13901
  hoverColor: hoverColorSchema,
13550
- hoverColorToken: themeColorTokenSchema.optional(),
13902
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
13551
13903
  gradientStyle: gradientStyleSchema.optional(),
13552
13904
  gradientAngle: z$1.number().min(0).max(360).optional(),
13553
13905
  gradientSharpness: gradientSharpnessSchema.optional()
13554
13906
  });
13907
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
13555
13908
  const gradientDirectionSchema$1 = z$1.enum([
13556
13909
  "to-r",
13557
13910
  "to-l",
@@ -13565,27 +13918,33 @@ const gradientDirectionSchema$1 = z$1.enum([
13565
13918
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
13566
13919
  z$1.object({
13567
13920
  type: z$1.literal("solid"),
13568
- colorToken: themeColorTokenSchema
13921
+ colorToken: opaqueButtonColourTokenSchema
13569
13922
  }),
13570
13923
  z$1.object({
13571
13924
  type: z$1.literal("gradient"),
13572
- stops: z$1.array(themeColorTokenSchema).min(2),
13573
- direction: gradientDirectionSchema$1
13925
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
13926
+ const [first, second, ...rest] = stops;
13927
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
13928
+ return [
13929
+ first,
13930
+ second,
13931
+ ...rest
13932
+ ];
13933
+ }),
13934
+ direction: gradientDirectionSchema$1,
13935
+ foregroundToken: opaqueButtonColourTokenSchema
13574
13936
  }),
13575
- z$1.object({ type: z$1.literal("transparent") })
13937
+ z$1.object({
13938
+ type: z$1.literal("surface"),
13939
+ role: z$1.literal("link")
13940
+ })
13576
13941
  ]);
13577
13942
  const effectApplicationSchema$1 = z$1.object({
13578
13943
  effectId: z$1.string(),
13579
- options: z$1.record(z$1.string(), z$1.any()).optional()
13580
- });
13581
- const buttonBorderSchema = z$1.object({
13582
- widthClass: z$1.string(),
13583
- colorToken: themeColorTokenSchema
13584
- });
13585
- const buttonVariantAffordanceSchema = z$1.object({
13586
- iconId: z$1.string().min(1),
13587
- colorToken: themeColorTokenSchema.optional()
13944
+ options: z$1.record(z$1.string(), z$1.json()).optional()
13588
13945
  });
13946
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
13947
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
13589
13948
  const variantShadowSchema = z$1.object({
13590
13949
  elevation: z$1.enum([
13591
13950
  "none",
@@ -13626,27 +13985,170 @@ const variantSizeOverridesSchema = z$1.object({
13626
13985
  * default (e.g. link-style variants declaring zero horizontal padding at
13627
13986
  * every size).
13628
13987
  */
13629
- const buttonVariantSchema = z$1.object({
13988
+ const canonicalButtonVariantSchema = z$1.object({
13630
13989
  id: z$1.string(),
13631
13990
  name: z$1.string().min(1).max(20),
13632
13991
  enabled: z$1.boolean(),
13633
13992
  priority: prioritySchema,
13634
13993
  background: buttonBackgroundSchema,
13635
- textColorToken: themeColorTokenSchema,
13636
13994
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
13637
13995
  borderRadius: z$1.string().optional(),
13638
13996
  shadow: variantShadowSchema.optional(),
13639
13997
  border: buttonBorderSchema.optional(),
13640
- hoverBackgroundToken: z$1.string().optional(),
13998
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
13641
13999
  effects: variantEffectsSchema.optional(),
13642
14000
  sizes: variantSizeOverridesSchema.optional(),
13643
14001
  affordance: buttonVariantAffordanceSchema.optional()
13644
14002
  });
14003
+ /**
14004
+ * Temporary persisted-theme admission boundary for issue #1206.
14005
+ *
14006
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
14007
+ * `textColorToken`/border colour shape. New source and all downstream code use
14008
+ * only the canonical relationship. Delete this preprocessor after the reviewed
14009
+ * production rewrite reports zero legacy rows.
14010
+ */
14011
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
13645
14012
  const buttonSystemSchema = z$1.object({
13646
14013
  global: buttonGlobalSettingsSchema,
13647
14014
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
13648
14015
  sizes: buttonSizesSchema.optional()
13649
14016
  });
14017
+ function normalizeLegacyButtonVariantInput(input) {
14018
+ if (!isUnknownRecord(input)) return input;
14019
+ const background = input.background;
14020
+ if (!isUnknownRecord(background)) return input;
14021
+ if (!(background.type === "transparent" || Object.prototype.hasOwnProperty.call(input, "textColorToken") || isUnknownRecord(input.border) && Object.prototype.hasOwnProperty.call(input.border, "colorToken") || hasLegacyButtonEffects(input.effects) || hasLegacyAlphaToken(input, background))) return input;
14022
+ const { textColorToken, ...withoutLegacyText } = input;
14023
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
14024
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
14025
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
14026
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
14027
+ if (background.type === "transparent") return {
14028
+ ...withoutLegacyText,
14029
+ background: {
14030
+ type: "surface",
14031
+ role: "link"
14032
+ },
14033
+ border: normalizedBorder,
14034
+ affordance: normalizedAffordance,
14035
+ effects: normalizedEffects,
14036
+ hoverBackgroundToken
14037
+ };
14038
+ if (background.type === "gradient") {
14039
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
14040
+ return {
14041
+ ...withoutLegacyText,
14042
+ background: {
14043
+ ...background,
14044
+ stops,
14045
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
14046
+ },
14047
+ border: normalizedBorder,
14048
+ affordance: normalizedAffordance,
14049
+ effects: normalizedEffects,
14050
+ hoverBackgroundToken
14051
+ };
14052
+ }
14053
+ return {
14054
+ ...withoutLegacyText,
14055
+ background: background.type === "solid" ? {
14056
+ ...background,
14057
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
14058
+ } : background,
14059
+ border: normalizedBorder,
14060
+ affordance: normalizedAffordance,
14061
+ effects: normalizedEffects,
14062
+ hoverBackgroundToken
14063
+ };
14064
+ }
14065
+ function normalizeLegacyButtonGlobalInput(input) {
14066
+ if (!isUnknownRecord(input)) return input;
14067
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
14068
+ return hoverColorToken === input.hoverColorToken ? input : {
14069
+ ...input,
14070
+ hoverColorToken
14071
+ };
14072
+ }
14073
+ function hasLegacyAlphaToken(input, background) {
14074
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
14075
+ return [
14076
+ input.hoverBackgroundToken,
14077
+ background.colorToken,
14078
+ background.foregroundToken,
14079
+ ...stops
14080
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
14081
+ }
14082
+ function stripLegacyTokenAlpha(value) {
14083
+ if (typeof value !== "string") return value;
14084
+ const slashIndex = value.indexOf("/");
14085
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
14086
+ }
14087
+ function hasLegacyButtonEffects(input) {
14088
+ if (!isUnknownRecord(input)) return false;
14089
+ return [
14090
+ "base",
14091
+ "hover",
14092
+ "active",
14093
+ "focus"
14094
+ ].some((state) => {
14095
+ const effects = input[state];
14096
+ return Array.isArray(effects) && effects.some((effect) => {
14097
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
14098
+ const classification = classifyButtonEffectId(effect.effectId);
14099
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
14100
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
14101
+ });
14102
+ });
14103
+ }
14104
+ function normalizeLegacyButtonEffects(input, backgroundType) {
14105
+ if (!isUnknownRecord(input)) return input;
14106
+ const normalized = {};
14107
+ for (const state of [
14108
+ "base",
14109
+ "hover",
14110
+ "active",
14111
+ "focus"
14112
+ ]) {
14113
+ const effects = input[state];
14114
+ if (!Array.isArray(effects)) continue;
14115
+ const safeEffects = effects.flatMap((effect) => {
14116
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
14117
+ const classification = classifyButtonEffectId(effect.effectId);
14118
+ if (classification === "non-colour") return [effect];
14119
+ if (classification !== "colour-transition") return [];
14120
+ if (effect.effectId === "background-on-hover") {
14121
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
14122
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
14123
+ return colorToken === null ? [] : [{
14124
+ ...effect,
14125
+ options: {
14126
+ ...options,
14127
+ colorToken
14128
+ }
14129
+ }];
14130
+ }
14131
+ if (backgroundType !== "solid") return [];
14132
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
14133
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
14134
+ return [{
14135
+ ...effect,
14136
+ options: {
14137
+ ...isUnknownRecord(effect.options) ? effect.options : {},
14138
+ amount
14139
+ }
14140
+ }];
14141
+ });
14142
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
14143
+ }
14144
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
14145
+ }
14146
+ function isUnknownRecord(value) {
14147
+ return typeof value === "object" && value !== null && !Array.isArray(value);
14148
+ }
14149
+ function isUnknownArray(value) {
14150
+ return Array.isArray(value);
14151
+ }
13650
14152
  buttonSizeNameSchema.options;
13651
14153
  //#endregion
13652
14154
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -13673,7 +14175,7 @@ function defineButtonPersonality(input) {
13673
14175
  name: input.name,
13674
14176
  description: input.description,
13675
14177
  tags: input.tags,
13676
- buttonSystem: input.buttonSystem
14178
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
13677
14179
  };
13678
14180
  }
13679
14181
  //#endregion
@@ -13726,19 +14228,15 @@ const brushedWash = defineButtonPersonality({
13726
14228
  background: {
13727
14229
  type: "gradient",
13728
14230
  stops: ["primary", "accent"],
13729
- direction: "to-r"
14231
+ direction: "to-r",
14232
+ foregroundToken: "primaryForeground"
13730
14233
  },
13731
- textColorToken: "primaryForeground",
13732
14234
  borderRadius: "rounded-lg",
13733
14235
  shadow: {
13734
14236
  elevation: "low",
13735
14237
  softness: "soft",
13736
14238
  position: "bottom"
13737
- },
13738
- effects: { hover: [{
13739
- effectId: "opacity-reduce",
13740
- options: { reduction: -15 }
13741
- }] }
14239
+ }
13742
14240
  },
13743
14241
  {
13744
14242
  id: "secondary",
@@ -13748,32 +14246,27 @@ const brushedWash = defineButtonPersonality({
13748
14246
  background: {
13749
14247
  type: "gradient",
13750
14248
  stops: ["secondary", "accent"],
13751
- direction: "to-br"
14249
+ direction: "to-br",
14250
+ foregroundToken: "primaryForeground"
13752
14251
  },
13753
- textColorToken: "primaryForeground",
13754
14252
  borderRadius: "rounded-lg",
13755
14253
  shadow: {
13756
14254
  elevation: "low",
13757
14255
  softness: "soft",
13758
14256
  position: "bottom"
13759
- },
13760
- effects: { hover: [{
13761
- effectId: "opacity-reduce",
13762
- options: { reduction: -15 }
13763
- }] }
14257
+ }
13764
14258
  },
13765
14259
  {
13766
14260
  id: "outline",
13767
14261
  name: "Outline",
13768
14262
  enabled: true,
13769
14263
  priority: 3,
13770
- background: { type: "transparent" },
13771
- textColorToken: "primary",
13772
- borderRadius: "rounded-lg",
13773
- border: {
13774
- widthClass: "border",
13775
- colorToken: "primary"
14264
+ background: {
14265
+ type: "surface",
14266
+ role: "link"
13776
14267
  },
14268
+ borderRadius: "rounded-lg",
14269
+ border: { widthClass: "border" },
13777
14270
  effects: { hover: [{
13778
14271
  effectId: "background-on-hover",
13779
14272
  options: { colorToken: "surface" }
@@ -13784,8 +14277,10 @@ const brushedWash = defineButtonPersonality({
13784
14277
  name: "Ghost",
13785
14278
  enabled: true,
13786
14279
  priority: 3,
13787
- background: { type: "transparent" },
13788
- textColorToken: "text",
14280
+ background: {
14281
+ type: "surface",
14282
+ role: "link"
14283
+ },
13789
14284
  borderRadius: "rounded-lg",
13790
14285
  effects: { hover: [{
13791
14286
  effectId: "background-on-hover",
@@ -13831,7 +14326,6 @@ const confidentChip = defineButtonPersonality({
13831
14326
  type: "solid",
13832
14327
  colorToken: "primary"
13833
14328
  },
13834
- textColorToken: "primaryForeground",
13835
14329
  borderRadius: "rounded-md",
13836
14330
  shadow: {
13837
14331
  elevation: "medium",
@@ -13841,7 +14335,7 @@ const confidentChip = defineButtonPersonality({
13841
14335
  effects: {
13842
14336
  hover: [{
13843
14337
  effectId: "darken-background",
13844
- options: { amount: 60 }
14338
+ options: { amount: 100 }
13845
14339
  }],
13846
14340
  active: [{
13847
14341
  effectId: "scale-down",
@@ -13858,12 +14352,8 @@ const confidentChip = defineButtonPersonality({
13858
14352
  type: "solid",
13859
14353
  colorToken: "surface"
13860
14354
  },
13861
- textColorToken: "text",
13862
14355
  borderRadius: "rounded-md",
13863
- border: {
13864
- widthClass: "border",
13865
- colorToken: "border"
13866
- },
14356
+ border: { widthClass: "border" },
13867
14357
  effects: { hover: [{
13868
14358
  effectId: "background-on-hover",
13869
14359
  options: { colorToken: "background" }
@@ -13874,13 +14364,12 @@ const confidentChip = defineButtonPersonality({
13874
14364
  name: "Outline",
13875
14365
  enabled: true,
13876
14366
  priority: 3,
13877
- background: { type: "transparent" },
13878
- textColorToken: "primary",
13879
- borderRadius: "rounded-md",
13880
- border: {
13881
- widthClass: "border",
13882
- colorToken: "primary"
14367
+ background: {
14368
+ type: "surface",
14369
+ role: "link"
13883
14370
  },
14371
+ borderRadius: "rounded-md",
14372
+ border: { widthClass: "border" },
13884
14373
  effects: { hover: [{
13885
14374
  effectId: "background-on-hover",
13886
14375
  options: { colorToken: "surface" }
@@ -13891,8 +14380,10 @@ const confidentChip = defineButtonPersonality({
13891
14380
  name: "Ghost",
13892
14381
  enabled: true,
13893
14382
  priority: 3,
13894
- background: { type: "transparent" },
13895
- textColorToken: "primary",
14383
+ background: {
14384
+ type: "surface",
14385
+ role: "link"
14386
+ },
13896
14387
  borderRadius: "rounded-md",
13897
14388
  effects: { hover: [{
13898
14389
  effectId: "background-on-hover",
@@ -13955,7 +14446,6 @@ const earthPill = defineButtonPersonality({
13955
14446
  type: "solid",
13956
14447
  colorToken: "primary"
13957
14448
  },
13958
- textColorToken: "primaryForeground",
13959
14449
  borderRadius: "rounded-full",
13960
14450
  shadow: {
13961
14451
  elevation: "low",
@@ -13981,13 +14471,12 @@ const earthPill = defineButtonPersonality({
13981
14471
  name: "Secondary",
13982
14472
  enabled: true,
13983
14473
  priority: 2,
13984
- background: { type: "transparent" },
13985
- textColorToken: "primary",
13986
- borderRadius: "rounded-full",
13987
- border: {
13988
- widthClass: "border",
13989
- colorToken: "primary"
14474
+ background: {
14475
+ type: "surface",
14476
+ role: "link"
13990
14477
  },
14478
+ borderRadius: "rounded-full",
14479
+ border: { widthClass: "border" },
13991
14480
  effects: { hover: [{
13992
14481
  effectId: "background-on-hover",
13993
14482
  options: { colorToken: "muted" }
@@ -13998,13 +14487,12 @@ const earthPill = defineButtonPersonality({
13998
14487
  name: "Outline",
13999
14488
  enabled: true,
14000
14489
  priority: 3,
14001
- background: { type: "transparent" },
14002
- textColorToken: "text",
14003
- borderRadius: "rounded-full",
14004
- border: {
14005
- widthClass: "border",
14006
- colorToken: "border"
14490
+ background: {
14491
+ type: "surface",
14492
+ role: "link"
14007
14493
  },
14494
+ borderRadius: "rounded-full",
14495
+ border: { widthClass: "border" },
14008
14496
  effects: { hover: [{
14009
14497
  effectId: "background-on-hover",
14010
14498
  options: { colorToken: "surfaceAlt" }
@@ -14015,8 +14503,10 @@ const earthPill = defineButtonPersonality({
14015
14503
  name: "Ghost",
14016
14504
  enabled: true,
14017
14505
  priority: 3,
14018
- background: { type: "transparent" },
14019
- textColorToken: "primary",
14506
+ background: {
14507
+ type: "surface",
14508
+ role: "link"
14509
+ },
14020
14510
  borderRadius: "rounded-full",
14021
14511
  shadow: {
14022
14512
  elevation: "none",
@@ -14037,11 +14527,7 @@ const earthPill = defineButtonPersonality({
14037
14527
  padding: "0.625rem 0",
14038
14528
  fontSize: "text-xl"
14039
14529
  }
14040
- },
14041
- effects: { hover: [{
14042
- effectId: "opacity-reduce",
14043
- options: { reduction: 25 }
14044
- }] }
14530
+ }
14045
14531
  }
14046
14532
  ]
14047
14533
  }
@@ -14077,8 +14563,10 @@ const editorialLink = defineButtonPersonality({
14077
14563
  name: "Primary",
14078
14564
  enabled: true,
14079
14565
  priority: 1,
14080
- background: { type: "transparent" },
14081
- textColorToken: "text",
14566
+ background: {
14567
+ type: "surface",
14568
+ role: "link"
14569
+ },
14082
14570
  borderRadius: "rounded-none",
14083
14571
  sizes: {
14084
14572
  sm: { padding: "0.25rem 0" },
@@ -14100,8 +14588,10 @@ const editorialLink = defineButtonPersonality({
14100
14588
  name: "Secondary",
14101
14589
  enabled: true,
14102
14590
  priority: 2,
14103
- background: { type: "transparent" },
14104
- textColorToken: "mutedText",
14591
+ background: {
14592
+ type: "surface",
14593
+ role: "link"
14594
+ },
14105
14595
  borderRadius: "rounded-none",
14106
14596
  sizes: {
14107
14597
  sm: { padding: "0.25rem 0" },
@@ -14123,8 +14613,10 @@ const editorialLink = defineButtonPersonality({
14123
14613
  name: "Outline",
14124
14614
  enabled: true,
14125
14615
  priority: 3,
14126
- background: { type: "transparent" },
14127
- textColorToken: "accent",
14616
+ background: {
14617
+ type: "surface",
14618
+ role: "link"
14619
+ },
14128
14620
  borderRadius: "rounded-none",
14129
14621
  sizes: {
14130
14622
  sm: { padding: "0.25rem 0" },
@@ -14146,19 +14638,17 @@ const editorialLink = defineButtonPersonality({
14146
14638
  name: "Ghost",
14147
14639
  enabled: true,
14148
14640
  priority: 3,
14149
- background: { type: "transparent" },
14150
- textColorToken: "mutedText",
14641
+ background: {
14642
+ type: "surface",
14643
+ role: "link"
14644
+ },
14151
14645
  borderRadius: "rounded-none",
14152
14646
  sizes: {
14153
14647
  sm: { padding: "0.25rem 0" },
14154
14648
  md: { padding: "0.5rem 0" },
14155
14649
  lg: { padding: "0.625rem 0" },
14156
14650
  xl: { padding: "0.75rem 0" }
14157
- },
14158
- effects: { hover: [{
14159
- effectId: "opacity-reduce",
14160
- options: { reduction: -20 }
14161
- }] }
14651
+ }
14162
14652
  }
14163
14653
  ]
14164
14654
  }
@@ -14220,12 +14710,8 @@ const flatInk = defineButtonPersonality({
14220
14710
  type: "solid",
14221
14711
  colorToken: "primary"
14222
14712
  },
14223
- textColorToken: "primaryForeground",
14224
14713
  borderRadius: "rounded-lg",
14225
- affordance: {
14226
- iconId: "ArrowRight",
14227
- colorToken: "accent"
14228
- },
14714
+ affordance: { iconId: "ArrowRight" },
14229
14715
  effects: { hover: [{
14230
14716
  effectId: "lift",
14231
14717
  options: { translateY: "-2px" }
@@ -14239,13 +14725,12 @@ const flatInk = defineButtonPersonality({
14239
14725
  name: "Secondary",
14240
14726
  enabled: true,
14241
14727
  priority: 2,
14242
- background: { type: "transparent" },
14243
- textColorToken: "primary",
14244
- borderRadius: "rounded-lg",
14245
- border: {
14246
- widthClass: "border",
14247
- colorToken: "border"
14728
+ background: {
14729
+ type: "surface",
14730
+ role: "link"
14248
14731
  },
14732
+ borderRadius: "rounded-lg",
14733
+ border: { widthClass: "border" },
14249
14734
  effects: { hover: [{
14250
14735
  effectId: "lift",
14251
14736
  options: { translateY: "-2px" }
@@ -14263,12 +14748,8 @@ const flatInk = defineButtonPersonality({
14263
14748
  type: "solid",
14264
14749
  colorToken: "accent"
14265
14750
  },
14266
- textColorToken: "accentForeground",
14267
14751
  borderRadius: "rounded-lg",
14268
- affordance: {
14269
- iconId: "ArrowRight",
14270
- colorToken: "accentForeground"
14271
- },
14752
+ affordance: { iconId: "ArrowRight" },
14272
14753
  effects: { hover: [{
14273
14754
  effectId: "lift",
14274
14755
  options: { translateY: "-2px" }
@@ -14331,7 +14812,6 @@ const inkStamp = defineButtonPersonality({
14331
14812
  type: "solid",
14332
14813
  colorToken: "primary"
14333
14814
  },
14334
- textColorToken: "primaryForeground",
14335
14815
  borderRadius: "rounded-md",
14336
14816
  effects: {
14337
14817
  hover: [{
@@ -14352,13 +14832,12 @@ const inkStamp = defineButtonPersonality({
14352
14832
  name: "Secondary",
14353
14833
  enabled: true,
14354
14834
  priority: 2,
14355
- background: { type: "transparent" },
14356
- textColorToken: "primary",
14357
- borderRadius: "rounded-md",
14358
- border: {
14359
- widthClass: "border-2",
14360
- colorToken: "primary"
14835
+ background: {
14836
+ type: "surface",
14837
+ role: "link"
14361
14838
  },
14839
+ borderRadius: "rounded-md",
14840
+ border: { widthClass: "border-2" },
14362
14841
  effects: { hover: [{
14363
14842
  effectId: "background-on-hover",
14364
14843
  options: { colorToken: "surface" }
@@ -14369,13 +14848,12 @@ const inkStamp = defineButtonPersonality({
14369
14848
  name: "Outline",
14370
14849
  enabled: true,
14371
14850
  priority: 3,
14372
- background: { type: "transparent" },
14373
- textColorToken: "text",
14374
- borderRadius: "rounded-md",
14375
- border: {
14376
- widthClass: "border-2",
14377
- colorToken: "border"
14851
+ background: {
14852
+ type: "surface",
14853
+ role: "link"
14378
14854
  },
14855
+ borderRadius: "rounded-md",
14856
+ border: { widthClass: "border-2" },
14379
14857
  effects: { hover: [{
14380
14858
  effectId: "background-on-hover",
14381
14859
  options: { colorToken: "surface" }
@@ -14386,8 +14864,10 @@ const inkStamp = defineButtonPersonality({
14386
14864
  name: "Ghost",
14387
14865
  enabled: true,
14388
14866
  priority: 3,
14389
- background: { type: "transparent" },
14390
- textColorToken: "accent",
14867
+ background: {
14868
+ type: "surface",
14869
+ role: "link"
14870
+ },
14391
14871
  borderRadius: "rounded-none",
14392
14872
  sizes: {
14393
14873
  sm: {
@@ -14480,7 +14960,6 @@ const joyStamp = defineButtonPersonality({
14480
14960
  type: "solid",
14481
14961
  colorToken: "primary"
14482
14962
  },
14483
- textColorToken: "primaryForeground",
14484
14963
  borderRadius: "rounded-full",
14485
14964
  shadow: {
14486
14965
  elevation: "high",
@@ -14494,13 +14973,12 @@ const joyStamp = defineButtonPersonality({
14494
14973
  name: "Secondary",
14495
14974
  enabled: true,
14496
14975
  priority: 2,
14497
- background: { type: "transparent" },
14498
- textColorToken: "text",
14499
- borderRadius: "rounded-full",
14500
- border: {
14501
- widthClass: "border-2",
14502
- colorToken: "text"
14976
+ background: {
14977
+ type: "surface",
14978
+ role: "link"
14503
14979
  },
14980
+ borderRadius: "rounded-full",
14981
+ border: { widthClass: "border-2" },
14504
14982
  shadow: {
14505
14983
  elevation: "high",
14506
14984
  softness: "hard",
@@ -14565,12 +15043,8 @@ const ornateRitual = defineButtonPersonality({
14565
15043
  type: "solid",
14566
15044
  colorToken: "primary"
14567
15045
  },
14568
- textColorToken: "primaryForeground",
14569
15046
  borderRadius: "rounded-md",
14570
- border: {
14571
- widthClass: "border",
14572
- colorToken: "primary"
14573
- },
15047
+ border: { widthClass: "border" },
14574
15048
  effects: {
14575
15049
  hover: [{
14576
15050
  effectId: "background-on-hover",
@@ -14591,12 +15065,8 @@ const ornateRitual = defineButtonPersonality({
14591
15065
  type: "solid",
14592
15066
  colorToken: "secondary"
14593
15067
  },
14594
- textColorToken: "primaryForeground",
14595
15068
  borderRadius: "rounded-md",
14596
- border: {
14597
- widthClass: "border",
14598
- colorToken: "primary"
14599
- },
15069
+ border: { widthClass: "border" },
14600
15070
  effects: { hover: [{
14601
15071
  effectId: "background-on-hover",
14602
15072
  options: { colorToken: "surface" }
@@ -14607,13 +15077,12 @@ const ornateRitual = defineButtonPersonality({
14607
15077
  name: "Outline",
14608
15078
  enabled: true,
14609
15079
  priority: 3,
14610
- background: { type: "transparent" },
14611
- textColorToken: "primary",
14612
- borderRadius: "rounded-md",
14613
- border: {
14614
- widthClass: "border",
14615
- colorToken: "primary"
15080
+ background: {
15081
+ type: "surface",
15082
+ role: "link"
14616
15083
  },
15084
+ borderRadius: "rounded-md",
15085
+ border: { widthClass: "border" },
14617
15086
  effects: { hover: [{
14618
15087
  effectId: "background-on-hover",
14619
15088
  options: { colorToken: "muted" }
@@ -14624,8 +15093,10 @@ const ornateRitual = defineButtonPersonality({
14624
15093
  name: "Ghost",
14625
15094
  enabled: true,
14626
15095
  priority: 3,
14627
- background: { type: "transparent" },
14628
- textColorToken: "accent",
15096
+ background: {
15097
+ type: "surface",
15098
+ role: "link"
15099
+ },
14629
15100
  borderRadius: "rounded-none",
14630
15101
  sizes: {
14631
15102
  sm: {
@@ -14707,14 +15178,10 @@ const pebble = defineButtonPersonality({
14707
15178
  type: "solid",
14708
15179
  colorToken: "primary"
14709
15180
  },
14710
- textColorToken: "primaryForeground",
14711
15181
  borderRadius: "rounded-full",
14712
15182
  effects: { hover: [{
14713
- effectId: "background-on-hover-alpha",
14714
- options: {
14715
- colorToken: "primary",
14716
- opacity: 88
14717
- }
15183
+ effectId: "darken-background",
15184
+ options: { amount: 100 }
14718
15185
  }] }
14719
15186
  },
14720
15187
  {
@@ -14722,13 +15189,12 @@ const pebble = defineButtonPersonality({
14722
15189
  name: "Secondary",
14723
15190
  enabled: true,
14724
15191
  priority: 2,
14725
- background: { type: "transparent" },
14726
- textColorToken: "primary",
14727
- borderRadius: "rounded-full",
14728
- border: {
14729
- widthClass: "border-2",
14730
- colorToken: "accent"
15192
+ background: {
15193
+ type: "surface",
15194
+ role: "link"
14731
15195
  },
15196
+ borderRadius: "rounded-full",
15197
+ border: { widthClass: "border-2" },
14732
15198
  effects: { hover: [{
14733
15199
  effectId: "background-on-hover",
14734
15200
  options: { colorToken: "accent" }
@@ -14739,13 +15205,12 @@ const pebble = defineButtonPersonality({
14739
15205
  name: "Outline",
14740
15206
  enabled: true,
14741
15207
  priority: 3,
14742
- background: { type: "transparent" },
14743
- textColorToken: "text",
14744
- borderRadius: "rounded-full",
14745
- border: {
14746
- widthClass: "border",
14747
- colorToken: "border"
15208
+ background: {
15209
+ type: "surface",
15210
+ role: "link"
14748
15211
  },
15212
+ borderRadius: "rounded-full",
15213
+ border: { widthClass: "border" },
14749
15214
  effects: { hover: [{
14750
15215
  effectId: "background-on-hover",
14751
15216
  options: { colorToken: "surface" }
@@ -14756,8 +15221,10 @@ const pebble = defineButtonPersonality({
14756
15221
  name: "Ghost",
14757
15222
  enabled: true,
14758
15223
  priority: 3,
14759
- background: { type: "transparent" },
14760
- textColorToken: "primary",
15224
+ background: {
15225
+ type: "surface",
15226
+ role: "link"
15227
+ },
14761
15228
  borderRadius: "rounded-full",
14762
15229
  sizes: {
14763
15230
  sm: {
@@ -14773,11 +15240,7 @@ const pebble = defineButtonPersonality({
14773
15240
  padding: "0.75rem 1.5rem",
14774
15241
  fontSize: "text-xl"
14775
15242
  }
14776
- },
14777
- effects: { hover: [{
14778
- effectId: "opacity-reduce",
14779
- options: { reduction: 30 }
14780
- }] }
15243
+ }
14781
15244
  }
14782
15245
  ]
14783
15246
  }
@@ -14839,15 +15302,11 @@ const quietArrow = defineButtonPersonality({
14839
15302
  type: "solid",
14840
15303
  colorToken: "primary"
14841
15304
  },
14842
- textColorToken: "primaryForeground",
14843
15305
  borderRadius: "rounded-xl",
14844
15306
  affordance: { iconId: "ArrowRight" },
14845
15307
  effects: { hover: [{
14846
- effectId: "background-on-hover-alpha",
14847
- options: {
14848
- colorToken: "primary",
14849
- opacity: 90
14850
- }
15308
+ effectId: "darken-background",
15309
+ options: { amount: 100 }
14851
15310
  }] }
14852
15311
  },
14853
15312
  {
@@ -14855,13 +15314,12 @@ const quietArrow = defineButtonPersonality({
14855
15314
  name: "Secondary",
14856
15315
  enabled: true,
14857
15316
  priority: 2,
14858
- background: { type: "transparent" },
14859
- textColorToken: "primary",
14860
- borderRadius: "rounded-xl",
14861
- border: {
14862
- widthClass: "border",
14863
- colorToken: "primary"
15317
+ background: {
15318
+ type: "surface",
15319
+ role: "link"
14864
15320
  },
15321
+ borderRadius: "rounded-xl",
15322
+ border: { widthClass: "border" },
14865
15323
  affordance: { iconId: "ArrowRight" },
14866
15324
  effects: { hover: [{
14867
15325
  effectId: "background-on-hover",
@@ -14873,21 +15331,22 @@ const quietArrow = defineButtonPersonality({
14873
15331
  name: "Outline",
14874
15332
  enabled: true,
14875
15333
  priority: 3,
14876
- background: { type: "transparent" },
14877
- textColorToken: "primary",
15334
+ background: {
15335
+ type: "surface",
15336
+ role: "link"
15337
+ },
14878
15338
  borderRadius: "rounded-xl",
14879
- border: {
14880
- widthClass: "border",
14881
- colorToken: "primary"
14882
- }
15339
+ border: { widthClass: "border" }
14883
15340
  },
14884
15341
  {
14885
15342
  id: "ghost",
14886
15343
  name: "Ghost",
14887
15344
  enabled: true,
14888
15345
  priority: 3,
14889
- background: { type: "transparent" },
14890
- textColorToken: "primary",
15346
+ background: {
15347
+ type: "surface",
15348
+ role: "link"
15349
+ },
14891
15350
  borderRadius: "rounded-xl"
14892
15351
  }
14893
15352
  ]
@@ -14951,7 +15410,6 @@ const showtimePill = defineButtonPersonality({
14951
15410
  type: "solid",
14952
15411
  colorToken: "primary"
14953
15412
  },
14954
- textColorToken: "background",
14955
15413
  borderRadius: "rounded-full",
14956
15414
  effects: { hover: [{ effectId: "pop" }] }
14957
15415
  },
@@ -14960,13 +15418,12 @@ const showtimePill = defineButtonPersonality({
14960
15418
  name: "Secondary",
14961
15419
  enabled: true,
14962
15420
  priority: 2,
14963
- background: { type: "transparent" },
14964
- textColorToken: "primary",
14965
- borderRadius: "rounded-full",
14966
- border: {
14967
- widthClass: "border-2",
14968
- colorToken: "primary"
15421
+ background: {
15422
+ type: "surface",
15423
+ role: "link"
14969
15424
  },
15425
+ borderRadius: "rounded-full",
15426
+ border: { widthClass: "border-2" },
14970
15427
  effects: { hover: [{ effectId: "pop" }] }
14971
15428
  },
14972
15429
  {
@@ -14978,7 +15435,6 @@ const showtimePill = defineButtonPersonality({
14978
15435
  type: "solid",
14979
15436
  colorToken: "secondary"
14980
15437
  },
14981
- textColorToken: "primary",
14982
15438
  borderRadius: "rounded-full",
14983
15439
  effects: { hover: [{ effectId: "pop" }] }
14984
15440
  },
@@ -14991,12 +15447,8 @@ const showtimePill = defineButtonPersonality({
14991
15447
  type: "solid",
14992
15448
  colorToken: "background"
14993
15449
  },
14994
- textColorToken: "primary",
14995
15450
  borderRadius: "rounded-full",
14996
- border: {
14997
- widthClass: "border-2",
14998
- colorToken: "primary"
14999
- },
15451
+ border: { widthClass: "border-2" },
15000
15452
  effects: { hover: [{
15001
15453
  effectId: "background-on-hover",
15002
15454
  options: { colorToken: "surface" }
@@ -15007,13 +15459,12 @@ const showtimePill = defineButtonPersonality({
15007
15459
  name: "Outline",
15008
15460
  enabled: true,
15009
15461
  priority: 3,
15010
- background: { type: "transparent" },
15011
- textColorToken: "primary",
15012
- borderRadius: "rounded-full",
15013
- border: {
15014
- widthClass: "border-2",
15015
- colorToken: "primary"
15462
+ background: {
15463
+ type: "surface",
15464
+ role: "link"
15016
15465
  },
15466
+ borderRadius: "rounded-full",
15467
+ border: { widthClass: "border-2" },
15017
15468
  effects: { hover: [{
15018
15469
  effectId: "background-on-hover",
15019
15470
  options: { colorToken: "background" }
@@ -15024,8 +15475,10 @@ const showtimePill = defineButtonPersonality({
15024
15475
  name: "Ghost",
15025
15476
  enabled: true,
15026
15477
  priority: 3,
15027
- background: { type: "transparent" },
15028
- textColorToken: "primary",
15478
+ background: {
15479
+ type: "surface",
15480
+ role: "link"
15481
+ },
15029
15482
  borderRadius: "rounded-full",
15030
15483
  effects: { hover: [{
15031
15484
  effectId: "background-on-hover",
@@ -15036,104 +15489,151 @@ const showtimePill = defineButtonPersonality({
15036
15489
  }
15037
15490
  });
15038
15491
  //#endregion
15039
- //#region ../theme-core/src/buttons/personalities/index.ts
15040
- const buttonPersonalities = [
15041
- defineButtonPersonality({
15042
- id: "soft-pill",
15043
- name: "Soft Pill",
15044
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
15045
- tags: {
15046
- tone: "classic",
15047
- energy: "calm",
15048
- motion: "subtle",
15049
- era: "organic"
15492
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
15493
+ /**
15494
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
15495
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
15496
+ */
15497
+ const softPill = defineButtonPersonality({
15498
+ id: "soft-pill",
15499
+ name: "Soft Pill",
15500
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
15501
+ tags: {
15502
+ tone: "classic",
15503
+ energy: "calm",
15504
+ motion: "subtle",
15505
+ era: "organic"
15506
+ },
15507
+ buttonSystem: {
15508
+ global: {
15509
+ cornerStyle: "pill",
15510
+ shadow: "low",
15511
+ textTransform: "none",
15512
+ fontWeight: 500,
15513
+ borderWidth: 2,
15514
+ hoverTransform: "lift",
15515
+ hoverColor: "none"
15050
15516
  },
15051
- buttonSystem: {
15052
- global: {
15053
- cornerStyle: "pill",
15054
- shadow: "low",
15055
- textTransform: "none",
15056
- fontWeight: 500,
15057
- borderWidth: 2,
15058
- hoverTransform: "lift",
15059
- hoverColor: "none"
15517
+ variants: [
15518
+ {
15519
+ id: "primary",
15520
+ name: "Primary",
15521
+ enabled: true,
15522
+ priority: 1,
15523
+ background: {
15524
+ type: "solid",
15525
+ colorToken: "primary"
15526
+ },
15527
+ borderRadius: "rounded-full",
15528
+ shadow: {
15529
+ elevation: "low",
15530
+ softness: "soft",
15531
+ position: "bottom"
15532
+ },
15533
+ effects: {
15534
+ hover: [{
15535
+ effectId: "lift",
15536
+ options: { translateY: "-1px" }
15537
+ }],
15538
+ active: [{
15539
+ effectId: "scale-down",
15540
+ options: { scale: "0.98" }
15541
+ }]
15542
+ }
15060
15543
  },
15061
- variants: [
15062
- {
15063
- id: "primary",
15064
- name: "Primary",
15065
- enabled: true,
15066
- priority: 1,
15067
- background: {
15068
- type: "solid",
15069
- colorToken: "primary"
15070
- },
15071
- textColorToken: "primaryForeground",
15072
- borderRadius: "rounded-full",
15073
- shadow: {
15074
- elevation: "low",
15075
- softness: "soft",
15076
- position: "bottom"
15077
- },
15078
- effects: {
15079
- hover: [{
15080
- effectId: "lift",
15081
- options: { translateY: "-1px" }
15082
- }],
15083
- active: [{
15084
- effectId: "scale-down",
15085
- options: { scale: "0.98" }
15086
- }]
15087
- }
15544
+ {
15545
+ id: "secondary",
15546
+ name: "Secondary",
15547
+ enabled: true,
15548
+ priority: 2,
15549
+ background: {
15550
+ type: "surface",
15551
+ role: "link"
15088
15552
  },
15089
- {
15090
- id: "secondary",
15091
- name: "Secondary",
15092
- enabled: true,
15093
- priority: 2,
15094
- background: { type: "transparent" },
15095
- textColorToken: "primary",
15096
- borderRadius: "rounded-full",
15097
- border: {
15098
- widthClass: "border-2",
15099
- colorToken: "primary"
15100
- },
15101
- effects: { hover: [{
15102
- effectId: "background-on-hover",
15103
- options: { colorToken: "surface" }
15104
- }] }
15553
+ borderRadius: "rounded-full",
15554
+ border: { widthClass: "border-2" },
15555
+ effects: { hover: [{
15556
+ effectId: "background-on-hover",
15557
+ options: { colorToken: "surface" }
15558
+ }] }
15559
+ },
15560
+ {
15561
+ id: "outline",
15562
+ name: "Outline",
15563
+ enabled: true,
15564
+ priority: 3,
15565
+ background: {
15566
+ type: "surface",
15567
+ role: "link"
15105
15568
  },
15106
- {
15107
- id: "outline",
15108
- name: "Outline",
15109
- enabled: true,
15110
- priority: 3,
15111
- background: { type: "transparent" },
15112
- textColorToken: "text",
15113
- borderRadius: "rounded-full",
15114
- border: {
15115
- widthClass: "border",
15116
- colorToken: "border"
15117
- },
15118
- effects: { hover: [{
15119
- effectId: "background-on-hover",
15120
- options: { colorToken: "surface" }
15121
- }] }
15569
+ borderRadius: "rounded-full",
15570
+ border: { widthClass: "border" },
15571
+ effects: { hover: [{
15572
+ effectId: "background-on-hover",
15573
+ options: { colorToken: "surface" }
15574
+ }] }
15575
+ },
15576
+ {
15577
+ id: "ghost",
15578
+ name: "Ghost",
15579
+ enabled: true,
15580
+ priority: 3,
15581
+ background: {
15582
+ type: "surface",
15583
+ role: "link"
15122
15584
  },
15123
- {
15124
- id: "ghost",
15125
- name: "Ghost",
15126
- enabled: true,
15127
- priority: 3,
15128
- background: { type: "transparent" },
15129
- textColorToken: "text",
15130
- borderRadius: "rounded-full",
15131
- effects: { hover: [{
15132
- effectId: "background-on-hover",
15133
- options: { colorToken: "surface" }
15134
- }] }
15135
- }
15136
- ]
15585
+ borderRadius: "rounded-full",
15586
+ effects: { hover: [{
15587
+ effectId: "background-on-hover",
15588
+ options: { colorToken: "surface" }
15589
+ }] }
15590
+ }
15591
+ ]
15592
+ }
15593
+ });
15594
+ //#endregion
15595
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
15596
+ const solidSecondary = {
15597
+ id: "secondary",
15598
+ name: "Secondary",
15599
+ enabled: true,
15600
+ priority: 2,
15601
+ background: {
15602
+ type: "solid",
15603
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
15604
+ },
15605
+ borderRadius: "rounded-full",
15606
+ shadow: {
15607
+ elevation: "none",
15608
+ softness: null,
15609
+ position: "bottom"
15610
+ },
15611
+ effects: {
15612
+ hover: [{
15613
+ effectId: "background-on-hover-alpha",
15614
+ options: {
15615
+ colorToken: "secondary",
15616
+ opacity: 88
15617
+ }
15618
+ }],
15619
+ active: [{
15620
+ effectId: "scale-down",
15621
+ options: { scale: "0.98" }
15622
+ }]
15623
+ }
15624
+ };
15625
+ //#endregion
15626
+ //#region ../theme-core/src/buttons/personalities/index.ts
15627
+ const buttonPersonalities = [
15628
+ softPill,
15629
+ defineButtonPersonality({
15630
+ id: "two-tone-pill",
15631
+ name: "Two-tone Pill",
15632
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
15633
+ tags: softPill.tags,
15634
+ buttonSystem: {
15635
+ ...softPill.buttonSystem,
15636
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
15137
15637
  }
15138
15638
  }),
15139
15639
  earthPill,
@@ -15149,6 +15649,27 @@ const buttonPersonalities = [
15149
15649
  quietArrow
15150
15650
  ];
15151
15651
  new Map(buttonPersonalities.map((p) => [p.id, p]));
15652
+ buttonPersonalities.map((personality) => ({
15653
+ id: personality.id,
15654
+ name: personality.name,
15655
+ description: personality.description,
15656
+ category: presetCategory(personality),
15657
+ buttonSystem: personality.buttonSystem,
15658
+ compatibility: {
15659
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
15660
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
15661
+ }
15662
+ }));
15663
+ function presetCategory(personality) {
15664
+ switch (personality.tags.era) {
15665
+ case "retro": return "retro";
15666
+ case "editorial": return "minimal";
15667
+ case "organic": return "artistic";
15668
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
15669
+ case "technical": return "technical";
15670
+ case void 0: return "modern";
15671
+ }
15672
+ }
15152
15673
  //#endregion
15153
15674
  //#region ../theme-core/src/cards/types.ts
15154
15675
  const cardVariantRoleValues = ["default", "alternative"];
@@ -16667,6 +17188,7 @@ const navFontWeight = z$1.enum([
16667
17188
  "bold"
16668
17189
  ]);
16669
17190
  const headerMaxWidth = z$1.enum(["container", "full"]);
17191
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
16670
17192
  const headerContainerSchema = z$1.object({
16671
17193
  rounded: z$1.enum([
16672
17194
  "none",
@@ -16811,6 +17333,7 @@ const headerSchema = z$1.object({
16811
17333
  positioning: headerPositioning,
16812
17334
  shrinkOnScroll: z$1.boolean(),
16813
17335
  maxWidth: headerMaxWidth,
17336
+ barFrame: headerBarFrame.optional(),
16814
17337
  logoOverride: mediaSchema$1.nullable().optional(),
16815
17338
  background: headerBackgroundSchema.default({
16816
17339
  type: "color",
@@ -16820,6 +17343,7 @@ const headerSchema = z$1.object({
16820
17343
  navStyle: headerNavStyle,
16821
17344
  navColor: themeColorTokenSchema.nullable().optional(),
16822
17345
  navWeight: navFontWeight.default("medium"),
17346
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
16823
17347
  navTypography: z$1.enum(["body", "heading"]).optional(),
16824
17348
  navTextSize: navLinkStyleSchema.shape.textSize,
16825
17349
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -16835,7 +17359,21 @@ const headerSchema = z$1.object({
16835
17359
  ctaTreatment: headerCtaTreatmentSchema.optional(),
16836
17360
  ctaVariant: z$1.string().min(1).optional(),
16837
17361
  dropdownStyle: dropdownStyleSchema
16838
- });
17362
+ }).transform(normaliseHeaderNavFontRole);
17363
+ /**
17364
+ * Normalises the legacy `navTypography` font-role alias into the canonical
17365
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
17366
+ * a data migration. `navFontRole` always wins when both are present; the legacy
17367
+ * field is dropped so we never carry a dual write forward.
17368
+ */
17369
+ function normaliseHeaderNavFontRole(header) {
17370
+ if (header.navTypography === void 0) return header;
17371
+ const { navTypography, ...rest } = header;
17372
+ return header.navFontRole === void 0 ? {
17373
+ ...rest,
17374
+ navFontRole: navTypography
17375
+ } : rest;
17376
+ }
16839
17377
  const footerVariant = z$1.enum([
16840
17378
  "simple",
16841
17379
  "columns",
@@ -18609,6 +19147,241 @@ const originalJoyCardSystem = { variants: [{
18609
19147
  const serifDisplayQuote = { style: "serif-display" };
18610
19148
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
18611
19149
  const accentGlyphQuote = { style: "accent-glyph" };
19150
+ /**
19151
+ * Curated library of gradient presets.
19152
+ * All gradients use theme color tokens, so they adapt to the site's palette.
19153
+ */
19154
+ const GRADIENT_PRESETS = [
19155
+ {
19156
+ id: "primary-secondary",
19157
+ name: "Primary to Secondary",
19158
+ description: "Blend your primary and secondary brand colors",
19159
+ type: "linear",
19160
+ angle: 135,
19161
+ stops: [{
19162
+ color: "primary-500",
19163
+ position: 0
19164
+ }, {
19165
+ color: "secondary-500",
19166
+ position: 100
19167
+ }]
19168
+ },
19169
+ {
19170
+ id: "primary-accent",
19171
+ name: "Primary to Accent",
19172
+ description: "Energetic gradient from primary to accent",
19173
+ type: "linear",
19174
+ angle: 135,
19175
+ stops: [{
19176
+ color: "primary-500",
19177
+ position: 0
19178
+ }, {
19179
+ color: "accent-500",
19180
+ position: 100
19181
+ }]
19182
+ },
19183
+ {
19184
+ id: "secondary-accent",
19185
+ name: "Secondary to Accent",
19186
+ description: "Vibrant secondary to accent blend",
19187
+ type: "linear",
19188
+ angle: 135,
19189
+ stops: [{
19190
+ color: "secondary-500",
19191
+ position: 0
19192
+ }, {
19193
+ color: "accent-500",
19194
+ position: 100
19195
+ }]
19196
+ },
19197
+ {
19198
+ id: "primary-light-dark",
19199
+ name: "Primary Light to Dark",
19200
+ description: "Subtle primary color fade",
19201
+ type: "linear",
19202
+ angle: 180,
19203
+ stops: [{
19204
+ color: "primary-500",
19205
+ position: 0
19206
+ }, {
19207
+ color: "primary-900",
19208
+ position: 100
19209
+ }]
19210
+ },
19211
+ {
19212
+ id: "primary-dark-light",
19213
+ name: "Primary Dark to Light",
19214
+ description: "Reverse primary fade",
19215
+ type: "linear",
19216
+ angle: 180,
19217
+ stops: [{
19218
+ color: "primary-900",
19219
+ position: 0
19220
+ }, {
19221
+ color: "primary-50",
19222
+ position: 100
19223
+ }]
19224
+ },
19225
+ {
19226
+ id: "secondary-light-dark",
19227
+ name: "Secondary Light to Dark",
19228
+ description: "Subtle secondary color fade",
19229
+ type: "linear",
19230
+ angle: 180,
19231
+ stops: [{
19232
+ color: "secondary-500",
19233
+ position: 0
19234
+ }, {
19235
+ color: "secondary-900",
19236
+ position: 100
19237
+ }]
19238
+ },
19239
+ {
19240
+ id: "accent-light-dark",
19241
+ name: "Accent Light to Dark",
19242
+ description: "Accent color depth fade",
19243
+ type: "linear",
19244
+ angle: 180,
19245
+ stops: [{
19246
+ color: "accent-500",
19247
+ position: 0
19248
+ }, {
19249
+ color: "accent-900",
19250
+ position: 100
19251
+ }]
19252
+ },
19253
+ {
19254
+ id: "background-surface",
19255
+ name: "Background to Surface",
19256
+ description: "Subtle depth using base colors",
19257
+ type: "linear",
19258
+ angle: 180,
19259
+ stops: [{
19260
+ color: "background",
19261
+ position: 0
19262
+ }, {
19263
+ color: "surface",
19264
+ position: 100
19265
+ }]
19266
+ },
19267
+ {
19268
+ id: "neutral-fade",
19269
+ name: "Neutral Gradient",
19270
+ description: "Elegant neutral color fade",
19271
+ type: "linear",
19272
+ angle: 180,
19273
+ stops: [{
19274
+ color: "neutral-900",
19275
+ position: 0
19276
+ }, {
19277
+ color: "neutral-50",
19278
+ position: 100
19279
+ }]
19280
+ },
19281
+ {
19282
+ id: "primary-glow",
19283
+ name: "Primary glow",
19284
+ description: "A soft top-centred glow using your primary palette",
19285
+ type: "radial",
19286
+ shape: "ellipse",
19287
+ position: "top center",
19288
+ stops: [{
19289
+ color: "primary-900",
19290
+ position: 0
19291
+ }, {
19292
+ color: "primary-950",
19293
+ position: 100
19294
+ }],
19295
+ foreground: {
19296
+ textColor: "onPrimary900",
19297
+ headingColor: "onPrimary900",
19298
+ linkColor: "onPrimary900",
19299
+ supportingColor: "onPrimary900"
19300
+ }
19301
+ },
19302
+ {
19303
+ id: "accent-glow",
19304
+ name: "Accent glow",
19305
+ description: "A soft top-centred glow using your accent palette",
19306
+ type: "radial",
19307
+ shape: "ellipse",
19308
+ position: "top center",
19309
+ stops: [{
19310
+ color: "accent-900",
19311
+ position: 0
19312
+ }, {
19313
+ color: "accent-950",
19314
+ position: 100
19315
+ }],
19316
+ foreground: {
19317
+ textColor: "onAccent900",
19318
+ headingColor: "onAccent900",
19319
+ linkColor: "onAccent900",
19320
+ supportingColor: "onAccent900"
19321
+ }
19322
+ },
19323
+ {
19324
+ id: "primary-secondary-accent",
19325
+ name: "Brand Trio",
19326
+ description: "All three brand colors in harmony",
19327
+ type: "linear",
19328
+ angle: 135,
19329
+ stops: [
19330
+ {
19331
+ color: "primary-500",
19332
+ position: 0
19333
+ },
19334
+ {
19335
+ color: "secondary-500",
19336
+ position: 50
19337
+ },
19338
+ {
19339
+ color: "accent-500",
19340
+ position: 100
19341
+ }
19342
+ ]
19343
+ }
19344
+ ].map((preset) => ({
19345
+ ...preset,
19346
+ id: preset.id,
19347
+ stops: preset.stops
19348
+ }));
19349
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
19350
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
19351
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
19352
+ function parseGradientPresetId(value) {
19353
+ if (typeof value !== "string") return null;
19354
+ const normalized = value.trim();
19355
+ if (!gradientPresetIdSet.has(normalized)) return null;
19356
+ return normalized;
19357
+ }
19358
+ function getGradientPreset(id) {
19359
+ return gradientPresetById[id];
19360
+ }
19361
+ //#endregion
19362
+ //#region ../theme-core/src/gradients/utils.ts
19363
+ /**
19364
+ * Convert a GradientConfig to a CSS gradient string
19365
+ *
19366
+ * @param config - The gradient configuration using theme tokens
19367
+ * @param tokens - Map of theme color tokens to hex values
19368
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
19369
+ */
19370
+ function gradientToCss(config, tokens) {
19371
+ const stops = config.stops.map((stop) => {
19372
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
19373
+ }).join(", ");
19374
+ const type = config.type ?? "linear";
19375
+ if (type === "radial") {
19376
+ const position = config.position ?? "center";
19377
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
19378
+ }
19379
+ if (type === "conic") {
19380
+ const position = config.position ?? "center";
19381
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
19382
+ }
19383
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
19384
+ }
18612
19385
  //#endregion
18613
19386
  //#region ../theme-core/src/site-styles/headerLooks.ts
18614
19387
  function asHeaderLookId(value) {
@@ -18743,7 +19516,7 @@ const overlayLogoAccommodations = [
18743
19516
  * optional nested styling fields that would otherwise leak from another Look.
18744
19517
  */
18745
19518
  function baseHeader(theme) {
18746
- const { navLinkStyle: _navLinkStyle, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
19519
+ const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
18747
19520
  return {
18748
19521
  ...header,
18749
19522
  navContainer: {
@@ -18892,6 +19665,17 @@ const headerStyleCatalog = defineExactCatalog()([
18892
19665
  navTypography: "brand-caps",
18893
19666
  moods: ["expressive"]
18894
19667
  },
19668
+ {
19669
+ id: asHeaderStyleId("brand-capsule"),
19670
+ label: "Brand Capsule",
19671
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
19672
+ supportedLayoutIds: supportedLayouts(["classic"]),
19673
+ navInteraction: "pill-background",
19674
+ surface: "brand-solid",
19675
+ defaultDepth: "shadow",
19676
+ navTypography: "quiet-caps",
19677
+ moods: ["expressive", "professional"]
19678
+ },
18895
19679
  {
18896
19680
  id: asHeaderStyleId("serif-line"),
18897
19681
  label: "Serif Line",
@@ -18985,6 +19769,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
18985
19769
  "brand-bar",
18986
19770
  "brand-underline",
18987
19771
  "brand-pill",
19772
+ "brand-capsule",
18988
19773
  "serif-line",
18989
19774
  "flat-tabs"
18990
19775
  ])],
@@ -19022,6 +19807,11 @@ headerStyleRepairChain([
19022
19807
  "brand-pill",
19023
19808
  "brand-bar",
19024
19809
  "minimal"
19810
+ ]), headerStyleRepairChain([
19811
+ "brand-capsule",
19812
+ "brand-pill",
19813
+ "brand-bar",
19814
+ "minimal"
19025
19815
  ]), headerStyleRepairChain([
19026
19816
  "pill-nav",
19027
19817
  "soft-bar",
@@ -20635,6 +21425,19 @@ z$1.object({
20635
21425
  }).strict();
20636
21426
  //#endregion
20637
21427
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
21428
+ function defineSectionForegroundRuntimeTokens(input) {
21429
+ return {
21430
+ textColor: requireThemeColorToken(input.textColor),
21431
+ headingColor: requireThemeColorToken(input.headingColor),
21432
+ linkColor: requireThemeColorToken(input.linkColor),
21433
+ supportingColor: requireThemeColorToken(input.supportingColor)
21434
+ };
21435
+ }
21436
+ function requireThemeColorToken(value) {
21437
+ const token = parseThemeColorToken(value);
21438
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
21439
+ return token;
21440
+ }
20638
21441
  function defineDesignRuntimeRules(rules) {
20639
21442
  return rules;
20640
21443
  }
@@ -20905,24 +21708,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
20905
21708
  type: "color",
20906
21709
  color: "muted"
20907
21710
  },
20908
- foreground: {
21711
+ foreground: defineSectionForegroundRuntimeTokens({
20909
21712
  textColor: "text",
20910
21713
  headingColor: "primary",
20911
21714
  linkColor: "primary",
20912
21715
  supportingColor: "text"
20913
- }
21716
+ })
20914
21717
  },
20915
21718
  "brand-depth-band": {
20916
21719
  background: {
20917
21720
  type: "color",
20918
21721
  color: "primary-800"
20919
21722
  },
20920
- foreground: {
21723
+ foreground: defineSectionForegroundRuntimeTokens({
20921
21724
  textColor: "text",
20922
21725
  headingColor: "primary",
20923
21726
  linkColor: "primary",
20924
21727
  supportingColor: "text"
20925
- }
21728
+ })
20926
21729
  },
20927
21730
  "hero-image": {
20928
21731
  background: {
@@ -20930,12 +21733,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
20930
21733
  opacity: 1,
20931
21734
  position: "center center"
20932
21735
  },
20933
- foreground: {
21736
+ foreground: defineSectionForegroundRuntimeTokens({
20934
21737
  textColor: "text",
20935
21738
  headingColor: "primary",
20936
21739
  linkColor: "primary",
20937
21740
  supportingColor: "text"
20938
- }
21741
+ })
21742
+ }
21743
+ }
21744
+ });
21745
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
21746
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
21747
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
21748
+ ...defaultDesignRuntimeRules,
21749
+ sectionSurfaces: {
21750
+ ...defaultDesignRuntimeRules.sectionSurfaces,
21751
+ "accent-band": {
21752
+ background: {
21753
+ type: "gradient",
21754
+ gradientPresetId: primaryGlowGradientPresetId
21755
+ },
21756
+ foreground: defineSectionForegroundRuntimeTokens({
21757
+ textColor: "primaryForeground",
21758
+ headingColor: "primaryForeground",
21759
+ linkColor: "primaryForeground",
21760
+ supportingColor: "primaryForeground"
21761
+ })
20939
21762
  }
20940
21763
  }
20941
21764
  });
@@ -21259,6 +22082,7 @@ const curatedSiteStyles = [
21259
22082
  ],
21260
22083
  buttonPersonalityChoices: [
21261
22084
  buttonChoice("soft-pill"),
22085
+ buttonChoice("two-tone-pill"),
21262
22086
  buttonChoice("pebble"),
21263
22087
  buttonChoice("editorial-link"),
21264
22088
  buttonChoice("brushed-wash")
@@ -22322,6 +23146,8 @@ const curatedSiteStyles = [
22322
23146
  },
22323
23147
  compositionBudget: quietBudget,
22324
23148
  typography: fulcrumTypography,
23149
+ designRuntimeRules: fulcrumDesignRuntimeRules,
23150
+ recommendedAppearancePresetIds: ["cta-accent-band"],
22325
23151
  themeOverrides: {
22326
23152
  shadow: { colorToken: "primary" },
22327
23153
  accordions: {
@@ -22438,6 +23264,7 @@ const curatedSiteStyles = [
22438
23264
  ],
22439
23265
  buttonPersonalityChoices: [
22440
23266
  buttonChoice("quiet-arrow"),
23267
+ buttonChoice("two-tone-pill"),
22441
23268
  buttonChoice("flat-ink"),
22442
23269
  buttonChoice("editorial-link")
22443
23270
  ],
@@ -22693,213 +23520,6 @@ z$1.object({
22693
23520
  spacing: z$1.enum(themeTokenRecipeOptions.spacing),
22694
23521
  motion: z$1.enum(themeTokenRecipeOptions.motion)
22695
23522
  });
22696
- //#endregion
22697
- //#region ../theme-core/src/gradients/presets.ts
22698
- /**
22699
- * Curated library of gradient presets
22700
- * All gradients use theme color tokens, so they adapt to the site's palette
22701
- */
22702
- const GRADIENT_PRESETS = [
22703
- {
22704
- id: "primary-secondary",
22705
- name: "Primary to Secondary",
22706
- description: "Blend your primary and secondary brand colors",
22707
- type: "linear",
22708
- angle: 135,
22709
- stops: [{
22710
- color: "primary-500",
22711
- position: 0
22712
- }, {
22713
- color: "secondary-500",
22714
- position: 100
22715
- }]
22716
- },
22717
- {
22718
- id: "primary-accent",
22719
- name: "Primary to Accent",
22720
- description: "Energetic gradient from primary to accent",
22721
- type: "linear",
22722
- angle: 135,
22723
- stops: [{
22724
- color: "primary-500",
22725
- position: 0
22726
- }, {
22727
- color: "accent-500",
22728
- position: 100
22729
- }]
22730
- },
22731
- {
22732
- id: "secondary-accent",
22733
- name: "Secondary to Accent",
22734
- description: "Vibrant secondary to accent blend",
22735
- type: "linear",
22736
- angle: 135,
22737
- stops: [{
22738
- color: "secondary-500",
22739
- position: 0
22740
- }, {
22741
- color: "accent-500",
22742
- position: 100
22743
- }]
22744
- },
22745
- {
22746
- id: "primary-light-dark",
22747
- name: "Primary Light to Dark",
22748
- description: "Subtle primary color fade",
22749
- type: "linear",
22750
- angle: 180,
22751
- stops: [{
22752
- color: "primary-500",
22753
- position: 0
22754
- }, {
22755
- color: "primary-900",
22756
- position: 100
22757
- }]
22758
- },
22759
- {
22760
- id: "primary-dark-light",
22761
- name: "Primary Dark to Light",
22762
- description: "Reverse primary fade",
22763
- type: "linear",
22764
- angle: 180,
22765
- stops: [{
22766
- color: "primary-900",
22767
- position: 0
22768
- }, {
22769
- color: "primary-50",
22770
- position: 100
22771
- }]
22772
- },
22773
- {
22774
- id: "secondary-light-dark",
22775
- name: "Secondary Light to Dark",
22776
- description: "Subtle secondary color fade",
22777
- type: "linear",
22778
- angle: 180,
22779
- stops: [{
22780
- color: "secondary-500",
22781
- position: 0
22782
- }, {
22783
- color: "secondary-900",
22784
- position: 100
22785
- }]
22786
- },
22787
- {
22788
- id: "accent-light-dark",
22789
- name: "Accent Light to Dark",
22790
- description: "Accent color depth fade",
22791
- type: "linear",
22792
- angle: 180,
22793
- stops: [{
22794
- color: "accent-500",
22795
- position: 0
22796
- }, {
22797
- color: "accent-900",
22798
- position: 100
22799
- }]
22800
- },
22801
- {
22802
- id: "background-surface",
22803
- name: "Background to Surface",
22804
- description: "Subtle depth using base colors",
22805
- type: "linear",
22806
- angle: 180,
22807
- stops: [{
22808
- color: "background",
22809
- position: 0
22810
- }, {
22811
- color: "surface",
22812
- position: 100
22813
- }]
22814
- },
22815
- {
22816
- id: "neutral-fade",
22817
- name: "Neutral Gradient",
22818
- description: "Elegant neutral color fade",
22819
- type: "linear",
22820
- angle: 180,
22821
- stops: [{
22822
- color: "neutral-900",
22823
- position: 0
22824
- }, {
22825
- color: "neutral-50",
22826
- position: 100
22827
- }]
22828
- },
22829
- {
22830
- id: "primary-radial",
22831
- name: "Primary Spotlight",
22832
- description: "Radial primary gradient from center",
22833
- type: "radial",
22834
- position: "center",
22835
- stops: [{
22836
- color: "primary-500",
22837
- position: 0
22838
- }, {
22839
- color: "primary-900",
22840
- position: 100
22841
- }]
22842
- },
22843
- {
22844
- id: "accent-radial",
22845
- name: "Accent Spotlight",
22846
- description: "Radial accent gradient from center",
22847
- type: "radial",
22848
- position: "center",
22849
- stops: [{
22850
- color: "accent-500",
22851
- position: 0
22852
- }, {
22853
- color: "accent-900",
22854
- position: 100
22855
- }]
22856
- },
22857
- {
22858
- id: "primary-secondary-accent",
22859
- name: "Brand Trio",
22860
- description: "All three brand colors in harmony",
22861
- type: "linear",
22862
- angle: 135,
22863
- stops: [
22864
- {
22865
- color: "primary-500",
22866
- position: 0
22867
- },
22868
- {
22869
- color: "secondary-500",
22870
- position: 50
22871
- },
22872
- {
22873
- color: "accent-500",
22874
- position: 100
22875
- }
22876
- ]
22877
- }
22878
- ];
22879
- //#endregion
22880
- //#region ../theme-core/src/gradients/utils.ts
22881
- /**
22882
- * Convert a GradientConfig to a CSS gradient string
22883
- *
22884
- * @param config - The gradient configuration using theme tokens
22885
- * @param tokens - Map of theme color tokens to hex values
22886
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
22887
- */
22888
- function gradientToCss(config, tokens) {
22889
- const stops = config.stops.map((stop) => {
22890
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
22891
- }).join(", ");
22892
- const type = config.type ?? "linear";
22893
- if (type === "radial") {
22894
- const position = config.position ?? "center";
22895
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
22896
- }
22897
- if (type === "conic") {
22898
- const position = config.position ?? "center";
22899
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
22900
- }
22901
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
22902
- }
22903
23523
  const BREAKPOINT_LG = 1024;
22904
23524
  const BREAKPOINT_XL = 1280;
22905
23525
  const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
@@ -23866,6 +24486,20 @@ const blockCategoryEnum = z$1.enum([
23866
24486
  "layout",
23867
24487
  "interactive"
23868
24488
  ]);
24489
+ const blockContentSourceSchema = z$1.object({
24490
+ kind: z$1.enum([
24491
+ "inline",
24492
+ "entries",
24493
+ "mixed"
24494
+ ]),
24495
+ contentType: z$1.string().min(1).optional()
24496
+ }).superRefine((value, ctx) => {
24497
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
24498
+ code: z$1.ZodIssueCode.custom,
24499
+ path: ["contentType"],
24500
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
24501
+ });
24502
+ });
23869
24503
  z$1.object({
23870
24504
  name: z$1.string().min(1),
23871
24505
  version: z$1.string().min(1),
@@ -23896,6 +24530,12 @@ z$1.object({
23896
24530
  }).optional()).optional(),
23897
24531
  category: blockCategoryEnum.optional(),
23898
24532
  contentTypes: z$1.array(z$1.string()).optional(),
24533
+ /**
24534
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
24535
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
24536
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
24537
+ */
24538
+ contentSource: blockContentSourceSchema.optional(),
23899
24539
  tags: z$1.array(z$1.string()).optional(),
23900
24540
  icon: z$1.string().optional()
23901
24541
  });
@@ -24872,6 +25512,7 @@ function devValidate(node) {
24872
25512
  }
24873
25513
  //#endregion
24874
25514
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
25515
+ const BACKGROUND_FRAME_BASE_CLASS = "rb-background-frame rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-isolate rb-pointer-events-none";
24875
25516
  /**
24876
25517
  * Creates background layer nodes for rendering backgrounds from field data.
24877
25518
  *
@@ -24937,6 +25578,34 @@ function backgroundLayer(path, options = {}) {
24937
25578
  ];
24938
25579
  }
24939
25580
  /**
25581
+ * Wrap decorative background layers in their own clipping frame.
25582
+ *
25583
+ * Foreground content remains outside this frame, so editor outlines, focus
25584
+ * rings, and floating controls are never clipped by a visual background.
25585
+ * Backgrounds that explicitly opt into overflow keep that behavior within
25586
+ * the decorative layer rather than changing the content root.
25587
+ */
25588
+ function backgroundFrame(path, options = {}) {
25589
+ const { leadingNodes = [], ...layerOptions } = options;
25590
+ const framedLayerOptions = {
25591
+ ...layerOptions,
25592
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
25593
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
25594
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
25595
+ };
25596
+ return el("div", {
25597
+ className: { $bind: {
25598
+ from: path,
25599
+ transforms: [{
25600
+ id: "background.resolveFrameClassName",
25601
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
25602
+ }],
25603
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
25604
+ } },
25605
+ style: { borderRadius: "inherit" }
25606
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
25607
+ }
25608
+ /**
24940
25609
  * Creates a media node for rendering background image/video media with conditional rendering.
24941
25610
  *
24942
25611
  * This helper creates a media element that:
@@ -25098,8 +25767,8 @@ function sectionContainer(children, opts) {
25098
25767
  * - content
25099
25768
  */
25100
25769
  function styledContainer(config) {
25101
- const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-hidden", imageClassName = "rb-absolute rb-z-neg-10", constrainWidth = true } = config;
25102
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
25770
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
25771
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
25103
25772
  const childrenArray = Array.isArray(children) ? children : [children];
25104
25773
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
25105
25774
  return el(rootType, {
@@ -25122,7 +25791,7 @@ function styledContainer(config) {
25122
25791
  }],
25123
25792
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
25124
25793
  } }
25125
- }, [...backgroundNodes, ...childrenArray]);
25794
+ }, [backgroundNode, ...childrenArray]);
25126
25795
  }
25127
25796
  //#endregion
25128
25797
  //#region ../blocks/src/system/spacing.ts
@@ -25255,7 +25924,7 @@ const DEFAULT_SECTION_SPACING = "medium";
25255
25924
  * - Creating a section wrapper with background theme
25256
25925
  * - Adding background color/gradient/image layers
25257
25926
  * - Binding className to section styles with transform
25258
- * - Binding allowOverflow for background positioning
25927
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
25259
25928
  * - Wrapping content children
25260
25929
  *
25261
25930
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -25291,8 +25960,8 @@ const DEFAULT_SECTION_SPACING = "medium";
25291
25960
  * });
25292
25961
  */
25293
25962
  function styledSection(config) {
25294
- const { children, baseClass = "rb-px-6", spacing = DEFAULT_SECTION_SPACING, background = "background", bindFrom = "_sectionStyles", imageClassName = "rb-absolute rb-z-neg-10", renderBackgroundImage = true, backgroundImageLoading, backgroundImageFetchPriority, allowOverflow = false, fullWidthPath } = config;
25295
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
25963
+ const { children, baseClass = "rb-px-6", spacing = DEFAULT_SECTION_SPACING, background = "background", bindFrom = "_sectionStyles", imageClassName = "rb-absolute rb-z-0", renderBackgroundImage = true, backgroundImageLoading, backgroundImageFetchPriority, fullWidthPath } = config;
25964
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
25296
25965
  imageClassName,
25297
25966
  fallbackToken: background,
25298
25967
  omitImageLayer: !renderBackgroundImage,
@@ -25315,13 +25984,8 @@ function styledSection(config) {
25315
25984
  fullWidthPath
25316
25985
  }
25317
25986
  }]
25318
- } },
25319
- allowOverflow: allowOverflow ? true : { $bind: {
25320
- from: `${bindFrom}.background`,
25321
- transforms: [{ id: "background.resolveAllowOverflow" }],
25322
- fallback: false
25323
25987
  } }
25324
- }, [...renderedBackgroundNodes, ...childrenArray]);
25988
+ }, [renderedBackgroundNode, ...childrenArray]);
25325
25989
  }
25326
25990
  //#endregion
25327
25991
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -26182,9 +26846,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
26182
26846
  //#endregion
26183
26847
  //#region ../blocks/src/system/node/fragments/styledCard.ts
26184
26848
  function styledCard(children, opts, ...mods) {
26185
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
26186
- const defaultBackgroundLayer = el("div", { className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface" });
26187
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
26849
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
26850
+ const defaultBackgroundLayer = el("div", {
26851
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
26852
+ style: { borderRadius: "inherit" }
26853
+ });
26854
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
26188
26855
  const style = {
26189
26856
  ...opts.style ?? {},
26190
26857
  borderColor: { $bind: {
@@ -26211,7 +26878,7 @@ function styledCard(children, opts, ...mods) {
26211
26878
  ...style ? { style } : {}
26212
26879
  }, [
26213
26880
  defaultBackgroundLayer,
26214
- ...backgroundNodes,
26881
+ backgroundNode,
26215
26882
  ...children
26216
26883
  ], ...mods);
26217
26884
  }
@@ -26991,9 +27658,15 @@ function createButtonGroup(options = {}) {
26991
27658
  //#endregion
26992
27659
  //#region ../blocks/src/system/fields/ctas.ts
26993
27660
  function createCtasRepeater(options = {}) {
26994
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
27661
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
27662
+ const fieldId = id;
27663
+ const buttonField = createButtonGroup({
27664
+ showGroupLabel: false,
27665
+ ...button ?? {},
27666
+ flattenInRepeater: true
27667
+ });
26995
27668
  return {
26996
- id,
27669
+ id: fieldId,
26997
27670
  type: "repeater",
26998
27671
  label,
26999
27672
  itemLabel,
@@ -27002,11 +27675,8 @@ function createCtasRepeater(options = {}) {
27002
27675
  maxItems,
27003
27676
  required: false,
27004
27677
  allowConversion: true,
27005
- schema: { fields: [createButtonGroup({
27006
- showGroupLabel: false,
27007
- ...button ?? {},
27008
- flattenInRepeater: true
27009
- })] }
27678
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
27679
+ schema: { fields: [buttonField] }
27010
27680
  };
27011
27681
  }
27012
27682
  //#endregion
@@ -27056,6 +27726,7 @@ const heroCtaRowFragment = defineFragment({
27056
27726
  label: "Calls to action",
27057
27727
  itemLabel: "CTA",
27058
27728
  maxItems: 3,
27729
+ defaultValue: [],
27059
27730
  button: {
27060
27731
  variants: [
27061
27732
  {
@@ -27123,7 +27794,7 @@ const ctaCopyFragment = defineFragment({
27123
27794
  eyebrowPath: "content.eyebrow",
27124
27795
  titlePath: "content.title",
27125
27796
  className: "cta-heading"
27126
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
27797
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
27127
27798
  });
27128
27799
  //#endregion
27129
27800
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -27220,7 +27891,7 @@ function buildTestimonialCard(...mods) {
27220
27891
  }, props({ value: "“" })), richText({ className: "rb-prose rb-max-w-none" }, bind("testimonial.content.body"), when("testimonial.content.body"))]), el("div", { className: "rb-testimonial-attribution" }, buildAttributionNodes())])], {
27221
27892
  stylesFrom: "content._cardStyles",
27222
27893
  backgroundFrom: "content._cardStyles.background",
27223
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
27894
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
27224
27895
  }, ...mods);
27225
27896
  }
27226
27897
  /**
@@ -27692,39 +28363,6 @@ const formEmbedFragment = defineFragment({
27692
28363
  }
27693
28364
  });
27694
28365
  //#endregion
27695
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
27696
- const footerBottomTextFragment = defineFragment({
27697
- id: "footerBottomText",
27698
- title: "Footer Text",
27699
- description: "Rich text content for the main footer body and optional bottom bar.",
27700
- fields: [{
27701
- id: "bodyText",
27702
- type: "richText",
27703
- label: "Body text",
27704
- description: "Appears in the main footer area.",
27705
- ui: { variant: "limited" }
27706
- }, {
27707
- id: "bottomText",
27708
- type: "richText",
27709
- label: "Bottom bar text",
27710
- description: "Appears in the optional footer bottom bar.",
27711
- ui: { variant: "limited" }
27712
- }],
27713
- layout: [richText({
27714
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
27715
- style: textColorStyle("text/80")
27716
- }, when("bodyText"), bind("bodyText", { transforms: [{
27717
- id: "content.interpolateRichTextTokens",
27718
- options: { tokens: ["year", "site_name"] }
27719
- }] })), richText({
27720
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
27721
- style: textColorStyle("text/80")
27722
- }, when("bottomText"), bind("bottomText", { transforms: [{
27723
- id: "content.interpolateRichTextTokens",
27724
- options: { tokens: ["year", "site_name"] }
27725
- }] }))]
27726
- });
27727
- //#endregion
27728
28366
  //#region ../blocks/src/system/fragments/library/singleButton.ts
27729
28367
  const singleButtonFragment = defineFragment({
27730
28368
  id: "singleButton",
@@ -27897,7 +28535,7 @@ function createFaqAccordionLayout(options = {}) {
27897
28535
  options: {
27898
28536
  axis: "all",
27899
28537
  includeSpacing: false,
27900
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
28538
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
27901
28539
  }
27902
28540
  }]
27903
28541
  },
@@ -28888,6 +29526,7 @@ function createBlockManifest(config) {
28888
29526
  previewCustomize: config.previewCustomize,
28889
29527
  category: config.category,
28890
29528
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
29529
+ contentSource: config.contentSource,
28891
29530
  tags: config.tags ? [...config.tags] : [],
28892
29531
  icon: config.icon ?? "Box",
28893
29532
  layout,
@@ -29021,7 +29660,6 @@ function splitLayoutWith(children) {
29021
29660
  }
29022
29661
  }),
29023
29662
  renderBackgroundImage: false,
29024
- allowOverflow: true,
29025
29663
  baseClass: ""
29026
29664
  });
29027
29665
  }
@@ -29034,6 +29672,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
29034
29672
  title: "Hero",
29035
29673
  titleSource: "headline",
29036
29674
  category: "layout",
29675
+ contentSource: { kind: "inline" },
29037
29676
  includeContainerStyles: true,
29038
29677
  promotedFields: ["_sectionStyles.background.image"],
29039
29678
  fragments: [
@@ -29307,6 +29946,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
29307
29946
  id: "block.intro",
29308
29947
  title: "Intro",
29309
29948
  category: "layout",
29949
+ contentSource: { kind: "inline" },
29310
29950
  includeContainerStyles: true,
29311
29951
  titleSource: "title",
29312
29952
  previewCustomize: { quickFieldPriority: [
@@ -29492,6 +30132,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
29492
30132
  title: "Body Text",
29493
30133
  titleSource: "heading",
29494
30134
  category: "content",
30135
+ contentSource: { kind: "inline" },
29495
30136
  fragments: [{
29496
30137
  fragment: bodyCopyFragment,
29497
30138
  fieldPriority: 0
@@ -29548,6 +30189,10 @@ const blogPostBlockDefinition = {
29548
30189
  description: "Highlights a single blog post with title, image, and excerpt.",
29549
30190
  category: "blog",
29550
30191
  contentTypes: ["post"],
30192
+ contentSource: {
30193
+ kind: "entries",
30194
+ contentType: "post"
30195
+ },
29551
30196
  tags: [
29552
30197
  "blog",
29553
30198
  "post",
@@ -29649,7 +30294,7 @@ function postCard(children, ...mods) {
29649
30294
  return styledCard(children, {
29650
30295
  stylesFrom: "content._cardStyles",
29651
30296
  backgroundFrom: "content._cardStyles.background",
29652
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
30297
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
29653
30298
  }, ...mods);
29654
30299
  }
29655
30300
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -29685,7 +30330,7 @@ const stackPostCard = styledCard([inline({
29685
30330
  ])])], {
29686
30331
  stylesFrom: "content._cardStyles",
29687
30332
  backgroundFrom: "content._cardStyles.background",
29688
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
30333
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
29689
30334
  }, repeat("data.posts", "post"));
29690
30335
  const emptyState$2 = {
29691
30336
  ...styledCard([text({
@@ -29694,7 +30339,7 @@ const emptyState$2 = {
29694
30339
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
29695
30340
  stylesFrom: "content._cardStyles",
29696
30341
  backgroundFrom: "content._cardStyles.background",
29697
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
30342
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
29698
30343
  }),
29699
30344
  $when: {
29700
30345
  when: { from: "data.posts[0]" },
@@ -29704,7 +30349,7 @@ const emptyState$2 = {
29704
30349
  function blogListingShell(children) {
29705
30350
  return styledSection({
29706
30351
  children: styledContainer({
29707
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
30352
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
29708
30353
  children
29709
30354
  }),
29710
30355
  baseClass: ""
@@ -29845,6 +30490,10 @@ const blogListingManifest = createBlockManifest({
29845
30490
  ],
29846
30491
  description: "Display a collection of blog posts in grid or stack layout.",
29847
30492
  contentTypes: ["post"],
30493
+ contentSource: {
30494
+ kind: "entries",
30495
+ contentType: "post"
30496
+ },
29848
30497
  tags: [
29849
30498
  "blog",
29850
30499
  "posts",
@@ -29887,6 +30536,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
29887
30536
  id: "block.cta-full",
29888
30537
  title: "Full-width CTA",
29889
30538
  category: "marketing",
30539
+ contentSource: { kind: "inline" },
29890
30540
  fragments: [{
29891
30541
  fragment: ctaCopyFragment,
29892
30542
  fieldPriority: 0
@@ -29920,6 +30570,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
29920
30570
  id: "block.single-button",
29921
30571
  title: "Single Button",
29922
30572
  category: "marketing",
30573
+ contentSource: { kind: "inline" },
29923
30574
  fragments: [{
29924
30575
  fragment: singleButtonFragment,
29925
30576
  fieldPriority: 0
@@ -30116,7 +30767,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
30116
30767
  const formSurface = styledContainer({
30117
30768
  bindFrom: "_containerStyles",
30118
30769
  constrainWidth: false,
30119
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
30770
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
30120
30771
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
30121
30772
  });
30122
30773
  function createFormLayout(variant) {
@@ -30180,6 +30831,7 @@ const formManifest = createBlockManifest({
30180
30831
  paletteHidden: false
30181
30832
  },
30182
30833
  category: "interactive",
30834
+ contentSource: { kind: "inline" },
30183
30835
  tags: [
30184
30836
  "form",
30185
30837
  "contact",
@@ -30242,6 +30894,7 @@ const contactNewsletterBlockDefinition = {
30242
30894
  titleSource: "contactTitle",
30243
30895
  description: "Two-column newsletter signup and contact form section.",
30244
30896
  category: "interactive",
30897
+ contentSource: { kind: "inline" },
30245
30898
  layout: contactNewsletterLayout,
30246
30899
  defaultVariant: "default",
30247
30900
  variants: { default: contactNewsletterLayout },
@@ -30445,6 +31098,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
30445
31098
  title: "FAQ",
30446
31099
  titleSource: "title",
30447
31100
  category: "content",
31101
+ contentSource: { kind: "inline" },
30448
31102
  includeContainerStyles: true,
30449
31103
  fragments: [{
30450
31104
  fragment: faqHeadingFragment,
@@ -31333,6 +31987,7 @@ const headerRootClassTransform = {
31333
31987
  ];
31334
31988
  const variant = header?.variant;
31335
31989
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
31990
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
31336
31991
  return joinClasses(classes);
31337
31992
  }
31338
31993
  };
@@ -31856,7 +32511,7 @@ function desktopOnlyDisplay(display) {
31856
32511
  }
31857
32512
  //#endregion
31858
32513
  //#region ../blocks/src/system/blocks/site-header.ts
31859
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
32514
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
31860
32515
  ...node,
31861
32516
  $when: {
31862
32517
  when: {
@@ -31884,7 +32539,7 @@ const logoRow = link({
31884
32539
  text({
31885
32540
  as: "strong",
31886
32541
  className: "header-logo-text rb-truncate"
31887
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
32542
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
31888
32543
  ]);
31889
32544
  const centeredLogoRow = link({
31890
32545
  href: "/",
@@ -31904,7 +32559,7 @@ const centeredLogoRow = link({
31904
32559
  text({
31905
32560
  as: "strong",
31906
32561
  className: "header-logo-text"
31907
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
32562
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
31908
32563
  ]);
31909
32564
  const createNavRow = (className, align = "end") => navRow({
31910
32565
  className: `${className} header-nav-row`,
@@ -32036,7 +32691,7 @@ const classicLayout = inline({
32036
32691
  logoRow,
32037
32692
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
32038
32693
  headerCta
32039
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
32694
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
32040
32695
  const classicCenteredNavLayout = inline({
32041
32696
  className: bindProp("$root.theme.header.maxWidth", {
32042
32697
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -32047,7 +32702,7 @@ const classicCenteredNavLayout = inline({
32047
32702
  logoRow,
32048
32703
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
32049
32704
  headerCta
32050
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
32705
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
32051
32706
  const centeredLayout = stack({
32052
32707
  gap: "md",
32053
32708
  align: "center",
@@ -32087,6 +32742,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
32087
32742
  id: "block.site-header",
32088
32743
  title: "Site Header",
32089
32744
  category: "layout",
32745
+ contentSource: { kind: "inline" },
32090
32746
  additionalFields: [{
32091
32747
  id: "mode",
32092
32748
  type: "select",
@@ -32110,7 +32766,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
32110
32766
  transforms: pipe(tx("layout.headerSectionBackground")),
32111
32767
  fallback: "background"
32112
32768
  }),
32113
- allowOverflow: true,
32114
32769
  className: bindProp("$root.theme.header", {
32115
32770
  transforms: pipe(tx("layout.headerRootClass")),
32116
32771
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -32160,218 +32815,155 @@ const footerNavGroupsLayout = stack({
32160
32815
  linkRequired: true,
32161
32816
  target: { $bind: { from: "entry.target" } },
32162
32817
  rel: { $bind: { from: "entry.rel" } }
32163
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
32818
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
32164
32819
  //#endregion
32165
32820
  //#region ../blocks/src/system/blocks/site-footer.ts
32166
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
32167
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
32168
- ...node,
32169
- $when: {
32170
- when: {
32171
- from,
32172
- transforms: [{ id: transformId }]
32173
- },
32174
- equals
32175
- }
32176
- });
32177
- const bottomBarTextLayout = () => {
32178
- const bottomTextNode = footerTextLayout()[1];
32179
- return bottomTextNode ? [bottomTextNode] : [];
32180
- };
32181
- const bodyTextLayout = () => {
32182
- const bodyTextNode = footerTextLayout()[0];
32183
- return bodyTextNode ? [bodyTextNode] : [];
32184
- };
32185
- const businessAddressLayout = () => [text({
32186
- as: "p",
32187
- className: "rb-caption rb-opacity-80"
32188
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
32189
- const inlineBottomTextLayout = () => {
32190
- const bottomTextNode = footerTextLayout()[1];
32191
- if (!bottomTextNode) return [];
32192
- return [when("$root.theme.footer.bottomBar.enabled", {
32193
- equals: true,
32194
- not: true
32195
- })(bottomTextNode)];
32196
- };
32197
- const simpleFooterLayout = stack({
32198
- gap: "md",
32199
- align: "start",
32200
- className: { $bind: {
32201
- from: "$root.theme.footer",
32202
- transforms: [{ id: "layout.footerSimpleRootClass" }],
32203
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
32204
- } }
32205
- }, [
32206
- link({
32207
- href: "/",
32208
- className: { $bind: {
32209
- from: "$root.theme.footer.logo",
32210
- transforms: [{
32211
- id: "layout.footerLogoClass",
32212
- options: { requireExplicitShow: true }
32213
- }],
32214
- fallback: "rb-hidden"
32215
- } }
32216
- }, [
32217
- media({ className: { $bind: {
32218
- from: "$root.theme.footer.logo",
32219
- transforms: [{ id: "layout.footerLogoMediaClass" }],
32220
- fallback: "rb-w-auto"
32221
- } } }, when("content.logo"), bind("content.logo")),
32222
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
32223
- from: "$root.theme.footer.logo",
32224
- transforms: [{ id: "layout.footerLogoMediaClass" }],
32225
- fallback: "rb-w-auto"
32226
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
32227
- text({
32228
- as: "strong",
32229
- className: "footer-logo-text rb-nav-text"
32230
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
32231
- ]),
32232
- footerNav({
32233
- collectionPath: "footerMenu.items",
32234
- mode: "flatten",
32235
- className: { $bind: {
32236
- from: "$root.theme.footer.navLayout",
32237
- transforms: [{ id: "layout.footerSimpleNavClass" }],
32238
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
32239
- } },
32240
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
32241
- }),
32242
- ...bodyTextLayout(),
32243
- ...businessAddressLayout(),
32244
- ...inlineBottomTextLayout()
32245
- ], when("$root.theme.footer.variant", { equals: "simple" }));
32246
- const columnsFooterLayout = stack({
32247
- gap: "xl",
32248
- align: "start",
32821
+ const brandLogo = link({
32822
+ href: "/",
32249
32823
  className: { $bind: {
32250
- from: "$root.theme.footer.maxWidth",
32824
+ from: "$root.theme.footer.logo",
32251
32825
  transforms: [{
32252
- id: "layout.maxWidthClass",
32253
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
32826
+ id: "layout.footerLogoClass",
32827
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
32254
32828
  }],
32255
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
32829
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
32256
32830
  } }
32257
- }, [
32258
- footerNavGroupsLayout,
32259
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
32260
- as: "strong",
32261
- className: "rb-block rb-nav-text",
32262
- style: textColorStyle("text")
32263
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
32264
- collectionPath: "footerMenu.items",
32265
- mode: "links-only",
32266
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
32267
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
32268
- })]),
32269
- ...bodyTextLayout(),
32270
- ...businessAddressLayout(),
32271
- ...inlineBottomTextLayout()
32272
- ], when("$root.theme.footer.variant", { equals: "columns" }));
32273
- const splitFooterLayout = stack({
32274
- gap: "xl",
32275
- align: "start",
32831
+ }, [media({ className: { $bind: {
32832
+ from: "$root.theme.footer.logo",
32833
+ transforms: [{
32834
+ id: "layout.footerLogoMediaClass",
32835
+ options: { base: "rb-h-10 rb-w-auto" }
32836
+ }],
32837
+ fallback: "rb-h-10 rb-w-auto"
32838
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
32839
+ as: "strong",
32840
+ className: "footer-logo-text rb-nav-text"
32841
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
32842
+ const navigation = stack({
32843
+ gap: "md",
32844
+ className: "rb-w-full"
32845
+ }, [footerNavGroupsLayout, footerNav({
32846
+ collectionPath: "footerMenu.items",
32847
+ mode: "links-only",
32276
32848
  className: { $bind: {
32277
- from: "$root.theme.footer.maxWidth",
32278
- transforms: [{
32279
- id: "layout.maxWidthClass",
32280
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
32281
- }],
32282
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
32283
- } }
32849
+ from: "module.navigationClassName",
32850
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
32851
+ } },
32852
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
32853
+ })], when("module.kind", { equals: "navigation" }));
32854
+ const legalNavigation = footerNav({
32855
+ collectionPath: "legalFooterMenu.items",
32856
+ mode: "links-only",
32857
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
32858
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
32859
+ });
32860
+ const address = text({
32861
+ as: "address",
32862
+ className: "rb-not-italic rb-opacity-80"
32863
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
32864
+ const contact = stack({
32865
+ gap: "sm",
32866
+ className: "rb-items-start"
32867
+ }, [link({
32868
+ href: { $bind: { from: "contactLink.href" } },
32869
+ className: "rb-nav-text rb-break-words transition-theme-standard"
32870
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
32871
+ const hours = stack({
32872
+ gap: "sm",
32873
+ className: "rb-w-full"
32874
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
32875
+ as: "span",
32876
+ className: "rb-label"
32877
+ }, bind("hoursDay.weekday")), text({
32878
+ as: "span",
32879
+ className: "rb-caption rb-opacity-80"
32880
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
32881
+ as: "p",
32882
+ className: "rb-caption rb-opacity-70"
32883
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
32884
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
32885
+ href: { $bind: { from: "social.href" } },
32886
+ target: "_blank",
32887
+ rel: "noreferrer noopener",
32888
+ "aria-label": { $bind: { from: "social.label" } },
32889
+ className: "rb-nav-text transition-theme-standard"
32890
+ }, [icon({ className: "rb-h-5 rb-w-5" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
32891
+ const authoredCopy = richText({
32892
+ className: "rb-prose rb-prose-sm rb-max-w-none",
32893
+ style: textColorStyle("text/80")
32894
+ }, when("module.content"), bind("module.content", { transforms: [{
32895
+ id: "content.interpolateRichTextTokens",
32896
+ options: { tokens: ["year", "site_name"] }
32897
+ }] }));
32898
+ const footerGroup = stack({
32899
+ gap: "md",
32900
+ align: "stretch",
32901
+ className: "rb-min-w-0",
32902
+ "data-footer-group": { $bind: { from: "group.kind" } }
32903
+ }, [stack({
32904
+ gap: "md",
32905
+ align: "start",
32906
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
32284
32907
  }, [
32285
- inline({ className: { $bind: {
32286
- from: "$root.theme.footer.logo",
32287
- transforms: [{ id: "layout.footerSplitMainClass" }],
32288
- fallback: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
32289
- } } }, [stack({}, [footerNav({
32290
- collectionPath: "footerMenu.items",
32291
- mode: "flatten",
32292
- className: { $bind: {
32293
- from: "$root.theme.footer.navLayout",
32294
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
32295
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
32296
- } },
32297
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
32298
- })]), link({
32299
- href: "/",
32300
- className: { $bind: {
32301
- from: "$root.theme.footer.logo",
32302
- transforms: [{ id: "layout.footerLogoClass" }],
32303
- fallback: "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-self-end rb-no-underline rb-text-right rb-transition-opacity rb-hover-opacity-80"
32304
- } }
32305
- }, [
32306
- media({ className: { $bind: {
32307
- from: "$root.theme.footer.logo",
32308
- transforms: [{ id: "layout.footerLogoMediaClass" }],
32309
- fallback: "rb-w-auto"
32310
- } } }, when("content.logo"), bind("content.logo")),
32311
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
32312
- from: "$root.theme.footer.logo",
32313
- transforms: [{ id: "layout.footerLogoMediaClass" }],
32314
- fallback: "rb-w-auto"
32315
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
32316
- text({
32317
- as: "strong",
32318
- className: "footer-logo-text rb-nav-text"
32319
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
32320
- ])]),
32321
- ...businessAddressLayout(),
32322
- ...inlineBottomTextLayout()
32323
- ], when("$root.theme.footer.variant", { equals: "split" }));
32324
- const footerLayout = section({
32325
- background: "background",
32908
+ text({
32909
+ as: "h2",
32910
+ className: "rb-label",
32911
+ style: textColorStyle("text/70")
32912
+ }, bind("module.heading"), when("module.heading")),
32913
+ brandLogo,
32914
+ navigation,
32915
+ stack({
32916
+ gap: "sm",
32917
+ className: "rb-w-full"
32918
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
32919
+ address,
32920
+ contact,
32921
+ hours,
32922
+ socials,
32923
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
32924
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
32925
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
32926
+ const footerMainRegion = stack({
32927
+ className: { $bind: { from: "region.className" } },
32928
+ "data-footer-region": { $bind: { from: "region.kind" } }
32929
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
32930
+ const footerBottomRegion = stack({ className: { $bind: {
32931
+ from: "$root.theme.footer",
32932
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
32933
+ fallback: "rb-w-full"
32934
+ } } }, [stack({
32326
32935
  className: { $bind: {
32327
32936
  from: "$root.theme.footer",
32328
- transforms: [{ id: "layout.footerRootClass" }],
32329
- fallback: "rb-w-full rb-border-t transition-theme"
32937
+ transforms: [{ id: "layout.footerBottomBarClass" }],
32938
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
32330
32939
  } },
32331
32940
  style: { $bind: {
32332
32941
  from: "$root.theme.footer",
32333
- transforms: [{ id: "layout.footerRootStyle" }],
32334
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
32335
- } }
32336
- }, [
32337
- simpleFooterLayout,
32338
- columnsFooterLayout,
32339
- splitFooterLayout,
32340
- stack({
32341
- className: { $bind: {
32342
- from: "$root.theme.footer",
32343
- transforms: [{ id: "layout.footerBottomBarClass" }],
32344
- fallback: "rb-w-full rb-border-t rb-py-5"
32345
- } },
32346
- style: { $bind: {
32347
- from: "$root.theme.footer",
32348
- transforms: [{ id: "layout.footerBottomBarStyle" }]
32349
- } }
32350
- }, [stack({ className: { $bind: {
32351
- from: "$root.theme.footer",
32352
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
32353
- fallback: "rb-container"
32354
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
32355
- ]);
32942
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
32943
+ } },
32944
+ "data-footer-region": "bottom"
32945
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
32356
32946
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
32357
32947
  id: "block.site-footer",
32358
32948
  title: "Site Footer",
32359
32949
  category: "layout",
32360
- fragments: [{
32361
- fragment: footerBottomTextFragment,
32362
- fieldPriority: 0
32363
- }],
32950
+ contentSource: { kind: "inline" },
32364
32951
  skipSectionStyles: true,
32365
- additionalFields: [{
32366
- id: "showBusinessAddress",
32367
- type: "boolean",
32368
- label: "Add business address to site footer?",
32369
- required: false,
32370
- defaultValue: false,
32371
- ui: { intent: "content" }
32372
- }],
32373
- layout: footerLayout,
32374
- description: "Site-wide footer with navigation links and optional columns.",
32952
+ layout: section({
32953
+ background: "background",
32954
+ className: { $bind: {
32955
+ from: "$root.theme.footer",
32956
+ transforms: [{ id: "layout.footerRootClass" }],
32957
+ fallback: "rb-w-full rb-border-t transition-theme"
32958
+ } },
32959
+ style: { $bind: {
32960
+ from: "$root.theme.footer",
32961
+ transforms: [{ id: "layout.footerRootStyle" }],
32962
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
32963
+ } },
32964
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
32965
+ }, [footerMainRegion, footerBottomRegion]),
32966
+ description: "Site-wide composed footer with canonical shared details.",
32375
32967
  styleTokens: { spacing: "md" },
32376
32968
  paletteHidden: true
32377
32969
  }) };
@@ -32505,6 +33097,7 @@ const testimonialsBlockDefinition = {
32505
33097
  id: "block.testimonials",
32506
33098
  title: "Testimonials",
32507
33099
  category: "marketing",
33100
+ contentSource: { kind: "inline" },
32508
33101
  includeContainerStyles: true,
32509
33102
  previewCustomize: { quickFieldPriority: [
32510
33103
  "avatarLayout",
@@ -32663,6 +33256,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
32663
33256
  id: "block.columns",
32664
33257
  title: "Columns",
32665
33258
  category: "layout",
33259
+ contentSource: { kind: "inline" },
32666
33260
  additionalFields: [
32667
33261
  parseFieldDefinition({
32668
33262
  id: "equalHeight",
@@ -32849,7 +33443,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
32849
33443
  id: "boxStyles.all",
32850
33444
  options: {
32851
33445
  axis: "all",
32852
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
33446
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
32853
33447
  }
32854
33448
  }]
32855
33449
  },
@@ -32896,6 +33490,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
32896
33490
  id: "block.collection",
32897
33491
  title: "Collection",
32898
33492
  category: "layout",
33493
+ contentSource: { kind: "inline" },
32899
33494
  additionalFields: [
32900
33495
  parseFieldDefinition({
32901
33496
  id: "layout",
@@ -33132,6 +33727,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
33132
33727
  id: "block.feature-cards",
33133
33728
  title: "Feature Cards",
33134
33729
  category: "layout",
33730
+ contentSource: { kind: "inline" },
33135
33731
  includeContainerStyles: true,
33136
33732
  titleSource: "title",
33137
33733
  additionalFields: [
@@ -33515,6 +34111,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
33515
34111
  id: "block.media-text",
33516
34112
  title: "Media and Text",
33517
34113
  category: "layout",
34114
+ contentSource: { kind: "inline" },
33518
34115
  includeContainerStyles: true,
33519
34116
  titleSource: "title",
33520
34117
  previewCustomize: { quickFieldPriority: [
@@ -33915,6 +34512,7 @@ const appointmentBookingBlockDefinition = {
33915
34512
  paletteHidden: false
33916
34513
  },
33917
34514
  category: "interactive",
34515
+ contentSource: { kind: "inline" },
33918
34516
  tags: [
33919
34517
  "booking",
33920
34518
  "appointment",
@@ -34079,6 +34677,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
34079
34677
  paletteHidden: false
34080
34678
  },
34081
34679
  category: "interactive",
34680
+ contentSource: { kind: "inline" },
34082
34681
  tags: [
34083
34682
  "booking",
34084
34683
  "appointment",
@@ -35671,6 +36270,7 @@ const eventRegistrationBlockDefinition = {
35671
36270
  titleSource: "heading",
35672
36271
  description: "Multi-step event registration form",
35673
36272
  category: "interactive",
36273
+ contentSource: { kind: "inline" },
35674
36274
  tags: [
35675
36275
  "events",
35676
36276
  "registration",
@@ -35777,15 +36377,9 @@ const eventRegistrationBlockDefinition = {
35777
36377
  defaultValue: "Complete Registration",
35778
36378
  maxLength: 40
35779
36379
  },
35780
- {
35781
- id: "buttonVariant",
35782
- type: "select",
35783
- label: "Button style",
36380
+ createButtonVariantField({
35784
36381
  description: "Choose a button style from your theme",
35785
- required: false,
35786
- multiple: false,
35787
- defaultValue: "primary",
35788
- options: [
36382
+ variants: [
35789
36383
  {
35790
36384
  value: "primary",
35791
36385
  label: "Primary"
@@ -35798,9 +36392,8 @@ const eventRegistrationBlockDefinition = {
35798
36392
  value: "outline",
35799
36393
  label: "Outline"
35800
36394
  }
35801
- ],
35802
- ui: { intent: "style" }
35803
- }
36395
+ ]
36396
+ })
35804
36397
  ],
35805
36398
  layout: [styledSection({
35806
36399
  baseClass: "",
@@ -35993,6 +36586,7 @@ const courseRegistrationBlockDefinition = {
35993
36586
  titleSource: "heading",
35994
36587
  description: "Enrollment form for multi-session courses",
35995
36588
  category: "interactive",
36589
+ contentSource: { kind: "inline" },
35996
36590
  tags: [
35997
36591
  "courses",
35998
36592
  "enrollment",
@@ -36106,15 +36700,9 @@ const courseRegistrationBlockDefinition = {
36106
36700
  defaultValue: "Sign up",
36107
36701
  maxLength: 40
36108
36702
  },
36109
- {
36110
- id: "buttonVariant",
36111
- type: "select",
36112
- label: "Button style",
36703
+ createButtonVariantField({
36113
36704
  description: "Choose a button style from your theme",
36114
- required: false,
36115
- multiple: false,
36116
- defaultValue: "primary",
36117
- options: [
36705
+ variants: [
36118
36706
  {
36119
36707
  value: "primary",
36120
36708
  label: "Primary"
@@ -36127,9 +36715,8 @@ const courseRegistrationBlockDefinition = {
36127
36715
  value: "outline",
36128
36716
  label: "Outline"
36129
36717
  }
36130
- ],
36131
- ui: { intent: "style" }
36132
- }
36718
+ ]
36719
+ })
36133
36720
  ],
36134
36721
  layout: [styledSection({
36135
36722
  baseClass: "",
@@ -36209,6 +36796,7 @@ const eventDetailsManifest = createBlockManifest({
36209
36796
  titleSource: "heading",
36210
36797
  description: "Date/time, venue, map, and other dates for an event",
36211
36798
  category: "content",
36799
+ contentSource: { kind: "entries" },
36212
36800
  tags: [
36213
36801
  "events",
36214
36802
  "venue",
@@ -36414,6 +37002,7 @@ const courseDetailsBlockDefinition = {
36414
37002
  titleSource: "heading",
36415
37003
  description: "Schedule, venue, price, and enrollment status for a course",
36416
37004
  category: "content",
37005
+ contentSource: { kind: "entries" },
36417
37006
  tags: [
36418
37007
  "courses",
36419
37008
  "schedule",
@@ -36705,6 +37294,7 @@ const eventSpotlightBlockDefinition = {
36705
37294
  paletteHidden: false
36706
37295
  },
36707
37296
  category: "content",
37297
+ contentSource: { kind: "entries" },
36708
37298
  tags: [
36709
37299
  "events",
36710
37300
  "featured",
@@ -37251,6 +37841,7 @@ const eventListingBlockDefinition = {
37251
37841
  paletteHidden: true
37252
37842
  },
37253
37843
  category: "interactive",
37844
+ contentSource: { kind: "entries" },
37254
37845
  tags: [
37255
37846
  "events",
37256
37847
  "listing",
@@ -38423,6 +39014,7 @@ const eventCalendarBlockDefinition = {
38423
39014
  paletteHidden: false
38424
39015
  },
38425
39016
  category: "interactive",
39017
+ contentSource: { kind: "entries" },
38426
39018
  tags: [
38427
39019
  "events",
38428
39020
  "calendar",
@@ -38820,6 +39412,7 @@ const recurringScheduleBlockDefinition = {
38820
39412
  titleSource: "heading",
38821
39413
  description: "A compact weekly schedule with one row per recurring series.",
38822
39414
  category: "interactive",
39415
+ contentSource: { kind: "entries" },
38823
39416
  icon: "CalendarDays",
38824
39417
  tags: [
38825
39418
  "schedule",
@@ -39237,7 +39830,10 @@ const offeringsPreviewFields = [
39237
39830
  label: "Link"
39238
39831
  }
39239
39832
  ],
39240
- ui: { intent: "display" }
39833
+ ui: {
39834
+ intent: "display",
39835
+ widget: "buttonVariant"
39836
+ }
39241
39837
  },
39242
39838
  {
39243
39839
  id: "buttonText",
@@ -39290,6 +39886,7 @@ const offeringsPreviewManifest = createBlockManifest({
39290
39886
  paletteHidden: false
39291
39887
  },
39292
39888
  category: "content",
39889
+ contentSource: { kind: "mixed" },
39293
39890
  tags: [
39294
39891
  "offerings",
39295
39892
  "events",
@@ -39458,6 +40055,7 @@ const embedManifest = createBlockManifest({
39458
40055
  id: "block.embed",
39459
40056
  title: "Embed Content",
39460
40057
  category: "content",
40058
+ contentSource: { kind: "entries" },
39461
40059
  titleSource: "heading",
39462
40060
  additionalFields: [
39463
40061
  parseFieldDefinition({
@@ -39945,6 +40543,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
39945
40543
  id: "block.image-gallery",
39946
40544
  title: "Image Gallery",
39947
40545
  category: "content",
40546
+ contentSource: { kind: "inline" },
39948
40547
  previewCustomize: { quickFieldPriority: [
39949
40548
  "aspectRatio",
39950
40549
  "slidesToShow",
@@ -40597,6 +41196,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
40597
41196
  id: "block.video-grid",
40598
41197
  title: "Video Grid",
40599
41198
  category: "media",
41199
+ contentSource: { kind: "inline" },
40600
41200
  skipSectionStyles: true,
40601
41201
  additionalFields: parseFieldDefinitions([
40602
41202
  {
@@ -40767,6 +41367,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
40767
41367
  title: "Audio Player",
40768
41368
  titleSource: "title",
40769
41369
  category: "media",
41370
+ contentSource: { kind: "inline" },
40770
41371
  description: "Add a branded audio player for a single track.",
40771
41372
  tags: [
40772
41373
  "audio",
@@ -40878,6 +41479,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
40878
41479
  title: "File Download",
40879
41480
  titleSource: ["title", "file.filename"],
40880
41481
  category: "media",
41482
+ contentSource: { kind: "inline" },
40881
41483
  description: "Add a simple public download link for a document, ZIP, or audio file.",
40882
41484
  tags: [
40883
41485
  "file",
@@ -41822,6 +42424,7 @@ const shopBlockDefinition = {
41822
42424
  paletteHidden: false
41823
42425
  },
41824
42426
  category: "interactive",
42427
+ contentSource: { kind: "entries" },
41825
42428
  tags: [
41826
42429
  "shop",
41827
42430
  "passes",
@@ -42021,6 +42624,7 @@ const productListBlockDefinition = {
42021
42624
  paletteHidden: false
42022
42625
  },
42023
42626
  category: "interactive",
42627
+ contentSource: { kind: "entries" },
42024
42628
  tags: [
42025
42629
  "shop",
42026
42630
  "products",
@@ -42162,6 +42766,7 @@ const productDetailBlockDefinition = {
42162
42766
  paletteHidden: false
42163
42767
  },
42164
42768
  category: "interactive",
42769
+ contentSource: { kind: "entries" },
42165
42770
  tags: [
42166
42771
  "shop",
42167
42772
  "product",
@@ -42278,6 +42883,7 @@ const cartBlockDefinition = {
42278
42883
  paletteHidden: false
42279
42884
  },
42280
42885
  category: "interactive",
42886
+ contentSource: { kind: "inline" },
42281
42887
  tags: [
42282
42888
  "shop",
42283
42889
  "cart",
@@ -42360,6 +42966,7 @@ const checkoutBlockDefinition = {
42360
42966
  paletteHidden: false
42361
42967
  },
42362
42968
  category: "interactive",
42969
+ contentSource: { kind: "inline" },
42363
42970
  tags: [
42364
42971
  "shop",
42365
42972
  "checkout",
@@ -42563,6 +43170,7 @@ const giftingBlockDefinition = {
42563
43170
  paletteHidden: false
42564
43171
  },
42565
43172
  category: "interactive",
43173
+ contentSource: { kind: "entries" },
42566
43174
  tags: [
42567
43175
  "gifting",
42568
43176
  "gift cards",
@@ -42926,6 +43534,7 @@ const newsletterSignupBlockDefinition = {
42926
43534
  titleSource: "title",
42927
43535
  description: "Newsletter subscription form with configurable field presets.",
42928
43536
  category: "interactive",
43537
+ contentSource: { kind: "inline" },
42929
43538
  fragments: [{
42930
43539
  fragment: newsletterCopyFragment,
42931
43540
  fieldPriority: 0
@@ -43107,6 +43716,7 @@ const teamMembersBlockDefinition = {
43107
43716
  id: "block.team-members",
43108
43717
  title: "Team Members",
43109
43718
  category: "content",
43719
+ contentSource: { kind: "mixed" },
43110
43720
  titleSource: "heading",
43111
43721
  additionalFields: [
43112
43722
  parseFieldDefinition({
@@ -43527,6 +44137,7 @@ const locationMapBlockDefinition = {
43527
44137
  titleSource: "heading",
43528
44138
  description: "Show a business location with an interactive map and directions link.",
43529
44139
  category: "content",
44140
+ contentSource: { kind: "inline" },
43530
44141
  tags: [
43531
44142
  "map",
43532
44143
  "location",
@@ -44642,9 +45253,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
44642
45253
  ].filter(Boolean).join(" ");
44643
45254
  }
44644
45255
  function gradientPresetCss(value) {
44645
- if (!isString(value)) return null;
44646
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
44647
- if (!preset) return null;
45256
+ const presetId = parseGradientPresetId(value);
45257
+ if (!presetId) return null;
45258
+ const preset = getGradientPreset(presetId);
44648
45259
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
44649
45260
  }
44650
45261
  const backgroundTransforms = [
@@ -44683,16 +45294,17 @@ const backgroundTransforms = [
44683
45294
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
44684
45295
  },
44685
45296
  {
44686
- id: "background.resolveAllowOverflow",
45297
+ id: "background.resolveFrameClassName",
44687
45298
  kind: "formatter",
44688
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
44689
- run: (value) => {
44690
- if (!value || typeof value !== "object") return false;
45299
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
45300
+ run: (value, options) => {
45301
+ const baseClass = options?.baseClass?.trim() ?? "";
45302
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
44691
45303
  const input = value;
44692
- if (input.overflow === true) return true;
45304
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
44693
45305
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
44694
45306
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
44695
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
45307
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
44696
45308
  }
44697
45309
  },
44698
45310
  {
@@ -45760,6 +46372,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
45760
46372
  "already_refunded",
45761
46373
  "idempotency_amount_mismatch",
45762
46374
  "idempotency_method_mismatch",
46375
+ "idempotency_receipt_mismatch",
45763
46376
  "refund_in_progress"
45764
46377
  ],
45765
46378
  "invalid_amount",
@@ -45772,7 +46385,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
45772
46385
  "payment_intent_not_found",
45773
46386
  "stripe_error",
45774
46387
  "stale_pending_missing_context",
45775
- "non_refundable_deposit_remaining"
46388
+ "non_refundable_deposit_remaining",
46389
+ "deposit_refund_override_required",
46390
+ "refund_revoke_requires_full_line_refund",
46391
+ "payment_receipt_not_found",
46392
+ "payment_receipt_not_refundable",
46393
+ "payment_receipt_attribution_required"
45776
46394
  ];
45777
46395
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
45778
46396
  //#endregion
@@ -45785,7 +46403,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
45785
46403
  "missing_credit_customer",
45786
46404
  "deposit_refund_override_required",
45787
46405
  "refund_revoke_requires_full_line_refund",
45788
- "unified_order_link_required"
46406
+ "unified_order_link_required",
46407
+ "payment_receipt_not_found",
46408
+ "payment_receipt_not_refundable",
46409
+ "payment_receipt_attribution_required"
45789
46410
  ];
45790
46411
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
45791
46412
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];