@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) {
@@ -210,19 +210,29 @@ function isRecord$9(value) {
210
210
  //#region ../core/src/booking-date-time.ts
211
211
  const DEFAULT_LOCALE = "en-US";
212
212
  const FALLBACK_TIMEZONE = "UTC";
213
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
214
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
215
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
213
216
  function isValidTimeZone(timeZone) {
217
+ const cached = timeZoneValidityCache.get(timeZone);
218
+ if (cached !== void 0) return cached;
219
+ let isValid;
214
220
  try {
215
221
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
216
- return true;
222
+ isValid = true;
217
223
  } catch {
218
- return false;
224
+ isValid = false;
219
225
  }
226
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
227
+ timeZoneValidityCache.set(timeZone, isValid);
228
+ return isValid;
220
229
  }
221
230
  function getSafeTimeZone(timeZone) {
222
231
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
223
232
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
224
233
  }
225
234
  function parseStrictBookingTimeZone(timeZone) {
235
+ if (typeof timeZone !== "string") return null;
226
236
  const normalized = timeZone.trim();
227
237
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
228
238
  return normalized;
@@ -235,10 +245,19 @@ function formatParseError(error) {
235
245
  }
236
246
  }
237
247
  function formatToPartsLookup(date, locale, timeZone, format) {
238
- return new Map(new Intl.DateTimeFormat(locale, {
248
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
249
+ }
250
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
251
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
252
+ const cached = dateTimeFormatterCache.get(key);
253
+ if (cached !== void 0) return cached;
254
+ const formatter = new Intl.DateTimeFormat(locale, {
239
255
  ...format,
240
256
  timeZone
241
- }).formatToParts(date).map((part) => [part.type, part.value]));
257
+ });
258
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
259
+ dateTimeFormatterCache.set(key, formatter);
260
+ return formatter;
242
261
  }
243
262
  function getZonedDateTimeParts(date, timeZone) {
244
263
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -281,23 +300,9 @@ function toUtcIsoDateTimeString(value) {
281
300
  return parsed.value;
282
301
  }
283
302
  function parseScheduledBookingDateTime(input) {
303
+ let startsAt;
284
304
  try {
285
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
286
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
287
- if (timeZone === null) return {
288
- ok: false,
289
- field: "timeZone",
290
- reason: "invalid_time_zone",
291
- value: input.timeZone
292
- };
293
- return {
294
- ok: true,
295
- value: {
296
- startsAt,
297
- timeZone,
298
- locale: input.locale
299
- }
300
- };
305
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
301
306
  } catch {
302
307
  return {
303
308
  ok: false,
@@ -306,6 +311,21 @@ function parseScheduledBookingDateTime(input) {
306
311
  value: input.startsAt
307
312
  };
308
313
  }
314
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
315
+ if (timeZone === null) return {
316
+ ok: false,
317
+ field: "timeZone",
318
+ reason: "invalid_time_zone",
319
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
320
+ };
321
+ return {
322
+ ok: true,
323
+ value: {
324
+ startsAt,
325
+ timeZone,
326
+ locale: input.locale
327
+ }
328
+ };
309
329
  }
310
330
  function toScheduledBookingDateTime(input) {
311
331
  const result = parseScheduledBookingDateTime(input);
@@ -3435,6 +3455,111 @@ const mediaSchema$1 = z.object({
3435
3455
  transform: transformSchema$1.optional()
3436
3456
  });
3437
3457
  //#endregion
3458
+ //#region ../theme-core/src/buttons/effectClassification.ts
3459
+ /**
3460
+ * Exhaustive live policy for every registered effect id.
3461
+ *
3462
+ * The resolver consumes the transition payload directly, so adding an effect
3463
+ * cannot update classification without also defining its runtime behavior.
3464
+ */
3465
+ const BUTTON_EFFECT_POLICIES = {
3466
+ "darken-background": {
3467
+ classification: "colour-transition",
3468
+ transition: {
3469
+ kind: "adjust-shade",
3470
+ direction: "darker"
3471
+ }
3472
+ },
3473
+ "lighten-background": {
3474
+ classification: "colour-transition",
3475
+ transition: {
3476
+ kind: "adjust-shade",
3477
+ direction: "lighter"
3478
+ }
3479
+ },
3480
+ "background-on-hover": {
3481
+ classification: "colour-transition",
3482
+ transition: { kind: "replace-background" }
3483
+ },
3484
+ "background-on-hover-alpha": {
3485
+ classification: "unsupported-colour",
3486
+ reason: "alpha_requires_surface"
3487
+ },
3488
+ "fade-background": {
3489
+ classification: "unsupported-colour",
3490
+ reason: "changes_element_opacity"
3491
+ },
3492
+ "opacity-reduce": {
3493
+ classification: "unsupported-colour",
3494
+ reason: "changes_element_opacity"
3495
+ },
3496
+ "gradient-text": {
3497
+ classification: "unsupported-colour",
3498
+ reason: "changes_foreground"
3499
+ },
3500
+ "text-color-change": {
3501
+ classification: "unsupported-colour",
3502
+ reason: "changes_foreground"
3503
+ },
3504
+ "border-color-change": {
3505
+ classification: "unsupported-colour",
3506
+ reason: "changes_border"
3507
+ },
3508
+ "aurora-glow": {
3509
+ classification: "unsupported-background-overlay",
3510
+ reason: "unresolved_background_overlay"
3511
+ },
3512
+ "cosmic-stardust": {
3513
+ classification: "unsupported-background-overlay",
3514
+ reason: "unresolved_background_overlay"
3515
+ },
3516
+ "gradient-border-fill": {
3517
+ classification: "unsupported-background-overlay",
3518
+ reason: "unresolved_background_overlay"
3519
+ },
3520
+ "animated-gradient-border-fill": {
3521
+ classification: "unsupported-background-overlay",
3522
+ reason: "unresolved_background_overlay"
3523
+ },
3524
+ "nav-underline": {
3525
+ classification: "not-button",
3526
+ reason: "not_button_effect"
3527
+ },
3528
+ "nav-frosted-base": {
3529
+ classification: "not-button",
3530
+ reason: "not_button_effect"
3531
+ },
3532
+ "nav-frosted-hover": {
3533
+ classification: "not-button",
3534
+ reason: "not_button_effect"
3535
+ },
3536
+ "nav-frosted-active": {
3537
+ classification: "not-button",
3538
+ reason: "not_button_effect"
3539
+ },
3540
+ "animated-gradient": { classification: "non-colour" },
3541
+ "border-glow": { classification: "non-colour" },
3542
+ "drop-shadow": { classification: "non-colour" },
3543
+ "inner-shadow": { classification: "non-colour" },
3544
+ "neumorphic-shadow": { classification: "non-colour" },
3545
+ "outer-glow": { classification: "non-colour" },
3546
+ "retro-3d-shadow": { classification: "non-colour" },
3547
+ "scale-up": { classification: "non-colour" },
3548
+ "scale-down": { classification: "non-colour" },
3549
+ lift: { classification: "non-colour" },
3550
+ "press-down": { classification: "non-colour" },
3551
+ pop: { classification: "non-colour" },
3552
+ "border-bottom-grow": { classification: "non-colour" },
3553
+ "sketchy-border": { classification: "non-colour" },
3554
+ "pulse-animation": { classification: "non-colour" }
3555
+ };
3556
+ function getButtonEffectPolicy(effectId) {
3557
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
3558
+ }
3559
+ function classifyButtonEffectId(effectId) {
3560
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
3561
+ }
3562
+ //#endregion
3438
3563
  //#region ../theme-core/src/buttons/types.ts
3439
3564
  /**
3440
3565
  * Standard semantic variant roles a theme exposes.
@@ -3451,6 +3576,20 @@ const VARIANT_ROLES = [
3451
3576
  "tertiary",
3452
3577
  "accent"
3453
3578
  ];
3579
+ function parseOpaqueButtonColourToken(value) {
3580
+ const token = parseThemeColorToken(value);
3581
+ if (token === null) return null;
3582
+ const parts = parseColorTokenParts(token);
3583
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
3584
+ }
3585
+ function unsafeAsOpaqueButtonColourToken(value) {
3586
+ return value;
3587
+ }
3588
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
3589
+ const token = parseOpaqueButtonColourToken(value);
3590
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3591
+ return token;
3592
+ });
3454
3593
  const cornerStyleSchema = z$1.enum([
3455
3594
  "square",
3456
3595
  "rounded",
@@ -3552,7 +3691,7 @@ const buttonSizesSchema = z$1.object({
3552
3691
  lg,
3553
3692
  xl: xl ?? lg
3554
3693
  }));
3555
- const buttonGlobalSettingsSchema = z$1.object({
3694
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
3556
3695
  cornerStyle: cornerStyleSchema,
3557
3696
  cornerRadius: z$1.number().min(0).max(24).optional(),
3558
3697
  /**
@@ -3583,11 +3722,12 @@ const buttonGlobalSettingsSchema = z$1.object({
3583
3722
  paddingPreset: buttonPaddingPresetSchema.optional(),
3584
3723
  hoverTransform: hoverTransformSchema,
3585
3724
  hoverColor: hoverColorSchema,
3586
- hoverColorToken: themeColorTokenSchema.optional(),
3725
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
3587
3726
  gradientStyle: gradientStyleSchema.optional(),
3588
3727
  gradientAngle: z$1.number().min(0).max(360).optional(),
3589
3728
  gradientSharpness: gradientSharpnessSchema.optional()
3590
3729
  });
3730
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
3591
3731
  const gradientDirectionSchema$1 = z$1.enum([
3592
3732
  "to-r",
3593
3733
  "to-l",
@@ -3601,27 +3741,33 @@ const gradientDirectionSchema$1 = z$1.enum([
3601
3741
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
3602
3742
  z$1.object({
3603
3743
  type: z$1.literal("solid"),
3604
- colorToken: themeColorTokenSchema
3744
+ colorToken: opaqueButtonColourTokenSchema
3605
3745
  }),
3606
3746
  z$1.object({
3607
3747
  type: z$1.literal("gradient"),
3608
- stops: z$1.array(themeColorTokenSchema).min(2),
3609
- direction: gradientDirectionSchema$1
3748
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
3749
+ const [first, second, ...rest] = stops;
3750
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
3751
+ return [
3752
+ first,
3753
+ second,
3754
+ ...rest
3755
+ ];
3756
+ }),
3757
+ direction: gradientDirectionSchema$1,
3758
+ foregroundToken: opaqueButtonColourTokenSchema
3610
3759
  }),
3611
- z$1.object({ type: z$1.literal("transparent") })
3760
+ z$1.object({
3761
+ type: z$1.literal("surface"),
3762
+ role: z$1.literal("link")
3763
+ })
3612
3764
  ]);
3613
3765
  const effectApplicationSchema$1 = z$1.object({
3614
3766
  effectId: z$1.string(),
3615
- options: z$1.record(z$1.string(), z$1.any()).optional()
3616
- });
3617
- const buttonBorderSchema = z$1.object({
3618
- widthClass: z$1.string(),
3619
- colorToken: themeColorTokenSchema
3620
- });
3621
- const buttonVariantAffordanceSchema = z$1.object({
3622
- iconId: z$1.string().min(1),
3623
- colorToken: themeColorTokenSchema.optional()
3767
+ options: z$1.record(z$1.string(), z$1.json()).optional()
3624
3768
  });
3769
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
3770
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
3625
3771
  const variantShadowSchema = z$1.object({
3626
3772
  elevation: z$1.enum([
3627
3773
  "none",
@@ -3662,27 +3808,170 @@ const variantSizeOverridesSchema = z$1.object({
3662
3808
  * default (e.g. link-style variants declaring zero horizontal padding at
3663
3809
  * every size).
3664
3810
  */
3665
- const buttonVariantSchema = z$1.object({
3811
+ const canonicalButtonVariantSchema = z$1.object({
3666
3812
  id: z$1.string(),
3667
3813
  name: z$1.string().min(1).max(20),
3668
3814
  enabled: z$1.boolean(),
3669
3815
  priority: prioritySchema,
3670
3816
  background: buttonBackgroundSchema,
3671
- textColorToken: themeColorTokenSchema,
3672
3817
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
3673
3818
  borderRadius: z$1.string().optional(),
3674
3819
  shadow: variantShadowSchema.optional(),
3675
3820
  border: buttonBorderSchema.optional(),
3676
- hoverBackgroundToken: z$1.string().optional(),
3821
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
3677
3822
  effects: variantEffectsSchema.optional(),
3678
3823
  sizes: variantSizeOverridesSchema.optional(),
3679
3824
  affordance: buttonVariantAffordanceSchema.optional()
3680
3825
  });
3826
+ /**
3827
+ * Temporary persisted-theme admission boundary for issue #1206.
3828
+ *
3829
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
3830
+ * `textColorToken`/border colour shape. New source and all downstream code use
3831
+ * only the canonical relationship. Delete this preprocessor after the reviewed
3832
+ * production rewrite reports zero legacy rows.
3833
+ */
3834
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
3681
3835
  const buttonSystemSchema = z$1.object({
3682
3836
  global: buttonGlobalSettingsSchema,
3683
3837
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
3684
3838
  sizes: buttonSizesSchema.optional()
3685
3839
  });
3840
+ function normalizeLegacyButtonVariantInput(input) {
3841
+ if (!isUnknownRecord(input)) return input;
3842
+ const background = input.background;
3843
+ if (!isUnknownRecord(background)) return input;
3844
+ 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;
3845
+ const { textColorToken, ...withoutLegacyText } = input;
3846
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
3847
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
3848
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
3849
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
3850
+ if (background.type === "transparent") return {
3851
+ ...withoutLegacyText,
3852
+ background: {
3853
+ type: "surface",
3854
+ role: "link"
3855
+ },
3856
+ border: normalizedBorder,
3857
+ affordance: normalizedAffordance,
3858
+ effects: normalizedEffects,
3859
+ hoverBackgroundToken
3860
+ };
3861
+ if (background.type === "gradient") {
3862
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
3863
+ return {
3864
+ ...withoutLegacyText,
3865
+ background: {
3866
+ ...background,
3867
+ stops,
3868
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
3869
+ },
3870
+ border: normalizedBorder,
3871
+ affordance: normalizedAffordance,
3872
+ effects: normalizedEffects,
3873
+ hoverBackgroundToken
3874
+ };
3875
+ }
3876
+ return {
3877
+ ...withoutLegacyText,
3878
+ background: background.type === "solid" ? {
3879
+ ...background,
3880
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
3881
+ } : background,
3882
+ border: normalizedBorder,
3883
+ affordance: normalizedAffordance,
3884
+ effects: normalizedEffects,
3885
+ hoverBackgroundToken
3886
+ };
3887
+ }
3888
+ function normalizeLegacyButtonGlobalInput(input) {
3889
+ if (!isUnknownRecord(input)) return input;
3890
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
3891
+ return hoverColorToken === input.hoverColorToken ? input : {
3892
+ ...input,
3893
+ hoverColorToken
3894
+ };
3895
+ }
3896
+ function hasLegacyAlphaToken(input, background) {
3897
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
3898
+ return [
3899
+ input.hoverBackgroundToken,
3900
+ background.colorToken,
3901
+ background.foregroundToken,
3902
+ ...stops
3903
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
3904
+ }
3905
+ function stripLegacyTokenAlpha(value) {
3906
+ if (typeof value !== "string") return value;
3907
+ const slashIndex = value.indexOf("/");
3908
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
3909
+ }
3910
+ function hasLegacyButtonEffects(input) {
3911
+ if (!isUnknownRecord(input)) return false;
3912
+ return [
3913
+ "base",
3914
+ "hover",
3915
+ "active",
3916
+ "focus"
3917
+ ].some((state) => {
3918
+ const effects = input[state];
3919
+ return Array.isArray(effects) && effects.some((effect) => {
3920
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
3921
+ const classification = classifyButtonEffectId(effect.effectId);
3922
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
3923
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
3924
+ });
3925
+ });
3926
+ }
3927
+ function normalizeLegacyButtonEffects(input, backgroundType) {
3928
+ if (!isUnknownRecord(input)) return input;
3929
+ const normalized = {};
3930
+ for (const state of [
3931
+ "base",
3932
+ "hover",
3933
+ "active",
3934
+ "focus"
3935
+ ]) {
3936
+ const effects = input[state];
3937
+ if (!Array.isArray(effects)) continue;
3938
+ const safeEffects = effects.flatMap((effect) => {
3939
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
3940
+ const classification = classifyButtonEffectId(effect.effectId);
3941
+ if (classification === "non-colour") return [effect];
3942
+ if (classification !== "colour-transition") return [];
3943
+ if (effect.effectId === "background-on-hover") {
3944
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
3945
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
3946
+ return colorToken === null ? [] : [{
3947
+ ...effect,
3948
+ options: {
3949
+ ...options,
3950
+ colorToken
3951
+ }
3952
+ }];
3953
+ }
3954
+ if (backgroundType !== "solid") return [];
3955
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
3956
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
3957
+ return [{
3958
+ ...effect,
3959
+ options: {
3960
+ ...isUnknownRecord(effect.options) ? effect.options : {},
3961
+ amount
3962
+ }
3963
+ }];
3964
+ });
3965
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
3966
+ }
3967
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
3968
+ }
3969
+ function isUnknownRecord(value) {
3970
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3971
+ }
3972
+ function isUnknownArray(value) {
3973
+ return Array.isArray(value);
3974
+ }
3686
3975
  buttonSizeNameSchema.options;
3687
3976
  //#endregion
3688
3977
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -3709,7 +3998,7 @@ function defineButtonPersonality(input) {
3709
3998
  name: input.name,
3710
3999
  description: input.description,
3711
4000
  tags: input.tags,
3712
- buttonSystem: input.buttonSystem
4001
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
3713
4002
  };
3714
4003
  }
3715
4004
  //#endregion
@@ -3762,19 +4051,15 @@ const brushedWash = defineButtonPersonality({
3762
4051
  background: {
3763
4052
  type: "gradient",
3764
4053
  stops: ["primary", "accent"],
3765
- direction: "to-r"
4054
+ direction: "to-r",
4055
+ foregroundToken: "primaryForeground"
3766
4056
  },
3767
- textColorToken: "primaryForeground",
3768
4057
  borderRadius: "rounded-lg",
3769
4058
  shadow: {
3770
4059
  elevation: "low",
3771
4060
  softness: "soft",
3772
4061
  position: "bottom"
3773
- },
3774
- effects: { hover: [{
3775
- effectId: "opacity-reduce",
3776
- options: { reduction: -15 }
3777
- }] }
4062
+ }
3778
4063
  },
3779
4064
  {
3780
4065
  id: "secondary",
@@ -3784,32 +4069,27 @@ const brushedWash = defineButtonPersonality({
3784
4069
  background: {
3785
4070
  type: "gradient",
3786
4071
  stops: ["secondary", "accent"],
3787
- direction: "to-br"
4072
+ direction: "to-br",
4073
+ foregroundToken: "primaryForeground"
3788
4074
  },
3789
- textColorToken: "primaryForeground",
3790
4075
  borderRadius: "rounded-lg",
3791
4076
  shadow: {
3792
4077
  elevation: "low",
3793
4078
  softness: "soft",
3794
4079
  position: "bottom"
3795
- },
3796
- effects: { hover: [{
3797
- effectId: "opacity-reduce",
3798
- options: { reduction: -15 }
3799
- }] }
4080
+ }
3800
4081
  },
3801
4082
  {
3802
4083
  id: "outline",
3803
4084
  name: "Outline",
3804
4085
  enabled: true,
3805
4086
  priority: 3,
3806
- background: { type: "transparent" },
3807
- textColorToken: "primary",
3808
- borderRadius: "rounded-lg",
3809
- border: {
3810
- widthClass: "border",
3811
- colorToken: "primary"
4087
+ background: {
4088
+ type: "surface",
4089
+ role: "link"
3812
4090
  },
4091
+ borderRadius: "rounded-lg",
4092
+ border: { widthClass: "border" },
3813
4093
  effects: { hover: [{
3814
4094
  effectId: "background-on-hover",
3815
4095
  options: { colorToken: "surface" }
@@ -3820,8 +4100,10 @@ const brushedWash = defineButtonPersonality({
3820
4100
  name: "Ghost",
3821
4101
  enabled: true,
3822
4102
  priority: 3,
3823
- background: { type: "transparent" },
3824
- textColorToken: "text",
4103
+ background: {
4104
+ type: "surface",
4105
+ role: "link"
4106
+ },
3825
4107
  borderRadius: "rounded-lg",
3826
4108
  effects: { hover: [{
3827
4109
  effectId: "background-on-hover",
@@ -3867,7 +4149,6 @@ const confidentChip = defineButtonPersonality({
3867
4149
  type: "solid",
3868
4150
  colorToken: "primary"
3869
4151
  },
3870
- textColorToken: "primaryForeground",
3871
4152
  borderRadius: "rounded-md",
3872
4153
  shadow: {
3873
4154
  elevation: "medium",
@@ -3877,7 +4158,7 @@ const confidentChip = defineButtonPersonality({
3877
4158
  effects: {
3878
4159
  hover: [{
3879
4160
  effectId: "darken-background",
3880
- options: { amount: 60 }
4161
+ options: { amount: 100 }
3881
4162
  }],
3882
4163
  active: [{
3883
4164
  effectId: "scale-down",
@@ -3894,12 +4175,8 @@ const confidentChip = defineButtonPersonality({
3894
4175
  type: "solid",
3895
4176
  colorToken: "surface"
3896
4177
  },
3897
- textColorToken: "text",
3898
4178
  borderRadius: "rounded-md",
3899
- border: {
3900
- widthClass: "border",
3901
- colorToken: "border"
3902
- },
4179
+ border: { widthClass: "border" },
3903
4180
  effects: { hover: [{
3904
4181
  effectId: "background-on-hover",
3905
4182
  options: { colorToken: "background" }
@@ -3910,13 +4187,12 @@ const confidentChip = defineButtonPersonality({
3910
4187
  name: "Outline",
3911
4188
  enabled: true,
3912
4189
  priority: 3,
3913
- background: { type: "transparent" },
3914
- textColorToken: "primary",
3915
- borderRadius: "rounded-md",
3916
- border: {
3917
- widthClass: "border",
3918
- colorToken: "primary"
4190
+ background: {
4191
+ type: "surface",
4192
+ role: "link"
3919
4193
  },
4194
+ borderRadius: "rounded-md",
4195
+ border: { widthClass: "border" },
3920
4196
  effects: { hover: [{
3921
4197
  effectId: "background-on-hover",
3922
4198
  options: { colorToken: "surface" }
@@ -3927,8 +4203,10 @@ const confidentChip = defineButtonPersonality({
3927
4203
  name: "Ghost",
3928
4204
  enabled: true,
3929
4205
  priority: 3,
3930
- background: { type: "transparent" },
3931
- textColorToken: "primary",
4206
+ background: {
4207
+ type: "surface",
4208
+ role: "link"
4209
+ },
3932
4210
  borderRadius: "rounded-md",
3933
4211
  effects: { hover: [{
3934
4212
  effectId: "background-on-hover",
@@ -3991,7 +4269,6 @@ const earthPill = defineButtonPersonality({
3991
4269
  type: "solid",
3992
4270
  colorToken: "primary"
3993
4271
  },
3994
- textColorToken: "primaryForeground",
3995
4272
  borderRadius: "rounded-full",
3996
4273
  shadow: {
3997
4274
  elevation: "low",
@@ -4017,13 +4294,12 @@ const earthPill = defineButtonPersonality({
4017
4294
  name: "Secondary",
4018
4295
  enabled: true,
4019
4296
  priority: 2,
4020
- background: { type: "transparent" },
4021
- textColorToken: "primary",
4022
- borderRadius: "rounded-full",
4023
- border: {
4024
- widthClass: "border",
4025
- colorToken: "primary"
4297
+ background: {
4298
+ type: "surface",
4299
+ role: "link"
4026
4300
  },
4301
+ borderRadius: "rounded-full",
4302
+ border: { widthClass: "border" },
4027
4303
  effects: { hover: [{
4028
4304
  effectId: "background-on-hover",
4029
4305
  options: { colorToken: "muted" }
@@ -4034,13 +4310,12 @@ const earthPill = defineButtonPersonality({
4034
4310
  name: "Outline",
4035
4311
  enabled: true,
4036
4312
  priority: 3,
4037
- background: { type: "transparent" },
4038
- textColorToken: "text",
4039
- borderRadius: "rounded-full",
4040
- border: {
4041
- widthClass: "border",
4042
- colorToken: "border"
4313
+ background: {
4314
+ type: "surface",
4315
+ role: "link"
4043
4316
  },
4317
+ borderRadius: "rounded-full",
4318
+ border: { widthClass: "border" },
4044
4319
  effects: { hover: [{
4045
4320
  effectId: "background-on-hover",
4046
4321
  options: { colorToken: "surfaceAlt" }
@@ -4051,8 +4326,10 @@ const earthPill = defineButtonPersonality({
4051
4326
  name: "Ghost",
4052
4327
  enabled: true,
4053
4328
  priority: 3,
4054
- background: { type: "transparent" },
4055
- textColorToken: "primary",
4329
+ background: {
4330
+ type: "surface",
4331
+ role: "link"
4332
+ },
4056
4333
  borderRadius: "rounded-full",
4057
4334
  shadow: {
4058
4335
  elevation: "none",
@@ -4073,11 +4350,7 @@ const earthPill = defineButtonPersonality({
4073
4350
  padding: "0.625rem 0",
4074
4351
  fontSize: "text-xl"
4075
4352
  }
4076
- },
4077
- effects: { hover: [{
4078
- effectId: "opacity-reduce",
4079
- options: { reduction: 25 }
4080
- }] }
4353
+ }
4081
4354
  }
4082
4355
  ]
4083
4356
  }
@@ -4113,8 +4386,10 @@ const editorialLink = defineButtonPersonality({
4113
4386
  name: "Primary",
4114
4387
  enabled: true,
4115
4388
  priority: 1,
4116
- background: { type: "transparent" },
4117
- textColorToken: "text",
4389
+ background: {
4390
+ type: "surface",
4391
+ role: "link"
4392
+ },
4118
4393
  borderRadius: "rounded-none",
4119
4394
  sizes: {
4120
4395
  sm: { padding: "0.25rem 0" },
@@ -4136,8 +4411,10 @@ const editorialLink = defineButtonPersonality({
4136
4411
  name: "Secondary",
4137
4412
  enabled: true,
4138
4413
  priority: 2,
4139
- background: { type: "transparent" },
4140
- textColorToken: "mutedText",
4414
+ background: {
4415
+ type: "surface",
4416
+ role: "link"
4417
+ },
4141
4418
  borderRadius: "rounded-none",
4142
4419
  sizes: {
4143
4420
  sm: { padding: "0.25rem 0" },
@@ -4159,8 +4436,10 @@ const editorialLink = defineButtonPersonality({
4159
4436
  name: "Outline",
4160
4437
  enabled: true,
4161
4438
  priority: 3,
4162
- background: { type: "transparent" },
4163
- textColorToken: "accent",
4439
+ background: {
4440
+ type: "surface",
4441
+ role: "link"
4442
+ },
4164
4443
  borderRadius: "rounded-none",
4165
4444
  sizes: {
4166
4445
  sm: { padding: "0.25rem 0" },
@@ -4182,19 +4461,17 @@ const editorialLink = defineButtonPersonality({
4182
4461
  name: "Ghost",
4183
4462
  enabled: true,
4184
4463
  priority: 3,
4185
- background: { type: "transparent" },
4186
- textColorToken: "mutedText",
4464
+ background: {
4465
+ type: "surface",
4466
+ role: "link"
4467
+ },
4187
4468
  borderRadius: "rounded-none",
4188
4469
  sizes: {
4189
4470
  sm: { padding: "0.25rem 0" },
4190
4471
  md: { padding: "0.5rem 0" },
4191
4472
  lg: { padding: "0.625rem 0" },
4192
4473
  xl: { padding: "0.75rem 0" }
4193
- },
4194
- effects: { hover: [{
4195
- effectId: "opacity-reduce",
4196
- options: { reduction: -20 }
4197
- }] }
4474
+ }
4198
4475
  }
4199
4476
  ]
4200
4477
  }
@@ -4256,12 +4533,8 @@ const flatInk = defineButtonPersonality({
4256
4533
  type: "solid",
4257
4534
  colorToken: "primary"
4258
4535
  },
4259
- textColorToken: "primaryForeground",
4260
4536
  borderRadius: "rounded-lg",
4261
- affordance: {
4262
- iconId: "ArrowRight",
4263
- colorToken: "accent"
4264
- },
4537
+ affordance: { iconId: "ArrowRight" },
4265
4538
  effects: { hover: [{
4266
4539
  effectId: "lift",
4267
4540
  options: { translateY: "-2px" }
@@ -4275,13 +4548,12 @@ const flatInk = defineButtonPersonality({
4275
4548
  name: "Secondary",
4276
4549
  enabled: true,
4277
4550
  priority: 2,
4278
- background: { type: "transparent" },
4279
- textColorToken: "primary",
4280
- borderRadius: "rounded-lg",
4281
- border: {
4282
- widthClass: "border",
4283
- colorToken: "border"
4551
+ background: {
4552
+ type: "surface",
4553
+ role: "link"
4284
4554
  },
4555
+ borderRadius: "rounded-lg",
4556
+ border: { widthClass: "border" },
4285
4557
  effects: { hover: [{
4286
4558
  effectId: "lift",
4287
4559
  options: { translateY: "-2px" }
@@ -4299,12 +4571,8 @@ const flatInk = defineButtonPersonality({
4299
4571
  type: "solid",
4300
4572
  colorToken: "accent"
4301
4573
  },
4302
- textColorToken: "accentForeground",
4303
4574
  borderRadius: "rounded-lg",
4304
- affordance: {
4305
- iconId: "ArrowRight",
4306
- colorToken: "accentForeground"
4307
- },
4575
+ affordance: { iconId: "ArrowRight" },
4308
4576
  effects: { hover: [{
4309
4577
  effectId: "lift",
4310
4578
  options: { translateY: "-2px" }
@@ -4367,7 +4635,6 @@ const inkStamp = defineButtonPersonality({
4367
4635
  type: "solid",
4368
4636
  colorToken: "primary"
4369
4637
  },
4370
- textColorToken: "primaryForeground",
4371
4638
  borderRadius: "rounded-md",
4372
4639
  effects: {
4373
4640
  hover: [{
@@ -4388,13 +4655,12 @@ const inkStamp = defineButtonPersonality({
4388
4655
  name: "Secondary",
4389
4656
  enabled: true,
4390
4657
  priority: 2,
4391
- background: { type: "transparent" },
4392
- textColorToken: "primary",
4393
- borderRadius: "rounded-md",
4394
- border: {
4395
- widthClass: "border-2",
4396
- colorToken: "primary"
4658
+ background: {
4659
+ type: "surface",
4660
+ role: "link"
4397
4661
  },
4662
+ borderRadius: "rounded-md",
4663
+ border: { widthClass: "border-2" },
4398
4664
  effects: { hover: [{
4399
4665
  effectId: "background-on-hover",
4400
4666
  options: { colorToken: "surface" }
@@ -4405,13 +4671,12 @@ const inkStamp = defineButtonPersonality({
4405
4671
  name: "Outline",
4406
4672
  enabled: true,
4407
4673
  priority: 3,
4408
- background: { type: "transparent" },
4409
- textColorToken: "text",
4410
- borderRadius: "rounded-md",
4411
- border: {
4412
- widthClass: "border-2",
4413
- colorToken: "border"
4674
+ background: {
4675
+ type: "surface",
4676
+ role: "link"
4414
4677
  },
4678
+ borderRadius: "rounded-md",
4679
+ border: { widthClass: "border-2" },
4415
4680
  effects: { hover: [{
4416
4681
  effectId: "background-on-hover",
4417
4682
  options: { colorToken: "surface" }
@@ -4422,8 +4687,10 @@ const inkStamp = defineButtonPersonality({
4422
4687
  name: "Ghost",
4423
4688
  enabled: true,
4424
4689
  priority: 3,
4425
- background: { type: "transparent" },
4426
- textColorToken: "accent",
4690
+ background: {
4691
+ type: "surface",
4692
+ role: "link"
4693
+ },
4427
4694
  borderRadius: "rounded-none",
4428
4695
  sizes: {
4429
4696
  sm: {
@@ -4516,7 +4783,6 @@ const joyStamp = defineButtonPersonality({
4516
4783
  type: "solid",
4517
4784
  colorToken: "primary"
4518
4785
  },
4519
- textColorToken: "primaryForeground",
4520
4786
  borderRadius: "rounded-full",
4521
4787
  shadow: {
4522
4788
  elevation: "high",
@@ -4530,13 +4796,12 @@ const joyStamp = defineButtonPersonality({
4530
4796
  name: "Secondary",
4531
4797
  enabled: true,
4532
4798
  priority: 2,
4533
- background: { type: "transparent" },
4534
- textColorToken: "text",
4535
- borderRadius: "rounded-full",
4536
- border: {
4537
- widthClass: "border-2",
4538
- colorToken: "text"
4799
+ background: {
4800
+ type: "surface",
4801
+ role: "link"
4539
4802
  },
4803
+ borderRadius: "rounded-full",
4804
+ border: { widthClass: "border-2" },
4540
4805
  shadow: {
4541
4806
  elevation: "high",
4542
4807
  softness: "hard",
@@ -4601,12 +4866,8 @@ const ornateRitual = defineButtonPersonality({
4601
4866
  type: "solid",
4602
4867
  colorToken: "primary"
4603
4868
  },
4604
- textColorToken: "primaryForeground",
4605
4869
  borderRadius: "rounded-md",
4606
- border: {
4607
- widthClass: "border",
4608
- colorToken: "primary"
4609
- },
4870
+ border: { widthClass: "border" },
4610
4871
  effects: {
4611
4872
  hover: [{
4612
4873
  effectId: "background-on-hover",
@@ -4627,12 +4888,8 @@ const ornateRitual = defineButtonPersonality({
4627
4888
  type: "solid",
4628
4889
  colorToken: "secondary"
4629
4890
  },
4630
- textColorToken: "primaryForeground",
4631
4891
  borderRadius: "rounded-md",
4632
- border: {
4633
- widthClass: "border",
4634
- colorToken: "primary"
4635
- },
4892
+ border: { widthClass: "border" },
4636
4893
  effects: { hover: [{
4637
4894
  effectId: "background-on-hover",
4638
4895
  options: { colorToken: "surface" }
@@ -4643,13 +4900,12 @@ const ornateRitual = defineButtonPersonality({
4643
4900
  name: "Outline",
4644
4901
  enabled: true,
4645
4902
  priority: 3,
4646
- background: { type: "transparent" },
4647
- textColorToken: "primary",
4648
- borderRadius: "rounded-md",
4649
- border: {
4650
- widthClass: "border",
4651
- colorToken: "primary"
4903
+ background: {
4904
+ type: "surface",
4905
+ role: "link"
4652
4906
  },
4907
+ borderRadius: "rounded-md",
4908
+ border: { widthClass: "border" },
4653
4909
  effects: { hover: [{
4654
4910
  effectId: "background-on-hover",
4655
4911
  options: { colorToken: "muted" }
@@ -4660,8 +4916,10 @@ const ornateRitual = defineButtonPersonality({
4660
4916
  name: "Ghost",
4661
4917
  enabled: true,
4662
4918
  priority: 3,
4663
- background: { type: "transparent" },
4664
- textColorToken: "accent",
4919
+ background: {
4920
+ type: "surface",
4921
+ role: "link"
4922
+ },
4665
4923
  borderRadius: "rounded-none",
4666
4924
  sizes: {
4667
4925
  sm: {
@@ -4743,14 +5001,10 @@ const pebble = defineButtonPersonality({
4743
5001
  type: "solid",
4744
5002
  colorToken: "primary"
4745
5003
  },
4746
- textColorToken: "primaryForeground",
4747
5004
  borderRadius: "rounded-full",
4748
5005
  effects: { hover: [{
4749
- effectId: "background-on-hover-alpha",
4750
- options: {
4751
- colorToken: "primary",
4752
- opacity: 88
4753
- }
5006
+ effectId: "darken-background",
5007
+ options: { amount: 100 }
4754
5008
  }] }
4755
5009
  },
4756
5010
  {
@@ -4758,13 +5012,12 @@ const pebble = defineButtonPersonality({
4758
5012
  name: "Secondary",
4759
5013
  enabled: true,
4760
5014
  priority: 2,
4761
- background: { type: "transparent" },
4762
- textColorToken: "primary",
4763
- borderRadius: "rounded-full",
4764
- border: {
4765
- widthClass: "border-2",
4766
- colorToken: "accent"
5015
+ background: {
5016
+ type: "surface",
5017
+ role: "link"
4767
5018
  },
5019
+ borderRadius: "rounded-full",
5020
+ border: { widthClass: "border-2" },
4768
5021
  effects: { hover: [{
4769
5022
  effectId: "background-on-hover",
4770
5023
  options: { colorToken: "accent" }
@@ -4775,13 +5028,12 @@ const pebble = defineButtonPersonality({
4775
5028
  name: "Outline",
4776
5029
  enabled: true,
4777
5030
  priority: 3,
4778
- background: { type: "transparent" },
4779
- textColorToken: "text",
4780
- borderRadius: "rounded-full",
4781
- border: {
4782
- widthClass: "border",
4783
- colorToken: "border"
5031
+ background: {
5032
+ type: "surface",
5033
+ role: "link"
4784
5034
  },
5035
+ borderRadius: "rounded-full",
5036
+ border: { widthClass: "border" },
4785
5037
  effects: { hover: [{
4786
5038
  effectId: "background-on-hover",
4787
5039
  options: { colorToken: "surface" }
@@ -4792,8 +5044,10 @@ const pebble = defineButtonPersonality({
4792
5044
  name: "Ghost",
4793
5045
  enabled: true,
4794
5046
  priority: 3,
4795
- background: { type: "transparent" },
4796
- textColorToken: "primary",
5047
+ background: {
5048
+ type: "surface",
5049
+ role: "link"
5050
+ },
4797
5051
  borderRadius: "rounded-full",
4798
5052
  sizes: {
4799
5053
  sm: {
@@ -4809,11 +5063,7 @@ const pebble = defineButtonPersonality({
4809
5063
  padding: "0.75rem 1.5rem",
4810
5064
  fontSize: "text-xl"
4811
5065
  }
4812
- },
4813
- effects: { hover: [{
4814
- effectId: "opacity-reduce",
4815
- options: { reduction: 30 }
4816
- }] }
5066
+ }
4817
5067
  }
4818
5068
  ]
4819
5069
  }
@@ -4875,15 +5125,11 @@ const quietArrow = defineButtonPersonality({
4875
5125
  type: "solid",
4876
5126
  colorToken: "primary"
4877
5127
  },
4878
- textColorToken: "primaryForeground",
4879
5128
  borderRadius: "rounded-xl",
4880
5129
  affordance: { iconId: "ArrowRight" },
4881
5130
  effects: { hover: [{
4882
- effectId: "background-on-hover-alpha",
4883
- options: {
4884
- colorToken: "primary",
4885
- opacity: 90
4886
- }
5131
+ effectId: "darken-background",
5132
+ options: { amount: 100 }
4887
5133
  }] }
4888
5134
  },
4889
5135
  {
@@ -4891,13 +5137,12 @@ const quietArrow = defineButtonPersonality({
4891
5137
  name: "Secondary",
4892
5138
  enabled: true,
4893
5139
  priority: 2,
4894
- background: { type: "transparent" },
4895
- textColorToken: "primary",
4896
- borderRadius: "rounded-xl",
4897
- border: {
4898
- widthClass: "border",
4899
- colorToken: "primary"
5140
+ background: {
5141
+ type: "surface",
5142
+ role: "link"
4900
5143
  },
5144
+ borderRadius: "rounded-xl",
5145
+ border: { widthClass: "border" },
4901
5146
  affordance: { iconId: "ArrowRight" },
4902
5147
  effects: { hover: [{
4903
5148
  effectId: "background-on-hover",
@@ -4909,21 +5154,22 @@ const quietArrow = defineButtonPersonality({
4909
5154
  name: "Outline",
4910
5155
  enabled: true,
4911
5156
  priority: 3,
4912
- background: { type: "transparent" },
4913
- textColorToken: "primary",
5157
+ background: {
5158
+ type: "surface",
5159
+ role: "link"
5160
+ },
4914
5161
  borderRadius: "rounded-xl",
4915
- border: {
4916
- widthClass: "border",
4917
- colorToken: "primary"
4918
- }
5162
+ border: { widthClass: "border" }
4919
5163
  },
4920
5164
  {
4921
5165
  id: "ghost",
4922
5166
  name: "Ghost",
4923
5167
  enabled: true,
4924
5168
  priority: 3,
4925
- background: { type: "transparent" },
4926
- textColorToken: "primary",
5169
+ background: {
5170
+ type: "surface",
5171
+ role: "link"
5172
+ },
4927
5173
  borderRadius: "rounded-xl"
4928
5174
  }
4929
5175
  ]
@@ -4987,7 +5233,6 @@ const showtimePill = defineButtonPersonality({
4987
5233
  type: "solid",
4988
5234
  colorToken: "primary"
4989
5235
  },
4990
- textColorToken: "background",
4991
5236
  borderRadius: "rounded-full",
4992
5237
  effects: { hover: [{ effectId: "pop" }] }
4993
5238
  },
@@ -4996,13 +5241,12 @@ const showtimePill = defineButtonPersonality({
4996
5241
  name: "Secondary",
4997
5242
  enabled: true,
4998
5243
  priority: 2,
4999
- background: { type: "transparent" },
5000
- textColorToken: "primary",
5001
- borderRadius: "rounded-full",
5002
- border: {
5003
- widthClass: "border-2",
5004
- colorToken: "primary"
5244
+ background: {
5245
+ type: "surface",
5246
+ role: "link"
5005
5247
  },
5248
+ borderRadius: "rounded-full",
5249
+ border: { widthClass: "border-2" },
5006
5250
  effects: { hover: [{ effectId: "pop" }] }
5007
5251
  },
5008
5252
  {
@@ -5014,7 +5258,6 @@ const showtimePill = defineButtonPersonality({
5014
5258
  type: "solid",
5015
5259
  colorToken: "secondary"
5016
5260
  },
5017
- textColorToken: "primary",
5018
5261
  borderRadius: "rounded-full",
5019
5262
  effects: { hover: [{ effectId: "pop" }] }
5020
5263
  },
@@ -5027,12 +5270,8 @@ const showtimePill = defineButtonPersonality({
5027
5270
  type: "solid",
5028
5271
  colorToken: "background"
5029
5272
  },
5030
- textColorToken: "primary",
5031
5273
  borderRadius: "rounded-full",
5032
- border: {
5033
- widthClass: "border-2",
5034
- colorToken: "primary"
5035
- },
5274
+ border: { widthClass: "border-2" },
5036
5275
  effects: { hover: [{
5037
5276
  effectId: "background-on-hover",
5038
5277
  options: { colorToken: "surface" }
@@ -5043,13 +5282,12 @@ const showtimePill = defineButtonPersonality({
5043
5282
  name: "Outline",
5044
5283
  enabled: true,
5045
5284
  priority: 3,
5046
- background: { type: "transparent" },
5047
- textColorToken: "primary",
5048
- borderRadius: "rounded-full",
5049
- border: {
5050
- widthClass: "border-2",
5051
- colorToken: "primary"
5285
+ background: {
5286
+ type: "surface",
5287
+ role: "link"
5052
5288
  },
5289
+ borderRadius: "rounded-full",
5290
+ border: { widthClass: "border-2" },
5053
5291
  effects: { hover: [{
5054
5292
  effectId: "background-on-hover",
5055
5293
  options: { colorToken: "background" }
@@ -5060,8 +5298,10 @@ const showtimePill = defineButtonPersonality({
5060
5298
  name: "Ghost",
5061
5299
  enabled: true,
5062
5300
  priority: 3,
5063
- background: { type: "transparent" },
5064
- textColorToken: "primary",
5301
+ background: {
5302
+ type: "surface",
5303
+ role: "link"
5304
+ },
5065
5305
  borderRadius: "rounded-full",
5066
5306
  effects: { hover: [{
5067
5307
  effectId: "background-on-hover",
@@ -5072,104 +5312,151 @@ const showtimePill = defineButtonPersonality({
5072
5312
  }
5073
5313
  });
5074
5314
  //#endregion
5075
- //#region ../theme-core/src/buttons/personalities/index.ts
5076
- const buttonPersonalities = [
5077
- defineButtonPersonality({
5078
- id: "soft-pill",
5079
- name: "Soft Pill",
5080
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5081
- tags: {
5082
- tone: "classic",
5083
- energy: "calm",
5084
- motion: "subtle",
5085
- era: "organic"
5315
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
5316
+ /**
5317
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
5318
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
5319
+ */
5320
+ const softPill = defineButtonPersonality({
5321
+ id: "soft-pill",
5322
+ name: "Soft Pill",
5323
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5324
+ tags: {
5325
+ tone: "classic",
5326
+ energy: "calm",
5327
+ motion: "subtle",
5328
+ era: "organic"
5329
+ },
5330
+ buttonSystem: {
5331
+ global: {
5332
+ cornerStyle: "pill",
5333
+ shadow: "low",
5334
+ textTransform: "none",
5335
+ fontWeight: 500,
5336
+ borderWidth: 2,
5337
+ hoverTransform: "lift",
5338
+ hoverColor: "none"
5086
5339
  },
5087
- buttonSystem: {
5088
- global: {
5089
- cornerStyle: "pill",
5090
- shadow: "low",
5091
- textTransform: "none",
5092
- fontWeight: 500,
5093
- borderWidth: 2,
5094
- hoverTransform: "lift",
5095
- hoverColor: "none"
5340
+ variants: [
5341
+ {
5342
+ id: "primary",
5343
+ name: "Primary",
5344
+ enabled: true,
5345
+ priority: 1,
5346
+ background: {
5347
+ type: "solid",
5348
+ colorToken: "primary"
5349
+ },
5350
+ borderRadius: "rounded-full",
5351
+ shadow: {
5352
+ elevation: "low",
5353
+ softness: "soft",
5354
+ position: "bottom"
5355
+ },
5356
+ effects: {
5357
+ hover: [{
5358
+ effectId: "lift",
5359
+ options: { translateY: "-1px" }
5360
+ }],
5361
+ active: [{
5362
+ effectId: "scale-down",
5363
+ options: { scale: "0.98" }
5364
+ }]
5365
+ }
5096
5366
  },
5097
- variants: [
5098
- {
5099
- id: "primary",
5100
- name: "Primary",
5101
- enabled: true,
5102
- priority: 1,
5103
- background: {
5104
- type: "solid",
5105
- colorToken: "primary"
5106
- },
5107
- textColorToken: "primaryForeground",
5108
- borderRadius: "rounded-full",
5109
- shadow: {
5110
- elevation: "low",
5111
- softness: "soft",
5112
- position: "bottom"
5113
- },
5114
- effects: {
5115
- hover: [{
5116
- effectId: "lift",
5117
- options: { translateY: "-1px" }
5118
- }],
5119
- active: [{
5120
- effectId: "scale-down",
5121
- options: { scale: "0.98" }
5122
- }]
5123
- }
5367
+ {
5368
+ id: "secondary",
5369
+ name: "Secondary",
5370
+ enabled: true,
5371
+ priority: 2,
5372
+ background: {
5373
+ type: "surface",
5374
+ role: "link"
5124
5375
  },
5125
- {
5126
- id: "secondary",
5127
- name: "Secondary",
5128
- enabled: true,
5129
- priority: 2,
5130
- background: { type: "transparent" },
5131
- textColorToken: "primary",
5132
- borderRadius: "rounded-full",
5133
- border: {
5134
- widthClass: "border-2",
5135
- colorToken: "primary"
5136
- },
5137
- effects: { hover: [{
5138
- effectId: "background-on-hover",
5139
- options: { colorToken: "surface" }
5140
- }] }
5376
+ borderRadius: "rounded-full",
5377
+ border: { widthClass: "border-2" },
5378
+ effects: { hover: [{
5379
+ effectId: "background-on-hover",
5380
+ options: { colorToken: "surface" }
5381
+ }] }
5382
+ },
5383
+ {
5384
+ id: "outline",
5385
+ name: "Outline",
5386
+ enabled: true,
5387
+ priority: 3,
5388
+ background: {
5389
+ type: "surface",
5390
+ role: "link"
5141
5391
  },
5142
- {
5143
- id: "outline",
5144
- name: "Outline",
5145
- enabled: true,
5146
- priority: 3,
5147
- background: { type: "transparent" },
5148
- textColorToken: "text",
5149
- borderRadius: "rounded-full",
5150
- border: {
5151
- widthClass: "border",
5152
- colorToken: "border"
5153
- },
5154
- effects: { hover: [{
5155
- effectId: "background-on-hover",
5156
- options: { colorToken: "surface" }
5157
- }] }
5392
+ borderRadius: "rounded-full",
5393
+ border: { widthClass: "border" },
5394
+ effects: { hover: [{
5395
+ effectId: "background-on-hover",
5396
+ options: { colorToken: "surface" }
5397
+ }] }
5398
+ },
5399
+ {
5400
+ id: "ghost",
5401
+ name: "Ghost",
5402
+ enabled: true,
5403
+ priority: 3,
5404
+ background: {
5405
+ type: "surface",
5406
+ role: "link"
5158
5407
  },
5159
- {
5160
- id: "ghost",
5161
- name: "Ghost",
5162
- enabled: true,
5163
- priority: 3,
5164
- background: { type: "transparent" },
5165
- textColorToken: "text",
5166
- borderRadius: "rounded-full",
5167
- effects: { hover: [{
5168
- effectId: "background-on-hover",
5169
- options: { colorToken: "surface" }
5170
- }] }
5171
- }
5172
- ]
5408
+ borderRadius: "rounded-full",
5409
+ effects: { hover: [{
5410
+ effectId: "background-on-hover",
5411
+ options: { colorToken: "surface" }
5412
+ }] }
5413
+ }
5414
+ ]
5415
+ }
5416
+ });
5417
+ //#endregion
5418
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
5419
+ const solidSecondary = {
5420
+ id: "secondary",
5421
+ name: "Secondary",
5422
+ enabled: true,
5423
+ priority: 2,
5424
+ background: {
5425
+ type: "solid",
5426
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
5427
+ },
5428
+ borderRadius: "rounded-full",
5429
+ shadow: {
5430
+ elevation: "none",
5431
+ softness: null,
5432
+ position: "bottom"
5433
+ },
5434
+ effects: {
5435
+ hover: [{
5436
+ effectId: "background-on-hover-alpha",
5437
+ options: {
5438
+ colorToken: "secondary",
5439
+ opacity: 88
5440
+ }
5441
+ }],
5442
+ active: [{
5443
+ effectId: "scale-down",
5444
+ options: { scale: "0.98" }
5445
+ }]
5446
+ }
5447
+ };
5448
+ //#endregion
5449
+ //#region ../theme-core/src/buttons/personalities/index.ts
5450
+ const buttonPersonalities = [
5451
+ softPill,
5452
+ defineButtonPersonality({
5453
+ id: "two-tone-pill",
5454
+ name: "Two-tone Pill",
5455
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
5456
+ tags: softPill.tags,
5457
+ buttonSystem: {
5458
+ ...softPill.buttonSystem,
5459
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
5173
5460
  }
5174
5461
  }),
5175
5462
  earthPill,
@@ -5185,6 +5472,27 @@ const buttonPersonalities = [
5185
5472
  quietArrow
5186
5473
  ];
5187
5474
  new Map(buttonPersonalities.map((p) => [p.id, p]));
5475
+ buttonPersonalities.map((personality) => ({
5476
+ id: personality.id,
5477
+ name: personality.name,
5478
+ description: personality.description,
5479
+ category: presetCategory(personality),
5480
+ buttonSystem: personality.buttonSystem,
5481
+ compatibility: {
5482
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
5483
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
5484
+ }
5485
+ }));
5486
+ function presetCategory(personality) {
5487
+ switch (personality.tags.era) {
5488
+ case "retro": return "retro";
5489
+ case "editorial": return "minimal";
5490
+ case "organic": return "artistic";
5491
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
5492
+ case "technical": return "technical";
5493
+ case void 0: return "modern";
5494
+ }
5495
+ }
5188
5496
  //#endregion
5189
5497
  //#region ../theme-core/src/cards/types.ts
5190
5498
  const cardVariantRoleValues = ["default", "alternative"];
@@ -6703,6 +7011,7 @@ const navFontWeight = z$1.enum([
6703
7011
  "bold"
6704
7012
  ]);
6705
7013
  const headerMaxWidth = z$1.enum(["container", "full"]);
7014
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6706
7015
  const headerContainerSchema = z$1.object({
6707
7016
  rounded: z$1.enum([
6708
7017
  "none",
@@ -6847,6 +7156,7 @@ const headerSchema = z$1.object({
6847
7156
  positioning: headerPositioning,
6848
7157
  shrinkOnScroll: z$1.boolean(),
6849
7158
  maxWidth: headerMaxWidth,
7159
+ barFrame: headerBarFrame.optional(),
6850
7160
  logoOverride: mediaSchema$1.nullable().optional(),
6851
7161
  background: headerBackgroundSchema.default({
6852
7162
  type: "color",
@@ -6856,6 +7166,7 @@ const headerSchema = z$1.object({
6856
7166
  navStyle: headerNavStyle,
6857
7167
  navColor: themeColorTokenSchema.nullable().optional(),
6858
7168
  navWeight: navFontWeight.default("medium"),
7169
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6859
7170
  navTypography: z$1.enum(["body", "heading"]).optional(),
6860
7171
  navTextSize: navLinkStyleSchema.shape.textSize,
6861
7172
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6871,7 +7182,21 @@ const headerSchema = z$1.object({
6871
7182
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6872
7183
  ctaVariant: z$1.string().min(1).optional(),
6873
7184
  dropdownStyle: dropdownStyleSchema
6874
- });
7185
+ }).transform(normaliseHeaderNavFontRole);
7186
+ /**
7187
+ * Normalises the legacy `navTypography` font-role alias into the canonical
7188
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
7189
+ * a data migration. `navFontRole` always wins when both are present; the legacy
7190
+ * field is dropped so we never carry a dual write forward.
7191
+ */
7192
+ function normaliseHeaderNavFontRole(header) {
7193
+ if (header.navTypography === void 0) return header;
7194
+ const { navTypography, ...rest } = header;
7195
+ return header.navFontRole === void 0 ? {
7196
+ ...rest,
7197
+ navFontRole: navTypography
7198
+ } : rest;
7199
+ }
6875
7200
  const footerVariant = z$1.enum([
6876
7201
  "simple",
6877
7202
  "columns",
@@ -8645,6 +8970,241 @@ const originalJoyCardSystem = { variants: [{
8645
8970
  const serifDisplayQuote = { style: "serif-display" };
8646
8971
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8647
8972
  const accentGlyphQuote = { style: "accent-glyph" };
8973
+ /**
8974
+ * Curated library of gradient presets.
8975
+ * All gradients use theme color tokens, so they adapt to the site's palette.
8976
+ */
8977
+ const GRADIENT_PRESETS = [
8978
+ {
8979
+ id: "primary-secondary",
8980
+ name: "Primary to Secondary",
8981
+ description: "Blend your primary and secondary brand colors",
8982
+ type: "linear",
8983
+ angle: 135,
8984
+ stops: [{
8985
+ color: "primary-500",
8986
+ position: 0
8987
+ }, {
8988
+ color: "secondary-500",
8989
+ position: 100
8990
+ }]
8991
+ },
8992
+ {
8993
+ id: "primary-accent",
8994
+ name: "Primary to Accent",
8995
+ description: "Energetic gradient from primary to accent",
8996
+ type: "linear",
8997
+ angle: 135,
8998
+ stops: [{
8999
+ color: "primary-500",
9000
+ position: 0
9001
+ }, {
9002
+ color: "accent-500",
9003
+ position: 100
9004
+ }]
9005
+ },
9006
+ {
9007
+ id: "secondary-accent",
9008
+ name: "Secondary to Accent",
9009
+ description: "Vibrant secondary to accent blend",
9010
+ type: "linear",
9011
+ angle: 135,
9012
+ stops: [{
9013
+ color: "secondary-500",
9014
+ position: 0
9015
+ }, {
9016
+ color: "accent-500",
9017
+ position: 100
9018
+ }]
9019
+ },
9020
+ {
9021
+ id: "primary-light-dark",
9022
+ name: "Primary Light to Dark",
9023
+ description: "Subtle primary color fade",
9024
+ type: "linear",
9025
+ angle: 180,
9026
+ stops: [{
9027
+ color: "primary-500",
9028
+ position: 0
9029
+ }, {
9030
+ color: "primary-900",
9031
+ position: 100
9032
+ }]
9033
+ },
9034
+ {
9035
+ id: "primary-dark-light",
9036
+ name: "Primary Dark to Light",
9037
+ description: "Reverse primary fade",
9038
+ type: "linear",
9039
+ angle: 180,
9040
+ stops: [{
9041
+ color: "primary-900",
9042
+ position: 0
9043
+ }, {
9044
+ color: "primary-50",
9045
+ position: 100
9046
+ }]
9047
+ },
9048
+ {
9049
+ id: "secondary-light-dark",
9050
+ name: "Secondary Light to Dark",
9051
+ description: "Subtle secondary color fade",
9052
+ type: "linear",
9053
+ angle: 180,
9054
+ stops: [{
9055
+ color: "secondary-500",
9056
+ position: 0
9057
+ }, {
9058
+ color: "secondary-900",
9059
+ position: 100
9060
+ }]
9061
+ },
9062
+ {
9063
+ id: "accent-light-dark",
9064
+ name: "Accent Light to Dark",
9065
+ description: "Accent color depth fade",
9066
+ type: "linear",
9067
+ angle: 180,
9068
+ stops: [{
9069
+ color: "accent-500",
9070
+ position: 0
9071
+ }, {
9072
+ color: "accent-900",
9073
+ position: 100
9074
+ }]
9075
+ },
9076
+ {
9077
+ id: "background-surface",
9078
+ name: "Background to Surface",
9079
+ description: "Subtle depth using base colors",
9080
+ type: "linear",
9081
+ angle: 180,
9082
+ stops: [{
9083
+ color: "background",
9084
+ position: 0
9085
+ }, {
9086
+ color: "surface",
9087
+ position: 100
9088
+ }]
9089
+ },
9090
+ {
9091
+ id: "neutral-fade",
9092
+ name: "Neutral Gradient",
9093
+ description: "Elegant neutral color fade",
9094
+ type: "linear",
9095
+ angle: 180,
9096
+ stops: [{
9097
+ color: "neutral-900",
9098
+ position: 0
9099
+ }, {
9100
+ color: "neutral-50",
9101
+ position: 100
9102
+ }]
9103
+ },
9104
+ {
9105
+ id: "primary-glow",
9106
+ name: "Primary glow",
9107
+ description: "A soft top-centred glow using your primary palette",
9108
+ type: "radial",
9109
+ shape: "ellipse",
9110
+ position: "top center",
9111
+ stops: [{
9112
+ color: "primary-900",
9113
+ position: 0
9114
+ }, {
9115
+ color: "primary-950",
9116
+ position: 100
9117
+ }],
9118
+ foreground: {
9119
+ textColor: "onPrimary900",
9120
+ headingColor: "onPrimary900",
9121
+ linkColor: "onPrimary900",
9122
+ supportingColor: "onPrimary900"
9123
+ }
9124
+ },
9125
+ {
9126
+ id: "accent-glow",
9127
+ name: "Accent glow",
9128
+ description: "A soft top-centred glow using your accent palette",
9129
+ type: "radial",
9130
+ shape: "ellipse",
9131
+ position: "top center",
9132
+ stops: [{
9133
+ color: "accent-900",
9134
+ position: 0
9135
+ }, {
9136
+ color: "accent-950",
9137
+ position: 100
9138
+ }],
9139
+ foreground: {
9140
+ textColor: "onAccent900",
9141
+ headingColor: "onAccent900",
9142
+ linkColor: "onAccent900",
9143
+ supportingColor: "onAccent900"
9144
+ }
9145
+ },
9146
+ {
9147
+ id: "primary-secondary-accent",
9148
+ name: "Brand Trio",
9149
+ description: "All three brand colors in harmony",
9150
+ type: "linear",
9151
+ angle: 135,
9152
+ stops: [
9153
+ {
9154
+ color: "primary-500",
9155
+ position: 0
9156
+ },
9157
+ {
9158
+ color: "secondary-500",
9159
+ position: 50
9160
+ },
9161
+ {
9162
+ color: "accent-500",
9163
+ position: 100
9164
+ }
9165
+ ]
9166
+ }
9167
+ ].map((preset) => ({
9168
+ ...preset,
9169
+ id: preset.id,
9170
+ stops: preset.stops
9171
+ }));
9172
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
9173
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
9174
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
9175
+ function parseGradientPresetId(value) {
9176
+ if (typeof value !== "string") return null;
9177
+ const normalized = value.trim();
9178
+ if (!gradientPresetIdSet.has(normalized)) return null;
9179
+ return normalized;
9180
+ }
9181
+ function getGradientPreset(id) {
9182
+ return gradientPresetById[id];
9183
+ }
9184
+ //#endregion
9185
+ //#region ../theme-core/src/gradients/utils.ts
9186
+ /**
9187
+ * Convert a GradientConfig to a CSS gradient string
9188
+ *
9189
+ * @param config - The gradient configuration using theme tokens
9190
+ * @param tokens - Map of theme color tokens to hex values
9191
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
9192
+ */
9193
+ function gradientToCss(config, tokens) {
9194
+ const stops = config.stops.map((stop) => {
9195
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
9196
+ }).join(", ");
9197
+ const type = config.type ?? "linear";
9198
+ if (type === "radial") {
9199
+ const position = config.position ?? "center";
9200
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
9201
+ }
9202
+ if (type === "conic") {
9203
+ const position = config.position ?? "center";
9204
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
9205
+ }
9206
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
9207
+ }
8648
9208
  //#endregion
8649
9209
  //#region ../theme-core/src/site-styles/headerLooks.ts
8650
9210
  function asHeaderLookId(value) {
@@ -8779,7 +9339,7 @@ const overlayLogoAccommodations = [
8779
9339
  * optional nested styling fields that would otherwise leak from another Look.
8780
9340
  */
8781
9341
  function baseHeader(theme) {
8782
- 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;
9342
+ 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;
8783
9343
  return {
8784
9344
  ...header,
8785
9345
  navContainer: {
@@ -8928,6 +9488,17 @@ const headerStyleCatalog = defineExactCatalog()([
8928
9488
  navTypography: "brand-caps",
8929
9489
  moods: ["expressive"]
8930
9490
  },
9491
+ {
9492
+ id: asHeaderStyleId("brand-capsule"),
9493
+ label: "Brand Capsule",
9494
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
9495
+ supportedLayoutIds: supportedLayouts(["classic"]),
9496
+ navInteraction: "pill-background",
9497
+ surface: "brand-solid",
9498
+ defaultDepth: "shadow",
9499
+ navTypography: "quiet-caps",
9500
+ moods: ["expressive", "professional"]
9501
+ },
8931
9502
  {
8932
9503
  id: asHeaderStyleId("serif-line"),
8933
9504
  label: "Serif Line",
@@ -9021,6 +9592,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
9021
9592
  "brand-bar",
9022
9593
  "brand-underline",
9023
9594
  "brand-pill",
9595
+ "brand-capsule",
9024
9596
  "serif-line",
9025
9597
  "flat-tabs"
9026
9598
  ])],
@@ -9058,6 +9630,11 @@ headerStyleRepairChain([
9058
9630
  "brand-pill",
9059
9631
  "brand-bar",
9060
9632
  "minimal"
9633
+ ]), headerStyleRepairChain([
9634
+ "brand-capsule",
9635
+ "brand-pill",
9636
+ "brand-bar",
9637
+ "minimal"
9061
9638
  ]), headerStyleRepairChain([
9062
9639
  "pill-nav",
9063
9640
  "soft-bar",
@@ -10671,6 +11248,19 @@ z$1.object({
10671
11248
  }).strict();
10672
11249
  //#endregion
10673
11250
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
11251
+ function defineSectionForegroundRuntimeTokens(input) {
11252
+ return {
11253
+ textColor: requireThemeColorToken(input.textColor),
11254
+ headingColor: requireThemeColorToken(input.headingColor),
11255
+ linkColor: requireThemeColorToken(input.linkColor),
11256
+ supportingColor: requireThemeColorToken(input.supportingColor)
11257
+ };
11258
+ }
11259
+ function requireThemeColorToken(value) {
11260
+ const token = parseThemeColorToken(value);
11261
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
11262
+ return token;
11263
+ }
10674
11264
  function defineDesignRuntimeRules(rules) {
10675
11265
  return rules;
10676
11266
  }
@@ -10941,24 +11531,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10941
11531
  type: "color",
10942
11532
  color: "muted"
10943
11533
  },
10944
- foreground: {
11534
+ foreground: defineSectionForegroundRuntimeTokens({
10945
11535
  textColor: "text",
10946
11536
  headingColor: "primary",
10947
11537
  linkColor: "primary",
10948
11538
  supportingColor: "text"
10949
- }
11539
+ })
10950
11540
  },
10951
11541
  "brand-depth-band": {
10952
11542
  background: {
10953
11543
  type: "color",
10954
11544
  color: "primary-800"
10955
11545
  },
10956
- foreground: {
11546
+ foreground: defineSectionForegroundRuntimeTokens({
10957
11547
  textColor: "text",
10958
11548
  headingColor: "primary",
10959
11549
  linkColor: "primary",
10960
11550
  supportingColor: "text"
10961
- }
11551
+ })
10962
11552
  },
10963
11553
  "hero-image": {
10964
11554
  background: {
@@ -10966,12 +11556,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10966
11556
  opacity: 1,
10967
11557
  position: "center center"
10968
11558
  },
10969
- foreground: {
11559
+ foreground: defineSectionForegroundRuntimeTokens({
10970
11560
  textColor: "text",
10971
11561
  headingColor: "primary",
10972
11562
  linkColor: "primary",
10973
11563
  supportingColor: "text"
10974
- }
11564
+ })
11565
+ }
11566
+ }
11567
+ });
11568
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
11569
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
11570
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
11571
+ ...defaultDesignRuntimeRules,
11572
+ sectionSurfaces: {
11573
+ ...defaultDesignRuntimeRules.sectionSurfaces,
11574
+ "accent-band": {
11575
+ background: {
11576
+ type: "gradient",
11577
+ gradientPresetId: primaryGlowGradientPresetId
11578
+ },
11579
+ foreground: defineSectionForegroundRuntimeTokens({
11580
+ textColor: "primaryForeground",
11581
+ headingColor: "primaryForeground",
11582
+ linkColor: "primaryForeground",
11583
+ supportingColor: "primaryForeground"
11584
+ })
10975
11585
  }
10976
11586
  }
10977
11587
  });
@@ -11295,6 +11905,7 @@ const curatedSiteStyles = [
11295
11905
  ],
11296
11906
  buttonPersonalityChoices: [
11297
11907
  buttonChoice("soft-pill"),
11908
+ buttonChoice("two-tone-pill"),
11298
11909
  buttonChoice("pebble"),
11299
11910
  buttonChoice("editorial-link"),
11300
11911
  buttonChoice("brushed-wash")
@@ -12358,6 +12969,8 @@ const curatedSiteStyles = [
12358
12969
  },
12359
12970
  compositionBudget: quietBudget,
12360
12971
  typography: fulcrumTypography,
12972
+ designRuntimeRules: fulcrumDesignRuntimeRules,
12973
+ recommendedAppearancePresetIds: ["cta-accent-band"],
12361
12974
  themeOverrides: {
12362
12975
  shadow: { colorToken: "primary" },
12363
12976
  accordions: {
@@ -12474,6 +13087,7 @@ const curatedSiteStyles = [
12474
13087
  ],
12475
13088
  buttonPersonalityChoices: [
12476
13089
  buttonChoice("quiet-arrow"),
13090
+ buttonChoice("two-tone-pill"),
12477
13091
  buttonChoice("flat-ink"),
12478
13092
  buttonChoice("editorial-link")
12479
13093
  ],
@@ -12729,213 +13343,6 @@ z$1.object({
12729
13343
  spacing: z$1.enum(themeTokenRecipeOptions.spacing),
12730
13344
  motion: z$1.enum(themeTokenRecipeOptions.motion)
12731
13345
  });
12732
- //#endregion
12733
- //#region ../theme-core/src/gradients/presets.ts
12734
- /**
12735
- * Curated library of gradient presets
12736
- * All gradients use theme color tokens, so they adapt to the site's palette
12737
- */
12738
- const GRADIENT_PRESETS = [
12739
- {
12740
- id: "primary-secondary",
12741
- name: "Primary to Secondary",
12742
- description: "Blend your primary and secondary brand colors",
12743
- type: "linear",
12744
- angle: 135,
12745
- stops: [{
12746
- color: "primary-500",
12747
- position: 0
12748
- }, {
12749
- color: "secondary-500",
12750
- position: 100
12751
- }]
12752
- },
12753
- {
12754
- id: "primary-accent",
12755
- name: "Primary to Accent",
12756
- description: "Energetic gradient from primary to accent",
12757
- type: "linear",
12758
- angle: 135,
12759
- stops: [{
12760
- color: "primary-500",
12761
- position: 0
12762
- }, {
12763
- color: "accent-500",
12764
- position: 100
12765
- }]
12766
- },
12767
- {
12768
- id: "secondary-accent",
12769
- name: "Secondary to Accent",
12770
- description: "Vibrant secondary to accent blend",
12771
- type: "linear",
12772
- angle: 135,
12773
- stops: [{
12774
- color: "secondary-500",
12775
- position: 0
12776
- }, {
12777
- color: "accent-500",
12778
- position: 100
12779
- }]
12780
- },
12781
- {
12782
- id: "primary-light-dark",
12783
- name: "Primary Light to Dark",
12784
- description: "Subtle primary color fade",
12785
- type: "linear",
12786
- angle: 180,
12787
- stops: [{
12788
- color: "primary-500",
12789
- position: 0
12790
- }, {
12791
- color: "primary-900",
12792
- position: 100
12793
- }]
12794
- },
12795
- {
12796
- id: "primary-dark-light",
12797
- name: "Primary Dark to Light",
12798
- description: "Reverse primary fade",
12799
- type: "linear",
12800
- angle: 180,
12801
- stops: [{
12802
- color: "primary-900",
12803
- position: 0
12804
- }, {
12805
- color: "primary-50",
12806
- position: 100
12807
- }]
12808
- },
12809
- {
12810
- id: "secondary-light-dark",
12811
- name: "Secondary Light to Dark",
12812
- description: "Subtle secondary color fade",
12813
- type: "linear",
12814
- angle: 180,
12815
- stops: [{
12816
- color: "secondary-500",
12817
- position: 0
12818
- }, {
12819
- color: "secondary-900",
12820
- position: 100
12821
- }]
12822
- },
12823
- {
12824
- id: "accent-light-dark",
12825
- name: "Accent Light to Dark",
12826
- description: "Accent color depth fade",
12827
- type: "linear",
12828
- angle: 180,
12829
- stops: [{
12830
- color: "accent-500",
12831
- position: 0
12832
- }, {
12833
- color: "accent-900",
12834
- position: 100
12835
- }]
12836
- },
12837
- {
12838
- id: "background-surface",
12839
- name: "Background to Surface",
12840
- description: "Subtle depth using base colors",
12841
- type: "linear",
12842
- angle: 180,
12843
- stops: [{
12844
- color: "background",
12845
- position: 0
12846
- }, {
12847
- color: "surface",
12848
- position: 100
12849
- }]
12850
- },
12851
- {
12852
- id: "neutral-fade",
12853
- name: "Neutral Gradient",
12854
- description: "Elegant neutral color fade",
12855
- type: "linear",
12856
- angle: 180,
12857
- stops: [{
12858
- color: "neutral-900",
12859
- position: 0
12860
- }, {
12861
- color: "neutral-50",
12862
- position: 100
12863
- }]
12864
- },
12865
- {
12866
- id: "primary-radial",
12867
- name: "Primary Spotlight",
12868
- description: "Radial primary gradient from center",
12869
- type: "radial",
12870
- position: "center",
12871
- stops: [{
12872
- color: "primary-500",
12873
- position: 0
12874
- }, {
12875
- color: "primary-900",
12876
- position: 100
12877
- }]
12878
- },
12879
- {
12880
- id: "accent-radial",
12881
- name: "Accent Spotlight",
12882
- description: "Radial accent gradient from center",
12883
- type: "radial",
12884
- position: "center",
12885
- stops: [{
12886
- color: "accent-500",
12887
- position: 0
12888
- }, {
12889
- color: "accent-900",
12890
- position: 100
12891
- }]
12892
- },
12893
- {
12894
- id: "primary-secondary-accent",
12895
- name: "Brand Trio",
12896
- description: "All three brand colors in harmony",
12897
- type: "linear",
12898
- angle: 135,
12899
- stops: [
12900
- {
12901
- color: "primary-500",
12902
- position: 0
12903
- },
12904
- {
12905
- color: "secondary-500",
12906
- position: 50
12907
- },
12908
- {
12909
- color: "accent-500",
12910
- position: 100
12911
- }
12912
- ]
12913
- }
12914
- ];
12915
- //#endregion
12916
- //#region ../theme-core/src/gradients/utils.ts
12917
- /**
12918
- * Convert a GradientConfig to a CSS gradient string
12919
- *
12920
- * @param config - The gradient configuration using theme tokens
12921
- * @param tokens - Map of theme color tokens to hex values
12922
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
12923
- */
12924
- function gradientToCss(config, tokens) {
12925
- const stops = config.stops.map((stop) => {
12926
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
12927
- }).join(", ");
12928
- const type = config.type ?? "linear";
12929
- if (type === "radial") {
12930
- const position = config.position ?? "center";
12931
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
12932
- }
12933
- if (type === "conic") {
12934
- const position = config.position ?? "center";
12935
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
12936
- }
12937
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
12938
- }
12939
13346
  const BREAKPOINT_LG = 1024;
12940
13347
  const BREAKPOINT_XL = 1280;
12941
13348
  const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
@@ -13902,6 +14309,20 @@ const blockCategoryEnum = z$1.enum([
13902
14309
  "layout",
13903
14310
  "interactive"
13904
14311
  ]);
14312
+ const blockContentSourceSchema = z$1.object({
14313
+ kind: z$1.enum([
14314
+ "inline",
14315
+ "entries",
14316
+ "mixed"
14317
+ ]),
14318
+ contentType: z$1.string().min(1).optional()
14319
+ }).superRefine((value, ctx) => {
14320
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
14321
+ code: z$1.ZodIssueCode.custom,
14322
+ path: ["contentType"],
14323
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
14324
+ });
14325
+ });
13905
14326
  z$1.object({
13906
14327
  name: z$1.string().min(1),
13907
14328
  version: z$1.string().min(1),
@@ -13932,6 +14353,12 @@ z$1.object({
13932
14353
  }).optional()).optional(),
13933
14354
  category: blockCategoryEnum.optional(),
13934
14355
  contentTypes: z$1.array(z$1.string()).optional(),
14356
+ /**
14357
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
14358
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
14359
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
14360
+ */
14361
+ contentSource: blockContentSourceSchema.optional(),
13935
14362
  tags: z$1.array(z$1.string()).optional(),
13936
14363
  icon: z$1.string().optional()
13937
14364
  });
@@ -14908,6 +15335,7 @@ function devValidate(node) {
14908
15335
  }
14909
15336
  //#endregion
14910
15337
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
15338
+ 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";
14911
15339
  /**
14912
15340
  * Creates background layer nodes for rendering backgrounds from field data.
14913
15341
  *
@@ -14973,6 +15401,34 @@ function backgroundLayer(path, options = {}) {
14973
15401
  ];
14974
15402
  }
14975
15403
  /**
15404
+ * Wrap decorative background layers in their own clipping frame.
15405
+ *
15406
+ * Foreground content remains outside this frame, so editor outlines, focus
15407
+ * rings, and floating controls are never clipped by a visual background.
15408
+ * Backgrounds that explicitly opt into overflow keep that behavior within
15409
+ * the decorative layer rather than changing the content root.
15410
+ */
15411
+ function backgroundFrame(path, options = {}) {
15412
+ const { leadingNodes = [], ...layerOptions } = options;
15413
+ const framedLayerOptions = {
15414
+ ...layerOptions,
15415
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
15416
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
15417
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
15418
+ };
15419
+ return el("div", {
15420
+ className: { $bind: {
15421
+ from: path,
15422
+ transforms: [{
15423
+ id: "background.resolveFrameClassName",
15424
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
15425
+ }],
15426
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
15427
+ } },
15428
+ style: { borderRadius: "inherit" }
15429
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
15430
+ }
15431
+ /**
14976
15432
  * Creates a media node for rendering background image/video media with conditional rendering.
14977
15433
  *
14978
15434
  * This helper creates a media element that:
@@ -15134,8 +15590,8 @@ function sectionContainer(children, opts) {
15134
15590
  * - content
15135
15591
  */
15136
15592
  function styledContainer(config) {
15137
- 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;
15138
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
15593
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
15594
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
15139
15595
  const childrenArray = Array.isArray(children) ? children : [children];
15140
15596
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
15141
15597
  return el(rootType, {
@@ -15158,7 +15614,7 @@ function styledContainer(config) {
15158
15614
  }],
15159
15615
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
15160
15616
  } }
15161
- }, [...backgroundNodes, ...childrenArray]);
15617
+ }, [backgroundNode, ...childrenArray]);
15162
15618
  }
15163
15619
  //#endregion
15164
15620
  //#region ../blocks/src/system/spacing.ts
@@ -15291,7 +15747,7 @@ const DEFAULT_SECTION_SPACING = "medium";
15291
15747
  * - Creating a section wrapper with background theme
15292
15748
  * - Adding background color/gradient/image layers
15293
15749
  * - Binding className to section styles with transform
15294
- * - Binding allowOverflow for background positioning
15750
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
15295
15751
  * - Wrapping content children
15296
15752
  *
15297
15753
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -15327,8 +15783,8 @@ const DEFAULT_SECTION_SPACING = "medium";
15327
15783
  * });
15328
15784
  */
15329
15785
  function styledSection(config) {
15330
- 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;
15331
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
15786
+ 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;
15787
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
15332
15788
  imageClassName,
15333
15789
  fallbackToken: background,
15334
15790
  omitImageLayer: !renderBackgroundImage,
@@ -15351,13 +15807,8 @@ function styledSection(config) {
15351
15807
  fullWidthPath
15352
15808
  }
15353
15809
  }]
15354
- } },
15355
- allowOverflow: allowOverflow ? true : { $bind: {
15356
- from: `${bindFrom}.background`,
15357
- transforms: [{ id: "background.resolveAllowOverflow" }],
15358
- fallback: false
15359
15810
  } }
15360
- }, [...renderedBackgroundNodes, ...childrenArray]);
15811
+ }, [renderedBackgroundNode, ...childrenArray]);
15361
15812
  }
15362
15813
  //#endregion
15363
15814
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -16218,9 +16669,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
16218
16669
  //#endregion
16219
16670
  //#region ../blocks/src/system/node/fragments/styledCard.ts
16220
16671
  function styledCard(children, opts, ...mods) {
16221
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
16222
- 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" });
16223
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
16672
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
16673
+ const defaultBackgroundLayer = el("div", {
16674
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
16675
+ style: { borderRadius: "inherit" }
16676
+ });
16677
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
16224
16678
  const style = {
16225
16679
  ...opts.style ?? {},
16226
16680
  borderColor: { $bind: {
@@ -16247,7 +16701,7 @@ function styledCard(children, opts, ...mods) {
16247
16701
  ...style ? { style } : {}
16248
16702
  }, [
16249
16703
  defaultBackgroundLayer,
16250
- ...backgroundNodes,
16704
+ backgroundNode,
16251
16705
  ...children
16252
16706
  ], ...mods);
16253
16707
  }
@@ -17027,9 +17481,15 @@ function createButtonGroup(options = {}) {
17027
17481
  //#endregion
17028
17482
  //#region ../blocks/src/system/fields/ctas.ts
17029
17483
  function createCtasRepeater(options = {}) {
17030
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
17484
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
17485
+ const fieldId = id;
17486
+ const buttonField = createButtonGroup({
17487
+ showGroupLabel: false,
17488
+ ...button ?? {},
17489
+ flattenInRepeater: true
17490
+ });
17031
17491
  return {
17032
- id,
17492
+ id: fieldId,
17033
17493
  type: "repeater",
17034
17494
  label,
17035
17495
  itemLabel,
@@ -17038,11 +17498,8 @@ function createCtasRepeater(options = {}) {
17038
17498
  maxItems,
17039
17499
  required: false,
17040
17500
  allowConversion: true,
17041
- schema: { fields: [createButtonGroup({
17042
- showGroupLabel: false,
17043
- ...button ?? {},
17044
- flattenInRepeater: true
17045
- })] }
17501
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
17502
+ schema: { fields: [buttonField] }
17046
17503
  };
17047
17504
  }
17048
17505
  //#endregion
@@ -17092,6 +17549,7 @@ const heroCtaRowFragment = defineFragment({
17092
17549
  label: "Calls to action",
17093
17550
  itemLabel: "CTA",
17094
17551
  maxItems: 3,
17552
+ defaultValue: [],
17095
17553
  button: {
17096
17554
  variants: [
17097
17555
  {
@@ -17159,7 +17617,7 @@ const ctaCopyFragment = defineFragment({
17159
17617
  eyebrowPath: "content.eyebrow",
17160
17618
  titlePath: "content.title",
17161
17619
  className: "cta-heading"
17162
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
17620
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
17163
17621
  });
17164
17622
  //#endregion
17165
17623
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -17256,7 +17714,7 @@ function buildTestimonialCard(...mods) {
17256
17714
  }, 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())])], {
17257
17715
  stylesFrom: "content._cardStyles",
17258
17716
  backgroundFrom: "content._cardStyles.background",
17259
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
17717
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
17260
17718
  }, ...mods);
17261
17719
  }
17262
17720
  /**
@@ -17728,39 +18186,6 @@ const formEmbedFragment = defineFragment({
17728
18186
  }
17729
18187
  });
17730
18188
  //#endregion
17731
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
17732
- const footerBottomTextFragment = defineFragment({
17733
- id: "footerBottomText",
17734
- title: "Footer Text",
17735
- description: "Rich text content for the main footer body and optional bottom bar.",
17736
- fields: [{
17737
- id: "bodyText",
17738
- type: "richText",
17739
- label: "Body text",
17740
- description: "Appears in the main footer area.",
17741
- ui: { variant: "limited" }
17742
- }, {
17743
- id: "bottomText",
17744
- type: "richText",
17745
- label: "Bottom bar text",
17746
- description: "Appears in the optional footer bottom bar.",
17747
- ui: { variant: "limited" }
17748
- }],
17749
- layout: [richText({
17750
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17751
- style: textColorStyle("text/80")
17752
- }, when("bodyText"), bind("bodyText", { transforms: [{
17753
- id: "content.interpolateRichTextTokens",
17754
- options: { tokens: ["year", "site_name"] }
17755
- }] })), richText({
17756
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17757
- style: textColorStyle("text/80")
17758
- }, when("bottomText"), bind("bottomText", { transforms: [{
17759
- id: "content.interpolateRichTextTokens",
17760
- options: { tokens: ["year", "site_name"] }
17761
- }] }))]
17762
- });
17763
- //#endregion
17764
18189
  //#region ../blocks/src/system/fragments/library/singleButton.ts
17765
18190
  const singleButtonFragment = defineFragment({
17766
18191
  id: "singleButton",
@@ -17933,7 +18358,7 @@ function createFaqAccordionLayout(options = {}) {
17933
18358
  options: {
17934
18359
  axis: "all",
17935
18360
  includeSpacing: false,
17936
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
18361
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
17937
18362
  }
17938
18363
  }]
17939
18364
  },
@@ -18924,6 +19349,7 @@ function createBlockManifest(config) {
18924
19349
  previewCustomize: config.previewCustomize,
18925
19350
  category: config.category,
18926
19351
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
19352
+ contentSource: config.contentSource,
18927
19353
  tags: config.tags ? [...config.tags] : [],
18928
19354
  icon: config.icon ?? "Box",
18929
19355
  layout,
@@ -19057,7 +19483,6 @@ function splitLayoutWith(children) {
19057
19483
  }
19058
19484
  }),
19059
19485
  renderBackgroundImage: false,
19060
- allowOverflow: true,
19061
19486
  baseClass: ""
19062
19487
  });
19063
19488
  }
@@ -19070,6 +19495,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
19070
19495
  title: "Hero",
19071
19496
  titleSource: "headline",
19072
19497
  category: "layout",
19498
+ contentSource: { kind: "inline" },
19073
19499
  includeContainerStyles: true,
19074
19500
  promotedFields: ["_sectionStyles.background.image"],
19075
19501
  fragments: [
@@ -19343,6 +19769,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
19343
19769
  id: "block.intro",
19344
19770
  title: "Intro",
19345
19771
  category: "layout",
19772
+ contentSource: { kind: "inline" },
19346
19773
  includeContainerStyles: true,
19347
19774
  titleSource: "title",
19348
19775
  previewCustomize: { quickFieldPriority: [
@@ -19528,6 +19955,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
19528
19955
  title: "Body Text",
19529
19956
  titleSource: "heading",
19530
19957
  category: "content",
19958
+ contentSource: { kind: "inline" },
19531
19959
  fragments: [{
19532
19960
  fragment: bodyCopyFragment,
19533
19961
  fieldPriority: 0
@@ -19584,6 +20012,10 @@ const blogPostBlockDefinition = {
19584
20012
  description: "Highlights a single blog post with title, image, and excerpt.",
19585
20013
  category: "blog",
19586
20014
  contentTypes: ["post"],
20015
+ contentSource: {
20016
+ kind: "entries",
20017
+ contentType: "post"
20018
+ },
19587
20019
  tags: [
19588
20020
  "blog",
19589
20021
  "post",
@@ -19685,7 +20117,7 @@ function postCard(children, ...mods) {
19685
20117
  return styledCard(children, {
19686
20118
  stylesFrom: "content._cardStyles",
19687
20119
  backgroundFrom: "content._cardStyles.background",
19688
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
20120
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
19689
20121
  }, ...mods);
19690
20122
  }
19691
20123
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -19721,7 +20153,7 @@ const stackPostCard = styledCard([inline({
19721
20153
  ])])], {
19722
20154
  stylesFrom: "content._cardStyles",
19723
20155
  backgroundFrom: "content._cardStyles.background",
19724
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
20156
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
19725
20157
  }, repeat("data.posts", "post"));
19726
20158
  const emptyState$2 = {
19727
20159
  ...styledCard([text({
@@ -19730,7 +20162,7 @@ const emptyState$2 = {
19730
20162
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
19731
20163
  stylesFrom: "content._cardStyles",
19732
20164
  backgroundFrom: "content._cardStyles.background",
19733
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
20165
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
19734
20166
  }),
19735
20167
  $when: {
19736
20168
  when: { from: "data.posts[0]" },
@@ -19740,7 +20172,7 @@ const emptyState$2 = {
19740
20172
  function blogListingShell(children) {
19741
20173
  return styledSection({
19742
20174
  children: styledContainer({
19743
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
20175
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19744
20176
  children
19745
20177
  }),
19746
20178
  baseClass: ""
@@ -19881,6 +20313,10 @@ const blogListingManifest = createBlockManifest({
19881
20313
  ],
19882
20314
  description: "Display a collection of blog posts in grid or stack layout.",
19883
20315
  contentTypes: ["post"],
20316
+ contentSource: {
20317
+ kind: "entries",
20318
+ contentType: "post"
20319
+ },
19884
20320
  tags: [
19885
20321
  "blog",
19886
20322
  "posts",
@@ -19923,6 +20359,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
19923
20359
  id: "block.cta-full",
19924
20360
  title: "Full-width CTA",
19925
20361
  category: "marketing",
20362
+ contentSource: { kind: "inline" },
19926
20363
  fragments: [{
19927
20364
  fragment: ctaCopyFragment,
19928
20365
  fieldPriority: 0
@@ -19956,6 +20393,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
19956
20393
  id: "block.single-button",
19957
20394
  title: "Single Button",
19958
20395
  category: "marketing",
20396
+ contentSource: { kind: "inline" },
19959
20397
  fragments: [{
19960
20398
  fragment: singleButtonFragment,
19961
20399
  fieldPriority: 0
@@ -20152,7 +20590,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
20152
20590
  const formSurface = styledContainer({
20153
20591
  bindFrom: "_containerStyles",
20154
20592
  constrainWidth: false,
20155
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
20593
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
20156
20594
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
20157
20595
  });
20158
20596
  function createFormLayout(variant) {
@@ -20216,6 +20654,7 @@ const formManifest = createBlockManifest({
20216
20654
  paletteHidden: false
20217
20655
  },
20218
20656
  category: "interactive",
20657
+ contentSource: { kind: "inline" },
20219
20658
  tags: [
20220
20659
  "form",
20221
20660
  "contact",
@@ -20278,6 +20717,7 @@ const contactNewsletterBlockDefinition = {
20278
20717
  titleSource: "contactTitle",
20279
20718
  description: "Two-column newsletter signup and contact form section.",
20280
20719
  category: "interactive",
20720
+ contentSource: { kind: "inline" },
20281
20721
  layout: contactNewsletterLayout,
20282
20722
  defaultVariant: "default",
20283
20723
  variants: { default: contactNewsletterLayout },
@@ -20481,6 +20921,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
20481
20921
  title: "FAQ",
20482
20922
  titleSource: "title",
20483
20923
  category: "content",
20924
+ contentSource: { kind: "inline" },
20484
20925
  includeContainerStyles: true,
20485
20926
  fragments: [{
20486
20927
  fragment: faqHeadingFragment,
@@ -21369,6 +21810,7 @@ const headerRootClassTransform = {
21369
21810
  ];
21370
21811
  const variant = header?.variant;
21371
21812
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
21813
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
21372
21814
  return joinClasses(classes);
21373
21815
  }
21374
21816
  };
@@ -21892,7 +22334,7 @@ function desktopOnlyDisplay(display) {
21892
22334
  }
21893
22335
  //#endregion
21894
22336
  //#region ../blocks/src/system/blocks/site-header.ts
21895
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
22337
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
21896
22338
  ...node,
21897
22339
  $when: {
21898
22340
  when: {
@@ -21920,7 +22362,7 @@ const logoRow = link({
21920
22362
  text({
21921
22363
  as: "strong",
21922
22364
  className: "header-logo-text rb-truncate"
21923
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22365
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21924
22366
  ]);
21925
22367
  const centeredLogoRow = link({
21926
22368
  href: "/",
@@ -21940,7 +22382,7 @@ const centeredLogoRow = link({
21940
22382
  text({
21941
22383
  as: "strong",
21942
22384
  className: "header-logo-text"
21943
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22385
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21944
22386
  ]);
21945
22387
  const createNavRow = (className, align = "end") => navRow({
21946
22388
  className: `${className} header-nav-row`,
@@ -22072,7 +22514,7 @@ const classicLayout = inline({
22072
22514
  logoRow,
22073
22515
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
22074
22516
  headerCta
22075
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
22517
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
22076
22518
  const classicCenteredNavLayout = inline({
22077
22519
  className: bindProp("$root.theme.header.maxWidth", {
22078
22520
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -22083,7 +22525,7 @@ const classicCenteredNavLayout = inline({
22083
22525
  logoRow,
22084
22526
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
22085
22527
  headerCta
22086
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
22528
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
22087
22529
  const centeredLayout = stack({
22088
22530
  gap: "md",
22089
22531
  align: "center",
@@ -22123,6 +22565,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22123
22565
  id: "block.site-header",
22124
22566
  title: "Site Header",
22125
22567
  category: "layout",
22568
+ contentSource: { kind: "inline" },
22126
22569
  additionalFields: [{
22127
22570
  id: "mode",
22128
22571
  type: "select",
@@ -22146,7 +22589,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22146
22589
  transforms: pipe(tx("layout.headerSectionBackground")),
22147
22590
  fallback: "background"
22148
22591
  }),
22149
- allowOverflow: true,
22150
22592
  className: bindProp("$root.theme.header", {
22151
22593
  transforms: pipe(tx("layout.headerRootClass")),
22152
22594
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -22196,218 +22638,155 @@ const footerNavGroupsLayout = stack({
22196
22638
  linkRequired: true,
22197
22639
  target: { $bind: { from: "entry.target" } },
22198
22640
  rel: { $bind: { from: "entry.rel" } }
22199
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
22641
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
22200
22642
  //#endregion
22201
22643
  //#region ../blocks/src/system/blocks/site-footer.ts
22202
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
22203
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
22204
- ...node,
22205
- $when: {
22206
- when: {
22207
- from,
22208
- transforms: [{ id: transformId }]
22209
- },
22210
- equals
22211
- }
22212
- });
22213
- const bottomBarTextLayout = () => {
22214
- const bottomTextNode = footerTextLayout()[1];
22215
- return bottomTextNode ? [bottomTextNode] : [];
22216
- };
22217
- const bodyTextLayout = () => {
22218
- const bodyTextNode = footerTextLayout()[0];
22219
- return bodyTextNode ? [bodyTextNode] : [];
22220
- };
22221
- const businessAddressLayout = () => [text({
22222
- as: "p",
22223
- className: "rb-caption rb-opacity-80"
22224
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
22225
- const inlineBottomTextLayout = () => {
22226
- const bottomTextNode = footerTextLayout()[1];
22227
- if (!bottomTextNode) return [];
22228
- return [when("$root.theme.footer.bottomBar.enabled", {
22229
- equals: true,
22230
- not: true
22231
- })(bottomTextNode)];
22232
- };
22233
- const simpleFooterLayout = stack({
22234
- gap: "md",
22235
- align: "start",
22236
- className: { $bind: {
22237
- from: "$root.theme.footer",
22238
- transforms: [{ id: "layout.footerSimpleRootClass" }],
22239
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
22240
- } }
22241
- }, [
22242
- link({
22243
- href: "/",
22244
- className: { $bind: {
22245
- from: "$root.theme.footer.logo",
22246
- transforms: [{
22247
- id: "layout.footerLogoClass",
22248
- options: { requireExplicitShow: true }
22249
- }],
22250
- fallback: "rb-hidden"
22251
- } }
22252
- }, [
22253
- media({ className: { $bind: {
22254
- from: "$root.theme.footer.logo",
22255
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22256
- fallback: "rb-w-auto"
22257
- } } }, when("content.logo"), bind("content.logo")),
22258
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22259
- from: "$root.theme.footer.logo",
22260
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22261
- fallback: "rb-w-auto"
22262
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22263
- text({
22264
- as: "strong",
22265
- className: "footer-logo-text rb-nav-text"
22266
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22267
- ]),
22268
- footerNav({
22269
- collectionPath: "footerMenu.items",
22270
- mode: "flatten",
22271
- className: { $bind: {
22272
- from: "$root.theme.footer.navLayout",
22273
- transforms: [{ id: "layout.footerSimpleNavClass" }],
22274
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
22275
- } },
22276
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22277
- }),
22278
- ...bodyTextLayout(),
22279
- ...businessAddressLayout(),
22280
- ...inlineBottomTextLayout()
22281
- ], when("$root.theme.footer.variant", { equals: "simple" }));
22282
- const columnsFooterLayout = stack({
22283
- gap: "xl",
22284
- align: "start",
22644
+ const brandLogo = link({
22645
+ href: "/",
22285
22646
  className: { $bind: {
22286
- from: "$root.theme.footer.maxWidth",
22647
+ from: "$root.theme.footer.logo",
22287
22648
  transforms: [{
22288
- id: "layout.maxWidthClass",
22289
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22649
+ id: "layout.footerLogoClass",
22650
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
22290
22651
  }],
22291
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22652
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
22292
22653
  } }
22293
- }, [
22294
- footerNavGroupsLayout,
22295
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
22296
- as: "strong",
22297
- className: "rb-block rb-nav-text",
22298
- style: textColorStyle("text")
22299
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
22300
- collectionPath: "footerMenu.items",
22301
- mode: "links-only",
22302
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
22303
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22304
- })]),
22305
- ...bodyTextLayout(),
22306
- ...businessAddressLayout(),
22307
- ...inlineBottomTextLayout()
22308
- ], when("$root.theme.footer.variant", { equals: "columns" }));
22309
- const splitFooterLayout = stack({
22310
- gap: "xl",
22311
- align: "start",
22654
+ }, [media({ className: { $bind: {
22655
+ from: "$root.theme.footer.logo",
22656
+ transforms: [{
22657
+ id: "layout.footerLogoMediaClass",
22658
+ options: { base: "rb-h-10 rb-w-auto" }
22659
+ }],
22660
+ fallback: "rb-h-10 rb-w-auto"
22661
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
22662
+ as: "strong",
22663
+ className: "footer-logo-text rb-nav-text"
22664
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
22665
+ const navigation = stack({
22666
+ gap: "md",
22667
+ className: "rb-w-full"
22668
+ }, [footerNavGroupsLayout, footerNav({
22669
+ collectionPath: "footerMenu.items",
22670
+ mode: "links-only",
22312
22671
  className: { $bind: {
22313
- from: "$root.theme.footer.maxWidth",
22314
- transforms: [{
22315
- id: "layout.maxWidthClass",
22316
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22317
- }],
22318
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22319
- } }
22672
+ from: "module.navigationClassName",
22673
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
22674
+ } },
22675
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
22676
+ })], when("module.kind", { equals: "navigation" }));
22677
+ const legalNavigation = footerNav({
22678
+ collectionPath: "legalFooterMenu.items",
22679
+ mode: "links-only",
22680
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
22681
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
22682
+ });
22683
+ const address = text({
22684
+ as: "address",
22685
+ className: "rb-not-italic rb-opacity-80"
22686
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
22687
+ const contact = stack({
22688
+ gap: "sm",
22689
+ className: "rb-items-start"
22690
+ }, [link({
22691
+ href: { $bind: { from: "contactLink.href" } },
22692
+ className: "rb-nav-text rb-break-words transition-theme-standard"
22693
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
22694
+ const hours = stack({
22695
+ gap: "sm",
22696
+ className: "rb-w-full"
22697
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
22698
+ as: "span",
22699
+ className: "rb-label"
22700
+ }, bind("hoursDay.weekday")), text({
22701
+ as: "span",
22702
+ className: "rb-caption rb-opacity-80"
22703
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
22704
+ as: "p",
22705
+ className: "rb-caption rb-opacity-70"
22706
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
22707
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
22708
+ href: { $bind: { from: "social.href" } },
22709
+ target: "_blank",
22710
+ rel: "noreferrer noopener",
22711
+ "aria-label": { $bind: { from: "social.label" } },
22712
+ className: "rb-nav-text transition-theme-standard"
22713
+ }, [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" }));
22714
+ const authoredCopy = richText({
22715
+ className: "rb-prose rb-prose-sm rb-max-w-none",
22716
+ style: textColorStyle("text/80")
22717
+ }, when("module.content"), bind("module.content", { transforms: [{
22718
+ id: "content.interpolateRichTextTokens",
22719
+ options: { tokens: ["year", "site_name"] }
22720
+ }] }));
22721
+ const footerGroup = stack({
22722
+ gap: "md",
22723
+ align: "stretch",
22724
+ className: "rb-min-w-0",
22725
+ "data-footer-group": { $bind: { from: "group.kind" } }
22726
+ }, [stack({
22727
+ gap: "md",
22728
+ align: "start",
22729
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
22320
22730
  }, [
22321
- inline({ className: { $bind: {
22322
- from: "$root.theme.footer.logo",
22323
- transforms: [{ id: "layout.footerSplitMainClass" }],
22324
- 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"
22325
- } } }, [stack({}, [footerNav({
22326
- collectionPath: "footerMenu.items",
22327
- mode: "flatten",
22328
- className: { $bind: {
22329
- from: "$root.theme.footer.navLayout",
22330
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
22331
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
22332
- } },
22333
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
22334
- })]), link({
22335
- href: "/",
22336
- className: { $bind: {
22337
- from: "$root.theme.footer.logo",
22338
- transforms: [{ id: "layout.footerLogoClass" }],
22339
- 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"
22340
- } }
22341
- }, [
22342
- media({ className: { $bind: {
22343
- from: "$root.theme.footer.logo",
22344
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22345
- fallback: "rb-w-auto"
22346
- } } }, when("content.logo"), bind("content.logo")),
22347
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22348
- from: "$root.theme.footer.logo",
22349
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22350
- fallback: "rb-w-auto"
22351
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22352
- text({
22353
- as: "strong",
22354
- className: "footer-logo-text rb-nav-text"
22355
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22356
- ])]),
22357
- ...businessAddressLayout(),
22358
- ...inlineBottomTextLayout()
22359
- ], when("$root.theme.footer.variant", { equals: "split" }));
22360
- const footerLayout = section({
22361
- background: "background",
22731
+ text({
22732
+ as: "h2",
22733
+ className: "rb-label",
22734
+ style: textColorStyle("text/70")
22735
+ }, bind("module.heading"), when("module.heading")),
22736
+ brandLogo,
22737
+ navigation,
22738
+ stack({
22739
+ gap: "sm",
22740
+ className: "rb-w-full"
22741
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
22742
+ address,
22743
+ contact,
22744
+ hours,
22745
+ socials,
22746
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
22747
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
22748
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
22749
+ const footerMainRegion = stack({
22750
+ className: { $bind: { from: "region.className" } },
22751
+ "data-footer-region": { $bind: { from: "region.kind" } }
22752
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
22753
+ const footerBottomRegion = stack({ className: { $bind: {
22754
+ from: "$root.theme.footer",
22755
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22756
+ fallback: "rb-w-full"
22757
+ } } }, [stack({
22362
22758
  className: { $bind: {
22363
22759
  from: "$root.theme.footer",
22364
- transforms: [{ id: "layout.footerRootClass" }],
22365
- fallback: "rb-w-full rb-border-t transition-theme"
22760
+ transforms: [{ id: "layout.footerBottomBarClass" }],
22761
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
22366
22762
  } },
22367
22763
  style: { $bind: {
22368
22764
  from: "$root.theme.footer",
22369
- transforms: [{ id: "layout.footerRootStyle" }],
22370
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22371
- } }
22372
- }, [
22373
- simpleFooterLayout,
22374
- columnsFooterLayout,
22375
- splitFooterLayout,
22376
- stack({
22377
- className: { $bind: {
22378
- from: "$root.theme.footer",
22379
- transforms: [{ id: "layout.footerBottomBarClass" }],
22380
- fallback: "rb-w-full rb-border-t rb-py-5"
22381
- } },
22382
- style: { $bind: {
22383
- from: "$root.theme.footer",
22384
- transforms: [{ id: "layout.footerBottomBarStyle" }]
22385
- } }
22386
- }, [stack({ className: { $bind: {
22387
- from: "$root.theme.footer",
22388
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22389
- fallback: "rb-container"
22390
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
22391
- ]);
22765
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
22766
+ } },
22767
+ "data-footer-region": "bottom"
22768
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
22392
22769
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
22393
22770
  id: "block.site-footer",
22394
22771
  title: "Site Footer",
22395
22772
  category: "layout",
22396
- fragments: [{
22397
- fragment: footerBottomTextFragment,
22398
- fieldPriority: 0
22399
- }],
22773
+ contentSource: { kind: "inline" },
22400
22774
  skipSectionStyles: true,
22401
- additionalFields: [{
22402
- id: "showBusinessAddress",
22403
- type: "boolean",
22404
- label: "Add business address to site footer?",
22405
- required: false,
22406
- defaultValue: false,
22407
- ui: { intent: "content" }
22408
- }],
22409
- layout: footerLayout,
22410
- description: "Site-wide footer with navigation links and optional columns.",
22775
+ layout: section({
22776
+ background: "background",
22777
+ className: { $bind: {
22778
+ from: "$root.theme.footer",
22779
+ transforms: [{ id: "layout.footerRootClass" }],
22780
+ fallback: "rb-w-full rb-border-t transition-theme"
22781
+ } },
22782
+ style: { $bind: {
22783
+ from: "$root.theme.footer",
22784
+ transforms: [{ id: "layout.footerRootStyle" }],
22785
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22786
+ } },
22787
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
22788
+ }, [footerMainRegion, footerBottomRegion]),
22789
+ description: "Site-wide composed footer with canonical shared details.",
22411
22790
  styleTokens: { spacing: "md" },
22412
22791
  paletteHidden: true
22413
22792
  }) };
@@ -22541,6 +22920,7 @@ const testimonialsBlockDefinition = {
22541
22920
  id: "block.testimonials",
22542
22921
  title: "Testimonials",
22543
22922
  category: "marketing",
22923
+ contentSource: { kind: "inline" },
22544
22924
  includeContainerStyles: true,
22545
22925
  previewCustomize: { quickFieldPriority: [
22546
22926
  "avatarLayout",
@@ -22699,6 +23079,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
22699
23079
  id: "block.columns",
22700
23080
  title: "Columns",
22701
23081
  category: "layout",
23082
+ contentSource: { kind: "inline" },
22702
23083
  additionalFields: [
22703
23084
  parseFieldDefinition({
22704
23085
  id: "equalHeight",
@@ -22885,7 +23266,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
22885
23266
  id: "boxStyles.all",
22886
23267
  options: {
22887
23268
  axis: "all",
22888
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
23269
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
22889
23270
  }
22890
23271
  }]
22891
23272
  },
@@ -22932,6 +23313,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
22932
23313
  id: "block.collection",
22933
23314
  title: "Collection",
22934
23315
  category: "layout",
23316
+ contentSource: { kind: "inline" },
22935
23317
  additionalFields: [
22936
23318
  parseFieldDefinition({
22937
23319
  id: "layout",
@@ -23168,6 +23550,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
23168
23550
  id: "block.feature-cards",
23169
23551
  title: "Feature Cards",
23170
23552
  category: "layout",
23553
+ contentSource: { kind: "inline" },
23171
23554
  includeContainerStyles: true,
23172
23555
  titleSource: "title",
23173
23556
  additionalFields: [
@@ -23551,6 +23934,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
23551
23934
  id: "block.media-text",
23552
23935
  title: "Media and Text",
23553
23936
  category: "layout",
23937
+ contentSource: { kind: "inline" },
23554
23938
  includeContainerStyles: true,
23555
23939
  titleSource: "title",
23556
23940
  previewCustomize: { quickFieldPriority: [
@@ -23951,6 +24335,7 @@ const appointmentBookingBlockDefinition = {
23951
24335
  paletteHidden: false
23952
24336
  },
23953
24337
  category: "interactive",
24338
+ contentSource: { kind: "inline" },
23954
24339
  tags: [
23955
24340
  "booking",
23956
24341
  "appointment",
@@ -24115,6 +24500,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
24115
24500
  paletteHidden: false
24116
24501
  },
24117
24502
  category: "interactive",
24503
+ contentSource: { kind: "inline" },
24118
24504
  tags: [
24119
24505
  "booking",
24120
24506
  "appointment",
@@ -25679,6 +26065,7 @@ const eventRegistrationBlockDefinition = {
25679
26065
  titleSource: "heading",
25680
26066
  description: "Multi-step event registration form",
25681
26067
  category: "interactive",
26068
+ contentSource: { kind: "inline" },
25682
26069
  tags: [
25683
26070
  "events",
25684
26071
  "registration",
@@ -25785,15 +26172,9 @@ const eventRegistrationBlockDefinition = {
25785
26172
  defaultValue: "Complete Registration",
25786
26173
  maxLength: 40
25787
26174
  },
25788
- {
25789
- id: "buttonVariant",
25790
- type: "select",
25791
- label: "Button style",
26175
+ createButtonVariantField({
25792
26176
  description: "Choose a button style from your theme",
25793
- required: false,
25794
- multiple: false,
25795
- defaultValue: "primary",
25796
- options: [
26177
+ variants: [
25797
26178
  {
25798
26179
  value: "primary",
25799
26180
  label: "Primary"
@@ -25806,9 +26187,8 @@ const eventRegistrationBlockDefinition = {
25806
26187
  value: "outline",
25807
26188
  label: "Outline"
25808
26189
  }
25809
- ],
25810
- ui: { intent: "style" }
25811
- }
26190
+ ]
26191
+ })
25812
26192
  ],
25813
26193
  layout: [styledSection({
25814
26194
  baseClass: "",
@@ -26001,6 +26381,7 @@ const courseRegistrationBlockDefinition = {
26001
26381
  titleSource: "heading",
26002
26382
  description: "Enrollment form for multi-session courses",
26003
26383
  category: "interactive",
26384
+ contentSource: { kind: "inline" },
26004
26385
  tags: [
26005
26386
  "courses",
26006
26387
  "enrollment",
@@ -26114,15 +26495,9 @@ const courseRegistrationBlockDefinition = {
26114
26495
  defaultValue: "Sign up",
26115
26496
  maxLength: 40
26116
26497
  },
26117
- {
26118
- id: "buttonVariant",
26119
- type: "select",
26120
- label: "Button style",
26498
+ createButtonVariantField({
26121
26499
  description: "Choose a button style from your theme",
26122
- required: false,
26123
- multiple: false,
26124
- defaultValue: "primary",
26125
- options: [
26500
+ variants: [
26126
26501
  {
26127
26502
  value: "primary",
26128
26503
  label: "Primary"
@@ -26135,9 +26510,8 @@ const courseRegistrationBlockDefinition = {
26135
26510
  value: "outline",
26136
26511
  label: "Outline"
26137
26512
  }
26138
- ],
26139
- ui: { intent: "style" }
26140
- }
26513
+ ]
26514
+ })
26141
26515
  ],
26142
26516
  layout: [styledSection({
26143
26517
  baseClass: "",
@@ -26217,6 +26591,7 @@ const eventDetailsManifest = createBlockManifest({
26217
26591
  titleSource: "heading",
26218
26592
  description: "Date/time, venue, map, and other dates for an event",
26219
26593
  category: "content",
26594
+ contentSource: { kind: "entries" },
26220
26595
  tags: [
26221
26596
  "events",
26222
26597
  "venue",
@@ -26422,6 +26797,7 @@ const courseDetailsBlockDefinition = {
26422
26797
  titleSource: "heading",
26423
26798
  description: "Schedule, venue, price, and enrollment status for a course",
26424
26799
  category: "content",
26800
+ contentSource: { kind: "entries" },
26425
26801
  tags: [
26426
26802
  "courses",
26427
26803
  "schedule",
@@ -26713,6 +27089,7 @@ const eventSpotlightBlockDefinition = {
26713
27089
  paletteHidden: false
26714
27090
  },
26715
27091
  category: "content",
27092
+ contentSource: { kind: "entries" },
26716
27093
  tags: [
26717
27094
  "events",
26718
27095
  "featured",
@@ -27259,6 +27636,7 @@ const eventListingBlockDefinition = {
27259
27636
  paletteHidden: true
27260
27637
  },
27261
27638
  category: "interactive",
27639
+ contentSource: { kind: "entries" },
27262
27640
  tags: [
27263
27641
  "events",
27264
27642
  "listing",
@@ -28431,6 +28809,7 @@ const eventCalendarBlockDefinition = {
28431
28809
  paletteHidden: false
28432
28810
  },
28433
28811
  category: "interactive",
28812
+ contentSource: { kind: "entries" },
28434
28813
  tags: [
28435
28814
  "events",
28436
28815
  "calendar",
@@ -28828,6 +29207,7 @@ const recurringScheduleBlockDefinition = {
28828
29207
  titleSource: "heading",
28829
29208
  description: "A compact weekly schedule with one row per recurring series.",
28830
29209
  category: "interactive",
29210
+ contentSource: { kind: "entries" },
28831
29211
  icon: "CalendarDays",
28832
29212
  tags: [
28833
29213
  "schedule",
@@ -29245,7 +29625,10 @@ const offeringsPreviewFields = [
29245
29625
  label: "Link"
29246
29626
  }
29247
29627
  ],
29248
- ui: { intent: "display" }
29628
+ ui: {
29629
+ intent: "display",
29630
+ widget: "buttonVariant"
29631
+ }
29249
29632
  },
29250
29633
  {
29251
29634
  id: "buttonText",
@@ -29298,6 +29681,7 @@ const offeringsPreviewManifest = createBlockManifest({
29298
29681
  paletteHidden: false
29299
29682
  },
29300
29683
  category: "content",
29684
+ contentSource: { kind: "mixed" },
29301
29685
  tags: [
29302
29686
  "offerings",
29303
29687
  "events",
@@ -29466,6 +29850,7 @@ const embedManifest = createBlockManifest({
29466
29850
  id: "block.embed",
29467
29851
  title: "Embed Content",
29468
29852
  category: "content",
29853
+ contentSource: { kind: "entries" },
29469
29854
  titleSource: "heading",
29470
29855
  additionalFields: [
29471
29856
  parseFieldDefinition({
@@ -29953,6 +30338,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
29953
30338
  id: "block.image-gallery",
29954
30339
  title: "Image Gallery",
29955
30340
  category: "content",
30341
+ contentSource: { kind: "inline" },
29956
30342
  previewCustomize: { quickFieldPriority: [
29957
30343
  "aspectRatio",
29958
30344
  "slidesToShow",
@@ -30605,6 +30991,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
30605
30991
  id: "block.video-grid",
30606
30992
  title: "Video Grid",
30607
30993
  category: "media",
30994
+ contentSource: { kind: "inline" },
30608
30995
  skipSectionStyles: true,
30609
30996
  additionalFields: parseFieldDefinitions([
30610
30997
  {
@@ -30775,6 +31162,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
30775
31162
  title: "Audio Player",
30776
31163
  titleSource: "title",
30777
31164
  category: "media",
31165
+ contentSource: { kind: "inline" },
30778
31166
  description: "Add a branded audio player for a single track.",
30779
31167
  tags: [
30780
31168
  "audio",
@@ -30886,6 +31274,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
30886
31274
  title: "File Download",
30887
31275
  titleSource: ["title", "file.filename"],
30888
31276
  category: "media",
31277
+ contentSource: { kind: "inline" },
30889
31278
  description: "Add a simple public download link for a document, ZIP, or audio file.",
30890
31279
  tags: [
30891
31280
  "file",
@@ -31830,6 +32219,7 @@ const shopBlockDefinition = {
31830
32219
  paletteHidden: false
31831
32220
  },
31832
32221
  category: "interactive",
32222
+ contentSource: { kind: "entries" },
31833
32223
  tags: [
31834
32224
  "shop",
31835
32225
  "passes",
@@ -32029,6 +32419,7 @@ const productListBlockDefinition = {
32029
32419
  paletteHidden: false
32030
32420
  },
32031
32421
  category: "interactive",
32422
+ contentSource: { kind: "entries" },
32032
32423
  tags: [
32033
32424
  "shop",
32034
32425
  "products",
@@ -32170,6 +32561,7 @@ const productDetailBlockDefinition = {
32170
32561
  paletteHidden: false
32171
32562
  },
32172
32563
  category: "interactive",
32564
+ contentSource: { kind: "entries" },
32173
32565
  tags: [
32174
32566
  "shop",
32175
32567
  "product",
@@ -32286,6 +32678,7 @@ const cartBlockDefinition = {
32286
32678
  paletteHidden: false
32287
32679
  },
32288
32680
  category: "interactive",
32681
+ contentSource: { kind: "inline" },
32289
32682
  tags: [
32290
32683
  "shop",
32291
32684
  "cart",
@@ -32368,6 +32761,7 @@ const checkoutBlockDefinition = {
32368
32761
  paletteHidden: false
32369
32762
  },
32370
32763
  category: "interactive",
32764
+ contentSource: { kind: "inline" },
32371
32765
  tags: [
32372
32766
  "shop",
32373
32767
  "checkout",
@@ -32571,6 +32965,7 @@ const giftingBlockDefinition = {
32571
32965
  paletteHidden: false
32572
32966
  },
32573
32967
  category: "interactive",
32968
+ contentSource: { kind: "entries" },
32574
32969
  tags: [
32575
32970
  "gifting",
32576
32971
  "gift cards",
@@ -32914,6 +33309,7 @@ const newsletterSignupBlockDefinition = {
32914
33309
  titleSource: "title",
32915
33310
  description: "Newsletter subscription form with configurable field presets.",
32916
33311
  category: "interactive",
33312
+ contentSource: { kind: "inline" },
32917
33313
  fragments: [{
32918
33314
  fragment: newsletterCopyFragment,
32919
33315
  fieldPriority: 0
@@ -33095,6 +33491,7 @@ const teamMembersBlockDefinition = {
33095
33491
  id: "block.team-members",
33096
33492
  title: "Team Members",
33097
33493
  category: "content",
33494
+ contentSource: { kind: "mixed" },
33098
33495
  titleSource: "heading",
33099
33496
  additionalFields: [
33100
33497
  parseFieldDefinition({
@@ -33515,6 +33912,7 @@ const locationMapBlockDefinition = {
33515
33912
  titleSource: "heading",
33516
33913
  description: "Show a business location with an interactive map and directions link.",
33517
33914
  category: "content",
33915
+ contentSource: { kind: "inline" },
33518
33916
  tags: [
33519
33917
  "map",
33520
33918
  "location",
@@ -34630,9 +35028,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
34630
35028
  ].filter(Boolean).join(" ");
34631
35029
  }
34632
35030
  function gradientPresetCss(value) {
34633
- if (!isString(value)) return null;
34634
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
34635
- if (!preset) return null;
35031
+ const presetId = parseGradientPresetId(value);
35032
+ if (!presetId) return null;
35033
+ const preset = getGradientPreset(presetId);
34636
35034
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
34637
35035
  }
34638
35036
  const backgroundTransforms = [
@@ -34671,16 +35069,17 @@ const backgroundTransforms = [
34671
35069
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
34672
35070
  },
34673
35071
  {
34674
- id: "background.resolveAllowOverflow",
35072
+ id: "background.resolveFrameClassName",
34675
35073
  kind: "formatter",
34676
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
34677
- run: (value) => {
34678
- if (!value || typeof value !== "object") return false;
35074
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
35075
+ run: (value, options) => {
35076
+ const baseClass = options?.baseClass?.trim() ?? "";
35077
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
34679
35078
  const input = value;
34680
- if (input.overflow === true) return true;
35079
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
34681
35080
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
34682
35081
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
34683
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
35082
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
34684
35083
  }
34685
35084
  },
34686
35085
  {
@@ -35753,6 +36152,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
35753
36152
  "already_refunded",
35754
36153
  "idempotency_amount_mismatch",
35755
36154
  "idempotency_method_mismatch",
36155
+ "idempotency_receipt_mismatch",
35756
36156
  "refund_in_progress"
35757
36157
  ],
35758
36158
  "invalid_amount",
@@ -35765,7 +36165,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
35765
36165
  "payment_intent_not_found",
35766
36166
  "stripe_error",
35767
36167
  "stale_pending_missing_context",
35768
- "non_refundable_deposit_remaining"
36168
+ "non_refundable_deposit_remaining",
36169
+ "deposit_refund_override_required",
36170
+ "refund_revoke_requires_full_line_refund",
36171
+ "payment_receipt_not_found",
36172
+ "payment_receipt_not_refundable",
36173
+ "payment_receipt_attribution_required"
35769
36174
  ];
35770
36175
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
35771
36176
  //#endregion
@@ -35778,7 +36183,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
35778
36183
  "missing_credit_customer",
35779
36184
  "deposit_refund_override_required",
35780
36185
  "refund_revoke_requires_full_line_refund",
35781
- "unified_order_link_required"
36186
+ "unified_order_link_required",
36187
+ "payment_receipt_not_found",
36188
+ "payment_receipt_not_refundable",
36189
+ "payment_receipt_attribution_required"
35782
36190
  ];
35783
36191
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
35784
36192
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];