@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
@@ -2,7 +2,6 @@
2
2
  import { use, useEffect, useState } from "react";
3
3
  import z, { z as z$1 } from "zod";
4
4
  import "react/jsx-runtime";
5
- //#region ../api/src/apiEndpointTypes.ts
6
5
  function blockedDemoMutationPolicy(classification, publicMessage) {
7
6
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
8
7
  return {
@@ -30,6 +29,7 @@ const TAG_TEMPLATES = {
30
29
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
31
30
  routeById: "riverbank:route:{routeId}",
32
31
  pageById: "riverbank:page:{pageId}",
32
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
33
33
  workflowRunById: "riverbank:workflow-run:{runId}",
34
34
  siteForms: "riverbank:site:{siteId}:forms",
35
35
  formById: "riverbank:form:{formId}",
@@ -53,7 +53,7 @@ const TAG_TEMPLATES = {
53
53
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
54
54
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
55
55
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
56
- 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;
56
+ 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;
57
57
  //#endregion
58
58
  //#region ../core/src/result.ts
59
59
  function ok(value) {
@@ -211,19 +211,29 @@ function isRecord$9(value) {
211
211
  //#region ../core/src/booking-date-time.ts
212
212
  const DEFAULT_LOCALE = "en-US";
213
213
  const FALLBACK_TIMEZONE = "UTC";
214
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
215
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
216
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
214
217
  function isValidTimeZone(timeZone) {
218
+ const cached = timeZoneValidityCache.get(timeZone);
219
+ if (cached !== void 0) return cached;
220
+ let isValid;
215
221
  try {
216
222
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
217
- return true;
223
+ isValid = true;
218
224
  } catch {
219
- return false;
225
+ isValid = false;
220
226
  }
227
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
228
+ timeZoneValidityCache.set(timeZone, isValid);
229
+ return isValid;
221
230
  }
222
231
  function getSafeTimeZone(timeZone) {
223
232
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
224
233
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
225
234
  }
226
235
  function parseStrictBookingTimeZone(timeZone) {
236
+ if (typeof timeZone !== "string") return null;
227
237
  const normalized = timeZone.trim();
228
238
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
229
239
  return normalized;
@@ -236,10 +246,19 @@ function formatParseError(error) {
236
246
  }
237
247
  }
238
248
  function formatToPartsLookup(date, locale, timeZone, format) {
239
- return new Map(new Intl.DateTimeFormat(locale, {
249
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
250
+ }
251
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
252
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
253
+ const cached = dateTimeFormatterCache.get(key);
254
+ if (cached !== void 0) return cached;
255
+ const formatter = new Intl.DateTimeFormat(locale, {
240
256
  ...format,
241
257
  timeZone
242
- }).formatToParts(date).map((part) => [part.type, part.value]));
258
+ });
259
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
260
+ dateTimeFormatterCache.set(key, formatter);
261
+ return formatter;
243
262
  }
244
263
  function getZonedDateTimeParts(date, timeZone) {
245
264
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -282,23 +301,9 @@ function toUtcIsoDateTimeString(value) {
282
301
  return parsed.value;
283
302
  }
284
303
  function parseScheduledBookingDateTime(input) {
304
+ let startsAt;
285
305
  try {
286
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
287
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
288
- if (timeZone === null) return {
289
- ok: false,
290
- field: "timeZone",
291
- reason: "invalid_time_zone",
292
- value: input.timeZone
293
- };
294
- return {
295
- ok: true,
296
- value: {
297
- startsAt,
298
- timeZone,
299
- locale: input.locale
300
- }
301
- };
306
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
302
307
  } catch {
303
308
  return {
304
309
  ok: false,
@@ -307,6 +312,21 @@ function parseScheduledBookingDateTime(input) {
307
312
  value: input.startsAt
308
313
  };
309
314
  }
315
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
316
+ if (timeZone === null) return {
317
+ ok: false,
318
+ field: "timeZone",
319
+ reason: "invalid_time_zone",
320
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
321
+ };
322
+ return {
323
+ ok: true,
324
+ value: {
325
+ startsAt,
326
+ timeZone,
327
+ locale: input.locale
328
+ }
329
+ };
310
330
  }
311
331
  function toScheduledBookingDateTime(input) {
312
332
  const result = parseScheduledBookingDateTime(input);
@@ -3436,6 +3456,111 @@ const mediaSchema$1 = z.object({
3436
3456
  transform: transformSchema$1.optional()
3437
3457
  });
3438
3458
  //#endregion
3459
+ //#region ../theme-core/src/buttons/effectClassification.ts
3460
+ /**
3461
+ * Exhaustive live policy for every registered effect id.
3462
+ *
3463
+ * The resolver consumes the transition payload directly, so adding an effect
3464
+ * cannot update classification without also defining its runtime behavior.
3465
+ */
3466
+ const BUTTON_EFFECT_POLICIES = {
3467
+ "darken-background": {
3468
+ classification: "colour-transition",
3469
+ transition: {
3470
+ kind: "adjust-shade",
3471
+ direction: "darker"
3472
+ }
3473
+ },
3474
+ "lighten-background": {
3475
+ classification: "colour-transition",
3476
+ transition: {
3477
+ kind: "adjust-shade",
3478
+ direction: "lighter"
3479
+ }
3480
+ },
3481
+ "background-on-hover": {
3482
+ classification: "colour-transition",
3483
+ transition: { kind: "replace-background" }
3484
+ },
3485
+ "background-on-hover-alpha": {
3486
+ classification: "unsupported-colour",
3487
+ reason: "alpha_requires_surface"
3488
+ },
3489
+ "fade-background": {
3490
+ classification: "unsupported-colour",
3491
+ reason: "changes_element_opacity"
3492
+ },
3493
+ "opacity-reduce": {
3494
+ classification: "unsupported-colour",
3495
+ reason: "changes_element_opacity"
3496
+ },
3497
+ "gradient-text": {
3498
+ classification: "unsupported-colour",
3499
+ reason: "changes_foreground"
3500
+ },
3501
+ "text-color-change": {
3502
+ classification: "unsupported-colour",
3503
+ reason: "changes_foreground"
3504
+ },
3505
+ "border-color-change": {
3506
+ classification: "unsupported-colour",
3507
+ reason: "changes_border"
3508
+ },
3509
+ "aurora-glow": {
3510
+ classification: "unsupported-background-overlay",
3511
+ reason: "unresolved_background_overlay"
3512
+ },
3513
+ "cosmic-stardust": {
3514
+ classification: "unsupported-background-overlay",
3515
+ reason: "unresolved_background_overlay"
3516
+ },
3517
+ "gradient-border-fill": {
3518
+ classification: "unsupported-background-overlay",
3519
+ reason: "unresolved_background_overlay"
3520
+ },
3521
+ "animated-gradient-border-fill": {
3522
+ classification: "unsupported-background-overlay",
3523
+ reason: "unresolved_background_overlay"
3524
+ },
3525
+ "nav-underline": {
3526
+ classification: "not-button",
3527
+ reason: "not_button_effect"
3528
+ },
3529
+ "nav-frosted-base": {
3530
+ classification: "not-button",
3531
+ reason: "not_button_effect"
3532
+ },
3533
+ "nav-frosted-hover": {
3534
+ classification: "not-button",
3535
+ reason: "not_button_effect"
3536
+ },
3537
+ "nav-frosted-active": {
3538
+ classification: "not-button",
3539
+ reason: "not_button_effect"
3540
+ },
3541
+ "animated-gradient": { classification: "non-colour" },
3542
+ "border-glow": { classification: "non-colour" },
3543
+ "drop-shadow": { classification: "non-colour" },
3544
+ "inner-shadow": { classification: "non-colour" },
3545
+ "neumorphic-shadow": { classification: "non-colour" },
3546
+ "outer-glow": { classification: "non-colour" },
3547
+ "retro-3d-shadow": { classification: "non-colour" },
3548
+ "scale-up": { classification: "non-colour" },
3549
+ "scale-down": { classification: "non-colour" },
3550
+ lift: { classification: "non-colour" },
3551
+ "press-down": { classification: "non-colour" },
3552
+ pop: { classification: "non-colour" },
3553
+ "border-bottom-grow": { classification: "non-colour" },
3554
+ "sketchy-border": { classification: "non-colour" },
3555
+ "pulse-animation": { classification: "non-colour" }
3556
+ };
3557
+ function getButtonEffectPolicy(effectId) {
3558
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
3559
+ }
3560
+ function classifyButtonEffectId(effectId) {
3561
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
3562
+ }
3563
+ //#endregion
3439
3564
  //#region ../theme-core/src/buttons/types.ts
3440
3565
  /**
3441
3566
  * Standard semantic variant roles a theme exposes.
@@ -3452,6 +3577,20 @@ const VARIANT_ROLES = [
3452
3577
  "tertiary",
3453
3578
  "accent"
3454
3579
  ];
3580
+ function parseOpaqueButtonColourToken(value) {
3581
+ const token = parseThemeColorToken(value);
3582
+ if (token === null) return null;
3583
+ const parts = parseColorTokenParts(token);
3584
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
3585
+ }
3586
+ function unsafeAsOpaqueButtonColourToken(value) {
3587
+ return value;
3588
+ }
3589
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
3590
+ const token = parseOpaqueButtonColourToken(value);
3591
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3592
+ return token;
3593
+ });
3455
3594
  const cornerStyleSchema = z$1.enum([
3456
3595
  "square",
3457
3596
  "rounded",
@@ -3553,7 +3692,7 @@ const buttonSizesSchema = z$1.object({
3553
3692
  lg,
3554
3693
  xl: xl ?? lg
3555
3694
  }));
3556
- const buttonGlobalSettingsSchema = z$1.object({
3695
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
3557
3696
  cornerStyle: cornerStyleSchema,
3558
3697
  cornerRadius: z$1.number().min(0).max(24).optional(),
3559
3698
  /**
@@ -3584,11 +3723,12 @@ const buttonGlobalSettingsSchema = z$1.object({
3584
3723
  paddingPreset: buttonPaddingPresetSchema.optional(),
3585
3724
  hoverTransform: hoverTransformSchema,
3586
3725
  hoverColor: hoverColorSchema,
3587
- hoverColorToken: themeColorTokenSchema.optional(),
3726
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
3588
3727
  gradientStyle: gradientStyleSchema.optional(),
3589
3728
  gradientAngle: z$1.number().min(0).max(360).optional(),
3590
3729
  gradientSharpness: gradientSharpnessSchema.optional()
3591
3730
  });
3731
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
3592
3732
  const gradientDirectionSchema$1 = z$1.enum([
3593
3733
  "to-r",
3594
3734
  "to-l",
@@ -3602,27 +3742,33 @@ const gradientDirectionSchema$1 = z$1.enum([
3602
3742
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
3603
3743
  z$1.object({
3604
3744
  type: z$1.literal("solid"),
3605
- colorToken: themeColorTokenSchema
3745
+ colorToken: opaqueButtonColourTokenSchema
3606
3746
  }),
3607
3747
  z$1.object({
3608
3748
  type: z$1.literal("gradient"),
3609
- stops: z$1.array(themeColorTokenSchema).min(2),
3610
- direction: gradientDirectionSchema$1
3749
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
3750
+ const [first, second, ...rest] = stops;
3751
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
3752
+ return [
3753
+ first,
3754
+ second,
3755
+ ...rest
3756
+ ];
3757
+ }),
3758
+ direction: gradientDirectionSchema$1,
3759
+ foregroundToken: opaqueButtonColourTokenSchema
3611
3760
  }),
3612
- z$1.object({ type: z$1.literal("transparent") })
3761
+ z$1.object({
3762
+ type: z$1.literal("surface"),
3763
+ role: z$1.literal("link")
3764
+ })
3613
3765
  ]);
3614
3766
  const effectApplicationSchema$1 = z$1.object({
3615
3767
  effectId: z$1.string(),
3616
- options: z$1.record(z$1.string(), z$1.any()).optional()
3617
- });
3618
- const buttonBorderSchema = z$1.object({
3619
- widthClass: z$1.string(),
3620
- colorToken: themeColorTokenSchema
3621
- });
3622
- const buttonVariantAffordanceSchema = z$1.object({
3623
- iconId: z$1.string().min(1),
3624
- colorToken: themeColorTokenSchema.optional()
3768
+ options: z$1.record(z$1.string(), z$1.json()).optional()
3625
3769
  });
3770
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
3771
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
3626
3772
  const variantShadowSchema = z$1.object({
3627
3773
  elevation: z$1.enum([
3628
3774
  "none",
@@ -3663,27 +3809,170 @@ const variantSizeOverridesSchema = z$1.object({
3663
3809
  * default (e.g. link-style variants declaring zero horizontal padding at
3664
3810
  * every size).
3665
3811
  */
3666
- const buttonVariantSchema = z$1.object({
3812
+ const canonicalButtonVariantSchema = z$1.object({
3667
3813
  id: z$1.string(),
3668
3814
  name: z$1.string().min(1).max(20),
3669
3815
  enabled: z$1.boolean(),
3670
3816
  priority: prioritySchema,
3671
3817
  background: buttonBackgroundSchema,
3672
- textColorToken: themeColorTokenSchema,
3673
3818
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
3674
3819
  borderRadius: z$1.string().optional(),
3675
3820
  shadow: variantShadowSchema.optional(),
3676
3821
  border: buttonBorderSchema.optional(),
3677
- hoverBackgroundToken: z$1.string().optional(),
3822
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
3678
3823
  effects: variantEffectsSchema.optional(),
3679
3824
  sizes: variantSizeOverridesSchema.optional(),
3680
3825
  affordance: buttonVariantAffordanceSchema.optional()
3681
3826
  });
3827
+ /**
3828
+ * Temporary persisted-theme admission boundary for issue #1206.
3829
+ *
3830
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
3831
+ * `textColorToken`/border colour shape. New source and all downstream code use
3832
+ * only the canonical relationship. Delete this preprocessor after the reviewed
3833
+ * production rewrite reports zero legacy rows.
3834
+ */
3835
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
3682
3836
  const buttonSystemSchema = z$1.object({
3683
3837
  global: buttonGlobalSettingsSchema,
3684
3838
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
3685
3839
  sizes: buttonSizesSchema.optional()
3686
3840
  });
3841
+ function normalizeLegacyButtonVariantInput(input) {
3842
+ if (!isUnknownRecord(input)) return input;
3843
+ const background = input.background;
3844
+ if (!isUnknownRecord(background)) return input;
3845
+ 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;
3846
+ const { textColorToken, ...withoutLegacyText } = input;
3847
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
3848
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
3849
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
3850
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
3851
+ if (background.type === "transparent") return {
3852
+ ...withoutLegacyText,
3853
+ background: {
3854
+ type: "surface",
3855
+ role: "link"
3856
+ },
3857
+ border: normalizedBorder,
3858
+ affordance: normalizedAffordance,
3859
+ effects: normalizedEffects,
3860
+ hoverBackgroundToken
3861
+ };
3862
+ if (background.type === "gradient") {
3863
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
3864
+ return {
3865
+ ...withoutLegacyText,
3866
+ background: {
3867
+ ...background,
3868
+ stops,
3869
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
3870
+ },
3871
+ border: normalizedBorder,
3872
+ affordance: normalizedAffordance,
3873
+ effects: normalizedEffects,
3874
+ hoverBackgroundToken
3875
+ };
3876
+ }
3877
+ return {
3878
+ ...withoutLegacyText,
3879
+ background: background.type === "solid" ? {
3880
+ ...background,
3881
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
3882
+ } : background,
3883
+ border: normalizedBorder,
3884
+ affordance: normalizedAffordance,
3885
+ effects: normalizedEffects,
3886
+ hoverBackgroundToken
3887
+ };
3888
+ }
3889
+ function normalizeLegacyButtonGlobalInput(input) {
3890
+ if (!isUnknownRecord(input)) return input;
3891
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
3892
+ return hoverColorToken === input.hoverColorToken ? input : {
3893
+ ...input,
3894
+ hoverColorToken
3895
+ };
3896
+ }
3897
+ function hasLegacyAlphaToken(input, background) {
3898
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
3899
+ return [
3900
+ input.hoverBackgroundToken,
3901
+ background.colorToken,
3902
+ background.foregroundToken,
3903
+ ...stops
3904
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
3905
+ }
3906
+ function stripLegacyTokenAlpha(value) {
3907
+ if (typeof value !== "string") return value;
3908
+ const slashIndex = value.indexOf("/");
3909
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
3910
+ }
3911
+ function hasLegacyButtonEffects(input) {
3912
+ if (!isUnknownRecord(input)) return false;
3913
+ return [
3914
+ "base",
3915
+ "hover",
3916
+ "active",
3917
+ "focus"
3918
+ ].some((state) => {
3919
+ const effects = input[state];
3920
+ return Array.isArray(effects) && effects.some((effect) => {
3921
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
3922
+ const classification = classifyButtonEffectId(effect.effectId);
3923
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
3924
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
3925
+ });
3926
+ });
3927
+ }
3928
+ function normalizeLegacyButtonEffects(input, backgroundType) {
3929
+ if (!isUnknownRecord(input)) return input;
3930
+ const normalized = {};
3931
+ for (const state of [
3932
+ "base",
3933
+ "hover",
3934
+ "active",
3935
+ "focus"
3936
+ ]) {
3937
+ const effects = input[state];
3938
+ if (!Array.isArray(effects)) continue;
3939
+ const safeEffects = effects.flatMap((effect) => {
3940
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
3941
+ const classification = classifyButtonEffectId(effect.effectId);
3942
+ if (classification === "non-colour") return [effect];
3943
+ if (classification !== "colour-transition") return [];
3944
+ if (effect.effectId === "background-on-hover") {
3945
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
3946
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
3947
+ return colorToken === null ? [] : [{
3948
+ ...effect,
3949
+ options: {
3950
+ ...options,
3951
+ colorToken
3952
+ }
3953
+ }];
3954
+ }
3955
+ if (backgroundType !== "solid") return [];
3956
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
3957
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
3958
+ return [{
3959
+ ...effect,
3960
+ options: {
3961
+ ...isUnknownRecord(effect.options) ? effect.options : {},
3962
+ amount
3963
+ }
3964
+ }];
3965
+ });
3966
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
3967
+ }
3968
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
3969
+ }
3970
+ function isUnknownRecord(value) {
3971
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3972
+ }
3973
+ function isUnknownArray(value) {
3974
+ return Array.isArray(value);
3975
+ }
3687
3976
  buttonSizeNameSchema.options;
3688
3977
  //#endregion
3689
3978
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -3710,7 +3999,7 @@ function defineButtonPersonality(input) {
3710
3999
  name: input.name,
3711
4000
  description: input.description,
3712
4001
  tags: input.tags,
3713
- buttonSystem: input.buttonSystem
4002
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
3714
4003
  };
3715
4004
  }
3716
4005
  //#endregion
@@ -3763,19 +4052,15 @@ const brushedWash = defineButtonPersonality({
3763
4052
  background: {
3764
4053
  type: "gradient",
3765
4054
  stops: ["primary", "accent"],
3766
- direction: "to-r"
4055
+ direction: "to-r",
4056
+ foregroundToken: "primaryForeground"
3767
4057
  },
3768
- textColorToken: "primaryForeground",
3769
4058
  borderRadius: "rounded-lg",
3770
4059
  shadow: {
3771
4060
  elevation: "low",
3772
4061
  softness: "soft",
3773
4062
  position: "bottom"
3774
- },
3775
- effects: { hover: [{
3776
- effectId: "opacity-reduce",
3777
- options: { reduction: -15 }
3778
- }] }
4063
+ }
3779
4064
  },
3780
4065
  {
3781
4066
  id: "secondary",
@@ -3785,32 +4070,27 @@ const brushedWash = defineButtonPersonality({
3785
4070
  background: {
3786
4071
  type: "gradient",
3787
4072
  stops: ["secondary", "accent"],
3788
- direction: "to-br"
4073
+ direction: "to-br",
4074
+ foregroundToken: "primaryForeground"
3789
4075
  },
3790
- textColorToken: "primaryForeground",
3791
4076
  borderRadius: "rounded-lg",
3792
4077
  shadow: {
3793
4078
  elevation: "low",
3794
4079
  softness: "soft",
3795
4080
  position: "bottom"
3796
- },
3797
- effects: { hover: [{
3798
- effectId: "opacity-reduce",
3799
- options: { reduction: -15 }
3800
- }] }
4081
+ }
3801
4082
  },
3802
4083
  {
3803
4084
  id: "outline",
3804
4085
  name: "Outline",
3805
4086
  enabled: true,
3806
4087
  priority: 3,
3807
- background: { type: "transparent" },
3808
- textColorToken: "primary",
3809
- borderRadius: "rounded-lg",
3810
- border: {
3811
- widthClass: "border",
3812
- colorToken: "primary"
4088
+ background: {
4089
+ type: "surface",
4090
+ role: "link"
3813
4091
  },
4092
+ borderRadius: "rounded-lg",
4093
+ border: { widthClass: "border" },
3814
4094
  effects: { hover: [{
3815
4095
  effectId: "background-on-hover",
3816
4096
  options: { colorToken: "surface" }
@@ -3821,8 +4101,10 @@ const brushedWash = defineButtonPersonality({
3821
4101
  name: "Ghost",
3822
4102
  enabled: true,
3823
4103
  priority: 3,
3824
- background: { type: "transparent" },
3825
- textColorToken: "text",
4104
+ background: {
4105
+ type: "surface",
4106
+ role: "link"
4107
+ },
3826
4108
  borderRadius: "rounded-lg",
3827
4109
  effects: { hover: [{
3828
4110
  effectId: "background-on-hover",
@@ -3868,7 +4150,6 @@ const confidentChip = defineButtonPersonality({
3868
4150
  type: "solid",
3869
4151
  colorToken: "primary"
3870
4152
  },
3871
- textColorToken: "primaryForeground",
3872
4153
  borderRadius: "rounded-md",
3873
4154
  shadow: {
3874
4155
  elevation: "medium",
@@ -3878,7 +4159,7 @@ const confidentChip = defineButtonPersonality({
3878
4159
  effects: {
3879
4160
  hover: [{
3880
4161
  effectId: "darken-background",
3881
- options: { amount: 60 }
4162
+ options: { amount: 100 }
3882
4163
  }],
3883
4164
  active: [{
3884
4165
  effectId: "scale-down",
@@ -3895,12 +4176,8 @@ const confidentChip = defineButtonPersonality({
3895
4176
  type: "solid",
3896
4177
  colorToken: "surface"
3897
4178
  },
3898
- textColorToken: "text",
3899
4179
  borderRadius: "rounded-md",
3900
- border: {
3901
- widthClass: "border",
3902
- colorToken: "border"
3903
- },
4180
+ border: { widthClass: "border" },
3904
4181
  effects: { hover: [{
3905
4182
  effectId: "background-on-hover",
3906
4183
  options: { colorToken: "background" }
@@ -3911,13 +4188,12 @@ const confidentChip = defineButtonPersonality({
3911
4188
  name: "Outline",
3912
4189
  enabled: true,
3913
4190
  priority: 3,
3914
- background: { type: "transparent" },
3915
- textColorToken: "primary",
3916
- borderRadius: "rounded-md",
3917
- border: {
3918
- widthClass: "border",
3919
- colorToken: "primary"
4191
+ background: {
4192
+ type: "surface",
4193
+ role: "link"
3920
4194
  },
4195
+ borderRadius: "rounded-md",
4196
+ border: { widthClass: "border" },
3921
4197
  effects: { hover: [{
3922
4198
  effectId: "background-on-hover",
3923
4199
  options: { colorToken: "surface" }
@@ -3928,8 +4204,10 @@ const confidentChip = defineButtonPersonality({
3928
4204
  name: "Ghost",
3929
4205
  enabled: true,
3930
4206
  priority: 3,
3931
- background: { type: "transparent" },
3932
- textColorToken: "primary",
4207
+ background: {
4208
+ type: "surface",
4209
+ role: "link"
4210
+ },
3933
4211
  borderRadius: "rounded-md",
3934
4212
  effects: { hover: [{
3935
4213
  effectId: "background-on-hover",
@@ -3992,7 +4270,6 @@ const earthPill = defineButtonPersonality({
3992
4270
  type: "solid",
3993
4271
  colorToken: "primary"
3994
4272
  },
3995
- textColorToken: "primaryForeground",
3996
4273
  borderRadius: "rounded-full",
3997
4274
  shadow: {
3998
4275
  elevation: "low",
@@ -4018,13 +4295,12 @@ const earthPill = defineButtonPersonality({
4018
4295
  name: "Secondary",
4019
4296
  enabled: true,
4020
4297
  priority: 2,
4021
- background: { type: "transparent" },
4022
- textColorToken: "primary",
4023
- borderRadius: "rounded-full",
4024
- border: {
4025
- widthClass: "border",
4026
- colorToken: "primary"
4298
+ background: {
4299
+ type: "surface",
4300
+ role: "link"
4027
4301
  },
4302
+ borderRadius: "rounded-full",
4303
+ border: { widthClass: "border" },
4028
4304
  effects: { hover: [{
4029
4305
  effectId: "background-on-hover",
4030
4306
  options: { colorToken: "muted" }
@@ -4035,13 +4311,12 @@ const earthPill = defineButtonPersonality({
4035
4311
  name: "Outline",
4036
4312
  enabled: true,
4037
4313
  priority: 3,
4038
- background: { type: "transparent" },
4039
- textColorToken: "text",
4040
- borderRadius: "rounded-full",
4041
- border: {
4042
- widthClass: "border",
4043
- colorToken: "border"
4314
+ background: {
4315
+ type: "surface",
4316
+ role: "link"
4044
4317
  },
4318
+ borderRadius: "rounded-full",
4319
+ border: { widthClass: "border" },
4045
4320
  effects: { hover: [{
4046
4321
  effectId: "background-on-hover",
4047
4322
  options: { colorToken: "surfaceAlt" }
@@ -4052,8 +4327,10 @@ const earthPill = defineButtonPersonality({
4052
4327
  name: "Ghost",
4053
4328
  enabled: true,
4054
4329
  priority: 3,
4055
- background: { type: "transparent" },
4056
- textColorToken: "primary",
4330
+ background: {
4331
+ type: "surface",
4332
+ role: "link"
4333
+ },
4057
4334
  borderRadius: "rounded-full",
4058
4335
  shadow: {
4059
4336
  elevation: "none",
@@ -4074,11 +4351,7 @@ const earthPill = defineButtonPersonality({
4074
4351
  padding: "0.625rem 0",
4075
4352
  fontSize: "text-xl"
4076
4353
  }
4077
- },
4078
- effects: { hover: [{
4079
- effectId: "opacity-reduce",
4080
- options: { reduction: 25 }
4081
- }] }
4354
+ }
4082
4355
  }
4083
4356
  ]
4084
4357
  }
@@ -4114,8 +4387,10 @@ const editorialLink = defineButtonPersonality({
4114
4387
  name: "Primary",
4115
4388
  enabled: true,
4116
4389
  priority: 1,
4117
- background: { type: "transparent" },
4118
- textColorToken: "text",
4390
+ background: {
4391
+ type: "surface",
4392
+ role: "link"
4393
+ },
4119
4394
  borderRadius: "rounded-none",
4120
4395
  sizes: {
4121
4396
  sm: { padding: "0.25rem 0" },
@@ -4137,8 +4412,10 @@ const editorialLink = defineButtonPersonality({
4137
4412
  name: "Secondary",
4138
4413
  enabled: true,
4139
4414
  priority: 2,
4140
- background: { type: "transparent" },
4141
- textColorToken: "mutedText",
4415
+ background: {
4416
+ type: "surface",
4417
+ role: "link"
4418
+ },
4142
4419
  borderRadius: "rounded-none",
4143
4420
  sizes: {
4144
4421
  sm: { padding: "0.25rem 0" },
@@ -4160,8 +4437,10 @@ const editorialLink = defineButtonPersonality({
4160
4437
  name: "Outline",
4161
4438
  enabled: true,
4162
4439
  priority: 3,
4163
- background: { type: "transparent" },
4164
- textColorToken: "accent",
4440
+ background: {
4441
+ type: "surface",
4442
+ role: "link"
4443
+ },
4165
4444
  borderRadius: "rounded-none",
4166
4445
  sizes: {
4167
4446
  sm: { padding: "0.25rem 0" },
@@ -4183,19 +4462,17 @@ const editorialLink = defineButtonPersonality({
4183
4462
  name: "Ghost",
4184
4463
  enabled: true,
4185
4464
  priority: 3,
4186
- background: { type: "transparent" },
4187
- textColorToken: "mutedText",
4465
+ background: {
4466
+ type: "surface",
4467
+ role: "link"
4468
+ },
4188
4469
  borderRadius: "rounded-none",
4189
4470
  sizes: {
4190
4471
  sm: { padding: "0.25rem 0" },
4191
4472
  md: { padding: "0.5rem 0" },
4192
4473
  lg: { padding: "0.625rem 0" },
4193
4474
  xl: { padding: "0.75rem 0" }
4194
- },
4195
- effects: { hover: [{
4196
- effectId: "opacity-reduce",
4197
- options: { reduction: -20 }
4198
- }] }
4475
+ }
4199
4476
  }
4200
4477
  ]
4201
4478
  }
@@ -4257,12 +4534,8 @@ const flatInk = defineButtonPersonality({
4257
4534
  type: "solid",
4258
4535
  colorToken: "primary"
4259
4536
  },
4260
- textColorToken: "primaryForeground",
4261
4537
  borderRadius: "rounded-lg",
4262
- affordance: {
4263
- iconId: "ArrowRight",
4264
- colorToken: "accent"
4265
- },
4538
+ affordance: { iconId: "ArrowRight" },
4266
4539
  effects: { hover: [{
4267
4540
  effectId: "lift",
4268
4541
  options: { translateY: "-2px" }
@@ -4276,13 +4549,12 @@ const flatInk = defineButtonPersonality({
4276
4549
  name: "Secondary",
4277
4550
  enabled: true,
4278
4551
  priority: 2,
4279
- background: { type: "transparent" },
4280
- textColorToken: "primary",
4281
- borderRadius: "rounded-lg",
4282
- border: {
4283
- widthClass: "border",
4284
- colorToken: "border"
4552
+ background: {
4553
+ type: "surface",
4554
+ role: "link"
4285
4555
  },
4556
+ borderRadius: "rounded-lg",
4557
+ border: { widthClass: "border" },
4286
4558
  effects: { hover: [{
4287
4559
  effectId: "lift",
4288
4560
  options: { translateY: "-2px" }
@@ -4300,12 +4572,8 @@ const flatInk = defineButtonPersonality({
4300
4572
  type: "solid",
4301
4573
  colorToken: "accent"
4302
4574
  },
4303
- textColorToken: "accentForeground",
4304
4575
  borderRadius: "rounded-lg",
4305
- affordance: {
4306
- iconId: "ArrowRight",
4307
- colorToken: "accentForeground"
4308
- },
4576
+ affordance: { iconId: "ArrowRight" },
4309
4577
  effects: { hover: [{
4310
4578
  effectId: "lift",
4311
4579
  options: { translateY: "-2px" }
@@ -4368,7 +4636,6 @@ const inkStamp = defineButtonPersonality({
4368
4636
  type: "solid",
4369
4637
  colorToken: "primary"
4370
4638
  },
4371
- textColorToken: "primaryForeground",
4372
4639
  borderRadius: "rounded-md",
4373
4640
  effects: {
4374
4641
  hover: [{
@@ -4389,13 +4656,12 @@ const inkStamp = defineButtonPersonality({
4389
4656
  name: "Secondary",
4390
4657
  enabled: true,
4391
4658
  priority: 2,
4392
- background: { type: "transparent" },
4393
- textColorToken: "primary",
4394
- borderRadius: "rounded-md",
4395
- border: {
4396
- widthClass: "border-2",
4397
- colorToken: "primary"
4659
+ background: {
4660
+ type: "surface",
4661
+ role: "link"
4398
4662
  },
4663
+ borderRadius: "rounded-md",
4664
+ border: { widthClass: "border-2" },
4399
4665
  effects: { hover: [{
4400
4666
  effectId: "background-on-hover",
4401
4667
  options: { colorToken: "surface" }
@@ -4406,13 +4672,12 @@ const inkStamp = defineButtonPersonality({
4406
4672
  name: "Outline",
4407
4673
  enabled: true,
4408
4674
  priority: 3,
4409
- background: { type: "transparent" },
4410
- textColorToken: "text",
4411
- borderRadius: "rounded-md",
4412
- border: {
4413
- widthClass: "border-2",
4414
- colorToken: "border"
4675
+ background: {
4676
+ type: "surface",
4677
+ role: "link"
4415
4678
  },
4679
+ borderRadius: "rounded-md",
4680
+ border: { widthClass: "border-2" },
4416
4681
  effects: { hover: [{
4417
4682
  effectId: "background-on-hover",
4418
4683
  options: { colorToken: "surface" }
@@ -4423,8 +4688,10 @@ const inkStamp = defineButtonPersonality({
4423
4688
  name: "Ghost",
4424
4689
  enabled: true,
4425
4690
  priority: 3,
4426
- background: { type: "transparent" },
4427
- textColorToken: "accent",
4691
+ background: {
4692
+ type: "surface",
4693
+ role: "link"
4694
+ },
4428
4695
  borderRadius: "rounded-none",
4429
4696
  sizes: {
4430
4697
  sm: {
@@ -4517,7 +4784,6 @@ const joyStamp = defineButtonPersonality({
4517
4784
  type: "solid",
4518
4785
  colorToken: "primary"
4519
4786
  },
4520
- textColorToken: "primaryForeground",
4521
4787
  borderRadius: "rounded-full",
4522
4788
  shadow: {
4523
4789
  elevation: "high",
@@ -4531,13 +4797,12 @@ const joyStamp = defineButtonPersonality({
4531
4797
  name: "Secondary",
4532
4798
  enabled: true,
4533
4799
  priority: 2,
4534
- background: { type: "transparent" },
4535
- textColorToken: "text",
4536
- borderRadius: "rounded-full",
4537
- border: {
4538
- widthClass: "border-2",
4539
- colorToken: "text"
4800
+ background: {
4801
+ type: "surface",
4802
+ role: "link"
4540
4803
  },
4804
+ borderRadius: "rounded-full",
4805
+ border: { widthClass: "border-2" },
4541
4806
  shadow: {
4542
4807
  elevation: "high",
4543
4808
  softness: "hard",
@@ -4602,12 +4867,8 @@ const ornateRitual = defineButtonPersonality({
4602
4867
  type: "solid",
4603
4868
  colorToken: "primary"
4604
4869
  },
4605
- textColorToken: "primaryForeground",
4606
4870
  borderRadius: "rounded-md",
4607
- border: {
4608
- widthClass: "border",
4609
- colorToken: "primary"
4610
- },
4871
+ border: { widthClass: "border" },
4611
4872
  effects: {
4612
4873
  hover: [{
4613
4874
  effectId: "background-on-hover",
@@ -4628,12 +4889,8 @@ const ornateRitual = defineButtonPersonality({
4628
4889
  type: "solid",
4629
4890
  colorToken: "secondary"
4630
4891
  },
4631
- textColorToken: "primaryForeground",
4632
4892
  borderRadius: "rounded-md",
4633
- border: {
4634
- widthClass: "border",
4635
- colorToken: "primary"
4636
- },
4893
+ border: { widthClass: "border" },
4637
4894
  effects: { hover: [{
4638
4895
  effectId: "background-on-hover",
4639
4896
  options: { colorToken: "surface" }
@@ -4644,13 +4901,12 @@ const ornateRitual = defineButtonPersonality({
4644
4901
  name: "Outline",
4645
4902
  enabled: true,
4646
4903
  priority: 3,
4647
- background: { type: "transparent" },
4648
- textColorToken: "primary",
4649
- borderRadius: "rounded-md",
4650
- border: {
4651
- widthClass: "border",
4652
- colorToken: "primary"
4904
+ background: {
4905
+ type: "surface",
4906
+ role: "link"
4653
4907
  },
4908
+ borderRadius: "rounded-md",
4909
+ border: { widthClass: "border" },
4654
4910
  effects: { hover: [{
4655
4911
  effectId: "background-on-hover",
4656
4912
  options: { colorToken: "muted" }
@@ -4661,8 +4917,10 @@ const ornateRitual = defineButtonPersonality({
4661
4917
  name: "Ghost",
4662
4918
  enabled: true,
4663
4919
  priority: 3,
4664
- background: { type: "transparent" },
4665
- textColorToken: "accent",
4920
+ background: {
4921
+ type: "surface",
4922
+ role: "link"
4923
+ },
4666
4924
  borderRadius: "rounded-none",
4667
4925
  sizes: {
4668
4926
  sm: {
@@ -4744,14 +5002,10 @@ const pebble = defineButtonPersonality({
4744
5002
  type: "solid",
4745
5003
  colorToken: "primary"
4746
5004
  },
4747
- textColorToken: "primaryForeground",
4748
5005
  borderRadius: "rounded-full",
4749
5006
  effects: { hover: [{
4750
- effectId: "background-on-hover-alpha",
4751
- options: {
4752
- colorToken: "primary",
4753
- opacity: 88
4754
- }
5007
+ effectId: "darken-background",
5008
+ options: { amount: 100 }
4755
5009
  }] }
4756
5010
  },
4757
5011
  {
@@ -4759,13 +5013,12 @@ const pebble = defineButtonPersonality({
4759
5013
  name: "Secondary",
4760
5014
  enabled: true,
4761
5015
  priority: 2,
4762
- background: { type: "transparent" },
4763
- textColorToken: "primary",
4764
- borderRadius: "rounded-full",
4765
- border: {
4766
- widthClass: "border-2",
4767
- colorToken: "accent"
5016
+ background: {
5017
+ type: "surface",
5018
+ role: "link"
4768
5019
  },
5020
+ borderRadius: "rounded-full",
5021
+ border: { widthClass: "border-2" },
4769
5022
  effects: { hover: [{
4770
5023
  effectId: "background-on-hover",
4771
5024
  options: { colorToken: "accent" }
@@ -4776,13 +5029,12 @@ const pebble = defineButtonPersonality({
4776
5029
  name: "Outline",
4777
5030
  enabled: true,
4778
5031
  priority: 3,
4779
- background: { type: "transparent" },
4780
- textColorToken: "text",
4781
- borderRadius: "rounded-full",
4782
- border: {
4783
- widthClass: "border",
4784
- colorToken: "border"
5032
+ background: {
5033
+ type: "surface",
5034
+ role: "link"
4785
5035
  },
5036
+ borderRadius: "rounded-full",
5037
+ border: { widthClass: "border" },
4786
5038
  effects: { hover: [{
4787
5039
  effectId: "background-on-hover",
4788
5040
  options: { colorToken: "surface" }
@@ -4793,8 +5045,10 @@ const pebble = defineButtonPersonality({
4793
5045
  name: "Ghost",
4794
5046
  enabled: true,
4795
5047
  priority: 3,
4796
- background: { type: "transparent" },
4797
- textColorToken: "primary",
5048
+ background: {
5049
+ type: "surface",
5050
+ role: "link"
5051
+ },
4798
5052
  borderRadius: "rounded-full",
4799
5053
  sizes: {
4800
5054
  sm: {
@@ -4810,11 +5064,7 @@ const pebble = defineButtonPersonality({
4810
5064
  padding: "0.75rem 1.5rem",
4811
5065
  fontSize: "text-xl"
4812
5066
  }
4813
- },
4814
- effects: { hover: [{
4815
- effectId: "opacity-reduce",
4816
- options: { reduction: 30 }
4817
- }] }
5067
+ }
4818
5068
  }
4819
5069
  ]
4820
5070
  }
@@ -4876,15 +5126,11 @@ const quietArrow = defineButtonPersonality({
4876
5126
  type: "solid",
4877
5127
  colorToken: "primary"
4878
5128
  },
4879
- textColorToken: "primaryForeground",
4880
5129
  borderRadius: "rounded-xl",
4881
5130
  affordance: { iconId: "ArrowRight" },
4882
5131
  effects: { hover: [{
4883
- effectId: "background-on-hover-alpha",
4884
- options: {
4885
- colorToken: "primary",
4886
- opacity: 90
4887
- }
5132
+ effectId: "darken-background",
5133
+ options: { amount: 100 }
4888
5134
  }] }
4889
5135
  },
4890
5136
  {
@@ -4892,13 +5138,12 @@ const quietArrow = defineButtonPersonality({
4892
5138
  name: "Secondary",
4893
5139
  enabled: true,
4894
5140
  priority: 2,
4895
- background: { type: "transparent" },
4896
- textColorToken: "primary",
4897
- borderRadius: "rounded-xl",
4898
- border: {
4899
- widthClass: "border",
4900
- colorToken: "primary"
5141
+ background: {
5142
+ type: "surface",
5143
+ role: "link"
4901
5144
  },
5145
+ borderRadius: "rounded-xl",
5146
+ border: { widthClass: "border" },
4902
5147
  affordance: { iconId: "ArrowRight" },
4903
5148
  effects: { hover: [{
4904
5149
  effectId: "background-on-hover",
@@ -4910,21 +5155,22 @@ const quietArrow = defineButtonPersonality({
4910
5155
  name: "Outline",
4911
5156
  enabled: true,
4912
5157
  priority: 3,
4913
- background: { type: "transparent" },
4914
- textColorToken: "primary",
5158
+ background: {
5159
+ type: "surface",
5160
+ role: "link"
5161
+ },
4915
5162
  borderRadius: "rounded-xl",
4916
- border: {
4917
- widthClass: "border",
4918
- colorToken: "primary"
4919
- }
5163
+ border: { widthClass: "border" }
4920
5164
  },
4921
5165
  {
4922
5166
  id: "ghost",
4923
5167
  name: "Ghost",
4924
5168
  enabled: true,
4925
5169
  priority: 3,
4926
- background: { type: "transparent" },
4927
- textColorToken: "primary",
5170
+ background: {
5171
+ type: "surface",
5172
+ role: "link"
5173
+ },
4928
5174
  borderRadius: "rounded-xl"
4929
5175
  }
4930
5176
  ]
@@ -4988,7 +5234,6 @@ const showtimePill = defineButtonPersonality({
4988
5234
  type: "solid",
4989
5235
  colorToken: "primary"
4990
5236
  },
4991
- textColorToken: "background",
4992
5237
  borderRadius: "rounded-full",
4993
5238
  effects: { hover: [{ effectId: "pop" }] }
4994
5239
  },
@@ -4997,13 +5242,12 @@ const showtimePill = defineButtonPersonality({
4997
5242
  name: "Secondary",
4998
5243
  enabled: true,
4999
5244
  priority: 2,
5000
- background: { type: "transparent" },
5001
- textColorToken: "primary",
5002
- borderRadius: "rounded-full",
5003
- border: {
5004
- widthClass: "border-2",
5005
- colorToken: "primary"
5245
+ background: {
5246
+ type: "surface",
5247
+ role: "link"
5006
5248
  },
5249
+ borderRadius: "rounded-full",
5250
+ border: { widthClass: "border-2" },
5007
5251
  effects: { hover: [{ effectId: "pop" }] }
5008
5252
  },
5009
5253
  {
@@ -5015,7 +5259,6 @@ const showtimePill = defineButtonPersonality({
5015
5259
  type: "solid",
5016
5260
  colorToken: "secondary"
5017
5261
  },
5018
- textColorToken: "primary",
5019
5262
  borderRadius: "rounded-full",
5020
5263
  effects: { hover: [{ effectId: "pop" }] }
5021
5264
  },
@@ -5028,12 +5271,8 @@ const showtimePill = defineButtonPersonality({
5028
5271
  type: "solid",
5029
5272
  colorToken: "background"
5030
5273
  },
5031
- textColorToken: "primary",
5032
5274
  borderRadius: "rounded-full",
5033
- border: {
5034
- widthClass: "border-2",
5035
- colorToken: "primary"
5036
- },
5275
+ border: { widthClass: "border-2" },
5037
5276
  effects: { hover: [{
5038
5277
  effectId: "background-on-hover",
5039
5278
  options: { colorToken: "surface" }
@@ -5044,13 +5283,12 @@ const showtimePill = defineButtonPersonality({
5044
5283
  name: "Outline",
5045
5284
  enabled: true,
5046
5285
  priority: 3,
5047
- background: { type: "transparent" },
5048
- textColorToken: "primary",
5049
- borderRadius: "rounded-full",
5050
- border: {
5051
- widthClass: "border-2",
5052
- colorToken: "primary"
5286
+ background: {
5287
+ type: "surface",
5288
+ role: "link"
5053
5289
  },
5290
+ borderRadius: "rounded-full",
5291
+ border: { widthClass: "border-2" },
5054
5292
  effects: { hover: [{
5055
5293
  effectId: "background-on-hover",
5056
5294
  options: { colorToken: "background" }
@@ -5061,8 +5299,10 @@ const showtimePill = defineButtonPersonality({
5061
5299
  name: "Ghost",
5062
5300
  enabled: true,
5063
5301
  priority: 3,
5064
- background: { type: "transparent" },
5065
- textColorToken: "primary",
5302
+ background: {
5303
+ type: "surface",
5304
+ role: "link"
5305
+ },
5066
5306
  borderRadius: "rounded-full",
5067
5307
  effects: { hover: [{
5068
5308
  effectId: "background-on-hover",
@@ -5073,104 +5313,151 @@ const showtimePill = defineButtonPersonality({
5073
5313
  }
5074
5314
  });
5075
5315
  //#endregion
5076
- //#region ../theme-core/src/buttons/personalities/index.ts
5077
- const buttonPersonalities = [
5078
- defineButtonPersonality({
5079
- id: "soft-pill",
5080
- name: "Soft Pill",
5081
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5082
- tags: {
5083
- tone: "classic",
5084
- energy: "calm",
5085
- motion: "subtle",
5086
- era: "organic"
5316
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
5317
+ /**
5318
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
5319
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
5320
+ */
5321
+ const softPill = defineButtonPersonality({
5322
+ id: "soft-pill",
5323
+ name: "Soft Pill",
5324
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5325
+ tags: {
5326
+ tone: "classic",
5327
+ energy: "calm",
5328
+ motion: "subtle",
5329
+ era: "organic"
5330
+ },
5331
+ buttonSystem: {
5332
+ global: {
5333
+ cornerStyle: "pill",
5334
+ shadow: "low",
5335
+ textTransform: "none",
5336
+ fontWeight: 500,
5337
+ borderWidth: 2,
5338
+ hoverTransform: "lift",
5339
+ hoverColor: "none"
5087
5340
  },
5088
- buttonSystem: {
5089
- global: {
5090
- cornerStyle: "pill",
5091
- shadow: "low",
5092
- textTransform: "none",
5093
- fontWeight: 500,
5094
- borderWidth: 2,
5095
- hoverTransform: "lift",
5096
- hoverColor: "none"
5341
+ variants: [
5342
+ {
5343
+ id: "primary",
5344
+ name: "Primary",
5345
+ enabled: true,
5346
+ priority: 1,
5347
+ background: {
5348
+ type: "solid",
5349
+ colorToken: "primary"
5350
+ },
5351
+ borderRadius: "rounded-full",
5352
+ shadow: {
5353
+ elevation: "low",
5354
+ softness: "soft",
5355
+ position: "bottom"
5356
+ },
5357
+ effects: {
5358
+ hover: [{
5359
+ effectId: "lift",
5360
+ options: { translateY: "-1px" }
5361
+ }],
5362
+ active: [{
5363
+ effectId: "scale-down",
5364
+ options: { scale: "0.98" }
5365
+ }]
5366
+ }
5097
5367
  },
5098
- variants: [
5099
- {
5100
- id: "primary",
5101
- name: "Primary",
5102
- enabled: true,
5103
- priority: 1,
5104
- background: {
5105
- type: "solid",
5106
- colorToken: "primary"
5107
- },
5108
- textColorToken: "primaryForeground",
5109
- borderRadius: "rounded-full",
5110
- shadow: {
5111
- elevation: "low",
5112
- softness: "soft",
5113
- position: "bottom"
5114
- },
5115
- effects: {
5116
- hover: [{
5117
- effectId: "lift",
5118
- options: { translateY: "-1px" }
5119
- }],
5120
- active: [{
5121
- effectId: "scale-down",
5122
- options: { scale: "0.98" }
5123
- }]
5124
- }
5368
+ {
5369
+ id: "secondary",
5370
+ name: "Secondary",
5371
+ enabled: true,
5372
+ priority: 2,
5373
+ background: {
5374
+ type: "surface",
5375
+ role: "link"
5125
5376
  },
5126
- {
5127
- id: "secondary",
5128
- name: "Secondary",
5129
- enabled: true,
5130
- priority: 2,
5131
- background: { type: "transparent" },
5132
- textColorToken: "primary",
5133
- borderRadius: "rounded-full",
5134
- border: {
5135
- widthClass: "border-2",
5136
- colorToken: "primary"
5137
- },
5138
- effects: { hover: [{
5139
- effectId: "background-on-hover",
5140
- options: { colorToken: "surface" }
5141
- }] }
5377
+ borderRadius: "rounded-full",
5378
+ border: { widthClass: "border-2" },
5379
+ effects: { hover: [{
5380
+ effectId: "background-on-hover",
5381
+ options: { colorToken: "surface" }
5382
+ }] }
5383
+ },
5384
+ {
5385
+ id: "outline",
5386
+ name: "Outline",
5387
+ enabled: true,
5388
+ priority: 3,
5389
+ background: {
5390
+ type: "surface",
5391
+ role: "link"
5142
5392
  },
5143
- {
5144
- id: "outline",
5145
- name: "Outline",
5146
- enabled: true,
5147
- priority: 3,
5148
- background: { type: "transparent" },
5149
- textColorToken: "text",
5150
- borderRadius: "rounded-full",
5151
- border: {
5152
- widthClass: "border",
5153
- colorToken: "border"
5154
- },
5155
- effects: { hover: [{
5156
- effectId: "background-on-hover",
5157
- options: { colorToken: "surface" }
5158
- }] }
5393
+ borderRadius: "rounded-full",
5394
+ border: { widthClass: "border" },
5395
+ effects: { hover: [{
5396
+ effectId: "background-on-hover",
5397
+ options: { colorToken: "surface" }
5398
+ }] }
5399
+ },
5400
+ {
5401
+ id: "ghost",
5402
+ name: "Ghost",
5403
+ enabled: true,
5404
+ priority: 3,
5405
+ background: {
5406
+ type: "surface",
5407
+ role: "link"
5159
5408
  },
5160
- {
5161
- id: "ghost",
5162
- name: "Ghost",
5163
- enabled: true,
5164
- priority: 3,
5165
- background: { type: "transparent" },
5166
- textColorToken: "text",
5167
- borderRadius: "rounded-full",
5168
- effects: { hover: [{
5169
- effectId: "background-on-hover",
5170
- options: { colorToken: "surface" }
5171
- }] }
5172
- }
5173
- ]
5409
+ borderRadius: "rounded-full",
5410
+ effects: { hover: [{
5411
+ effectId: "background-on-hover",
5412
+ options: { colorToken: "surface" }
5413
+ }] }
5414
+ }
5415
+ ]
5416
+ }
5417
+ });
5418
+ //#endregion
5419
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
5420
+ const solidSecondary = {
5421
+ id: "secondary",
5422
+ name: "Secondary",
5423
+ enabled: true,
5424
+ priority: 2,
5425
+ background: {
5426
+ type: "solid",
5427
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
5428
+ },
5429
+ borderRadius: "rounded-full",
5430
+ shadow: {
5431
+ elevation: "none",
5432
+ softness: null,
5433
+ position: "bottom"
5434
+ },
5435
+ effects: {
5436
+ hover: [{
5437
+ effectId: "background-on-hover-alpha",
5438
+ options: {
5439
+ colorToken: "secondary",
5440
+ opacity: 88
5441
+ }
5442
+ }],
5443
+ active: [{
5444
+ effectId: "scale-down",
5445
+ options: { scale: "0.98" }
5446
+ }]
5447
+ }
5448
+ };
5449
+ //#endregion
5450
+ //#region ../theme-core/src/buttons/personalities/index.ts
5451
+ const buttonPersonalities = [
5452
+ softPill,
5453
+ defineButtonPersonality({
5454
+ id: "two-tone-pill",
5455
+ name: "Two-tone Pill",
5456
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
5457
+ tags: softPill.tags,
5458
+ buttonSystem: {
5459
+ ...softPill.buttonSystem,
5460
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
5174
5461
  }
5175
5462
  }),
5176
5463
  earthPill,
@@ -5186,6 +5473,27 @@ const buttonPersonalities = [
5186
5473
  quietArrow
5187
5474
  ];
5188
5475
  new Map(buttonPersonalities.map((p) => [p.id, p]));
5476
+ buttonPersonalities.map((personality) => ({
5477
+ id: personality.id,
5478
+ name: personality.name,
5479
+ description: personality.description,
5480
+ category: presetCategory(personality),
5481
+ buttonSystem: personality.buttonSystem,
5482
+ compatibility: {
5483
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
5484
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
5485
+ }
5486
+ }));
5487
+ function presetCategory(personality) {
5488
+ switch (personality.tags.era) {
5489
+ case "retro": return "retro";
5490
+ case "editorial": return "minimal";
5491
+ case "organic": return "artistic";
5492
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
5493
+ case "technical": return "technical";
5494
+ case void 0: return "modern";
5495
+ }
5496
+ }
5189
5497
  //#endregion
5190
5498
  //#region ../theme-core/src/cards/types.ts
5191
5499
  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
@@ -16214,9 +16665,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
16214
16665
  //#endregion
16215
16666
  //#region ../blocks/src/system/node/fragments/styledCard.ts
16216
16667
  function styledCard(children, opts, ...mods) {
16217
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
16218
- 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" });
16219
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
16668
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
16669
+ const defaultBackgroundLayer = el("div", {
16670
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
16671
+ style: { borderRadius: "inherit" }
16672
+ });
16673
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
16220
16674
  const style = {
16221
16675
  ...opts.style ?? {},
16222
16676
  borderColor: { $bind: {
@@ -16243,7 +16697,7 @@ function styledCard(children, opts, ...mods) {
16243
16697
  ...style ? { style } : {}
16244
16698
  }, [
16245
16699
  defaultBackgroundLayer,
16246
- ...backgroundNodes,
16700
+ backgroundNode,
16247
16701
  ...children
16248
16702
  ], ...mods);
16249
16703
  }
@@ -17023,9 +17477,15 @@ function createButtonGroup(options = {}) {
17023
17477
  //#endregion
17024
17478
  //#region ../blocks/src/system/fields/ctas.ts
17025
17479
  function createCtasRepeater(options = {}) {
17026
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
17480
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
17481
+ const fieldId = id;
17482
+ const buttonField = createButtonGroup({
17483
+ showGroupLabel: false,
17484
+ ...button ?? {},
17485
+ flattenInRepeater: true
17486
+ });
17027
17487
  return {
17028
- id,
17488
+ id: fieldId,
17029
17489
  type: "repeater",
17030
17490
  label,
17031
17491
  itemLabel,
@@ -17034,11 +17494,8 @@ function createCtasRepeater(options = {}) {
17034
17494
  maxItems,
17035
17495
  required: false,
17036
17496
  allowConversion: true,
17037
- schema: { fields: [createButtonGroup({
17038
- showGroupLabel: false,
17039
- ...button ?? {},
17040
- flattenInRepeater: true
17041
- })] }
17497
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
17498
+ schema: { fields: [buttonField] }
17042
17499
  };
17043
17500
  }
17044
17501
  //#endregion
@@ -17088,6 +17545,7 @@ const heroCtaRowFragment = defineFragment({
17088
17545
  label: "Calls to action",
17089
17546
  itemLabel: "CTA",
17090
17547
  maxItems: 3,
17548
+ defaultValue: [],
17091
17549
  button: {
17092
17550
  variants: [
17093
17551
  {
@@ -17155,7 +17613,7 @@ const ctaCopyFragment = defineFragment({
17155
17613
  eyebrowPath: "content.eyebrow",
17156
17614
  titlePath: "content.title",
17157
17615
  className: "cta-heading"
17158
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
17616
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
17159
17617
  });
17160
17618
  //#endregion
17161
17619
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -17252,7 +17710,7 @@ function buildTestimonialCard(...mods) {
17252
17710
  }, 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())])], {
17253
17711
  stylesFrom: "content._cardStyles",
17254
17712
  backgroundFrom: "content._cardStyles.background",
17255
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
17713
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
17256
17714
  }, ...mods);
17257
17715
  }
17258
17716
  /**
@@ -17724,39 +18182,6 @@ const formEmbedFragment = defineFragment({
17724
18182
  }
17725
18183
  });
17726
18184
  //#endregion
17727
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
17728
- const footerBottomTextFragment = defineFragment({
17729
- id: "footerBottomText",
17730
- title: "Footer Text",
17731
- description: "Rich text content for the main footer body and optional bottom bar.",
17732
- fields: [{
17733
- id: "bodyText",
17734
- type: "richText",
17735
- label: "Body text",
17736
- description: "Appears in the main footer area.",
17737
- ui: { variant: "limited" }
17738
- }, {
17739
- id: "bottomText",
17740
- type: "richText",
17741
- label: "Bottom bar text",
17742
- description: "Appears in the optional footer bottom bar.",
17743
- ui: { variant: "limited" }
17744
- }],
17745
- layout: [richText({
17746
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17747
- style: textColorStyle("text/80")
17748
- }, when("bodyText"), bind("bodyText", { transforms: [{
17749
- id: "content.interpolateRichTextTokens",
17750
- options: { tokens: ["year", "site_name"] }
17751
- }] })), richText({
17752
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17753
- style: textColorStyle("text/80")
17754
- }, when("bottomText"), bind("bottomText", { transforms: [{
17755
- id: "content.interpolateRichTextTokens",
17756
- options: { tokens: ["year", "site_name"] }
17757
- }] }))]
17758
- });
17759
- //#endregion
17760
18185
  //#region ../blocks/src/system/fragments/library/singleButton.ts
17761
18186
  const singleButtonFragment = defineFragment({
17762
18187
  id: "singleButton",
@@ -17929,7 +18354,7 @@ function createFaqAccordionLayout(options = {}) {
17929
18354
  options: {
17930
18355
  axis: "all",
17931
18356
  includeSpacing: false,
17932
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
18357
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
17933
18358
  }
17934
18359
  }]
17935
18360
  },
@@ -18920,6 +19345,7 @@ function createBlockManifest(config) {
18920
19345
  previewCustomize: config.previewCustomize,
18921
19346
  category: config.category,
18922
19347
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
19348
+ contentSource: config.contentSource,
18923
19349
  tags: config.tags ? [...config.tags] : [],
18924
19350
  icon: config.icon ?? "Box",
18925
19351
  layout,
@@ -19053,7 +19479,6 @@ function splitLayoutWith(children) {
19053
19479
  }
19054
19480
  }),
19055
19481
  renderBackgroundImage: false,
19056
- allowOverflow: true,
19057
19482
  baseClass: ""
19058
19483
  });
19059
19484
  }
@@ -19066,6 +19491,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
19066
19491
  title: "Hero",
19067
19492
  titleSource: "headline",
19068
19493
  category: "layout",
19494
+ contentSource: { kind: "inline" },
19069
19495
  includeContainerStyles: true,
19070
19496
  promotedFields: ["_sectionStyles.background.image"],
19071
19497
  fragments: [
@@ -19339,6 +19765,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
19339
19765
  id: "block.intro",
19340
19766
  title: "Intro",
19341
19767
  category: "layout",
19768
+ contentSource: { kind: "inline" },
19342
19769
  includeContainerStyles: true,
19343
19770
  titleSource: "title",
19344
19771
  previewCustomize: { quickFieldPriority: [
@@ -19524,6 +19951,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
19524
19951
  title: "Body Text",
19525
19952
  titleSource: "heading",
19526
19953
  category: "content",
19954
+ contentSource: { kind: "inline" },
19527
19955
  fragments: [{
19528
19956
  fragment: bodyCopyFragment,
19529
19957
  fieldPriority: 0
@@ -19580,6 +20008,10 @@ const blogPostBlockDefinition = {
19580
20008
  description: "Highlights a single blog post with title, image, and excerpt.",
19581
20009
  category: "blog",
19582
20010
  contentTypes: ["post"],
20011
+ contentSource: {
20012
+ kind: "entries",
20013
+ contentType: "post"
20014
+ },
19583
20015
  tags: [
19584
20016
  "blog",
19585
20017
  "post",
@@ -19681,7 +20113,7 @@ function postCard(children, ...mods) {
19681
20113
  return styledCard(children, {
19682
20114
  stylesFrom: "content._cardStyles",
19683
20115
  backgroundFrom: "content._cardStyles.background",
19684
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
20116
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
19685
20117
  }, ...mods);
19686
20118
  }
19687
20119
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -19717,7 +20149,7 @@ const stackPostCard = styledCard([inline({
19717
20149
  ])])], {
19718
20150
  stylesFrom: "content._cardStyles",
19719
20151
  backgroundFrom: "content._cardStyles.background",
19720
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
20152
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
19721
20153
  }, repeat("data.posts", "post"));
19722
20154
  const emptyState$2 = {
19723
20155
  ...styledCard([text({
@@ -19726,7 +20158,7 @@ const emptyState$2 = {
19726
20158
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
19727
20159
  stylesFrom: "content._cardStyles",
19728
20160
  backgroundFrom: "content._cardStyles.background",
19729
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
20161
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
19730
20162
  }),
19731
20163
  $when: {
19732
20164
  when: { from: "data.posts[0]" },
@@ -19736,7 +20168,7 @@ const emptyState$2 = {
19736
20168
  function blogListingShell(children) {
19737
20169
  return styledSection({
19738
20170
  children: styledContainer({
19739
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
20171
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19740
20172
  children
19741
20173
  }),
19742
20174
  baseClass: ""
@@ -19877,6 +20309,10 @@ const blogListingManifest = createBlockManifest({
19877
20309
  ],
19878
20310
  description: "Display a collection of blog posts in grid or stack layout.",
19879
20311
  contentTypes: ["post"],
20312
+ contentSource: {
20313
+ kind: "entries",
20314
+ contentType: "post"
20315
+ },
19880
20316
  tags: [
19881
20317
  "blog",
19882
20318
  "posts",
@@ -19919,6 +20355,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
19919
20355
  id: "block.cta-full",
19920
20356
  title: "Full-width CTA",
19921
20357
  category: "marketing",
20358
+ contentSource: { kind: "inline" },
19922
20359
  fragments: [{
19923
20360
  fragment: ctaCopyFragment,
19924
20361
  fieldPriority: 0
@@ -19952,6 +20389,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
19952
20389
  id: "block.single-button",
19953
20390
  title: "Single Button",
19954
20391
  category: "marketing",
20392
+ contentSource: { kind: "inline" },
19955
20393
  fragments: [{
19956
20394
  fragment: singleButtonFragment,
19957
20395
  fieldPriority: 0
@@ -20148,7 +20586,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
20148
20586
  const formSurface = styledContainer({
20149
20587
  bindFrom: "_containerStyles",
20150
20588
  constrainWidth: false,
20151
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
20589
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
20152
20590
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
20153
20591
  });
20154
20592
  function createFormLayout(variant) {
@@ -20212,6 +20650,7 @@ const formManifest = createBlockManifest({
20212
20650
  paletteHidden: false
20213
20651
  },
20214
20652
  category: "interactive",
20653
+ contentSource: { kind: "inline" },
20215
20654
  tags: [
20216
20655
  "form",
20217
20656
  "contact",
@@ -20274,6 +20713,7 @@ const contactNewsletterBlockDefinition = {
20274
20713
  titleSource: "contactTitle",
20275
20714
  description: "Two-column newsletter signup and contact form section.",
20276
20715
  category: "interactive",
20716
+ contentSource: { kind: "inline" },
20277
20717
  layout: contactNewsletterLayout,
20278
20718
  defaultVariant: "default",
20279
20719
  variants: { default: contactNewsletterLayout },
@@ -20477,6 +20917,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
20477
20917
  title: "FAQ",
20478
20918
  titleSource: "title",
20479
20919
  category: "content",
20920
+ contentSource: { kind: "inline" },
20480
20921
  includeContainerStyles: true,
20481
20922
  fragments: [{
20482
20923
  fragment: faqHeadingFragment,
@@ -21365,6 +21806,7 @@ const headerRootClassTransform = {
21365
21806
  ];
21366
21807
  const variant = header?.variant;
21367
21808
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
21809
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
21368
21810
  return joinClasses(classes);
21369
21811
  }
21370
21812
  };
@@ -21888,7 +22330,7 @@ function desktopOnlyDisplay(display) {
21888
22330
  }
21889
22331
  //#endregion
21890
22332
  //#region ../blocks/src/system/blocks/site-header.ts
21891
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
22333
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
21892
22334
  ...node,
21893
22335
  $when: {
21894
22336
  when: {
@@ -21916,7 +22358,7 @@ const logoRow = link({
21916
22358
  text({
21917
22359
  as: "strong",
21918
22360
  className: "header-logo-text rb-truncate"
21919
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22361
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21920
22362
  ]);
21921
22363
  const centeredLogoRow = link({
21922
22364
  href: "/",
@@ -21936,7 +22378,7 @@ const centeredLogoRow = link({
21936
22378
  text({
21937
22379
  as: "strong",
21938
22380
  className: "header-logo-text"
21939
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22381
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21940
22382
  ]);
21941
22383
  const createNavRow = (className, align = "end") => navRow({
21942
22384
  className: `${className} header-nav-row`,
@@ -22068,7 +22510,7 @@ const classicLayout = inline({
22068
22510
  logoRow,
22069
22511
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
22070
22512
  headerCta
22071
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
22513
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
22072
22514
  const classicCenteredNavLayout = inline({
22073
22515
  className: bindProp("$root.theme.header.maxWidth", {
22074
22516
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -22079,7 +22521,7 @@ const classicCenteredNavLayout = inline({
22079
22521
  logoRow,
22080
22522
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
22081
22523
  headerCta
22082
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
22524
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
22083
22525
  const centeredLayout = stack({
22084
22526
  gap: "md",
22085
22527
  align: "center",
@@ -22119,6 +22561,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22119
22561
  id: "block.site-header",
22120
22562
  title: "Site Header",
22121
22563
  category: "layout",
22564
+ contentSource: { kind: "inline" },
22122
22565
  additionalFields: [{
22123
22566
  id: "mode",
22124
22567
  type: "select",
@@ -22142,7 +22585,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22142
22585
  transforms: pipe(tx("layout.headerSectionBackground")),
22143
22586
  fallback: "background"
22144
22587
  }),
22145
- allowOverflow: true,
22146
22588
  className: bindProp("$root.theme.header", {
22147
22589
  transforms: pipe(tx("layout.headerRootClass")),
22148
22590
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -22192,218 +22634,155 @@ const footerNavGroupsLayout = stack({
22192
22634
  linkRequired: true,
22193
22635
  target: { $bind: { from: "entry.target" } },
22194
22636
  rel: { $bind: { from: "entry.rel" } }
22195
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
22637
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
22196
22638
  //#endregion
22197
22639
  //#region ../blocks/src/system/blocks/site-footer.ts
22198
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
22199
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
22200
- ...node,
22201
- $when: {
22202
- when: {
22203
- from,
22204
- transforms: [{ id: transformId }]
22205
- },
22206
- equals
22207
- }
22208
- });
22209
- const bottomBarTextLayout = () => {
22210
- const bottomTextNode = footerTextLayout()[1];
22211
- return bottomTextNode ? [bottomTextNode] : [];
22212
- };
22213
- const bodyTextLayout = () => {
22214
- const bodyTextNode = footerTextLayout()[0];
22215
- return bodyTextNode ? [bodyTextNode] : [];
22216
- };
22217
- const businessAddressLayout = () => [text({
22218
- as: "p",
22219
- className: "rb-caption rb-opacity-80"
22220
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
22221
- const inlineBottomTextLayout = () => {
22222
- const bottomTextNode = footerTextLayout()[1];
22223
- if (!bottomTextNode) return [];
22224
- return [when("$root.theme.footer.bottomBar.enabled", {
22225
- equals: true,
22226
- not: true
22227
- })(bottomTextNode)];
22228
- };
22229
- const simpleFooterLayout = stack({
22230
- gap: "md",
22231
- align: "start",
22232
- className: { $bind: {
22233
- from: "$root.theme.footer",
22234
- transforms: [{ id: "layout.footerSimpleRootClass" }],
22235
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
22236
- } }
22237
- }, [
22238
- link({
22239
- href: "/",
22240
- className: { $bind: {
22241
- from: "$root.theme.footer.logo",
22242
- transforms: [{
22243
- id: "layout.footerLogoClass",
22244
- options: { requireExplicitShow: true }
22245
- }],
22246
- fallback: "rb-hidden"
22247
- } }
22248
- }, [
22249
- media({ className: { $bind: {
22250
- from: "$root.theme.footer.logo",
22251
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22252
- fallback: "rb-w-auto"
22253
- } } }, when("content.logo"), bind("content.logo")),
22254
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22255
- from: "$root.theme.footer.logo",
22256
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22257
- fallback: "rb-w-auto"
22258
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22259
- text({
22260
- as: "strong",
22261
- className: "footer-logo-text rb-nav-text"
22262
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22263
- ]),
22264
- footerNav({
22265
- collectionPath: "footerMenu.items",
22266
- mode: "flatten",
22267
- className: { $bind: {
22268
- from: "$root.theme.footer.navLayout",
22269
- transforms: [{ id: "layout.footerSimpleNavClass" }],
22270
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
22271
- } },
22272
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22273
- }),
22274
- ...bodyTextLayout(),
22275
- ...businessAddressLayout(),
22276
- ...inlineBottomTextLayout()
22277
- ], when("$root.theme.footer.variant", { equals: "simple" }));
22278
- const columnsFooterLayout = stack({
22279
- gap: "xl",
22280
- align: "start",
22640
+ const brandLogo = link({
22641
+ href: "/",
22281
22642
  className: { $bind: {
22282
- from: "$root.theme.footer.maxWidth",
22643
+ from: "$root.theme.footer.logo",
22283
22644
  transforms: [{
22284
- id: "layout.maxWidthClass",
22285
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22645
+ id: "layout.footerLogoClass",
22646
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
22286
22647
  }],
22287
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22648
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
22288
22649
  } }
22289
- }, [
22290
- footerNavGroupsLayout,
22291
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
22292
- as: "strong",
22293
- className: "rb-block rb-nav-text",
22294
- style: textColorStyle("text")
22295
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
22296
- collectionPath: "footerMenu.items",
22297
- mode: "links-only",
22298
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
22299
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22300
- })]),
22301
- ...bodyTextLayout(),
22302
- ...businessAddressLayout(),
22303
- ...inlineBottomTextLayout()
22304
- ], when("$root.theme.footer.variant", { equals: "columns" }));
22305
- const splitFooterLayout = stack({
22306
- gap: "xl",
22307
- align: "start",
22650
+ }, [media({ className: { $bind: {
22651
+ from: "$root.theme.footer.logo",
22652
+ transforms: [{
22653
+ id: "layout.footerLogoMediaClass",
22654
+ options: { base: "rb-h-10 rb-w-auto" }
22655
+ }],
22656
+ fallback: "rb-h-10 rb-w-auto"
22657
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
22658
+ as: "strong",
22659
+ className: "footer-logo-text rb-nav-text"
22660
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
22661
+ const navigation = stack({
22662
+ gap: "md",
22663
+ className: "rb-w-full"
22664
+ }, [footerNavGroupsLayout, footerNav({
22665
+ collectionPath: "footerMenu.items",
22666
+ mode: "links-only",
22308
22667
  className: { $bind: {
22309
- from: "$root.theme.footer.maxWidth",
22310
- transforms: [{
22311
- id: "layout.maxWidthClass",
22312
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22313
- }],
22314
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22315
- } }
22668
+ from: "module.navigationClassName",
22669
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
22670
+ } },
22671
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
22672
+ })], when("module.kind", { equals: "navigation" }));
22673
+ const legalNavigation = footerNav({
22674
+ collectionPath: "legalFooterMenu.items",
22675
+ mode: "links-only",
22676
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
22677
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
22678
+ });
22679
+ const address = text({
22680
+ as: "address",
22681
+ className: "rb-not-italic rb-opacity-80"
22682
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
22683
+ const contact = stack({
22684
+ gap: "sm",
22685
+ className: "rb-items-start"
22686
+ }, [link({
22687
+ href: { $bind: { from: "contactLink.href" } },
22688
+ className: "rb-nav-text rb-break-words transition-theme-standard"
22689
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
22690
+ const hours = stack({
22691
+ gap: "sm",
22692
+ className: "rb-w-full"
22693
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
22694
+ as: "span",
22695
+ className: "rb-label"
22696
+ }, bind("hoursDay.weekday")), text({
22697
+ as: "span",
22698
+ className: "rb-caption rb-opacity-80"
22699
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
22700
+ as: "p",
22701
+ className: "rb-caption rb-opacity-70"
22702
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
22703
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
22704
+ href: { $bind: { from: "social.href" } },
22705
+ target: "_blank",
22706
+ rel: "noreferrer noopener",
22707
+ "aria-label": { $bind: { from: "social.label" } },
22708
+ className: "rb-nav-text transition-theme-standard"
22709
+ }, [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" }));
22710
+ const authoredCopy = richText({
22711
+ className: "rb-prose rb-prose-sm rb-max-w-none",
22712
+ style: textColorStyle("text/80")
22713
+ }, when("module.content"), bind("module.content", { transforms: [{
22714
+ id: "content.interpolateRichTextTokens",
22715
+ options: { tokens: ["year", "site_name"] }
22716
+ }] }));
22717
+ const footerGroup = stack({
22718
+ gap: "md",
22719
+ align: "stretch",
22720
+ className: "rb-min-w-0",
22721
+ "data-footer-group": { $bind: { from: "group.kind" } }
22722
+ }, [stack({
22723
+ gap: "md",
22724
+ align: "start",
22725
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
22316
22726
  }, [
22317
- inline({ className: { $bind: {
22318
- from: "$root.theme.footer.logo",
22319
- transforms: [{ id: "layout.footerSplitMainClass" }],
22320
- 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"
22321
- } } }, [stack({}, [footerNav({
22322
- collectionPath: "footerMenu.items",
22323
- mode: "flatten",
22324
- className: { $bind: {
22325
- from: "$root.theme.footer.navLayout",
22326
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
22327
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
22328
- } },
22329
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
22330
- })]), link({
22331
- href: "/",
22332
- className: { $bind: {
22333
- from: "$root.theme.footer.logo",
22334
- transforms: [{ id: "layout.footerLogoClass" }],
22335
- 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"
22336
- } }
22337
- }, [
22338
- media({ className: { $bind: {
22339
- from: "$root.theme.footer.logo",
22340
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22341
- fallback: "rb-w-auto"
22342
- } } }, when("content.logo"), bind("content.logo")),
22343
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22344
- from: "$root.theme.footer.logo",
22345
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22346
- fallback: "rb-w-auto"
22347
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22348
- text({
22349
- as: "strong",
22350
- className: "footer-logo-text rb-nav-text"
22351
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22352
- ])]),
22353
- ...businessAddressLayout(),
22354
- ...inlineBottomTextLayout()
22355
- ], when("$root.theme.footer.variant", { equals: "split" }));
22356
- const footerLayout = section({
22357
- background: "background",
22727
+ text({
22728
+ as: "h2",
22729
+ className: "rb-label",
22730
+ style: textColorStyle("text/70")
22731
+ }, bind("module.heading"), when("module.heading")),
22732
+ brandLogo,
22733
+ navigation,
22734
+ stack({
22735
+ gap: "sm",
22736
+ className: "rb-w-full"
22737
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
22738
+ address,
22739
+ contact,
22740
+ hours,
22741
+ socials,
22742
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
22743
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
22744
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
22745
+ const footerMainRegion = stack({
22746
+ className: { $bind: { from: "region.className" } },
22747
+ "data-footer-region": { $bind: { from: "region.kind" } }
22748
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
22749
+ const footerBottomRegion = stack({ className: { $bind: {
22750
+ from: "$root.theme.footer",
22751
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22752
+ fallback: "rb-w-full"
22753
+ } } }, [stack({
22358
22754
  className: { $bind: {
22359
22755
  from: "$root.theme.footer",
22360
- transforms: [{ id: "layout.footerRootClass" }],
22361
- fallback: "rb-w-full rb-border-t transition-theme"
22756
+ transforms: [{ id: "layout.footerBottomBarClass" }],
22757
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
22362
22758
  } },
22363
22759
  style: { $bind: {
22364
22760
  from: "$root.theme.footer",
22365
- transforms: [{ id: "layout.footerRootStyle" }],
22366
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22367
- } }
22368
- }, [
22369
- simpleFooterLayout,
22370
- columnsFooterLayout,
22371
- splitFooterLayout,
22372
- stack({
22373
- className: { $bind: {
22374
- from: "$root.theme.footer",
22375
- transforms: [{ id: "layout.footerBottomBarClass" }],
22376
- fallback: "rb-w-full rb-border-t rb-py-5"
22377
- } },
22378
- style: { $bind: {
22379
- from: "$root.theme.footer",
22380
- transforms: [{ id: "layout.footerBottomBarStyle" }]
22381
- } }
22382
- }, [stack({ className: { $bind: {
22383
- from: "$root.theme.footer",
22384
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22385
- fallback: "rb-container"
22386
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
22387
- ]);
22761
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
22762
+ } },
22763
+ "data-footer-region": "bottom"
22764
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
22388
22765
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
22389
22766
  id: "block.site-footer",
22390
22767
  title: "Site Footer",
22391
22768
  category: "layout",
22392
- fragments: [{
22393
- fragment: footerBottomTextFragment,
22394
- fieldPriority: 0
22395
- }],
22769
+ contentSource: { kind: "inline" },
22396
22770
  skipSectionStyles: true,
22397
- additionalFields: [{
22398
- id: "showBusinessAddress",
22399
- type: "boolean",
22400
- label: "Add business address to site footer?",
22401
- required: false,
22402
- defaultValue: false,
22403
- ui: { intent: "content" }
22404
- }],
22405
- layout: footerLayout,
22406
- description: "Site-wide footer with navigation links and optional columns.",
22771
+ layout: section({
22772
+ background: "background",
22773
+ className: { $bind: {
22774
+ from: "$root.theme.footer",
22775
+ transforms: [{ id: "layout.footerRootClass" }],
22776
+ fallback: "rb-w-full rb-border-t transition-theme"
22777
+ } },
22778
+ style: { $bind: {
22779
+ from: "$root.theme.footer",
22780
+ transforms: [{ id: "layout.footerRootStyle" }],
22781
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22782
+ } },
22783
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
22784
+ }, [footerMainRegion, footerBottomRegion]),
22785
+ description: "Site-wide composed footer with canonical shared details.",
22407
22786
  styleTokens: { spacing: "md" },
22408
22787
  paletteHidden: true
22409
22788
  }) };
@@ -22537,6 +22916,7 @@ const testimonialsBlockDefinition = {
22537
22916
  id: "block.testimonials",
22538
22917
  title: "Testimonials",
22539
22918
  category: "marketing",
22919
+ contentSource: { kind: "inline" },
22540
22920
  includeContainerStyles: true,
22541
22921
  previewCustomize: { quickFieldPriority: [
22542
22922
  "avatarLayout",
@@ -22695,6 +23075,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
22695
23075
  id: "block.columns",
22696
23076
  title: "Columns",
22697
23077
  category: "layout",
23078
+ contentSource: { kind: "inline" },
22698
23079
  additionalFields: [
22699
23080
  parseFieldDefinition({
22700
23081
  id: "equalHeight",
@@ -22881,7 +23262,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
22881
23262
  id: "boxStyles.all",
22882
23263
  options: {
22883
23264
  axis: "all",
22884
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
23265
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
22885
23266
  }
22886
23267
  }]
22887
23268
  },
@@ -22928,6 +23309,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
22928
23309
  id: "block.collection",
22929
23310
  title: "Collection",
22930
23311
  category: "layout",
23312
+ contentSource: { kind: "inline" },
22931
23313
  additionalFields: [
22932
23314
  parseFieldDefinition({
22933
23315
  id: "layout",
@@ -23164,6 +23546,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
23164
23546
  id: "block.feature-cards",
23165
23547
  title: "Feature Cards",
23166
23548
  category: "layout",
23549
+ contentSource: { kind: "inline" },
23167
23550
  includeContainerStyles: true,
23168
23551
  titleSource: "title",
23169
23552
  additionalFields: [
@@ -23547,6 +23930,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
23547
23930
  id: "block.media-text",
23548
23931
  title: "Media and Text",
23549
23932
  category: "layout",
23933
+ contentSource: { kind: "inline" },
23550
23934
  includeContainerStyles: true,
23551
23935
  titleSource: "title",
23552
23936
  previewCustomize: { quickFieldPriority: [
@@ -23947,6 +24331,7 @@ const appointmentBookingBlockDefinition = {
23947
24331
  paletteHidden: false
23948
24332
  },
23949
24333
  category: "interactive",
24334
+ contentSource: { kind: "inline" },
23950
24335
  tags: [
23951
24336
  "booking",
23952
24337
  "appointment",
@@ -24111,6 +24496,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
24111
24496
  paletteHidden: false
24112
24497
  },
24113
24498
  category: "interactive",
24499
+ contentSource: { kind: "inline" },
24114
24500
  tags: [
24115
24501
  "booking",
24116
24502
  "appointment",
@@ -25675,6 +26061,7 @@ const eventRegistrationBlockDefinition = {
25675
26061
  titleSource: "heading",
25676
26062
  description: "Multi-step event registration form",
25677
26063
  category: "interactive",
26064
+ contentSource: { kind: "inline" },
25678
26065
  tags: [
25679
26066
  "events",
25680
26067
  "registration",
@@ -25781,15 +26168,9 @@ const eventRegistrationBlockDefinition = {
25781
26168
  defaultValue: "Complete Registration",
25782
26169
  maxLength: 40
25783
26170
  },
25784
- {
25785
- id: "buttonVariant",
25786
- type: "select",
25787
- label: "Button style",
26171
+ createButtonVariantField({
25788
26172
  description: "Choose a button style from your theme",
25789
- required: false,
25790
- multiple: false,
25791
- defaultValue: "primary",
25792
- options: [
26173
+ variants: [
25793
26174
  {
25794
26175
  value: "primary",
25795
26176
  label: "Primary"
@@ -25802,9 +26183,8 @@ const eventRegistrationBlockDefinition = {
25802
26183
  value: "outline",
25803
26184
  label: "Outline"
25804
26185
  }
25805
- ],
25806
- ui: { intent: "style" }
25807
- }
26186
+ ]
26187
+ })
25808
26188
  ],
25809
26189
  layout: [styledSection({
25810
26190
  baseClass: "",
@@ -25997,6 +26377,7 @@ const courseRegistrationBlockDefinition = {
25997
26377
  titleSource: "heading",
25998
26378
  description: "Enrollment form for multi-session courses",
25999
26379
  category: "interactive",
26380
+ contentSource: { kind: "inline" },
26000
26381
  tags: [
26001
26382
  "courses",
26002
26383
  "enrollment",
@@ -26110,15 +26491,9 @@ const courseRegistrationBlockDefinition = {
26110
26491
  defaultValue: "Sign up",
26111
26492
  maxLength: 40
26112
26493
  },
26113
- {
26114
- id: "buttonVariant",
26115
- type: "select",
26116
- label: "Button style",
26494
+ createButtonVariantField({
26117
26495
  description: "Choose a button style from your theme",
26118
- required: false,
26119
- multiple: false,
26120
- defaultValue: "primary",
26121
- options: [
26496
+ variants: [
26122
26497
  {
26123
26498
  value: "primary",
26124
26499
  label: "Primary"
@@ -26131,9 +26506,8 @@ const courseRegistrationBlockDefinition = {
26131
26506
  value: "outline",
26132
26507
  label: "Outline"
26133
26508
  }
26134
- ],
26135
- ui: { intent: "style" }
26136
- }
26509
+ ]
26510
+ })
26137
26511
  ],
26138
26512
  layout: [styledSection({
26139
26513
  baseClass: "",
@@ -26213,6 +26587,7 @@ const eventDetailsManifest = createBlockManifest({
26213
26587
  titleSource: "heading",
26214
26588
  description: "Date/time, venue, map, and other dates for an event",
26215
26589
  category: "content",
26590
+ contentSource: { kind: "entries" },
26216
26591
  tags: [
26217
26592
  "events",
26218
26593
  "venue",
@@ -26418,6 +26793,7 @@ const courseDetailsBlockDefinition = {
26418
26793
  titleSource: "heading",
26419
26794
  description: "Schedule, venue, price, and enrollment status for a course",
26420
26795
  category: "content",
26796
+ contentSource: { kind: "entries" },
26421
26797
  tags: [
26422
26798
  "courses",
26423
26799
  "schedule",
@@ -26709,6 +27085,7 @@ const eventSpotlightBlockDefinition = {
26709
27085
  paletteHidden: false
26710
27086
  },
26711
27087
  category: "content",
27088
+ contentSource: { kind: "entries" },
26712
27089
  tags: [
26713
27090
  "events",
26714
27091
  "featured",
@@ -27255,6 +27632,7 @@ const eventListingBlockDefinition = {
27255
27632
  paletteHidden: true
27256
27633
  },
27257
27634
  category: "interactive",
27635
+ contentSource: { kind: "entries" },
27258
27636
  tags: [
27259
27637
  "events",
27260
27638
  "listing",
@@ -28427,6 +28805,7 @@ const eventCalendarBlockDefinition = {
28427
28805
  paletteHidden: false
28428
28806
  },
28429
28807
  category: "interactive",
28808
+ contentSource: { kind: "entries" },
28430
28809
  tags: [
28431
28810
  "events",
28432
28811
  "calendar",
@@ -28824,6 +29203,7 @@ const recurringScheduleBlockDefinition = {
28824
29203
  titleSource: "heading",
28825
29204
  description: "A compact weekly schedule with one row per recurring series.",
28826
29205
  category: "interactive",
29206
+ contentSource: { kind: "entries" },
28827
29207
  icon: "CalendarDays",
28828
29208
  tags: [
28829
29209
  "schedule",
@@ -29241,7 +29621,10 @@ const offeringsPreviewFields = [
29241
29621
  label: "Link"
29242
29622
  }
29243
29623
  ],
29244
- ui: { intent: "display" }
29624
+ ui: {
29625
+ intent: "display",
29626
+ widget: "buttonVariant"
29627
+ }
29245
29628
  },
29246
29629
  {
29247
29630
  id: "buttonText",
@@ -29294,6 +29677,7 @@ const offeringsPreviewManifest = createBlockManifest({
29294
29677
  paletteHidden: false
29295
29678
  },
29296
29679
  category: "content",
29680
+ contentSource: { kind: "mixed" },
29297
29681
  tags: [
29298
29682
  "offerings",
29299
29683
  "events",
@@ -29462,6 +29846,7 @@ const embedManifest = createBlockManifest({
29462
29846
  id: "block.embed",
29463
29847
  title: "Embed Content",
29464
29848
  category: "content",
29849
+ contentSource: { kind: "entries" },
29465
29850
  titleSource: "heading",
29466
29851
  additionalFields: [
29467
29852
  parseFieldDefinition({
@@ -29949,6 +30334,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
29949
30334
  id: "block.image-gallery",
29950
30335
  title: "Image Gallery",
29951
30336
  category: "content",
30337
+ contentSource: { kind: "inline" },
29952
30338
  previewCustomize: { quickFieldPriority: [
29953
30339
  "aspectRatio",
29954
30340
  "slidesToShow",
@@ -30601,6 +30987,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
30601
30987
  id: "block.video-grid",
30602
30988
  title: "Video Grid",
30603
30989
  category: "media",
30990
+ contentSource: { kind: "inline" },
30604
30991
  skipSectionStyles: true,
30605
30992
  additionalFields: parseFieldDefinitions([
30606
30993
  {
@@ -30771,6 +31158,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
30771
31158
  title: "Audio Player",
30772
31159
  titleSource: "title",
30773
31160
  category: "media",
31161
+ contentSource: { kind: "inline" },
30774
31162
  description: "Add a branded audio player for a single track.",
30775
31163
  tags: [
30776
31164
  "audio",
@@ -30882,6 +31270,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
30882
31270
  title: "File Download",
30883
31271
  titleSource: ["title", "file.filename"],
30884
31272
  category: "media",
31273
+ contentSource: { kind: "inline" },
30885
31274
  description: "Add a simple public download link for a document, ZIP, or audio file.",
30886
31275
  tags: [
30887
31276
  "file",
@@ -31826,6 +32215,7 @@ const shopBlockDefinition = {
31826
32215
  paletteHidden: false
31827
32216
  },
31828
32217
  category: "interactive",
32218
+ contentSource: { kind: "entries" },
31829
32219
  tags: [
31830
32220
  "shop",
31831
32221
  "passes",
@@ -32025,6 +32415,7 @@ const productListBlockDefinition = {
32025
32415
  paletteHidden: false
32026
32416
  },
32027
32417
  category: "interactive",
32418
+ contentSource: { kind: "entries" },
32028
32419
  tags: [
32029
32420
  "shop",
32030
32421
  "products",
@@ -32166,6 +32557,7 @@ const productDetailBlockDefinition = {
32166
32557
  paletteHidden: false
32167
32558
  },
32168
32559
  category: "interactive",
32560
+ contentSource: { kind: "entries" },
32169
32561
  tags: [
32170
32562
  "shop",
32171
32563
  "product",
@@ -32282,6 +32674,7 @@ const cartBlockDefinition = {
32282
32674
  paletteHidden: false
32283
32675
  },
32284
32676
  category: "interactive",
32677
+ contentSource: { kind: "inline" },
32285
32678
  tags: [
32286
32679
  "shop",
32287
32680
  "cart",
@@ -32364,6 +32757,7 @@ const checkoutBlockDefinition = {
32364
32757
  paletteHidden: false
32365
32758
  },
32366
32759
  category: "interactive",
32760
+ contentSource: { kind: "inline" },
32367
32761
  tags: [
32368
32762
  "shop",
32369
32763
  "checkout",
@@ -32567,6 +32961,7 @@ const giftingBlockDefinition = {
32567
32961
  paletteHidden: false
32568
32962
  },
32569
32963
  category: "interactive",
32964
+ contentSource: { kind: "entries" },
32570
32965
  tags: [
32571
32966
  "gifting",
32572
32967
  "gift cards",
@@ -32910,6 +33305,7 @@ const newsletterSignupBlockDefinition = {
32910
33305
  titleSource: "title",
32911
33306
  description: "Newsletter subscription form with configurable field presets.",
32912
33307
  category: "interactive",
33308
+ contentSource: { kind: "inline" },
32913
33309
  fragments: [{
32914
33310
  fragment: newsletterCopyFragment,
32915
33311
  fieldPriority: 0
@@ -33091,6 +33487,7 @@ const teamMembersBlockDefinition = {
33091
33487
  id: "block.team-members",
33092
33488
  title: "Team Members",
33093
33489
  category: "content",
33490
+ contentSource: { kind: "mixed" },
33094
33491
  titleSource: "heading",
33095
33492
  additionalFields: [
33096
33493
  parseFieldDefinition({
@@ -33511,6 +33908,7 @@ const locationMapBlockDefinition = {
33511
33908
  titleSource: "heading",
33512
33909
  description: "Show a business location with an interactive map and directions link.",
33513
33910
  category: "content",
33911
+ contentSource: { kind: "inline" },
33514
33912
  tags: [
33515
33913
  "map",
33516
33914
  "location",
@@ -34626,9 +35024,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
34626
35024
  ].filter(Boolean).join(" ");
34627
35025
  }
34628
35026
  function gradientPresetCss(value) {
34629
- if (!isString(value)) return null;
34630
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
34631
- if (!preset) return null;
35027
+ const presetId = parseGradientPresetId(value);
35028
+ if (!presetId) return null;
35029
+ const preset = getGradientPreset(presetId);
34632
35030
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
34633
35031
  }
34634
35032
  const backgroundTransforms = [
@@ -34667,16 +35065,17 @@ const backgroundTransforms = [
34667
35065
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
34668
35066
  },
34669
35067
  {
34670
- id: "background.resolveAllowOverflow",
35068
+ id: "background.resolveFrameClassName",
34671
35069
  kind: "formatter",
34672
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
34673
- run: (value) => {
34674
- if (!value || typeof value !== "object") return false;
35070
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
35071
+ run: (value, options) => {
35072
+ const baseClass = options?.baseClass?.trim() ?? "";
35073
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
34675
35074
  const input = value;
34676
- if (input.overflow === true) return true;
35075
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
34677
35076
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
34678
35077
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
34679
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
35078
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
34680
35079
  }
34681
35080
  },
34682
35081
  {
@@ -35749,6 +36148,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
35749
36148
  "already_refunded",
35750
36149
  "idempotency_amount_mismatch",
35751
36150
  "idempotency_method_mismatch",
36151
+ "idempotency_receipt_mismatch",
35752
36152
  "refund_in_progress"
35753
36153
  ],
35754
36154
  "invalid_amount",
@@ -35761,7 +36161,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
35761
36161
  "payment_intent_not_found",
35762
36162
  "stripe_error",
35763
36163
  "stale_pending_missing_context",
35764
- "non_refundable_deposit_remaining"
36164
+ "non_refundable_deposit_remaining",
36165
+ "deposit_refund_override_required",
36166
+ "refund_revoke_requires_full_line_refund",
36167
+ "payment_receipt_not_found",
36168
+ "payment_receipt_not_refundable",
36169
+ "payment_receipt_attribution_required"
35765
36170
  ];
35766
36171
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
35767
36172
  //#endregion
@@ -35774,7 +36179,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
35774
36179
  "missing_credit_customer",
35775
36180
  "deposit_refund_override_required",
35776
36181
  "refund_revoke_requires_full_line_refund",
35777
- "unified_order_link_required"
36182
+ "unified_order_link_required",
36183
+ "payment_receipt_not_found",
36184
+ "payment_receipt_not_refundable",
36185
+ "payment_receipt_attribution_required"
35778
36186
  ];
35779
36187
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
35780
36188
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];