@riverbankcms/sdk 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +21 -1
  2. package/dist/{PreviewEditorSidebar-DpAbAl08.mjs → PreviewEditorSidebar-DWqwfy3_.mjs} +48 -28
  3. package/dist/{PreviewEditorUI-O7cn6Xxv.mjs → PreviewEditorUI-B7OL4sfR.mjs} +10 -9
  4. package/dist/{PreviewQueryProvider-D0tnKl0t.mjs → PreviewQueryProvider-D0y2l8JN.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CVB7urtl.mjs → SdkPreviewModeRuntime-D8Gt9Gbe.mjs} +633 -220
  6. package/dist/{SiteChromeCustomizeContext-C_sizso-.mjs → SiteChromeCustomizeContext-DUpalEdL.mjs} +5764 -1556
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +15383 -11388
  8. package/dist/_dts/api/src/blocks.d.ts +41 -7
  9. package/dist/_dts/api/src/bookingAdjustments.d.ts +5 -0
  10. package/dist/_dts/api/src/bookingOperations.d.ts +4 -0
  11. package/dist/_dts/api/src/bookingRecords.d.ts +177 -127
  12. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  13. package/dist/_dts/api/src/cache-tags.d.ts +3 -0
  14. package/dist/_dts/api/src/common/envelope.d.ts +7 -0
  15. package/dist/_dts/api/src/contentRuntime.d.ts +19 -1
  16. package/dist/_dts/api/src/courses.d.ts +1 -0
  17. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +5 -5
  18. package/dist/_dts/api/src/endpoints.d.ts +134 -0
  19. package/dist/_dts/api/src/footer-settings.d.ts +1 -0
  20. package/dist/_dts/api/src/footerSettings.d.ts +8 -0
  21. package/dist/_dts/api/src/index.d.ts +7 -4
  22. package/dist/_dts/api/src/navigation/contracts.d.ts +3 -3
  23. package/dist/_dts/api/src/participantMessaging.d.ts +18 -12
  24. package/dist/_dts/api/src/previewContentContract.d.ts +4 -0
  25. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  26. package/dist/_dts/api/src/sdkContracts.d.ts +309 -1
  27. package/dist/_dts/api/src/siteBanner.d.ts +2 -2
  28. package/dist/_dts/api/src/siteInfrastructure.d.ts +13 -0
  29. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +144 -60
  30. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +35 -1
  31. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +74 -28
  32. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientField.d.ts +9 -0
  33. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientWidget.d.ts +3 -4
  34. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  35. package/dist/_dts/blocks/src/index.d.ts +1 -1
  36. package/dist/_dts/blocks/src/primitives/layout/Section.d.ts +0 -1
  37. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -0
  38. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +3 -0
  39. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +3 -0
  40. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +3 -0
  41. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +1 -22
  42. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +3 -0
  43. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +1 -22
  44. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -0
  45. package/dist/_dts/blocks/src/system/blocks/form.d.ts +3 -0
  46. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +3 -0
  47. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -0
  48. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +3 -0
  49. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +50 -0
  50. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +9 -48
  51. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +3 -0
  52. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -0
  53. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +3 -0
  54. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +3 -0
  55. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  56. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +16 -6
  57. package/dist/_dts/blocks/src/system/defineBlock.d.ts +9 -1
  58. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +8 -0
  59. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -1
  60. package/dist/_dts/blocks/src/system/icons/social.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/icons/svg.d.ts +1 -0
  62. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +33 -2
  63. package/dist/_dts/blocks/src/system/node/fragments/backgroundLayer.d.ts +13 -0
  64. package/dist/_dts/blocks/src/system/node/fragments/footerNav.d.ts +2 -0
  65. package/dist/_dts/blocks/src/system/node/fragments/styledContainer.d.ts +4 -4
  66. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +3 -12
  67. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  68. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -6
  69. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  70. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/types/link.d.ts +3 -3
  72. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +14 -0
  73. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +27 -8
  74. package/dist/_dts/content-editor/src/footerComposer.d.ts +56 -0
  75. package/dist/_dts/content-editor/src/hooks/useEntryActions.d.ts +1 -1
  76. package/dist/_dts/content-editor/src/hooks/useEntryMutations.d.ts +5 -5
  77. package/dist/_dts/content-editor/src/index.d.ts +2 -0
  78. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +3 -1
  79. package/dist/_dts/content-editor/src/services/contentEntryServices.d.ts +20 -36
  80. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +5 -1
  81. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +11 -0
  82. package/dist/_dts/content-model/src/content-types/entryValidation.d.ts +31 -0
  83. package/dist/_dts/content-model/src/content-types/scaffold.d.ts +58 -0
  84. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  85. package/dist/_dts/content-model/src/content-types/sentinels.d.ts +36 -0
  86. package/dist/_dts/content-model/src/definitions/shared.d.ts +3 -0
  87. package/dist/_dts/content-model/src/index.d.ts +3 -0
  88. package/dist/_dts/core/src/booking-date-time.d.ts +8 -0
  89. package/dist/_dts/core/src/branded.d.ts +3 -0
  90. package/dist/_dts/core/src/editor-state.d.ts +4 -0
  91. package/dist/_dts/core/src/footer-composition.d.ts +143 -0
  92. package/dist/_dts/core/src/index.d.ts +2 -0
  93. package/dist/_dts/core/src/public-profile.d.ts +73 -0
  94. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +221 -205
  95. package/dist/_dts/db/src/schemas/forms.d.ts +10 -10
  96. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +5 -0
  97. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +1 -0
  98. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +2 -1
  99. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +2 -1
  100. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +2 -1
  101. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +10 -0
  102. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +1 -0
  103. package/dist/_dts/media-core/src/fileMimeDetection.d.ts +16 -0
  104. package/dist/_dts/media-core/src/fileStorage.d.ts +8 -0
  105. package/dist/_dts/media-core/src/storagePathDomain.d.ts +2 -0
  106. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +3 -0
  107. package/dist/_dts/path-utils/src/index.d.ts +5 -0
  108. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +2 -0
  109. package/dist/_dts/preview-next/src/client/preview/PreviewChromeLayer.d.ts +5 -0
  110. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -1
  111. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  112. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -1
  113. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -1
  114. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -0
  115. package/dist/_dts/preview-next/src/client/preview/previewErrorMessages.d.ts +4 -0
  116. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -1
  117. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -1
  118. package/dist/_dts/sdk/src/cli/commands/compare.d.ts +1 -1
  119. package/dist/_dts/sdk/src/cli/commands/deploy.d.ts +1 -1
  120. package/dist/_dts/sdk/src/cli/commands/drafts.d.ts +18 -0
  121. package/dist/_dts/sdk/src/cli/commands/entry.d.ts +15 -0
  122. package/dist/_dts/sdk/src/cli/commands/init-docs.d.ts +2 -2
  123. package/dist/_dts/sdk/src/cli/commands/publish-all.d.ts +1 -1
  124. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +1 -0
  125. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +1 -1
  126. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +3 -0
  127. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +12 -1
  128. package/dist/_dts/sdk/src/cli/commands/setup.d.ts +1 -0
  129. package/dist/_dts/sdk/src/cli/commands/verify.d.ts +1 -0
  130. package/dist/_dts/sdk/src/cli/content/reader.d.ts +1 -0
  131. package/dist/_dts/sdk/src/cli/helpers.d.ts +22 -1
  132. package/dist/_dts/sdk/src/cli/index.d.ts +4 -0
  133. package/dist/_dts/sdk/src/cli/output.d.ts +88 -0
  134. package/dist/_dts/sdk/src/cli/program.d.ts +29 -0
  135. package/dist/_dts/sdk/src/cli/push-config.d.ts +1 -1
  136. package/dist/_dts/sdk/src/client/management/blocks.d.ts +14 -1
  137. package/dist/_dts/sdk/src/client/management/catalog.d.ts +10 -0
  138. package/dist/_dts/sdk/src/client/management/http.d.ts +7 -1
  139. package/dist/_dts/sdk/src/client/management/index.d.ts +2 -1
  140. package/dist/_dts/sdk/src/client/management/types.d.ts +58 -20
  141. package/dist/_dts/sdk/src/config/content-types.d.ts +2 -0
  142. package/dist/_dts/sdk/src/config/content-validation.d.ts +4 -0
  143. package/dist/_dts/sdk/src/date-time/index.d.ts +68 -0
  144. package/dist/_dts/sdk/src/navigation/index.d.ts +2 -0
  145. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -2
  146. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -1
  147. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  148. package/dist/_dts/sdk/src/version.d.ts +1 -1
  149. package/dist/_dts/site-commands/src/commands.d.ts +900 -827
  150. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  151. package/dist/_dts/theme-core/src/buttons/core.d.ts +15 -46
  152. package/dist/_dts/theme-core/src/buttons/effectClassification.d.ts +147 -0
  153. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +2 -3
  154. package/dist/_dts/theme-core/src/buttons/generateDefaultButtonSystem.d.ts +1 -1
  155. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  156. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  157. package/dist/_dts/theme-core/src/buttons/personalities/two-tone-pill.d.ts +17 -0
  158. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +45 -33
  159. package/dist/_dts/theme-core/src/buttons/presets.d.ts +4 -25
  160. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +100 -0
  161. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +16 -0
  162. package/dist/_dts/theme-core/src/buttons/types.d.ts +104 -86
  163. package/dist/_dts/theme-core/src/cards/types.d.ts +16 -16
  164. package/dist/_dts/theme-core/src/footer/mode.d.ts +15 -0
  165. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  166. package/dist/_dts/theme-core/src/gradients/presets.d.ts +200 -8
  167. package/dist/_dts/theme-core/src/gradients/utils.d.ts +6 -2
  168. package/dist/_dts/theme-core/src/interactive/baseSchema.d.ts +1 -1
  169. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +117 -150
  170. package/dist/_dts/theme-core/src/mock-themes/modern-minimal.d.ts +1 -1
  171. package/dist/_dts/theme-core/src/navigation/types.d.ts +3 -3
  172. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -2
  173. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +5 -8
  174. package/dist/_dts/theme-core/src/palette/index.d.ts +0 -1
  175. package/dist/_dts/theme-core/src/schema.d.ts +1264 -138
  176. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  177. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +10 -10
  178. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +12 -1
  179. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +3 -2
  180. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +13 -6
  181. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +29 -8
  182. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +15 -0
  183. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +2 -2
  184. package/dist/cli/index.mjs +68552 -66955
  185. package/dist/cli/init-docs/content/cli-reference.md +50 -7
  186. package/dist/cli/init-docs/content/content-management.md +7 -4
  187. package/dist/cli/init-docs/content/workflow-publish.md +5 -1
  188. package/dist/client/{DiscountCodeDisclosure-BwGkvmVH.mjs → DiscountCodeDisclosure-DU1ygxU2.mjs} +1 -1
  189. package/dist/client/{EventCombined.client-JnWE6Hzc.mjs → EventCombined.client-DB5zagCo.mjs} +3 -3
  190. package/dist/client/{EventListing.client-DQewc_kg.mjs → EventListing.client-CTX9JHBL.mjs} +2 -2
  191. package/dist/client/{LeafletStaticMap-DPAU3SFt.mjs → LeafletStaticMap-BYImhgiB.mjs} +1 -1
  192. package/dist/client/{MagicLinkForm-D4kpWCbW.mjs → MagicLinkForm-CRkw_M3l.mjs} +2 -2
  193. package/dist/client/{StepIndicator-CBlkb4rA.mjs → StepIndicator-BnmVBJJh.mjs} +2 -2
  194. package/dist/client/{accordion-DAIBVpTS.mjs → accordion-CeGreumd.mjs} +1 -1
  195. package/dist/client/{bookingForm-DZ-4l5_1.mjs → bookingForm-CSzFNrpN.mjs} +6 -6
  196. package/dist/client/bookings.mjs +637 -328
  197. package/dist/client/{buttons-DJgynGHQ.mjs → buttons-DoFV7KDL.mjs} +618 -306
  198. package/dist/client/{carousel-D-SLfX8r.mjs → carousel-B2jDtogf.mjs} +1 -1
  199. package/dist/client/{cart-CEgbgJhX.mjs → cart-D-jZ-vaY.mjs} +3 -3
  200. package/dist/client/{checkout-CXWrCRAA.mjs → checkout-Dza-LA7N.mjs} +3 -3
  201. package/dist/client/client.mjs +2497 -1216
  202. package/dist/client/{colorStyles-jZS6KfkP.mjs → colorStyles-CrgzoXsm.mjs} +1 -30
  203. package/dist/client/{courseRegistration-DVmLrRVz.mjs → courseRegistration-TYkNychb.mjs} +7 -7
  204. package/dist/client/{eventCalendar-DCuyPY_c.mjs → eventCalendar-BI_90SsT.mjs} +5 -5
  205. package/dist/client/{eventCombined-kP2CA2D4.mjs → eventCombined-mNrpryE9.mjs} +2 -2
  206. package/dist/client/{eventDetails-DU0LeF5e.mjs → eventDetails-D4GVlCIY.mjs} +3 -3
  207. package/dist/client/{eventListing-CcHF87BI.mjs → eventListing-YhKN018y.mjs} +2 -2
  208. package/dist/client/{eventRegistration-DJnR0yFH.mjs → eventRegistration-CdHGtilr.mjs} +7 -7
  209. package/dist/client/foregroundContract-xICPq59x.mjs +31 -0
  210. package/dist/client/{form-CH1lCusH.mjs → form-AcAL45rA.mjs} +2 -2
  211. package/dist/client/{headerSection-CBPFZoku.mjs → headerSection-uEC52ueD.mjs} +3 -3
  212. package/dist/client/hooks.mjs +1249 -841
  213. package/dist/client/{locationMap-Cx1hBg5n.mjs → locationMap-_wJDSUYe.mjs} +3 -3
  214. package/dist/client/{media-DHtSxS5V.mjs → media-BK0O3b-U.mjs} +3 -2
  215. package/dist/client/{newsletterForm-1ZL_ti9u.mjs → newsletterForm-DrArsb2B.mjs} +2 -2
  216. package/dist/client/{pricing-BIbzmV0G.mjs → pricing-BSYVghwo.mjs} +1 -1
  217. package/dist/client/{productDetail-BTh5gHBV.mjs → productDetail-Dyk90sMs.mjs} +3 -3
  218. package/dist/client/{productList-Cc7OMrqN.mjs → productList-BCKThwAI.mjs} +3 -3
  219. package/dist/client/{propsDecoder-oR-M-ISN.mjs → propsDecoder-CkXxkdSR.mjs} +96 -33
  220. package/dist/client/rendering/client.mjs +1278 -523
  221. package/dist/client/rendering/islands.mjs +19 -19
  222. package/dist/client/rendering.mjs +2308 -1028
  223. package/dist/client/{shop-CQ_YbCnn.mjs → shop-DeltVH10.mjs} +6 -6
  224. package/dist/client/{shop-commerce-BM-AoD3M.mjs → shop-commerce-BD9Jsm2Z.mjs} +6 -6
  225. package/dist/client/{shop-commerce-store-DFMQhU5p.mjs → shop-commerce-store-CmXD6FDS.mjs} +1 -1
  226. package/dist/client/{shopShared-D0SKO2Cu.mjs → shopShared-B8v-lH_F.mjs} +2 -2
  227. package/dist/client/{useDiscountCodeUi-CrG4_ARt.mjs → useDiscountCodeUi-DbWJN8ld.mjs} +1 -1
  228. package/dist/client/{useEventFilters-CxK8Fekl.mjs → useEventFilters-EJIMUnqT.mjs} +46 -69
  229. package/dist/client/{usePolling-jcVryNgZ.mjs → usePolling-Cmh14fc7.mjs} +2 -2
  230. package/dist/preview-next/before-render.mjs +213 -0
  231. package/dist/preview-next/client/runtime.mjs +4 -4
  232. package/dist/preview-next/middleware.mjs +213 -0
  233. package/dist/{previewAuthStore-BPcJPzdz.mjs → previewAuthStore-CTO7CRPk.mjs} +213 -0
  234. package/dist/{sdk-runtime-C39Rsk-x.mjs → sdk-runtime-Dou0GAav.mjs} +2 -2
  235. package/dist/{separator-BoMSQnsP.mjs → separator-CI5wZNXT.mjs} +1 -1
  236. package/dist/server/components.mjs +2370 -1132
  237. package/dist/server/config-validation.mjs +1256 -842
  238. package/dist/server/config.mjs +1256 -843
  239. package/dist/server/data.mjs +1249 -841
  240. package/dist/server/date-time.mjs +386 -0
  241. package/dist/server/index.mjs +214 -1
  242. package/dist/server/navigation.mjs +9 -3
  243. package/dist/server/next.mjs +3421 -1949
  244. package/dist/server/page-converter.mjs +1236 -659
  245. package/dist/server/prebuild.mjs +1 -1
  246. package/dist/server/rendering/server.mjs +2074 -1060
  247. package/dist/server/rendering.mjs +2370 -1132
  248. package/dist/server/routing.mjs +1543 -1062
  249. package/dist/server/server.mjs +1464 -843
  250. package/dist/server/theme-bridge.mjs +1581 -474
  251. package/dist/server/theme.mjs +614 -305
  252. package/dist/styles/index.css +12 -1
  253. package/package.json +7 -1
  254. package/dist/_dts/theme-core/src/buttons/presets/types.d.ts +0 -88
  255. package/dist/_dts/theme-core/src/buttons/utils/contrast.d.ts +0 -38
  256. package/dist/_dts/theme-core/src/palette/themePaletteCompatibility.d.ts +0 -57
@@ -1,7 +1,6 @@
1
1
  import z, { z as z$1 } from "zod";
2
2
  import "react/jsx-runtime";
3
3
  import "react";
4
- //#region ../api/src/apiEndpointTypes.ts
5
4
  function blockedDemoMutationPolicy(classification, publicMessage) {
6
5
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
7
6
  return {
@@ -29,6 +28,7 @@ const TAG_TEMPLATES = {
29
28
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
30
29
  routeById: "riverbank:route:{routeId}",
31
30
  pageById: "riverbank:page:{pageId}",
31
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
32
32
  workflowRunById: "riverbank:workflow-run:{runId}",
33
33
  siteForms: "riverbank:site:{siteId}:forms",
34
34
  formById: "riverbank:form:{formId}",
@@ -52,7 +52,7 @@ const TAG_TEMPLATES = {
52
52
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
53
53
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
54
54
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
55
- TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
55
+ TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
56
56
  //#endregion
57
57
  //#region ../core/src/result.ts
58
58
  function ok(value) {
@@ -205,19 +205,29 @@ function isRecord$7(value) {
205
205
  //#region ../core/src/booking-date-time.ts
206
206
  const DEFAULT_LOCALE = "en-US";
207
207
  const FALLBACK_TIMEZONE = "UTC";
208
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
209
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
210
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
208
211
  function isValidTimeZone(timeZone) {
212
+ const cached = timeZoneValidityCache.get(timeZone);
213
+ if (cached !== void 0) return cached;
214
+ let isValid;
209
215
  try {
210
216
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
211
- return true;
217
+ isValid = true;
212
218
  } catch {
213
- return false;
219
+ isValid = false;
214
220
  }
221
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
222
+ timeZoneValidityCache.set(timeZone, isValid);
223
+ return isValid;
215
224
  }
216
225
  function getSafeTimeZone(timeZone) {
217
226
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
218
227
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
219
228
  }
220
229
  function parseStrictBookingTimeZone(timeZone) {
230
+ if (typeof timeZone !== "string") return null;
221
231
  const normalized = timeZone.trim();
222
232
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
223
233
  return normalized;
@@ -230,10 +240,19 @@ function formatParseError(error) {
230
240
  }
231
241
  }
232
242
  function formatToPartsLookup(date, locale, timeZone, format) {
233
- return new Map(new Intl.DateTimeFormat(locale, {
243
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
244
+ }
245
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
246
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
247
+ const cached = dateTimeFormatterCache.get(key);
248
+ if (cached !== void 0) return cached;
249
+ const formatter = new Intl.DateTimeFormat(locale, {
234
250
  ...format,
235
251
  timeZone
236
- }).formatToParts(date).map((part) => [part.type, part.value]));
252
+ });
253
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
254
+ dateTimeFormatterCache.set(key, formatter);
255
+ return formatter;
237
256
  }
238
257
  function getZonedDateTimeParts(date, timeZone) {
239
258
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -276,23 +295,9 @@ function toUtcIsoDateTimeString(value) {
276
295
  return parsed.value;
277
296
  }
278
297
  function parseScheduledBookingDateTime(input) {
298
+ let startsAt;
279
299
  try {
280
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
281
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
282
- if (timeZone === null) return {
283
- ok: false,
284
- field: "timeZone",
285
- reason: "invalid_time_zone",
286
- value: input.timeZone
287
- };
288
- return {
289
- ok: true,
290
- value: {
291
- startsAt,
292
- timeZone,
293
- locale: input.locale
294
- }
295
- };
300
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
296
301
  } catch {
297
302
  return {
298
303
  ok: false,
@@ -301,6 +306,21 @@ function parseScheduledBookingDateTime(input) {
301
306
  value: input.startsAt
302
307
  };
303
308
  }
309
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
310
+ if (timeZone === null) return {
311
+ ok: false,
312
+ field: "timeZone",
313
+ reason: "invalid_time_zone",
314
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
315
+ };
316
+ return {
317
+ ok: true,
318
+ value: {
319
+ startsAt,
320
+ timeZone,
321
+ locale: input.locale
322
+ }
323
+ };
304
324
  }
305
325
  function toScheduledBookingDateTime(input) {
306
326
  const result = parseScheduledBookingDateTime(input);
@@ -3430,6 +3450,111 @@ const mediaSchema$1 = z.object({
3430
3450
  transform: transformSchema$1.optional()
3431
3451
  });
3432
3452
  //#endregion
3453
+ //#region ../theme-core/src/buttons/effectClassification.ts
3454
+ /**
3455
+ * Exhaustive live policy for every registered effect id.
3456
+ *
3457
+ * The resolver consumes the transition payload directly, so adding an effect
3458
+ * cannot update classification without also defining its runtime behavior.
3459
+ */
3460
+ const BUTTON_EFFECT_POLICIES = {
3461
+ "darken-background": {
3462
+ classification: "colour-transition",
3463
+ transition: {
3464
+ kind: "adjust-shade",
3465
+ direction: "darker"
3466
+ }
3467
+ },
3468
+ "lighten-background": {
3469
+ classification: "colour-transition",
3470
+ transition: {
3471
+ kind: "adjust-shade",
3472
+ direction: "lighter"
3473
+ }
3474
+ },
3475
+ "background-on-hover": {
3476
+ classification: "colour-transition",
3477
+ transition: { kind: "replace-background" }
3478
+ },
3479
+ "background-on-hover-alpha": {
3480
+ classification: "unsupported-colour",
3481
+ reason: "alpha_requires_surface"
3482
+ },
3483
+ "fade-background": {
3484
+ classification: "unsupported-colour",
3485
+ reason: "changes_element_opacity"
3486
+ },
3487
+ "opacity-reduce": {
3488
+ classification: "unsupported-colour",
3489
+ reason: "changes_element_opacity"
3490
+ },
3491
+ "gradient-text": {
3492
+ classification: "unsupported-colour",
3493
+ reason: "changes_foreground"
3494
+ },
3495
+ "text-color-change": {
3496
+ classification: "unsupported-colour",
3497
+ reason: "changes_foreground"
3498
+ },
3499
+ "border-color-change": {
3500
+ classification: "unsupported-colour",
3501
+ reason: "changes_border"
3502
+ },
3503
+ "aurora-glow": {
3504
+ classification: "unsupported-background-overlay",
3505
+ reason: "unresolved_background_overlay"
3506
+ },
3507
+ "cosmic-stardust": {
3508
+ classification: "unsupported-background-overlay",
3509
+ reason: "unresolved_background_overlay"
3510
+ },
3511
+ "gradient-border-fill": {
3512
+ classification: "unsupported-background-overlay",
3513
+ reason: "unresolved_background_overlay"
3514
+ },
3515
+ "animated-gradient-border-fill": {
3516
+ classification: "unsupported-background-overlay",
3517
+ reason: "unresolved_background_overlay"
3518
+ },
3519
+ "nav-underline": {
3520
+ classification: "not-button",
3521
+ reason: "not_button_effect"
3522
+ },
3523
+ "nav-frosted-base": {
3524
+ classification: "not-button",
3525
+ reason: "not_button_effect"
3526
+ },
3527
+ "nav-frosted-hover": {
3528
+ classification: "not-button",
3529
+ reason: "not_button_effect"
3530
+ },
3531
+ "nav-frosted-active": {
3532
+ classification: "not-button",
3533
+ reason: "not_button_effect"
3534
+ },
3535
+ "animated-gradient": { classification: "non-colour" },
3536
+ "border-glow": { classification: "non-colour" },
3537
+ "drop-shadow": { classification: "non-colour" },
3538
+ "inner-shadow": { classification: "non-colour" },
3539
+ "neumorphic-shadow": { classification: "non-colour" },
3540
+ "outer-glow": { classification: "non-colour" },
3541
+ "retro-3d-shadow": { classification: "non-colour" },
3542
+ "scale-up": { classification: "non-colour" },
3543
+ "scale-down": { classification: "non-colour" },
3544
+ lift: { classification: "non-colour" },
3545
+ "press-down": { classification: "non-colour" },
3546
+ pop: { classification: "non-colour" },
3547
+ "border-bottom-grow": { classification: "non-colour" },
3548
+ "sketchy-border": { classification: "non-colour" },
3549
+ "pulse-animation": { classification: "non-colour" }
3550
+ };
3551
+ function getButtonEffectPolicy(effectId) {
3552
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
3553
+ }
3554
+ function classifyButtonEffectId(effectId) {
3555
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
3556
+ }
3557
+ //#endregion
3433
3558
  //#region ../theme-core/src/buttons/types.ts
3434
3559
  /**
3435
3560
  * Standard semantic variant roles a theme exposes.
@@ -3446,6 +3571,20 @@ const VARIANT_ROLES = [
3446
3571
  "tertiary",
3447
3572
  "accent"
3448
3573
  ];
3574
+ function parseOpaqueButtonColourToken(value) {
3575
+ const token = parseThemeColorToken(value);
3576
+ if (token === null) return null;
3577
+ const parts = parseColorTokenParts(token);
3578
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
3579
+ }
3580
+ function unsafeAsOpaqueButtonColourToken(value) {
3581
+ return value;
3582
+ }
3583
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
3584
+ const token = parseOpaqueButtonColourToken(value);
3585
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3586
+ return token;
3587
+ });
3449
3588
  const cornerStyleSchema = z$1.enum([
3450
3589
  "square",
3451
3590
  "rounded",
@@ -3547,7 +3686,7 @@ const buttonSizesSchema = z$1.object({
3547
3686
  lg,
3548
3687
  xl: xl ?? lg
3549
3688
  }));
3550
- const buttonGlobalSettingsSchema = z$1.object({
3689
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
3551
3690
  cornerStyle: cornerStyleSchema,
3552
3691
  cornerRadius: z$1.number().min(0).max(24).optional(),
3553
3692
  /**
@@ -3578,11 +3717,12 @@ const buttonGlobalSettingsSchema = z$1.object({
3578
3717
  paddingPreset: buttonPaddingPresetSchema.optional(),
3579
3718
  hoverTransform: hoverTransformSchema,
3580
3719
  hoverColor: hoverColorSchema,
3581
- hoverColorToken: themeColorTokenSchema.optional(),
3720
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
3582
3721
  gradientStyle: gradientStyleSchema.optional(),
3583
3722
  gradientAngle: z$1.number().min(0).max(360).optional(),
3584
3723
  gradientSharpness: gradientSharpnessSchema.optional()
3585
3724
  });
3725
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
3586
3726
  const gradientDirectionSchema$1 = z$1.enum([
3587
3727
  "to-r",
3588
3728
  "to-l",
@@ -3596,27 +3736,33 @@ const gradientDirectionSchema$1 = z$1.enum([
3596
3736
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
3597
3737
  z$1.object({
3598
3738
  type: z$1.literal("solid"),
3599
- colorToken: themeColorTokenSchema
3739
+ colorToken: opaqueButtonColourTokenSchema
3600
3740
  }),
3601
3741
  z$1.object({
3602
3742
  type: z$1.literal("gradient"),
3603
- stops: z$1.array(themeColorTokenSchema).min(2),
3604
- direction: gradientDirectionSchema$1
3743
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
3744
+ const [first, second, ...rest] = stops;
3745
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
3746
+ return [
3747
+ first,
3748
+ second,
3749
+ ...rest
3750
+ ];
3751
+ }),
3752
+ direction: gradientDirectionSchema$1,
3753
+ foregroundToken: opaqueButtonColourTokenSchema
3605
3754
  }),
3606
- z$1.object({ type: z$1.literal("transparent") })
3755
+ z$1.object({
3756
+ type: z$1.literal("surface"),
3757
+ role: z$1.literal("link")
3758
+ })
3607
3759
  ]);
3608
3760
  const effectApplicationSchema$1 = z$1.object({
3609
3761
  effectId: z$1.string(),
3610
- options: z$1.record(z$1.string(), z$1.any()).optional()
3611
- });
3612
- const buttonBorderSchema = z$1.object({
3613
- widthClass: z$1.string(),
3614
- colorToken: themeColorTokenSchema
3615
- });
3616
- const buttonVariantAffordanceSchema = z$1.object({
3617
- iconId: z$1.string().min(1),
3618
- colorToken: themeColorTokenSchema.optional()
3762
+ options: z$1.record(z$1.string(), z$1.json()).optional()
3619
3763
  });
3764
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
3765
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
3620
3766
  const variantShadowSchema = z$1.object({
3621
3767
  elevation: z$1.enum([
3622
3768
  "none",
@@ -3657,27 +3803,170 @@ const variantSizeOverridesSchema = z$1.object({
3657
3803
  * default (e.g. link-style variants declaring zero horizontal padding at
3658
3804
  * every size).
3659
3805
  */
3660
- const buttonVariantSchema = z$1.object({
3806
+ const canonicalButtonVariantSchema = z$1.object({
3661
3807
  id: z$1.string(),
3662
3808
  name: z$1.string().min(1).max(20),
3663
3809
  enabled: z$1.boolean(),
3664
3810
  priority: prioritySchema,
3665
3811
  background: buttonBackgroundSchema,
3666
- textColorToken: themeColorTokenSchema,
3667
3812
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
3668
3813
  borderRadius: z$1.string().optional(),
3669
3814
  shadow: variantShadowSchema.optional(),
3670
3815
  border: buttonBorderSchema.optional(),
3671
- hoverBackgroundToken: z$1.string().optional(),
3816
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
3672
3817
  effects: variantEffectsSchema.optional(),
3673
3818
  sizes: variantSizeOverridesSchema.optional(),
3674
3819
  affordance: buttonVariantAffordanceSchema.optional()
3675
3820
  });
3821
+ /**
3822
+ * Temporary persisted-theme admission boundary for issue #1206.
3823
+ *
3824
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
3825
+ * `textColorToken`/border colour shape. New source and all downstream code use
3826
+ * only the canonical relationship. Delete this preprocessor after the reviewed
3827
+ * production rewrite reports zero legacy rows.
3828
+ */
3829
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
3676
3830
  const buttonSystemSchema = z$1.object({
3677
3831
  global: buttonGlobalSettingsSchema,
3678
3832
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
3679
3833
  sizes: buttonSizesSchema.optional()
3680
3834
  });
3835
+ function normalizeLegacyButtonVariantInput(input) {
3836
+ if (!isUnknownRecord(input)) return input;
3837
+ const background = input.background;
3838
+ if (!isUnknownRecord(background)) return input;
3839
+ 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;
3840
+ const { textColorToken, ...withoutLegacyText } = input;
3841
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
3842
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
3843
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
3844
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
3845
+ if (background.type === "transparent") return {
3846
+ ...withoutLegacyText,
3847
+ background: {
3848
+ type: "surface",
3849
+ role: "link"
3850
+ },
3851
+ border: normalizedBorder,
3852
+ affordance: normalizedAffordance,
3853
+ effects: normalizedEffects,
3854
+ hoverBackgroundToken
3855
+ };
3856
+ if (background.type === "gradient") {
3857
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
3858
+ return {
3859
+ ...withoutLegacyText,
3860
+ background: {
3861
+ ...background,
3862
+ stops,
3863
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
3864
+ },
3865
+ border: normalizedBorder,
3866
+ affordance: normalizedAffordance,
3867
+ effects: normalizedEffects,
3868
+ hoverBackgroundToken
3869
+ };
3870
+ }
3871
+ return {
3872
+ ...withoutLegacyText,
3873
+ background: background.type === "solid" ? {
3874
+ ...background,
3875
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
3876
+ } : background,
3877
+ border: normalizedBorder,
3878
+ affordance: normalizedAffordance,
3879
+ effects: normalizedEffects,
3880
+ hoverBackgroundToken
3881
+ };
3882
+ }
3883
+ function normalizeLegacyButtonGlobalInput(input) {
3884
+ if (!isUnknownRecord(input)) return input;
3885
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
3886
+ return hoverColorToken === input.hoverColorToken ? input : {
3887
+ ...input,
3888
+ hoverColorToken
3889
+ };
3890
+ }
3891
+ function hasLegacyAlphaToken(input, background) {
3892
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
3893
+ return [
3894
+ input.hoverBackgroundToken,
3895
+ background.colorToken,
3896
+ background.foregroundToken,
3897
+ ...stops
3898
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
3899
+ }
3900
+ function stripLegacyTokenAlpha(value) {
3901
+ if (typeof value !== "string") return value;
3902
+ const slashIndex = value.indexOf("/");
3903
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
3904
+ }
3905
+ function hasLegacyButtonEffects(input) {
3906
+ if (!isUnknownRecord(input)) return false;
3907
+ return [
3908
+ "base",
3909
+ "hover",
3910
+ "active",
3911
+ "focus"
3912
+ ].some((state) => {
3913
+ const effects = input[state];
3914
+ return Array.isArray(effects) && effects.some((effect) => {
3915
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
3916
+ const classification = classifyButtonEffectId(effect.effectId);
3917
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
3918
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
3919
+ });
3920
+ });
3921
+ }
3922
+ function normalizeLegacyButtonEffects(input, backgroundType) {
3923
+ if (!isUnknownRecord(input)) return input;
3924
+ const normalized = {};
3925
+ for (const state of [
3926
+ "base",
3927
+ "hover",
3928
+ "active",
3929
+ "focus"
3930
+ ]) {
3931
+ const effects = input[state];
3932
+ if (!Array.isArray(effects)) continue;
3933
+ const safeEffects = effects.flatMap((effect) => {
3934
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
3935
+ const classification = classifyButtonEffectId(effect.effectId);
3936
+ if (classification === "non-colour") return [effect];
3937
+ if (classification !== "colour-transition") return [];
3938
+ if (effect.effectId === "background-on-hover") {
3939
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
3940
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
3941
+ return colorToken === null ? [] : [{
3942
+ ...effect,
3943
+ options: {
3944
+ ...options,
3945
+ colorToken
3946
+ }
3947
+ }];
3948
+ }
3949
+ if (backgroundType !== "solid") return [];
3950
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
3951
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
3952
+ return [{
3953
+ ...effect,
3954
+ options: {
3955
+ ...isUnknownRecord(effect.options) ? effect.options : {},
3956
+ amount
3957
+ }
3958
+ }];
3959
+ });
3960
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
3961
+ }
3962
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
3963
+ }
3964
+ function isUnknownRecord(value) {
3965
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3966
+ }
3967
+ function isUnknownArray(value) {
3968
+ return Array.isArray(value);
3969
+ }
3681
3970
  buttonSizeNameSchema.options;
3682
3971
  //#endregion
3683
3972
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -3704,7 +3993,7 @@ function defineButtonPersonality(input) {
3704
3993
  name: input.name,
3705
3994
  description: input.description,
3706
3995
  tags: input.tags,
3707
- buttonSystem: input.buttonSystem
3996
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
3708
3997
  };
3709
3998
  }
3710
3999
  //#endregion
@@ -3757,19 +4046,15 @@ const brushedWash = defineButtonPersonality({
3757
4046
  background: {
3758
4047
  type: "gradient",
3759
4048
  stops: ["primary", "accent"],
3760
- direction: "to-r"
4049
+ direction: "to-r",
4050
+ foregroundToken: "primaryForeground"
3761
4051
  },
3762
- textColorToken: "primaryForeground",
3763
4052
  borderRadius: "rounded-lg",
3764
4053
  shadow: {
3765
4054
  elevation: "low",
3766
4055
  softness: "soft",
3767
4056
  position: "bottom"
3768
- },
3769
- effects: { hover: [{
3770
- effectId: "opacity-reduce",
3771
- options: { reduction: -15 }
3772
- }] }
4057
+ }
3773
4058
  },
3774
4059
  {
3775
4060
  id: "secondary",
@@ -3779,32 +4064,27 @@ const brushedWash = defineButtonPersonality({
3779
4064
  background: {
3780
4065
  type: "gradient",
3781
4066
  stops: ["secondary", "accent"],
3782
- direction: "to-br"
4067
+ direction: "to-br",
4068
+ foregroundToken: "primaryForeground"
3783
4069
  },
3784
- textColorToken: "primaryForeground",
3785
4070
  borderRadius: "rounded-lg",
3786
4071
  shadow: {
3787
4072
  elevation: "low",
3788
4073
  softness: "soft",
3789
4074
  position: "bottom"
3790
- },
3791
- effects: { hover: [{
3792
- effectId: "opacity-reduce",
3793
- options: { reduction: -15 }
3794
- }] }
4075
+ }
3795
4076
  },
3796
4077
  {
3797
4078
  id: "outline",
3798
4079
  name: "Outline",
3799
4080
  enabled: true,
3800
4081
  priority: 3,
3801
- background: { type: "transparent" },
3802
- textColorToken: "primary",
3803
- borderRadius: "rounded-lg",
3804
- border: {
3805
- widthClass: "border",
3806
- colorToken: "primary"
4082
+ background: {
4083
+ type: "surface",
4084
+ role: "link"
3807
4085
  },
4086
+ borderRadius: "rounded-lg",
4087
+ border: { widthClass: "border" },
3808
4088
  effects: { hover: [{
3809
4089
  effectId: "background-on-hover",
3810
4090
  options: { colorToken: "surface" }
@@ -3815,8 +4095,10 @@ const brushedWash = defineButtonPersonality({
3815
4095
  name: "Ghost",
3816
4096
  enabled: true,
3817
4097
  priority: 3,
3818
- background: { type: "transparent" },
3819
- textColorToken: "text",
4098
+ background: {
4099
+ type: "surface",
4100
+ role: "link"
4101
+ },
3820
4102
  borderRadius: "rounded-lg",
3821
4103
  effects: { hover: [{
3822
4104
  effectId: "background-on-hover",
@@ -3862,7 +4144,6 @@ const confidentChip = defineButtonPersonality({
3862
4144
  type: "solid",
3863
4145
  colorToken: "primary"
3864
4146
  },
3865
- textColorToken: "primaryForeground",
3866
4147
  borderRadius: "rounded-md",
3867
4148
  shadow: {
3868
4149
  elevation: "medium",
@@ -3872,7 +4153,7 @@ const confidentChip = defineButtonPersonality({
3872
4153
  effects: {
3873
4154
  hover: [{
3874
4155
  effectId: "darken-background",
3875
- options: { amount: 60 }
4156
+ options: { amount: 100 }
3876
4157
  }],
3877
4158
  active: [{
3878
4159
  effectId: "scale-down",
@@ -3889,12 +4170,8 @@ const confidentChip = defineButtonPersonality({
3889
4170
  type: "solid",
3890
4171
  colorToken: "surface"
3891
4172
  },
3892
- textColorToken: "text",
3893
4173
  borderRadius: "rounded-md",
3894
- border: {
3895
- widthClass: "border",
3896
- colorToken: "border"
3897
- },
4174
+ border: { widthClass: "border" },
3898
4175
  effects: { hover: [{
3899
4176
  effectId: "background-on-hover",
3900
4177
  options: { colorToken: "background" }
@@ -3905,13 +4182,12 @@ const confidentChip = defineButtonPersonality({
3905
4182
  name: "Outline",
3906
4183
  enabled: true,
3907
4184
  priority: 3,
3908
- background: { type: "transparent" },
3909
- textColorToken: "primary",
3910
- borderRadius: "rounded-md",
3911
- border: {
3912
- widthClass: "border",
3913
- colorToken: "primary"
4185
+ background: {
4186
+ type: "surface",
4187
+ role: "link"
3914
4188
  },
4189
+ borderRadius: "rounded-md",
4190
+ border: { widthClass: "border" },
3915
4191
  effects: { hover: [{
3916
4192
  effectId: "background-on-hover",
3917
4193
  options: { colorToken: "surface" }
@@ -3922,8 +4198,10 @@ const confidentChip = defineButtonPersonality({
3922
4198
  name: "Ghost",
3923
4199
  enabled: true,
3924
4200
  priority: 3,
3925
- background: { type: "transparent" },
3926
- textColorToken: "primary",
4201
+ background: {
4202
+ type: "surface",
4203
+ role: "link"
4204
+ },
3927
4205
  borderRadius: "rounded-md",
3928
4206
  effects: { hover: [{
3929
4207
  effectId: "background-on-hover",
@@ -3986,7 +4264,6 @@ const earthPill = defineButtonPersonality({
3986
4264
  type: "solid",
3987
4265
  colorToken: "primary"
3988
4266
  },
3989
- textColorToken: "primaryForeground",
3990
4267
  borderRadius: "rounded-full",
3991
4268
  shadow: {
3992
4269
  elevation: "low",
@@ -4012,13 +4289,12 @@ const earthPill = defineButtonPersonality({
4012
4289
  name: "Secondary",
4013
4290
  enabled: true,
4014
4291
  priority: 2,
4015
- background: { type: "transparent" },
4016
- textColorToken: "primary",
4017
- borderRadius: "rounded-full",
4018
- border: {
4019
- widthClass: "border",
4020
- colorToken: "primary"
4292
+ background: {
4293
+ type: "surface",
4294
+ role: "link"
4021
4295
  },
4296
+ borderRadius: "rounded-full",
4297
+ border: { widthClass: "border" },
4022
4298
  effects: { hover: [{
4023
4299
  effectId: "background-on-hover",
4024
4300
  options: { colorToken: "muted" }
@@ -4029,13 +4305,12 @@ const earthPill = defineButtonPersonality({
4029
4305
  name: "Outline",
4030
4306
  enabled: true,
4031
4307
  priority: 3,
4032
- background: { type: "transparent" },
4033
- textColorToken: "text",
4034
- borderRadius: "rounded-full",
4035
- border: {
4036
- widthClass: "border",
4037
- colorToken: "border"
4308
+ background: {
4309
+ type: "surface",
4310
+ role: "link"
4038
4311
  },
4312
+ borderRadius: "rounded-full",
4313
+ border: { widthClass: "border" },
4039
4314
  effects: { hover: [{
4040
4315
  effectId: "background-on-hover",
4041
4316
  options: { colorToken: "surfaceAlt" }
@@ -4046,8 +4321,10 @@ const earthPill = defineButtonPersonality({
4046
4321
  name: "Ghost",
4047
4322
  enabled: true,
4048
4323
  priority: 3,
4049
- background: { type: "transparent" },
4050
- textColorToken: "primary",
4324
+ background: {
4325
+ type: "surface",
4326
+ role: "link"
4327
+ },
4051
4328
  borderRadius: "rounded-full",
4052
4329
  shadow: {
4053
4330
  elevation: "none",
@@ -4068,11 +4345,7 @@ const earthPill = defineButtonPersonality({
4068
4345
  padding: "0.625rem 0",
4069
4346
  fontSize: "text-xl"
4070
4347
  }
4071
- },
4072
- effects: { hover: [{
4073
- effectId: "opacity-reduce",
4074
- options: { reduction: 25 }
4075
- }] }
4348
+ }
4076
4349
  }
4077
4350
  ]
4078
4351
  }
@@ -4108,8 +4381,10 @@ const editorialLink = defineButtonPersonality({
4108
4381
  name: "Primary",
4109
4382
  enabled: true,
4110
4383
  priority: 1,
4111
- background: { type: "transparent" },
4112
- textColorToken: "text",
4384
+ background: {
4385
+ type: "surface",
4386
+ role: "link"
4387
+ },
4113
4388
  borderRadius: "rounded-none",
4114
4389
  sizes: {
4115
4390
  sm: { padding: "0.25rem 0" },
@@ -4131,8 +4406,10 @@ const editorialLink = defineButtonPersonality({
4131
4406
  name: "Secondary",
4132
4407
  enabled: true,
4133
4408
  priority: 2,
4134
- background: { type: "transparent" },
4135
- textColorToken: "mutedText",
4409
+ background: {
4410
+ type: "surface",
4411
+ role: "link"
4412
+ },
4136
4413
  borderRadius: "rounded-none",
4137
4414
  sizes: {
4138
4415
  sm: { padding: "0.25rem 0" },
@@ -4154,8 +4431,10 @@ const editorialLink = defineButtonPersonality({
4154
4431
  name: "Outline",
4155
4432
  enabled: true,
4156
4433
  priority: 3,
4157
- background: { type: "transparent" },
4158
- textColorToken: "accent",
4434
+ background: {
4435
+ type: "surface",
4436
+ role: "link"
4437
+ },
4159
4438
  borderRadius: "rounded-none",
4160
4439
  sizes: {
4161
4440
  sm: { padding: "0.25rem 0" },
@@ -4177,19 +4456,17 @@ const editorialLink = defineButtonPersonality({
4177
4456
  name: "Ghost",
4178
4457
  enabled: true,
4179
4458
  priority: 3,
4180
- background: { type: "transparent" },
4181
- textColorToken: "mutedText",
4459
+ background: {
4460
+ type: "surface",
4461
+ role: "link"
4462
+ },
4182
4463
  borderRadius: "rounded-none",
4183
4464
  sizes: {
4184
4465
  sm: { padding: "0.25rem 0" },
4185
4466
  md: { padding: "0.5rem 0" },
4186
4467
  lg: { padding: "0.625rem 0" },
4187
4468
  xl: { padding: "0.75rem 0" }
4188
- },
4189
- effects: { hover: [{
4190
- effectId: "opacity-reduce",
4191
- options: { reduction: -20 }
4192
- }] }
4469
+ }
4193
4470
  }
4194
4471
  ]
4195
4472
  }
@@ -4251,12 +4528,8 @@ const flatInk = defineButtonPersonality({
4251
4528
  type: "solid",
4252
4529
  colorToken: "primary"
4253
4530
  },
4254
- textColorToken: "primaryForeground",
4255
4531
  borderRadius: "rounded-lg",
4256
- affordance: {
4257
- iconId: "ArrowRight",
4258
- colorToken: "accent"
4259
- },
4532
+ affordance: { iconId: "ArrowRight" },
4260
4533
  effects: { hover: [{
4261
4534
  effectId: "lift",
4262
4535
  options: { translateY: "-2px" }
@@ -4270,13 +4543,12 @@ const flatInk = defineButtonPersonality({
4270
4543
  name: "Secondary",
4271
4544
  enabled: true,
4272
4545
  priority: 2,
4273
- background: { type: "transparent" },
4274
- textColorToken: "primary",
4275
- borderRadius: "rounded-lg",
4276
- border: {
4277
- widthClass: "border",
4278
- colorToken: "border"
4546
+ background: {
4547
+ type: "surface",
4548
+ role: "link"
4279
4549
  },
4550
+ borderRadius: "rounded-lg",
4551
+ border: { widthClass: "border" },
4280
4552
  effects: { hover: [{
4281
4553
  effectId: "lift",
4282
4554
  options: { translateY: "-2px" }
@@ -4294,12 +4566,8 @@ const flatInk = defineButtonPersonality({
4294
4566
  type: "solid",
4295
4567
  colorToken: "accent"
4296
4568
  },
4297
- textColorToken: "accentForeground",
4298
4569
  borderRadius: "rounded-lg",
4299
- affordance: {
4300
- iconId: "ArrowRight",
4301
- colorToken: "accentForeground"
4302
- },
4570
+ affordance: { iconId: "ArrowRight" },
4303
4571
  effects: { hover: [{
4304
4572
  effectId: "lift",
4305
4573
  options: { translateY: "-2px" }
@@ -4362,7 +4630,6 @@ const inkStamp = defineButtonPersonality({
4362
4630
  type: "solid",
4363
4631
  colorToken: "primary"
4364
4632
  },
4365
- textColorToken: "primaryForeground",
4366
4633
  borderRadius: "rounded-md",
4367
4634
  effects: {
4368
4635
  hover: [{
@@ -4383,13 +4650,12 @@ const inkStamp = defineButtonPersonality({
4383
4650
  name: "Secondary",
4384
4651
  enabled: true,
4385
4652
  priority: 2,
4386
- background: { type: "transparent" },
4387
- textColorToken: "primary",
4388
- borderRadius: "rounded-md",
4389
- border: {
4390
- widthClass: "border-2",
4391
- colorToken: "primary"
4653
+ background: {
4654
+ type: "surface",
4655
+ role: "link"
4392
4656
  },
4657
+ borderRadius: "rounded-md",
4658
+ border: { widthClass: "border-2" },
4393
4659
  effects: { hover: [{
4394
4660
  effectId: "background-on-hover",
4395
4661
  options: { colorToken: "surface" }
@@ -4400,13 +4666,12 @@ const inkStamp = defineButtonPersonality({
4400
4666
  name: "Outline",
4401
4667
  enabled: true,
4402
4668
  priority: 3,
4403
- background: { type: "transparent" },
4404
- textColorToken: "text",
4405
- borderRadius: "rounded-md",
4406
- border: {
4407
- widthClass: "border-2",
4408
- colorToken: "border"
4669
+ background: {
4670
+ type: "surface",
4671
+ role: "link"
4409
4672
  },
4673
+ borderRadius: "rounded-md",
4674
+ border: { widthClass: "border-2" },
4410
4675
  effects: { hover: [{
4411
4676
  effectId: "background-on-hover",
4412
4677
  options: { colorToken: "surface" }
@@ -4417,8 +4682,10 @@ const inkStamp = defineButtonPersonality({
4417
4682
  name: "Ghost",
4418
4683
  enabled: true,
4419
4684
  priority: 3,
4420
- background: { type: "transparent" },
4421
- textColorToken: "accent",
4685
+ background: {
4686
+ type: "surface",
4687
+ role: "link"
4688
+ },
4422
4689
  borderRadius: "rounded-none",
4423
4690
  sizes: {
4424
4691
  sm: {
@@ -4511,7 +4778,6 @@ const joyStamp = defineButtonPersonality({
4511
4778
  type: "solid",
4512
4779
  colorToken: "primary"
4513
4780
  },
4514
- textColorToken: "primaryForeground",
4515
4781
  borderRadius: "rounded-full",
4516
4782
  shadow: {
4517
4783
  elevation: "high",
@@ -4525,13 +4791,12 @@ const joyStamp = defineButtonPersonality({
4525
4791
  name: "Secondary",
4526
4792
  enabled: true,
4527
4793
  priority: 2,
4528
- background: { type: "transparent" },
4529
- textColorToken: "text",
4530
- borderRadius: "rounded-full",
4531
- border: {
4532
- widthClass: "border-2",
4533
- colorToken: "text"
4794
+ background: {
4795
+ type: "surface",
4796
+ role: "link"
4534
4797
  },
4798
+ borderRadius: "rounded-full",
4799
+ border: { widthClass: "border-2" },
4535
4800
  shadow: {
4536
4801
  elevation: "high",
4537
4802
  softness: "hard",
@@ -4596,12 +4861,8 @@ const ornateRitual = defineButtonPersonality({
4596
4861
  type: "solid",
4597
4862
  colorToken: "primary"
4598
4863
  },
4599
- textColorToken: "primaryForeground",
4600
4864
  borderRadius: "rounded-md",
4601
- border: {
4602
- widthClass: "border",
4603
- colorToken: "primary"
4604
- },
4865
+ border: { widthClass: "border" },
4605
4866
  effects: {
4606
4867
  hover: [{
4607
4868
  effectId: "background-on-hover",
@@ -4622,12 +4883,8 @@ const ornateRitual = defineButtonPersonality({
4622
4883
  type: "solid",
4623
4884
  colorToken: "secondary"
4624
4885
  },
4625
- textColorToken: "primaryForeground",
4626
4886
  borderRadius: "rounded-md",
4627
- border: {
4628
- widthClass: "border",
4629
- colorToken: "primary"
4630
- },
4887
+ border: { widthClass: "border" },
4631
4888
  effects: { hover: [{
4632
4889
  effectId: "background-on-hover",
4633
4890
  options: { colorToken: "surface" }
@@ -4638,13 +4895,12 @@ const ornateRitual = defineButtonPersonality({
4638
4895
  name: "Outline",
4639
4896
  enabled: true,
4640
4897
  priority: 3,
4641
- background: { type: "transparent" },
4642
- textColorToken: "primary",
4643
- borderRadius: "rounded-md",
4644
- border: {
4645
- widthClass: "border",
4646
- colorToken: "primary"
4898
+ background: {
4899
+ type: "surface",
4900
+ role: "link"
4647
4901
  },
4902
+ borderRadius: "rounded-md",
4903
+ border: { widthClass: "border" },
4648
4904
  effects: { hover: [{
4649
4905
  effectId: "background-on-hover",
4650
4906
  options: { colorToken: "muted" }
@@ -4655,8 +4911,10 @@ const ornateRitual = defineButtonPersonality({
4655
4911
  name: "Ghost",
4656
4912
  enabled: true,
4657
4913
  priority: 3,
4658
- background: { type: "transparent" },
4659
- textColorToken: "accent",
4914
+ background: {
4915
+ type: "surface",
4916
+ role: "link"
4917
+ },
4660
4918
  borderRadius: "rounded-none",
4661
4919
  sizes: {
4662
4920
  sm: {
@@ -4738,14 +4996,10 @@ const pebble = defineButtonPersonality({
4738
4996
  type: "solid",
4739
4997
  colorToken: "primary"
4740
4998
  },
4741
- textColorToken: "primaryForeground",
4742
4999
  borderRadius: "rounded-full",
4743
5000
  effects: { hover: [{
4744
- effectId: "background-on-hover-alpha",
4745
- options: {
4746
- colorToken: "primary",
4747
- opacity: 88
4748
- }
5001
+ effectId: "darken-background",
5002
+ options: { amount: 100 }
4749
5003
  }] }
4750
5004
  },
4751
5005
  {
@@ -4753,13 +5007,12 @@ const pebble = defineButtonPersonality({
4753
5007
  name: "Secondary",
4754
5008
  enabled: true,
4755
5009
  priority: 2,
4756
- background: { type: "transparent" },
4757
- textColorToken: "primary",
4758
- borderRadius: "rounded-full",
4759
- border: {
4760
- widthClass: "border-2",
4761
- colorToken: "accent"
5010
+ background: {
5011
+ type: "surface",
5012
+ role: "link"
4762
5013
  },
5014
+ borderRadius: "rounded-full",
5015
+ border: { widthClass: "border-2" },
4763
5016
  effects: { hover: [{
4764
5017
  effectId: "background-on-hover",
4765
5018
  options: { colorToken: "accent" }
@@ -4770,13 +5023,12 @@ const pebble = defineButtonPersonality({
4770
5023
  name: "Outline",
4771
5024
  enabled: true,
4772
5025
  priority: 3,
4773
- background: { type: "transparent" },
4774
- textColorToken: "text",
4775
- borderRadius: "rounded-full",
4776
- border: {
4777
- widthClass: "border",
4778
- colorToken: "border"
5026
+ background: {
5027
+ type: "surface",
5028
+ role: "link"
4779
5029
  },
5030
+ borderRadius: "rounded-full",
5031
+ border: { widthClass: "border" },
4780
5032
  effects: { hover: [{
4781
5033
  effectId: "background-on-hover",
4782
5034
  options: { colorToken: "surface" }
@@ -4787,8 +5039,10 @@ const pebble = defineButtonPersonality({
4787
5039
  name: "Ghost",
4788
5040
  enabled: true,
4789
5041
  priority: 3,
4790
- background: { type: "transparent" },
4791
- textColorToken: "primary",
5042
+ background: {
5043
+ type: "surface",
5044
+ role: "link"
5045
+ },
4792
5046
  borderRadius: "rounded-full",
4793
5047
  sizes: {
4794
5048
  sm: {
@@ -4804,11 +5058,7 @@ const pebble = defineButtonPersonality({
4804
5058
  padding: "0.75rem 1.5rem",
4805
5059
  fontSize: "text-xl"
4806
5060
  }
4807
- },
4808
- effects: { hover: [{
4809
- effectId: "opacity-reduce",
4810
- options: { reduction: 30 }
4811
- }] }
5061
+ }
4812
5062
  }
4813
5063
  ]
4814
5064
  }
@@ -4870,15 +5120,11 @@ const quietArrow = defineButtonPersonality({
4870
5120
  type: "solid",
4871
5121
  colorToken: "primary"
4872
5122
  },
4873
- textColorToken: "primaryForeground",
4874
5123
  borderRadius: "rounded-xl",
4875
5124
  affordance: { iconId: "ArrowRight" },
4876
5125
  effects: { hover: [{
4877
- effectId: "background-on-hover-alpha",
4878
- options: {
4879
- colorToken: "primary",
4880
- opacity: 90
4881
- }
5126
+ effectId: "darken-background",
5127
+ options: { amount: 100 }
4882
5128
  }] }
4883
5129
  },
4884
5130
  {
@@ -4886,13 +5132,12 @@ const quietArrow = defineButtonPersonality({
4886
5132
  name: "Secondary",
4887
5133
  enabled: true,
4888
5134
  priority: 2,
4889
- background: { type: "transparent" },
4890
- textColorToken: "primary",
4891
- borderRadius: "rounded-xl",
4892
- border: {
4893
- widthClass: "border",
4894
- colorToken: "primary"
5135
+ background: {
5136
+ type: "surface",
5137
+ role: "link"
4895
5138
  },
5139
+ borderRadius: "rounded-xl",
5140
+ border: { widthClass: "border" },
4896
5141
  affordance: { iconId: "ArrowRight" },
4897
5142
  effects: { hover: [{
4898
5143
  effectId: "background-on-hover",
@@ -4904,21 +5149,22 @@ const quietArrow = defineButtonPersonality({
4904
5149
  name: "Outline",
4905
5150
  enabled: true,
4906
5151
  priority: 3,
4907
- background: { type: "transparent" },
4908
- textColorToken: "primary",
5152
+ background: {
5153
+ type: "surface",
5154
+ role: "link"
5155
+ },
4909
5156
  borderRadius: "rounded-xl",
4910
- border: {
4911
- widthClass: "border",
4912
- colorToken: "primary"
4913
- }
5157
+ border: { widthClass: "border" }
4914
5158
  },
4915
5159
  {
4916
5160
  id: "ghost",
4917
5161
  name: "Ghost",
4918
5162
  enabled: true,
4919
5163
  priority: 3,
4920
- background: { type: "transparent" },
4921
- textColorToken: "primary",
5164
+ background: {
5165
+ type: "surface",
5166
+ role: "link"
5167
+ },
4922
5168
  borderRadius: "rounded-xl"
4923
5169
  }
4924
5170
  ]
@@ -4982,7 +5228,6 @@ const showtimePill = defineButtonPersonality({
4982
5228
  type: "solid",
4983
5229
  colorToken: "primary"
4984
5230
  },
4985
- textColorToken: "background",
4986
5231
  borderRadius: "rounded-full",
4987
5232
  effects: { hover: [{ effectId: "pop" }] }
4988
5233
  },
@@ -4991,13 +5236,12 @@ const showtimePill = defineButtonPersonality({
4991
5236
  name: "Secondary",
4992
5237
  enabled: true,
4993
5238
  priority: 2,
4994
- background: { type: "transparent" },
4995
- textColorToken: "primary",
4996
- borderRadius: "rounded-full",
4997
- border: {
4998
- widthClass: "border-2",
4999
- colorToken: "primary"
5239
+ background: {
5240
+ type: "surface",
5241
+ role: "link"
5000
5242
  },
5243
+ borderRadius: "rounded-full",
5244
+ border: { widthClass: "border-2" },
5001
5245
  effects: { hover: [{ effectId: "pop" }] }
5002
5246
  },
5003
5247
  {
@@ -5009,7 +5253,6 @@ const showtimePill = defineButtonPersonality({
5009
5253
  type: "solid",
5010
5254
  colorToken: "secondary"
5011
5255
  },
5012
- textColorToken: "primary",
5013
5256
  borderRadius: "rounded-full",
5014
5257
  effects: { hover: [{ effectId: "pop" }] }
5015
5258
  },
@@ -5022,12 +5265,8 @@ const showtimePill = defineButtonPersonality({
5022
5265
  type: "solid",
5023
5266
  colorToken: "background"
5024
5267
  },
5025
- textColorToken: "primary",
5026
5268
  borderRadius: "rounded-full",
5027
- border: {
5028
- widthClass: "border-2",
5029
- colorToken: "primary"
5030
- },
5269
+ border: { widthClass: "border-2" },
5031
5270
  effects: { hover: [{
5032
5271
  effectId: "background-on-hover",
5033
5272
  options: { colorToken: "surface" }
@@ -5038,13 +5277,12 @@ const showtimePill = defineButtonPersonality({
5038
5277
  name: "Outline",
5039
5278
  enabled: true,
5040
5279
  priority: 3,
5041
- background: { type: "transparent" },
5042
- textColorToken: "primary",
5043
- borderRadius: "rounded-full",
5044
- border: {
5045
- widthClass: "border-2",
5046
- colorToken: "primary"
5280
+ background: {
5281
+ type: "surface",
5282
+ role: "link"
5047
5283
  },
5284
+ borderRadius: "rounded-full",
5285
+ border: { widthClass: "border-2" },
5048
5286
  effects: { hover: [{
5049
5287
  effectId: "background-on-hover",
5050
5288
  options: { colorToken: "background" }
@@ -5055,8 +5293,10 @@ const showtimePill = defineButtonPersonality({
5055
5293
  name: "Ghost",
5056
5294
  enabled: true,
5057
5295
  priority: 3,
5058
- background: { type: "transparent" },
5059
- textColorToken: "primary",
5296
+ background: {
5297
+ type: "surface",
5298
+ role: "link"
5299
+ },
5060
5300
  borderRadius: "rounded-full",
5061
5301
  effects: { hover: [{
5062
5302
  effectId: "background-on-hover",
@@ -5067,104 +5307,151 @@ const showtimePill = defineButtonPersonality({
5067
5307
  }
5068
5308
  });
5069
5309
  //#endregion
5070
- //#region ../theme-core/src/buttons/personalities/index.ts
5071
- const buttonPersonalities = [
5072
- defineButtonPersonality({
5073
- id: "soft-pill",
5074
- name: "Soft Pill",
5075
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5076
- tags: {
5077
- tone: "classic",
5078
- energy: "calm",
5079
- motion: "subtle",
5080
- era: "organic"
5310
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
5311
+ /**
5312
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
5313
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
5314
+ */
5315
+ const softPill = defineButtonPersonality({
5316
+ id: "soft-pill",
5317
+ name: "Soft Pill",
5318
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5319
+ tags: {
5320
+ tone: "classic",
5321
+ energy: "calm",
5322
+ motion: "subtle",
5323
+ era: "organic"
5324
+ },
5325
+ buttonSystem: {
5326
+ global: {
5327
+ cornerStyle: "pill",
5328
+ shadow: "low",
5329
+ textTransform: "none",
5330
+ fontWeight: 500,
5331
+ borderWidth: 2,
5332
+ hoverTransform: "lift",
5333
+ hoverColor: "none"
5081
5334
  },
5082
- buttonSystem: {
5083
- global: {
5084
- cornerStyle: "pill",
5085
- shadow: "low",
5086
- textTransform: "none",
5087
- fontWeight: 500,
5088
- borderWidth: 2,
5089
- hoverTransform: "lift",
5090
- hoverColor: "none"
5335
+ variants: [
5336
+ {
5337
+ id: "primary",
5338
+ name: "Primary",
5339
+ enabled: true,
5340
+ priority: 1,
5341
+ background: {
5342
+ type: "solid",
5343
+ colorToken: "primary"
5344
+ },
5345
+ borderRadius: "rounded-full",
5346
+ shadow: {
5347
+ elevation: "low",
5348
+ softness: "soft",
5349
+ position: "bottom"
5350
+ },
5351
+ effects: {
5352
+ hover: [{
5353
+ effectId: "lift",
5354
+ options: { translateY: "-1px" }
5355
+ }],
5356
+ active: [{
5357
+ effectId: "scale-down",
5358
+ options: { scale: "0.98" }
5359
+ }]
5360
+ }
5091
5361
  },
5092
- variants: [
5093
- {
5094
- id: "primary",
5095
- name: "Primary",
5096
- enabled: true,
5097
- priority: 1,
5098
- background: {
5099
- type: "solid",
5100
- colorToken: "primary"
5101
- },
5102
- textColorToken: "primaryForeground",
5103
- borderRadius: "rounded-full",
5104
- shadow: {
5105
- elevation: "low",
5106
- softness: "soft",
5107
- position: "bottom"
5108
- },
5109
- effects: {
5110
- hover: [{
5111
- effectId: "lift",
5112
- options: { translateY: "-1px" }
5113
- }],
5114
- active: [{
5115
- effectId: "scale-down",
5116
- options: { scale: "0.98" }
5117
- }]
5118
- }
5362
+ {
5363
+ id: "secondary",
5364
+ name: "Secondary",
5365
+ enabled: true,
5366
+ priority: 2,
5367
+ background: {
5368
+ type: "surface",
5369
+ role: "link"
5119
5370
  },
5120
- {
5121
- id: "secondary",
5122
- name: "Secondary",
5123
- enabled: true,
5124
- priority: 2,
5125
- background: { type: "transparent" },
5126
- textColorToken: "primary",
5127
- borderRadius: "rounded-full",
5128
- border: {
5129
- widthClass: "border-2",
5130
- colorToken: "primary"
5131
- },
5132
- effects: { hover: [{
5133
- effectId: "background-on-hover",
5134
- options: { colorToken: "surface" }
5135
- }] }
5371
+ borderRadius: "rounded-full",
5372
+ border: { widthClass: "border-2" },
5373
+ effects: { hover: [{
5374
+ effectId: "background-on-hover",
5375
+ options: { colorToken: "surface" }
5376
+ }] }
5377
+ },
5378
+ {
5379
+ id: "outline",
5380
+ name: "Outline",
5381
+ enabled: true,
5382
+ priority: 3,
5383
+ background: {
5384
+ type: "surface",
5385
+ role: "link"
5136
5386
  },
5137
- {
5138
- id: "outline",
5139
- name: "Outline",
5140
- enabled: true,
5141
- priority: 3,
5142
- background: { type: "transparent" },
5143
- textColorToken: "text",
5144
- borderRadius: "rounded-full",
5145
- border: {
5146
- widthClass: "border",
5147
- colorToken: "border"
5148
- },
5149
- effects: { hover: [{
5150
- effectId: "background-on-hover",
5151
- options: { colorToken: "surface" }
5152
- }] }
5387
+ borderRadius: "rounded-full",
5388
+ border: { widthClass: "border" },
5389
+ effects: { hover: [{
5390
+ effectId: "background-on-hover",
5391
+ options: { colorToken: "surface" }
5392
+ }] }
5393
+ },
5394
+ {
5395
+ id: "ghost",
5396
+ name: "Ghost",
5397
+ enabled: true,
5398
+ priority: 3,
5399
+ background: {
5400
+ type: "surface",
5401
+ role: "link"
5153
5402
  },
5154
- {
5155
- id: "ghost",
5156
- name: "Ghost",
5157
- enabled: true,
5158
- priority: 3,
5159
- background: { type: "transparent" },
5160
- textColorToken: "text",
5161
- borderRadius: "rounded-full",
5162
- effects: { hover: [{
5163
- effectId: "background-on-hover",
5164
- options: { colorToken: "surface" }
5165
- }] }
5166
- }
5167
- ]
5403
+ borderRadius: "rounded-full",
5404
+ effects: { hover: [{
5405
+ effectId: "background-on-hover",
5406
+ options: { colorToken: "surface" }
5407
+ }] }
5408
+ }
5409
+ ]
5410
+ }
5411
+ });
5412
+ //#endregion
5413
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
5414
+ const solidSecondary = {
5415
+ id: "secondary",
5416
+ name: "Secondary",
5417
+ enabled: true,
5418
+ priority: 2,
5419
+ background: {
5420
+ type: "solid",
5421
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
5422
+ },
5423
+ borderRadius: "rounded-full",
5424
+ shadow: {
5425
+ elevation: "none",
5426
+ softness: null,
5427
+ position: "bottom"
5428
+ },
5429
+ effects: {
5430
+ hover: [{
5431
+ effectId: "background-on-hover-alpha",
5432
+ options: {
5433
+ colorToken: "secondary",
5434
+ opacity: 88
5435
+ }
5436
+ }],
5437
+ active: [{
5438
+ effectId: "scale-down",
5439
+ options: { scale: "0.98" }
5440
+ }]
5441
+ }
5442
+ };
5443
+ //#endregion
5444
+ //#region ../theme-core/src/buttons/personalities/index.ts
5445
+ const buttonPersonalities = [
5446
+ softPill,
5447
+ defineButtonPersonality({
5448
+ id: "two-tone-pill",
5449
+ name: "Two-tone Pill",
5450
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
5451
+ tags: softPill.tags,
5452
+ buttonSystem: {
5453
+ ...softPill.buttonSystem,
5454
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
5168
5455
  }
5169
5456
  }),
5170
5457
  earthPill,
@@ -5180,6 +5467,27 @@ const buttonPersonalities = [
5180
5467
  quietArrow
5181
5468
  ];
5182
5469
  new Map(buttonPersonalities.map((p) => [p.id, p]));
5470
+ buttonPersonalities.map((personality) => ({
5471
+ id: personality.id,
5472
+ name: personality.name,
5473
+ description: personality.description,
5474
+ category: presetCategory(personality),
5475
+ buttonSystem: personality.buttonSystem,
5476
+ compatibility: {
5477
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
5478
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
5479
+ }
5480
+ }));
5481
+ function presetCategory(personality) {
5482
+ switch (personality.tags.era) {
5483
+ case "retro": return "retro";
5484
+ case "editorial": return "minimal";
5485
+ case "organic": return "artistic";
5486
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
5487
+ case "technical": return "technical";
5488
+ case void 0: return "modern";
5489
+ }
5490
+ }
5183
5491
  //#endregion
5184
5492
  //#region ../theme-core/src/cards/types.ts
5185
5493
  const cardVariantRoleValues = ["default", "alternative"];
@@ -6698,6 +7006,7 @@ const navFontWeight = z$1.enum([
6698
7006
  "bold"
6699
7007
  ]);
6700
7008
  const headerMaxWidth = z$1.enum(["container", "full"]);
7009
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6701
7010
  const headerContainerSchema = z$1.object({
6702
7011
  rounded: z$1.enum([
6703
7012
  "none",
@@ -6842,6 +7151,7 @@ const headerSchema = z$1.object({
6842
7151
  positioning: headerPositioning,
6843
7152
  shrinkOnScroll: z$1.boolean(),
6844
7153
  maxWidth: headerMaxWidth,
7154
+ barFrame: headerBarFrame.optional(),
6845
7155
  logoOverride: mediaSchema$1.nullable().optional(),
6846
7156
  background: headerBackgroundSchema.default({
6847
7157
  type: "color",
@@ -6851,6 +7161,7 @@ const headerSchema = z$1.object({
6851
7161
  navStyle: headerNavStyle,
6852
7162
  navColor: themeColorTokenSchema.nullable().optional(),
6853
7163
  navWeight: navFontWeight.default("medium"),
7164
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6854
7165
  navTypography: z$1.enum(["body", "heading"]).optional(),
6855
7166
  navTextSize: navLinkStyleSchema.shape.textSize,
6856
7167
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6866,7 +7177,21 @@ const headerSchema = z$1.object({
6866
7177
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6867
7178
  ctaVariant: z$1.string().min(1).optional(),
6868
7179
  dropdownStyle: dropdownStyleSchema
6869
- });
7180
+ }).transform(normaliseHeaderNavFontRole);
7181
+ /**
7182
+ * Normalises the legacy `navTypography` font-role alias into the canonical
7183
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
7184
+ * a data migration. `navFontRole` always wins when both are present; the legacy
7185
+ * field is dropped so we never carry a dual write forward.
7186
+ */
7187
+ function normaliseHeaderNavFontRole(header) {
7188
+ if (header.navTypography === void 0) return header;
7189
+ const { navTypography, ...rest } = header;
7190
+ return header.navFontRole === void 0 ? {
7191
+ ...rest,
7192
+ navFontRole: navTypography
7193
+ } : rest;
7194
+ }
6870
7195
  const footerVariant = z$1.enum([
6871
7196
  "simple",
6872
7197
  "columns",
@@ -8538,6 +8863,241 @@ const originalJoyCardSystem = { variants: [{
8538
8863
  const serifDisplayQuote = { style: "serif-display" };
8539
8864
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8540
8865
  const accentGlyphQuote = { style: "accent-glyph" };
8866
+ /**
8867
+ * Curated library of gradient presets.
8868
+ * All gradients use theme color tokens, so they adapt to the site's palette.
8869
+ */
8870
+ const GRADIENT_PRESETS = [
8871
+ {
8872
+ id: "primary-secondary",
8873
+ name: "Primary to Secondary",
8874
+ description: "Blend your primary and secondary brand colors",
8875
+ type: "linear",
8876
+ angle: 135,
8877
+ stops: [{
8878
+ color: "primary-500",
8879
+ position: 0
8880
+ }, {
8881
+ color: "secondary-500",
8882
+ position: 100
8883
+ }]
8884
+ },
8885
+ {
8886
+ id: "primary-accent",
8887
+ name: "Primary to Accent",
8888
+ description: "Energetic gradient from primary to accent",
8889
+ type: "linear",
8890
+ angle: 135,
8891
+ stops: [{
8892
+ color: "primary-500",
8893
+ position: 0
8894
+ }, {
8895
+ color: "accent-500",
8896
+ position: 100
8897
+ }]
8898
+ },
8899
+ {
8900
+ id: "secondary-accent",
8901
+ name: "Secondary to Accent",
8902
+ description: "Vibrant secondary to accent blend",
8903
+ type: "linear",
8904
+ angle: 135,
8905
+ stops: [{
8906
+ color: "secondary-500",
8907
+ position: 0
8908
+ }, {
8909
+ color: "accent-500",
8910
+ position: 100
8911
+ }]
8912
+ },
8913
+ {
8914
+ id: "primary-light-dark",
8915
+ name: "Primary Light to Dark",
8916
+ description: "Subtle primary color fade",
8917
+ type: "linear",
8918
+ angle: 180,
8919
+ stops: [{
8920
+ color: "primary-500",
8921
+ position: 0
8922
+ }, {
8923
+ color: "primary-900",
8924
+ position: 100
8925
+ }]
8926
+ },
8927
+ {
8928
+ id: "primary-dark-light",
8929
+ name: "Primary Dark to Light",
8930
+ description: "Reverse primary fade",
8931
+ type: "linear",
8932
+ angle: 180,
8933
+ stops: [{
8934
+ color: "primary-900",
8935
+ position: 0
8936
+ }, {
8937
+ color: "primary-50",
8938
+ position: 100
8939
+ }]
8940
+ },
8941
+ {
8942
+ id: "secondary-light-dark",
8943
+ name: "Secondary Light to Dark",
8944
+ description: "Subtle secondary color fade",
8945
+ type: "linear",
8946
+ angle: 180,
8947
+ stops: [{
8948
+ color: "secondary-500",
8949
+ position: 0
8950
+ }, {
8951
+ color: "secondary-900",
8952
+ position: 100
8953
+ }]
8954
+ },
8955
+ {
8956
+ id: "accent-light-dark",
8957
+ name: "Accent Light to Dark",
8958
+ description: "Accent color depth fade",
8959
+ type: "linear",
8960
+ angle: 180,
8961
+ stops: [{
8962
+ color: "accent-500",
8963
+ position: 0
8964
+ }, {
8965
+ color: "accent-900",
8966
+ position: 100
8967
+ }]
8968
+ },
8969
+ {
8970
+ id: "background-surface",
8971
+ name: "Background to Surface",
8972
+ description: "Subtle depth using base colors",
8973
+ type: "linear",
8974
+ angle: 180,
8975
+ stops: [{
8976
+ color: "background",
8977
+ position: 0
8978
+ }, {
8979
+ color: "surface",
8980
+ position: 100
8981
+ }]
8982
+ },
8983
+ {
8984
+ id: "neutral-fade",
8985
+ name: "Neutral Gradient",
8986
+ description: "Elegant neutral color fade",
8987
+ type: "linear",
8988
+ angle: 180,
8989
+ stops: [{
8990
+ color: "neutral-900",
8991
+ position: 0
8992
+ }, {
8993
+ color: "neutral-50",
8994
+ position: 100
8995
+ }]
8996
+ },
8997
+ {
8998
+ id: "primary-glow",
8999
+ name: "Primary glow",
9000
+ description: "A soft top-centred glow using your primary palette",
9001
+ type: "radial",
9002
+ shape: "ellipse",
9003
+ position: "top center",
9004
+ stops: [{
9005
+ color: "primary-900",
9006
+ position: 0
9007
+ }, {
9008
+ color: "primary-950",
9009
+ position: 100
9010
+ }],
9011
+ foreground: {
9012
+ textColor: "onPrimary900",
9013
+ headingColor: "onPrimary900",
9014
+ linkColor: "onPrimary900",
9015
+ supportingColor: "onPrimary900"
9016
+ }
9017
+ },
9018
+ {
9019
+ id: "accent-glow",
9020
+ name: "Accent glow",
9021
+ description: "A soft top-centred glow using your accent palette",
9022
+ type: "radial",
9023
+ shape: "ellipse",
9024
+ position: "top center",
9025
+ stops: [{
9026
+ color: "accent-900",
9027
+ position: 0
9028
+ }, {
9029
+ color: "accent-950",
9030
+ position: 100
9031
+ }],
9032
+ foreground: {
9033
+ textColor: "onAccent900",
9034
+ headingColor: "onAccent900",
9035
+ linkColor: "onAccent900",
9036
+ supportingColor: "onAccent900"
9037
+ }
9038
+ },
9039
+ {
9040
+ id: "primary-secondary-accent",
9041
+ name: "Brand Trio",
9042
+ description: "All three brand colors in harmony",
9043
+ type: "linear",
9044
+ angle: 135,
9045
+ stops: [
9046
+ {
9047
+ color: "primary-500",
9048
+ position: 0
9049
+ },
9050
+ {
9051
+ color: "secondary-500",
9052
+ position: 50
9053
+ },
9054
+ {
9055
+ color: "accent-500",
9056
+ position: 100
9057
+ }
9058
+ ]
9059
+ }
9060
+ ].map((preset) => ({
9061
+ ...preset,
9062
+ id: preset.id,
9063
+ stops: preset.stops
9064
+ }));
9065
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
9066
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
9067
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
9068
+ function parseGradientPresetId(value) {
9069
+ if (typeof value !== "string") return null;
9070
+ const normalized = value.trim();
9071
+ if (!gradientPresetIdSet.has(normalized)) return null;
9072
+ return normalized;
9073
+ }
9074
+ function getGradientPreset(id) {
9075
+ return gradientPresetById[id];
9076
+ }
9077
+ //#endregion
9078
+ //#region ../theme-core/src/gradients/utils.ts
9079
+ /**
9080
+ * Convert a GradientConfig to a CSS gradient string
9081
+ *
9082
+ * @param config - The gradient configuration using theme tokens
9083
+ * @param tokens - Map of theme color tokens to hex values
9084
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
9085
+ */
9086
+ function gradientToCss(config, tokens) {
9087
+ const stops = config.stops.map((stop) => {
9088
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
9089
+ }).join(", ");
9090
+ const type = config.type ?? "linear";
9091
+ if (type === "radial") {
9092
+ const position = config.position ?? "center";
9093
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
9094
+ }
9095
+ if (type === "conic") {
9096
+ const position = config.position ?? "center";
9097
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
9098
+ }
9099
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
9100
+ }
8541
9101
  //#endregion
8542
9102
  //#region ../theme-core/src/site-styles/headerLooks.ts
8543
9103
  function asHeaderLookId(value) {
@@ -8672,7 +9232,7 @@ const overlayLogoAccommodations = [
8672
9232
  * optional nested styling fields that would otherwise leak from another Look.
8673
9233
  */
8674
9234
  function baseHeader(theme) {
8675
- 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;
9235
+ 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;
8676
9236
  return {
8677
9237
  ...header,
8678
9238
  navContainer: {
@@ -8821,6 +9381,17 @@ const headerStyleCatalog = defineExactCatalog()([
8821
9381
  navTypography: "brand-caps",
8822
9382
  moods: ["expressive"]
8823
9383
  },
9384
+ {
9385
+ id: asHeaderStyleId("brand-capsule"),
9386
+ label: "Brand Capsule",
9387
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
9388
+ supportedLayoutIds: supportedLayouts(["classic"]),
9389
+ navInteraction: "pill-background",
9390
+ surface: "brand-solid",
9391
+ defaultDepth: "shadow",
9392
+ navTypography: "quiet-caps",
9393
+ moods: ["expressive", "professional"]
9394
+ },
8824
9395
  {
8825
9396
  id: asHeaderStyleId("serif-line"),
8826
9397
  label: "Serif Line",
@@ -8914,6 +9485,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8914
9485
  "brand-bar",
8915
9486
  "brand-underline",
8916
9487
  "brand-pill",
9488
+ "brand-capsule",
8917
9489
  "serif-line",
8918
9490
  "flat-tabs"
8919
9491
  ])],
@@ -8951,6 +9523,11 @@ headerStyleRepairChain([
8951
9523
  "brand-pill",
8952
9524
  "brand-bar",
8953
9525
  "minimal"
9526
+ ]), headerStyleRepairChain([
9527
+ "brand-capsule",
9528
+ "brand-pill",
9529
+ "brand-bar",
9530
+ "minimal"
8954
9531
  ]), headerStyleRepairChain([
8955
9532
  "pill-nav",
8956
9533
  "soft-bar",
@@ -10564,6 +11141,19 @@ z$1.object({
10564
11141
  }).strict();
10565
11142
  //#endregion
10566
11143
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
11144
+ function defineSectionForegroundRuntimeTokens(input) {
11145
+ return {
11146
+ textColor: requireThemeColorToken(input.textColor),
11147
+ headingColor: requireThemeColorToken(input.headingColor),
11148
+ linkColor: requireThemeColorToken(input.linkColor),
11149
+ supportingColor: requireThemeColorToken(input.supportingColor)
11150
+ };
11151
+ }
11152
+ function requireThemeColorToken(value) {
11153
+ const token = parseThemeColorToken(value);
11154
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
11155
+ return token;
11156
+ }
10567
11157
  function defineDesignRuntimeRules(rules) {
10568
11158
  return rules;
10569
11159
  }
@@ -10834,24 +11424,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10834
11424
  type: "color",
10835
11425
  color: "muted"
10836
11426
  },
10837
- foreground: {
11427
+ foreground: defineSectionForegroundRuntimeTokens({
10838
11428
  textColor: "text",
10839
11429
  headingColor: "primary",
10840
11430
  linkColor: "primary",
10841
11431
  supportingColor: "text"
10842
- }
11432
+ })
10843
11433
  },
10844
11434
  "brand-depth-band": {
10845
11435
  background: {
10846
11436
  type: "color",
10847
11437
  color: "primary-800"
10848
11438
  },
10849
- foreground: {
11439
+ foreground: defineSectionForegroundRuntimeTokens({
10850
11440
  textColor: "text",
10851
11441
  headingColor: "primary",
10852
11442
  linkColor: "primary",
10853
11443
  supportingColor: "text"
10854
- }
11444
+ })
10855
11445
  },
10856
11446
  "hero-image": {
10857
11447
  background: {
@@ -10859,12 +11449,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10859
11449
  opacity: 1,
10860
11450
  position: "center center"
10861
11451
  },
10862
- foreground: {
11452
+ foreground: defineSectionForegroundRuntimeTokens({
10863
11453
  textColor: "text",
10864
11454
  headingColor: "primary",
10865
11455
  linkColor: "primary",
10866
11456
  supportingColor: "text"
10867
- }
11457
+ })
11458
+ }
11459
+ }
11460
+ });
11461
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
11462
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
11463
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
11464
+ ...defaultDesignRuntimeRules,
11465
+ sectionSurfaces: {
11466
+ ...defaultDesignRuntimeRules.sectionSurfaces,
11467
+ "accent-band": {
11468
+ background: {
11469
+ type: "gradient",
11470
+ gradientPresetId: primaryGlowGradientPresetId
11471
+ },
11472
+ foreground: defineSectionForegroundRuntimeTokens({
11473
+ textColor: "primaryForeground",
11474
+ headingColor: "primaryForeground",
11475
+ linkColor: "primaryForeground",
11476
+ supportingColor: "primaryForeground"
11477
+ })
10868
11478
  }
10869
11479
  }
10870
11480
  });
@@ -11188,6 +11798,7 @@ const curatedSiteStyles = [
11188
11798
  ],
11189
11799
  buttonPersonalityChoices: [
11190
11800
  buttonChoice("soft-pill"),
11801
+ buttonChoice("two-tone-pill"),
11191
11802
  buttonChoice("pebble"),
11192
11803
  buttonChoice("editorial-link"),
11193
11804
  buttonChoice("brushed-wash")
@@ -12251,6 +12862,8 @@ const curatedSiteStyles = [
12251
12862
  },
12252
12863
  compositionBudget: quietBudget,
12253
12864
  typography: fulcrumTypography,
12865
+ designRuntimeRules: fulcrumDesignRuntimeRules,
12866
+ recommendedAppearancePresetIds: ["cta-accent-band"],
12254
12867
  themeOverrides: {
12255
12868
  shadow: { colorToken: "primary" },
12256
12869
  accordions: {
@@ -12367,6 +12980,7 @@ const curatedSiteStyles = [
12367
12980
  ],
12368
12981
  buttonPersonalityChoices: [
12369
12982
  buttonChoice("quiet-arrow"),
12983
+ buttonChoice("two-tone-pill"),
12370
12984
  buttonChoice("flat-ink"),
12371
12985
  buttonChoice("editorial-link")
12372
12986
  ],
@@ -12622,213 +13236,6 @@ z$1.object({
12622
13236
  spacing: z$1.enum(themeTokenRecipeOptions.spacing),
12623
13237
  motion: z$1.enum(themeTokenRecipeOptions.motion)
12624
13238
  });
12625
- //#endregion
12626
- //#region ../theme-core/src/gradients/presets.ts
12627
- /**
12628
- * Curated library of gradient presets
12629
- * All gradients use theme color tokens, so they adapt to the site's palette
12630
- */
12631
- const GRADIENT_PRESETS = [
12632
- {
12633
- id: "primary-secondary",
12634
- name: "Primary to Secondary",
12635
- description: "Blend your primary and secondary brand colors",
12636
- type: "linear",
12637
- angle: 135,
12638
- stops: [{
12639
- color: "primary-500",
12640
- position: 0
12641
- }, {
12642
- color: "secondary-500",
12643
- position: 100
12644
- }]
12645
- },
12646
- {
12647
- id: "primary-accent",
12648
- name: "Primary to Accent",
12649
- description: "Energetic gradient from primary to accent",
12650
- type: "linear",
12651
- angle: 135,
12652
- stops: [{
12653
- color: "primary-500",
12654
- position: 0
12655
- }, {
12656
- color: "accent-500",
12657
- position: 100
12658
- }]
12659
- },
12660
- {
12661
- id: "secondary-accent",
12662
- name: "Secondary to Accent",
12663
- description: "Vibrant secondary to accent blend",
12664
- type: "linear",
12665
- angle: 135,
12666
- stops: [{
12667
- color: "secondary-500",
12668
- position: 0
12669
- }, {
12670
- color: "accent-500",
12671
- position: 100
12672
- }]
12673
- },
12674
- {
12675
- id: "primary-light-dark",
12676
- name: "Primary Light to Dark",
12677
- description: "Subtle primary color fade",
12678
- type: "linear",
12679
- angle: 180,
12680
- stops: [{
12681
- color: "primary-500",
12682
- position: 0
12683
- }, {
12684
- color: "primary-900",
12685
- position: 100
12686
- }]
12687
- },
12688
- {
12689
- id: "primary-dark-light",
12690
- name: "Primary Dark to Light",
12691
- description: "Reverse primary fade",
12692
- type: "linear",
12693
- angle: 180,
12694
- stops: [{
12695
- color: "primary-900",
12696
- position: 0
12697
- }, {
12698
- color: "primary-50",
12699
- position: 100
12700
- }]
12701
- },
12702
- {
12703
- id: "secondary-light-dark",
12704
- name: "Secondary Light to Dark",
12705
- description: "Subtle secondary color fade",
12706
- type: "linear",
12707
- angle: 180,
12708
- stops: [{
12709
- color: "secondary-500",
12710
- position: 0
12711
- }, {
12712
- color: "secondary-900",
12713
- position: 100
12714
- }]
12715
- },
12716
- {
12717
- id: "accent-light-dark",
12718
- name: "Accent Light to Dark",
12719
- description: "Accent color depth fade",
12720
- type: "linear",
12721
- angle: 180,
12722
- stops: [{
12723
- color: "accent-500",
12724
- position: 0
12725
- }, {
12726
- color: "accent-900",
12727
- position: 100
12728
- }]
12729
- },
12730
- {
12731
- id: "background-surface",
12732
- name: "Background to Surface",
12733
- description: "Subtle depth using base colors",
12734
- type: "linear",
12735
- angle: 180,
12736
- stops: [{
12737
- color: "background",
12738
- position: 0
12739
- }, {
12740
- color: "surface",
12741
- position: 100
12742
- }]
12743
- },
12744
- {
12745
- id: "neutral-fade",
12746
- name: "Neutral Gradient",
12747
- description: "Elegant neutral color fade",
12748
- type: "linear",
12749
- angle: 180,
12750
- stops: [{
12751
- color: "neutral-900",
12752
- position: 0
12753
- }, {
12754
- color: "neutral-50",
12755
- position: 100
12756
- }]
12757
- },
12758
- {
12759
- id: "primary-radial",
12760
- name: "Primary Spotlight",
12761
- description: "Radial primary gradient from center",
12762
- type: "radial",
12763
- position: "center",
12764
- stops: [{
12765
- color: "primary-500",
12766
- position: 0
12767
- }, {
12768
- color: "primary-900",
12769
- position: 100
12770
- }]
12771
- },
12772
- {
12773
- id: "accent-radial",
12774
- name: "Accent Spotlight",
12775
- description: "Radial accent gradient from center",
12776
- type: "radial",
12777
- position: "center",
12778
- stops: [{
12779
- color: "accent-500",
12780
- position: 0
12781
- }, {
12782
- color: "accent-900",
12783
- position: 100
12784
- }]
12785
- },
12786
- {
12787
- id: "primary-secondary-accent",
12788
- name: "Brand Trio",
12789
- description: "All three brand colors in harmony",
12790
- type: "linear",
12791
- angle: 135,
12792
- stops: [
12793
- {
12794
- color: "primary-500",
12795
- position: 0
12796
- },
12797
- {
12798
- color: "secondary-500",
12799
- position: 50
12800
- },
12801
- {
12802
- color: "accent-500",
12803
- position: 100
12804
- }
12805
- ]
12806
- }
12807
- ];
12808
- //#endregion
12809
- //#region ../theme-core/src/gradients/utils.ts
12810
- /**
12811
- * Convert a GradientConfig to a CSS gradient string
12812
- *
12813
- * @param config - The gradient configuration using theme tokens
12814
- * @param tokens - Map of theme color tokens to hex values
12815
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
12816
- */
12817
- function gradientToCss(config, tokens) {
12818
- const stops = config.stops.map((stop) => {
12819
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
12820
- }).join(", ");
12821
- const type = config.type ?? "linear";
12822
- if (type === "radial") {
12823
- const position = config.position ?? "center";
12824
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
12825
- }
12826
- if (type === "conic") {
12827
- const position = config.position ?? "center";
12828
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
12829
- }
12830
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
12831
- }
12832
13239
  const BREAKPOINT_LG = 1024;
12833
13240
  const BREAKPOINT_XL = 1280;
12834
13241
  const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
@@ -13254,7 +13661,7 @@ const ALLOWED_TRANSFORM_IDS = [
13254
13661
  "media.fromUrl",
13255
13662
  "background.resolveStyle",
13256
13663
  "background.resolveColorsStyle",
13257
- "background.resolveAllowOverflow",
13664
+ "background.resolveFrameClassName",
13258
13665
  "background.resolveImageStyle",
13259
13666
  "background.resolveImageClassName",
13260
13667
  "background.resolveOverlayStyle",
@@ -13915,6 +14322,20 @@ const blockCategoryEnum = z$1.enum([
13915
14322
  "layout",
13916
14323
  "interactive"
13917
14324
  ]);
14325
+ const blockContentSourceSchema = z$1.object({
14326
+ kind: z$1.enum([
14327
+ "inline",
14328
+ "entries",
14329
+ "mixed"
14330
+ ]),
14331
+ contentType: z$1.string().min(1).optional()
14332
+ }).superRefine((value, ctx) => {
14333
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
14334
+ code: z$1.ZodIssueCode.custom,
14335
+ path: ["contentType"],
14336
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
14337
+ });
14338
+ });
13918
14339
  z$1.object({
13919
14340
  name: z$1.string().min(1),
13920
14341
  version: z$1.string().min(1),
@@ -13945,6 +14366,12 @@ z$1.object({
13945
14366
  }).optional()).optional(),
13946
14367
  category: blockCategoryEnum.optional(),
13947
14368
  contentTypes: z$1.array(z$1.string()).optional(),
14369
+ /**
14370
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
14371
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
14372
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
14373
+ */
14374
+ contentSource: blockContentSourceSchema.optional(),
13948
14375
  tags: z$1.array(z$1.string()).optional(),
13949
14376
  icon: z$1.string().optional()
13950
14377
  });
@@ -14921,6 +15348,7 @@ function devValidate(node) {
14921
15348
  }
14922
15349
  //#endregion
14923
15350
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
15351
+ 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";
14924
15352
  /**
14925
15353
  * Creates background layer nodes for rendering backgrounds from field data.
14926
15354
  *
@@ -14986,6 +15414,34 @@ function backgroundLayer(path, options = {}) {
14986
15414
  ];
14987
15415
  }
14988
15416
  /**
15417
+ * Wrap decorative background layers in their own clipping frame.
15418
+ *
15419
+ * Foreground content remains outside this frame, so editor outlines, focus
15420
+ * rings, and floating controls are never clipped by a visual background.
15421
+ * Backgrounds that explicitly opt into overflow keep that behavior within
15422
+ * the decorative layer rather than changing the content root.
15423
+ */
15424
+ function backgroundFrame(path, options = {}) {
15425
+ const { leadingNodes = [], ...layerOptions } = options;
15426
+ const framedLayerOptions = {
15427
+ ...layerOptions,
15428
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
15429
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
15430
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
15431
+ };
15432
+ return el("div", {
15433
+ className: { $bind: {
15434
+ from: path,
15435
+ transforms: [{
15436
+ id: "background.resolveFrameClassName",
15437
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
15438
+ }],
15439
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
15440
+ } },
15441
+ style: { borderRadius: "inherit" }
15442
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
15443
+ }
15444
+ /**
14989
15445
  * Creates a media node for rendering background image/video media with conditional rendering.
14990
15446
  *
14991
15447
  * This helper creates a media element that:
@@ -15147,8 +15603,8 @@ function sectionContainer(children, opts) {
15147
15603
  * - content
15148
15604
  */
15149
15605
  function styledContainer(config) {
15150
- 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;
15151
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
15606
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
15607
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
15152
15608
  const childrenArray = Array.isArray(children) ? children : [children];
15153
15609
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
15154
15610
  return el(rootType, {
@@ -15171,7 +15627,7 @@ function styledContainer(config) {
15171
15627
  }],
15172
15628
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
15173
15629
  } }
15174
- }, [...backgroundNodes, ...childrenArray]);
15630
+ }, [backgroundNode, ...childrenArray]);
15175
15631
  }
15176
15632
  //#endregion
15177
15633
  //#region ../blocks/src/system/spacing.ts
@@ -15304,7 +15760,7 @@ const DEFAULT_SECTION_SPACING = "medium";
15304
15760
  * - Creating a section wrapper with background theme
15305
15761
  * - Adding background color/gradient/image layers
15306
15762
  * - Binding className to section styles with transform
15307
- * - Binding allowOverflow for background positioning
15763
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
15308
15764
  * - Wrapping content children
15309
15765
  *
15310
15766
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -15340,8 +15796,8 @@ const DEFAULT_SECTION_SPACING = "medium";
15340
15796
  * });
15341
15797
  */
15342
15798
  function styledSection(config) {
15343
- 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;
15344
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
15799
+ 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;
15800
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
15345
15801
  imageClassName,
15346
15802
  fallbackToken: background,
15347
15803
  omitImageLayer: !renderBackgroundImage,
@@ -15364,13 +15820,8 @@ function styledSection(config) {
15364
15820
  fullWidthPath
15365
15821
  }
15366
15822
  }]
15367
- } },
15368
- allowOverflow: allowOverflow ? true : { $bind: {
15369
- from: `${bindFrom}.background`,
15370
- transforms: [{ id: "background.resolveAllowOverflow" }],
15371
- fallback: false
15372
15823
  } }
15373
- }, [...renderedBackgroundNodes, ...childrenArray]);
15824
+ }, [renderedBackgroundNode, ...childrenArray]);
15374
15825
  }
15375
15826
  //#endregion
15376
15827
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -16222,9 +16673,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
16222
16673
  //#endregion
16223
16674
  //#region ../blocks/src/system/node/fragments/styledCard.ts
16224
16675
  function styledCard(children, opts, ...mods) {
16225
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
16226
- 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" });
16227
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
16676
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
16677
+ const defaultBackgroundLayer = el("div", {
16678
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
16679
+ style: { borderRadius: "inherit" }
16680
+ });
16681
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
16228
16682
  const style = {
16229
16683
  ...opts.style ?? {},
16230
16684
  borderColor: { $bind: {
@@ -16251,7 +16705,7 @@ function styledCard(children, opts, ...mods) {
16251
16705
  ...style ? { style } : {}
16252
16706
  }, [
16253
16707
  defaultBackgroundLayer,
16254
- ...backgroundNodes,
16708
+ backgroundNode,
16255
16709
  ...children
16256
16710
  ], ...mods);
16257
16711
  }
@@ -17031,9 +17485,15 @@ function createButtonGroup(options = {}) {
17031
17485
  //#endregion
17032
17486
  //#region ../blocks/src/system/fields/ctas.ts
17033
17487
  function createCtasRepeater(options = {}) {
17034
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
17488
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
17489
+ const fieldId = id;
17490
+ const buttonField = createButtonGroup({
17491
+ showGroupLabel: false,
17492
+ ...button ?? {},
17493
+ flattenInRepeater: true
17494
+ });
17035
17495
  return {
17036
- id,
17496
+ id: fieldId,
17037
17497
  type: "repeater",
17038
17498
  label,
17039
17499
  itemLabel,
@@ -17042,11 +17502,8 @@ function createCtasRepeater(options = {}) {
17042
17502
  maxItems,
17043
17503
  required: false,
17044
17504
  allowConversion: true,
17045
- schema: { fields: [createButtonGroup({
17046
- showGroupLabel: false,
17047
- ...button ?? {},
17048
- flattenInRepeater: true
17049
- })] }
17505
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
17506
+ schema: { fields: [buttonField] }
17050
17507
  };
17051
17508
  }
17052
17509
  //#endregion
@@ -17096,6 +17553,7 @@ const heroCtaRowFragment = defineFragment({
17096
17553
  label: "Calls to action",
17097
17554
  itemLabel: "CTA",
17098
17555
  maxItems: 3,
17556
+ defaultValue: [],
17099
17557
  button: {
17100
17558
  variants: [
17101
17559
  {
@@ -17163,7 +17621,7 @@ const ctaCopyFragment = defineFragment({
17163
17621
  eyebrowPath: "content.eyebrow",
17164
17622
  titlePath: "content.title",
17165
17623
  className: "cta-heading"
17166
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
17624
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
17167
17625
  });
17168
17626
  //#endregion
17169
17627
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -17260,7 +17718,7 @@ function buildTestimonialCard(...mods) {
17260
17718
  }, 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())])], {
17261
17719
  stylesFrom: "content._cardStyles",
17262
17720
  backgroundFrom: "content._cardStyles.background",
17263
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
17721
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
17264
17722
  }, ...mods);
17265
17723
  }
17266
17724
  /**
@@ -17732,39 +18190,6 @@ const formEmbedFragment = defineFragment({
17732
18190
  }
17733
18191
  });
17734
18192
  //#endregion
17735
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
17736
- const footerBottomTextFragment = defineFragment({
17737
- id: "footerBottomText",
17738
- title: "Footer Text",
17739
- description: "Rich text content for the main footer body and optional bottom bar.",
17740
- fields: [{
17741
- id: "bodyText",
17742
- type: "richText",
17743
- label: "Body text",
17744
- description: "Appears in the main footer area.",
17745
- ui: { variant: "limited" }
17746
- }, {
17747
- id: "bottomText",
17748
- type: "richText",
17749
- label: "Bottom bar text",
17750
- description: "Appears in the optional footer bottom bar.",
17751
- ui: { variant: "limited" }
17752
- }],
17753
- layout: [richText({
17754
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17755
- style: textColorStyle("text/80")
17756
- }, when("bodyText"), bind("bodyText", { transforms: [{
17757
- id: "content.interpolateRichTextTokens",
17758
- options: { tokens: ["year", "site_name"] }
17759
- }] })), richText({
17760
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17761
- style: textColorStyle("text/80")
17762
- }, when("bottomText"), bind("bottomText", { transforms: [{
17763
- id: "content.interpolateRichTextTokens",
17764
- options: { tokens: ["year", "site_name"] }
17765
- }] }))]
17766
- });
17767
- //#endregion
17768
18193
  //#region ../blocks/src/system/fragments/library/singleButton.ts
17769
18194
  const singleButtonFragment = defineFragment({
17770
18195
  id: "singleButton",
@@ -17937,7 +18362,7 @@ function createFaqAccordionLayout(options = {}) {
17937
18362
  options: {
17938
18363
  axis: "all",
17939
18364
  includeSpacing: false,
17940
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
18365
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
17941
18366
  }
17942
18367
  }]
17943
18368
  },
@@ -18928,6 +19353,7 @@ function createBlockManifest(config) {
18928
19353
  previewCustomize: config.previewCustomize,
18929
19354
  category: config.category,
18930
19355
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
19356
+ contentSource: config.contentSource,
18931
19357
  tags: config.tags ? [...config.tags] : [],
18932
19358
  icon: config.icon ?? "Box",
18933
19359
  layout,
@@ -19061,7 +19487,6 @@ function splitLayoutWith(children) {
19061
19487
  }
19062
19488
  }),
19063
19489
  renderBackgroundImage: false,
19064
- allowOverflow: true,
19065
19490
  baseClass: ""
19066
19491
  });
19067
19492
  }
@@ -19074,6 +19499,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
19074
19499
  title: "Hero",
19075
19500
  titleSource: "headline",
19076
19501
  category: "layout",
19502
+ contentSource: { kind: "inline" },
19077
19503
  includeContainerStyles: true,
19078
19504
  promotedFields: ["_sectionStyles.background.image"],
19079
19505
  fragments: [
@@ -19347,6 +19773,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
19347
19773
  id: "block.intro",
19348
19774
  title: "Intro",
19349
19775
  category: "layout",
19776
+ contentSource: { kind: "inline" },
19350
19777
  includeContainerStyles: true,
19351
19778
  titleSource: "title",
19352
19779
  previewCustomize: { quickFieldPriority: [
@@ -19532,6 +19959,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
19532
19959
  title: "Body Text",
19533
19960
  titleSource: "heading",
19534
19961
  category: "content",
19962
+ contentSource: { kind: "inline" },
19535
19963
  fragments: [{
19536
19964
  fragment: bodyCopyFragment,
19537
19965
  fieldPriority: 0
@@ -19588,6 +20016,10 @@ const blogPostBlockDefinition = {
19588
20016
  description: "Highlights a single blog post with title, image, and excerpt.",
19589
20017
  category: "blog",
19590
20018
  contentTypes: ["post"],
20019
+ contentSource: {
20020
+ kind: "entries",
20021
+ contentType: "post"
20022
+ },
19591
20023
  tags: [
19592
20024
  "blog",
19593
20025
  "post",
@@ -19689,7 +20121,7 @@ function postCard(children, ...mods) {
19689
20121
  return styledCard(children, {
19690
20122
  stylesFrom: "content._cardStyles",
19691
20123
  backgroundFrom: "content._cardStyles.background",
19692
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
20124
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
19693
20125
  }, ...mods);
19694
20126
  }
19695
20127
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -19725,7 +20157,7 @@ const stackPostCard = styledCard([inline({
19725
20157
  ])])], {
19726
20158
  stylesFrom: "content._cardStyles",
19727
20159
  backgroundFrom: "content._cardStyles.background",
19728
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
20160
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
19729
20161
  }, repeat("data.posts", "post"));
19730
20162
  const emptyState$2 = {
19731
20163
  ...styledCard([text({
@@ -19734,7 +20166,7 @@ const emptyState$2 = {
19734
20166
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
19735
20167
  stylesFrom: "content._cardStyles",
19736
20168
  backgroundFrom: "content._cardStyles.background",
19737
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
20169
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
19738
20170
  }),
19739
20171
  $when: {
19740
20172
  when: { from: "data.posts[0]" },
@@ -19744,7 +20176,7 @@ const emptyState$2 = {
19744
20176
  function blogListingShell(children) {
19745
20177
  return styledSection({
19746
20178
  children: styledContainer({
19747
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
20179
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19748
20180
  children
19749
20181
  }),
19750
20182
  baseClass: ""
@@ -19885,6 +20317,10 @@ const blogListingManifest = createBlockManifest({
19885
20317
  ],
19886
20318
  description: "Display a collection of blog posts in grid or stack layout.",
19887
20319
  contentTypes: ["post"],
20320
+ contentSource: {
20321
+ kind: "entries",
20322
+ contentType: "post"
20323
+ },
19888
20324
  tags: [
19889
20325
  "blog",
19890
20326
  "posts",
@@ -19927,6 +20363,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
19927
20363
  id: "block.cta-full",
19928
20364
  title: "Full-width CTA",
19929
20365
  category: "marketing",
20366
+ contentSource: { kind: "inline" },
19930
20367
  fragments: [{
19931
20368
  fragment: ctaCopyFragment,
19932
20369
  fieldPriority: 0
@@ -19960,6 +20397,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
19960
20397
  id: "block.single-button",
19961
20398
  title: "Single Button",
19962
20399
  category: "marketing",
20400
+ contentSource: { kind: "inline" },
19963
20401
  fragments: [{
19964
20402
  fragment: singleButtonFragment,
19965
20403
  fieldPriority: 0
@@ -20156,7 +20594,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
20156
20594
  const formSurface = styledContainer({
20157
20595
  bindFrom: "_containerStyles",
20158
20596
  constrainWidth: false,
20159
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
20597
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
20160
20598
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
20161
20599
  });
20162
20600
  function createFormLayout(variant) {
@@ -20220,6 +20658,7 @@ const formManifest = createBlockManifest({
20220
20658
  paletteHidden: false
20221
20659
  },
20222
20660
  category: "interactive",
20661
+ contentSource: { kind: "inline" },
20223
20662
  tags: [
20224
20663
  "form",
20225
20664
  "contact",
@@ -20282,6 +20721,7 @@ const contactNewsletterBlockDefinition = {
20282
20721
  titleSource: "contactTitle",
20283
20722
  description: "Two-column newsletter signup and contact form section.",
20284
20723
  category: "interactive",
20724
+ contentSource: { kind: "inline" },
20285
20725
  layout: contactNewsletterLayout,
20286
20726
  defaultVariant: "default",
20287
20727
  variants: { default: contactNewsletterLayout },
@@ -20485,6 +20925,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
20485
20925
  title: "FAQ",
20486
20926
  titleSource: "title",
20487
20927
  category: "content",
20928
+ contentSource: { kind: "inline" },
20488
20929
  includeContainerStyles: true,
20489
20930
  fragments: [{
20490
20931
  fragment: faqHeadingFragment,
@@ -21373,6 +21814,7 @@ const headerRootClassTransform = {
21373
21814
  ];
21374
21815
  const variant = header?.variant;
21375
21816
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
21817
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
21376
21818
  return joinClasses(classes);
21377
21819
  }
21378
21820
  };
@@ -21886,7 +22328,7 @@ function desktopOnlyDisplay(display) {
21886
22328
  }
21887
22329
  //#endregion
21888
22330
  //#region ../blocks/src/system/blocks/site-header.ts
21889
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
22331
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
21890
22332
  ...node,
21891
22333
  $when: {
21892
22334
  when: {
@@ -21914,7 +22356,7 @@ const logoRow = link({
21914
22356
  text({
21915
22357
  as: "strong",
21916
22358
  className: "header-logo-text rb-truncate"
21917
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22359
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21918
22360
  ]);
21919
22361
  const centeredLogoRow = link({
21920
22362
  href: "/",
@@ -21934,7 +22376,7 @@ const centeredLogoRow = link({
21934
22376
  text({
21935
22377
  as: "strong",
21936
22378
  className: "header-logo-text"
21937
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22379
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21938
22380
  ]);
21939
22381
  const createNavRow = (className, align = "end") => navRow({
21940
22382
  className: `${className} header-nav-row`,
@@ -22066,7 +22508,7 @@ const classicLayout = inline({
22066
22508
  logoRow,
22067
22509
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
22068
22510
  headerCta
22069
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
22511
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
22070
22512
  const classicCenteredNavLayout = inline({
22071
22513
  className: bindProp("$root.theme.header.maxWidth", {
22072
22514
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -22077,7 +22519,7 @@ const classicCenteredNavLayout = inline({
22077
22519
  logoRow,
22078
22520
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
22079
22521
  headerCta
22080
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
22522
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
22081
22523
  const centeredLayout = stack({
22082
22524
  gap: "md",
22083
22525
  align: "center",
@@ -22117,6 +22559,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22117
22559
  id: "block.site-header",
22118
22560
  title: "Site Header",
22119
22561
  category: "layout",
22562
+ contentSource: { kind: "inline" },
22120
22563
  additionalFields: [{
22121
22564
  id: "mode",
22122
22565
  type: "select",
@@ -22140,7 +22583,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22140
22583
  transforms: pipe(tx("layout.headerSectionBackground")),
22141
22584
  fallback: "background"
22142
22585
  }),
22143
- allowOverflow: true,
22144
22586
  className: bindProp("$root.theme.header", {
22145
22587
  transforms: pipe(tx("layout.headerRootClass")),
22146
22588
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -22190,218 +22632,155 @@ const footerNavGroupsLayout = stack({
22190
22632
  linkRequired: true,
22191
22633
  target: { $bind: { from: "entry.target" } },
22192
22634
  rel: { $bind: { from: "entry.rel" } }
22193
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
22635
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
22194
22636
  //#endregion
22195
22637
  //#region ../blocks/src/system/blocks/site-footer.ts
22196
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
22197
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
22198
- ...node,
22199
- $when: {
22200
- when: {
22201
- from,
22202
- transforms: [{ id: transformId }]
22203
- },
22204
- equals
22205
- }
22206
- });
22207
- const bottomBarTextLayout = () => {
22208
- const bottomTextNode = footerTextLayout()[1];
22209
- return bottomTextNode ? [bottomTextNode] : [];
22210
- };
22211
- const bodyTextLayout = () => {
22212
- const bodyTextNode = footerTextLayout()[0];
22213
- return bodyTextNode ? [bodyTextNode] : [];
22214
- };
22215
- const businessAddressLayout = () => [text({
22216
- as: "p",
22217
- className: "rb-caption rb-opacity-80"
22218
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
22219
- const inlineBottomTextLayout = () => {
22220
- const bottomTextNode = footerTextLayout()[1];
22221
- if (!bottomTextNode) return [];
22222
- return [when("$root.theme.footer.bottomBar.enabled", {
22223
- equals: true,
22224
- not: true
22225
- })(bottomTextNode)];
22226
- };
22227
- const simpleFooterLayout = stack({
22228
- gap: "md",
22229
- align: "start",
22230
- className: { $bind: {
22231
- from: "$root.theme.footer",
22232
- transforms: [{ id: "layout.footerSimpleRootClass" }],
22233
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
22234
- } }
22235
- }, [
22236
- link({
22237
- href: "/",
22238
- className: { $bind: {
22239
- from: "$root.theme.footer.logo",
22240
- transforms: [{
22241
- id: "layout.footerLogoClass",
22242
- options: { requireExplicitShow: true }
22243
- }],
22244
- fallback: "rb-hidden"
22245
- } }
22246
- }, [
22247
- media({ className: { $bind: {
22248
- from: "$root.theme.footer.logo",
22249
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22250
- fallback: "rb-w-auto"
22251
- } } }, when("content.logo"), bind("content.logo")),
22252
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22253
- from: "$root.theme.footer.logo",
22254
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22255
- fallback: "rb-w-auto"
22256
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22257
- text({
22258
- as: "strong",
22259
- className: "footer-logo-text rb-nav-text"
22260
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22261
- ]),
22262
- footerNav({
22263
- collectionPath: "footerMenu.items",
22264
- mode: "flatten",
22265
- className: { $bind: {
22266
- from: "$root.theme.footer.navLayout",
22267
- transforms: [{ id: "layout.footerSimpleNavClass" }],
22268
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
22269
- } },
22270
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22271
- }),
22272
- ...bodyTextLayout(),
22273
- ...businessAddressLayout(),
22274
- ...inlineBottomTextLayout()
22275
- ], when("$root.theme.footer.variant", { equals: "simple" }));
22276
- const columnsFooterLayout = stack({
22277
- gap: "xl",
22278
- align: "start",
22638
+ const brandLogo = link({
22639
+ href: "/",
22279
22640
  className: { $bind: {
22280
- from: "$root.theme.footer.maxWidth",
22641
+ from: "$root.theme.footer.logo",
22281
22642
  transforms: [{
22282
- id: "layout.maxWidthClass",
22283
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22643
+ id: "layout.footerLogoClass",
22644
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
22284
22645
  }],
22285
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22646
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
22286
22647
  } }
22287
- }, [
22288
- footerNavGroupsLayout,
22289
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
22290
- as: "strong",
22291
- className: "rb-block rb-nav-text",
22292
- style: textColorStyle("text")
22293
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
22294
- collectionPath: "footerMenu.items",
22295
- mode: "links-only",
22296
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
22297
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22298
- })]),
22299
- ...bodyTextLayout(),
22300
- ...businessAddressLayout(),
22301
- ...inlineBottomTextLayout()
22302
- ], when("$root.theme.footer.variant", { equals: "columns" }));
22303
- const splitFooterLayout = stack({
22304
- gap: "xl",
22305
- align: "start",
22648
+ }, [media({ className: { $bind: {
22649
+ from: "$root.theme.footer.logo",
22650
+ transforms: [{
22651
+ id: "layout.footerLogoMediaClass",
22652
+ options: { base: "rb-h-10 rb-w-auto" }
22653
+ }],
22654
+ fallback: "rb-h-10 rb-w-auto"
22655
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
22656
+ as: "strong",
22657
+ className: "footer-logo-text rb-nav-text"
22658
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
22659
+ const navigation = stack({
22660
+ gap: "md",
22661
+ className: "rb-w-full"
22662
+ }, [footerNavGroupsLayout, footerNav({
22663
+ collectionPath: "footerMenu.items",
22664
+ mode: "links-only",
22306
22665
  className: { $bind: {
22307
- from: "$root.theme.footer.maxWidth",
22308
- transforms: [{
22309
- id: "layout.maxWidthClass",
22310
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22311
- }],
22312
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22313
- } }
22666
+ from: "module.navigationClassName",
22667
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
22668
+ } },
22669
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
22670
+ })], when("module.kind", { equals: "navigation" }));
22671
+ const legalNavigation = footerNav({
22672
+ collectionPath: "legalFooterMenu.items",
22673
+ mode: "links-only",
22674
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
22675
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
22676
+ });
22677
+ const address = text({
22678
+ as: "address",
22679
+ className: "rb-not-italic rb-opacity-80"
22680
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
22681
+ const contact = stack({
22682
+ gap: "sm",
22683
+ className: "rb-items-start"
22684
+ }, [link({
22685
+ href: { $bind: { from: "contactLink.href" } },
22686
+ className: "rb-nav-text rb-break-words transition-theme-standard"
22687
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
22688
+ const hours = stack({
22689
+ gap: "sm",
22690
+ className: "rb-w-full"
22691
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
22692
+ as: "span",
22693
+ className: "rb-label"
22694
+ }, bind("hoursDay.weekday")), text({
22695
+ as: "span",
22696
+ className: "rb-caption rb-opacity-80"
22697
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
22698
+ as: "p",
22699
+ className: "rb-caption rb-opacity-70"
22700
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
22701
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
22702
+ href: { $bind: { from: "social.href" } },
22703
+ target: "_blank",
22704
+ rel: "noreferrer noopener",
22705
+ "aria-label": { $bind: { from: "social.label" } },
22706
+ className: "rb-nav-text transition-theme-standard"
22707
+ }, [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" }));
22708
+ const authoredCopy = richText({
22709
+ className: "rb-prose rb-prose-sm rb-max-w-none",
22710
+ style: textColorStyle("text/80")
22711
+ }, when("module.content"), bind("module.content", { transforms: [{
22712
+ id: "content.interpolateRichTextTokens",
22713
+ options: { tokens: ["year", "site_name"] }
22714
+ }] }));
22715
+ const footerGroup = stack({
22716
+ gap: "md",
22717
+ align: "stretch",
22718
+ className: "rb-min-w-0",
22719
+ "data-footer-group": { $bind: { from: "group.kind" } }
22720
+ }, [stack({
22721
+ gap: "md",
22722
+ align: "start",
22723
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
22314
22724
  }, [
22315
- inline({ className: { $bind: {
22316
- from: "$root.theme.footer.logo",
22317
- transforms: [{ id: "layout.footerSplitMainClass" }],
22318
- 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"
22319
- } } }, [stack({}, [footerNav({
22320
- collectionPath: "footerMenu.items",
22321
- mode: "flatten",
22322
- className: { $bind: {
22323
- from: "$root.theme.footer.navLayout",
22324
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
22325
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
22326
- } },
22327
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
22328
- })]), link({
22329
- href: "/",
22330
- className: { $bind: {
22331
- from: "$root.theme.footer.logo",
22332
- transforms: [{ id: "layout.footerLogoClass" }],
22333
- 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"
22334
- } }
22335
- }, [
22336
- media({ className: { $bind: {
22337
- from: "$root.theme.footer.logo",
22338
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22339
- fallback: "rb-w-auto"
22340
- } } }, when("content.logo"), bind("content.logo")),
22341
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22342
- from: "$root.theme.footer.logo",
22343
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22344
- fallback: "rb-w-auto"
22345
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22346
- text({
22347
- as: "strong",
22348
- className: "footer-logo-text rb-nav-text"
22349
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22350
- ])]),
22351
- ...businessAddressLayout(),
22352
- ...inlineBottomTextLayout()
22353
- ], when("$root.theme.footer.variant", { equals: "split" }));
22354
- const footerLayout = section({
22355
- background: "background",
22725
+ text({
22726
+ as: "h2",
22727
+ className: "rb-label",
22728
+ style: textColorStyle("text/70")
22729
+ }, bind("module.heading"), when("module.heading")),
22730
+ brandLogo,
22731
+ navigation,
22732
+ stack({
22733
+ gap: "sm",
22734
+ className: "rb-w-full"
22735
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
22736
+ address,
22737
+ contact,
22738
+ hours,
22739
+ socials,
22740
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
22741
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
22742
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
22743
+ const footerMainRegion = stack({
22744
+ className: { $bind: { from: "region.className" } },
22745
+ "data-footer-region": { $bind: { from: "region.kind" } }
22746
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
22747
+ const footerBottomRegion = stack({ className: { $bind: {
22748
+ from: "$root.theme.footer",
22749
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22750
+ fallback: "rb-w-full"
22751
+ } } }, [stack({
22356
22752
  className: { $bind: {
22357
22753
  from: "$root.theme.footer",
22358
- transforms: [{ id: "layout.footerRootClass" }],
22359
- fallback: "rb-w-full rb-border-t transition-theme"
22754
+ transforms: [{ id: "layout.footerBottomBarClass" }],
22755
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
22360
22756
  } },
22361
22757
  style: { $bind: {
22362
22758
  from: "$root.theme.footer",
22363
- transforms: [{ id: "layout.footerRootStyle" }],
22364
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22365
- } }
22366
- }, [
22367
- simpleFooterLayout,
22368
- columnsFooterLayout,
22369
- splitFooterLayout,
22370
- stack({
22371
- className: { $bind: {
22372
- from: "$root.theme.footer",
22373
- transforms: [{ id: "layout.footerBottomBarClass" }],
22374
- fallback: "rb-w-full rb-border-t rb-py-5"
22375
- } },
22376
- style: { $bind: {
22377
- from: "$root.theme.footer",
22378
- transforms: [{ id: "layout.footerBottomBarStyle" }]
22379
- } }
22380
- }, [stack({ className: { $bind: {
22381
- from: "$root.theme.footer",
22382
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22383
- fallback: "rb-container"
22384
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
22385
- ]);
22759
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
22760
+ } },
22761
+ "data-footer-region": "bottom"
22762
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
22386
22763
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
22387
22764
  id: "block.site-footer",
22388
22765
  title: "Site Footer",
22389
22766
  category: "layout",
22390
- fragments: [{
22391
- fragment: footerBottomTextFragment,
22392
- fieldPriority: 0
22393
- }],
22767
+ contentSource: { kind: "inline" },
22394
22768
  skipSectionStyles: true,
22395
- additionalFields: [{
22396
- id: "showBusinessAddress",
22397
- type: "boolean",
22398
- label: "Add business address to site footer?",
22399
- required: false,
22400
- defaultValue: false,
22401
- ui: { intent: "content" }
22402
- }],
22403
- layout: footerLayout,
22404
- description: "Site-wide footer with navigation links and optional columns.",
22769
+ layout: section({
22770
+ background: "background",
22771
+ className: { $bind: {
22772
+ from: "$root.theme.footer",
22773
+ transforms: [{ id: "layout.footerRootClass" }],
22774
+ fallback: "rb-w-full rb-border-t transition-theme"
22775
+ } },
22776
+ style: { $bind: {
22777
+ from: "$root.theme.footer",
22778
+ transforms: [{ id: "layout.footerRootStyle" }],
22779
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22780
+ } },
22781
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
22782
+ }, [footerMainRegion, footerBottomRegion]),
22783
+ description: "Site-wide composed footer with canonical shared details.",
22405
22784
  styleTokens: { spacing: "md" },
22406
22785
  paletteHidden: true
22407
22786
  }) };
@@ -22535,6 +22914,7 @@ const testimonialsBlockDefinition = {
22535
22914
  id: "block.testimonials",
22536
22915
  title: "Testimonials",
22537
22916
  category: "marketing",
22917
+ contentSource: { kind: "inline" },
22538
22918
  includeContainerStyles: true,
22539
22919
  previewCustomize: { quickFieldPriority: [
22540
22920
  "avatarLayout",
@@ -22693,6 +23073,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
22693
23073
  id: "block.columns",
22694
23074
  title: "Columns",
22695
23075
  category: "layout",
23076
+ contentSource: { kind: "inline" },
22696
23077
  additionalFields: [
22697
23078
  parseFieldDefinition({
22698
23079
  id: "equalHeight",
@@ -22879,7 +23260,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
22879
23260
  id: "boxStyles.all",
22880
23261
  options: {
22881
23262
  axis: "all",
22882
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
23263
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
22883
23264
  }
22884
23265
  }]
22885
23266
  },
@@ -22926,6 +23307,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
22926
23307
  id: "block.collection",
22927
23308
  title: "Collection",
22928
23309
  category: "layout",
23310
+ contentSource: { kind: "inline" },
22929
23311
  additionalFields: [
22930
23312
  parseFieldDefinition({
22931
23313
  id: "layout",
@@ -23162,6 +23544,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
23162
23544
  id: "block.feature-cards",
23163
23545
  title: "Feature Cards",
23164
23546
  category: "layout",
23547
+ contentSource: { kind: "inline" },
23165
23548
  includeContainerStyles: true,
23166
23549
  titleSource: "title",
23167
23550
  additionalFields: [
@@ -23545,6 +23928,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
23545
23928
  id: "block.media-text",
23546
23929
  title: "Media and Text",
23547
23930
  category: "layout",
23931
+ contentSource: { kind: "inline" },
23548
23932
  includeContainerStyles: true,
23549
23933
  titleSource: "title",
23550
23934
  previewCustomize: { quickFieldPriority: [
@@ -23945,6 +24329,7 @@ const appointmentBookingBlockDefinition = {
23945
24329
  paletteHidden: false
23946
24330
  },
23947
24331
  category: "interactive",
24332
+ contentSource: { kind: "inline" },
23948
24333
  tags: [
23949
24334
  "booking",
23950
24335
  "appointment",
@@ -24109,6 +24494,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
24109
24494
  paletteHidden: false
24110
24495
  },
24111
24496
  category: "interactive",
24497
+ contentSource: { kind: "inline" },
24112
24498
  tags: [
24113
24499
  "booking",
24114
24500
  "appointment",
@@ -25673,6 +26059,7 @@ const eventRegistrationBlockDefinition = {
25673
26059
  titleSource: "heading",
25674
26060
  description: "Multi-step event registration form",
25675
26061
  category: "interactive",
26062
+ contentSource: { kind: "inline" },
25676
26063
  tags: [
25677
26064
  "events",
25678
26065
  "registration",
@@ -25779,15 +26166,9 @@ const eventRegistrationBlockDefinition = {
25779
26166
  defaultValue: "Complete Registration",
25780
26167
  maxLength: 40
25781
26168
  },
25782
- {
25783
- id: "buttonVariant",
25784
- type: "select",
25785
- label: "Button style",
26169
+ createButtonVariantField({
25786
26170
  description: "Choose a button style from your theme",
25787
- required: false,
25788
- multiple: false,
25789
- defaultValue: "primary",
25790
- options: [
26171
+ variants: [
25791
26172
  {
25792
26173
  value: "primary",
25793
26174
  label: "Primary"
@@ -25800,9 +26181,8 @@ const eventRegistrationBlockDefinition = {
25800
26181
  value: "outline",
25801
26182
  label: "Outline"
25802
26183
  }
25803
- ],
25804
- ui: { intent: "style" }
25805
- }
26184
+ ]
26185
+ })
25806
26186
  ],
25807
26187
  layout: [styledSection({
25808
26188
  baseClass: "",
@@ -25995,6 +26375,7 @@ const courseRegistrationBlockDefinition = {
25995
26375
  titleSource: "heading",
25996
26376
  description: "Enrollment form for multi-session courses",
25997
26377
  category: "interactive",
26378
+ contentSource: { kind: "inline" },
25998
26379
  tags: [
25999
26380
  "courses",
26000
26381
  "enrollment",
@@ -26108,15 +26489,9 @@ const courseRegistrationBlockDefinition = {
26108
26489
  defaultValue: "Sign up",
26109
26490
  maxLength: 40
26110
26491
  },
26111
- {
26112
- id: "buttonVariant",
26113
- type: "select",
26114
- label: "Button style",
26492
+ createButtonVariantField({
26115
26493
  description: "Choose a button style from your theme",
26116
- required: false,
26117
- multiple: false,
26118
- defaultValue: "primary",
26119
- options: [
26494
+ variants: [
26120
26495
  {
26121
26496
  value: "primary",
26122
26497
  label: "Primary"
@@ -26129,9 +26504,8 @@ const courseRegistrationBlockDefinition = {
26129
26504
  value: "outline",
26130
26505
  label: "Outline"
26131
26506
  }
26132
- ],
26133
- ui: { intent: "style" }
26134
- }
26507
+ ]
26508
+ })
26135
26509
  ],
26136
26510
  layout: [styledSection({
26137
26511
  baseClass: "",
@@ -26211,6 +26585,7 @@ const eventDetailsManifest = createBlockManifest({
26211
26585
  titleSource: "heading",
26212
26586
  description: "Date/time, venue, map, and other dates for an event",
26213
26587
  category: "content",
26588
+ contentSource: { kind: "entries" },
26214
26589
  tags: [
26215
26590
  "events",
26216
26591
  "venue",
@@ -26416,6 +26791,7 @@ const courseDetailsBlockDefinition = {
26416
26791
  titleSource: "heading",
26417
26792
  description: "Schedule, venue, price, and enrollment status for a course",
26418
26793
  category: "content",
26794
+ contentSource: { kind: "entries" },
26419
26795
  tags: [
26420
26796
  "courses",
26421
26797
  "schedule",
@@ -26707,6 +27083,7 @@ const eventSpotlightBlockDefinition = {
26707
27083
  paletteHidden: false
26708
27084
  },
26709
27085
  category: "content",
27086
+ contentSource: { kind: "entries" },
26710
27087
  tags: [
26711
27088
  "events",
26712
27089
  "featured",
@@ -27253,6 +27630,7 @@ const eventListingBlockDefinition = {
27253
27630
  paletteHidden: true
27254
27631
  },
27255
27632
  category: "interactive",
27633
+ contentSource: { kind: "entries" },
27256
27634
  tags: [
27257
27635
  "events",
27258
27636
  "listing",
@@ -28425,6 +28803,7 @@ const eventCalendarBlockDefinition = {
28425
28803
  paletteHidden: false
28426
28804
  },
28427
28805
  category: "interactive",
28806
+ contentSource: { kind: "entries" },
28428
28807
  tags: [
28429
28808
  "events",
28430
28809
  "calendar",
@@ -28598,6 +28977,7 @@ const recurringScheduleBlockDefinition = {
28598
28977
  titleSource: "heading",
28599
28978
  description: "A compact weekly schedule with one row per recurring series.",
28600
28979
  category: "interactive",
28980
+ contentSource: { kind: "entries" },
28601
28981
  icon: "CalendarDays",
28602
28982
  tags: [
28603
28983
  "schedule",
@@ -29015,7 +29395,10 @@ const offeringsPreviewFields = [
29015
29395
  label: "Link"
29016
29396
  }
29017
29397
  ],
29018
- ui: { intent: "display" }
29398
+ ui: {
29399
+ intent: "display",
29400
+ widget: "buttonVariant"
29401
+ }
29019
29402
  },
29020
29403
  {
29021
29404
  id: "buttonText",
@@ -29068,6 +29451,7 @@ const offeringsPreviewManifest = createBlockManifest({
29068
29451
  paletteHidden: false
29069
29452
  },
29070
29453
  category: "content",
29454
+ contentSource: { kind: "mixed" },
29071
29455
  tags: [
29072
29456
  "offerings",
29073
29457
  "events",
@@ -29236,6 +29620,7 @@ const embedManifest = createBlockManifest({
29236
29620
  id: "block.embed",
29237
29621
  title: "Embed Content",
29238
29622
  category: "content",
29623
+ contentSource: { kind: "entries" },
29239
29624
  titleSource: "heading",
29240
29625
  additionalFields: [
29241
29626
  parseFieldDefinition({
@@ -29723,6 +30108,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
29723
30108
  id: "block.image-gallery",
29724
30109
  title: "Image Gallery",
29725
30110
  category: "content",
30111
+ contentSource: { kind: "inline" },
29726
30112
  previewCustomize: { quickFieldPriority: [
29727
30113
  "aspectRatio",
29728
30114
  "slidesToShow",
@@ -30375,6 +30761,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
30375
30761
  id: "block.video-grid",
30376
30762
  title: "Video Grid",
30377
30763
  category: "media",
30764
+ contentSource: { kind: "inline" },
30378
30765
  skipSectionStyles: true,
30379
30766
  additionalFields: parseFieldDefinitions([
30380
30767
  {
@@ -30545,6 +30932,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
30545
30932
  title: "Audio Player",
30546
30933
  titleSource: "title",
30547
30934
  category: "media",
30935
+ contentSource: { kind: "inline" },
30548
30936
  description: "Add a branded audio player for a single track.",
30549
30937
  tags: [
30550
30938
  "audio",
@@ -30656,6 +31044,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
30656
31044
  title: "File Download",
30657
31045
  titleSource: ["title", "file.filename"],
30658
31046
  category: "media",
31047
+ contentSource: { kind: "inline" },
30659
31048
  description: "Add a simple public download link for a document, ZIP, or audio file.",
30660
31049
  tags: [
30661
31050
  "file",
@@ -31600,6 +31989,7 @@ const shopBlockDefinition = {
31600
31989
  paletteHidden: false
31601
31990
  },
31602
31991
  category: "interactive",
31992
+ contentSource: { kind: "entries" },
31603
31993
  tags: [
31604
31994
  "shop",
31605
31995
  "passes",
@@ -31799,6 +32189,7 @@ const productListBlockDefinition = {
31799
32189
  paletteHidden: false
31800
32190
  },
31801
32191
  category: "interactive",
32192
+ contentSource: { kind: "entries" },
31802
32193
  tags: [
31803
32194
  "shop",
31804
32195
  "products",
@@ -31940,6 +32331,7 @@ const productDetailBlockDefinition = {
31940
32331
  paletteHidden: false
31941
32332
  },
31942
32333
  category: "interactive",
32334
+ contentSource: { kind: "entries" },
31943
32335
  tags: [
31944
32336
  "shop",
31945
32337
  "product",
@@ -32056,6 +32448,7 @@ const cartBlockDefinition = {
32056
32448
  paletteHidden: false
32057
32449
  },
32058
32450
  category: "interactive",
32451
+ contentSource: { kind: "inline" },
32059
32452
  tags: [
32060
32453
  "shop",
32061
32454
  "cart",
@@ -32138,6 +32531,7 @@ const checkoutBlockDefinition = {
32138
32531
  paletteHidden: false
32139
32532
  },
32140
32533
  category: "interactive",
32534
+ contentSource: { kind: "inline" },
32141
32535
  tags: [
32142
32536
  "shop",
32143
32537
  "checkout",
@@ -32341,6 +32735,7 @@ const giftingBlockDefinition = {
32341
32735
  paletteHidden: false
32342
32736
  },
32343
32737
  category: "interactive",
32738
+ contentSource: { kind: "entries" },
32344
32739
  tags: [
32345
32740
  "gifting",
32346
32741
  "gift cards",
@@ -32684,6 +33079,7 @@ const newsletterSignupBlockDefinition = {
32684
33079
  titleSource: "title",
32685
33080
  description: "Newsletter subscription form with configurable field presets.",
32686
33081
  category: "interactive",
33082
+ contentSource: { kind: "inline" },
32687
33083
  fragments: [{
32688
33084
  fragment: newsletterCopyFragment,
32689
33085
  fieldPriority: 0
@@ -32865,6 +33261,7 @@ const teamMembersBlockDefinition = {
32865
33261
  id: "block.team-members",
32866
33262
  title: "Team Members",
32867
33263
  category: "content",
33264
+ contentSource: { kind: "mixed" },
32868
33265
  titleSource: "heading",
32869
33266
  additionalFields: [
32870
33267
  parseFieldDefinition({
@@ -33285,6 +33682,7 @@ const locationMapBlockDefinition = {
33285
33682
  titleSource: "heading",
33286
33683
  description: "Show a business location with an interactive map and directions link.",
33287
33684
  category: "content",
33685
+ contentSource: { kind: "inline" },
33288
33686
  tags: [
33289
33687
  "map",
33290
33688
  "location",
@@ -34400,9 +34798,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
34400
34798
  ].filter(Boolean).join(" ");
34401
34799
  }
34402
34800
  function gradientPresetCss(value) {
34403
- if (!isString(value)) return null;
34404
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
34405
- if (!preset) return null;
34801
+ const presetId = parseGradientPresetId(value);
34802
+ if (!presetId) return null;
34803
+ const preset = getGradientPreset(presetId);
34406
34804
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
34407
34805
  }
34408
34806
  const backgroundTransforms = [
@@ -34441,16 +34839,17 @@ const backgroundTransforms = [
34441
34839
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
34442
34840
  },
34443
34841
  {
34444
- id: "background.resolveAllowOverflow",
34842
+ id: "background.resolveFrameClassName",
34445
34843
  kind: "formatter",
34446
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
34447
- run: (value) => {
34448
- if (!value || typeof value !== "object") return false;
34844
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
34845
+ run: (value, options) => {
34846
+ const baseClass = options?.baseClass?.trim() ?? "";
34847
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
34449
34848
  const input = value;
34450
- if (input.overflow === true) return true;
34849
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
34451
34850
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
34452
34851
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
34453
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
34852
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
34454
34853
  }
34455
34854
  },
34456
34855
  {
@@ -35075,6 +35474,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
35075
35474
  "already_refunded",
35076
35475
  "idempotency_amount_mismatch",
35077
35476
  "idempotency_method_mismatch",
35477
+ "idempotency_receipt_mismatch",
35078
35478
  "refund_in_progress"
35079
35479
  ],
35080
35480
  "invalid_amount",
@@ -35087,7 +35487,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
35087
35487
  "payment_intent_not_found",
35088
35488
  "stripe_error",
35089
35489
  "stale_pending_missing_context",
35090
- "non_refundable_deposit_remaining"
35490
+ "non_refundable_deposit_remaining",
35491
+ "deposit_refund_override_required",
35492
+ "refund_revoke_requires_full_line_refund",
35493
+ "payment_receipt_not_found",
35494
+ "payment_receipt_not_refundable",
35495
+ "payment_receipt_attribution_required"
35091
35496
  ];
35092
35497
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
35093
35498
  //#endregion
@@ -35100,7 +35505,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
35100
35505
  "missing_credit_customer",
35101
35506
  "deposit_refund_override_required",
35102
35507
  "refund_revoke_requires_full_line_refund",
35103
- "unified_order_link_required"
35508
+ "unified_order_link_required",
35509
+ "payment_receipt_not_found",
35510
+ "payment_receipt_not_refundable",
35511
+ "payment_receipt_attribution_required"
35104
35512
  ];
35105
35513
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
35106
35514
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
@@ -36074,8 +36482,14 @@ const navigationMenuConfigSchema = z$1.object({
36074
36482
  name: z$1.string().min(1, "Name is required"),
36075
36483
  isPrimary: z$1.boolean().optional(),
36076
36484
  isFooter: z$1.boolean().optional(),
36485
+ footerRole: z$1.enum(["main", "legal-policy"]).nullable().optional(),
36077
36486
  items: z$1.array(navigationItemConfigSchema)
36078
36487
  }).superRefine((menu, ctx) => {
36488
+ if (menu.footerRole !== void 0 && menu.isFooter !== void 0 && menu.isFooter !== (menu.footerRole === "main")) ctx.addIssue({
36489
+ code: "custom",
36490
+ message: "footerRole and isFooter disagree",
36491
+ path: ["footerRole"]
36492
+ });
36079
36493
  const portalStats = collectPortalLinkStats(menu.items);
36080
36494
  if (portalStats.count > 1) ctx.addIssue({
36081
36495
  code: z$1.ZodIssueCode.custom,